<!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>[214586] 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/214586">214586</a></dd>
<dt>Author</dt> <dd>timothy_horton@apple.com</dd>
<dt>Date</dt> <dd>2017-03-29 18:05:58 -0700 (Wed, 29 Mar 2017)</dd>
</dl>

<h3>Log Message</h3>
<pre>Swipe gesture tests don't work on macOS Sierra
https://bugs.webkit.org/show_bug.cgi?id=161675
&lt;rdar://problem/23379930&gt;

Reviewed by Darin Adler.

Tools:

* DumpRenderTree/mac/UIScriptControllerMac.mm:
(WTR::UIScriptController::platformPlayBackEventStream):
(WTR::UIScriptController::beginBackSwipe):
(WTR::UIScriptController::completeBackSwipe):
* TestRunnerShared/EventSerialization/mac/EventSerializerMac.h: Copied from Tools/DumpRenderTree/mac/UIScriptControllerMac.mm.
* TestRunnerShared/EventSerialization/mac/EventSerializerMac.mm: Added.
(eventIsOfType):
(eventIsOfTypes):
(eventIsOfGestureType):
(eventIsOfGestureTypes):
(+[EventSerializer dictionaryForEvent:relativeToTime:]):
(+[EventSerializer createEventForDictionary:inWindow:relativeToTime:]):
(+[EventSerializer playEventStream:inWindow:completionHandler:]):
* TestRunnerShared/EventSerialization/mac/SharedEventStreamsMac.h: Copied from Tools/WebKitTestRunner/mac/UIScriptControllerMac.mm.
* TestRunnerShared/EventSerialization/mac/SharedEventStreamsMac.mm: Added.
(beginSwipeBackEventStream):
(completeSwipeBackEventStream):
* TestRunnerShared/UIScriptContext/Bindings/UIScriptController.idl:
* TestRunnerShared/UIScriptContext/UIScriptController.cpp:
(WTR::UIScriptController::playBackEventStream):
(WTR::UIScriptController::beginBackSwipe):
(WTR::UIScriptController::completeBackSwipe):
(WTR::UIScriptController::platformPlayBackEventStream):
(WTR::UIScriptController::platformClearAllCallbacks): Deleted.
* TestRunnerShared/UIScriptContext/UIScriptController.h:
* TestRunnerShared/spi/CoreGraphicsSPI.h: Added.
* TestRunnerShared/spi/IOKitSPI.h: Renamed from Tools/WebKitTestRunner/ios/IOKitSPI.h.
* WebKitTestRunner/WebKitTestRunner.xcodeproj/project.pbxproj:
* WebKitTestRunner/mac/UIScriptControllerMac.mm:
(WTR::playBackEvents):
(WTR::UIScriptController::beginBackSwipe):
(WTR::UIScriptController::completeBackSwipe):
(WTR::UIScriptController::platformPlayBackEventStream):

LayoutTests:

* platform/mac-wk2/TestExpectations:
* swipe/basic-cached-back-swipe-expected.txt:
* swipe/basic-cached-back-swipe.html:
* swipe/main-frame-pinning-requirement-expected.txt:
* swipe/main-frame-pinning-requirement.html:
* swipe/pushState-cached-back-swipe-expected.txt:
* swipe/pushState-cached-back-swipe.html:
* swipe/pushState-programmatic-back-while-swiping-crash-expected.txt:
* swipe/pushState-programmatic-back-while-swiping-crash.html:
* swipe/resources/swipe-test.js:
(measuredDurationShouldBeLessThan):
(startSwipeGesture):
(completeSwipeGesture):
(playEventStream):
(eventQueue.enqueueScrollEvent): Deleted.
(eventQueue.enqueueSwipeEvent): Deleted.
(eventQueue.hasPendingEvents): Deleted.
(eventQueue.callAfterEventDispatch): Deleted.
(eventQueue._processEventQueue): Deleted.
(eventQueue._processEventQueueSoon): Deleted.
* swipe/swipe-start-hysteresis-failures-expected.txt: Removed.
* swipe/swipe-start-hysteresis-failures.html: Removed.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsplatformmacwk2TestExpectations">trunk/LayoutTests/platform/mac-wk2/TestExpectations</a></li>
<li><a href="#trunkLayoutTestsswipebasiccachedbackswipeexpectedtxt">trunk/LayoutTests/swipe/basic-cached-back-swipe-expected.txt</a></li>
<li><a href="#trunkLayoutTestsswipebasiccachedbackswipehtml">trunk/LayoutTests/swipe/basic-cached-back-swipe.html</a></li>
<li><a href="#trunkLayoutTestsswipemainframepinningrequirementexpectedtxt">trunk/LayoutTests/swipe/main-frame-pinning-requirement-expected.txt</a></li>
<li><a href="#trunkLayoutTestsswipemainframepinningrequirementhtml">trunk/LayoutTests/swipe/main-frame-pinning-requirement.html</a></li>
<li><a href="#trunkLayoutTestsswipepushStatecachedbackswipeexpectedtxt">trunk/LayoutTests/swipe/pushState-cached-back-swipe-expected.txt</a></li>
<li><a href="#trunkLayoutTestsswipepushStatecachedbackswipehtml">trunk/LayoutTests/swipe/pushState-cached-back-swipe.html</a></li>
<li><a href="#trunkLayoutTestsswipepushStateprogrammaticbackwhileswipingcrashexpectedtxt">trunk/LayoutTests/swipe/pushState-programmatic-back-while-swiping-crash-expected.txt</a></li>
<li><a href="#trunkLayoutTestsswipepushStateprogrammaticbackwhileswipingcrashhtml">trunk/LayoutTests/swipe/pushState-programmatic-back-while-swiping-crash.html</a></li>
<li><a href="#trunkLayoutTestsswiperesourcesswipetestjs">trunk/LayoutTests/swipe/resources/swipe-test.js</a></li>
<li><a href="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
<li><a href="#trunkToolsDumpRenderTreemacUIScriptControllerMacmm">trunk/Tools/DumpRenderTree/mac/UIScriptControllerMac.mm</a></li>
<li><a href="#trunkToolsTestRunnerSharedUIScriptContextBindingsUIScriptControlleridl">trunk/Tools/TestRunnerShared/UIScriptContext/Bindings/UIScriptController.idl</a></li>
<li><a href="#trunkToolsTestRunnerSharedUIScriptContextUIScriptControllercpp">trunk/Tools/TestRunnerShared/UIScriptContext/UIScriptController.cpp</a></li>
<li><a href="#trunkToolsTestRunnerSharedUIScriptContextUIScriptControllerh">trunk/Tools/TestRunnerShared/UIScriptContext/UIScriptController.h</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="#trunkToolsWebKitTestRunnerInjectedBundleiosEventSenderProxyIOSmm">trunk/Tools/WebKitTestRunner/InjectedBundle/ios/EventSenderProxyIOS.mm</a></li>
<li><a href="#trunkToolsWebKitTestRunnerTestControllercpp">trunk/Tools/WebKitTestRunner/TestController.cpp</a></li>
<li><a href="#trunkToolsWebKitTestRunnerWebKitTestRunnerxcodeprojprojectpbxproj">trunk/Tools/WebKitTestRunner/WebKitTestRunner.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkToolsWebKitTestRunnereflEventSenderProxyEflcpp">trunk/Tools/WebKitTestRunner/efl/EventSenderProxyEfl.cpp</a></li>
<li><a href="#trunkToolsWebKitTestRunnergtkEventSenderProxyGtkcpp">trunk/Tools/WebKitTestRunner/gtk/EventSenderProxyGtk.cpp</a></li>
<li><a href="#trunkToolsWebKitTestRunnermacEventSenderProxymm">trunk/Tools/WebKitTestRunner/mac/EventSenderProxy.mm</a></li>
<li><a href="#trunkToolsWebKitTestRunnermacUIScriptControllerMacmm">trunk/Tools/WebKitTestRunner/mac/UIScriptControllerMac.mm</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li>trunk/Tools/TestRunnerShared/EventSerialization/</li>
<li>trunk/Tools/TestRunnerShared/EventSerialization/mac/</li>
<li><a href="#trunkToolsTestRunnerSharedEventSerializationmacEventSerializerMach">trunk/Tools/TestRunnerShared/EventSerialization/mac/EventSerializerMac.h</a></li>
<li><a href="#trunkToolsTestRunnerSharedEventSerializationmacEventSerializerMacmm">trunk/Tools/TestRunnerShared/EventSerialization/mac/EventSerializerMac.mm</a></li>
<li><a href="#trunkToolsTestRunnerSharedEventSerializationmacSharedEventStreamsMach">trunk/Tools/TestRunnerShared/EventSerialization/mac/SharedEventStreamsMac.h</a></li>
<li><a href="#trunkToolsTestRunnerSharedEventSerializationmacSharedEventStreamsMacmm">trunk/Tools/TestRunnerShared/EventSerialization/mac/SharedEventStreamsMac.mm</a></li>
<li>trunk/Tools/TestRunnerShared/spi/</li>
<li><a href="#trunkToolsTestRunnerSharedspiCoreGraphicsSPIh">trunk/Tools/TestRunnerShared/spi/CoreGraphicsSPI.h</a></li>
<li><a href="#trunkToolsTestRunnerSharedspiIOKitSPIh">trunk/Tools/TestRunnerShared/spi/IOKitSPI.h</a></li>
</ul>

