<!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>[201958] 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/201958">201958</a></dd>
<dt>Author</dt> <dd>benjamin@webkit.org</dd>
<dt>Date</dt> <dd>2016-06-10 18:18:37 -0700 (Fri, 10 Jun 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Add support for passive event listeners on touch events
https://bugs.webkit.org/show_bug.cgi?id=158601

Patch by Benjamin Poulain &lt;bpoulain@apple.com&gt; on 2016-06-10
Reviewed by Simon Fraser.

Source/WebCore:

This patch wires &quot;passive&quot; state of EventTarget to the delivery of touch
events in WebKit2.

Instead of having a NonFastScrollableRegion, we have a pair of regions
in EventTrackingRegions.
The &quot;asynchronousDispatchRegion&quot; tracks the area for which all event
listeners are passive. For those, events should be dispatched asynchronously.
The &quot;synchronousDispatchRegion&quot; tracks the area for which there is at
least one active event listener. Events have to be dispatched synchronously
for correctness.

Tests: fast/events/touch/ios/tap-with-active-listener-on-elements.html
       fast/events/touch/ios/tap-with-active-listener-on-window.html
       fast/events/touch/ios/tap-with-passive-listener-on-elements.html
       fast/events/touch/ios/tap-with-passive-listener-on-window.html

* WebCore.xcodeproj/project.pbxproj:
* dom/Document.cpp:
(WebCore::Document::wheelEventHandlersChanged):
(WebCore::Document::Document): Deleted.
* dom/Document.h:

* dom/EventListenerMap.cpp:
(WebCore::EventListenerMap::containsActive):
If a Target has multiple listener for an event type, we want to know
if any of them is active.

* dom/EventListenerMap.h:
* dom/EventTarget.cpp:
(WebCore::EventTarget::hasActiveEventListeners):
(WebCore::EventTarget::hasActiveTouchEventListeners):
* dom/EventTarget.h:

* page/DebugPageOverlays.cpp:
(WebCore::NonFastScrollableRegionOverlay::updateRegion):
I did not change the debug overlays.
The NonFastScrollable area is the region for which events needs
synchronous dispatch. Everything else should scroll without delay.

* page/FrameView.cpp:
(WebCore::FrameView::scrollableAreaSetChanged):
* page/Page.cpp:
(WebCore::Page::nonFastScrollableRects):
* page/scrolling/AsyncScrollingCoordinator.cpp:
(WebCore::AsyncScrollingCoordinator::setEventTrackingRegionsDirty):
(WebCore::AsyncScrollingCoordinator::willCommitTree):
(WebCore::AsyncScrollingCoordinator::updateEventTrackingRegions):
(WebCore::AsyncScrollingCoordinator::frameViewLayoutUpdated):
(WebCore::AsyncScrollingCoordinator::frameViewEventTrackingRegionsChanged):
(WebCore::AsyncScrollingCoordinator::scrollingStateTreeAsText):
(WebCore::AsyncScrollingCoordinator::setNonFastScrollableRegionDirty): Deleted.
(WebCore::AsyncScrollingCoordinator::updateNonFastScrollableRegion): Deleted.
(WebCore::AsyncScrollingCoordinator::frameViewNonFastScrollableRegionChanged): Deleted.
* page/scrolling/AsyncScrollingCoordinator.h:
(WebCore::AsyncScrollingCoordinator::eventTrackingRegionsDirty):
(WebCore::AsyncScrollingCoordinator::nonFastScrollableRegionDirty): Deleted.

* page/scrolling/ScrollingCoordinator.cpp:
(WebCore::ScrollingCoordinator::absoluteEventTrackingRegionsForFrame):
(WebCore::ScrollingCoordinator::absoluteEventTrackingRegions):
(WebCore::ScrollingCoordinator::absoluteNonFastScrollableRegionForFrame): Deleted.
(WebCore::ScrollingCoordinator::absoluteNonFastScrollableRegion): Deleted.
I intentionally left the Wheel event with synchronous dispatch.
This use case will need its own set of tests.

* page/scrolling/ScrollingCoordinator.h:
(WebCore::ScrollingCoordinator::frameViewEventTrackingRegionsChanged):
(WebCore::ScrollingCoordinator::frameViewNonFastScrollableRegionChanged): Deleted.
* page/scrolling/ScrollingStateFrameScrollingNode.cpp:
(WebCore::ScrollingStateFrameScrollingNode::ScrollingStateFrameScrollingNode):
(WebCore::ScrollingStateFrameScrollingNode::setEventTrackingRegions):
(WebCore::ScrollingStateFrameScrollingNode::dumpProperties):
(WebCore::ScrollingStateFrameScrollingNode::setNonFastScrollableRegion): Deleted.
* page/scrolling/ScrollingStateFrameScrollingNode.h:
* page/scrolling/ScrollingTree.cpp:
(WebCore::ScrollingTree::shouldHandleWheelEventSynchronously):
(WebCore::ScrollingTree::commitNewTreeState):
(WebCore::ScrollingTree::eventTrackingTypeForPoint):
(WebCore::ScrollingTree::isPointInNonFastScrollableRegion): Deleted.
* page/scrolling/ScrollingTree.h:
* page/scrolling/mac/ScrollingCoordinatorMac.mm:
(WebCore::ScrollingCoordinatorMac::scheduleTreeStateCommit):
* platform/EventTrackingRegions.h: Added.
(WebCore::EventTrackingRegions::isEmpty):
(WebCore::EventTrackingRegions::trackingTypeForPoint):
(WebCore::operator==):

Source/WebKit2:

* Shared/Scrolling/RemoteScrollingCoordinatorTransaction.cpp:
(ArgumentCoder&lt;ScrollingStateFrameScrollingNode&gt;::encode):
(ArgumentCoder&lt;ScrollingStateFrameScrollingNode&gt;::decode):
(WebKit::dump):
* Shared/WebCoreArgumentCoders.cpp:
(IPC::ArgumentCoder&lt;EventTrackingRegions&gt;::encode):
(IPC::ArgumentCoder&lt;EventTrackingRegions&gt;::decode):
* Shared/WebCoreArgumentCoders.h:
* UIProcess/Scrolling/RemoteScrollingCoordinatorProxy.cpp:
(WebKit::RemoteScrollingCoordinatorProxy::eventTrackingTypeForPoint):
(WebKit::RemoteScrollingCoordinatorProxy::isPointInNonFastScrollableRegion): Deleted.
* UIProcess/Scrolling/RemoteScrollingCoordinatorProxy.h:
* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::touchEventTrackingType):
The type is the most restrictive type of all the touch points.
If any touch point needs synchronous tracking, everything has to be synchronous.

(WebKit::WebPageProxy::handleTouchEventSynchronously):
This is a very unfortunate design.

The upper layer dealing with UIKit knows about gesture and when something
can be dispatched asynchrnously because a gesture has started.
This layer knows about tracking and can use that extra inforamtion
to dispatch an event asynchrnously anyway.

In the future, we should refactor this to let WebPageProxy
always decide of the dispatch type. I am just concerned changing
the upper layer while we are stabilizing WebKit.

(WebKit::WebPageProxy::handleTouchEventAsynchronously):
(WebKit::WebPageProxy::handleTouchEvent):
(WebKit::WebPageProxy::resetState):
(WebKit::WebPageProxy::WebPageProxy): Deleted.
(WebKit::WebPageProxy::shouldStartTrackingTouchEvents): Deleted.
* UIProcess/WebPageProxy.h:

LayoutTests:

