<!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>[178570] 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/178570">178570</a></dd>
<dt>Author</dt> <dd>dbates@webkit.org</dd>
<dt>Date</dt> <dd>2015-01-15 19:29:13 -0800 (Thu, 15 Jan 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>[iOS] REGRESSION (<a href="http://trac.webkit.org/projects/webkit/changeset/174642">r174642</a>): DumpRenderTree.app test may dump result twice
https://bugs.webkit.org/show_bug.cgi?id=139685
&lt;rdar://problem/19281317&gt;

Reviewed by Simon Fraser.

Fixes an issue where a test in DumpRenderTree.app may dump its result twice. In particular,
the test LayoutTests/fast/dom/gc-10.html may dump its result twice.

Following &lt;http://trac.webkit.org/changeset/174642&gt;, we dump the test result asynchronously
as opposed to synchronously. So, the WebThread or the main thread may perform other tasks
before DRT dumps the output of a test. In particular, the WebThread may start a new page
load (say, as a result of continued JavaScript execution), which will ultimately lead to
dumping the test result again. Instead we want DRT to dump the test result synchronously
such that we capture the state of the web page either when the page is loaded or when
window.testRunner.notifyDone() is called.

* DumpRenderTree/ios/PixelDumpSupportIOS.mm:
(createBitmapContextFromWebView): Moved logic to re-enable tile painting and update the
state of the display from here to updateDisplay(). Added call to -[CATransaction flush] to
flush CA transactions to the window.
* DumpRenderTree/mac/DumpRenderTree.mm:
(updateDisplay): Added iOS-specific code to update tiles and tell WebKit to flush
compositing changes to ensure that we have up-to-date tile content for a pixel/ref-test.
(dump): Renamed; formerly named dumpTestResults().
(displayWebView): Removed outdated FIXME comment. Added FIXME comment to investigate
enabling repaint support on iOS.
(-[DumpRenderTree _deferDumpToMainThread]): Deleted.
(-[DumpRenderTree _waitForWebThreadThenDump]): Deleted.
(dumpTestResults): Deleted.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
<li><a href="#trunkToolsDumpRenderTreeiosPixelDumpSupportIOSmm">trunk/Tools/DumpRenderTree/ios/PixelDumpSupportIOS.mm</a></li>
<li><a href="#trunkToolsDumpRenderTreemacDumpRenderTreemm">trunk/Tools/DumpRenderTree/mac/DumpRenderTree.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (178569 => 178570)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog        2015-01-16 02:53:06 UTC (rev 178569)
+++ trunk/Tools/ChangeLog        2015-01-16 03:29:13 UTC (rev 178570)
</span><span class="lines">@@ -1,3 +1,36 @@
</span><ins>+2015-01-15  Daniel Bates  &lt;dabates@apple.com&gt;
+
+        [iOS] REGRESSION (r174642): DumpRenderTree.app test may dump result twice
+        https://bugs.webkit.org/show_bug.cgi?id=139685
+        &lt;rdar://problem/19281317&gt;
+
+        Reviewed by Simon Fraser.
+
+        Fixes an issue where a test in DumpRenderTree.app may dump its result twice. In particular,
+        the test LayoutTests/fast/dom/gc-10.html may dump its result twice.
+
+        Following &lt;http://trac.webkit.org/changeset/174642&gt;, we dump the test result asynchronously
+        as opposed to synchronously. So, the WebThread or the main thread may perform other tasks
+        before DRT dumps the output of a test. In particular, the WebThread may start a new page
+        load (say, as a result of continued JavaScript execution), which will ultimately lead to
+        dumping the test result again. Instead we want DRT to dump the test result synchronously
+        such that we capture the state of the web page either when the page is loaded or when
+        window.testRunner.notifyDone() is called.
+
+        * DumpRenderTree/ios/PixelDumpSupportIOS.mm:
+        (createBitmapContextFromWebView): Moved logic to re-enable tile painting and update the
+        state of the display from here to updateDisplay(). Added call to -[CATransaction flush] to
+        flush CA transactions to the window.
+        * DumpRenderTree/mac/DumpRenderTree.mm:
+        (updateDisplay): Added iOS-specific code to update tiles and tell WebKit to flush
+        compositing changes to ensure that we have up-to-date tile content for a pixel/ref-test.
+        (dump): Renamed; formerly named dumpTestResults().
+        (displayWebView): Removed outdated FIXME comment. Added FIXME comment to investigate
+        enabling repaint support on iOS.
+        (-[DumpRenderTree _deferDumpToMainThread]): Deleted.
+        (-[DumpRenderTree _waitForWebThreadThenDump]): Deleted.
+        (dumpTestResults): Deleted.
+
</ins><span class="cx"> 2015-01-15  Brent Fulgham  &lt;bfulgham@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [Win] Miscellaneous DRT fixes
</span></span></pre></div>
<a id="trunkToolsDumpRenderTreeiosPixelDumpSupportIOSmm"></a>
<div class="modfile"><h4>Modified: trunk/Tools/DumpRenderTree/ios/PixelDumpSupportIOS.mm (178569 => 178570)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/DumpRenderTree/ios/PixelDumpSupportIOS.mm        2015-01-16 02:53:06 UTC (rev 178569)
+++ trunk/Tools/DumpRenderTree/ios/PixelDumpSupportIOS.mm        2015-01-16 03:29:13 UTC (rev 178570)
</span><span class="lines">@@ -80,9 +80,9 @@
</span><span class="cx"> PassRefPtr&lt;BitmapContext&gt; createBitmapContextFromWebView(bool onscreen, bool incrementalRepaint, bool sweepHorizontally, bool drawSelectionRect)
</span><span class="cx"> {
</span><span class="cx">     // TODO: &lt;rdar://problem/6558366&gt; DumpRenderTree: Investigate testRepaintSweepHorizontally and dumpSelectionRect
</span><ins>+
</ins><span class="cx">     WebThreadLock();
</span><del>-    [gWebBrowserView layoutIfNeeded]; // Re-enables tile painting, which was disabled when committing the frame load.
-    [gWebBrowserView setNeedsDisplay];
</del><ins>+    [CATransaction flush];
</ins><span class="cx"> 
</span><span class="cx">     UIGraphicsBeginImageContextWithOptions([[mainFrame webView] frame].size, YES /* opaque */, [gDrtWindow screenScale]);
</span><span class="cx">     [[gWebBrowserView layer] renderInContext:UIGraphicsGetCurrentContext()];
</span></span></pre></div>
<a id="trunkToolsDumpRenderTreemacDumpRenderTreemm"></a>
<div class="modfile"><h4>Modified: trunk/Tools/DumpRenderTree/mac/DumpRenderTree.mm (178569 => 178570)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/DumpRenderTree/mac/DumpRenderTree.mm        2015-01-16 02:53:06 UTC (rev 178569)
+++ trunk/Tools/DumpRenderTree/mac/DumpRenderTree.mm        2015-01-16 03:29:13 UTC (rev 178570)
</span><span class="lines">@@ -151,8 +151,11 @@
</span><span class="cx"> @end
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+@interface WebView (Details)
+- (BOOL)_flushCompositingChanges;
+@end
+
</ins><span class="cx"> static void runTest(const string&amp; testURL);
</span><del>-static void dumpTestResults();
</del><span class="cx"> 
</span><span class="cx"> // Deciding when it's OK to dump out the state is a bit tricky.  All these must be true:
</span><span class="cx"> // - There is no load in progress
</span><span class="lines">@@ -1220,15 +1223,6 @@
</span><span class="cx">     [self performSelectorOnMainThread:@selector(_runDumpRenderTree) withObject:nil waitUntilDone:NO];
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-- (void)_deferDumpToMainThread
-{
-    ASSERT(WebThreadIsCurrent());
-    
-    dispatch_async(dispatch_get_main_queue(), ^{
-        dump();
-    });
-}
-
</del><span class="cx"> - (void)applicationDidEnterBackground:(UIApplication *)application
</span><span class="cx"> {
</span><span class="cx">     /* Apps will get suspended or killed some time after entering the background state but we want to be able to run multiple copies of DumpRenderTree. Periodically check to see if our remaining background time dips below a threshold and create a new background task.
</span><span class="lines">@@ -1284,12 +1278,6 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-- (void)_waitForWebThreadThenDump
-{
-    [self _waitForWebThread];
-    dumpTestResults();
-}
-
</del><span class="cx"> @end
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="lines">@@ -1565,34 +1553,21 @@
</span><span class="cx"> static void updateDisplay()
</span><span class="cx"> {
</span><span class="cx">     WebView *webView = [mainFrame webView];
</span><del>-
</del><ins>+#if PLATFORM(IOS)
+    [gWebBrowserView layoutIfNeeded]; // Re-enables tile painting, which was disabled when committing the frame load.
+    [gDrtWindow layoutTilesNow];
+    [webView _flushCompositingChanges];
+#else
</ins><span class="cx">     if ([webView _isUsingAcceleratedCompositing])
</span><span class="cx">         [webView display];
</span><span class="cx">     else
</span><span class="cx">         [webView displayIfNeeded];
</span><ins>+#endif
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void dump()
</span><span class="cx"> {
</span><span class="cx"> #if PLATFORM(IOS)
</span><del>-    // This can get called on the web thread if from a JavaScript notifyDone().
-    if (WebThreadIsCurrent()) {
-        [(DumpRenderTree *)UIApp _deferDumpToMainThread];
-        return;
-    }
-
-    // Allow the web thread to run before dumping. We can't call -_waitForWebThread directly since we may
-    // be inside a delegate callback.
-    [UIApp performSelectorOnMainThread:@selector(_waitForWebThreadThenDump) withObject:nil waitUntilDone:NO];
-    return;
-#endif
-
-    dumpTestResults();
-}
-
-void dumpTestResults()
-{
-#if PLATFORM(IOS)
</del><span class="cx">     WebThreadLock();
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="lines">@@ -1980,11 +1955,11 @@
</span><span class="cx"> #if !PLATFORM(IOS)
</span><span class="cx">     WebView *webView = [mainFrame webView];
</span><span class="cx">     [webView display];
</span><del>-    
</del><ins>+
+    // FIXME: Tracking repaints is not specific to Mac. We should enable such support on iOS.
</ins><span class="cx">     [webView setTracksRepaints:YES];
</span><span class="cx">     [webView resetTrackedRepaints];
</span><span class="cx"> #else
</span><del>-    // FIXME: &lt;rdar://problem/5106253&gt; DumpRenderTree: fix DRT and ImageDiff to re-enable pixel tests
</del><span class="cx">     [gDrtWindow layoutTilesNow];
</span><span class="cx">     [gDrtWindow setNeedsDisplayInRect:[gDrtWindow frame]];
</span><span class="cx">     [CATransaction flush];
</span></span></pre>
</div>
</div>

</body>
</html>