<!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>[182912] 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/182912">182912</a></dd>
<dt>Author</dt> <dd>bdakin@apple.com</dd>
<dt>Date</dt> <dd>2015-04-16 15:18:35 -0700 (Thu, 16 Apr 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Force mouse events should go through normal mouse event handling code paths
https://bugs.webkit.org/show_bug.cgi?id=143749
-and corresponding-
rdar://problem/20472895

Reviewed by Dean Jackson.

Source/WebCore:

This patch moves all of the code to dispatch mouseforcedown, mouseforceup, and 
mouseforcechanged into normal mouse event dispatching code. This patch leaves 
behind the cancel and click events because we plan to remove those, and it also 
leaves mouseforcewillbegin because that is necessarily a very different event more 
tied to the NSImmediateActionGestureRecognizer than these other events which are 
tied to NSResponder’s pressureChangeWithEvent.

New helper functions.
* dom/Document.cpp:
(WebCore::Document::hasListenerTypeForEventType):
* dom/Document.h:
* dom/Element.cpp:
(WebCore::isForceEvent):

Move the code to ensure the force events have listeners in order to fire to 
dispatchMouseEvent, and delete the old implementations.
(WebCore::Element::dispatchMouseEvent):
(WebCore::Element::dispatchMouseForceChanged): Deleted.
(WebCore::Element::dispatchMouseForceDown): Deleted.
(WebCore::Element::dispatchMouseForceUp): Deleted.
* dom/Element.h:

Perform a hit test and pipe the events through dispatchMouseEvent(). 
* page/EventHandler.cpp:
(WebCore::EventHandler::handleMouseForceEvent):
* page/EventHandler.h:

New types for the new events.
* platform/PlatformEvent.h:

Forward to EventHandler. 
* replay/UserInputBridge.cpp:
(WebCore::UserInputBridge::handleMouseForceEvent):
* replay/UserInputBridge.h:

Source/WebKit2:

This patch makes pressureChangeWithEvent create NativeWebMouseEvents with the 
NSEventTypePressures that is gets and sends those down to the web process.

Re-name pressureEvent to lastPressureEvent. Now that event can sometimes be an 
NSEventTypePressure, the new name makes it clear how the second parameter differs 
from the first.
* Shared/NativeWebMouseEvent.h:

New event types for the new types of events.
* Shared/WebEvent.h:
* Shared/WebEventConversion.cpp:
(WebKit::WebKit2PlatformMouseEvent::WebKit2PlatformMouseEvent):
* Shared/mac/NativeWebMouseEventMac.mm:
(WebKit::NativeWebMouseEvent::NativeWebMouseEvent):
* Shared/mac/WebEventFactory.h:

All of the square-peg, round-hole problems of massaging the NSEventTypePressures 
events into WebMouseEvents is taken care of here.
* Shared/mac/WebEventFactory.mm:
(WebKit::mouseButtonForEvent):
(WebKit::globalPointForEvent):
(WebKit::pointForEvent):
(WebKit::WebEventFactory::createWebMouseEvent):

Instead of calling the old inputDeviceForceDidChange, create a NativeWebMouseEvent 
and handle it.
* UIProcess/API/mac/WKView.mm:
(-[WKView pressureChangeWithEvent:]):

Handle the new types.
* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::didReceiveEvent):

Can delete inputDeviceForceDidChange since it’s no longer used.
(WebKit::WebPageProxy::inputDeviceForceDidChange): Deleted.
* UIProcess/WebPageProxy.h:

Handle the new types of mouse events properly.
* WebProcess/WebPage/WebPage.cpp:
(WebKit::handleMouseEvent):

Delete inputDeviceForceDidChange() and m_lastForceStage.
* WebProcess/WebPage/WebPage.h:
* WebProcess/WebPage/WebPage.messages.in:
* WebProcess/WebPage/mac/WebPageMac.mm:
(WebKit::WebPage::inputDeviceForceDidChange): Deleted.

Handle new WebEvent types.
* WebProcess/Plugins/Netscape/x11/NetscapePluginX11.cpp:

Tools:

Add mouseForceDown/mouseForceUp/mouseForceChanged support to WebKitTestRunner. 
Since there is not a way to create an NSEventTypePressure from scratch, we 
subclass NSEvent and override all of the critical methods.

* WebKitTestRunner/EventSenderProxy.h:
* WebKitTestRunner/InjectedBundle/Bindings/EventSendingController.idl:
* WebKitTestRunner/InjectedBundle/EventSendingController.cpp:
(WTR::EventSendingController::mouseForceDown):
(WTR::EventSendingController::mouseForceUp):
(WTR::EventSendingController::mouseForceChanged):
* WebKitTestRunner/InjectedBundle/EventSendingController.h:
* WebKitTestRunner/TestController.cpp:
(WTR::TestController::didReceiveSynchronousMessageFromInjectedBundle):
* WebKitTestRunner/mac/EventSenderProxy.mm:
(-[EventSenderPressureEvent initAtLocation:globalLocation:stage:pressure:phase:time:eventNumber:]):
(-[EventSenderPressureEvent timestamp]):
(-[EventSenderPressureEvent type]):
(-[EventSenderPressureEvent locationInWindow]):
(-[EventSenderPressureEvent location]):
(-[EventSenderPressureEvent stage]):
(-[EventSenderPressureEvent pressure]):
(-[EventSenderPressureEvent phase]):
(-[EventSenderPressureEvent eventNumber]):
(WTR::EventSenderProxy::mouseForceDown):
(WTR::EventSenderProxy::mouseForceUp):
(WTR::EventSenderProxy::mouseForceChanged):

LayoutTests:

Just a few new tests. More to come.
* fast/events/mouse-force-changed-expected.txt: Added.
* fast/events/mouse-force-changed.html: Added.
* fast/events/mouse-force-down-expected.txt: Added.
* fast/events/mouse-force-down.html: Added.
* fast/events/mouse-force-up-expected.txt: Added.
* fast/events/mouse-force-up.html: Added.

