<!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>[178980] trunk/Source/WebKit2</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/178980">178980</a></dd>
<dt>Author</dt> <dd>benjamin@webkit.org</dd>
<dt>Date</dt> <dd>2015-01-22 20:17:11 -0800 (Thu, 22 Jan 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>[iOS][WK2] Ignore synthetic click initiated on a previous page
https://bugs.webkit.org/show_bug.cgi?id=139556
rdar://problem/18586008

Patch by Benjamin Poulain &lt;bpoulain@apple.com&gt; on 2015-01-22
Reviewed by David Kilzer.

Under the right accumulation of bad luck, a synthetic click could be generated
on a page that never asked for it.

What happened was:
1) Page Foo listen to touch event.
2) In response to touch events, Foo decides to navigate to page Bar
   *but* it does not cancel the native gesture recognizers with preventDefault().
3) Page Bar loads.
4) The native gesture recognizer ask us to click, we forward that to the WebProcess
   and generate a synthetic mouse event.
-&gt; Bar receives a click.
If you are unlucky enough, it looks like a single tap does a double click.

There are two ways this patch avoids the problem:

First, in the UIProcess, we just cancel the HighlightLongPressGestureRecognizer
on didCommitLoadForMainFrame. This prevents &quot;fast clicks&quot; from accidentally going through.
This is not bullet proof because we get didCommitLoadForMainFrame asynchronously but
killing the timer and gesture seems like a good idea.

Second, we skip any tap command at the WebProcess level when it was issued for
the previous page. This is using the same principle we used for VisibleContentRect:
any input generated before the current layer tree commit is useless for the current page.

We track the commit ID in the UIProcess when we decide to do the tracking or not.
Note that we keep the ID regardless of the tracking state, it does not matter if we have sent
touch events, what matters is what content was on screen when the touch events were handled.

If the user interaction result in a tap, we send the commit ID along the tap commands.
In the WebProcess, we know the actual layer tree commit associated with the current page.
If the tap was generated with a layer ID preceding the current page, we fail the command.

* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::WebPageProxy):
(WebKit::WebPageProxy::handleTouchEventSynchronously):
(WebKit::WebPageProxy::resetState):
* UIProcess/WebPageProxy.h:
* UIProcess/ios/WKContentView.mm:
(-[WKContentView _didCommitLoadForMainFrame]):
* UIProcess/ios/WKContentViewInteraction.mm:
(-[WKContentView _attemptClickAtLocation:]):
* UIProcess/ios/WebPageProxyIOS.mm:
(WebKit::WebPageProxy::commitPotentialTap):
(WebKit::WebPageProxy::handleTap):
* WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::didCommitLoad):
* WebProcess/WebPage/WebPage.h:
* WebProcess/WebPage/WebPage.messages.in:
* WebProcess/WebPage/ios/WebPageIOS.mm:
(WebKit::WebPage::handleTap):
(WebKit::WebPage::commitPotentialTap):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2UIProcessWebPageProxycpp">trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessWebPageProxyh">trunk/Source/WebKit2/UIProcess/WebPageProxy.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessiosWKContentViewmm">trunk/Source/WebKit2/UIProcess/ios/WKContentView.mm</a></li>
<li><a href="#trunkSourceWebKit2UIProcessiosWKContentViewInteractionmm">trunk/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.mm</a></li>
<li><a href="#trunkSourceWebKit2UIProcessiosWebPageProxyIOSmm">trunk/Source/WebKit2/UIProcess/ios/WebPageProxyIOS.mm</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageWebPagecpp">trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageWebPageh">trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageWebPagemessagesin">trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageiosWebPageIOSmm">trunk/Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (178979 => 178980)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2015-01-23 04:06:40 UTC (rev 178979)
+++ trunk/Source/WebKit2/ChangeLog        2015-01-23 04:17:11 UTC (rev 178980)
</span><span class="lines">@@ -1,3 +1,63 @@
</span><ins>+2015-01-22  Benjamin Poulain  &lt;bpoulain@apple.com&gt;
+
+        [iOS][WK2] Ignore synthetic click initiated on a previous page
+        https://bugs.webkit.org/show_bug.cgi?id=139556
+        rdar://problem/18586008
+
+        Reviewed by David Kilzer.
+
+        Under the right accumulation of bad luck, a synthetic click could be generated
+        on a page that never asked for it.
+
+        What happened was:
+        1) Page Foo listen to touch event.
+        2) In response to touch events, Foo decides to navigate to page Bar
+           *but* it does not cancel the native gesture recognizers with preventDefault().
+        3) Page Bar loads.
+        4) The native gesture recognizer ask us to click, we forward that to the WebProcess
+           and generate a synthetic mouse event.
+        -&gt; Bar receives a click.
+        If you are unlucky enough, it looks like a single tap does a double click.
+
+        There are two ways this patch avoids the problem:
+
+        First, in the UIProcess, we just cancel the HighlightLongPressGestureRecognizer
+        on didCommitLoadForMainFrame. This prevents &quot;fast clicks&quot; from accidentally going through.
+        This is not bullet proof because we get didCommitLoadForMainFrame asynchronously but
+        killing the timer and gesture seems like a good idea.
+
+        Second, we skip any tap command at the WebProcess level when it was issued for
+        the previous page. This is using the same principle we used for VisibleContentRect:
+        any input generated before the current layer tree commit is useless for the current page.
+
+        We track the commit ID in the UIProcess when we decide to do the tracking or not.
+        Note that we keep the ID regardless of the tracking state, it does not matter if we have sent
+        touch events, what matters is what content was on screen when the touch events were handled.
+
+        If the user interaction result in a tap, we send the commit ID along the tap commands.
+        In the WebProcess, we know the actual layer tree commit associated with the current page.
+        If the tap was generated with a layer ID preceding the current page, we fail the command.
+
+        * UIProcess/WebPageProxy.cpp:
+        (WebKit::WebPageProxy::WebPageProxy):
+        (WebKit::WebPageProxy::handleTouchEventSynchronously):
+        (WebKit::WebPageProxy::resetState):
+        * UIProcess/WebPageProxy.h:
+        * UIProcess/ios/WKContentView.mm:
+        (-[WKContentView _didCommitLoadForMainFrame]):
+        * UIProcess/ios/WKContentViewInteraction.mm:
+        (-[WKContentView _attemptClickAtLocation:]):
+        * UIProcess/ios/WebPageProxyIOS.mm:
+        (WebKit::WebPageProxy::commitPotentialTap):
+        (WebKit::WebPageProxy::handleTap):
+        * WebProcess/WebPage/WebPage.cpp:
+        (WebKit::WebPage::didCommitLoad):
+        * WebProcess/WebPage/WebPage.h:
+        * WebProcess/WebPage/WebPage.messages.in:
+        * WebProcess/WebPage/ios/WebPageIOS.mm:
+        (WebKit::WebPage::handleTap):
+        (WebKit::WebPage::commitPotentialTap):
+
</ins><span class="cx"> 2015-01-22  Chris Dumez  &lt;cdumez@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [WK2][Cocoa] Drop WKWebViewConfiguration._featureCounterEnabled SPI.
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessWebPageProxycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp (178979 => 178980)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp        2015-01-23 04:06:40 UTC (rev 178979)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp        2015-01-23 04:17:11 UTC (rev 178980)
</span><span class="lines">@@ -286,6 +286,7 @@
</span><span class="cx">     , m_dynamicViewportSizeUpdateWaitingForTarget(false)
</span><span class="cx">     , m_dynamicViewportSizeUpdateWaitingForLayerTreeCommit(false)
</span><span class="cx">     , m_dynamicViewportSizeUpdateLayerTreeTransactionID(0)
</span><ins>+    , m_layerTreeTransactionIdAtLastTouchStart(0)
</ins><span class="cx"> #endif
</span><span class="cx">     , m_geolocationPermissionRequestManager(*this)
</span><span class="cx">     , m_notificationPermissionRequestManager(*this)
</span><span class="lines">@@ -1782,8 +1783,10 @@
</span><span class="cx">     if (!isValid())
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    if (event.type() == WebEvent::TouchStart)
</del><ins>+    if (event.type() == WebEvent::TouchStart) {
</ins><span class="cx">         m_isTrackingTouchEvents = shouldStartTrackingTouchEvents(event);
</span><ins>+        m_layerTreeTransactionIdAtLastTouchStart = downcast&lt;RemoteLayerTreeDrawingAreaProxy&gt;(*drawingArea()).lastCommittedLayerTreeTransactionID();
+    }
</ins><span class="cx"> 
</span><span class="cx">     if (!m_isTrackingTouchEvents)
</span><span class="cx">         return;
</span><span class="lines">@@ -4578,6 +4581,7 @@
</span><span class="cx">     m_dynamicViewportSizeUpdateWaitingForTarget = false;
</span><span class="cx">     m_dynamicViewportSizeUpdateWaitingForLayerTreeCommit = false;
</span><span class="cx">     m_dynamicViewportSizeUpdateLayerTreeTransactionID = 0;
</span><ins>+    m_layerTreeTransactionIdAtLastTouchStart = 0;
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     CallbackBase::Error error;
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessWebPageProxyh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.h (178979 => 178980)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/WebPageProxy.h        2015-01-23 04:06:40 UTC (rev 178979)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.h        2015-01-23 04:17:11 UTC (rev 178980)
</span><span class="lines">@@ -896,6 +896,7 @@
</span><span class="cx">     void commitPotentialTap();
</span><span class="cx">     void cancelPotentialTap();
</span><span class="cx">     void tapHighlightAtPosition(const WebCore::FloatPoint&amp;, uint64_t&amp; requestID);
</span><ins>+    void handleTap(const WebCore::FloatPoint&amp;);
</ins><span class="cx"> 
</span><span class="cx">     void inspectorNodeSearchMovedToPosition(const WebCore::FloatPoint&amp;);
</span><span class="cx">     void inspectorNodeSearchEndedAtPosition(const WebCore::FloatPoint&amp;);
</span><span class="lines">@@ -1422,6 +1423,7 @@
</span><span class="cx">     bool m_dynamicViewportSizeUpdateWaitingForTarget;
</span><span class="cx">     bool m_dynamicViewportSizeUpdateWaitingForLayerTreeCommit;
</span><span class="cx">     uint64_t m_dynamicViewportSizeUpdateLayerTreeTransactionID;
</span><ins>+    uint64_t m_layerTreeTransactionIdAtLastTouchStart;
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(VIBRATION)
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessiosWKContentViewmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/ios/WKContentView.mm (178979 => 178980)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/ios/WKContentView.mm        2015-01-23 04:06:40 UTC (rev 178979)
+++ trunk/Source/WebKit2/UIProcess/ios/WKContentView.mm        2015-01-23 04:17:11 UTC (rev 178980)
</span><span class="lines">@@ -461,6 +461,7 @@
</span><span class="cx"> - (void)_didCommitLoadForMainFrame
</span><span class="cx"> {
</span><span class="cx">     [self _stopAssistingNode];
</span><ins>+    [self _cancelLongPressGestureRecognizer];
</ins><span class="cx">     [_webView _didCommitLoadForMainFrame];
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessiosWKContentViewInteractionmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.mm (178979 => 178980)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.mm        2015-01-23 04:06:40 UTC (rev 178979)
+++ trunk/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.mm        2015-01-23 04:17:11 UTC (rev 178980)
</span><span class="lines">@@ -1071,7 +1071,7 @@
</span><span class="cx">     if (![self isFirstResponder])
</span><span class="cx">         [self becomeFirstResponder];
</span><span class="cx"> 
</span><del>-    _page-&gt;process().send(Messages::WebPage::HandleTap(IntPoint(location)), _page-&gt;pageID());
</del><ins>+    _page-&gt;handleTap(location);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (void)useSelectionAssistantWithMode:(UIWebSelectionMode)selectionMode
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessiosWebPageProxyIOSmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/ios/WebPageProxyIOS.mm (178979 => 178980)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/ios/WebPageProxyIOS.mm        2015-01-23 04:06:40 UTC (rev 178979)
+++ trunk/Source/WebKit2/UIProcess/ios/WebPageProxyIOS.mm        2015-01-23 04:17:11 UTC (rev 178980)
</span><span class="lines">@@ -686,7 +686,7 @@
</span><span class="cx"> 
</span><span class="cx"> void WebPageProxy::commitPotentialTap()
</span><span class="cx"> {
</span><del>-    process().send(Messages::WebPage::CommitPotentialTap(), m_pageID);
</del><ins>+    process().send(Messages::WebPage::CommitPotentialTap(m_layerTreeTransactionIdAtLastTouchStart), m_pageID);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebPageProxy::cancelPotentialTap()
</span><span class="lines">@@ -699,6 +699,11 @@
</span><span class="cx">     process().send(Messages::WebPage::TapHighlightAtPosition(requestID, position), m_pageID);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void WebPageProxy::handleTap(const FloatPoint&amp; location)
+{
+    process().send(Messages::WebPage::HandleTap(roundedIntPoint(location), m_layerTreeTransactionIdAtLastTouchStart), m_pageID);
+}
+
</ins><span class="cx"> void WebPageProxy::inspectorNodeSearchMovedToPosition(const WebCore::FloatPoint&amp; position)
</span><span class="cx"> {
</span><span class="cx">     process().send(Messages::WebPage::InspectorNodeSearchMovedToPosition(position), m_pageID);
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageWebPagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp (178979 => 178980)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp        2015-01-23 04:06:40 UTC (rev 178979)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp        2015-01-23 04:17:11 UTC (rev 178980)
</span><span class="lines">@@ -4547,6 +4547,7 @@
</span><span class="cx">     m_firstLayerTreeTransactionIDAfterDidCommitLoad = downcast&lt;RemoteLayerTreeDrawingArea&gt;(*m_drawingArea).nextTransactionID();
</span><span class="cx">     m_userHasChangedPageScaleFactor = false;
</span><span class="cx">     m_estimatedLatency = std::chrono::milliseconds(1000 / 60);
</span><ins>+    cancelPotentialTap();
</ins><span class="cx"> 
</span><span class="cx"> #if ENABLE(IOS_TOUCH_EVENTS)
</span><span class="cx">     WebProcess::shared().eventDispatcher().clearQueuedTouchEventsForPage(*this);
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageWebPageh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h (178979 => 178980)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h        2015-01-23 04:06:40 UTC (rev 178979)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h        2015-01-23 04:17:11 UTC (rev 178980)
</span><span class="lines">@@ -473,9 +473,9 @@
</span><span class="cx">     bool allowsUserScaling() const;
</span><span class="cx">     bool hasStablePageScaleFactor() const { return m_hasStablePageScaleFactor; }
</span><span class="cx"> 
</span><del>-    void handleTap(const WebCore::IntPoint&amp;);
</del><ins>+    void handleTap(const WebCore::IntPoint&amp;, uint64_t lastLayerTreeTranscationId);
</ins><span class="cx">     void potentialTapAtPosition(uint64_t requestID, const WebCore::FloatPoint&amp;);
</span><del>-    void commitPotentialTap();
</del><ins>+    void commitPotentialTap(uint64_t lastLayerTreeTranscationId);
</ins><span class="cx">     void commitPotentialTapFailed();
</span><span class="cx">     void cancelPotentialTap();
</span><span class="cx">     void tapHighlightAtPosition(uint64_t requestID, const WebCore::FloatPoint&amp;);
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageWebPagemessagesin"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in (178979 => 178980)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in        2015-01-23 04:06:40 UTC (rev 178979)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in        2015-01-23 04:17:11 UTC (rev 178980)
</span><span class="lines">@@ -49,9 +49,9 @@
</span><span class="cx">     DynamicViewportSizeUpdate(WebCore::FloatSize minimumLayoutSize, WebCore::FloatSize maximumUnobscuredSize, WebCore::FloatRect targetExposedContentRect, WebCore::FloatRect targetUnobscuredRect, WebCore::FloatRect targetUnobscuredRectInScrollViewCoordinates, double scale, int32_t deviceOrientation)
</span><span class="cx">     SynchronizeDynamicViewportUpdate() -&gt; (double newTargetScale, WebCore::FloatPoint newScrollPosition, uint64_t nextValidLayerTreeTransactionID)
</span><span class="cx"> 
</span><del>-    HandleTap(WebCore::IntPoint point)
</del><ins>+    HandleTap(WebCore::IntPoint point, uint64_t lastLayerTreeTranscationId)
</ins><span class="cx">     PotentialTapAtPosition(uint64_t requestID, WebCore::FloatPoint point)
</span><del>-    CommitPotentialTap()
</del><ins>+    CommitPotentialTap(uint64_t lastLayerTreeTranscationId)
</ins><span class="cx">     CancelPotentialTap()
</span><span class="cx">     TapHighlightAtPosition(uint64_t requestID, WebCore::FloatPoint point)
</span><span class="cx">     InspectorNodeSearchMovedToPosition(WebCore::FloatPoint point)
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageiosWebPageIOSmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm (178979 => 178980)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm        2015-01-23 04:06:40 UTC (rev 178979)
+++ trunk/Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm        2015-01-23 04:17:11 UTC (rev 178980)
</span><span class="lines">@@ -503,8 +503,13 @@
</span><span class="cx">         send(Messages::WebPageProxy::DidNotHandleTapAsClick(roundedIntPoint(location)));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WebPage::handleTap(const IntPoint&amp; point)
</del><ins>+void WebPage::handleTap(const IntPoint&amp; point, uint64_t lastLayerTreeTranscationId)
</ins><span class="cx"> {
</span><ins>+    if (lastLayerTreeTranscationId &lt; m_firstLayerTreeTransactionIDAfterDidCommitLoad) {
+        send(Messages::WebPageProxy::DidNotHandleTapAsClick(roundedIntPoint(m_potentialTapLocation)));
+        return;
+    }
+
</ins><span class="cx">     FloatPoint adjustedPoint;
</span><span class="cx">     Node* nodeRespondingToClick = m_page-&gt;mainFrame().nodeRespondingToClickEvents(point, adjustedPoint);
</span><span class="cx">     handleSyntheticClick(nodeRespondingToClick, adjustedPoint);
</span><span class="lines">@@ -552,9 +557,9 @@
</span><span class="cx">     sendTapHighlightForNodeIfNecessary(requestID, m_potentialTapNode.get());
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WebPage::commitPotentialTap()
</del><ins>+void WebPage::commitPotentialTap(uint64_t lastLayerTreeTranscationId)
</ins><span class="cx"> {
</span><del>-    if (!m_potentialTapNode || !m_potentialTapNode-&gt;renderer()) {
</del><ins>+    if (!m_potentialTapNode || !m_potentialTapNode-&gt;renderer() || lastLayerTreeTranscationId &lt; m_firstLayerTreeTransactionIDAfterDidCommitLoad) {
</ins><span class="cx">         commitPotentialTapFailed();
</span><span class="cx">         return;
</span><span class="cx">     }
</span></span></pre>
</div>
</div>

</body>
</html>