<!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>[171488] trunk</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/171488">171488</a></dd>
<dt>Author</dt> <dd>commit-queue@webkit.org</dd>
<dt>Date</dt> <dd>2014-07-23 13:59:40 -0700 (Wed, 23 Jul 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Unreviewed, rolling out <a href="http://trac.webkit.org/projects/webkit/changeset/171455">r171455</a>.
https://bugs.webkit.org/show_bug.cgi?id=135209

completely broke selection highlight invalidation (Requested
by thorton on #webkit).

Reverted changeset:

&quot;REGRESSION (<a href="http://trac.webkit.org/projects/webkit/changeset/169105">r169105</a>): Crash in selection&quot;
https://bugs.webkit.org/show_bug.cgi?id=134303
http://trac.webkit.org/changeset/171455</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreWebCorexcodeprojprojectpbxproj">trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderBlockcpp">trunk/Source/WebCore/rendering/RenderBlock.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderSelectionInfoh">trunk/Source/WebCore/rendering/RenderSelectionInfo.h</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderViewcpp">trunk/Source/WebCore/rendering/RenderView.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderViewh">trunk/Source/WebCore/rendering/RenderView.h</a></li>
<li><a href="#trunkSourceWebCorerenderingSelectionSubtreeRootcpp">trunk/Source/WebCore/rendering/SelectionSubtreeRoot.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingSelectionSubtreeRooth">trunk/Source/WebCore/rendering/SelectionSubtreeRoot.h</a></li>
</ul>

<h3>Removed Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsfastregionsselectioncrashdeselectexpectedtxt">trunk/LayoutTests/fast/regions/selection/crash-deselect-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastregionsselectioncrashdeselecthtml">trunk/LayoutTests/fast/regions/selection/crash-deselect.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (171487 => 171488)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2014-07-23 20:34:14 UTC (rev 171487)
+++ trunk/LayoutTests/ChangeLog        2014-07-23 20:59:40 UTC (rev 171488)
</span><span class="lines">@@ -1,3 +1,17 @@
</span><ins>+2014-07-23  Commit Queue  &lt;commit-queue@webkit.org&gt;
+
+        Unreviewed, rolling out r171455.
+        https://bugs.webkit.org/show_bug.cgi?id=135209
+
+        completely broke selection highlight invalidation (Requested
+        by thorton on #webkit).
+
+        Reverted changeset:
+
+        &quot;REGRESSION (r169105): Crash in selection&quot;
+        https://bugs.webkit.org/show_bug.cgi?id=134303
+        http://trac.webkit.org/changeset/171455
+
</ins><span class="cx"> 2014-07-23  Bem Jones-Bey  &lt;bjonesbe@adobe.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Ensure we compute the min and max height of replaced elements to 'none' or 0 when appropriate.
</span></span></pre></div>
<a id="trunkLayoutTestsfastregionsselectioncrashdeselectexpectedtxt"></a>
<div class="delfile"><h4>Deleted: trunk/LayoutTests/fast/regions/selection/crash-deselect-expected.txt (171487 => 171488)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/regions/selection/crash-deselect-expected.txt        2014-07-23 20:34:14 UTC (rev 171487)
+++ trunk/LayoutTests/fast/regions/selection/crash-deselect-expected.txt        2014-07-23 20:59:40 UTC (rev 171488)
</span><span class="lines">@@ -1,5 +0,0 @@
</span><del>-CONSOLE MESSAGE: line 66: HierarchyRequestError: DOM Exception 3: A Node was inserted somewhere it doesn't belong.
-
-Errlog selectionTest: HierarchyRequestError: HierarchyRequestError: DOM Exception 3 : index 1 
-Errlog webtest_fn_24: 
-
</del></span></pre></div>
<a id="trunkLayoutTestsfastregionsselectioncrashdeselecthtml"></a>
<div class="delfile"><h4>Deleted: trunk/LayoutTests/fast/regions/selection/crash-deselect.html (171487 => 171488)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/regions/selection/crash-deselect.html        2014-07-23 20:34:14 UTC (rev 171487)
+++ trunk/LayoutTests/fast/regions/selection/crash-deselect.html        2014-07-23 20:59:40 UTC (rev 171488)
</span><span class="lines">@@ -1,72 +0,0 @@
</span><del>-&lt;!DOCTYPE html&gt;
-&lt;html id=&quot;webtest0&quot;&gt;
-    &lt;head id=&quot;webtest1&quot;&gt;
-        &lt;style id=&quot;webtest2&quot;&gt;&lt;/style&gt;
-        &lt;style&gt;
-            :last-child { -webkit-flow-into: foo; }
-        &lt;/style&gt;
-        
-    &lt;/head&gt;
-    &lt;body id=&quot;webtest3&quot;&gt;
-        &lt;script id=&quot;example&quot;&gt;&lt;/script&gt;
-
-        &lt;script type=&quot;text/javascript&quot;&gt;
-            if (window.testRunner)
-                testRunner.dumpAsText(false);
-        &lt;/script&gt;
-
-        &lt;script&gt;
-            var new_elem = document.createElement(&quot;canvas&quot;);
-            new_elem.setAttribute(&quot;id&quot;, &quot;webtest11&quot;);
-            document.querySelector(&quot;#webtest0&quot;).appendChild(new_elem);
-
-            document.write(&quot;&lt;br&gt;&lt;summary&gt;&quot;);
-        &lt;/script&gt;
-        &lt;summary&gt;
-            &lt;mathml id=&quot;webtest12&quot;&gt;
-                &lt;femerge&gt;&lt;/femerge&gt;
-            &lt;/mathml&gt;
-
-            &lt;script&gt;
-                function selectionTest() {
-                    try {
-                        wf_i = 0;
-                        for (; wf_i&lt;40; wf_i++) {
-                            var range = document.createRange();
-
-                            range.setStartBefore(document.getElementById(&quot;webtest3&quot;));
-                            range.setEndAfter(document.getElementById(&quot;webtest2&quot;));
-                            range.deleteContents();
-                            
-                            var markElement = document.getElementById(&quot;webtest1&quot;).appendChild(document.createElementNS(&quot;&quot;, &quot;mark&quot;));
-                            range.setStartAfter(markElement);
-
-                            var appletElement = document.getElementById(&quot;example&quot;).appendChild(document.createElement(&quot;applet&quot;));
-                            range.setEndAfter(appletElement);
-
-                            range.insertNode(document.getElementById(&quot;example&quot;));
-                        }
-                    } catch(e) {
-                      document.write(&quot;Errlog selectionTest: &quot; + e.name + &quot;: &quot; + e.message + &quot; : index &quot; + wf_i + &quot; &lt;br&gt;&lt;table/&gt;&quot;);
-                    }
-                }
-                selectionTest();
-            &lt;/script&gt;
-            &lt;sub&gt;
-
-            &lt;script&gt;
-                document.designMode = &quot;on&quot;;
-                document.execCommand(&quot;SelectAll&quot;);
-                document.write(&quot;Errlog webtest_fn_24: &lt;br&gt;&lt;nobr&gt;&quot;);
-
-                var femergeElement = document.getElementById(&quot;webtest12&quot;).appendChild(document.createElement(&quot;femerge&quot;));
-                var appletElement = document.getElementById(&quot;example&quot;).appendChild(document.createElement(&quot;applet&quot;));
-                var gradientElement = document.body.appendChild(document.createElement(&quot;gradient&quot;));
-                        
-                document.getElementById(&quot;webtest2&quot;).isEqualNode(femergeElement.insertBefore(document.documentElement, gradientElement));
-            &lt;/script&gt;
-
-            &lt;table&gt;&lt;/table&gt;
-        &lt;/summary&gt;
-    &lt;/body&gt;
-&lt;/html&gt;
</del></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (171487 => 171488)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-07-23 20:34:14 UTC (rev 171487)
+++ trunk/Source/WebCore/ChangeLog        2014-07-23 20:59:40 UTC (rev 171488)
</span><span class="lines">@@ -1,3 +1,17 @@
</span><ins>+2014-07-23  Commit Queue  &lt;commit-queue@webkit.org&gt;
+
+        Unreviewed, rolling out r171455.
+        https://bugs.webkit.org/show_bug.cgi?id=135209
+
+        completely broke selection highlight invalidation (Requested
+        by thorton on #webkit).
+
+        Reverted changeset:
+
+        &quot;REGRESSION (r169105): Crash in selection&quot;
+        https://bugs.webkit.org/show_bug.cgi?id=134303
+        http://trac.webkit.org/changeset/171455
+
</ins><span class="cx"> 2014-07-23  Alex Christensen  &lt;achristensen@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         Compile window-inactive and fullscreen pseudoclasses in css selectors.
</span></span></pre></div>
<a id="trunkSourceWebCoreWebCorexcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (171487 => 171488)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2014-07-23 20:34:14 UTC (rev 171487)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2014-07-23 20:59:40 UTC (rev 171488)
</span><span class="lines">@@ -466,7 +466,7 @@
</span><span class="cx">                 0F09087F1444FDB200028917 /* ScrollbarTheme.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0FE71415142189FC00DB33BA /* ScrollbarTheme.cpp */; };
</span><span class="cx">                 0F099D0817B968A100FF84B9 /* WebCoreTypedArrayController.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F099D0617B968A100FF84B9 /* WebCoreTypedArrayController.cpp */; };
</span><span class="cx">                 0F099D0917B968A100FF84B9 /* WebCoreTypedArrayController.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F099D0717B968A100FF84B9 /* WebCoreTypedArrayController.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><del>-                0F11A54F0F39233100C37884 /* RenderSelectionInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F11A54E0F39233100C37884 /* RenderSelectionInfo.h */; settings = {ATTRIBUTES = (Private, ); }; };
</del><ins>+                0F11A54F0F39233100C37884 /* RenderSelectionInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F11A54E0F39233100C37884 /* RenderSelectionInfo.h */; };
</ins><span class="cx">                 0F13163E16ED0CC80035CC04 /* PlatformCAFilters.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F13163D16ED0CC80035CC04 /* PlatformCAFilters.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 0F13164016ED0CDE0035CC04 /* PlatformCAFiltersMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 0F13163F16ED0CDE0035CC04 /* PlatformCAFiltersMac.mm */; };
</span><span class="cx">                 0F15DA8A0F3AAEE70000CE47 /* AnimationControllerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F15DA890F3AAEE70000CE47 /* AnimationControllerPrivate.h */; };
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderBlockcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderBlock.cpp (171487 => 171488)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderBlock.cpp        2014-07-23 20:34:14 UTC (rev 171487)
+++ trunk/Source/WebCore/rendering/RenderBlock.cpp        2014-07-23 20:59:40 UTC (rev 171488)
</span><span class="lines">@@ -1828,8 +1828,8 @@
</span><span class="cx">         || isRenderFlowThread() || style().columnSpan() == ColumnSpanAll)
</span><span class="cx">         return true;
</span><span class="cx">     
</span><del>-    if (view().selectionUnsplitStart()) {
-        Node* startElement = view().selectionUnsplitStart()-&gt;node();
</del><ins>+    if (view().selectionStart()) {
+        Node* startElement = view().selectionStart()-&gt;node();
</ins><span class="cx">         if (startElement &amp;&amp; startElement-&gt;rootEditableElement() == element())
</span><span class="cx">             return true;
</span><span class="cx">     }
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderSelectionInfoh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderSelectionInfo.h (171487 => 171488)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderSelectionInfo.h        2014-07-23 20:34:14 UTC (rev 171487)
+++ trunk/Source/WebCore/rendering/RenderSelectionInfo.h        2014-07-23 20:59:40 UTC (rev 171488)
</span><span class="lines">@@ -25,9 +25,8 @@
</span><span class="cx"> #ifndef RenderSelectionInfo_h
</span><span class="cx"> #define RenderSelectionInfo_h
</span><span class="cx"> 
</span><del>-#include &quot;GapRects.h&quot;
</del><span class="cx"> #include &quot;IntRect.h&quot;
</span><del>-#include &quot;RenderBlock.h&quot;
</del><ins>+#include &quot;RenderBox.h&quot;
</ins><span class="cx"> #include &quot;RenderText.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderViewcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderView.cpp (171487 => 171488)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderView.cpp        2014-07-23 20:34:14 UTC (rev 171487)
+++ trunk/Source/WebCore/rendering/RenderView.cpp        2014-07-23 20:59:40 UTC (rev 171488)
</span><span class="lines">@@ -96,10 +96,10 @@
</span><span class="cx"> RenderView::RenderView(Document&amp; document, PassRef&lt;RenderStyle&gt; style)
</span><span class="cx">     : RenderBlockFlow(document, WTF::move(style))
</span><span class="cx">     , m_frameView(*document.view())
</span><del>-    , m_unsplitSelectionStart(0)
-    , m_unsplitSelectionEnd(0)
-    , m_unsplitSelectionStartPos(-1)
-    , m_unsplitSelectionEndPos(-1)
</del><ins>+    , m_selectionStart(0)
+    , m_selectionEnd(0)
+    , m_selectionStartPos(-1)
+    , m_selectionEndPos(-1)
</ins><span class="cx">     , m_rendererCount(0)
</span><span class="cx">     , m_maximalOutlineSize(0)
</span><span class="cx">     , m_lazyRepaintTimer(this, &amp;RenderView::lazyRepaintTimerFired)
</span><span class="lines">@@ -842,30 +842,19 @@
</span><span class="cx">     bool caretChanged = m_selectionWasCaret != frame().selection().isCaret();
</span><span class="cx">     m_selectionWasCaret = frame().selection().isCaret();
</span><span class="cx">     // Just return if the selection hasn't changed.
</span><del>-    if (m_unsplitSelectionStart == start &amp;&amp; m_unsplitSelectionStartPos == startPos
-        &amp;&amp; m_unsplitSelectionEnd == end &amp;&amp; m_unsplitSelectionEndPos == endPos &amp;&amp; !caretChanged) {
</del><ins>+    if (m_selectionStart == start &amp;&amp; m_selectionStartPos == startPos &amp;&amp;
+        m_selectionEnd == end &amp;&amp; m_selectionEndPos == endPos &amp;&amp; !caretChanged)
</ins><span class="cx">         return;
</span><del>-    }
</del><span class="cx"> 
</span><span class="cx">     // Set global positions for new selection.
</span><del>-    m_unsplitSelectionStart = start;
-    m_unsplitSelectionStartPos = startPos;
-    m_unsplitSelectionEnd = end;
-    m_unsplitSelectionEndPos = endPos;
</del><ins>+    m_selectionStart = start;
+    m_selectionStartPos = startPos;
+    m_selectionEnd = end;
+    m_selectionEndPos = endPos;
</ins><span class="cx"> 
</span><span class="cx">     // If there is no RenderNamedFlowThreads we follow the regular selection.
</span><span class="cx">     if (!hasRenderNamedFlowThreads()) {
</span><del>-        RenderSubtreesMap singleSubtreeMap;
-        singleSubtreeMap.set(this, SelectionSubtreeRoot(start, startPos, end, endPos));
-
-        // Since there are no named flow threads, these are the final selection parameters
-        // and they must be applied to the SelectionSubtreeRoot members within RenderView.
-        setSelectionStart(start);
-        setSelectionStartPos(startPos);
-        setSelectionEnd(end);
-        setSelectionEndPos(endPos);
-
-        updateSelectionForSubtrees(singleSubtreeMap, blockRepaintMode);
</del><ins>+        setSubtreeSelection(*this, start, startPos, end, endPos, blockRepaintMode);
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -875,6 +864,7 @@
</span><span class="cx"> void RenderView::splitSelectionBetweenSubtrees(RenderObject* start, int startPos, RenderObject* end, int endPos, SelectionRepaintMode blockRepaintMode)
</span><span class="cx"> {
</span><span class="cx">     // Compute the visible selection end points for each of the subtrees.
</span><ins>+    typedef HashMap&lt;SelectionSubtreeRoot*, SelectionSubtreeRoot&gt; RenderSubtreesMap;
</ins><span class="cx">     RenderSubtreesMap renderSubtreesMap;
</span><span class="cx"> 
</span><span class="cx">     SelectionSubtreeRoot initialSelection;
</span><span class="lines">@@ -908,49 +898,33 @@
</span><span class="cx">             renderSubtreesMap.set(&amp;root, selectionData);
</span><span class="cx">         }
</span><span class="cx">     }
</span><del>-    
-    updateSelectionForSubtrees(renderSubtreesMap, blockRepaintMode);
-}
</del><span class="cx"> 
</span><del>-void RenderView::updateSelectionForSubtrees(RenderSubtreesMap&amp; renderSubtreesMap, SelectionRepaintMode blockRepaintMode)
-{
-    SubtreeOldSelectionDataMap oldSelectionDataMap;
-    for (auto it = renderSubtreesMap.begin(); it != renderSubtreesMap.end(); ++it) {
-        std::unique_ptr&lt;OldSelectionData&gt; oldSelectionData = std::make_unique&lt;OldSelectionData&gt;();
-        clearSubtreeSelection(*it-&gt;key, blockRepaintMode, *oldSelectionData);
-        oldSelectionDataMap.set(it-&gt;key, WTF::move(oldSelectionData));
-
-        SelectionSubtreeRoot&amp; subtreeSelectionData = it-&gt;value;
</del><ins>+    for (RenderSubtreesMap::iterator i = renderSubtreesMap.begin(); i != renderSubtreesMap.end(); ++i) {
+        SelectionSubtreeRoot subtreeSelectionData = i-&gt;value;
</ins><span class="cx">         subtreeSelectionData.adjustForVisibleSelection(document());
</span><del>-        
-        SelectionSubtreeRoot&amp; root = *it-&gt;key;
-        root.setSelectionStart(subtreeSelectionData.selectionStart());
-        root.setSelectionStartPos(subtreeSelectionData.selectionStartPos());
-        root.setSelectionEnd(subtreeSelectionData.selectionEnd());
-        root.setSelectionEndPos(subtreeSelectionData.selectionEndPos());
</del><ins>+        setSubtreeSelection(*i-&gt;key, subtreeSelectionData.selectionStart(), subtreeSelectionData.selectionStartPos(),
+            subtreeSelectionData.selectionEnd(), subtreeSelectionData.selectionEndPos(), blockRepaintMode);
</ins><span class="cx">     }
</span><del>-
-    // Update selection status for the objects inside the selection subtrees.
-    // This needs to be done after the previous loop updated the selectionStart/End
-    // parameters of all subtrees because we're going to be climbing up the containing
-    // block chain and we might end up in a different selection subtree.
-    for (auto it = renderSubtreesMap.begin(); it != renderSubtreesMap.end(); ++it) {
-        SelectionSubtreeRoot subtreeSelectionData = it-&gt;value;
-        OldSelectionData&amp; oldSelectionData = *oldSelectionDataMap.get(it-&gt;key);
-        applySubtreeSelection(*it-&gt;key, subtreeSelectionData.selectionStart(), subtreeSelectionData.selectionEnd(), subtreeSelectionData.selectionEndPos(), blockRepaintMode, oldSelectionData);
-    }
</del><span class="cx"> }
</span><span class="cx"> 
</span><del>-void RenderView::clearSubtreeSelection(const SelectionSubtreeRoot&amp; root, SelectionRepaintMode blockRepaintMode, OldSelectionData&amp; oldSelectionData)
</del><ins>+void RenderView::setSubtreeSelection(SelectionSubtreeRoot&amp; root, RenderObject* start, int startPos, RenderObject* end, int endPos, SelectionRepaintMode blockRepaintMode)
</ins><span class="cx"> {
</span><span class="cx">     // Record the old selected objects.  These will be used later
</span><span class="cx">     // when we compare against the new selected objects.
</span><del>-    oldSelectionData.selectionStartPos = root.selectionStartPos();
-    oldSelectionData.selectionEndPos = root.selectionEndPos();
-    
</del><ins>+    int oldStartPos = root.selectionStartPos();
+    int oldEndPos = root.selectionEndPos();
+
+    // Objects each have a single selection rect to examine.
+    typedef HashMap&lt;RenderObject*, std::unique_ptr&lt;RenderSelectionInfo&gt;&gt; SelectedObjectMap;
+    SelectedObjectMap oldSelectedObjects;
+    SelectedObjectMap newSelectedObjects;
+
</ins><span class="cx">     // Blocks contain selected objects and fill gaps between them, either on the left, right, or in between lines and blocks.
</span><span class="cx">     // In order to get the repaint rect right, we have to examine left, middle, and right rects individually, since otherwise
</span><span class="cx">     // the union of those rects might remain the same even when changes have occurred.
</span><ins>+    typedef HashMap&lt;RenderBlock*, std::unique_ptr&lt;RenderBlockSelectionInfo&gt;&gt; SelectedBlockMap;
+    SelectedBlockMap oldSelectedBlocks;
+    SelectedBlockMap newSelectedBlocks;
</ins><span class="cx"> 
</span><span class="cx">     RenderObject* os = root.selectionStart();
</span><span class="cx">     RenderObject* stop = rendererAfterPosition(root.selectionEnd(), root.selectionEndPos());
</span><span class="lines">@@ -959,11 +933,11 @@
</span><span class="cx">         if ((os-&gt;canBeSelectionLeaf() || os == root.selectionStart() || os == root.selectionEnd())
</span><span class="cx">             &amp;&amp; os-&gt;selectionState() != SelectionNone) {
</span><span class="cx">             // Blocks are responsible for painting line gaps and margin gaps.  They must be examined as well.
</span><del>-            oldSelectionData.selectedObjects.set(os, std::make_unique&lt;RenderSelectionInfo&gt;(os, true));
</del><ins>+            oldSelectedObjects.set(os, std::make_unique&lt;RenderSelectionInfo&gt;(os, true));
</ins><span class="cx">             if (blockRepaintMode == RepaintNewXOROld) {
</span><span class="cx">                 RenderBlock* cb = os-&gt;containingBlock();
</span><span class="cx">                 while (cb &amp;&amp; !cb-&gt;isRenderView()) {
</span><del>-                    std::unique_ptr&lt;RenderBlockSelectionInfo&gt;&amp; blockInfo = oldSelectionData.selectedBlocks.add(cb, nullptr).iterator-&gt;value;
</del><ins>+                    std::unique_ptr&lt;RenderBlockSelectionInfo&gt;&amp; blockInfo = oldSelectedBlocks.add(cb, nullptr).iterator-&gt;value;
</ins><span class="cx">                     if (blockInfo)
</span><span class="cx">                         break;
</span><span class="cx">                     blockInfo = std::make_unique&lt;RenderBlockSelectionInfo&gt;(cb);
</span><span class="lines">@@ -975,13 +949,17 @@
</span><span class="cx">         os = selectionIterator.next();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    auto oldObjectsEnd = oldSelectionData.selectedObjects.end();
-    for (auto i = oldSelectionData.selectedObjects.begin(); i != oldObjectsEnd; ++i)
</del><ins>+    // Now clear the selection.
+    SelectedObjectMap::iterator oldObjectsEnd = oldSelectedObjects.end();
+    for (SelectedObjectMap::iterator i = oldSelectedObjects.begin(); i != oldObjectsEnd; ++i)
</ins><span class="cx">         i-&gt;key-&gt;setSelectionStateIfNeeded(SelectionNone);
</span><del>-}
</del><span class="cx"> 
</span><del>-void RenderView::applySubtreeSelection(SelectionSubtreeRoot&amp; root, RenderObject* start, RenderObject* end, int endPos, SelectionRepaintMode blockRepaintMode, const OldSelectionData&amp; oldSelectionData)
-{
</del><ins>+    // set selection start and end
+    root.setSelectionStart(start);
+    root.setSelectionStartPos(startPos);
+    root.setSelectionEnd(end);
+    root.setSelectionEndPos(endPos);
+
</ins><span class="cx">     // Update the selection status of all objects between selectionStart and selectionEnd
</span><span class="cx">     if (start &amp;&amp; start == end)
</span><span class="cx">         start-&gt;setSelectionStateIfNeeded(SelectionBoth);
</span><span class="lines">@@ -993,8 +971,8 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     RenderObject* o = start;
</span><del>-    RenderObject* stop = rendererAfterPosition(end, endPos);
-    SelectionIterator selectionIterator(o);
</del><ins>+    stop = rendererAfterPosition(end, endPos);
+    selectionIterator = SelectionIterator(o);
</ins><span class="cx">     
</span><span class="cx">     while (o &amp;&amp; o != stop) {
</span><span class="cx">         if (o != start &amp;&amp; o != end &amp;&amp; o-&gt;canBeSelectionLeaf())
</span><span class="lines">@@ -1007,8 +985,6 @@
</span><span class="cx"> 
</span><span class="cx">     // Now that the selection state has been updated for the new objects, walk them again and
</span><span class="cx">     // put them in the new objects list.
</span><del>-    SelectedObjectMap newSelectedObjects;
-    SelectedBlockMap newSelectedBlocks;
</del><span class="cx">     o = start;
</span><span class="cx">     selectionIterator = SelectionIterator(o);
</span><span class="cx">     while (o &amp;&amp; o != stop) {
</span><span class="lines">@@ -1043,14 +1019,13 @@
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     // Have any of the old selected objects changed compared to the new selection?
</span><del>-    auto oldObjectsEnd = oldSelectionData.selectedObjects.end();
-    for (auto it = oldSelectionData.selectedObjects.begin(); it != oldObjectsEnd; ++it) {
-        RenderObject* obj = it-&gt;key;
</del><ins>+    for (SelectedObjectMap::iterator i = oldSelectedObjects.begin(); i != oldObjectsEnd; ++i) {
+        RenderObject* obj = i-&gt;key;
</ins><span class="cx">         RenderSelectionInfo* newInfo = newSelectedObjects.get(obj);
</span><del>-        RenderSelectionInfo* oldInfo = it-&gt;value.get();
</del><ins>+        RenderSelectionInfo* oldInfo = i-&gt;value.get();
</ins><span class="cx">         if (!newInfo || oldInfo-&gt;rect() != newInfo-&gt;rect() || oldInfo-&gt;state() != newInfo-&gt;state()
</span><del>-            || (root.selectionStart() == obj &amp;&amp; oldSelectionData.selectionStartPos != root.selectionStartPos())
-            || (root.selectionEnd() == obj &amp;&amp; oldSelectionData.selectionEndPos != root.selectionEndPos())) {
</del><ins>+            || (root.selectionStart() == obj &amp;&amp; oldStartPos != root.selectionStartPos())
+            || (root.selectionEnd() == obj &amp;&amp; oldEndPos != root.selectionEndPos())) {
</ins><span class="cx">             oldInfo-&gt;repaint();
</span><span class="cx">             if (newInfo) {
</span><span class="cx">                 newInfo-&gt;repaint();
</span><span class="lines">@@ -1060,16 +1035,16 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // Any new objects that remain were not found in the old objects dict, and so they need to be updated.
</span><del>-    auto newObjectsEnd = newSelectedObjects.end();
-    for (auto it = newSelectedObjects.begin(); it != newObjectsEnd; ++it)
-        it-&gt;value-&gt;repaint();
</del><ins>+    SelectedObjectMap::iterator newObjectsEnd = newSelectedObjects.end();
+    for (SelectedObjectMap::iterator i = newSelectedObjects.begin(); i != newObjectsEnd; ++i)
+        i-&gt;value-&gt;repaint();
</ins><span class="cx"> 
</span><span class="cx">     // Have any of the old blocks changed?
</span><del>-    auto oldBlocksEnd = oldSelectionData.selectedBlocks.end();
-    for (auto it = oldSelectionData.selectedBlocks.begin(); it != oldBlocksEnd; ++it) {
-        RenderBlock* block = it-&gt;key;
</del><ins>+    SelectedBlockMap::iterator oldBlocksEnd = oldSelectedBlocks.end();
+    for (SelectedBlockMap::iterator i = oldSelectedBlocks.begin(); i != oldBlocksEnd; ++i) {
+        RenderBlock* block = i-&gt;key;
</ins><span class="cx">         RenderBlockSelectionInfo* newInfo = newSelectedBlocks.get(block);
</span><del>-        RenderBlockSelectionInfo* oldInfo = it-&gt;value.get();
</del><ins>+        RenderBlockSelectionInfo* oldInfo = i-&gt;value.get();
</ins><span class="cx">         if (!newInfo || oldInfo-&gt;rects() != newInfo-&gt;rects() || oldInfo-&gt;state() != newInfo-&gt;state()) {
</span><span class="cx">             oldInfo-&gt;repaint();
</span><span class="cx">             if (newInfo) {
</span><span class="lines">@@ -1080,17 +1055,17 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // Any new blocks that remain were not found in the old blocks dict, and so they need to be updated.
</span><del>-    auto newBlocksEnd = newSelectedBlocks.end();
-    for (auto it = newSelectedBlocks.begin(); it != newBlocksEnd; ++it)
-        it-&gt;value-&gt;repaint();
</del><ins>+    SelectedBlockMap::iterator newBlocksEnd = newSelectedBlocks.end();
+    for (SelectedBlockMap::iterator i = newSelectedBlocks.begin(); i != newBlocksEnd; ++i)
+        i-&gt;value-&gt;repaint();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void RenderView::getSelection(RenderObject*&amp; startRenderer, int&amp; startOffset, RenderObject*&amp; endRenderer, int&amp; endOffset) const
</span><span class="cx"> {
</span><del>-    startRenderer = m_unsplitSelectionStart;
-    startOffset = m_unsplitSelectionStartPos;
-    endRenderer = m_unsplitSelectionEnd;
-    endOffset = m_unsplitSelectionEndPos;
</del><ins>+    startRenderer = m_selectionStart;
+    startOffset = m_selectionStartPos;
+    endRenderer = m_selectionEnd;
+    endOffset = m_selectionEndPos;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void RenderView::clearSelection()
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderViewh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderView.h (171487 => 171488)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderView.h        2014-07-23 20:34:14 UTC (rev 171487)
+++ trunk/Source/WebCore/rendering/RenderView.h        2014-07-23 20:59:40 UTC (rev 171488)
</span><span class="lines">@@ -89,8 +89,8 @@
</span><span class="cx">     void setSelection(RenderObject* start, int startPos, RenderObject* end, int endPos, SelectionRepaintMode = RepaintNewXOROld);
</span><span class="cx">     void getSelection(RenderObject*&amp; startRenderer, int&amp; startOffset, RenderObject*&amp; endRenderer, int&amp; endOffset) const;
</span><span class="cx">     void clearSelection();
</span><del>-    RenderObject* selectionUnsplitStart() const { return m_unsplitSelectionStart; }
-    RenderObject* selectionUnsplitEnd() const { return m_unsplitSelectionEnd; }
</del><ins>+    RenderObject* selectionStart() const { return m_selectionStart; }
+    RenderObject* selectionEnd() const { return m_selectionEnd; }
</ins><span class="cx">     IntRect selectionBounds(bool clipToVisibleContent = true) const;
</span><span class="cx">     void repaintSelection() const;
</span><span class="cx"> 
</span><span class="lines">@@ -304,19 +304,17 @@
</span><span class="cx">     friend class LayoutStateDisabler;
</span><span class="cx"> 
</span><span class="cx">     void splitSelectionBetweenSubtrees(RenderObject* start, int startPos, RenderObject* end, int endPos, SelectionRepaintMode blockRepaintMode);
</span><del>-    void clearSubtreeSelection(const SelectionSubtreeRoot&amp;, SelectionRepaintMode, OldSelectionData&amp;);
-    void updateSelectionForSubtrees(RenderSubtreesMap&amp;, SelectionRepaintMode);
-    void applySubtreeSelection(SelectionSubtreeRoot&amp;, RenderObject* start, RenderObject* end, int endPos, SelectionRepaintMode, const OldSelectionData&amp;);
</del><ins>+    void setSubtreeSelection(SelectionSubtreeRoot&amp;, RenderObject* start, int startPos, RenderObject* end, int endPos, SelectionRepaintMode);
</ins><span class="cx">     LayoutRect subtreeSelectionBounds(const SelectionSubtreeRoot&amp;, bool clipToVisibleContent = true) const;
</span><span class="cx">     void repaintSubtreeSelection(const SelectionSubtreeRoot&amp;) const;
</span><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     FrameView&amp; m_frameView;
</span><span class="cx"> 
</span><del>-    RenderObject* m_unsplitSelectionStart;
-    RenderObject* m_unsplitSelectionEnd;
-    int m_unsplitSelectionStartPos;
-    int m_unsplitSelectionEndPos;
</del><ins>+    RenderObject* m_selectionStart;
+    RenderObject* m_selectionEnd;
+    int m_selectionStartPos;
+    int m_selectionEndPos;
</ins><span class="cx"> 
</span><span class="cx">     uint64_t m_rendererCount;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingSelectionSubtreeRootcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/SelectionSubtreeRoot.cpp (171487 => 171488)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/SelectionSubtreeRoot.cpp        2014-07-23 20:34:14 UTC (rev 171487)
+++ trunk/Source/WebCore/rendering/SelectionSubtreeRoot.cpp        2014-07-23 20:59:40 UTC (rev 171488)
</span><span class="lines">@@ -45,14 +45,6 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-SelectionSubtreeRoot::SelectionSubtreeRoot(RenderObject* selectionStart, int selectionStartPos, RenderObject* selectionEnd, int selectionEndPos)
-    : m_selectionStart(selectionStart)
-    , m_selectionStartPos(selectionStartPos)
-    , m_selectionEnd(selectionEnd)
-    , m_selectionEndPos(selectionEndPos)
-{
-}
-
</del><span class="cx"> void SelectionSubtreeRoot::adjustForVisibleSelection(Document&amp; document)
</span><span class="cx"> {
</span><span class="cx">     if (selectionClear())
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingSelectionSubtreeRooth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/SelectionSubtreeRoot.h (171487 => 171488)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/SelectionSubtreeRoot.h        2014-07-23 20:34:14 UTC (rev 171487)
+++ trunk/Source/WebCore/rendering/SelectionSubtreeRoot.h        2014-07-23 20:59:40 UTC (rev 171488)
</span><span class="lines">@@ -31,7 +31,6 @@
</span><span class="cx"> #define SelectionSubtreeRoot_h
</span><span class="cx"> 
</span><span class="cx"> #include &quot;RenderObject.h&quot;
</span><del>-#include &quot;RenderSelectionInfo.h&quot;
</del><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="lines">@@ -39,28 +38,8 @@
</span><span class="cx"> 
</span><span class="cx"> class SelectionSubtreeRoot {
</span><span class="cx"> public:
</span><del>-    
-    typedef HashMap&lt;RenderObject*, std::unique_ptr&lt;RenderSelectionInfo&gt;&gt; SelectedObjectMap;
-    typedef HashMap&lt;RenderBlock*, std::unique_ptr&lt;RenderBlockSelectionInfo&gt;&gt; SelectedBlockMap;
-    typedef HashMap&lt;SelectionSubtreeRoot*, SelectionSubtreeRoot&gt; RenderSubtreesMap;
</del><span class="cx"> 
</span><del>-    struct OldSelectionData {
-        OldSelectionData()
-            : selectionStartPos(-1)
-            , selectionEndPos(-1)
-        {
-        }
-
-        int selectionStartPos;
-        int selectionEndPos;
-        SelectedObjectMap selectedObjects;
-        SelectedBlockMap selectedBlocks;
-    };
-    
-    typedef HashMap&lt;SelectionSubtreeRoot*, std::unique_ptr&lt;OldSelectionData&gt;&gt; SubtreeOldSelectionDataMap;
-
</del><span class="cx">     SelectionSubtreeRoot();
</span><del>-    SelectionSubtreeRoot(RenderObject* selectionStart, int selectionStartPos, RenderObject* selectionEnd, int selectionEndPos);
</del><span class="cx"> 
</span><span class="cx">     RenderObject* selectionStart() const { return m_selectionStart; }
</span><span class="cx">     int selectionStartPos() const { return m_selectionStartPos; }
</span></span></pre>
</div>
</div>

</body>
</html>