<!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>[195281] 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/195281">195281</a></dd>
<dt>Author</dt> <dd>rniwa@webkit.org</dd>
<dt>Date</dt> <dd>2016-01-19 02:47:11 -0800 (Tue, 19 Jan 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Text::splitText doesn't update Range end points anchored on parent nodes
https://bugs.webkit.org/show_bug.cgi?id=153227

Reviewed by Antti Koivisto.

LayoutTests/imported/w3c:

Rebaseline the test now that we're passing more test cases.

* web-platform-tests/dom/ranges/Range-mutations-expected.txt:

Source/WebCore:

When a Text node is split into two and there is a Range whose boundary points' container node
is its parent and offset appears after the Text node, we must update the boundary points as specified
in step 7 of the concept &quot;split&quot; a Text node at https://dom.spec.whatwg.org/#concept-text-split

1. Insert new node into parent before node’s next sibling.
2. For each range whose start node is node and start offset is greater than offset, set its start node
   to new node and decrease its start offset by offset.
3. For each range whose end node is node and end offset is greater than offset, set its end node to
   new node and decrease its end offset by offset.
4. For each range whose start node is parent and start offset is equal to the index of node + 1,
   increase its start offset by one.
5. For each range whose end node is parent and end offset is equal to the index of node + 1, increase
   its end offset by one.

Fixed the bug by implementing steps 4 and 5 in boundaryTextNodesSplit. New behavior matches the DOM spec
as well as the behavior of Firefox.

Test: fast/dom/Range/update-range-in-split-text.html

* dom/Range.cpp:
(WebCore::boundaryTextNodesSplit): See above.
* dom/RangeBoundaryPoint.h:
(WebCore::RangeBoundaryPoint::setToAfterChild): Added.

LayoutTests:

Added a regression test since the rebaselined W3C test is incomprehensible.

* fast/dom/Range/update-range-in-split-text-expected.txt: Added.
* fast/dom/Range/update-range-in-split-text.html: Added.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsimportedw3cChangeLog">trunk/LayoutTests/imported/w3c/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsdomrangesRangemutationsexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/dom/ranges/Range-mutations-expected.txt</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoredomRangecpp">trunk/Source/WebCore/dom/Range.cpp</a></li>
<li><a href="#trunkSourceWebCoredomRangeBoundaryPointh">trunk/Source/WebCore/dom/RangeBoundaryPoint.h</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsfastdomRangeupdaterangeinsplittextexpectedtxt">trunk/LayoutTests/fast/dom/Range/update-range-in-split-text-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastdomRangeupdaterangeinsplittexthtml">trunk/LayoutTests/fast/dom/Range/update-range-in-split-text.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (195280 => 195281)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2016-01-19 10:13:55 UTC (rev 195280)
+++ trunk/LayoutTests/ChangeLog        2016-01-19 10:47:11 UTC (rev 195281)
</span><span class="lines">@@ -1,5 +1,17 @@
</span><span class="cx"> 2016-01-19  Ryosuke Niwa  &lt;rniwa@webkit.org&gt;
</span><span class="cx"> 
</span><ins>+        Text::splitText doesn't update Range end points anchored on parent nodes
+        https://bugs.webkit.org/show_bug.cgi?id=153227
+
+        Reviewed by Antti Koivisto.
+
+        Added a regression test since the rebaselined W3C test is incomprehensible.
+
+        * fast/dom/Range/update-range-in-split-text-expected.txt: Added.
+        * fast/dom/Range/update-range-in-split-text.html: Added.
+
+2016-01-19  Ryosuke Niwa  &lt;rniwa@webkit.org&gt;
+
</ins><span class="cx">         innerHTML should always add a mutation record for removing all children
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=148782
</span><span class="cx">         &lt;rdar://problem/22571962&gt;
</span></span></pre></div>
<a id="trunkLayoutTestsfastdomRangeupdaterangeinsplittextexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/dom/Range/update-range-in-split-text-expected.txt (0 => 195281)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/dom/Range/update-range-in-split-text-expected.txt                                (rev 0)
+++ trunk/LayoutTests/fast/dom/Range/update-range-in-split-text-expected.txt        2016-01-19 10:47:11 UTC (rev 195281)
</span><span class="lines">@@ -0,0 +1,40 @@
</span><ins>+
+text = createTextWithParent(); range = createRange(text.parentNode, 0, text.parentNode, 0); text.splitText(0)
+PASS range.startContainer is text.parentNode
+PASS range.startOffset is 0
+PASS range.endContainer is text.parentNode
+PASS range.endOffset is 0
+
+text = createTextWithParent(); range = createRange(text.parentNode, 1, text.parentNode, 1); text.splitText(0)
+PASS range.startContainer is text.parentNode
+PASS range.startOffset is 2
+PASS range.endContainer is text.parentNode
+PASS range.endOffset is 2
+
+text = createTextWithParent(); range = createRange(text.parentNode, 0, text.parentNode, 1); text.splitText(0)
+PASS range.startContainer is text.parentNode
+PASS range.startOffset is 0
+PASS range.endContainer is text.parentNode
+PASS range.endOffset is 2
+
+text = createTextWithParentAndSiblings(); range = createRange(text.parentNode, 1, text.parentNode, 1); text.splitText(0)
+PASS range.startContainer is text.parentNode
+PASS range.startOffset is 1
+PASS range.endContainer is text.parentNode
+PASS range.endOffset is 1
+
+text = createTextWithParentAndSiblings(); range = createRange(text.parentNode, 2, text.parentNode, 2); text.splitText(0)
+PASS range.startContainer is text.parentNode
+PASS range.startOffset is 3
+PASS range.endContainer is text.parentNode
+PASS range.endOffset is 3
+
+text = createTextWithParentAndSiblings(); range = createRange(text.parentNode, 1, text.parentNode, 2); text.splitText(0)
+PASS range.startContainer is text.parentNode
+PASS range.startOffset is 1
+PASS range.endContainer is text.parentNode
+PASS range.endOffset is 3
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsfastdomRangeupdaterangeinsplittexthtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/dom/Range/update-range-in-split-text.html (0 => 195281)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/dom/Range/update-range-in-split-text.html                                (rev 0)
+++ trunk/LayoutTests/fast/dom/Range/update-range-in-split-text.html        2016-01-19 10:47:11 UTC (rev 195281)
</span><span class="lines">@@ -0,0 +1,86 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;body&gt;
+&lt;script src=&quot;../../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
+&lt;div id=&quot;container&quot; style=&quot;display: none;&quot;&gt;&lt;/div&gt;
+&lt;script&gt;
+
+function createTextWithParent()
+{
+    var container = document.getElementById('container');
+
+    var element = document.createElement('div');
+    element.textContent = 'hello';
+    container.appendChild(element);
+
+    return element.firstChild;
+}
+
+function createTextWithParentAndSiblings()
+{
+    var container = document.getElementById('container');
+
+    var element = document.createElement('div');
+    element.textContent = 'hello';
+    container.appendChild(element);
+
+    var sibling = document.createElement('b');
+    element.insertBefore(sibling, element.firstChild);
+
+    var sibling = document.createElement('i');
+    element.appendChild(sibling);
+
+    return element.childNodes[1];
+}
+
+function createRange(startContainer, startOffset, endContainer, endOffset) {
+    var range = document.createRange();
+    range.setStart(startContainer, startOffset);
+    range.setEnd(endContainer, endOffset);
+    return range;
+}
+
+debug('');
+evalAndLog('text = createTextWithParent(); range = createRange(text.parentNode, 0, text.parentNode, 0); text.splitText(0)');
+shouldBe('range.startContainer', 'text.parentNode');
+shouldBe('range.startOffset', '0');
+shouldBe('range.endContainer', 'text.parentNode');
+shouldBe('range.endOffset', '0');
+
+debug('');
+evalAndLog('text = createTextWithParent(); range = createRange(text.parentNode, 1, text.parentNode, 1); text.splitText(0)');
+shouldBe('range.startContainer', 'text.parentNode');
+shouldBe('range.startOffset', '2');
+shouldBe('range.endContainer', 'text.parentNode');
+shouldBe('range.endOffset', '2');
+
+debug('');
+evalAndLog('text = createTextWithParent(); range = createRange(text.parentNode, 0, text.parentNode, 1); text.splitText(0)');
+shouldBe('range.startContainer', 'text.parentNode');
+shouldBe('range.startOffset', '0');
+shouldBe('range.endContainer', 'text.parentNode');
+shouldBe('range.endOffset', '2');
+
+debug('');
+evalAndLog('text = createTextWithParentAndSiblings(); range = createRange(text.parentNode, 1, text.parentNode, 1); text.splitText(0)');
+shouldBe('range.startContainer', 'text.parentNode');
+shouldBe('range.startOffset', '1');
+shouldBe('range.endContainer', 'text.parentNode');
+shouldBe('range.endOffset', '1');
+
+debug('');
+evalAndLog('text = createTextWithParentAndSiblings(); range = createRange(text.parentNode, 2, text.parentNode, 2); text.splitText(0)');
+shouldBe('range.startContainer', 'text.parentNode');
+shouldBe('range.startOffset', '3');
+shouldBe('range.endContainer', 'text.parentNode');
+shouldBe('range.endOffset', '3');
+
+debug('');
+evalAndLog('text = createTextWithParentAndSiblings(); range = createRange(text.parentNode, 1, text.parentNode, 2); text.splitText(0)');
+shouldBe('range.startContainer', 'text.parentNode');
+shouldBe('range.startOffset', '1');
+shouldBe('range.endContainer', 'text.parentNode');
+shouldBe('range.endOffset', '3');
+
+&lt;/script&gt;
+&lt;script src=&quot;../../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsimportedw3cChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/ChangeLog (195280 => 195281)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/ChangeLog        2016-01-19 10:13:55 UTC (rev 195280)
+++ trunk/LayoutTests/imported/w3c/ChangeLog        2016-01-19 10:47:11 UTC (rev 195281)
</span><span class="lines">@@ -1,5 +1,16 @@
</span><span class="cx"> 2016-01-19  Ryosuke Niwa  &lt;rniwa@webkit.org&gt;
</span><span class="cx"> 
</span><ins>+        Text::splitText doesn't update Range end points anchored on parent nodes
+        https://bugs.webkit.org/show_bug.cgi?id=153227
+
+        Reviewed by Antti Koivisto.
+
+        Rebaseline the test now that we're passing more test cases.
+
+        * web-platform-tests/dom/ranges/Range-mutations-expected.txt:
+
+2016-01-19  Ryosuke Niwa  &lt;rniwa@webkit.org&gt;
+
</ins><span class="cx">         innerHTML should always add a mutation record for removing all children
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=148782
</span><span class="cx">         &lt;rdar://problem/22571962&gt;
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsdomrangesRangemutationsexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/dom/ranges/Range-mutations-expected.txt (195280 => 195281)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/dom/ranges/Range-mutations-expected.txt        2016-01-19 10:13:55 UTC (rev 195280)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/dom/ranges/Range-mutations-expected.txt        2016-01-19 10:47:11 UTC (rev 195281)
</span><span class="lines">@@ -99,18 +99,18 @@
</span><span class="cx"> FAIL detachedXmlTextNode.splitText(3), with selected range on detachedXmlTextNode from 1 to 3 assert_equals: Sanity check: selection must have exactly one range after adding the range expected 1 but got 0
</span><span class="cx"> PASS paras[0].firstChild.splitText(1), with unselected range collapsed at (paras[0], 0) 
</span><span class="cx"> FAIL paras[0].firstChild.splitText(1), with selected range collapsed at (paras[0], 0) assert_equals: Sanity check: selection's range must initially be the same as the range we added expected object &quot;&quot; but got object &quot;&quot;
</span><del>-FAIL paras[0].firstChild.splitText(1), with unselected range on paras[0] from 0 to 1 assert_equals: Wrong end offset expected 2 but got 1
</del><ins>+PASS paras[0].firstChild.splitText(1), with unselected range on paras[0] from 0 to 1 
</ins><span class="cx"> FAIL paras[0].firstChild.splitText(1), with selected range on paras[0] from 0 to 1 assert_equals: Sanity check: selection's range must initially be the same as the range we added expected object &quot;Äb̈c̈d̈ëf̈g̈ḧ
</span><span class="cx"> &quot; but got object &quot;Äb̈c̈d̈ëf̈g̈ḧ&quot;
</span><del>-FAIL paras[0].firstChild.splitText(1), with unselected range collapsed at (paras[0], 1) assert_equals: Wrong start offset expected 2 but got 1
</del><ins>+PASS paras[0].firstChild.splitText(1), with unselected range collapsed at (paras[0], 1) 
</ins><span class="cx"> FAIL paras[0].firstChild.splitText(1), with selected range collapsed at (paras[0], 1) assert_equals: Sanity check: selection's range must initially be the same as the range we added expected object &quot;&quot; but got object &quot;&quot;
</span><del>-FAIL paras[0].firstChild.splitText(1), with unselected range from (paras[0].firstChild, 1) to (paras[0], 1) assert_equals: Wrong end offset expected 2 but got 1
</del><ins>+PASS paras[0].firstChild.splitText(1), with unselected range from (paras[0].firstChild, 1) to (paras[0], 1) 
</ins><span class="cx"> FAIL paras[0].firstChild.splitText(1), with selected range from (paras[0].firstChild, 1) to (paras[0], 1) assert_equals: Sanity check: selection's range must initially be the same as the range we added expected object &quot;̈b̈c̈d̈ëf̈g̈ḧ
</span><span class="cx"> &quot; but got object &quot;b̈c̈d̈ëf̈g̈ḧ&quot;
</span><del>-FAIL paras[0].firstChild.splitText(2), with unselected range from (paras[0].firstChild, 1) to (paras[0], 1) assert_equals: Wrong end offset expected 2 but got 1
</del><ins>+PASS paras[0].firstChild.splitText(2), with unselected range from (paras[0].firstChild, 1) to (paras[0], 1) 
</ins><span class="cx"> FAIL paras[0].firstChild.splitText(2), with selected range from (paras[0].firstChild, 1) to (paras[0], 1) assert_equals: Sanity check: selection's range must initially be the same as the range we added expected object &quot;̈b̈c̈d̈ëf̈g̈ḧ
</span><span class="cx"> &quot; but got object &quot;b̈c̈d̈ëf̈g̈ḧ&quot;
</span><del>-FAIL paras[0].firstChild.splitText(3), with unselected range from (paras[0].firstChild, 1) to (paras[0], 1) assert_equals: Wrong end offset expected 2 but got 1
</del><ins>+PASS paras[0].firstChild.splitText(3), with unselected range from (paras[0].firstChild, 1) to (paras[0], 1) 
</ins><span class="cx"> FAIL paras[0].firstChild.splitText(3), with selected range from (paras[0].firstChild, 1) to (paras[0], 1) assert_equals: Sanity check: selection's range must initially be the same as the range we added expected object &quot;̈b̈c̈d̈ëf̈g̈ḧ
</span><span class="cx"> &quot; but got object &quot;b̈c̈d̈ëf̈g̈ḧ&quot;
</span><span class="cx"> PASS paras[0].firstChild.splitText(1), with unselected range from (paras[0], 0) to (paras[0].firstChild, 3) 
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (195280 => 195281)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-01-19 10:13:55 UTC (rev 195280)
+++ trunk/Source/WebCore/ChangeLog        2016-01-19 10:47:11 UTC (rev 195281)
</span><span class="lines">@@ -1,5 +1,36 @@
</span><span class="cx"> 2016-01-19  Ryosuke Niwa  &lt;rniwa@webkit.org&gt;
</span><span class="cx"> 
</span><ins>+        Text::splitText doesn't update Range end points anchored on parent nodes
+        https://bugs.webkit.org/show_bug.cgi?id=153227
+
+        Reviewed by Antti Koivisto.
+
+        When a Text node is split into two and there is a Range whose boundary points' container node
+        is its parent and offset appears after the Text node, we must update the boundary points as specified
+        in step 7 of the concept &quot;split&quot; a Text node at https://dom.spec.whatwg.org/#concept-text-split
+
+        1. Insert new node into parent before node’s next sibling.
+        2. For each range whose start node is node and start offset is greater than offset, set its start node
+           to new node and decrease its start offset by offset.
+        3. For each range whose end node is node and end offset is greater than offset, set its end node to
+           new node and decrease its end offset by offset.
+        4. For each range whose start node is parent and start offset is equal to the index of node + 1,
+           increase its start offset by one.
+        5. For each range whose end node is parent and end offset is equal to the index of node + 1, increase
+           its end offset by one.
+
+        Fixed the bug by implementing steps 4 and 5 in boundaryTextNodesSplit. New behavior matches the DOM spec
+        as well as the behavior of Firefox.
+
+        Test: fast/dom/Range/update-range-in-split-text.html
+
+        * dom/Range.cpp:
+        (WebCore::boundaryTextNodesSplit): See above.
+        * dom/RangeBoundaryPoint.h:
+        (WebCore::RangeBoundaryPoint::setToAfterChild): Added.
+
+2016-01-19  Ryosuke Niwa  &lt;rniwa@webkit.org&gt;
+
</ins><span class="cx">         CharacterData::setData doesn't need ExceptionCode as an out argument
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=153225
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoredomRangecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/Range.cpp (195280 => 195281)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/Range.cpp        2016-01-19 10:13:55 UTC (rev 195280)
+++ trunk/Source/WebCore/dom/Range.cpp        2016-01-19 10:47:11 UTC (rev 195281)
</span><span class="lines">@@ -1712,12 +1712,19 @@
</span><span class="cx"> 
</span><span class="cx"> static inline void boundaryTextNodesSplit(RangeBoundaryPoint&amp; boundary, Text* oldNode)
</span><span class="cx"> {
</span><del>-    if (boundary.container() != oldNode)
</del><ins>+    if (boundary.container() == oldNode) {
+        unsigned splitOffset = oldNode-&gt;length();
+        unsigned boundaryOffset = boundary.offset();
+        if (boundaryOffset &gt; splitOffset)
+            boundary.set(oldNode-&gt;nextSibling(), boundaryOffset - splitOffset, 0);
</ins><span class="cx">         return;
</span><del>-    unsigned boundaryOffset = boundary.offset();
-    if (boundaryOffset &lt;= oldNode-&gt;length())
-        return;
-    boundary.set(oldNode-&gt;nextSibling(), boundaryOffset - oldNode-&gt;length(), 0);
</del><ins>+    }
+    auto* parent = oldNode-&gt;parentNode();
+    if (boundary.container() == parent &amp;&amp; boundary.childBefore() == oldNode) {
+        auto* newChild = oldNode-&gt;nextSibling();
+        ASSERT(newChild);
+        boundary.setToAfterChild(*newChild);
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Range::textNodeSplit(Text* oldNode)
</span></span></pre></div>
<a id="trunkSourceWebCoredomRangeBoundaryPointh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/RangeBoundaryPoint.h (195280 => 195281)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/RangeBoundaryPoint.h        2016-01-19 10:13:55 UTC (rev 195280)
+++ trunk/Source/WebCore/dom/RangeBoundaryPoint.h        2016-01-19 10:47:11 UTC (rev 195281)
</span><span class="lines">@@ -49,6 +49,7 @@
</span><span class="cx">     void setOffset(int offset);
</span><span class="cx"> 
</span><span class="cx">     void setToBeforeChild(Node&amp;);
</span><ins>+    void setToAfterChild(Node&amp;);
</ins><span class="cx">     void setToStartOfNode(PassRefPtr&lt;Node&gt;);
</span><span class="cx">     void setToEndOfNode(PassRefPtr&lt;Node&gt;);
</span><span class="cx"> 
</span><span class="lines">@@ -142,6 +143,14 @@
</span><span class="cx">     m_offsetInContainer = m_childBeforeBoundary ? invalidOffset : 0;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+inline void RangeBoundaryPoint::setToAfterChild(Node&amp; child)
+{
+    ASSERT(child.parentNode());
+    m_childBeforeBoundary = &amp;child;
+    m_containerNode = child.parentNode();
+    m_offsetInContainer = m_childBeforeBoundary ? invalidOffset : 0;
+}
+
</ins><span class="cx"> inline void RangeBoundaryPoint::setToStartOfNode(PassRefPtr&lt;Node&gt; container)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(container);
</span></span></pre>
</div>
</div>

</body>
</html>