<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[163692] trunk/Source/WebCore</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/163692">163692</a></dd>
<dt>Author</dt> <dd>rniwa@webkit.org</dd>
<dt>Date</dt> <dd>2014-02-07 21:27:17 -0800 (Fri, 07 Feb 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Merge updateSelectionCachesIfSelectionIsInsideTextFormControl into setSelectionWithoutUpdatingAppearance
https://bugs.webkit.org/show_bug.cgi?id=128439

Reviewed by Anders Carlsson.

FrameSelection::selectAll had a superfluous call to updateSelectionCachesIfSelectionIsInsideTextFormControl
because it wasn't setting UserTriggered option to avoid revealing selection.

Call setSelection with UserTriggered and recently added DoNotRevealSelection option and merge
updateSelectionCachesIfSelectionIsInsideTextFormControl into setSelectionWithoutUpdatingAppearance.

Also rename local variables in setSelectionWithoutUpdatingAppearance, newSelection to
newSelectionPossiblyWithoutDirection and s to newSelection so that they're self explanatory.

In addition, we now update the input element's selection caches before calling
selectFrameElementInParentIfFullySelected but this should be fine because selection cannot simultaneously
select the entire document and be inside a text form control.

* editing/FrameSelection.cpp:
(WebCore::FrameSelection::setSelectionWithoutUpdatingAppearance):
(WebCore::FrameSelection::selectAll):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreeditingFrameSelectioncpp">trunk/Source/WebCore/editing/FrameSelection.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (163691 => 163692)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-02-08 05:06:33 UTC (rev 163691)
+++ trunk/Source/WebCore/ChangeLog        2014-02-08 05:27:17 UTC (rev 163692)
</span><span class="lines">@@ -1,5 +1,29 @@
</span><span class="cx"> 2014-02-07  Ryosuke Niwa  &lt;rniwa@webkit.org&gt;
</span><span class="cx"> 
</span><ins>+        Merge updateSelectionCachesIfSelectionIsInsideTextFormControl into setSelectionWithoutUpdatingAppearance
+        https://bugs.webkit.org/show_bug.cgi?id=128439
+
+        Reviewed by Anders Carlsson.
+
+        FrameSelection::selectAll had a superfluous call to updateSelectionCachesIfSelectionIsInsideTextFormControl
+        because it wasn't setting UserTriggered option to avoid revealing selection.
+
+        Call setSelection with UserTriggered and recently added DoNotRevealSelection option and merge
+        updateSelectionCachesIfSelectionIsInsideTextFormControl into setSelectionWithoutUpdatingAppearance.
+
+        Also rename local variables in setSelectionWithoutUpdatingAppearance, newSelection to
+        newSelectionPossiblyWithoutDirection and s to newSelection so that they're self explanatory.
+
+        In addition, we now update the input element's selection caches before calling
+        selectFrameElementInParentIfFullySelected but this should be fine because selection cannot simultaneously
+        select the entire document and be inside a text form control.
+
+        * editing/FrameSelection.cpp:
+        (WebCore::FrameSelection::setSelectionWithoutUpdatingAppearance):
+        (WebCore::FrameSelection::selectAll):
+
+2014-02-07  Ryosuke Niwa  &lt;rniwa@webkit.org&gt;
+
</ins><span class="cx">         EFL build fix attempt after r163662.
</span><span class="cx"> 
</span><span class="cx">         * Modules/indexeddb/leveldb/IDBLevelDBCoding.cpp:
</span></span></pre></div>
<a id="trunkSourceWebCoreeditingFrameSelectioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/editing/FrameSelection.cpp (163691 => 163692)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/editing/FrameSelection.cpp        2014-02-08 05:06:33 UTC (rev 163691)
+++ trunk/Source/WebCore/editing/FrameSelection.cpp        2014-02-08 05:27:17 UTC (rev 163692)
</span><span class="lines">@@ -250,33 +250,33 @@
</span><span class="cx">     setSelection(newSelection, UserTriggered | DoNotRevealSelection | CloseTyping | ClearTypingStyle, AlignCursorOnScrollIfNeeded, granularity);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool FrameSelection::setSelectionWithoutUpdatingAppearance(const VisibleSelection&amp; newSelection, SetSelectionOptions options, CursorAlignOnScroll align, TextGranularity granularity, EUserTriggered userTriggered)
</del><ins>+bool FrameSelection::setSelectionWithoutUpdatingAppearance(const VisibleSelection&amp; newSelectionPossiblyWithoutDirection, SetSelectionOptions options, CursorAlignOnScroll align, TextGranularity granularity, EUserTriggered userTriggered)
</ins><span class="cx"> {
</span><span class="cx">     bool closeTyping = options &amp; CloseTyping;
</span><span class="cx">     bool shouldClearTypingStyle = options &amp; ClearTypingStyle;
</span><span class="cx"> 
</span><del>-    VisibleSelection s = newSelection;
</del><ins>+    VisibleSelection newSelection = newSelectionPossiblyWithoutDirection;
</ins><span class="cx">     if (shouldAlwaysUseDirectionalSelection(m_frame))
</span><del>-        s.setIsDirectional(true);
</del><ins>+        newSelection.setIsDirectional(true);
</ins><span class="cx"> 
</span><span class="cx">     if (!m_frame) {
</span><del>-        m_selection = s;
</del><ins>+        m_selection = newSelection;
</ins><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // &lt;http://bugs.webkit.org/show_bug.cgi?id=23464&gt;: Infinite recursion at FrameSelection::setSelection
</span><span class="cx">     // if document-&gt;frame() == m_frame we can get into an infinite loop
</span><del>-    if (s.base().anchorNode()) {
-        Document&amp; document = s.base().anchorNode()-&gt;document();
-        if (document.frame() &amp;&amp; document.frame() != m_frame &amp;&amp; &amp;document != m_frame-&gt;document()) {
-            RefPtr&lt;Frame&gt; guard = document.frame();
-            document.frame()-&gt;selection().setSelection(s, options, align, granularity);
-            // It's possible that during the above set selection, this FrameSelection has been modified by
-            // selectFrameElementInParentIfFullySelected, but that the selection is no longer valid since
-            // the frame is about to be destroyed. If this is the case, clear our selection.
-            if (guard-&gt;hasOneRef() &amp;&amp; !m_selection.isNonOrphanedCaretOrRange())
-                clear();
-            return false;
</del><ins>+    if (Document* newSelectionDocument = newSelection.base().document()) {
+        if (RefPtr&lt;Frame&gt; newSelectionFrame = newSelectionDocument-&gt;frame()) {
+            if (newSelectionFrame != m_frame &amp;&amp; newSelectionDocument != m_frame-&gt;document()) {
+                newSelectionFrame-&gt;selection().setSelection(newSelection, options, align, granularity);
+                // It's possible that during the above set selection, this FrameSelection has been modified by
+                // selectFrameElementInParentIfFullySelected, but that the selection is no longer valid since
+                // the frame is about to be destroyed. If this is the case, clear our selection.
+                if (newSelectionFrame-&gt;hasOneRef() &amp;&amp; !m_selection.isNonOrphanedCaretOrRange())
+                    clear();
+                return false;
+            }
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -292,25 +292,25 @@
</span><span class="cx">     if (shouldClearTypingStyle)
</span><span class="cx">         clearTypingStyle();
</span><span class="cx"> 
</span><del>-    if (m_selection == s) {
-        // Even if selection was not changed, selection offsets may have been changed.
-        updateSelectionCachesIfSelectionIsInsideTextFormControl(userTriggered);
-        return false;
-    }
-
</del><span class="cx">     VisibleSelection oldSelection = m_selection;
</span><ins>+    m_selection = newSelection;
</ins><span class="cx"> 
</span><del>-    m_selection = s;
</del><ins>+    // Selection offsets should increase when LF is inserted before the caret in InsertLineBreakCommand. See &lt;https://webkit.org/b/56061&gt;.
+    if (HTMLTextFormControlElement* textControl = enclosingTextFormControl(newSelection.start()))
+        textControl-&gt;selectionChanged(userTriggered == UserTriggered);
+
+    if (oldSelection == newSelection)
+        return false;
+
</ins><span class="cx">     setCaretRectNeedsUpdate();
</span><del>-    
-    if (!s.isNone() &amp;&amp; !(options &amp; DoNotSetFocus))
</del><ins>+
+    if (!newSelection.isNone() &amp;&amp; !(options &amp; DoNotSetFocus))
</ins><span class="cx">         setFocusedElementIfNeeded();
</span><span class="cx"> 
</span><span class="cx">     // Always clear the x position used for vertical arrow navigation.
</span><span class="cx">     // It will be restored by the vertical arrow navigation code if necessary.
</span><span class="cx">     m_xPosForVerticalArrowNavigation = NoXPosForVerticalArrowNavigation();
</span><span class="cx">     selectFrameElementInParentIfFullySelected();
</span><del>-    updateSelectionCachesIfSelectionIsInsideTextFormControl(userTriggered);
</del><span class="cx">     m_frame-&gt;editor().respondToChangedSelection(oldSelection, options);
</span><span class="cx">     m_frame-&gt;document()-&gt;enqueueDocumentEvent(Event::create(eventNames().selectionchangeEvent, false, false));
</span><span class="cx"> 
</span><span class="lines">@@ -1706,10 +1706,7 @@
</span><span class="cx">     VisibleSelection newSelection(VisibleSelection::selectionFromContentsOfNode(root.get()));
</span><span class="cx"> 
</span><span class="cx">     if (shouldChangeSelection(newSelection))
</span><del>-        setSelection(newSelection);
-
-    selectFrameElementInParentIfFullySelected();
-    updateSelectionCachesIfSelectionIsInsideTextFormControl(UserTriggered);
</del><ins>+        setSelection(newSelection, UserTriggered | CloseTyping | ClearTypingStyle | DoNotRevealSelection);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool FrameSelection::setSelectedRange(Range* range, EAffinity affinity, bool closeTyping)
</span><span class="lines">@@ -1912,12 +1909,6 @@
</span><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void FrameSelection::updateSelectionCachesIfSelectionIsInsideTextFormControl(EUserTriggered userTriggered)
-{
-    if (HTMLTextFormControlElement* textControl = enclosingTextFormControl(m_selection.start()))
-        textControl-&gt;selectionChanged(userTriggered == UserTriggered);
-}
-
</del><span class="cx"> // Helper function that tells whether a particular node is an element that has an entire
</span><span class="cx"> // Frame and FrameView, a &lt;frame&gt;, &lt;iframe&gt;, or &lt;object&gt;.
</span><span class="cx"> static bool isFrameElement(const Node* n)
</span></span></pre>
</div>
</div>

</body>
</html>