Bug 1103196 - Error on encountering invalid certificate; r?automatedtester draft
authorAndreas Tolfsen <ato@mozilla.com>
Sun, 06 Nov 2016 18:01:23 +0000
changeset 440474 53a3e5ad39db5f29c439782053cd79ae12018f99
parent 440473 b5033e403b523e48d0ab5a1fbbc57258567aa89d
child 440475 e03366de5772fbcc02e88eb530cfcd4794baf9f5
child 440476 f56cc2b87212857ce0042660ce1696936bf7a30d
push id36225
push userbmo:ato@mozilla.com
push dateThu, 17 Nov 2016 15:30:50 +0000
reviewersautomatedtester
bugs1103196
milestone53.0a1
Bug 1103196 - Error on encountering invalid certificate; r?automatedtester When arriving at a document which baseURI starts with `about:certerror` will cause Marionette to now return `error.InsecureCertificateError`. This is mandated by the WebDriver specification. This does, however, mark a non-backwards compatible change in Marionette. It is assumed we will be able to mitigate this change in error type as few consumers, if any, rely on the more generic type considering we did not support invalid TLS certificates prior to this push. MozReview-Commit-ID: JcIMvCXimB
testing/marionette/driver.js
testing/marionette/listener.js
--- a/testing/marionette/driver.js
+++ b/testing/marionette/driver.js
@@ -1414,27 +1414,32 @@ GeckoDriver.prototype.switchToParentFram
  *     A web element reference to the element to switch to.
  * @param {(string|number)} id
  *     If element is not defined, then this holds either the id, name,
  *     or index of the frame to switch to.
  */
 GeckoDriver.prototype.switchToFrame = function*(cmd, resp) {
   let {id, element, focus} = cmd.parameters;
 
-  let checkTimer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
+  const otherErrorsExpr = /about:.+(error)|(blocked)\?/;
+  const checkTimer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
+
   let curWindow = this.getCurrentWindow();
 
   let checkLoad = function() {
-    let errorRegex = /about:.+(error)|(blocked)\?/;
-    let curWindow = this.getCurrentWindow();
-    if (curWindow.document.readyState == "complete") {
+    let win = this.getCurrentWindow();
+    if (win.document.readyState == "complete") {
       return;
-    } else if (curWindow.document.readyState == "interactive" &&
-        errorRegex.exec(curWindow.document.baseURI)) {
-      throw new UnknownError("Error loading page");
+    } else if (win.document.readyState == "interactive") {
+      let baseURI = win.document.baseURI;
+      if (baseURI.startsWith("about:certerror")) {
+        throw new InsecureCertificateError();
+      } else if (otherErrorsExpr.exec(win.document.baseURI)) {
+        throw new UnknownError("Error loading page");
+      }
     }
 
     checkTimer.initWithCallback(checkLoad.bind(this), 100, Ci.nsITimer.TYPE_ONE_SHOT);
   };
 
   if (this.context == Context.CHROME) {
     let foundFrame = null;
 
--- a/testing/marionette/listener.js
+++ b/testing/marionette/listener.js
@@ -870,20 +870,25 @@ function pollForReadyState(msg, start = 
     let doc = curContainer.frame.document;
     let now = new Date().getTime();
     if (pageTimeout == null || (now - start) <= pageTimeout) {
       // document fully loaded
       if (doc.readyState == "complete") {
         callback();
         sendOk(command_id);
 
+      // document with an insecure cert
+      } else if (doc.readyState == "interactive" &&
+          doc.baseURI.startsWith("about:certerror")) {
+        callback();
+        sendError(new InsecureCertificateError(), command_id);
+
       // we have reached an error url without requesting it
       } else if (doc.readyState == "interactive" &&
-          /about:.+(error)\?/.exec(doc.baseURI) &&
-          !doc.baseURI.startsWith(url)) {
+          /about:.+(error)\?/.exec(doc.baseURI)) {
         callback();
         sendError(new UnknownError("Reached error page: " + doc.baseURI), command_id);
 
       // return early for about: urls
       } else if (doc.readyState == "interactive" && doc.baseURI.startsWith("about:")) {
         callback();
         sendOk(command_id);