<!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>[164104] 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/164104">164104</a></dd>
<dt>Author</dt> <dd>commit-queue@webkit.org</dd>
<dt>Date</dt> <dd>2014-02-14 09:41:03 -0800 (Fri, 14 Feb 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>ASSERTION FAILED: comparePositions(newEnd, newStart) &gt;= 0 in WebCore::ApplyStyleCommand::updateStartEnd
https://bugs.webkit.org/show_bug.cgi?id=121791

Patch by Renata Hodovan &lt;rhodovan.u-szeged@partner.samsung.com&gt; on 2014-02-14
Reviewed by Darin Adler.

Source/WebCore:

If WebCore::ApplyStyleCommand::applyBlockStyle() creates a TextIterator for a range
that has an element with ReplacedElement rendering object, then a ',' is emitted in the
constructor of TextIterator. Due to this comma the end of the run range can be at the
wrong position, what makes the assertion fire. This situation can be handled the same
way in TextIterator::rangeFromLocationAndLength() as we do in case of the emitted '\n's.

Test: editing/execCommand/remove-formatting-from-iframe-in-button.html

* editing/TextIterator.cpp:
(WebCore::TextIterator::rangeFromLocationAndLength):

LayoutTests:

* editing/execCommand/remove-formatting-from-iframe-in-button-expected.txt: Added.
* editing/execCommand/remove-formatting-from-iframe-in-button.html: Added.</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="#trunkSourceWebCoreeditingTextIteratorcpp">trunk/Source/WebCore/editing/TextIterator.cpp</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestseditingexecCommandremoveformattingfromiframeinbuttonexpectedtxt">trunk/LayoutTests/editing/execCommand/remove-formatting-from-iframe-in-button-expected.txt</a></li>
<li><a href="#trunkLayoutTestseditingexecCommandremoveformattingfromiframeinbuttonhtml">trunk/LayoutTests/editing/execCommand/remove-formatting-from-iframe-in-button.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (164103 => 164104)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2014-02-14 17:35:22 UTC (rev 164103)
+++ trunk/LayoutTests/ChangeLog        2014-02-14 17:41:03 UTC (rev 164104)
</span><span class="lines">@@ -1,3 +1,13 @@
</span><ins>+2014-02-14  Renata Hodovan  &lt;rhodovan.u-szeged@partner.samsung.com&gt;
+
+        ASSERTION FAILED: comparePositions(newEnd, newStart) &gt;= 0 in WebCore::ApplyStyleCommand::updateStartEnd
+        https://bugs.webkit.org/show_bug.cgi?id=121791
+
+        Reviewed by Darin Adler.
+
+        * editing/execCommand/remove-formatting-from-iframe-in-button-expected.txt: Added.
+        * editing/execCommand/remove-formatting-from-iframe-in-button.html: Added.
+
</ins><span class="cx"> 2014-02-14  Andrei Bucur  &lt;abucur@adobe.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [CSS Regions] visibility: hidden on a region should hide its content
</span></span></pre></div>
<a id="trunkLayoutTestseditingexecCommandremoveformattingfromiframeinbuttonexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/editing/execCommand/remove-formatting-from-iframe-in-button-expected.txt (0 => 164104)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/editing/execCommand/remove-formatting-from-iframe-in-button-expected.txt                                (rev 0)
+++ trunk/LayoutTests/editing/execCommand/remove-formatting-from-iframe-in-button-expected.txt        2014-02-14 17:41:03 UTC (rev 164104)
</span><span class="lines">@@ -0,0 +1 @@
</span><ins>+PASSED - this test didn't fire ASSERT, bug 121791.
</ins></span></pre></div>
<a id="trunkLayoutTestseditingexecCommandremoveformattingfromiframeinbuttonhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/editing/execCommand/remove-formatting-from-iframe-in-button.html (0 => 164104)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/editing/execCommand/remove-formatting-from-iframe-in-button.html                                (rev 0)
+++ trunk/LayoutTests/editing/execCommand/remove-formatting-from-iframe-in-button.html        2014-02-14 17:41:03 UTC (rev 164104)
</span><span class="lines">@@ -0,0 +1,19 @@
</span><ins>+&lt;head&gt;
+        &lt;script type=&quot;text/javascript&quot;&gt;
+                function runTest() {
+                    if (window.testRunner)
+                        window.testRunner.dumpAsText();
+
+                     document.designMode=&quot;on&quot;;
+            document.execCommand(&quot;selectall&quot;);
+            document.execCommand(&quot;RemoveFormat&quot;);
+            document.execCommand(&quot;inserthtml&quot;, false, &quot;PASSED - this test didn't fire ASSERT, bug 121791.&quot;);
+        }
+        &lt;/script&gt;
+&lt;/head&gt;
+&lt;body onload=&quot;runTest()&quot;&gt;        
+        &lt;button&gt;
+            &lt;iframe/&gt;
+        &lt;/button&gt;
+&lt;/body&gt;
+
</ins></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (164103 => 164104)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-02-14 17:35:22 UTC (rev 164103)
+++ trunk/Source/WebCore/ChangeLog        2014-02-14 17:41:03 UTC (rev 164104)
</span><span class="lines">@@ -1,3 +1,21 @@
</span><ins>+2014-02-14  Renata Hodovan  &lt;rhodovan.u-szeged@partner.samsung.com&gt;
+
+        ASSERTION FAILED: comparePositions(newEnd, newStart) &gt;= 0 in WebCore::ApplyStyleCommand::updateStartEnd
+        https://bugs.webkit.org/show_bug.cgi?id=121791
+
+        Reviewed by Darin Adler.
+
+        If WebCore::ApplyStyleCommand::applyBlockStyle() creates a TextIterator for a range
+        that has an element with ReplacedElement rendering object, then a ',' is emitted in the
+        constructor of TextIterator. Due to this comma the end of the run range can be at the
+        wrong position, what makes the assertion fire. This situation can be handled the same
+        way in TextIterator::rangeFromLocationAndLength() as we do in case of the emitted '\n's.
+
+        Test: editing/execCommand/remove-formatting-from-iframe-in-button.html
+
+        * editing/TextIterator.cpp:
+        (WebCore::TextIterator::rangeFromLocationAndLength):
+
</ins><span class="cx"> 2014-02-14  Andrei Bucur  &lt;abucur@adobe.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [CSS Regions] visibility: hidden on a region should hide its content
</span></span></pre></div>
<a id="trunkSourceWebCoreeditingTextIteratorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/editing/TextIterator.cpp (164103 => 164104)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/editing/TextIterator.cpp        2014-02-14 17:35:22 UTC (rev 164103)
+++ trunk/Source/WebCore/editing/TextIterator.cpp        2014-02-14 17:41:03 UTC (rev 164104)
</span><span class="lines">@@ -2450,6 +2450,17 @@
</span><span class="cx">     return characterSubrange(entireRangeIterator, characterOffset, characterCount);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+static inline bool isInsideReplacedElement(TextIterator&amp; iterator)
+{
+    ASSERT(!iterator.atEnd());
+    ASSERT(iterator.length() == 1);
+    Node* node = iterator.node();
+    if (!node)
+        return false;
+    auto* renderer = node-&gt;renderer();
+    return renderer &amp;&amp; isRendererReplacedElement(renderer);
+}
+
</ins><span class="cx"> PassRefPtr&lt;Range&gt; TextIterator::rangeFromLocationAndLength(ContainerNode* scope, int rangeLocation, int rangeLength, bool forSelectionPreservation)
</span><span class="cx"> {
</span><span class="cx">     RefPtr&lt;Range&gt; resultRange = scope-&gt;document().createRange();
</span><span class="lines">@@ -2483,8 +2494,8 @@
</span><span class="cx">         // in those cases that textRunRange is used.
</span><span class="cx">         if (foundEnd) {
</span><span class="cx">             // FIXME: This is a workaround for the fact that the end of a run is often at the wrong
</span><del>-            // position for emitted '\n's.
-            if (len == 1 &amp;&amp; it.characterAt(0) == '\n') {
</del><ins>+            // position for emitted '\n's or if the renderer of the current node is a replaced element.
+            if (len == 1 &amp;&amp; (it.characterAt(0) == '\n' || isInsideReplacedElement(it))) {
</ins><span class="cx">                 it.advance();
</span><span class="cx">                 if (!it.atEnd()) {
</span><span class="cx">                     RefPtr&lt;Range&gt; range = it.range();
</span></span></pre>
</div>
</div>

</body>
</html>