Right now the new tests will only work on Mac 10.10.3 and beyond.
* platform/efl/TestExpectations:
* platform/gtk/TestExpectations:
* platform/ios-simulator/TestExpectations:
* platform/mac-mavericks/TestExpectations:
* platform/win/TestExpectations:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsplatformeflTestExpectations">trunk/LayoutTests/platform/efl/TestExpectations</a></li>
<li><a href="#trunkLayoutTestsplatformgtkTestExpectations">trunk/LayoutTests/platform/gtk/TestExpectations</a></li>
<li><a href="#trunkLayoutTestsplatformiossimulatorTestExpectations">trunk/LayoutTests/platform/ios-simulator/TestExpectations</a></li>
<li><a href="#trunkLayoutTestsplatformmacmavericksTestExpectations">trunk/LayoutTests/platform/mac-mavericks/TestExpectations</a></li>
<li><a href="#trunkLayoutTestsplatformwinTestExpectations">trunk/LayoutTests/platform/win/TestExpectations</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</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="#trunkSourceWebCoredomElementcpp">trunk/Source/WebCore/dom/Element.cpp</a></li>
<li><a href="#trunkSourceWebCoredomElementh">trunk/Source/WebCore/dom/Element.h</a></li>
<li><a href="#trunkSourceWebCorepageEventHandlercpp">trunk/Source/WebCore/page/EventHandler.cpp</a></li>
<li><a href="#trunkSourceWebCorepageEventHandlerh">trunk/Source/WebCore/page/EventHandler.h</a></li>
<li><a href="#trunkSourceWebCoreplatformPlatformEventh">trunk/Source/WebCore/platform/PlatformEvent.h</a></li>
<li><a href="#trunkSourceWebCorereplayUserInputBridgecpp">trunk/Source/WebCore/replay/UserInputBridge.cpp</a></li>
<li><a href="#trunkSourceWebCorereplayUserInputBridgeh">trunk/Source/WebCore/replay/UserInputBridge.h</a></li>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2SharedNativeWebMouseEventh">trunk/Source/WebKit2/Shared/NativeWebMouseEvent.h</a></li>
<li><a href="#trunkSourceWebKit2SharedWebEventh">trunk/Source/WebKit2/Shared/WebEvent.h</a></li>
<li><a href="#trunkSourceWebKit2SharedWebEventConversioncpp">trunk/Source/WebKit2/Shared/WebEventConversion.cpp</a></li>
<li><a href="#trunkSourceWebKit2SharedmacNativeWebMouseEventMacmm">trunk/Source/WebKit2/Shared/mac/NativeWebMouseEventMac.mm</a></li>
<li><a href="#trunkSourceWebKit2SharedmacWebEventFactoryh">trunk/Source/WebKit2/Shared/mac/WebEventFactory.h</a></li>
<li><a href="#trunkSourceWebKit2SharedmacWebEventFactorymm">trunk/Source/WebKit2/Shared/mac/WebEventFactory.mm</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPImacWKViewmm">trunk/Source/WebKit2/UIProcess/API/mac/WKView.mm</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="#trunkSourceWebKit2WebProcessPluginsNetscapex11NetscapePluginX11cpp">trunk/Source/WebKit2/WebProcess/Plugins/Netscape/x11/NetscapePluginX11.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageWebPagecpp">trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageWebPageh">trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageWebPagemessagesin">trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPagemacWebPageMacmm">trunk/Source/WebKit2/WebProcess/WebPage/mac/WebPageMac.mm</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="#trunkLayoutTestsfasteventsmouseforcechangedexpectedtxt">trunk/LayoutTests/fast/events/mouse-force-changed-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfasteventsmouseforcechangedhtml">trunk/LayoutTests/fast/events/mouse-force-changed.html</a></li>
<li><a href="#trunkLayoutTestsfasteventsmouseforcedownexpectedtxt">trunk/LayoutTests/fast/events/mouse-force-down-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfasteventsmouseforcedownhtml">trunk/LayoutTests/fast/events/mouse-force-down.html</a></li>
<li><a href="#trunkLayoutTestsfasteventsmouseforceupexpectedtxt">trunk/LayoutTests/fast/events/mouse-force-up-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfasteventsmouseforceuphtml">trunk/LayoutTests/fast/events/mouse-force-up.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (182911 => 182912)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2015-04-16 21:35:30 UTC (rev 182911)
+++ trunk/LayoutTests/ChangeLog        2015-04-16 22:18:35 UTC (rev 182912)
</span><span class="lines">@@ -1,3 +1,27 @@
</span><ins>+2015-04-16  Beth Dakin  &lt;bdakin@apple.com&gt;
+
+        Force mouse events should go through normal mouse event handling code paths
+        https://bugs.webkit.org/show_bug.cgi?id=143749
+        -and corresponding-
+        rdar://problem/20472895
+
+        Reviewed by Dean Jackson.
+
+        Just a few new tests. More to come.
+        * fast/events/mouse-force-changed-expected.txt: Added.
+        * fast/events/mouse-force-changed.html: Added.
+        * fast/events/mouse-force-down-expected.txt: Added.
+        * fast/events/mouse-force-down.html: Added.
+        * fast/events/mouse-force-up-expected.txt: Added.
+        * fast/events/mouse-force-up.html: Added.
+
+        Right now the new tests will only work on Mac 10.10.3 and beyond.
+        * platform/efl/TestExpectations:
+        * platform/gtk/TestExpectations:
+        * platform/ios-simulator/TestExpectations:
+        * platform/mac-mavericks/TestExpectations:
+        * platform/win/TestExpectations:
+
</ins><span class="cx"> 2015-04-16  Chris Dumez  &lt;cdumez@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Regression(r182517): WebSocket::suspend() causes error event to be fired
</span></span></pre></div>
<a id="trunkLayoutTestsfasteventsmouseforcechangedexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/events/mouse-force-changed-expected.txt (0 => 182912)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/events/mouse-force-changed-expected.txt                                (rev 0)
+++ trunk/LayoutTests/fast/events/mouse-force-changed-expected.txt        2015-04-16 22:18:35 UTC (rev 182912)
</span><span class="lines">@@ -0,0 +1 @@
</span><ins>+Success! The mouseforcechanged event was dispatched.
</ins></span></pre></div>
<a id="trunkLayoutTestsfasteventsmouseforcechangedhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/events/mouse-force-changed.html (0 => 182912)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/events/mouse-force-changed.html                                (rev 0)
+++ trunk/LayoutTests/fast/events/mouse-force-changed.html        2015-04-16 22:18:35 UTC (rev 182912)
</span><span class="lines">@@ -0,0 +1,43 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;style&gt;
+#forceSensor {
+    width: 200px;
+    height: 200px;
+    border: 2px solid black;
+}
+&lt;/style&gt;
+&lt;script&gt;
+
+function forceChanged()
+{
+    var console = document.getElementById(&quot;console&quot;);
+    console.innerHTML = &quot;Success! The mouseforcechanged event was dispatched.&quot;;
+    testRunner.notifyDone();
+}
+
+function startTest()
+{
+    var forceSensor = document.getElementById(&quot;forceSensor&quot;);
+    forceSensor.addEventListener(&quot;webkitmouseforcechanged&quot;, forceChanged, false);
+
+    if (window.testRunner) {
+        testRunner.dumpAsText();
+        testRunner.waitUntilDone();
+    }
+
+    if (window.eventSender) {
+        eventSender.mouseMoveTo(100, 100);
+        eventSender.mouseForceChanged(1.5);
+    }
+}
+&lt;/script&gt;
+&lt;/head&gt;
+
+&lt;body onload=&quot;startTest()&quot;&gt;
+
+&lt;div id=&quot;forceSensor&quot;&gt;&lt;/div&gt;
+&lt;pre id=&quot;console&quot;&gt;Failed. This test must be run in the test harness.&lt;/pre&gt;
+
+&lt;/body&gt;
+&lt;/html&gt;
</ins><span class="cx">\ No newline at end of file
</span></span></pre></div>
<a id="trunkLayoutTestsfasteventsmouseforcedownexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/events/mouse-force-down-expected.txt (0 => 182912)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/events/mouse-force-down-expected.txt                                (rev 0)
+++ trunk/LayoutTests/fast/events/mouse-force-down-expected.txt        2015-04-16 22:18:35 UTC (rev 182912)
</span><span class="lines">@@ -0,0 +1 @@
</span><ins>+Success! The mouseforcedown event was dispatched.
</ins></span></pre></div>
<a id="trunkLayoutTestsfasteventsmouseforcedownhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/events/mouse-force-down.html (0 => 182912)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/events/mouse-force-down.html                                (rev 0)
+++ trunk/LayoutTests/fast/events/mouse-force-down.html        2015-04-16 22:18:35 UTC (rev 182912)
</span><span class="lines">@@ -0,0 +1,43 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;style&gt;
+#forceSensor {
+    width: 200px;
+    height: 200px;
+    border: 2px solid black;
+}
+&lt;/style&gt;
+&lt;script&gt;
+
+function forceDown()
+{
+    var console = document.getElementById(&quot;console&quot;);
+    console.innerHTML = &quot;Success! The mouseforcedown event was dispatched.&quot;;
+    testRunner.notifyDone();
+}
+
+function startTest()
+{
+    var forceSensor = document.getElementById(&quot;forceSensor&quot;);
+    forceSensor.addEventListener(&quot;webkitmouseforcedown&quot;, forceDown, false);
+
+    if (window.testRunner) {
+        testRunner.dumpAsText();
+        testRunner.waitUntilDone();
+    }
+
+    if (window.eventSender) {
+        eventSender.mouseMoveTo(100, 100);
+        eventSender.mouseForceDown();
+    }
+}
+&lt;/script&gt;
+&lt;/head&gt;
+
+&lt;body onload=&quot;startTest()&quot;&gt;
+
+&lt;div id=&quot;forceSensor&quot;&gt;&lt;/div&gt;
+&lt;pre id=&quot;console&quot;&gt;Failed. This test must be run in the test harness.&lt;/pre&gt;
+
+&lt;/body&gt;
+&lt;/html&gt;
</ins><span class="cx">\ No newline at end of file
</span></span></pre></div>
<a id="trunkLayoutTestsfasteventsmouseforceupexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/events/mouse-force-up-expected.txt (0 => 182912)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/events/mouse-force-up-expected.txt                                (rev 0)
+++ trunk/LayoutTests/fast/events/mouse-force-up-expected.txt        2015-04-16 22:18:35 UTC (rev 182912)
</span><span class="lines">@@ -0,0 +1 @@
</span><ins>+Success! The mouseforceup event was dispatched.
</ins></span></pre></div>
<a id="trunkLayoutTestsfasteventsmouseforceuphtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/events/mouse-force-up.html (0 => 182912)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/events/mouse-force-up.html                                (rev 0)
+++ trunk/LayoutTests/fast/events/mouse-force-up.html        2015-04-16 22:18:35 UTC (rev 182912)
</span><span class="lines">@@ -0,0 +1,44 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;style&gt;
+#forceSensor {
+    width: 200px;
+    height: 200px;
+    border: 2px solid black;
+}
+&lt;/style&gt;
+&lt;script&gt;
+
+function forceUp()
+{
+    var console = document.getElementById(&quot;console&quot;);
+    console.innerHTML = &quot;Success! The mouseforceup event was dispatched.&quot;;
+    testRunner.notifyDone();
+}
+
+function startTest()
+{
+    var forceSensor = document.getElementById(&quot;forceSensor&quot;);
+    forceSensor.addEventListener(&quot;webkitmouseforceup&quot;, forceUp, false);
+
+    if (window.testRunner) {
+        testRunner.dumpAsText();
+        testRunner.waitUntilDone();
+    }
+
+    if (window.eventSender) {
+        eventSender.mouseMoveTo(100, 100);
+        eventSender.mouseForceDown();
+        eventSender.mouseForceUp();
+    }
+}
+&lt;/script&gt;
+&lt;/head&gt;
+
+&lt;body onload=&quot;startTest()&quot;&gt;
+
+&lt;div id=&quot;forceSensor&quot;&gt;&lt;/div&gt;
+&lt;pre id=&quot;console&quot;&gt;Failed. This test must be run in the test harness.&lt;/pre&gt;
+
+&lt;/body&gt;
+&lt;/html&gt;
</ins><span class="cx">\ No newline at end of file
</span></span></pre></div>
<a id="trunkLayoutTestsplatformeflTestExpectations"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/platform/efl/TestExpectations (182911 => 182912)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/platform/efl/TestExpectations        2015-04-16 21:35:30 UTC (rev 182911)
+++ trunk/LayoutTests/platform/efl/TestExpectations        2015-04-16 22:18:35 UTC (rev 182912)
</span><span class="lines">@@ -68,6 +68,11 @@
</span><span class="cx"> animations/trigger-container-scroll-simple.html [ Skip ]
</span><span class="cx"> animations/trigger-container-scroll-boundaries.html [ Skip ]
</span><span class="cx"> 
</span><ins>+# No support for force events
+fast/events/mouse-force-changed.html [ Skip ]
+fast/events/mouse-force-down.html [ Skip ]
+fast/events/mouse-force-up.html [ Skip ]
+
</ins><span class="cx"> # ----------------------------------------
</span><span class="cx"> # Tests which also fail in other platforms
</span><span class="cx"> # ----------------------------------------
</span></span></pre></div>
<a id="trunkLayoutTestsplatformgtkTestExpectations"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/platform/gtk/TestExpectations (182911 => 182912)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/platform/gtk/TestExpectations        2015-04-16 21:35:30 UTC (rev 182911)
+++ trunk/LayoutTests/platform/gtk/TestExpectations        2015-04-16 22:18:35 UTC (rev 182912)
</span><span class="lines">@@ -638,6 +638,11 @@
</span><span class="cx"> 
</span><span class="cx"> webkit.org/b/143703 fast/forms/listbox-visible-size.html [ Failure ]
</span><span class="cx"> 
</span><ins>+# No support for force events
+fast/events/mouse-force-changed.html [ Skip ]
+fast/events/mouse-force-down.html [ Skip ]
+fast/events/mouse-force-up.html [ Skip ]
+
</ins><span class="cx"> #////////////////////////////////////////////////////////////////////////////////////////
</span><span class="cx"> # End of Expected failures
</span><span class="cx"> #////////////////////////////////////////////////////////////////////////////////////////
</span></span></pre></div>
<a id="trunkLayoutTestsplatformiossimulatorTestExpectations"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/platform/ios-simulator/TestExpectations (182911 => 182912)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/platform/ios-simulator/TestExpectations        2015-04-16 21:35:30 UTC (rev 182911)
+++ trunk/LayoutTests/platform/ios-simulator/TestExpectations        2015-04-16 22:18:35 UTC (rev 182912)
</span><span class="lines">@@ -204,6 +204,11 @@
</span><span class="cx"> http/tests/local/fileapi/send-dragged-file.html
</span><span class="cx"> http/tests/local/fileapi/send-sliced-dragged-file.html
</span><span class="cx"> 
</span><ins>+# No support for force events
+fast/events/mouse-force-changed.html [ Skip ]
+fast/events/mouse-force-down.html [ Skip ]
+fast/events/mouse-force-up.html [ Skip ]
+
</ins><span class="cx"> ###
</span><span class="cx"> # Known failures
</span><span class="cx"> ##
</span></span></pre></div>
<a id="trunkLayoutTestsplatformmacmavericksTestExpectations"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/platform/mac-mavericks/TestExpectations (182911 => 182912)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/platform/mac-mavericks/TestExpectations        2015-04-16 21:35:30 UTC (rev 182911)
+++ trunk/LayoutTests/platform/mac-mavericks/TestExpectations        2015-04-16 22:18:35 UTC (rev 182912)
</span><span class="lines">@@ -1,2 +1,7 @@
</span><span class="cx"> # https://bugs.webkit.org/show_bug.cgi?id=143258
</span><span class="cx"> http/tests/cache/disk-cache/disk-cache-validation-back-navigation-policy.html
</span><ins>+
+# No support for force events
+fast/events/mouse-force-changed.html [ Skip ]
+fast/events/mouse-force-down.html [ Skip ]
+fast/events/mouse-force-up.html [ Skip ]
</ins></span></pre></div>
<a id="trunkLayoutTestsplatformwinTestExpectations"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/platform/win/TestExpectations (182911 => 182912)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/platform/win/TestExpectations        2015-04-16 21:35:30 UTC (rev 182911)
+++ trunk/LayoutTests/platform/win/TestExpectations        2015-04-16 22:18:35 UTC (rev 182912)
</span><span class="lines">@@ -603,6 +603,11 @@
</span><span class="cx"> animations/trigger-container-scroll-simple.html [ Skip ]
</span><span class="cx"> animations/trigger-container-scroll-boundaries.html [ Skip ]
</span><span class="cx"> 
</span><ins>+# No support for force events
+fast/events/mouse-force-changed.html [ Skip ]
+fast/events/mouse-force-down.html [ Skip ]
+fast/events/mouse-force-up.html [ Skip ]
+
</ins><span class="cx"> ################################################################################
</span><span class="cx"> ###########    End Missing Functionality Prevents Testing         ##############
</span><span class="cx"> ################################################################################
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (182911 => 182912)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-04-16 21:35:30 UTC (rev 182911)
+++ trunk/Source/WebCore/ChangeLog        2015-04-16 22:18:35 UTC (rev 182912)
</span><span class="lines">@@ -1,3 +1,47 @@
</span><ins>+2015-04-16  Beth Dakin  &lt;bdakin@apple.com&gt;
+
+        Force mouse events should go through normal mouse event handling code paths
+        https://bugs.webkit.org/show_bug.cgi?id=143749
+        -and corresponding-
+        rdar://problem/20472895
+
+        Reviewed by Dean Jackson.
+
+        This patch moves all of the code to dispatch mouseforcedown, mouseforceup, and 
+        mouseforcechanged into normal mouse event dispatching code. This patch leaves 
+        behind the cancel and click events because we plan to remove those, and it also 
+        leaves mouseforcewillbegin because that is necessarily a very different event more 
+        tied to the NSImmediateActionGestureRecognizer than these other events which are 
+        tied to NSResponder’s pressureChangeWithEvent.
+
+        New helper functions.
+        * dom/Document.cpp:
+        (WebCore::Document::hasListenerTypeForEventType):
+        * dom/Document.h:
+        * dom/Element.cpp:
+        (WebCore::isForceEvent):
+
+        Move the code to ensure the force events have listeners in order to fire to 
+        dispatchMouseEvent, and delete the old implementations.
+        (WebCore::Element::dispatchMouseEvent):
+        (WebCore::Element::dispatchMouseForceChanged): Deleted.
+        (WebCore::Element::dispatchMouseForceDown): Deleted.
+        (WebCore::Element::dispatchMouseForceUp): Deleted.
+        * dom/Element.h:
+
+        Perform a hit test and pipe the events through dispatchMouseEvent(). 
+        * page/EventHandler.cpp:
+        (WebCore::EventHandler::handleMouseForceEvent):
+        * page/EventHandler.h:
+
+        New types for the new events.
+        * platform/PlatformEvent.h:
+
+        Forward to EventHandler. 
+        * replay/UserInputBridge.cpp:
+        (WebCore::UserInputBridge::handleMouseForceEvent):
+        * replay/UserInputBridge.h:
+
</ins><span class="cx"> 2015-04-16  Tim Horton  &lt;timothy_horton@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Sites with both width=device-width and height=device-height load zoomed out
</span></span></pre></div>
<a id="trunkSourceWebCoredomDocumentcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/Document.cpp (182911 => 182912)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/Document.cpp        2015-04-16 21:35:30 UTC (rev 182911)
+++ trunk/Source/WebCore/dom/Document.cpp        2015-04-16 22:18:35 UTC (rev 182912)
</span><span class="lines">@@ -3966,6 +3966,22 @@
</span><span class="cx">     return nullptr;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool Document::hasListenerTypeForEventType(PlatformEvent::Type eventType) const
+{
+    switch (eventType) {
+    case PlatformEvent::MouseForceChanged:
+        return m_listenerTypes &amp; Document::FORCECHANGED_LISTENER;
+    case PlatformEvent::MouseForceDown:
+        return m_listenerTypes &amp; Document::FORCEDOWN_LISTENER;
+    case PlatformEvent::MouseForceUp:
+        return m_listenerTypes &amp; Document::FORCEUP_LISTENER;
+    case PlatformEvent::MouseScroll:
+        return m_listenerTypes &amp; Document::SCROLL_LISTENER;
+    default:
+        return false;
+    }
+}
+
</ins><span class="cx"> void Document::addListenerTypeIfNeeded(const AtomicString&amp; eventType)
</span><span class="cx"> {
</span><span class="cx">     if (eventType == eventNames().DOMSubtreeModifiedEvent)
</span></span></pre></div>
<a id="trunkSourceWebCoredomDocumenth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/Document.h (182911 => 182912)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/Document.h        2015-04-16 21:35:30 UTC (rev 182911)
+++ trunk/Source/WebCore/dom/Document.h        2015-04-16 22:18:35 UTC (rev 182912)
</span><span class="lines">@@ -38,6 +38,7 @@
</span><span class="cx"> #include &quot;FontSelector.h&quot;
</span><span class="cx"> #include &quot;MutationObserver.h&quot;
</span><span class="cx"> #include &quot;PageVisibilityState.h&quot;
</span><ins>+#include &quot;PlatformEvent.h&quot;
</ins><span class="cx"> #include &quot;PlatformScreen.h&quot;
</span><span class="cx"> #include &quot;ReferrerPolicy.h&quot;
</span><span class="cx"> #include &quot;Region.h&quot;
</span><span class="lines">@@ -780,6 +781,7 @@
</span><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     bool hasListenerType(ListenerType listenerType) const { return (m_listenerTypes &amp; listenerType); }
</span><ins>+    bool hasListenerTypeForEventType(PlatformEvent::Type) const;
</ins><span class="cx">     void addListenerTypeIfNeeded(const AtomicString&amp; eventType);
</span><span class="cx"> 
</span><span class="cx">     bool hasMutationObserversOfType(MutationObserver::MutationType type) const
</span></span></pre></div>
<a id="trunkSourceWebCoredomElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/Element.cpp (182911 => 182912)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/Element.cpp        2015-04-16 21:35:30 UTC (rev 182911)
+++ trunk/Source/WebCore/dom/Element.cpp        2015-04-16 22:18:35 UTC (rev 182912)
</span><span class="lines">@@ -244,11 +244,19 @@
</span><span class="cx">     return computeEditability(UserSelectAllIsAlwaysNonEditable, ShouldUpdateStyle::Update) != Editability::ReadOnly;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+static bool isForceEvent(const PlatformMouseEvent&amp; platformEvent)
+{
+    return platformEvent.type() == PlatformEvent::MouseForceChanged || platformEvent.type() == PlatformEvent::MouseForceDown || platformEvent.type() == PlatformEvent::MouseForceUp;
+}
+
</ins><span class="cx"> bool Element::dispatchMouseEvent(const PlatformMouseEvent&amp; platformEvent, const AtomicString&amp; eventType, int detail, Element* relatedTarget)
</span><span class="cx"> {
</span><span class="cx">     if (isDisabledFormControl())
</span><span class="cx">         return false;
</span><span class="cx"> 
</span><ins>+    if (isForceEvent(platformEvent) &amp;&amp; !document().hasListenerTypeForEventType(platformEvent.type()))
+        return false;
+
</ins><span class="cx">     RefPtr&lt;MouseEvent&gt; mouseEvent = MouseEvent::create(eventType, document().defaultView(), platformEvent, detail, relatedTarget);
</span><span class="cx"> 
</span><span class="cx">     if (mouseEvent-&gt;type().isEmpty())
</span><span class="lines">@@ -2253,54 +2261,6 @@
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Element::dispatchMouseForceChanged(float force)
-{
-    if (!document().hasListenerType(Document::FORCECHANGED_LISTENER))
-        return;
-
-    Frame* frame = document().frame();
-    if (!frame)
-        return;
-
-    PlatformMouseEvent platformMouseEvent(frame-&gt;eventHandler().lastKnownMousePosition(), frame-&gt;eventHandler().lastKnownMouseGlobalPosition(), NoButton, PlatformEvent::NoType, 1, false, false, false, false, WTF::currentTime(), force);
-    RefPtr&lt;MouseEvent&gt; mouseForceChangedEvent =  MouseEvent::create(eventNames().webkitmouseforcechangedEvent, document().defaultView(), platformMouseEvent, 0, nullptr);
-
-    mouseForceChangedEvent-&gt;setTarget(this);
-    dispatchEvent(mouseForceChangedEvent);
-}
-
-void Element::dispatchMouseForceDown()
-{
-    if (!document().hasListenerType(Document::FORCEDOWN_LISTENER))
-        return;
-
-    Frame* frame = document().frame();
-    if (!frame)
-        return;
-
-    PlatformMouseEvent platformMouseEvent(frame-&gt;eventHandler().lastKnownMousePosition(), frame-&gt;eventHandler().lastKnownMouseGlobalPosition(), NoButton, PlatformEvent::NoType, 1, false, false, false, false, WTF::currentTime(), ForceAtForceClick);
-    RefPtr&lt;MouseEvent&gt; mouseForceDownEvent =  MouseEvent::create(eventNames().webkitmouseforcedownEvent, document().defaultView(), platformMouseEvent, 0, nullptr);
-
-    mouseForceDownEvent-&gt;setTarget(this);
-    dispatchEvent(mouseForceDownEvent);
-}
-
-void Element::dispatchMouseForceUp()
-{
-    if (!document().hasListenerType(Document::FORCEUP_LISTENER))
-        return;
-
-    Frame* frame = document().frame();
-    if (!frame)
-        return;
-
-    PlatformMouseEvent platformMouseEvent(frame-&gt;eventHandler().lastKnownMousePosition(), frame-&gt;eventHandler().lastKnownMouseGlobalPosition(), NoButton, PlatformEvent::NoType, 1, false, false, false, false, WTF::currentTime(), ForceAtForceClick);
-    RefPtr&lt;MouseEvent&gt; mouseForceUpEvent =  MouseEvent::create(eventNames().webkitmouseforceupEvent, document().defaultView(), platformMouseEvent, 0, nullptr);
-
-    mouseForceUpEvent-&gt;setTarget(this);
-    dispatchEvent(mouseForceUpEvent);
-}
-
</del><span class="cx"> void Element::dispatchMouseForceClick()
</span><span class="cx"> {
</span><span class="cx">     if (!document().hasListenerType(Document::FORCECLICK_LISTENER))
</span><span class="lines">@@ -2340,18 +2300,6 @@
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Element::dispatchMouseForceChanged(float)
-{
-}
-
-void Element::dispatchMouseForceDown()
-{
-}
-
-void Element::dispatchMouseForceUp()
-{
-}
-
</del><span class="cx"> void Element::dispatchMouseForceClick()
</span><span class="cx"> {
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoredomElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/Element.h (182911 => 182912)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/Element.h        2015-04-16 21:35:30 UTC (rev 182911)
+++ trunk/Source/WebCore/dom/Element.h        2015-04-16 22:18:35 UTC (rev 182912)
</span><span class="lines">@@ -469,9 +469,6 @@
</span><span class="cx">     virtual void dispatchBlurEvent(RefPtr&lt;Element&gt;&amp;&amp; newFocusedElement);
</span><span class="cx"> 
</span><span class="cx">     WEBCORE_EXPORT bool dispatchMouseForceWillBegin();
</span><del>-    WEBCORE_EXPORT void dispatchMouseForceChanged(float force);
-    WEBCORE_EXPORT void dispatchMouseForceDown();
-    WEBCORE_EXPORT void dispatchMouseForceUp();
</del><span class="cx">     WEBCORE_EXPORT void dispatchMouseForceClick();
</span><span class="cx">     WEBCORE_EXPORT void dispatchMouseForceCancelled();
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorepageEventHandlercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/EventHandler.cpp (182911 => 182912)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/EventHandler.cpp        2015-04-16 21:35:30 UTC (rev 182911)
+++ trunk/Source/WebCore/page/EventHandler.cpp        2015-04-16 22:18:35 UTC (rev 182912)
</span><span class="lines">@@ -2104,6 +2104,33 @@
</span><span class="cx">     return swallowMouseUpEvent || swallowClickEvent || swallowMouseReleaseEvent;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+#if ENABLE(MOUSE_FORCE_EVENTS)
+bool EventHandler::handleMouseForceEvent(const PlatformMouseEvent&amp; event)
+{
+    RefPtr&lt;FrameView&gt; protector(m_frame.view());
+
+    setLastKnownMousePosition(event);
+
+    HitTestRequest::HitTestRequestType hitType = HitTestRequest::DisallowShadowContent | HitTestRequest::Active;
+
+    HitTestRequest request(hitType);
+    MouseEventWithHitTestResults mouseEvent = prepareMouseEvent(request, event);
+
+    bool swallowedEvent = !dispatchMouseEvent(eventNames().webkitmouseforcechangedEvent, mouseEvent.targetNode(), false, 0, event, false);
+    if (event.type() == PlatformEvent::MouseForceDown)
+        swallowedEvent |= !dispatchMouseEvent(eventNames().webkitmouseforcedownEvent, mouseEvent.targetNode(), false, 0, event, false);
+    if (event.type() == PlatformEvent::MouseForceUp)
+        swallowedEvent |= !dispatchMouseEvent(eventNames().webkitmouseforceupEvent, mouseEvent.targetNode(), false, 0, event, false);
+
+    return swallowedEvent;
+}
+#else
+bool EventHandler::handleMouseForceEvent(const PlatformMouseEvent&amp; )
+{
+    return false;
+}
+#endif // #if ENABLE(MOUSE_FORCE_EVENTS)
+
</ins><span class="cx"> bool EventHandler::handlePasteGlobalSelection(const PlatformMouseEvent&amp; platformMouseEvent)
</span><span class="cx"> {
</span><span class="cx">     // If the event was a middle click, attempt to copy global selection in after
</span></span></pre></div>
<a id="trunkSourceWebCorepageEventHandlerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/EventHandler.h (182911 => 182912)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/EventHandler.h        2015-04-16 21:35:30 UTC (rev 182911)
+++ trunk/Source/WebCore/page/EventHandler.h        2015-04-16 22:18:35 UTC (rev 182912)
</span><span class="lines">@@ -202,6 +202,7 @@
</span><span class="cx">     WEBCORE_EXPORT bool handleMousePressEvent(const PlatformMouseEvent&amp;);
</span><span class="cx">     bool handleMouseMoveEvent(const PlatformMouseEvent&amp;, HitTestResult* hoveredNode = 0, bool onlyUpdateScrollbars = false);
</span><span class="cx">     WEBCORE_EXPORT bool handleMouseReleaseEvent(const PlatformMouseEvent&amp;);
</span><ins>+    bool handleMouseForceEvent(const PlatformMouseEvent&amp;);
</ins><span class="cx">     WEBCORE_EXPORT bool handleWheelEvent(const PlatformWheelEvent&amp;);
</span><span class="cx">     void defaultWheelEventHandler(Node*, WheelEvent*);
</span><span class="cx">     bool handlePasteGlobalSelection(const PlatformMouseEvent&amp;);
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformPlatformEventh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/PlatformEvent.h (182911 => 182912)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/PlatformEvent.h        2015-04-16 21:35:30 UTC (rev 182911)
+++ trunk/Source/WebCore/platform/PlatformEvent.h        2015-04-16 22:18:35 UTC (rev 182912)
</span><span class="lines">@@ -43,6 +43,9 @@
</span><span class="cx">         MouseMoved,
</span><span class="cx">         MousePressed,
</span><span class="cx">         MouseReleased,
</span><ins>+        MouseForceChanged,
+        MouseForceDown,
+        MouseForceUp,
</ins><span class="cx">         MouseScroll,
</span><span class="cx"> 
</span><span class="cx">         // PlatformWheelEvent
</span></span></pre></div>
<a id="trunkSourceWebCorereplayUserInputBridgecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/replay/UserInputBridge.cpp (182911 => 182912)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/replay/UserInputBridge.cpp        2015-04-16 21:35:30 UTC (rev 182911)
+++ trunk/Source/WebCore/replay/UserInputBridge.cpp        2015-04-16 22:18:35 UTC (rev 182912)
</span><span class="lines">@@ -147,6 +147,11 @@
</span><span class="cx">     return m_page.mainFrame().eventHandler().passMouseMovedEventToScrollbars(mouseEvent);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool UserInputBridge::handleMouseForceEvent(const PlatformMouseEvent&amp; mouseEvent, InputSource)
+{
+    return m_page.mainFrame().eventHandler().handleMouseForceEvent(mouseEvent);
+}
+
</ins><span class="cx"> bool UserInputBridge::handleKeyEvent(const PlatformKeyboardEvent&amp; keyEvent, InputSource inputSource)
</span><span class="cx"> {
</span><span class="cx"> #if ENABLE(WEB_REPLAY)
</span></span></pre></div>
<a id="trunkSourceWebCorereplayUserInputBridgeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/replay/UserInputBridge.h (182911 => 182912)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/replay/UserInputBridge.h        2015-04-16 21:35:30 UTC (rev 182911)
+++ trunk/Source/WebCore/replay/UserInputBridge.h        2015-04-16 22:18:35 UTC (rev 182912)
</span><span class="lines">@@ -78,6 +78,7 @@
</span><span class="cx">     WEBCORE_EXPORT bool handleMouseReleaseEvent(const PlatformMouseEvent&amp;, InputSource source = InputSource::User);
</span><span class="cx">     WEBCORE_EXPORT bool handleMouseMoveEvent(const PlatformMouseEvent&amp;, InputSource source = InputSource::User);
</span><span class="cx">     WEBCORE_EXPORT bool handleMouseMoveOnScrollbarEvent(const PlatformMouseEvent&amp;, InputSource source = InputSource::User);
</span><ins>+    WEBCORE_EXPORT bool handleMouseForceEvent(const PlatformMouseEvent&amp;, InputSource = InputSource::User);
</ins><span class="cx">     WEBCORE_EXPORT bool handleWheelEvent(const PlatformWheelEvent&amp;, InputSource source = InputSource::User);
</span><span class="cx">     WEBCORE_EXPORT bool handleKeyEvent(const PlatformKeyboardEvent&amp;, InputSource source = InputSource::User);
</span><span class="cx">     WEBCORE_EXPORT bool handleAccessKeyEvent(const PlatformKeyboardEvent&amp;, InputSource source = InputSource::User);
</span></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (182911 => 182912)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2015-04-16 21:35:30 UTC (rev 182911)
+++ trunk/Source/WebKit2/ChangeLog        2015-04-16 22:18:35 UTC (rev 182912)
</span><span class="lines">@@ -1,3 +1,62 @@
</span><ins>+2015-04-16  Beth Dakin  &lt;bdakin@apple.com&gt;
+
+        Force mouse events should go through normal mouse event handling code paths
+        https://bugs.webkit.org/show_bug.cgi?id=143749
+        -and corresponding-
+        rdar://problem/20472895
+
+        Reviewed by Dean Jackson.
+
+        This patch makes pressureChangeWithEvent create NativeWebMouseEvents with the 
+        NSEventTypePressures that is gets and sends those down to the web process.
+
+        Re-name pressureEvent to lastPressureEvent. Now that event can sometimes be an 
+        NSEventTypePressure, the new name makes it clear how the second parameter differs 
+        from the first.
+        * Shared/NativeWebMouseEvent.h:
+
+        New event types for the new types of events.
+        * Shared/WebEvent.h:
+        * Shared/WebEventConversion.cpp:
+        (WebKit::WebKit2PlatformMouseEvent::WebKit2PlatformMouseEvent):
+        * Shared/mac/NativeWebMouseEventMac.mm:
+        (WebKit::NativeWebMouseEvent::NativeWebMouseEvent):
+        * Shared/mac/WebEventFactory.h:
+
+        All of the square-peg, round-hole problems of massaging the NSEventTypePressures 
+        events into WebMouseEvents is taken care of here.
+        * Shared/mac/WebEventFactory.mm:
+        (WebKit::mouseButtonForEvent):
+        (WebKit::globalPointForEvent):
+        (WebKit::pointForEvent):
+        (WebKit::WebEventFactory::createWebMouseEvent):
+
+        Instead of calling the old inputDeviceForceDidChange, create a NativeWebMouseEvent 
+        and handle it.
+        * UIProcess/API/mac/WKView.mm:
+        (-[WKView pressureChangeWithEvent:]):
+
+        Handle the new types.
+        * UIProcess/WebPageProxy.cpp:
+        (WebKit::WebPageProxy::didReceiveEvent):
+
+        Can delete inputDeviceForceDidChange since it’s no longer used.
+        (WebKit::WebPageProxy::inputDeviceForceDidChange): Deleted.
+        * UIProcess/WebPageProxy.h:
+
+        Handle the new types of mouse events properly.
+        * WebProcess/WebPage/WebPage.cpp:
+        (WebKit::handleMouseEvent):
+
+        Delete inputDeviceForceDidChange() and m_lastForceStage.
+        * WebProcess/WebPage/WebPage.h:
+        * WebProcess/WebPage/WebPage.messages.in:
+        * WebProcess/WebPage/mac/WebPageMac.mm:
+        (WebKit::WebPage::inputDeviceForceDidChange): Deleted.
+
+        Handle new WebEvent types.
+        * WebProcess/Plugins/Netscape/x11/NetscapePluginX11.cpp:
+
</ins><span class="cx"> 2015-04-16  Dan Bernstein  &lt;mitz@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         &lt;rdar://problem/20575744&gt; Also include a definition of __NSd_{current deployment target} in WKFoundation.h.
</span></span></pre></div>
<a id="trunkSourceWebKit2SharedNativeWebMouseEventh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Shared/NativeWebMouseEvent.h (182911 => 182912)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Shared/NativeWebMouseEvent.h        2015-04-16 21:35:30 UTC (rev 182911)
+++ trunk/Source/WebKit2/Shared/NativeWebMouseEvent.h        2015-04-16 22:18:35 UTC (rev 182912)
</span><span class="lines">@@ -49,7 +49,7 @@
</span><span class="cx"> class NativeWebMouseEvent : public WebMouseEvent {
</span><span class="cx"> public:
</span><span class="cx"> #if USE(APPKIT)
</span><del>-    NativeWebMouseEvent(NSEvent *, NSEvent *pressureEvent, NSView *);
</del><ins>+    NativeWebMouseEvent(NSEvent *, NSEvent *lastPressureEvent, NSView *);
</ins><span class="cx"> #elif PLATFORM(GTK)
</span><span class="cx">     NativeWebMouseEvent(const NativeWebMouseEvent&amp;);
</span><span class="cx">     NativeWebMouseEvent(GdkEvent*, int);
</span></span></pre></div>
<a id="trunkSourceWebKit2SharedWebEventh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Shared/WebEvent.h (182911 => 182912)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Shared/WebEvent.h        2015-04-16 21:35:30 UTC (rev 182911)
+++ trunk/Source/WebKit2/Shared/WebEvent.h        2015-04-16 22:18:35 UTC (rev 182912)
</span><span class="lines">@@ -58,6 +58,9 @@
</span><span class="cx">         MouseDown,
</span><span class="cx">         MouseUp,
</span><span class="cx">         MouseMove,
</span><ins>+        MouseForceChanged,
+        MouseForceDown,
+        MouseForceUp,
</ins><span class="cx"> 
</span><span class="cx">         // WebWheelEvent
</span><span class="cx">         Wheel,
</span></span></pre></div>
<a id="trunkSourceWebKit2SharedWebEventConversioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Shared/WebEventConversion.cpp (182911 => 182912)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Shared/WebEventConversion.cpp        2015-04-16 21:35:30 UTC (rev 182911)
+++ trunk/Source/WebKit2/Shared/WebEventConversion.cpp        2015-04-16 22:18:35 UTC (rev 182912)
</span><span class="lines">@@ -48,6 +48,18 @@
</span><span class="cx">             m_type = WebCore::PlatformEvent::MouseMoved;
</span><span class="cx">             m_force = webEvent.force();
</span><span class="cx">             break;
</span><ins>+        case WebEvent::MouseForceChanged:
+            m_type = WebCore::PlatformEvent::MouseForceChanged;
+            m_force = webEvent.force();
+            break;
+        case WebEvent::MouseForceDown:
+            m_type = WebCore::PlatformEvent::MouseForceDown;
+            m_force = WebCore::ForceAtForceClick;
+            break;
+        case WebEvent::MouseForceUp:
+            m_type = WebCore::PlatformEvent::MouseForceUp;
+            m_force = WebCore::ForceAtForceClick;
+            break;
</ins><span class="cx">         default:
</span><span class="cx">             ASSERT_NOT_REACHED();
</span><span class="cx">         }
</span></span></pre></div>
<a id="trunkSourceWebKit2SharedmacNativeWebMouseEventMacmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Shared/mac/NativeWebMouseEventMac.mm (182911 => 182912)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Shared/mac/NativeWebMouseEventMac.mm        2015-04-16 21:35:30 UTC (rev 182911)
+++ trunk/Source/WebKit2/Shared/mac/NativeWebMouseEventMac.mm        2015-04-16 22:18:35 UTC (rev 182912)
</span><span class="lines">@@ -32,8 +32,8 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebKit {
</span><span class="cx"> 
</span><del>-NativeWebMouseEvent::NativeWebMouseEvent(NSEvent *event, NSEvent *pressureEvent, NSView *view)
-    : WebMouseEvent(WebEventFactory::createWebMouseEvent(event, pressureEvent, view))
</del><ins>+NativeWebMouseEvent::NativeWebMouseEvent(NSEvent *event, NSEvent *lastPressureEvent, NSView *view)
+    : WebMouseEvent(WebEventFactory::createWebMouseEvent(event, lastPressureEvent, view))
</ins><span class="cx">     , m_nativeEvent(event)
</span><span class="cx"> {
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebKit2SharedmacWebEventFactoryh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Shared/mac/WebEventFactory.h (182911 => 182912)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Shared/mac/WebEventFactory.h        2015-04-16 21:35:30 UTC (rev 182911)
+++ trunk/Source/WebKit2/Shared/mac/WebEventFactory.h        2015-04-16 22:18:35 UTC (rev 182912)
</span><span class="lines">@@ -42,7 +42,7 @@
</span><span class="cx"> class WebEventFactory {
</span><span class="cx"> public:
</span><span class="cx"> #if USE(APPKIT)
</span><del>-    static WebMouseEvent createWebMouseEvent(NSEvent *, NSEvent *pressureEvent, NSView *windowView);
</del><ins>+    static WebMouseEvent createWebMouseEvent(NSEvent *, NSEvent *lastPressureEvent, NSView *windowView);
</ins><span class="cx">     static WebWheelEvent createWebWheelEvent(NSEvent *, NSView *windowView);
</span><span class="cx">     static WebKeyboardEvent createWebKeyboardEvent(NSEvent *, bool handledByInputMethod, const Vector&lt;WebCore::KeypressCommand&gt;&amp;);
</span><span class="cx">     static bool shouldBeHandledAsContextClick(const WebCore::PlatformMouseEvent&amp;);
</span></span></pre></div>
<a id="trunkSourceWebKit2SharedmacWebEventFactorymm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Shared/mac/WebEventFactory.mm (182911 => 182912)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Shared/mac/WebEventFactory.mm        2015-04-16 21:35:30 UTC (rev 182911)
+++ trunk/Source/WebKit2/Shared/mac/WebEventFactory.mm        2015-04-16 22:18:35 UTC (rev 182912)
</span><span class="lines">@@ -76,6 +76,9 @@
</span><span class="cx">         case NSOtherMouseUp:
</span><span class="cx">         case NSOtherMouseDragged:
</span><span class="cx">             return WebMouseEvent::MiddleButton;
</span><ins>+#if __MAC_OS_X_VERSION_MAX_ALLOWED &gt;= 101003
+        case NSEventTypePressure:
+#endif
</ins><span class="cx">         case NSMouseEntered:
</span><span class="cx">         case NSMouseExited:
</span><span class="cx">             return currentMouseButton();
</span><span class="lines">@@ -156,51 +159,57 @@
</span><span class="cx"> static NSPoint globalPointForEvent(NSEvent *event)
</span><span class="cx"> {
</span><span class="cx">     switch ([event type]) {
</span><del>-        case NSLeftMouseDown:
-        case NSLeftMouseDragged:
-        case NSLeftMouseUp:
-        case NSMouseEntered:
-        case NSMouseExited:
-        case NSMouseMoved:
-        case NSOtherMouseDown:
-        case NSOtherMouseDragged:
-        case NSOtherMouseUp:
-        case NSRightMouseDown:
-        case NSRightMouseDragged:
-        case NSRightMouseUp:
-        case NSScrollWheel:
-            return globalPoint([event locationInWindow], [event window]);
-        default:
-            return NSZeroPoint;
</del><ins>+#if __MAC_OS_X_VERSION_MAX_ALLOWED &gt;= 101003
+    case NSEventTypePressure:
+#endif
+    case NSLeftMouseDown:
+    case NSLeftMouseDragged:
+    case NSLeftMouseUp:
+    case NSMouseEntered:
+    case NSMouseExited:
+    case NSMouseMoved:
+    case NSOtherMouseDown:
+    case NSOtherMouseDragged:
+    case NSOtherMouseUp:
+    case NSRightMouseDown:
+    case NSRightMouseDragged:
+    case NSRightMouseUp:
+    case NSScrollWheel:
+        return globalPoint([event locationInWindow], [event window]);
+    default:
+        return NSZeroPoint;
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static NSPoint pointForEvent(NSEvent *event, NSView *windowView)
</span><span class="cx"> {
</span><span class="cx">     switch ([event type]) {
</span><del>-        case NSLeftMouseDown:
-        case NSLeftMouseDragged:
-        case NSLeftMouseUp:
-        case NSMouseEntered:
-        case NSMouseExited:
-        case NSMouseMoved:
-        case NSOtherMouseDown:
-        case NSOtherMouseDragged:
-        case NSOtherMouseUp:
-        case NSRightMouseDown:
-        case NSRightMouseDragged:
-        case NSRightMouseUp:
-        case NSScrollWheel: {
-            // Note: This will have its origin at the bottom left of the window unless windowView is flipped.
-            // In those cases, the Y coordinate gets flipped by Widget::convertFromContainingWindow.
-            NSPoint location = [event locationInWindow];
-            if (windowView)
-                location = [windowView convertPoint:location fromView:nil];
-            return location;
-        }
-        default:
-            return NSZeroPoint;
</del><ins>+#if __MAC_OS_X_VERSION_MAX_ALLOWED &gt;= 101003
+    case NSEventTypePressure:
+#endif
+    case NSLeftMouseDown:
+    case NSLeftMouseDragged:
+    case NSLeftMouseUp:
+    case NSMouseEntered:
+    case NSMouseExited:
+    case NSMouseMoved:
+    case NSOtherMouseDown:
+    case NSOtherMouseDragged:
+    case NSOtherMouseUp:
+    case NSRightMouseDown:
+    case NSRightMouseDragged:
+    case NSRightMouseUp:
+    case NSScrollWheel: {
+        // Note: This will have its origin at the bottom left of the window unless windowView is flipped.
+        // In those cases, the Y coordinate gets flipped by Widget::convertFromContainingWindow.
+        NSPoint location = [event locationInWindow];
+        if (windowView)
+            location = [windowView convertPoint:location fromView:nil];
+        return location;
</ins><span class="cx">     }
</span><ins>+    default:
+        return NSZeroPoint;
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static WebWheelEvent::Phase phaseForEvent(NSEvent *event)
</span><span class="lines">@@ -358,25 +367,38 @@
</span><span class="cx">     return (static_cast&lt;NSMenuType&gt;(event.menuTypeForEvent()) == NSMenuTypeContextMenu);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-WebMouseEvent WebEventFactory::createWebMouseEvent(NSEvent *event, NSEvent *pressureEvent, NSView *windowView)
</del><ins>+WebMouseEvent WebEventFactory::createWebMouseEvent(NSEvent *event, NSEvent *lastPressureEvent, NSView *windowView)
</ins><span class="cx"> {
</span><span class="cx">     NSPoint position = pointForEvent(event, windowView);
</span><span class="cx">     NSPoint globalPosition = globalPointForEvent(event);
</span><span class="cx"> 
</span><del>-    WebEvent::Type type                     = mouseEventTypeForEvent(event);
-    WebMouseEvent::Button button            = mouseButtonForEvent(event);
-    float deltaX                            = [event deltaX];
-    float deltaY                            = [event deltaY];
-    float deltaZ                            = [event deltaZ];
-    int clickCount                          = clickCountForEvent(event);
-    WebEvent::Modifiers modifiers           = modifiersForEvent(event);
-    double timestamp                        = eventTimeStampSince1970(event);
-    int eventNumber                         = [event eventNumber];
-    int menuTypeForEvent                    = typeForEvent(event);
</del><ins>+    WebEvent::Type type = mouseEventTypeForEvent(event);
+#if __MAC_OS_X_VERSION_MAX_ALLOWED &gt;= 101003
+    if ([event type] == NSEventTypePressure) {
+        // Since AppKit doesn't send mouse events for force down or force up, we have to use the current pressure
+        // event and lastPressureEvent to detect if this is MouseForceDown, MouseForceUp, or just MouseForceChanged.
+        if (lastPressureEvent.stage == 1 &amp;&amp; event.stage == 2)
+            type = WebEvent::MouseForceDown;
+        else if (lastPressureEvent.stage == 2 &amp;&amp; event.stage == 1)
+            type = WebEvent::MouseForceUp;
+        else
+            type = WebEvent::MouseForceChanged;
+    }
+#endif
</ins><span class="cx"> 
</span><ins>+    WebMouseEvent::Button button = mouseButtonForEvent(event);
+    float deltaX = [event deltaX];
+    float deltaY = [event deltaY];
+    float deltaZ = [event deltaZ];
+    int clickCount = clickCountForEvent(event);
+    WebEvent::Modifiers modifiers = modifiersForEvent(event);
+    double timestamp = eventTimeStampSince1970(event);
+    int eventNumber = [event eventNumber];
+    int menuTypeForEvent = typeForEvent(event);
+
</ins><span class="cx">     double force = 0;
</span><span class="cx"> #if __MAC_OS_X_VERSION_MAX_ALLOWED &gt;= 101003
</span><del>-    force = pressureEvent.stage &lt; 1 ? pressureEvent.pressure : pressureEvent.pressure + pressureEvent.stage - 1;
</del><ins>+    force = lastPressureEvent.stage &lt; 1 ? lastPressureEvent.pressure : lastPressureEvent.pressure + lastPressureEvent.stage - 1;
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     return WebMouseEvent(type, button, IntPoint(position), IntPoint(globalPosition), deltaX, deltaY, deltaZ, clickCount, modifiers, timestamp, force, eventNumber, menuTypeForEvent);
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPImacWKViewmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/mac/WKView.mm (182911 => 182912)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/mac/WKView.mm        2015-04-16 21:35:30 UTC (rev 182911)
+++ trunk/Source/WebKit2/UIProcess/API/mac/WKView.mm        2015-04-16 22:18:35 UTC (rev 182912)
</span><span class="lines">@@ -1431,13 +1431,17 @@
</span><span class="cx">     if (event == _data-&gt;_pressureEvent)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><ins>+    if (_data-&gt;_ignoresNonWheelEvents)
+        return;
+
</ins><span class="cx">     if (event.phase != NSEventPhaseChanged &amp;&amp; event.phase != NSEventPhaseBegan &amp;&amp; event.phase != NSEventPhaseEnded)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><ins>+    NativeWebMouseEvent webEvent(event, _data-&gt;_pressureEvent, self);
+    _data-&gt;_page-&gt;handleMouseEvent(webEvent);
+
</ins><span class="cx">     [_data-&gt;_pressureEvent release];
</span><span class="cx">     _data-&gt;_pressureEvent = [event retain];
</span><del>-
-    _data-&gt;_page-&gt;inputDeviceForceDidChange(event.pressure, event.stage);
</del><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessWebPageProxycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp (182911 => 182912)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp        2015-04-16 21:35:30 UTC (rev 182911)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp        2015-04-16 22:18:35 UTC (rev 182912)
</span><span class="lines">@@ -4397,6 +4397,9 @@
</span><span class="cx"> 
</span><span class="cx">     case WebEvent::MouseDown:
</span><span class="cx">     case WebEvent::MouseUp:
</span><ins>+    case WebEvent::MouseForceChanged:
+    case WebEvent::MouseForceDown:
+    case WebEvent::MouseForceUp:
</ins><span class="cx">     case WebEvent::Wheel:
</span><span class="cx">     case WebEvent::KeyDown:
</span><span class="cx">     case WebEvent::KeyUp:
</span><span class="lines">@@ -4427,6 +4430,10 @@
</span><span class="cx">     case WebEvent::MouseUp:
</span><span class="cx">         m_currentlyProcessedMouseDownEvent = nullptr;
</span><span class="cx">         break;
</span><ins>+    case WebEvent::MouseForceChanged:
+    case WebEvent::MouseForceDown:
+    case WebEvent::MouseForceUp:
+        break;
</ins><span class="cx"> 
</span><span class="cx">     case WebEvent::Wheel: {
</span><span class="cx">         MESSAGE_CHECK(!m_currentlyProcessedWheelEvents.isEmpty());
</span><span class="lines">@@ -5674,11 +5681,6 @@
</span><span class="cx">     m_process-&gt;send(Messages::WebPage::FocusAndSelectLastActionMenuHitTestResult(), m_pageID);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WebPageProxy::inputDeviceForceDidChange(float force, int stage)
-{
-    m_process-&gt;send(Messages::WebPage::InputDeviceForceDidChange(force, stage), m_pageID);
-}
-
</del><span class="cx"> void WebPageProxy::immediateActionDidUpdate()
</span><span class="cx"> {
</span><span class="cx">     m_process-&gt;send(Messages::WebPage::ImmediateActionDidUpdate(), m_pageID);
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessWebPageProxyh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.h (182911 => 182912)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/WebPageProxy.h        2015-04-16 21:35:30 UTC (rev 182911)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.h        2015-04-16 22:18:35 UTC (rev 182912)
</span><span class="lines">@@ -994,7 +994,6 @@
</span><span class="cx">     void selectLastActionMenuRange();
</span><span class="cx">     void focusAndSelectLastActionMenuHitTestResult();
</span><span class="cx"> 
</span><del>-    void inputDeviceForceDidChange(float force, int stage);
</del><span class="cx">     void immediateActionDidUpdate();
</span><span class="cx">     void immediateActionDidCancel();
</span><span class="cx">     void immediateActionDidComplete();
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessPluginsNetscapex11NetscapePluginX11cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/Plugins/Netscape/x11/NetscapePluginX11.cpp (182911 => 182912)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/Plugins/Netscape/x11/NetscapePluginX11.cpp        2015-04-16 21:35:30 UTC (rev 182911)
+++ trunk/Source/WebKit2/WebProcess/Plugins/Netscape/x11/NetscapePluginX11.cpp        2015-04-16 22:18:35 UTC (rev 182912)
</span><span class="lines">@@ -474,6 +474,9 @@
</span><span class="cx">     case WebEvent::MouseMove:
</span><span class="cx">         setXMotionEventFields(xEvent, event, convertToRootView(IntPoint()));
</span><span class="cx">         break;
</span><ins>+    case WebEvent::MouseForceChanged:
+    case WebEvent::MouseForceDown:
+    case WebEvent::MouseForceUp:
</ins><span class="cx">     case WebEvent::NoType:
</span><span class="cx">     case WebEvent::Wheel:
</span><span class="cx">     case WebEvent::KeyDown:
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageWebPagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp (182911 => 182912)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp        2015-04-16 21:35:30 UTC (rev 182911)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp        2015-04-16 22:18:35 UTC (rev 182912)
</span><span class="lines">@@ -1903,6 +1903,12 @@
</span><span class="cx">             if (onlyUpdateScrollbars)
</span><span class="cx">                 return page-&gt;corePage()-&gt;userInputBridge().handleMouseMoveOnScrollbarEvent(platformMouseEvent);
</span><span class="cx">             return page-&gt;corePage()-&gt;userInputBridge().handleMouseMoveEvent(platformMouseEvent);
</span><ins>+
+        case PlatformEvent::MouseForceChanged:
+        case PlatformEvent::MouseForceDown:
+        case PlatformEvent::MouseForceUp:
+            return page-&gt;corePage()-&gt;userInputBridge().handleMouseForceEvent(platformMouseEvent);
+
</ins><span class="cx">         default:
</span><span class="cx">             ASSERT_NOT_REACHED();
</span><span class="cx">             return false;
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageWebPageh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h (182911 => 182912)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h        2015-04-16 21:35:30 UTC (rev 182911)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h        2015-04-16 22:18:35 UTC (rev 182912)
</span><span class="lines">@@ -1094,7 +1094,6 @@
</span><span class="cx">     PassRefPtr&lt;WebCore::Range&gt; lookupTextAtLocation(WebCore::FloatPoint, NSDictionary **options);
</span><span class="cx">     void selectLastActionMenuRange();
</span><span class="cx">     void focusAndSelectLastActionMenuHitTestResult();
</span><del>-    void inputDeviceForceDidChange(float force, int stage);
</del><span class="cx">     void immediateActionDidUpdate();
</span><span class="cx">     void immediateActionDidCancel();
</span><span class="cx">     void immediateActionDidComplete();
</span><span class="lines">@@ -1355,7 +1354,6 @@
</span><span class="cx">     RefPtr&lt;WebCore::Range&gt; m_lastActionMenuRangeForSelection;
</span><span class="cx">     WebCore::HitTestResult m_lastActionMenuHitTestResult;
</span><span class="cx">     RefPtr&lt;WebPageOverlay&gt; m_lastActionMenuHitPageOverlay;
</span><del>-    int m_lastForceStage { 0 };
</del><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     bool m_mainFrameProgressCompleted;
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageWebPagemessagesin"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in (182911 => 182912)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in        2015-04-16 21:35:30 UTC (rev 182911)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in        2015-04-16 22:18:35 UTC (rev 182912)
</span><span class="lines">@@ -407,7 +407,6 @@
</span><span class="cx">     PerformActionMenuHitTestAtLocation(WebCore::FloatPoint location, bool forImmediateAction)
</span><span class="cx">     SelectLastActionMenuRange()
</span><span class="cx">     FocusAndSelectLastActionMenuHitTestResult()
</span><del>-    InputDeviceForceDidChange(float force, int stage)
</del><span class="cx">     ImmediateActionDidUpdate()
</span><span class="cx">     ImmediateActionDidCancel()
</span><span class="cx">     ImmediateActionDidComplete()
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPagemacWebPageMacmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/mac/WebPageMac.mm (182911 => 182912)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/mac/WebPageMac.mm        2015-04-16 21:35:30 UTC (rev 182911)
+++ trunk/Source/WebKit2/WebProcess/WebPage/mac/WebPageMac.mm        2015-04-16 22:18:35 UTC (rev 182912)
</span><span class="lines">@@ -1141,25 +1141,6 @@
</span><span class="cx">     frame-&gt;selection().setSelection(position);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WebPage::inputDeviceForceDidChange(float force, int stage)
-{
-    Element* element = m_lastActionMenuHitTestResult.innerElement();
-    if (!element)
-        return;
-
-    float overallForce = stage &lt; 1 ? force : force + stage - 1;
-    element-&gt;dispatchMouseForceChanged(overallForce);
-
-    if (m_lastForceStage == 1 &amp;&amp; stage == 2)
-        element-&gt;dispatchMouseForceDown();
-    else if (m_lastForceStage == 2 &amp;&amp; stage == 1) {
-        element-&gt;dispatchMouseForceUp();
-        element-&gt;dispatchMouseForceClick();
-    }
-
-    m_lastForceStage = stage;
-}
-
</del><span class="cx"> void WebPage::immediateActionDidUpdate()
</span><span class="cx"> {
</span><span class="cx">     m_page-&gt;mainFrame().eventHandler().setImmediateActionStage(ImmediateActionStage::ActionUpdated);
</span></span></pre></div>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (182911 => 182912)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog        2015-04-16 21:35:30 UTC (rev 182911)
+++ trunk/Tools/ChangeLog        2015-04-16 22:18:35 UTC (rev 182912)
</span><span class="lines">@@ -1,3 +1,39 @@
</span><ins>+2015-04-16  Beth Dakin  &lt;bdakin@apple.com&gt;
+
+        Force mouse events should go through normal mouse event handling code paths
+        https://bugs.webkit.org/show_bug.cgi?id=143749
+        -and corresponding-
+        rdar://problem/20472895
+
+        Reviewed by Dean Jackson.
+
+        Add mouseForceDown/mouseForceUp/mouseForceChanged support to WebKitTestRunner. 
+        Since there is not a way to create an NSEventTypePressure from scratch, we 
+        subclass NSEvent and override all of the critical methods.
+
+        * WebKitTestRunner/EventSenderProxy.h:
+        * WebKitTestRunner/InjectedBundle/Bindings/EventSendingController.idl:
+        * WebKitTestRunner/InjectedBundle/EventSendingController.cpp:
+        (WTR::EventSendingController::mouseForceDown):
+        (WTR::EventSendingController::mouseForceUp):
+        (WTR::EventSendingController::mouseForceChanged):
+        * WebKitTestRunner/InjectedBundle/EventSendingController.h:
+        * WebKitTestRunner/TestController.cpp:
+        (WTR::TestController::didReceiveSynchronousMessageFromInjectedBundle):
+        * WebKitTestRunner/mac/EventSenderProxy.mm:
+        (-[EventSenderPressureEvent initAtLocation:globalLocation:stage:pressure:phase:time:eventNumber:]):
+        (-[EventSenderPressureEvent timestamp]):
+        (-[EventSenderPressureEvent type]):
+        (-[EventSenderPressureEvent locationInWindow]):
+        (-[EventSenderPressureEvent location]):
+        (-[EventSenderPressureEvent stage]):
+        (-[EventSenderPressureEvent pressure]):
+        (-[EventSenderPressureEvent phase]):
+        (-[EventSenderPressureEvent eventNumber]):
+        (WTR::EventSenderProxy::mouseForceDown):
+        (WTR::EventSenderProxy::mouseForceUp):
+        (WTR::EventSenderProxy::mouseForceChanged):
+
</ins><span class="cx"> 2015-04-16  Csaba Osztrogonác  &lt;ossy@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         [EFL] Bump LLVM to version 3.6.0 on X86_64
</span></span></pre></div>
<a id="trunkToolsWebKitTestRunnerEventSenderProxyh"></a>
<div class="modfile"><h4>Modified: trunk/Tools/WebKitTestRunner/EventSenderProxy.h (182911 => 182912)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebKitTestRunner/EventSenderProxy.h        2015-04-16 21:35:30 UTC (rev 182911)
+++ trunk/Tools/WebKitTestRunner/EventSenderProxy.h        2015-04-16 22:18:35 UTC (rev 182912)
</span><span class="lines">@@ -58,6 +58,9 @@
</span><span class="cx"> 
</span><span class="cx">     void mouseDown(unsigned button, WKEventModifiers);
</span><span class="cx">     void mouseUp(unsigned button, WKEventModifiers);
</span><ins>+    void mouseForceDown();
+    void mouseForceUp();
+    void mouseForceChanged(float);
</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 (182911 => 182912)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebKitTestRunner/InjectedBundle/Bindings/EventSendingController.idl        2015-04-16 21:35:30 UTC (rev 182911)
+++ trunk/Tools/WebKitTestRunner/InjectedBundle/Bindings/EventSendingController.idl        2015-04-16 22:18:35 UTC (rev 182912)
</span><span class="lines">@@ -27,6 +27,9 @@
</span><span class="cx">     void mouseDown(long buttonNumber, object modifierArray);
</span><span class="cx">     void mouseUp(long buttonNumber, object modifierArray);
</span><span class="cx">     void mouseMoveTo(long x, long y);
</span><ins>+    void mouseForceDown();
+    void mouseForceUp();
+    void mouseForceChanged(double force);
</ins><span class="cx">     void mouseScrollBy(long x, long y);
</span><span class="cx">     void mouseScrollByWithWheelAndMomentumPhases(long x, long y, DOMString phase, DOMString momentum, optional boolean asyncScrolling);
</span><span class="cx">     void continuousMouseScrollBy(long x, long y, optional boolean paged);
</span></span></pre></div>
<a id="trunkToolsWebKitTestRunnerInjectedBundleEventSendingControllercpp"></a>
<div class="modfile"><h4>Modified: trunk/Tools/WebKitTestRunner/InjectedBundle/EventSendingController.cpp (182911 => 182912)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebKitTestRunner/InjectedBundle/EventSendingController.cpp        2015-04-16 21:35:30 UTC (rev 182911)
+++ trunk/Tools/WebKitTestRunner/InjectedBundle/EventSendingController.cpp        2015-04-16 22:18:35 UTC (rev 182912)
</span><span class="lines">@@ -253,6 +253,46 @@
</span><span class="cx">     WKBundlePagePostSynchronousMessage(InjectedBundle::singleton().page()-&gt;page(), EventSenderMessageName.get(), EventSenderMessageBody.get(), 0);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void EventSendingController::mouseForceDown()
+{
+    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;MouseForceDown&quot;));
+    WKDictionarySetItem(EventSenderMessageBody.get(), subMessageKey.get(), subMessageName.get());
+
+    WKBundlePagePostSynchronousMessage(InjectedBundle::singleton().page()-&gt;page(), EventSenderMessageName.get(), EventSenderMessageBody.get(), 0);
+}
+
+void EventSendingController::mouseForceUp()
+{
+    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;MouseForceUp&quot;));
+    WKDictionarySetItem(EventSenderMessageBody.get(), subMessageKey.get(), subMessageName.get());
+
+    WKBundlePagePostSynchronousMessage(InjectedBundle::singleton().page()-&gt;page(), EventSenderMessageName.get(), EventSenderMessageBody.get(), 0);
+}
+
+void EventSendingController::mouseForceChanged(double force)
+{
+    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;MouseForceChanged&quot;));
+    WKDictionarySetItem(EventSenderMessageBody.get(), subMessageKey.get(), subMessageName.get());
+
+    WKRetainPtr&lt;WKStringRef&gt; forceKey(AdoptWK, WKStringCreateWithUTF8CString(&quot;Force&quot;));
+    WKRetainPtr&lt;WKDoubleRef&gt; forceRef(AdoptWK, WKDoubleCreate(force));
+    WKDictionarySetItem(EventSenderMessageBody.get(), forceKey.get(), forceRef.get());
+
+    WKBundlePagePostSynchronousMessage(InjectedBundle::singleton().page()-&gt;page(), EventSenderMessageName.get(), EventSenderMessageBody.get(), 0);
+}
+
</ins><span class="cx"> void EventSendingController::leapForward(int milliseconds)
</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 (182911 => 182912)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebKitTestRunner/InjectedBundle/EventSendingController.h        2015-04-16 21:35:30 UTC (rev 182911)
+++ trunk/Tools/WebKitTestRunner/InjectedBundle/EventSendingController.h        2015-04-16 22:18:35 UTC (rev 182912)
</span><span class="lines">@@ -46,6 +46,9 @@
</span><span class="cx">     void mouseDown(int button, JSValueRef modifierArray);
</span><span class="cx">     void mouseUp(int button, JSValueRef modifierArray);
</span><span class="cx">     void mouseMoveTo(int x, int y);
</span><ins>+    void mouseForceDown();
+    void mouseForceUp();
+    void mouseForceChanged(double force);
</ins><span class="cx">     void mouseScrollBy(int x, int y);
</span><span class="cx">     void mouseScrollByWithWheelAndMomentumPhases(int x, int y, JSStringRef phase, JSStringRef momentum, bool asyncScrolling);
</span><span class="cx">     void continuousMouseScrollBy(int x, int y, bool paged);
</span></span></pre></div>
<a id="trunkToolsWebKitTestRunnerTestControllercpp"></a>
<div class="modfile"><h4>Modified: trunk/Tools/WebKitTestRunner/TestController.cpp (182911 => 182912)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebKitTestRunner/TestController.cpp        2015-04-16 21:35:30 UTC (rev 182911)
+++ trunk/Tools/WebKitTestRunner/TestController.cpp        2015-04-16 22:18:35 UTC (rev 182912)
</span><span class="lines">@@ -1102,6 +1102,32 @@
</span><span class="cx">             return 0;
</span><span class="cx">         }
</span><span class="cx"> 
</span><ins>+#if PLATFORM(MAC)
+        if (WKStringIsEqualToUTF8CString(subMessageName, &quot;MouseForceDown&quot;)) {
+            WKPageSetShouldSendEventsSynchronously(mainWebView()-&gt;page(), true);
+            m_eventSenderProxy-&gt;mouseForceDown();
+            WKPageSetShouldSendEventsSynchronously(mainWebView()-&gt;page(), false);
+            return 0;
+        }
+
+        if (WKStringIsEqualToUTF8CString(subMessageName, &quot;MouseForceUp&quot;)) {
+            WKPageSetShouldSendEventsSynchronously(mainWebView()-&gt;page(), true);
+            m_eventSenderProxy-&gt;mouseForceUp();
+            WKPageSetShouldSendEventsSynchronously(mainWebView()-&gt;page(), false);
+            return 0;
+        }
+
+        if (WKStringIsEqualToUTF8CString(subMessageName, &quot;MouseForceChanged&quot;)) {
+            WKRetainPtr&lt;WKStringRef&gt; forceKey = adoptWK(WKStringCreateWithUTF8CString(&quot;Force&quot;));
+            double force = WKDoubleGetValue(static_cast&lt;WKDoubleRef&gt;(WKDictionaryGetItemForKey(messageBodyDictionary, forceKey.get())));
+
+            WKPageSetShouldSendEventsSynchronously(mainWebView()-&gt;page(), true);
+            m_eventSenderProxy-&gt;mouseForceChanged(force);
+            WKPageSetShouldSendEventsSynchronously(mainWebView()-&gt;page(), false);
+            return 0;
+        }
+#endif // PLATFORM(MAC)
+
</ins><span class="cx">         if (WKStringIsEqualToUTF8CString(subMessageName, &quot;MouseScrollBy&quot;)) {
</span><span class="cx">             WKRetainPtr&lt;WKStringRef&gt; xKey = adoptWK(WKStringCreateWithUTF8CString(&quot;X&quot;));
</span><span class="cx">             double x = WKDoubleGetValue(static_cast&lt;WKDoubleRef&gt;(WKDictionaryGetItemForKey(messageBodyDictionary, xKey.get())));
</span></span></pre></div>
<a id="trunkToolsWebKitTestRunnermacEventSenderProxymm"></a>
<div class="modfile"><h4>Modified: trunk/Tools/WebKitTestRunner/mac/EventSenderProxy.mm (182911 => 182912)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebKitTestRunner/mac/EventSenderProxy.mm        2015-04-16 21:35:30 UTC (rev 182911)
+++ trunk/Tools/WebKitTestRunner/mac/EventSenderProxy.mm        2015-04-16 22:18:35 UTC (rev 182912)
</span><span class="lines">@@ -39,6 +39,85 @@
</span><span class="cx"> - (void)_setCurrentEvent:(NSEvent *)event;
</span><span class="cx"> @end
</span><span class="cx"> 
</span><ins>+#if __MAC_OS_X_VERSION_MAX_ALLOWED &gt;= 101003
+@interface EventSenderPressureEvent : NSEvent {
+@public
+    NSPoint _eventSender_locationInWindow;
+    NSPoint _eventSender_location;
+    NSInteger _eventSender_stage;
+    float _eventSender_pressure;
+    NSEventPhase _eventSender_phase;
+    NSTimeInterval _eventSender_timestamp;
+    NSInteger _eventSender_eventNumber;
+}
+
+- (id)initAtLocation:(NSPoint)location globalLocation:(NSPoint)globalLocation stage:(NSInteger)stage pressure:(float)pressure phase:(NSEventPhase)phase time:(NSTimeInterval)time eventNumber:(NSInteger)eventNumber;
+- (NSTimeInterval)timestamp;
+@end
+
+@implementation EventSenderPressureEvent
+
+- (id)initAtLocation:(NSPoint)location globalLocation:(NSPoint)globalLocation stage:(NSInteger)stage pressure:(float)pressure phase:(NSEventPhase)phase time:(NSTimeInterval)time eventNumber:(NSInteger)eventNumber
+{
+    self = [super init];
+
+    if (!self)
+        return nil;
+
+    _eventSender_location = location;
+    _eventSender_locationInWindow = globalLocation;
+    _eventSender_stage = stage;
+    _eventSender_pressure = pressure;
+    _eventSender_phase = phase;
+    _eventSender_timestamp = time;
+    _eventSender_eventNumber = eventNumber;
+
+    return self;
+}
+
+- (NSTimeInterval)timestamp
+{
+    return _eventSender_timestamp;
+}
+
+- (NSEventType)type
+{
+    return NSEventTypePressure;
+}
+
+- (NSPoint)locationInWindow
+{
+    return self-&gt;_eventSender_location;
+}
+
+- (NSPoint)location
+{
+    return self-&gt;_eventSender_locationInWindow;
+}
+
+- (NSInteger)stage
+{
+    return _eventSender_stage;
+}
+
+- (float)pressure
+{
+    return _eventSender_pressure;
+}
+
+- (NSEventPhase)phase
+{
+    return _eventSender_phase;
+}
+
+- (NSInteger)eventNumber
+{
+    return _eventSender_eventNumber;
+}
+
+@end
+#endif // __MAC_OS_X_VERSION_MAX_ALLOWED &gt;= 101003
+
</ins><span class="cx"> namespace WTR {
</span><span class="cx"> 
</span><span class="cx"> enum MouseAction {
</span><span class="lines">@@ -200,6 +279,115 @@
</span><span class="cx">     m_clickPosition = m_position;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+#if __MAC_OS_X_VERSION_MAX_ALLOWED &gt;= 101003
+void EventSenderProxy::mouseForceDown()
+{
+    EventSenderPressureEvent *firstEvent = [[EventSenderPressureEvent alloc] initAtLocation:NSMakePoint(m_position.x, m_position.y)
+        globalLocation:([m_testController-&gt;mainWebView()-&gt;platformWindow() convertRectToScreen:NSMakeRect(m_position.x, m_position.y, 1, 1)].origin)
+        stage:1
+        pressure:0.9
+        phase:NSEventPhaseChanged
+        time:absoluteTimeForEventTime(currentEventTime())
+        eventNumber:++eventNumber];
+    EventSenderPressureEvent *secondEvent = [[EventSenderPressureEvent alloc] initAtLocation:NSMakePoint(m_position.x, m_position.y)
+        globalLocation:([m_testController-&gt;mainWebView()-&gt;platformWindow() convertRectToScreen:NSMakeRect(m_position.x, m_position.y, 1, 1)].origin)
+        stage:2
+        pressure:0.1
+        phase:NSEventPhaseChanged
+        time:absoluteTimeForEventTime(currentEventTime())
+        eventNumber:++eventNumber];
+
+    NSView *targetView = [m_testController-&gt;mainWebView()-&gt;platformView() hitTest:[firstEvent 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.
+    [NSApp _setCurrentEvent:firstEvent];
+    [targetView pressureChangeWithEvent:firstEvent];
+    [NSApp _setCurrentEvent:secondEvent];
+    [targetView pressureChangeWithEvent:secondEvent];
+
+    [NSApp _setCurrentEvent:nil];
+    // WKView caches the most recent pressure event, so send it a nil event to clear the cache.
+    [targetView pressureChangeWithEvent:nil];
+
+    [firstEvent release];
+    [secondEvent release];
+}
+
+void EventSenderProxy::mouseForceUp()
+{
+    EventSenderPressureEvent *firstEvent = [[EventSenderPressureEvent alloc] initAtLocation:NSMakePoint(m_position.x, m_position.y)
+        globalLocation:([m_testController-&gt;mainWebView()-&gt;platformWindow() convertRectToScreen:NSMakeRect(m_position.x, m_position.y, 1, 1)].origin)
+        stage:2
+        pressure:0.1
+        phase:NSEventPhaseChanged
+        time:absoluteTimeForEventTime(currentEventTime())
+        eventNumber:++eventNumber];
+    EventSenderPressureEvent *secondEvent = [[EventSenderPressureEvent alloc] initAtLocation:NSMakePoint(m_position.x, m_position.y)
+        globalLocation:([m_testController-&gt;mainWebView()-&gt;platformWindow() convertRectToScreen:NSMakeRect(m_position.x, m_position.y, 1, 1)].origin)
+        stage:1
+        pressure:0.9
+        phase:NSEventPhaseChanged
+        time:absoluteTimeForEventTime(currentEventTime())
+        eventNumber:++eventNumber];
+
+    NSView *targetView = [m_testController-&gt;mainWebView()-&gt;platformView() hitTest:[firstEvent 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.
+    [NSApp _setCurrentEvent:firstEvent];
+    [targetView pressureChangeWithEvent:firstEvent];
+    [NSApp _setCurrentEvent:secondEvent];
+    [targetView pressureChangeWithEvent:secondEvent];
+
+    [NSApp _setCurrentEvent:nil];
+    // WKView caches the most recent pressure event, so send it a nil event to clear the cache.
+    [targetView pressureChangeWithEvent:nil];
+
+    [firstEvent release];
+    [secondEvent release];
+}
+
+void EventSenderProxy::mouseForceChanged(float force)
+{
+    EventSenderPressureEvent *event = [[EventSenderPressureEvent alloc] initAtLocation:NSMakePoint(m_position.x, m_position.y)
+        globalLocation:([m_testController-&gt;mainWebView()-&gt;platformWindow() convertRectToScreen:NSMakeRect(m_position.x, m_position.y, 1, 1)].origin)
+        stage:force &lt; 1 ? 1 : 2
+        pressure:force
+        phase:NSEventPhaseChanged
+        time:absoluteTimeForEventTime(currentEventTime())
+        eventNumber:++eventNumber];
+
+    NSView *targetView = [m_testController-&gt;mainWebView()-&gt;platformView() hitTest:[event locationInWindow]];
+    targetView = targetView ? targetView : m_testController-&gt;mainWebView()-&gt;platformView();
+    ASSERT(targetView);
+    [NSApp _setCurrentEvent:event];
+    [targetView pressureChangeWithEvent:event];
+    [NSApp _setCurrentEvent:nil];
+
+    // WKView caches the most recent pressure event, so send it a nil event to clear the cache.
+    [targetView pressureChangeWithEvent:nil];
+
+    [event release];
+}
+#else
+void EventSenderProxy::mouseForceDown()
+{
+}
+
+void EventSenderProxy::mouseForceUp()
+{
+}
+
+void EventSenderProxy::mouseForceChanged(float)
+{
+}
+#endif // __MAC_OS_X_VERSION_MAX_ALLOWED &gt;= 101003
+
</ins><span class="cx"> void EventSenderProxy::mouseMoveTo(double x, double y)
</span><span class="cx"> {
</span><span class="cx">     NSView *view = m_testController-&gt;mainWebView()-&gt;platformView();
</span></span></pre>
</div>
</div>

</body>
</html>