<!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>[189400] 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/189400">189400</a></dd>
<dt>Author</dt> <dd>bdakin@apple.com</dd>
<dt>Date</dt> <dd>2015-09-04 16:48:58 -0700 (Fri, 04 Sep 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Should have a test to make sure links don't navigate after a cancelled force 
click
https://bugs.webkit.org/show_bug.cgi?id=148846

Reviewed by Tim Horton.

Tools:

New EventSender function for a started then cancelled force click.
* WebKitTestRunner/EventSenderProxy.h:
* WebKitTestRunner/InjectedBundle/Bindings/EventSendingController.idl:
* WebKitTestRunner/InjectedBundle/EventSendingController.cpp:
(WTR::EventSendingController::mouseForceClick):
(WTR::EventSendingController::startAndCancelMouseForceClick):
(WTR::EventSendingController::mouseForceDown):
* WebKitTestRunner/InjectedBundle/EventSendingController.h:
* WebKitTestRunner/TestController.cpp:
(WTR::TestController::didReceiveSynchronousMessageFromInjectedBundle):
* WebKitTestRunner/mac/EventSenderProxy.mm:
(WTR::EventSenderProxy::mouseForceClick):
(WTR::EventSenderProxy::startAndCancelMouseForceClick):
(WTR::EventSenderProxy::mouseForceDown):
(WTR::EventSenderProxy::mouseMoveTo):

LayoutTests:

* fast/events/cancelled-force-click-link-navigation-expected.txt: Added.
* fast/events/cancelled-force-click-link-navigation.html: Added.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
<li><a href="#trunkToolsWebKitTestRunnerEventSenderProxyh">trunk/Tools/WebKitTestRunner/EventSenderProxy.h</a></li>
<li><a href="#trunkToolsWebKitTestRunnerInjectedBundleBindingsEventSendingControlleridl">trunk/Tools/WebKitTestRunner/InjectedBundle/Bindings/EventSendingController.idl</a></li>
<li><a href="#trunkToolsWebKitTestRunnerInjectedBundleEventSendingControllercpp">trunk/Tools/WebKitTestRunner/InjectedBundle/EventSendingController.cpp</a></li>
<li><a href="#trunkToolsWebKitTestRunnerInjectedBundleEventSendingControllerh">trunk/Tools/WebKitTestRunner/InjectedBundle/EventSendingController.h</a></li>
<li><a href="#trunkToolsWebKitTestRunnerTestControllercpp">trunk/Tools/WebKitTestRunner/TestController.cpp</a></li>
<li><a href="#trunkToolsWebKitTestRunnermacEventSenderProxymm">trunk/Tools/WebKitTestRunner/mac/EventSenderProxy.mm</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsfasteventscancelledforceclicklinknavigationexpectedtxt">trunk/LayoutTests/fast/events/cancelled-force-click-link-navigation-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfasteventscancelledforceclicklinknavigationhtml">trunk/LayoutTests/fast/events/cancelled-force-click-link-navigation.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (189399 => 189400)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2015-09-04 23:35:30 UTC (rev 189399)
+++ trunk/LayoutTests/ChangeLog        2015-09-04 23:48:58 UTC (rev 189400)
</span><span class="lines">@@ -1,3 +1,14 @@
</span><ins>+2015-09-04  Beth Dakin  &lt;bdakin@apple.com&gt;
+
+        Should have a test to make sure links don't navigate after a cancelled force 
+        click
+        https://bugs.webkit.org/show_bug.cgi?id=148846
+
+        Reviewed by Tim Horton.
+
+        * fast/events/cancelled-force-click-link-navigation-expected.txt: Added.
+        * fast/events/cancelled-force-click-link-navigation.html: Added.
+
</ins><span class="cx"> 2015-09-04  Chris Dumez  &lt;cdumez@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Unreviewed, add bug number for http/tests/w3c/html/semantics/text-level-semantics/the-wbr-element/wbr-element.html
</span></span></pre></div>
<a id="trunkLayoutTestsfasteventscancelledforceclicklinknavigationexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/events/cancelled-force-click-link-navigation-expected.txt (0 => 189400)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/events/cancelled-force-click-link-navigation-expected.txt                                (rev 0)
+++ trunk/LayoutTests/fast/events/cancelled-force-click-link-navigation-expected.txt        2015-09-04 23:48:58 UTC (rev 189400)
</span><span class="lines">@@ -0,0 +1,2 @@
</span><ins>+Link
+SUCCESS! We did not navigate to the link after starting a force click.
</ins></span></pre></div>
<a id="trunkLayoutTestsfasteventscancelledforceclicklinknavigationhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/events/cancelled-force-click-link-navigation.html (0 => 189400)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/events/cancelled-force-click-link-navigation.html                                (rev 0)
+++ trunk/LayoutTests/fast/events/cancelled-force-click-link-navigation.html        2015-09-04 23:48:58 UTC (rev 189400)
</span><span class="lines">@@ -0,0 +1,49 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script&gt;
+
+var didNavigate = false;
+
+window.onbeforeunload = function () {
+    didNavigate = true;
+};
+
+function checkForDone()
+{
+    if (!didNavigate) {
+        var console = document.getElementById(&quot;console&quot;);
+        console.innerHTML = &quot;SUCCESS! We did not navigate to the link after starting a force click.&quot;;
+    }
+
+    if (window.testRunner)
+        testRunner.notifyDone();
+}
+
+function spinRunLoop()
+{
+    window.setTimeout(checkForDone, 0);
+}
+
+function startTest()
+{
+    if (window.testRunner) {
+        testRunner.dumpAsText();
+        testRunner.waitUntilDone();
+    }
+
+    if (window.eventSender) {
+        eventSender.mouseMoveTo(16, 16);
+        eventSender.startAndCancelMouseForceClick();
+        window.setTimeout(spinRunLoop, 0);
+    }
+}
+&lt;/script&gt;
+&lt;/head&gt;
+
+&lt;body onload=&quot;startTest()&quot;&gt;
+
+&lt;a href=&quot;resources/do-not-navigate-here.html&quot;&gt;Link&lt;/a&gt;
+&lt;pre id=&quot;console&quot;&gt;Failed. This test must be run in the test harness. To run the test manually, start force clicking on the link, but don't click hard enough to pop open the preview. Then make sure that the original document does not navigate anywhere.&lt;/pre&gt;
+
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (189399 => 189400)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog        2015-09-04 23:35:30 UTC (rev 189399)
+++ trunk/Tools/ChangeLog        2015-09-04 23:48:58 UTC (rev 189400)
</span><span class="lines">@@ -1,3 +1,27 @@
</span><ins>+2015-09-04  Beth Dakin  &lt;bdakin@apple.com&gt;
+
+        Should have a test to make sure links don't navigate after a cancelled force 
+        click
+        https://bugs.webkit.org/show_bug.cgi?id=148846
+
+        Reviewed by Tim Horton.
+
+        New EventSender function for a started then cancelled force click.
+        * WebKitTestRunner/EventSenderProxy.h:
+        * WebKitTestRunner/InjectedBundle/Bindings/EventSendingController.idl:
+        * WebKitTestRunner/InjectedBundle/EventSendingController.cpp:
+        (WTR::EventSendingController::mouseForceClick):
+        (WTR::EventSendingController::startAndCancelMouseForceClick):
+        (WTR::EventSendingController::mouseForceDown):
+        * WebKitTestRunner/InjectedBundle/EventSendingController.h:
+        * WebKitTestRunner/TestController.cpp:
+        (WTR::TestController::didReceiveSynchronousMessageFromInjectedBundle):
+        * WebKitTestRunner/mac/EventSenderProxy.mm:
+        (WTR::EventSenderProxy::mouseForceClick):
+        (WTR::EventSenderProxy::startAndCancelMouseForceClick):
+        (WTR::EventSenderProxy::mouseForceDown):
+        (WTR::EventSenderProxy::mouseMoveTo):
+
</ins><span class="cx"> 2015-09-04  Tim Horton  &lt;timothy_horton@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Add a test for r179736 (programmatic navigation during swipe causing a crash)
</span></span></pre></div>
<a id="trunkToolsWebKitTestRunnerEventSenderProxyh"></a>
<div class="modfile"><h4>Modified: trunk/Tools/WebKitTestRunner/EventSenderProxy.h (189399 => 189400)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebKitTestRunner/EventSenderProxy.h        2015-09-04 23:35:30 UTC (rev 189399)
+++ trunk/Tools/WebKitTestRunner/EventSenderProxy.h        2015-09-04 23:48:58 UTC (rev 189400)
</span><span class="lines">@@ -67,6 +67,7 @@
</span><span class="cx">     void mouseForceUp();
</span><span class="cx">     void mouseForceChanged(float);
</span><span class="cx">     void mouseForceClick();
</span><ins>+    void startAndCancelMouseForceClick();
</ins><span class="cx">     void mouseMoveTo(double x, double y);
</span><span class="cx">     void mouseScrollBy(int x, int y);
</span><span class="cx">     void mouseScrollByWithWheelAndMomentumPhases(int x, int y, int phase, int momentum);
</span></span></pre></div>
<a id="trunkToolsWebKitTestRunnerInjectedBundleBindingsEventSendingControlleridl"></a>
<div class="modfile"><h4>Modified: trunk/Tools/WebKitTestRunner/InjectedBundle/Bindings/EventSendingController.idl (189399 => 189400)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebKitTestRunner/InjectedBundle/Bindings/EventSendingController.idl        2015-09-04 23:35:30 UTC (rev 189399)
+++ trunk/Tools/WebKitTestRunner/InjectedBundle/Bindings/EventSendingController.idl        2015-09-04 23:48:58 UTC (rev 189400)
</span><span class="lines">@@ -28,6 +28,7 @@
</span><span class="cx">     void mouseUp(long buttonNumber, object modifierArray);
</span><span class="cx">     void mouseMoveTo(long x, long y);
</span><span class="cx">     void mouseForceClick();
</span><ins>+    void startAndCancelMouseForceClick();
</ins><span class="cx">     void mouseForceDown();
</span><span class="cx">     void mouseForceUp();
</span><span class="cx">     void mouseForceChanged(double force);
</span></span></pre></div>
<a id="trunkToolsWebKitTestRunnerInjectedBundleEventSendingControllercpp"></a>
<div class="modfile"><h4>Modified: trunk/Tools/WebKitTestRunner/InjectedBundle/EventSendingController.cpp (189399 => 189400)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebKitTestRunner/InjectedBundle/EventSendingController.cpp        2015-09-04 23:35:30 UTC (rev 189399)
+++ trunk/Tools/WebKitTestRunner/InjectedBundle/EventSendingController.cpp        2015-09-04 23:48:58 UTC (rev 189400)
</span><span class="lines">@@ -267,6 +267,18 @@
</span><span class="cx">     WKBundlePagePostSynchronousMessageForTesting(InjectedBundle::singleton().page()-&gt;page(), EventSenderMessageName.get(), EventSenderMessageBody.get(), 0);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void EventSendingController::startAndCancelMouseForceClick()
+{
+    WKRetainPtr&lt;WKStringRef&gt; EventSenderMessageName(AdoptWK, WKStringCreateWithUTF8CString(&quot;EventSender&quot;));
+    WKRetainPtr&lt;WKMutableDictionaryRef&gt; EventSenderMessageBody(AdoptWK, WKMutableDictionaryCreate());
+
+    WKRetainPtr&lt;WKStringRef&gt; subMessageKey(AdoptWK, WKStringCreateWithUTF8CString(&quot;SubMessage&quot;));
+    WKRetainPtr&lt;WKStringRef&gt; subMessageName(AdoptWK, WKStringCreateWithUTF8CString(&quot;StartAndCancelMouseForceClick&quot;));
+    WKDictionarySetItem(EventSenderMessageBody.get(), subMessageKey.get(), subMessageName.get());
+
+    WKBundlePagePostSynchronousMessageForTesting(InjectedBundle::singleton().page()-&gt;page(), EventSenderMessageName.get(), EventSenderMessageBody.get(), 0);
+}
+
</ins><span class="cx"> void EventSendingController::mouseForceDown()
</span><span class="cx"> {
</span><span class="cx">     WKRetainPtr&lt;WKStringRef&gt; EventSenderMessageName(AdoptWK, WKStringCreateWithUTF8CString(&quot;EventSender&quot;));
</span></span></pre></div>
<a id="trunkToolsWebKitTestRunnerInjectedBundleEventSendingControllerh"></a>
<div class="modfile"><h4>Modified: trunk/Tools/WebKitTestRunner/InjectedBundle/EventSendingController.h (189399 => 189400)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebKitTestRunner/InjectedBundle/EventSendingController.h        2015-09-04 23:35:30 UTC (rev 189399)
+++ trunk/Tools/WebKitTestRunner/InjectedBundle/EventSendingController.h        2015-09-04 23:48:58 UTC (rev 189400)
</span><span class="lines">@@ -47,6 +47,7 @@
</span><span class="cx">     void mouseUp(int button, JSValueRef modifierArray);
</span><span class="cx">     void mouseMoveTo(int x, int y);
</span><span class="cx">     void mouseForceClick();
</span><ins>+    void startAndCancelMouseForceClick();
</ins><span class="cx">     void mouseForceDown();
</span><span class="cx">     void mouseForceUp();
</span><span class="cx">     void mouseForceChanged(double force);
</span></span></pre></div>
<a id="trunkToolsWebKitTestRunnerTestControllercpp"></a>
<div class="modfile"><h4>Modified: trunk/Tools/WebKitTestRunner/TestController.cpp (189399 => 189400)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebKitTestRunner/TestController.cpp        2015-09-04 23:35:30 UTC (rev 189399)
+++ trunk/Tools/WebKitTestRunner/TestController.cpp        2015-09-04 23:48:58 UTC (rev 189400)
</span><span class="lines">@@ -1216,6 +1216,11 @@
</span><span class="cx">             return 0;
</span><span class="cx">         }
</span><span class="cx"> 
</span><ins>+        if (WKStringIsEqualToUTF8CString(subMessageName, &quot;StartAndCancelMouseForceClick&quot;)) {
+            m_eventSenderProxy-&gt;startAndCancelMouseForceClick();
+            return 0;
+        }
+
</ins><span class="cx">         if (WKStringIsEqualToUTF8CString(subMessageName, &quot;MouseForceDown&quot;)) {
</span><span class="cx">             m_eventSenderProxy-&gt;mouseForceDown();
</span><span class="cx">             return 0;
</span></span></pre></div>
<a id="trunkToolsWebKitTestRunnermacEventSenderProxymm"></a>
<div class="modfile"><h4>Modified: trunk/Tools/WebKitTestRunner/mac/EventSenderProxy.mm (189399 => 189400)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebKitTestRunner/mac/EventSenderProxy.mm        2015-09-04 23:35:30 UTC (rev 189399)
+++ trunk/Tools/WebKitTestRunner/mac/EventSenderProxy.mm        2015-09-04 23:48:58 UTC (rev 189400)
</span><span class="lines">@@ -467,6 +467,42 @@
</span><span class="cx"> #pragma clang diagnostic pop
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void EventSenderProxy::startAndCancelMouseForceClick()
+{
+    sendMouseDownToStartPressureEvents();
+
+    RetainPtr&lt;NSEvent&gt; beginPressure = beginPressureEvent(1);
+    RetainPtr&lt;NSEvent&gt; increasingPressure = pressureChangeEvent(1, PressureChangeDirection::Increasing);
+    RetainPtr&lt;NSEvent&gt; releasingPressure = pressureChangeEvent(1, PressureChangeDirection::Decreasing);
+    NSEvent *mouseUp = [NSEvent mouseEventWithType:NSLeftMouseUp
+        location:NSMakePoint(m_position.x, m_position.y)
+        modifierFlags:0
+        timestamp:absoluteTimeForEventTime(currentEventTime())
+        windowNumber:[m_testController-&gt;mainWebView()-&gt;platformWindow() windowNumber]
+        context:[NSGraphicsContext currentContext]
+        eventNumber:++eventNumber
+        clickCount:m_clickCount
+        pressure:0.0];
+
+    NSView *targetView = [m_testController-&gt;mainWebView()-&gt;platformView() hitTest:[beginPressure.get() locationInWindow]];
+    targetView = targetView ? targetView : m_testController-&gt;mainWebView()-&gt;platformView();
+    ASSERT(targetView);
+
+    // Since AppKit does not implement forceup/down as mouse events, we need to send two pressure events to detect
+    // the change in stage that marks those moments.
+    handleForceEventSynchronously(beginPressure.get());
+    handleForceEventSynchronously(increasingPressure.get());
+    handleForceEventSynchronously(releasingPressure.get());
+    [NSApp sendEvent:mouseUp];
+
+    [NSApp _setCurrentEvent:nil];
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored &quot;-Wnonnull&quot;
+    // WKView caches the most recent pressure event, so send it a nil event to clear the cache.
+    [targetView pressureChangeWithEvent:nil];
+#pragma clang diagnostic pop
+}
+
</ins><span class="cx"> void EventSenderProxy::mouseForceDown()
</span><span class="cx"> {
</span><span class="cx">     sendMouseDownToStartPressureEvents();
</span><span class="lines">@@ -576,6 +612,10 @@
</span><span class="cx"> void EventSenderProxy::mouseForceClick()
</span><span class="cx"> {
</span><span class="cx"> }
</span><ins>+
+void EventSenderProxy::startAndCancelMouseForceClick()
+{
+}
</ins><span class="cx"> #endif // defined(__LP64__) &amp;&amp; __MAC_OS_X_VERSION_MIN_REQUIRED &gt;= 101003
</span><span class="cx"> 
</span><span class="cx"> void EventSenderProxy::mouseMoveTo(double x, double y)
</span></span></pre>
</div>
</div>

</body>
</html>