<!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>[177363] 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/177363">177363</a></dd>
<dt>Author</dt> <dd>ap@apple.com</dd>
<dt>Date</dt> <dd>2014-12-16 10:32:21 -0800 (Tue, 16 Dec 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Sort out timeout implementations in DRT and WKTR
https://bugs.webkit.org/show_bug.cgi?id=139671

Reviewed by Simon Fraser.

Test timeout implementation had many deficiencies, please see the bug for details.
Most notably, we shouldn't have the tool confused about timeouts vs. failures, and
[ Slow ] modifiers should work a lot better.

* DumpRenderTree/TestRunner.cpp: (TestRunner::TestRunner):
* DumpRenderTree/TestRunner.h: (TestRunner::setCustomTimeout):
* DumpRenderTree/mac/DumpRenderTree.mm: (runTest):
* DumpRenderTree/mac/TestRunnerMac.mm: (TestRunner::setWaitToDump):
DumpRenderTree already read the --timeout option from command line, and webkitpy
was already configured to pass it on Mac and iOS. Let's actually use it.
TestCommand already had the same 30 second default, so this doesn't change behavior
when DRT is ran manually without the option.
Windows DumpRenderTree will need to be fixed separately (that's easy).

* DumpRenderTree/TestRunner.cpp: (TestRunner::waitToDumpWatchdogTimerFired()):
Don't print the timeout message to stdout to match WebKitTestRunner. It would be
slightly better to use stderr in both, as this is an out of band message, but
that's a larger refactoring, and the difference is minimal in practice.

* Scripts/webkitpy/layout_tests/controllers/single_test_runner.py:
(SingleTestRunner.__init__): Ensure that script and tool timeouts are substantially
different. We want the tool to reliably detect timeouts that can be detected, and
not race with the script for that.

* Scripts/webkitpy/port/base.py: (Port.default_timeout_ms): Don't make WebKit2
timeout longer than WebKit1 one, I doubt that this is necessary. Now that the value
is honored inmore cases, that could make tests run slower.
* Scripts/webkitpy/port/driver.py:
(Driver.__init__):
(Driver.run_test):
(Driver.cmd_line):
(Driver._check_for_driver_timeout):
Detect tests that have the timeout output, and make these have the proper Timeout result.

* Scripts/webkitpy/port/ios.py: (IOSSimulatorPort.default_timeout_ms): Remove an
incorrect recent change - 80 * 1000 is 80 seconds, not 80 milliseconds.

* WebKitTestRunner/InjectedBundle/TestRunner.cpp:
(WTR::TestRunner::setCustomTimeout): Deleted.
* WebKitTestRunner/InjectedBundle/TestRunner.h:
(WTR::TestRunner::setCustomTimeout):
* WebKitTestRunner/InjectedBundle/efl/TestRunnerEfl.cpp:
(WTR::TestRunner::initializeWaitToDumpWatchdogTimerIfNeeded):
* WebKitTestRunner/InjectedBundle/mac/TestRunnerMac.mm:
(WTR::TestRunner::initializeWaitToDumpWatchdogTimerIfNeeded):
* WebKitTestRunner/InjectedBundle/win/TestRunnerWin.cpp:
(WTR::TestRunner::initializeWaitToDumpWatchdogTimerIfNeeded):
* WebKitTestRunner/InjectedBundle/gtk/TestRunnerGtk.cpp:
(WTR::TestRunner::initializeWaitToDumpWatchdogTimerIfNeeded):
Updated to use a timeout passed from UI process, which used to be ignored.

* WebKitTestRunner/TestController.cpp:
(WTR::TestController::TestController):
(WTR::TestController::runUntil):
(WTR::TestController::getCustomTimeout): Deleted.
* WebKitTestRunner/TestController.h:
Delete unused m_timeout. First, it was always 0, and second, we don't need it at all.
Changed default message timeouts to match new run-webkit-tests timeout. These don't
affect ports where timeout is passed per test (shouldn't they all be like that?).

* WebKitTestRunner/TestInvocation.cpp:
(WTR::TestInvocation::invoke):
(WTR::TestInvocation::setCustomTimeout): Deleted.
* WebKitTestRunner/TestInvocation.h:
(WTR::TestInvocation::setCustomTimeout):
(WTR::TestInvocation::customTimeout):
Ditto.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
<li><a href="#trunkToolsDumpRenderTreeTestRunnercpp">trunk/Tools/DumpRenderTree/TestRunner.cpp</a></li>
<li><a href="#trunkToolsDumpRenderTreeTestRunnerh">trunk/Tools/DumpRenderTree/TestRunner.h</a></li>
<li><a href="#trunkToolsDumpRenderTreemacDumpRenderTreemm">trunk/Tools/DumpRenderTree/mac/DumpRenderTree.mm</a></li>
<li><a href="#trunkToolsDumpRenderTreemacTestRunnerMacmm">trunk/Tools/DumpRenderTree/mac/TestRunnerMac.mm</a></li>
<li><a href="#trunkToolsScriptswebkitpylayout_testscontrollerssingle_test_runnerpy">trunk/Tools/Scripts/webkitpy/layout_tests/controllers/single_test_runner.py</a></li>
<li><a href="#trunkToolsScriptswebkitpyportbasepy">trunk/Tools/Scripts/webkitpy/port/base.py</a></li>
<li><a href="#trunkToolsScriptswebkitpyportdriverpy">trunk/Tools/Scripts/webkitpy/port/driver.py</a></li>
<li><a href="#trunkToolsScriptswebkitpyportiospy">trunk/Tools/Scripts/webkitpy/port/ios.py</a></li>
<li><a href="#trunkToolsWebKitTestRunnerInjectedBundleTestRunnercpp">trunk/Tools/WebKitTestRunner/InjectedBundle/TestRunner.cpp</a></li>
<li><a href="#trunkToolsWebKitTestRunnerInjectedBundleTestRunnerh">trunk/Tools/WebKitTestRunner/InjectedBundle/TestRunner.h</a></li>
<li><a href="#trunkToolsWebKitTestRunnerInjectedBundleeflTestRunnerEflcpp">trunk/Tools/WebKitTestRunner/InjectedBundle/efl/TestRunnerEfl.cpp</a></li>
<li><a href="#trunkToolsWebKitTestRunnerInjectedBundlegtkTestRunnerGtkcpp">trunk/Tools/WebKitTestRunner/InjectedBundle/gtk/TestRunnerGtk.cpp</a></li>
<li><a href="#trunkToolsWebKitTestRunnerInjectedBundlemacTestRunnerMacmm">trunk/Tools/WebKitTestRunner/InjectedBundle/mac/TestRunnerMac.mm</a></li>
<li><a href="#trunkToolsWebKitTestRunnerInjectedBundlewinTestRunnerWincpp">trunk/Tools/WebKitTestRunner/InjectedBundle/win/TestRunnerWin.cpp</a></li>
<li><a href="#trunkToolsWebKitTestRunnerTestControllercpp">trunk/Tools/WebKitTestRunner/TestController.cpp</a></li>
<li><a href="#trunkToolsWebKitTestRunnerTestControllerh">trunk/Tools/WebKitTestRunner/TestController.h</a></li>
<li><a href="#trunkToolsWebKitTestRunnerTestInvocationcpp">trunk/Tools/WebKitTestRunner/TestInvocation.cpp</a></li>
<li><a href="#trunkToolsWebKitTestRunnerTestInvocationh">trunk/Tools/WebKitTestRunner/TestInvocation.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (177362 => 177363)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog        2014-12-16 17:45:13 UTC (rev 177362)
+++ trunk/Tools/ChangeLog        2014-12-16 18:32:21 UTC (rev 177363)
</span><span class="lines">@@ -1,3 +1,78 @@
</span><ins>+2014-12-15  Alexey Proskuryakov  &lt;ap@apple.com&gt;
+
+        Sort out timeout implementations in DRT and WKTR
+        https://bugs.webkit.org/show_bug.cgi?id=139671
+
+        Reviewed by Simon Fraser.
+
+        Test timeout implementation had many deficiencies, please see the bug for details.
+        Most notably, we shouldn't have the tool confused about timeouts vs. failures, and
+        [ Slow ] modifiers should work a lot better.
+
+        * DumpRenderTree/TestRunner.cpp: (TestRunner::TestRunner):
+        * DumpRenderTree/TestRunner.h: (TestRunner::setCustomTimeout):
+        * DumpRenderTree/mac/DumpRenderTree.mm: (runTest):
+        * DumpRenderTree/mac/TestRunnerMac.mm: (TestRunner::setWaitToDump):
+        DumpRenderTree already read the --timeout option from command line, and webkitpy
+        was already configured to pass it on Mac and iOS. Let's actually use it.
+        TestCommand already had the same 30 second default, so this doesn't change behavior
+        when DRT is ran manually without the option.
+        Windows DumpRenderTree will need to be fixed separately (that's easy).
+
+        * DumpRenderTree/TestRunner.cpp: (TestRunner::waitToDumpWatchdogTimerFired()):
+        Don't print the timeout message to stdout to match WebKitTestRunner. It would be
+        slightly better to use stderr in both, as this is an out of band message, but
+        that's a larger refactoring, and the difference is minimal in practice.
+
+        * Scripts/webkitpy/layout_tests/controllers/single_test_runner.py:
+        (SingleTestRunner.__init__): Ensure that script and tool timeouts are substantially
+        different. We want the tool to reliably detect timeouts that can be detected, and
+        not race with the script for that.
+
+        * Scripts/webkitpy/port/base.py: (Port.default_timeout_ms): Don't make WebKit2
+        timeout longer than WebKit1 one, I doubt that this is necessary. Now that the value
+        is honored inmore cases, that could make tests run slower.
+        * Scripts/webkitpy/port/driver.py:
+        (Driver.__init__):
+        (Driver.run_test):
+        (Driver.cmd_line):
+        (Driver._check_for_driver_timeout):
+        Detect tests that have the timeout output, and make these have the proper Timeout result.
+
+        * Scripts/webkitpy/port/ios.py: (IOSSimulatorPort.default_timeout_ms): Remove an
+        incorrect recent change - 80 * 1000 is 80 seconds, not 80 milliseconds.
+
+        * WebKitTestRunner/InjectedBundle/TestRunner.cpp:
+        (WTR::TestRunner::setCustomTimeout): Deleted.
+        * WebKitTestRunner/InjectedBundle/TestRunner.h:
+        (WTR::TestRunner::setCustomTimeout):
+        * WebKitTestRunner/InjectedBundle/efl/TestRunnerEfl.cpp:
+        (WTR::TestRunner::initializeWaitToDumpWatchdogTimerIfNeeded):
+        * WebKitTestRunner/InjectedBundle/mac/TestRunnerMac.mm:
+        (WTR::TestRunner::initializeWaitToDumpWatchdogTimerIfNeeded):
+        * WebKitTestRunner/InjectedBundle/win/TestRunnerWin.cpp:
+        (WTR::TestRunner::initializeWaitToDumpWatchdogTimerIfNeeded):
+        * WebKitTestRunner/InjectedBundle/gtk/TestRunnerGtk.cpp:
+        (WTR::TestRunner::initializeWaitToDumpWatchdogTimerIfNeeded):
+        Updated to use a timeout passed from UI process, which used to be ignored.
+
+        * WebKitTestRunner/TestController.cpp:
+        (WTR::TestController::TestController):
+        (WTR::TestController::runUntil):
+        (WTR::TestController::getCustomTimeout): Deleted.
+        * WebKitTestRunner/TestController.h:
+        Delete unused m_timeout. First, it was always 0, and second, we don't need it at all.
+        Changed default message timeouts to match new run-webkit-tests timeout. These don't
+        affect ports where timeout is passed per test (shouldn't they all be like that?).
+
+        * WebKitTestRunner/TestInvocation.cpp:
+        (WTR::TestInvocation::invoke):
+        (WTR::TestInvocation::setCustomTimeout): Deleted.
+        * WebKitTestRunner/TestInvocation.h:
+        (WTR::TestInvocation::setCustomTimeout):
+        (WTR::TestInvocation::customTimeout):
+        Ditto.
+
</ins><span class="cx"> 2014-12-16  Grzegorz Czajkowski  &lt;g.czajkowski@samsung.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [EFL] Add logging domain for MiniBrowser
</span></span></pre></div>
<a id="trunkToolsDumpRenderTreeTestRunnercpp"></a>
<div class="modfile"><h4>Modified: trunk/Tools/DumpRenderTree/TestRunner.cpp (177362 => 177363)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/DumpRenderTree/TestRunner.cpp        2014-12-16 17:45:13 UTC (rev 177362)
+++ trunk/Tools/DumpRenderTree/TestRunner.cpp        2014-12-16 18:32:21 UTC (rev 177363)
</span><span class="lines">@@ -115,6 +115,7 @@
</span><span class="cx">     , m_testURL(testURL)
</span><span class="cx">     , m_expectedPixelHash(expectedPixelHash)
</span><span class="cx">     , m_titleTextDirection(&quot;ltr&quot;)
</span><ins>+    , m_timeout(0)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -2257,7 +2258,6 @@
</span><span class="cx"> void TestRunner::waitToDumpWatchdogTimerFired()
</span><span class="cx"> {
</span><span class="cx">     const char* message = &quot;FAIL: Timed out waiting for notifyDone to be called\n&quot;;
</span><del>-    fprintf(stderr, &quot;%s&quot;, message);
</del><span class="cx">     fprintf(stdout, &quot;%s&quot;, message);
</span><span class="cx">     notifyDone();
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkToolsDumpRenderTreeTestRunnerh"></a>
<div class="modfile"><h4>Modified: trunk/Tools/DumpRenderTree/TestRunner.h (177362 => 177363)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/DumpRenderTree/TestRunner.h        2014-12-16 17:45:13 UTC (rev 177362)
+++ trunk/Tools/DumpRenderTree/TestRunner.h        2014-12-16 18:32:21 UTC (rev 177363)
</span><span class="lines">@@ -356,6 +356,8 @@
</span><span class="cx"> 
</span><span class="cx">     bool hasPendingWebNotificationClick() const { return m_hasPendingWebNotificationClick; }
</span><span class="cx"> 
</span><ins>+    void setCustomTimeout(int duration) { m_timeout = duration; }
+
</ins><span class="cx"> private:
</span><span class="cx">     TestRunner(const std::string&amp; testURL, const std::string&amp; expectedPixelHash);
</span><span class="cx"> 
</span><span class="lines">@@ -431,6 +433,8 @@
</span><span class="cx">     static JSClassRef getJSClass();
</span><span class="cx">     static JSStaticValue* staticValues();
</span><span class="cx">     static JSStaticFunction* staticFunctions();
</span><ins>+
+    int m_timeout;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> #endif // TestRunner_h
</span></span></pre></div>
<a id="trunkToolsDumpRenderTreemacDumpRenderTreemm"></a>
<div class="modfile"><h4>Modified: trunk/Tools/DumpRenderTree/mac/DumpRenderTree.mm (177362 => 177363)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/DumpRenderTree/mac/DumpRenderTree.mm        2014-12-16 17:45:13 UTC (rev 177362)
+++ trunk/Tools/DumpRenderTree/mac/DumpRenderTree.mm        2014-12-16 18:32:21 UTC (rev 177363)
</span><span class="lines">@@ -1863,6 +1863,7 @@
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     gTestRunner = TestRunner::create(testURL, command.expectedPixelHash);
</span><ins>+    gTestRunner-&gt;setCustomTimeout(command.timeout);
</ins><span class="cx">     topLoadingFrame = nil;
</span><span class="cx"> #if !PLATFORM(IOS)
</span><span class="cx">     ASSERT(!draggingInfo); // the previous test should have called eventSender.mouseUp to drop!
</span></span></pre></div>
<a id="trunkToolsDumpRenderTreemacTestRunnerMacmm"></a>
<div class="modfile"><h4>Modified: trunk/Tools/DumpRenderTree/mac/TestRunnerMac.mm (177362 => 177363)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/DumpRenderTree/mac/TestRunnerMac.mm        2014-12-16 17:45:13 UTC (rev 177362)
+++ trunk/Tools/DumpRenderTree/mac/TestRunnerMac.mm        2014-12-16 18:32:21 UTC (rev 177363)
</span><span class="lines">@@ -646,8 +646,6 @@
</span><span class="cx">     [[mainFrame webView] _updateActiveState];
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static const CFTimeInterval waitToDumpWatchdogInterval = 30.0;
-
</del><span class="cx"> static void waitUntilDoneWatchdogFired(CFRunLoopTimerRef timer, void* info)
</span><span class="cx"> {
</span><span class="cx">     gTestRunner-&gt;waitToDumpWatchdogTimerFired();
</span><span class="lines">@@ -656,8 +654,8 @@
</span><span class="cx"> void TestRunner::setWaitToDump(bool waitUntilDone)
</span><span class="cx"> {
</span><span class="cx">     m_waitToDump = waitUntilDone;
</span><del>-    if (m_waitToDump &amp;&amp; shouldSetWaitToDumpWatchdog())
-        setWaitToDumpWatchdog(CFRunLoopTimerCreate(kCFAllocatorDefault, CFAbsoluteTimeGetCurrent() + waitToDumpWatchdogInterval, 0, 0, 0, waitUntilDoneWatchdogFired, NULL));
</del><ins>+    if (m_waitToDump &amp;&amp; m_timeout &amp;&amp; shouldSetWaitToDumpWatchdog())
+        setWaitToDumpWatchdog(CFRunLoopTimerCreate(kCFAllocatorDefault, CFAbsoluteTimeGetCurrent() + m_timeout / 1000.0, 0, 0, 0, waitUntilDoneWatchdogFired, NULL));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> int TestRunner::windowCount()
</span></span></pre></div>
<a id="trunkToolsScriptswebkitpylayout_testscontrollerssingle_test_runnerpy"></a>
<div class="modfile"><h4>Modified: trunk/Tools/Scripts/webkitpy/layout_tests/controllers/single_test_runner.py (177362 => 177363)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/Scripts/webkitpy/layout_tests/controllers/single_test_runner.py        2014-12-16 17:45:13 UTC (rev 177362)
+++ trunk/Tools/Scripts/webkitpy/layout_tests/controllers/single_test_runner.py        2014-12-16 18:32:21 UTC (rev 177363)
</span><span class="lines">@@ -55,13 +55,19 @@
</span><span class="cx">         self._options = options
</span><span class="cx">         self._results_directory = results_directory
</span><span class="cx">         self._driver = driver
</span><del>-        self._timeout = test_input.timeout
</del><span class="cx">         self._worker_name = worker_name
</span><span class="cx">         self._test_name = test_input.test_name
</span><span class="cx">         self._should_run_pixel_test = test_input.should_run_pixel_test
</span><span class="cx">         self._reference_files = test_input.reference_files
</span><span class="cx">         self._stop_when_done = stop_when_done
</span><span class="cx"> 
</span><ins>+        self._timeout = test_input.timeout
+        if self._timeout &gt; 5000:
+            # Timeouts are detected by both script and tool; tool detected timeouts are
+            # better, because they contain partial output. Give the tool some time to
+            # report the timeout instead of being killed.
+            self._timeout = int(self._timeout) - 5000
+
</ins><span class="cx">         if self._reference_files:
</span><span class="cx">             # Detect and report a test which has a wrong combination of expectation files.
</span><span class="cx">             # For example, if 'foo.html' has two expectation files, 'foo-expected.html' and
</span></span></pre></div>
<a id="trunkToolsScriptswebkitpyportbasepy"></a>
<div class="modfile"><h4>Modified: trunk/Tools/Scripts/webkitpy/port/base.py (177362 => 177363)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/Scripts/webkitpy/port/base.py        2014-12-16 17:45:13 UTC (rev 177362)
+++ trunk/Tools/Scripts/webkitpy/port/base.py        2014-12-16 18:32:21 UTC (rev 177363)
</span><span class="lines">@@ -138,10 +138,6 @@
</span><span class="cx">         return False
</span><span class="cx"> 
</span><span class="cx">     def default_timeout_ms(self):
</span><del>-        if self.get_option('webkit_test_runner'):
-            # Add some more time to WebKitTestRunner because it needs to syncronise the state
-            # with the web process and we want to detect if there is a problem with that in the driver.
-            return 80 * 1000
</del><span class="cx">         return 35 * 1000
</span><span class="cx"> 
</span><span class="cx">     def driver_stop_timeout(self):
</span></span></pre></div>
<a id="trunkToolsScriptswebkitpyportdriverpy"></a>
<div class="modfile"><h4>Modified: trunk/Tools/Scripts/webkitpy/port/driver.py (177362 => 177363)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/Scripts/webkitpy/port/driver.py        2014-12-16 17:45:13 UTC (rev 177362)
+++ trunk/Tools/Scripts/webkitpy/port/driver.py        2014-12-16 18:32:21 UTC (rev 177363)
</span><span class="lines">@@ -137,6 +137,8 @@
</span><span class="cx">         self._crashed_process_name = None
</span><span class="cx">         self._crashed_pid = None
</span><span class="cx"> 
</span><ins>+        self._driver_timed_out = False
+
</ins><span class="cx">         # WebKitTestRunner can report back subprocesses that became unresponsive
</span><span class="cx">         # This could mean they crashed.
</span><span class="cx">         self._subprocess_was_unresponsive = False
</span><span class="lines">@@ -172,6 +174,7 @@
</span><span class="cx">         start_time = time.time()
</span><span class="cx">         self.start(driver_input.should_run_pixel_test, driver_input.args)
</span><span class="cx">         test_begin_time = time.time()
</span><ins>+        self._driver_timed_out = False
</ins><span class="cx">         self.error_from_test = str()
</span><span class="cx">         self.err_seen_eof = False
</span><span class="cx"> 
</span><span class="lines">@@ -184,6 +187,7 @@
</span><span class="cx"> 
</span><span class="cx">         crashed = self.has_crashed()
</span><span class="cx">         timed_out = self._server_process.timed_out
</span><ins>+        driver_timed_out = self._driver_timed_out
</ins><span class="cx">         pid = self._server_process.pid()
</span><span class="cx"> 
</span><span class="cx">         if stop_when_done or crashed or timed_out:
</span><span class="lines">@@ -213,7 +217,7 @@
</span><span class="cx"> 
</span><span class="cx">         return DriverOutput(text, image, actual_image_hash, audio,
</span><span class="cx">             crash=crashed, test_time=time.time() - test_begin_time, measurements=self._measurements,
</span><del>-            timeout=timed_out, error=self.error_from_test,
</del><ins>+            timeout=timed_out or driver_timed_out, error=self.error_from_test,
</ins><span class="cx">             crashed_process_name=self._crashed_process_name,
</span><span class="cx">             crashed_pid=self._crashed_pid, crash_log=crash_log, pid=pid)
</span><span class="cx"> 
</span><span class="lines">@@ -349,7 +353,6 @@
</span><span class="cx">             cmd.append('--threaded')
</span><span class="cx">         if self._no_timeout:
</span><span class="cx">             cmd.append('--no-timeout')
</span><del>-        # FIXME: We need to pass --timeout=SECONDS to WebKitTestRunner for WebKit2.
</del><span class="cx"> 
</span><span class="cx">         cmd.extend(self._port.get_option('additional_drt_flag', []))
</span><span class="cx">         cmd.extend(self._port.additional_drt_flag())
</span><span class="lines">@@ -359,6 +362,10 @@
</span><span class="cx">         cmd.append('-')
</span><span class="cx">         return cmd
</span><span class="cx"> 
</span><ins>+    def _check_for_driver_timeout(self, out_line):
+        if out_line == &quot;FAIL: Timed out waiting for notifyDone to be called&quot;:
+            self._driver_timed_out = True
+
</ins><span class="cx">     def _check_for_driver_crash(self, error_line):
</span><span class="cx">         if error_line == &quot;#CRASHED\n&quot;:
</span><span class="cx">             # This is used on Windows and iOS to report that the process has crashed
</span></span></pre></div>
<a id="trunkToolsScriptswebkitpyportiospy"></a>
<div class="modfile"><h4>Modified: trunk/Tools/Scripts/webkitpy/port/ios.py (177362 => 177363)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/Scripts/webkitpy/port/ios.py        2014-12-16 17:45:13 UTC (rev 177362)
+++ trunk/Tools/Scripts/webkitpy/port/ios.py        2014-12-16 18:32:21 UTC (rev 177363)
</span><span class="lines">@@ -82,11 +82,6 @@
</span><span class="cx">     def default_timeout_ms(self):
</span><span class="cx">         if self.get_option('guard_malloc'):
</span><span class="cx">             return 350 * 1000
</span><del>-        if not self.get_option('webkit_test_runner'):
-            # DumpRenderTree.app waits for the WebThread to run before dumping its output.  In practice
-            # it seems sufficient to wait up to 80ms to ensure that the WebThread ran and hence output
-            # for the test is dumped.
-            return 80 * 1000
</del><span class="cx">         return super(IOSSimulatorPort, self).default_timeout_ms()
</span><span class="cx"> 
</span><span class="cx">     def supports_per_test_timeout(self):
</span></span></pre></div>
<a id="trunkToolsWebKitTestRunnerInjectedBundleTestRunnercpp"></a>
<div class="modfile"><h4>Modified: trunk/Tools/WebKitTestRunner/InjectedBundle/TestRunner.cpp (177362 => 177363)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebKitTestRunner/InjectedBundle/TestRunner.cpp        2014-12-16 17:45:13 UTC (rev 177362)
+++ trunk/Tools/WebKitTestRunner/InjectedBundle/TestRunner.cpp        2014-12-16 18:32:21 UTC (rev 177363)
</span><span class="lines">@@ -55,8 +55,6 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WTR {
</span><span class="cx"> 
</span><del>-const double TestRunner::waitToDumpWatchdogTimerInterval = 30;
-
</del><span class="cx"> PassRefPtr&lt;TestRunner&gt; TestRunner::create()
</span><span class="cx"> {
</span><span class="cx">     return adoptRef(new TestRunner);
</span><span class="lines">@@ -93,6 +91,7 @@
</span><span class="cx">     , m_policyDelegatePermissive(false)
</span><span class="cx">     , m_globalFlag(false)
</span><span class="cx">     , m_customFullScreenBehavior(false)
</span><ins>+    , m_timeout(30000)
</ins><span class="cx">     , m_databaseDefaultQuota(-1)
</span><span class="cx">     , m_databaseMaxQuota(-1)
</span><span class="cx">     , m_userStyleSheetEnabled(false)
</span><span class="lines">@@ -164,11 +163,6 @@
</span><span class="cx">     m_waitToDump = false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void TestRunner::setCustomTimeout(int timeout)
-{
-    m_timeout = timeout;
-}
-
</del><span class="cx"> void TestRunner::addUserScript(JSStringRef source, bool runAtStart, bool allFrames)
</span><span class="cx"> {
</span><span class="cx">     WKRetainPtr&lt;WKStringRef&gt; sourceWK = toWK(source);
</span></span></pre></div>
<a id="trunkToolsWebKitTestRunnerInjectedBundleTestRunnerh"></a>
<div class="modfile"><h4>Modified: trunk/Tools/WebKitTestRunner/InjectedBundle/TestRunner.h (177362 => 177363)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebKitTestRunner/InjectedBundle/TestRunner.h        2014-12-16 17:45:13 UTC (rev 177362)
+++ trunk/Tools/WebKitTestRunner/InjectedBundle/TestRunner.h        2014-12-16 18:32:21 UTC (rev 177363)
</span><span class="lines">@@ -263,7 +263,7 @@
</span><span class="cx"> 
</span><span class="cx">     bool callShouldCloseOnWebView();
</span><span class="cx"> 
</span><del>-    void setCustomTimeout(int duration);
</del><ins>+    void setCustomTimeout(int duration) { m_timeout = duration; }
</ins><span class="cx"> 
</span><span class="cx">     // Work queue.
</span><span class="cx">     void queueBackNavigation(unsigned howFarBackward);
</span><span class="lines">@@ -280,8 +280,6 @@
</span><span class="cx">     JSValueRef neverInlineFunction(JSValueRef theFunction);
</span><span class="cx"> 
</span><span class="cx"> private:
</span><del>-    static const double waitToDumpWatchdogTimerInterval;
-
</del><span class="cx">     TestRunner();
</span><span class="cx"> 
</span><span class="cx">     void platformInitialize();
</span></span></pre></div>
<a id="trunkToolsWebKitTestRunnerInjectedBundleeflTestRunnerEflcpp"></a>
<div class="modfile"><h4>Modified: trunk/Tools/WebKitTestRunner/InjectedBundle/efl/TestRunnerEfl.cpp (177362 => 177363)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebKitTestRunner/InjectedBundle/efl/TestRunnerEfl.cpp        2014-12-16 17:45:13 UTC (rev 177362)
+++ trunk/Tools/WebKitTestRunner/InjectedBundle/efl/TestRunnerEfl.cpp        2014-12-16 18:32:21 UTC (rev 177363)
</span><span class="lines">@@ -53,8 +53,7 @@
</span><span class="cx">     if (m_waitToDumpWatchdogTimer)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    m_waitToDumpWatchdogTimer = ecore_timer_loop_add(waitToDumpWatchdogTimerInterval,
-                                                     waitToDumpWatchdogTimerCallback, 0);
</del><ins>+    m_waitToDumpWatchdogTimer = ecore_timer_loop_add(m_timeout / 1000.0, waitToDumpWatchdogTimerCallback, 0);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> JSRetainPtr&lt;JSStringRef&gt; TestRunner::pathToLocalResource(JSStringRef url)
</span></span></pre></div>
<a id="trunkToolsWebKitTestRunnerInjectedBundlegtkTestRunnerGtkcpp"></a>
<div class="modfile"><h4>Modified: trunk/Tools/WebKitTestRunner/InjectedBundle/gtk/TestRunnerGtk.cpp (177362 => 177363)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebKitTestRunner/InjectedBundle/gtk/TestRunnerGtk.cpp        2014-12-16 17:45:13 UTC (rev 177362)
+++ trunk/Tools/WebKitTestRunner/InjectedBundle/gtk/TestRunnerGtk.cpp        2014-12-16 18:32:21 UTC (rev 177363)
</span><span class="lines">@@ -49,7 +49,7 @@
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     m_waitToDumpWatchdogTimer.scheduleAfterDelay(&quot;[WTR] waitToDumpWatchdogTimerCallback&quot;, [this] { waitToDumpWatchdogTimerFired(); },
</span><del>-        std::chrono::duration_cast&lt;std::chrono::microseconds&gt;(std::chrono::duration&lt;double&gt;(waitToDumpWatchdogTimerInterval)));
</del><ins>+        std::chrono::duration_cast&lt;std::chrono::microseconds&gt;(std::chrono::duration&lt;double&gt;(m_timeout / 1000.0)));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> JSRetainPtr&lt;JSStringRef&gt; TestRunner::pathToLocalResource(JSStringRef url)
</span></span></pre></div>
<a id="trunkToolsWebKitTestRunnerInjectedBundlemacTestRunnerMacmm"></a>
<div class="modfile"><h4>Modified: trunk/Tools/WebKitTestRunner/InjectedBundle/mac/TestRunnerMac.mm (177362 => 177363)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebKitTestRunner/InjectedBundle/mac/TestRunnerMac.mm        2014-12-16 17:45:13 UTC (rev 177362)
+++ trunk/Tools/WebKitTestRunner/InjectedBundle/mac/TestRunnerMac.mm        2014-12-16 18:32:21 UTC (rev 177363)
</span><span class="lines">@@ -52,7 +52,8 @@
</span><span class="cx">     if (m_waitToDumpWatchdogTimer)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    m_waitToDumpWatchdogTimer = adoptCF(CFRunLoopTimerCreate(kCFAllocatorDefault, CFAbsoluteTimeGetCurrent() + waitToDumpWatchdogTimerInterval, 0, 0, 0, WTR::waitUntilDoneWatchdogTimerFired, NULL));
</del><ins>+    CFTimeInterval interval = m_timeout / 1000.0;
+    m_waitToDumpWatchdogTimer = adoptCF(CFRunLoopTimerCreate(kCFAllocatorDefault, CFAbsoluteTimeGetCurrent() + interval, 0, 0, 0, WTR::waitUntilDoneWatchdogTimerFired, NULL));
</ins><span class="cx">     CFRunLoopAddTimer(CFRunLoopGetCurrent(), m_waitToDumpWatchdogTimer.get(), kCFRunLoopCommonModes);
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkToolsWebKitTestRunnerInjectedBundlewinTestRunnerWincpp"></a>
<div class="modfile"><h4>Modified: trunk/Tools/WebKitTestRunner/InjectedBundle/win/TestRunnerWin.cpp (177362 => 177363)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebKitTestRunner/InjectedBundle/win/TestRunnerWin.cpp        2014-12-16 17:45:13 UTC (rev 177362)
+++ trunk/Tools/WebKitTestRunner/InjectedBundle/win/TestRunnerWin.cpp        2014-12-16 18:32:21 UTC (rev 177363)
</span><span class="lines">@@ -56,7 +56,7 @@
</span><span class="cx">     if (m_waitToDumpWatchdogTimer)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    m_waitToDumpWatchdogTimer = ::SetTimer(0, waitToDumpWatchdogTimerIdentifier, waitToDumpWatchdogTimerInterval * 1000, WTR::waitToDumpWatchdogTimerFired);
</del><ins>+    m_waitToDumpWatchdogTimer = ::SetTimer(0, waitToDumpWatchdogTimerIdentifier, m_timeout, WTR::waitToDumpWatchdogTimerFired);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> JSRetainPtr&lt;JSStringRef&gt; TestRunner::pathToLocalResource(JSStringRef url)
</span></span></pre></div>
<a id="trunkToolsWebKitTestRunnerTestControllercpp"></a>
<div class="modfile"><h4>Modified: trunk/Tools/WebKitTestRunner/TestController.cpp (177362 => 177363)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebKitTestRunner/TestController.cpp        2014-12-16 17:45:13 UTC (rev 177362)
+++ trunk/Tools/WebKitTestRunner/TestController.cpp        2014-12-16 18:32:21 UTC (rev 177363)
</span><span class="lines">@@ -70,11 +70,12 @@
</span><span class="cx"> const unsigned TestController::w3cSVGViewWidth = 480;
</span><span class="cx"> const unsigned TestController::w3cSVGViewHeight = 360;
</span><span class="cx"> 
</span><del>-// defaultLongTimeout + defaultShortTimeout should be less than 80,
</del><ins>+// defaultLongTimeout + defaultShortTimeout should be less than 35,
</ins><span class="cx"> // the default timeout value of the test harness so we can detect an
</span><span class="cx"> // unresponsive web process.
</span><del>-static const double defaultLongTimeout = 60;
-static const double defaultShortTimeout = 15;
</del><ins>+// These values are only used by ports that don't have --timeout option passed to WebKitTestRunner.
+static const double defaultLongTimeout = 25;
+static const double defaultShortTimeout = 5;
</ins><span class="cx"> static const double defaultNoTimeout = -1;
</span><span class="cx"> 
</span><span class="cx"> static WKURLRef blankURL()
</span><span class="lines">@@ -110,7 +111,6 @@
</span><span class="cx">     , m_noTimeout(defaultNoTimeout)
</span><span class="cx">     , m_useWaitToDumpWatchdogTimer(true)
</span><span class="cx">     , m_forceNoTimeout(false)
</span><del>-    , m_timeout(0)
</del><span class="cx">     , m_didPrintWebProcessCrashedMessage(false)
</span><span class="cx">     , m_shouldExitWhenWebProcessCrashes(true)
</span><span class="cx">     , m_beforeUnloadReturnValue(true)
</span><span class="lines">@@ -194,11 +194,6 @@
</span><span class="cx">     TestController::shared().handleUserMediaPermissionRequest(permissionRequest);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-int TestController::getCustomTimeout()
-{
-    return m_timeout;
-}
-
</del><span class="cx"> WKPageRef TestController::createOtherPage(WKPageRef oldPage, WKURLRequestRef, WKDictionaryRef, WKEventModifiers, WKEventMouseButton, const void* clientInfo)
</span><span class="cx"> {
</span><span class="cx">     PlatformWebView* parentView = static_cast&lt;PlatformWebView*&gt;(const_cast&lt;void*&gt;(clientInfo));
</span><span class="lines">@@ -979,9 +974,6 @@
</span><span class="cx">         case LongTimeout:
</span><span class="cx">             timeout = m_longTimeout;
</span><span class="cx">             break;
</span><del>-        case CustomTimeout:
-            timeout = m_timeout;
-            break;
</del><span class="cx">         case NoTimeout:
</span><span class="cx">         default:
</span><span class="cx">             timeout = m_noTimeout;
</span></span></pre></div>
<a id="trunkToolsWebKitTestRunnerTestControllerh"></a>
<div class="modfile"><h4>Modified: trunk/Tools/WebKitTestRunner/TestController.h (177362 => 177363)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebKitTestRunner/TestController.h        2014-12-16 17:45:13 UTC (rev 177362)
+++ trunk/Tools/WebKitTestRunner/TestController.h        2014-12-16 18:32:21 UTC (rev 177363)
</span><span class="lines">@@ -68,14 +68,12 @@
</span><span class="cx">     bool shouldUseRemoteLayerTree() const { return m_shouldUseRemoteLayerTree; }
</span><span class="cx">     
</span><span class="cx">     // Runs the run loop until `done` is true or the timeout elapses.
</span><del>-    enum TimeoutDuration { ShortTimeout, LongTimeout, NoTimeout, CustomTimeout };
</del><ins>+    enum TimeoutDuration { ShortTimeout, LongTimeout, NoTimeout };
</ins><span class="cx">     bool useWaitToDumpWatchdogTimer() { return m_useWaitToDumpWatchdogTimer; }
</span><span class="cx">     void runUntil(bool&amp; done, TimeoutDuration);
</span><span class="cx">     void notifyDone();
</span><span class="cx">     
</span><span class="cx">     void configureViewForTest(const TestInvocation&amp;);
</span><del>-
-    int getCustomTimeout();
</del><span class="cx">     
</span><span class="cx">     bool beforeUnloadReturnValue() const { return m_beforeUnloadReturnValue; }
</span><span class="cx">     void setBeforeUnloadReturnValue(bool value) { m_beforeUnloadReturnValue = value; }
</span><span class="lines">@@ -231,8 +229,6 @@
</span><span class="cx">     bool m_useWaitToDumpWatchdogTimer;
</span><span class="cx">     bool m_forceNoTimeout;
</span><span class="cx"> 
</span><del>-    int m_timeout;
-
</del><span class="cx">     bool m_didPrintWebProcessCrashedMessage;
</span><span class="cx">     bool m_shouldExitWhenWebProcessCrashes;
</span><span class="cx">     
</span></span></pre></div>
<a id="trunkToolsWebKitTestRunnerTestInvocationcpp"></a>
<div class="modfile"><h4>Modified: trunk/Tools/WebKitTestRunner/TestInvocation.cpp (177362 => 177363)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebKitTestRunner/TestInvocation.cpp        2014-12-16 17:45:13 UTC (rev 177362)
+++ trunk/Tools/WebKitTestRunner/TestInvocation.cpp        2014-12-16 18:32:21 UTC (rev 177363)
</span><span class="lines">@@ -117,11 +117,6 @@
</span><span class="cx">     m_expectedPixelHash = expectedPixelHash;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void TestInvocation::setCustomTimeout(int timeout)
-{
-    m_timeout = timeout;
-}
-
</del><span class="cx"> static bool shouldLogFrameLoadDelegates(const char* pathOrURL)
</span><span class="cx"> {
</span><span class="cx">     return strstr(pathOrURL, &quot;loading/&quot;);
</span><span class="lines">@@ -165,8 +160,6 @@
</span><span class="cx"> 
</span><span class="cx">     WKContextPostMessageToInjectedBundle(TestController::shared().context(), messageName.get(), beginTestMessageBody.get());
</span><span class="cx"> 
</span><del>-    TestController::TimeoutDuration timeoutToUse = TestController::LongTimeout;
-
</del><span class="cx">     TestController::shared().runUntil(m_gotInitialResponse, TestController::ShortTimeout);
</span><span class="cx">     if (!m_gotInitialResponse) {
</span><span class="cx">         m_errorMessage = &quot;Timed out waiting for initial response from web process\n&quot;;
</span><span class="lines">@@ -178,12 +171,7 @@
</span><span class="cx"> 
</span><span class="cx">     WKPageLoadURL(TestController::shared().mainWebView()-&gt;page(), m_url.get());
</span><span class="cx"> 
</span><del>-    if (TestController::shared().useWaitToDumpWatchdogTimer()) {
-        if (m_timeout &gt; 0)
-            timeoutToUse = TestController::CustomTimeout;
-    } else
-        timeoutToUse = TestController::NoTimeout;
-    TestController::shared().runUntil(m_gotFinalMessage, timeoutToUse);
</del><ins>+    TestController::shared().runUntil(m_gotFinalMessage, TestController::NoTimeout);
</ins><span class="cx"> 
</span><span class="cx">     if (!m_gotFinalMessage) {
</span><span class="cx">         m_errorMessage = &quot;Timed out waiting for final message from web process\n&quot;;
</span></span></pre></div>
<a id="trunkToolsWebKitTestRunnerTestInvocationh"></a>
<div class="modfile"><h4>Modified: trunk/Tools/WebKitTestRunner/TestInvocation.h (177362 => 177363)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebKitTestRunner/TestInvocation.h        2014-12-16 17:45:13 UTC (rev 177362)
+++ trunk/Tools/WebKitTestRunner/TestInvocation.h        2014-12-16 18:32:21 UTC (rev 177363)
</span><span class="lines">@@ -44,7 +44,8 @@
</span><span class="cx"> 
</span><span class="cx">     void setIsPixelTest(const std::string&amp; expectedPixelHash);
</span><span class="cx"> 
</span><del>-    void setCustomTimeout(int duration);
</del><ins>+    void setCustomTimeout(int duration) { m_timeout = duration; }
+    int customTimeout() const { return m_timeout; }
</ins><span class="cx"> 
</span><span class="cx">     void invoke();
</span><span class="cx">     void didReceiveMessageFromInjectedBundle(WKStringRef messageName, WKTypeRef messageBody);
</span></span></pre>
</div>
</div>

</body>
</html>