<!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>[183595] 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/183595">183595</a></dd>
<dt>Author</dt> <dd>bfulgham@apple.com</dd>
<dt>Date</dt> <dd>2015-04-29 17:29:05 -0700 (Wed, 29 Apr 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Expand test infrastructure to support scrolling tests
https://bugs.webkit.org/show_bug.cgi?id=143684
&lt;rdar://problem/20375516&gt;

Reviewed by Simon Fraser.

Source/WebCore:

Tested by various fast/scrolling and platform/mac-wk2/tiled-drawing/scrolling tests.

This series of changes adds a new singleton class, 'WheelEventTestTrigger', which encapsulates a
function object to be fired when scroll events are finished. The object also keeps track of reasons
why the test should not yet fire (e.g., 'rubberbanding' is active) so that tests do not incorrectly
check rendering state in the middle of an animation.

Switch from the original WeakPtr design to ThreadSafeRefPtr, because WeakPtr cannot be shared
across multiple threads.

* page/FrameView.cpp:
(WebCore::FrameView::layout): Make sure ScrollAnimator knows about any active test trigger.
(WebCore::FrameView::setScrollPosition): Ditto.
(WebCore::FrameView::didAddScrollbar): Ditto.
* page/MainFrame.cpp:
(WebCore::MainFrame::testTrigger): Moved to Page.
(WebCore::MainFrame::ensureTestTrigger): Ditto.
* page/MainFrame.h:
* page/Page.cpp:
(WebCore::Page::testTrigger): Moved from MainFrame, and converted to use RefPtr.
(WebCore::Page::ensureTestTrigger): Ditto.
* page/Page.h:
* page/WheelEventTestTrigger.cpp:
(WebCore::WheelEventTestTrigger::WheelEventTestTrigger): Remove WeakPtr code.
(WebCore::WheelEventTestTrigger::createWeakPtr): Deleted.
* page/WheelEventTestTrigger.h:
* page/mac/EventHandlerMac.mm:
(WebCore::EventHandler::platformPrepareForWheelEvents): Make sure the scroll animator knows about
any active test trigger object.
* page/scrolling/AsyncScrollingCoordinator.cpp:
(WebCore::AsyncScrollingCoordinator::updateScrollPositionAfterAsyncScroll): Notify WheelEventTestTrigger
that the scrolling thread is synced with the main thread.
* platform/ScrollAnimator.h: Hold a RefPtr to the WheelEventTestTrigger. 
(WebCore::ScrollAnimator::ScrollAnimator::setWheelEventTestTrigger):
* platform/cocoa/ScrollController.h:
* platform/cocoa/ScrollController.mm:
(WebCore::ScrollController::startSnapRubberbandTimer): Notify test trigger to hold tests until rubber band
snapping is complete.
(WebCore::ScrollController::stopSnapRubberbandTimer): Notify test trigger that rubber band snapping is done.
(WebCore::ScrollController::startScrollSnapTimer): Notify test trigger to hold tests until scroll snapping
is complete.
(WebCore::ScrollController::stopScrollSnapTimer): Notify test trigger that scroll snapping is done.
* platform/mac/ScrollAnimatorMac.mm:
(WebCore::ScrollAnimatorMac::didBeginScrollGesture): Notify test trigger that a content scroll is in progress.
(WebCore::ScrollAnimatorMac::didEndScrollGesture): Notify test trigger that a content scroll is finished.
(WebCore::ScrollAnimatorMac::sendContentAreaScrolledSoon): Notify test trigger to hold tests until the content
scrolling is complete.
(WebCore::ScrollAnimatorMac::sendContentAreaScrolledTimerFired): Notify test trigger that content scrolling is done.
* rendering/RenderBox.cpp:
(WebCore::connectScrollAnimatorToTestTrigger): Helper function.
(WebCore::RenderBox::setScrollLeft): Call 'connectScrollAnimatorToTestTrigger' to connect the ScrollAnimator
to the WheelEventTestTrigger so that future scroll operations can notify the test infrastructure.
(WebCore::RenderBox::setScrollTop): Ditto.
* rendering/RenderLayer.cpp:
(WebCore::RenderLayer::createScrollbar): Make sure the ScrollAnimator knows about any active test triggers.
* rendering/RenderListBox.cpp:
(WebCore::connectScrollAnimatorToTestTrigger): Helper function.
(WebCore::RenderListBox::setScrollLeft): Call 'connectScrollAnimatorToTestTrigger' to connect the ScrollAnimator
to the WheelEventTestTrigger so that future scroll operations can notify the test infrastructure.
(WebCore::RenderListBox::setScrollTop): Ditto.
(WebCore::RenderListBox::createScrollbar): Ditto.
* testing/js/WebCoreTestSupport.cpp:
(WebCoreTestSupport::monitorWheelEvents): Look for WheelEventTestTrigger in Page, rather than MainFrame.
(WebCoreTestSupport::setTestCallbackAndStartNotificationTimer): Ditto.

Source/WebKit2:

Update test programs to activate (and deactivate) the new WheelEventTestTrigger logic.

* UIProcess/API/C/WKPage.cpp:
(WKPageClearWheelEventTestTriggers): Added.
* UIProcess/API/C/WKPage.h:
* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::clearWheelEventTestTrigger): Added.
* UIProcess/WebPageProxy.h:
* WebProcess/InjectedBundle/API/c/WKBundlePage.cpp:
(WKBundlePageStartMonitoringScrollOperations): Interact with WheelEventTestTrigger through
the Page, rather than MainFrame.
(WKBundlePageRegisterScrollOperationCompletionCallback): Ditto.
* WebProcess/Plugins/PDF/PDFPlugin.mm:
(WebKit::PDFPlugin::createScrollbar): Make sure scroll animator knows about any
active test triggers.
* WebPage/EventDispatcher.mm:
(WebKit::EventDispatcher::wheelEvent): If the wheel event was passed to the scrolling thread,
defer tests until a Scrolling Thread Sync has occurred.
* WebPage/WebPage.cpp:
(WebKit::WebPage::clearWheelEventTestTrigger): Added.
* WebPage/WebPage.h:
* WebPage/WebPage.message.in: Added ClearWheelEventTestTrigger message.

Tools:

* DumpRenderTree/mac/DumpRenderTree.mm:
(resetWebViewToConsistentStateBeforeTesting): Make sure the WheelEventTestTrigger state is
reset before the next test run.
* WebKitTestRunner/TestController.cpp:
(WTR::TestController::resetStateToConsistentValues): Ditto.&quot;</pre>

