<!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>[210101] trunk/Tools</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/210101">210101</a></dd>
<dt>Author</dt> <dd>wenson_hsieh@apple.com</dd>
<dt>Date</dt> <dd>2016-12-22 09:37:50 -0800 (Thu, 22 Dec 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>fast/events/ios/viewport-shrink-to-fit-allows-double-tap.html is flaky/order dependent
https://bugs.webkit.org/show_bug.cgi?id=161328
&lt;rdar://problem/28475977&gt;

Reviewed by Darin Adler.

Running a test that scales the viewport and listens to a didEndZooming callback (such as
viewport-shrink-to-fit-allows-double-tap.html) immediately after a test that may begin to trigger viewport
scaling as the test completes (such as viewport-device-width-at-initial-scale-fast-clicks.html) may result in
the didEndZooming callback of the latter test being fired early due to the previous test triggering a zoom
animation. Ideally, -[WKScrollView _stopScrollingAndZoomingAnimations], which is called when committing the page
load, should prevent this from happening, but from reading documentation and code inspection, this is not
intended to fire any associated delegate methods or notifications of the UIScrollView, instead deferring them
for later. Instead, what we need in this case is to clear out any started but not yet completed animations after
we finish running a test and before we load the next test.

One way to do this is to remove all animations from the WKScrollView's layer, and the layers of its children,
recursively. Doing so causes scrollViewDidEndZooming:withView:atScale: to fire at the end of the runloop if the
previous test started zooming and then finished before zooming completed. Since this happens before the next
test has a chance to run UI-side scripts, we won't end up firing this callback prematurely during the next test.

* WebKitTestRunner/ios/TestControllerIOS.mm:
(WTR::TestController::platformResetStateToConsistentValues):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
<li><a href="#trunkToolsWebKitTestRunneriosTestControllerIOSmm">trunk/Tools/WebKitTestRunner/ios/TestControllerIOS.mm</a></li>
<li><a href="#trunkToolsWebKitTestRunneriosUIKitSPIh">trunk/Tools/WebKitTestRunner/ios/UIKitSPI.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (210100 => 210101)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog        2016-12-22 17:32:38 UTC (rev 210100)
+++ trunk/Tools/ChangeLog        2016-12-22 17:37:50 UTC (rev 210101)
</span><span class="lines">@@ -1,3 +1,29 @@
</span><ins>+2016-12-22  Wenson Hsieh  &lt;wenson_hsieh@apple.com&gt;
+
+        fast/events/ios/viewport-shrink-to-fit-allows-double-tap.html is flaky/order dependent
+        https://bugs.webkit.org/show_bug.cgi?id=161328
+        &lt;rdar://problem/28475977&gt;
+
+        Reviewed by Darin Adler.
+
+        Running a test that scales the viewport and listens to a didEndZooming callback (such as
+        viewport-shrink-to-fit-allows-double-tap.html) immediately after a test that may begin to trigger viewport
+        scaling as the test completes (such as viewport-device-width-at-initial-scale-fast-clicks.html) may result in
+        the didEndZooming callback of the latter test being fired early due to the previous test triggering a zoom
+        animation. Ideally, -[WKScrollView _stopScrollingAndZoomingAnimations], which is called when committing the page
+        load, should prevent this from happening, but from reading documentation and code inspection, this is not
+        intended to fire any associated delegate methods or notifications of the UIScrollView, instead deferring them
+        for later. Instead, what we need in this case is to clear out any started but not yet completed animations after
+        we finish running a test and before we load the next test.
+
+        One way to do this is to remove all animations from the WKScrollView's layer, and the layers of its children,
+        recursively. Doing so causes scrollViewDidEndZooming:withView:atScale: to fire at the end of the runloop if the
+        previous test started zooming and then finished before zooming completed. Since this happens before the next
+        test has a chance to run UI-side scripts, we won't end up firing this callback prematurely during the next test.
+
+        * WebKitTestRunner/ios/TestControllerIOS.mm:
+        (WTR::TestController::platformResetStateToConsistentValues):
+
</ins><span class="cx"> 2016-12-22  Jer Noble  &lt;jer.noble@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Muted media element playback should not interrupt other audio playback
</span></span></pre></div>
<a id="trunkToolsWebKitTestRunneriosTestControllerIOSmm"></a>
<div class="modfile"><h4>Modified: trunk/Tools/WebKitTestRunner/ios/TestControllerIOS.mm (210100 => 210101)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebKitTestRunner/ios/TestControllerIOS.mm        2016-12-22 17:32:38 UTC (rev 210100)
+++ trunk/Tools/WebKitTestRunner/ios/TestControllerIOS.mm        2016-12-22 17:37:50 UTC (rev 210101)
</span><span class="lines">@@ -30,6 +30,7 @@
</span><span class="cx"> #import &quot;PlatformWebView.h&quot;
</span><span class="cx"> #import &quot;TestInvocation.h&quot;
</span><span class="cx"> #import &quot;TestRunnerWKWebView.h&quot;
</span><ins>+#import &quot;UIKitSPI.h&quot;
</ins><span class="cx"> #import &lt;Foundation/Foundation.h&gt;
</span><span class="cx"> #import &lt;UIKit/UIKit.h&gt;
</span><span class="cx"> #import &lt;WebKit/WKPreferencesRefPrivate.h&gt;
</span><span class="lines">@@ -89,6 +90,7 @@
</span><span class="cx">     if (PlatformWebView* webView = mainWebView()) {
</span><span class="cx">         webView-&gt;platformView()._stableStateOverride = nil;
</span><span class="cx">         UIScrollView *scrollView = webView-&gt;platformView().scrollView;
</span><ins>+        [scrollView _removeAllAnimations:YES];
</ins><span class="cx">         [scrollView setZoomScale:1 animated:NO];
</span><span class="cx">         [scrollView setContentOffset:CGPointZero];
</span><span class="cx">     }
</span></span></pre></div>
<a id="trunkToolsWebKitTestRunneriosUIKitSPIh"></a>
<div class="modfile"><h4>Modified: trunk/Tools/WebKitTestRunner/ios/UIKitSPI.h (210100 => 210101)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebKitTestRunner/ios/UIKitSPI.h        2016-12-22 17:32:38 UTC (rev 210100)
+++ trunk/Tools/WebKitTestRunner/ios/UIKitSPI.h        2016-12-22 17:37:50 UTC (rev 210101)
</span><span class="lines">@@ -36,6 +36,7 @@
</span><span class="cx"> 
</span><span class="cx"> #import &lt;UIKit/UIApplication_Private.h&gt;
</span><span class="cx"> #import &lt;UIKit/UIKeyboard.h&gt;
</span><ins>+#import &lt;UIKit/UIView_Private.h&gt;
</ins><span class="cx"> #import &lt;UIKit/UIWindow_Private.h&gt;
</span><span class="cx"> 
</span><span class="cx"> @interface UIKeyboardPredictionView : UIView
</span><span class="lines">@@ -60,6 +61,10 @@
</span><span class="cx"> + (void)removeAllDynamicDictionaries;
</span><span class="cx"> @end
</span><span class="cx"> 
</span><ins>+@interface UIView ()
+- (void)_removeAllAnimations:(BOOL)includeSubviews;
+@end
+
</ins><span class="cx"> #endif // USE(APPLE_INTERNAL_SDK)
</span><span class="cx"> 
</span><span class="cx"> #endif // PLATFORM(IOS)
</span></span></pre>
</div>
</div>

</body>
</html>