* fast/events/touch/ios/tap-with-active-listener-on-elements-expected.txt: Added.
* fast/events/touch/ios/tap-with-active-listener-on-elements.html: Added.
* fast/events/touch/ios/tap-with-active-listener-on-window-expected.txt: Added.
* fast/events/touch/ios/tap-with-active-listener-on-window.html: Added.
* fast/events/touch/ios/tap-with-passive-listener-inside-active-listener-expected.txt: Added.
* fast/events/touch/ios/tap-with-passive-listener-on-elements-expected.txt: Added.
* fast/events/touch/ios/tap-with-passive-listener-on-elements.html: Added.
* fast/events/touch/ios/tap-with-passive-listener-on-window-expected.txt: Added.
* fast/events/touch/ios/tap-with-passive-listener-on-window.html: Added.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTeststileddrawingscrollingfixedfixedinoverflowexpectedtxt">trunk/LayoutTests/tiled-drawing/scrolling/fixed/fixed-in-overflow-expected.txt</a></li>
<li><a href="#trunkLayoutTeststileddrawingscrollingframescoordinatedframeexpectedtxt">trunk/LayoutTests/tiled-drawing/scrolling/frames/coordinated-frame-expected.txt</a></li>
<li><a href="#trunkLayoutTeststileddrawingscrollingframescoordinatedframegainscrollingancestorexpectedtxt">trunk/LayoutTests/tiled-drawing/scrolling/frames/coordinated-frame-gain-scrolling-ancestor-expected.txt</a></li>
<li><a href="#trunkLayoutTeststileddrawingscrollingframescoordinatedframeinfixedexpectedtxt">trunk/LayoutTests/tiled-drawing/scrolling/frames/coordinated-frame-in-fixed-expected.txt</a></li>
<li><a href="#trunkLayoutTeststileddrawingscrollingframescoordinatedframelosescrollingancestorexpectedtxt">trunk/LayoutTests/tiled-drawing/scrolling/frames/coordinated-frame-lose-scrolling-ancestor-expected.txt</a></li>
<li><a href="#trunkLayoutTeststileddrawingscrollingframesframesetframescrollabilityexpectedtxt">trunk/LayoutTests/tiled-drawing/scrolling/frames/frameset-frame-scrollability-expected.txt</a></li>
<li><a href="#trunkLayoutTeststileddrawingscrollingframesframesetnestedframescrollabilityexpectedtxt">trunk/LayoutTests/tiled-drawing/scrolling/frames/frameset-nested-frame-scrollability-expected.txt</a></li>
<li><a href="#trunkLayoutTeststileddrawingscrollingframesscrollregionafterframelayoutexpectedtxt">trunk/LayoutTests/tiled-drawing/scrolling/frames/scroll-region-after-frame-layout-expected.txt</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreWebCorexcodeprojprojectpbxproj">trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceWebCoredomDocumentcpp">trunk/Source/WebCore/dom/Document.cpp</a></li>
<li><a href="#trunkSourceWebCoredomDocumenth">trunk/Source/WebCore/dom/Document.h</a></li>
<li><a href="#trunkSourceWebCoredomEventListenerMapcpp">trunk/Source/WebCore/dom/EventListenerMap.cpp</a></li>
<li><a href="#trunkSourceWebCoredomEventListenerMaph">trunk/Source/WebCore/dom/EventListenerMap.h</a></li>
<li><a href="#trunkSourceWebCoredomEventTargetcpp">trunk/Source/WebCore/dom/EventTarget.cpp</a></li>
<li><a href="#trunkSourceWebCoredomEventTargeth">trunk/Source/WebCore/dom/EventTarget.h</a></li>
<li><a href="#trunkSourceWebCorepageDebugPageOverlayscpp">trunk/Source/WebCore/page/DebugPageOverlays.cpp</a></li>
<li><a href="#trunkSourceWebCorepageFrameViewcpp">trunk/Source/WebCore/page/FrameView.cpp</a></li>
<li><a href="#trunkSourceWebCorepagePagecpp">trunk/Source/WebCore/page/Page.cpp</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="#trunkSourceWebCorepagescrollingScrollingCoordinatorcpp">trunk/Source/WebCore/page/scrolling/ScrollingCoordinator.cpp</a></li>
<li><a href="#trunkSourceWebCorepagescrollingScrollingCoordinatorh">trunk/Source/WebCore/page/scrolling/ScrollingCoordinator.h</a></li>
<li><a href="#trunkSourceWebCorepagescrollingScrollingStateFrameScrollingNodecpp">trunk/Source/WebCore/page/scrolling/ScrollingStateFrameScrollingNode.cpp</a></li>
<li><a href="#trunkSourceWebCorepagescrollingScrollingStateFrameScrollingNodeh">trunk/Source/WebCore/page/scrolling/ScrollingStateFrameScrollingNode.h</a></li>
<li><a href="#trunkSourceWebCorepagescrollingScrollingTreecpp">trunk/Source/WebCore/page/scrolling/ScrollingTree.cpp</a></li>
<li><a href="#trunkSourceWebCorepagescrollingScrollingTreeh">trunk/Source/WebCore/page/scrolling/ScrollingTree.h</a></li>
<li><a href="#trunkSourceWebCorepagescrollingmacScrollingCoordinatorMacmm">trunk/Source/WebCore/page/scrolling/mac/ScrollingCoordinatorMac.mm</a></li>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2SharedScrollingRemoteScrollingCoordinatorTransactioncpp">trunk/Source/WebKit2/Shared/Scrolling/RemoteScrollingCoordinatorTransaction.cpp</a></li>
<li><a href="#trunkSourceWebKit2SharedWebCoreArgumentCoderscpp">trunk/Source/WebKit2/Shared/WebCoreArgumentCoders.cpp</a></li>
<li><a href="#trunkSourceWebKit2SharedWebCoreArgumentCodersh">trunk/Source/WebKit2/Shared/WebCoreArgumentCoders.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessScrollingRemoteScrollingCoordinatorProxycpp">trunk/Source/WebKit2/UIProcess/Scrolling/RemoteScrollingCoordinatorProxy.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessScrollingRemoteScrollingCoordinatorProxyh">trunk/Source/WebKit2/UIProcess/Scrolling/RemoteScrollingCoordinatorProxy.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>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsfasteventstouchiostapwithactivelisteneronelementsexpectedtxt">trunk/LayoutTests/fast/events/touch/ios/tap-with-active-listener-on-elements-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfasteventstouchiostapwithactivelisteneronelementshtml">trunk/LayoutTests/fast/events/touch/ios/tap-with-active-listener-on-elements.html</a></li>
<li><a href="#trunkLayoutTestsfasteventstouchiostapwithactivelisteneronwindowexpectedtxt">trunk/LayoutTests/fast/events/touch/ios/tap-with-active-listener-on-window-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfasteventstouchiostapwithactivelisteneronwindowhtml">trunk/LayoutTests/fast/events/touch/ios/tap-with-active-listener-on-window.html</a></li>
<li><a href="#trunkLayoutTestsfasteventstouchiostapwithpassivelistenerinsideactivelistenerexpectedtxt">trunk/LayoutTests/fast/events/touch/ios/tap-with-passive-listener-inside-active-listener-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfasteventstouchiostapwithpassivelisteneronelementsexpectedtxt">trunk/LayoutTests/fast/events/touch/ios/tap-with-passive-listener-on-elements-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfasteventstouchiostapwithpassivelisteneronelementshtml">trunk/LayoutTests/fast/events/touch/ios/tap-with-passive-listener-on-elements.html</a></li>
<li><a href="#trunkLayoutTestsfasteventstouchiostapwithpassivelisteneronwindowexpectedtxt">trunk/LayoutTests/fast/events/touch/ios/tap-with-passive-listener-on-window-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfasteventstouchiostapwithpassivelisteneronwindowhtml">trunk/LayoutTests/fast/events/touch/ios/tap-with-passive-listener-on-window.html</a></li>
<li><a href="#trunkSourceWebCoreplatformEventTrackingRegionsh">trunk/Source/WebCore/platform/EventTrackingRegions.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (201957 => 201958)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2016-06-11 00:48:43 UTC (rev 201957)
+++ trunk/LayoutTests/ChangeLog        2016-06-11 01:18:37 UTC (rev 201958)
</span><span class="lines">@@ -1,3 +1,20 @@
</span><ins>+2016-06-10  Benjamin Poulain  &lt;bpoulain@apple.com&gt;
+
+        Add support for passive event listeners on touch events
+        https://bugs.webkit.org/show_bug.cgi?id=158601
+
+        Reviewed by Simon Fraser.
+
+        * fast/events/touch/ios/tap-with-active-listener-on-elements-expected.txt: Added.
+        * fast/events/touch/ios/tap-with-active-listener-on-elements.html: Added.
+        * fast/events/touch/ios/tap-with-active-listener-on-window-expected.txt: Added.
+        * fast/events/touch/ios/tap-with-active-listener-on-window.html: Added.
+        * fast/events/touch/ios/tap-with-passive-listener-inside-active-listener-expected.txt: Added.
+        * fast/events/touch/ios/tap-with-passive-listener-on-elements-expected.txt: Added.
+        * fast/events/touch/ios/tap-with-passive-listener-on-elements.html: Added.
+        * fast/events/touch/ios/tap-with-passive-listener-on-window-expected.txt: Added.
+        * fast/events/touch/ios/tap-with-passive-listener-on-window.html: Added.
+
</ins><span class="cx"> 2016-06-10  Enrica Casucci  &lt;enrica@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         REGRESSION(r198177): Cannot paste an image when the pasteboard format is mime type.
</span></span></pre></div>
<a id="trunkLayoutTestsfasteventstouchiostapwithactivelisteneronelementsexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/events/touch/ios/tap-with-active-listener-on-elements-expected.txt (0 => 201958)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/events/touch/ios/tap-with-active-listener-on-elements-expected.txt                                (rev 0)
+++ trunk/LayoutTests/fast/events/touch/ios/tap-with-active-listener-on-elements-expected.txt        2016-06-11 01:18:37 UTC (rev 201958)
</span><span class="lines">@@ -0,0 +1,17 @@
</span><ins>+Tap on Target1 (green)
+
+Listener target1 received cancelable event touchstart targetting eventTarget1 at 50, 50
+Listener target1 received cancelable event touchend targetting eventTarget1
+Done
+Tap on Target2 (red)
+
+Listener target1 received cancelable event touchstart targetting eventTarget2 at 150, 50
+Listener target1 received cancelable event touchend targetting eventTarget2
+Done
+Tap on Target3 (blue)
+
+Listener target3 received cancelable event touchstart targetting eventTarget3 at 250, 50
+Listener target1 received cancelable event touchstart targetting eventTarget3 at 250, 50
+Listener target3 received cancelable event touchend targetting eventTarget3
+Listener target1 received cancelable event touchend targetting eventTarget3
+
</ins></span></pre></div>
<a id="trunkLayoutTestsfasteventstouchiostapwithactivelisteneronelementshtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/events/touch/ios/tap-with-active-listener-on-elements.html (0 => 201958)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/events/touch/ios/tap-with-active-listener-on-elements.html                                (rev 0)
+++ trunk/LayoutTests/fast/events/touch/ios/tap-with-active-listener-on-elements.html        2016-06-11 01:18:37 UTC (rev 201958)
</span><span class="lines">@@ -0,0 +1,113 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+
+&lt;html&gt;
+&lt;head&gt;
+    &lt;script&gt;
+        if (window.testRunner) {
+            testRunner.dumpAsText();
+            testRunner.waitUntilDone();
+        }
+
+        function getUIScript(x, y)
+        {
+            return `
+            (function() {
+                uiController.singleTapAtPoint(${x}, ${y}, function() {
+                    uiController.uiScriptComplete(&quot;Done&quot;);
+                });
+            })();`
+        }
+
+        function runTest()
+        {
+            if (!testRunner.runUIScript)
+                return;
+
+            function fail(event) {
+                output += 'FAILED!: No mouse event should be receive, we got a ' + event.type;
+            }
+            window.addEventListener('mouseover', fail);
+            window.addEventListener('mouseout', fail);
+            window.addEventListener('mouseenter', fail);
+            window.addEventListener('mouseleave', fail);
+            window.addEventListener('mousedown', fail);
+            window.addEventListener('mousemove', fail);
+            window.addEventListener('mouseup', fail);
+            window.addEventListener('click', fail);
+
+            let output = '';
+            function getLogEvent(listener) {
+                return function logEvent(event) {
+                    output += 'Listener ' + listener + ' received' + (event.cancelable ? ' cancelable' : '') + ' event ' + event.type + ' targetting ' + event.target.id;
+                    if (event.touches[0] &amp;&amp; event.touches[0].clientX) {
+                        output += ' at ' + event.touches[0].clientX + ', ' + event.touches[0].clientY;
+                    }
+                    output +=  '&lt;br&gt;';
+                }
+            }
+
+            let target1 = document.getElementById('eventTarget1');
+            target1.addEventListener('touchstart', getLogEvent(&quot;target1&quot;));
+            target1.addEventListener('touchmove', getLogEvent(&quot;target1&quot;));
+            target1.addEventListener('touchend', getLogEvent(&quot;target1&quot;));
+            target1.addEventListener('touchcancel', getLogEvent(&quot;target1&quot;));
+            let target3 = document.getElementById('eventTarget3');
+            target3.addEventListener('touchstart', getLogEvent(&quot;target3&quot;));
+            target3.addEventListener('touchmove', getLogEvent(&quot;target3&quot;));
+            target3.addEventListener('touchend', getLogEvent(&quot;target3&quot;));
+            target3.addEventListener('touchcancel', getLogEvent(&quot;target3&quot;));
+
+            output += &quot;&lt;h1&gt;Tap on Target1 (green)&lt;/h1&gt;&quot;;
+            testRunner.runUIScript(getUIScript(50, 50), function(result) {
+                output += result;
+                output += &quot;&lt;h1&gt;Tap on Target2 (red)&lt;/h1&gt;&quot;;
+                testRunner.runUIScript(getUIScript(150, 50), function(result) {
+                    output += result;
+                    output += &quot;&lt;h1&gt;Tap on Target3 (blue)&lt;/h1&gt;&quot;;
+                    testRunner.runUIScript(getUIScript(250, 50), function(result) {
+                    document.getElementById('output').innerHTML = output;
+                    testRunner.notifyDone();
+                });
+                });
+            });
+        }
+
+        window.addEventListener('load', runTest, false);
+    &lt;/script&gt;
+    &lt;style&gt;
+        * { touch-action: manipulation; }
+        body {
+            margin: 0;
+        }
+        #eventTarget1, #eventTarget2, #eventTarget3 {
+            width: 100px;
+            height: 100px;
+        }
+        #eventTarget1 {
+            background-color: green;
+        }
+        #eventTarget2 {
+            background-color: red;
+            position: absolute;
+            left: 100px;
+        }
+        #eventTarget3 {
+            background-color: blue;
+            position: absolute;
+            left: 100px;
+        }
+    &lt;/style&gt;
+    &lt;meta name=&quot;viewport&quot; content=&quot;initial-scale=1&quot;&gt;
+&lt;/head&gt;
+&lt;body&gt;
+    &lt;div id=eventTarget1&gt;
+        &lt;div id=eventTarget2&gt;
+            &lt;div id=eventTarget3&gt;
+            &lt;/div&gt;
+        &lt;/div&gt;
+    &lt;/div&gt;
+    &lt;div id=output&gt;
+    This test requires UIScriptController to run.
+    &lt;/div&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsfasteventstouchiostapwithactivelisteneronwindowexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/events/touch/ios/tap-with-active-listener-on-window-expected.txt (0 => 201958)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/events/touch/ios/tap-with-active-listener-on-window-expected.txt                                (rev 0)
+++ trunk/LayoutTests/fast/events/touch/ios/tap-with-active-listener-on-window-expected.txt        2016-06-11 01:18:37 UTC (rev 201958)
</span><span class="lines">@@ -0,0 +1,3 @@
</span><ins>+Received cancelable event touchstart at 50, 50
+Received cancelable event touchend
+Done
</ins></span></pre></div>
<a id="trunkLayoutTestsfasteventstouchiostapwithactivelisteneronwindowhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/events/touch/ios/tap-with-active-listener-on-window.html (0 => 201958)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/events/touch/ios/tap-with-active-listener-on-window.html                                (rev 0)
+++ trunk/LayoutTests/fast/events/touch/ios/tap-with-active-listener-on-window.html        2016-06-11 01:18:37 UTC (rev 201958)
</span><span class="lines">@@ -0,0 +1,65 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+
+&lt;html&gt;
+&lt;head&gt;
+    &lt;script&gt;
+        if (window.testRunner) {
+            testRunner.dumpAsText();
+            testRunner.waitUntilDone();
+        }
+
+        function getUIScript()
+        {
+            return `
+            (function() {
+                uiController.singleTapAtPoint(50, 50, function() {
+                    uiController.uiScriptComplete(&quot;Done&quot;);
+                });
+            })();`
+        }
+
+        function runTest()
+        {
+            var output = '';
+            window.addEventListener('touchstart', function(event) {
+                output += 'Received' + (event.cancelable ? ' cancelable' : '') + ' event ' + event.type + ' at ' + event.touches[0].clientX + ', ' + event.touches[0].clientY + '&lt;br&gt;';
+                event.preventDefault();
+            });
+
+            window.addEventListener('touchend', function(event) {
+                output += 'Received' + (event.cancelable ? ' cancelable' : '') + ' event ' + event.type + '&lt;br&gt;';
+            });
+
+            function fail(event) {
+                output += 'FAILED!: No mouse event should be receive, we got a ' + event.type;
+            }
+            window.addEventListener('mouseover', fail);
+            window.addEventListener('mouseout', fail);
+            window.addEventListener('mouseenter', fail);
+            window.addEventListener('mouseleave', fail);
+            window.addEventListener('mousedown', fail);
+            window.addEventListener('mousemove', fail);
+            window.addEventListener('mouseup', fail);
+            window.addEventListener('click', fail);
+
+            if (testRunner.runUIScript) {
+                testRunner.runUIScript(getUIScript(), function(result) {
+                    output += result;
+                    document.getElementById('output').innerHTML = output;
+                    testRunner.notifyDone();
+                });
+            }
+        }
+
+        window.addEventListener('load', runTest, false);
+    &lt;/script&gt;
+    &lt;style&gt;
+        * { touch-action: manipulation; }
+    &lt;/style&gt;
+&lt;/head&gt;
+&lt;body&gt;
+    &lt;div id=output&gt;
+    This test requires UIScriptController to run.
+    &lt;/div&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsfasteventstouchiostapwithpassivelistenerinsideactivelistenerexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/events/touch/ios/tap-with-passive-listener-inside-active-listener-expected.txt (0 => 201958)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/events/touch/ios/tap-with-passive-listener-inside-active-listener-expected.txt                                (rev 0)
+++ trunk/LayoutTests/fast/events/touch/ios/tap-with-passive-listener-inside-active-listener-expected.txt        2016-06-11 01:18:37 UTC (rev 201958)
</span><span class="lines">@@ -0,0 +1,33 @@
</span><ins>+Tap on Target1 (green)
+
+Listener target1 received cancelable event touchstart targetting eventTarget1 at 50, 50
+defaultPrevented before preventDefault(): false
+defaultPrevented after preventDefault(): true
+Listener target1 received cancelable event touchend targetting eventTarget1
+defaultPrevented before preventDefault(): false
+defaultPrevented after preventDefault(): true
+Done
+Tap on Target2 (red)
+
+Listener target1 received cancelable event touchstart targetting eventTarget2 at 150, 50
+defaultPrevented before preventDefault(): false
+defaultPrevented after preventDefault(): true
+Listener target1 received cancelable event touchend targetting eventTarget2
+defaultPrevented before preventDefault(): false
+defaultPrevented after preventDefault(): true
+Done
+Tap on Target3 (blue)
+
+Listener target3 received cancelable event touchstart targetting eventTarget3 at 250, 50
+defaultPrevented before preventDefault(): false
+defaultPrevented after preventDefault(): false
+Listener target1 received cancelable event touchstart targetting eventTarget3 at 250, 50
+defaultPrevented before preventDefault(): false
+defaultPrevented after preventDefault(): true
+Listener target3 received cancelable event touchend targetting eventTarget3
+defaultPrevented before preventDefault(): false
+defaultPrevented after preventDefault(): false
+Listener target1 received cancelable event touchend targetting eventTarget3
+defaultPrevented before preventDefault(): false
+defaultPrevented after preventDefault(): true
+
</ins></span></pre></div>
<a id="trunkLayoutTestsfasteventstouchiostapwithpassivelisteneronelementsexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/events/touch/ios/tap-with-passive-listener-on-elements-expected.txt (0 => 201958)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/events/touch/ios/tap-with-passive-listener-on-elements-expected.txt                                (rev 0)
+++ trunk/LayoutTests/fast/events/touch/ios/tap-with-passive-listener-on-elements-expected.txt        2016-06-11 01:18:37 UTC (rev 201958)
</span><span class="lines">@@ -0,0 +1,17 @@
</span><ins>+Tap on Target1 (green)
+
+Listener target1 received event touchstart targetting eventTarget1 at 50, 50
+Listener target1 received event touchend targetting eventTarget1
+Done
+Tap on Target2 (red)
+
+Listener target1 received event touchstart targetting eventTarget2 at 150, 50
+Listener target1 received event touchend targetting eventTarget2
+Done
+Tap on Target3 (blue)
+
+Listener target3 received event touchstart targetting eventTarget3 at 250, 50
+Listener target1 received event touchstart targetting eventTarget3 at 250, 50
+Listener target3 received event touchend targetting eventTarget3
+Listener target1 received event touchend targetting eventTarget3
+
</ins></span></pre></div>
<a id="trunkLayoutTestsfasteventstouchiostapwithpassivelisteneronelementshtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/events/touch/ios/tap-with-passive-listener-on-elements.html (0 => 201958)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/events/touch/ios/tap-with-passive-listener-on-elements.html                                (rev 0)
+++ trunk/LayoutTests/fast/events/touch/ios/tap-with-passive-listener-on-elements.html        2016-06-11 01:18:37 UTC (rev 201958)
</span><span class="lines">@@ -0,0 +1,113 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+
+&lt;html&gt;
+&lt;head&gt;
+    &lt;script&gt;
+        if (window.testRunner) {
+            testRunner.dumpAsText();
+            testRunner.waitUntilDone();
+        }
+
+        function getUIScript(x, y)
+        {
+            return `
+            (function() {
+                uiController.singleTapAtPoint(${x}, ${y}, function() {
+                    uiController.uiScriptComplete(&quot;Done&quot;);
+                });
+            })();`
+        }
+
+        function runTest()
+        {
+            if (!testRunner.runUIScript)
+                return;
+
+            function fail(event) {
+                output += 'FAILED!: No mouse event should be receive, we got a ' + event.type;
+            }
+            window.addEventListener('mouseover', fail);
+            window.addEventListener('mouseout', fail);
+            window.addEventListener('mouseenter', fail);
+            window.addEventListener('mouseleave', fail);
+            window.addEventListener('mousedown', fail);
+            window.addEventListener('mousemove', fail);
+            window.addEventListener('mouseup', fail);
+            window.addEventListener('click', fail);
+
+            let output = '';
+            function getLogEvent(listener) {
+                return function logEvent(event) {
+                    output += 'Listener ' + listener + ' received' + (event.cancelable ? ' cancelable' : '') + ' event ' + event.type + ' targetting ' + event.target.id;
+                    if (event.touches[0] &amp;&amp; event.touches[0].clientX) {
+                        output += ' at ' + event.touches[0].clientX + ', ' + event.touches[0].clientY;
+                    }
+                    output +=  '&lt;br&gt;';
+                }
+            }
+
+            let target1 = document.getElementById('eventTarget1');
+            target1.addEventListener('touchstart', getLogEvent(&quot;target1&quot;), { 'passive': true });
+            target1.addEventListener('touchmove', getLogEvent(&quot;target1&quot;), { 'passive': true });
+            target1.addEventListener('touchend', getLogEvent(&quot;target1&quot;), { 'passive': true });
+            target1.addEventListener('touchcancel', getLogEvent(&quot;target1&quot;), { 'passive': true });
+            let target3 = document.getElementById('eventTarget3');
+            target3.addEventListener('touchstart', getLogEvent(&quot;target3&quot;), { 'passive': true });
+            target3.addEventListener('touchmove', getLogEvent(&quot;target3&quot;), { 'passive': true });
+            target3.addEventListener('touchend', getLogEvent(&quot;target3&quot;), { 'passive': true });
+            target3.addEventListener('touchcancel', getLogEvent(&quot;target3&quot;), { 'passive': true });
+
+            output += &quot;&lt;h1&gt;Tap on Target1 (green)&lt;/h1&gt;&quot;;
+            testRunner.runUIScript(getUIScript(50, 50), function(result) {
+                output += result;
+                output += &quot;&lt;h1&gt;Tap on Target2 (red)&lt;/h1&gt;&quot;;
+                testRunner.runUIScript(getUIScript(150, 50), function(result) {
+                    output += result;
+                    output += &quot;&lt;h1&gt;Tap on Target3 (blue)&lt;/h1&gt;&quot;;
+                    testRunner.runUIScript(getUIScript(250, 50), function(result) {
+                        document.getElementById('output').innerHTML = output;
+                        testRunner.notifyDone();
+                    });
+                });
+            });
+        }
+
+        window.addEventListener('load', runTest, false);
+    &lt;/script&gt;
+    &lt;style&gt;
+        * { touch-action: manipulation; }
+        body {
+            margin: 0;
+        }
+        #eventTarget1, #eventTarget2, #eventTarget3 {
+            width: 100px;
+            height: 100px;
+        }
+        #eventTarget1 {
+            background-color: green;
+        }
+        #eventTarget2 {
+            background-color: red;
+            position: absolute;
+            left: 100px;
+        }
+        #eventTarget3 {
+            background-color: blue;
+            position: absolute;
+            left: 100px;
+        }
+    &lt;/style&gt;
+    &lt;meta name=&quot;viewport&quot; content=&quot;initial-scale=1&quot;&gt;
+&lt;/head&gt;
+&lt;body&gt;
+    &lt;div id=eventTarget1&gt;
+        &lt;div id=eventTarget2&gt;
+            &lt;div id=eventTarget3&gt;
+            &lt;/div&gt;
+        &lt;/div&gt;
+    &lt;/div&gt;
+    &lt;div id=output&gt;
+    This test requires UIScriptController to run.
+    &lt;/div&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsfasteventstouchiostapwithpassivelisteneronwindowexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/events/touch/ios/tap-with-passive-listener-on-window-expected.txt (0 => 201958)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/events/touch/ios/tap-with-passive-listener-on-window-expected.txt                                (rev 0)
+++ trunk/LayoutTests/fast/events/touch/ios/tap-with-passive-listener-on-window-expected.txt        2016-06-11 01:18:37 UTC (rev 201958)
</span><span class="lines">@@ -0,0 +1,3 @@
</span><ins>+Received event touchstart at 50, 50
+Received event touchend
+Done
</ins></span></pre></div>
<a id="trunkLayoutTestsfasteventstouchiostapwithpassivelisteneronwindowhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/events/touch/ios/tap-with-passive-listener-on-window.html (0 => 201958)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/events/touch/ios/tap-with-passive-listener-on-window.html                                (rev 0)
+++ trunk/LayoutTests/fast/events/touch/ios/tap-with-passive-listener-on-window.html        2016-06-11 01:18:37 UTC (rev 201958)
</span><span class="lines">@@ -0,0 +1,53 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+
+&lt;html&gt;
+&lt;head&gt;
+    &lt;script&gt;
+        if (window.testRunner) {
+            testRunner.dumpAsText();
+            testRunner.waitUntilDone();
+        }
+
+        function getUIScript()
+        {
+            return `
+            (function() {
+                uiController.singleTapAtPoint(50, 50, function() {
+                    uiController.uiScriptComplete(&quot;Done&quot;);
+                });
+            })();`
+        }
+
+        function runTest()
+        {
+            var output = '';
+            window.addEventListener('touchstart', function(event) {
+                output += 'Received' + (event.cancelable ? ' cancelable' : '') + ' event ' + event.type + ' at ' + event.touches[0].clientX + ', ' + event.touches[0].clientY + '&lt;br&gt;';
+                event.preventDefault();
+            }, { 'passive': true });
+
+            window.addEventListener('touchend', function(event) {
+                output += 'Received' + (event.cancelable ? ' cancelable' : '') + ' event ' + event.type + '&lt;br&gt;';
+            }, { 'passive': true });
+
+            if (testRunner.runUIScript) {
+                testRunner.runUIScript(getUIScript(), function(result) {
+                    output += result;
+                    document.getElementById('output').innerHTML = output;
+                    testRunner.notifyDone();
+                });
+            }
+        }
+
+        window.addEventListener('load', runTest, false);
+    &lt;/script&gt;
+&lt;/head&gt;
+&lt;style&gt;
+    * { touch-action: manipulation; }
+&lt;/style&gt;
+&lt;body&gt;
+    &lt;div id=output&gt;
+    This test requires UIScriptController to run.
+    &lt;/div&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTeststileddrawingscrollingfixedfixedinoverflowexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/tiled-drawing/scrolling/fixed/fixed-in-overflow-expected.txt (201957 => 201958)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/tiled-drawing/scrolling/fixed/fixed-in-overflow-expected.txt        2016-06-11 00:48:43 UTC (rev 201957)
+++ trunk/LayoutTests/tiled-drawing/scrolling/fixed/fixed-in-overflow-expected.txt        2016-06-11 01:18:37 UTC (rev 201958)
</span><span class="lines">@@ -2,7 +2,7 @@
</span><span class="cx">   (scrollable area size 785 600)
</span><span class="cx">   (contents size 785 2213)
</span><span class="cx">   (requested scroll position 0 200)
</span><del>-  (non-fast-scrollable region
</del><ins>+  (synchronous event dispatch region
</ins><span class="cx">     at (0,13) size 204x204)
</span><span class="cx">   (children 1
</span><span class="cx">     (Fixed node
</span></span></pre></div>
<a id="trunkLayoutTeststileddrawingscrollingframescoordinatedframeexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/tiled-drawing/scrolling/frames/coordinated-frame-expected.txt (201957 => 201958)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/tiled-drawing/scrolling/frames/coordinated-frame-expected.txt        2016-06-11 00:48:43 UTC (rev 201957)
+++ trunk/LayoutTests/tiled-drawing/scrolling/frames/coordinated-frame-expected.txt        2016-06-11 01:18:37 UTC (rev 201958)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> (Frame scrolling node
</span><span class="cx">   (scrollable area size 785 600)
</span><span class="cx">   (contents size 785 1016)
</span><del>-  (non-fast-scrollable region
</del><ins>+  (synchronous event dispatch region
</ins><span class="cx">     at (45,47) size 404x304)
</span><span class="cx">   (children 1
</span><span class="cx">     (Frame scrolling node
</span></span></pre></div>
<a id="trunkLayoutTeststileddrawingscrollingframescoordinatedframegainscrollingancestorexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/tiled-drawing/scrolling/frames/coordinated-frame-gain-scrolling-ancestor-expected.txt (201957 => 201958)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/tiled-drawing/scrolling/frames/coordinated-frame-gain-scrolling-ancestor-expected.txt        2016-06-11 00:48:43 UTC (rev 201957)
+++ trunk/LayoutTests/tiled-drawing/scrolling/frames/coordinated-frame-gain-scrolling-ancestor-expected.txt        2016-06-11 01:18:37 UTC (rev 201958)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> (Frame scrolling node
</span><span class="cx">   (scrollable area size 785 600)
</span><span class="cx">   (contents size 785 1016)
</span><del>-  (non-fast-scrollable region
</del><ins>+  (synchronous event dispatch region
</ins><span class="cx">     at (45,47) size 404x304)
</span><span class="cx">   (children 1
</span><span class="cx">     (Fixed node
</span></span></pre></div>
<a id="trunkLayoutTeststileddrawingscrollingframescoordinatedframeinfixedexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/tiled-drawing/scrolling/frames/coordinated-frame-in-fixed-expected.txt (201957 => 201958)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/tiled-drawing/scrolling/frames/coordinated-frame-in-fixed-expected.txt        2016-06-11 00:48:43 UTC (rev 201957)
+++ trunk/LayoutTests/tiled-drawing/scrolling/frames/coordinated-frame-in-fixed-expected.txt        2016-06-11 01:18:37 UTC (rev 201958)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> (Frame scrolling node
</span><span class="cx">   (scrollable area size 785 600)
</span><span class="cx">   (contents size 785 1016)
</span><del>-  (non-fast-scrollable region
</del><ins>+  (synchronous event dispatch region
</ins><span class="cx">     at (45,37) size 404x304)
</span><span class="cx">   (children 1
</span><span class="cx">     (Fixed node
</span></span></pre></div>
<a id="trunkLayoutTeststileddrawingscrollingframescoordinatedframelosescrollingancestorexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/tiled-drawing/scrolling/frames/coordinated-frame-lose-scrolling-ancestor-expected.txt (201957 => 201958)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/tiled-drawing/scrolling/frames/coordinated-frame-lose-scrolling-ancestor-expected.txt        2016-06-11 00:48:43 UTC (rev 201957)
+++ trunk/LayoutTests/tiled-drawing/scrolling/frames/coordinated-frame-lose-scrolling-ancestor-expected.txt        2016-06-11 01:18:37 UTC (rev 201958)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> (Frame scrolling node
</span><span class="cx">   (scrollable area size 785 600)
</span><span class="cx">   (contents size 785 1016)
</span><del>-  (non-fast-scrollable region
</del><ins>+  (synchronous event dispatch region
</ins><span class="cx">     at (45,47) size 404x304)
</span><span class="cx">   (children 1
</span><span class="cx">     (Frame scrolling node
</span></span></pre></div>
<a id="trunkLayoutTeststileddrawingscrollingframesframesetframescrollabilityexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/tiled-drawing/scrolling/frames/frameset-frame-scrollability-expected.txt (201957 => 201958)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/tiled-drawing/scrolling/frames/frameset-frame-scrollability-expected.txt        2016-06-11 00:48:43 UTC (rev 201957)
+++ trunk/LayoutTests/tiled-drawing/scrolling/frames/frameset-frame-scrollability-expected.txt        2016-06-11 01:18:37 UTC (rev 201958)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> (Frame scrolling node
</span><span class="cx">   (scrollable area size 800 600)
</span><span class="cx">   (contents size 800 600)
</span><del>-  (non-fast-scrollable region
</del><ins>+  (synchronous event dispatch region
</ins><span class="cx">     at (0,0) size 800x594)
</span><span class="cx"> )
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTeststileddrawingscrollingframesframesetnestedframescrollabilityexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/tiled-drawing/scrolling/frames/frameset-nested-frame-scrollability-expected.txt (201957 => 201958)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/tiled-drawing/scrolling/frames/frameset-nested-frame-scrollability-expected.txt        2016-06-11 00:48:43 UTC (rev 201957)
+++ trunk/LayoutTests/tiled-drawing/scrolling/frames/frameset-nested-frame-scrollability-expected.txt        2016-06-11 01:18:37 UTC (rev 201958)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> (Frame scrolling node
</span><span class="cx">   (scrollable area size 800 600)
</span><span class="cx">   (contents size 800 600)
</span><del>-  (non-fast-scrollable region
</del><ins>+  (synchronous event dispatch region
</ins><span class="cx">     at (0,166) size 280x434)
</span><span class="cx"> )
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTeststileddrawingscrollingframesscrollregionafterframelayoutexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/tiled-drawing/scrolling/frames/scroll-region-after-frame-layout-expected.txt (201957 => 201958)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/tiled-drawing/scrolling/frames/scroll-region-after-frame-layout-expected.txt        2016-06-11 00:48:43 UTC (rev 201957)
+++ trunk/LayoutTests/tiled-drawing/scrolling/frames/scroll-region-after-frame-layout-expected.txt        2016-06-11 01:18:37 UTC (rev 201958)
</span><span class="lines">@@ -2,7 +2,7 @@
</span><span class="cx"> (Frame scrolling node
</span><span class="cx">   (scrollable area size 785 600)
</span><span class="cx">   (contents size 785 757)
</span><del>-  (non-fast-scrollable region
</del><ins>+  (synchronous event dispatch region
</ins><span class="cx">     at (68,68) size 300x300)
</span><span class="cx"> )
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (201957 => 201958)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-06-11 00:48:43 UTC (rev 201957)
+++ trunk/Source/WebCore/ChangeLog        2016-06-11 01:18:37 UTC (rev 201958)
</span><span class="lines">@@ -1,3 +1,97 @@
</span><ins>+2016-06-10  Benjamin Poulain  &lt;bpoulain@apple.com&gt;
+
+        Add support for passive event listeners on touch events
+        https://bugs.webkit.org/show_bug.cgi?id=158601
+
+        Reviewed by Simon Fraser.
+
+        This patch wires &quot;passive&quot; state of EventTarget to the delivery of touch
+        events in WebKit2.
+
+        Instead of having a NonFastScrollableRegion, we have a pair of regions
+        in EventTrackingRegions.
+        The &quot;asynchronousDispatchRegion&quot; tracks the area for which all event
+        listeners are passive. For those, events should be dispatched asynchronously.
+        The &quot;synchronousDispatchRegion&quot; tracks the area for which there is at
+        least one active event listener. Events have to be dispatched synchronously
+        for correctness.
+
+        Tests: fast/events/touch/ios/tap-with-active-listener-on-elements.html
+               fast/events/touch/ios/tap-with-active-listener-on-window.html
+               fast/events/touch/ios/tap-with-passive-listener-on-elements.html
+               fast/events/touch/ios/tap-with-passive-listener-on-window.html
+
+        * WebCore.xcodeproj/project.pbxproj:
+        * dom/Document.cpp:
+        (WebCore::Document::wheelEventHandlersChanged):
+        (WebCore::Document::Document): Deleted.
+        * dom/Document.h:
+
+        * dom/EventListenerMap.cpp:
+        (WebCore::EventListenerMap::containsActive):
+        If a Target has multiple listener for an event type, we want to know
+        if any of them is active.
+
+        * dom/EventListenerMap.h:
+        * dom/EventTarget.cpp:
+        (WebCore::EventTarget::hasActiveEventListeners):
+        (WebCore::EventTarget::hasActiveTouchEventListeners):
+        * dom/EventTarget.h:
+
+        * page/DebugPageOverlays.cpp:
+        (WebCore::NonFastScrollableRegionOverlay::updateRegion):
+        I did not change the debug overlays.
+        The NonFastScrollable area is the region for which events needs
+        synchronous dispatch. Everything else should scroll without delay.
+
+        * page/FrameView.cpp:
+        (WebCore::FrameView::scrollableAreaSetChanged):
+        * page/Page.cpp:
+        (WebCore::Page::nonFastScrollableRects):
+        * page/scrolling/AsyncScrollingCoordinator.cpp:
+        (WebCore::AsyncScrollingCoordinator::setEventTrackingRegionsDirty):
+        (WebCore::AsyncScrollingCoordinator::willCommitTree):
+        (WebCore::AsyncScrollingCoordinator::updateEventTrackingRegions):
+        (WebCore::AsyncScrollingCoordinator::frameViewLayoutUpdated):
+        (WebCore::AsyncScrollingCoordinator::frameViewEventTrackingRegionsChanged):
+        (WebCore::AsyncScrollingCoordinator::scrollingStateTreeAsText):
+        (WebCore::AsyncScrollingCoordinator::setNonFastScrollableRegionDirty): Deleted.
+        (WebCore::AsyncScrollingCoordinator::updateNonFastScrollableRegion): Deleted.
+        (WebCore::AsyncScrollingCoordinator::frameViewNonFastScrollableRegionChanged): Deleted.
+        * page/scrolling/AsyncScrollingCoordinator.h:
+        (WebCore::AsyncScrollingCoordinator::eventTrackingRegionsDirty):
+        (WebCore::AsyncScrollingCoordinator::nonFastScrollableRegionDirty): Deleted.
+
+        * page/scrolling/ScrollingCoordinator.cpp:
+        (WebCore::ScrollingCoordinator::absoluteEventTrackingRegionsForFrame):
+        (WebCore::ScrollingCoordinator::absoluteEventTrackingRegions):
+        (WebCore::ScrollingCoordinator::absoluteNonFastScrollableRegionForFrame): Deleted.
+        (WebCore::ScrollingCoordinator::absoluteNonFastScrollableRegion): Deleted.
+        I intentionally left the Wheel event with synchronous dispatch.
+        This use case will need its own set of tests.
+
+        * page/scrolling/ScrollingCoordinator.h:
+        (WebCore::ScrollingCoordinator::frameViewEventTrackingRegionsChanged):
+        (WebCore::ScrollingCoordinator::frameViewNonFastScrollableRegionChanged): Deleted.
+        * page/scrolling/ScrollingStateFrameScrollingNode.cpp:
+        (WebCore::ScrollingStateFrameScrollingNode::ScrollingStateFrameScrollingNode):
+        (WebCore::ScrollingStateFrameScrollingNode::setEventTrackingRegions):
+        (WebCore::ScrollingStateFrameScrollingNode::dumpProperties):
+        (WebCore::ScrollingStateFrameScrollingNode::setNonFastScrollableRegion): Deleted.
+        * page/scrolling/ScrollingStateFrameScrollingNode.h:
+        * page/scrolling/ScrollingTree.cpp:
+        (WebCore::ScrollingTree::shouldHandleWheelEventSynchronously):
+        (WebCore::ScrollingTree::commitNewTreeState):
+        (WebCore::ScrollingTree::eventTrackingTypeForPoint):
+        (WebCore::ScrollingTree::isPointInNonFastScrollableRegion): Deleted.
+        * page/scrolling/ScrollingTree.h:
+        * page/scrolling/mac/ScrollingCoordinatorMac.mm:
+        (WebCore::ScrollingCoordinatorMac::scheduleTreeStateCommit):
+        * platform/EventTrackingRegions.h: Added.
+        (WebCore::EventTrackingRegions::isEmpty):
+        (WebCore::EventTrackingRegions::trackingTypeForPoint):
+        (WebCore::operator==):
+
</ins><span class="cx"> 2016-06-10  Enrica Casucci  &lt;enrica@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         REGRESSION(r198177): Cannot paste an image when the pasteboard format is mime type.
</span></span></pre></div>
<a id="trunkSourceWebCoreWebCorexcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (201957 => 201958)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2016-06-11 00:48:43 UTC (rev 201957)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2016-06-11 01:18:37 UTC (rev 201958)
</span><span class="lines">@@ -1030,6 +1030,7 @@
</span><span class="cx">                 26255F0018878DFF0006E1FD /* UserAgentIOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = 26255EFF18878DFF0006E1FD /* UserAgentIOS.mm */; };
</span><span class="cx">                 26255F0318878E110006E1FD /* UserAgent.h in Headers */ = {isa = PBXBuildFile; fileRef = 26255F0118878E110006E1FD /* UserAgent.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 26255F0418878E110006E1FD /* UserAgentMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 26255F0218878E110006E1FD /* UserAgentMac.mm */; };
</span><ins>+                262EC41A1D078FB900BA78FC /* EventTrackingRegions.h in Headers */ = {isa = PBXBuildFile; fileRef = 262EC4191D078F3D00BA78FC /* EventTrackingRegions.h */; settings = {ATTRIBUTES = (Private, ); }; };
</ins><span class="cx">                 265541391489811C000DFC5D /* KeyEventCodesIOS.h in Headers */ = {isa = PBXBuildFile; fileRef = 265541371489811C000DFC5D /* KeyEventCodesIOS.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 2655413A1489811C000DFC5D /* KeyEventIOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = 265541381489811C000DFC5D /* KeyEventIOS.mm */; };
</span><span class="cx">                 265541521489B233000DFC5D /* CursorIOS.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2655414B1489AA2B000DFC5D /* CursorIOS.cpp */; };
</span><span class="lines">@@ -8510,6 +8511,7 @@
</span><span class="cx">                 26255EFF18878DFF0006E1FD /* UserAgentIOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = UserAgentIOS.mm; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 26255F0118878E110006E1FD /* UserAgent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UserAgent.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 26255F0218878E110006E1FD /* UserAgentMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = UserAgentMac.mm; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                262EC4191D078F3D00BA78FC /* EventTrackingRegions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EventTrackingRegions.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 265541371489811C000DFC5D /* KeyEventCodesIOS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KeyEventCodesIOS.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 265541381489811C000DFC5D /* KeyEventIOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = KeyEventIOS.mm; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 2655414B1489AA2B000DFC5D /* CursorIOS.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CursorIOS.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -22951,6 +22953,7 @@
</span><span class="cx">                                 A7CFB3CF0B7ED10A0070C32D /* DragImage.cpp */,
</span><span class="cx">                                 A7CFB3D00B7ED10A0070C32D /* DragImage.h */,
</span><span class="cx">                                 1CA19E150DC255CA0065A994 /* EventLoop.h */,
</span><ins>+                                262EC4191D078F3D00BA78FC /* EventTrackingRegions.h */,
</ins><span class="cx">                                 934FE9E40B5CA539003E4A73 /* FileChooser.cpp */,
</span><span class="cx">                                 066C772A0AB603B700238CC4 /* FileChooser.h */,
</span><span class="cx">                                 4689F1AE1267BAE100E8D380 /* FileMetadata.h */,
</span><span class="lines">@@ -28143,6 +28146,7 @@
</span><span class="cx">                                 439D334513A6911C00C20F4F /* SVGAnimatorFactory.h in Headers */,
</span><span class="cx">                                 08FB3F8413BC754C0099FC18 /* SVGAttributeToPropertyMap.h in Headers */,
</span><span class="cx">                                 B222799C0D00BF220071B782 /* SVGCircleElement.h in Headers */,
</span><ins>+                                262EC41A1D078FB900BA78FC /* EventTrackingRegions.h in Headers */,
</ins><span class="cx">                                 B222799F0D00BF220071B782 /* SVGClipPathElement.h in Headers */,
</span><span class="cx">                                 B22279A20D00BF220071B782 /* SVGColor.h in Headers */,
</span><span class="cx">                                 B22279A50D00BF220071B782 /* SVGComponentTransferFunctionElement.h in Headers */,
</span></span></pre></div>
<a id="trunkSourceWebCoredomDocumentcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/Document.cpp (201957 => 201958)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/Document.cpp        2016-06-11 00:48:43 UTC (rev 201957)
+++ trunk/Source/WebCore/dom/Document.cpp        2016-06-11 01:18:37 UTC (rev 201958)
</span><span class="lines">@@ -431,8 +431,6 @@
</span><span class="cx">     : ContainerNode(*this, CreateDocument)
</span><span class="cx">     , TreeScope(*this)
</span><span class="cx"> #if ENABLE(IOS_TOUCH_EVENTS)
</span><del>-    , m_handlingTouchEvent(false)
-    , m_touchEventRegionsDirty(false)
</del><span class="cx">     , m_touchEventsChangedTimer(*this, &amp;Document::touchEventsChangedTimerFired)
</span><span class="cx"> #endif
</span><span class="cx">     , m_referencingNodeCount(0)
</span><span class="lines">@@ -6284,7 +6282,7 @@
</span><span class="cx"> 
</span><span class="cx">     if (FrameView* frameView = view()) {
</span><span class="cx">         if (ScrollingCoordinator* scrollingCoordinator = page-&gt;scrollingCoordinator())
</span><del>-            scrollingCoordinator-&gt;frameViewNonFastScrollableRegionChanged(*frameView);
</del><ins>+            scrollingCoordinator-&gt;frameViewEventTrackingRegionsChanged(*frameView);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     bool haveHandlers = m_wheelEventTargets &amp;&amp; !m_wheelEventTargets-&gt;isEmpty();
</span></span></pre></div>
<a id="trunkSourceWebCoredomDocumenth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/Document.h (201957 => 201958)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/Document.h        2016-06-11 00:48:43 UTC (rev 201957)
+++ trunk/Source/WebCore/dom/Document.h        2016-06-11 01:18:37 UTC (rev 201958)
</span><span class="lines">@@ -32,6 +32,7 @@
</span><span class="cx"> #include &quot;ContainerNode.h&quot;
</span><span class="cx"> #include &quot;DocumentEventQueue.h&quot;
</span><span class="cx"> #include &quot;DocumentTiming.h&quot;
</span><ins>+#include &quot;EventTrackingRegions.h&quot;
</ins><span class="cx"> #include &quot;FocusDirection.h&quot;
</span><span class="cx"> #include &quot;FontSelectorClient.h&quot;
</span><span class="cx"> #include &quot;MediaProducer.h&quot;
</span></span></pre></div>
<a id="trunkSourceWebCoredomEventListenerMapcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/EventListenerMap.cpp (201957 => 201958)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/EventListenerMap.cpp        2016-06-11 00:48:43 UTC (rev 201957)
+++ trunk/Source/WebCore/dom/EventListenerMap.cpp        2016-06-11 01:18:37 UTC (rev 201958)
</span><span class="lines">@@ -77,6 +77,19 @@
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool EventListenerMap::containsActive(const AtomicString&amp; eventType) const
+{
+    for (auto&amp; entry : m_entries) {
+        if (entry.first == eventType) {
+            for (auto&amp; eventListener : *entry.second) {
+                if (!eventListener.isPassive)
+                    return true;
+            }
+        }
+    }
+    return false;
+}
+
</ins><span class="cx"> void EventListenerMap::clear()
</span><span class="cx"> {
</span><span class="cx">     assertNoActiveIterators();
</span></span></pre></div>
<a id="trunkSourceWebCoredomEventListenerMaph"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/EventListenerMap.h (201957 => 201958)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/EventListenerMap.h        2016-06-11 00:48:43 UTC (rev 201957)
+++ trunk/Source/WebCore/dom/EventListenerMap.h        2016-06-11 01:18:37 UTC (rev 201958)
</span><span class="lines">@@ -52,6 +52,7 @@
</span><span class="cx">     bool isEmpty() const { return m_entries.isEmpty(); }
</span><span class="cx">     WEBCORE_EXPORT bool contains(const AtomicString&amp; eventType) const;
</span><span class="cx">     bool containsCapturing(const AtomicString&amp; eventType) const;
</span><ins>+    bool containsActive(const AtomicString&amp; eventType) const;
</ins><span class="cx"> 
</span><span class="cx">     void clear();
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoredomEventTargetcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/EventTarget.cpp (201957 => 201958)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/EventTarget.cpp        2016-06-11 00:48:43 UTC (rev 201957)
+++ trunk/Source/WebCore/dom/EventTarget.cpp        2016-06-11 01:18:37 UTC (rev 201958)
</span><span class="lines">@@ -141,6 +141,14 @@
</span><span class="cx">     return 0;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool EventTarget::hasActiveEventListeners(const AtomicString&amp; eventType) const
+{
+    EventTargetData* eventTargetData = const_cast&lt;EventTarget*&gt;(this)-&gt;eventTargetData();
+    if (!eventTargetData)
+        return false;
+    return eventTargetData-&gt;eventListenerMap.containsActive(eventType);
+}
+
</ins><span class="cx"> bool EventTarget::clearAttributeEventListener(const AtomicString&amp; eventType)
</span><span class="cx"> {
</span><span class="cx">     EventListener* listener = getAttributeEventListener(eventType);
</span><span class="lines">@@ -233,7 +241,17 @@
</span><span class="cx"> 
</span><span class="cx">     return !event.defaultPrevented();
</span><span class="cx"> }
</span><del>-        
</del><ins>+
+bool EventTarget::hasActiveTouchEventListeners() const
+{
+    const EventNames&amp; names = eventNames();
+    return hasActiveEventListeners(names.touchstartEvent)
+        || hasActiveEventListeners(names.touchmoveEvent)
+        || hasActiveEventListeners(names.touchendEvent)
+        || hasActiveEventListeners(names.touchcancelEvent)
+        || hasActiveEventListeners(names.touchforcechangeEvent);
+}
+
</ins><span class="cx"> void EventTarget::fireEventListeners(Event&amp; event, EventTargetData* d, EventListenerVector&amp; entry)
</span><span class="cx"> {
</span><span class="cx">     Ref&lt;EventTarget&gt; protectedThis(*this);
</span></span></pre></div>
<a id="trunkSourceWebCoredomEventTargeth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/EventTarget.h (201957 => 201958)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/EventTarget.h        2016-06-11 00:48:43 UTC (rev 201957)
+++ trunk/Source/WebCore/dom/EventTarget.h        2016-06-11 01:18:37 UTC (rev 201958)
</span><span class="lines">@@ -160,6 +160,7 @@
</span><span class="cx">     bool hasEventListeners() const;
</span><span class="cx">     bool hasEventListeners(const AtomicString&amp; eventType);
</span><span class="cx">     bool hasCapturingEventListeners(const AtomicString&amp; eventType);
</span><ins>+    bool hasActiveEventListeners(const AtomicString&amp; eventType) const;
</ins><span class="cx">     const EventListenerVector&amp; getEventListeners(const AtomicString&amp; eventType);
</span><span class="cx"> 
</span><span class="cx">     bool fireEventListeners(Event&amp;);
</span><span class="lines">@@ -168,6 +169,8 @@
</span><span class="cx">     void visitJSEventListeners(JSC::SlotVisitor&amp;);
</span><span class="cx">     void invalidateJSEventListeners(JSC::JSObject*);
</span><span class="cx"> 
</span><ins>+    bool hasActiveTouchEventListeners() const;
+
</ins><span class="cx"> protected:
</span><span class="cx">     virtual ~EventTarget();
</span><span class="cx">     
</span></span></pre></div>
<a id="trunkSourceWebCorepageDebugPageOverlayscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/DebugPageOverlays.cpp (201957 => 201958)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/DebugPageOverlays.cpp        2016-06-11 00:48:43 UTC (rev 201957)
+++ trunk/Source/WebCore/page/DebugPageOverlays.cpp        2016-06-11 01:18:37 UTC (rev 201958)
</span><span class="lines">@@ -131,8 +131,10 @@
</span><span class="cx">     std::unique_ptr&lt;Region&gt; region = std::make_unique&lt;Region&gt;();
</span><span class="cx"> 
</span><span class="cx">     if (Page* page = m_frame.page()) {
</span><del>-        if (ScrollingCoordinator* scrollingCoordinator = page-&gt;scrollingCoordinator())
-            *region = scrollingCoordinator-&gt;absoluteNonFastScrollableRegion();
</del><ins>+        if (ScrollingCoordinator* scrollingCoordinator = page-&gt;scrollingCoordinator()) {
+            EventTrackingRegions eventTrackingRegions = scrollingCoordinator-&gt;absoluteEventTrackingRegions();
+            *region = eventTrackingRegions.synchronousDispatchRegion;
+        }
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     bool regionChanged = !m_region || !(*m_region == *region);
</span></span></pre></div>
<a id="trunkSourceWebCorepageFrameViewcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/FrameView.cpp (201957 => 201958)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/FrameView.cpp        2016-06-11 00:48:43 UTC (rev 201957)
+++ trunk/Source/WebCore/page/FrameView.cpp        2016-06-11 01:18:37 UTC (rev 201958)
</span><span class="lines">@@ -4619,7 +4619,7 @@
</span><span class="cx"> {
</span><span class="cx">     if (auto* page = frame().page()) {
</span><span class="cx">         if (auto* scrollingCoordinator = page-&gt;scrollingCoordinator())
</span><del>-            scrollingCoordinator-&gt;frameViewNonFastScrollableRegionChanged(*this);
</del><ins>+            scrollingCoordinator-&gt;frameViewEventTrackingRegionsChanged(*this);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorepagePagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/Page.cpp (201957 => 201958)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/Page.cpp        2016-06-11 00:48:43 UTC (rev 201957)
+++ trunk/Source/WebCore/page/Page.cpp        2016-06-11 01:18:37 UTC (rev 201958)
</span><span class="lines">@@ -372,7 +372,7 @@
</span><span class="cx"> 
</span><span class="cx">     Vector&lt;IntRect&gt; rects;
</span><span class="cx">     if (ScrollingCoordinator* scrollingCoordinator = this-&gt;scrollingCoordinator())
</span><del>-        rects = scrollingCoordinator-&gt;absoluteNonFastScrollableRegion().rects();
</del><ins>+        rects = scrollingCoordinator-&gt;absoluteEventTrackingRegions().synchronousDispatchRegion.rects();
</ins><span class="cx"> 
</span><span class="cx">     Vector&lt;FloatQuad&gt; quads(rects.size());
</span><span class="cx">     for (size_t i = 0; i &lt; rects.size(); ++i)
</span></span></pre></div>
<a id="trunkSourceWebCorepagescrollingAsyncScrollingCoordinatorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/scrolling/AsyncScrollingCoordinator.cpp (201957 => 201958)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/scrolling/AsyncScrollingCoordinator.cpp        2016-06-11 00:48:43 UTC (rev 201957)
+++ trunk/Source/WebCore/page/scrolling/AsyncScrollingCoordinator.cpp        2016-06-11 01:18:37 UTC (rev 201958)
</span><span class="lines">@@ -77,28 +77,28 @@
</span><span class="cx">         node.setVerticalSnapOffsets(snapOffsetsAsFloat);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void AsyncScrollingCoordinator::setNonFastScrollableRegionDirty()
</del><ins>+void AsyncScrollingCoordinator::setEventTrackingRegionsDirty()
</ins><span class="cx"> {
</span><del>-    m_nonFastScrollableRegionDirty = true;
</del><ins>+    m_eventTrackingRegionsDirty = true;
</ins><span class="cx">     // We have to schedule a commit, but the computed non-fast region may not have actually changed.
</span><span class="cx">     scheduleTreeStateCommit();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void AsyncScrollingCoordinator::willCommitTree()
</span><span class="cx"> {
</span><del>-    updateNonFastScrollableRegion();
</del><ins>+    updateEventTrackingRegions();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void AsyncScrollingCoordinator::updateNonFastScrollableRegion()
</del><ins>+void AsyncScrollingCoordinator::updateEventTrackingRegions()
</ins><span class="cx"> {
</span><del>-    if (!m_nonFastScrollableRegionDirty)
</del><ins>+    if (!m_eventTrackingRegionsDirty)
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     if (!m_scrollingStateTree-&gt;rootStateNode())
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    m_scrollingStateTree-&gt;rootStateNode()-&gt;setNonFastScrollableRegion(absoluteNonFastScrollableRegion());
-    m_nonFastScrollableRegionDirty = false;
</del><ins>+    m_scrollingStateTree-&gt;rootStateNode()-&gt;setEventTrackingRegions(absoluteEventTrackingRegions());
+    m_eventTrackingRegionsDirty = false;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void AsyncScrollingCoordinator::frameViewLayoutUpdated(FrameView&amp; frameView)
</span><span class="lines">@@ -115,8 +115,8 @@
</span><span class="cx">     // frame view whose layout was updated is not the main frame.
</span><span class="cx">     // In the future, we may want to have the ability to set non-fast scrolling regions for more than
</span><span class="cx">     // just the root node. But right now, this concept only applies to the root.
</span><del>-    m_scrollingStateTree-&gt;rootStateNode()-&gt;setNonFastScrollableRegion(absoluteNonFastScrollableRegion());
-    m_nonFastScrollableRegionDirty = false;
</del><ins>+    m_scrollingStateTree-&gt;rootStateNode()-&gt;setEventTrackingRegions(absoluteEventTrackingRegions());
+    m_eventTrackingRegionsDirty = false;
</ins><span class="cx"> 
</span><span class="cx">     if (!coordinatesScrollingForFrameView(frameView))
</span><span class="cx">         return;
</span><span class="lines">@@ -164,12 +164,12 @@
</span><span class="cx">     node-&gt;setScrollableAreaParameters(scrollParameters);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void AsyncScrollingCoordinator::frameViewNonFastScrollableRegionChanged(FrameView&amp;)
</del><ins>+void AsyncScrollingCoordinator::frameViewEventTrackingRegionsChanged(FrameView&amp;)
</ins><span class="cx"> {
</span><span class="cx">     if (!m_scrollingStateTree-&gt;rootStateNode())
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    setNonFastScrollableRegionDirty();
</del><ins>+    setEventTrackingRegionsDirty();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void AsyncScrollingCoordinator::frameViewRootLayerDidChange(FrameView&amp; frameView)
</span><span class="lines">@@ -551,8 +551,8 @@
</span><span class="cx"> String AsyncScrollingCoordinator::scrollingStateTreeAsText() const
</span><span class="cx"> {
</span><span class="cx">     if (m_scrollingStateTree-&gt;rootStateNode()) {
</span><del>-        if (m_nonFastScrollableRegionDirty)
-            m_scrollingStateTree-&gt;rootStateNode()-&gt;setNonFastScrollableRegion(absoluteNonFastScrollableRegion());
</del><ins>+        if (m_eventTrackingRegionsDirty)
+            m_scrollingStateTree-&gt;rootStateNode()-&gt;setEventTrackingRegions(absoluteEventTrackingRegions());
</ins><span class="cx">         return m_scrollingStateTree-&gt;rootStateNode()-&gt;scrollingStateTreeAsText();
</span><span class="cx">     }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorepagescrollingAsyncScrollingCoordinatorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/scrolling/AsyncScrollingCoordinator.h (201957 => 201958)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/scrolling/AsyncScrollingCoordinator.h        2016-06-11 00:48:43 UTC (rev 201957)
+++ trunk/Source/WebCore/page/scrolling/AsyncScrollingCoordinator.h        2016-06-11 01:18:37 UTC (rev 201958)
</span><span class="lines">@@ -80,7 +80,7 @@
</span><span class="cx">     WEBCORE_EXPORT String scrollingStateTreeAsText() const override;
</span><span class="cx">     WEBCORE_EXPORT void willCommitTree() override;
</span><span class="cx"> 
</span><del>-    bool nonFastScrollableRegionDirty() const { return m_nonFastScrollableRegionDirty; }
</del><ins>+    bool eventTrackingRegionsDirty() const { return m_eventTrackingRegionsDirty; }
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     bool isAsyncScrollingCoordinator() const override { return true; }
</span><span class="lines">@@ -90,7 +90,7 @@
</span><span class="cx"> 
</span><span class="cx">     WEBCORE_EXPORT void frameViewLayoutUpdated(FrameView&amp;) override;
</span><span class="cx">     WEBCORE_EXPORT void frameViewRootLayerDidChange(FrameView&amp;) override;
</span><del>-    WEBCORE_EXPORT void frameViewNonFastScrollableRegionChanged(FrameView&amp;) override;
</del><ins>+    WEBCORE_EXPORT void frameViewEventTrackingRegionsChanged(FrameView&amp;) override;
</ins><span class="cx"> 
</span><span class="cx">     WEBCORE_EXPORT bool requestScrollPositionUpdate(FrameView&amp;, const IntPoint&amp;) override;
</span><span class="cx"> 
</span><span class="lines">@@ -121,8 +121,8 @@
</span><span class="cx">     void updateMainFrameScrollLayerPosition();
</span><span class="cx"> 
</span><span class="cx">     void updateScrollPositionAfterAsyncScrollTimerFired();
</span><del>-    void setNonFastScrollableRegionDirty();
-    void updateNonFastScrollableRegion();
</del><ins>+    void setEventTrackingRegionsDirty();
+    void updateEventTrackingRegions();
</ins><span class="cx">     
</span><span class="cx">     FrameView* frameViewForScrollingNode(ScrollingNodeID) const;
</span><span class="cx"> 
</span><span class="lines">@@ -160,7 +160,7 @@
</span><span class="cx">     std::unique_ptr&lt;ScrollingStateTree&gt; m_scrollingStateTree;
</span><span class="cx">     RefPtr&lt;ScrollingTree&gt; m_scrollingTree;
</span><span class="cx"> 
</span><del>-    bool m_nonFastScrollableRegionDirty { false };
</del><ins>+    bool m_eventTrackingRegionsDirty { false };
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCorepagescrollingScrollingCoordinatorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/scrolling/ScrollingCoordinator.cpp (201957 => 201958)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/scrolling/ScrollingCoordinator.cpp        2016-06-11 00:48:43 UTC (rev 201957)
+++ trunk/Source/WebCore/page/scrolling/ScrollingCoordinator.cpp        2016-06-11 01:18:37 UTC (rev 201958)
</span><span class="lines">@@ -96,11 +96,11 @@
</span><span class="cx">     return renderView-&gt;usesCompositing();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-Region ScrollingCoordinator::absoluteNonFastScrollableRegionForFrame(const Frame&amp; frame) const
</del><ins>+EventTrackingRegions ScrollingCoordinator::absoluteEventTrackingRegionsForFrame(const Frame&amp; frame) const
</ins><span class="cx"> {
</span><span class="cx">     RenderView* renderView = frame.contentRenderer();
</span><span class="cx">     if (!renderView || renderView-&gt;documentBeingDestroyed())
</span><del>-        return Region();
</del><ins>+        return EventTrackingRegions();
</ins><span class="cx"> 
</span><span class="cx"> #if ENABLE(IOS_TOUCH_EVENTS)
</span><span class="cx">     // On iOS, we use nonFastScrollableRegion to represent the region covered by elements with touch event handlers.
</span><span class="lines">@@ -108,22 +108,13 @@
</span><span class="cx"> 
</span><span class="cx">     Document* document = frame.document();
</span><span class="cx">     if (!document)
</span><del>-        return Region();
-
-    Vector&lt;IntRect&gt; touchRects;
-    document-&gt;getTouchRects(touchRects);
-    
-    Region touchRegion;
-    for (const auto&amp; rect : touchRects)
-        touchRegion.unite(rect);
-
-    // FIXME: use absoluteRegionForEventTargets().
-    return touchRegion;
</del><ins>+        return EventTrackingRegions();
+    return document-&gt;eventTrackingRegions();
</ins><span class="cx"> #else
</span><span class="cx">     Region nonFastScrollableRegion;
</span><span class="cx">     FrameView* frameView = frame.view();
</span><span class="cx">     if (!frameView)
</span><del>-        return nonFastScrollableRegion;
</del><ins>+        return EventTrackingRegions();
</ins><span class="cx"> 
</span><span class="cx">     // FIXME: should ASSERT(!frameView-&gt;needsLayout()) here, but need to fix DebugPageOverlays
</span><span class="cx">     // to not ask for regions at bad times.
</span><span class="lines">@@ -158,7 +149,7 @@
</span><span class="cx">         if (!subframeView)
</span><span class="cx">             continue;
</span><span class="cx"> 
</span><del>-        Region subframeRegion = absoluteNonFastScrollableRegionForFrame(*subframe);
</del><ins>+        Region subframeRegion = absoluteEventTrackingRegionsForFrame(*subframe).synchronousDispatchRegion;
</ins><span class="cx">         // Map from the frame document to our document.
</span><span class="cx">         IntPoint offset = subframeView-&gt;contentsToContainingViewContents(IntPoint());
</span><span class="cx"> 
</span><span class="lines">@@ -178,13 +169,13 @@
</span><span class="cx">     nonFastScrollableRegion.unite(wheelHandlerRegion.first);
</span><span class="cx"> 
</span><span class="cx">     // FIXME: If this is not the main frame, we could clip the region to the frame's bounds.
</span><del>-    return nonFastScrollableRegion;
</del><ins>+    return EventTrackingRegions { Region(), nonFastScrollableRegion };
</ins><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-Region ScrollingCoordinator::absoluteNonFastScrollableRegion() const
</del><ins>+EventTrackingRegions ScrollingCoordinator::absoluteEventTrackingRegions() const
</ins><span class="cx"> {
</span><del>-    return absoluteNonFastScrollableRegionForFrame(m_page-&gt;mainFrame());
</del><ins>+    return absoluteEventTrackingRegionsForFrame(m_page-&gt;mainFrame());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void ScrollingCoordinator::frameViewHasSlowRepaintObjectsDidChange(FrameView&amp; frameView)
</span></span></pre></div>
<a id="trunkSourceWebCorepagescrollingScrollingCoordinatorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/scrolling/ScrollingCoordinator.h (201957 => 201958)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/scrolling/ScrollingCoordinator.h        2016-06-11 00:48:43 UTC (rev 201957)
+++ trunk/Source/WebCore/page/scrolling/ScrollingCoordinator.h        2016-06-11 01:18:37 UTC (rev 201958)
</span><span class="lines">@@ -26,6 +26,7 @@
</span><span class="cx"> #ifndef ScrollingCoordinator_h
</span><span class="cx"> #define ScrollingCoordinator_h
</span><span class="cx"> 
</span><ins>+#include &quot;EventTrackingRegions.h&quot;
</ins><span class="cx"> #include &quot;IntRect.h&quot;
</span><span class="cx"> #include &quot;LayoutRect.h&quot;
</span><span class="cx"> #include &quot;PlatformWheelEvent.h&quot;
</span><span class="lines">@@ -128,7 +129,7 @@
</span><span class="cx">     void frameViewFixedObjectsDidChange(FrameView&amp;);
</span><span class="cx"> 
</span><span class="cx">     // Called whenever the non-fast scrollable region changes for reasons other than layout.
</span><del>-    virtual void frameViewNonFastScrollableRegionChanged(FrameView&amp;) { }
</del><ins>+    virtual void frameViewEventTrackingRegionsChanged(FrameView&amp;) { }
</ins><span class="cx"> 
</span><span class="cx">     // Should be called whenever the root layer for the given frame view changes.
</span><span class="cx">     virtual void frameViewRootLayerDidChange(FrameView&amp;);
</span><span class="lines">@@ -204,7 +205,7 @@
</span><span class="cx">     static String synchronousScrollingReasonsAsText(SynchronousScrollingReasons);
</span><span class="cx">     String synchronousScrollingReasonsAsText() const;
</span><span class="cx"> 
</span><del>-    Region absoluteNonFastScrollableRegion() const;
</del><ins>+    EventTrackingRegions absoluteEventTrackingRegions() const;
</ins><span class="cx"> 
</span><span class="cx"> protected:
</span><span class="cx">     explicit ScrollingCoordinator(Page*);
</span><span class="lines">@@ -229,7 +230,7 @@
</span><span class="cx">     virtual bool hasVisibleSlowRepaintViewportConstrainedObjects(const FrameView&amp;) const;
</span><span class="cx">     void updateSynchronousScrollingReasons(const FrameView&amp;);
</span><span class="cx"> 
</span><del>-    Region absoluteNonFastScrollableRegionForFrame(const Frame&amp;) const;
</del><ins>+    EventTrackingRegions absoluteEventTrackingRegionsForFrame(const Frame&amp;) const;
</ins><span class="cx">     
</span><span class="cx">     bool m_forceSynchronousScrollLayerPositionUpdates { false };
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebCorepagescrollingScrollingStateFrameScrollingNodecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/scrolling/ScrollingStateFrameScrollingNode.cpp (201957 => 201958)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/scrolling/ScrollingStateFrameScrollingNode.cpp        2016-06-11 00:48:43 UTC (rev 201957)
+++ trunk/Source/WebCore/page/scrolling/ScrollingStateFrameScrollingNode.cpp        2016-06-11 01:18:37 UTC (rev 201958)
</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, 2016 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">@@ -49,7 +49,7 @@
</span><span class="cx">     , m_verticalScrollerImp(stateNode.verticalScrollerImp())
</span><span class="cx">     , m_horizontalScrollerImp(stateNode.horizontalScrollerImp())
</span><span class="cx"> #endif
</span><del>-    , m_nonFastScrollableRegion(stateNode.nonFastScrollableRegion())
</del><ins>+    , m_eventTrackingRegions(stateNode.eventTrackingRegions())
</ins><span class="cx">     , m_requestedScrollPosition(stateNode.requestedScrollPosition())
</span><span class="cx">     , m_frameScaleFactor(stateNode.frameScaleFactor())
</span><span class="cx">     , m_topContentInset(stateNode.topContentInset())
</span><span class="lines">@@ -98,13 +98,13 @@
</span><span class="cx">     setPropertyChanged(FrameScaleFactor);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void ScrollingStateFrameScrollingNode::setNonFastScrollableRegion(const Region&amp; nonFastScrollableRegion)
</del><ins>+void ScrollingStateFrameScrollingNode::setEventTrackingRegions(const EventTrackingRegions&amp; eventTrackingRegions)
</ins><span class="cx"> {
</span><del>-    if (m_nonFastScrollableRegion == nonFastScrollableRegion)
</del><ins>+    if (m_eventTrackingRegions == eventTrackingRegions)
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    m_nonFastScrollableRegion = nonFastScrollableRegion;
-    setPropertyChanged(NonFastScrollableRegion);
</del><ins>+    m_eventTrackingRegions = eventTrackingRegions;
+    setPropertyChanged(EventTrackingRegion);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void ScrollingStateFrameScrollingNode::setSynchronousScrollingReasons(SynchronousScrollingReasons reasons)
</span><span class="lines">@@ -231,13 +231,13 @@
</span><span class="cx">         writeIndent(ts, indent + 1);
</span><span class="cx">         ts &lt;&lt; &quot;(frame scale factor &quot; &lt;&lt; m_frameScaleFactor &lt;&lt; &quot;)\n&quot;;
</span><span class="cx">     }
</span><del>-    
-    if (!m_nonFastScrollableRegion.isEmpty()) {
</del><ins>+
+    if (!m_eventTrackingRegions.asynchronousDispatchRegion.isEmpty()) {
</ins><span class="cx">         ++indent;
</span><span class="cx">         writeIndent(ts, indent);
</span><del>-        ts &lt;&lt; &quot;(non-fast-scrollable region&quot;;
</del><ins>+        ts &lt;&lt; &quot;(asynchronous event dispatch region&quot;;
</ins><span class="cx">         ++indent;
</span><del>-        for (auto rect : m_nonFastScrollableRegion.rects()) {
</del><ins>+        for (auto rect : m_eventTrackingRegions.asynchronousDispatchRegion.rects()) {
</ins><span class="cx">             ts &lt;&lt; &quot;\n&quot;;
</span><span class="cx">             writeIndent(ts, indent);
</span><span class="cx">             ts &lt;&lt; rect;
</span><span class="lines">@@ -245,6 +245,19 @@
</span><span class="cx">         ts &lt;&lt; &quot;)\n&quot;;
</span><span class="cx">         indent -= 2;
</span><span class="cx">     }
</span><ins>+    if (!m_eventTrackingRegions.synchronousDispatchRegion.isEmpty()) {
+        ++indent;
+        writeIndent(ts, indent);
+        ts &lt;&lt; &quot;(synchronous event dispatch region&quot;;
+        ++indent;
+        for (auto rect : m_eventTrackingRegions.synchronousDispatchRegion.rects()) {
+            ts &lt;&lt; &quot;\n&quot;;
+            writeIndent(ts, indent);
+            ts &lt;&lt; rect;
+        }
+        ts &lt;&lt; &quot;)\n&quot;;
+        indent -= 2;
+    }
</ins><span class="cx"> 
</span><span class="cx">     if (m_synchronousScrollingReasons) {
</span><span class="cx">         writeIndent(ts, indent + 1);
</span></span></pre></div>
<a id="trunkSourceWebCorepagescrollingScrollingStateFrameScrollingNodeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/scrolling/ScrollingStateFrameScrollingNode.h (201957 => 201958)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/scrolling/ScrollingStateFrameScrollingNode.h        2016-06-11 00:48:43 UTC (rev 201957)
+++ trunk/Source/WebCore/page/scrolling/ScrollingStateFrameScrollingNode.h        2016-06-11 01:18:37 UTC (rev 201958)
</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, 2016 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">@@ -28,7 +28,7 @@
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(ASYNC_SCROLLING) || USE(COORDINATED_GRAPHICS)
</span><span class="cx"> 
</span><del>-#include &quot;Region.h&quot;
</del><ins>+#include &quot;EventTrackingRegions.h&quot;
</ins><span class="cx"> #include &quot;ScrollTypes.h&quot;
</span><span class="cx"> #include &quot;ScrollbarThemeComposite.h&quot;
</span><span class="cx"> #include &quot;ScrollingCoordinator.h&quot;
</span><span class="lines">@@ -48,7 +48,7 @@
</span><span class="cx"> 
</span><span class="cx">     enum ChangedProperty {
</span><span class="cx">         FrameScaleFactor = NumScrollingStateNodeBits,
</span><del>-        NonFastScrollableRegion,
</del><ins>+        EventTrackingRegion,
</ins><span class="cx">         ReasonsForSynchronousScrolling,
</span><span class="cx">         ScrolledContentsLayer,
</span><span class="cx">         CounterScrollingLayer,
</span><span class="lines">@@ -67,8 +67,8 @@
</span><span class="cx">     float frameScaleFactor() const { return m_frameScaleFactor; }
</span><span class="cx">     WEBCORE_EXPORT void setFrameScaleFactor(float);
</span><span class="cx"> 
</span><del>-    const Region&amp; nonFastScrollableRegion() const { return m_nonFastScrollableRegion; }
-    WEBCORE_EXPORT void setNonFastScrollableRegion(const Region&amp;);
</del><ins>+    const EventTrackingRegions&amp; eventTrackingRegions() const { return m_eventTrackingRegions; }
+    WEBCORE_EXPORT void setEventTrackingRegions(const EventTrackingRegions&amp;);
</ins><span class="cx"> 
</span><span class="cx">     SynchronousScrollingReasons synchronousScrollingReasons() const { return m_synchronousScrollingReasons; }
</span><span class="cx">     WEBCORE_EXPORT void setSynchronousScrollingReasons(SynchronousScrollingReasons);
</span><span class="lines">@@ -137,7 +137,7 @@
</span><span class="cx">     RetainPtr&lt;NSScrollerImp&gt; m_horizontalScrollerImp;
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-    Region m_nonFastScrollableRegion;
</del><ins>+    EventTrackingRegions m_eventTrackingRegions;
</ins><span class="cx">     FloatPoint m_requestedScrollPosition;
</span><span class="cx">     float m_frameScaleFactor { 1 };
</span><span class="cx">     float m_topContentInset { 0 };
</span></span></pre></div>
<a id="trunkSourceWebCorepagescrollingScrollingTreecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/scrolling/ScrollingTree.cpp (201957 => 201958)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/scrolling/ScrollingTree.cpp        2016-06-11 00:48:43 UTC (rev 201957)
+++ trunk/Source/WebCore/page/scrolling/ScrollingTree.cpp        2016-06-11 01:18:37 UTC (rev 201958)
</span><span class="lines">@@ -61,14 +61,15 @@
</span><span class="cx">     if (shouldSetLatch)
</span><span class="cx">         m_latchedNode = 0;
</span><span class="cx">     
</span><del>-    if (!m_nonFastScrollableRegion.isEmpty() &amp;&amp; m_rootNode) {
</del><ins>+    if (!m_eventTrackingRegions.isEmpty() &amp;&amp; m_rootNode) {
</ins><span class="cx">         ScrollingTreeFrameScrollingNode&amp; frameScrollingNode = downcast&lt;ScrollingTreeFrameScrollingNode&gt;(*m_rootNode);
</span><span class="cx">         FloatPoint position = wheelEvent.position();
</span><span class="cx">         position.move(frameScrollingNode.viewToContentsOffset(m_mainFrameScrollPosition));
</span><span class="cx"> 
</span><del>-        LOG_WITH_STREAM(Scrolling, stream &lt;&lt; &quot;ScrollingTree::shouldHandleWheelEventSynchronously: wheelEvent at &quot; &lt;&lt; wheelEvent.position() &lt;&lt; &quot; mapped to content point &quot; &lt;&lt; position &lt;&lt; &quot;, in non-fast region &quot; &lt;&lt; m_nonFastScrollableRegion.contains(roundedIntPoint(position)));
</del><ins>+        bool isSynchronousDispatchRegion = m_eventTrackingRegions.trackingTypeForPoint(roundedIntPoint(position)) == TrackingType::Synchronous;
+        LOG_WITH_STREAM(Scrolling, stream &lt;&lt; &quot;ScrollingTree::shouldHandleWheelEventSynchronously: wheelEvent at &quot; &lt;&lt; wheelEvent.position() &lt;&lt; &quot; mapped to content point &quot; &lt;&lt; position &lt;&lt; &quot;, in non-fast region &quot; &lt;&lt; isSynchronousDispatchRegion);
</ins><span class="cx"> 
</span><del>-        if (m_nonFastScrollableRegion.contains(roundedIntPoint(position)))
</del><ins>+        if (isSynchronousDispatchRegion)
</ins><span class="cx">             return true;
</span><span class="cx">     }
</span><span class="cx">     return false;
</span><span class="lines">@@ -117,14 +118,14 @@
</span><span class="cx">     ScrollingStateScrollingNode* rootNode = scrollingStateTree-&gt;rootStateNode();
</span><span class="cx">     if (rootNode
</span><span class="cx">         &amp;&amp; (rootStateNodeChanged
</span><del>-            || rootNode-&gt;hasChangedProperty(ScrollingStateFrameScrollingNode::NonFastScrollableRegion)
</del><ins>+            || rootNode-&gt;hasChangedProperty(ScrollingStateFrameScrollingNode::EventTrackingRegion)
</ins><span class="cx">             || rootNode-&gt;hasChangedProperty(ScrollingStateNode::ScrollLayer))) {
</span><span class="cx">         LockHolder lock(m_mutex);
</span><span class="cx"> 
</span><span class="cx">         if (rootStateNodeChanged || rootNode-&gt;hasChangedProperty(ScrollingStateNode::ScrollLayer))
</span><span class="cx">             m_mainFrameScrollPosition = FloatPoint();
</span><del>-        if (rootStateNodeChanged || rootNode-&gt;hasChangedProperty(ScrollingStateFrameScrollingNode::NonFastScrollableRegion))
-            m_nonFastScrollableRegion = scrollingStateTree-&gt;rootStateNode()-&gt;nonFastScrollableRegion();
</del><ins>+        if (rootStateNodeChanged || rootNode-&gt;hasChangedProperty(ScrollingStateFrameScrollingNode::EventTrackingRegion))
+            m_eventTrackingRegions = scrollingStateTree-&gt;rootStateNode()-&gt;eventTrackingRegions();
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     bool scrollRequestIsProgammatic = rootNode ? rootNode-&gt;requestedScrollPositionRepresentsProgrammaticScroll() : false;
</span><span class="lines">@@ -232,11 +233,11 @@
</span><span class="cx">     m_mainFrameScrollPosition = position;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool ScrollingTree::isPointInNonFastScrollableRegion(IntPoint p)
</del><ins>+TrackingType ScrollingTree::eventTrackingTypeForPoint(IntPoint p)
</ins><span class="cx"> {
</span><span class="cx">     LockHolder lock(m_mutex);
</span><span class="cx">     
</span><del>-    return m_nonFastScrollableRegion.contains(p);
</del><ins>+    return m_eventTrackingRegions.trackingTypeForPoint(p);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool ScrollingTree::isRubberBandInProgress()
</span></span></pre></div>
<a id="trunkSourceWebCorepagescrollingScrollingTreeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/scrolling/ScrollingTree.h (201957 => 201958)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/scrolling/ScrollingTree.h        2016-06-11 00:48:43 UTC (rev 201957)
+++ trunk/Source/WebCore/page/scrolling/ScrollingTree.h        2016-06-11 01:18:37 UTC (rev 201958)
</span><span class="lines">@@ -101,7 +101,7 @@
</span><span class="cx">     virtual void scrollingTreeNodeDidEndScroll() { }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-    WEBCORE_EXPORT bool isPointInNonFastScrollableRegion(IntPoint);
</del><ins>+    WEBCORE_EXPORT TrackingType eventTrackingTypeForPoint(IntPoint);
</ins><span class="cx">     
</span><span class="cx"> #if PLATFORM(MAC)
</span><span class="cx">     virtual void handleWheelEventPhase(PlatformWheelEventPhase) = 0;
</span><span class="lines">@@ -162,7 +162,7 @@
</span><span class="cx">     ScrollingTreeNodeMap m_nodeMap;
</span><span class="cx"> 
</span><span class="cx">     Lock m_mutex;
</span><del>-    Region m_nonFastScrollableRegion;
</del><ins>+    EventTrackingRegions m_eventTrackingRegions;
</ins><span class="cx">     FloatPoint m_mainFrameScrollPosition;
</span><span class="cx"> 
</span><span class="cx">     Lock m_swipeStateMutex;
</span></span></pre></div>
<a id="trunkSourceWebCorepagescrollingmacScrollingCoordinatorMacmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/scrolling/mac/ScrollingCoordinatorMac.mm (201957 => 201958)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/scrolling/mac/ScrollingCoordinatorMac.mm        2016-06-11 00:48:43 UTC (rev 201957)
+++ trunk/Source/WebCore/page/scrolling/mac/ScrollingCoordinatorMac.mm        2016-06-11 01:18:37 UTC (rev 201958)
</span><span class="lines">@@ -99,7 +99,7 @@
</span><span class="cx"> 
</span><span class="cx"> void ScrollingCoordinatorMac::scheduleTreeStateCommit()
</span><span class="cx"> {
</span><del>-    ASSERT(scrollingStateTree()-&gt;hasChangedProperties() || nonFastScrollableRegionDirty());
</del><ins>+    ASSERT(scrollingStateTree()-&gt;hasChangedProperties() || eventTrackingRegionsDirty());
</ins><span class="cx"> 
</span><span class="cx">     if (m_scrollingStateTreeCommitterTimer.isActive())
</span><span class="cx">         return;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformEventTrackingRegionsh"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/platform/EventTrackingRegions.h (0 => 201958)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/EventTrackingRegions.h                                (rev 0)
+++ trunk/Source/WebCore/platform/EventTrackingRegions.h        2016-06-11 01:18:37 UTC (rev 201958)
</span><span class="lines">@@ -0,0 +1,70 @@
</span><ins>+/*
+ * Copyright (C) 2016 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#include &quot;Region.h&quot;
+
+namespace WebCore {
+
+enum class TrackingType : uint8_t {
+    NotTracking = 0,
+    Asynchronous = 1,
+    Synchronous = 2
+};
+
+struct EventTrackingRegions {
+    // Region for which events can be dispatched without blocking scrolling.
+    Region asynchronousDispatchRegion;
+
+    // Region for which events must be sent before performing the default behavior.
+    Region synchronousDispatchRegion;
+
+    bool isEmpty() const;
+
+    TrackingType trackingTypeForPoint(const IntPoint&amp;);
+};
+
+inline bool EventTrackingRegions::isEmpty() const
+{
+    return asynchronousDispatchRegion.isEmpty() &amp;&amp; synchronousDispatchRegion.isEmpty();
+}
+
+inline TrackingType EventTrackingRegions::trackingTypeForPoint(const IntPoint&amp; point)
+{
+    if (synchronousDispatchRegion.contains(point))
+        return TrackingType::Synchronous;
+    if (asynchronousDispatchRegion.contains(point))
+        return TrackingType::Asynchronous;
+    return TrackingType::NotTracking;
+}
+
+inline bool operator==(const EventTrackingRegions&amp; a, const EventTrackingRegions&amp; b)
+{
+    return a.asynchronousDispatchRegion == b.asynchronousDispatchRegion
+        &amp;&amp; a.synchronousDispatchRegion == b.synchronousDispatchRegion;
+}
+
+} // namespace WebCore
</ins></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (201957 => 201958)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2016-06-11 00:48:43 UTC (rev 201957)
+++ trunk/Source/WebKit2/ChangeLog        2016-06-11 01:18:37 UTC (rev 201958)
</span><span class="lines">@@ -1,3 +1,46 @@
</span><ins>+2016-06-10  Benjamin Poulain  &lt;bpoulain@apple.com&gt;
+
+        Add support for passive event listeners on touch events
+        https://bugs.webkit.org/show_bug.cgi?id=158601
+
+        Reviewed by Simon Fraser.
+
+        * Shared/Scrolling/RemoteScrollingCoordinatorTransaction.cpp:
+        (ArgumentCoder&lt;ScrollingStateFrameScrollingNode&gt;::encode):
+        (ArgumentCoder&lt;ScrollingStateFrameScrollingNode&gt;::decode):
+        (WebKit::dump):
+        * Shared/WebCoreArgumentCoders.cpp:
+        (IPC::ArgumentCoder&lt;EventTrackingRegions&gt;::encode):
+        (IPC::ArgumentCoder&lt;EventTrackingRegions&gt;::decode):
+        * Shared/WebCoreArgumentCoders.h:
+        * UIProcess/Scrolling/RemoteScrollingCoordinatorProxy.cpp:
+        (WebKit::RemoteScrollingCoordinatorProxy::eventTrackingTypeForPoint):
+        (WebKit::RemoteScrollingCoordinatorProxy::isPointInNonFastScrollableRegion): Deleted.
+        * UIProcess/Scrolling/RemoteScrollingCoordinatorProxy.h:
+        * UIProcess/WebPageProxy.cpp:
+        (WebKit::WebPageProxy::touchEventTrackingType):
+        The type is the most restrictive type of all the touch points.
+        If any touch point needs synchronous tracking, everything has to be synchronous.
+
+        (WebKit::WebPageProxy::handleTouchEventSynchronously):
+        This is a very unfortunate design.
+
+        The upper layer dealing with UIKit knows about gesture and when something
+        can be dispatched asynchrnously because a gesture has started.
+        This layer knows about tracking and can use that extra inforamtion
+        to dispatch an event asynchrnously anyway.
+
+        In the future, we should refactor this to let WebPageProxy
+        always decide of the dispatch type. I am just concerned changing
+        the upper layer while we are stabilizing WebKit.
+
+        (WebKit::WebPageProxy::handleTouchEventAsynchronously):
+        (WebKit::WebPageProxy::handleTouchEvent):
+        (WebKit::WebPageProxy::resetState):
+        (WebKit::WebPageProxy::WebPageProxy): Deleted.
+        (WebKit::WebPageProxy::shouldStartTrackingTouchEvents): Deleted.
+        * UIProcess/WebPageProxy.h:
+
</ins><span class="cx"> 2016-06-10  Beth Dakin  &lt;bdakin@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Add requestExitFullScreen to WKFullScreenWindowController
</span></span></pre></div>
<a id="trunkSourceWebKit2SharedScrollingRemoteScrollingCoordinatorTransactioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Shared/Scrolling/RemoteScrollingCoordinatorTransaction.cpp (201957 => 201958)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Shared/Scrolling/RemoteScrollingCoordinatorTransaction.cpp        2016-06-11 00:48:43 UTC (rev 201957)
+++ trunk/Source/WebKit2/Shared/Scrolling/RemoteScrollingCoordinatorTransaction.cpp        2016-06-11 01:18:37 UTC (rev 201958)
</span><span class="lines">@@ -144,7 +144,7 @@
</span><span class="cx">     encoder &lt;&lt; static_cast&lt;const ScrollingStateScrollingNode&amp;&gt;(node);
</span><span class="cx">     
</span><span class="cx">     SCROLLING_NODE_ENCODE(ScrollingStateFrameScrollingNode::FrameScaleFactor, frameScaleFactor)
</span><del>-    SCROLLING_NODE_ENCODE(ScrollingStateFrameScrollingNode::NonFastScrollableRegion, nonFastScrollableRegion)
</del><ins>+    SCROLLING_NODE_ENCODE(ScrollingStateFrameScrollingNode::EventTrackingRegion, eventTrackingRegions)
</ins><span class="cx">     SCROLLING_NODE_ENCODE(ScrollingStateFrameScrollingNode::ReasonsForSynchronousScrolling, synchronousScrollingReasons)
</span><span class="cx">     SCROLLING_NODE_ENCODE_ENUM(ScrollingStateFrameScrollingNode::BehaviorForFixedElements, scrollBehaviorForFixedElements)
</span><span class="cx">     SCROLLING_NODE_ENCODE(ScrollingStateFrameScrollingNode::HeaderHeight, headerHeight)
</span><span class="lines">@@ -228,7 +228,7 @@
</span><span class="cx">         return false;
</span><span class="cx"> 
</span><span class="cx">     SCROLLING_NODE_DECODE(ScrollingStateFrameScrollingNode::FrameScaleFactor, float, setFrameScaleFactor);
</span><del>-    SCROLLING_NODE_DECODE(ScrollingStateFrameScrollingNode::NonFastScrollableRegion, Region, setNonFastScrollableRegion);
</del><ins>+    SCROLLING_NODE_DECODE(ScrollingStateFrameScrollingNode::EventTrackingRegion, EventTrackingRegions, setEventTrackingRegions);
</ins><span class="cx">     SCROLLING_NODE_DECODE(ScrollingStateFrameScrollingNode::ReasonsForSynchronousScrolling, SynchronousScrollingReasons, setSynchronousScrollingReasons);
</span><span class="cx">     SCROLLING_NODE_DECODE_ENUM(ScrollingStateFrameScrollingNode::BehaviorForFixedElements, ScrollBehaviorForFixedElements, setScrollBehaviorForFixedElements);
</span><span class="cx"> 
</span><span class="lines">@@ -484,14 +484,25 @@
</span><span class="cx">     if (!changedPropertiesOnly || node.hasChangedProperty(ScrollingStateFrameScrollingNode::FrameScaleFactor))
</span><span class="cx">         ts.dumpProperty(&quot;frame-scale-factor&quot;, node.frameScaleFactor());
</span><span class="cx"> 
</span><del>-    if (!changedPropertiesOnly || node.hasChangedProperty(ScrollingStateFrameScrollingNode::NonFastScrollableRegion)) {
-        TextStream::GroupScope group(ts);
-        ts &lt;&lt; &quot;non-fast-scrollable-region&quot;;
-        for (auto rect : node.nonFastScrollableRegion().rects()) {
-            ts &lt;&lt; &quot;\n&quot;;
-            ts.writeIndent();
-            ts &lt;&lt; rect;
</del><ins>+    if (!changedPropertiesOnly || node.hasChangedProperty(ScrollingStateFrameScrollingNode::EventTrackingRegion)) {
+        {
+            TextStream::GroupScope group(ts);
+            ts &lt;&lt; &quot;asynchronous-event-tracking-region&quot;;
+            for (auto rect : node.eventTrackingRegions().asynchronousDispatchRegion.rects()) {
+                ts &lt;&lt; &quot;\n&quot;;
+                ts.writeIndent();
+                ts &lt;&lt; rect;
+            }
</ins><span class="cx">         }
</span><ins>+        {
+            TextStream::GroupScope group(ts);
+            ts &lt;&lt; &quot;synchronous-event-tracking-region&quot;;
+            for (auto rect : node.eventTrackingRegions().synchronousDispatchRegion.rects()) {
+                ts &lt;&lt; &quot;\n&quot;;
+                ts.writeIndent();
+                ts &lt;&lt; rect;
+            }
+        }
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // FIXME: dump synchronousScrollingReasons
</span></span></pre></div>
<a id="trunkSourceWebKit2SharedWebCoreArgumentCoderscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Shared/WebCoreArgumentCoders.cpp (201957 => 201958)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Shared/WebCoreArgumentCoders.cpp        2016-06-11 00:48:43 UTC (rev 201957)
+++ trunk/Source/WebKit2/Shared/WebCoreArgumentCoders.cpp        2016-06-11 01:18:37 UTC (rev 201958)
</span><span class="lines">@@ -38,6 +38,7 @@
</span><span class="cx"> #include &lt;WebCore/DictationAlternative.h&gt;
</span><span class="cx"> #include &lt;WebCore/DictionaryPopupInfo.h&gt;
</span><span class="cx"> #include &lt;WebCore/Editor.h&gt;
</span><ins>+#include &lt;WebCore/EventTrackingRegions.h&gt;
</ins><span class="cx"> #include &lt;WebCore/FileChooser.h&gt;
</span><span class="cx"> #include &lt;WebCore/FilterOperation.h&gt;
</span><span class="cx"> #include &lt;WebCore/FilterOperations.h&gt;
</span><span class="lines">@@ -107,6 +108,25 @@
</span><span class="cx">     return SimpleArgumentCoder&lt;AffineTransform&gt;::decode(decoder, affineTransform);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void ArgumentCoder&lt;EventTrackingRegions&gt;::encode(ArgumentEncoder&amp; encoder, const EventTrackingRegions&amp; eventTrackingRegions)
+{
+    encoder &lt;&lt; eventTrackingRegions.asynchronousDispatchRegion;
+    encoder &lt;&lt; eventTrackingRegions.synchronousDispatchRegion;
+}
+
+bool ArgumentCoder&lt;EventTrackingRegions&gt;::decode(ArgumentDecoder&amp; decoder, EventTrackingRegions&amp; eventTrackingRegions)
+{
+    Region asynchronousDispatchRegion;
+    if (!decoder.decode(asynchronousDispatchRegion))
+        return false;
+    Region synchronousDispatchRegion;
+    if (!decoder.decode(synchronousDispatchRegion))
+        return false;
+    eventTrackingRegions.asynchronousDispatchRegion = WTFMove(asynchronousDispatchRegion);
+    eventTrackingRegions.synchronousDispatchRegion = WTFMove(synchronousDispatchRegion);
+    return true;
+}
+
</ins><span class="cx"> void ArgumentCoder&lt;TransformationMatrix&gt;::encode(ArgumentEncoder&amp; encoder, const TransformationMatrix&amp; transformationMatrix)
</span><span class="cx"> {
</span><span class="cx">     encoder &lt;&lt; transformationMatrix.m11();
</span></span></pre></div>
<a id="trunkSourceWebKit2SharedWebCoreArgumentCodersh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Shared/WebCoreArgumentCoders.h (201957 => 201958)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Shared/WebCoreArgumentCoders.h        2016-06-11 00:48:43 UTC (rev 201957)
+++ trunk/Source/WebKit2/Shared/WebCoreArgumentCoders.h        2016-06-11 01:18:37 UTC (rev 201958)
</span><span class="lines">@@ -72,6 +72,7 @@
</span><span class="cx"> struct Cookie;
</span><span class="cx"> struct DictationAlternative;
</span><span class="cx"> struct DictionaryPopupInfo;
</span><ins>+struct EventTrackingRegions;
</ins><span class="cx"> struct ExceptionDetails;
</span><span class="cx"> struct FileChooserSettings;
</span><span class="cx"> struct Length;
</span><span class="lines">@@ -132,6 +133,11 @@
</span><span class="cx">     static bool decode(ArgumentDecoder&amp;, WebCore::AffineTransform&amp;);
</span><span class="cx"> };
</span><span class="cx"> 
</span><ins>+template&lt;&gt; struct ArgumentCoder&lt;WebCore::EventTrackingRegions&gt; {
+    static void encode(ArgumentEncoder&amp;, const WebCore::EventTrackingRegions&amp;);
+    static bool decode(ArgumentDecoder&amp;, WebCore::EventTrackingRegions&amp;);
+};
+
</ins><span class="cx"> template&lt;&gt; struct ArgumentCoder&lt;WebCore::TransformationMatrix&gt; {
</span><span class="cx">     static void encode(ArgumentEncoder&amp;, const WebCore::TransformationMatrix&amp;);
</span><span class="cx">     static bool decode(ArgumentDecoder&amp;, WebCore::TransformationMatrix&amp;);
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessScrollingRemoteScrollingCoordinatorProxycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/Scrolling/RemoteScrollingCoordinatorProxy.cpp (201957 => 201958)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/Scrolling/RemoteScrollingCoordinatorProxy.cpp        2016-06-11 00:48:43 UTC (rev 201957)
+++ trunk/Source/WebKit2/UIProcess/Scrolling/RemoteScrollingCoordinatorProxy.cpp        2016-06-11 01:18:37 UTC (rev 201958)
</span><span class="lines">@@ -149,9 +149,9 @@
</span><span class="cx">     return result == ScrollingTree::DidHandleEvent; // FIXME: handle other values.
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool RemoteScrollingCoordinatorProxy::isPointInNonFastScrollableRegion(const IntPoint&amp; p) const
</del><ins>+TrackingType RemoteScrollingCoordinatorProxy::eventTrackingTypeForPoint(IntPoint p) const
</ins><span class="cx"> {
</span><del>-    return m_scrollingTree-&gt;isPointInNonFastScrollableRegion(p);
</del><ins>+    return m_scrollingTree-&gt;eventTrackingTypeForPoint(p);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void RemoteScrollingCoordinatorProxy::viewportChangedViaDelegatedScrolling(ScrollingNodeID nodeID, const FloatRect&amp; fixedPositionRect, double scale)
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessScrollingRemoteScrollingCoordinatorProxyh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/Scrolling/RemoteScrollingCoordinatorProxy.h (201957 => 201958)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/Scrolling/RemoteScrollingCoordinatorProxy.h        2016-06-11 00:48:43 UTC (rev 201957)
+++ trunk/Source/WebKit2/UIProcess/Scrolling/RemoteScrollingCoordinatorProxy.h        2016-06-11 01:18:37 UTC (rev 201958)
</span><span class="lines">@@ -56,7 +56,7 @@
</span><span class="cx">     void scrollingTreeNodeDidScroll(WebCore::ScrollingNodeID, const WebCore::FloatPoint&amp; newScrollPosition, WebCore::SetOrSyncScrollingLayerPosition);
</span><span class="cx">     void scrollingTreeNodeRequestsScroll(WebCore::ScrollingNodeID, const WebCore::FloatPoint&amp; scrollPosition, bool representsProgrammaticScroll);
</span><span class="cx"> 
</span><del>-    bool isPointInNonFastScrollableRegion(const WebCore::IntPoint&amp;) const;
</del><ins>+    WebCore::TrackingType eventTrackingTypeForPoint(WebCore::IntPoint) const;
</ins><span class="cx"> 
</span><span class="cx">     // Called externally when native views move around.
</span><span class="cx">     void viewportChangedViaDelegatedScrolling(WebCore::ScrollingNodeID, const WebCore::FloatRect&amp; fixedPositionRect, double scale);
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessWebPageProxycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp (201957 => 201958)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp        2016-06-11 00:48:43 UTC (rev 201957)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp        2016-06-11 01:18:37 UTC (rev 201958)
</span><span class="lines">@@ -383,9 +383,6 @@
</span><span class="cx">     , m_syncNavigationActionPolicyAction(PolicyUse)
</span><span class="cx">     , m_syncNavigationActionPolicyDownloadID(0)
</span><span class="cx">     , m_processingMouseMoveEvent(false)
</span><del>-#if ENABLE(TOUCH_EVENTS)
-    , m_isTrackingTouchEvents(false)
-#endif
</del><span class="cx">     , m_pageID(pageID)
</span><span class="cx">     , m_sessionID(m_configuration-&gt;sessionID())
</span><span class="cx">     , m_isPageSuspended(false)
</span><span class="lines">@@ -1939,19 +1936,24 @@
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(TOUCH_EVENTS)
</span><span class="cx"> 
</span><del>-bool WebPageProxy::shouldStartTrackingTouchEvents(const WebTouchEvent&amp; touchStartEvent) const
</del><ins>+TrackingType WebPageProxy::touchEventTrackingType(const WebTouchEvent&amp; touchStartEvent) const
</ins><span class="cx"> {
</span><span class="cx"> #if ENABLE(ASYNC_SCROLLING)
</span><ins>+    TrackingType trackingType = TrackingType::NotTracking;
</ins><span class="cx">     for (auto&amp; touchPoint : touchStartEvent.touchPoints()) {
</span><del>-        if (m_scrollingCoordinatorProxy-&gt;isPointInNonFastScrollableRegion(touchPoint.location()))
-            return true;
</del><ins>+        TrackingType touchPointTrackingType = m_scrollingCoordinatorProxy-&gt;eventTrackingTypeForPoint(touchPoint.location());
+        if (touchPointTrackingType == TrackingType::Synchronous)
+            return TrackingType::Synchronous;
+
+        if (touchPointTrackingType == TrackingType::Asynchronous)
+            trackingType = touchPointTrackingType;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return false;
</del><ins>+    return trackingType;
</ins><span class="cx"> #else
</span><span class="cx">     UNUSED_PARAM(touchStartEvent);
</span><span class="cx"> #endif // ENABLE(ASYNC_SCROLLING)
</span><del>-    return true;
</del><ins>+    return TrackingType::Synchronous;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #endif
</span><span class="lines">@@ -1971,19 +1973,32 @@
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(IOS_TOUCH_EVENTS)
</span><del>-void WebPageProxy::handleTouchEventSynchronously(const NativeWebTouchEvent&amp; event)
</del><ins>+void WebPageProxy::handleTouchEventSynchronously(NativeWebTouchEvent&amp; event)
</ins><span class="cx"> {
</span><span class="cx">     if (!isValid())
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     if (event.type() == WebEvent::TouchStart) {
</span><del>-        m_isTrackingTouchEvents = shouldStartTrackingTouchEvents(event);
</del><ins>+        m_touchEventsTrackingType = touchEventTrackingType(event);
</ins><span class="cx">         m_layerTreeTransactionIdAtLastTouchStart = downcast&lt;RemoteLayerTreeDrawingAreaProxy&gt;(*drawingArea()).lastCommittedLayerTreeTransactionID();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (!m_isTrackingTouchEvents)
</del><ins>+    if (m_touchEventsTrackingType == TrackingType::NotTracking)
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><ins>+    if (m_touchEventsTrackingType == TrackingType::Asynchronous) {
+        // We can end up here if a native gesture has not started but the event handlers are passive.
+        //
+        // The client of WebPageProxy asks the event to be sent synchronously since the touch event
+        // can prevent a native gesture.
+        // But, here we know that all events handlers that can handle this events are passive.
+        // We can use asynchronous dispatch and pretend to the client that the page does nothing with the events.
+        event.setCanPreventNativeGestures(false);
+        handleTouchEventAsynchronously(event);
+        didReceiveEvent(event.type(), false);
+        return;
+    }
+
</ins><span class="cx">     m_process-&gt;responsivenessTimer().start();
</span><span class="cx">     bool handled = false;
</span><span class="cx">     m_process-&gt;sendSync(Messages::WebPage::TouchEventSync(event), Messages::WebPage::TouchEventSync::Reply(handled), m_pageID);
</span><span class="lines">@@ -1992,7 +2007,7 @@
</span><span class="cx">     m_process-&gt;responsivenessTimer().stop();
</span><span class="cx"> 
</span><span class="cx">     if (event.allTouchPointsAreReleased())
</span><del>-        m_isTrackingTouchEvents = false;
</del><ins>+        m_touchEventsTrackingType = TrackingType::NotTracking;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebPageProxy::handleTouchEventAsynchronously(const NativeWebTouchEvent&amp; event)
</span><span class="lines">@@ -2000,13 +2015,13 @@
</span><span class="cx">     if (!isValid())
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    if (!m_isTrackingTouchEvents)
</del><ins>+    if (m_touchEventsTrackingType == TrackingType::NotTracking)
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     m_process-&gt;send(Messages::EventDispatcher::TouchEvent(m_pageID, event), 0);
</span><span class="cx"> 
</span><span class="cx">     if (event.allTouchPointsAreReleased())
</span><del>-        m_isTrackingTouchEvents = false;
</del><ins>+        m_touchEventsTrackingType = TrackingType::NotTracking;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #elif ENABLE(TOUCH_EVENTS)
</span><span class="lines">@@ -2016,9 +2031,9 @@
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     if (event.type() == WebEvent::TouchStart)
</span><del>-        m_isTrackingTouchEvents = shouldStartTrackingTouchEvents(event);
</del><ins>+        m_touchEventsTrackingType = touchEventTrackingType(event);
</ins><span class="cx"> 
</span><del>-    if (!m_isTrackingTouchEvents)
</del><ins>+    if (m_touchEventsTrackingType == TrackingType::NotTracking)
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     // If the page is suspended, which should be the case during panning, pinching
</span><span class="lines">@@ -2041,7 +2056,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (event.allTouchPointsAreReleased())
</span><del>-        m_isTrackingTouchEvents = false;
</del><ins>+        m_touchEventsTrackingType = TrackingType::NotTracking;
</ins><span class="cx"> }
</span><span class="cx"> #endif // ENABLE(TOUCH_EVENTS)
</span><span class="cx"> 
</span><span class="lines">@@ -5060,7 +5075,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(TOUCH_EVENTS)
</span><del>-    m_isTrackingTouchEvents = false;
</del><ins>+    m_touchEventsTrackingType = TrackingType::NotTracking;
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(INPUT_TYPE_COLOR)
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessWebPageProxyh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.h (201957 => 201958)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/WebPageProxy.h        2016-06-11 00:48:43 UTC (rev 201957)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.h        2016-06-11 01:18:37 UTC (rev 201958)
</span><span class="lines">@@ -63,6 +63,7 @@
</span><span class="cx"> #include &quot;WebProcessLifetimeTracker.h&quot;
</span><span class="cx"> #include &lt;WebCore/Color.h&gt;
</span><span class="cx"> #include &lt;WebCore/DragActions.h&gt;
</span><ins>+#include &lt;WebCore/EventTrackingRegions.h&gt;
</ins><span class="cx"> #include &lt;WebCore/FrameLoaderTypes.h&gt;
</span><span class="cx"> #include &lt;WebCore/HitTestResult.h&gt;
</span><span class="cx"> #include &lt;WebCore/MediaProducer.h&gt;
</span><span class="lines">@@ -615,7 +616,7 @@
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(IOS_TOUCH_EVENTS)
</span><del>-    void handleTouchEventSynchronously(const NativeWebTouchEvent&amp;);
</del><ins>+    void handleTouchEventSynchronously(NativeWebTouchEvent&amp;);
</ins><span class="cx">     void handleTouchEventAsynchronously(const NativeWebTouchEvent&amp;);
</span><span class="cx"> 
</span><span class="cx"> #elif ENABLE(TOUCH_EVENTS)
</span><span class="lines">@@ -1463,7 +1464,7 @@
</span><span class="cx">     void sendWheelEvent(const WebWheelEvent&amp;);
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(TOUCH_EVENTS)
</span><del>-    bool shouldStartTrackingTouchEvents(const WebTouchEvent&amp;) const;
</del><ins>+    WebCore::TrackingType touchEventTrackingType(const WebTouchEvent&amp;) const;
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(NETSCAPE_PLUGIN_API)
</span><span class="lines">@@ -1690,7 +1691,7 @@
</span><span class="cx">     std::unique_ptr&lt;NativeWebMouseEvent&gt; m_currentlyProcessedMouseDownEvent;
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(TOUCH_EVENTS)
</span><del>-    bool m_isTrackingTouchEvents;
</del><ins>+    WebCore::TrackingType m_touchEventsTrackingType { WebCore::TrackingType::NotTracking };
</ins><span class="cx"> #endif
</span><span class="cx"> #if ENABLE(TOUCH_EVENTS) &amp;&amp; !ENABLE(IOS_TOUCH_EVENTS)
</span><span class="cx">     Deque&lt;QueuedTouchEvents&gt; m_touchEventQueue;
</span></span></pre>
</div>
</div>

</body>
</html>