<!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>[205689] 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/205689">205689</a></dd>
<dt>Author</dt> <dd>cdumez@apple.com</dd>
<dt>Date</dt> <dd>2016-09-08 20:31:21 -0700 (Thu, 08 Sep 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>ol.start may return incorrect value for reversed lists when not explicitly set
https://bugs.webkit.org/show_bug.cgi?id=161713

Reviewed by Zalan Bujtas.

LayoutTests/imported/w3c:

Rebaseline several W3C tests now that more checks are passing.

* web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-expected.txt:
* web-platform-tests/html/semantics/grouping-content/the-ol-element/ol.start-reflection-2-expected.txt:

Source/WebCore:

ol.start may return incorrect value for reversed lists when not explicitly set.
This is because we're supposed to return the number of rendered &lt;li&gt; child
elements, which relies on layout. However, we did not make sure the layout is
up-to-date before counting the number of li child elements. This patch fixes
the issue.

No new tests, rebaselined existing tests.

* html/HTMLOListElement.h:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsimportedw3cChangeLog">trunk/LayoutTests/imported/w3c/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestshtmlsemanticsgroupingcontenttheolelementgroupingolexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestshtmlsemanticsgroupingcontenttheolelementolstartreflection2expectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/grouping-content/the-ol-element/ol.start-reflection-2-expected.txt</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorehtmlHTMLOListElementcpp">trunk/Source/WebCore/html/HTMLOListElement.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlHTMLOListElementh">trunk/Source/WebCore/html/HTMLOListElement.h</a></li>
<li><a href="#trunkSourceWebCorehtmlHTMLOListElementidl">trunk/Source/WebCore/html/HTMLOListElement.idl</a></li>
<li><a href="#trunkSourceWebKitmacDOMDOMHTMLOListElementmm">trunk/Source/WebKit/mac/DOM/DOMHTMLOListElement.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsimportedw3cChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/ChangeLog (205688 => 205689)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/ChangeLog        2016-09-09 02:50:02 UTC (rev 205688)
+++ trunk/LayoutTests/imported/w3c/ChangeLog        2016-09-09 03:31:21 UTC (rev 205689)
</span><span class="lines">@@ -1,5 +1,17 @@
</span><span class="cx"> 2016-09-08  Chris Dumez  &lt;cdumez@apple.com&gt;
</span><span class="cx"> 
</span><ins>+        ol.start may return incorrect value for reversed lists when not explicitly set
+        https://bugs.webkit.org/show_bug.cgi?id=161713
+
+        Reviewed by Zalan Bujtas.
+
+        Rebaseline several W3C tests now that more checks are passing.
+
+        * web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-expected.txt:
+        * web-platform-tests/html/semantics/grouping-content/the-ol-element/ol.start-reflection-2-expected.txt:
+
+2016-09-08  Chris Dumez  &lt;cdumez@apple.com&gt;
+
</ins><span class="cx">         Add support for HTMLIframeElement.allowFullscreen attribute
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=161757
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestshtmlsemanticsgroupingcontenttheolelementgroupingolexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-expected.txt (205688 => 205689)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-expected.txt        2016-09-09 02:50:02 UTC (rev 205688)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-expected.txt        2016-09-09 03:31:21 UTC (rev 205689)
</span><span class="lines">@@ -16,11 +16,11 @@
</span><span class="cx"> PASS Default start value for non-reversed list should be 1 
</span><span class="cx"> PASS IDL and content attribute parse start of '.5' correctly. 
</span><span class="cx"> PASS IDL and content attribute parse start of 'A' correctly. 
</span><del>-FAIL Default start value (if none provided) for reversed list = child li elements. assert_equals: no start attribute provided -&gt; 3 expected 3 but got 0
-FAIL Default start value (if failed to parse) for reversed list = child li elements. assert_equals: start of A -&gt; 3 (default) expected 3 but got 0
-FAIL Default start value for reversed list = child li elements (even with tons of other child elements). assert_equals: no start attribute -&gt; 3 (default) expected 3 but got 0
-FAIL Adding child element to reversed list adds 1 to start value assert_equals: Adding child element to reversed list adds 1 to start value expected 4 but got 0
-FAIL Deleting child element from reversed list reduces start value by 1 assert_equals: Deleting child element from reversed list reduces start value by 1 expected 2 but got 0
</del><ins>+PASS Default start value (if none provided) for reversed list = child li elements. 
+PASS Default start value (if failed to parse) for reversed list = child li elements. 
+PASS Default start value for reversed list = child li elements (even with tons of other child elements). 
+PASS Adding child element to reversed list adds 1 to start value 
+PASS Deleting child element from reversed list reduces start value by 1 
</ins><span class="cx"> PASS IDL and content attribute parse start of '2' correctly. 
</span><span class="cx"> PASS IDL and content attribute parse start of '-10' correctly. 
</span><span class="cx"> PASS IDL and content attribute parse start of '4.03' correctly. 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestshtmlsemanticsgroupingcontenttheolelementolstartreflection2expectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/grouping-content/the-ol-element/ol.start-reflection-2-expected.txt (205688 => 205689)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/grouping-content/the-ol-element/ol.start-reflection-2-expected.txt        2016-09-09 02:50:02 UTC (rev 205688)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/html/semantics/grouping-content/the-ol-element/ol.start-reflection-2-expected.txt        2016-09-09 03:31:21 UTC (rev 205689)
</span><span class="lines">@@ -2,5 +2,5 @@
</span><span class="cx"> Two
</span><span class="cx"> One
</span><span class="cx"> 
</span><del>-FAIL ol.start - reflection test assert_equals: expected 3 but got 0
</del><ins>+PASS ol.start - reflection test 
</ins><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (205688 => 205689)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-09-09 02:50:02 UTC (rev 205688)
+++ trunk/Source/WebCore/ChangeLog        2016-09-09 03:31:21 UTC (rev 205689)
</span><span class="lines">@@ -1,5 +1,22 @@
</span><span class="cx"> 2016-09-08  Chris Dumez  &lt;cdumez@apple.com&gt;
</span><span class="cx"> 
</span><ins>+        ol.start may return incorrect value for reversed lists when not explicitly set
+        https://bugs.webkit.org/show_bug.cgi?id=161713
+
+        Reviewed by Zalan Bujtas.
+
+        ol.start may return incorrect value for reversed lists when not explicitly set.
+        This is because we're supposed to return the number of rendered &lt;li&gt; child
+        elements, which relies on layout. However, we did not make sure the layout is
+        up-to-date before counting the number of li child elements. This patch fixes
+        the issue.
+
+        No new tests, rebaselined existing tests.
+
+        * html/HTMLOListElement.h:
+
+2016-09-08  Chris Dumez  &lt;cdumez@apple.com&gt;
+
</ins><span class="cx">         Add support for HTMLIframeElement.allowFullscreen attribute
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=161757
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlHTMLOListElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/HTMLOListElement.cpp (205688 => 205689)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/HTMLOListElement.cpp        2016-09-09 02:50:02 UTC (rev 205688)
+++ trunk/Source/WebCore/html/HTMLOListElement.cpp        2016-09-09 03:31:21 UTC (rev 205689)
</span><span class="lines">@@ -94,7 +94,7 @@
</span><span class="cx">         HTMLElement::parseAttribute(name, value);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void HTMLOListElement::setStart(int start)
</del><ins>+void HTMLOListElement::setStartForBindings(int start)
</ins><span class="cx"> {
</span><span class="cx">     setIntegralAttribute(startAttr, start);
</span><span class="cx"> }
</span><span class="lines">@@ -104,6 +104,16 @@
</span><span class="cx">     RenderListItem::updateItemValuesForOrderedList(*this);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+unsigned HTMLOListElement::itemCount(ShouldLayout shouldLayout) const
+{
+    if (shouldLayout == ShouldLayout::Yes)
+        document().updateLayoutIgnorePendingStylesheets();
+
+    if (m_shouldRecalculateItemCount)
+        const_cast&lt;HTMLOListElement*&gt;(this)-&gt;recalculateItemCount();
+    return m_itemCount;
+}
+
</ins><span class="cx"> void HTMLOListElement::recalculateItemCount()
</span><span class="cx"> {
</span><span class="cx">     m_itemCount = RenderListItem::itemCountForOrderedList(*this);
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlHTMLOListElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/HTMLOListElement.h (205688 => 205689)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/HTMLOListElement.h        2016-09-09 02:50:02 UTC (rev 205688)
+++ trunk/Source/WebCore/html/HTMLOListElement.h        2016-09-09 03:31:21 UTC (rev 205689)
</span><span class="lines">@@ -32,9 +32,14 @@
</span><span class="cx">     static Ref&lt;HTMLOListElement&gt; create(Document&amp;);
</span><span class="cx">     static Ref&lt;HTMLOListElement&gt; create(const QualifiedName&amp;, Document&amp;);
</span><span class="cx"> 
</span><del>-    int start() const { return m_start ? m_start.value() : (m_isReversed ? itemCount() : 1); }
-    WEBCORE_EXPORT void setStart(int);
</del><ins>+    // FIXME: The reason we have this start() function which does not trigger layout is because it is called
+    // from rendering code and this is unfortunately one of the few cases where the render tree is mutated
+    // while in layout.
+    int start() const { return m_start ? m_start.value() : (m_isReversed ? itemCount(ShouldLayout::No) : 1); }
+    int startForBindings() const { return m_start ? m_start.value() : (m_isReversed ? itemCount(ShouldLayout::Yes) : 1); }
</ins><span class="cx"> 
</span><ins>+    WEBCORE_EXPORT void setStartForBindings(int);
+
</ins><span class="cx">     bool isReversed() const { return m_isReversed; }
</span><span class="cx"> 
</span><span class="cx">     void itemCountChanged() { m_shouldRecalculateItemCount = true; }
</span><span class="lines">@@ -44,12 +49,8 @@
</span><span class="cx">         
</span><span class="cx">     void updateItemValues();
</span><span class="cx"> 
</span><del>-    unsigned itemCount() const
-    {
-        if (m_shouldRecalculateItemCount)
-            const_cast&lt;HTMLOListElement*&gt;(this)-&gt;recalculateItemCount();
-        return m_itemCount;
-    }
</del><ins>+    enum class ShouldLayout { No, Yes };
+    WEBCORE_EXPORT unsigned itemCount(ShouldLayout) const;
</ins><span class="cx"> 
</span><span class="cx">     WEBCORE_EXPORT void recalculateItemCount();
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlHTMLOListElementidl"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/HTMLOListElement.idl (205688 => 205689)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/HTMLOListElement.idl        2016-09-09 02:50:02 UTC (rev 205688)
+++ trunk/Source/WebCore/html/HTMLOListElement.idl        2016-09-09 03:31:21 UTC (rev 205689)
</span><span class="lines">@@ -19,7 +19,7 @@
</span><span class="cx"> 
</span><span class="cx"> interface HTMLOListElement : HTMLElement {
</span><span class="cx">     [Reflect] attribute boolean compact;
</span><del>-    attribute long start;
</del><ins>+    [ImplementedAs=startForBindings] attribute long start;
</ins><span class="cx">     [Reflect] attribute boolean reversed;
</span><span class="cx">     [Reflect] attribute DOMString type;
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebKitmacDOMDOMHTMLOListElementmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/DOM/DOMHTMLOListElement.mm (205688 => 205689)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/DOM/DOMHTMLOListElement.mm        2016-09-09 02:50:02 UTC (rev 205688)
+++ trunk/Source/WebKit/mac/DOM/DOMHTMLOListElement.mm        2016-09-09 03:31:21 UTC (rev 205689)
</span><span class="lines">@@ -54,13 +54,13 @@
</span><span class="cx"> - (int)start
</span><span class="cx"> {
</span><span class="cx">     WebCore::JSMainThreadNullState state;
</span><del>-    return IMPL-&gt;start();
</del><ins>+    return IMPL-&gt;startForBindings();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (void)setStart:(int)newStart
</span><span class="cx"> {
</span><span class="cx">     WebCore::JSMainThreadNullState state;
</span><del>-    IMPL-&gt;setStart(newStart);
</del><ins>+    IMPL-&gt;setStartForBindings(newStart);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (BOOL)reversed
</span></span></pre>
</div>
</div>

</body>
</html>