<h3>Modified Paths</h3>
<ul>
<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="#trunkSourceWebCorepageMainFramecpp">trunk/Source/WebCore/page/MainFrame.cpp</a></li>
<li><a href="#trunkSourceWebCorepageMainFrameh">trunk/Source/WebCore/page/MainFrame.h</a></li>
<li><a href="#trunkSourceWebCorepagePagecpp">trunk/Source/WebCore/page/Page.cpp</a></li>
<li><a href="#trunkSourceWebCorepagePageh">trunk/Source/WebCore/page/Page.h</a></li>
<li><a href="#trunkSourceWebCorepageWheelEventTestTriggercpp">trunk/Source/WebCore/page/WheelEventTestTrigger.cpp</a></li>
<li><a href="#trunkSourceWebCorepageWheelEventTestTriggerh">trunk/Source/WebCore/page/WheelEventTestTrigger.h</a></li>
<li><a href="#trunkSourceWebCorepagemacEventHandlerMacmm">trunk/Source/WebCore/page/mac/EventHandlerMac.mm</a></li>
<li><a href="#trunkSourceWebCorepagescrollingAsyncScrollingCoordinatorcpp">trunk/Source/WebCore/page/scrolling/AsyncScrollingCoordinator.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformScrollAnimatorh">trunk/Source/WebCore/platform/ScrollAnimator.h</a></li>
<li><a href="#trunkSourceWebCoreplatformcocoaScrollControllerh">trunk/Source/WebCore/platform/cocoa/ScrollController.h</a></li>
<li><a href="#trunkSourceWebCoreplatformcocoaScrollControllermm">trunk/Source/WebCore/platform/cocoa/ScrollController.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformmacScrollAnimatorMacmm">trunk/Source/WebCore/platform/mac/ScrollAnimatorMac.mm</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderBoxcpp">trunk/Source/WebCore/rendering/RenderBox.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderLayercpp">trunk/Source/WebCore/rendering/RenderLayer.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderListBoxcpp">trunk/Source/WebCore/rendering/RenderListBox.cpp</a></li>
<li><a href="#trunkSourceWebCoretestingjsWebCoreTestSupportcpp">trunk/Source/WebCore/testing/js/WebCoreTestSupport.cpp</a></li>
<li><a href="#trunkSourceWebCoretestingjsWebCoreTestSupporth">trunk/Source/WebCore/testing/js/WebCoreTestSupport.h</a></li>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPICWKPagecpp">trunk/Source/WebKit2/UIProcess/API/C/WKPage.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPICWKPageh">trunk/Source/WebKit2/UIProcess/API/C/WKPage.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessWebPageProxycpp">trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessWebPageProxyh">trunk/Source/WebKit2/UIProcess/WebPageProxy.h</a></li>
<li><a href="#trunkSourceWebKit2WebProcessInjectedBundleAPIcWKBundlePagecpp">trunk/Source/WebKit2/WebProcess/InjectedBundle/API/c/WKBundlePage.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessPluginsPDFPDFPluginmm">trunk/Source/WebKit2/WebProcess/Plugins/PDF/PDFPlugin.mm</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageEventDispatchercpp">trunk/Source/WebKit2/WebProcess/WebPage/EventDispatcher.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageWebPagecpp">trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageWebPageh">trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageWebPagemessagesin">trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in</a></li>
<li><a href="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
<li><a href="#trunkToolsDumpRenderTreemacDumpRenderTreemm">trunk/Tools/DumpRenderTree/mac/DumpRenderTree.mm</a></li>
<li><a href="#trunkToolsWebKitTestRunnerTestControllercpp">trunk/Tools/WebKitTestRunner/TestController.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (183594 => 183595)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-04-30 00:28:04 UTC (rev 183594)
+++ trunk/Source/WebCore/ChangeLog        2015-04-30 00:29:05 UTC (rev 183595)
</span><span class="lines">@@ -1,3 +1,76 @@
</span><ins>+2015-04-29  Brent Fulgham  &lt;bfulgham@apple.com&gt;
+
+        Expand test infrastructure to support scrolling tests
+        https://bugs.webkit.org/show_bug.cgi?id=143684
+        &lt;rdar://problem/20375516&gt;
+
+        Reviewed by Simon Fraser.
+
+        Tested by various fast/scrolling and platform/mac-wk2/tiled-drawing/scrolling tests.
+
+        This series of changes adds a new singleton class, 'WheelEventTestTrigger', which encapsulates a
+        function object to be fired when scroll events are finished. The object also keeps track of reasons
+        why the test should not yet fire (e.g., 'rubberbanding' is active) so that tests do not incorrectly
+        check rendering state in the middle of an animation.
+
+        Switch from the original WeakPtr design to ThreadSafeRefPtr, because WeakPtr cannot be shared
+        across multiple threads.
+
+        * page/FrameView.cpp:
+        (WebCore::FrameView::layout): Make sure ScrollAnimator knows about any active test trigger.
+        (WebCore::FrameView::setScrollPosition): Ditto.
+        (WebCore::FrameView::didAddScrollbar): Ditto.
+        * page/MainFrame.cpp:
+        (WebCore::MainFrame::testTrigger): Moved to Page.
+        (WebCore::MainFrame::ensureTestTrigger): Ditto.
+        * page/MainFrame.h:
+        * page/Page.cpp:
+        (WebCore::Page::testTrigger): Moved from MainFrame, and converted to use RefPtr.
+        (WebCore::Page::ensureTestTrigger): Ditto.
+        * page/Page.h:
+        * page/WheelEventTestTrigger.cpp:
+        (WebCore::WheelEventTestTrigger::WheelEventTestTrigger): Remove WeakPtr code.
+        (WebCore::WheelEventTestTrigger::createWeakPtr): Deleted.
+        * page/WheelEventTestTrigger.h:
+        * page/mac/EventHandlerMac.mm:
+        (WebCore::EventHandler::platformPrepareForWheelEvents): Make sure the scroll animator knows about
+        any active test trigger object.
+        * page/scrolling/AsyncScrollingCoordinator.cpp:
+        (WebCore::AsyncScrollingCoordinator::updateScrollPositionAfterAsyncScroll): Notify WheelEventTestTrigger
+        that the scrolling thread is synced with the main thread.
+        * platform/ScrollAnimator.h: Hold a RefPtr to the WheelEventTestTrigger. 
+        (WebCore::ScrollAnimator::ScrollAnimator::setWheelEventTestTrigger):
+        * platform/cocoa/ScrollController.h:
+        * platform/cocoa/ScrollController.mm:
+        (WebCore::ScrollController::startSnapRubberbandTimer): Notify test trigger to hold tests until rubber band
+        snapping is complete.
+        (WebCore::ScrollController::stopSnapRubberbandTimer): Notify test trigger that rubber band snapping is done.
+        (WebCore::ScrollController::startScrollSnapTimer): Notify test trigger to hold tests until scroll snapping
+        is complete.
+        (WebCore::ScrollController::stopScrollSnapTimer): Notify test trigger that scroll snapping is done.
+        * platform/mac/ScrollAnimatorMac.mm:
+        (WebCore::ScrollAnimatorMac::didBeginScrollGesture): Notify test trigger that a content scroll is in progress.
+        (WebCore::ScrollAnimatorMac::didEndScrollGesture): Notify test trigger that a content scroll is finished.
+        (WebCore::ScrollAnimatorMac::sendContentAreaScrolledSoon): Notify test trigger to hold tests until the content
+        scrolling is complete.
+        (WebCore::ScrollAnimatorMac::sendContentAreaScrolledTimerFired): Notify test trigger that content scrolling is done.
+        * rendering/RenderBox.cpp:
+        (WebCore::connectScrollAnimatorToTestTrigger): Helper function.
+        (WebCore::RenderBox::setScrollLeft): Call 'connectScrollAnimatorToTestTrigger' to connect the ScrollAnimator
+        to the WheelEventTestTrigger so that future scroll operations can notify the test infrastructure.
+        (WebCore::RenderBox::setScrollTop): Ditto.
+        * rendering/RenderLayer.cpp:
+        (WebCore::RenderLayer::createScrollbar): Make sure the ScrollAnimator knows about any active test triggers.
+        * rendering/RenderListBox.cpp:
+        (WebCore::connectScrollAnimatorToTestTrigger): Helper function.
+        (WebCore::RenderListBox::setScrollLeft): Call 'connectScrollAnimatorToTestTrigger' to connect the ScrollAnimator
+        to the WheelEventTestTrigger so that future scroll operations can notify the test infrastructure.
+        (WebCore::RenderListBox::setScrollTop): Ditto.
+        (WebCore::RenderListBox::createScrollbar): Ditto.
+        * testing/js/WebCoreTestSupport.cpp:
+        (WebCoreTestSupport::monitorWheelEvents): Look for WheelEventTestTrigger in Page, rather than MainFrame.
+        (WebCoreTestSupport::setTestCallbackAndStartNotificationTimer): Ditto.
+
</ins><span class="cx"> 2015-04-29  Javier Fernandez  &lt;jfernandez@igalia.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [CSS Box Alignment] Unifying alignment data in a single class
</span></span></pre></div>
<a id="trunkSourceWebCorepageFrameViewcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/FrameView.cpp (183594 => 183595)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/FrameView.cpp        2015-04-30 00:28:04 UTC (rev 183594)
+++ trunk/Source/WebCore/page/FrameView.cpp        2015-04-30 00:29:05 UTC (rev 183595)
</span><span class="lines">@@ -87,6 +87,7 @@
</span><span class="cx"> #include &quot;TextResourceDecoder.h&quot;
</span><span class="cx"> #include &quot;TextStream.h&quot;
</span><span class="cx"> #include &quot;TiledBacking.h&quot;
</span><ins>+#include &quot;WheelEventTestTrigger.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> #include &lt;wtf/CurrentTime.h&gt;
</span><span class="cx"> #include &lt;wtf/Ref.h&gt;
</span><span class="lines">@@ -1265,7 +1266,9 @@
</span><span class="cx">                     // Set the initial hMode to AlwaysOff if we're auto.
</span><span class="cx">                     if (hMode == ScrollbarAuto)
</span><span class="cx">                         setHorizontalScrollbarMode(ScrollbarAlwaysOff); // This causes a horizontal scrollbar to disappear.
</span><del>-
</del><ins>+                    Page* page = frame().page();
+                    if (page &amp;&amp; page-&gt;expectsWheelEventTriggers())
+                        scrollAnimator().setWheelEventTestTrigger(page-&gt;testTrigger());
</ins><span class="cx">                     setScrollbarModes(hMode, vMode);
</span><span class="cx">                     setScrollbarsSuppressed(false, true);
</span><span class="cx">                 } else
</span><span class="lines">@@ -2049,6 +2052,9 @@
</span><span class="cx"> {
</span><span class="cx">     TemporaryChange&lt;bool&gt; changeInProgrammaticScroll(m_inProgrammaticScroll, true);
</span><span class="cx">     m_maintainScrollPositionAnchor = nullptr;
</span><ins>+    Page* page = frame().page();
+    if (page &amp;&amp; page-&gt;expectsWheelEventTriggers())
+        scrollAnimator().setWheelEventTestTrigger(page-&gt;testTrigger());
</ins><span class="cx">     ScrollView::setScrollPosition(scrollPoint);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -4561,6 +4567,9 @@
</span><span class="cx"> void FrameView::didAddScrollbar(Scrollbar* scrollbar, ScrollbarOrientation orientation)
</span><span class="cx"> {
</span><span class="cx">     ScrollableArea::didAddScrollbar(scrollbar, orientation);
</span><ins>+    Page* page = frame().page();
+    if (page &amp;&amp; page-&gt;expectsWheelEventTriggers())
+        scrollAnimator().setWheelEventTestTrigger(page-&gt;testTrigger());
</ins><span class="cx">     if (AXObjectCache* cache = axObjectCache())
</span><span class="cx">         cache-&gt;handleScrollbarUpdate(this);
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorepageMainFramecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/MainFrame.cpp (183594 => 183595)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/MainFrame.cpp        2015-04-30 00:28:04 UTC (rev 183594)
+++ trunk/Source/WebCore/page/MainFrame.cpp        2015-04-30 00:29:05 UTC (rev 183595)
</span><span class="lines">@@ -33,7 +33,6 @@
</span><span class="cx"> #include &quot;ScrollLatchingState.h&quot;
</span><span class="cx"> #include &quot;Settings.h&quot;
</span><span class="cx"> #include &quot;WheelEventDeltaTracker.h&quot;
</span><del>-#include &quot;WheelEventTestTrigger.h&quot;
</del><span class="cx"> #include &lt;wtf/NeverDestroyed.h&gt;
</span><span class="cx"> 
</span><span class="cx"> #if PLATFORM(MAC)
</span><span class="lines">@@ -127,22 +126,4 @@
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-WheelEventTestTrigger* MainFrame::testTrigger() const
-{
-    return m_testTrigger.get();
</del><span class="cx"> }
</span><del>-
-WheelEventTestTrigger* MainFrame::ensureTestTrigger()
-{
-    if (!m_testTrigger)
-        m_testTrigger = std::make_unique&lt;WheelEventTestTrigger&gt;();
-
-    return m_testTrigger.get();
-}
-
-void MainFrame::clearTrigger()
-{
-    m_testTrigger = nullptr;
-}
-
-}
</del></span></pre></div>
<a id="trunkSourceWebCorepageMainFrameh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/MainFrame.h (183594 => 183595)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/MainFrame.h        2015-04-30 00:28:04 UTC (rev 183594)
+++ trunk/Source/WebCore/page/MainFrame.h        2015-04-30 00:29:05 UTC (rev 183595)
</span><span class="lines">@@ -37,7 +37,6 @@
</span><span class="cx"> class ScrollLatchingState;
</span><span class="cx"> class ServicesOverlayController;
</span><span class="cx"> class WheelEventDeltaTracker;
</span><del>-class WheelEventTestTrigger;
</del><span class="cx"> 
</span><span class="cx"> class MainFrame final : public Frame {
</span><span class="cx"> public:
</span><span class="lines">@@ -64,10 +63,6 @@
</span><span class="cx"> 
</span><span class="cx">     WEBCORE_EXPORT DiagnosticLoggingClient&amp; diagnosticLoggingClient() const;
</span><span class="cx"> 
</span><del>-    WEBCORE_EXPORT WheelEventTestTrigger* testTrigger() const;
-    WEBCORE_EXPORT WheelEventTestTrigger* ensureTestTrigger();
-    WEBCORE_EXPORT void clearTrigger();
-
</del><span class="cx"> private:
</span><span class="cx">     MainFrame(Page&amp;, PageConfiguration&amp;);
</span><span class="cx"> 
</span><span class="lines">@@ -81,7 +76,6 @@
</span><span class="cx">     std::unique_ptr&lt;ServicesOverlayController&gt; m_servicesOverlayController;
</span><span class="cx"> #endif
</span><span class="cx"> #endif
</span><del>-    std::unique_ptr&lt;WheelEventTestTrigger&gt; m_testTrigger;
</del><span class="cx"> 
</span><span class="cx">     std::unique_ptr&lt;WheelEventDeltaTracker&gt; m_recentWheelEventDeltaTracker;
</span><span class="cx">     std::unique_ptr&lt;PageOverlayController&gt; m_pageOverlayController;
</span></span></pre></div>
<a id="trunkSourceWebCorepagePagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/Page.cpp (183594 => 183595)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/Page.cpp        2015-04-30 00:28:04 UTC (rev 183594)
+++ trunk/Source/WebCore/page/Page.cpp        2015-04-30 00:29:05 UTC (rev 183595)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Apple Inc. All Rights Reserved.
</del><ins>+ * Copyright (C) 2006-2015  Apple Inc. All Rights Reserved.
</ins><span class="cx">  * Copyright (C) 2008 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
</span><span class="cx">  *
</span><span class="cx">  * This library is free software; you can redistribute it and/or
</span><span class="lines">@@ -1724,4 +1724,23 @@
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+RefPtr&lt;WheelEventTestTrigger&gt; Page::testTrigger() const
+{
+    return m_testTrigger;
+}
+
+WheelEventTestTrigger&amp; Page::ensureTestTrigger()
+{
+    if (!m_testTrigger)
+        m_testTrigger = adoptRef(new WheelEventTestTrigger());
+
+    return *m_testTrigger;
+}
+
+void Page::clearTrigger()
+{
+    m_testTrigger = nullptr;
+}
+    
+
</ins><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCorepagePageh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/Page.h (183594 => 183595)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/Page.h        2015-04-30 00:28:04 UTC (rev 183594)
+++ trunk/Source/WebCore/page/Page.h        2015-04-30 00:29:05 UTC (rev 183595)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2013 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2006-2010, 2013, 2015 Apple Inc. All rights reserved.
</ins><span class="cx">  * Copyright (C) 2008 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
</span><span class="cx">  *
</span><span class="cx">  * This library is free software; you can redistribute it and/or
</span><span class="lines">@@ -36,6 +36,7 @@
</span><span class="cx"> #include &quot;Supplementable.h&quot;
</span><span class="cx"> #include &quot;ViewState.h&quot;
</span><span class="cx"> #include &quot;ViewportArguments.h&quot;
</span><ins>+#include &quot;WheelEventTestTrigger.h&quot;
</ins><span class="cx"> #include &lt;memory&gt;
</span><span class="cx"> #include &lt;wtf/Forward.h&gt;
</span><span class="cx"> #include &lt;wtf/HashMap.h&gt;
</span><span class="lines">@@ -439,6 +440,11 @@
</span><span class="cx">     WEBCORE_EXPORT void setShouldPlayToPlaybackTarget(uint64_t, bool);
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+    WEBCORE_EXPORT RefPtr&lt;WheelEventTestTrigger&gt; testTrigger() const;
+    WEBCORE_EXPORT WheelEventTestTrigger&amp; ensureTestTrigger();
+    WEBCORE_EXPORT void clearTrigger();
+    WEBCORE_EXPORT bool expectsWheelEventTriggers() const { return !!m_testTrigger; }
+
</ins><span class="cx"> private:
</span><span class="cx">     WEBCORE_EXPORT void initGroup();
</span><span class="cx"> 
</span><span class="lines">@@ -586,6 +592,7 @@
</span><span class="cx">     Ref&lt;StorageNamespaceProvider&gt; m_storageNamespaceProvider;
</span><span class="cx">     RefPtr&lt;UserContentController&gt; m_userContentController;
</span><span class="cx">     Ref&lt;VisitedLinkStore&gt; m_visitedLinkStore;
</span><ins>+    RefPtr&lt;WheelEventTestTrigger&gt; m_testTrigger;
</ins><span class="cx"> 
</span><span class="cx">     HashSet&lt;ViewStateChangeObserver*&gt; m_viewStateChangeObservers;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorepageWheelEventTestTriggercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/WheelEventTestTrigger.cpp (183594 => 183595)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/WheelEventTestTrigger.cpp        2015-04-30 00:28:04 UTC (rev 183594)
+++ trunk/Source/WebCore/page/WheelEventTestTrigger.cpp        2015-04-30 00:29:05 UTC (rev 183595)
</span><span class="lines">@@ -33,15 +33,9 @@
</span><span class="cx"> 
</span><span class="cx"> WheelEventTestTrigger::WheelEventTestTrigger()
</span><span class="cx">     : m_testTriggerTimer(RunLoop::current(), this, &amp;WheelEventTestTrigger::triggerTestTimerFired)
</span><del>-    , m_weakPtrFactory(this)
</del><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-WeakPtr&lt;WheelEventTestTrigger&gt; WheelEventTestTrigger::createWeakPtr()
-{
-    return m_weakPtrFactory.createWeakPtr();
-}
-
</del><span class="cx"> void WheelEventTestTrigger::clearAllTestDeferrals()
</span><span class="cx"> {
</span><span class="cx">     std::lock_guard&lt;std::mutex&gt; lock(m_testTriggerMutex);
</span></span></pre></div>
<a id="trunkSourceWebCorepageWheelEventTestTriggerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/WheelEventTestTrigger.h (183594 => 183595)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/WheelEventTestTrigger.h        2015-04-30 00:28:04 UTC (rev 183594)
+++ trunk/Source/WebCore/page/WheelEventTestTrigger.h        2015-04-30 00:29:05 UTC (rev 183595)
</span><span class="lines">@@ -32,12 +32,13 @@
</span><span class="cx"> #include &lt;mutex&gt;
</span><span class="cx"> #include &lt;set&gt;
</span><span class="cx"> #include &lt;wtf/HashMap.h&gt;
</span><ins>+#include &lt;wtf/RefPtr.h&gt;
</ins><span class="cx"> #include &lt;wtf/RunLoop.h&gt;
</span><del>-#include &lt;wtf/WeakPtr.h&gt;
</del><ins>+#include &lt;wtf/ThreadSafeRefCounted.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-class WheelEventTestTrigger {
</del><ins>+class WheelEventTestTrigger : public ThreadSafeRefCounted&lt;WheelEventTestTrigger&gt; {
</ins><span class="cx">     WTF_MAKE_NONCOPYABLE(WheelEventTestTrigger); WTF_MAKE_FAST_ALLOCATED;
</span><span class="cx"> public:
</span><span class="cx">     WheelEventTestTrigger();
</span><span class="lines">@@ -51,20 +52,16 @@
</span><span class="cx">         ScrollingThreadSyncNeeded,
</span><span class="cx">         ContentScrollInProgress
</span><span class="cx">     };
</span><del>-    typedef void* ScrollableAreaIdentifier;
-    void deferTestsForReason(ScrollableAreaIdentifier, DeferTestTriggerReason);
-    void removeTestDeferralForReason(ScrollableAreaIdentifier, DeferTestTriggerReason);
</del><ins>+    typedef const void* ScrollableAreaIdentifier;
+    void WEBCORE_EXPORT deferTestsForReason(ScrollableAreaIdentifier, DeferTestTriggerReason);
+    void WEBCORE_EXPORT removeTestDeferralForReason(ScrollableAreaIdentifier, DeferTestTriggerReason);
</ins><span class="cx">     void triggerTestTimerFired();
</span><span class="cx"> 
</span><del>-    WeakPtr&lt;WheelEventTestTrigger&gt; createWeakPtr();
-
</del><span class="cx"> private:
</span><span class="cx">     std::function&lt;void()&gt; m_testNotificationCallback;
</span><span class="cx">     RunLoop::Timer&lt;WheelEventTestTrigger&gt; m_testTriggerTimer;
</span><span class="cx">     mutable std::mutex m_testTriggerMutex;
</span><del>-    WTF::HashMap&lt;void*, std::set&lt;DeferTestTriggerReason&gt;&gt; m_deferTestTriggerReasons;
-
-    WeakPtrFactory&lt;WheelEventTestTrigger&gt; m_weakPtrFactory;
</del><ins>+    WTF::HashMap&lt;ScrollableAreaIdentifier, std::set&lt;DeferTestTriggerReason&gt;&gt; m_deferTestTriggerReasons;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorepagemacEventHandlerMacmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/mac/EventHandlerMac.mm (183594 => 183595)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/mac/EventHandlerMac.mm        2015-04-30 00:28:04 UTC (rev 183594)
+++ trunk/Source/WebCore/page/mac/EventHandlerMac.mm        2015-04-30 00:29:05 UTC (rev 183595)
</span><span class="lines">@@ -59,6 +59,7 @@
</span><span class="cx"> #include &quot;Settings.h&quot;
</span><span class="cx"> #include &quot;ShadowRoot.h&quot;
</span><span class="cx"> #include &quot;WebCoreSystemInterface.h&quot;
</span><ins>+#include &quot;WheelEventTestTrigger.h&quot;
</ins><span class="cx"> #include &lt;wtf/MainThread.h&gt;
</span><span class="cx"> #include &lt;wtf/NeverDestroyed.h&gt;
</span><span class="cx"> #include &lt;wtf/ObjcRuntimeExtras.h&gt;
</span><span class="lines">@@ -882,6 +883,10 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx">     
</span><ins>+    Page* page = m_frame.page();
+    if (scrollableArea &amp;&amp; page &amp;&amp; page-&gt;expectsWheelEventTriggers())
+        scrollableArea-&gt;scrollAnimator().setWheelEventTestTrigger(page-&gt;testTrigger());
+
</ins><span class="cx">     ScrollLatchingState* latchingState = m_frame.mainFrame().latchingState();
</span><span class="cx">     if (wheelEvent.shouldConsiderLatching()) {
</span><span class="cx">         if (scrollableContainer &amp;&amp; scrollableArea) {
</span></span></pre></div>
<a id="trunkSourceWebCorepagescrollingAsyncScrollingCoordinatorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/scrolling/AsyncScrollingCoordinator.cpp (183594 => 183595)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/scrolling/AsyncScrollingCoordinator.cpp        2015-04-30 00:28:04 UTC (rev 183594)
+++ trunk/Source/WebCore/page/scrolling/AsyncScrollingCoordinator.cpp        2015-04-30 00:29:05 UTC (rev 183595)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2014 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2014-2015 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -34,12 +34,14 @@
</span><span class="cx"> #include &quot;GraphicsLayer.h&quot;
</span><span class="cx"> #include &quot;MainFrame.h&quot;
</span><span class="cx"> #include &quot;Page.h&quot;
</span><ins>+#include &quot;ScrollAnimator.h&quot;
</ins><span class="cx"> #include &quot;ScrollingConstraints.h&quot;
</span><span class="cx"> #include &quot;ScrollingStateFixedNode.h&quot;
</span><span class="cx"> #include &quot;ScrollingStateFrameScrollingNode.h&quot;
</span><span class="cx"> #include &quot;ScrollingStateOverflowScrollingNode.h&quot;
</span><span class="cx"> #include &quot;ScrollingStateStickyNode.h&quot;
</span><span class="cx"> #include &quot;ScrollingStateTree.h&quot;
</span><ins>+#include &quot;WheelEventTestTrigger.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="lines">@@ -354,6 +356,14 @@
</span><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx"> 
</span><ins>+#if PLATFORM(COCOA)
+        if (m_page-&gt;expectsWheelEventTriggers()) {
+            frameView.scrollAnimator().setWheelEventTestTrigger(m_page-&gt;testTrigger());
+            if (const auto&amp; trigger = m_page-&gt;testTrigger())
+                trigger-&gt;removeTestDeferralForReason(reinterpret_cast&lt;WheelEventTestTrigger::ScrollableAreaIdentifier&gt;(m_page), WheelEventTestTrigger::ScrollingThreadSyncNeeded);
+        }
+#endif
+        
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -364,6 +374,14 @@
</span><span class="cx">         scrollableArea-&gt;setIsUserScroll(false);
</span><span class="cx">         if (scrollingLayerPositionAction == SetScrollingLayerPosition)
</span><span class="cx">             m_page-&gt;editorClient().overflowScrollPositionChanged();
</span><ins>+
+#if PLATFORM(COCOA)
+        if (m_page-&gt;expectsWheelEventTriggers()) {
+            frameView.scrollAnimator().setWheelEventTestTrigger(m_page-&gt;testTrigger());
+            if (const auto&amp; trigger = m_page-&gt;testTrigger())
+                trigger-&gt;removeTestDeferralForReason(reinterpret_cast&lt;WheelEventTestTrigger::ScrollableAreaIdentifier&gt;(m_page), WheelEventTestTrigger::ScrollingThreadSyncNeeded);
+        }
+#endif
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformScrollAnimatorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/ScrollAnimator.h (183594 => 183595)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/ScrollAnimator.h        2015-04-30 00:28:04 UTC (rev 183594)
+++ trunk/Source/WebCore/platform/ScrollAnimator.h        2015-04-30 00:29:05 UTC (rev 183595)
</span><span class="lines">@@ -36,6 +36,7 @@
</span><span class="cx"> #include &quot;LayoutUnit.h&quot;
</span><span class="cx"> #include &quot;PlatformWheelEvent.h&quot;
</span><span class="cx"> #include &quot;ScrollTypes.h&quot;
</span><ins>+#include &quot;WheelEventTestTrigger.h&quot;
</ins><span class="cx"> #include &lt;wtf/FastMalloc.h&gt;
</span><span class="cx"> #include &lt;wtf/Forward.h&gt;
</span><span class="cx"> 
</span><span class="lines">@@ -49,6 +50,7 @@
</span><span class="cx"> class PlatformTouchEvent;
</span><span class="cx"> class ScrollableArea;
</span><span class="cx"> class Scrollbar;
</span><ins>+class WheelEventTestTrigger;
</ins><span class="cx"> 
</span><span class="cx"> #if (ENABLE(CSS_SCROLL_SNAP) || ENABLE(RUBBER_BANDING)) &amp;&amp; PLATFORM(MAC)
</span><span class="cx"> class ScrollAnimator : private ScrollControllerClient {
</span><span class="lines">@@ -117,6 +119,11 @@
</span><span class="cx"> 
</span><span class="cx">     virtual bool isRubberBandInProgress() const { return false; }
</span><span class="cx"> 
</span><ins>+    void setWheelEventTestTrigger(RefPtr&lt;WheelEventTestTrigger&gt;&amp;&amp; testTrigger) { m_wheelEventTestTrigger = testTrigger; }
+#if (ENABLE(CSS_SCROLL_SNAP) || ENABLE(RUBBER_BANDING)) &amp;&amp; PLATFORM(MAC)
+    WheelEventTestTrigger* testTrigger() const override { return m_wheelEventTestTrigger.get(); }
+#endif
+    
</ins><span class="cx"> #if ENABLE(CSS_SCROLL_SNAP) &amp;&amp; PLATFORM(MAC)
</span><span class="cx">     bool processWheelEventForScrollSnap(const PlatformWheelEvent&amp;);
</span><span class="cx">     void updateScrollAnimatorsAndTimers();
</span><span class="lines">@@ -128,6 +135,7 @@
</span><span class="cx">     virtual void notifyPositionChanged(const FloatSize&amp; delta);
</span><span class="cx"> 
</span><span class="cx">     ScrollableArea&amp; m_scrollableArea;
</span><ins>+    RefPtr&lt;WheelEventTestTrigger&gt; m_wheelEventTestTrigger;
</ins><span class="cx"> #if (ENABLE(CSS_SCROLL_SNAP) || ENABLE(RUBBER_BANDING)) &amp;&amp; PLATFORM(MAC)
</span><span class="cx">     ScrollController m_scrollController;
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformcocoaScrollControllerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/cocoa/ScrollController.h (183594 => 183595)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/cocoa/ScrollController.h        2015-04-30 00:28:04 UTC (rev 183594)
+++ trunk/Source/WebCore/platform/cocoa/ScrollController.h        2015-04-30 00:29:05 UTC (rev 183595)
</span><span class="lines">@@ -42,6 +42,7 @@
</span><span class="cx"> 
</span><span class="cx"> class PlatformWheelEvent;
</span><span class="cx"> class ScrollableArea;
</span><ins>+class WheelEventTestTrigger;
</ins><span class="cx"> 
</span><span class="cx"> class ScrollControllerClient {
</span><span class="cx"> protected:
</span><span class="lines">@@ -75,6 +76,8 @@
</span><span class="cx">     // the page to scroll to the nearest boundary point.
</span><span class="cx">     virtual void adjustScrollPositionToBoundsIfNecessary() = 0;
</span><span class="cx"> 
</span><ins>+    virtual WheelEventTestTrigger* testTrigger() const { return nullptr; }
+
</ins><span class="cx"> #if ENABLE(CSS_SCROLL_SNAP) &amp;&amp; PLATFORM(MAC)
</span><span class="cx">     virtual LayoutUnit scrollOffsetOnAxis(ScrollEventAxis) const = 0;
</span><span class="cx">     virtual void immediateScrollOnAxis(ScrollEventAxis, float delta) = 0;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformcocoaScrollControllermm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/cocoa/ScrollController.mm (183594 => 183595)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/cocoa/ScrollController.mm        2015-04-30 00:28:04 UTC (rev 183594)
+++ trunk/Source/WebCore/platform/cocoa/ScrollController.mm        2015-04-30 00:29:05 UTC (rev 183595)
</span><span class="lines">@@ -28,6 +28,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;PlatformWheelEvent.h&quot;
</span><span class="cx"> #include &quot;WebCoreSystemInterface.h&quot;
</span><ins>+#include &quot;WheelEventTestTrigger.h&quot;
</ins><span class="cx"> #include &lt;sys/sysctl.h&gt;
</span><span class="cx"> #include &lt;sys/time.h&gt;
</span><span class="cx"> 
</span><span class="lines">@@ -411,6 +412,9 @@
</span><span class="cx"> {
</span><span class="cx">     m_client.startSnapRubberbandTimer();
</span><span class="cx">     m_snapRubberbandTimer.startRepeating(1.0 / 60.0);
</span><ins>+
+    if (auto* trigger = m_client.testTrigger())
+        trigger-&gt;deferTestsForReason(reinterpret_cast&lt;WheelEventTestTrigger::ScrollableAreaIdentifier&gt;(this), WheelEventTestTrigger::RubberbandInProgress);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void ScrollController::stopSnapRubberbandTimer()
</span><span class="lines">@@ -418,6 +422,9 @@
</span><span class="cx">     m_client.stopSnapRubberbandTimer();
</span><span class="cx">     m_snapRubberbandTimer.stop();
</span><span class="cx">     m_snapRubberbandTimerIsActive = false;
</span><ins>+    
+    if (auto* trigger = m_client.testTrigger())
+        trigger-&gt;removeTestDeferralForReason(reinterpret_cast&lt;WheelEventTestTrigger::ScrollableAreaIdentifier&gt;(this), WheelEventTestTrigger::RubberbandInProgress);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void ScrollController::snapRubberBand()
</span><span class="lines">@@ -613,6 +620,12 @@
</span><span class="cx">         m_client.startScrollSnapTimer(axis);
</span><span class="cx">         scrollSnapTimer.startRepeating(1.0 / 60.0);
</span><span class="cx">     }
</span><ins>+
+    if (!m_horizontalScrollSnapTimer.isActive() &amp;&amp; !m_verticalScrollSnapTimer.isActive())
+        return;
+
+    if (auto* trigger = m_client.testTrigger())
+        trigger-&gt;deferTestsForReason(reinterpret_cast&lt;WheelEventTestTrigger::ScrollableAreaIdentifier&gt;(this), WheelEventTestTrigger::ScrollSnapInProgress);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void ScrollController::stopScrollSnapTimer(ScrollEventAxis axis)
</span><span class="lines">@@ -620,6 +633,12 @@
</span><span class="cx">     m_client.stopScrollSnapTimer(axis);
</span><span class="cx">     RunLoop::Timer&lt;ScrollController&gt;&amp; scrollSnapTimer = axis == ScrollEventAxis::Horizontal ? m_horizontalScrollSnapTimer : m_verticalScrollSnapTimer;
</span><span class="cx">     scrollSnapTimer.stop();
</span><ins>+    
+    if (m_horizontalScrollSnapTimer.isActive() || m_verticalScrollSnapTimer.isActive())
+        return;
+
+    if (auto* trigger = m_client.testTrigger())
+        trigger-&gt;removeTestDeferralForReason(reinterpret_cast&lt;WheelEventTestTrigger::ScrollableAreaIdentifier&gt;(this), WheelEventTestTrigger::ScrollSnapInProgress);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void ScrollController::horizontalScrollSnapTimerFired()
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmacScrollAnimatorMacmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mac/ScrollAnimatorMac.mm (183594 => 183595)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mac/ScrollAnimatorMac.mm        2015-04-30 00:28:04 UTC (rev 183594)
+++ trunk/Source/WebCore/platform/mac/ScrollAnimatorMac.mm        2015-04-30 00:29:05 UTC (rev 183595)
</span><span class="lines">@@ -889,6 +889,11 @@
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     [m_scrollbarPainterController beginScrollGesture];
</span><ins>+
+#if ENABLE(CSS_SCROLL_SNAP) || ENABLE(RUBBER_BANDING)
+    if (m_wheelEventTestTrigger)
+        m_wheelEventTestTrigger-&gt;deferTestsForReason(reinterpret_cast&lt;WheelEventTestTrigger::ScrollableAreaIdentifier&gt;(this), WheelEventTestTrigger::ContentScrollInProgress);
+#endif
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void ScrollAnimatorMac::didEndScrollGesture() const
</span><span class="lines">@@ -897,6 +902,11 @@
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     [m_scrollbarPainterController endScrollGesture];
</span><ins>+
+#if ENABLE(CSS_SCROLL_SNAP) || ENABLE(RUBBER_BANDING)
+    if (m_wheelEventTestTrigger)
+        m_wheelEventTestTrigger-&gt;removeTestDeferralForReason(reinterpret_cast&lt;WheelEventTestTrigger::ScrollableAreaIdentifier&gt;(this), WheelEventTestTrigger::ContentScrollInProgress);
+#endif
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void ScrollAnimatorMac::mayBeginScrollGesture() const
</span><span class="lines">@@ -1349,6 +1359,9 @@
</span><span class="cx"> 
</span><span class="cx">     if (!m_sendContentAreaScrolledTimer.isActive())
</span><span class="cx">         m_sendContentAreaScrolledTimer.startOneShot(0);
</span><ins>+
+    if (m_wheelEventTestTrigger)
+        m_wheelEventTestTrigger-&gt;deferTestsForReason(reinterpret_cast&lt;WheelEventTestTrigger::ScrollableAreaIdentifier&gt;(this), WheelEventTestTrigger::ContentScrollInProgress);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void ScrollAnimatorMac::sendContentAreaScrolled(const FloatSize&amp; delta)
</span><span class="lines">@@ -1363,6 +1376,9 @@
</span><span class="cx"> {
</span><span class="cx">     sendContentAreaScrolled(m_contentAreaScrolledTimerScrollDelta);
</span><span class="cx">     m_contentAreaScrolledTimerScrollDelta = FloatSize();
</span><ins>+
+    if (m_wheelEventTestTrigger)
+        m_wheelEventTestTrigger-&gt;removeTestDeferralForReason(reinterpret_cast&lt;WheelEventTestTrigger::ScrollableAreaIdentifier&gt;(this), WheelEventTestTrigger::ContentScrollInProgress);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void ScrollAnimatorMac::setVisibleScrollerThumbRect(const IntRect&amp; scrollerThumb)
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderBoxcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderBox.cpp (183594 => 183595)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderBox.cpp        2015-04-30 00:28:04 UTC (rev 183594)
+++ trunk/Source/WebCore/rendering/RenderBox.cpp        2015-04-30 00:29:05 UTC (rev 183595)
</span><span class="lines">@@ -3,7 +3,7 @@
</span><span class="cx">  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
</span><span class="cx">  *           (C) 2005 Allan Sandfeld Jensen (kde@carewolf.com)
</span><span class="cx">  *           (C) 2005, 2006 Samuel Weinig (sam.weinig@gmail.com)
</span><del>- * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2005-2010, 2015 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * This library is free software; you can redistribute it and/or
</span><span class="cx">  * modify it under the terms of the GNU Library General Public
</span><span class="lines">@@ -59,6 +59,7 @@
</span><span class="cx"> #include &quot;RenderTableCell.h&quot;
</span><span class="cx"> #include &quot;RenderTheme.h&quot;
</span><span class="cx"> #include &quot;RenderView.h&quot;
</span><ins>+#include &quot;ScrollAnimator.h&quot;
</ins><span class="cx"> #include &quot;ScrollbarTheme.h&quot;
</span><span class="cx"> #include &quot;TransformState.h&quot;
</span><span class="cx"> #include &quot;htmlediting.h&quot;
</span><span class="lines">@@ -593,16 +594,32 @@
</span><span class="cx">     return hasOverflowClip() ? layer()-&gt;scrollYOffset() : 0;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+static void setupWheelEventTestTrigger(RenderLayer&amp; layer, Frame* frame)
+{
+    if (!frame)
+        return;
+
+    Page* page = frame-&gt;page();
+    if (!page || !page-&gt;expectsWheelEventTriggers())
+        return;
+
+    layer.scrollAnimator().setWheelEventTestTrigger(page-&gt;testTrigger());
+}
+
</ins><span class="cx"> void RenderBox::setScrollLeft(int newLeft)
</span><span class="cx"> {
</span><del>-    if (hasOverflowClip())
</del><ins>+    if (hasOverflowClip()) {
+        setupWheelEventTestTrigger(*layer(), document().frame());
</ins><span class="cx">         layer()-&gt;scrollToXOffset(newLeft, RenderLayer::ScrollOffsetClamped);
</span><ins>+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void RenderBox::setScrollTop(int newTop)
</span><span class="cx"> {
</span><del>-    if (hasOverflowClip())
</del><ins>+    if (hasOverflowClip()) {
+        setupWheelEventTestTrigger(*layer(), document().frame());
</ins><span class="cx">         layer()-&gt;scrollToYOffset(newTop, RenderLayer::ScrollOffsetClamped);
</span><ins>+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void RenderBox::absoluteRects(Vector&lt;IntRect&gt;&amp; rects, const LayoutPoint&amp; accumulatedOffset) const
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderLayercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderLayer.cpp (183594 => 183595)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderLayer.cpp        2015-04-30 00:28:04 UTC (rev 183594)
+++ trunk/Source/WebCore/rendering/RenderLayer.cpp        2015-04-30 00:29:05 UTC (rev 183595)
</span><span class="lines">@@ -119,6 +119,7 @@
</span><span class="cx"> #include &quot;TextStream.h&quot;
</span><span class="cx"> #include &quot;TransformationMatrix.h&quot;
</span><span class="cx"> #include &quot;TranslateTransformOperation.h&quot;
</span><ins>+#include &quot;WheelEventTestTrigger.h&quot;
</ins><span class="cx"> #include &lt;stdio.h&gt;
</span><span class="cx"> #include &lt;wtf/StdLibExtras.h&gt;
</span><span class="cx"> #include &lt;wtf/text/CString.h&gt;
</span><span class="lines">@@ -3075,6 +3076,10 @@
</span><span class="cx">     else {
</span><span class="cx">         widget = Scrollbar::createNativeScrollbar(*this, orientation, RegularScrollbar);
</span><span class="cx">         didAddScrollbar(widget.get(), orientation);
</span><ins>+        if (Page* page = renderer().frame().page()) {
+            if (page-&gt;expectsWheelEventTriggers())
+                scrollAnimator().setWheelEventTestTrigger(page-&gt;testTrigger());
+        }
</ins><span class="cx">     }
</span><span class="cx">     renderer().view().frameView().addChild(widget.get());
</span><span class="cx">     return widget.release();
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderListBoxcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderListBox.cpp (183594 => 183595)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderListBox.cpp        2015-04-30 00:28:04 UTC (rev 183594)
+++ trunk/Source/WebCore/rendering/RenderListBox.cpp        2015-04-30 00:29:05 UTC (rev 183595)
</span><span class="lines">@@ -53,11 +53,13 @@
</span><span class="cx"> #include &quot;RenderText.h&quot;
</span><span class="cx"> #include &quot;RenderTheme.h&quot;
</span><span class="cx"> #include &quot;RenderView.h&quot;
</span><ins>+#include &quot;ScrollAnimator.h&quot;
</ins><span class="cx"> #include &quot;Scrollbar.h&quot;
</span><span class="cx"> #include &quot;ScrollbarTheme.h&quot;
</span><span class="cx"> #include &quot;Settings.h&quot;
</span><span class="cx"> #include &quot;SpatialNavigation.h&quot;
</span><span class="cx"> #include &quot;StyleResolver.h&quot;
</span><ins>+#include &quot;WheelEventTestTrigger.h&quot;
</ins><span class="cx"> #include &lt;math.h&gt;
</span><span class="cx"> #include &lt;wtf/StackStats.h&gt;
</span><span class="cx"> 
</span><span class="lines">@@ -661,13 +663,25 @@
</span><span class="cx">     return m_indexOffset * itemHeight();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+static void setupWheelEventTestTrigger(RenderListBox&amp; renderer, Frame* frame)
+{
+    if (!frame)
+        return;
+
+    Page* page = frame-&gt;page();
+    if (!page || !page-&gt;expectsWheelEventTriggers())
+        return;
+
+    renderer.scrollAnimator().setWheelEventTestTrigger(page-&gt;testTrigger());
+}
+
</ins><span class="cx"> void RenderListBox::setScrollTop(int newTop)
</span><span class="cx"> {
</span><span class="cx">     // Determine an index and scroll to it.    
</span><span class="cx">     int index = newTop / itemHeight();
</span><span class="cx">     if (index &lt; 0 || index &gt;= numItems() || index == m_indexOffset)
</span><span class="cx">         return;
</span><del>-    
</del><ins>+    setupWheelEventTestTrigger(*this, document().frame());
</ins><span class="cx">     scrollToOffsetWithoutAnimation(VerticalScrollbar, index);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -806,6 +820,10 @@
</span><span class="cx">     else {
</span><span class="cx">         widget = Scrollbar::createNativeScrollbar(*this, VerticalScrollbar, theme().scrollbarControlSizeForPart(ListboxPart));
</span><span class="cx">         didAddScrollbar(widget.get(), VerticalScrollbar);
</span><ins>+        if (Page* page = frame().page()) {
+            if (page-&gt;expectsWheelEventTriggers())
+                scrollAnimator().setWheelEventTestTrigger(page-&gt;testTrigger());
+        }
</ins><span class="cx">     }
</span><span class="cx">     view().frameView().addChild(widget.get());
</span><span class="cx">     return widget.release();
</span></span></pre></div>
<a id="trunkSourceWebCoretestingjsWebCoreTestSupportcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/testing/js/WebCoreTestSupport.cpp (183594 => 183595)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/testing/js/WebCoreTestSupport.cpp        2015-04-30 00:28:04 UTC (rev 183594)
+++ trunk/Source/WebCore/testing/js/WebCoreTestSupport.cpp        2015-04-30 00:29:05 UTC (rev 183595)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2011 Google Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2011, 2015 Google Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -31,7 +31,7 @@
</span><span class="cx"> #include &quot;Internals.h&quot;
</span><span class="cx"> #include &quot;JSDocument.h&quot;
</span><span class="cx"> #include &quot;JSInternals.h&quot;
</span><del>-#include &quot;MainFrame.h&quot;
</del><ins>+#include &quot;Page.h&quot;
</ins><span class="cx"> #include &quot;WheelEventTestTrigger.h&quot;
</span><span class="cx"> #include &lt;JavaScriptCore/APICast.h&gt;
</span><span class="cx"> #include &lt;JavaScriptCore/JSValueRef.h&gt;
</span><span class="lines">@@ -67,18 +67,34 @@
</span><span class="cx"> 
</span><span class="cx"> void monitorWheelEvents(WebCore::Frame&amp; frame)
</span><span class="cx"> {
</span><del>-    frame.mainFrame().ensureTestTrigger();
</del><ins>+    Page* page = frame.page();
+    if (!page)
+        return;
+
+    page-&gt;ensureTestTrigger();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void setTestCallbackAndStartNotificationTimer(WebCore::Frame&amp; frame, JSContextRef context, JSObjectRef jsCallbackFunction)
</span><span class="cx"> {
</span><del>-    WheelEventTestTrigger* trigger = frame.mainFrame().ensureTestTrigger();
</del><ins>+    Page* page = frame.page();
+    if (!page || !page-&gt;expectsWheelEventTriggers())
+        return;
+
</ins><span class="cx">     JSValueProtect(context, jsCallbackFunction);
</span><span class="cx">     
</span><del>-    trigger-&gt;setTestCallbackAndStartNotificationTimer([=](void) {
</del><ins>+    page-&gt;ensureTestTrigger().setTestCallbackAndStartNotificationTimer([=](void) {
</ins><span class="cx">         JSObjectCallAsFunction(context, jsCallbackFunction, nullptr, 0, nullptr, nullptr);
</span><span class="cx">         JSValueUnprotect(context, jsCallbackFunction);
</span><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void clearWheelEventTestTrigger(WebCore::Frame&amp; frame)
+{
+    Page* page = frame.page();
+    if (!page)
+        return;
+    
+    page-&gt;clearTrigger();
</ins><span class="cx"> }
</span><ins>+
+}
</ins></span></pre></div>
<a id="trunkSourceWebCoretestingjsWebCoreTestSupporth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/testing/js/WebCoreTestSupport.h (183594 => 183595)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/testing/js/WebCoreTestSupport.h        2015-04-30 00:28:04 UTC (rev 183594)
+++ trunk/Source/WebCore/testing/js/WebCoreTestSupport.h        2015-04-30 00:29:05 UTC (rev 183595)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2011 Google Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2011, 2015 Google Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -45,6 +45,7 @@
</span><span class="cx"> void resetInternalsObject(JSContextRef) TEST_SUPPORT_EXPORT;
</span><span class="cx"> void monitorWheelEvents(WebCore::Frame&amp;) TEST_SUPPORT_EXPORT;
</span><span class="cx"> void setTestCallbackAndStartNotificationTimer(WebCore::Frame&amp;, JSContextRef, JSObjectRef) TEST_SUPPORT_EXPORT;
</span><ins>+void clearWheelEventTestTrigger(WebCore::Frame&amp;) TEST_SUPPORT_EXPORT;
</ins><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (183594 => 183595)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2015-04-30 00:28:04 UTC (rev 183594)
+++ trunk/Source/WebKit2/ChangeLog        2015-04-30 00:29:05 UTC (rev 183595)
</span><span class="lines">@@ -1,3 +1,34 @@
</span><ins>+2015-04-29  Brent Fulgham  &lt;bfulgham@apple.com&gt;
+
+        Expand test infrastructure to support scrolling tests
+        https://bugs.webkit.org/show_bug.cgi?id=143684
+        &lt;rdar://problem/20375516&gt;
+
+        Reviewed by Simon Fraser.
+
+        Update test programs to activate (and deactivate) the new WheelEventTestTrigger logic.
+
+        * UIProcess/API/C/WKPage.cpp:
+        (WKPageClearWheelEventTestTriggers): Added.
+        * UIProcess/API/C/WKPage.h:
+        * UIProcess/WebPageProxy.cpp:
+        (WebKit::WebPageProxy::clearWheelEventTestTrigger): Added.
+        * UIProcess/WebPageProxy.h:
+        * WebProcess/InjectedBundle/API/c/WKBundlePage.cpp:
+        (WKBundlePageStartMonitoringScrollOperations): Interact with WheelEventTestTrigger through
+        the Page, rather than MainFrame.
+        (WKBundlePageRegisterScrollOperationCompletionCallback): Ditto.
+        * WebProcess/Plugins/PDF/PDFPlugin.mm:
+        (WebKit::PDFPlugin::createScrollbar): Make sure scroll animator knows about any
+        active test triggers.
+        * WebPage/EventDispatcher.mm:
+        (WebKit::EventDispatcher::wheelEvent): If the wheel event was passed to the scrolling thread,
+        defer tests until a Scrolling Thread Sync has occurred.
+        * WebPage/WebPage.cpp:
+        (WebKit::WebPage::clearWheelEventTestTrigger): Added.
+        * WebPage/WebPage.h:
+        * WebPage/WebPage.message.in: Added ClearWheelEventTestTrigger message.
+
</ins><span class="cx"> 2015-04-29  Enrica Casucci  &lt;enrica@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Adding the ability to move selection by granularity on iOS.
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICWKPagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/C/WKPage.cpp (183594 => 183595)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/C/WKPage.cpp        2015-04-30 00:28:04 UTC (rev 183594)
+++ trunk/Source/WebKit2/UIProcess/API/C/WKPage.cpp        2015-04-30 00:29:05 UTC (rev 183595)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2010 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2010, 2015 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -2201,6 +2201,12 @@
</span><span class="cx">     return toImpl(page)-&gt;isPlayingAudio();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void WKPageClearWheelEventTestTrigger(WKPageRef pageRef)
+{
+    toImpl(pageRef)-&gt;clearWheelEventTestTrigger();
+}
+
+
</ins><span class="cx"> #if ENABLE(NETSCAPE_PLUGIN_API)
</span><span class="cx"> 
</span><span class="cx"> // -- DEPRECATED --
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICWKPageh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/C/WKPage.h (183594 => 183595)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/C/WKPage.h        2015-04-30 00:28:04 UTC (rev 183594)
+++ trunk/Source/WebKit2/UIProcess/API/C/WKPage.h        2015-04-30 00:29:05 UTC (rev 183595)
</span><span class="lines">@@ -144,6 +144,7 @@
</span><span class="cx"> 
</span><span class="cx"> WK_EXPORT double WKPageGetBackingScaleFactor(WKPageRef page);
</span><span class="cx"> WK_EXPORT void WKPageSetCustomBackingScaleFactor(WKPageRef page, double customScaleFactor);
</span><ins>+WK_EXPORT void WKPageClearWheelEventTestTrigger(WKPageRef page);
</ins><span class="cx"> 
</span><span class="cx"> WK_EXPORT bool WKPageSupportsTextZoom(WKPageRef page);
</span><span class="cx"> WK_EXPORT double WKPageGetTextZoomFactor(WKPageRef page);
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessWebPageProxycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp (183594 => 183595)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp        2015-04-30 00:28:04 UTC (rev 183594)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp        2015-04-30 00:29:05 UTC (rev 183595)
</span><span class="lines">@@ -5794,4 +5794,12 @@
</span><span class="cx">     m_pageClient.didChangeBackgroundColor();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void WebPageProxy::clearWheelEventTestTrigger()
+{
+    if (!isValid())
+        return;
+    
+    m_process-&gt;send(Messages::WebPage::ClearWheelEventTestTrigger(), m_pageID);
+}
+
</ins><span class="cx"> } // namespace WebKit
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessWebPageProxyh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.h (183594 => 183595)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/WebPageProxy.h        2015-04-30 00:28:04 UTC (rev 183594)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.h        2015-04-30 00:29:05 UTC (rev 183595)
</span><span class="lines">@@ -1037,6 +1037,8 @@
</span><span class="cx">     void didChangeBackgroundColor();
</span><span class="cx">     void didLayoutForCustomContentProvider();
</span><span class="cx"> 
</span><ins>+    void clearWheelEventTestTrigger();
+
</ins><span class="cx"> private:
</span><span class="cx">     WebPageProxy(PageClient&amp;, WebProcessProxy&amp;, uint64_t pageID, const WebPageConfiguration&amp;);
</span><span class="cx">     void platformInitialize();
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessInjectedBundleAPIcWKBundlePagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/InjectedBundle/API/c/WKBundlePage.cpp (183594 => 183595)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/InjectedBundle/API/c/WKBundlePage.cpp        2015-04-30 00:28:04 UTC (rev 183594)
+++ trunk/Source/WebKit2/WebProcess/InjectedBundle/API/c/WKBundlePage.cpp        2015-04-30 00:29:05 UTC (rev 183595)
</span><span class="lines">@@ -582,7 +582,7 @@
</span><span class="cx">     if (!page)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    page-&gt;mainFrame().ensureTestTrigger();
</del><ins>+    page-&gt;ensureTestTrigger();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WKBundlePageRegisterScrollOperationCompletionCallback(WKBundlePageRef pageRef, WKBundlePageTestNotificationCallback callback, void* context)
</span><span class="lines">@@ -592,12 +592,10 @@
</span><span class="cx">     
</span><span class="cx">     WebKit::WebPage* webPage = toImpl(pageRef);
</span><span class="cx">     WebCore::Page* page = webPage ? webPage-&gt;corePage() : nullptr;
</span><del>-    
-    if (!page)
</del><ins>+    if (!page || !page-&gt;expectsWheelEventTriggers())
</ins><span class="cx">         return;
</span><span class="cx">     
</span><del>-    WebCore::WheelEventTestTrigger* trigger = page-&gt;mainFrame().ensureTestTrigger();
-    trigger-&gt;setTestCallbackAndStartNotificationTimer([=]() {
</del><ins>+    page-&gt;ensureTestTrigger().setTestCallbackAndStartNotificationTimer([=]() {
</ins><span class="cx">         callback(context);
</span><span class="cx">     });
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessPluginsPDFPDFPluginmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/Plugins/PDF/PDFPlugin.mm (183594 => 183595)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/Plugins/PDF/PDFPlugin.mm        2015-04-30 00:28:04 UTC (rev 183594)
+++ trunk/Source/WebKit2/WebProcess/Plugins/PDF/PDFPlugin.mm        2015-04-30 00:29:05 UTC (rev 183595)
</span><span class="lines">@@ -68,15 +68,18 @@
</span><span class="cx"> #import &lt;WebCore/HTMLFormElement.h&gt;
</span><span class="cx"> #import &lt;WebCore/HTMLPlugInElement.h&gt;
</span><span class="cx"> #import &lt;WebCore/LocalizedStrings.h&gt;
</span><ins>+#import &lt;WebCore/MainFrame.h&gt;
</ins><span class="cx"> #import &lt;WebCore/MouseEvent.h&gt;
</span><span class="cx"> #import &lt;WebCore/Page.h&gt;
</span><span class="cx"> #import &lt;WebCore/Pasteboard.h&gt;
</span><span class="cx"> #import &lt;WebCore/PluginData.h&gt;
</span><span class="cx"> #import &lt;WebCore/PluginDocument.h&gt;
</span><span class="cx"> #import &lt;WebCore/RenderBoxModelObject.h&gt;
</span><ins>+#import &lt;WebCore/ScrollAnimator.h&gt;
</ins><span class="cx"> #import &lt;WebCore/ScrollbarTheme.h&gt;
</span><span class="cx"> #import &lt;WebCore/Settings.h&gt;
</span><span class="cx"> #import &lt;WebCore/UUID.h&gt;
</span><ins>+#import &lt;WebCore/WheelEventTestTrigger.h&gt;
</ins><span class="cx"> #import &lt;WebKitSystemInterface.h&gt;
</span><span class="cx"> #import &lt;wtf/CurrentTime.h&gt;
</span><span class="cx"> 
</span><span class="lines">@@ -660,6 +663,12 @@
</span><span class="cx">         [m_containerLayer addSublayer:m_verticalScrollbarLayer.get()];
</span><span class="cx">     }
</span><span class="cx">     didAddScrollbar(widget.get(), orientation);
</span><ins>+    if (Frame* frame = webFrame()-&gt;coreFrame()) {
+        if (Page* page = frame-&gt;page()) {
+            if (page-&gt;expectsWheelEventTriggers())
+                scrollAnimator().setWheelEventTestTrigger(page-&gt;testTrigger());
+        }
+    }
</ins><span class="cx">     pluginView()-&gt;frame()-&gt;view()-&gt;addChild(widget.get());
</span><span class="cx">     return widget.release();
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageEventDispatchercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/EventDispatcher.cpp (183594 => 183595)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/EventDispatcher.cpp        2015-04-30 00:28:04 UTC (rev 183594)
+++ trunk/Source/WebKit2/WebProcess/WebPage/EventDispatcher.cpp        2015-04-30 00:29:05 UTC (rev 183595)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2011, 2014 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2011, 2014-2015 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -33,6 +33,7 @@
</span><span class="cx"> #include &quot;WebPageProxyMessages.h&quot;
</span><span class="cx"> #include &quot;WebProcess.h&quot;
</span><span class="cx"> #include &lt;WebCore/Page.h&gt;
</span><ins>+#include &lt;WebCore/WheelEventTestTrigger.h&gt;
</ins><span class="cx"> #include &lt;wtf/MainThread.h&gt;
</span><span class="cx"> #include &lt;wtf/RunLoop.h&gt;
</span><span class="cx"> 
</span><span class="lines">@@ -87,6 +88,17 @@
</span><span class="cx">     connection-&gt;addWorkQueueMessageReceiver(Messages::EventDispatcher::messageReceiverName(), &amp;m_queue.get(), this);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+static void updateWheelEventTestTriggersIfNeeded(uint64_t pageID)
+{
+    WebPage* webPage = WebProcess::singleton().webPage(pageID);
+    Page* page = webPage ? webPage-&gt;corePage() : nullptr;
+
+    if (!page || !page-&gt;expectsWheelEventTriggers())
+        return;
+
+    page-&gt;testTrigger()-&gt;deferTestsForReason(reinterpret_cast&lt;WheelEventTestTrigger::ScrollableAreaIdentifier&gt;(page), WheelEventTestTrigger::ScrollingThreadSyncNeeded);
+}
+
</ins><span class="cx"> void EventDispatcher::wheelEvent(uint64_t pageID, const WebWheelEvent&amp; wheelEvent, bool canRubberBandAtLeft, bool canRubberBandAtRight, bool canRubberBandAtTop, bool canRubberBandAtBottom)
</span><span class="cx"> {
</span><span class="cx">     PlatformWheelEvent platformWheelEvent = platform(wheelEvent);
</span><span class="lines">@@ -131,6 +143,12 @@
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         ScrollingTree::EventResult result = scrollingTree-&gt;tryToHandleWheelEvent(platformWheelEvent);
</span><ins>+
+#if ENABLE(CSS_SCROLL_SNAP) || ENABLE(RUBBER_BANDING)
+        if (result == ScrollingTree::DidHandleEvent)
+            updateWheelEventTestTriggersIfNeeded(pageID);
+#endif
+
</ins><span class="cx">         if (result == ScrollingTree::DidHandleEvent || result == ScrollingTree::DidNotHandleEvent) {
</span><span class="cx">             sendDidReceiveEvent(pageID, wheelEvent, result == ScrollingTree::DidHandleEvent);
</span><span class="cx">             return;
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageWebPagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp (183594 => 183595)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp        2015-04-30 00:28:04 UTC (rev 183594)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp        2015-04-30 00:29:05 UTC (rev 183595)
</span><span class="lines">@@ -4903,4 +4903,12 @@
</span><span class="cx">         returnData = webProcess.transformHandlesToObjects(returnUserData.object());
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void WebPage::clearWheelEventTestTrigger()
+{
+    if (!m_page)
+        return;
+
+    m_page-&gt;clearTrigger();
+}
+
</ins><span class="cx"> } // namespace WebKit
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageWebPageh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h (183594 => 183595)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h        2015-04-30 00:28:04 UTC (rev 183594)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h        2015-04-30 00:29:05 UTC (rev 183595)
</span><span class="lines">@@ -1118,6 +1118,8 @@
</span><span class="cx">     void setShouldPlayToPlaybackTarget(uint64_t, bool);
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+    void clearWheelEventTestTrigger();
+
</ins><span class="cx">     uint64_t m_pageID;
</span><span class="cx"> 
</span><span class="cx">     std::unique_ptr&lt;WebCore::Page&gt; m_page;
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageWebPagemessagesin"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in (183594 => 183595)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in        2015-04-30 00:28:04 UTC (rev 183594)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in        2015-04-30 00:29:05 UTC (rev 183595)
</span><span class="lines">@@ -425,4 +425,5 @@
</span><span class="cx">     SetShouldPlayToPlaybackTarget(uint64_t contextId, bool shouldPlay)
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+    ClearWheelEventTestTrigger()
</ins><span class="cx"> }
</span></span></pre></div>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (183594 => 183595)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog        2015-04-30 00:28:04 UTC (rev 183594)
+++ trunk/Tools/ChangeLog        2015-04-30 00:29:05 UTC (rev 183595)
</span><span class="lines">@@ -1,3 +1,17 @@
</span><ins>+2015-04-29  Brent Fulgham  &lt;bfulgham@apple.com&gt;
+
+        Expand test infrastructure to support scrolling tests
+        https://bugs.webkit.org/show_bug.cgi?id=143684
+        &lt;rdar://problem/20375516&gt;
+
+        Reviewed by Simon Fraser.
+
+        * DumpRenderTree/mac/DumpRenderTree.mm:
+        (resetWebViewToConsistentStateBeforeTesting): Make sure the WheelEventTestTrigger state is
+        reset before the next test run.
+        * WebKitTestRunner/TestController.cpp:
+        (WTR::TestController::resetStateToConsistentValues): Ditto.&quot;
+
</ins><span class="cx"> 2015-04-29  Alex Christensen  &lt;achristensen@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         Run javascriptcore tests on Windows without cygwin
</span></span></pre></div>
<a id="trunkToolsDumpRenderTreemacDumpRenderTreemm"></a>
<div class="modfile"><h4>Modified: trunk/Tools/DumpRenderTree/mac/DumpRenderTree.mm (183594 => 183595)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/DumpRenderTree/mac/DumpRenderTree.mm        2015-04-30 00:28:04 UTC (rev 183594)
+++ trunk/Tools/DumpRenderTree/mac/DumpRenderTree.mm        2015-04-30 00:29:05 UTC (rev 183595)
</span><span class="lines">@@ -154,6 +154,12 @@
</span><span class="cx"> - (BOOL)_flushCompositingChanges;
</span><span class="cx"> @end
</span><span class="cx"> 
</span><ins>+#if !PLATFORM(IOS)
+@interface WebView (WebViewInternalForTesting)
+- (WebCore::Frame*)_mainCoreFrame;
+@end
+#endif
+
</ins><span class="cx"> static void runTest(const string&amp; testURL);
</span><span class="cx"> 
</span><span class="cx"> // Deciding when it's OK to dump out the state is a bit tricky.  All these must be true:
</span><span class="lines">@@ -1824,6 +1830,11 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx"> #if !PLATFORM(IOS)
</span><ins>+    if (WebCore::Frame* frame = [webView _mainCoreFrame])
+        WebCoreTestSupport::clearWheelEventTestTrigger(*frame);
+#endif
+
+#if !PLATFORM(IOS)
</ins><span class="cx">     [webView setContinuousSpellCheckingEnabled:YES];
</span><span class="cx">     [webView setAutomaticQuoteSubstitutionEnabled:NO];
</span><span class="cx">     [webView setAutomaticLinkDetectionEnabled:NO];
</span></span></pre></div>
<a id="trunkToolsWebKitTestRunnerTestControllercpp"></a>
<div class="modfile"><h4>Modified: trunk/Tools/WebKitTestRunner/TestController.cpp (183594 => 183595)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebKitTestRunner/TestController.cpp        2015-04-30 00:28:04 UTC (rev 183594)
+++ trunk/Tools/WebKitTestRunner/TestController.cpp        2015-04-30 00:29:05 UTC (rev 183595)
</span><span class="lines">@@ -660,6 +660,8 @@
</span><span class="cx">     // Re-set to the default backing scale factor by setting the custom scale factor to 0.
</span><span class="cx">     WKPageSetCustomBackingScaleFactor(m_mainWebView-&gt;page(), 0);
</span><span class="cx"> 
</span><ins>+    WKPageClearWheelEventTestTrigger(m_mainWebView-&gt;page());
+
</ins><span class="cx"> #if PLATFORM(EFL)
</span><span class="cx">     // EFL use a real window while other ports such as Qt don't.
</span><span class="cx">     // In EFL, we need to resize the window to the original size after calls to window.resizeTo.
</span></span></pre>
</div>
</div>

</body>
</html>