<!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>[190330] 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/190330">190330</a></dd>
<dt>Author</dt> <dd>wenson_hsieh@apple.com</dd>
<dt>Date</dt> <dd>2015-09-29 15:56:20 -0700 (Tue, 29 Sep 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Snap offsets should update when style is programmatically changed
https://bugs.webkit.org/show_bug.cgi?id=135964
&lt;rdar://problem/18162411&gt;

Reviewed by Darin Adler.

Source/WebCore:

Tests:  css3/scroll-snap/scroll-snap-style-changed-coordinates.html
        css3/scroll-snap/scroll-snap-style-changed-repeat.html

Updating scroll snap style properties now programmatically updates the scroll snap container. Does not yet
handle the case of reparented elements with scroll snap coordinates. Adds some plumbing the FrameView and
RenderLayerCompositor to immediately update the scrolling coordinator when updating the FrameView due to
style changes.

* page/FrameView.cpp:
(WebCore::FrameView::updateScrollingCoordinatorScrollSnapProperties): Calls on the compositor to reupdate scroll snap
    properties on the FrameView.
* page/FrameView.h:
* page/scrolling/AsyncScrollingCoordinator.cpp: Sets snap offsets to an empty vector when appropriate.
(WebCore::setStateScrollingNodeSnapOffsetsAsFloat): Ditto.
(WebCore::AsyncScrollingCoordinator::frameViewLayoutUpdated): Ditto.
(WebCore::AsyncScrollingCoordinator::updateOverflowScrollingNode): Ditto.
(WebCore::AsyncScrollingCoordinator::updateScrollSnapPropertiesWithFrameView): Updates scroll snap properties
    from a given FrameView.
* page/scrolling/AsyncScrollingCoordinator.h:
* page/scrolling/ScrollingCoordinator.h:
(WebCore::ScrollingCoordinator::updateScrollSnapPropertiesWithFrameView):
* rendering/RenderLayerCompositor.cpp:
(WebCore::RenderLayerCompositor::updateScrollSnapPropertiesWithFrameView): Updates the scrolling coordinator's
    scroll snap properties.
* rendering/RenderLayerCompositor.h: Plumb scroll snap property updating to the FrameView.
* rendering/RenderLayerModelObject.cpp: Checks for style changes and updates snap offsets when appropriate.
(WebCore::scrollSnapContainerRequiresUpdateForStyleUpdate): Ditto.
(WebCore::RenderLayerModelObject::styleDidChange): Ditto.

LayoutTests:

Tests style updates in both cases where -points and -coordinates are used to position snap points.

* css3/scroll-snap/scroll-snap-style-changed-coordinates-expected.txt: Added.
* css3/scroll-snap/scroll-snap-style-changed-coordinates.html: Added.
* css3/scroll-snap/scroll-snap-style-changed-repeat-expected.txt: Added.
* css3/scroll-snap/scroll-snap-style-changed-repeat.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="#trunkSourceWebCorepageFrameViewcpp">trunk/Source/WebCore/page/FrameView.cpp</a></li>
<li><a href="#trunkSourceWebCorepageFrameViewh">trunk/Source/WebCore/page/FrameView.h</a></li>
<li><a href="#trunkSourceWebCorepagescrollingAsyncScrollingCoordinatorcpp">trunk/Source/WebCore/page/scrolling/AsyncScrollingCoordinator.cpp</a></li>
<li><a href="#trunkSourceWebCorepagescrollingAsyncScrollingCoordinatorh">trunk/Source/WebCore/page/scrolling/AsyncScrollingCoordinator.h</a></li>
<li><a href="#trunkSourceWebCorepagescrollingScrollingCoordinatorh">trunk/Source/WebCore/page/scrolling/ScrollingCoordinator.h</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderLayerCompositorcpp">trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderLayerCompositorh">trunk/Source/WebCore/rendering/RenderLayerCompositor.h</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderLayerModelObjectcpp">trunk/Source/WebCore/rendering/RenderLayerModelObject.cpp</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestscss3scrollsnapscrollsnapstylechangedcoordinatesexpectedtxt">trunk/LayoutTests/css3/scroll-snap/scroll-snap-style-changed-coordinates-expected.txt</a></li>
<li><a href="#trunkLayoutTestscss3scrollsnapscrollsnapstylechangedcoordinateshtml">trunk/LayoutTests/css3/scroll-snap/scroll-snap-style-changed-coordinates.html</a></li>
<li><a href="#trunkLayoutTestscss3scrollsnapscrollsnapstylechangedrepeatexpectedtxt">trunk/LayoutTests/css3/scroll-snap/scroll-snap-style-changed-repeat-expected.txt</a></li>
<li><a href="#trunkLayoutTestscss3scrollsnapscrollsnapstylechangedrepeathtml">trunk/LayoutTests/css3/scroll-snap/scroll-snap-style-changed-repeat.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (190329 => 190330)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2015-09-29 21:25:11 UTC (rev 190329)
+++ trunk/LayoutTests/ChangeLog        2015-09-29 22:56:20 UTC (rev 190330)
</span><span class="lines">@@ -1,3 +1,18 @@
</span><ins>+2015-09-29  Wenson Hsieh  &lt;wenson_hsieh@apple.com&gt;
+
+        Snap offsets should update when style is programmatically changed
+        https://bugs.webkit.org/show_bug.cgi?id=135964
+        &lt;rdar://problem/18162411&gt;
+
+        Reviewed by Darin Adler.
+
+        Tests style updates in both cases where -points and -coordinates are used to position snap points.
+
+        * css3/scroll-snap/scroll-snap-style-changed-coordinates-expected.txt: Added.
+        * css3/scroll-snap/scroll-snap-style-changed-coordinates.html: Added.
+        * css3/scroll-snap/scroll-snap-style-changed-repeat-expected.txt: Added.
+        * css3/scroll-snap/scroll-snap-style-changed-repeat.html: Added.
+
</ins><span class="cx"> 2015-09-29  Commit Queue  &lt;commit-queue@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         Unreviewed, rolling out r190289.
</span></span></pre></div>
<a id="trunkLayoutTestscss3scrollsnapscrollsnapstylechangedcoordinatesexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/css3/scroll-snap/scroll-snap-style-changed-coordinates-expected.txt (0 => 190330)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/css3/scroll-snap/scroll-snap-style-changed-coordinates-expected.txt                                (rev 0)
+++ trunk/LayoutTests/css3/scroll-snap/scroll-snap-style-changed-coordinates-expected.txt        2015-09-29 22:56:20 UTC (rev 190330)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+PASS successfullyParsed is true
+
+TEST COMPLETE
+Original snap offsets: vertical = { 0, 500, 1000, 1500, 2000, 2500 }
+Updated child coordinates to 0px 250px: vertical = { 0, 250, 750, 1250, 1750, 2250, 2500 }
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestscss3scrollsnapscrollsnapstylechangedcoordinateshtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/css3/scroll-snap/scroll-snap-style-changed-coordinates.html (0 => 190330)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/css3/scroll-snap/scroll-snap-style-changed-coordinates.html                                (rev 0)
+++ trunk/LayoutTests/css3/scroll-snap/scroll-snap-style-changed-coordinates.html        2015-09-29 22:56:20 UTC (rev 190330)
</span><span class="lines">@@ -0,0 +1,74 @@
</span><ins>+&lt;html&gt;
+
+    &lt;head&gt;
+        &lt;style&gt;
+            #gallery {
+                width: 515px;
+                height: 500px;
+                -webkit-scroll-snap-type: mandatory;
+                -webkit-overflow-scrolling: touch;
+                overflow-y: scroll;
+                position: absolute;
+            }
+
+            .vertical {
+                width: 500px;
+                height: 500px;
+                -webkit-scroll-snap-coordinate: 0% 0%;
+                position: absolute;
+            }
+
+            #child00 { background-color: #DD0000; left: 0; top: 0px; }
+            #child01 { background-color: #FF6666; left: 0; top: 500px; }
+            #child02 { background-color: #00DD00; left: 0; top: 1000px; }
+            #child03 { background-color: #66FF66; left: 0; top: 1500px; }
+            #child04 { background-color: #0000DD; left: 0; top: 2000px; }
+            #child05 { background-color: #6666FF; left: 0; top: 2500px; }
+        &lt;/style&gt;
+        &lt;script src=&quot;../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
+        &lt;script&gt;
+        function setup() {
+            var gallery = document.getElementById(&quot;gallery&quot;);
+            var coordinateChildElements = document.getElementsByClassName(&quot;vertical&quot;);
+
+            function snapOffsets() {
+                return window.internals.scrollSnapOffsets(gallery);
+            }
+
+            function dumpGalleryAndUpdateCoordinates() {
+                debug(&quot;Original snap offsets: &quot; + snapOffsets());
+                for (var index = 0; index &lt; coordinateChildElements.length; ++index)
+                    coordinateChildElements[index].style.webkitScrollSnapCoordinate = &quot;0px 250px&quot;;
+
+                setTimeout(dumpGalleryAndFinishTest, 0);
+            }
+
+            function dumpGalleryAndFinishTest() {
+                debug(&quot;Updated child coordinates to 0px 250px: &quot; + snapOffsets());
+                finishJSTest();
+                testRunner.notifyDone();
+            }
+
+            if (window.testRunner) {
+                window.jsTestIsAsync = true;
+                testRunner.dumpAsText();
+                testRunner.waitUntilDone();
+                setTimeout(dumpGalleryAndUpdateCoordinates, 0);
+            }
+        }
+        &lt;/script&gt;
+    &lt;/head&gt;
+
+    &lt;body onload=&quot;setup()&quot;&gt;
+        &lt;div id=&quot;gallery&quot;&gt;
+            &lt;div class=&quot;vertical&quot; id=&quot;child00&quot;&gt;&lt;/div&gt;
+            &lt;div class=&quot;vertical&quot; id=&quot;child01&quot;&gt;&lt;/div&gt;
+            &lt;div class=&quot;vertical&quot; id=&quot;child02&quot;&gt;&lt;/div&gt;
+            &lt;div class=&quot;vertical&quot; id=&quot;child03&quot;&gt;&lt;/div&gt;
+            &lt;div class=&quot;vertical&quot; id=&quot;child04&quot;&gt;&lt;/div&gt;
+            &lt;div class=&quot;vertical&quot; id=&quot;child05&quot;&gt;&lt;/div&gt;
+        &lt;/div&gt;
+        &lt;script src=&quot;../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
+    &lt;/body&gt;
+
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestscss3scrollsnapscrollsnapstylechangedrepeatexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/css3/scroll-snap/scroll-snap-style-changed-repeat-expected.txt (0 => 190330)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/css3/scroll-snap/scroll-snap-style-changed-repeat-expected.txt                                (rev 0)
+++ trunk/LayoutTests/css3/scroll-snap/scroll-snap-style-changed-repeat-expected.txt        2015-09-29 22:56:20 UTC (rev 190330)
</span><span class="lines">@@ -0,0 +1,11 @@
</span><ins>+PASS successfullyParsed is true
+
+TEST COMPLETE
+Original snap offsets: vertical = { 0, 500, 1000, 1500, 2000, 2500 }
+Updated points-y to repeat(1000px): vertical = { 0, 1000, 2000, 2500 }
+Updated destination to 0px 250px: vertical = { 0, 750, 1750, 2500 }
+Updated type to none:
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestscss3scrollsnapscrollsnapstylechangedrepeathtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/css3/scroll-snap/scroll-snap-style-changed-repeat.html (0 => 190330)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/css3/scroll-snap/scroll-snap-style-changed-repeat.html                                (rev 0)
+++ trunk/LayoutTests/css3/scroll-snap/scroll-snap-style-changed-repeat.html        2015-09-29 22:56:20 UTC (rev 190330)
</span><span class="lines">@@ -0,0 +1,83 @@
</span><ins>+&lt;html&gt;
+
+    &lt;head&gt;
+        &lt;style&gt;
+            #gallery {
+                width: 515px;
+                height: 500px;
+                -webkit-scroll-snap-type: mandatory;
+                -webkit-overflow-scrolling: touch;
+                -webkit-scroll-snap-points-y: repeat(500px);
+                overflow-y: scroll;
+                position: absolute;
+            }
+
+            .vertical {
+                width: 500px;
+                height: 500px;
+            }
+
+            #child00 { background-color: #DD0000; }
+            #child01 { background-color: #FF6666; }
+            #child02 { background-color: #00DD00; }
+            #child03 { background-color: #66FF66; }
+            #child04 { background-color: #0000DD; }
+            #child05 { background-color: #6666FF; }
+        &lt;/style&gt;
+        &lt;script src=&quot;../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
+        &lt;script&gt;
+        function setup() {
+            var gallery = document.getElementById(&quot;gallery&quot;);
+
+            function snapOffsets() {
+                return window.internals.scrollSnapOffsets(gallery);
+            }
+
+            // Test starts here. Each function call triggers the next.
+            function dumpSnapOffsetsAndUpdatePointsY() {
+                debug(&quot;Original snap offsets: &quot; + snapOffsets());
+                gallery.style.webkitScrollSnapPointsY = &quot;repeat(1000px)&quot;;
+                setTimeout(dumpSnapOffsetsAndUpdateDestination, 0);
+            }
+
+            function dumpSnapOffsetsAndUpdateDestination() {
+                debug(&quot;Updated points-y to repeat(1000px): &quot; + snapOffsets());
+                gallery.style.webkitScrollSnapDestination = &quot;0px 250px&quot;;
+                setTimeout(dumpSnapOffsetsAndUpdateType, 0);
+            }
+
+            function dumpSnapOffsetsAndUpdateType() {
+                debug(&quot;Updated destination to 0px 250px: &quot; + snapOffsets());
+                gallery.style.webkitScrollSnapType = &quot;none&quot;;
+                setTimeout(dumpSnapOffsetsAndFinishTest, 0);
+            }
+
+            function dumpSnapOffsetsAndFinishTest() {
+                debug(&quot;Updated type to none:&quot; + snapOffsets());
+                finishJSTest();
+                testRunner.notifyDone();
+            }
+
+            if (window.testRunner) {
+                window.jsTestIsAsync = true;
+                testRunner.dumpAsText();
+                testRunner.waitUntilDone();
+                setTimeout(dumpSnapOffsetsAndUpdatePointsY, 0);
+            }
+        }
+        &lt;/script&gt;
+    &lt;/head&gt;
+
+    &lt;body onload=&quot;setup()&quot;&gt;
+        &lt;div id=&quot;gallery&quot;&gt;
+            &lt;div class=&quot;vertical&quot; id=&quot;child00&quot;&gt;&lt;/div&gt;
+            &lt;div class=&quot;vertical&quot; id=&quot;child01&quot;&gt;&lt;/div&gt;
+            &lt;div class=&quot;vertical&quot; id=&quot;child02&quot;&gt;&lt;/div&gt;
+            &lt;div class=&quot;vertical&quot; id=&quot;child03&quot;&gt;&lt;/div&gt;
+            &lt;div class=&quot;vertical&quot; id=&quot;child04&quot;&gt;&lt;/div&gt;
+            &lt;div class=&quot;vertical&quot; id=&quot;child05&quot;&gt;&lt;/div&gt;
+        &lt;/div&gt;
+        &lt;script src=&quot;../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
+    &lt;/body&gt;
+
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (190329 => 190330)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-09-29 21:25:11 UTC (rev 190329)
+++ trunk/Source/WebCore/ChangeLog        2015-09-29 22:56:20 UTC (rev 190330)
</span><span class="lines">@@ -1,3 +1,40 @@
</span><ins>+2015-09-29  Wenson Hsieh  &lt;wenson_hsieh@apple.com&gt;
+
+        Snap offsets should update when style is programmatically changed
+        https://bugs.webkit.org/show_bug.cgi?id=135964
+        &lt;rdar://problem/18162411&gt;
+
+        Reviewed by Darin Adler.
+
+        Tests:  css3/scroll-snap/scroll-snap-style-changed-coordinates.html
+                css3/scroll-snap/scroll-snap-style-changed-repeat.html
+
+        Updating scroll snap style properties now programmatically updates the scroll snap container. Does not yet
+        handle the case of reparented elements with scroll snap coordinates. Adds some plumbing the FrameView and
+        RenderLayerCompositor to immediately update the scrolling coordinator when updating the FrameView due to
+        style changes.
+
+        * page/FrameView.cpp:
+        (WebCore::FrameView::updateScrollingCoordinatorScrollSnapProperties): Calls on the compositor to reupdate scroll snap
+            properties on the FrameView.
+        * page/FrameView.h:
+        * page/scrolling/AsyncScrollingCoordinator.cpp: Sets snap offsets to an empty vector when appropriate.
+        (WebCore::setStateScrollingNodeSnapOffsetsAsFloat): Ditto.
+        (WebCore::AsyncScrollingCoordinator::frameViewLayoutUpdated): Ditto.
+        (WebCore::AsyncScrollingCoordinator::updateOverflowScrollingNode): Ditto.
+        (WebCore::AsyncScrollingCoordinator::updateScrollSnapPropertiesWithFrameView): Updates scroll snap properties
+            from a given FrameView.
+        * page/scrolling/AsyncScrollingCoordinator.h:
+        * page/scrolling/ScrollingCoordinator.h:
+        (WebCore::ScrollingCoordinator::updateScrollSnapPropertiesWithFrameView):
+        * rendering/RenderLayerCompositor.cpp:
+        (WebCore::RenderLayerCompositor::updateScrollSnapPropertiesWithFrameView): Updates the scrolling coordinator's
+            scroll snap properties.
+        * rendering/RenderLayerCompositor.h: Plumb scroll snap property updating to the FrameView.
+        * rendering/RenderLayerModelObject.cpp: Checks for style changes and updates snap offsets when appropriate.
+        (WebCore::scrollSnapContainerRequiresUpdateForStyleUpdate): Ditto.
+        (WebCore::RenderLayerModelObject::styleDidChange): Ditto.
+
</ins><span class="cx"> 2015-09-29  Jer Noble  &lt;jer.noble@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         REGRESSION: WebAudio user-gesture restriction is no longer lifted by touchstart event
</span></span></pre></div>
<a id="trunkSourceWebCorepageFrameViewcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/FrameView.cpp (190329 => 190330)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/FrameView.cpp        2015-09-29 21:25:11 UTC (rev 190329)
+++ trunk/Source/WebCore/page/FrameView.cpp        2015-09-29 22:56:20 UTC (rev 190330)
</span><span class="lines">@@ -1007,6 +1007,11 @@
</span><span class="cx">     
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><ins>+
+void FrameView::updateScrollingCoordinatorScrollSnapProperties() const
+{
+    renderView()-&gt;compositor().updateScrollSnapPropertiesWithFrameView(*this);
+}
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> bool FrameView::flushCompositingStateForThisFrame(const Frame&amp; rootFrameForFlush)
</span></span></pre></div>
<a id="trunkSourceWebCorepageFrameViewh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/FrameView.h (190329 => 190330)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/FrameView.h        2015-09-29 21:25:11 UTC (rev 190329)
+++ trunk/Source/WebCore/page/FrameView.h        2015-09-29 22:56:20 UTC (rev 190330)
</span><span class="lines">@@ -544,6 +544,7 @@
</span><span class="cx"> #if ENABLE(CSS_SCROLL_SNAP)
</span><span class="cx">     void updateSnapOffsets() override;
</span><span class="cx">     bool isScrollSnapInProgress() const override;
</span><ins>+    void updateScrollingCoordinatorScrollSnapProperties() const;
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     virtual float adjustScrollStepForFixedContent(float step, ScrollbarOrientation, ScrollGranularity) override;
</span></span></pre></div>
<a id="trunkSourceWebCorepagescrollingAsyncScrollingCoordinatorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/scrolling/AsyncScrollingCoordinator.cpp (190329 => 190330)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/scrolling/AsyncScrollingCoordinator.cpp        2015-09-29 21:25:11 UTC (rev 190329)
+++ trunk/Source/WebCore/page/scrolling/AsyncScrollingCoordinator.cpp        2015-09-29 22:56:20 UTC (rev 190330)
</span><span class="lines">@@ -62,14 +62,15 @@
</span><span class="cx">     scheduleTreeStateCommit();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static inline void setStateScrollingNodeSnapOffsetsAsFloat(ScrollingStateScrollingNode&amp; node, ScrollEventAxis axis, const Vector&lt;LayoutUnit&gt;&amp; snapOffsets, float deviceScaleFactor)
</del><ins>+static inline void setStateScrollingNodeSnapOffsetsAsFloat(ScrollingStateScrollingNode&amp; node, ScrollEventAxis axis, const Vector&lt;LayoutUnit&gt;* snapOffsets, float deviceScaleFactor)
</ins><span class="cx"> {
</span><span class="cx">     // FIXME: Incorporate current page scale factor in snapping to device pixel. Perhaps we should just convert to float here and let UI process do the pixel snapping?
</span><span class="cx">     Vector&lt;float&gt; snapOffsetsAsFloat;
</span><del>-    snapOffsetsAsFloat.reserveInitialCapacity(snapOffsets.size());
-    for (auto&amp; offset : snapOffsets)
-        snapOffsetsAsFloat.append(roundToDevicePixel(offset, deviceScaleFactor, false));
-
</del><ins>+    if (snapOffsets) {
+        snapOffsetsAsFloat.reserveInitialCapacity(snapOffsets-&gt;size());
+        for (auto&amp; offset : *snapOffsets)
+            snapOffsetsAsFloat.uncheckedAppend(roundToDevicePixel(offset, deviceScaleFactor, false));
+    }
</ins><span class="cx">     if (axis == ScrollEventAxis::Horizontal)
</span><span class="cx">         node.setHorizontalSnapOffsets(snapOffsetsAsFloat);
</span><span class="cx">     else
</span><span class="lines">@@ -141,14 +142,7 @@
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(CSS_SCROLL_SNAP)
</span><span class="cx">     frameView.updateSnapOffsets();
</span><del>-    if (const Vector&lt;LayoutUnit&gt;* horizontalSnapOffsets = frameView.horizontalSnapOffsets())
-        setStateScrollingNodeSnapOffsetsAsFloat(*node, ScrollEventAxis::Horizontal, *horizontalSnapOffsets, m_page-&gt;deviceScaleFactor());
-
-    if (const Vector&lt;LayoutUnit&gt;* verticalSnapOffsets = frameView.verticalSnapOffsets())
-        setStateScrollingNodeSnapOffsetsAsFloat(*node, ScrollEventAxis::Vertical, *verticalSnapOffsets, m_page-&gt;deviceScaleFactor());
-
-    node-&gt;setCurrentHorizontalSnapPointIndex(frameView.currentHorizontalSnapPointIndex());
-    node-&gt;setCurrentVerticalSnapPointIndex(frameView.currentVerticalSnapPointIndex());
</del><ins>+    updateScrollSnapPropertiesWithFrameView(frameView);
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> #if PLATFORM(COCOA)
</span><span class="lines">@@ -485,8 +479,8 @@
</span><span class="cx">         node-&gt;setReachableContentsSize(scrollingGeometry-&gt;reachableContentSize);
</span><span class="cx">         node-&gt;setScrollableAreaSize(scrollingGeometry-&gt;scrollableAreaSize);
</span><span class="cx"> #if ENABLE(CSS_SCROLL_SNAP)
</span><del>-        setStateScrollingNodeSnapOffsetsAsFloat(*node, ScrollEventAxis::Horizontal, scrollingGeometry-&gt;horizontalSnapOffsets, m_page-&gt;deviceScaleFactor());
-        setStateScrollingNodeSnapOffsetsAsFloat(*node, ScrollEventAxis::Vertical, scrollingGeometry-&gt;verticalSnapOffsets, m_page-&gt;deviceScaleFactor());
</del><ins>+        setStateScrollingNodeSnapOffsetsAsFloat(*node, ScrollEventAxis::Horizontal, &amp;scrollingGeometry-&gt;horizontalSnapOffsets, m_page-&gt;deviceScaleFactor());
+        setStateScrollingNodeSnapOffsetsAsFloat(*node, ScrollEventAxis::Vertical, &amp;scrollingGeometry-&gt;verticalSnapOffsets, m_page-&gt;deviceScaleFactor());
</ins><span class="cx">         node-&gt;setCurrentHorizontalSnapPointIndex(scrollingGeometry-&gt;currentHorizontalSnapPointIndex);
</span><span class="cx">         node-&gt;setCurrentVerticalSnapPointIndex(scrollingGeometry-&gt;currentVerticalSnapPointIndex);
</span><span class="cx"> #endif
</span><span class="lines">@@ -621,6 +615,16 @@
</span><span class="cx"> {
</span><span class="cx">     return scrollingTree()-&gt;isScrollSnapInProgress();
</span><span class="cx"> }
</span><ins>+
+void AsyncScrollingCoordinator::updateScrollSnapPropertiesWithFrameView(const FrameView&amp; frameView)
+{
+    if (auto node = downcast&lt;ScrollingStateFrameScrollingNode&gt;(m_scrollingStateTree-&gt;stateNodeForID(frameView.scrollLayerID()))) {
+        setStateScrollingNodeSnapOffsetsAsFloat(*node, ScrollEventAxis::Horizontal, frameView.horizontalSnapOffsets(), m_page-&gt;deviceScaleFactor());
+        setStateScrollingNodeSnapOffsetsAsFloat(*node, ScrollEventAxis::Vertical, frameView.verticalSnapOffsets(), m_page-&gt;deviceScaleFactor());
+        node-&gt;setCurrentHorizontalSnapPointIndex(frameView.currentHorizontalSnapPointIndex());
+        node-&gt;setCurrentVerticalSnapPointIndex(frameView.currentVerticalSnapPointIndex());
+    }
+}
</ins><span class="cx"> #endif
</span><span class="cx">     
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCorepagescrollingAsyncScrollingCoordinatorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/scrolling/AsyncScrollingCoordinator.h (190329 => 190330)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/scrolling/AsyncScrollingCoordinator.h        2015-09-29 21:25:11 UTC (rev 190329)
+++ trunk/Source/WebCore/page/scrolling/AsyncScrollingCoordinator.h        2015-09-29 22:56:20 UTC (rev 190330)
</span><span class="lines">@@ -62,6 +62,10 @@
</span><span class="cx">     void removeTestDeferralForReason(WheelEventTestTrigger::ScrollableAreaIdentifier, WheelEventTestTrigger::DeferTestTriggerReason) const;
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+#if ENABLE(CSS_SCROLL_SNAP)
+    WEBCORE_EXPORT void updateScrollSnapPropertiesWithFrameView(const FrameView&amp;) override;
+#endif
+
</ins><span class="cx"> protected:
</span><span class="cx">     WEBCORE_EXPORT AsyncScrollingCoordinator(Page*);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorepagescrollingScrollingCoordinatorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/scrolling/ScrollingCoordinator.h (190329 => 190330)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/scrolling/ScrollingCoordinator.h        2015-09-29 21:25:11 UTC (rev 190329)
+++ trunk/Source/WebCore/page/scrolling/ScrollingCoordinator.h        2015-09-29 22:56:20 UTC (rev 190330)
</span><span class="lines">@@ -179,6 +179,7 @@
</span><span class="cx">     virtual String scrollingStateTreeAsText() const;
</span><span class="cx">     virtual bool isRubberBandInProgress() const { return false; }
</span><span class="cx">     virtual bool isScrollSnapInProgress() const { return false; }
</span><ins>+    virtual void updateScrollSnapPropertiesWithFrameView(const FrameView&amp;) { }
</ins><span class="cx">     virtual void setScrollPinningBehavior(ScrollPinningBehavior) { }
</span><span class="cx"> 
</span><span class="cx">     // Generated a unique id for scroll layers.
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderLayerCompositorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp (190329 => 190330)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp        2015-09-29 21:25:11 UTC (rev 190329)
+++ trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp        2015-09-29 22:56:20 UTC (rev 190330)
</span><span class="lines">@@ -4264,4 +4264,12 @@
</span><span class="cx">     return m_compositingUpdateCount;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+#if ENABLE(CSS_SCROLL_SNAP)
+void RenderLayerCompositor::updateScrollSnapPropertiesWithFrameView(const FrameView&amp; frameView)
+{
+    if (ScrollingCoordinator* coordinator = scrollingCoordinator())
+        coordinator-&gt;updateScrollSnapPropertiesWithFrameView(frameView);
+}
+#endif
+
</ins><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderLayerCompositorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderLayerCompositor.h (190329 => 190330)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderLayerCompositor.h        2015-09-29 21:25:11 UTC (rev 190329)
+++ trunk/Source/WebCore/rendering/RenderLayerCompositor.h        2015-09-29 22:56:20 UTC (rev 190330)
</span><span class="lines">@@ -313,6 +313,10 @@
</span><span class="cx">     void setRootExtendedBackgroundColor(const Color&amp;);
</span><span class="cx">     Color rootExtendedBackgroundColor() const { return m_rootExtendedBackgroundColor; }
</span><span class="cx"> 
</span><ins>+#if ENABLE(CSS_SCROLL_SNAP)
+    void updateScrollSnapPropertiesWithFrameView(const FrameView&amp;);
+#endif
+
</ins><span class="cx">     // For testing.
</span><span class="cx">     WEBCORE_EXPORT void startTrackingLayerFlushes();
</span><span class="cx">     WEBCORE_EXPORT unsigned layerFlushCount() const;
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderLayerModelObjectcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderLayerModelObject.cpp (190329 => 190330)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderLayerModelObject.cpp        2015-09-29 21:25:11 UTC (rev 190329)
+++ trunk/Source/WebCore/rendering/RenderLayerModelObject.cpp        2015-09-29 22:56:20 UTC (rev 190330)
</span><span class="lines">@@ -26,6 +26,7 @@
</span><span class="cx"> #include &quot;RenderLayerModelObject.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;RenderLayer.h&quot;
</span><ins>+#include &quot;RenderLayerCompositor.h&quot;
</ins><span class="cx"> #include &quot;RenderView.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="lines">@@ -124,6 +125,16 @@
</span><span class="cx">     RenderElement::styleWillChange(diff, newStyle);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+#if ENABLE(CSS_SCROLL_SNAP)
+static bool scrollSnapContainerRequiresUpdateForStyleUpdate(const RenderStyle&amp; oldStyle, const RenderStyle&amp; newStyle)
+{
+    return !(oldStyle.scrollSnapType() == newStyle.scrollSnapType()
+        &amp;&amp; oldStyle.scrollSnapPointsX() == newStyle.scrollSnapPointsX()
+        &amp;&amp; oldStyle.scrollSnapPointsY() == newStyle.scrollSnapPointsY()
+        &amp;&amp; oldStyle.scrollSnapDestination() == newStyle.scrollSnapDestination());
+}
+#endif
+
</ins><span class="cx"> void RenderLayerModelObject::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle)
</span><span class="cx"> {
</span><span class="cx">     RenderElement::styleDidChange(diff, oldStyle);
</span><span class="lines">@@ -169,6 +180,33 @@
</span><span class="cx">         else
</span><span class="cx">             view().frameView().removeViewportConstrainedObject(this);
</span><span class="cx">     }
</span><ins>+
+#if ENABLE(CSS_SCROLL_SNAP)
+    const RenderStyle&amp; newStyle = style();
+    if (oldStyle &amp;&amp; scrollSnapContainerRequiresUpdateForStyleUpdate(*oldStyle, newStyle)) {
+        if (RenderLayer* renderLayer = layer()) {
+            renderLayer-&gt;updateSnapOffsets();
+            renderLayer-&gt;updateScrollSnapState();
+        } else if (isBody() || isRoot()) {
+            FrameView&amp; frameView = view().frameView();
+            frameView.updateSnapOffsets();
+            frameView.updateScrollSnapState();
+            frameView.updateScrollingCoordinatorScrollSnapProperties();
+        }
+    }
+    if (oldStyle &amp;&amp; oldStyle-&gt;scrollSnapCoordinates() != newStyle.scrollSnapCoordinates()) {
+        const RenderBox* scrollSnapBox = enclosingBox().findEnclosingScrollableContainer();
+        if (scrollSnapBox &amp;&amp; scrollSnapBox-&gt;layer()) {
+            const RenderStyle&amp; style = scrollSnapBox-&gt;style();
+            if (style.scrollSnapType() != ScrollSnapType::None) {
+                scrollSnapBox-&gt;layer()-&gt;updateSnapOffsets();
+                scrollSnapBox-&gt;layer()-&gt;updateScrollSnapState();
+                if (scrollSnapBox-&gt;isBody() || scrollSnapBox-&gt;isRoot())
+                    scrollSnapBox-&gt;view().frameView().updateScrollingCoordinatorScrollSnapProperties();
+            }
+        }
+    }
+#endif
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre>
</div>
</div>

</body>
</html>