Web Automation: evaluateJavaScriptFunction should start the callback timeout after...
authorcarlosgc@webkit.org <carlosgc@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 13 Jul 2017 06:34:20 +0000 (06:34 +0000)
committercarlosgc@webkit.org <carlosgc@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 13 Jul 2017 06:34:20 +0000 (06:34 +0000)
https://bugs.webkit.org/show_bug.cgi?id=174421

Reviewed by Brian Burg.

This is causing selenium test testShouldNotTimeoutIfScriptCallsbackInsideAZeroTimeout to fail, because
JavaScriptTimeout error is generated unexpectedly. When no script timeout is specified, 0 is used by default,
which means we do a setTimeout with 0 and then the script does another setTimeout with 0, but ours is dispatched
before and reportTimeoutError is called. We should start our timeout after applying the function, and only if
the result hasn't been reported yet.

* WebProcess/Automation/WebAutomationSessionProxy.js:
(let.AutomationSessionProxy.prototype.evaluateJavaScriptFunction):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@219442 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebKit2/ChangeLog
Source/WebKit2/WebProcess/Automation/WebAutomationSessionProxy.js

index a83f367..aec37d3 100644 (file)
@@ -1,3 +1,19 @@
+2017-07-12  Carlos Garcia Campos  <cgarcia@igalia.com>
+
+        Web Automation: evaluateJavaScriptFunction should start the callback timeout after the function is applied
+        https://bugs.webkit.org/show_bug.cgi?id=174421
+
+        Reviewed by Brian Burg.
+
+        This is causing selenium test testShouldNotTimeoutIfScriptCallsbackInsideAZeroTimeout to fail, because
+        JavaScriptTimeout error is generated unexpectedly. When no script timeout is specified, 0 is used by default,
+        which means we do a setTimeout with 0 and then the script does another setTimeout with 0, but ours is dispatched
+        before and reportTimeoutError is called. We should start our timeout after applying the function, and only if
+        the result hasn't been reported yet.
+
+        * WebProcess/Automation/WebAutomationSessionProxy.js:
+        (let.AutomationSessionProxy.prototype.evaluateJavaScriptFunction):
+
 2017-07-12  Wenson Hsieh  <wenson_hsieh@apple.com>
 
         [iOS DnD] [WK2] Add SPI to enable, disable, or follow default behavior for DnD on a WKWebView
index b1ea972..80c6bbd 100644 (file)
@@ -49,15 +49,21 @@ let AutomationSessionProxy = class AutomationSessionProxy
         let argumentValues = argumentStrings.map(this._jsonParse, this);
 
         let timeoutIdentifier = 0;
-
-        let reportResult = (result) => { clearTimeout(timeoutIdentifier); resultCallback(frameID, callbackID, this._jsonStringify(result), false); };
+        let resultReported = false;
+
+        let reportResult = (result) => {
+            if (timeoutIdentifier)
+                clearTimeout(timeoutIdentifier);
+            resultCallback(frameID, callbackID, this._jsonStringify(result), false);
+            resultReported = true;
+        };
         let reportTimeoutError = () => { resultCallback(frameID, callbackID, "JavaScriptTimeout", true); };
 
         if (expectsImplicitCallbackArgument) {
-            timeoutIdentifier = setTimeout(reportTimeoutError, callbackTimeout);
-
             argumentValues.push(reportResult);
             functionValue.apply(null, argumentValues);
+            if (!resultReported)
+                timeoutIdentifier = setTimeout(reportTimeoutError, callbackTimeout);
         } else
             reportResult(functionValue.apply(null, argumentValues));
     }