Bug 1302707 - Make GeckoDriver#timeouts spec compatible; r?automatedtester draft
authorAndreas Tolfsen <ato@mozilla.com>
Wed, 14 Sep 2016 18:10:22 +0100
changeset 418520 1cf0d038dd7a458bfd226f97d395b932ba2df4ba
parent 418519 7b02ff2404250b73f4f3bc2225feaa0068b9cce2
child 418521 e2f9db49666d9f54e11f1ee527588525b319e5df
push id30699
push userbmo:ato@mozilla.com
push dateWed, 28 Sep 2016 16:44:24 +0000
reviewersautomatedtester
bugs1302707
milestone52.0a1
Bug 1302707 - Make GeckoDriver#timeouts spec compatible; r?automatedtester MozReview-Commit-ID: 7vLVbKKuZNV
testing/marionette/driver.js
--- a/testing/marionette/driver.js
+++ b/testing/marionette/driver.js
@@ -1530,40 +1530,58 @@ GeckoDriver.prototype.switchToFrame = fu
       yield browserListening;
     }
   }
 };
 
 /**
  * Set timeout for page loading, searching, and scripts.
  *
- * @param {string} type
- *     Type of timeout.
- * @param {number} ms
- *     Timeout in milliseconds.
+ * @param {Object.<string, number>}
+ *     Dictionary of timeout types and their new value, where all timeout
+ *     types are optional.
+ *
+ * @throws {InvalidArgumentError}
+ *     If timeout type key is unknown, or the value provided with it is
+ *     not an integer.
  */
 GeckoDriver.prototype.timeouts = function(cmd, resp) {
-  let typ = cmd.parameters.type;
-  let ms = parseInt(cmd.parameters.ms);
-  if (isNaN(ms)) {
-    throw new WebDriverError("Not a Number");
+  // backwards compatibility with old API
+  // that accepted a dictionary {type: <string>, ms: <number>}
+  let timeouts = {};
+  if (typeof cmd.parameters == "object" &&
+      "type" in cmd.parameters &&
+      "ms" in cmd.parameters) {
+    logger.warn("Using deprecated data structure for setting timeouts");
+    timeouts = {[cmd.parameters.type]: parseInt(cmd.parameters.ms)};
+  } else {
+    timeouts = cmd.parameters;
   }
 
-  switch (typ) {
-    case "implicit":
-      this.setSearchTimeout(cmd, resp);
-      break;
+  for (let [typ, ms] of Object.entries(timeouts)) {
+    if (!Number.isInteger(ms)) {
+      throw new InvalidArgumentError();
+    }
+
+    switch (typ) {
+      case "implicit":
+        this.searchTimeout = ms;
+        break;
 
-    case "script":
-      this.setScriptTimeout(cmd, resp);
-      break;
+      case "script":
+        this.scriptTimeout = ms;
+        break;
 
-    default:
-      this.pageTimeout = ms;
-      break;
+      case "page load":
+        this.pageTimeout = ms;
+        break;
+
+      default:
+        throw new InvalidArgumentError();
+    }
   }
 };
 
 /** Single tap. */
 GeckoDriver.prototype.singleTap = function*(cmd, resp) {
   let {id, x, y} = cmd.parameters;
 
   switch (this.context) {