<h3>Removed Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsswipeswipestarthysteresisfailuresexpectedtxt">trunk/LayoutTests/swipe/swipe-start-hysteresis-failures-expected.txt</a></li>
<li><a href="#trunkLayoutTestsswipeswipestarthysteresisfailureshtml">trunk/LayoutTests/swipe/swipe-start-hysteresis-failures.html</a></li>
<li><a href="#trunkToolsWebKitTestRunneriosIOKitSPIh">trunk/Tools/WebKitTestRunner/ios/IOKitSPI.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (214585 => 214586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2017-03-30 00:37:36 UTC (rev 214585)
+++ trunk/LayoutTests/ChangeLog        2017-03-30 01:05:58 UTC (rev 214586)
</span><span class="lines">@@ -1,3 +1,34 @@
</span><ins>+2017-03-29  Tim Horton  &lt;timothy_horton@apple.com&gt;
+
+        Swipe gesture tests don't work on macOS Sierra
+        https://bugs.webkit.org/show_bug.cgi?id=161675
+        &lt;rdar://problem/23379930&gt;
+
+        Reviewed by Darin Adler.
+
+        * platform/mac-wk2/TestExpectations:
+        * swipe/basic-cached-back-swipe-expected.txt:
+        * swipe/basic-cached-back-swipe.html:
+        * swipe/main-frame-pinning-requirement-expected.txt:
+        * swipe/main-frame-pinning-requirement.html:
+        * swipe/pushState-cached-back-swipe-expected.txt:
+        * swipe/pushState-cached-back-swipe.html:
+        * swipe/pushState-programmatic-back-while-swiping-crash-expected.txt:
+        * swipe/pushState-programmatic-back-while-swiping-crash.html:
+        * swipe/resources/swipe-test.js:
+        (measuredDurationShouldBeLessThan):
+        (startSwipeGesture):
+        (completeSwipeGesture):
+        (playEventStream):
+        (eventQueue.enqueueScrollEvent): Deleted.
+        (eventQueue.enqueueSwipeEvent): Deleted.
+        (eventQueue.hasPendingEvents): Deleted.
+        (eventQueue.callAfterEventDispatch): Deleted.
+        (eventQueue._processEventQueue): Deleted.
+        (eventQueue._processEventQueueSoon): Deleted.
+        * swipe/swipe-start-hysteresis-failures-expected.txt: Removed.
+        * swipe/swipe-start-hysteresis-failures.html: Removed.
+
</ins><span class="cx"> 2017-03-29  Myles C. Maxfield  &lt;mmaxfield@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Try to normalize variation ranges
</span></span></pre></div>
<a id="trunkLayoutTestsplatformmacwk2TestExpectations"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/platform/mac-wk2/TestExpectations (214585 => 214586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/platform/mac-wk2/TestExpectations        2017-03-30 00:37:36 UTC (rev 214585)
+++ trunk/LayoutTests/platform/mac-wk2/TestExpectations        2017-03-30 01:05:58 UTC (rev 214586)
</span><span class="lines">@@ -542,12 +542,6 @@
</span><span class="cx"> # &lt;rdar://problem/25063128&gt;
</span><span class="cx"> [ Sierra+ ] media/media-controls-drag-timeline-set-controls-property.html [ Pass Timeout ]
</span><span class="cx"> 
</span><del>-# &lt;rdar://problem/23379930&gt; swipe tests crashing
-[ Sierra+ ] swipe/basic-cached-back-swipe.html [ Skip ]
-[ Sierra+ ] swipe/main-frame-pinning-requirement.html [ Skip ]
-[ Sierra+ ] swipe/pushState-cached-back-swipe.html [ Skip ]
-[ Sierra+ ] swipe/swipe-start-hysteresis-failures.html [ Skip ]
-
</del><span class="cx"> # Hitting &quot;The certificate for this server is invalid&quot; loading error (not happening in WK1)
</span><span class="cx"> webkit.org/b/160445 [ Sierra+ ] http/tests/security/contentSecurityPolicy/upgrade-insecure-requests/upgrade-insecure-fetch-in-worker.html [ Failure ]
</span><span class="cx"> webkit.org/b/160445 [ Sierra+ ] http/tests/security/contentSecurityPolicy/upgrade-insecure-requests/upgrade-insecure-fetch-in-main-frame.html [ Failure ]
</span></span></pre></div>
<a id="trunkLayoutTestsswipebasiccachedbackswipeexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/swipe/basic-cached-back-swipe-expected.txt (214585 => 214586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/swipe/basic-cached-back-swipe-expected.txt        2017-03-30 00:37:36 UTC (rev 214585)
+++ trunk/LayoutTests/swipe/basic-cached-back-swipe-expected.txt        2017-03-30 01:05:58 UTC (rev 214586)
</span><span class="lines">@@ -1,10 +1,6 @@
</span><del>-swipe event (delta 0 0, phase 'maybegin')
-scroll event (delta 1 0, phase 'began')
-scroll event (delta 1 0, phase 'changed')
</del><ins>+startSwipeGesture
</ins><span class="cx"> didBeginSwipe
</span><del>-swipe event (delta 1 0, phase 'changed')
-swipe event (delta 256 0, phase 'changed')
-swipe event (delta 0 0, phase 'ended')
</del><ins>+completeSwipeGesture
</ins><span class="cx"> willEndSwipe
</span><span class="cx"> didEndSwipe
</span><span class="cx"> didRemoveSwipeSnapshot
</span></span></pre></div>
<a id="trunkLayoutTestsswipebasiccachedbackswipehtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/swipe/basic-cached-back-swipe.html (214585 => 214586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/swipe/basic-cached-back-swipe.html        2017-03-30 00:37:36 UTC (rev 214585)
+++ trunk/LayoutTests/swipe/basic-cached-back-swipe.html        2017-03-30 01:05:58 UTC (rev 214586)
</span><span class="lines">@@ -6,28 +6,10 @@
</span><span class="cx"> &lt;/style&gt;
</span><span class="cx"> &lt;script src=&quot;resources/swipe-test.js&quot;&gt;&lt;/script&gt;
</span><span class="cx"> &lt;script&gt;
</span><del>-function startSwipeGesture()
-{
-    eventSender.mouseMoveTo(100, 100);
-
-    eventQueue.enqueueSwipeEvent(0, 0, 'maybegin');
-    eventQueue.enqueueScrollEvent(1, 0, 'began');
-    eventQueue.enqueueScrollEvent(1, 0, 'changed');
-}
-
-function completeSwipeGesture()
-{
-    eventQueue.enqueueSwipeEvent(1, 0, 'changed');
-    eventQueue.enqueueSwipeEvent(256, 0, 'changed');
-    eventQueue.enqueueSwipeEvent(0, 0, 'ended');
-}
-
</del><span class="cx"> function didBeginSwipeCallback()
</span><span class="cx"> {
</span><span class="cx">     log(&quot;didBeginSwipe&quot;);
</span><span class="cx"> 
</span><del>-    shouldBe(false, eventQueue.hasPendingEvents(), &quot;Event queue should be empty. Both scroll events should be required to start the swipe because of the swipe-start hysteresis.&quot;);
-
</del><span class="cx">     completeSwipeGesture();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -42,7 +24,6 @@
</span><span class="cx"> {
</span><span class="cx">     log(&quot;didEndSwipe&quot;);
</span><span class="cx"> 
</span><del>-    shouldBe(0, eventQueue.hasPendingEvents(), &quot;Event queue should be empty. The swipe isn't complete until we see the end of the gesture.&quot;);
</del><span class="cx">     startMeasuringDuration(&quot;snapshotRemoval&quot;);
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsswipemainframepinningrequirementexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/swipe/main-frame-pinning-requirement-expected.txt (214585 => 214586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/swipe/main-frame-pinning-requirement-expected.txt        2017-03-30 00:37:36 UTC (rev 214585)
+++ trunk/LayoutTests/swipe/main-frame-pinning-requirement-expected.txt        2017-03-30 01:05:58 UTC (rev 214586)
</span><span class="lines">@@ -1,23 +1,8 @@
</span><del>-swipe event (delta 0 0, phase 'maybegin')
-scroll event (delta 10 0, phase 'began')
-scroll event (delta 10 0, phase 'changed')
-scroll event (delta 10 0, phase 'changed')
-scroll event (delta 10 0, phase 'changed')
-scroll event (delta 10 0, phase 'changed')
-scroll event (delta 10 0, phase 'changed')
-scroll event (delta 10 0, phase 'changed')
-scroll event (delta 10 0, phase 'changed')
-scroll event (delta 10 0, phase 'changed')
-scroll event (delta 10 0, phase 'changed')
-scroll event (delta 10 0, phase 'changed')
-scroll event (delta 0 0, phase 'ended')
-swipe event (delta 0 0, phase 'maybegin')
-scroll event (delta 1 0, phase 'began')
-scroll event (delta 10 0, phase 'changed')
</del><ins>+startSwipeGesture
+completeSwipeGesture
+startSwipeGesture
</ins><span class="cx"> didBeginSwipe
</span><del>-swipe event (delta 1 0, phase 'changed')
-swipe event (delta 256 0, phase 'changed')
-swipe event (delta 0 0, phase 'ended')
</del><ins>+completeSwipeGesture
</ins><span class="cx"> willEndSwipe
</span><span class="cx"> didEndSwipe
</span><span class="cx"> didRemoveSwipeSnapshot
</span></span></pre></div>
<a id="trunkLayoutTestsswipemainframepinningrequirementhtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/swipe/main-frame-pinning-requirement.html (214585 => 214586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/swipe/main-frame-pinning-requirement.html        2017-03-30 00:37:36 UTC (rev 214585)
+++ trunk/LayoutTests/swipe/main-frame-pinning-requirement.html        2017-03-30 01:05:58 UTC (rev 214586)
</span><span class="lines">@@ -6,50 +6,26 @@
</span><span class="cx"> &lt;/style&gt;
</span><span class="cx"> &lt;script src=&quot;resources/swipe-test.js&quot;&gt;&lt;/script&gt;
</span><span class="cx"> &lt;script&gt;
</span><del>-function startSwipeGesture()
</del><ins>+
+function runTest()
</ins><span class="cx"> {
</span><del>-    eventSender.mouseMoveTo(100, 100);
-
</del><span class="cx">     // The first swipe should fail because we're scrolled to the middle of the document
</span><span class="cx">     // and this is all a single gesture. We can only start swipes if we *begin*
</span><span class="cx">     // pinned to the edge.
</span><del>-    eventQueue.enqueueSwipeEvent(0, 0, 'maybegin');
-    eventQueue.enqueueScrollEvent(10, 0, 'began');
-    eventQueue.enqueueScrollEvent(10, 0, 'changed');
-    eventQueue.enqueueScrollEvent(10, 0, 'changed');
-    eventQueue.enqueueScrollEvent(10, 0, 'changed');
-    eventQueue.enqueueScrollEvent(10, 0, 'changed');
-    eventQueue.enqueueScrollEvent(10, 0, 'changed');
-    eventQueue.enqueueScrollEvent(10, 0, 'changed');
-    eventQueue.enqueueScrollEvent(10, 0, 'changed');
-    eventQueue.enqueueScrollEvent(10, 0, 'changed');
-    eventQueue.enqueueScrollEvent(10, 0, 'changed');
-    eventQueue.enqueueScrollEvent(10, 0, 'changed');
-    eventQueue.enqueueScrollEvent(0, 0, 'ended');
</del><ins>+    startSwipeGesture(function () {
+        completeSwipeGesture(function () {
+            testRunner.clearTestRunnerCallbacks();
+            testRunner.installDidBeginSwipeCallback(didBeginSwipeCallback);
+            testRunner.installWillEndSwipeCallback(willEndSwipeCallback);
+            testRunner.installDidEndSwipeCallback(didEndSwipeCallback);
+            testRunner.installDidRemoveSwipeSnapshotCallback(didRemoveSwipeSnapshotCallback);    
</ins><span class="cx"> 
</span><del>-    eventQueue.callAfterEventDispatch(function () {
-        testRunner.clearTestRunnerCallbacks();
-        testRunner.installDidBeginSwipeCallback(didBeginSwipeCallback);
-        testRunner.installWillEndSwipeCallback(willEndSwipeCallback);
-        testRunner.installDidEndSwipeCallback(didEndSwipeCallback);
-        testRunner.installDidRemoveSwipeSnapshotCallback(didRemoveSwipeSnapshotCallback);
-
-        setTimeout(function () {
</del><span class="cx">             // The second swipe should succeed because we are now scrolled to the left edge.
</span><del>-            eventQueue.enqueueSwipeEvent(0, 0, 'maybegin');
-            eventQueue.enqueueScrollEvent(1, 0, 'began');
-            eventQueue.enqueueScrollEvent(10, 0, 'changed');
-        }, 0);
-    })
</del><ins>+            startSwipeGesture(function () { completeSwipeGesture(); });
+        });
+    });
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-function completeSwipeGesture()
-{
-    eventQueue.enqueueSwipeEvent(1, 0, 'changed');
-    eventQueue.enqueueSwipeEvent(256, 0, 'changed');
-    eventQueue.enqueueSwipeEvent(0, 0, 'ended');
-}
-
</del><span class="cx"> function didBeginSwipeNotReachedCallback()
</span><span class="cx"> {
</span><span class="cx">     log(&quot;Failure. Should never begin a swipe, because we were in the middle of a scrolling gesture that started when the main frame was not pinned to the left.&quot;);
</span><span class="lines">@@ -58,10 +34,6 @@
</span><span class="cx"> function didBeginSwipeCallback()
</span><span class="cx"> {
</span><span class="cx">     log(&quot;didBeginSwipe&quot;);
</span><del>-
-    shouldBe(false, eventQueue.hasPendingEvents(), &quot;Event queue should be empty. Both scroll events should be required to start the swipe because of the swipe-start hysteresis.&quot;);
-
-    completeSwipeGesture();
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> function willEndSwipeCallback()
</span><span class="lines">@@ -75,7 +47,6 @@
</span><span class="cx"> {
</span><span class="cx">     log(&quot;didEndSwipe&quot;);
</span><span class="cx"> 
</span><del>-    shouldBe(0, eventQueue.hasPendingEvents(), &quot;Event queue should be empty. The swipe isn't complete until we see the end of the gesture.&quot;);
</del><span class="cx">     startMeasuringDuration(&quot;snapshotRemoval&quot;);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -121,8 +92,9 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // Second page loaded.
</span><del>-    window.scrollTo(1000, 0);
-    startSwipeGesture();
</del><ins>+    window.scrollTo(100, 0);
+
+    runTest();
</ins><span class="cx"> };
</span><span class="cx"> &lt;/script&gt;
</span><span class="cx"> &lt;/head&gt;
</span></span></pre></div>
<a id="trunkLayoutTestsswipepushStatecachedbackswipeexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/swipe/pushState-cached-back-swipe-expected.txt (214585 => 214586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/swipe/pushState-cached-back-swipe-expected.txt        2017-03-30 00:37:36 UTC (rev 214585)
+++ trunk/LayoutTests/swipe/pushState-cached-back-swipe-expected.txt        2017-03-30 01:05:58 UTC (rev 214586)
</span><span class="lines">@@ -1,10 +1,6 @@
</span><del>-swipe event (delta 0 0, phase 'maybegin')
-scroll event (delta 1 0, phase 'began')
-scroll event (delta 1 0, phase 'changed')
</del><ins>+startSwipeGesture
</ins><span class="cx"> didBeginSwipe
</span><del>-swipe event (delta 1 0, phase 'changed')
-swipe event (delta 256 0, phase 'changed')
-swipe event (delta 0 0, phase 'ended')
</del><ins>+completeSwipeGesture
</ins><span class="cx"> willEndSwipe
</span><span class="cx"> didEndSwipe
</span><span class="cx"> didRemoveSwipeSnapshot
</span></span></pre></div>
<a id="trunkLayoutTestsswipepushStatecachedbackswipehtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/swipe/pushState-cached-back-swipe.html (214585 => 214586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/swipe/pushState-cached-back-swipe.html        2017-03-30 00:37:36 UTC (rev 214585)
+++ trunk/LayoutTests/swipe/pushState-cached-back-swipe.html        2017-03-30 01:05:58 UTC (rev 214586)
</span><span class="lines">@@ -6,28 +6,11 @@
</span><span class="cx"> &lt;/style&gt;
</span><span class="cx"> &lt;script src=&quot;resources/swipe-test.js&quot;&gt;&lt;/script&gt;
</span><span class="cx"> &lt;script&gt;
</span><del>-function startSwipeGesture()
-{
-    eventSender.mouseMoveTo(100, 100);
</del><span class="cx"> 
</span><del>-    eventQueue.enqueueSwipeEvent(0, 0, 'maybegin');
-    eventQueue.enqueueScrollEvent(1, 0, 'began');
-    eventQueue.enqueueScrollEvent(1, 0, 'changed');
-}
-
-function completeSwipeGesture()
-{
-    eventQueue.enqueueSwipeEvent(1, 0, 'changed');
-    eventQueue.enqueueSwipeEvent(256, 0, 'changed');
-    eventQueue.enqueueSwipeEvent(0, 0, 'ended');
-}
-
</del><span class="cx"> function didBeginSwipeCallback()
</span><span class="cx"> {
</span><span class="cx">     log(&quot;didBeginSwipe&quot;);
</span><span class="cx"> 
</span><del>-    shouldBe(false, eventQueue.hasPendingEvents(), &quot;Event queue should be empty. Both scroll events should be required to start the swipe because of the swipe-start hysteresis.&quot;);
-
</del><span class="cx">     completeSwipeGesture();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -42,7 +25,6 @@
</span><span class="cx"> {
</span><span class="cx">     log(&quot;didEndSwipe&quot;);
</span><span class="cx"> 
</span><del>-    shouldBe(0, eventQueue.hasPendingEvents(), &quot;Event queue should be empty. The swipe isn't complete until we see the end of the gesture.&quot;);
</del><span class="cx">     startMeasuringDuration(&quot;snapshotRemoval&quot;);
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsswipepushStateprogrammaticbackwhileswipingcrashexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/swipe/pushState-programmatic-back-while-swiping-crash-expected.txt (214585 => 214586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/swipe/pushState-programmatic-back-while-swiping-crash-expected.txt        2017-03-30 00:37:36 UTC (rev 214585)
+++ trunk/LayoutTests/swipe/pushState-programmatic-back-while-swiping-crash-expected.txt        2017-03-30 01:05:58 UTC (rev 214586)
</span><span class="lines">@@ -1,7 +1,4 @@
</span><del>-swipe event (delta 0 0, phase 'maybegin')
-scroll event (delta 1 0, phase 'began')
-scroll event (delta 1 0, phase 'changed')
-swipe event (delta 1 0, phase 'changed')
-swipe event (delta 256 0, phase 'changed')
-swipe event (delta 0 0, phase 'ended')
</del><ins>+playEventStream
+playEventStream
+completeSwipeGesture
</ins><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsswipepushStateprogrammaticbackwhileswipingcrashhtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/swipe/pushState-programmatic-back-while-swiping-crash.html (214585 => 214586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/swipe/pushState-programmatic-back-while-swiping-crash.html        2017-03-30 00:37:36 UTC (rev 214585)
+++ trunk/LayoutTests/swipe/pushState-programmatic-back-while-swiping-crash.html        2017-03-30 01:05:58 UTC (rev 214586)
</span><span class="lines">@@ -6,14 +6,40 @@
</span><span class="cx"> &lt;/style&gt;
</span><span class="cx"> &lt;script src=&quot;resources/swipe-test.js&quot;&gt;&lt;/script&gt;
</span><span class="cx"> &lt;script&gt;
</span><del>-function startSwipeGesture()
</del><ins>+function runTest()
</ins><span class="cx"> {
</span><del>-    eventSender.mouseMoveTo(100, 100);
-
-    eventQueue.enqueueSwipeEvent(0, 0, 'maybegin');
-    eventQueue.enqueueScrollEvent(1, 0, 'began');
-    
-    eventQueue.callAfterEventDispatch(goBack);
</del><ins>+    playEventStream(`[{
+        &quot;relativeTimeMS&quot; : 0,
+        &quot;kCGEventScrollGestureFlagBits&quot; : 1,
+        &quot;kCGEventGestureHIDType&quot; : 6,
+        &quot;kCGSEventTypeField&quot; : 29,
+        &quot;kCGEventGesturePhase&quot; : 128,
+        &quot;windowLocation&quot; : &quot;{400, 300}&quot;
+      },
+      {
+        &quot;relativeTimeMS&quot; : 8,
+        &quot;kCGEventGestureHIDType&quot; : 61,
+        &quot;kCGSEventTypeField&quot; : 29,
+        &quot;kCGEventGestureStartEndSeriesType&quot; : 6,
+        &quot;windowLocation&quot; : &quot;{0, 0}&quot;
+      },
+      {
+        &quot;kCGEventGestureHIDType&quot; : 6,
+        &quot;relativeTimeMS&quot; : 8,
+        &quot;windowLocation&quot; : &quot;{400, 300}&quot;,
+        &quot;kCGEventGesturePhase&quot; : 1,
+        &quot;kCGEventScrollGestureFlagBits&quot; : 1,
+        &quot;kCGSEventTypeField&quot; : 29,
+        &quot;kCGEventGestureScrollX&quot; : 2
+      },
+      {
+        &quot;relativeTimeMS&quot; : 8,
+        &quot;windowLocation&quot; : &quot;{400, 300}&quot;,
+        &quot;kCGScrollWheelEventScrollPhase&quot; : 1,
+        &quot;kCGScrollWheelEventIsContinuous&quot; : 1,
+        &quot;kCGScrollWheelEventPointDeltaAxis2&quot; : 1,
+        &quot;kCGSEventTypeField&quot; : 22
+      }]`, goBack);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> function goBack()
</span><span class="lines">@@ -20,23 +46,27 @@
</span><span class="cx"> {
</span><span class="cx">     window.history.back();
</span><span class="cx"> 
</span><del>-    eventQueue.callAfterEventDispatch(continueSwipeGesture);
</del><ins>+    setTimeout(continueTest, 0);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-function continueSwipeGesture()
</del><ins>+function continueTest()
</ins><span class="cx"> {
</span><del>-    eventQueue.enqueueScrollEvent(1, 0, 'changed');
-
-    eventQueue.callAfterEventDispatch(completeSwipeGesture);
</del><ins>+    playEventStream(`[
+      {
+        &quot;relativeTimeMS&quot; : 0,
+        &quot;windowLocation&quot; : &quot;{400, 300}&quot;,
+        &quot;kCGScrollWheelEventScrollPhase&quot; : 1,
+        &quot;kCGScrollWheelEventIsContinuous&quot; : 1,
+        &quot;kCGScrollWheelEventPointDeltaAxis2&quot; : 20,
+        &quot;kCGSEventTypeField&quot; : 22
+      }]`, function () {
+        completeTest();
+      });
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-function completeSwipeGesture()
</del><ins>+function completeTest()
</ins><span class="cx"> {
</span><del>-    eventQueue.enqueueSwipeEvent(1, 0, 'changed');
-    eventQueue.enqueueSwipeEvent(256, 0, 'changed');
-    eventQueue.enqueueSwipeEvent(0, 0, 'ended');
-
-    eventQueue.callAfterEventDispatch(testComplete);
</del><ins>+    completeSwipeGesture(testComplete);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> function didBeginSwipeCallback()
</span><span class="lines">@@ -79,7 +109,7 @@
</span><span class="cx">         updateContent();
</span><span class="cx"> 
</span><span class="cx">         setTimeout(function () {
</span><del>-            startSwipeGesture();
</del><ins>+            runTest();
</ins><span class="cx">         }, 0);
</span><span class="cx">     }, 0);
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkLayoutTestsswiperesourcesswipetestjs"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/swipe/resources/swipe-test.js (214585 => 214586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/swipe/resources/swipe-test.js        2017-03-30 00:37:36 UTC (rev 214585)
+++ trunk/LayoutTests/swipe/resources/swipe-test.js        2017-03-30 01:05:58 UTC (rev 214586)
</span><span class="lines">@@ -1,50 +1,3 @@
</span><del>-var eventQueue = {
-    enqueueScrollEvent: function (x, y, phase) {
-        this._queue.push(function () {
-            log(&quot;scroll event (delta &quot; + x + &quot; &quot; + y + &quot;, phase '&quot; + phase + &quot;')&quot;);
-            window.eventSender.mouseScrollByWithWheelAndMomentumPhases(x, y, phase, 'none');
-        });
-        this._processEventQueueSoon();
-    },
-
-    enqueueSwipeEvent: function (x, y, phase) {
-        this._queue.push(function () {
-            log(&quot;swipe event (delta &quot; + x + &quot; &quot; + y + &quot;, phase '&quot; + phase + &quot;')&quot;);
-            window.eventSender.swipeGestureWithWheelAndMomentumPhases(x, y, phase, 'none');
-        });
-        this._processEventQueueSoon();
-    },
-
-    hasPendingEvents: function () {
-        return this._queue.length != 0;
-    },
-
-    callAfterEventDispatch: function (callback) {
-        var interval = setInterval(function () { 
-            if (!eventQueue.hasPendingEvents()) {
-                clearInterval(interval);
-                callback();
-            }
-        }, 0);
-    },
-
-    _queue: [],
-
-    _processEventQueue: function () {
-        if (!this._queue.length)
-            return;
-
-        var item = this._queue.shift();
-        item();
-        this._processEventQueueSoon();
-    },
-
-    _processEventQueueSoon: function () {
-        clearTimeout(this._processingTimeout);
-        this._processingTimeout = setTimeout(this._processEventQueue.bind(this), 0);
-    }
-}
-
</del><span class="cx"> function shouldBe(expected, actual, message)
</span><span class="cx"> {
</span><span class="cx">     if (expected != actual)
</span><span class="lines">@@ -84,4 +37,37 @@
</span><span class="cx">     var duration = Date.now() - window.localStorage[key + &quot;swipeStartTime&quot;];
</span><span class="cx">     if (duration &gt;= timeInMS)
</span><span class="cx">         log(&quot;Failure. &quot; + message + &quot; (expected: &quot; + timeInMS + &quot;, actual: &quot; + duration + &quot;)&quot;);
</span><del>-}
</del><span class="cx">\ No newline at end of file
</span><ins>+}
+
+function startSwipeGesture(callback)
+{
+    log(&quot;startSwipeGesture&quot;);
+    testRunner.runUIScript(`
+    (function() {
+        uiController.beginBackSwipe(function() {
+            uiController.uiScriptComplete();
+        });
+    })();`, callback || function () {});
+}
+
+function completeSwipeGesture(callback)
+{
+    log(&quot;completeSwipeGesture&quot;);
+    testRunner.runUIScript(`
+    (function() {
+        uiController.completeBackSwipe(function() {
+            uiController.uiScriptComplete();
+        });
+    })();`, callback || function () {});
+}
+
+function playEventStream(stream, callback)
+{
+    log(&quot;playEventStream&quot;);
+    testRunner.runUIScript(`
+    (function() {
+        uiController.playBackEventStream(\`${stream}\`, function() {
+            uiController.uiScriptComplete();
+        });
+    })();`, callback || function () {});
+}
</ins></span></pre></div>
<a id="trunkLayoutTestsswipeswipestarthysteresisfailuresexpectedtxt"></a>
<div class="delfile"><h4>Deleted: trunk/LayoutTests/swipe/swipe-start-hysteresis-failures-expected.txt (214585 => 214586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/swipe/swipe-start-hysteresis-failures-expected.txt        2017-03-30 00:37:36 UTC (rev 214585)
+++ trunk/LayoutTests/swipe/swipe-start-hysteresis-failures-expected.txt        2017-03-30 01:05:58 UTC (rev 214586)
</span><span class="lines">@@ -1,22 +0,0 @@
</span><del>-swipe event (delta 0 0, phase 'maybegin')
-scroll event (delta 1 0, phase 'began')
-scroll event (delta 0 0, phase 'changed')
-scroll event (delta 0 0, phase 'ended')
-swipe event (delta 0 0, phase 'maybegin')
-scroll event (delta 2 2, phase 'began')
-scroll event (delta 0 0, phase 'changed')
-scroll event (delta 0 0, phase 'ended')
-swipe event (delta 0 0, phase 'maybegin')
-scroll event (delta 0 2, phase 'began')
-scroll event (delta 0 0, phase 'changed')
-scroll event (delta 0 0, phase 'ended')
-swipe event (delta 0 0, phase 'maybegin')
-scroll event (delta 1 0, phase 'began')
-scroll event (delta 0 2, phase 'changed')
-scroll event (delta 0 0, phase 'ended')
-swipe event (delta 0 0, phase 'maybegin')
-scroll event (delta 3 1, phase 'began')
-scroll event (delta 0 0, phase 'changed')
-scroll event (delta 0 0, phase 'ended')
-swipe event (delta 0 0, phase 'ended')
-
</del></span></pre></div>
<a id="trunkLayoutTestsswipeswipestarthysteresisfailureshtml"></a>
<div class="delfile"><h4>Deleted: trunk/LayoutTests/swipe/swipe-start-hysteresis-failures.html (214585 => 214586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/swipe/swipe-start-hysteresis-failures.html        2017-03-30 00:37:36 UTC (rev 214585)
+++ trunk/LayoutTests/swipe/swipe-start-hysteresis-failures.html        2017-03-30 01:05:58 UTC (rev 214586)
</span><span class="lines">@@ -1,119 +0,0 @@
</span><del>-&lt;head&gt;
-&lt;style&gt;
-html {
-    font-size: 32pt;
-}
-&lt;/style&gt;
-&lt;script src=&quot;resources/swipe-test.js&quot;&gt;&lt;/script&gt;
-&lt;script&gt;
-function doShortSwipeGesture()
-{
-    eventSender.mouseMoveTo(100, 100);
-
-    // Total delta of 10, 0; should not be enough to start a swipe.
-    eventQueue.enqueueSwipeEvent(0, 0, 'maybegin');
-    eventQueue.enqueueScrollEvent(1, 0, 'began');
-    eventQueue.enqueueScrollEvent(0, 0, 'changed');
-    eventQueue.enqueueScrollEvent(0, 0, 'ended');
-
-    eventQueue.callAfterEventDispatch(doDiagonalSwipeGesture);
-}
-
-function doDiagonalSwipeGesture()
-{
-    // Total delta of 20, 20; this is ordinarily sufficient magnitude to start a swipe,
-    // but is too diagonal to start a swipe.
-    eventQueue.enqueueSwipeEvent(0, 0, 'maybegin');
-    eventQueue.enqueueScrollEvent(2, 2, 'began');
-    eventQueue.enqueueScrollEvent(0, 0, 'changed');
-    eventQueue.enqueueScrollEvent(0, 0, 'ended');
-
-    eventQueue.callAfterEventDispatch(doVerticalSwipeGesture);
-}
-
-function doVerticalSwipeGesture()
-{
-    // Total delta of 0, 20; this is ordinarily sufficient magnitude to start a swipe,
-    // but is completely vertical, so we won't start a swipe.
-    eventQueue.enqueueSwipeEvent(0, 0, 'maybegin');
-    eventQueue.enqueueScrollEvent(0, 2, 'began');
-    eventQueue.enqueueScrollEvent(0, 0, 'changed');
-    eventQueue.enqueueScrollEvent(0, 0, 'ended');
-
-    eventQueue.callAfterEventDispatch(doHorizontalThenVerticalSwipeGesture);
-}
-
-function doHorizontalThenVerticalSwipeGesture()
-{
-    // Total delta of 10, 20; this is ordinarily sufficient magnitude to start a swipe,
-    // but is too vertical, so we won't start a swipe.
-    eventQueue.enqueueSwipeEvent(0, 0, 'maybegin');
-    eventQueue.enqueueScrollEvent(1, 0, 'began');
-    eventQueue.enqueueScrollEvent(0, 2, 'changed');
-    eventQueue.enqueueScrollEvent(0, 0, 'ended');
-
-    eventQueue.callAfterEventDispatch(doRegularSwipeGesture);
-}
-
-function doRegularSwipeGesture()
-{
-    // Swap in a different callback that makes sure we *do* reach didBeginSwipe.
-    testRunner.clearTestRunnerCallbacks();
-    var sawDidBeginSwipe = false;
-    testRunner.installDidBeginSwipeCallback(function () {
-        sawDidBeginSwipe = true;
-        // Need a swipe-end event to clean up.
-        eventQueue.enqueueSwipeEvent(0, 0, 'ended');
-    });
-
-    testRunner.installDidRemoveSwipeSnapshotCallback(function () {
-        shouldBe(true, sawDidBeginSwipe, &quot;The last gesture should start a swipe, because it is sufficient magnitude and in the correct direction.&quot;)
-        testComplete();
-    });
-
-    // Total delta of 30, 10; this should start a swipe as usual.
-    eventQueue.enqueueSwipeEvent(0, 0, 'maybegin');
-    eventQueue.enqueueScrollEvent(3, 1, 'began');
-    eventQueue.enqueueScrollEvent(0, 0, 'changed');
-    eventQueue.enqueueScrollEvent(0, 0, 'ended');
-}
-
-function didBeginSwipeNotReachedCallback()
-{
-    log(&quot;Failure. Should never begin a swipe, because all of the attempted swipes should fail due to the swipe-start hysteresis.&quot;);
-}
-
-function isFirstPage()
-{
-    return window.location.href.indexOf(&quot;second&quot;) == -1;
-}
-
-window.onload = function () {
-    if (!window.eventSender || !window.testRunner) {
-        document.body.innerHTML = &quot;This test must be run in WebKitTestRunner.&quot;;
-        return;
-    }
-
-    document.body.innerHTML = isFirstPage() ? &quot;first&quot; : &quot;second&quot;;
-
-    if (isFirstPage()) {
-        initializeSwipeTest();
-
-        testRunner.installDidBeginSwipeCallback(didBeginSwipeNotReachedCallback);
-
-        testRunner.overridePreference(&quot;WebKitUsesPageCachePreferenceKey&quot;, 1);
-        testRunner.dumpAsText();
-        testRunner.waitUntilDone();
-
-        setTimeout(function () { 
-            window.location.href = window.location.href + &quot;?second&quot;;
-        }, 0);
-        return;
-    }
-
-    doShortSwipeGesture();
-};
-&lt;/script&gt;
-&lt;/head&gt;
-&lt;body&gt;
-&lt;/body&gt;
</del><span class="cx">\ No newline at end of file
</span></span></pre></div>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (214585 => 214586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog        2017-03-30 00:37:36 UTC (rev 214585)
+++ trunk/Tools/ChangeLog        2017-03-30 01:05:58 UTC (rev 214586)
</span><span class="lines">@@ -1,3 +1,45 @@
</span><ins>+2017-03-29  Tim Horton  &lt;timothy_horton@apple.com&gt;
+
+        Swipe gesture tests don't work on macOS Sierra
+        https://bugs.webkit.org/show_bug.cgi?id=161675
+        &lt;rdar://problem/23379930&gt;
+
+        Reviewed by Darin Adler.
+
+        * DumpRenderTree/mac/UIScriptControllerMac.mm:
+        (WTR::UIScriptController::platformPlayBackEventStream):
+        (WTR::UIScriptController::beginBackSwipe):
+        (WTR::UIScriptController::completeBackSwipe):
+        * TestRunnerShared/EventSerialization/mac/EventSerializerMac.h: Copied from Tools/DumpRenderTree/mac/UIScriptControllerMac.mm.
+        * TestRunnerShared/EventSerialization/mac/EventSerializerMac.mm: Added.
+        (eventIsOfType):
+        (eventIsOfTypes):
+        (eventIsOfGestureType):
+        (eventIsOfGestureTypes):
+        (+[EventSerializer dictionaryForEvent:relativeToTime:]):
+        (+[EventSerializer createEventForDictionary:inWindow:relativeToTime:]):
+        (+[EventSerializer playEventStream:inWindow:completionHandler:]):
+        * TestRunnerShared/EventSerialization/mac/SharedEventStreamsMac.h: Copied from Tools/WebKitTestRunner/mac/UIScriptControllerMac.mm.
+        * TestRunnerShared/EventSerialization/mac/SharedEventStreamsMac.mm: Added.
+        (beginSwipeBackEventStream):
+        (completeSwipeBackEventStream):
+        * TestRunnerShared/UIScriptContext/Bindings/UIScriptController.idl:
+        * TestRunnerShared/UIScriptContext/UIScriptController.cpp:
+        (WTR::UIScriptController::playBackEventStream):
+        (WTR::UIScriptController::beginBackSwipe):
+        (WTR::UIScriptController::completeBackSwipe):
+        (WTR::UIScriptController::platformPlayBackEventStream):
+        (WTR::UIScriptController::platformClearAllCallbacks): Deleted.
+        * TestRunnerShared/UIScriptContext/UIScriptController.h:
+        * TestRunnerShared/spi/CoreGraphicsSPI.h: Added.
+        * TestRunnerShared/spi/IOKitSPI.h: Renamed from Tools/WebKitTestRunner/ios/IOKitSPI.h.
+        * WebKitTestRunner/WebKitTestRunner.xcodeproj/project.pbxproj:
+        * WebKitTestRunner/mac/UIScriptControllerMac.mm:
+        (WTR::playBackEvents):
+        (WTR::UIScriptController::beginBackSwipe):
+        (WTR::UIScriptController::completeBackSwipe):
+        (WTR::UIScriptController::platformPlayBackEventStream):
+
</ins><span class="cx"> 2017-03-29  Jonathan Bedard  &lt;jbedard@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         webkitpy: Robust test clean-up
</span></span></pre></div>
<a id="trunkToolsDumpRenderTreemacUIScriptControllerMacmm"></a>
<div class="modfile"><h4>Modified: trunk/Tools/DumpRenderTree/mac/UIScriptControllerMac.mm (214585 => 214586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/DumpRenderTree/mac/UIScriptControllerMac.mm        2017-03-30 00:37:36 UTC (rev 214585)
+++ trunk/Tools/DumpRenderTree/mac/UIScriptControllerMac.mm        2017-03-30 01:05:58 UTC (rev 214586)
</span><span class="lines">@@ -136,6 +136,18 @@
</span><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void UIScriptController::beginBackSwipe(JSValueRef callback)
+{
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void UIScriptController::completeBackSwipe(JSValueRef callback)
+{
+}
+
+void UIScriptController::platformPlayBackEventStream(JSStringRef, JSValueRef)
+{
+}
+
+}
+
</ins><span class="cx"> #endif // PLATFORM(MAC)
</span></span></pre></div>
<a id="trunkToolsTestRunnerSharedEventSerializationmacEventSerializerMach"></a>
<div class="addfile"><h4>Added: trunk/Tools/TestRunnerShared/EventSerialization/mac/EventSerializerMac.h (0 => 214586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestRunnerShared/EventSerialization/mac/EventSerializerMac.h                                (rev 0)
+++ trunk/Tools/TestRunnerShared/EventSerialization/mac/EventSerializerMac.h        2017-03-30 01:05:58 UTC (rev 214586)
</span><span class="lines">@@ -0,0 +1,51 @@
</span><ins>+/*
+ * Copyright (C) 2016 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#if PLATFORM(MAC)
+
+#import &lt;AppKit/AppKit.h&gt;
+#import &lt;wtf/BlockPtr.h&gt;
+#import &lt;wtf/RetainPtr.h&gt;
+
+@interface EventSerializer : NSObject
+
++ (NSDictionary *)dictionaryForEvent:(CGEventRef)event relativeToTime:(CGEventTimestamp)referenceTimestamp;
+
++ (RetainPtr&lt;CGEventRef&gt;)createEventForDictionary:(NSDictionary *)dict inWindow:(NSWindow *)window relativeToTime:(CGEventTimestamp)referenceTimestamp;
+
+@end
+
+@interface EventStreamPlayer : NSObject {
+    RetainPtr&lt;NSMutableArray *&gt; _remainingEventDictionaries;
+    RetainPtr&lt;NSWindow *&gt; _window;
+    BlockPtr&lt;void ()&gt; _completionHandler;
+    uint64_t _startTime;
+}
+
++ (void)playStream:(NSArray&lt;NSDictionary *&gt; *)eventDicts window:(NSWindow *)window completionHandler:(void(^)())completionHandler;
+
+@end
+
+#endif
</ins></span></pre></div>
<a id="trunkToolsTestRunnerSharedEventSerializationmacEventSerializerMacmm"></a>
<div class="addfile"><h4>Added: trunk/Tools/TestRunnerShared/EventSerialization/mac/EventSerializerMac.mm (0 => 214586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestRunnerShared/EventSerialization/mac/EventSerializerMac.mm                                (rev 0)
+++ trunk/Tools/TestRunnerShared/EventSerialization/mac/EventSerializerMac.mm        2017-03-30 01:05:58 UTC (rev 214586)
</span><span class="lines">@@ -0,0 +1,320 @@
</span><ins>+/*
+ * Copyright (C) 2016 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import &quot;config.h&quot;
+#import &quot;EventSerializerMac.h&quot;
+
+#if PLATFORM(MAC)
+
+#import &quot;CoreGraphicsSPI.h&quot;
+#import &quot;IOKitSPI.h&quot;
+#import &lt;algorithm&gt;
+#import &lt;mach/mach_time.h&gt;
+#import &lt;wtf/RetainPtr.h&gt;
+
+#define MOUSE_EVENT_TYPES \
+    (CGSEventType)kCGEventLeftMouseDown, \
+    (CGSEventType)kCGEventLeftMouseUp, \
+    (CGSEventType)kCGEventRightMouseDown, \
+    (CGSEventType)kCGEventRightMouseUp, \
+    (CGSEventType)kCGEventMouseMoved, \
+    (CGSEventType)kCGEventLeftMouseDragged, \
+    (CGSEventType)kCGEventRightMouseDragged, \
+    (CGSEventType)kCGEventOtherMouseDown, \
+    (CGSEventType)kCGEventOtherMouseUp, \
+    (CGSEventType)kCGEventOtherMouseDragged
+
+#define KEY_EVENT_TYPES \
+    (CGSEventType)kCGEventKeyDown, \
+    (CGSEventType)kCGEventKeyUp, \
+    (CGSEventType)kCGEventFlagsChanged
+
+#define GESTURE_EVENT_TYPES \
+    kCGSEventGesture, \
+    kCGSEventFluidTouchGesture, \
+    kCGSEventDockControl
+
+bool eventIsOfType(CGEventRef event, CGSEventType type)
+{
+    return (CGSEventType)CGEventGetType(event) == type;
+}
+
+bool eventIsOfTypes(CGEventRef) { return false; }
+
+template&lt;typename ... Types&gt;
+bool eventIsOfTypes(CGEventRef event, CGSEventType first, Types ... rest)
+{
+    return eventIsOfType(event, first) || eventIsOfTypes(event, rest...);
+}
+
+bool eventIsOfGestureType(CGEventRef event, IOHIDEventType type)
+{
+    return (IOHIDEventType)CGEventGetIntegerValueField(event, kCGEventGestureHIDType) == type;
+}
+
+bool eventIsOfGestureTypes(CGEventRef) { return false; }
+
+template&lt;typename ... Types&gt;
+bool eventIsOfGestureTypes(CGEventRef event, IOHIDEventType first, Types ... rest)
+{
+    if (!eventIsOfTypes(event, GESTURE_EVENT_TYPES))
+        return false;
+    return eventIsOfGestureType(event, first) || eventIsOfGestureTypes(event, rest...);
+}
+
+#define FOR_EACH_CGEVENT_INTEGER_FIELD(macro) \
+    macro(true, kCGSEventTypeField) \
+    \
+    macro(eventIsOfTypes(rawEvent, kCGSEventScrollWheel, kCGSEventZoom), kCGScrollWheelEventDeltaAxis1) \
+    macro(eventIsOfTypes(rawEvent, kCGSEventScrollWheel, kCGSEventZoom), kCGScrollWheelEventDeltaAxis2) \
+    macro(eventIsOfTypes(rawEvent, kCGSEventScrollWheel, kCGSEventZoom), kCGScrollWheelEventDeltaAxis3) \
+    macro(eventIsOfTypes(rawEvent, kCGSEventScrollWheel, kCGSEventZoom), kCGScrollWheelEventIsContinuous) \
+    macro(eventIsOfTypes(rawEvent, kCGSEventScrollWheel, kCGSEventZoom), kCGScrollWheelEventMomentumPhase) \
+    macro(eventIsOfTypes(rawEvent, kCGSEventScrollWheel, kCGSEventZoom), kCGScrollWheelEventPointDeltaAxis1) \
+    macro(eventIsOfTypes(rawEvent, kCGSEventScrollWheel, kCGSEventZoom), kCGScrollWheelEventPointDeltaAxis2) \
+    macro(eventIsOfTypes(rawEvent, kCGSEventScrollWheel, kCGSEventZoom), kCGScrollWheelEventPointDeltaAxis3) \
+    macro(eventIsOfTypes(rawEvent, kCGSEventScrollWheel, kCGSEventZoom), kCGScrollWheelEventScrollCount) \
+    macro(eventIsOfTypes(rawEvent, kCGSEventScrollWheel, kCGSEventZoom), kCGScrollWheelEventScrollPhase) \
+    \
+    macro(eventIsOfTypes(rawEvent, MOUSE_EVENT_TYPES), kCGMouseEventButtonNumber) \
+    macro(eventIsOfTypes(rawEvent, MOUSE_EVENT_TYPES), kCGMouseEventClickState) \
+    macro(eventIsOfTypes(rawEvent, MOUSE_EVENT_TYPES), kCGMouseEventDeltaX) \
+    macro(eventIsOfTypes(rawEvent, MOUSE_EVENT_TYPES), kCGMouseEventDeltaY) \
+    macro(eventIsOfTypes(rawEvent, MOUSE_EVENT_TYPES), kCGMouseEventSubtype) \
+    macro(eventIsOfTypes(rawEvent, MOUSE_EVENT_TYPES), kCGMouseEventNumber) \
+    \
+    macro(eventIsOfTypes(rawEvent, KEY_EVENT_TYPES), kCGKeyboardEventAutorepeat) \
+    macro(eventIsOfTypes(rawEvent, KEY_EVENT_TYPES), kCGKeyboardEventKeyboardType) \
+    macro(eventIsOfTypes(rawEvent, KEY_EVENT_TYPES), kCGKeyboardEventKeycode) \
+    \
+    macro(eventIsOfTypes(rawEvent, GESTURE_EVENT_TYPES), kCGEventGestureHIDType) \
+    macro(eventIsOfTypes(rawEvent, GESTURE_EVENT_TYPES), kCGEventGestureBehavior) \
+    macro(eventIsOfTypes(rawEvent, GESTURE_EVENT_TYPES), kCGEventGestureFlavor) \
+    macro(eventIsOfTypes(rawEvent, GESTURE_EVENT_TYPES), kCGEventGestureMask) \
+    macro(eventIsOfTypes(rawEvent, GESTURE_EVENT_TYPES), kCGEventGesturePhase) \
+    macro(eventIsOfTypes(rawEvent, GESTURE_EVENT_TYPES), kCGEventGestureStage) \
+    \
+    macro(eventIsOfGestureType(rawEvent, kIOHIDEventTypeScroll), kCGEventScrollGestureFlagBits) \
+    \
+    macro(eventIsOfGestureType(rawEvent, kIOHIDEventTypeNavigationSwipe), kCGEventSwipeGestureFlagBits) \
+    macro(eventIsOfGestureType(rawEvent, kIOHIDEventTypeNavigationSwipe), kCGEventGestureSwipeMask) \
+    macro(eventIsOfGestureType(rawEvent, kIOHIDEventTypeNavigationSwipe), kCGEventGestureSwipeMotion) \
+    macro(eventIsOfGestureType(rawEvent, kIOHIDEventTypeNavigationSwipe), kCGEventGestureSwipeValue) \
+    macro(eventIsOfGestureType(rawEvent, kIOHIDEventTypeNavigationSwipe), kCGEventGestureFlavor) \
+    \
+    macro(eventIsOfGestureTypes(rawEvent, kCGHIDEventTypeGestureStarted, kCGHIDEventTypeGestureEnded), kCGEventGestureStartEndSeriesType)
+
+#define FOR_EACH_CGEVENT_DOUBLE_FIELD(macro) \
+    macro(eventIsOfTypes(rawEvent, GESTURE_EVENT_TYPES), kCGEventGestureProgress) \
+    \
+    macro(eventIsOfTypes(rawEvent, MOUSE_EVENT_TYPES), kCGMouseEventPressure) \
+    \
+    macro(eventIsOfGestureType(rawEvent, kIOHIDEventTypeZoom), kCGEventGestureZoomDeltaX) \
+    macro(eventIsOfGestureType(rawEvent, kIOHIDEventTypeZoom), kCGEventGestureZoomDeltaY) \
+    macro(eventIsOfGestureType(rawEvent, kIOHIDEventTypeZoom), kCGEventGestureZoomValue) \
+    \
+    macro(eventIsOfGestureType(rawEvent, kIOHIDEventTypeRotation), kCGEventGestureRotationValue) \
+    \
+    macro(eventIsOfGestureType(rawEvent, kIOHIDEventTypeScroll), kCGEventGestureScrollX) \
+    macro(eventIsOfGestureType(rawEvent, kIOHIDEventTypeScroll), kCGEventGestureScrollY) \
+    macro(eventIsOfGestureType(rawEvent, kIOHIDEventTypeScroll), kCGEventGestureScrollZ) \
+    \
+    macro(eventIsOfGestureType(rawEvent, kIOHIDEventTypeNavigationSwipe), kCGEventGestureSwipePositionX) \
+    macro(eventIsOfGestureType(rawEvent, kIOHIDEventTypeNavigationSwipe), kCGEventGestureSwipePositionY) \
+    macro(eventIsOfGestureType(rawEvent, kIOHIDEventTypeNavigationSwipe), kCGEventGestureSwipeProgress) \
+    macro(eventIsOfGestureType(rawEvent, kIOHIDEventTypeNavigationSwipe), kCGEventGestureSwipeVelocityX) \
+    macro(eventIsOfGestureType(rawEvent, kIOHIDEventTypeNavigationSwipe), kCGEventGestureSwipeVelocityY) \
+    macro(eventIsOfGestureType(rawEvent, kIOHIDEventTypeNavigationSwipe), kCGEventGestureSwipeVelocityZ) \
+    \
+    macro(eventIsOfGestureType(rawEvent, kIOHIDEventTypeForce), kCGEventTransitionProgress) \
+    macro(eventIsOfGestureType(rawEvent, kIOHIDEventTypeForce), kCGEventStagePressure)
+
+#define LOAD_INTEGER_FIELD_FROM_EVENT(eventTypeFilter, field) \
+^ { \
+    if (!(eventTypeFilter)) \
+        return; \
+    int64_t value = CGEventGetIntegerValueField(rawEvent, field); \
+    int64_t plainValue = CGEventGetIntegerValueField(rawPlainEvent, field); \
+    if (value != plainValue) \
+        dict[@#field] = @(value); \
+}();
+
+#define LOAD_DOUBLE_FIELD_FROM_EVENT(eventTypeFilter, field) \
+^ { \
+    if (!(eventTypeFilter)) \
+        return; \
+    double value = CGEventGetDoubleValueField(rawEvent, field); \
+    if (!isnan(value)) { \
+        double plainValue = CGEventGetDoubleValueField(rawPlainEvent, field); \
+        if (fabs(value - plainValue) &gt;= FLT_EPSILON) \
+            dict[@#field] = @(value); \
+    } \
+}();
+
+#define STORE_INTEGER_FIELD_TO_EVENT(eventTypeFilter, field) \
+^ { \
+    if (!(eventTypeFilter)) \
+        return; \
+    NSNumber *value = dict[@#field]; \
+    if (value) \
+        CGEventSetIntegerValueField(rawEvent, field, value.unsignedLongLongValue); \
+}();
+
+#define STORE_DOUBLE_FIELD_TO_EVENT(eventTypeFilter, field) \
+^ { \
+    if (!(eventTypeFilter)) \
+        return; \
+    NSNumber *value = dict[@#field]; \
+    if (value) \
+        CGEventSetDoubleValueField(rawEvent, field, value.doubleValue); \
+}();
+
+@implementation EventSerializer
+
++ (NSDictionary *)dictionaryForEvent:(CGEventRef)rawEvent relativeToTime:(CGEventTimestamp)referenceTimestamp
+{
+    RetainPtr&lt;CGEventRef&gt; plainEvent = adoptCF(CGEventCreate(NULL));
+    CGEventRef rawPlainEvent = plainEvent.get();
+
+    NSMutableDictionary *dict = [[[NSMutableDictionary alloc] init] autorelease];
+
+    FOR_EACH_CGEVENT_INTEGER_FIELD(LOAD_INTEGER_FIELD_FROM_EVENT);
+    FOR_EACH_CGEVENT_DOUBLE_FIELD(LOAD_DOUBLE_FIELD_FROM_EVENT);
+
+    CGEventTimestamp timestamp = CGEventGetTimestamp(rawEvent);
+    dict[@&quot;relativeTimeMS&quot;] = @(std::max(static_cast&lt;double&gt;(timestamp - referenceTimestamp) / NSEC_PER_MSEC, 0.0));
+
+    CGSEventType eventType = (CGSEventType)CGEventGetIntegerValueField(rawEvent, kCGSEventTypeField);
+    if (eventType == kCGSEventGesture || eventType == kCGSEventFluidTouchGesture || eventType == kCGSEventDockControl) {
+        if (CGEventGetIntegerValueField(rawEvent, kCGEventGestureIsPreflight)) {
+            dict[@&quot;kCGEventGestureIsPreflight&quot;] = @YES;
+            dict[@&quot;kCGEventGesturePreflightProgress&quot;] = @(CGEventGetDoubleValueField(rawEvent, kCGEventGesturePreflightProgress));
+        }
+    }
+
+    dict[@&quot;windowLocation&quot;] = NSStringFromPoint(NSPointFromCGPoint(CGEventGetWindowLocation(rawEvent)));
+
+    auto flags = static_cast&lt;CGEventFlags&gt;(CGEventGetFlags(rawEvent) &amp; ~NX_NONCOALSESCEDMASK);
+    auto plainFlags = static_cast&lt;CGEventFlags&gt;(CGEventGetFlags(rawPlainEvent) &amp; ~NX_NONCOALSESCEDMASK);
+    if (flags != plainFlags)
+        dict[@&quot;flags&quot;] = @(flags);
+
+    return dict;
+}
+
++ (RetainPtr&lt;CGEventRef&gt;)createEventForDictionary:(NSDictionary *)dict inWindow:(NSWindow *)window relativeToTime:(CGEventTimestamp)referenceTimestamp
+{
+    RetainPtr&lt;CGEventRef&gt; event = adoptCF(CGEventCreate(NULL));
+    CGEventRef rawEvent = event.get();
+
+    FOR_EACH_CGEVENT_INTEGER_FIELD(STORE_INTEGER_FIELD_TO_EVENT);
+    FOR_EACH_CGEVENT_DOUBLE_FIELD(STORE_DOUBLE_FIELD_TO_EVENT);
+
+    if (dict[@&quot;relativeTimeMS&quot;])
+        CGEventSetTimestamp(event.get(), referenceTimestamp + static_cast&lt;CGEventTimestamp&gt;(([dict[@&quot;relativeTimeMS&quot;] doubleValue] * NSEC_PER_MSEC)));
+
+    if ([dict[@&quot;kCGEventGestureIsPreflight&quot;] boolValue]) {
+        CGEventSetIntegerValueField(rawEvent, kCGEventGestureIsPreflight, 1);
+        CGEventSetDoubleValueField(rawEvent, kCGEventGesturePreflightProgress, [dict[@&quot;kCGEventGesturePreflightProgress&quot;] doubleValue]);
+    }
+
+    if (dict[@&quot;windowLocation&quot;]) {
+        CGPoint windowLocation = NSPointToCGPoint(NSPointFromString(dict[@&quot;windowLocation&quot;]));
+        CGEventSetWindowLocation(rawEvent, windowLocation);
+
+        NSPoint screenPoint = [window convertRectToScreen:NSMakeRect(windowLocation.x, windowLocation.y, 1, 1)].origin;
+        CGEventSetLocation(rawEvent, CGPointMake(screenPoint.x, NSScreen.screens.firstObject.frame.size.height - screenPoint.y));
+    }
+
+    if (dict[@&quot;flags&quot;])
+        CGEventSetFlags(rawEvent, static_cast&lt;CGEventFlags&gt;([dict[@&quot;flags&quot;] unsignedLongLongValue]));
+
+    CGEventSetIntegerValueField(rawEvent, kCGSEventWindowIDField, window.windowNumber);
+
+    return event;
+}
+
+@end
+
+@implementation EventStreamPlayer
+
+const float eventDispatchTimerRate = 1. / 120.;
+
++ (void)playStream:(NSArray&lt;NSDictionary *&gt; *)eventDicts window:(NSWindow *)window completionHandler:(void(^)())completionHandler
+{
+    RetainPtr&lt;EventStreamPlayer&gt; player = adoptNS([[EventStreamPlayer alloc] init]);
+
+    player-&gt;_remainingEventDictionaries = adoptNS([eventDicts mutableCopy]);
+    player-&gt;_window = window;
+
+    if (completionHandler)
+        player-&gt;_completionHandler = makeBlockPtr(completionHandler);
+
+    player-&gt;_startTime = mach_absolute_time();
+
+    [NSTimer scheduledTimerWithTimeInterval:eventDispatchTimerRate target:player.get() selector:@selector(playbackTimerFired:) userInfo:nil repeats:YES];
+}
+
+- (void)playbackTimerFired:(NSTimer *)timer
+{
+    auto removeList = adoptNS([[NSMutableArray alloc] init]);
+    NSEvent *nsEvent = nil;
+    for (id eventDict in _remainingEventDictionaries.get()) {
+        RetainPtr&lt;CGEventRef&gt; event = [EventSerializer createEventForDictionary:eventDict inWindow:_window.get() relativeToTime:_startTime];
+        if (CGEventGetTimestamp(event.get()) &lt; mach_absolute_time()) {
+            nsEvent = [NSEvent eventWithCGEvent:event.get()];
+            [NSApp postEvent:nsEvent atStart:NO];
+            [removeList addObject:eventDict];
+        }
+    }
+    [_remainingEventDictionaries removeObjectsInArray:removeList.get()];
+
+    if ([_remainingEventDictionaries count])
+        return;
+
+#if __MAC_OS_X_VERSION_MIN_REQUIRED &gt;= 101200
+    NSEventType applicationDefinedEventType = NSEventTypeApplicationDefined;
+#else
+    NSEventType applicationDefinedEventType = NSApplicationDefined;
+#endif
+    [NSApp postEvent:[NSEvent otherEventWithType:applicationDefinedEventType location:NSZeroPoint modifierFlags:0 timestamp:0 windowNumber:0 context:0 subtype:0 data1:42 data2:0] atStart:NO];
+    // Block until we send the last event we posted.
+    while (true) {
+        NSEvent *nextEvent = [NSApp nextEventMatchingMask:NSAnyEventMask untilDate:[NSDate dateWithTimeIntervalSinceNow:eventDispatchTimerRate] inMode:NSDefaultRunLoopMode dequeue:YES];
+        if (nextEvent.type == applicationDefinedEventType &amp;&amp; nextEvent.data1 == 42)
+            break;
+        if (nextEvent)
+            [NSApp sendEvent:nextEvent];
+    }
+
+    if (_completionHandler)
+        _completionHandler();
+
+    [timer invalidate];
+}
+
+@end
+
+#endif
</ins></span></pre></div>
<a id="trunkToolsTestRunnerSharedEventSerializationmacSharedEventStreamsMach"></a>
<div class="addfile"><h4>Added: trunk/Tools/TestRunnerShared/EventSerialization/mac/SharedEventStreamsMac.h (0 => 214586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestRunnerShared/EventSerialization/mac/SharedEventStreamsMac.h                                (rev 0)
+++ trunk/Tools/TestRunnerShared/EventSerialization/mac/SharedEventStreamsMac.h        2017-03-30 01:05:58 UTC (rev 214586)
</span><span class="lines">@@ -0,0 +1,33 @@
</span><ins>+/*
+ * Copyright (C) 2016 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#if PLATFORM(MAC)
+
+@class NSString;
+
+NSString *beginSwipeBackEventStream();
+NSString *completeSwipeBackEventStream();
+
+#endif
</ins></span></pre></div>
<a id="trunkToolsTestRunnerSharedEventSerializationmacSharedEventStreamsMacmm"></a>
<div class="addfile"><h4>Added: trunk/Tools/TestRunnerShared/EventSerialization/mac/SharedEventStreamsMac.mm (0 => 214586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestRunnerShared/EventSerialization/mac/SharedEventStreamsMac.mm                                (rev 0)
+++ trunk/Tools/TestRunnerShared/EventSerialization/mac/SharedEventStreamsMac.mm        2017-03-30 01:05:58 UTC (rev 214586)
</span><span class="lines">@@ -0,0 +1,369 @@
</span><ins>+/*
+ * Copyright (C) 2016 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import &quot;config.h&quot;
+#import &quot;SharedEventStreamsMac.h&quot;
+
+#if PLATFORM(MAC)
+
+#define QUOTE(...) @(#__VA_ARGS__)
+
+NSString *beginSwipeBackEventStream()
+{
+    return QUOTE([
+        {
+            &quot;relativeTimeMS&quot; : 0,
+            &quot;kCGEventScrollGestureFlagBits&quot; : 1,
+            &quot;kCGEventGestureHIDType&quot; : 6,
+            &quot;kCGSEventTypeField&quot; : 29,
+            &quot;kCGEventGesturePhase&quot; : 128,
+            &quot;windowLocation&quot; : &quot;{400, 300}&quot;
+        },
+        {
+            &quot;relativeTimeMS&quot; : 8,
+            &quot;kCGEventGestureHIDType&quot; : 61,
+            &quot;kCGSEventTypeField&quot; : 29,
+            &quot;kCGEventGestureStartEndSeriesType&quot; : 6,
+            &quot;windowLocation&quot; : &quot;{400, 300}&quot;
+        },
+        {
+            &quot;kCGEventGestureHIDType&quot; : 6,
+            &quot;relativeTimeMS&quot; : 8,
+            &quot;windowLocation&quot; : &quot;{400, 300}&quot;,
+            &quot;kCGEventGesturePhase&quot; : 1,
+            &quot;kCGEventScrollGestureFlagBits&quot; : 1,
+            &quot;kCGSEventTypeField&quot; : 29,
+            &quot;kCGEventGestureScrollX&quot; : 2
+        },
+        {
+            &quot;relativeTimeMS&quot; : 8,
+            &quot;windowLocation&quot; : &quot;{400, 300}&quot;,
+            &quot;kCGScrollWheelEventScrollPhase&quot; : 1,
+            &quot;kCGScrollWheelEventIsContinuous&quot; : 1,
+            &quot;kCGScrollWheelEventPointDeltaAxis2&quot; : 1,
+            &quot;kCGSEventTypeField&quot; : 22
+        },
+        {
+            &quot;kCGEventGestureHIDType&quot; : 6,
+            &quot;relativeTimeMS&quot; : 17,
+            &quot;windowLocation&quot; : &quot;{400, 300}&quot;,
+            &quot;kCGEventGestureScrollY&quot; : 1,
+            &quot;kCGEventGesturePhase&quot; : 2,
+            &quot;kCGEventScrollGestureFlagBits&quot; : 1,
+            &quot;kCGSEventTypeField&quot; : 29,
+            &quot;kCGEventGestureScrollX&quot; : 12
+        },
+        {
+            &quot;kCGScrollWheelEventPointDeltaAxis1&quot; : 1,
+            &quot;relativeTimeMS&quot; : 17,
+            &quot;kCGScrollWheelEventScrollPhase&quot; : 2,
+            &quot;kCGScrollWheelEventIsContinuous&quot; : 1,
+            &quot;kCGScrollWheelEventPointDeltaAxis2&quot; : 4,
+            &quot;windowLocation&quot; : &quot;{400, 300}&quot;,
+            &quot;kCGSEventTypeField&quot; : 22
+        },
+        {
+            &quot;kCGEventGestureHIDType&quot; : 6,
+            &quot;relativeTimeMS&quot; : 25,
+            &quot;windowLocation&quot; : &quot;{400, 300}&quot;,
+            &quot;kCGEventGestureScrollY&quot; : 2,
+            &quot;kCGEventGesturePhase&quot; : 2,
+            &quot;kCGEventScrollGestureFlagBits&quot; : 1,
+            &quot;kCGSEventTypeField&quot; : 29,
+            &quot;kCGEventGestureScrollX&quot; : 23
+        },
+        {
+            &quot;kCGScrollWheelEventDeltaAxis2&quot; : 1,
+            &quot;kCGScrollWheelEventPointDeltaAxis1&quot; : 1,
+            &quot;relativeTimeMS&quot; : 25,
+            &quot;kCGScrollWheelEventIsContinuous&quot; : 1,
+            &quot;kCGScrollWheelEventScrollPhase&quot; : 2,
+            &quot;kCGScrollWheelEventPointDeltaAxis2&quot; : 11,
+            &quot;windowLocation&quot; : &quot;{400, 300}&quot;,
+            &quot;kCGSEventTypeField&quot; : 22
+        },
+        {
+            &quot;kCGEventGestureHIDType&quot; : 6,
+            &quot;relativeTimeMS&quot; : 33,
+            &quot;windowLocation&quot; : &quot;{400, 300}&quot;,
+            &quot;kCGEventGestureScrollY&quot; : 2,
+            &quot;kCGEventGesturePhase&quot; : 2,
+            &quot;kCGEventScrollGestureFlagBits&quot; : 1,
+            &quot;kCGSEventTypeField&quot; : 29,
+            &quot;kCGEventGestureScrollX&quot; : 28
+        },
+        {
+            &quot;kCGScrollWheelEventDeltaAxis2&quot; : 2,
+            &quot;kCGScrollWheelEventPointDeltaAxis1&quot; : 1,
+            &quot;relativeTimeMS&quot; : 33,
+            &quot;kCGScrollWheelEventIsContinuous&quot; : 1,
+            &quot;kCGScrollWheelEventScrollPhase&quot; : 2,
+            &quot;kCGScrollWheelEventPointDeltaAxis2&quot; : 16,
+            &quot;windowLocation&quot; : &quot;{400, 300}&quot;,
+            &quot;kCGSEventTypeField&quot; : 22
+        },
+        {
+            &quot;kCGEventGestureHIDType&quot; : 6,
+            &quot;relativeTimeMS&quot; : 41,
+            &quot;windowLocation&quot; : &quot;{400, 300}&quot;,
+            &quot;kCGEventGestureScrollY&quot; : 1,
+            &quot;kCGEventGesturePhase&quot; : 2,
+            &quot;kCGEventScrollGestureFlagBits&quot; : 1,
+            &quot;kCGSEventTypeField&quot; : 29,
+            &quot;kCGEventGestureScrollX&quot; : 35
+        },
+        {
+            &quot;kCGScrollWheelEventDeltaAxis2&quot; : 2,
+            &quot;kCGScrollWheelEventPointDeltaAxis1&quot; : 1,
+            &quot;relativeTimeMS&quot; : 41,
+            &quot;kCGScrollWheelEventIsContinuous&quot; : 1,
+            &quot;kCGScrollWheelEventScrollPhase&quot; : 2,
+            &quot;kCGScrollWheelEventPointDeltaAxis2&quot; : 24,
+            &quot;windowLocation&quot; : &quot;{400, 300}&quot;,
+            &quot;kCGSEventTypeField&quot; : 22
+        },
+        {
+            &quot;kCGEventGestureHIDType&quot; : 6,
+            &quot;relativeTimeMS&quot; : 49,
+            &quot;windowLocation&quot; : &quot;{400, 300}&quot;,
+            &quot;kCGEventGestureScrollY&quot; : -1,
+            &quot;kCGEventGesturePhase&quot; : 2,
+            &quot;kCGEventScrollGestureFlagBits&quot; : 1,
+            &quot;kCGSEventTypeField&quot; : 29,
+            &quot;kCGEventGestureScrollX&quot; : 45
+        },
+        {
+            &quot;kCGScrollWheelEventScrollCount&quot; : 1,
+            &quot;kCGScrollWheelEventDeltaAxis2&quot; : 4,
+            &quot;kCGScrollWheelEventPointDeltaAxis1&quot; : -1,
+            &quot;relativeTimeMS&quot; : 49,
+            &quot;kCGScrollWheelEventIsContinuous&quot; : 1,
+            &quot;kCGScrollWheelEventScrollPhase&quot; : 2,
+            &quot;kCGScrollWheelEventPointDeltaAxis2&quot; : 37,
+            &quot;windowLocation&quot; : &quot;{400, 300}&quot;,
+            &quot;kCGSEventTypeField&quot; : 22
+        },
+        {
+            &quot;kCGEventGestureHIDType&quot; : 6,
+            &quot;relativeTimeMS&quot; : 57,
+            &quot;windowLocation&quot; : &quot;{400, 300}&quot;,
+            &quot;kCGEventGestureScrollY&quot; : -3,
+            &quot;kCGEventGesturePhase&quot; : 2,
+            &quot;kCGEventScrollGestureFlagBits&quot; : 1,
+            &quot;kCGSEventTypeField&quot; : 29,
+            &quot;kCGEventGestureScrollX&quot; : 57
+        },
+        {
+            &quot;kCGScrollWheelEventScrollCount&quot; : 1,
+            &quot;kCGScrollWheelEventDeltaAxis2&quot; : 5,
+            &quot;kCGScrollWheelEventPointDeltaAxis1&quot; : -1,
+            &quot;relativeTimeMS&quot; : 57,
+            &quot;kCGScrollWheelEventIsContinuous&quot; : 1,
+            &quot;kCGScrollWheelEventScrollPhase&quot; : 2,
+            &quot;kCGScrollWheelEventPointDeltaAxis2&quot; : 54,
+            &quot;windowLocation&quot; : &quot;{400, 300}&quot;,
+            &quot;kCGSEventTypeField&quot; : 22
+        },
+        {
+            &quot;kCGEventGestureHIDType&quot; : 6,
+            &quot;relativeTimeMS&quot; : 65,
+            &quot;windowLocation&quot; : &quot;{400, 300}&quot;,
+            &quot;kCGEventGestureScrollY&quot; : -5,
+            &quot;kCGEventGesturePhase&quot; : 2,
+            &quot;kCGEventScrollGestureFlagBits&quot; : 1,
+            &quot;kCGSEventTypeField&quot; : 29,
+            &quot;kCGEventGestureScrollX&quot; : 81
+        },
+        {
+            &quot;kCGScrollWheelEventScrollCount&quot; : 1,
+            &quot;kCGScrollWheelEventDeltaAxis2&quot; : 9,
+            &quot;kCGScrollWheelEventPointDeltaAxis1&quot; : -2,
+            &quot;relativeTimeMS&quot; : 65,
+            &quot;kCGScrollWheelEventIsContinuous&quot; : 1,
+            &quot;kCGScrollWheelEventScrollPhase&quot; : 2,
+            &quot;kCGScrollWheelEventPointDeltaAxis2&quot; : 92,
+            &quot;windowLocation&quot; : &quot;{400, 300}&quot;,
+            &quot;kCGSEventTypeField&quot; : 22
+        },
+    ]);
+}
+
+NSString *completeSwipeBackEventStream()
+{
+    return QUOTE([
+        {
+            &quot;kCGEventGestureHIDType&quot; : 6,
+            &quot;relativeTimeMS&quot; : 73,
+            &quot;windowLocation&quot; : &quot;{400, 300}&quot;,
+            &quot;kCGEventGestureScrollY&quot; : -3,
+            &quot;kCGEventGesturePhase&quot; : 2,
+            &quot;kCGEventScrollGestureFlagBits&quot; : 1,
+            &quot;kCGSEventTypeField&quot; : 29,
+            &quot;kCGEventGestureScrollX&quot; : 75
+        },
+        {
+            &quot;kCGScrollWheelEventScrollCount&quot; : 1,
+            &quot;kCGScrollWheelEventDeltaAxis2&quot; : 11,
+            &quot;kCGScrollWheelEventPointDeltaAxis1&quot; : -1,
+            &quot;relativeTimeMS&quot; : 73,
+            &quot;kCGScrollWheelEventIsContinuous&quot; : 1,
+            &quot;kCGScrollWheelEventScrollPhase&quot; : 2,
+            &quot;kCGScrollWheelEventPointDeltaAxis2&quot; : 106,
+            &quot;windowLocation&quot; : &quot;{400, 300}&quot;,
+            &quot;kCGSEventTypeField&quot; : 22
+        },
+        {
+            &quot;kCGEventGestureHIDType&quot; : 6,
+            &quot;relativeTimeMS&quot; : 81,
+            &quot;windowLocation&quot; : &quot;{400, 300}&quot;,
+            &quot;kCGEventGestureScrollY&quot; : -3,
+            &quot;kCGEventGesturePhase&quot; : 2,
+            &quot;kCGEventScrollGestureFlagBits&quot; : 1,
+            &quot;kCGSEventTypeField&quot; : 29,
+            &quot;kCGEventGestureScrollX&quot; : 85
+        },
+        {
+            &quot;kCGScrollWheelEventScrollCount&quot; : 1,
+            &quot;kCGScrollWheelEventDeltaAxis2&quot; : 13,
+            &quot;kCGScrollWheelEventPointDeltaAxis1&quot; : -1,
+            &quot;relativeTimeMS&quot; : 81,
+            &quot;kCGScrollWheelEventIsContinuous&quot; : 1,
+            &quot;kCGScrollWheelEventScrollPhase&quot; : 2,
+            &quot;kCGScrollWheelEventPointDeltaAxis2&quot; : 127,
+            &quot;windowLocation&quot; : &quot;{400, 300}&quot;,
+            &quot;kCGSEventTypeField&quot; : 22
+        },
+        {
+            &quot;kCGEventGestureHIDType&quot; : 6,
+            &quot;relativeTimeMS&quot; : 89,
+            &quot;windowLocation&quot; : &quot;{400, 300}&quot;,
+            &quot;kCGEventGestureScrollY&quot; : -1,
+            &quot;kCGEventGesturePhase&quot; : 2,
+            &quot;kCGEventScrollGestureFlagBits&quot; : 1,
+            &quot;kCGSEventTypeField&quot; : 29,
+            &quot;kCGEventGestureScrollX&quot; : 91
+        },
+        {
+            &quot;kCGScrollWheelEventScrollCount&quot; : 1,
+            &quot;kCGScrollWheelEventDeltaAxis2&quot; : 14,
+            &quot;kCGScrollWheelEventPointDeltaAxis1&quot; : -1,
+            &quot;relativeTimeMS&quot; : 89,
+            &quot;kCGScrollWheelEventIsContinuous&quot; : 1,
+            &quot;kCGScrollWheelEventScrollPhase&quot; : 2,
+            &quot;kCGScrollWheelEventPointDeltaAxis2&quot; : 139,
+            &quot;windowLocation&quot; : &quot;{400, 300}&quot;,
+            &quot;kCGSEventTypeField&quot; : 22
+        },
+        {
+            &quot;kCGEventGestureHIDType&quot; : 6,
+            &quot;relativeTimeMS&quot; : 97,
+            &quot;windowLocation&quot; : &quot;{400, 300}&quot;,
+            &quot;kCGEventGestureScrollY&quot; : 2,
+            &quot;kCGEventGesturePhase&quot; : 2,
+            &quot;kCGEventScrollGestureFlagBits&quot; : 1,
+            &quot;kCGSEventTypeField&quot; : 29,
+            &quot;kCGEventGestureScrollX&quot; : 136
+        },
+        {
+            &quot;kCGScrollWheelEventScrollCount&quot; : 1,
+            &quot;kCGScrollWheelEventDeltaAxis2&quot; : 20,
+            &quot;kCGScrollWheelEventPointDeltaAxis1&quot; : 1,
+            &quot;relativeTimeMS&quot; : 97,
+            &quot;kCGScrollWheelEventIsContinuous&quot; : 1,
+            &quot;kCGScrollWheelEventScrollPhase&quot; : 2,
+            &quot;kCGScrollWheelEventPointDeltaAxis2&quot; : 204,
+            &quot;windowLocation&quot; : &quot;{400, 300}&quot;,
+            &quot;kCGSEventTypeField&quot; : 22
+        },
+        {
+            &quot;kCGEventGestureHIDType&quot; : 6,
+            &quot;relativeTimeMS&quot; : 105,
+            &quot;windowLocation&quot; : &quot;{400, 300}&quot;,
+            &quot;kCGEventGestureScrollY&quot; : 5,
+            &quot;kCGEventGesturePhase&quot; : 2,
+            &quot;kCGEventScrollGestureFlagBits&quot; : 1,
+            &quot;kCGSEventTypeField&quot; : 29,
+            &quot;kCGEventGestureScrollX&quot; : 92
+        },
+        {
+            &quot;kCGScrollWheelEventScrollCount&quot; : 1,
+            &quot;kCGScrollWheelEventDeltaAxis2&quot; : 14,
+            &quot;kCGScrollWheelEventPointDeltaAxis1&quot; : 2,
+            &quot;relativeTimeMS&quot; : 105,
+            &quot;kCGScrollWheelEventIsContinuous&quot; : 1,
+            &quot;kCGScrollWheelEventScrollPhase&quot; : 2,
+            &quot;kCGScrollWheelEventPointDeltaAxis2&quot; : 136,
+            &quot;windowLocation&quot; : &quot;{400, 300}&quot;,
+            &quot;kCGSEventTypeField&quot; : 22
+        },
+        {
+            &quot;kCGEventGestureHIDType&quot; : 6,
+            &quot;relativeTimeMS&quot; : 113,
+            &quot;windowLocation&quot; : &quot;{400, 300}&quot;,
+            &quot;kCGEventGestureScrollY&quot; : 14,
+            &quot;kCGEventGesturePhase&quot; : 2,
+            &quot;kCGEventScrollGestureFlagBits&quot; : 1,
+            &quot;kCGSEventTypeField&quot; : 29,
+            &quot;kCGEventGestureScrollX&quot; : 133
+        },
+        {
+            &quot;kCGScrollWheelEventScrollPhase&quot; : 2,
+            &quot;kCGScrollWheelEventPointDeltaAxis2&quot; : 192,
+            &quot;kCGSEventTypeField&quot; : 22,
+            &quot;kCGScrollWheelEventDeltaAxis1&quot; : 1,
+            &quot;kCGScrollWheelEventIsContinuous&quot; : 1,
+            &quot;relativeTimeMS&quot; : 113,
+            &quot;kCGScrollWheelEventScrollCount&quot; : 1,
+            &quot;kCGScrollWheelEventDeltaAxis2&quot; : 19,
+            &quot;windowLocation&quot; : &quot;{400, 300}&quot;,
+            &quot;kCGScrollWheelEventPointDeltaAxis1&quot; : 7
+        },
+        {
+            &quot;relativeTimeMS&quot; : 121,
+            &quot;kCGEventScrollGestureFlagBits&quot; : 1,
+            &quot;kCGEventGestureHIDType&quot; : 6,
+            &quot;kCGSEventTypeField&quot; : 29,
+            &quot;kCGEventGesturePhase&quot; : 4,
+            &quot;windowLocation&quot; : &quot;{400, 300}&quot;
+        },
+        {
+            &quot;relativeTimeMS&quot; : 121,
+            &quot;kCGEventGestureHIDType&quot; : 62,
+            &quot;kCGSEventTypeField&quot; : 29,
+            &quot;kCGEventGestureStartEndSeriesType&quot; : 6,
+            &quot;windowLocation&quot; : &quot;{400, 300}&quot;
+        },
+        {
+            &quot;kCGScrollWheelEventScrollCount&quot; : 1,
+            &quot;relativeTimeMS&quot; : 139,
+            &quot;windowLocation&quot; : &quot;{400, 300}&quot;,
+            &quot;kCGSEventTypeField&quot; : 22,
+            &quot;kCGScrollWheelEventScrollPhase&quot; : 4,
+            &quot;kCGScrollWheelEventIsContinuous&quot; : 1
+        }
+    ]);
+}
+
+#endif
</ins></span></pre></div>
<a id="trunkToolsTestRunnerSharedUIScriptContextBindingsUIScriptControlleridl"></a>
<div class="modfile"><h4>Modified: trunk/Tools/TestRunnerShared/UIScriptContext/Bindings/UIScriptController.idl (214585 => 214586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestRunnerShared/UIScriptContext/Bindings/UIScriptController.idl        2017-03-30 00:37:36 UTC (rev 214585)
+++ trunk/Tools/TestRunnerShared/UIScriptContext/Bindings/UIScriptController.idl        2017-03-30 01:05:58 UTC (rev 214586)
</span><span class="lines">@@ -162,6 +162,11 @@
</span><span class="cx">     //  }
</span><span class="cx">     void sendEventStream(DOMString eventsJSON, object callback);
</span><span class="cx"> 
</span><ins>+    void beginBackSwipe(object callback);
+    void completeBackSwipe(object callback);
+
+    void playBackEventStream(DOMString eventStream, object callback);
+
</ins><span class="cx">     // Equivalent of pressing the Done button in the form accessory bar.
</span><span class="cx">     void dismissFormAccessoryView();
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkToolsTestRunnerSharedUIScriptContextUIScriptControllercpp"></a>
<div class="modfile"><h4>Modified: trunk/Tools/TestRunnerShared/UIScriptContext/UIScriptController.cpp (214585 => 214586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestRunnerShared/UIScriptContext/UIScriptController.cpp        2017-03-30 00:37:36 UTC (rev 214585)
+++ trunk/Tools/TestRunnerShared/UIScriptContext/UIScriptController.cpp        2017-03-30 01:05:58 UTC (rev 214586)
</span><span class="lines">@@ -194,6 +194,11 @@
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+void UIScriptController::playBackEventStream(JSStringRef stream, JSValueRef callback)
+{
+    platformPlayBackEventStream(stream, callback);
+}
+
</ins><span class="cx"> #if !PLATFORM(IOS)
</span><span class="cx"> void UIScriptController::touchDownAtPoint(long x, long y, long touchCount, JSValueRef)
</span><span class="cx"> {
</span><span class="lines">@@ -418,6 +423,18 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void UIScriptController::beginBackSwipe(JSValueRef callback)
+{
+}
+
+void UIScriptController::completeBackSwipe(JSValueRef callback)
+{
+}
+
+void UIScriptController::platformPlayBackEventStream(JSStringRef, JSValueRef)
+{
+}
+
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> void UIScriptController::uiScriptComplete(JSStringRef result)
</span></span></pre></div>
<a id="trunkToolsTestRunnerSharedUIScriptContextUIScriptControllerh"></a>
<div class="modfile"><h4>Modified: trunk/Tools/TestRunnerShared/UIScriptContext/UIScriptController.h (214585 => 214586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestRunnerShared/UIScriptContext/UIScriptController.h        2017-03-30 00:37:36 UTC (rev 214585)
+++ trunk/Tools/TestRunnerShared/UIScriptContext/UIScriptController.h        2017-03-30 01:05:58 UTC (rev 214586)
</span><span class="lines">@@ -95,6 +95,9 @@
</span><span class="cx">     void immediateScrollToOffset(long x, long y);
</span><span class="cx">     void immediateZoomToScale(double scale);
</span><span class="cx"> 
</span><ins>+    void beginBackSwipe(JSValueRef callback);
+    void completeBackSwipe(JSValueRef callback);
+
</ins><span class="cx">     void setDidStartFormControlInteractionCallback(JSValueRef);
</span><span class="cx">     JSValueRef didStartFormControlInteractionCallback() const;
</span><span class="cx"> 
</span><span class="lines">@@ -122,6 +125,8 @@
</span><span class="cx">     void setDidEndScrollingCallback(JSValueRef);
</span><span class="cx">     JSValueRef didEndScrollingCallback() const;
</span><span class="cx"> 
</span><ins>+    void playBackEventStream(JSStringRef stream, JSValueRef callback);
+
</ins><span class="cx">     double zoomScale() const;
</span><span class="cx">     double minimumZoomScale() const;
</span><span class="cx">     double maximumZoomScale() const;
</span><span class="lines">@@ -166,6 +171,7 @@
</span><span class="cx">     void platformSetDidHideKeyboardCallback();
</span><span class="cx">     void platformSetDidEndScrollingCallback();
</span><span class="cx">     void platformClearAllCallbacks();
</span><ins>+    void platformPlayBackEventStream(JSStringRef, JSValueRef);
</ins><span class="cx"> 
</span><span class="cx">     JSClassRef wrapperClass() final;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkToolsTestRunnerSharedspiCoreGraphicsSPIh"></a>
<div class="addfile"><h4>Added: trunk/Tools/TestRunnerShared/spi/CoreGraphicsSPI.h (0 => 214586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestRunnerShared/spi/CoreGraphicsSPI.h                                (rev 0)
+++ trunk/Tools/TestRunnerShared/spi/CoreGraphicsSPI.h        2017-03-30 01:05:58 UTC (rev 214586)
</span><span class="lines">@@ -0,0 +1,92 @@
</span><ins>+/*
+ * Copyright (C) 2016 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#import &lt;wtf/Platform.h&gt;
+
+#if USE(APPLE_INTERNAL_SDK)
+
+#import &lt;CoreGraphics/CGEventPrivate.h&gt;
+#import &lt;CoreGraphics/CGSEvent.h&gt;
+
+#else
+
+WTF_EXTERN_C_BEGIN
+
+static const CGEventField kCGSEventWindowIDField = (CGEventField)51;
+static const CGEventField kCGSEventTypeField = (CGEventField)55;
+static const CGEventField kCGEventGestureHIDType = (CGEventField)110;
+static const CGEventField kCGEventGestureIsPreflight = (CGEventField)111;
+static const CGEventField kCGEventGestureZoomValue = (CGEventField)113;
+static const CGEventField kCGEventGestureRotationValue = (CGEventField)114;
+static const CGEventField kCGEventGestureSwipeValue = (CGEventField)115;
+static const CGEventField kCGEventGesturePreflightProgress = (CGEventField)116;
+static const CGEventField kCGEventGestureStartEndSeriesType = (CGEventField)117;
+static const CGEventField kCGEventGestureScrollX = (CGEventField)118;
+static const CGEventField kCGEventGestureScrollY = (CGEventField)119;
+static const CGEventField kCGEventGestureScrollZ = (CGEventField)120;
+static const CGEventField kCGEventGestureSwipeMotion = (CGEventField)123;
+static const CGEventField kCGEventGestureSwipeProgress = (CGEventField)124;
+static const CGEventField kCGEventGestureSwipePositionX = (CGEventField)125;
+static const CGEventField kCGEventGestureSwipePositionY = (CGEventField)126;
+static const CGEventField kCGEventGestureSwipeVelocityX = (CGEventField)129;
+static const CGEventField kCGEventGestureSwipeVelocityY = (CGEventField)130;
+static const CGEventField kCGEventGestureSwipeVelocityZ = (CGEventField)131;
+static const CGEventField kCGEventGesturePhase = (CGEventField)132;
+static const CGEventField kCGEventGestureMask = (CGEventField)133;
+static const CGEventField kCGEventGestureSwipeMask = (CGEventField)134;
+static const CGEventField kCGEventScrollGestureFlagBits = (CGEventField)135;
+static const CGEventField kCGEventSwipeGestureFlagBits = (CGEventField)136;
+static const CGEventField kCGEventGestureFlavor = (CGEventField)138;
+static const CGEventField kCGEventGestureZoomDeltaX = (CGEventField)139;
+static const CGEventField kCGEventGestureZoomDeltaY = (CGEventField)140;
+static const CGEventField kCGEventGestureProgress = (CGEventField)142;
+static const CGEventField kCGEventGestureStage = (CGEventField)143;
+static const CGEventField kCGEventGestureBehavior = (CGEventField)144;
+static const CGEventField kCGEventTransitionProgress = (CGEventField)147;
+static const CGEventField kCGEventStagePressure = (CGEventField)148;
+
+enum {
+    kCGSEventScrollWheel = 22,
+    kCGSEventZoom = 28,
+    kCGSEventGesture = 29,
+    kCGSEventDockControl = 30,
+    kCGSEventFluidTouchGesture = 31,
+};
+typedef uint32_t CGSEventType;
+
+enum {
+    kCGHIDEventTypeGestureStarted = 61,
+    kCGHIDEventTypeGestureEnded = 62,
+};
+typedef uint32_t CGSHIDEventType;
+
+CGPoint CGEventGetWindowLocation(CGEventRef);
+void CGEventSetWindowLocation(CGEventRef, CGPoint);
+
+WTF_EXTERN_C_END
+
+#endif // USE(APPLE_INTERNAL_SDK)
</ins></span></pre></div>
<a id="trunkToolsTestRunnerSharedspiIOKitSPIhfromrev214585trunkToolsWebKitTestRunneriosIOKitSPIh"></a>
<div class="copfile"><h4>Copied: trunk/Tools/TestRunnerShared/spi/IOKitSPI.h (from rev 214585, trunk/Tools/WebKitTestRunner/ios/IOKitSPI.h) (0 => 214586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestRunnerShared/spi/IOKitSPI.h                                (rev 0)
+++ trunk/Tools/TestRunnerShared/spi/IOKitSPI.h        2017-03-30 01:05:58 UTC (rev 214586)
</span><span class="lines">@@ -0,0 +1,203 @@
</span><ins>+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#import &lt;wtf/Platform.h&gt;
+
+#if USE(APPLE_INTERNAL_SDK)
+
+#import &lt;IOKit/hid/IOHIDEvent.h&gt;
+#import &lt;IOKit/hid/IOHIDEventData.h&gt;
+#import &lt;IOKit/hid/IOHIDEventSystemClient.h&gt;
+#import &lt;IOKit/hid/IOHIDUsageTables.h&gt;
+
+#else
+
+WTF_EXTERN_C_BEGIN
+
+#ifdef __LP64__
+typedef double IOHIDFloat;
+#else
+typedef float IOHIDFloat;
+#endif
+
+enum {
+    kIOHIDEventOptionNone = 0,
+};
+
+typedef UInt32 IOOptionBits;
+typedef uint32_t IOHIDEventOptionBits;
+typedef uint32_t IOHIDEventField;
+
+typedef struct __IOHIDEventSystemClient * IOHIDEventSystemClientRef;
+typedef struct __IOHIDEvent * IOHIDEventRef;
+
+#define IOHIDEventFieldBase(type) (type &lt;&lt; 16)
+
+enum {
+    kHIDPage_KeyboardOrKeypad       = 0x07,
+    kHIDPage_VendorDefinedStart     = 0xFF00
+};
+
+enum {
+    kIOHIDDigitizerEventRange       = 1&lt;&lt;0,
+    kIOHIDDigitizerEventTouch       = 1&lt;&lt;1,
+    kIOHIDDigitizerEventPosition    = 1&lt;&lt;2,
+    kIOHIDDigitizerEventIdentity    = 1&lt;&lt;5,
+    kIOHIDDigitizerEventAttribute   = 1&lt;&lt;6,
+    kIOHIDDigitizerEventCancel      = 1&lt;&lt;7,
+    kIOHIDDigitizerEventStart       = 1&lt;&lt;8,
+    kIOHIDDigitizerEventEstimatedAltitude = 1&lt;&lt;28,
+    kIOHIDDigitizerEventEstimatedAzimuth = 1&lt;&lt;29,
+    kIOHIDDigitizerEventEstimatedPressure = 1&lt;&lt;30
+};
+typedef uint32_t IOHIDDigitizerEventMask;
+
+enum {
+    kIOHIDDigitizerEventUpdateAltitudeMask = 1&lt;&lt;28,
+    kIOHIDDigitizerEventUpdateAzimuthMask = 1&lt;&lt;29,
+    kIOHIDDigitizerEventUpdatePressureMask = 1&lt;&lt;30
+};
+
+enum {
+    kIOHIDEventTypeNULL,
+    kIOHIDEventTypeVendorDefined,
+    kIOHIDEventTypeKeyboard = 3,
+    kIOHIDEventTypeRotation = 5,
+    kIOHIDEventTypeScroll = 6,
+    kIOHIDEventTypeZoom = 8,
+    kIOHIDEventTypeDigitizer = 11,
+    kIOHIDEventTypeNavigationSwipe = 16,
+    kIOHIDEventTypeForce = 32,
+
+};
+typedef uint32_t IOHIDEventType;
+
+enum {
+    kIOHIDEventFieldVendorDefinedUsagePage = IOHIDEventFieldBase(kIOHIDEventTypeVendorDefined),
+    kIOHIDEventFieldVendorDefinedReserved,
+    kIOHIDEventFieldVendorDefinedReserved1,
+    kIOHIDEventFieldVendorDefinedDataLength,
+    kIOHIDEventFieldVendorDefinedData
+};
+
+enum {
+    kIOHIDEventFieldDigitizerX = IOHIDEventFieldBase(kIOHIDEventTypeDigitizer),
+    kIOHIDEventFieldDigitizerY,
+    kIOHIDEventFieldDigitizerMajorRadius = kIOHIDEventFieldDigitizerX + 20,
+    kIOHIDEventFieldDigitizerMinorRadius,
+    kIOHIDEventFieldDigitizerIsDisplayIntegrated = kIOHIDEventFieldDigitizerMajorRadius + 5,
+};
+
+enum {
+    kIOHIDTransducerRange               = 0x00010000,
+    kIOHIDTransducerTouch               = 0x00020000,
+    kIOHIDTransducerInvert              = 0x00040000,
+    kIOHIDTransducerDisplayIntegrated   = 0x00080000
+};
+
+enum {
+    kIOHIDDigitizerTransducerTypeStylus  = 0,
+    kIOHIDDigitizerTransducerTypeFinger = 2,
+    kIOHIDDigitizerTransducerTypeHand = 3
+};
+typedef uint32_t IOHIDDigitizerTransducerType;
+
+enum {
+    kIOHIDEventFieldDigitizerWillUpdateMask = 720924,
+    kIOHIDEventFieldDigitizerDidUpdateMask = 720925
+};
+
+IOHIDEventRef IOHIDEventCreateDigitizerEvent(CFAllocatorRef, uint64_t, IOHIDDigitizerTransducerType, uint32_t, uint32_t, IOHIDDigitizerEventMask, uint32_t, IOHIDFloat, IOHIDFloat, IOHIDFloat, IOHIDFloat, IOHIDFloat, boolean_t, boolean_t, IOOptionBits);
+
+IOHIDEventRef IOHIDEventCreateDigitizerFingerEvent(CFAllocatorRef, uint64_t, uint32_t, uint32_t, IOHIDDigitizerEventMask, IOHIDFloat, IOHIDFloat, IOHIDFloat, IOHIDFloat, IOHIDFloat, boolean_t, boolean_t, IOHIDEventOptionBits);
+
+IOHIDEventRef IOHIDEventCreateForceEvent(CFAllocatorRef, uint64_t, uint32_t, IOHIDFloat, uint32_t, IOHIDFloat, IOHIDEventOptionBits);
+
+IOHIDEventRef IOHIDEventCreateKeyboardEvent(CFAllocatorRef, uint64_t, uint32_t, uint32_t, boolean_t, IOOptionBits);
+
+IOHIDEventRef IOHIDEventCreateVendorDefinedEvent(CFAllocatorRef, uint64_t, uint32_t, uint32_t, uint32_t, uint8_t*, CFIndex, IOHIDEventOptionBits);
+
+IOHIDEventRef IOHIDEventCreateDigitizerStylusEventWithPolarOrientation(CFAllocatorRef, uint64_t, uint32_t, uint32_t, IOHIDDigitizerEventMask, uint32_t, IOHIDFloat, IOHIDFloat, IOHIDFloat, IOHIDFloat, IOHIDFloat, IOHIDFloat, IOHIDFloat, IOHIDFloat, boolean_t, boolean_t, IOHIDEventOptionBits);
+
+IOHIDEventType IOHIDEventGetType(IOHIDEventRef);
+
+void IOHIDEventSetFloatValue(IOHIDEventRef, IOHIDEventField, IOHIDFloat);
+
+CFIndex IOHIDEventGetIntegerValue(IOHIDEventRef, IOHIDEventField);
+void IOHIDEventSetIntegerValue(IOHIDEventRef, IOHIDEventField, CFIndex);
+
+void IOHIDEventAppendEvent(IOHIDEventRef, IOHIDEventRef, IOOptionBits);
+
+IOHIDEventSystemClientRef IOHIDEventSystemClientCreate(CFAllocatorRef);
+
+#define kGSEventPathInfoInRange (1 &lt;&lt; 0)
+#define kGSEventPathInfoInTouch (1 &lt;&lt; 1)
+
+enum {
+    kHIDUsage_KeyboardA = 0x04,
+    kHIDUsage_Keyboard1 = 0x1E,
+    kHIDUsage_Keyboard2 = 0x1F,
+    kHIDUsage_Keyboard3 = 0x20,
+    kHIDUsage_Keyboard4 = 0x21,
+    kHIDUsage_Keyboard5 = 0x22,
+    kHIDUsage_Keyboard6 = 0x23,
+    kHIDUsage_Keyboard7 = 0x24,
+    kHIDUsage_Keyboard8 = 0x25,
+    kHIDUsage_Keyboard9 = 0x26,
+    kHIDUsage_Keyboard0 = 0x27,
+    kHIDUsage_KeyboardReturnOrEnter = 0x28,
+    kHIDUsage_KeyboardEscape = 0x29,
+    kHIDUsage_KeyboardDeleteOrBackspace = 0x2A,
+    kHIDUsage_KeyboardTab = 0x2B,
+    kHIDUsage_KeyboardSpacebar = 0x2C,
+    kHIDUsage_KeyboardHyphen = 0x2D,
+    kHIDUsage_KeyboardEqualSign = 0x2E,
+    kHIDUsage_KeyboardOpenBracket = 0x2F,
+    kHIDUsage_KeyboardCloseBracket = 0x30,
+    kHIDUsage_KeyboardBackslash = 0x31,
+    kHIDUsage_KeyboardSemicolon = 0x33,
+    kHIDUsage_KeyboardQuote = 0x34,
+    kHIDUsage_KeyboardGraveAccentAndTilde = 0x35,
+    kHIDUsage_KeyboardComma = 0x36,
+    kHIDUsage_KeyboardPeriod = 0x37,
+    kHIDUsage_KeyboardSlash = 0x38,
+    kHIDUsage_KeyboardF1 = 0x3A,
+    kHIDUsage_KeyboardHome = 0x4A,
+    kHIDUsage_KeyboardPageUp = 0x4B,
+    kHIDUsage_KeyboardEnd = 0x4D,
+    kHIDUsage_KeyboardRightArrow = 0x4F,
+    kHIDUsage_KeyboardLeftArrow = 0x50,
+    kHIDUsage_KeyboardDownArrow = 0x51,
+    kHIDUsage_KeyboardUpArrow = 0x52,
+    kHIDUsage_KeyboardLeftControl = 0xE0,
+    kHIDUsage_KeyboardLeftShift = 0xE1,
+    kHIDUsage_KeyboardLeftAlt = 0xE2
+};
+
+WTF_EXTERN_C_END
+
+#endif // USE(APPLE_INTERNAL_SDK)
</ins></span></pre></div>
<a id="trunkToolsWebKitTestRunnerEventSenderProxyh"></a>
<div class="modfile"><h4>Modified: trunk/Tools/WebKitTestRunner/EventSenderProxy.h (214585 => 214586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebKitTestRunner/EventSenderProxy.h        2017-03-30 00:37:36 UTC (rev 214585)
+++ trunk/Tools/WebKitTestRunner/EventSenderProxy.h        2017-03-30 01:05:58 UTC (rev 214586)
</span><span class="lines">@@ -71,7 +71,6 @@
</span><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><del>-    void swipeGestureWithWheelAndMomentumPhases(int x, int y, int phase, int momentum);
</del><span class="cx">     void continuousMouseScrollBy(int x, int y, bool paged);
</span><span class="cx"> 
</span><span class="cx">     void leapForward(int milliseconds);
</span></span></pre></div>
<a id="trunkToolsWebKitTestRunnerInjectedBundleBindingsEventSendingControlleridl"></a>
<div class="modfile"><h4>Modified: trunk/Tools/WebKitTestRunner/InjectedBundle/Bindings/EventSendingController.idl (214585 => 214586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebKitTestRunner/InjectedBundle/Bindings/EventSendingController.idl        2017-03-30 00:37:36 UTC (rev 214585)
+++ trunk/Tools/WebKitTestRunner/InjectedBundle/Bindings/EventSendingController.idl        2017-03-30 01:05:58 UTC (rev 214586)
</span><span class="lines">@@ -34,7 +34,6 @@
</span><span class="cx">     void mouseForceChanged(double force);
</span><span class="cx">     void mouseScrollBy(long x, long y);
</span><span class="cx">     void mouseScrollByWithWheelAndMomentumPhases(long x, long y, DOMString phase, DOMString momentum);
</span><del>-    void swipeGestureWithWheelAndMomentumPhases(long x, long y, DOMString phase, DOMString momentum);
</del><span class="cx">     void continuousMouseScrollBy(long x, long y, optional boolean paged);
</span><span class="cx">     object contextClick();
</span><span class="cx">     void scheduleAsynchronousClick();
</span></span></pre></div>
<a id="trunkToolsWebKitTestRunnerInjectedBundleEventSendingControllercpp"></a>
<div class="modfile"><h4>Modified: trunk/Tools/WebKitTestRunner/InjectedBundle/EventSendingController.cpp (214585 => 214586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebKitTestRunner/InjectedBundle/EventSendingController.cpp        2017-03-30 00:37:36 UTC (rev 214585)
+++ trunk/Tools/WebKitTestRunner/InjectedBundle/EventSendingController.cpp        2017-03-30 01:05:58 UTC (rev 214586)
</span><span class="lines">@@ -483,38 +483,6 @@
</span><span class="cx">     WKBundlePagePostMessage(InjectedBundle::singleton().page()-&gt;page(), EventSenderMessageName.get(), EventSenderMessageBody.get());
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void EventSendingController::swipeGestureWithWheelAndMomentumPhases(int x, int y, JSStringRef phaseStr, JSStringRef momentumStr)
-{
-    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;SwipeGestureWithWheelAndMomentumPhases&quot;));
-    WKDictionarySetItem(EventSenderMessageBody.get(), subMessageKey.get(), subMessageName.get());
-
-    WKRetainPtr&lt;WKStringRef&gt; xKey(AdoptWK, WKStringCreateWithUTF8CString(&quot;X&quot;));
-    WKRetainPtr&lt;WKDoubleRef&gt; xRef(AdoptWK, WKDoubleCreate(x));
-    WKDictionarySetItem(EventSenderMessageBody.get(), xKey.get(), xRef.get());
-
-    WKRetainPtr&lt;WKStringRef&gt; yKey(AdoptWK, WKStringCreateWithUTF8CString(&quot;Y&quot;));
-    WKRetainPtr&lt;WKDoubleRef&gt; yRef(AdoptWK, WKDoubleCreate(y));
-    WKDictionarySetItem(EventSenderMessageBody.get(), yKey.get(), yRef.get());
-
-    uint64_t phase = cgEventPhaseFromString(phaseStr);
-    uint64_t momentum = cgEventMomentumPhaseFromString(momentumStr);
-
-    WKRetainPtr&lt;WKStringRef&gt; phaseKey(AdoptWK, WKStringCreateWithUTF8CString(&quot;Phase&quot;));
-    WKRetainPtr&lt;WKUInt64Ref&gt; phaseRef(AdoptWK, WKUInt64Create(phase));
-    WKDictionarySetItem(EventSenderMessageBody.get(), phaseKey.get(), phaseRef.get());
-
-    WKRetainPtr&lt;WKStringRef&gt; momentumKey(AdoptWK, WKStringCreateWithUTF8CString(&quot;Momentum&quot;));
-    WKRetainPtr&lt;WKUInt64Ref&gt; momentumRef(AdoptWK, WKUInt64Create(momentum));
-    WKDictionarySetItem(EventSenderMessageBody.get(), momentumKey.get(), momentumRef.get());
-
-    WKBundlePageForceRepaint(InjectedBundle::singleton().page()-&gt;page()); // Triggers a scrolling tree commit.
-    WKBundlePagePostMessage(InjectedBundle::singleton().page()-&gt;page(), EventSenderMessageName.get(), EventSenderMessageBody.get());
-}
-
</del><span class="cx"> void EventSendingController::continuousMouseScrollBy(int x, int y, bool paged)
</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 (214585 => 214586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebKitTestRunner/InjectedBundle/EventSendingController.h        2017-03-30 00:37:36 UTC (rev 214585)
+++ trunk/Tools/WebKitTestRunner/InjectedBundle/EventSendingController.h        2017-03-30 01:05:58 UTC (rev 214586)
</span><span class="lines">@@ -52,7 +52,6 @@
</span><span class="cx">     void mouseForceChanged(double force);
</span><span class="cx">     void mouseScrollBy(int x, int y);
</span><span class="cx">     void mouseScrollByWithWheelAndMomentumPhases(int x, int y, JSStringRef phase, JSStringRef momentum);
</span><del>-    void swipeGestureWithWheelAndMomentumPhases(int x, int y, JSStringRef phase, JSStringRef momentum);
</del><span class="cx">     void continuousMouseScrollBy(int x, int y, bool paged);
</span><span class="cx">     JSValueRef contextClick();
</span><span class="cx">     void leapForward(int milliseconds);
</span></span></pre></div>
<a id="trunkToolsWebKitTestRunnerInjectedBundleiosEventSenderProxyIOSmm"></a>
<div class="modfile"><h4>Modified: trunk/Tools/WebKitTestRunner/InjectedBundle/ios/EventSenderProxyIOS.mm (214585 => 214586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebKitTestRunner/InjectedBundle/ios/EventSenderProxyIOS.mm        2017-03-30 00:37:36 UTC (rev 214585)
+++ trunk/Tools/WebKitTestRunner/InjectedBundle/ios/EventSenderProxyIOS.mm        2017-03-30 01:05:58 UTC (rev 214586)
</span><span class="lines">@@ -103,11 +103,6 @@
</span><span class="cx">     // Write me.
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void EventSenderProxy::swipeGestureWithWheelAndMomentumPhases(int, int, int, int)
-{
-    // Write me.
-}
-
</del><span class="cx"> void EventSenderProxy::continuousMouseScrollBy(int x, int y, bool paged)
</span><span class="cx"> {
</span><span class="cx">     // Write me.
</span></span></pre></div>
<a id="trunkToolsWebKitTestRunnerTestControllercpp"></a>
<div class="modfile"><h4>Modified: trunk/Tools/WebKitTestRunner/TestController.cpp (214585 => 214586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebKitTestRunner/TestController.cpp        2017-03-30 00:37:36 UTC (rev 214585)
+++ trunk/Tools/WebKitTestRunner/TestController.cpp        2017-03-30 01:05:58 UTC (rev 214586)
</span><span class="lines">@@ -1315,23 +1315,6 @@
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (WKStringIsEqualToUTF8CString(subMessageName, &quot;SwipeGestureWithWheelAndMomentumPhases&quot;)) {
-            WKRetainPtr&lt;WKStringRef&gt; xKey = adoptWK(WKStringCreateWithUTF8CString(&quot;X&quot;));
-            double x = WKDoubleGetValue(static_cast&lt;WKDoubleRef&gt;(WKDictionaryGetItemForKey(messageBodyDictionary, xKey.get())));
-
-            WKRetainPtr&lt;WKStringRef&gt; yKey = adoptWK(WKStringCreateWithUTF8CString(&quot;Y&quot;));
-            double y = WKDoubleGetValue(static_cast&lt;WKDoubleRef&gt;(WKDictionaryGetItemForKey(messageBodyDictionary, yKey.get())));
-
-            WKRetainPtr&lt;WKStringRef&gt; phaseKey = adoptWK(WKStringCreateWithUTF8CString(&quot;Phase&quot;));
-            int phase = static_cast&lt;int&gt;(WKUInt64GetValue(static_cast&lt;WKUInt64Ref&gt;(WKDictionaryGetItemForKey(messageBodyDictionary, phaseKey.get()))));
-            WKRetainPtr&lt;WKStringRef&gt; momentumKey = adoptWK(WKStringCreateWithUTF8CString(&quot;Momentum&quot;));
-            int momentum = static_cast&lt;int&gt;(WKUInt64GetValue(static_cast&lt;WKUInt64Ref&gt;(WKDictionaryGetItemForKey(messageBodyDictionary, momentumKey.get()))));
-
-            m_eventSenderProxy-&gt;swipeGestureWithWheelAndMomentumPhases(x, y, phase, momentum);
-
-            return;
-        }
-
</del><span class="cx">         ASSERT_NOT_REACHED();
</span><span class="cx">     }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkToolsWebKitTestRunnerWebKitTestRunnerxcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Tools/WebKitTestRunner/WebKitTestRunner.xcodeproj/project.pbxproj (214585 => 214586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebKitTestRunner/WebKitTestRunner.xcodeproj/project.pbxproj        2017-03-30 00:37:36 UTC (rev 214585)
+++ trunk/Tools/WebKitTestRunner/WebKitTestRunner.xcodeproj/project.pbxproj        2017-03-30 01:05:58 UTC (rev 214586)
</span><span class="lines">@@ -62,6 +62,11 @@
</span><span class="cx">                 29A8FCDD145F0337009045A6 /* JSAccessibilityTextMarkerRange.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 29A8FCE1345E7021006AA5A6 /* JSAccessibilityTextMarkerRange.cpp */; };
</span><span class="cx">                 29A8FCE2145F037B009045A6 /* AccessibilityTextMarkerRange.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 29A8FCE1145F037B009045A6 /* AccessibilityTextMarkerRange.cpp */; };
</span><span class="cx">                 29A8FCE5145F0464009045A6 /* AccessibilityTextMarkerRangeMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 29A8FCE4145F0464009045A6 /* AccessibilityTextMarkerRangeMac.mm */; };
</span><ins>+                2DB6187E1D7D58D400978D19 /* CoreGraphicsSPI.h in Headers */ = {isa = PBXBuildFile; fileRef = 2DB6187D1D7D58D400978D19 /* CoreGraphicsSPI.h */; };
+                2DD4C49A1D6E7D3B0007379C /* EventSerializerMac.h in Headers */ = {isa = PBXBuildFile; fileRef = 2DD4C4981D6E7D3B0007379C /* EventSerializerMac.h */; };
+                2DD4C49B1D6E7D3B0007379C /* EventSerializerMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2DD4C4991D6E7D3B0007379C /* EventSerializerMac.mm */; };
+                2DFA98481D7F70CF00AFF2C9 /* SharedEventStreamsMac.h in Headers */ = {isa = PBXBuildFile; fileRef = 2DFA98461D7F70CF00AFF2C9 /* SharedEventStreamsMac.h */; };
+                2DFA98491D7F70CF00AFF2C9 /* SharedEventStreamsMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2DFA98471D7F70CF00AFF2C9 /* SharedEventStreamsMac.mm */; };
</ins><span class="cx">                 2E34C90018B68808000067BB /* WebKitTestRunnerInjectedBundle.bundle in Copy Plug-Ins */ = {isa = PBXBuildFile; fileRef = BC25186211D15D54002EBC01 /* WebKitTestRunnerInjectedBundle.bundle */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
</span><span class="cx">                 2E63ED8A1891AD7E002A7AFC /* AccessibilityControllerIOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2E63ED751891ACE9002A7AFC /* AccessibilityControllerIOS.mm */; };
</span><span class="cx">                 2E63ED8B1891AD7E002A7AFC /* AccessibilityTextMarkerIOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2E63ED771891ACE9002A7AFC /* AccessibilityTextMarkerIOS.mm */; };
</span><span class="lines">@@ -208,7 +213,7 @@
</span><span class="cx">                 0FEB90A31905BC6A000FDBF3 /* CrashReporterInfo.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = CrashReporterInfo.mm; path = cocoa/CrashReporterInfo.mm; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 0FEBF8581BB61DF20028722D /* HIDEventGenerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HIDEventGenerator.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 0FEBF8591BB61DF20028722D /* HIDEventGenerator.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = HIDEventGenerator.mm; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><del>-                0FEBF85B1BB62A370028722D /* IOKitSPI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = IOKitSPI.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</del><ins>+                0FEBF85B1BB62A370028722D /* IOKitSPI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = IOKitSPI.h; path = ../TestRunnerShared/spi/IOKitSPI.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 0FEBF85C1BB62D460028722D /* UIKitSPI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UIKitSPI.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 1A3326051B75396500F89F62 /* TestOptions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TestOptions.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 1CA211C71BCA107300B2101F /* FontWithFeatures.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = FontWithFeatures.otf; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -238,7 +243,12 @@
</span><span class="cx">                 29A8FCE1345E7021006AA5A6 /* JSAccessibilityTextMarkerRange.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSAccessibilityTextMarkerRange.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 29A8FCE1345E7021006AA5A7 /* JSAccessibilityTextMarkerRange.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSAccessibilityTextMarkerRange.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 29A8FCE4145F0464009045A6 /* AccessibilityTextMarkerRangeMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = AccessibilityTextMarkerRangeMac.mm; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                2DB6187D1D7D58D400978D19 /* CoreGraphicsSPI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CoreGraphicsSPI.h; path = ../TestRunnerShared/spi/CoreGraphicsSPI.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 2DCE2CD11B84524500C7F832 /* TestControllerCocoa.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = TestControllerCocoa.mm; path = cocoa/TestControllerCocoa.mm; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                2DD4C4981D6E7D3B0007379C /* EventSerializerMac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EventSerializerMac.h; path = mac/EventSerializerMac.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                2DD4C4991D6E7D3B0007379C /* EventSerializerMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = EventSerializerMac.mm; path = mac/EventSerializerMac.mm; sourceTree = &quot;&lt;group&gt;&quot;; };
+                2DFA98461D7F70CF00AFF2C9 /* SharedEventStreamsMac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SharedEventStreamsMac.h; path = mac/SharedEventStreamsMac.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                2DFA98471D7F70CF00AFF2C9 /* SharedEventStreamsMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = SharedEventStreamsMac.mm; path = mac/SharedEventStreamsMac.mm; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 2E63ED751891ACE9002A7AFC /* AccessibilityControllerIOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = AccessibilityControllerIOS.mm; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 2E63ED761891ACE9002A7AFC /* AccessibilityNotificationHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AccessibilityNotificationHandler.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 2E63ED771891ACE9002A7AFC /* AccessibilityTextMarkerIOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = AccessibilityTextMarkerIOS.mm; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -474,7 +484,9 @@
</span><span class="cx">                 0F73B5471BA782FE004B3EF4 /* UIScriptContext */ = {
</span><span class="cx">                         isa = PBXGroup;
</span><span class="cx">                         children = (
</span><ins>+                                2DB6187F1D7D598800978D19 /* spi */,
</ins><span class="cx">                                 0F73B54B1BA78350004B3EF4 /* Bindings */,
</span><ins>+                                2DD4C4971D6E7D3B0007379C /* Event Serialization */,
</ins><span class="cx">                                 0F73B54E1BA78954004B3EF4 /* Derived Sources */,
</span><span class="cx">                                 0F18E6DD1D6B9AAF0027E547 /* UIScriptContext.cpp */,
</span><span class="cx">                                 0F18E6DE1D6B9AAF0027E547 /* UIScriptContext.h */,
</span><span class="lines">@@ -552,6 +564,35 @@
</span><span class="cx">                         name = Accessibility;
</span><span class="cx">                         sourceTree = &quot;&lt;group&gt;&quot;;
</span><span class="cx">                 };
</span><ins>+                2DB6187F1D7D598800978D19 /* spi */ = {
+                        isa = PBXGroup;
+                        children = (
+                                2DB6187D1D7D58D400978D19 /* CoreGraphicsSPI.h */,
+                                0FEBF85B1BB62A370028722D /* IOKitSPI.h */,
+                        );
+                        name = spi;
+                        sourceTree = &quot;&lt;group&gt;&quot;;
+                };
+                2DD4C4971D6E7D3B0007379C /* Event Serialization */ = {
+                        isa = PBXGroup;
+                        children = (
+                                2DFA984A1D7F79E000AFF2C9 /* mac */,
+                        );
+                        name = &quot;Event Serialization&quot;;
+                        path = ../TestRunnerShared/EventSerialization;
+                        sourceTree = &quot;&lt;group&gt;&quot;;
+                };
+                2DFA984A1D7F79E000AFF2C9 /* mac */ = {
+                        isa = PBXGroup;
+                        children = (
+                                2DD4C4981D6E7D3B0007379C /* EventSerializerMac.h */,
+                                2DD4C4991D6E7D3B0007379C /* EventSerializerMac.mm */,
+                                2DFA98461D7F70CF00AFF2C9 /* SharedEventStreamsMac.h */,
+                                2DFA98471D7F70CF00AFF2C9 /* SharedEventStreamsMac.mm */,
+                        );
+                        name = mac;
+                        sourceTree = &quot;&lt;group&gt;&quot;;
+                };
</ins><span class="cx">                 2E63ED741891ACE9002A7AFC /* ios */ = {
</span><span class="cx">                         isa = PBXGroup;
</span><span class="cx">                         children = (
</span><span class="lines">@@ -589,7 +630,6 @@
</span><span class="cx">                         children = (
</span><span class="cx">                                 0FEBF8581BB61DF20028722D /* HIDEventGenerator.h */,
</span><span class="cx">                                 0FEBF8591BB61DF20028722D /* HIDEventGenerator.mm */,
</span><del>-                                0FEBF85B1BB62A370028722D /* IOKitSPI.h */,
</del><span class="cx">                                 2EE52D131890A9FB0010ED21 /* PlatformWebViewIOS.mm */,
</span><span class="cx">                                 2EE52D141890A9FB0010ED21 /* TestControllerIOS.mm */,
</span><span class="cx">                                 0FEBF85C1BB62D460028722D /* UIKitSPI.h */,
</span><span class="lines">@@ -765,7 +805,10 @@
</span><span class="cx">                         isa = PBXHeadersBuildPhase;
</span><span class="cx">                         buildActionMask = 2147483647;
</span><span class="cx">                         files = (
</span><ins>+                                2DB6187E1D7D58D400978D19 /* CoreGraphicsSPI.h in Headers */,
</ins><span class="cx">                                 0F73B5521BA78968004B3EF4 /* JSUIScriptController.h in Headers */,
</span><ins>+                                2DFA98481D7F70CF00AFF2C9 /* SharedEventStreamsMac.h in Headers */,
+                                2DD4C49A1D6E7D3B0007379C /* EventSerializerMac.h in Headers */,
</ins><span class="cx">                         );
</span><span class="cx">                         runOnlyForDeploymentPostprocessing = 0;
</span><span class="cx">                 };
</span><span class="lines">@@ -972,8 +1015,10 @@
</span><span class="cx">                                 0F73B5511BA78968004B3EF4 /* JSUIScriptController.cpp in Sources */,
</span><span class="cx">                                 0F18E7181D6BC4560027E547 /* JSWrapper.cpp in Sources */,
</span><span class="cx">                                 A185103C1B9AE0FE00744AEB /* Options.cpp in Sources */,
</span><ins>+                                2DD4C49B1D6E7D3B0007379C /* EventSerializerMac.mm in Sources */,
</ins><span class="cx">                                 A18510401B9AE13100744AEB /* PixelDumpSupport.cpp in Sources */,
</span><span class="cx">                                 A18510411B9AE13800744AEB /* TestController.cpp in Sources */,
</span><ins>+                                2DFA98491D7F70CF00AFF2C9 /* SharedEventStreamsMac.mm in Sources */,
</ins><span class="cx">                                 A185103B1B9AE0E200744AEB /* TestControllerCocoa.mm in Sources */,
</span><span class="cx">                                 31DA8A3D1E7205CC00E1DF2F /* IOSLayoutTestCommunication.cpp in Sources */,
</span><span class="cx">                                 A18510421B9AE13E00744AEB /* TestInvocation.cpp in Sources */,
</span></span></pre></div>
<a id="trunkToolsWebKitTestRunnereflEventSenderProxyEflcpp"></a>
<div class="modfile"><h4>Modified: trunk/Tools/WebKitTestRunner/efl/EventSenderProxyEfl.cpp (214585 => 214586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebKitTestRunner/efl/EventSenderProxyEfl.cpp        2017-03-30 00:37:36 UTC (rev 214585)
+++ trunk/Tools/WebKitTestRunner/efl/EventSenderProxyEfl.cpp        2017-03-30 01:05:58 UTC (rev 214586)
</span><span class="lines">@@ -399,11 +399,6 @@
</span><span class="cx">     mouseScrollBy(x, y);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void EventSenderProxy::swipeGestureWithWheelAndMomentumPhases(int, int, int, int)
-{
-    notImplemented();
-}
-
</del><span class="cx"> void EventSenderProxy::leapForward(int milliseconds)
</span><span class="cx"> {
</span><span class="cx">     if (m_eventQueue.isEmpty())
</span></span></pre></div>
<a id="trunkToolsWebKitTestRunnergtkEventSenderProxyGtkcpp"></a>
<div class="modfile"><h4>Modified: trunk/Tools/WebKitTestRunner/gtk/EventSenderProxyGtk.cpp (214585 => 214586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebKitTestRunner/gtk/EventSenderProxyGtk.cpp        2017-03-30 00:37:36 UTC (rev 214585)
+++ trunk/Tools/WebKitTestRunner/gtk/EventSenderProxyGtk.cpp        2017-03-30 01:05:58 UTC (rev 214586)
</span><span class="lines">@@ -468,11 +468,6 @@
</span><span class="cx">     mouseScrollBy(x, y);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void EventSenderProxy::swipeGestureWithWheelAndMomentumPhases(int, int, int, int)
-{
-    notImplemented();
-}
-
</del><span class="cx"> void EventSenderProxy::leapForward(int milliseconds)
</span><span class="cx"> {
</span><span class="cx">     if (m_eventQueue.isEmpty())
</span></span></pre></div>
<a id="trunkToolsWebKitTestRunneriosIOKitSPIh"></a>
<div class="delfile"><h4>Deleted: trunk/Tools/WebKitTestRunner/ios/IOKitSPI.h (214585 => 214586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebKitTestRunner/ios/IOKitSPI.h        2017-03-30 00:37:36 UTC (rev 214585)
+++ trunk/Tools/WebKitTestRunner/ios/IOKitSPI.h        2017-03-30 01:05:58 UTC (rev 214586)
</span><span class="lines">@@ -1,204 +0,0 @@
</span><del>-/*
- * Copyright (C) 2015 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef IOKitSPI_h
-#define IOKitSPI_h
-
-#import &lt;wtf/Platform.h&gt;
-
-#if PLATFORM(IOS)
-
-#if USE(APPLE_INTERNAL_SDK)
-
-#import &lt;IOKit/hid/IOHIDEvent.h&gt;
-#import &lt;IOKit/hid/IOHIDEventData.h&gt;
-#import &lt;IOKit/hid/IOHIDEventSystemClient.h&gt;
-#import &lt;IOKit/hid/IOHIDUsageTables.h&gt;
-
-#else
-
-WTF_EXTERN_C_BEGIN
-
-#ifdef __LP64__
-typedef double IOHIDFloat;
-#else
-typedef float IOHIDFloat;
-#endif
-
-enum {
-    kIOHIDEventOptionNone = 0,
-};
-
-typedef UInt32 IOOptionBits;
-typedef uint32_t IOHIDEventOptionBits;
-typedef uint32_t IOHIDEventField;
-
-typedef struct __IOHIDEventSystemClient * IOHIDEventSystemClientRef;
-typedef struct __IOHIDEvent * IOHIDEventRef;
-
-#define IOHIDEventFieldBase(type) (type &lt;&lt; 16)
-
-enum {
-    kHIDPage_KeyboardOrKeypad       = 0x07,
-    kHIDPage_VendorDefinedStart     = 0xFF00
-};
-
-enum {
-    kIOHIDDigitizerEventRange       = 1&lt;&lt;0,
-    kIOHIDDigitizerEventTouch       = 1&lt;&lt;1,
-    kIOHIDDigitizerEventPosition    = 1&lt;&lt;2,
-    kIOHIDDigitizerEventIdentity    = 1&lt;&lt;5,
-    kIOHIDDigitizerEventAttribute   = 1&lt;&lt;6,
-    kIOHIDDigitizerEventCancel      = 1&lt;&lt;7,
-    kIOHIDDigitizerEventStart       = 1&lt;&lt;8,
-    kIOHIDDigitizerEventEstimatedAltitude = 1&lt;&lt;28,
-    kIOHIDDigitizerEventEstimatedAzimuth = 1&lt;&lt;29,
-    kIOHIDDigitizerEventEstimatedPressure = 1&lt;&lt;30
-};
-typedef uint32_t IOHIDDigitizerEventMask;
-
-enum {
-    kIOHIDDigitizerEventUpdateAltitudeMask = 1&lt;&lt;28,
-    kIOHIDDigitizerEventUpdateAzimuthMask = 1&lt;&lt;29,
-    kIOHIDDigitizerEventUpdatePressureMask = 1&lt;&lt;30
-};
-
-enum {
-    kIOHIDEventTypeNULL,
-    kIOHIDEventTypeVendorDefined,
-    kIOHIDEventTypeKeyboard = 3,
-    kIOHIDEventTypeDigitizer = 11,
-};
-typedef uint32_t IOHIDEventType;
-
-enum {
-    kIOHIDEventFieldVendorDefinedUsagePage = IOHIDEventFieldBase(kIOHIDEventTypeVendorDefined),
-    kIOHIDEventFieldVendorDefinedReserved,
-    kIOHIDEventFieldVendorDefinedReserved1,
-    kIOHIDEventFieldVendorDefinedDataLength,
-    kIOHIDEventFieldVendorDefinedData
-};
-
-enum {
-    kIOHIDEventFieldDigitizerX = IOHIDEventFieldBase(kIOHIDEventTypeDigitizer),
-    kIOHIDEventFieldDigitizerY,
-    kIOHIDEventFieldDigitizerMajorRadius = kIOHIDEventFieldDigitizerX + 20,
-    kIOHIDEventFieldDigitizerMinorRadius,
-    kIOHIDEventFieldDigitizerIsDisplayIntegrated = kIOHIDEventFieldDigitizerMajorRadius + 5,
-};
-
-enum {
-    kIOHIDTransducerRange               = 0x00010000,
-    kIOHIDTransducerTouch               = 0x00020000,
-    kIOHIDTransducerInvert              = 0x00040000,
-    kIOHIDTransducerDisplayIntegrated   = 0x00080000
-};
-
-enum {
-    kIOHIDDigitizerTransducerTypeStylus  = 0,
-    kIOHIDDigitizerTransducerTypeFinger = 2,
-    kIOHIDDigitizerTransducerTypeHand = 3
-};
-typedef uint32_t IOHIDDigitizerTransducerType;
-
-enum {
-    kIOHIDEventFieldDigitizerWillUpdateMask = 720924,
-    kIOHIDEventFieldDigitizerDidUpdateMask = 720925
-};
-
-IOHIDEventRef IOHIDEventCreateDigitizerEvent(CFAllocatorRef, uint64_t, IOHIDDigitizerTransducerType, uint32_t, uint32_t, IOHIDDigitizerEventMask, uint32_t, IOHIDFloat, IOHIDFloat, IOHIDFloat, IOHIDFloat, IOHIDFloat, boolean_t, boolean_t, IOOptionBits);
-
-IOHIDEventRef IOHIDEventCreateDigitizerFingerEvent(CFAllocatorRef, uint64_t, uint32_t, uint32_t, IOHIDDigitizerEventMask, IOHIDFloat, IOHIDFloat, IOHIDFloat, IOHIDFloat, IOHIDFloat, boolean_t, boolean_t, IOHIDEventOptionBits);
-
-IOHIDEventRef IOHIDEventCreateForceEvent(CFAllocatorRef, uint64_t, uint32_t, IOHIDFloat, uint32_t, IOHIDFloat, IOHIDEventOptionBits);
-
-IOHIDEventRef IOHIDEventCreateKeyboardEvent(CFAllocatorRef, uint64_t, uint32_t, uint32_t, boolean_t, IOOptionBits);
-
-IOHIDEventRef IOHIDEventCreateVendorDefinedEvent(CFAllocatorRef, uint64_t, uint32_t, uint32_t, uint32_t, uint8_t*, CFIndex, IOHIDEventOptionBits);
-
-IOHIDEventRef IOHIDEventCreateDigitizerStylusEventWithPolarOrientation(CFAllocatorRef, uint64_t, uint32_t, uint32_t, IOHIDDigitizerEventMask, uint32_t, IOHIDFloat, IOHIDFloat, IOHIDFloat, IOHIDFloat, IOHIDFloat, IOHIDFloat, IOHIDFloat, IOHIDFloat, boolean_t, boolean_t, IOHIDEventOptionBits);
-
-IOHIDEventType IOHIDEventGetType(IOHIDEventRef);
-
-void IOHIDEventSetFloatValue(IOHIDEventRef, IOHIDEventField, IOHIDFloat);
-
-CFIndex IOHIDEventGetIntegerValue(IOHIDEventRef, IOHIDEventField);
-void IOHIDEventSetIntegerValue(IOHIDEventRef, IOHIDEventField, CFIndex);
-
-void IOHIDEventAppendEvent(IOHIDEventRef, IOHIDEventRef, IOOptionBits);
-
-IOHIDEventSystemClientRef IOHIDEventSystemClientCreate(CFAllocatorRef);
-
-#define kGSEventPathInfoInRange (1 &lt;&lt; 0)
-#define kGSEventPathInfoInTouch (1 &lt;&lt; 1)
-
-enum {
-    kHIDUsage_KeyboardA = 0x04,
-    kHIDUsage_Keyboard1 = 0x1E,
-    kHIDUsage_Keyboard2 = 0x1F,
-    kHIDUsage_Keyboard3 = 0x20,
-    kHIDUsage_Keyboard4 = 0x21,
-    kHIDUsage_Keyboard5 = 0x22,
-    kHIDUsage_Keyboard6 = 0x23,
-    kHIDUsage_Keyboard7 = 0x24,
-    kHIDUsage_Keyboard8 = 0x25,
-    kHIDUsage_Keyboard9 = 0x26,
-    kHIDUsage_Keyboard0 = 0x27,
-    kHIDUsage_KeyboardReturnOrEnter = 0x28,
-    kHIDUsage_KeyboardEscape = 0x29,
-    kHIDUsage_KeyboardDeleteOrBackspace = 0x2A,
-    kHIDUsage_KeyboardTab = 0x2B,
-    kHIDUsage_KeyboardSpacebar = 0x2C,
-    kHIDUsage_KeyboardHyphen = 0x2D,
-    kHIDUsage_KeyboardEqualSign = 0x2E,
-    kHIDUsage_KeyboardOpenBracket = 0x2F,
-    kHIDUsage_KeyboardCloseBracket = 0x30,
-    kHIDUsage_KeyboardBackslash = 0x31,
-    kHIDUsage_KeyboardSemicolon = 0x33,
-    kHIDUsage_KeyboardQuote = 0x34,
-    kHIDUsage_KeyboardGraveAccentAndTilde = 0x35,
-    kHIDUsage_KeyboardComma = 0x36,
-    kHIDUsage_KeyboardPeriod = 0x37,
-    kHIDUsage_KeyboardSlash = 0x38,
-    kHIDUsage_KeyboardF1 = 0x3A,
-    kHIDUsage_KeyboardHome = 0x4A,
-    kHIDUsage_KeyboardPageUp = 0x4B,
-    kHIDUsage_KeyboardEnd = 0x4D,
-    kHIDUsage_KeyboardRightArrow = 0x4F,
-    kHIDUsage_KeyboardLeftArrow = 0x50,
-    kHIDUsage_KeyboardDownArrow = 0x51,
-    kHIDUsage_KeyboardUpArrow = 0x52,
-    kHIDUsage_KeyboardLeftControl = 0xE0,
-    kHIDUsage_KeyboardLeftShift = 0xE1,
-    kHIDUsage_KeyboardLeftAlt = 0xE2
-};
-
-WTF_EXTERN_C_END
-
-#endif // USE(APPLE_INTERNAL_SDK)
-
-#endif // PLATFORM(IOS)
-
-#endif // IOKitSPI_h
</del></span></pre></div>
<a id="trunkToolsWebKitTestRunnermacEventSenderProxymm"></a>
<div class="modfile"><h4>Modified: trunk/Tools/WebKitTestRunner/mac/EventSenderProxy.mm (214585 => 214586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebKitTestRunner/mac/EventSenderProxy.mm        2017-03-30 00:37:36 UTC (rev 214585)
+++ trunk/Tools/WebKitTestRunner/mac/EventSenderProxy.mm        2017-03-30 01:05:58 UTC (rev 214586)
</span><span class="lines">@@ -46,17 +46,6 @@
</span><span class="cx"> - (void)_postDelayed;
</span><span class="cx"> @end
</span><span class="cx"> 
</span><del>-#if defined(__LP64__)
-struct WKTRCGSEventRecord {
-    char offset1[150];
-    uint8_t phase;
-    char offset2[13];
-    float deltaX;
-    float deltaY;
-    char offset3[76];
-} __attribute__((packed));
-#endif
-
</del><span class="cx"> @interface EventSenderSyntheticEvent : NSEvent {
</span><span class="cx"> @public
</span><span class="cx">     NSPoint _eventSender_locationInWindow;
</span><span class="lines">@@ -71,11 +60,6 @@
</span><span class="cx">     short _eventSender_subtype;
</span><span class="cx">     NSEventType _eventSender_type;
</span><span class="cx">     NSWindow *_eventSender_window;
</span><del>-
-
-#if defined(__LP64__)
-    WKTRCGSEventRecord _eventSender_cgsEventRecord;
-#endif
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (id)initPressureEventAtLocation:(NSPoint)location globalLocation:(NSPoint)globalLocation stage:(NSInteger)stage pressure:(float)pressure stageTransition:(float)stageTransition phase:(NSEventPhase)phase time:(NSTimeInterval)time eventNumber:(NSInteger)eventNumber window:(NSWindow *)window;
</span><span class="lines">@@ -168,13 +152,6 @@
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-#if defined(__LP64__)
-- (WKTRCGSEventRecord)_cgsEventRecord
-{
-    return _eventSender_cgsEventRecord;
-}
-#endif
-
</del><span class="cx"> - (NSWindow *)window
</span><span class="cx"> {
</span><span class="cx">     return _eventSender_window;
</span><span class="lines">@@ -907,50 +884,4 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static NSEventPhase nsEventPhaseFromCGEventPhase(int phase)
-{
-    switch (phase) {
-    case 0: // kCGSGesturePhaseNone
-        return NSEventPhaseNone;
-    case 1: // kCGSGesturePhaseBegan
-        return NSEventPhaseBegan;
-    case 2: // kCGSGesturePhaseChanged
-        return NSEventPhaseChanged;
-    case 4: // kCGSGesturePhaseEnded
-        return NSEventPhaseEnded;
-    case 8: // kCGSGesturePhaseCancelled
-        return NSEventPhaseCancelled;
-    case 128: // kCGSGesturePhaseMayBegin
-        return NSEventPhaseMayBegin;
-    }
-
-    ASSERT_NOT_REACHED();
-    return NSEventPhaseNone;
-}
-
-void EventSenderProxy::swipeGestureWithWheelAndMomentumPhases(int x, int y, int phase, int momentum)
-{
-    RetainPtr&lt;EventSenderSyntheticEvent&gt; event = adoptNS([[EventSenderSyntheticEvent alloc] init]);
-
-    // &quot;mayBegin&quot; a swipe is actually a scroll wheel event.
-    event-&gt;_eventSender_type = (phase == 128) ? NSEventTypeScrollWheel : NSEventTypeGesture;
-    event-&gt;_eventSender_subtype = 6; // kIOHIDEventTypeScroll
-    event-&gt;_eventSender_locationInWindow = NSMakePoint(m_position.x, m_position.y);
-    event-&gt;_eventSender_location = ([m_testController-&gt;mainWebView()-&gt;platformWindow() convertRectToScreen:NSMakeRect(m_position.x, m_position.y, 1, 1)].origin);
-    event-&gt;_eventSender_phase = nsEventPhaseFromCGEventPhase(phase);
-    event-&gt;_eventSender_momentumPhase = nsEventPhaseFromCGEventPhase(momentum);
-    event-&gt;_eventSender_timestamp = absoluteTimeForEventTime(currentEventTime());
-    event-&gt;_eventSender_eventNumber = ++eventNumber;
-
-#if defined(__LP64__)
-    event-&gt;_eventSender_cgsEventRecord.phase = phase;
-    event-&gt;_eventSender_cgsEventRecord.deltaX = (float)x;
-    event-&gt;_eventSender_cgsEventRecord.deltaY = (float)y;
-#else
-    NSLog(@&quot;Synthetic swipe gestures are not implemented for 32-bit WebKitTestRunner.&quot;);
-#endif
-
-    [NSApp sendEvent:event.get()];
-}
-
</del><span class="cx"> } // namespace WTR
</span></span></pre></div>
<a id="trunkToolsWebKitTestRunnermacUIScriptControllerMacmm"></a>
<div class="modfile"><h4>Modified: trunk/Tools/WebKitTestRunner/mac/UIScriptControllerMac.mm (214585 => 214586)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebKitTestRunner/mac/UIScriptControllerMac.mm        2017-03-30 00:37:36 UTC (rev 214585)
+++ trunk/Tools/WebKitTestRunner/mac/UIScriptControllerMac.mm        2017-03-30 01:05:58 UTC (rev 214586)
</span><span class="lines">@@ -26,7 +26,11 @@
</span><span class="cx"> #import &quot;config.h&quot;
</span><span class="cx"> #import &quot;UIScriptController.h&quot;
</span><span class="cx"> 
</span><ins>+#import &quot;EventSerializerMac.h&quot;
</ins><span class="cx"> #import &quot;PlatformWebView.h&quot;
</span><ins>+#import &quot;SharedEventStreamsMac.h&quot;
+#import &quot;TestController.h&quot;
+#import &quot;PlatformWebView.h&quot;
</ins><span class="cx"> #import &quot;StringFunctions.h&quot;
</span><span class="cx"> #import &quot;TestController.h&quot;
</span><span class="cx"> #import &quot;TestRunnerWKWebView.h&quot;
</span><span class="lines">@@ -188,4 +192,39 @@
</span><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+static void playBackEvents(UIScriptContext *context, NSString *eventStream, JSValueRef callback)
+{
+    NSError *error = nil;
+    NSArray *eventDicts = [NSJSONSerialization JSONObjectWithData:[eventStream dataUsingEncoding:NSUTF8StringEncoding] options:0 error:&amp;error];
+
+    if (error) {
+        NSLog(@&quot;ERROR: %@&quot;, error);
+        return;
+    }
+
+    unsigned callbackID = context-&gt;prepareForAsyncTask(callback, CallbackTypeNonPersistent);
+
+    NSWindow *window = [TestController::singleton().mainWebView()-&gt;platformView() window];
+
+    [EventStreamPlayer playStream:eventDicts window:window completionHandler:^ {
+        context-&gt;asyncTaskComplete(callbackID);
+    }];
+}
+
+void UIScriptController::beginBackSwipe(JSValueRef callback)
+{
+    playBackEvents(m_context, beginSwipeBackEventStream(), callback);
+}
+
+void UIScriptController::completeBackSwipe(JSValueRef callback)
+{
+    playBackEvents(m_context, completeSwipeBackEventStream(), callback);
+}
+
+void UIScriptController::platformPlayBackEventStream(JSStringRef eventStream, JSValueRef callback)
+{
+    RetainPtr&lt;CFStringRef&gt; stream = adoptCF(JSStringCopyCFString(kCFAllocatorDefault, eventStream));
+    playBackEvents(m_context, (NSString *)stream.get(), callback);
+}
+
</ins><span class="cx"> } // namespace WTR
</span></span></pre>
</div>
</div>

</body>
</html>