Browse Source

More devtools backports

Ian Neal 9 months ago
parent
commit
c11c57014d
100 changed files with 32031 additions and 33 deletions
  1. 537 0
      mozilla-release/patches/1233890-60a1.patch
  2. 292 0
      mozilla-release/patches/1303171-59a1.patch
  3. 257 0
      mozilla-release/patches/1307899-60a1.patch
  4. 110 0
      mozilla-release/patches/1307925-60a1.patch
  5. 1974 0
      mozilla-release/patches/1307928-1-60a1.patch
  6. 536 0
      mozilla-release/patches/1307928-2-60a1.patch
  7. 230 0
      mozilla-release/patches/1307928-3-60a1.patch
  8. 239 0
      mozilla-release/patches/1307928-4-60a1.patch
  9. 31 0
      mozilla-release/patches/1335316-60a1.patch
  10. 6 6
      mozilla-release/patches/1382606-60a1.patch
  11. 893 0
      mozilla-release/patches/1382609-60a1.patch
  12. 161 0
      mozilla-release/patches/1384463-58a1.patch
  13. 184 0
      mozilla-release/patches/1386523-60a1.patch
  14. 34 0
      mozilla-release/patches/1387511-1-59a1.patch
  15. 2083 0
      mozilla-release/patches/1387511-2-59a1.patch
  16. 8688 0
      mozilla-release/patches/1393900-57a1.patch
  17. 51 0
      mozilla-release/patches/1395990-1no2-57a1.patch
  18. 62 0
      mozilla-release/patches/1395990-3-57a1.patch
  19. 179 0
      mozilla-release/patches/1396666-59a1.patch
  20. 31 0
      mozilla-release/patches/1398904-59a1.patch
  21. 254 0
      mozilla-release/patches/1401548-59a1.patch
  22. 198 0
      mozilla-release/patches/1401944-59a1.patch
  23. 3 3
      mozilla-release/patches/1401953-59a1.patch
  24. 137 0
      mozilla-release/patches/1401958-58a1.patch
  25. 258 0
      mozilla-release/patches/1403196-60a1.patch
  26. 149 0
      mozilla-release/patches/1403200-60a1.patch
  27. 218 0
      mozilla-release/patches/1403205-60a1.patch
  28. 101 0
      mozilla-release/patches/1403449-58a1.patch
  29. 16 16
      mozilla-release/patches/1403450-60a1.patch
  30. 131 0
      mozilla-release/patches/1403454-60a1.patch
  31. 8 8
      mozilla-release/patches/1403458-58a1.patch
  32. 91 0
      mozilla-release/patches/1403907-59a1.patch
  33. 175 0
      mozilla-release/patches/1404359-60a1.patch
  34. 268 0
      mozilla-release/patches/1404364-60a1.patch
  35. 84 0
      mozilla-release/patches/1404368-59a1.patch
  36. 113 0
      mozilla-release/patches/1404371-59a1.patch
  37. 185 0
      mozilla-release/patches/1404378-59a1.patch
  38. 562 0
      mozilla-release/patches/1404384-59a1.patch
  39. 176 0
      mozilla-release/patches/1404392-59a1.patch
  40. 139 0
      mozilla-release/patches/1404400-59a1.patch
  41. 159 0
      mozilla-release/patches/1404832-1-60a1.patch
  42. 60 0
      mozilla-release/patches/1404832-2-60a1.patch
  43. 87 0
      mozilla-release/patches/1404844-60a1.patch
  44. 248 0
      mozilla-release/patches/1404849-59a1.patch
  45. 192 0
      mozilla-release/patches/1404851-59a1.patch
  46. 246 0
      mozilla-release/patches/1404853-59a1.patch
  47. 179 0
      mozilla-release/patches/1404877-60a1.patch
  48. 335 0
      mozilla-release/patches/1404883-60a1.patch
  49. 116 0
      mozilla-release/patches/1404884-60a1.patch
  50. 142 0
      mozilla-release/patches/1404886-60a1.patch
  51. 231 0
      mozilla-release/patches/1404888-60a1.patch
  52. 41 0
      mozilla-release/patches/1405245-1-60a1.patch
  53. 199 0
      mozilla-release/patches/1405245-2-60a1.patch
  54. 101 0
      mozilla-release/patches/1405252-59a1.patch
  55. 82 0
      mozilla-release/patches/1405333-59a1.patch
  56. 115 0
      mozilla-release/patches/1405350-59a1.patch
  57. 2476 0
      mozilla-release/patches/1405352-60a1.patch
  58. 283 0
      mozilla-release/patches/1405636-59a1.patch
  59. 143 0
      mozilla-release/patches/1405637-59a1.patch
  60. 133 0
      mozilla-release/patches/1405641-60a1.patch
  61. 224 0
      mozilla-release/patches/1405647-60a1.patch
  62. 126 0
      mozilla-release/patches/1405648-60a1.patch
  63. 218 0
      mozilla-release/patches/1405649-60a1.patch
  64. 111 0
      mozilla-release/patches/1405650-60a1.patch
  65. 88 0
      mozilla-release/patches/1405652-58a1.patch
  66. 69 0
      mozilla-release/patches/1406022-60a1.patch
  67. 286 0
      mozilla-release/patches/1406028-60a1.patch
  68. 142 0
      mozilla-release/patches/1406039-59a1.patch
  69. 72 0
      mozilla-release/patches/1406061-58a1.patch
  70. 158 0
      mozilla-release/patches/1406069-58a1.patch
  71. 160 0
      mozilla-release/patches/1406841-59a1.patch
  72. 166 0
      mozilla-release/patches/1407178-59a1.patch
  73. 137 0
      mozilla-release/patches/1408893-59a1.patch
  74. 122 0
      mozilla-release/patches/1408916-58a1.patch
  75. 155 0
      mozilla-release/patches/1408917-58a1.patch
  76. 118 0
      mozilla-release/patches/1408918-58a1.patch
  77. 284 0
      mozilla-release/patches/1408919-58a1.patch
  78. 576 0
      mozilla-release/patches/1408920-58a1.patch
  79. 209 0
      mozilla-release/patches/1408924-58a1.patch
  80. 105 0
      mozilla-release/patches/1408926-59a1.patch
  81. 93 0
      mozilla-release/patches/1408927-59a1.patch
  82. 85 0
      mozilla-release/patches/1408928-58a1.patch
  83. 229 0
      mozilla-release/patches/1408929-59a1.patch
  84. 125 0
      mozilla-release/patches/1408930-59a1.patch
  85. 133 0
      mozilla-release/patches/1408931-59a1.patch
  86. 181 0
      mozilla-release/patches/1408932-59a1.patch
  87. 353 0
      mozilla-release/patches/1408933-59a1.patch
  88. 225 0
      mozilla-release/patches/1408934-59a1.patch
  89. 101 0
      mozilla-release/patches/1408935-59a1.patch
  90. 243 0
      mozilla-release/patches/1408936-59a1.patch
  91. 144 0
      mozilla-release/patches/1408937-59a1.patch
  92. 136 0
      mozilla-release/patches/1408938-59a1.patch
  93. 129 0
      mozilla-release/patches/1408939-59a1.patch
  94. 125 0
      mozilla-release/patches/1408940-59a1.patch
  95. 124 0
      mozilla-release/patches/1408941-59a1.patch
  96. 188 0
      mozilla-release/patches/1408942-59a1.patch
  97. 113 0
      mozilla-release/patches/1408943-59a1.patch
  98. 108 0
      mozilla-release/patches/1408944-59a1.patch
  99. 166 0
      mozilla-release/patches/1408945-59a1.patch
  100. 92 0
      mozilla-release/patches/1408946-59a1.patch

+ 537 - 0
mozilla-release/patches/1233890-60a1.patch

@@ -0,0 +1,537 @@
+# HG changeset patch
+# User Alexandre Poirot <poirot.alex@gmail.com>
+# Date 1518528352 28800
+# Node ID 921a91c6538bf374b9a6eaca557b4f24e8fa552b
+# Parent  211f0604347015cd1ace84fd7e9bd9917cc72fb7
+Bug 1233890 - Remove unnecessary usages of deprecated sync promises in devtools/server. r=jryans
+
+MozReview-Commit-ID: 2K7gxMz9w3y
+
+diff --git a/devtools/server/main.js b/devtools/server/main.js
+--- a/devtools/server/main.js
++++ b/devtools/server/main.js
+@@ -557,17 +557,17 @@ var DebuggerServer = {
+ 
+     let promises = [];
+ 
+     // Pass to all connections
+     for (let connID of Object.getOwnPropertyNames(this._connections)) {
+       promises.push(this._connections[connID].setAddonOptions(id, options));
+     }
+ 
+-    return SyncPromise.all(promises);
++    return Promise.all(promises);
+   },
+ 
+   get listeningSockets() {
+     return this._listeners.length;
+   },
+ 
+   /**
+    * Creates a socket listener for remote debugger connections.
+@@ -681,91 +681,89 @@ var DebuggerServer = {
+     let transport = isWorker ?
+                     new WorkerDebuggerTransport(scopeOrManager, prefix) :
+                     new ChildDebuggerTransport(scopeOrManager, prefix);
+ 
+     return this._onConnection(transport, prefix, true);
+   },
+ 
+   connectToContent(connection, mm, onDestroy) {
+-    let deferred = SyncPromise.defer();
+-
+-    let prefix = connection.allocID("content-process");
+-    let actor, childTransport;
++    return new Promise(resolve => {
++      let prefix = connection.allocID("content-process");
++      let actor, childTransport;
+ 
+-    mm.addMessageListener("debug:content-process-actor", function listener(msg) {
+-      // Arbitrarily choose the first content process to reply
+-      // XXX: This code needs to be updated if we use more than one content process
+-      mm.removeMessageListener("debug:content-process-actor", listener);
++      mm.addMessageListener("debug:content-process-actor", function listener(msg) {
++        // Arbitrarily choose the first content process to reply
++        // XXX: This code needs to be updated if we use more than one content process
++        mm.removeMessageListener("debug:content-process-actor", listener);
+ 
+-      // Pipe Debugger message from/to parent/child via the message manager
+-      childTransport = new ChildDebuggerTransport(mm, prefix);
+-      childTransport.hooks = {
+-        onPacket: connection.send.bind(connection),
+-        onClosed() {}
+-      };
+-      childTransport.ready();
++        // Pipe Debugger message from/to parent/child via the message manager
++        childTransport = new ChildDebuggerTransport(mm, prefix);
++        childTransport.hooks = {
++          onPacket: connection.send.bind(connection),
++          onClosed() {}
++        };
++        childTransport.ready();
+ 
+-      connection.setForwarding(prefix, childTransport);
++        connection.setForwarding(prefix, childTransport);
+ 
+-      dumpn("establishing forwarding for process with prefix " + prefix);
++        dumpn("establishing forwarding for process with prefix " + prefix);
+ 
+-      actor = msg.json.actor;
++        actor = msg.json.actor;
+ 
+-      deferred.resolve(actor);
+-    });
++        resolve(actor);
++      });
+ 
+-    // Load the content process debugger server script only once.
+-    if (!this._contentProcessScriptLoaded) {
+-      // Load the process script that will receive the debug:init-content-server message
+-      Services.ppmm.loadProcessScript(CONTENT_PROCESS_DBG_SERVER_SCRIPT, true);
+-      this._contentProcessScriptLoaded = true;
+-    }
++      // Load the content process debugger server script only once.
++      if (!this._contentProcessScriptLoaded) {
++        // Load the process script that will receive the debug:init-content-server message
++        Services.ppmm.loadProcessScript(CONTENT_PROCESS_DBG_SERVER_SCRIPT, true);
++        this._contentProcessScriptLoaded = true;
++      }
+ 
+-    // Send a message to the content process debugger server script to forward it the
+-    // prefix.
+-    mm.sendAsyncMessage("debug:init-content-server", {
+-      prefix: prefix
+-    });
++      // Send a message to the content process debugger server script to forward it the
++      // prefix.
++      mm.sendAsyncMessage("debug:init-content-server", {
++        prefix: prefix
++      });
+ 
+-    function onClose() {
+-      Services.obs.removeObserver(onMessageManagerClose, "message-manager-close");
+-      EventEmitter.off(connection, "closed", onClose);
+-      if (childTransport) {
+-        // If we have a child transport, the actor has already
+-        // been created. We need to stop using this message manager.
+-        childTransport.close();
+-        childTransport = null;
+-        connection.cancelForwarding(prefix);
++      function onClose() {
++        Services.obs.removeObserver(onMessageManagerClose, "message-manager-close");
++        EventEmitter.off(connection, "closed", onClose);
++        if (childTransport) {
++          // If we have a child transport, the actor has already
++          // been created. We need to stop using this message manager.
++          childTransport.close();
++          childTransport = null;
++          connection.cancelForwarding(prefix);
+ 
+-        // ... and notify the child process to clean the tab actors.
+-        try {
+-          mm.sendAsyncMessage("debug:content-process-destroy");
+-        } catch (e) {
+-          // Nothing to do
++          // ... and notify the child process to clean the tab actors.
++          try {
++            mm.sendAsyncMessage("debug:content-process-destroy");
++          } catch (e) {
++            // Nothing to do
++          }
++        }
++
++        if (onDestroy) {
++          onDestroy(mm);
+         }
+       }
+ 
+-      if (onDestroy) {
+-        onDestroy(mm);
+-      }
+-    }
++      let onMessageManagerClose = DevToolsUtils.makeInfallible((subject, topic, data) => {
++        if (subject == mm) {
++          onClose();
++          connection.send({ from: actor.actor, type: "tabDetached" });
++        }
++      });
++      Services.obs.addObserver(onMessageManagerClose,
++                               "message-manager-close");
+ 
+-    let onMessageManagerClose = DevToolsUtils.makeInfallible((subject, topic, data) => {
+-      if (subject == mm) {
+-        onClose();
+-        connection.send({ from: actor.actor, type: "tabDetached" });
+-      }
++      EventEmitter.on(connection, "closed", onClose);
+     });
+-    Services.obs.addObserver(onMessageManagerClose,
+-                             "message-manager-close");
+-
+-    EventEmitter.on(connection, "closed", onClose);
+-
+-    return deferred.promise;
+   },
+ 
+   connectToWorker(connection, dbg, id, options) {
+     return new Promise((resolve, reject) => {
+       // Step 1: Ensure the worker debugger is initialized.
+       if (!dbg.isInitialized) {
+         dbg.initialize("resource://devtools/server/worker.js");
+ 
+@@ -971,198 +969,196 @@ var DebuggerServer = {
+    *        Optional function to invoke when the child process closes
+    *        or the connection shuts down. (Need to forget about the
+    *        related TabActor)
+    * @return object
+    *         A promise object that is resolved once the connection is
+    *         established.
+    */
+   connectToChild(connection, frame, onDestroy, {addonId} = {}) {
+-    let deferred = SyncPromise.defer();
+-
+-    // Get messageManager from XUL browser (which might be a specialized tunnel for RDM)
+-    // or else fallback to asking the frameLoader itself.
+-    let mm = frame.messageManager || frame.frameLoader.messageManager;
+-    mm.loadFrameScript("resource://devtools/server/child.js", false);
++    return new Promise(resolve => {
++      // Get messageManager from XUL browser (which might be a specialized tunnel for RDM)
++      // or else fallback to asking the frameLoader itself.
++      let mm = frame.messageManager || frame.frameLoader.messageManager;
++      mm.loadFrameScript("resource://devtools/server/child.js", false);
+ 
+-    let trackMessageManager = () => {
+-      frame.addEventListener("DevTools:BrowserSwap", onBrowserSwap);
+-      mm.addMessageListener("debug:setup-in-parent", onSetupInParent);
+-      if (!actor) {
+-        mm.addMessageListener("debug:actor", onActorCreated);
+-      }
+-      DebuggerServer._childMessageManagers.add(mm);
+-    };
++      let trackMessageManager = () => {
++        frame.addEventListener("DevTools:BrowserSwap", onBrowserSwap);
++        mm.addMessageListener("debug:setup-in-parent", onSetupInParent);
++        if (!actor) {
++          mm.addMessageListener("debug:actor", onActorCreated);
++        }
++        DebuggerServer._childMessageManagers.add(mm);
++      };
+ 
+-    let untrackMessageManager = () => {
+-      frame.removeEventListener("DevTools:BrowserSwap", onBrowserSwap);
+-      mm.removeMessageListener("debug:setup-in-parent", onSetupInParent);
+-      if (!actor) {
+-        mm.removeMessageListener("debug:actor", onActorCreated);
+-      }
+-      DebuggerServer._childMessageManagers.delete(mm);
+-    };
+-
+-    let actor, childTransport;
+-    let prefix = connection.allocID("child");
+-    // Compute the same prefix that's used by DebuggerServerConnection
+-    let connPrefix = prefix + "/";
++      let untrackMessageManager = () => {
++        frame.removeEventListener("DevTools:BrowserSwap", onBrowserSwap);
++        mm.removeMessageListener("debug:setup-in-parent", onSetupInParent);
++        if (!actor) {
++          mm.removeMessageListener("debug:actor", onActorCreated);
++        }
++        DebuggerServer._childMessageManagers.delete(mm);
++      };
+ 
+-    // provides hook to actor modules that need to exchange messages
+-    // between e10s parent and child processes
+-    let parentModules = [];
+-    let onSetupInParent = function (msg) {
+-      // We may have multiple connectToChild instance running for the same tab
+-      // and need to filter the messages.
+-      if (msg.json.prefix != connPrefix) {
+-        return false;
+-      }
++      let actor, childTransport;
++      let prefix = connection.allocID("child");
++      // Compute the same prefix that's used by DebuggerServerConnection
++      let connPrefix = prefix + "/";
+ 
+-      let { module, setupParent } = msg.json;
+-      let m;
+-
+-      try {
+-        m = require(module);
+-
+-        if (!(setupParent in m)) {
+-          dumpn(`ERROR: module '${module}' does not export '${setupParent}'`);
++      // provides hook to actor modules that need to exchange messages
++      // between e10s parent and child processes
++      let parentModules = [];
++      let onSetupInParent = function (msg) {
++        // We may have multiple connectToChild instance running for the same tab
++        // and need to filter the messages.
++        if (msg.json.prefix != connPrefix) {
+           return false;
+         }
+ 
+-        parentModules.push(m[setupParent]({ mm, prefix: connPrefix }));
++        let { module, setupParent } = msg.json;
++        let m;
++
++        try {
++          m = require(module);
++
++          if (!(setupParent in m)) {
++            dumpn(`ERROR: module '${module}' does not export '${setupParent}'`);
++            return false;
++          }
+ 
+-        return true;
+-      } catch (e) {
+-        let errorMessage =
+-          "Exception during actor module setup running in the parent process: ";
+-        DevToolsUtils.reportException(errorMessage + e);
+-        dumpn(`ERROR: ${errorMessage}\n\t module: '${module}'\n\t ` +
+-              `setupParent: '${setupParent}'\n${DevToolsUtils.safeErrorString(e)}`);
+-        return false;
+-      }
+-    };
++          parentModules.push(m[setupParent]({ mm, prefix: connPrefix }));
++
++          return true;
++        } catch (e) {
++          let errorMessage =
++            "Exception during actor module setup running in the parent process: ";
++          DevToolsUtils.reportException(errorMessage + e);
++          dumpn(`ERROR: ${errorMessage}\n\t module: '${module}'\n\t ` +
++                `setupParent: '${setupParent}'\n${DevToolsUtils.safeErrorString(e)}`);
++          return false;
++        }
++      };
+ 
+-    let onActorCreated = DevToolsUtils.makeInfallible(function (msg) {
+-      if (msg.json.prefix != prefix) {
+-        return;
+-      }
+-      mm.removeMessageListener("debug:actor", onActorCreated);
++      let onActorCreated = DevToolsUtils.makeInfallible(function (msg) {
++        if (msg.json.prefix != prefix) {
++          return;
++        }
++        mm.removeMessageListener("debug:actor", onActorCreated);
++
++        // Pipe Debugger message from/to parent/child via the message manager
++        childTransport = new ChildDebuggerTransport(mm, prefix);
++        childTransport.hooks = {
++          onPacket: connection.send.bind(connection),
++          onClosed() {}
++        };
++        childTransport.ready();
++
++        connection.setForwarding(prefix, childTransport);
+ 
+-      // Pipe Debugger message from/to parent/child via the message manager
+-      childTransport = new ChildDebuggerTransport(mm, prefix);
+-      childTransport.hooks = {
+-        onPacket: connection.send.bind(connection),
+-        onClosed() {}
+-      };
+-      childTransport.ready();
++        dumpn("establishing forwarding for app with prefix " + prefix);
++
++        actor = msg.json.actor;
++        resolve(actor);
++      }).bind(this);
++
++      // Listen for browser frame swap
++      let onBrowserSwap = ({ detail: newFrame }) => {
++        // Remove listeners from old frame and mm
++        untrackMessageManager();
++        // Update frame and mm to point to the new browser frame
++        frame = newFrame;
++        // Get messageManager from XUL browser (which might be a specialized tunnel for
++        // RDM) or else fallback to asking the frameLoader itself.
++        mm = frame.messageManager || frame.frameLoader.messageManager;
++        // Add listeners to new frame and mm
++        trackMessageManager();
+ 
+-      connection.setForwarding(prefix, childTransport);
++        // provides hook to actor modules that need to exchange messages
++        // between e10s parent and child processes
++        parentModules.forEach(mod => {
++          if (mod.onBrowserSwap) {
++            mod.onBrowserSwap(mm);
++          }
++        });
+ 
+-      dumpn("establishing forwarding for app with prefix " + prefix);
++        if (childTransport) {
++          childTransport.swapBrowser(mm);
++        }
++      };
+ 
+-      actor = msg.json.actor;
+-      deferred.resolve(actor);
+-    }).bind(this);
++      let destroy = DevToolsUtils.makeInfallible(function () {
++        EventEmitter.off(connection, "closed", destroy);
++        Services.obs.removeObserver(onMessageManagerClose, "message-manager-close");
++
++        // provides hook to actor modules that need to exchange messages
++        // between e10s parent and child processes
++        parentModules.forEach(mod => {
++          if (mod.onDisconnected) {
++            mod.onDisconnected();
++          }
++        });
++        // TODO: Remove this deprecated path once it's no longer needed by add-ons.
++        DebuggerServer.emit("disconnected-from-child:" + connPrefix,
++                            { mm, prefix: connPrefix });
+ 
+-    // Listen for browser frame swap
+-    let onBrowserSwap = ({ detail: newFrame }) => {
+-      // Remove listeners from old frame and mm
+-      untrackMessageManager();
+-      // Update frame and mm to point to the new browser frame
+-      frame = newFrame;
+-      // Get messageManager from XUL browser (which might be a specialized tunnel for RDM)
+-      // or else fallback to asking the frameLoader itself.
+-      mm = frame.messageManager || frame.frameLoader.messageManager;
+-      // Add listeners to new frame and mm
+-      trackMessageManager();
++        if (childTransport) {
++          // If we have a child transport, the actor has already
++          // been created. We need to stop using this message manager.
++          childTransport.close();
++          childTransport = null;
++          connection.cancelForwarding(prefix);
+ 
+-      // provides hook to actor modules that need to exchange messages
+-      // between e10s parent and child processes
+-      parentModules.forEach(mod => {
+-        if (mod.onBrowserSwap) {
+-          mod.onBrowserSwap(mm);
++          // ... and notify the child process to clean the tab actors.
++          try {
++            // Bug 1169643: Ignore any exception as the child process
++            // may already be destroyed by now.
++            mm.sendAsyncMessage("debug:disconnect", { prefix });
++          } catch (e) {
++            // Nothing to do
++          }
++        } else {
++          // Otherwise, the app has been closed before the actor
++          // had a chance to be created, so we are not able to create
++          // the actor.
++          resolve(null);
+         }
++        if (actor) {
++          // The ContentActor within the child process doesn't necessary
++          // have time to uninitialize itself when the app is closed/killed.
++          // So ensure telling the client that the related actor is detached.
++          connection.send({ from: actor.actor, type: "tabDetached" });
++          actor = null;
++        }
++
++        if (onDestroy) {
++          onDestroy(mm);
++        }
++
++        // Cleanup all listeners
++        untrackMessageManager();
+       });
+ 
+-      if (childTransport) {
+-        childTransport.swapBrowser(mm);
+-      }
+-    };
+-
+-    let destroy = DevToolsUtils.makeInfallible(function () {
+-      EventEmitter.off(connection, "closed", destroy);
+-      Services.obs.removeObserver(onMessageManagerClose, "message-manager-close");
++      // Listen for various messages and frame events
++      trackMessageManager();
+ 
+-      // provides hook to actor modules that need to exchange messages
+-      // between e10s parent and child processes
+-      parentModules.forEach(mod => {
+-        if (mod.onDisconnected) {
+-          mod.onDisconnected();
+-        }
+-      });
+-      // TODO: Remove this deprecated path once it's no longer needed by add-ons.
+-      DebuggerServer.emit("disconnected-from-child:" + connPrefix,
+-                          { mm, prefix: connPrefix });
+-
+-      if (childTransport) {
+-        // If we have a child transport, the actor has already
+-        // been created. We need to stop using this message manager.
+-        childTransport.close();
+-        childTransport = null;
+-        connection.cancelForwarding(prefix);
+-
+-        // ... and notify the child process to clean the tab actors.
+-        try {
+-          // Bug 1169643: Ignore any exception as the child process
+-          // may already be destroyed by now.
+-          mm.sendAsyncMessage("debug:disconnect", { prefix });
+-        } catch (e) {
+-          // Nothing to do
++      // Listen for app process exit
++      let onMessageManagerClose = function (subject, topic, data) {
++        if (subject == mm) {
++          destroy();
+         }
+-      } else {
+-        // Otherwise, the app has been closed before the actor
+-        // had a chance to be created, so we are not able to create
+-        // the actor.
+-        deferred.resolve(null);
+-      }
+-      if (actor) {
+-        // The ContentActor within the child process doesn't necessary
+-        // have time to uninitialize itself when the app is closed/killed.
+-        // So ensure telling the client that the related actor is detached.
+-        connection.send({ from: actor.actor, type: "tabDetached" });
+-        actor = null;
+-      }
++      };
++      Services.obs.addObserver(onMessageManagerClose,
++                               "message-manager-close");
+ 
+-      if (onDestroy) {
+-        onDestroy(mm);
+-      }
++      // Listen for connection close to cleanup things
++      // when user unplug the device or we lose the connection somehow.
++      EventEmitter.on(connection, "closed", destroy);
+ 
+-      // Cleanup all listeners
+-      untrackMessageManager();
++      mm.sendAsyncMessage("debug:connect", { prefix, addonId });
+     });
+-
+-    // Listen for various messages and frame events
+-    trackMessageManager();
+-
+-    // Listen for app process exit
+-    let onMessageManagerClose = function (subject, topic, data) {
+-      if (subject == mm) {
+-        destroy();
+-      }
+-    };
+-    Services.obs.addObserver(onMessageManagerClose,
+-                             "message-manager-close");
+-
+-    // Listen for connection close to cleanup things
+-    // when user unplug the device or we lose the connection somehow.
+-    EventEmitter.on(connection, "closed", destroy);
+-
+-    mm.sendAsyncMessage("debug:connect", { prefix, addonId });
+-
+-    return deferred.promise;
+   },
+ 
+   /**
+    * Create a new debugger connection for the given transport. Called after
+    * connectPipe(), from connectToParent, or from an incoming socket
+    * connection handler.
+    *
+    * If present, |forwardingPrefix| is a forwarding prefix that a parent

+ 292 - 0
mozilla-release/patches/1303171-59a1.patch

@@ -0,0 +1,292 @@
+# HG changeset patch
+# User J. Ryan Stinnett <jryans@gmail.com>
+# Date 1512793101 21600
+# Node ID d5fce5140351c71c5d2cc42fbb42d558a1989dcd
+# Parent  1eada6971162662099baeeff89ba41215541206f
+Bug 1303171 - Adjust highlighters to account for writing mode and text dir. r=gl
+
+The `getCurrentMatrix` function is used by grid and other highlighters to
+account for the element's position, transforms, etc.  Here we extend it with
+extra logic to account for the element's writing mode and text direction.
+
+MozReview-Commit-ID: AZT4cJySLwk
+
+diff --git a/devtools/client/preferences/devtools.js b/devtools/client/preferences/devtools.js
+--- a/devtools/client/preferences/devtools.js
++++ b/devtools/client/preferences/devtools.js
+@@ -74,16 +74,19 @@ pref("devtools.new-animationinspector.en
+ 
+ // Grid highlighter preferences
+ pref("devtools.gridinspector.gridOutlineMaxColumns", 50);
+ pref("devtools.gridinspector.gridOutlineMaxRows", 50);
+ pref("devtools.gridinspector.showGridAreas", false);
+ pref("devtools.gridinspector.showGridLineNumbers", false);
+ pref("devtools.gridinspector.showInfiniteLines", false);
+ 
++// Common highlighter preferences
++pref("devtools.highlighter.writingModeAdjust", false);
++
+ // Whether or not the box model panel is opened in the computed view
+ pref("devtools.computed.boxmodel.opened", true);
+ // Whether or not the box model panel is opened in the layout view
+ pref("devtools.layout.boxmodel.opened", true);
+ // Whether or not the flexbox panel is opened in the layout view
+ pref("devtools.layout.flexbox.opened", true);
+ // Whether or not the grid inspector panel is opened in the layout view
+ pref("devtools.layout.grid.opened", true);
+diff --git a/devtools/server/actors/highlighters/css-grid.js b/devtools/server/actors/highlighters/css-grid.js
+--- a/devtools/server/actors/highlighters/css-grid.js
++++ b/devtools/server/actors/highlighters/css-grid.js
+@@ -1460,18 +1460,18 @@ class CssGridHighlighter extends AutoRef
+     // It also clear the <canvas>'s drawing context.
+     updateCanvasElement(this.canvas, this._canvasPosition, this.win.devicePixelRatio);
+ 
+     // Clear the grid area highlights.
+     this.clearGridAreas();
+     this.clearGridCell();
+ 
+     // Update the current matrix used in our canvas' rendering.
+-    let { currentMatrix, hasNodeTransformations } = getCurrentMatrix(this.currentNode,
+-      this.win);
++    let { currentMatrix, hasNodeTransformations } =
++      getCurrentMatrix(this.currentNode, this.win);
+     this.currentMatrix = currentMatrix;
+     this.hasNodeTransformations = hasNodeTransformations;
+ 
+     // Start drawing the grid fragments.
+     for (let i = 0; i < this.gridData.length; i++) {
+       this.renderFragment(this.gridData[i]);
+     }
+ 
+diff --git a/devtools/server/actors/highlighters/utils/canvas.js b/devtools/server/actors/highlighters/utils/canvas.js
+--- a/devtools/server/actors/highlighters/utils/canvas.js
++++ b/devtools/server/actors/highlighters/utils/canvas.js
+@@ -1,20 +1,25 @@
+ /* This Source Code Form is subject to the terms of the Mozilla Public
+  * License, v. 2.0. If a copy of the MPL was not distributed with this
+  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+ 
+ "use strict";
+ 
++const Services = require("Services");
++const DevToolsUtils = require("devtools/shared/DevToolsUtils");
++
+ const {
+   apply,
+   getNodeTransformationMatrix,
+   identity,
+   isIdentity,
+   multiply,
++  reflectAboutY,
++  rotate,
+   scale,
+   translate,
+ } = require("devtools/shared/layout/dom-matrix-2d");
+ const { getViewportDimensions } = require("devtools/shared/layout/utils");
+ 
+ // A set of utility functions for highlighters that render their content to a <canvas>
+ // element.
+ 
+@@ -33,16 +38,21 @@ const { getViewportDimensions } = requir
+ // the displayport API instead.
+ //
+ // Using a fixed value should also solve bug 1348293.
+ const CANVAS_SIZE = 4096;
+ 
+ // The default color used for the canvas' font, fill and stroke colors.
+ const DEFAULT_COLOR = "#9400FF";
+ 
++// Boolean pref to enable adjustment for writing mode and RTL content.
++DevToolsUtils.defineLazyGetter(this, "WRITING_MODE_ADJUST_ENABLED", () => {
++  return Services.prefs.getBoolPref("devtools.highlighter.writingModeAdjust");
++});
++
+ /**
+  * Draws a rect to the context given and applies a transformation matrix if passed.
+  * The coordinates are the start and end points of the rectangle's diagonal.
+  *
+  * @param  {CanvasRenderingContext2D} ctx
+  *         The 2D canvas context.
+  * @param  {Number} x1
+  *         The x-axis coordinate of the rectangle's diagonal start point.
+@@ -258,16 +268,18 @@ function getBoundsFromPoints(points) {
+  * following transformations, in this order:
+  *   1. The scale given by the display pixel ratio.
+  *   2. The translation to the top left corner of the element.
+  *   3. The scale given by the current zoom.
+  *   4. The translation given by the top and left padding of the element.
+  *   5. Any CSS transformation applied directly to the element (only 2D
+  *      transformation; the 3D transformation are flattened, see `dom-matrix-2d` module
+  *      for further details.)
++ *   6. Rotate, translate, and reflect as needed to match the writing mode and text
++ *      direction of the element.
+  *
+  *  The transformations of the element's ancestors are not currently computed (see
+  *  bug 1355675).
+  *
+  * @param  {Element} element
+  *         The current element.
+  * @param  {Window} window
+  *         The window object.
+@@ -285,32 +297,40 @@ function getCurrentMatrix(element, windo
+   let borderTop = parseFloat(computedStyle.borderTopWidth);
+   let borderLeft = parseFloat(computedStyle.borderLeftWidth);
+ 
+   let nodeMatrix = getNodeTransformationMatrix(element, window.document.documentElement);
+ 
+   let currentMatrix = identity();
+   let hasNodeTransformations = false;
+ 
+-  // First, we scale based on the device pixel ratio.
++  // Scale based on the device pixel ratio.
+   currentMatrix = multiply(currentMatrix, scale(window.devicePixelRatio));
+ 
+-  // Then, we apply the current node's transformation matrix, relative to the
+-  // inspected window's root element, but only if it's not a identity matrix.
++  // Apply the current node's transformation matrix, relative to the inspected window's
++  // root element, but only if it's not a identity matrix.
+   if (isIdentity(nodeMatrix)) {
+     hasNodeTransformations = false;
+   } else {
+     currentMatrix = multiply(currentMatrix, nodeMatrix);
+     hasNodeTransformations = true;
+   }
+ 
+-  // Finally, we translate the origin based on the node's padding and border values.
++  // Translate the origin based on the node's padding and border values.
+   currentMatrix = multiply(currentMatrix,
+     translate(paddingLeft + borderLeft, paddingTop + borderTop));
+ 
++  if (WRITING_MODE_ADJUST_ENABLED) {
++    // Adjust as needed to match the writing mode and text direction of the element.
++    let writingModeMatrix = getWritingModeMatrix(element, computedStyle);
++    if (!isIdentity(writingModeMatrix)) {
++      currentMatrix = multiply(currentMatrix, writingModeMatrix);
++    }
++  }
++
+   return { currentMatrix, hasNodeTransformations };
+ }
+ 
+ /**
+  * Given an array of four points, returns a string represent a path description.
+  *
+  * @param  {Array} points
+  *         An array with 4 pointer objects {x, y} representing the box quads.
+@@ -350,16 +370,82 @@ function getPointsFromDiagonal(x1, y1, x
+   ].map(point => {
+     let transformedPoint = apply(matrix, point);
+ 
+     return { x: transformedPoint[0], y: transformedPoint[1] };
+   });
+ }
+ 
+ /**
++ * Returns the matrix to rotate, translate, and reflect (if needed) from the element's
++ * top-left origin into the actual writing mode and text direction applied to the element.
++ *
++ * @param  {Element} element
++ *         The current element.
++ * @param  {CSSStyleDeclaration} computedStyle
++ *         The computed style for the element.
++ * @return {Array}
++ *         The matrix with adjustments for writing mode and text direction, if any.
++ */
++function getWritingModeMatrix(element, computedStyle) {
++  let currentMatrix = identity();
++  let { direction, writingMode } = computedStyle;
++
++  switch (writingMode) {
++    case "horizontal-tb":
++      // This is the initial value.  No further adjustment needed.
++      break;
++    case "vertical-rl":
++      currentMatrix = multiply(
++        translate(element.offsetWidth, 0),
++        rotate(-Math.PI / 2)
++      );
++      break;
++    case "vertical-lr":
++      currentMatrix = multiply(
++        reflectAboutY(),
++        rotate(-Math.PI / 2)
++      );
++      break;
++    case "sideways-rl":
++      currentMatrix = multiply(
++        translate(element.offsetWidth, 0),
++        rotate(-Math.PI / 2)
++      );
++      break;
++    case "sideways-lr":
++      currentMatrix = multiply(
++        rotate(Math.PI / 2),
++        translate(-element.offsetHeight, 0)
++      );
++      break;
++    default:
++      console.error(`Unexpected writing-mode: ${writingMode}`);
++  }
++
++  switch (direction) {
++    case "ltr":
++      // This is the initial value.  No further adjustment needed.
++      break;
++    case "rtl":
++      let rowLength = element.offsetWidth;
++      if (writingMode != "horizontal-tb") {
++        rowLength = element.offsetHeight;
++      }
++      currentMatrix = multiply(currentMatrix, translate(rowLength, 0));
++      currentMatrix = multiply(currentMatrix, reflectAboutY());
++      break;
++    default:
++      console.error(`Unexpected direction: ${direction}`);
++  }
++
++  return currentMatrix;
++}
++
++/**
+  * Updates the <canvas> element's style in accordance with the current window's
+  * device pixel ratio, and the position calculated in `getCanvasPosition`. It also
+  * clears the drawing context. This is called on canvas update after a scroll event where
+  * `getCanvasPosition` updates the new canvasPosition.
+  *
+  * @param  {Canvas} canvas
+  *         The <canvas> element.
+  * @param  {Object} canvasPosition
+diff --git a/devtools/shared/layout/dom-matrix-2d.js b/devtools/shared/layout/dom-matrix-2d.js
+--- a/devtools/shared/layout/dom-matrix-2d.js
++++ b/devtools/shared/layout/dom-matrix-2d.js
+@@ -40,16 +40,30 @@ exports.scale = scale;
+ const translate = (tx = 0, ty = tx) => [
+   1, 0, tx,
+   0, 1, ty,
+   0, 0, 1
+ ];
+ exports.translate = translate;
+ 
+ /**
++ * Returns a matrix that reflects about the Y axis.  For example, the point (x1, y1) would
++ * become (-x1, y1).
++ *
++ * @return {Array}
++ *         The new matrix.
++ */
++const reflectAboutY = () => [
++  -1, 0, 0,
++  0,  1, 0,
++  0,  0, 1,
++];
++exports.reflectAboutY = reflectAboutY;
++
++/**
+  * Returns a matrix for the rotation given.
+  * Calling `rotate()` or `rotate(0)` returns a new identity matrix.
+  *
+  * @param {Number} [angle = 0]
+  *        The angle, in radians, for which to return a corresponding rotation matrix.
+  *        If unspecified, it will equal `0`.
+  * @return {Array}
+  *         The new matrix.

+ 257 - 0
mozilla-release/patches/1307899-60a1.patch

@@ -0,0 +1,257 @@
+# HG changeset patch
+# User Nicolas Chevobbe <nchevobbe@mozilla.com>
+# Date 1518104630 -3600
+# Node ID bbbd357dcb92b05153d6c9a1304b5f3954fb3415
+# Parent  76dc517a317a7fbdb80cf0ab768e81fcc151335b
+Bug 1307899 - Remove renderComponent and switch consumers to using Enzyme instead; r=bgrins.
+
+MozReview-Commit-ID: D88nlKJOSjk
+
+diff --git a/devtools/client/webconsole/new-console-output/test/components/message-container.test.js b/devtools/client/webconsole/new-console-output/test/components/message-container.test.js
+--- a/devtools/client/webconsole/new-console-output/test/components/message-container.test.js
++++ b/devtools/client/webconsole/new-console-output/test/components/message-container.test.js
+@@ -1,37 +1,37 @@
+ /* Any copyright is dedicated to the Public Domain.
+    http://creativecommons.org/publicdomain/zero/1.0/ */
+ "use strict";
+ 
+ // Test utils.
+ const expect = require("expect");
+-const {
+-  renderComponent,
+-} = require("devtools/client/webconsole/new-console-output/test/helpers");
++const { render } = require("enzyme");
++const { createFactory } = require("devtools/client/shared/vendor/react");
+ 
+ // Components under test.
+-const { MessageContainer, getMessageComponent } = require("devtools/client/webconsole/new-console-output/components/MessageContainer");
++let { MessageContainer, getMessageComponent } = require("devtools/client/webconsole/new-console-output/components/MessageContainer");
++MessageContainer = createFactory(MessageContainer);
+ const ConsoleApiCall = require("devtools/client/webconsole/new-console-output/components/message-types/ConsoleApiCall");
+ const EvaluationResult = require("devtools/client/webconsole/new-console-output/components/message-types/EvaluationResult");
+ const PageError = require("devtools/client/webconsole/new-console-output/components/message-types/PageError");
+ 
+ // Test fakes.
+ const { stubPreparedMessages } = require("devtools/client/webconsole/new-console-output/test/fixtures/stubs/index");
+ const serviceContainer = require("devtools/client/webconsole/new-console-output/test/fixtures/serviceContainer");
+ 
+ describe("MessageContainer component:", () => {
+   it("pipes data to children as expected", () => {
+     const message = stubPreparedMessages.get("console.log('foobar', 'test')");
+-    const rendered = renderComponent(MessageContainer, {
++    const rendered = render(MessageContainer({
+       getMessage: () => message,
+       serviceContainer
+-    });
++    }));
+ 
+-    expect(rendered.textContent.includes("foobar")).toBe(true);
++    expect(rendered.text().includes("foobar")).toBe(true);
+   });
+   it("picks correct child component", () => {
+     const messageTypes = [
+       {
+         component: ConsoleApiCall,
+         message: stubPreparedMessages.get("console.log('foobar', 'test')")
+       },
+       {
+diff --git a/devtools/client/webconsole/new-console-output/test/components/message-icon.test.js b/devtools/client/webconsole/new-console-output/test/components/message-icon.test.js
+--- a/devtools/client/webconsole/new-console-output/test/components/message-icon.test.js
++++ b/devtools/client/webconsole/new-console-output/test/components/message-icon.test.js
+@@ -1,24 +1,21 @@
+ /* Any copyright is dedicated to the Public Domain.
+    http://creativecommons.org/publicdomain/zero/1.0/ */
+ "use strict";
+ 
+ const {
+   MESSAGE_LEVEL,
+ } = require("devtools/client/webconsole/new-console-output/constants");
+-const MessageIcon = require("devtools/client/webconsole/new-console-output/components/MessageIcon");
+ 
+ const expect = require("expect");
+-
+-const {
+-  renderComponent
+-} = require("devtools/client/webconsole/new-console-output/test/helpers");
++const { render } = require("enzyme");
++const { createFactory } = require("devtools/client/shared/vendor/react");
++const MessageIcon = createFactory(require("devtools/client/webconsole/new-console-output/components/MessageIcon"));
+ 
+ describe("MessageIcon component:", () => {
+   it("renders icon based on level", () => {
+-    const rendered = renderComponent(MessageIcon, { level: MESSAGE_LEVEL.ERROR });
+-
+-    expect(rendered.classList.contains("icon")).toBe(true);
+-    expect(rendered.getAttribute("aria-live")).toBe("off");
+-    expect(rendered.getAttribute("title")).toBe("Error");
++    const rendered = render(MessageIcon({ level: MESSAGE_LEVEL.ERROR }));
++    expect(rendered.hasClass("icon")).toBe(true);
++    expect(rendered.attr("title")).toBe("Error");
++    expect(rendered.attr("aria-live")).toBe("off");
+   });
+ });
+diff --git a/devtools/client/webconsole/new-console-output/test/components/message-repeat.test.js b/devtools/client/webconsole/new-console-output/test/components/message-repeat.test.js
+--- a/devtools/client/webconsole/new-console-output/test/components/message-repeat.test.js
++++ b/devtools/client/webconsole/new-console-output/test/components/message-repeat.test.js
+@@ -1,19 +1,16 @@
+ /* Any copyright is dedicated to the Public Domain.
+    http://creativecommons.org/publicdomain/zero/1.0/ */
+ "use strict";
+ 
+-const MessageRepeat = require("devtools/client/webconsole/new-console-output/components/MessageRepeat");
+-
+ const expect = require("expect");
+-
+-const {
+-  renderComponent
+-} = require("devtools/client/webconsole/new-console-output/test/helpers");
++const { render } = require("enzyme");
++const { createFactory } = require("devtools/client/shared/vendor/react");
++const MessageRepeat = createFactory(require("devtools/client/webconsole/new-console-output/components/MessageRepeat"));
+ 
+ describe("MessageRepeat component:", () => {
+   it("renders repeated value correctly", () => {
+-    const rendered = renderComponent(MessageRepeat, { repeat: 99 });
+-    expect(rendered.classList.contains("message-repeats")).toBe(true);
+-    expect(rendered.textContent).toBe("99");
++    const rendered = render(MessageRepeat({ repeat: 99 }));
++    expect(rendered.hasClass("message-repeats")).toBe(true);
++    expect(rendered.text()).toBe("99");
+   });
+ });
+diff --git a/devtools/client/webconsole/new-console-output/test/components/message-types-aria.test.js b/devtools/client/webconsole/new-console-output/test/components/message-types-aria.test.js
+--- a/devtools/client/webconsole/new-console-output/test/components/message-types-aria.test.js
++++ b/devtools/client/webconsole/new-console-output/test/components/message-types-aria.test.js
+@@ -1,50 +1,47 @@
+ /* Any copyright is dedicated to the Public Domain.
+    http://creativecommons.org/publicdomain/zero/1.0/ */
+ "use strict";
+ 
+ // Test utils.
+ const expect = require("expect");
+-
+-const {
+-  renderComponent
+-} = require("devtools/client/webconsole/new-console-output/test/helpers");
++const { render } = require("enzyme");
++const { createFactory } = require("devtools/client/shared/vendor/react");
+ 
+ // Components under test.
+-const ConsoleApiCall = require("devtools/client/webconsole/new-console-output/components/message-types/ConsoleApiCall");
+-const ConsoleCmd = require("devtools/client/webconsole/new-console-output/components/message-types/ConsoleCommand");
+-const EvaluationResult = require("devtools/client/webconsole/new-console-output/components/message-types/EvaluationResult");
++const ConsoleApiCall = createFactory(require("devtools/client/webconsole/new-console-output/components/message-types/ConsoleApiCall"));
++const ConsoleCmd = createFactory(require("devtools/client/webconsole/new-console-output/components/message-types/ConsoleCommand"));
++const EvaluationResult = createFactory(require("devtools/client/webconsole/new-console-output/components/message-types/EvaluationResult"));
+ 
+ const { ConsoleCommand } = require("devtools/client/webconsole/new-console-output/types");
+ 
+ // Test fakes.
+ const { stubPreparedMessages } = require("devtools/client/webconsole/new-console-output/test/fixtures/stubs/index");
+ const serviceContainer = require("devtools/client/webconsole/new-console-output/test/fixtures/serviceContainer");
+ 
+ describe("message types component ARIA:", () => {
+   describe("ConsoleAPICall", () => {
+     it("sets aria-live to polite", () => {
+       const message = stubPreparedMessages.get("console.log('foobar', 'test')");
+-      const wrapper = renderComponent(ConsoleApiCall,
+-        { message, serviceContainer });
+-      expect(wrapper.getAttribute("aria-live")).toBe("polite");
++      const wrapper = render(ConsoleApiCall({ message, serviceContainer }));
++      expect(wrapper.attr("aria-live")).toBe("polite");
+     });
+   });
+ 
+   describe("EvaluationResult", () => {
+     it("sets aria-live to polite", () => {
+       const message = stubPreparedMessages.get("asdf()");
+-      const wrapper = renderComponent(EvaluationResult, { message, serviceContainer });
+-      expect(wrapper.getAttribute("aria-live")).toBe("polite");
++      const wrapper = render(EvaluationResult({message, serviceContainer}));
++      expect(wrapper.attr("aria-live")).toBe("polite");
+     });
+   });
+ 
+   describe("ConsoleCommand", () => {
+     it("sets aria-live to off", () => {
+       let message = new ConsoleCommand({
+         messageText: `"simple"`,
+       });
+-      const wrapper = renderComponent(ConsoleCmd, { message, serviceContainer});
+-      expect(wrapper.getAttribute("aria-live")).toBe("off");
++      const wrapper = render(ConsoleCmd({message, serviceContainer}));
++      expect(wrapper.attr("aria-live")).toBe("off");
+     });
+   });
+ });
+diff --git a/devtools/client/webconsole/new-console-output/test/helpers.js b/devtools/client/webconsole/new-console-output/test/helpers.js
+--- a/devtools/client/webconsole/new-console-output/test/helpers.js
++++ b/devtools/client/webconsole/new-console-output/test/helpers.js
+@@ -1,19 +1,13 @@
+ /* Any copyright is dedicated to the Public Domain.
+    http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+ "use strict";
+ 
+-let ReactDOM = require("devtools/client/shared/vendor/react-dom");
+-let React = require("devtools/client/shared/vendor/react");
+-const dom = require("devtools/client/shared/vendor/react-dom-factories");
+-const { createElement } = React;
+-const TestUtils = require("devtools/client/shared/vendor/react-dom-test-utils");
+-
+ const reduxActions = require("devtools/client/webconsole/new-console-output/actions/index");
+ const { configureStore } = require("devtools/client/webconsole/new-console-output/store");
+ const { IdGenerator } = require("devtools/client/webconsole/new-console-output/utils/id-generator");
+ const { stubPackets } = require("devtools/client/webconsole/new-console-output/test/fixtures/stubs/index");
+ const {
+   getAllMessagesById,
+ } = require("devtools/client/webconsole/new-console-output/selectors/messages");
+ 
+@@ -57,33 +51,16 @@ function setupStore(input = [], {
+   const messagesAdd = actions
+     ? actions.messagesAdd
+     : reduxActions.messagesAdd;
+   store.dispatch(messagesAdd(input.map(cmd => stubPackets.get(cmd))));
+ 
+   return store;
+ }
+ 
+-function renderComponent(component, props) {
+-  const el = createElement(component, props, {});
+-  // By default, renderIntoDocument() won't work for stateless components, but
+-  // it will work if the stateless component is wrapped in a stateful one.
+-  // See https://github.com/facebook/react/issues/4839
+-  const wrappedEl = dom.span({}, [el]);
+-  const renderedComponent = TestUtils.renderIntoDocument(wrappedEl);
+-  return ReactDOM.findDOMNode(renderedComponent).children[0];
+-}
+-
+-function shallowRenderComponent(component, props) {
+-  const el = createElement(component, props);
+-  const renderer = TestUtils.createRenderer();
+-  renderer.render(el, {});
+-  return renderer.getRenderOutput();
+-}
+-
+ /**
+  * Create deep copy of given packet object.
+  */
+ function clonePacket(packet) {
+   return JSON.parse(JSON.stringify(packet));
+ }
+ 
+ /**
+@@ -119,13 +96,11 @@ function getLastMessage(state) {
+   return getMessageAt(state, lastIndex);
+ }
+ 
+ module.exports = {
+   clonePacket,
+   getMessageAt,
+   getFirstMessage,
+   getLastMessage,
+-  renderComponent,
+   setupActions,
+   setupStore,
+-  shallowRenderComponent,
+ };

+ 110 - 0
mozilla-release/patches/1307925-60a1.patch

@@ -0,0 +1,110 @@
+# HG changeset patch
+# User Nicolas Chevobbe <nchevobbe@mozilla.com>
+# Date 1520241324 -3600
+# Node ID 8b4c82584d6b33a563abd453c743fff5f5a5b191
+# Parent  34d7c26c0373b98443bd1207659c0aa8fe55c15a
+Bug 1307925 - Localize and explicitely test Navigation message; r=Honza.
+
+The message is now localized, with the URL as a parameter.
+browser_webconsole_persist was modified to explicitely wait for
+the Navigation message to be logged.
+
+MozReview-Commit-ID: L0hsrkYsl16
+
+diff --git a/devtools/client/locales/en-US/webconsole.properties b/devtools/client/locales/en-US/webconsole.properties
+--- a/devtools/client/locales/en-US/webconsole.properties
++++ b/devtools/client/locales/en-US/webconsole.properties
+@@ -322,8 +322,13 @@ webconsole.filteredMessages.label=#1 ite
+ # Label used as the text of the "Reset filters" button in the "filtered messages" bar.
+ # It resets the default filters of the console to their original values.
+ webconsole.resetFiltersButton.label=Reset filters
+ 
+ # LOCALIZATION NOTE (webconsole.enablePersistentLogs.label)
+ webconsole.enablePersistentLogs.label=Persist Logs
+ # LOCALIZATION NOTE (webconsole.enablePersistentLogs.tooltip)
+ webconsole.enablePersistentLogs.tooltip=If you enable this option the output will not be cleared each time you navigate to a new page
++
++# LOCALIZATION NOTE (webconsole.navigated): this string is used in the console when the
++# current inspected page is navigated to a new location.
++# Parameters: %S is the new URL.
++webconsole.navigated=Navigated to %S
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_persist.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_persist.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_persist.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_persist.js
+@@ -15,20 +15,21 @@ const TEST_URI = "http://example.com/bro
+ registerCleanupFunction(() => {
+   Services.prefs.clearUserPref("devtools.webconsole.persistlog");
+ });
+ 
+ add_task(async function () {
+   info("Testing that messages disappear on a refresh if logs aren't persisted");
+   let hud = await openNewTabAndConsole(TEST_URI);
+ 
+-  await ContentTask.spawn(gBrowser.selectedBrowser, {}, () => {
+-    content.wrappedJSObject.doLogs(5);
++  const INITIAL_LOGS_NUMBER = 5;
++  await ContentTask.spawn(gBrowser.selectedBrowser, INITIAL_LOGS_NUMBER, (count) => {
++    content.wrappedJSObject.doLogs(count);
+   });
+-  await waitFor(() => findMessages(hud, "").length === 5);
++  await waitFor(() => findMessages(hud, "").length === INITIAL_LOGS_NUMBER);
+   ok(true, "Messages showed up initially");
+ 
+   await refreshTab();
+   await waitFor(() => findMessages(hud, "").length === 0);
+   ok(true, "Messages disappeared");
+ 
+   await closeToolbox();
+ });
+@@ -36,19 +37,23 @@ add_task(async function () {
+ add_task(async function () {
+   info("Testing that messages persist on a refresh if logs are persisted");
+ 
+   let hud = await openNewTabAndConsole(TEST_URI);
+ 
+   hud.ui.outputNode.querySelector(".webconsole-filterbar-primary .filter-checkbox")
+     .click();
+ 
+-  await ContentTask.spawn(gBrowser.selectedBrowser, {}, () => {
+-    content.wrappedJSObject.doLogs(5);
++  const INITIAL_LOGS_NUMBER = 5;
++  await ContentTask.spawn(gBrowser.selectedBrowser, INITIAL_LOGS_NUMBER, (count) => {
++    content.wrappedJSObject.doLogs(count);
+   });
+-  await waitFor(() => findMessages(hud, "").length === 5);
++  await waitFor(() => findMessages(hud, "").length === INITIAL_LOGS_NUMBER);
+   ok(true, "Messages showed up initially");
+ 
+-  await refreshTab();
+-  await waitFor(() => findMessages(hud, "").length === 6);
++  const onNavigatedMessage = waitForMessage(hud, "Navigated to");
++  refreshTab();
++  await onNavigatedMessage;
+ 
+-  ok(findMessage(hud, "Navigated"), "Navigated message appeared");
++  ok(true, "Navigation message appeared as expected");
++  is(findMessages(hud, "").length, INITIAL_LOGS_NUMBER + 1,
++    "Messages logged before navigation are still visible");
+ });
+diff --git a/devtools/client/webconsole/new-console-output/utils/messages.js b/devtools/client/webconsole/new-console-output/utils/messages.js
+--- a/devtools/client/webconsole/new-console-output/utils/messages.js
++++ b/devtools/client/webconsole/new-console-output/utils/messages.js
+@@ -171,17 +171,17 @@ function transformConsoleAPICallPacket(p
+ }
+ 
+ function transformNavigationMessagePacket(packet) {
+   let { message } = packet;
+   return new ConsoleMessage({
+     source: MESSAGE_SOURCE.CONSOLE_API,
+     type: MESSAGE_TYPE.LOG,
+     level: MESSAGE_LEVEL.LOG,
+-    messageText: "Navigated to " + message.url,
++    messageText: l10n.getFormatStr("webconsole.navigated", [message.url]),
+     timeStamp: message.timeStamp
+   });
+ }
+ 
+ function transformLogMessagePacket(packet) {
+   let {
+     message,
+     timeStamp,

+ 1974 - 0
mozilla-release/patches/1307928-1-60a1.patch

@@ -0,0 +1,1974 @@
+# HG changeset patch
+# User Nicolas Chevobbe <nchevobbe@mozilla.com>
+# Date 1519816261 -3600
+# Node ID 31fce33230d4c2f6ea5dc749854fb0799f311e55
+# Parent  1533e0a0c89a813d6cf987c06e51a6d1b5ccf675
+Bug 1307928 - Add a "private" property to the ConsoleMessage type; r=bgrins.
+
+Populate this from the different packet types and update stubs.
+
+MozReview-Commit-ID: 4rrZBRdtOa4
+
+diff --git a/devtools/client/webconsole/new-console-output/test/fixtures/stubs/consoleApi.js b/devtools/client/webconsole/new-console-output/test/fixtures/stubs/consoleApi.js
+--- a/devtools/client/webconsole/new-console-output/test/fixtures/stubs/consoleApi.js
++++ b/devtools/client/webconsole/new-console-output/test/fixtures/stubs/consoleApi.js
+@@ -21,222 +21,230 @@ stubPreparedMessages.set(`console.log('f
+   "type": "log",
+   "helperType": null,
+   "level": "log",
+   "messageText": null,
+   "parameters": [
+     "foobar",
+     "test"
+   ],
+-  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":1,\"column\":27},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[\"foobar\",\"test\"],\"source\":\"console-api\",\"type\":\"log\",\"userProvidedStyles\":[]}",
++  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":1,\"column\":27},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[\"foobar\",\"test\"],\"source\":\"console-api\",\"type\":\"log\",\"userProvidedStyles\":[],\"private\":false}",
+   "stacktrace": null,
+   "frame": {
+     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+     "line": 1,
+     "column": 27
+   },
+   "groupId": null,
+   "exceptionDocURL": null,
+   "userProvidedStyles": [],
+   "notes": null,
+   "indent": 0,
+-  "prefix": ""
++  "prefix": "",
++  "private": false
+ }));
+ 
+ stubPreparedMessages.set(`console.log(undefined)`, new ConsoleMessage({
+   "id": "1",
+   "allowRepeating": true,
+   "source": "console-api",
+   "timeStamp": 1502884924479,
+   "type": "log",
+   "helperType": null,
+   "level": "log",
+   "messageText": null,
+   "parameters": [
+     {
+       "type": "undefined"
+     }
+   ],
+-  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":1,\"column\":27},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[{\"type\":\"undefined\"}],\"source\":\"console-api\",\"type\":\"log\",\"userProvidedStyles\":[]}",
++  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":1,\"column\":27},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[{\"type\":\"undefined\"}],\"source\":\"console-api\",\"type\":\"log\",\"userProvidedStyles\":[],\"private\":false}",
+   "stacktrace": null,
+   "frame": {
+     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+     "line": 1,
+     "column": 27
+   },
+   "groupId": null,
+   "exceptionDocURL": null,
+   "userProvidedStyles": [],
+   "notes": null,
+   "indent": 0,
+-  "prefix": ""
++  "prefix": "",
++  "private": false
+ }));
+ 
+ stubPreparedMessages.set(`console.warn('danger, will robinson!')`, new ConsoleMessage({
+   "id": "1",
+   "allowRepeating": true,
+   "source": "console-api",
+   "timeStamp": 1502884924487,
+   "type": "warn",
+   "helperType": null,
+   "level": "warn",
+   "messageText": null,
+   "parameters": [
+     "danger, will robinson!"
+   ],
+-  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":1,\"column\":27},\"groupId\":null,\"indent\":0,\"level\":\"warn\",\"messageText\":null,\"parameters\":[\"danger, will robinson!\"],\"source\":\"console-api\",\"type\":\"warn\",\"userProvidedStyles\":[]}",
++  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":1,\"column\":27},\"groupId\":null,\"indent\":0,\"level\":\"warn\",\"messageText\":null,\"parameters\":[\"danger, will robinson!\"],\"source\":\"console-api\",\"type\":\"warn\",\"userProvidedStyles\":[],\"private\":false}",
+   "stacktrace": null,
+   "frame": {
+     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+     "line": 1,
+     "column": 27
+   },
+   "groupId": null,
+   "exceptionDocURL": null,
+   "userProvidedStyles": [],
+   "notes": null,
+   "indent": 0,
+-  "prefix": ""
++  "prefix": "",
++  "private": false
+ }));
+ 
+ stubPreparedMessages.set(`console.log(NaN)`, new ConsoleMessage({
+   "id": "1",
+   "allowRepeating": true,
+   "source": "console-api",
+   "timeStamp": 1502884924495,
+   "type": "log",
+   "helperType": null,
+   "level": "log",
+   "messageText": null,
+   "parameters": [
+     {
+       "type": "NaN"
+     }
+   ],
+-  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":1,\"column\":27},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[{\"type\":\"NaN\"}],\"source\":\"console-api\",\"type\":\"log\",\"userProvidedStyles\":[]}",
++  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":1,\"column\":27},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[{\"type\":\"NaN\"}],\"source\":\"console-api\",\"type\":\"log\",\"userProvidedStyles\":[],\"private\":false}",
+   "stacktrace": null,
+   "frame": {
+     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+     "line": 1,
+     "column": 27
+   },
+   "groupId": null,
+   "exceptionDocURL": null,
+   "userProvidedStyles": [],
+   "notes": null,
+   "indent": 0,
+-  "prefix": ""
++  "prefix": "",
++  "private": false
+ }));
+ 
+ stubPreparedMessages.set(`console.log(null)`, new ConsoleMessage({
+   "id": "1",
+   "allowRepeating": true,
+   "source": "console-api",
+   "timeStamp": 1502884924501,
+   "type": "log",
+   "helperType": null,
+   "level": "log",
+   "messageText": null,
+   "parameters": [
+     {
+       "type": "null"
+     }
+   ],
+-  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":1,\"column\":27},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[{\"type\":\"null\"}],\"source\":\"console-api\",\"type\":\"log\",\"userProvidedStyles\":[]}",
++  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":1,\"column\":27},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[{\"type\":\"null\"}],\"source\":\"console-api\",\"type\":\"log\",\"userProvidedStyles\":[],\"private\":false}",
+   "stacktrace": null,
+   "frame": {
+     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+     "line": 1,
+     "column": 27
+   },
+   "groupId": null,
+   "exceptionDocURL": null,
+   "userProvidedStyles": [],
+   "notes": null,
+   "indent": 0,
+-  "prefix": ""
++  "prefix": "",
++  "private": false
+ }));
+ 
+ stubPreparedMessages.set(`console.log('鼬')`, new ConsoleMessage({
+   "id": "1",
+   "allowRepeating": true,
+   "source": "console-api",
+   "timeStamp": 1502884924506,
+   "type": "log",
+   "helperType": null,
+   "level": "log",
+   "messageText": null,
+   "parameters": [
+     "鼬"
+   ],
+-  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":1,\"column\":27},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[\"鼬\"],\"source\":\"console-api\",\"type\":\"log\",\"userProvidedStyles\":[]}",
++  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":1,\"column\":27},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[\"鼬\"],\"source\":\"console-api\",\"type\":\"log\",\"userProvidedStyles\":[],\"private\":false}",
+   "stacktrace": null,
+   "frame": {
+     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+     "line": 1,
+     "column": 27
+   },
+   "groupId": null,
+   "exceptionDocURL": null,
+   "userProvidedStyles": [],
+   "notes": null,
+   "indent": 0,
+-  "prefix": ""
++  "prefix": "",
++  "private": false
+ }));
+ 
+ stubPreparedMessages.set(`console.clear()`, new ConsoleMessage({
+   "id": "1",
+   "allowRepeating": true,
+   "source": "console-api",
+   "timeStamp": 1502884924512,
+   "type": "clear",
+   "helperType": null,
+   "level": "log",
+   "messageText": null,
+   "parameters": [
+     "Console was cleared."
+   ],
+-  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":1,\"column\":27},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[\"Console was cleared.\"],\"source\":\"console-api\",\"type\":\"clear\",\"userProvidedStyles\":[]}",
++  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":1,\"column\":27},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[\"Console was cleared.\"],\"source\":\"console-api\",\"type\":\"clear\",\"userProvidedStyles\":[],\"private\":false}",
+   "stacktrace": null,
+   "frame": {
+     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+     "line": 1,
+     "column": 27
+   },
+   "groupId": null,
+   "exceptionDocURL": null,
+   "userProvidedStyles": [],
+   "notes": null,
+   "indent": 0,
+-  "prefix": ""
++  "prefix": "",
++  "private": false
+ }));
+ 
+ stubPreparedMessages.set(`console.count('bar')`, new ConsoleMessage({
+   "id": "1",
+   "allowRepeating": true,
+   "source": "console-api",
+   "timeStamp": 1502884924515,
+   "type": "log",
+   "helperType": null,
+   "level": "log",
+   "messageText": "bar: 1",
+   "parameters": null,
+-  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":1,\"column\":27},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":\"bar: 1\",\"parameters\":null,\"source\":\"console-api\",\"type\":\"log\",\"userProvidedStyles\":[]}",
++  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":1,\"column\":27},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":\"bar: 1\",\"parameters\":null,\"source\":\"console-api\",\"type\":\"log\",\"userProvidedStyles\":[],\"private\":false}",
+   "stacktrace": null,
+   "frame": {
+     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+     "line": 1,
+     "column": 27
+   },
+   "groupId": null,
+   "exceptionDocURL": null,
+   "userProvidedStyles": [],
+   "notes": null,
+   "indent": 0,
+-  "prefix": ""
++  "prefix": "",
++  "private": false
+ }));
+ 
+ stubPreparedMessages.set(`console.assert(false, {message: 'foobar'})`, new ConsoleMessage({
+   "id": "1",
+   "allowRepeating": true,
+   "source": "console-api",
+   "timeStamp": 1502884924521,
+   "type": "assert",
+@@ -264,17 +272,17 @@ stubPreparedMessages.set(`console.assert
+         },
+         "ownSymbols": [],
+         "ownPropertiesLength": 1,
+         "ownSymbolsLength": 0,
+         "safeGetterValues": {}
+       }
+     }
+   ],
+-  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":1,\"column\":27},\"groupId\":null,\"indent\":0,\"level\":\"error\",\"messageText\":null,\"parameters\":[{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj30\",\"class\":\"Object\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":1,\"preview\":{\"kind\":\"Object\",\"ownProperties\":{\"message\":{\"configurable\":true,\"enumerable\":true,\"writable\":true,\"value\":\"foobar\"}},\"ownSymbols\":[],\"ownPropertiesLength\":1,\"ownSymbolsLength\":0,\"safeGetterValues\":{}}}],\"source\":\"console-api\",\"type\":\"assert\",\"userProvidedStyles\":[]}",
++  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":1,\"column\":27},\"groupId\":null,\"indent\":0,\"level\":\"error\",\"messageText\":null,\"parameters\":[{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj30\",\"class\":\"Object\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":1,\"preview\":{\"kind\":\"Object\",\"ownProperties\":{\"message\":{\"configurable\":true,\"enumerable\":true,\"writable\":true,\"value\":\"foobar\"}},\"ownSymbols\":[],\"ownPropertiesLength\":1,\"ownSymbolsLength\":0,\"safeGetterValues\":{}}}],\"source\":\"console-api\",\"type\":\"assert\",\"userProvidedStyles\":[],\"private\":false}",
+   "stacktrace": [
+     {
+       "columnNumber": 27,
+       "filename": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+       "functionName": "triggerPacket",
+       "lineNumber": 1
+     }
+   ],
+@@ -283,71 +291,74 @@ stubPreparedMessages.set(`console.assert
+     "line": 1,
+     "column": 27
+   },
+   "groupId": null,
+   "exceptionDocURL": null,
+   "userProvidedStyles": [],
+   "notes": null,
+   "indent": 0,
+-  "prefix": ""
++  "prefix": "",
++  "private": false
+ }));
+ 
+ stubPreparedMessages.set(`console.log('hello \nfrom \rthe \"string world!')`, new ConsoleMessage({
+   "id": "1",
+   "allowRepeating": true,
+   "source": "console-api",
+   "timeStamp": 1502884924528,
+   "type": "log",
+   "helperType": null,
+   "level": "log",
+   "messageText": null,
+   "parameters": [
+     "hello \nfrom \rthe \"string world!"
+   ],
+-  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":1,\"column\":27},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[\"hello \\nfrom \\rthe \\\"string world!\"],\"source\":\"console-api\",\"type\":\"log\",\"userProvidedStyles\":[]}",
++  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":1,\"column\":27},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[\"hello \\nfrom \\rthe \\\"string world!\"],\"source\":\"console-api\",\"type\":\"log\",\"userProvidedStyles\":[],\"private\":false}",
+   "stacktrace": null,
+   "frame": {
+     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+     "line": 1,
+     "column": 27
+   },
+   "groupId": null,
+   "exceptionDocURL": null,
+   "userProvidedStyles": [],
+   "notes": null,
+   "indent": 0,
+-  "prefix": ""
++  "prefix": "",
++  "private": false
+ }));
+ 
+ stubPreparedMessages.set(`console.log('úṇĩçödê țĕșť')`, new ConsoleMessage({
+   "id": "1",
+   "allowRepeating": true,
+   "source": "console-api",
+   "timeStamp": 1502884924586,
+   "type": "log",
+   "helperType": null,
+   "level": "log",
+   "messageText": null,
+   "parameters": [
+     "úṇĩçödê țĕșť"
+   ],
+-  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":1,\"column\":27},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[\"úṇĩçödê țĕșť\"],\"source\":\"console-api\",\"type\":\"log\",\"userProvidedStyles\":[]}",
++  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":1,\"column\":27},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[\"úṇĩçödê țĕșť\"],\"source\":\"console-api\",\"type\":\"log\",\"userProvidedStyles\":[],\"private\":false}",
+   "stacktrace": null,
+   "frame": {
+     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+     "line": 1,
+     "column": 27
+   },
+   "groupId": null,
+   "exceptionDocURL": null,
+   "userProvidedStyles": [],
+   "notes": null,
+   "indent": 0,
+-  "prefix": ""
++  "prefix": "",
++  "private": false
+ }));
+ 
+ stubPreparedMessages.set(`console.dirxml(window)`, new ConsoleMessage({
+   "id": "1",
+   "allowRepeating": true,
+   "source": "console-api",
+   "timeStamp": 1502884924596,
+   "type": "log",
+@@ -364,29 +375,30 @@ stubPreparedMessages.set(`console.dirxml
+       "sealed": false,
+       "ownPropertyLength": 830,
+       "preview": {
+         "kind": "ObjectWithURL",
+         "url": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html"
+       }
+     }
+   ],
+-  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":1,\"column\":27},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj31\",\"class\":\"Window\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":830,\"preview\":{\"kind\":\"ObjectWithURL\",\"url\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\"}}],\"source\":\"console-api\",\"type\":\"log\",\"userProvidedStyles\":[]}",
++  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":1,\"column\":27},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj31\",\"class\":\"Window\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":830,\"preview\":{\"kind\":\"ObjectWithURL\",\"url\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\"}}],\"source\":\"console-api\",\"type\":\"log\",\"userProvidedStyles\":[],\"private\":false}",
+   "stacktrace": null,
+   "frame": {
+     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+     "line": 1,
+     "column": 27
+   },
+   "groupId": null,
+   "exceptionDocURL": null,
+   "userProvidedStyles": [],
+   "notes": null,
+   "indent": 0,
+-  "prefix": ""
++  "prefix": "",
++  "private": false
+ }));
+ 
+ stubPreparedMessages.set(`console.log('myarray', ['red', 'green', 'blue'])`, new ConsoleMessage({
+   "id": "1",
+   "allowRepeating": true,
+   "source": "console-api",
+   "timeStamp": 1502884924604,
+   "type": "log",
+@@ -409,29 +421,30 @@ stubPreparedMessages.set(`console.log('m
+         "items": [
+           "red",
+           "green",
+           "blue"
+         ]
+       }
+     }
+   ],
+-  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":1,\"column\":27},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[\"myarray\",{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj32\",\"class\":\"Array\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":4,\"preview\":{\"kind\":\"ArrayLike\",\"length\":3,\"items\":[\"red\",\"green\",\"blue\"]}}],\"source\":\"console-api\",\"type\":\"log\",\"userProvidedStyles\":[]}",
++  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":1,\"column\":27},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[\"myarray\",{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj32\",\"class\":\"Array\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":4,\"preview\":{\"kind\":\"ArrayLike\",\"length\":3,\"items\":[\"red\",\"green\",\"blue\"]}}],\"source\":\"console-api\",\"type\":\"log\",\"userProvidedStyles\":[],\"private\":false}",
+   "stacktrace": null,
+   "frame": {
+     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+     "line": 1,
+     "column": 27
+   },
+   "groupId": null,
+   "exceptionDocURL": null,
+   "userProvidedStyles": [],
+   "notes": null,
+   "indent": 0,
+-  "prefix": ""
++  "prefix": "",
++  "private": false
+ }));
+ 
+ stubPreparedMessages.set(`console.log('myregex', /a.b.c/)`, new ConsoleMessage({
+   "id": "1",
+   "allowRepeating": true,
+   "source": "console-api",
+   "timeStamp": 1502884924610,
+   "type": "log",
+@@ -446,29 +459,30 @@ stubPreparedMessages.set(`console.log('m
+       "class": "RegExp",
+       "extensible": true,
+       "frozen": false,
+       "sealed": false,
+       "ownPropertyLength": 1,
+       "displayString": "/a.b.c/"
+     }
+   ],
+-  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":1,\"column\":27},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[\"myregex\",{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj33\",\"class\":\"RegExp\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":1,\"displayString\":\"/a.b.c/\"}],\"source\":\"console-api\",\"type\":\"log\",\"userProvidedStyles\":[]}",
++  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":1,\"column\":27},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[\"myregex\",{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj33\",\"class\":\"RegExp\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":1,\"displayString\":\"/a.b.c/\"}],\"source\":\"console-api\",\"type\":\"log\",\"userProvidedStyles\":[],\"private\":false}",
+   "stacktrace": null,
+   "frame": {
+     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+     "line": 1,
+     "column": 27
+   },
+   "groupId": null,
+   "exceptionDocURL": null,
+   "userProvidedStyles": [],
+   "notes": null,
+   "indent": 0,
+-  "prefix": ""
++  "prefix": "",
++  "private": false
+ }));
+ 
+ stubPreparedMessages.set(`console.table(['red', 'green', 'blue']);`, new ConsoleMessage({
+   "id": "1",
+   "allowRepeating": true,
+   "source": "console-api",
+   "timeStamp": 1502884924612,
+   "type": "table",
+@@ -490,29 +504,30 @@ stubPreparedMessages.set(`console.table(
+         "items": [
+           "red",
+           "green",
+           "blue"
+         ]
+       }
+     }
+   ],
+-  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":1,\"column\":27},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj34\",\"class\":\"Array\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":4,\"preview\":{\"kind\":\"ArrayLike\",\"length\":3,\"items\":[\"red\",\"green\",\"blue\"]}}],\"source\":\"console-api\",\"type\":\"table\",\"userProvidedStyles\":[]}",
++  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":1,\"column\":27},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj34\",\"class\":\"Array\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":4,\"preview\":{\"kind\":\"ArrayLike\",\"length\":3,\"items\":[\"red\",\"green\",\"blue\"]}}],\"source\":\"console-api\",\"type\":\"table\",\"userProvidedStyles\":[],\"private\":false}",
+   "stacktrace": null,
+   "frame": {
+     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+     "line": 1,
+     "column": 27
+   },
+   "groupId": null,
+   "exceptionDocURL": null,
+   "userProvidedStyles": [],
+   "notes": null,
+   "indent": 0,
+-  "prefix": ""
++  "prefix": "",
++  "private": false
+ }));
+ 
+ stubPreparedMessages.set(`console.log('myobject', {red: 'redValue', green: 'greenValue', blue: 'blueValue'});`, new ConsoleMessage({
+   "id": "1",
+   "allowRepeating": true,
+   "source": "console-api",
+   "timeStamp": 1502884924614,
+   "type": "log",
+@@ -553,98 +568,101 @@ stubPreparedMessages.set(`console.log('m
+         },
+         "ownSymbols": [],
+         "ownPropertiesLength": 3,
+         "ownSymbolsLength": 0,
+         "safeGetterValues": {}
+       }
+     }
+   ],
+-  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":1,\"column\":27},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[\"myobject\",{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj35\",\"class\":\"Object\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":3,\"preview\":{\"kind\":\"Object\",\"ownProperties\":{\"red\":{\"configurable\":true,\"enumerable\":true,\"writable\":true,\"value\":\"redValue\"},\"green\":{\"configurable\":true,\"enumerable\":true,\"writable\":true,\"value\":\"greenValue\"},\"blue\":{\"configurable\":true,\"enumerable\":true,\"writable\":true,\"value\":\"blueValue\"}},\"ownSymbols\":[],\"ownPropertiesLength\":3,\"ownSymbolsLength\":0,\"safeGetterValues\":{}}}],\"source\":\"console-api\",\"type\":\"log\",\"userProvidedStyles\":[]}",
++  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":1,\"column\":27},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[\"myobject\",{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj35\",\"class\":\"Object\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":3,\"preview\":{\"kind\":\"Object\",\"ownProperties\":{\"red\":{\"configurable\":true,\"enumerable\":true,\"writable\":true,\"value\":\"redValue\"},\"green\":{\"configurable\":true,\"enumerable\":true,\"writable\":true,\"value\":\"greenValue\"},\"blue\":{\"configurable\":true,\"enumerable\":true,\"writable\":true,\"value\":\"blueValue\"}},\"ownSymbols\":[],\"ownPropertiesLength\":3,\"ownSymbolsLength\":0,\"safeGetterValues\":{}}}],\"source\":\"console-api\",\"type\":\"log\",\"userProvidedStyles\":[],\"private\":false}",
+   "stacktrace": null,
+   "frame": {
+     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+     "line": 1,
+     "column": 27
+   },
+   "groupId": null,
+   "exceptionDocURL": null,
+   "userProvidedStyles": [],
+   "notes": null,
+   "indent": 0,
+-  "prefix": ""
++  "prefix": "",
++  "private": false
+ }));
+ 
+ stubPreparedMessages.set(`console.debug('debug message');`, new ConsoleMessage({
+   "id": "1",
+   "allowRepeating": true,
+   "source": "console-api",
+   "timeStamp": 1502884924621,
+   "type": "debug",
+   "helperType": null,
+   "level": "debug",
+   "messageText": null,
+   "parameters": [
+     "debug message"
+   ],
+-  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":1,\"column\":27},\"groupId\":null,\"indent\":0,\"level\":\"debug\",\"messageText\":null,\"parameters\":[\"debug message\"],\"source\":\"console-api\",\"type\":\"debug\",\"userProvidedStyles\":[]}",
++  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":1,\"column\":27},\"groupId\":null,\"indent\":0,\"level\":\"debug\",\"messageText\":null,\"parameters\":[\"debug message\"],\"source\":\"console-api\",\"type\":\"debug\",\"userProvidedStyles\":[],\"private\":false}",
+   "stacktrace": null,
+   "frame": {
+     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+     "line": 1,
+     "column": 27
+   },
+   "groupId": null,
+   "exceptionDocURL": null,
+   "userProvidedStyles": [],
+   "notes": null,
+   "indent": 0,
+-  "prefix": ""
++  "prefix": "",
++  "private": false
+ }));
+ 
+ stubPreparedMessages.set(`console.info('info message');`, new ConsoleMessage({
+   "id": "1",
+   "allowRepeating": true,
+   "source": "console-api",
+   "timeStamp": 1502884924625,
+   "type": "info",
+   "helperType": null,
+   "level": "info",
+   "messageText": null,
+   "parameters": [
+     "info message"
+   ],
+-  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":1,\"column\":27},\"groupId\":null,\"indent\":0,\"level\":\"info\",\"messageText\":null,\"parameters\":[\"info message\"],\"source\":\"console-api\",\"type\":\"info\",\"userProvidedStyles\":[]}",
++  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":1,\"column\":27},\"groupId\":null,\"indent\":0,\"level\":\"info\",\"messageText\":null,\"parameters\":[\"info message\"],\"source\":\"console-api\",\"type\":\"info\",\"userProvidedStyles\":[],\"private\":false}",
+   "stacktrace": null,
+   "frame": {
+     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+     "line": 1,
+     "column": 27
+   },
+   "groupId": null,
+   "exceptionDocURL": null,
+   "userProvidedStyles": [],
+   "notes": null,
+   "indent": 0,
+-  "prefix": ""
++  "prefix": "",
++  "private": false
+ }));
+ 
+ stubPreparedMessages.set(`console.error('error message');`, new ConsoleMessage({
+   "id": "1",
+   "allowRepeating": true,
+   "source": "console-api",
+   "timeStamp": 1502884924628,
+   "type": "error",
+   "helperType": null,
+   "level": "error",
+   "messageText": null,
+   "parameters": [
+     "error message"
+   ],
+-  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":1,\"column\":27},\"groupId\":null,\"indent\":0,\"level\":\"error\",\"messageText\":null,\"parameters\":[\"error message\"],\"source\":\"console-api\",\"type\":\"error\",\"userProvidedStyles\":[]}",
++  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":1,\"column\":27},\"groupId\":null,\"indent\":0,\"level\":\"error\",\"messageText\":null,\"parameters\":[\"error message\"],\"source\":\"console-api\",\"type\":\"error\",\"userProvidedStyles\":[],\"private\":false}",
+   "stacktrace": [
+     {
+       "columnNumber": 27,
+       "filename": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+       "functionName": "triggerPacket",
+       "lineNumber": 1
+     }
+   ],
+@@ -653,17 +671,18 @@ stubPreparedMessages.set(`console.error(
+     "line": 1,
+     "column": 27
+   },
+   "groupId": null,
+   "exceptionDocURL": null,
+   "userProvidedStyles": [],
+   "notes": null,
+   "indent": 0,
+-  "prefix": ""
++  "prefix": "",
++  "private": false
+ }));
+ 
+ stubPreparedMessages.set(`console.log('mymap')`, new ConsoleMessage({
+   "id": "1",
+   "allowRepeating": true,
+   "source": "console-api",
+   "timeStamp": 1502884924631,
+   "type": "log",
+@@ -691,29 +710,30 @@ stubPreparedMessages.set(`console.log('m
+           [
+             "key2",
+             "value2"
+           ]
+         ]
+       }
+     }
+   ],
+-  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":5,\"column\":1},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[\"mymap\",{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj36\",\"class\":\"Map\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":0,\"preview\":{\"kind\":\"MapLike\",\"size\":2,\"entries\":[[\"key1\",\"value1\"],[\"key2\",\"value2\"]]}}],\"source\":\"console-api\",\"type\":\"log\",\"userProvidedStyles\":[]}",
++  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":5,\"column\":1},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[\"mymap\",{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj36\",\"class\":\"Map\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":0,\"preview\":{\"kind\":\"MapLike\",\"size\":2,\"entries\":[[\"key1\",\"value1\"],[\"key2\",\"value2\"]]}}],\"source\":\"console-api\",\"type\":\"log\",\"userProvidedStyles\":[],\"private\":false}",
+   "stacktrace": null,
+   "frame": {
+     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+     "line": 5,
+     "column": 1
+   },
+   "groupId": null,
+   "exceptionDocURL": null,
+   "userProvidedStyles": [],
+   "notes": null,
+   "indent": 0,
+-  "prefix": ""
++  "prefix": "",
++  "private": false
+ }));
+ 
+ stubPreparedMessages.set(`console.log('myset')`, new ConsoleMessage({
+   "id": "1",
+   "allowRepeating": true,
+   "source": "console-api",
+   "timeStamp": 1502884924746,
+   "type": "log",
+@@ -735,42 +755,43 @@ stubPreparedMessages.set(`console.log('m
+         "length": 2,
+         "items": [
+           "a",
+           "b"
+         ]
+       }
+     }
+   ],
+-  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":2,\"column\":1},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[\"myset\",{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj37\",\"class\":\"Set\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":0,\"preview\":{\"kind\":\"ArrayLike\",\"length\":2,\"items\":[\"a\",\"b\"]}}],\"source\":\"console-api\",\"type\":\"log\",\"userProvidedStyles\":[]}",
++  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":2,\"column\":1},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[\"myset\",{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj37\",\"class\":\"Set\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":0,\"preview\":{\"kind\":\"ArrayLike\",\"length\":2,\"items\":[\"a\",\"b\"]}}],\"source\":\"console-api\",\"type\":\"log\",\"userProvidedStyles\":[],\"private\":false}",
+   "stacktrace": null,
+   "frame": {
+     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+     "line": 2,
+     "column": 1
+   },
+   "groupId": null,
+   "exceptionDocURL": null,
+   "userProvidedStyles": [],
+   "notes": null,
+   "indent": 0,
+-  "prefix": ""
++  "prefix": "",
++  "private": false
+ }));
+ 
+ stubPreparedMessages.set(`console.trace()`, new ConsoleMessage({
+   "id": "1",
+   "allowRepeating": true,
+   "source": "console-api",
+   "timeStamp": 1502884924752,
+   "type": "trace",
+   "helperType": null,
+   "level": "log",
+   "messageText": null,
+   "parameters": [],
+-  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":3,\"column\":3},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[],\"source\":\"console-api\",\"type\":\"trace\",\"userProvidedStyles\":[]}",
++  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":3,\"column\":3},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[],\"source\":\"console-api\",\"type\":\"trace\",\"userProvidedStyles\":[],\"private\":false}",
+   "stacktrace": [
+     {
+       "columnNumber": 3,
+       "filename": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+       "functionName": "testStacktraceFiltering",
+       "lineNumber": 3
+     },
+     {
+@@ -791,144 +812,150 @@ stubPreparedMessages.set(`console.trace(
+     "line": 3,
+     "column": 3
+   },
+   "groupId": null,
+   "exceptionDocURL": null,
+   "userProvidedStyles": [],
+   "notes": null,
+   "indent": 0,
+-  "prefix": ""
++  "prefix": "",
++  "private": false
+ }));
+ 
+ stubPreparedMessages.set(`console.time('bar')`, new ConsoleMessage({
+   "id": "1",
+   "allowRepeating": true,
+   "source": "console-api",
+   "timeStamp": 1502884924757,
+   "type": "nullMessage",
+   "helperType": null,
+   "level": "log",
+   "messageText": null,
+   "parameters": null,
+-  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":2,\"column\":1},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":null,\"source\":\"console-api\",\"type\":\"nullMessage\",\"userProvidedStyles\":[]}",
++  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":2,\"column\":1},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":null,\"source\":\"console-api\",\"type\":\"nullMessage\",\"userProvidedStyles\":[],\"private\":false}",
+   "stacktrace": null,
+   "frame": {
+     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+     "line": 2,
+     "column": 1
+   },
+   "groupId": null,
+   "exceptionDocURL": null,
+   "userProvidedStyles": [],
+   "notes": null,
+   "indent": 0,
+-  "prefix": ""
++  "prefix": "",
++  "private": false
+ }));
+ 
+ stubPreparedMessages.set(`timerAlreadyExists`, new ConsoleMessage({
+   "id": "1",
+   "allowRepeating": true,
+   "source": "console-api",
+   "timeStamp": 1502884924758,
+   "type": "time",
+   "helperType": null,
+   "level": "warn",
+   "messageText": "Timer “bar” already exists.",
+   "parameters": null,
+-  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":3,\"column\":1},\"groupId\":null,\"indent\":0,\"level\":\"warn\",\"messageText\":\"Timer “bar” already exists.\",\"parameters\":null,\"source\":\"console-api\",\"type\":\"time\",\"userProvidedStyles\":[]}",
++  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":3,\"column\":1},\"groupId\":null,\"indent\":0,\"level\":\"warn\",\"messageText\":\"Timer “bar” already exists.\",\"parameters\":null,\"source\":\"console-api\",\"type\":\"time\",\"userProvidedStyles\":[],\"private\":false}",
+   "stacktrace": null,
+   "frame": {
+     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+     "line": 3,
+     "column": 1
+   },
+   "groupId": null,
+   "exceptionDocURL": null,
+   "userProvidedStyles": [],
+   "notes": null,
+   "indent": 0,
+-  "prefix": ""
++  "prefix": "",
++  "private": false
+ }));
+ 
+ stubPreparedMessages.set(`console.timeEnd('bar')`, new ConsoleMessage({
+   "id": "1",
+   "allowRepeating": true,
+   "source": "console-api",
+   "timeStamp": 1502884924759,
+   "type": "timeEnd",
+   "helperType": null,
+   "level": "log",
+   "messageText": "bar: 1.21ms",
+   "parameters": null,
+-  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":4,\"column\":1},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":\"bar: 1.21ms\",\"parameters\":null,\"source\":\"console-api\",\"type\":\"timeEnd\",\"userProvidedStyles\":[]}",
++  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":4,\"column\":1},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":\"bar: 1.21ms\",\"parameters\":null,\"source\":\"console-api\",\"type\":\"timeEnd\",\"userProvidedStyles\":[],\"private\":false}",
+   "stacktrace": null,
+   "frame": {
+     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+     "line": 4,
+     "column": 1
+   },
+   "groupId": null,
+   "exceptionDocURL": null,
+   "userProvidedStyles": [],
+   "notes": null,
+   "indent": 0,
+-  "prefix": ""
++  "prefix": "",
++  "private": false
+ }));
+ 
+ stubPreparedMessages.set(`timerDoesntExist`, new ConsoleMessage({
+   "id": "1",
+   "allowRepeating": true,
+   "source": "console-api",
+   "timeStamp": 1502884924759,
+   "type": "timeEnd",
+   "helperType": null,
+   "level": "warn",
+   "messageText": "Timer “bar” doesn’t exist.",
+   "parameters": null,
+-  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":5,\"column\":1},\"groupId\":null,\"indent\":0,\"level\":\"warn\",\"messageText\":\"Timer “bar” doesn’t exist.\",\"parameters\":null,\"source\":\"console-api\",\"type\":\"timeEnd\",\"userProvidedStyles\":[]}",
++  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":5,\"column\":1},\"groupId\":null,\"indent\":0,\"level\":\"warn\",\"messageText\":\"Timer “bar” doesn’t exist.\",\"parameters\":null,\"source\":\"console-api\",\"type\":\"timeEnd\",\"userProvidedStyles\":[],\"private\":false}",
+   "stacktrace": null,
+   "frame": {
+     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+     "line": 5,
+     "column": 1
+   },
+   "groupId": null,
+   "exceptionDocURL": null,
+   "userProvidedStyles": [],
+   "notes": null,
+   "indent": 0,
+-  "prefix": ""
++  "prefix": "",
++  "private": false
+ }));
+ 
+ stubPreparedMessages.set(`console.table('bar')`, new ConsoleMessage({
+   "id": "1",
+   "allowRepeating": true,
+   "source": "console-api",
+   "timeStamp": 1502884924801,
+   "type": "log",
+   "helperType": null,
+   "level": "log",
+   "messageText": null,
+   "parameters": [
+     "bar"
+   ],
+-  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":2,\"column\":1},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[\"bar\"],\"source\":\"console-api\",\"type\":\"log\",\"userProvidedStyles\":[]}",
++  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":2,\"column\":1},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[\"bar\"],\"source\":\"console-api\",\"type\":\"log\",\"userProvidedStyles\":[],\"private\":false}",
+   "stacktrace": null,
+   "frame": {
+     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+     "line": 2,
+     "column": 1
+   },
+   "groupId": null,
+   "exceptionDocURL": null,
+   "userProvidedStyles": [],
+   "notes": null,
+   "indent": 0,
+-  "prefix": ""
++  "prefix": "",
++  "private": false
+ }));
+ 
+ stubPreparedMessages.set(`console.table(['a', 'b', 'c'])`, new ConsoleMessage({
+   "id": "1",
+   "allowRepeating": true,
+   "source": "console-api",
+   "timeStamp": 1502884924859,
+   "type": "table",
+@@ -950,361 +977,374 @@ stubPreparedMessages.set(`console.table(
+         "items": [
+           "a",
+           "b",
+           "c"
+         ]
+       }
+     }
+   ],
+-  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":2,\"column\":1},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj39\",\"class\":\"Array\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":4,\"preview\":{\"kind\":\"ArrayLike\",\"length\":3,\"items\":[\"a\",\"b\",\"c\"]}}],\"source\":\"console-api\",\"type\":\"table\",\"userProvidedStyles\":[]}",
++  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":2,\"column\":1},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj39\",\"class\":\"Array\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":4,\"preview\":{\"kind\":\"ArrayLike\",\"length\":3,\"items\":[\"a\",\"b\",\"c\"]}}],\"source\":\"console-api\",\"type\":\"table\",\"userProvidedStyles\":[],\"private\":false}",
+   "stacktrace": null,
+   "frame": {
+     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+     "line": 2,
+     "column": 1
+   },
+   "groupId": null,
+   "exceptionDocURL": null,
+   "userProvidedStyles": [],
+   "notes": null,
+   "indent": 0,
+-  "prefix": ""
++  "prefix": "",
++  "private": false
+ }));
+ 
+ stubPreparedMessages.set(`console.group('bar')`, new ConsoleMessage({
+   "id": "1",
+   "allowRepeating": true,
+   "source": "console-api",
+   "timeStamp": 1502884924863,
+   "type": "startGroup",
+   "helperType": null,
+   "level": "log",
+   "messageText": null,
+   "parameters": [
+     "bar"
+   ],
+-  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":2,\"column\":1},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[\"bar\"],\"source\":\"console-api\",\"type\":\"startGroup\",\"userProvidedStyles\":[]}",
++  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":2,\"column\":1},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[\"bar\"],\"source\":\"console-api\",\"type\":\"startGroup\",\"userProvidedStyles\":[],\"private\":false}",
+   "stacktrace": null,
+   "frame": {
+     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+     "line": 2,
+     "column": 1
+   },
+   "groupId": null,
+   "exceptionDocURL": null,
+   "userProvidedStyles": [],
+   "notes": null,
+   "indent": 0,
+-  "prefix": ""
++  "prefix": "",
++  "private": false
+ }));
+ 
+ stubPreparedMessages.set(`console.groupEnd('bar')`, new ConsoleMessage({
+   "id": "1",
+   "allowRepeating": true,
+   "source": "console-api",
+   "timeStamp": 1502884924864,
+   "type": "endGroup",
+   "helperType": null,
+   "level": "log",
+   "messageText": null,
+   "parameters": null,
+-  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":3,\"column\":1},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":null,\"source\":\"console-api\",\"type\":\"endGroup\",\"userProvidedStyles\":[]}",
++  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":3,\"column\":1},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":null,\"source\":\"console-api\",\"type\":\"endGroup\",\"userProvidedStyles\":[],\"private\":false}",
+   "stacktrace": null,
+   "frame": {
+     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+     "line": 3,
+     "column": 1
+   },
+   "groupId": null,
+   "exceptionDocURL": null,
+   "userProvidedStyles": [],
+   "notes": null,
+   "indent": 0,
+-  "prefix": ""
++  "prefix": "",
++  "private": false
+ }));
+ 
+ stubPreparedMessages.set(`console.groupCollapsed('foo')`, new ConsoleMessage({
+   "id": "1",
+   "allowRepeating": true,
+   "source": "console-api",
+   "timeStamp": 1502884924870,
+   "type": "startGroupCollapsed",
+   "helperType": null,
+   "level": "log",
+   "messageText": null,
+   "parameters": [
+     "foo"
+   ],
+-  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":2,\"column\":1},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[\"foo\"],\"source\":\"console-api\",\"type\":\"startGroupCollapsed\",\"userProvidedStyles\":[]}",
++  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":2,\"column\":1},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[\"foo\"],\"source\":\"console-api\",\"type\":\"startGroupCollapsed\",\"userProvidedStyles\":[],\"private\":false}",
+   "stacktrace": null,
+   "frame": {
+     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+     "line": 2,
+     "column": 1
+   },
+   "groupId": null,
+   "exceptionDocURL": null,
+   "userProvidedStyles": [],
+   "notes": null,
+   "indent": 0,
+-  "prefix": ""
++  "prefix": "",
++  "private": false
+ }));
+ 
+ stubPreparedMessages.set(`console.groupEnd('foo')`, new ConsoleMessage({
+   "id": "1",
+   "allowRepeating": true,
+   "source": "console-api",
+   "timeStamp": 1502884924871,
+   "type": "endGroup",
+   "helperType": null,
+   "level": "log",
+   "messageText": null,
+   "parameters": null,
+-  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":3,\"column\":1},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":null,\"source\":\"console-api\",\"type\":\"endGroup\",\"userProvidedStyles\":[]}",
++  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":3,\"column\":1},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":null,\"source\":\"console-api\",\"type\":\"endGroup\",\"userProvidedStyles\":[],\"private\":false}",
+   "stacktrace": null,
+   "frame": {
+     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+     "line": 3,
+     "column": 1
+   },
+   "groupId": null,
+   "exceptionDocURL": null,
+   "userProvidedStyles": [],
+   "notes": null,
+   "indent": 0,
+-  "prefix": ""
++  "prefix": "",
++  "private": false
+ }));
+ 
+ stubPreparedMessages.set(`console.group()`, new ConsoleMessage({
+   "id": "1",
+   "allowRepeating": true,
+   "source": "console-api",
+   "timeStamp": 1502884924878,
+   "type": "startGroup",
+   "helperType": null,
+   "level": "log",
+   "messageText": null,
+   "parameters": [
+     "<no group label>"
+   ],
+-  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":2,\"column\":1},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[\"<no group label>\"],\"source\":\"console-api\",\"type\":\"startGroup\",\"userProvidedStyles\":[]}",
++  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":2,\"column\":1},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[\"<no group label>\"],\"source\":\"console-api\",\"type\":\"startGroup\",\"userProvidedStyles\":[],\"private\":false}",
+   "stacktrace": null,
+   "frame": {
+     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+     "line": 2,
+     "column": 1
+   },
+   "groupId": null,
+   "exceptionDocURL": null,
+   "userProvidedStyles": [],
+   "notes": null,
+   "indent": 0,
+-  "prefix": ""
++  "prefix": "",
++  "private": false
+ }));
+ 
+ stubPreparedMessages.set(`console.groupEnd()`, new ConsoleMessage({
+   "id": "1",
+   "allowRepeating": true,
+   "source": "console-api",
+   "timeStamp": 1502884924879,
+   "type": "endGroup",
+   "helperType": null,
+   "level": "log",
+   "messageText": null,
+   "parameters": null,
+-  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":3,\"column\":1},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":null,\"source\":\"console-api\",\"type\":\"endGroup\",\"userProvidedStyles\":[]}",
++  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":3,\"column\":1},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":null,\"source\":\"console-api\",\"type\":\"endGroup\",\"userProvidedStyles\":[],\"private\":false}",
+   "stacktrace": null,
+   "frame": {
+     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+     "line": 3,
+     "column": 1
+   },
+   "groupId": null,
+   "exceptionDocURL": null,
+   "userProvidedStyles": [],
+   "notes": null,
+   "indent": 0,
+-  "prefix": ""
++  "prefix": "",
++  "private": false
+ }));
+ 
+ stubPreparedMessages.set(`console.log(%cfoobar)`, new ConsoleMessage({
+   "id": "1",
+   "allowRepeating": true,
+   "source": "console-api",
+   "timeStamp": 1502884924883,
+   "type": "log",
+   "helperType": null,
+   "level": "log",
+   "messageText": null,
+   "parameters": [
+     "foo",
+     "bar"
+   ],
+-  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":2,\"column\":1},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[\"foo\",\"bar\"],\"source\":\"console-api\",\"type\":\"log\",\"userProvidedStyles\":[\"color:blue; font-size:1.3em; background:url('http://example.com/test'); position:absolute; top:10px; \",\"color:red; line-height: 1.5; background:url('http://example.com/test')\"]}",
++  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":2,\"column\":1},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[\"foo\",\"bar\"],\"source\":\"console-api\",\"type\":\"log\",\"userProvidedStyles\":[\"color:blue; font-size:1.3em; background:url('http://example.com/test'); position:absolute; top:10px; \",\"color:red; line-height: 1.5; background:url('http://example.com/test')\"],\"private\":false}",
+   "stacktrace": null,
+   "frame": {
+     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+     "line": 2,
+     "column": 1
+   },
+   "groupId": null,
+   "exceptionDocURL": null,
+   "userProvidedStyles": [
+     "color:blue; font-size:1.3em; background:url('http://example.com/test'); position:absolute; top:10px; ",
+     "color:red; line-height: 1.5; background:url('http://example.com/test')"
+   ],
+   "notes": null,
+   "indent": 0,
+-  "prefix": ""
++  "prefix": "",
++  "private": false
+ }));
+ 
+ stubPreparedMessages.set(`console.log("%cHello%c|%cWorld")`, new ConsoleMessage({
+   "id": "1",
+   "allowRepeating": true,
+   "source": "console-api",
+   "timeStamp": 1518681614352,
+   "type": "log",
+   "helperType": null,
+   "level": "log",
+   "messageText": null,
+   "parameters": [
+     "Hello",
+     "|",
+     "World"
+   ],
+-  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":2,\"column\":3},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[\"Hello\",\"|\",\"World\"],\"source\":\"console-api\",\"type\":\"log\",\"userProvidedStyles\":[\"color:red\",\"\",\"color: blue\"]}",
++  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":2,\"column\":3},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[\"Hello\",\"|\",\"World\"],\"source\":\"console-api\",\"type\":\"log\",\"userProvidedStyles\":[\"color:red\",\"\",\"color: blue\"],\"private\":false}",
+   "stacktrace": null,
+   "frame": {
+     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+     "line": 2,
+     "column": 3
+   },
+   "groupId": null,
+   "exceptionDocURL": null,
+   "userProvidedStyles": [
+     "color:red",
+     "",
+     "color: blue"
+   ],
+   "notes": null,
+   "indent": 0,
+-  "prefix": ""
++  "prefix": "",
++  "private": false
+ }));
+ 
+ stubPreparedMessages.set(`console.group(%cfoo%cbar)`, new ConsoleMessage({
+   "id": "1",
+   "allowRepeating": true,
+   "source": "console-api",
+   "timeStamp": 1502884924887,
+   "type": "startGroup",
+   "helperType": null,
+   "level": "log",
+   "messageText": null,
+   "parameters": [
+     "foo",
+     "bar"
+   ],
+-  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":2,\"column\":1},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[\"foo\",\"bar\"],\"source\":\"console-api\",\"type\":\"startGroup\",\"userProvidedStyles\":[\"color:blue;font-size:1.3em;background:url('http://example.com/test');position:absolute;top:10px\",\"color:red;background:url('http://example.com/test')\"]}",
++  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":2,\"column\":1},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[\"foo\",\"bar\"],\"source\":\"console-api\",\"type\":\"startGroup\",\"userProvidedStyles\":[\"color:blue;font-size:1.3em;background:url('http://example.com/test');position:absolute;top:10px\",\"color:red;background:url('http://example.com/test')\"],\"private\":false}",
+   "stacktrace": null,
+   "frame": {
+     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+     "line": 2,
+     "column": 1
+   },
+   "groupId": null,
+   "exceptionDocURL": null,
+   "userProvidedStyles": [
+     "color:blue;font-size:1.3em;background:url('http://example.com/test');position:absolute;top:10px",
+     "color:red;background:url('http://example.com/test')"
+   ],
+   "notes": null,
+   "indent": 0,
+-  "prefix": ""
++  "prefix": "",
++  "private": false
+ }));
+ 
+ stubPreparedMessages.set(`console.groupEnd(%cfoo%cbar)`, new ConsoleMessage({
+   "id": "1",
+   "allowRepeating": true,
+   "source": "console-api",
+   "timeStamp": 1502884924887,
+   "type": "endGroup",
+   "helperType": null,
+   "level": "log",
+   "messageText": null,
+   "parameters": null,
+-  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":6,\"column\":1},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":null,\"source\":\"console-api\",\"type\":\"endGroup\",\"userProvidedStyles\":[]}",
++  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":6,\"column\":1},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":null,\"source\":\"console-api\",\"type\":\"endGroup\",\"userProvidedStyles\":[],\"private\":false}",
+   "stacktrace": null,
+   "frame": {
+     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+     "line": 6,
+     "column": 1
+   },
+   "groupId": null,
+   "exceptionDocURL": null,
+   "userProvidedStyles": [],
+   "notes": null,
+   "indent": 0,
+-  "prefix": ""
++  "prefix": "",
++  "private": false
+ }));
+ 
+ stubPreparedMessages.set(`console.groupCollapsed(%cfoo%cbaz)`, new ConsoleMessage({
+   "id": "1",
+   "allowRepeating": true,
+   "source": "console-api",
+   "timeStamp": 1502884924892,
+   "type": "startGroupCollapsed",
+   "helperType": null,
+   "level": "log",
+   "messageText": null,
+   "parameters": [
+     "foo",
+     "baz"
+   ],
+-  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":2,\"column\":1},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[\"foo\",\"baz\"],\"source\":\"console-api\",\"type\":\"startGroupCollapsed\",\"userProvidedStyles\":[\"color:blue;font-size:1.3em;background:url('http://example.com/test');position:absolute;top:10px\",\"color:red;background:url('http://example.com/test')\"]}",
++  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":2,\"column\":1},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[\"foo\",\"baz\"],\"source\":\"console-api\",\"type\":\"startGroupCollapsed\",\"userProvidedStyles\":[\"color:blue;font-size:1.3em;background:url('http://example.com/test');position:absolute;top:10px\",\"color:red;background:url('http://example.com/test')\"],\"private\":false}",
+   "stacktrace": null,
+   "frame": {
+     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+     "line": 2,
+     "column": 1
+   },
+   "groupId": null,
+   "exceptionDocURL": null,
+   "userProvidedStyles": [
+     "color:blue;font-size:1.3em;background:url('http://example.com/test');position:absolute;top:10px",
+     "color:red;background:url('http://example.com/test')"
+   ],
+   "notes": null,
+   "indent": 0,
+-  "prefix": ""
++  "prefix": "",
++  "private": false
+ }));
+ 
+ stubPreparedMessages.set(`console.groupEnd(%cfoo%cbaz)`, new ConsoleMessage({
+   "id": "1",
+   "allowRepeating": true,
+   "source": "console-api",
+   "timeStamp": 1502884924893,
+   "type": "endGroup",
+   "helperType": null,
+   "level": "log",
+   "messageText": null,
+   "parameters": null,
+-  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":6,\"column\":1},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":null,\"source\":\"console-api\",\"type\":\"endGroup\",\"userProvidedStyles\":[]}",
++  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":6,\"column\":1},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":null,\"source\":\"console-api\",\"type\":\"endGroup\",\"userProvidedStyles\":[],\"private\":false}",
+   "stacktrace": null,
+   "frame": {
+     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+     "line": 6,
+     "column": 1
+   },
+   "groupId": null,
+   "exceptionDocURL": null,
+   "userProvidedStyles": [],
+   "notes": null,
+   "indent": 0,
+-  "prefix": ""
++  "prefix": "",
++  "private": false
+ }));
+ 
+ stubPreparedMessages.set(`console.dir({C, M, Y, K})`, new ConsoleMessage({
+   "id": "1",
+   "allowRepeating": true,
+   "source": "console-api",
+   "timeStamp": 1502884924899,
+   "type": "dir",
+@@ -1350,231 +1390,240 @@ stubPreparedMessages.set(`console.dir({C
+         },
+         "ownSymbols": [],
+         "ownPropertiesLength": 4,
+         "ownSymbolsLength": 0,
+         "safeGetterValues": {}
+       }
+     }
+   ],
+-  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":1,\"column\":27},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj36\",\"class\":\"Object\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":4,\"preview\":{\"kind\":\"Object\",\"ownProperties\":{\"cyan\":{\"configurable\":true,\"enumerable\":true,\"writable\":true,\"value\":\"C\"},\"magenta\":{\"configurable\":true,\"enumerable\":true,\"writable\":true,\"value\":\"M\"},\"yellow\":{\"configurable\":true,\"enumerable\":true,\"writable\":true,\"value\":\"Y\"},\"black\":{\"configurable\":true,\"enumerable\":true,\"writable\":true,\"value\":\"K\"}},\"ownSymbols\":[],\"ownPropertiesLength\":4,\"ownSymbolsLength\":0,\"safeGetterValues\":{}}}],\"source\":\"console-api\",\"type\":\"dir\",\"userProvidedStyles\":[]}",
++  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":1,\"column\":27},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[{\"type\":\"object\",\"actor\":\"server1.conn0.child1/obj36\",\"class\":\"Object\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":4,\"preview\":{\"kind\":\"Object\",\"ownProperties\":{\"cyan\":{\"configurable\":true,\"enumerable\":true,\"writable\":true,\"value\":\"C\"},\"magenta\":{\"configurable\":true,\"enumerable\":true,\"writable\":true,\"value\":\"M\"},\"yellow\":{\"configurable\":true,\"enumerable\":true,\"writable\":true,\"value\":\"Y\"},\"black\":{\"configurable\":true,\"enumerable\":true,\"writable\":true,\"value\":\"K\"}},\"ownSymbols\":[],\"ownPropertiesLength\":4,\"ownSymbolsLength\":0,\"safeGetterValues\":{}}}],\"source\":\"console-api\",\"type\":\"dir\",\"userProvidedStyles\":[],\"private\":false}",
+   "stacktrace": null,
+   "frame": {
+     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+     "line": 1,
+     "column": 27
+   },
+   "groupId": null,
+   "exceptionDocURL": null,
+   "userProvidedStyles": [],
+   "notes": null,
+   "indent": 0,
+-  "prefix": ""
++  "prefix": "",
++  "private": false
+ }));
+ 
+ stubPreparedMessages.set(`console.count | default: 1`, new ConsoleMessage({
+   "id": "1",
+   "allowRepeating": true,
+   "source": "console-api",
+   "timeStamp": 1511365913333,
+   "type": "log",
+   "helperType": null,
+   "level": "log",
+   "messageText": "default: 1",
+   "parameters": null,
+-  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":2,\"column\":5},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":\"default: 1\",\"parameters\":null,\"source\":\"console-api\",\"type\":\"log\",\"userProvidedStyles\":[]}",
++  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":2,\"column\":5},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":\"default: 1\",\"parameters\":null,\"source\":\"console-api\",\"type\":\"log\",\"userProvidedStyles\":[],\"private\":false}",
+   "stacktrace": null,
+   "frame": {
+     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+     "line": 2,
+     "column": 5
+   },
+   "groupId": null,
+   "exceptionDocURL": null,
+   "userProvidedStyles": [],
+   "notes": null,
+   "indent": 0,
+-  "prefix": ""
++  "prefix": "",
++  "private": false
+ }));
+ 
+ stubPreparedMessages.set(`console.count | default: 2`, new ConsoleMessage({
+   "id": "1",
+   "allowRepeating": true,
+   "source": "console-api",
+   "timeStamp": 1511365913334,
+   "type": "log",
+   "helperType": null,
+   "level": "log",
+   "messageText": "default: 2",
+   "parameters": null,
+-  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":3,\"column\":5},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":\"default: 2\",\"parameters\":null,\"source\":\"console-api\",\"type\":\"log\",\"userProvidedStyles\":[]}",
++  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":3,\"column\":5},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":\"default: 2\",\"parameters\":null,\"source\":\"console-api\",\"type\":\"log\",\"userProvidedStyles\":[],\"private\":false}",
+   "stacktrace": null,
+   "frame": {
+     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+     "line": 3,
+     "column": 5
+   },
+   "groupId": null,
+   "exceptionDocURL": null,
+   "userProvidedStyles": [],
+   "notes": null,
+   "indent": 0,
+-  "prefix": ""
++  "prefix": "",
++  "private": false
+ }));
+ 
+ stubPreparedMessages.set(`console.count | test counter: 1`, new ConsoleMessage({
+   "id": "1",
+   "allowRepeating": true,
+   "source": "console-api",
+   "timeStamp": 1511365913334,
+   "type": "log",
+   "helperType": null,
+   "level": "log",
+   "messageText": "test counter: 1",
+   "parameters": null,
+-  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":4,\"column\":5},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":\"test counter: 1\",\"parameters\":null,\"source\":\"console-api\",\"type\":\"log\",\"userProvidedStyles\":[]}",
++  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":4,\"column\":5},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":\"test counter: 1\",\"parameters\":null,\"source\":\"console-api\",\"type\":\"log\",\"userProvidedStyles\":[],\"private\":false}",
+   "stacktrace": null,
+   "frame": {
+     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+     "line": 4,
+     "column": 5
+   },
+   "groupId": null,
+   "exceptionDocURL": null,
+   "userProvidedStyles": [],
+   "notes": null,
+   "indent": 0,
+-  "prefix": ""
++  "prefix": "",
++  "private": false
+ }));
+ 
+ stubPreparedMessages.set(`console.count | test counter: 2`, new ConsoleMessage({
+   "id": "1",
+   "allowRepeating": true,
+   "source": "console-api",
+   "timeStamp": 1511365913334,
+   "type": "log",
+   "helperType": null,
+   "level": "log",
+   "messageText": "test counter: 2",
+   "parameters": null,
+-  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":5,\"column\":5},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":\"test counter: 2\",\"parameters\":null,\"source\":\"console-api\",\"type\":\"log\",\"userProvidedStyles\":[]}",
++  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":5,\"column\":5},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":\"test counter: 2\",\"parameters\":null,\"source\":\"console-api\",\"type\":\"log\",\"userProvidedStyles\":[],\"private\":false}",
+   "stacktrace": null,
+   "frame": {
+     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+     "line": 5,
+     "column": 5
+   },
+   "groupId": null,
+   "exceptionDocURL": null,
+   "userProvidedStyles": [],
+   "notes": null,
+   "indent": 0,
+-  "prefix": ""
++  "prefix": "",
++  "private": false
+ }));
+ 
+ stubPreparedMessages.set(`console.count | default: 3`, new ConsoleMessage({
+   "id": "1",
+   "allowRepeating": true,
+   "source": "console-api",
+   "timeStamp": 1511365913334,
+   "type": "log",
+   "helperType": null,
+   "level": "log",
+   "messageText": "default: 3",
+   "parameters": null,
+-  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":6,\"column\":5},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":\"default: 3\",\"parameters\":null,\"source\":\"console-api\",\"type\":\"log\",\"userProvidedStyles\":[]}",
++  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":6,\"column\":5},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":\"default: 3\",\"parameters\":null,\"source\":\"console-api\",\"type\":\"log\",\"userProvidedStyles\":[],\"private\":false}",
+   "stacktrace": null,
+   "frame": {
+     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+     "line": 6,
+     "column": 5
+   },
+   "groupId": null,
+   "exceptionDocURL": null,
+   "userProvidedStyles": [],
+   "notes": null,
+   "indent": 0,
+-  "prefix": ""
++  "prefix": "",
++  "private": false
+ }));
+ 
+ stubPreparedMessages.set(`console.count | clear`, new ConsoleMessage({
+   "id": "1",
+   "allowRepeating": true,
+   "source": "console-api",
+   "timeStamp": 1511365913334,
+   "type": "clear",
+   "helperType": null,
+   "level": "log",
+   "messageText": null,
+   "parameters": [
+     "Console was cleared."
+   ],
+-  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":7,\"column\":5},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[\"Console was cleared.\"],\"source\":\"console-api\",\"type\":\"clear\",\"userProvidedStyles\":[]}",
++  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":7,\"column\":5},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":null,\"parameters\":[\"Console was cleared.\"],\"source\":\"console-api\",\"type\":\"clear\",\"userProvidedStyles\":[],\"private\":false}",
+   "stacktrace": null,
+   "frame": {
+     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+     "line": 7,
+     "column": 5
+   },
+   "groupId": null,
+   "exceptionDocURL": null,
+   "userProvidedStyles": [],
+   "notes": null,
+   "indent": 0,
+-  "prefix": ""
++  "prefix": "",
++  "private": false
+ }));
+ 
+ stubPreparedMessages.set(`console.count | default: 4`, new ConsoleMessage({
+   "id": "1",
+   "allowRepeating": true,
+   "source": "console-api",
+   "timeStamp": 1511365913335,
+   "type": "log",
+   "helperType": null,
+   "level": "log",
+   "messageText": "default: 4",
+   "parameters": null,
+-  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":8,\"column\":5},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":\"default: 4\",\"parameters\":null,\"source\":\"console-api\",\"type\":\"log\",\"userProvidedStyles\":[]}",
++  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":8,\"column\":5},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":\"default: 4\",\"parameters\":null,\"source\":\"console-api\",\"type\":\"log\",\"userProvidedStyles\":[],\"private\":false}",
+   "stacktrace": null,
+   "frame": {
+     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+     "line": 8,
+     "column": 5
+   },
+   "groupId": null,
+   "exceptionDocURL": null,
+   "userProvidedStyles": [],
+   "notes": null,
+   "indent": 0,
+-  "prefix": ""
++  "prefix": "",
++  "private": false
+ }));
+ 
+ stubPreparedMessages.set(`console.count | test counter: 3`, new ConsoleMessage({
+   "id": "1",
+   "allowRepeating": true,
+   "source": "console-api",
+   "timeStamp": 1511365913335,
+   "type": "log",
+   "helperType": null,
+   "level": "log",
+   "messageText": "test counter: 3",
+   "parameters": null,
+-  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":9,\"column\":5},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":\"test counter: 3\",\"parameters\":null,\"source\":\"console-api\",\"type\":\"log\",\"userProvidedStyles\":[]}",
++  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":9,\"column\":5},\"groupId\":null,\"indent\":0,\"level\":\"log\",\"messageText\":\"test counter: 3\",\"parameters\":null,\"source\":\"console-api\",\"type\":\"log\",\"userProvidedStyles\":[],\"private\":false}",
+   "stacktrace": null,
+   "frame": {
+     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+     "line": 9,
+     "column": 5
+   },
+   "groupId": null,
+   "exceptionDocURL": null,
+   "userProvidedStyles": [],
+   "notes": null,
+   "indent": 0,
+-  "prefix": ""
++  "prefix": "",
++  "private": false
+ }));
+ 
+ stubPackets.set(`console.log('foobar', 'test')`, {
+   "from": "server1.conn0.child1/consoleActor2",
+   "type": "consoleAPICall",
+   "message": {
+     "addonId": "",
+     "arguments": [
+diff --git a/devtools/client/webconsole/new-console-output/test/fixtures/stubs/cssMessage.js b/devtools/client/webconsole/new-console-output/test/fixtures/stubs/cssMessage.js
+--- a/devtools/client/webconsole/new-console-output/test/fixtures/stubs/cssMessage.js
++++ b/devtools/client/webconsole/new-console-output/test/fixtures/stubs/cssMessage.js
+@@ -18,52 +18,54 @@ stubPreparedMessages.set(`Unknown property ‘such-unknown-property’.  Declaration dropped.`, new ConsoleMessage({
+   "allowRepeating": true,
+   "source": "css",
+   "timeStamp": 1479159920406,
+   "type": "log",
+   "helperType": null,
+   "level": "warn",
+   "messageText": "Unknown property ‘such-unknown-property’.  Declaration dropped.",
+   "parameters": null,
+-  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-css-message.html\",\"line\":3,\"column\":25},\"groupId\":null,\"indent\":0,\"level\":\"warn\",\"messageText\":\"Unknown property ‘such-unknown-property’.  Declaration dropped.\",\"parameters\":null,\"source\":\"css\",\"type\":\"log\",\"userProvidedStyles\":null}",
++  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-css-message.html\",\"line\":3,\"column\":25},\"groupId\":null,\"indent\":0,\"level\":\"warn\",\"messageText\":\"Unknown property ‘such-unknown-property’.  Declaration dropped.\",\"parameters\":null,\"source\":\"css\",\"type\":\"log\",\"userProvidedStyles\":null,\"private\":false}",
+   "stacktrace": null,
+   "frame": {
+     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-css-message.html",
+     "line": 3,
+     "column": 25
+   },
+   "groupId": null,
+   "userProvidedStyles": null,
+   "notes": null,
+   "indent": 0,
+-  "prefix": ""
++  "prefix": "",
++  "private": false
+ }));
+ 
+ stubPreparedMessages.set(`Error in parsing value for ‘padding-top’.  Declaration dropped.`, new ConsoleMessage({
+   "id": "1",
+   "allowRepeating": true,
+   "source": "css",
+   "timeStamp": 1479159920465,
+   "type": "log",
+   "helperType": null,
+   "level": "warn",
+   "messageText": "Error in parsing value for ‘padding-top’.  Declaration dropped.",
+   "parameters": null,
+-  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-css-message.html\",\"line\":3,\"column\":16},\"groupId\":null,\"indent\":0,\"level\":\"warn\",\"messageText\":\"Error in parsing value for ‘padding-top’.  Declaration dropped.\",\"parameters\":null,\"source\":\"css\",\"type\":\"log\",\"userProvidedStyles\":null}",
++  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-css-message.html\",\"line\":3,\"column\":16},\"groupId\":null,\"indent\":0,\"level\":\"warn\",\"messageText\":\"Error in parsing value for ‘padding-top’.  Declaration dropped.\",\"parameters\":null,\"source\":\"css\",\"type\":\"log\",\"userProvidedStyles\":null,\"private\":false}",
+   "stacktrace": null,
+   "frame": {
+     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-css-message.html",
+     "line": 3,
+     "column": 16
+   },
+   "groupId": null,
+   "userProvidedStyles": null,
+   "notes": null,
+   "indent": 0,
+-  "prefix": ""
++  "prefix": "",
++  "private": false
+ }));
+ 
+ stubPackets.set(`Unknown property ‘such-unknown-property’.  Declaration dropped.`, {
+   "from": "server1.conn0.child1/consoleActor2",
+   "type": "pageError",
+   "pageError": {
+     "errorMessage": "Unknown property ‘such-unknown-property’.  Declaration dropped.",
+     "errorMessageName": "",
+diff --git a/devtools/client/webconsole/new-console-output/test/fixtures/stubs/networkEvent.js b/devtools/client/webconsole/new-console-output/test/fixtures/stubs/networkEvent.js
+--- a/devtools/client/webconsole/new-console-output/test/fixtures/stubs/networkEvent.js
++++ b/devtools/client/webconsole/new-console-output/test/fixtures/stubs/networkEvent.js
+@@ -28,16 +28,17 @@ stubPreparedMessages.set("GET request", 
+   "groupId": null,
+   "timeStamp": 1487022056850,
+   "indent": 0,
+   "updates": [],
+   "openedOnce": false,
+   "securityState": null,
+   "securityInfo": null,
+   "requestHeadersFromUploadStream": null,
++  "private": false,
+   "url": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/inexistent.html",
+   "urlDetails": {
+     "baseNameWithQuery": "inexistent.html",
+     "host": "example.com",
+     "scheme": "http",
+     "unicodeUrl": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/inexistent.html",
+     "isLocal": null
+   },
+@@ -106,16 +107,17 @@ stubPreparedMessages.set("XHR GET reques
+   "groupId": null,
+   "timeStamp": 1487022057746,
+   "indent": 0,
+   "updates": [],
+   "openedOnce": false,
+   "securityState": null,
+   "securityInfo": null,
+   "requestHeadersFromUploadStream": null,
++  "private": false,
+   "url": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/inexistent.html",
+   "urlDetails": {
+     "baseNameWithQuery": "inexistent.html",
+     "host": "example.com",
+     "scheme": "http",
+     "unicodeUrl": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/inexistent.html",
+     "isLocal": null
+   },
+@@ -184,16 +186,17 @@ stubPreparedMessages.set("XHR POST reque
+   "groupId": null,
+   "timeStamp": 1487022058414,
+   "indent": 0,
+   "updates": [],
+   "openedOnce": false,
+   "securityState": null,
+   "securityInfo": null,
+   "requestHeadersFromUploadStream": null,
++  "private": false,
+   "url": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/inexistent.html",
+   "urlDetails": {
+     "baseNameWithQuery": "inexistent.html",
+     "host": "example.com",
+     "scheme": "http",
+     "unicodeUrl": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/inexistent.html",
+     "isLocal": null
+   },
+diff --git a/devtools/client/webconsole/new-console-output/test/fixtures/stubs/pageError.js b/devtools/client/webconsole/new-console-output/test/fixtures/stubs/pageError.js
+--- a/devtools/client/webconsole/new-console-output/test/fixtures/stubs/pageError.js
++++ b/devtools/client/webconsole/new-console-output/test/fixtures/stubs/pageError.js
+@@ -18,17 +18,17 @@ stubPreparedMessages.set(`ReferenceError
+   "allowRepeating": true,
+   "source": "javascript",
+   "timeStamp": 1476573167137,
+   "type": "log",
+   "helperType": null,
+   "level": "error",
+   "messageText": "ReferenceError: asdf is not defined",
+   "parameters": null,
+-  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":3,\"column\":5},\"groupId\":null,\"indent\":0,\"level\":\"error\",\"messageText\":\"ReferenceError: asdf is not defined\",\"parameters\":null,\"source\":\"javascript\",\"type\":\"log\",\"userProvidedStyles\":null}",
++  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":3,\"column\":5},\"groupId\":null,\"indent\":0,\"level\":\"error\",\"messageText\":\"ReferenceError: asdf is not defined\",\"parameters\":null,\"source\":\"javascript\",\"type\":\"log\",\"userProvidedStyles\":null,\"private\":false}",
+   "stacktrace": [
+     {
+       "filename": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+       "lineNumber": 3,
+       "columnNumber": 5,
+       "functionName": "bar"
+     },
+     {
+@@ -61,30 +61,31 @@ stubPreparedMessages.set(`ReferenceError
+     "line": 3,
+     "column": 5
+   },
+   "groupId": null,
+   "exceptionDocURL": "https://developer.mozilla.org/docs/Web/JavaScript/Reference/Errors/Not_defined?utm_source=mozilla&utm_medium=firefox-console-errors&utm_campaign=default",
+   "userProvidedStyles": null,
+   "notes": null,
+   "indent": 0,
+-  "prefix": ""
++  "prefix": "",
++  "private": false
+ }));
+ 
+ stubPreparedMessages.set(`SyntaxError: redeclaration of let a`, new ConsoleMessage({
+   "id": "1",
+   "allowRepeating": true,
+   "source": "javascript",
+   "timeStamp": 1487992945524,
+   "type": "log",
+   "helperType": null,
+   "level": "error",
+   "messageText": "SyntaxError: redeclaration of let a",
+   "parameters": null,
+-  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":2,\"column\":9},\"groupId\":null,\"indent\":0,\"level\":\"error\",\"messageText\":\"SyntaxError: redeclaration of let a\",\"parameters\":null,\"source\":\"javascript\",\"type\":\"log\",\"userProvidedStyles\":null}",
++  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":2,\"column\":9},\"groupId\":null,\"indent\":0,\"level\":\"error\",\"messageText\":\"SyntaxError: redeclaration of let a\",\"parameters\":null,\"source\":\"javascript\",\"type\":\"log\",\"userProvidedStyles\":null,\"private\":false}",
+   "stacktrace": [
+     {
+       "filename": "resource://testing-common/content-task.js line 50 > eval",
+       "lineNumber": 7,
+       "columnNumber": 9,
+       "functionName": null
+     },
+     {
+@@ -107,17 +108,18 @@ stubPreparedMessages.set(`SyntaxError: r
+       "frame": {
+         "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+         "line": 2,
+         "column": 6
+       }
+     }
+   ],
+   "indent": 0,
+-  "prefix": ""
++  "prefix": "",
++  "private": false
+ }));
+ 
+ stubPreparedMessages.set(`TypeError longString message`, new ConsoleMessage({
+   "id": "1",
+   "allowRepeating": true,
+   "source": "javascript",
+   "timeStamp": 1493109507061,
+   "type": "log",
+@@ -125,17 +127,17 @@ stubPreparedMessages.set(`TypeError long
+   "level": "error",
+   "messageText": {
+     "type": "longString",
+     "initial": "Error: Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Lon",
+     "length": 110007,
+     "actor": "server1.conn0.child1/longString30"
+   },
+   "parameters": null,
+-  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":1,\"column\":7},\"groupId\":null,\"indent\":0,\"level\":\"error\",\"messageText\":{\"type\":\"longString\",\"initial\":\"Error: Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Lon\",\"length\":110007,\"actor\":\"server1.conn0.child1/longString30\"},\"parameters\":null,\"source\":\"javascript\",\"type\":\"log\",\"userProvidedStyles\":null}",
++  "repeatId": "{\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html\",\"line\":1,\"column\":7},\"groupId\":null,\"indent\":0,\"level\":\"error\",\"messageText\":{\"type\":\"longString\",\"initial\":\"Error: Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Long error Lon\",\"length\":110007,\"actor\":\"server1.conn0.child1/longString30\"},\"parameters\":null,\"source\":\"javascript\",\"type\":\"log\",\"userProvidedStyles\":null,\"private\":false}",
+   "stacktrace": [
+     {
+       "filename": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+       "lineNumber": 1,
+       "columnNumber": 7,
+       "functionName": null
+     },
+     {
+@@ -155,57 +157,60 @@ stubPreparedMessages.set(`TypeError long
+     "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-console-api.html",
+     "line": 1,
+     "column": 7
+   },
+   "groupId": null,
+   "userProvidedStyles": null,
+   "notes": null,
+   "indent": 0,
+-  "prefix": ""
++  "prefix": "",
++  "private": false
+ }));
+ 
+ stubPreparedMessages.set(`throw ""`, new ConsoleMessage({
+   "id": "1",
+   "allowRepeating": true,
+   "source": "javascript",
+   "timeStamp": 1517942398629,
+   "type": "log",
+   "helperType": null,
+   "level": "error",
+   "messageText": "uncaught exception: ",
+   "parameters": null,
+-  "repeatId": "{\"frame\":null,\"groupId\":null,\"indent\":0,\"level\":\"error\",\"messageText\":\"uncaught exception: \",\"parameters\":null,\"source\":\"javascript\",\"type\":\"log\",\"userProvidedStyles\":null}",
++  "repeatId": "{\"frame\":null,\"groupId\":null,\"indent\":0,\"level\":\"error\",\"messageText\":\"uncaught exception: \",\"parameters\":null,\"source\":\"javascript\",\"type\":\"log\",\"userProvidedStyles\":null,\"private\":false}",
+   "stacktrace": null,
+   "frame": null,
+   "groupId": null,
+   "userProvidedStyles": null,
+   "notes": null,
+   "indent": 0,
+-  "prefix": ""
++  "prefix": "",
++  "private": false
+ }));
+ 
+ stubPreparedMessages.set(`throw "tomato"`, new ConsoleMessage({
+   "id": "1",
+   "allowRepeating": true,
+   "source": "javascript",
+   "timeStamp": 1517942398637,
+   "type": "log",
+   "helperType": null,
+   "level": "error",
+   "messageText": "uncaught exception: tomato",
+   "parameters": null,
+-  "repeatId": "{\"frame\":null,\"groupId\":null,\"indent\":0,\"level\":\"error\",\"messageText\":\"uncaught exception: tomato\",\"parameters\":null,\"source\":\"javascript\",\"type\":\"log\",\"userProvidedStyles\":null}",
++  "repeatId": "{\"frame\":null,\"groupId\":null,\"indent\":0,\"level\":\"error\",\"messageText\":\"uncaught exception: tomato\",\"parameters\":null,\"source\":\"javascript\",\"type\":\"log\",\"userProvidedStyles\":null,\"private\":false}",
+   "stacktrace": null,
+   "frame": null,
+   "groupId": null,
+   "userProvidedStyles": null,
+   "notes": null,
+   "indent": 0,
+-  "prefix": ""
++  "prefix": "",
++  "private": false
+ }));
+ 
+ stubPackets.set(`ReferenceError: asdf is not defined`, {
+   "from": "server1.conn0.child1/consoleActor2",
+   "type": "pageError",
+   "pageError": {
+     "errorMessage": "ReferenceError: asdf is not defined",
+     "errorMessageName": "JSMSG_NOT_DEFINED",
+diff --git a/devtools/client/webconsole/new-console-output/types.js b/devtools/client/webconsole/new-console-output/types.js
+--- a/devtools/client/webconsole/new-console-output/types.js
++++ b/devtools/client/webconsole/new-console-output/types.js
+@@ -16,16 +16,17 @@ exports.ConsoleCommand = function (props
+     id: null,
+     allowRepeating: false,
+     messageText: null,
+     source: MESSAGE_SOURCE.JAVASCRIPT,
+     type: MESSAGE_TYPE.COMMAND,
+     level: MESSAGE_LEVEL.LOG,
+     groupId: null,
+     indent: 0,
++    private: false,
+   }, props);
+ };
+ 
+ exports.ConsoleMessage = function (props) {
+   return Object.assign({
+     id: null,
+     allowRepeating: true,
+     source: null,
+@@ -39,16 +40,17 @@ exports.ConsoleMessage = function (props
+     stacktrace: null,
+     frame: null,
+     groupId: null,
+     exceptionDocURL: null,
+     userProvidedStyles: null,
+     notes: null,
+     indent: 0,
+     prefix: "",
++    private: false,
+   }, props);
+ };
+ 
+ exports.NetworkEventMessage = function (props) {
+   return Object.assign({
+     id: null,
+     actor: null,
+     level: MESSAGE_LEVEL.LOG,
+@@ -61,10 +63,11 @@ exports.NetworkEventMessage = function (
+     timeStamp: null,
+     totalTime: null,
+     indent: 0,
+     updates: null,
+     openedOnce: false,
+     securityState: null,
+     securityInfo: null,
+     requestHeadersFromUploadStream: null,
++    private: false,
+   }, props);
+ };
+diff --git a/devtools/client/webconsole/new-console-output/utils/messages.js b/devtools/client/webconsole/new-console-output/utils/messages.js
+--- a/devtools/client/webconsole/new-console-output/utils/messages.js
++++ b/devtools/client/webconsole/new-console-output/utils/messages.js
+@@ -162,42 +162,45 @@ function transformConsoleAPICallPacket(p
+     level,
+     parameters,
+     messageText,
+     stacktrace: message.stacktrace ? message.stacktrace : null,
+     frame,
+     timeStamp: message.timeStamp,
+     userProvidedStyles: message.styles,
+     prefix: message.prefix,
++    private: message.private,
+   });
+ }
+ 
+ function transformNavigationMessagePacket(packet) {
+   let { message } = packet;
+   return new ConsoleMessage({
+     source: MESSAGE_SOURCE.CONSOLE_API,
+     type: MESSAGE_TYPE.LOG,
+     level: MESSAGE_LEVEL.LOG,
+     messageText: l10n.getFormatStr("webconsole.navigated", [message.url]),
+-    timeStamp: message.timeStamp
++    timeStamp: message.timeStamp,
++    private: message.private,
+   });
+ }
+ 
+ function transformLogMessagePacket(packet) {
+   let {
+     message,
+     timeStamp,
+   } = packet;
+ 
+   return new ConsoleMessage({
+     source: MESSAGE_SOURCE.CONSOLE_API,
+     type: MESSAGE_TYPE.LOG,
+     level: MESSAGE_LEVEL.LOG,
+     messageText: message,
+     timeStamp,
++    private: message.private,
+   });
+ }
+ 
+ function transformPageErrorPacket(packet) {
+   let { pageError } = packet;
+   let level = MESSAGE_LEVEL.ERROR;
+   if (pageError.warning || pageError.strict) {
+     level = MESSAGE_LEVEL.WARN;
+@@ -219,16 +222,17 @@ function transformPageErrorPacket(packet
+     type: MESSAGE_TYPE.LOG,
+     level,
+     messageText: pageError.errorMessage,
+     stacktrace: pageError.stacktrace ? pageError.stacktrace : null,
+     frame,
+     exceptionDocURL: pageError.exceptionDocURL,
+     timeStamp: pageError.timeStamp,
+     notes: pageError.notes,
++    private: pageError.private,
+   });
+ }
+ 
+ function transformNetworkEventPacket(packet) {
+   let { networkEvent } = packet;
+ 
+   return new NetworkEventMessage({
+     actor: networkEvent.actor,
+@@ -237,16 +241,17 @@ function transformNetworkEventPacket(pac
+     response: networkEvent.response,
+     timeStamp: networkEvent.timeStamp,
+     totalTime: networkEvent.totalTime,
+     url: networkEvent.request.url,
+     urlDetails: getUrlDetails(networkEvent.request.url),
+     method: networkEvent.request.method,
+     updates: networkEvent.updates,
+     cause: networkEvent.cause,
++    private: networkEvent.private,
+   });
+ }
+ 
+ function transformEvaluationResultPacket(packet) {
+   let {
+     exceptionMessage,
+     exceptionDocURL,
+     exception,
+@@ -282,31 +287,33 @@ function transformEvaluationResultPacket
+     helperType: helperResult ? helperResult.type : null,
+     level,
+     messageText: exceptionMessage,
+     parameters: [parameter],
+     exceptionDocURL,
+     frame,
+     timeStamp,
+     notes,
++    private: packet.private,
+   });
+ }
+ 
+ // Helpers
+ function getRepeatId(message) {
+   return JSON.stringify({
+     frame: message.frame,
+     groupId: message.groupId,
+     indent: message.indent,
+     level: message.level,
+     messageText: message.messageText,
+     parameters: message.parameters,
+     source: message.source,
+     type: message.type,
+     userProvidedStyles: message.userProvidedStyles,
++    private: message.private,
+   });
+ }
+ 
+ function convertCachedPacket(packet) {
+   // The devtools server provides cached message packets in a different shape, so we
+   // transform them here.
+   let convertPacket = {};
+   if (packet._type === "ConsoleAPI") {

+ 536 - 0
mozilla-release/patches/1307928-2-60a1.patch

@@ -0,0 +1,536 @@
+# HG changeset patch
+# User Nicolas Chevobbe <nchevobbe@mozilla.com>
+# Date 1519816466 -3600
+# Node ID e5f12661cc1af27b63aedfc21200e27e996f3637
+# Parent  4c3bf73c6266f7b00b3705a4a9761cf4bb72ecda
+Bug 1307928 - Remove private messages on lastPrivateContextExited event; r=bgrins.
+
+Add a redux action to handle the event and clear private messages from the store.
+A new `cleanState` function was extracted from `limitTopLevelMessage` so we can
+use it in this case.
+
+MozReview-Commit-ID: Hp6o9iZAbZ7
+
+diff --git a/devtools/client/webconsole/jsterm.js b/devtools/client/webconsole/jsterm.js
+--- a/devtools/client/webconsole/jsterm.js
++++ b/devtools/client/webconsole/jsterm.js
+@@ -1001,19 +1001,23 @@ JSTerm.prototype = {
+   },
+ 
+   /**
+    * Remove all of the private messages from the Web Console output.
+    *
+    * This method emits the "private-messages-cleared" notification.
+    */
+   clearPrivateMessages: function () {
+-    let nodes = this.hud.outputNode.querySelectorAll(".message[private]");
+-    for (let node of nodes) {
+-      this.hud.removeOutputMessage(node);
++    if (this.hud.NEW_CONSOLE_OUTPUT_ENABLED) {
++      this.hud.newConsoleOutput.dispatchPrivateMessagesClear();
++    } else {
++      let nodes = this.hud.outputNode.querySelectorAll(".message[private]");
++      for (let node of nodes) {
++        this.hud.removeOutputMessage(node);
++      }
+     }
+     this.emit("private-messages-cleared");
+   },
+ 
+   /**
+    * Updates the size of the input field (command line) to fit its contents.
+    *
+    * @returns void
+diff --git a/devtools/client/webconsole/new-console-output/actions/messages.js b/devtools/client/webconsole/new-console-output/actions/messages.js
+--- a/devtools/client/webconsole/new-console-output/actions/messages.js
++++ b/devtools/client/webconsole/new-console-output/actions/messages.js
+@@ -16,16 +16,17 @@ const {
+   MESSAGES_ADD,
+   NETWORK_MESSAGE_UPDATE,
+   NETWORK_UPDATE_REQUEST,
+   MESSAGES_CLEAR,
+   MESSAGE_OPEN,
+   MESSAGE_CLOSE,
+   MESSAGE_TYPE,
+   MESSAGE_TABLE_RECEIVE,
++  PRIVATE_MESSAGES_CLEAR,
+ } = require("../constants");
+ 
+ const defaultIdGenerator = new IdGenerator();
+ 
+ function messagesAdd(packets, idGenerator = null) {
+   if (idGenerator == null) {
+     idGenerator = defaultIdGenerator;
+   }
+@@ -51,16 +52,22 @@ function messagesAdd(packets, idGenerato
+ }
+ 
+ function messagesClear() {
+   return {
+     type: MESSAGES_CLEAR
+   };
+ }
+ 
++function privateMessagesClear() {
++  return {
++    type: PRIVATE_MESSAGES_CLEAR
++  };
++}
++
+ function messageOpen(id) {
+   return {
+     type: MESSAGE_OPEN,
+     id
+   };
+ }
+ 
+ function messageClose(id) {
+@@ -124,11 +131,12 @@ function networkUpdateRequest(id, data) 
+ module.exports = {
+   messagesAdd,
+   messagesClear,
+   messageOpen,
+   messageClose,
+   messageTableDataGet,
+   networkMessageUpdate,
+   networkUpdateRequest,
++  privateMessagesClear,
+   // for test purpose only.
+   messageTableDataReceive,
+ };
+diff --git a/devtools/client/webconsole/new-console-output/constants.js b/devtools/client/webconsole/new-console-output/constants.js
+--- a/devtools/client/webconsole/new-console-output/constants.js
++++ b/devtools/client/webconsole/new-console-output/constants.js
+@@ -16,16 +16,17 @@ const actionTypes = {
+   MESSAGE_CLOSE: "MESSAGE_CLOSE",
+   MESSAGE_OPEN: "MESSAGE_OPEN",
+   MESSAGE_TABLE_RECEIVE: "MESSAGE_TABLE_RECEIVE",
+   MESSAGES_ADD: "MESSAGES_ADD",
+   MESSAGES_CLEAR: "MESSAGES_CLEAR",
+   NETWORK_MESSAGE_UPDATE: "NETWORK_MESSAGE_UPDATE",
+   NETWORK_UPDATE_REQUEST: "NETWORK_UPDATE_REQUEST",
+   PERSIST_TOGGLE: "PERSIST_TOGGLE",
++  PRIVATE_MESSAGES_CLEAR: "PRIVATE_MESSAGES_CLEAR",
+   REMOVED_ACTORS_CLEAR: "REMOVED_ACTORS_CLEAR",
+   SELECT_NETWORK_MESSAGE_TAB: "SELECT_NETWORK_MESSAGE_TAB",
+   SIDEBAR_CLOSE: "SIDEBAR_CLOSE",
+   SHOW_OBJECT_IN_SIDEBAR: "SHOW_OBJECT_IN_SIDEBAR",
+   TIMESTAMPS_TOGGLE: "TIMESTAMPS_TOGGLE",
+ };
+ 
+ const prefs = {
+diff --git a/devtools/client/webconsole/new-console-output/new-console-output-wrapper.js b/devtools/client/webconsole/new-console-output/new-console-output-wrapper.js
+--- a/devtools/client/webconsole/new-console-output/new-console-output-wrapper.js
++++ b/devtools/client/webconsole/new-console-output/new-console-output-wrapper.js
+@@ -6,16 +6,18 @@
+ const { createElement, createFactory } = require("devtools/client/shared/vendor/react");
+ const dom = require("devtools/client/shared/vendor/react-dom-factories");
+ const ReactDOM = require("devtools/client/shared/vendor/react-dom");
+ const { Provider } = require("devtools/client/shared/vendor/react-redux");
+ 
+ const actions = require("devtools/client/webconsole/new-console-output/actions/index");
+ const { createContextMenu } = require("devtools/client/webconsole/new-console-output/utils/context-menu");
+ const { configureStore } = require("devtools/client/webconsole/new-console-output/store");
++const { isPacketPrivate } = require("devtools/client/webconsole/new-console-output/utils/messages");
++const { getAllMessagesById, getMessage } = require("devtools/client/webconsole/new-console-output/selectors/messages");
+ 
+ const EventEmitter = require("devtools/shared/event-emitter");
+ const ConsoleOutput = createFactory(require("devtools/client/webconsole/new-console-output/components/ConsoleOutput"));
+ const FilterBar = createFactory(require("devtools/client/webconsole/new-console-output/components/FilterBar"));
+ const SideBar = createFactory(require("devtools/client/webconsole/new-console-output/components/SideBar"));
+ 
+ let store = null;
+ 
+@@ -259,22 +261,68 @@ NewConsoleOutputWrapper.prototype = {
+     return promise;
+   },
+ 
+   dispatchMessagesAdd: function (messages) {
+     store.dispatch(actions.messagesAdd(messages));
+   },
+ 
+   dispatchMessagesClear: function () {
++    // We might still have pending message additions and updates when the clear action is
++    // triggered, so we need to flush them to make sure we don't have unexpected behavior
++    // in the ConsoleOutput.
+     this.queuedMessageAdds = [];
+     this.queuedMessageUpdates = [];
+     this.queuedRequestUpdates = [];
+     store.dispatch(actions.messagesClear());
+   },
+ 
++  dispatchPrivateMessagesClear: function () {
++    // We might still have pending private message additions when the private messages
++    // clear action is triggered. We need to remove any private-window-issued packets from
++    // the queue so they won't appear in the output.
++
++    // For (network) message updates, we need to check both messages queue and the state
++    // since we can receive updates even if the message isn't rendered yet.
++    const messages = [...getAllMessagesById(store.getState()).values()];
++    this.queuedMessageUpdates = this.queuedMessageUpdates.filter(({networkInfo}) => {
++      const { actor } = networkInfo;
++
++      const queuedNetworkMessage = this.queuedMessageAdds.find(p => p.actor === actor);
++      if (queuedNetworkMessage && isPacketPrivate(queuedNetworkMessage)) {
++        return false;
++      }
++
++      const requestMessage = messages.find(message => actor === message.actor);
++      if (requestMessage && requestMessage.private === true) {
++        return false;
++      }
++
++      return true;
++    });
++
++    // For (network) requests updates, we can check only the state, since there must be a
++    // user interaction to get an update (i.e. the network message is displayed and thus
++    // in the state).
++    this.queuedRequestUpdates = this.queuedRequestUpdates.filter(({id}) => {
++      const requestMessage = getMessage(store.getState(), id);
++      if (requestMessage && requestMessage.private === true) {
++        return false;
++      }
++
++      return true;
++    });
++
++    // Finally we clear the messages queue. This needs to be done here since we use it to
++    // clean the other queues.
++    this.queuedMessageAdds = this.queuedMessageAdds.filter(p => !isPacketPrivate(p));
++
++    store.dispatch(actions.privateMessagesClear());
++  },
++
+   dispatchTimestampsToggle: function (enabled) {
+     store.dispatch(actions.timestampsToggle(enabled));
+   },
+ 
+   dispatchMessageUpdate: function (message, res) {
+     // network-message-updated will emit when all the update message arrives.
+     // Since we can't ensure the order of the network update, we check
+     // that networkInfo.updates has all we need.
+diff --git a/devtools/client/webconsole/new-console-output/reducers/messages.js b/devtools/client/webconsole/new-console-output/reducers/messages.js
+--- a/devtools/client/webconsole/new-console-output/reducers/messages.js
++++ b/devtools/client/webconsole/new-console-output/reducers/messages.js
+@@ -192,21 +192,38 @@ function messages(state = MessageState()
+ 
+       return limitTopLevelMessageCount(newState, logLimit);
+ 
+     case constants.MESSAGES_CLEAR:
+       return MessageState({
+         // Store all actors from removed messages. This array is used by
+         // `releaseActorsEnhancer` to release all of those backend actors.
+         removedActors: [...state.messagesById.values()].reduce((res, msg) => {
+-          res.push(...getAllActorsInMessage(msg, state));
++          res.push(...getAllActorsInMessage(msg));
+           return res;
+         }, [])
+       });
+ 
++    case constants.PRIVATE_MESSAGES_CLEAR:
++      const removedIds = [];
++      for (const [id, message] of messagesById) {
++        if (message.private === true) {
++          removedIds.push(id);
++        }
++      }
++
++      // If there's no private messages, there's no need to change the state.
++      if (removedIds.length === 0) {
++        return state;
++      }
++
++      return removeMessagesFromState({
++        ...state,
++      }, removedIds);
++
+     case constants.MESSAGE_OPEN:
+       const openState = {...state};
+       openState.messagesUiById = [...messagesUiById, action.id];
+       let currMessage = messagesById.get(action.id);
+ 
+       // If the message is a group
+       if (isGroupType(currMessage.type)) {
+         // We want to make its children visible
+@@ -333,27 +350,44 @@ function messages(state = MessageState()
+         visibleMessages: messagesToShow,
+         filteredMessagesCount: filtered,
+       };
+   }
+ 
+   return state;
+ }
+ 
+-function getNewCurrentGroup(currentGroup, groupsById) {
+-  let newCurrentGroup = null;
+-  if (currentGroup) {
+-    // Retrieve the parent groups of the current group.
+-    let parents = groupsById.get(currentGroup);
+-    if (Array.isArray(parents) && parents.length > 0) {
+-      // If there's at least one parent, make the first one the new currentGroup.
+-      newCurrentGroup = parents[0];
++/**
++ * Returns the new current group id given the previous current group and the groupsById
++ * state property.
++ *
++ * @param {String} currentGroup: id of the current group
++ * @param {Map} groupsById
++ * @param {Array} ignoredIds: An array of ids which can't be the new current group.
++ * @returns {String|null} The new current group id, or null if there isn't one.
++ */
++function getNewCurrentGroup(currentGroup, groupsById, ignoredIds = []) {
++  if (!currentGroup) {
++    return null;
++  }
++
++  // Retrieve the parent groups of the current group.
++  let parents = groupsById.get(currentGroup);
++
++  // If there's at least one parent, make the first one the new currentGroup.
++  if (Array.isArray(parents) && parents.length > 0) {
++    // If the found group must be ignored, let's search for its parent.
++    if (ignoredIds.includes(parents[0])) {
++      return getNewCurrentGroup(parents[0], groupsById, ignoredIds);
+     }
++
++    return parents[0];
+   }
+-  return newCurrentGroup;
++
++  return null;
+ }
+ 
+ function getParentGroups(currentGroup, groupsById) {
+   let groups = [];
+   if (currentGroup) {
+     // If there is a current group, we add it as a parent
+     groups = [currentGroup];
+ 
+@@ -377,18 +411,16 @@ function limitTopLevelMessageCount(newSt
+     ? newState.messagesById.size
+     : getToplevelMessageCount(newState);
+ 
+   if (topLevelCount <= logLimit) {
+     return newState;
+   }
+ 
+   const removedMessagesId = [];
+-  const removedActors = [];
+-  let visibleMessages = [...newState.visibleMessages];
+ 
+   let cleaningGroup = false;
+   for (let [id, message] of newState.messagesById) {
+     // If we were cleaning a group and the current message does not have
+     // a groupId, we're done cleaning.
+     if (cleaningGroup === true && !message.groupId) {
+       cleaningGroup = false;
+     }
+@@ -405,82 +437,109 @@ function limitTopLevelMessageCount(newSt
+       cleaningGroup = true;
+     }
+ 
+     if (!message.groupId) {
+       topLevelCount--;
+     }
+ 
+     removedMessagesId.push(id);
+-    removedActors.push(...getAllActorsInMessage(message, newState));
++  }
++
++  return removeMessagesFromState(newState, removedMessagesId);
++}
+ 
++/**
++ * Clean the properties for a given state object and an array of removed messages ids.
++ * Be aware that this function MUTATE the `state` argument.
++ *
++ * @param {MessageState} state
++ * @param {Array} removedMessagesIds
++ * @returns {MessageState}
++ */
++function removeMessagesFromState(state, removedMessagesIds) {
++  if (!Array.isArray(removedMessagesIds) || removedMessagesIds.length === 0) {
++    return state;
++  }
++
++  const removedActors = [];
++  const visibleMessages = [...state.visibleMessages];
++  removedMessagesIds.forEach(id => {
+     const index = visibleMessages.indexOf(id);
+     if (index > -1) {
+       visibleMessages.splice(index, 1);
+     }
++
++    removedActors.push(...getAllActorsInMessage(state.messagesById.get(id)));
++  });
++
++  if (state.visibleMessages.length > visibleMessages.length) {
++    state.visibleMessages = visibleMessages;
+   }
+ 
+   if (removedActors.length > 0) {
+-    newState.removedActors =  newState.removedActors.concat(removedActors);
++    state.removedActors =  state.removedActors.concat(removedActors);
+   }
+ 
+-  if (newState.visibleMessages.length > visibleMessages.length) {
+-    newState.visibleMessages = visibleMessages;
+-  }
+-
+-  const isInRemovedId = id => removedMessagesId.includes(id);
+-  const mapHasRemovedIdKey = map => removedMessagesId.some(id => map.has(id));
++  const isInRemovedId = id => removedMessagesIds.includes(id);
++  const mapHasRemovedIdKey = map => removedMessagesIds.some(id => map.has(id));
+   const objectHasRemovedIdKey = obj => Object.keys(obj).findIndex(isInRemovedId) !== -1;
+ 
+   const cleanUpMap = map => {
+     const clonedMap = new Map(map);
+-    removedMessagesId.forEach(id => clonedMap.delete(id));
++    removedMessagesIds.forEach(id => clonedMap.delete(id));
+     return clonedMap;
+   };
+   const cleanUpObject = object => [...Object.entries(object)]
+     .reduce((res, [id, value]) => {
+       if (!isInRemovedId(id)) {
+         res[id] = value;
+       }
+       return res;
+     }, {});
+ 
+-  newState.messagesById = cleanUpMap(newState.messagesById);
++  state.messagesById = cleanUpMap(state.messagesById);
+ 
+-  if (newState.messagesUiById.find(isInRemovedId)) {
+-    newState.messagesUiById = newState.messagesUiById.filter(id => !isInRemovedId(id));
++  if (state.messagesUiById.find(isInRemovedId)) {
++    state.messagesUiById = state.messagesUiById.filter(id => !isInRemovedId(id));
++  }
++
++  if (isInRemovedId(state.currentGroup)) {
++    state.currentGroup =
++      getNewCurrentGroup(state.currentGroup, state.groupsById, removedMessagesIds);
+   }
+ 
+-  if (mapHasRemovedIdKey(newState.messagesTableDataById)) {
+-    newState.messagesTableDataById =
+-      cleanUpMap(newState.messagesTableDataById);
++  if (mapHasRemovedIdKey(state.messagesTableDataById)) {
++    state.messagesTableDataById = cleanUpMap(state.messagesTableDataById);
+   }
+-  if (mapHasRemovedIdKey(newState.groupsById)) {
+-    newState.groupsById = cleanUpMap(newState.groupsById);
++  if (mapHasRemovedIdKey(state.groupsById)) {
++    state.groupsById = cleanUpMap(state.groupsById);
+   }
+-  if (objectHasRemovedIdKey(newState.repeatById)) {
+-    newState.repeatById = cleanUpObject(newState.repeatById);
++  if (mapHasRemovedIdKey(state.groupsById)) {
++    state.groupsById = cleanUpMap(state.groupsById);
+   }
+ 
+-  if (objectHasRemovedIdKey(newState.networkMessagesUpdateById)) {
+-    newState.networkMessagesUpdateById =
+-      cleanUpObject(newState.networkMessagesUpdateById);
++  if (objectHasRemovedIdKey(state.repeatById)) {
++    state.repeatById = cleanUpObject(state.repeatById);
+   }
+ 
+-  return newState;
++  if (objectHasRemovedIdKey(state.networkMessagesUpdateById)) {
++    state.networkMessagesUpdateById = cleanUpObject(state.networkMessagesUpdateById);
++  }
++
++  return state;
+ }
+ 
+ /**
+  * Get an array of all the actors logged in a specific message.
+  *
+  * @param {Message} message: The message to get actors from.
+- * @param {Record} state: The redux state.
+  * @return {Array} An array containing all the actors logged in a message.
+  */
+-function getAllActorsInMessage(message, state) {
++function getAllActorsInMessage(message) {
+   const {
+     parameters,
+     messageText,
+   } = message;
+ 
+   let actors = [];
+   if (Array.isArray(parameters)) {
+     message.parameters.forEach(parameter => {
+diff --git a/devtools/client/webconsole/new-console-output/store.js b/devtools/client/webconsole/new-console-output/store.js
+--- a/devtools/client/webconsole/new-console-output/store.js
++++ b/devtools/client/webconsole/new-console-output/store.js
+@@ -13,16 +13,17 @@ const {
+ } = require("devtools/client/shared/vendor/redux");
+ const {
+   BATCH_ACTIONS
+ } = require("devtools/client/shared/redux/middleware/debounce");
+ const {
+   MESSAGE_OPEN,
+   MESSAGES_ADD,
+   MESSAGES_CLEAR,
++  PRIVATE_MESSAGES_CLEAR,
+   REMOVED_ACTORS_CLEAR,
+   NETWORK_MESSAGE_UPDATE,
+   PREFS,
+ } = require("devtools/client/webconsole/new-console-output/constants");
+ const { reducers } = require("./reducers/index");
+ const {
+   getMessage,
+   getAllMessagesUiById,
+@@ -139,17 +140,20 @@ function enableBatching() {
+  */
+ function enableActorReleaser(hud) {
+   return next => (reducer, initialState, enhancer) => {
+     function releaseActorsEnhancer(state, action) {
+       state = reducer(state, action);
+ 
+       let type = action.type;
+       let proxy = hud ? hud.proxy : null;
+-      if (proxy && ([MESSAGES_ADD, MESSAGES_CLEAR].includes(type))) {
++      if (
++        proxy &&
++        ([MESSAGES_ADD, MESSAGES_CLEAR, PRIVATE_MESSAGES_CLEAR].includes(type))
++      ) {
+         releaseActors(state.messages.removedActors, proxy);
+ 
+         // Reset `removedActors` in message reducer.
+         state = reducer(state, {
+           type: REMOVED_ACTORS_CLEAR
+         });
+       }
+ 
+diff --git a/devtools/client/webconsole/new-console-output/utils/messages.js b/devtools/client/webconsole/new-console-output/utils/messages.js
+--- a/devtools/client/webconsole/new-console-output/utils/messages.js
++++ b/devtools/client/webconsole/new-console-output/utils/messages.js
+@@ -383,16 +383,26 @@ function isGroupType(type) {
+   ].includes(type);
+ }
+ 
+ function getInitialMessageCountForViewport(win) {
+   const minMessageHeight = 20;
+   return Math.ceil(win.innerHeight / minMessageHeight);
+ }
+ 
++function isPacketPrivate(packet) {
++  return (
++    packet.private === true ||
++    (packet.message && packet.message.private === true) ||
++    (packet.pageError && packet.pageError.private === true) ||
++    (packet.networkEvent && packet.networkEvent.private === true)
++  );
++}
++
+ module.exports = {
+   getInitialMessageCountForViewport,
+   isGroupType,
++  isPacketPrivate,
+   l10n,
+   prepareMessage,
+   // Export for use in testing.
+   getRepeatId,
+ };

+ 230 - 0
mozilla-release/patches/1307928-3-60a1.patch

@@ -0,0 +1,230 @@
+# HG changeset patch
+# User Nicolas Chevobbe <nchevobbe@mozilla.com>
+# Date 1519816541 -3600
+# Node ID 991e19165a11c3a45ae118d72d88a4e83e55684d
+# Parent  f43ddae6331a7e5b544f914b6dea8787671ac117
+Bug 1307928 - Add mocha tests for private messages; r=bgrins.
+
+Those ensures that we do handle them properly and that the state
+is cleaned up as expected when they are removed.
+
+MozReview-Commit-ID: 9PNuaHcFxSv
+
+diff --git a/devtools/client/webconsole/new-console-output/test/store/private-messages.test.js b/devtools/client/webconsole/new-console-output/test/store/private-messages.test.js
+new file mode 100644
+--- /dev/null
++++ b/devtools/client/webconsole/new-console-output/test/store/private-messages.test.js
+@@ -0,0 +1,213 @@
++/* This Source Code Form is subject to the terms of the Mozilla Public
++ * License, v. 2.0. If a copy of the MPL was not distributed with this
++ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
++
++"use strict";
++
++const {
++  getAllMessagesUiById,
++  getAllMessagesTableDataById,
++  getAllNetworkMessagesUpdateById,
++  getAllRepeatById,
++  getCurrentGroup,
++  getGroupsById,
++  getAllMessagesById,
++  getVisibleMessages,
++} = require("devtools/client/webconsole/new-console-output/selectors/messages");
++const {
++  clonePacket,
++  getFirstMessage,
++  getLastMessage,
++  setupActions,
++  setupStore,
++} = require("devtools/client/webconsole/new-console-output/test/helpers");
++const { stubPackets } = require("devtools/client/webconsole/new-console-output/test/fixtures/stubs/index");
++
++const expect = require("expect");
++
++function getPrivatePacket(key) {
++  const packet = clonePacket(stubPackets.get(key));
++  if (packet.message) {
++    packet.message.private = true;
++  }
++  if (Object.getOwnPropertyNames(packet).includes("private")) {
++    packet.private = true;
++  }
++  return packet;
++}
++
++describe("private messages", () => {
++  let actions;
++  before(() => {
++    actions = setupActions();
++  });
++
++  it("removes private messages on PRIVATE_MESSAGES_CLEAR action", () => {
++    const { dispatch, getState } = setupStore();
++
++    dispatch(actions.messagesAdd([
++      getPrivatePacket("console.trace()"),
++      stubPackets.get("console.log('mymap')"),
++      getPrivatePacket("console.log(undefined)"),
++      getPrivatePacket("GET request"),
++    ]));
++
++    let state = getState();
++    const messages = getAllMessagesById(state);
++    expect(messages.size).toBe(4);
++
++    dispatch(actions.privateMessagesClear());
++
++    state = getState();
++    expect(getAllMessagesById(state).size).toBe(1);
++    expect(getVisibleMessages(state).length).toBe(1);
++  });
++
++  it("cleans messagesUiById on PRIVATE_MESSAGES_CLEAR action", () => {
++    const { dispatch, getState } = setupStore();
++
++    dispatch(actions.messagesAdd([
++      getPrivatePacket("console.trace()"),
++      stubPackets.get("console.trace()"),
++    ]));
++
++    let state = getState();
++    expect(getAllMessagesUiById(state).length).toBe(2);
++
++    dispatch(actions.privateMessagesClear());
++
++    state = getState();
++    expect(getAllMessagesUiById(state).length).toBe(1);
++  });
++
++  it("cleans repeatsById on PRIVATE_MESSAGES_CLEAR action", () => {
++    const { dispatch, getState } = setupStore();
++
++    dispatch(actions.messagesAdd([
++      getPrivatePacket("console.log(undefined)"),
++      getPrivatePacket("console.log(undefined)"),
++      stubPackets.get("console.log(undefined)"),
++      stubPackets.get("console.log(undefined)"),
++    ]));
++
++    let state = getState();
++    expect(getAllRepeatById(state)).toEqual({
++      [getFirstMessage(state).id]: 2,
++      [getLastMessage(state).id]: 2,
++    });
++
++    dispatch(actions.privateMessagesClear());
++
++    state = getState();
++    expect(Object.keys(getAllRepeatById(state)).length).toBe(1);
++    expect(getAllRepeatById(state)).toEqual({
++      [getFirstMessage(state).id]: 2,
++    });
++  });
++
++  it("cleans messagesTableDataById on PRIVATE_MESSAGES_CLEAR action", () => {
++    const { dispatch, getState } = setupStore();
++
++    dispatch(actions.messagesAdd([
++      getPrivatePacket("console.table(['a', 'b', 'c'])"),
++      stubPackets.get("console.table(['a', 'b', 'c'])"),
++    ]));
++
++    const privateTableData = Symbol("privateTableData");
++    const publicTableData = Symbol("publicTableData");
++    dispatch(actions.messageTableDataReceive(
++      getFirstMessage(getState()).id,
++      privateTableData
++    ));
++    dispatch(actions.messageTableDataReceive(
++      getLastMessage(getState()).id,
++      publicTableData
++    ));
++
++    let state = getState();
++    expect(getAllMessagesTableDataById(state).size).toBe(2);
++
++    dispatch(actions.privateMessagesClear());
++
++    state = getState();
++    expect(getAllMessagesTableDataById(state).size).toBe(1);
++    expect(getAllMessagesTableDataById(state).get(getFirstMessage(getState()).id))
++      .toBe(publicTableData);
++  });
++
++  it("cleans group properties on PRIVATE_MESSAGES_CLEAR action", () => {
++    const { dispatch, getState } = setupStore();
++    dispatch(actions.messagesAdd([
++      stubPackets.get("console.group()"),
++      getPrivatePacket("console.group()"),
++    ]));
++
++    let state = getState();
++    const publicMessageId = getFirstMessage(state).id;
++    const privateMessageId = getLastMessage(state).id;
++    expect(getCurrentGroup(state)).toBe(privateMessageId);
++    expect(getGroupsById(state).size).toBe(2);
++
++    dispatch(actions.privateMessagesClear());
++
++    state = getState();
++    expect(getGroupsById(state).size).toBe(1);
++    expect(getGroupsById(state).has(publicMessageId)).toBe(true);
++    expect(getCurrentGroup(state)).toBe(publicMessageId);
++  });
++
++  it("cleans networkMessagesUpdateById on PRIVATE_MESSAGES_CLEAR action", () => {
++    const { dispatch, getState } = setupStore();
++    dispatch(actions.messagesAdd([
++      stubPackets.get("GET request"),
++      getPrivatePacket("XHR GET request"),
++    ]));
++
++    let state = getState();
++    const publicMessageId = getFirstMessage(state).id;
++    const privateMessageId = getLastMessage(state).id;
++
++    dispatch(actions.networkUpdateRequest(publicMessageId));
++    dispatch(actions.networkUpdateRequest(privateMessageId));
++
++    let networkUpdates = getAllNetworkMessagesUpdateById(getState());
++    expect(Object.keys(networkUpdates)).toEqual([publicMessageId, privateMessageId]);
++
++    dispatch(actions.privateMessagesClear());
++
++    networkUpdates = getAllNetworkMessagesUpdateById(getState());
++    expect(Object.keys(networkUpdates)).toEqual([publicMessageId]);
++  });
++
++  it("releases private backend actors on PRIVATE_MESSAGES_CLEAR action", () => {
++    let releasedActors = [];
++    const { dispatch, getState } = setupStore([], {
++      hud: {
++        proxy: {
++          releaseActor: (actor) => {
++            releasedActors.push(actor);
++          }
++        }
++      }
++    });
++
++    // Add a log message.
++    dispatch(actions.messagesAdd([
++      stubPackets.get("console.log('myarray', ['red', 'green', 'blue'])"),
++      getPrivatePacket("console.log('mymap')"),
++    ]));
++
++    const firstMessage = getFirstMessage(getState());
++    const firstMessageActor = firstMessage.parameters[1].actor;
++
++    const lastMessage = getLastMessage(getState());
++    const lastMessageActor = lastMessage.parameters[1].actor;
++
++    // Kick-off the actor release.
++    dispatch(actions.privateMessagesClear());
++
++    expect(releasedActors.length).toBe(1);
++    expect(releasedActors).toInclude(lastMessageActor);
++    expect(releasedActors).toNotInclude(firstMessageActor);
++  });
++});

+ 239 - 0
mozilla-release/patches/1307928-4-60a1.patch

@@ -0,0 +1,239 @@
+# HG changeset patch
+# User Nicolas Chevobbe <nchevobbe@mozilla.com>
+# Date 1520351585 -3600
+# Node ID 9525342545388cece89c1c0ddd04d8147af29c9a
+# Parent  c16fa7de2f64094f10ed668fe3f41e8e5df27225
+Bug 1307928 - Add mocha tests for NewConsoleOutputWrapper queues; r=bgrins.
+
+This required to add a couple new cases for require-hacker.
+
+MozReview-Commit-ID: 9Qon1PNjdF7
+
+diff --git a/devtools/client/webconsole/new-console-output/test/components/new-console-output-wrapper.test.js b/devtools/client/webconsole/new-console-output/test/components/new-console-output-wrapper.test.js
+new file mode 100644
+--- /dev/null
++++ b/devtools/client/webconsole/new-console-output/test/components/new-console-output-wrapper.test.js
+@@ -0,0 +1,122 @@
++/* This Source Code Form is subject to the terms of the Mozilla Public
++ * License, v. 2.0. If a copy of the MPL was not distributed with this
++ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
++
++"use strict";
++
++// Test utils.
++const expect = require("expect");
++const { stubPackets } =
++  require("devtools/client/webconsole/new-console-output/test/fixtures/stubs/index");
++const {
++  getFirstMessage,
++  getLastMessage,
++  getMessageAt,
++  getPrivatePacket,
++} = require("devtools/client/webconsole/new-console-output/test/helpers");
++
++const NewConsoleOutputWrapper =
++  require("devtools/client/webconsole/new-console-output/new-console-output-wrapper");
++const { messagesAdd } =
++  require("devtools/client/webconsole/new-console-output/actions/messages");
++
++function getNewConsoleOutputWrapper() {
++  const jsterm = {
++    hud: {
++      proxy: {
++        releaseActor: () => {}
++      }
++    }
++  };
++  return new NewConsoleOutputWrapper(null, jsterm);
++}
++
++describe("NewConsoleOutputWrapper", () => {
++  it("clears queues when dispatchMessagesClear is called", () => {
++    const ncow = getNewConsoleOutputWrapper();
++    ncow.queuedMessageAdds.push({fakePacket: "message"});
++    ncow.queuedMessageUpdates.push({fakePacket: "message-update"});
++    ncow.queuedRequestUpdates.push({fakePacket: "request-update"});
++
++    ncow.dispatchMessagesClear();
++
++    expect(ncow.queuedMessageAdds.length).toBe(0);
++    expect(ncow.queuedMessageUpdates.length).toBe(0);
++    expect(ncow.queuedRequestUpdates.length).toBe(0);
++  });
++
++  it("removes private packets from message queue on dispatchPrivateMessagesClear", () => {
++    const ncow = getNewConsoleOutputWrapper();
++
++    const publicLog = stubPackets.get("console.log('mymap')");
++    ncow.queuedMessageAdds.push(
++      getPrivatePacket("console.trace()"),
++      publicLog,
++      getPrivatePacket("XHR POST request"),
++    );
++
++    ncow.dispatchPrivateMessagesClear();
++
++    expect(ncow.queuedMessageAdds).toEqual([publicLog]);
++  });
++
++  it("removes private packets from network update queue on dispatchPrivateMessagesClear",
++    () => {
++      const ncow = getNewConsoleOutputWrapper();
++
++      const postId = Symbol();
++      const getId = Symbol();
++
++      // Add messages in the store to make sure that update to private requests are
++      // removed from the queue.
++      ncow.getStore().dispatch(messagesAdd([
++        stubPackets.get("GET request"),
++        {...getPrivatePacket("XHR GET request"), actor: getId},
++      ]));
++
++      // Add packet to the message queue to make sure that update to private requests are
++      // removed from the queue.
++      ncow.queuedMessageAdds.push(
++        {...getPrivatePacket("XHR POST request"), actor: postId},
++      );
++
++      const publicNetworkUpdate = stubPackets.get("GET request update");
++      ncow.queuedMessageUpdates.push(
++        publicNetworkUpdate,
++        {...getPrivatePacket("XHR GET request update"), networkInfo: {actor: getId}},
++        {...getPrivatePacket("XHR POST request update"), networkInfo: {actor: postId}},
++      );
++
++      ncow.dispatchPrivateMessagesClear();
++
++      expect(ncow.queuedMessageUpdates.length).toBe(1);
++      expect(ncow.queuedMessageUpdates).toEqual([publicNetworkUpdate]);
++    });
++
++  it("removes private packets from network request queue on dispatchPrivateMessagesClear",
++    () => {
++      const ncow = getNewConsoleOutputWrapper();
++
++      ncow.getStore().dispatch(messagesAdd([
++        stubPackets.get("GET request"),
++        getPrivatePacket("XHR GET request"),
++        getPrivatePacket("XHR POST request"),
++      ]));
++
++      const state = ncow.getStore().getState();
++      const publicId = getFirstMessage(state).id;
++      const privateXhrGetId = getMessageAt(state, 1).id;
++      const privateXhrPostId = getLastMessage(state).id;
++      ncow.queuedRequestUpdates.push(
++        {id: publicId},
++        {id: privateXhrGetId},
++        {id: privateXhrPostId},
++      );
++      // ncow.queuedRequestUpdates.push({fakePacket: "request-update"});
++
++      ncow.dispatchPrivateMessagesClear();
++
++      expect(ncow.queuedRequestUpdates.length).toBe(1);
++      expect(ncow.queuedRequestUpdates).toEqual([{id: publicId}]);
++    });
++});
+diff --git a/devtools/client/webconsole/new-console-output/test/helpers.js b/devtools/client/webconsole/new-console-output/test/helpers.js
+--- a/devtools/client/webconsole/new-console-output/test/helpers.js
++++ b/devtools/client/webconsole/new-console-output/test/helpers.js
+@@ -107,19 +107,31 @@ function getFiltersPrefs() {
+ function clearPrefs() {
+   [
+     "devtools.hud.loglimit",
+     ...Object.values(PREFS.FILTER),
+     ...Object.values(PREFS.UI),
+   ].forEach(prefsService.clearUserPref);
+ }
+ 
++function getPrivatePacket(key) {
++  const packet = clonePacket(stubPackets.get(key));
++  if (packet.message) {
++    packet.message.private = true;
++  }
++  if (Object.getOwnPropertyNames(packet).includes("private")) {
++    packet.private = true;
++  }
++  return packet;
++}
++
+ module.exports = {
+   clearPrefs,
+   clonePacket,
+   getFiltersPrefs,
+   getFirstMessage,
+   getLastMessage,
+   getMessageAt,
++  getPrivatePacket,
+   prefsService,
+   setupActions,
+   setupStore,
+ };
+diff --git a/devtools/client/webconsole/new-console-output/test/mocha-test-setup.js b/devtools/client/webconsole/new-console-output/test/mocha-test-setup.js
+--- a/devtools/client/webconsole/new-console-output/test/mocha-test-setup.js
++++ b/devtools/client/webconsole/new-console-output/test/mocha-test-setup.js
+@@ -53,16 +53,20 @@ requireHacker.global_hook("default", (pa
+         "devtools/client/webconsole/new-console-output/test/fixtures/PluralForm");
+     case "Services":
+     case "Services.default":
+       return `module.exports = require("devtools-modules/src/Services")`;
+     case "devtools/shared/client/object-client":
+       return `() => {}`;
+     case "devtools/client/netmonitor/src/components/TabboxPanel":
+       return "{}";
++    case "devtools/client/webconsole/new-console-output/utils/context-menu":
++      return "{}";
++    case "devtools/shared/event-emitter":
++      return `module.exports = require("devtools-modules/src/utils/event-emitter")`;
+   }
+ 
+   // We need to rewrite all the modules assuming the root is mozilla-central and give them
+   // an absolute path.
+   if (path.startsWith("devtools/")) {
+     return getModule(path);
+   }
+ 
+diff --git a/devtools/client/webconsole/new-console-output/test/store/private-messages.test.js b/devtools/client/webconsole/new-console-output/test/store/private-messages.test.js
+--- a/devtools/client/webconsole/new-console-output/test/store/private-messages.test.js
++++ b/devtools/client/webconsole/new-console-output/test/store/private-messages.test.js
+@@ -10,37 +10,26 @@ const {
+   getAllNetworkMessagesUpdateById,
+   getAllRepeatById,
+   getCurrentGroup,
+   getGroupsById,
+   getAllMessagesById,
+   getVisibleMessages,
+ } = require("devtools/client/webconsole/new-console-output/selectors/messages");
+ const {
+-  clonePacket,
+   getFirstMessage,
+   getLastMessage,
++  getPrivatePacket,
+   setupActions,
+   setupStore,
+ } = require("devtools/client/webconsole/new-console-output/test/helpers");
+ const { stubPackets } = require("devtools/client/webconsole/new-console-output/test/fixtures/stubs/index");
+ 
+ const expect = require("expect");
+ 
+-function getPrivatePacket(key) {
+-  const packet = clonePacket(stubPackets.get(key));
+-  if (packet.message) {
+-    packet.message.private = true;
+-  }
+-  if (Object.getOwnPropertyNames(packet).includes("private")) {
+-    packet.private = true;
+-  }
+-  return packet;
+-}
+-
+ describe("private messages", () => {
+   let actions;
+   before(() => {
+     actions = setupActions();
+   });
+ 
+   it("removes private messages on PRIVATE_MESSAGES_CLEAR action", () => {
+     const { dispatch, getState } = setupStore();

+ 31 - 0
mozilla-release/patches/1335316-60a1.patch

@@ -0,0 +1,31 @@
+# HG changeset patch
+# User abhinav <abhinav.koppula@gmail.com>
+# Date 1516388638 -19800
+# Node ID d74298d2f24174aa7fe52385ac507b8ad4eb9179
+# Parent  99ad436017fd3f04d7ae53b1857b7d662e307cec
+Bug 1335316 - Include URL parameters in network request logs; r=Honza
+
+MozReview-Commit-ID: 4NqKiX46vqz
+
+diff --git a/devtools/client/webconsole/new-console-output/components/message-types/NetworkEventMessage.js b/devtools/client/webconsole/new-console-output/components/message-types/NetworkEventMessage.js
+--- a/devtools/client/webconsole/new-console-output/components/message-types/NetworkEventMessage.js
++++ b/devtools/client/webconsole/new-console-output/components/message-types/NetworkEventMessage.js
+@@ -102,17 +102,17 @@ function NetworkEventMessage({
+   };
+ 
+   // Message body components.
+   const method = dom.span({className: "method" }, request.method);
+   const xhr = isXHR
+     ? dom.span({ className: "xhr" }, l10n.getStr("webConsoleXhrIndicator"))
+     : null;
+   const requestUrl = dom.a({ className: "url", title: request.url, onClick: toggle },
+-    request.url.replace(/\?.+/, ""));
++    request.url);
+   const statusBody = statusInfo
+     ? dom.a({ className: "status", onClick: toggle }, statusInfo)
+     : null;
+ 
+   const messageBody = [method, xhr, requestUrl, statusBody];
+ 
+   // API consumed by Net monitor UI components. Most of the method
+   // are not needed in context of the Console panel (atm) and thus

+ 6 - 6
mozilla-release/patches/1382606-60a1.patch

@@ -2,7 +2,7 @@
 # User Nicolas Chevobbe <nchevobbe@mozilla.com>
 # Date 1519373436 -3600
 # Node ID 8d249a26e23a3edef78b1ecf31d4f88b7b81b0b2
-# Parent  4c493400d10f96c5c53555f2a1a8c873d050fa98
+# Parent  158708257941327328382db836e9a5acb2ea7ecf
 Bug 1382606 - Switch webconsole to new event-emitter; r=Honza.
 
 MozReview-Commit-ID: HBogPeOI7WM
@@ -157,7 +157,7 @@ diff --git a/devtools/client/webconsole/new-console-output/test/chrome/test_rend
 +++ b/devtools/client/webconsole/new-console-output/test/chrome/test_render_perf.html
 @@ -23,17 +23,17 @@ const NUM_MESSAGES = 4000;
  const NUM_STREAMING = 100;
- Cu.import("resource://gre/modules/FileUtils.jsm");
+ ChromeUtils.import("resource://gre/modules/FileUtils.jsm");
  const Services = browserRequire("Services");
  Services.prefs.setIntPref("devtools.hud.loglimit", NUM_MESSAGES);
  const NewConsoleOutputWrapper = browserRequire(
@@ -262,15 +262,15 @@ diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browse
 diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/head.js b/devtools/client/webconsole/new-console-output/test/mochitest/head.js
 --- a/devtools/client/webconsole/new-console-output/test/mochitest/head.js
 +++ b/devtools/client/webconsole/new-console-output/test/mochitest/head.js
-@@ -77,17 +77,17 @@ async function openNewTabAndConsole(url,
+@@ -103,17 +103,17 @@ function logAllStoreChanges(hud) {
   *        - messages: Array[Object]. An array of messages to match.
              Current supported options:
-  *            - text: Exact text match in .message-body
+  *            - text: Partial text match in .message-body
   */
  function waitForMessages({ hud, messages }) {
    return new Promise(resolve => {
-     let numMatched = 0;
-     let receivedLog = hud.ui.on("new-messages",
+     const matchedMessages = [];
+     hud.ui.on("new-messages",
 -      function messagesReceived(e, newMessages) {
 +      function messagesReceived(newMessages) {
          for (let message of messages) {

+ 893 - 0
mozilla-release/patches/1382609-60a1.patch

@@ -0,0 +1,893 @@
+# HG changeset patch
+# User Nicolas Chevobbe <nchevobbe@mozilla.com>
+# Date 1519718816 -3600
+# Node ID 784928adcf87fadbbbcfc2a28345d94b6cffb31c
+# Parent  b47ef99804aefe96f2ec8d8eee900378594ee681
+Bug 1382609 - Remove old-event-emitter usage from devtools/server; r=pbro.
+
+MozReview-Commit-ID: 3B3slS3EPYn
+
+diff --git a/devtools/client/framework/ToolboxProcess.jsm b/devtools/client/framework/ToolboxProcess.jsm
+--- a/devtools/client/framework/ToolboxProcess.jsm
++++ b/devtools/client/framework/ToolboxProcess.jsm
+@@ -329,17 +329,17 @@ BrowserToolboxProcess.prototype = {
+   /**
+    * Called upon receiving the connectionchange event from a debuggerServer.
+    *
+    * @param {String} what
+    *        Type of connection change (can be either 'opened' or 'closed').
+    * @param {DebuggerServerConnection} connection
+    *        The connection that was opened or closed.
+    */
+-  _onConnectionChange: function (evt, what, connection) {
++  _onConnectionChange: function (what, connection) {
+     let wrappedJSObject = { what, connection };
+     Services.obs.notifyObservers({ wrappedJSObject }, "toolbox-connection-change");
+   },
+ 
+   /**
+    * Closes the remote debugging server and kills the toolbox process.
+    */
+   close: async function () {
+diff --git a/devtools/server/actors/highlighters.js b/devtools/server/actors/highlighters.js
+--- a/devtools/server/actors/highlighters.js
++++ b/devtools/server/actors/highlighters.js
+@@ -2,17 +2,17 @@
+  * License, v. 2.0. If a copy of the MPL was not distributed with this
+  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+ 
+ "use strict";
+ 
+ const { Ci, Cu } = require("chrome");
+ 
+ const { XPCOMUtils } = require("resource://gre/modules/XPCOMUtils.jsm");
+-const EventEmitter = require("devtools/shared/old-event-emitter");
++const EventEmitter = require("devtools/shared/event-emitter");
+ const protocol = require("devtools/shared/protocol");
+ const Services = require("Services");
+ const { highlighterSpec, customHighlighterSpec } = require("devtools/shared/specs/highlighters");
+ 
+ loader.lazyRequireGetter(this, "isWindowIncluded", "devtools/shared/layout/utils", true);
+ loader.lazyRequireGetter(this, "isXUL", "devtools/server/actors/highlighters/utils/markup", true);
+ loader.lazyRequireGetter(this, "SimpleOutlineHighlighter", "devtools/server/actors/highlighters/simple-outline", true);
+ loader.lazyRequireGetter(this, "BoxModelHighlighter", "devtools/server/actors/highlighters/box-model", true);
+@@ -512,17 +512,17 @@ exports.CustomHighlighterActor = protoco
+     if (this._highlighter) {
+       this._highlighter.hide();
+     }
+   },
+ 
+   /**
+    * Upon receiving an event from the highlighter, forward it to the client.
+    */
+-  _onHighlighterEvent: function (type, data) {
++  _onHighlighterEvent: function (data) {
+     this.emit("highlighter-event", data);
+   },
+ 
+   /**
+    * Kill this actor. This method is called automatically just before the actor
+    * is destroyed.
+    */
+   finalize: function () {
+diff --git a/devtools/server/actors/highlighters/auto-refresh.js b/devtools/server/actors/highlighters/auto-refresh.js
+--- a/devtools/server/actors/highlighters/auto-refresh.js
++++ b/devtools/server/actors/highlighters/auto-refresh.js
+@@ -1,16 +1,16 @@
+ /* This Source Code Form is subject to the terms of the Mozilla Public
+  * License, v. 2.0. If a copy of the MPL was not distributed with this
+  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+ 
+ "use strict";
+ 
+ const { Cu } = require("chrome");
+-const EventEmitter = require("devtools/shared/old-event-emitter");
++const EventEmitter = require("devtools/shared/event-emitter");
+ const { isNodeValid } = require("./utils/markup");
+ const { getAdjustedQuads, getWindowDimensions } = require("devtools/shared/layout/utils");
+ 
+ // Note that the order of items in this array is important because it is used
+ // for drawing the BoxModelHighlighter's path elements correctly.
+ const BOX_MODEL_REGIONS = ["margin", "border", "padding", "content"];
+ const QUADS_PROPS = ["p1", "p2", "p3", "p4", "bounds"];
+ 
+diff --git a/devtools/server/actors/highlighters/eye-dropper.js b/devtools/server/actors/highlighters/eye-dropper.js
+--- a/devtools/server/actors/highlighters/eye-dropper.js
++++ b/devtools/server/actors/highlighters/eye-dropper.js
+@@ -6,17 +6,17 @@
+ // Eye-dropper tool. This is implemented as a highlighter so it can be displayed in the
+ // content page.
+ // It basically displays a magnifier that tracks mouse moves and shows a magnified version
+ // of the page. On click, it samples the color at the pixel being hovered.
+ 
+ const {Ci, Cc} = require("chrome");
+ const {CanvasFrameAnonymousContentHelper, createNode} = require("./utils/markup");
+ const Services = require("Services");
+-const EventEmitter = require("devtools/shared/old-event-emitter");
++const EventEmitter = require("devtools/shared/event-emitter");
+ const {rgbToHsl, rgbToColorName} = require("devtools/shared/css/color").colorUtils;
+ const {getCurrentZoom, getFrameOffsets} = require("devtools/shared/layout/utils");
+ 
+ loader.lazyGetter(this, "clipboardHelper",
+   () => Cc["@mozilla.org/widget/clipboardhelper;1"].getService(Ci.nsIClipboardHelper));
+ loader.lazyGetter(this, "l10n",
+   () => Services.strings.createBundle("chrome://devtools-shared/locale/eyedropper.properties"));
+ 
+diff --git a/devtools/server/actors/highlighters/shapes.js b/devtools/server/actors/highlighters/shapes.js
+--- a/devtools/server/actors/highlighters/shapes.js
++++ b/devtools/server/actors/highlighters/shapes.js
+@@ -21,17 +21,17 @@ const {
+   apply,
+   translate,
+   multiply,
+   scale,
+   rotate,
+   changeMatrixBase,
+   getBasis
+ } = require("devtools/shared/layout/dom-matrix-2d");
+-const EventEmitter = require("devtools/shared/old-event-emitter");
++const EventEmitter = require("devtools/shared/event-emitter");
+ const { getCSSStyleRules } = require("devtools/shared/inspector/css-logic");
+ 
+ const BASE_MARKER_SIZE = 5;
+ // the width of the area around highlighter lines that can be clicked, in px
+ const LINE_CLICK_WIDTH = 5;
+ const ROTATE_LINE_LENGTH = 50;
+ const DOM_EVENTS = ["mousedown", "mousemove", "mouseup", "dblclick"];
+ const _dragging = Symbol("shapes/dragging");
+diff --git a/devtools/server/actors/highlighters/utils/markup.js b/devtools/server/actors/highlighters/utils/markup.js
+--- a/devtools/server/actors/highlighters/utils/markup.js
++++ b/devtools/server/actors/highlighters/utils/markup.js
+@@ -298,17 +298,17 @@ CanvasFrameAnonymousContentHelper.protot
+ 
+   /**
+    * The "window-ready" event can be triggered when:
+    *   - a new window is created
+    *   - a window is unfrozen from bfcache
+    *   - when first attaching to a page
+    *   - when swapping frame loaders (moving tabs, toggling RDM)
+    */
+-  _onWindowReady(e, {isTopLevel}) {
++  _onWindowReady({isTopLevel}) {
+     if (isTopLevel) {
+       this._removeAllListeners();
+       this.elements.clear();
+       this._insert();
+       this.anonymousContentDocument = this.highlighterEnv.document;
+     }
+   },
+ 
+diff --git a/devtools/server/actors/inspector/inspector.js b/devtools/server/actors/inspector/inspector.js
+--- a/devtools/server/actors/inspector/inspector.js
++++ b/devtools/server/actors/inspector/inspector.js
+@@ -301,16 +301,16 @@ exports.InspectorActor = protocol.ActorC
+     // SVG documents do not render the canvasFrame (see Bug 1157592).
+     if (ns === SVG_NS) {
+       return false;
+     }
+ 
+     return true;
+   },
+ 
+-  _onColorPicked: function (e, color) {
++  _onColorPicked: function (color) {
+     this.emit("color-picked", color);
+   },
+ 
+   _onColorPickCanceled: function () {
+     this.emit("color-pick-canceled");
+   }
+ });
+diff --git a/devtools/server/actors/performance.js b/devtools/server/actors/performance.js
+--- a/devtools/server/actors/performance.js
++++ b/devtools/server/actors/performance.js
+@@ -38,23 +38,42 @@ var PerformanceActor = ActorClassWithSpe
+       withGCEvents: true,
+       withDocLoadingEvents: true,
+       withAllocations: true,
+     },
+   },
+ 
+   initialize: function (conn, tabActor) {
+     Actor.prototype.initialize.call(this, conn);
+-    this._onRecorderEvent = this._onRecorderEvent.bind(this);
++
++    this._onRecordingStarted = this._onRecordingStarted.bind(this);
++    this._onRecordingStopping = this._onRecordingStopping.bind(this);
++    this._onRecordingStopped = this._onRecordingStopped.bind(this);
++    this._onProfilerStatus = this._onProfilerStatus.bind(this);
++    this._onTimelineData = this._onTimelineData.bind(this);
++    this._onConsoleProfileStart = this._onConsoleProfileStart.bind(this);
++
+     this.bridge = new PerformanceRecorder(conn, tabActor);
+-    this.bridge.on("*", this._onRecorderEvent);
++
++    this.bridge.on("recording-started", this._onRecordingStarted);
++    this.bridge.on("recording-stopping", this._onRecordingStopping);
++    this.bridge.on("recording-stopped", this._onRecordingStopped);
++    this.bridge.on("profiler-status", this._onProfilerStatus);
++    this.bridge.on("timeline-data", this._onTimelineData);
++    this.bridge.on("console-profile-start", this._onConsoleProfileStart);
+   },
+ 
+   destroy: function () {
+-    this.bridge.off("*", this._onRecorderEvent);
++    this.bridge.off("recording-started", this._onRecordingStarted);
++    this.bridge.off("recording-stopping", this._onRecordingStopping);
++    this.bridge.off("recording-stopped", this._onRecordingStopped);
++    this.bridge.off("profiler-status", this._onProfilerStatus);
++    this.bridge.off("timeline-data", this._onTimelineData);
++    this.bridge.off("console-profile-start", this._onConsoleProfileStart);
++
+     this.bridge.destroy();
+     Actor.prototype.destroy.call(this);
+   },
+ 
+   connect: function (config) {
+     this.bridge.connect({ systemClient: config.systemClient });
+     return { traits: this.traits };
+   },
+@@ -79,17 +98,41 @@ var PerformanceActor = ActorClassWithSpe
+   isRecording: actorBridgeWithSpec("isRecording"),
+   getRecordings: actorBridgeWithSpec("getRecordings"),
+   getConfiguration: actorBridgeWithSpec("getConfiguration"),
+   setProfilerStatusInterval: actorBridgeWithSpec("setProfilerStatusInterval"),
+ 
+   /**
+    * Filter which events get piped to the front.
+    */
+-  _onRecorderEvent: function (eventName, ...data) {
++  _onRecordingStarted: function (...data) {
++    this._onRecorderEvent("recording-started", data);
++  },
++
++  _onRecordingStopping: function (...data) {
++    this._onRecorderEvent("recording-stopping", data);
++  },
++
++  _onRecordingStopped: function (...data) {
++    this._onRecorderEvent("recording-stopped", data);
++  },
++
++  _onProfilerStatus: function (...data) {
++    this._onRecorderEvent("profiler-status", data);
++  },
++
++  _onTimelineData: function (...data) {
++    this._onRecorderEvent("timeline-data", data);
++  },
++
++  _onConsoleProfileStart: function (...data) {
++    this._onRecorderEvent("console-profile-start", data);
++  },
++
++  _onRecorderEvent: function (eventName, data) {
+     // If this is a recording state change, call
+     // a method on the related PerformanceRecordingActor so it can
+     // update its internal state.
+     if (RECORDING_STATE_CHANGE_EVENTS.has(eventName)) {
+       let recording = data[0];
+       let extraData = data[1];
+       recording._setState(eventName, extraData);
+     }
+diff --git a/devtools/server/actors/reflow.js b/devtools/server/actors/reflow.js
+--- a/devtools/server/actors/reflow.js
++++ b/devtools/server/actors/reflow.js
+@@ -22,17 +22,17 @@
+  * - Dedicated observers: There's only one of them for now: ReflowObserver which
+  *   listens to reflow events via the docshell,
+  *   These dedicated classes are used by the LayoutChangesObserver.
+  */
+ 
+ const {Ci} = require("chrome");
+ const {XPCOMUtils} = require("resource://gre/modules/XPCOMUtils.jsm");
+ const protocol = require("devtools/shared/protocol");
+-const EventEmitter = require("devtools/shared/old-event-emitter");
++const EventEmitter = require("devtools/shared/event-emitter");
+ const {reflowSpec} = require("devtools/shared/specs/reflow");
+ 
+ /**
+  * The reflow actor tracks reflows and emits events about them.
+  */
+ exports.ReflowActor = protocol.ActorClassWithSpec(reflowSpec, {
+   initialize: function (conn, tabActor) {
+     protocol.Actor.prototype.initialize.call(this, conn);
+@@ -71,17 +71,17 @@ exports.ReflowActor = protocol.ActorClas
+    */
+   stop: function () {
+     if (this._isStarted) {
+       this.observer.off("reflows", this._onReflow);
+       this._isStarted = false;
+     }
+   },
+ 
+-  _onReflow: function (event, reflows) {
++  _onReflow: function (reflows) {
+     if (this._isStarted) {
+       this.emit("reflows", reflows);
+     }
+   }
+ });
+ 
+ /**
+  * Base class for all sorts of observers that need to listen to events on the
+diff --git a/devtools/server/actors/thread.js b/devtools/server/actors/thread.js
+--- a/devtools/server/actors/thread.js
++++ b/devtools/server/actors/thread.js
+@@ -81,17 +81,19 @@ const ThreadActor = ActorClassWithSpec(t
+     // A map of actorID -> actor for breakpoints created and managed by the
+     // server.
+     this._hiddenBreakpoints = new Map();
+ 
+     this.global = global;
+ 
+     this._allEventsListener = this._allEventsListener.bind(this);
+     this.onNewGlobal = this.onNewGlobal.bind(this);
+-    this.onSourceEvent = this.onSourceEvent.bind(this);
++    this.onNewSourceEvent = this.onNewSourceEvent.bind(this);
++    this.onUpdatedSourceEvent = this.onUpdatedSourceEvent.bind(this);
++
+     this.uncaughtExceptionHook = this.uncaughtExceptionHook.bind(this);
+     this.onDebuggerStatement = this.onDebuggerStatement.bind(this);
+     this.onNewScript = this.onNewScript.bind(this);
+     this.objectGrip = this.objectGrip.bind(this);
+     this.pauseObjectGrip = this.pauseObjectGrip.bind(this);
+     this._onWindowReady = this._onWindowReady.bind(this);
+     EventEmitter.on(this._parent, "window-ready", this._onWindowReady);
+     // Set a wrappedJSObject property so |this| can be sent via the observer svc
+@@ -216,18 +218,18 @@ const ThreadActor = ActorClassWithSpec(t
+     }
+ 
+     // Blow away our source actor ID store because those IDs are only
+     // valid for this connection. This is ok because we never keep
+     // things like breakpoints across connections.
+     this._sourceActorStore = null;
+ 
+     EventEmitter.off(this._parent, "window-ready", this._onWindowReady);
+-    this.sources.off("newSource", this.onSourceEvent);
+-    this.sources.off("updatedSource", this.onSourceEvent);
++    this.sources.off("newSource", this.onNewSourceEvent);
++    this.sources.off("updatedSource", this.onUpdatedSourceEvent);
+     this.clearDebuggees();
+     this.conn.removeActorPool(this._threadLifetimePool);
+     this._threadLifetimePool = null;
+ 
+     if (this._prettyPrintWorker) {
+       this._prettyPrintWorker.destroy();
+       this._prettyPrintWorker = null;
+     }
+@@ -258,18 +260,18 @@ const ThreadActor = ActorClassWithSpec(t
+                message: "Current state is " + this.state };
+     }
+ 
+     this._state = "attached";
+     this._debuggerSourcesSeen = new WeakSet();
+ 
+     Object.assign(this._options, request.options || {});
+     this.sources.setOptions(this._options);
+-    this.sources.on("newSource", this.onSourceEvent);
+-    this.sources.on("updatedSource", this.onSourceEvent);
++    this.sources.on("newSource", this.onNewSourceEvent);
++    this.sources.on("updatedSource", this.onUpdatedSourceEvent);
+ 
+     // Initialize an event loop stack. This can't be done in the constructor,
+     // because this.conn is not yet initialized by the actor pool at that time.
+     this._nestedEventLoops = new EventLoopStack({
+       hooks: this._parent,
+       connection: this.conn,
+       thread: this
+     });
+@@ -1543,38 +1545,50 @@ const ThreadActor = ActorClassWithSpec(t
+    * @param global Debugger.Object
+    *        A Debugger.Object instance whose referent is the global object.
+    */
+   onNewScript: function (script, global) {
+     this._addSource(script.source);
+   },
+ 
+   /**
+-   * A function called when there's a new or updated source from a thread actor's
+-   * sources. Emits `newSource` and `updatedSource` on the tab actor.
++   * A function called when there's a new source from a thread actor's sources.
++   * Emits `newSource` on the tab actor.
+    *
+-   * @param {String} name
+    * @param {SourceActor} source
+    */
+-  onSourceEvent: function (name, source) {
++  onNewSourceEvent: function (source) {
++    const type = "newSource";
+     this.conn.send({
+       from: this._parent.actorID,
+-      type: name,
++      type,
+       source: source.form()
+     });
+ 
+     // For compatibility and debugger still using `newSource` on the thread client,
+     // still emit this event here. Clean up in bug 1247084
+-    if (name === "newSource") {
+-      this.conn.send({
+-        from: this.actorID,
+-        type: name,
+-        source: source.form()
+-      });
+-    }
++    this.conn.send({
++      from: this.actorID,
++      type,
++      source: source.form()
++    });
++  },
++
++  /**
++   * A function called when there's an updated source from a thread actor' sources.
++   * Emits `updatedSource` on the tab actor.
++   *
++   * @param {SourceActor} source
++   */
++  onUpdatedSourceEvent: function (source) {
++    this.conn.send({
++      from: this._parent.actorID,
++      type: "updatedSource",
++      source: source.form()
++    });
+   },
+ 
+   /**
+    * Add the provided source to the server cache.
+    *
+    * @param aSource Debugger.Source
+    *        The source that will be stored.
+    * @returns true, if the source was added; false otherwise.
+diff --git a/devtools/server/actors/timeline.js b/devtools/server/actors/timeline.js
+--- a/devtools/server/actors/timeline.js
++++ b/devtools/server/actors/timeline.js
+@@ -29,37 +29,61 @@ exports.TimelineActor = protocol.ActorCl
+   /**
+    * Initializes this actor with the provided connection and tab actor.
+    */
+   initialize: function (conn, tabActor) {
+     protocol.Actor.prototype.initialize.call(this, conn);
+     this.tabActor = tabActor;
+     this.bridge = new Timeline(tabActor);
+ 
+-    this._onTimelineEvent = this._onTimelineEvent.bind(this);
+-    this.bridge.on("*", this._onTimelineEvent);
++    this._onTimelineDocLoading = this._onTimelineDocLoading.bind(this);
++    this._onTimelineMarkers = this._onTimelineMarkers.bind(this);
++    this._onTimelineTicks = this._onTimelineTicks.bind(this);
++    this._onTimelineMemory = this._onTimelineMemory.bind(this);
++    this._onTimelineFrames = this._onTimelineFrames.bind(this);
++
++    this.bridge.on("doc-loading", this._onTimelineDocLoading);
++    this.bridge.on("markers", this._onTimelineMarkers);
++    this.bridge.on("ticks", this._onTimelineTicks);
++    this.bridge.on("memory", this._onTimelineMemory);
++    this.bridge.on("frames", this._onTimelineFrames);
+   },
+ 
+   /**
+    * Destroys this actor, stopping recording first.
+    */
+   destroy: function () {
+-    this.bridge.off("*", this._onTimelineEvent);
++    this.bridge.off("doc-loading", this._onTimelineDocLoading);
++    this.bridge.off("markers", this._onTimelineMarkers);
++    this.bridge.off("ticks", this._onTimelineTicks);
++    this.bridge.off("memory", this._onTimelineMemory);
++    this.bridge.off("frames", this._onTimelineFrames);
+     this.bridge.destroy();
+     this.bridge = null;
+     this.tabActor = null;
+     protocol.Actor.prototype.destroy.call(this);
+   },
+ 
+   /**
+-   * Propagate events from the Timeline module over RDP if the event is defined
+-   * here.
++   * Propagate events from the Timeline module over RDP if the event is defined here.
+    */
+-  _onTimelineEvent: function (eventName, ...args) {
+-    this.emit(eventName, ...args);
++  _onTimelineDocLoading: function (...args) {
++    this.emit("doc-loading", ...args);
++  },
++  _onTimelineMarkers: function (...args) {
++    this.emit("markers", ...args);
++  },
++  _onTimelineTicks: function (...args) {
++    this.emit("ticks", ...args);
++  },
++  _onTimelineMemory: function (...args) {
++    this.emit("memory", ...args);
++  },
++  _onTimelineFrames: function (...args) {
++    this.emit("frames", ...args);
+   },
+ 
+   isRecording: actorBridgeWithSpec("isRecording", {
+     request: {},
+     response: {
+       value: RetVal("boolean")
+     }
+   }),
+diff --git a/devtools/server/actors/utils/TabSources.js b/devtools/server/actors/utils/TabSources.js
+--- a/devtools/server/actors/utils/TabSources.js
++++ b/devtools/server/actors/utils/TabSources.js
+@@ -1,17 +1,17 @@
+ /* This Source Code Form is subject to the terms of the Mozilla Public
+  * License, v. 2.0. If a copy of the MPL was not distributed with this
+  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+ 
+ "use strict";
+ 
+ const DevToolsUtils = require("devtools/shared/DevToolsUtils");
+ const { assert, fetch } = DevToolsUtils;
+-const EventEmitter = require("devtools/shared/old-event-emitter");
++const EventEmitter = require("devtools/shared/event-emitter");
+ const { OriginalLocation, GeneratedLocation } = require("devtools/server/actors/common");
+ const { joinURI } = require("devtools/shared/path");
+ 
+ loader.lazyRequireGetter(this, "SourceActor", "devtools/server/actors/source", true);
+ loader.lazyRequireGetter(this, "isEvalSource", "devtools/server/actors/source", true);
+ loader.lazyRequireGetter(this, "SourceMapConsumer", "source-map", true);
+ loader.lazyRequireGetter(this, "SourceMapGenerator", "source-map", true);
+ loader.lazyRequireGetter(this, "WasmRemap", "devtools/shared/wasm-source-map", true);
+diff --git a/devtools/server/actors/utils/make-debugger.js b/devtools/server/actors/utils/make-debugger.js
+--- a/devtools/server/actors/utils/make-debugger.js
++++ b/devtools/server/actors/utils/make-debugger.js
+@@ -1,17 +1,17 @@
+ /* -*- indent-tabs-mode: nil; js-indent-level: 2; js-indent-level: 2 -*- */
+ /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+ /* This Source Code Form is subject to the terms of the Mozilla Public
+  * License, v. 2.0. If a copy of the MPL was not distributed with this
+  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+ 
+ "use strict";
+ 
+-const EventEmitter = require("devtools/shared/old-event-emitter");
++const EventEmitter = require("devtools/shared/event-emitter");
+ const Debugger = require("Debugger");
+ 
+ const { reportException } = require("devtools/shared/DevToolsUtils");
+ 
+ /**
+  * Multiple actors that use a |Debugger| instance come in a few versions, each
+  * with a different set of debuggees. One version for content tabs (globals
+  * within a tab), one version for chrome debugging (all globals), and sometimes
+diff --git a/devtools/server/main.js b/devtools/server/main.js
+--- a/devtools/server/main.js
++++ b/devtools/server/main.js
+@@ -12,17 +12,16 @@ var { Ci, Cc } = require("chrome");
+ var Services = require("Services");
+ var { ActorPool, OriginalLocation, RegisteredActorFactory,
+       ObservedActorFactory } = require("devtools/server/actors/common");
+ var { LocalDebuggerTransport, ChildDebuggerTransport, WorkerDebuggerTransport } =
+   require("devtools/shared/transport/transport");
+ var DevToolsUtils = require("devtools/shared/DevToolsUtils");
+ var { dumpn } = DevToolsUtils;
+ var flags = require("devtools/shared/flags");
+-var OldEventEmitter = require("devtools/shared/old-event-emitter");
+ var SyncPromise = require("devtools/shared/deprecated-sync-thenables");
+ 
+ DevToolsUtils.defineLazyGetter(this, "DebuggerSocket", () => {
+   let { DebuggerSocket } = require("devtools/shared/security/socket");
+   return DebuggerSocket;
+ });
+ DevToolsUtils.defineLazyGetter(this, "Authentication", () => {
+   return require("devtools/shared/security/auth");
+@@ -1379,17 +1378,17 @@ var DebuggerServer = {
+ // Expose these to save callers the trouble of importing DebuggerSocket
+ DevToolsUtils.defineLazyGetter(DebuggerServer, "Authenticators", () => {
+   return Authentication.Authenticators;
+ });
+ DevToolsUtils.defineLazyGetter(DebuggerServer, "AuthenticationResult", () => {
+   return Authentication.AuthenticationResult;
+ });
+ 
+-OldEventEmitter.decorate(DebuggerServer);
++EventEmitter.decorate(DebuggerServer);
+ 
+ if (this.exports) {
+   exports.DebuggerServer = DebuggerServer;
+   exports.ActorPool = ActorPool;
+   exports.OriginalLocation = OriginalLocation;
+ }
+ 
+ // Needed on B2G (See header note)
+diff --git a/devtools/server/tests/unit/test_layout-reflows-observer.js b/devtools/server/tests/unit/test_layout-reflows-observer.js
+--- a/devtools/server/tests/unit/test_layout-reflows-observer.js
++++ b/devtools/server/tests/unit/test_layout-reflows-observer.js
+@@ -127,17 +127,17 @@ function eventsAreBatched() {
+ 
+   // Note that in this test, we mock the TabActor and its window property, so we
+   // also mock the setTimeout/clearTimeout mechanism and just call the callback
+   // manually
+   let tabActor = new MockTabActor();
+   let observer = getLayoutChangesObserver(tabActor);
+ 
+   let reflowsEvents = [];
+-  let onReflows = (event, reflows) => reflowsEvents.push(reflows);
++  let onReflows = reflows => reflowsEvents.push(reflows);
+   observer.on("reflows", onReflows);
+ 
+   let resizeEvents = [];
+   let onResize = () => resizeEvents.push("resize");
+   observer.on("resize", onResize);
+ 
+   info("Fake one reflow event");
+   tabActor.window.docShell.observer.reflow();
+@@ -170,17 +170,17 @@ function eventsAreBatched() {
+ function noEventsAreSentWhenThereAreNoReflowsAndLoopTimeouts() {
+   info("Checking that if no reflows were detected and the event batching " +
+   "loop expires, then no reflows event is sent");
+ 
+   let tabActor = new MockTabActor();
+   let observer = getLayoutChangesObserver(tabActor);
+ 
+   let reflowsEvents = [];
+-  let onReflows = (event, reflows) => reflowsEvents.push(reflows);
++  let onReflows = (reflows) => reflowsEvents.push(reflows);
+   observer.on("reflows", onReflows);
+ 
+   info("Faking timeout expiration and checking for reflows");
+   observer.eventLoopTimer();
+   Assert.equal(reflowsEvents.length, 0);
+ 
+   observer.off("reflows", onReflows);
+   releaseLayoutChangesObserver(tabActor);
+diff --git a/devtools/server/tests/unit/test_registerClient.js b/devtools/server/tests/unit/test_registerClient.js
+--- a/devtools/server/tests/unit/test_registerClient.js
++++ b/devtools/server/tests/unit/test_registerClient.js
+@@ -1,16 +1,16 @@
+ /* Any copyright is dedicated to the Public Domain.
+    http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+ "use strict";
+ 
+ // Test the DebuggerClient.registerClient API
+ 
+-var EventEmitter = require("devtools/shared/old-event-emitter");
++var EventEmitter = require("devtools/shared/event-emitter");
+ 
+ var gClient;
+ var gTestClient;
+ 
+ function TestActor(conn) {
+   this.conn = conn;
+ }
+ TestActor.prototype = {
+@@ -69,18 +69,17 @@ function init() {
+     .then(response => {
+       gTestClient = new TestClient(gClient, response);
+       run_next_test();
+     });
+ }
+ 
+ function test_client_events() {
+   // Test DebuggerClient.registerClient and DebuggerServerConnection.sendActorEvent
+-  gTestClient.on("foo", function (type, data) {
+-    Assert.equal(type, "foo");
++  gTestClient.on("foo", function (data) {
+     Assert.equal(data.hello, "world");
+     run_next_test();
+   });
+   gTestClient.start();
+ }
+ 
+ function close_client() {
+   gClient.close().then(() => {
+diff --git a/devtools/shared/transport/stream-utils.js b/devtools/shared/transport/stream-utils.js
+--- a/devtools/shared/transport/stream-utils.js
++++ b/devtools/shared/transport/stream-utils.js
+@@ -3,17 +3,17 @@
+  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+ 
+ "use strict";
+ 
+ const { Ci, Cc, Cr, CC } = require("chrome");
+ const Services = require("Services");
+ const DevToolsUtils = require("devtools/shared/DevToolsUtils");
+ const { dumpv } = DevToolsUtils;
+-const EventEmitter = require("devtools/shared/old-event-emitter");
++const EventEmitter = require("devtools/shared/event-emitter");
+ const defer = require("devtools/shared/defer");
+ 
+ DevToolsUtils.defineLazyGetter(this, "IOUtil", () => {
+   return Cc["@mozilla.org/io-util;1"].getService(Ci.nsIIOUtil);
+ });
+ 
+ DevToolsUtils.defineLazyGetter(this, "ScriptableInputStream", () => {
+   return CC("@mozilla.org/scriptableinputstream;1",
+diff --git a/devtools/shared/transport/tests/unit/test_client_server_bulk.js b/devtools/shared/transport/tests/unit/test_client_server_bulk.js
+--- a/devtools/shared/transport/tests/unit/test_client_server_bulk.js
++++ b/devtools/shared/transport/tests/unit/test_client_server_bulk.js
+@@ -174,17 +174,17 @@ var test_bulk_request_cs = async functio
+ 
+     // Set up reply handling for this type
+     replyHandlers[replyType](request).then(() => {
+       client.close();
+       transport.close();
+     });
+   }).catch(do_throw);
+ 
+-  DebuggerServer.on("connectionchange", (event, type) => {
++  DebuggerServer.on("connectionchange", type => {
+     if (type === "closed") {
+       serverDeferred.resolve();
+     }
+   });
+ 
+   return promise.all([
+     clientDeferred.promise,
+     bulkCopyDeferred.promise,
+@@ -216,17 +216,17 @@ var test_json_request_cs = async functio
+ 
+     // Set up reply handling for this type
+     replyHandlers[replyType](request).then(() => {
+       client.close();
+       transport.close();
+     });
+   }).catch(do_throw);
+ 
+-  DebuggerServer.on("connectionchange", (event, type) => {
++  DebuggerServer.on("connectionchange", type => {
+     if (type === "closed") {
+       serverDeferred.resolve();
+     }
+   });
+ 
+   return promise.all([
+     clientDeferred.promise,
+     serverDeferred.promise
+diff --git a/devtools/shared/transport/tests/unit/test_queue.js b/devtools/shared/transport/tests/unit/test_queue.js
+--- a/devtools/shared/transport/tests/unit/test_queue.js
++++ b/devtools/shared/transport/tests/unit/test_queue.js
+@@ -107,17 +107,17 @@ var test_transport = async function (tra
+ 
+       // Server
+       Assert.equal(Object.keys(DebuggerServer._connections).length, 1);
+       info(Object.keys(DebuggerServer._connections));
+       for (let connId in DebuggerServer._connections) {
+         DebuggerServer._connections[connId].onBulkPacket = on_bulk_packet;
+       }
+ 
+-      DebuggerServer.on("connectionchange", (event, type) => {
++      DebuggerServer.on("connectionchange", type => {
+         if (type === "closed") {
+           serverDeferred.resolve();
+         }
+       });
+ 
+       send_packets();
+     },
+ 
+diff --git a/devtools/shared/transport/tests/unit/test_transport_bulk.js b/devtools/shared/transport/tests/unit/test_transport_bulk.js
+--- a/devtools/shared/transport/tests/unit/test_transport_bulk.js
++++ b/devtools/shared/transport/tests/unit/test_transport_bulk.js
+@@ -80,17 +80,17 @@ var test_bulk_transfer_transport = async
+ 
+       // Server
+       Assert.equal(Object.keys(DebuggerServer._connections).length, 1);
+       info(Object.keys(DebuggerServer._connections));
+       for (let connId in DebuggerServer._connections) {
+         DebuggerServer._connections[connId].onBulkPacket = on_bulk_packet;
+       }
+ 
+-      DebuggerServer.on("connectionchange", (event, type) => {
++      DebuggerServer.on("connectionchange", type => {
+         if (type === "closed") {
+           serverDeferred.resolve();
+         }
+       });
+ 
+       transport.startBulkSend({
+         actor: "root",
+         type: "file-stream",
+diff --git a/devtools/shared/transport/tests/unit/test_transport_events.js b/devtools/shared/transport/tests/unit/test_transport_events.js
+--- a/devtools/shared/transport/tests/unit/test_transport_events.js
++++ b/devtools/shared/transport/tests/unit/test_transport_events.js
+@@ -23,51 +23,46 @@ async function test_transport_events(nam
+   let transport = await transportFactory();
+ 
+   // Transport expects the hooks to be not null
+   transport.hooks = {
+     onPacket: () => {},
+     onClosed: () => {},
+   };
+ 
+-  let rootReceived = transport.once("packet", (event, packet) => {
+-    info(`Packet event: ${event} ${JSON.stringify(packet)}`);
+-    Assert.equal(event, "packet");
++  let rootReceived = transport.once("packet", packet => {
++    info(`Packet event: ${JSON.stringify(packet)}`);
+     Assert.equal(packet.from, "root");
+   });
+ 
+   transport.ready();
+   await rootReceived;
+ 
+-  let echoSent = transport.once("send", (event, packet) => {
+-    info(`Send event: ${event} ${JSON.stringify(packet)}`);
+-    Assert.equal(event, "send");
++  let echoSent = transport.once("send", packet => {
++    info(`Send event: ${JSON.stringify(packet)}`);
+     Assert.equal(packet.to, "root");
+     Assert.equal(packet.type, "echo");
+   });
+ 
+-  let echoReceived = transport.once("packet", (event, packet) => {
+-    info(`Packet event: ${event} ${JSON.stringify(packet)}`);
+-    Assert.equal(event, "packet");
++  let echoReceived = transport.once("packet", packet => {
++    info(`Packet event: ${JSON.stringify(packet)}`);
+     Assert.equal(packet.from, "root");
+     Assert.equal(packet.type, "echo");
+   });
+ 
+   transport.send({ to: "root", type: "echo" });
+   await echoSent;
+   await echoReceived;
+ 
+-  let clientClosed = transport.once("close", (event) => {
+-    info(`Close event: ${event}`);
+-    Assert.equal(event, "close");
++  let clientClosed = transport.once("close", () => {
++    info(`Close event`);
+   });
+ 
+-  let serverClosed = DebuggerServer.once("connectionchange", (event, type) => {
++  let serverClosed = DebuggerServer.once("connectionchange", type => {
+     info(`Server closed`);
+-    Assert.equal(event, "connectionchange");
+     Assert.equal(type, "closed");
+   });
+ 
+   transport.close();
+ 
+   await clientClosed;
+   await serverClosed;
+ 
+diff --git a/devtools/shared/transport/transport.js b/devtools/shared/transport/transport.js
+--- a/devtools/shared/transport/transport.js
++++ b/devtools/shared/transport/transport.js
+@@ -25,17 +25,17 @@
+   const DevToolsUtils = require("devtools/shared/DevToolsUtils");
+   const { dumpn, dumpv } = DevToolsUtils;
+   const flags = require("devtools/shared/flags");
+   const StreamUtils = require("devtools/shared/transport/stream-utils");
+   const { Packet, JSONPacket, BulkPacket } =
+   require("devtools/shared/transport/packets");
+   const promise = require("promise");
+   const defer = require("devtools/shared/defer");
+-  const EventEmitter = require("devtools/shared/old-event-emitter");
++  const EventEmitter = require("devtools/shared/event-emitter");
+ 
+   DevToolsUtils.defineLazyGetter(this, "Pipe", () => {
+     return CC("@mozilla.org/pipe;1", "nsIPipe", "init");
+   });
+ 
+   DevToolsUtils.defineLazyGetter(this, "ScriptableInputStream", () => {
+     return CC("@mozilla.org/scriptableinputstream;1",
+             "nsIScriptableInputStream", "init");
+diff --git a/devtools/shared/transport/websocket-transport.js b/devtools/shared/transport/websocket-transport.js
+--- a/devtools/shared/transport/websocket-transport.js
++++ b/devtools/shared/transport/websocket-transport.js
+@@ -1,15 +1,15 @@
+ /* This Source Code Form is subject to the terms of the Mozilla Public
+  * License, v. 2.0. If a copy of the MPL was not distributed with this
+  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+ 
+ "use strict";
+ 
+-const EventEmitter = require("devtools/shared/old-event-emitter");
++const EventEmitter = require("devtools/shared/event-emitter");
+ 
+ function WebSocketDebuggerTransport(socket) {
+   EventEmitter.decorate(this);
+ 
+   this.active = false;
+   this.hooks = null;
+   this.socket = socket;
+ }

+ 161 - 0
mozilla-release/patches/1384463-58a1.patch

@@ -0,0 +1,161 @@
+# HG changeset patch
+# User Tom Tromey <tom@tromey.com>
+# Date 1508432670 21600
+# Node ID 96703e5d9e78d7551bad2a5d227efe06eb003724
+# Parent  6270360e94ebe8d5a4a31ec75e12d29bb7491687
+Bug 1384463 - only trim CSS-allowed whitespace in declaration parser; r=gl
+
+MozReview-Commit-ID: 7bnu2a9G1uq
+
+diff --git a/devtools/client/shared/test/unit/test_parseDeclarations.js b/devtools/client/shared/test/unit/test_parseDeclarations.js
+--- a/devtools/client/shared/test/unit/test_parseDeclarations.js
++++ b/devtools/client/shared/test/unit/test_parseDeclarations.js
+@@ -360,16 +360,25 @@ const TEST_DATA = [
+   },
+ 
+   // Regression test for bug 1297890 - don't paste tokens.
+   {
+     parseComments: true,
+     input: "stroke-dasharray: 1/*ThisIsAComment*/2;",
+     expected: [{name: "stroke-dasharray", value: "1 2", priority: "", offsets: [0, 39]}]
+   },
++
++  // Regression test for bug 1384463 - don't trim significant
++  // whitespace.
++  {
++    // \u00a0 is non-breaking space.
++    input: "\u00a0vertical-align: top",
++    expected: [{name: "\u00a0vertical-align", value: "top", priority: "",
++                offsets: [0, 20]}]
++  },
+ ];
+ 
+ function run_test() {
+   run_basic_tests();
+   run_comment_tests();
+   run_named_tests();
+ }
+ 
+diff --git a/devtools/shared/css/parsing-utils.js b/devtools/shared/css/parsing-utils.js
+--- a/devtools/shared/css/parsing-utils.js
++++ b/devtools/shared/css/parsing-utils.js
+@@ -245,16 +245,38 @@ function parseCommentDeclarations(isCssP
+ function getEmptyDeclaration() {
+   return {name: "", value: "", priority: "",
+           terminator: "",
+           offsets: [undefined, undefined],
+           colonOffsets: false};
+ }
+ 
+ /**
++ * Like trim, but only trims CSS-allowed whitespace.
++ */
++function cssTrim(str) {
++  let match = /^[ \t\r\n\f]*(.*?)[ \t\r\n\f]*$/.exec(str);
++  if (match) {
++    return match[1];
++  }
++  return str;
++}
++
++/**
++ * Like trimRight, but only trims CSS-allowed whitespace.
++ */
++function cssTrimRight(str) {
++  let match = /^(.*?)[ \t\r\n\f]*$/.exec(str);
++  if (match) {
++    return match[1];
++  }
++  return str;
++}
++
++/**
+  * A helper function that does all the parsing work for
+  * parseDeclarations.  This is separate because it has some arguments
+  * that don't make sense in isolation.
+  *
+  * The return value and arguments are like parseDeclarations, with
+  * these additional arguments.
+  *
+  * @param {Function} isCssPropertyKnown
+@@ -305,17 +327,17 @@ function parseDeclarationsInternal(isCss
+                !lastProp.priority && lastProp.colonOffsets[1]) {
+       // Whitespace appearing after the ":" is attributed to it.
+       lastProp.colonOffsets[1] = token.endOffset;
+     }
+ 
+     if (token.tokenType === "symbol" && token.text === ":") {
+       if (!lastProp.name) {
+         // Set the current declaration name if there's no name yet
+-        lastProp.name = current.trim();
++        lastProp.name = cssTrim(current);
+         lastProp.colonOffsets = [token.startOffset, token.endOffset];
+         current = "";
+         hasBang = false;
+ 
+         // When parsing a comment body, if the left-hand-side is not a
+         // valid property name, then drop it and stop parsing.
+         if (inComment && !commentOverride &&
+             !isCssPropertyKnown(lastProp.name)) {
+@@ -331,17 +353,17 @@ function parseDeclarationsInternal(isCss
+       lastProp.terminator = "";
+       // When parsing a comment, if the name hasn't been set, then we
+       // have probably just seen an ordinary semicolon used in text,
+       // so drop this and stop parsing.
+       if (inComment && !lastProp.name) {
+         current = "";
+         break;
+       }
+-      lastProp.value = current.trim();
++      lastProp.value = cssTrim(current);
+       current = "";
+       hasBang = false;
+       declarations.push(getEmptyDeclaration());
+       lastProp = declarations[declarations.length - 1];
+     } else if (token.tokenType === "ident") {
+       if (token.text === "important" && hasBang) {
+         lastProp.priority = "important";
+         hasBang = false;
+@@ -379,21 +401,21 @@ function parseDeclarationsInternal(isCss
+   }
+ 
+   // Handle whatever trailing properties or values might still be there
+   if (current) {
+     if (!lastProp.name) {
+       // Ignore this case in comments.
+       if (!inComment) {
+         // Trailing property found, e.g. p1:v1;p2:v2;p3
+-        lastProp.name = current.trim();
++        lastProp.name = cssTrim(current);
+       }
+     } else {
+       // Trailing value found, i.e. value without an ending ;
+-      lastProp.value = current.trim();
++      lastProp.value = cssTrim(current);
+       let terminator = lexer.performEOFFixup("", true);
+       lastProp.terminator = terminator + ";";
+       // If the input was unterminated, attribute the remainder to
+       // this property.  This avoids some bad behavior when rewriting
+       // an unterminated comment.
+       if (terminator) {
+         lastProp.offsets[1] = inputString.length;
+       }
+@@ -828,17 +850,17 @@ RuleRewriter.prototype = {
+                                      decl.colonOffsets[1]);
+       this.result += unescapeCSSComment(commentNamePart);
+ 
+       // When uncommenting, we must be sure to sanitize the text, to
+       // avoid things like /* decl: }; */, which will be accepted as
+       // a property but which would break the entire style sheet.
+       let newText = this.inputString.substring(decl.colonOffsets[1],
+                                                decl.offsets[1]);
+-      newText = unescapeCSSComment(newText).trimRight();
++      newText = cssTrimRight(unescapeCSSComment(newText));
+       this.result += this.sanitizeText(newText, index) + ";";
+ 
+       // See if the comment end can be deleted.
+       let trailingText = this.inputString.substring(decl.offsets[1]);
+       if (EMPTY_COMMENT_END_RX.test(trailingText)) {
+         copyOffset = decl.commentOffsets[1];
+       } else {
+         this.result += " /*";

+ 184 - 0
mozilla-release/patches/1386523-60a1.patch

@@ -0,0 +1,184 @@
+# HG changeset patch
+# User Brian Grinstead <bgrinstead@mozilla.com>
+# Date 1516744709 28800
+# Node ID 5aa5875856638063e463cfcd2b37619192337ba4
+# Parent  355be23f27529dbfc108713364bd49f4ef7ad6a6
+Bug 1386523 - Make store debug logging into a shared helper function for webconsole mochitests;r=nchevobbe
+
+MozReview-Commit-ID: FxDgYNr35o3
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_console_dir.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_console_dir.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_console_dir.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_console_dir.js
+@@ -7,27 +7,17 @@
+ 
+ // Check console.dir() calls.
+ const TEST_URI = "data:text/html;charset=utf8,<h1>test console.dir</h1>";
+ 
+ add_task(async function () {
+   let toolbox = await openNewTabAndToolbox(TEST_URI, "webconsole");
+   let hud = toolbox.getCurrentPanel().hud;
+ 
+-  const store = hud.ui.newConsoleOutput.getStore();
+-  // Adding logging each time the store is modified in order to check
+-  // the store state in case of failure.
+-  store.subscribe(() => {
+-    const messages = store.getState().messages.messagesById
+-      .reduce(function (res, {id, type, parameters, messageText}) {
+-        res.push({id, type, parameters, messageText});
+-        return res;
+-      }, []);
+-    info("messages : " + JSON.stringify(messages));
+-  });
++  logAllStoreChanges(hud);
+ 
+   info("console.dir on an array");
+   await ContentTask.spawn(gBrowser.selectedBrowser, null, function () {
+     content.wrappedJSObject.console.dir(
+       [1, 2, {a: "a", b: "b"}],
+     );
+   });
+   let dirMessageNode = await waitFor(() =>
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_console_group.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_console_group.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_console_group.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_console_group.js
+@@ -8,33 +8,18 @@
+ // Check console.group, console.groupCollapsed and console.groupEnd calls
+ // behave as expected.
+ 
+ const TEST_URI = "http://example.com/browser/devtools/client/webconsole/new-console-output/test/mochitest/test-console-group.html";
+ const { INDENT_WIDTH } = require("devtools/client/webconsole/new-console-output/components/MessageIndent");
+ 
+ add_task(async function () {
+   const hud = await openNewTabAndConsole(TEST_URI);
+-
+   const store = hud.ui.newConsoleOutput.getStore();
+-  // Adding logging each time the store is modified in order to check
+-  // the store state in case of failure.
+-  store.subscribe(() => {
+-    const messages = [...store.getState().messages.messagesById]
+-      .reduce(function (res, [id, message]) {
+-        res.push({
+-          id,
+-          type: message.type,
+-          parameters: message.parameters,
+-          messageText: message.messageText
+-        });
+-        return res;
+-      }, []);
+-    info("messages : " + JSON.stringify(messages));
+-  });
++  logAllStoreChanges(hud);
+ 
+   const onMessagesLogged = waitForMessage(hud, "log-6");
+   ContentTask.spawn(gBrowser.selectedBrowser, null, function () {
+     content.wrappedJSObject.doLog();
+   });
+   await onMessagesLogged;
+ 
+   info("Test a group at root level");
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_object_inspector.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_object_inspector.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_object_inspector.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_object_inspector.js
+@@ -7,27 +7,17 @@
+ 
+ // Check expanding/collapsing object inspector in the console.
+ const TEST_URI = "data:text/html;charset=utf8,<h1>test Object Inspector</h1>";
+ 
+ add_task(async function () {
+   let toolbox = await openNewTabAndToolbox(TEST_URI, "webconsole");
+   let hud = toolbox.getCurrentPanel().hud;
+ 
+-  const store = hud.ui.newConsoleOutput.getStore();
+-  // Adding logging each time the store is modified in order to check
+-  // the store state in case of failure.
+-  store.subscribe(() => {
+-    const messages = store.getState().messages.messagesById
+-      .reduce(function (res, {id, type, parameters, messageText}) {
+-        res.push({id, type, parameters, messageText});
+-        return res;
+-      }, []);
+-    info("messages : " + JSON.stringify(messages));
+-  });
++  logAllStoreChanges(hud);
+ 
+   await ContentTask.spawn(gBrowser.selectedBrowser, null, function () {
+     content.wrappedJSObject.console.log(
+       "oi-test",
+       [1, 2, {a: "a", b: "b"}],
+       {c: "c", d: [3, 4], length: 987}
+     );
+   });
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_object_inspector_entries.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_object_inspector_entries.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_object_inspector_entries.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_object_inspector_entries.js
+@@ -6,27 +6,18 @@
+ "use strict";
+ 
+ // Check expanding/collapsing maps and sets in the console.
+ const TEST_URI = "data:text/html;charset=utf8,<h1>Object Inspector on Maps & Sets</h1>";
+ const {ELLIPSIS} = require("devtools/shared/l10n");
+ 
+ add_task(async function () {
+   const hud = await openNewTabAndConsole(TEST_URI);
+-  const store = hud.ui.newConsoleOutput.getStore();
+-  // Adding logging each time the store is modified in order to check
+-  // the store state in case of failure.
+-  store.subscribe(() => {
+-    const messages = store.getState().messages.messagesById
+-      .reduce(function (res, {id, type, parameters, messageText}) {
+-        res.push({id, type, parameters, messageText});
+-        return res;
+-      }, []);
+-    info("messages : " + JSON.stringify(messages));
+-  });
++
++  logAllStoreChanges(hud);
+ 
+   await ContentTask.spawn(gBrowser.selectedBrowser, null, function () {
+     content.wrappedJSObject.console.log(
+       "oi-entries-test",
+       new Map(
+         Array.from({length: 20}).map((el, i) => [Symbol(i),  i])
+       ),
+       new Map(
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/head.js b/devtools/client/webconsole/new-console-output/test/mochitest/head.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/head.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/head.js
+@@ -71,16 +71,36 @@ async function openNewTabAndConsole(url,
+     // Clearing history that might have been set in previous tests.
+     await hud.jsterm.clearHistory();
+   }
+ 
+   return hud;
+ }
+ 
+ /**
++ * Subscribe to the store and log out stringinfied versions of messages.
++ * This is a helper function for debugging, to make is easier to see what
++ * happened during the test in the log.
++ *
++ * @param object hud
++ */
++function logAllStoreChanges(hud) {
++  const store = hud.ui.newConsoleOutput.getStore();
++  // Adding logging each time the store is modified in order to check
++  // the store state in case of failure.
++  store.subscribe(() => {
++    const messages = [...store.getState().messages.messagesById.values()];
++    const debugMessages = messages.map(({id, type, parameters, messageText}) => {
++      return {id, type, parameters, messageText};
++    });
++    info("messages : " + JSON.stringify(debugMessages));
++  });
++}
++
++/**
+  * Wait for messages in the web console output, resolving once they are received.
+  *
+  * @param object options
+  *        - hud: the webconsole
+  *        - messages: Array[Object]. An array of messages to match.
+             Current supported options:
+  *            - text: Partial text match in .message-body
+  */

+ 34 - 0
mozilla-release/patches/1387511-1-59a1.patch

@@ -0,0 +1,34 @@
+# HG changeset patch
+# User Gabriel Luong <gabriel.luong@gmail.com>
+# Date 1510714964 18000
+# Node ID b0780ac4a74e0416263db9496c2057b6126ced41
+# Parent  bf7496804e16a2193f45fa95372e9a6b31849615
+Bug 1387511 - Part 1: Use the grid negative number platform API to render negative line numbers correctly in css grid inspector. r=pbro
+
+diff --git a/devtools/server/actors/highlighters/css-grid.js b/devtools/server/actors/highlighters/css-grid.js
+--- a/devtools/server/actors/highlighters/css-grid.js
++++ b/devtools/server/actors/highlighters/css-grid.js
+@@ -856,17 +856,22 @@ class CssGridHighlighter extends AutoRef
+ 
+     // Keep track of the number of collapsed lines per line position
+     let stackedLines = [];
+ 
+     const { lines } = gridDimension;
+ 
+     for (let i = 0, line; (line = lines[i++]);) {
+       let linePos = line.start;
+-      let negativeLineNumber = i - lines.length - 1;
++      let negativeLineNumber = line.negativeNumber;
++
++      // Don't render any negative line number greater than -1.
++      if (negativeLineNumber == 0) {
++        break;
++      }
+ 
+       // Check for overlapping lines. We render a second box beneath the last overlapping
+       // line number to indicate there are lines beneath it.
+       const gridLine = gridDimension.tracks[line.number - 1];
+ 
+       if (gridLine) {
+         const { breadth }  = gridLine;
+ 

+ 2083 - 0
mozilla-release/patches/1387511-2-59a1.patch

@@ -0,0 +1,2083 @@
+# HG changeset patch
+# User Gabriel Luong <gabriel.luong@gmail.com>
+# Date 1510714971 18000
+# Node ID 46a0be972d5ae92da4a6dacb21f6e6ff119eb970
+# Parent  6cef87aa99bdde7edf4ec68ade433628c9db96a7
+Bug 1387511 - Part 2: Format css-grid.js r=pbro
+
+diff --git a/devtools/server/actors/highlighters/css-grid.js b/devtools/server/actors/highlighters/css-grid.js
+--- a/devtools/server/actors/highlighters/css-grid.js
++++ b/devtools/server/actors/highlighters/css-grid.js
+@@ -164,17 +164,17 @@ class CssGridHighlighter extends AutoRef
+     this.onPageHide = this.onPageHide.bind(this);
+     this.onWillNavigate = this.onWillNavigate.bind(this);
+ 
+     this.highlighterEnv.on("will-navigate", this.onWillNavigate);
+ 
+     let { pageListenerTarget } = highlighterEnv;
+     pageListenerTarget.addEventListener("pagehide", this.onPageHide);
+ 
+-    // Initialize the <canvas> position to the top left corner of the page
++    // Initialize the <canvas> position to the top left corner of the page.
+     this._canvasPosition = {
+       x: 0,
+       y: 0
+     };
+ 
+     // Calling `updateCanvasPosition` anyway since the highlighter could be initialized
+     // on a page that has scrolled already.
+     updateCanvasPosition(this._canvasPosition, this._scroll, this.win,
+@@ -208,17 +208,17 @@ class CssGridHighlighter extends AutoRef
+         "class": "canvas",
+         "hidden": "true",
+         "width": CANVAS_SIZE,
+         "height": CANVAS_SIZE
+       },
+       prefix: this.ID_CLASS_PREFIX
+     });
+ 
+-    // Build the SVG element
++    // Build the SVG element.
+     let svg = createSVGNode(this.win, {
+       nodeType: "svg",
+       parent: root,
+       attributes: {
+         "id": "elements",
+         "width": "100%",
+         "height": "100%",
+         "hidden": "true"
+@@ -250,17 +250,17 @@ class CssGridHighlighter extends AutoRef
+       parent: regions,
+       attributes: {
+         "class": "cells",
+         "id": "cells"
+       },
+       prefix: this.ID_CLASS_PREFIX
+     });
+ 
+-    // Building the grid area infobar markup
++    // Build the grid area infobar markup.
+     let areaInfobarContainer = createNode(this.win, {
+       parent: container,
+       attributes: {
+         "class": "area-infobar-container",
+         "id": "area-infobar-container",
+         "position": "top",
+         "hidden": "true"
+       },
+@@ -296,17 +296,17 @@ class CssGridHighlighter extends AutoRef
+       parent: areaTextbox,
+       attributes: {
+         "class": "area-infobar-dimensions",
+         "id": "area-infobar-dimensions"
+       },
+       prefix: this.ID_CLASS_PREFIX
+     });
+ 
+-    // Building the grid cell infobar markup
++    // Build the grid cell infobar markup.
+     let cellInfobarContainer = createNode(this.win, {
+       parent: container,
+       attributes: {
+         "class": "cell-infobar-container",
+         "id": "cell-infobar-container",
+         "position": "top",
+         "hidden": "true"
+       },
+@@ -342,17 +342,17 @@ class CssGridHighlighter extends AutoRef
+       parent: cellTextbox,
+       attributes: {
+         "class": "cell-infobar-dimensions",
+         "id": "cell-infobar-dimensions"
+       },
+       prefix: this.ID_CLASS_PREFIX
+     });
+ 
+-    // Building the grid line infobar markup
++    // Build the grid line infobar markup.
+     let lineInfobarContainer = createNode(this.win, {
+       parent: container,
+       attributes: {
+         "class": "line-infobar-container",
+         "id": "line-infobar-container",
+         "position": "top",
+         "hidden": "true"
+       },
+@@ -391,48 +391,76 @@ class CssGridHighlighter extends AutoRef
+         "id": "line-infobar-names"
+       },
+       prefix: this.ID_CLASS_PREFIX
+     });
+ 
+     return container;
+   }
+ 
++  clearCache() {
++    gCachedGridPattern.clear();
++  }
++
++  /**
++   * Clear the grid area highlights.
++   */
++  clearGridAreas() {
++    let areas = this.getElement("areas");
++    areas.setAttribute("d", "");
++  }
++
++  /**
++   * Clear the grid cell highlights.
++   */
++  clearGridCell() {
++    let cells = this.getElement("cells");
++    cells.setAttribute("d", "");
++  }
++
+   destroy() {
+     let { highlighterEnv } = this;
+     highlighterEnv.off("will-navigate", this.onWillNavigate);
+ 
+     let { pageListenerTarget } = highlighterEnv;
+     if (pageListenerTarget) {
+       pageListenerTarget.removeEventListener("pagehide", this.onPageHide);
+     }
+ 
+     this.markup.destroy();
+ 
+     // Clear the pattern cache to avoid dead object exceptions (Bug 1342051).
+-    this._clearCache();
++    this.clearCache();
+     AutoRefreshHighlighter.prototype.destroy.call(this);
+   }
+ 
+-  getElement(id) {
+-    return this.markup.getElement(this.ID_CLASS_PREFIX + id);
+-  }
+-
+-  get ctx() {
+-    return this.canvas.getCanvasContext("2d");
+-  }
+-
+   get canvas() {
+     return this.getElement("canvas");
+   }
+ 
+   get color() {
+     return this.options.color || DEFAULT_COLOR;
+   }
+ 
++  get ctx() {
++    return this.canvas.getCanvasContext("2d");
++  }
++
++  getElement(id) {
++    return this.markup.getElement(this.ID_CLASS_PREFIX + id);
++  }
++
++  getFirstColLinePos(fragment) {
++    return fragment.cols.lines[0].start;
++  }
++
++  getFirstRowLinePos(fragment) {
++    return fragment.rows.lines[0].start;
++  }
++
+   /**
+    * Gets the grid gap pattern used to render the gap regions based on the device
+    * pixel ratio given.
+    *
+    * @param  {Number} devicePixelRatio
+    *         The device pixel ratio we want the pattern for.
+    * @param  {Object} dimension
+    *         Refers to the Map key for the grid dimension type which is either the
+@@ -479,82 +507,179 @@ class CssGridHighlighter extends AutoRef
+     let pattern = ctx.createPattern(canvas, "repeat");
+ 
+     gridPatternMap.set(dimension, pattern);
+     gCachedGridPattern.set(devicePixelRatio, gridPatternMap);
+ 
+     return pattern;
+   }
+ 
+-  onPageHide({ target }) {
+-    // If a page hide event is triggered for current window's highlighter, hide the
+-    // highlighter.
+-    if (target.defaultView === this.win) {
+-      this.hide();
++  getLastColLinePos(fragment) {
++    return fragment.cols.lines[fragment.cols.lines.length - 1].start;
++  }
++
++  /**
++   * Get the GridLine index of the last edge of the explicit grid for a grid dimension.
++   *
++   * @param  {GridTracks} tracks
++   *         The grid track of a given grid dimension.
++   * @return {Number} index of the last edge of the explicit grid for a grid dimension.
++   */
++  getLastEdgeLineIndex(tracks) {
++    let trackIndex = tracks.length - 1;
++
++    // Traverse the grid track backwards until we find an explicit track.
++    while (trackIndex >= 0 && tracks[trackIndex].type != "explicit") {
++      trackIndex--;
+     }
++
++    // The grid line index is the grid track index + 1.
++    return trackIndex + 1;
++  }
++
++  getLastRowLinePos(fragment) {
++    return fragment.rows.lines[fragment.rows.lines.length - 1].start;
++  }
++
++  /**
++   * The AutoRefreshHighlighter's _hasMoved method returns true only if the
++   * element's quads have changed. Override it so it also returns true if the
++   * element's grid has changed (which can happen when you change the
++   * grid-template-* CSS properties with the highlighter displayed).
++   */
++  _hasMoved() {
++    let hasMoved = AutoRefreshHighlighter.prototype._hasMoved.call(this);
++
++    let oldGridData = stringifyGridFragments(this.gridData);
++    this.gridData = this.currentNode.getGridFragments();
++    let newGridData = stringifyGridFragments(this.gridData);
++
++    return hasMoved || oldGridData !== newGridData;
+   }
+ 
+   /**
+-   * Called when the page will-navigate. Used to hide the grid highlighter and clear
+-   * the cached gap patterns and avoid using DeadWrapper obejcts as gap patterns the
+-   * next time.
++   * Hide the highlighter, the canvas and the infobars.
+    */
+-  onWillNavigate({ isTopLevel }) {
+-    this._clearCache();
++  _hide() {
++    setIgnoreLayoutChanges(true);
++    this._hideGrid();
++    this._hideGridElements();
++    this._hideGridAreaInfoBar();
++    this._hideGridCellInfoBar();
++    this._hideGridLineInfoBar();
++    setIgnoreLayoutChanges(false, this.highlighterEnv.document.documentElement);
++  }
++
++  _hideGrid() {
++    this.getElement("canvas").setAttribute("hidden", "true");
++  }
++
++  _hideGridAreaInfoBar() {
++    this.getElement("area-infobar-container").setAttribute("hidden", "true");
++  }
++
++  _hideGridCellInfoBar() {
++    this.getElement("cell-infobar-container").setAttribute("hidden", "true");
++  }
++
++  _hideGridElements() {
++    this.getElement("elements").setAttribute("hidden", "true");
++  }
++
++  _hideGridLineInfoBar() {
++    this.getElement("line-infobar-container").setAttribute("hidden", "true");
++  }
+ 
+-    if (isTopLevel) {
+-      this.hide();
++  /**
++   * Checks if the current node has a CSS Grid layout.
++   *
++   * @return {Boolean} true if the current node has a CSS grid layout, false otherwise.
++   */
++  isGrid() {
++    return this.currentNode.getGridFragments().length > 0;
++  }
++
++  /**
++   * Is a given grid fragment valid? i.e. does it actually have tracks? In some cases, we
++   * may have a fragment that defines column tracks but doesn't have any rows (or vice
++   * versa). In which case we do not want to draw anything for that fragment.
++   *
++   * @param  {Object} fragment
++   * @return {Boolean}
++   */
++  isValidFragment(fragment) {
++    return fragment.cols.tracks.length && fragment.rows.tracks.length;
++  }
++
++  /**
++   * The <canvas>'s position needs to be updated if the page scrolls too much, in order
++   * to give the illusion that it always covers the viewport.
++   */
++  _scrollUpdate() {
++    let hasUpdated = updateCanvasPosition(this._canvasPosition, this._scroll, this.win,
++      this._winDimensions);
++
++    if (hasUpdated) {
++      this._update();
+     }
+   }
+ 
+   _show() {
+     if (!this.isGrid()) {
+       this.hide();
+       return false;
+     }
+ 
+     // The grid pattern cache should be cleared in case the color changed.
+-    this._clearCache();
++    this.clearCache();
+ 
+     // Hide the canvas, grid element highlights and infobar.
+     this._hide();
+ 
+     return this._update();
+   }
+ 
+-  _clearCache() {
+-    gCachedGridPattern.clear();
++  _showGrid() {
++    this.getElement("canvas").removeAttribute("hidden");
++  }
++
++  _showGridAreaInfoBar() {
++    this.getElement("area-infobar-container").removeAttribute("hidden");
++  }
++
++  _showGridCellInfoBar() {
++    this.getElement("cell-infobar-container").removeAttribute("hidden");
++  }
++
++  _showGridElements() {
++    this.getElement("elements").removeAttribute("hidden");
++  }
++
++  _showGridLineInfoBar() {
++    this.getElement("line-infobar-container").removeAttribute("hidden");
++  }
++
++  /**
++   * Shows all the grid area highlights for the current grid.
++   */
++  showAllGridAreas() {
++    this.renderGridArea();
+   }
+ 
+   /**
+    * Shows the grid area highlight for the given area name.
+    *
+    * @param  {String} areaName
+    *         Grid area name.
+    */
+   showGridArea(areaName) {
+     this.renderGridArea(areaName);
+   }
+ 
+   /**
+-   * Shows all the grid area highlights for the current grid.
+-   */
+-  showAllGridAreas() {
+-    this.renderGridArea();
+-  }
+-
+-  /**
+-   * Clear the grid area highlights.
+-   */
+-  clearGridAreas() {
+-    let areas = this.getElement("areas");
+-    areas.setAttribute("d", "");
+-  }
+-
+-  /**
+    * Shows the grid cell highlight for the given grid cell options.
+    *
+    * @param  {Number} options.gridFragmentIndex
+    *         Index of the grid fragment to render the grid cell highlight.
+    * @param  {Number} options.rowNumber
+    *         Row number of the grid cell to highlight.
+    * @param  {Number} options.columnNumber
+    *         Column number of the grid cell to highlight.
+@@ -573,64 +698,756 @@ class CssGridHighlighter extends AutoRef
+    * @param  {String} options.type
+    *         The dimension type of the grid line.
+    */
+   showGridLineNames({ gridFragmentIndex, lineNumber, type }) {
+     this.renderGridLineNames(gridFragmentIndex, lineNumber, type);
+   }
+ 
+   /**
+-   * Clear the grid cell highlights.
++   * If a page hide event is triggered for current window's highlighter, hide the
++   * highlighter.
++   */
++  onPageHide({ target }) {
++    if (target.defaultView === this.win) {
++      this.hide();
++    }
++  }
++
++  /**
++   * Called when the page will-navigate. Used to hide the grid highlighter and clear
++   * the cached gap patterns and avoid using DeadWrapper obejcts as gap patterns the
++   * next time.
+    */
+-  clearGridCell() {
+-    let cells = this.getElement("cells");
+-    cells.setAttribute("d", "");
++  onWillNavigate({ isTopLevel }) {
++    this.clearCache();
++
++    if (isTopLevel) {
++      this.hide();
++    }
++  }
++
++  renderFragment(fragment) {
++    if (!this.isValidFragment(fragment)) {
++      return;
++    }
++
++    this.renderLines(fragment.cols, COLUMNS, this.getFirstRowLinePos(fragment),
++      this.getLastRowLinePos(fragment));
++    this.renderLines(fragment.rows, ROWS, this.getFirstColLinePos(fragment),
++      this.getLastColLinePos(fragment));
++
++    if (this.options.showGridAreasOverlay) {
++      this.renderGridAreaOverlay();
++    }
++
++    // Line numbers are rendered in a 2nd step to avoid overlapping with existing lines.
++    if (this.options.showGridLineNumbers) {
++      this.renderLineNumbers(fragment.cols, COLUMNS, this.getFirstRowLinePos(fragment));
++      this.renderLineNumbers(fragment.rows, ROWS, this.getFirstColLinePos(fragment));
++
++      if (Services.prefs.getBoolPref(NEGATIVE_LINE_NUMBERS_PREF)) {
++        this.renderNegativeLineNumbers(fragment.cols, COLUMNS,
++          this.getLastRowLinePos(fragment));
++        this.renderNegativeLineNumbers(fragment.rows, ROWS,
++          this.getLastColLinePos(fragment));
++      }
++    }
++  }
++
++  /**
++   * Render the grid area highlight for the given area name or for all the grid areas.
++   *
++   * @param  {String} areaName
++   *         Name of the grid area to be highlighted. If no area name is provided, all
++   *         the grid areas should be highlighted.
++   */
++  renderGridArea(areaName) {
++    let { devicePixelRatio } = this.win;
++    let displayPixelRatio = getDisplayPixelRatio(this.win);
++    let paths = [];
++
++    for (let i = 0; i < this.gridData.length; i++) {
++      let fragment = this.gridData[i];
++
++      for (let area of fragment.areas) {
++        if (areaName && areaName != area.name) {
++          continue;
++        }
++
++        let rowStart = fragment.rows.lines[area.rowStart - 1];
++        let rowEnd = fragment.rows.lines[area.rowEnd - 1];
++        let columnStart = fragment.cols.lines[area.columnStart - 1];
++        let columnEnd = fragment.cols.lines[area.columnEnd - 1];
++
++        let x1 = columnStart.start + columnStart.breadth;
++        let y1 = rowStart.start + rowStart.breadth;
++        let x2 = columnEnd.start;
++        let y2 = rowEnd.start;
++
++        let points = getPointsFromDiagonal(x1, y1, x2, y2, this.currentMatrix);
++
++        // Scale down by `devicePixelRatio` since SVG element already take them into
++        // account.
++        let svgPoints = points.map(point => ({
++          x: Math.round(point.x / devicePixelRatio),
++          y: Math.round(point.y / devicePixelRatio)
++        }));
++
++        // Scale down by `displayPixelRatio` since infobar's HTML elements already take it
++        // into account; and the zoom scaling is handled by `moveInfobar`.
++        let bounds = getBoundsFromPoints(points.map(point => ({
++          x: Math.round(point.x / displayPixelRatio),
++          y: Math.round(point.y / displayPixelRatio)
++        })));
++
++        paths.push(getPathDescriptionFromPoints(svgPoints));
++
++        // Update and show the info bar when only displaying a single grid area.
++        if (areaName) {
++          this._showGridAreaInfoBar();
++          this._updateGridAreaInfobar(area, bounds);
++        }
++      }
++    }
++
++    let areas = this.getElement("areas");
++    areas.setAttribute("d", paths.join(" "));
+   }
+ 
+   /**
+-   * Checks if the current node has a CSS Grid layout.
++   * Render grid area name on the containing grid area cell.
+    *
+-   * @return {Boolean} true if the current node has a CSS grid layout, false otherwise.
++   * @param  {Object} fragment
++   *         The grid fragment of the grid container.
++   * @param  {Object} area
++   *         The area overlay to render on the CSS highlighter canvas.
++   */
++  renderGridAreaName(fragment, area) {
++    let { rowStart, rowEnd, columnStart, columnEnd } = area;
++    let { devicePixelRatio } = this.win;
++    let displayPixelRatio = getDisplayPixelRatio(this.win);
++    let offset = (displayPixelRatio / 2) % 1;
++    let fontSize = GRID_AREA_NAME_FONT_SIZE * displayPixelRatio;
++    let canvasX = Math.round(this._canvasPosition.x * devicePixelRatio);
++    let canvasY = Math.round(this._canvasPosition.y * devicePixelRatio);
++
++    this.ctx.save();
++    this.ctx.translate(offset - canvasX, offset - canvasY);
++    this.ctx.font = fontSize + "px " + GRID_FONT_FAMILY;
++    this.ctx.strokeStyle = this.color;
++    this.ctx.textAlign = "center";
++    this.ctx.textBaseline = "middle";
++
++    // Draw the text for the grid area name.
++    for (let rowNumber = rowStart; rowNumber < rowEnd; rowNumber++) {
++      for (let columnNumber = columnStart; columnNumber < columnEnd; columnNumber++) {
++        let row = fragment.rows.tracks[rowNumber - 1];
++        let column = fragment.cols.tracks[columnNumber - 1];
++
++        // Check if the font size is exceeds the bounds of the containing grid cell.
++        if (fontSize > (column.breadth * displayPixelRatio) ||
++            fontSize > (row.breadth * displayPixelRatio)) {
++          fontSize = (column.breadth + row.breadth) / 2;
++          this.ctx.font = fontSize + "px " + GRID_FONT_FAMILY;
++        }
++
++        let textWidth = this.ctx.measureText(area.name).width;
++        // The width of the character 'm' approximates the height of the text.
++        let textHeight = this.ctx.measureText("m").width;
++        // Padding in pixels for the line number text inside of the line number container.
++        let padding = 3 * displayPixelRatio;
++
++        let boxWidth = textWidth + 2 * padding;
++        let boxHeight = textHeight + 2 * padding;
++
++        let x = column.start + column.breadth / 2;
++        let y = row.start + row.breadth / 2;
++
++        [x, y] = apply(this.currentMatrix, [x, y]);
++
++        let rectXPos = x - boxWidth / 2;
++        let rectYPos = y - boxHeight / 2;
++
++        // Draw a rounded rectangle with a border width of 1 pixel,
++        // a border color matching the grid color, and a white background.
++        this.ctx.lineWidth = 1 * displayPixelRatio;
++        this.ctx.strokeStyle = this.color;
++        this.ctx.fillStyle = "white";
++        let radius = 2 * displayPixelRatio;
++        drawRoundedRect(this.ctx, rectXPos, rectYPos, boxWidth, boxHeight, radius);
++
++        this.ctx.fillStyle = this.color;
++        this.ctx.fillText(area.name, x, y + padding);
++      }
++    }
++
++    this.ctx.restore();
++  }
++
++  /**
++   * Renders the grid area overlay on the css grid highlighter canvas.
+    */
+-  isGrid() {
+-    return this.currentNode.getGridFragments().length > 0;
++  renderGridAreaOverlay() {
++    let padding = 1;
++
++    for (let i = 0; i < this.gridData.length; i++) {
++      let fragment = this.gridData[i];
++
++      for (let area of fragment.areas) {
++        let { rowStart, rowEnd, columnStart, columnEnd, type } = area;
++
++        if (type === "implicit") {
++          continue;
++        }
++
++        // Draw the line edges for the grid area.
++        const areaColStart = fragment.cols.lines[columnStart - 1];
++        const areaColEnd = fragment.cols.lines[columnEnd - 1];
++
++        const areaRowStart = fragment.rows.lines[rowStart - 1];
++        const areaRowEnd = fragment.rows.lines[rowEnd - 1];
++
++        const areaColStartLinePos = areaColStart.start + areaColStart.breadth;
++        const areaRowStartLinePos = areaRowStart.start + areaRowStart.breadth;
++
++        this.renderLine(areaColStartLinePos + padding, areaRowStartLinePos,
++          areaRowEnd.start, COLUMNS, "areaEdge");
++        this.renderLine(areaColEnd.start - padding, areaRowStartLinePos,
++          areaRowEnd.start, COLUMNS, "areaEdge");
++
++        this.renderLine(areaRowStartLinePos + padding, areaColStartLinePos,
++          areaColEnd.start, ROWS, "areaEdge");
++        this.renderLine(areaRowEnd.start - padding, areaColStartLinePos, areaColEnd.start,
++          ROWS, "areaEdge");
++
++        this.renderGridAreaName(fragment, area);
++      }
++    }
++  }
++
++  /**
++   * Render the grid cell highlight for the given grid fragment index, row and column
++   * number.
++   *
++   * @param  {Number} gridFragmentIndex
++   *         Index of the grid fragment to render the grid cell highlight.
++   * @param  {Number} rowNumber
++   *         Row number of the grid cell to highlight.
++   * @param  {Number} columnNumber
++   *         Column number of the grid cell to highlight.
++   */
++  renderGridCell(gridFragmentIndex, rowNumber, columnNumber) {
++    let fragment = this.gridData[gridFragmentIndex];
++
++    if (!fragment) {
++      return;
++    }
++
++    let row = fragment.rows.tracks[rowNumber - 1];
++    let column = fragment.cols.tracks[columnNumber - 1];
++
++    if (!row || !column) {
++      return;
++    }
++
++    let x1 = column.start;
++    let y1 = row.start;
++    let x2 = column.start + column.breadth;
++    let y2 = row.start + row.breadth;
++
++    let { devicePixelRatio } = this.win;
++    let displayPixelRatio = getDisplayPixelRatio(this.win);
++    let points = getPointsFromDiagonal(x1, y1, x2, y2, this.currentMatrix);
++
++    // Scale down by `devicePixelRatio` since SVG element already take them into account.
++    let svgPoints = points.map(point => ({
++      x: Math.round(point.x / devicePixelRatio),
++      y: Math.round(point.y / devicePixelRatio)
++    }));
++
++    // Scale down by `displayPixelRatio` since infobar's HTML elements already take it
++    // into account, and the zoom scaling is handled by `moveInfobar`.
++    let bounds = getBoundsFromPoints(points.map(point => ({
++      x: Math.round(point.x / displayPixelRatio),
++      y: Math.round(point.y / displayPixelRatio)
++    })));
++
++    let cells = this.getElement("cells");
++    cells.setAttribute("d", getPathDescriptionFromPoints(svgPoints));
++
++    this._showGridCellInfoBar();
++    this._updateGridCellInfobar(rowNumber, columnNumber, bounds);
++  }
++
++  /**
++   * Render the grid gap area on the css grid highlighter canvas.
++   *
++   * @param  {Number} linePos
++   *         The line position along the x-axis for a column grid line and
++   *         y-axis for a row grid line.
++   * @param  {Number} startPos
++   *         The start position of the cross side of the grid line.
++   * @param  {Number} endPos
++   *         The end position of the cross side of the grid line.
++   * @param  {Number} breadth
++   *         The grid line breadth value.
++   * @param  {String} dimensionType
++   *         The grid dimension type which is either the constant COLUMNS or ROWS.
++   */
++  renderGridGap(linePos, startPos, endPos, breadth, dimensionType) {
++    let { devicePixelRatio } = this.win;
++    let displayPixelRatio = getDisplayPixelRatio(this.win);
++    let offset = (displayPixelRatio / 2) % 1;
++    let canvasX = Math.round(this._canvasPosition.x * devicePixelRatio);
++    let canvasY = Math.round(this._canvasPosition.y * devicePixelRatio);
++
++    linePos = Math.round(linePos);
++    startPos = Math.round(startPos);
++    breadth = Math.round(breadth);
++
++    this.ctx.save();
++    this.ctx.fillStyle = this.getGridGapPattern(devicePixelRatio, dimensionType);
++    this.ctx.translate(offset - canvasX, offset - canvasY);
++
++    if (dimensionType === COLUMNS) {
++      if (isFinite(endPos)) {
++        endPos = Math.round(endPos);
++      } else {
++        endPos = this._winDimensions.height;
++        startPos = -endPos;
++      }
++      drawRect(this.ctx, linePos, startPos, linePos + breadth, endPos,
++        this.currentMatrix);
++    } else {
++      if (isFinite(endPos)) {
++        endPos = Math.round(endPos);
++      } else {
++        endPos = this._winDimensions.width;
++        startPos = -endPos;
++      }
++      drawRect(this.ctx, startPos, linePos, endPos, linePos + breadth,
++        this.currentMatrix);
++    }
++
++    this.ctx.fill();
++    this.ctx.restore();
+   }
+ 
+   /**
+-   * Is a given grid fragment valid? i.e. does it actually have tracks? In some cases, we
+-   * may have a fragment that defines column tracks but doesn't have any rows (or vice
+-   * versa). In which case we do not want to draw anything for that fragment.
++   * Render the grid line name highlight for the given grid fragment index, lineNumber,
++   * and dimensionType.
++   *
++   * @param  {Number} gridFragmentIndex
++   *         Index of the grid fragment to render the grid line highlight.
++   * @param  {Number} lineNumber
++   *         Line number of the grid line to highlight.
++   * @param  {String} dimensionType
++   *         The dimension type of the grid line.
++   */
++  renderGridLineNames(gridFragmentIndex, lineNumber, dimensionType) {
++    let fragment = this.gridData[gridFragmentIndex];
++
++    if (!fragment || !lineNumber || !dimensionType) {
++      return;
++    }
++
++    const { names } = fragment[dimensionType].lines[lineNumber - 1];
++    let linePos;
++
++    if (dimensionType === ROWS) {
++      linePos = fragment.rows.lines[lineNumber - 1];
++    } else if (dimensionType === COLUMNS) {
++      linePos = fragment.cols.lines[lineNumber - 1];
++    }
++
++    if (!linePos) {
++      return;
++    }
++
++    let currentZoom = getCurrentZoom(this.win);
++    let { bounds } = this.currentQuads.content[gridFragmentIndex];
++
++    const rowYPosition = fragment.rows.lines[0];
++    const colXPosition = fragment.rows.lines[0];
++
++    let x = dimensionType === COLUMNS
++      ? linePos.start + (bounds.left / currentZoom)
++      : colXPosition.start + (bounds.left / currentZoom);
++
++    let y = dimensionType === ROWS
++      ? linePos.start + (bounds.top / currentZoom)
++      : rowYPosition.start + (bounds.top / currentZoom);
++
++    this._showGridLineInfoBar();
++    this._updateGridLineInfobar(names.join(", "), lineNumber, x, y);
++  }
++
++  /**
++   * Render the grid line number on the css grid highlighter canvas.
+    *
+-   * @param {Object} fragment
+-   * @return {Boolean}
++   * @param  {Number} lineNumber
++   *         The grid line number.
++   * @param  {Number} linePos
++   *         The line position along the x-axis for a column grid line and
++   *         y-axis for a row grid line.
++   * @param  {Number} startPos
++   *         The start position of the cross side of the grid line.
++   * @param  {Number} breadth
++   *         The grid line breadth value.
++   * @param  {String} dimensionType
++   *         The grid dimension type which is either the constant COLUMNS or ROWS.
++   * @param  {Number||undefined} stackedLineIndex
++   *         The line index position of the stacked line.
+    */
+-  isValidFragment(fragment) {
+-    return fragment.cols.tracks.length && fragment.rows.tracks.length;
++  renderGridLineNumber(lineNumber, linePos, startPos, breadth, dimensionType,
++    stackedLineIndex) {
++    let displayPixelRatio = getDisplayPixelRatio(this.win);
++    let { devicePixelRatio } = this.win;
++    let offset = (displayPixelRatio / 2) % 1;
++    let fontSize = GRID_FONT_SIZE * displayPixelRatio;
++    let canvasX = Math.round(this._canvasPosition.x * devicePixelRatio);
++    let canvasY = Math.round(this._canvasPosition.y * devicePixelRatio);
++
++    linePos = Math.round(linePos);
++    startPos = Math.round(startPos);
++    breadth = Math.round(breadth);
++
++    if (linePos + breadth < 0) {
++      // Don't render the line number since the line is not visible on screen.
++      return;
++    }
++
++    this.ctx.save();
++    this.ctx.translate(offset - canvasX, offset - canvasY);
++    this.ctx.font = fontSize + "px " + GRID_FONT_FAMILY;
++
++    // For a general grid box, the height of the character "m" will be its minimum width
++    // and height. If line number's text width is greater, then use the grid box's text
++    // width instead.
++    let textHeight = this.ctx.measureText("m").width;
++    let textWidth = Math.max(textHeight, this.ctx.measureText(lineNumber).width);
++
++    // Padding in pixels for the line number text inside of the line number container.
++    let padding = 3 * displayPixelRatio;
++    let offsetFromEdge = 2 * displayPixelRatio;
++
++    let boxWidth = textWidth + 2 * padding;
++    let boxHeight = textHeight + 2 * padding;
++
++    // Calculate the x & y coordinates for the line number container, so that its arrow
++    // tip is centered on the line (or the gap if there is one), and is offset by the
++    // calculated padding value from the grid container edge.
++    let x, y;
++
++    if (dimensionType === COLUMNS) {
++      x = linePos + breadth / 2;
++      y = startPos;
++
++      if (lineNumber > 0) {
++        y -= offsetFromEdge;
++      } else {
++        y += offsetFromEdge;
++      }
++    } else if (dimensionType === ROWS) {
++      x = startPos;
++      y = linePos + breadth / 2;
++
++      if (lineNumber > 0) {
++        x -= offsetFromEdge;
++      } else {
++        x += offsetFromEdge;
++      }
++    }
++
++    [x, y] = apply(this.currentMatrix, [x, y]);
++
++    if (stackedLineIndex) {
++      // Offset the stacked line number by half of the box's width/height.
++      const xOffset = boxWidth / 4;
++      const yOffset = boxHeight / 4;
++
++      if (lineNumber > 0) {
++        x -= xOffset;
++        y -= yOffset;
++      } else {
++        x += xOffset;
++        y += yOffset;
++      }
++    }
++
++    if (!this.hasNodeTransformations) {
++      x = Math.max(x, padding);
++      y = Math.max(y, padding);
++    }
++
++    // Draw a bubble rectanglular arrow with a border width of 2 pixels, a border color
++    // matching the grid color and a white background (the line number will be written in
++    // black).
++    this.ctx.lineWidth = 2 * displayPixelRatio;
++    this.ctx.strokeStyle = this.color;
++    this.ctx.fillStyle = "white";
++
++    // See param definitions of drawBubbleRect.
++    let radius = 2 * displayPixelRatio;
++    let margin = 2 * displayPixelRatio;
++    let arrowSize = 8 * displayPixelRatio;
++
++    let minBoxSize = arrowSize * 2 + padding;
++    boxWidth = Math.max(boxWidth, minBoxSize);
++    boxHeight = Math.max(boxHeight, minBoxSize);
++
++    if (dimensionType === COLUMNS) {
++      if (lineNumber > 0) {
++        drawBubbleRect(this.ctx, x, y, boxWidth, boxHeight, radius, margin, arrowSize,
++          "top");
++        // After drawing the number box, we need to center the x/y coordinates of the
++        // number text written it.
++        y -= (boxHeight + arrowSize + radius) - boxHeight / 2;
++      } else {
++        drawBubbleRect(this.ctx, x, y, boxWidth, boxHeight, radius, margin, arrowSize,
++          "bottom");
++        y += (boxHeight + arrowSize + radius) - boxHeight / 2;
++      }
++    } else if (dimensionType === ROWS) {
++      if (lineNumber > 0) {
++        drawBubbleRect(this.ctx, x, y, boxWidth, boxHeight, radius, margin, arrowSize,
++          "left");
++        x -= (boxWidth + arrowSize + radius) - boxWidth / 2;
++      } else {
++        drawBubbleRect(this.ctx, x, y, boxWidth, boxHeight, radius, margin, arrowSize,
++          "right");
++        x += (boxWidth + arrowSize + radius) - boxWidth / 2;
++      }
++    }
++
++    // Write the line number inside of the rectangle.
++    this.ctx.textAlign = "center";
++    this.ctx.textBaseline = "middle";
++    this.ctx.fillStyle = "black";
++    const numberText = stackedLineIndex ? "" : lineNumber;
++    this.ctx.fillText(numberText, x, y);
++    this.ctx.restore();
+   }
+ 
+   /**
+-   * The AutoRefreshHighlighter's _hasMoved method returns true only if the
+-   * element's quads have changed. Override it so it also returns true if the
+-   * element's grid has changed (which can happen when you change the
+-   * grid-template-* CSS properties with the highlighter displayed).
++   * Render the grid line on the css grid highlighter canvas.
++   *
++   * @param  {Number} linePos
++   *         The line position along the x-axis for a column grid line and
++   *         y-axis for a row grid line.
++   * @param  {Number} startPos
++   *         The start position of the cross side of the grid line.
++   * @param  {Number} endPos
++   *         The end position of the cross side of the grid line.
++   * @param  {String} dimensionType
++   *         The grid dimension type which is either the constant COLUMNS or ROWS.
++   * @param  {String} lineType
++   *         The grid line type - "edge", "explicit", or "implicit".
++   */
++  renderLine(linePos, startPos, endPos, dimensionType, lineType) {
++    let { devicePixelRatio } = this.win;
++    let lineWidth = getDisplayPixelRatio(this.win);
++    let offset = (lineWidth / 2) % 1;
++    let canvasX = Math.round(this._canvasPosition.x * devicePixelRatio);
++    let canvasY = Math.round(this._canvasPosition.y * devicePixelRatio);
++
++    linePos = Math.round(linePos);
++    startPos = Math.round(startPos);
++    endPos = Math.round(endPos);
++
++    this.ctx.save();
++    this.ctx.setLineDash(GRID_LINES_PROPERTIES[lineType].lineDash);
++    this.ctx.beginPath();
++    this.ctx.translate(offset - canvasX, offset - canvasY);
++
++    let lineOptions = {
++      matrix: this.currentMatrix
++    };
++
++    if (this.options.showInfiniteLines) {
++      lineOptions.extendToBoundaries = [canvasX, canvasY, canvasX + CANVAS_SIZE,
++                                        canvasY + CANVAS_SIZE];
++    }
++
++    if (dimensionType === COLUMNS) {
++      drawLine(this.ctx, linePos, startPos, linePos, endPos, lineOptions);
++    } else {
++      drawLine(this.ctx, startPos, linePos, endPos, linePos, lineOptions);
++    }
++
++    this.ctx.strokeStyle = this.color;
++    this.ctx.globalAlpha = GRID_LINES_PROPERTIES[lineType].alpha;
++
++    if (GRID_LINES_PROPERTIES[lineType].lineWidth) {
++      this.ctx.lineWidth = GRID_LINES_PROPERTIES[lineType].lineWidth * devicePixelRatio;
++    } else {
++      this.ctx.lineWidth = lineWidth;
++    }
++
++    this.ctx.stroke();
++    this.ctx.restore();
++  }
++
++  /**
++   * Render the grid lines given the grid dimension information of the
++   * column or row lines.
++   *
++   * @param  {GridDimension} gridDimension
++   *         Column or row grid dimension object.
++   * @param  {Object} quad.bounds
++   *         The content bounds of the box model region quads.
++   * @param  {String} dimensionType
++   *         The grid dimension type which is either the constant COLUMNS or ROWS.
++   * @param  {Number} startPos
++   *         The start position of the cross side ("left" for ROWS and "top" for COLUMNS)
++   *         of the grid dimension.
++   * @param  {Number} endPos
++   *         The end position of the cross side ("left" for ROWS and "top" for COLUMNS)
++   *         of the grid dimension.
+    */
+-  _hasMoved() {
+-    let hasMoved = AutoRefreshHighlighter.prototype._hasMoved.call(this);
++  renderLines(gridDimension, dimensionType, startPos, endPos) {
++    const { lines, tracks } = gridDimension;
++    const lastEdgeLineIndex = this.getLastEdgeLineIndex(tracks);
++
++    for (let i = 0; i < lines.length; i++) {
++      let line = lines[i];
++      let linePos = line.start;
++
++      if (i == 0 || i == lastEdgeLineIndex) {
++        this.renderLine(linePos, startPos, endPos, dimensionType, "edge");
++      } else {
++        this.renderLine(linePos, startPos, endPos, dimensionType, tracks[i - 1].type);
++      }
++
++      // Render a second line to illustrate the gutter for non-zero breadth.
++      if (line.breadth > 0) {
++        this.renderGridGap(linePos, startPos, endPos, line.breadth, dimensionType);
++        this.renderLine(linePos + line.breadth, startPos, endPos, dimensionType,
++          tracks[i].type);
++      }
++    }
++  }
++
++  /**
++   * Render the grid lines given the grid dimension information of the
++   * column or row lines.
++   *
++   * @param  {GridDimension} gridDimension
++   *         Column or row grid dimension object.
++   * @param  {String} dimensionType
++   *         The grid dimension type which is either the constant COLUMNS or ROWS.
++   * @param  {Number} startPos
++   *         The start position of the cross side ("left" for ROWS and "top" for COLUMNS)
++   *         of the grid dimension.
++   */
++  renderLineNumbers(gridDimension, dimensionType, startPos) {
++    const { lines, tracks } = gridDimension;
++    // Keep track of the number of collapsed lines per line position.
++    let stackedLines = [];
++
++    for (let i = 0, line; (line = lines[i++]);) {
++      // If you place something using negative numbers, you can trigger some implicit
++      // grid creation above and to the left of the explicit grid (assuming a
++      // horizontal-tb writing mode).
++      //
++      // The first explicit grid line gets the number of 1, and any implicit grid lines
++      // before 1 get negative numbers. Since here we're rendering only the positive line
++      // numbers, we have to skip any implicit grid lines before the first one that is
++      // explicit. The API returns a 0 as the line's number for these implicit lines that
++      // occurs before the first explicit line.
++      if (line.number === 0) {
++        continue;
++      }
++
++      // Check for overlapping lines. We render a second box beneath the last overlapping
++      // line number to indicate there are lines beneath it.
++      const gridLine = tracks[line.number - 1];
++
++      if (gridLine) {
++        const { breadth }  = gridLine;
++
++        if (breadth === 0) {
++          stackedLines.push(lines[i].number);
+ 
+-    let oldGridData = stringifyGridFragments(this.gridData);
+-    this.gridData = this.currentNode.getGridFragments();
+-    let newGridData = stringifyGridFragments(this.gridData);
++          if (stackedLines.length > 0) {
++            this.renderGridLineNumber(line.number, line.start, startPos, line.breadth,
++              dimensionType, 1);
++          }
++
++          continue;
++        }
++      }
++
++      this.renderGridLineNumber(line.number, line.start, startPos, line.breadth,
++        dimensionType);
++    }
++  }
++
++  /**
++   * Render the negative grid lines given the grid dimension information of the
++   * column or row lines.
++   *
++   * @param  {GridDimension} gridDimension
++   *         Column or row grid dimension object.
++   * @param  {String} dimensionType
++   *         The grid dimension type which is either the constant COLUMNS or ROWS.
++   * @param  {Number} startPos
++   *         The start position of the cross side ("left" for ROWS and "top" for COLUMNS)
++   *         of the grid dimension.
++   */
++  renderNegativeLineNumbers(gridDimension, dimensionType, startPos) {
++    const { lines, tracks } = gridDimension;
++    // Keep track of the number of collapsed lines per line position.
++    let stackedLines = [];
++
++    for (let i = 0, line; (line = lines[i++]);) {
++      let linePos = line.start;
++      let negativeLineNumber = line.negativeNumber;
+ 
+-    return hasMoved || oldGridData !== newGridData;
++      // Don't render any negative line number greater than -1.
++      if (negativeLineNumber == 0) {
++        break;
++      }
++
++      // Check for overlapping lines. We render a second box beneath the last overlapping
++      // line number to indicate there are lines beneath it.
++      const gridLine = tracks[line.number - 1];
++
++      if (gridLine) {
++        const { breadth }  = gridLine;
++
++        if (breadth === 0) {
++          stackedLines.push(negativeLineNumber);
++
++          if (stackedLines.length > 0) {
++            this.renderGridLineNumber(negativeLineNumber, linePos, startPos,
++              line.breadth, dimensionType, 1);
++          }
++
++          continue;
++        }
++      }
++
++      // For negative line numbers, we want to display the smallest
++      // value at the front of the stack.
++      if (stackedLines.length) {
++        negativeLineNumber = stackedLines[0];
++        stackedLines = [];
++      }
++
++      this.renderGridLineNumber(negativeLineNumber, linePos, startPos, line.breadth,
++        dimensionType);
++    }
+   }
+ 
+   /**
+    * Update the highlighter on the current highlighted node (the one that was
+-   * passed as an argument to show(node)).
+-   * Should be called whenever node's geometry or grid changes.
++   * passed as an argument to show(node)). Should be called whenever node's geometry
++   * or grid changes.
+    */
+   _update() {
+     setIgnoreLayoutChanges(true);
+ 
+     let root = this.getElement("root");
+     let cells = this.getElement("cells");
+     let areas = this.getElement("areas");
+ 
+@@ -648,17 +1465,17 @@ class CssGridHighlighter extends AutoRef
+     // Updates the <canvas> element's position and size.
+     // It also clear the <canvas>'s drawing context.
+     updateCanvasElement(this.canvas, this._canvasPosition, this.win.devicePixelRatio);
+ 
+     // Clear the grid area highlights.
+     this.clearGridAreas();
+     this.clearGridCell();
+ 
+-    // Update the current matrix used in our canvas' rendering
++    // Update the current matrix used in our canvas' rendering.
+     let { currentMatrix, hasNodeTransformations } = getCurrentMatrix(this.currentNode,
+       this.win);
+     this.currentMatrix = currentMatrix;
+     this.hasNodeTransformations = hasNodeTransformations;
+ 
+     // Start drawing the grid fragments.
+     for (let i = 0; i < this.gridData.length; i++) {
+       this.renderFragment(this.gridData[i]);
+@@ -725,18 +1542,18 @@ class CssGridHighlighter extends AutoRef
+    * @param  {Object} bounds
+    *         A DOMRect-like object represent the grid cell rectangle.
+    */
+   _updateGridCellInfobar(rowNumber, columnNumber, bounds) {
+     let { width, height } = bounds;
+     let dim = parseFloat(width.toPrecision(6)) +
+               " \u00D7 " +
+               parseFloat(height.toPrecision(6));
+-    let position = LAYOUT_L10N.getFormatStr("layout.rowColumnPositions",
+-                   rowNumber, columnNumber);
++    let position = LAYOUT_L10N.getFormatStr("layout.rowColumnPositions", rowNumber,
++      columnNumber);
+ 
+     this.getElement("cell-infobar-position").setTextContent(position);
+     this.getElement("cell-infobar-dimensions").setTextContent(dim);
+ 
+     let container = this.getElement("cell-infobar-container");
+     moveInfobar(container, bounds, this.win, {
+       position: "top",
+       hideIfOffscreen: true
+@@ -755,855 +1572,14 @@ class CssGridHighlighter extends AutoRef
+    * @param  {Number} y
+    *         The y-coordinate of the grid line.
+    */
+   _updateGridLineInfobar(gridLineNames, gridLineNumber, x, y) {
+     this.getElement("line-infobar-number").setTextContent(gridLineNumber);
+     this.getElement("line-infobar-names").setTextContent(gridLineNames);
+ 
+     let container = this.getElement("line-infobar-container");
+-    moveInfobar(container,
+-      getBoundsFromPoints([{x, y}, {x, y}, {x, y}, {x, y}]), this.win);
+-  }
+-
+-  /**
+-   * The <canvas>'s position needs to be updated if the page scrolls too much, in order
+-   * to give the illusion that it always covers the viewport.
+-   */
+-  _scrollUpdate() {
+-    let hasUpdated = updateCanvasPosition(this._canvasPosition, this._scroll, this.win,
+-      this._winDimensions);
+-
+-    if (hasUpdated) {
+-      this._update();
+-    }
+-  }
+-
+-  getFirstRowLinePos(fragment) {
+-    return fragment.rows.lines[0].start;
+-  }
+-
+-  getLastRowLinePos(fragment) {
+-    return fragment.rows.lines[fragment.rows.lines.length - 1].start;
+-  }
+-
+-  getFirstColLinePos(fragment) {
+-    return fragment.cols.lines[0].start;
+-  }
+-
+-  getLastColLinePos(fragment) {
+-    return fragment.cols.lines[fragment.cols.lines.length - 1].start;
+-  }
+-
+-  /**
+-   * Get the GridLine index of the last edge of the explicit grid for a grid dimension.
+-   *
+-   * @param  {GridTracks} tracks
+-   *         The grid track of a given grid dimension.
+-   * @return {Number} index of the last edge of the explicit grid for a grid dimension.
+-   */
+-  getLastEdgeLineIndex(tracks) {
+-    let trackIndex = tracks.length - 1;
+-
+-    // Traverse the grid track backwards until we find an explicit track.
+-    while (trackIndex >= 0 && tracks[trackIndex].type != "explicit") {
+-      trackIndex--;
+-    }
+-
+-    // The grid line index is the grid track index + 1.
+-    return trackIndex + 1;
+-  }
+-
+-  renderFragment(fragment) {
+-    if (!this.isValidFragment(fragment)) {
+-      return;
+-    }
+-
+-    this.renderLines(fragment.cols, COLUMNS, "left", "top", "height",
+-                     this.getFirstRowLinePos(fragment),
+-                     this.getLastRowLinePos(fragment));
+-    this.renderLines(fragment.rows, ROWS, "top", "left", "width",
+-                     this.getFirstColLinePos(fragment),
+-                     this.getLastColLinePos(fragment));
+-
+-    if (this.options.showGridAreasOverlay) {
+-      this.renderGridAreaOverlay();
+-    }
+-
+-    // Line numbers are rendered in a 2nd step to avoid overlapping with existing lines.
+-    if (this.options.showGridLineNumbers) {
+-      this.renderLineNumbers(fragment.cols, COLUMNS, "left", "top",
+-                       this.getFirstRowLinePos(fragment));
+-      this.renderLineNumbers(fragment.rows, ROWS, "top", "left",
+-                       this.getFirstColLinePos(fragment));
+-
+-      if (Services.prefs.getBoolPref(NEGATIVE_LINE_NUMBERS_PREF)) {
+-        this.renderNegativeLineNumbers(fragment.cols, COLUMNS, "left", "top",
+-                          this.getLastRowLinePos(fragment));
+-        this.renderNegativeLineNumbers(fragment.rows, ROWS, "top", "left",
+-                          this.getLastColLinePos(fragment));
+-      }
+-    }
+-  }
+-
+-  /**
+-   * Render the negative grid lines given the grid dimension information of the
+-   * column or row lines.
+-   *
+-   * See @param for renderLines.
+-   */
+-  renderNegativeLineNumbers(gridDimension, dimensionType, mainSide, crossSide,
+-            startPos) {
+-    let lineStartPos = startPos;
+-
+-    // Keep track of the number of collapsed lines per line position
+-    let stackedLines = [];
+-
+-    const { lines } = gridDimension;
+-
+-    for (let i = 0, line; (line = lines[i++]);) {
+-      let linePos = line.start;
+-      let negativeLineNumber = line.negativeNumber;
+-
+-      // Don't render any negative line number greater than -1.
+-      if (negativeLineNumber == 0) {
+-        break;
+-      }
+-
+-      // Check for overlapping lines. We render a second box beneath the last overlapping
+-      // line number to indicate there are lines beneath it.
+-      const gridLine = gridDimension.tracks[line.number - 1];
+-
+-      if (gridLine) {
+-        const { breadth }  = gridLine;
+-
+-        if (breadth === 0) {
+-          stackedLines.push(negativeLineNumber);
+-
+-          if (stackedLines.length > 0) {
+-            this.renderGridLineNumber(negativeLineNumber, linePos, lineStartPos,
+-              line.breadth, dimensionType, 1);
+-          }
+-
+-          continue;
+-        }
+-      }
+-
+-      // For negative line numbers, we want to display the smallest
+-      // value at the front of the stack.
+-      if (stackedLines.length) {
+-        negativeLineNumber = stackedLines[0];
+-        stackedLines = [];
+-      }
+-
+-      this.renderGridLineNumber(negativeLineNumber, linePos, lineStartPos, line.breadth,
+-        dimensionType);
+-    }
+-  }
+-
+-  /**
+-   * Renders the grid area overlay on the css grid highlighter canvas.
+-   */
+-  renderGridAreaOverlay() {
+-    let padding = 1;
+-
+-    for (let i = 0; i < this.gridData.length; i++) {
+-      let fragment = this.gridData[i];
+-
+-      for (let area of fragment.areas) {
+-        let { rowStart, rowEnd, columnStart, columnEnd, type } = area;
+-
+-        if (type === "implicit") {
+-          continue;
+-        }
+-
+-        // Draw the line edges for the grid area
+-        const areaColStart = fragment.cols.lines[columnStart - 1];
+-        const areaColEnd = fragment.cols.lines[columnEnd - 1];
+-
+-        const areaRowStart = fragment.rows.lines[rowStart - 1];
+-        const areaRowEnd = fragment.rows.lines[rowEnd - 1];
+-
+-        const areaColStartLinePos = areaColStart.start + areaColStart.breadth;
+-        const areaRowStartLinePos = areaRowStart.start + areaRowStart.breadth;
+-
+-        this.renderLine(areaColStartLinePos + padding,
+-                        areaRowStartLinePos, areaRowEnd.start,
+-                        COLUMNS, "areaEdge");
+-        this.renderLine(areaColEnd.start - padding,
+-                        areaRowStartLinePos, areaRowEnd.start,
+-                        COLUMNS, "areaEdge");
+-
+-        this.renderLine(areaRowStartLinePos + padding,
+-                        areaColStartLinePos, areaColEnd.start,
+-                        ROWS, "areaEdge");
+-        this.renderLine(areaRowEnd.start - padding,
+-                        areaColStartLinePos, areaColEnd.start,
+-                        ROWS, "areaEdge");
+-
+-        this.renderGridAreaName(fragment, area);
+-      }
+-    }
+-
+-    this.ctx.restore();
+-  }
+-
+-  /**
+-   * Render grid area name on the containing grid area cell.
+-   *
+-   * @param  {Object} fragment
+-   *         The grid fragment of the grid container.
+-   * @param  {Object} area
+-   *         The area overlay to render on the CSS highlighter canvas.
+-   */
+-  renderGridAreaName(fragment, area) {
+-    let { rowStart, rowEnd, columnStart, columnEnd } = area;
+-    let { devicePixelRatio } = this.win;
+-    let displayPixelRatio = getDisplayPixelRatio(this.win);
+-    let offset = (displayPixelRatio / 2) % 1;
+-    let fontSize = (GRID_AREA_NAME_FONT_SIZE * displayPixelRatio);
+-
+-    this.ctx.save();
+-
+-    let canvasX = Math.round(this._canvasPosition.x * devicePixelRatio);
+-    let canvasY = Math.round(this._canvasPosition.y * devicePixelRatio);
+-    this.ctx.translate(offset - canvasX, offset - canvasY);
+-
+-    this.ctx.font = fontSize + "px " + GRID_FONT_FAMILY;
+-    this.ctx.strokeStyle = this.color;
+-    this.ctx.textAlign = "center";
+-    this.ctx.textBaseline = "middle";
+-
+-    // Draw the text for the grid area name.
+-    for (let rowNumber = rowStart; rowNumber < rowEnd; rowNumber++) {
+-      for (let columnNumber = columnStart; columnNumber < columnEnd; columnNumber++) {
+-        let row = fragment.rows.tracks[rowNumber - 1];
+-        let column = fragment.cols.tracks[columnNumber - 1];
+-
+-        // Check if the font size is exceeds the bounds of the containing grid cell.
+-        if (fontSize > (column.breadth * displayPixelRatio) ||
+-            fontSize > (row.breadth * displayPixelRatio)) {
+-          fontSize = (column.breadth + row.breadth) / 2;
+-          this.ctx.font = fontSize + "px " + GRID_FONT_FAMILY;
+-        }
+-
+-        let textWidth = this.ctx.measureText(area.name).width;
+-
+-        // The width of the character 'm' approximates the height of the text.
+-        let textHeight = this.ctx.measureText("m").width;
+-
+-        // Padding in pixels for the line number text inside of the line number container.
+-        let padding = 3 * displayPixelRatio;
+-
+-        let boxWidth = textWidth + 2 * padding;
+-        let boxHeight = textHeight + 2 * padding;
+-
+-        let x = column.start + column.breadth / 2;
+-        let y = row.start + row.breadth / 2;
+-
+-        [x, y] = apply(this.currentMatrix, [x, y]);
+-
+-        let rectXPos = x - boxWidth / 2;
+-        let rectYPos = y - boxHeight / 2;
+-
+-        // Draw a rounded rectangle with a border width of 1 pixel,
+-        // a border color matching the grid color, and a white background
+-        this.ctx.lineWidth = 1 * displayPixelRatio;
+-        this.ctx.strokeStyle = this.color;
+-        this.ctx.fillStyle = "white";
+-        let radius = 2 * displayPixelRatio;
+-        drawRoundedRect(this.ctx, rectXPos, rectYPos, boxWidth, boxHeight, radius);
+-
+-        this.ctx.fillStyle = this.color;
+-        this.ctx.fillText(area.name, x, y + padding);
+-      }
+-    }
+-
+-    this.ctx.restore();
+-  }
+-
+-  /**
+-   * Render the grid lines given the grid dimension information of the
+-   * column or row lines.
+-   *
+-   * @param  {GridDimension} gridDimension
+-   *         Column or row grid dimension object.
+-   * @param  {Object} quad.bounds
+-   *         The content bounds of the box model region quads.
+-   * @param  {String} dimensionType
+-   *         The grid dimension type which is either the constant COLUMNS or ROWS.
+-   * @param  {String} mainSide
+-   *         The main side of the given grid dimension - "top" for rows and
+-   *         "left" for columns.
+-   * @param  {String} crossSide
+-   *         The cross side of the given grid dimension - "left" for rows and
+-   *         "top" for columns.
+-   * @param  {String} mainSize
+-   *         The main size of the given grid dimension - "width" for rows and
+-   *         "height" for columns.
+-   * @param  {Number} startPos
+-   *         The start position of the cross side of the grid dimension.
+-   * @param  {Number} endPos
+-   *         The end position of the cross side of the grid dimension.
+-   */
+-  renderLines(gridDimension, dimensionType, mainSide, crossSide,
+-              mainSize, startPos, endPos) {
+-    let lineStartPos = startPos;
+-    let lineEndPos = endPos;
+-
+-    let lastEdgeLineIndex = this.getLastEdgeLineIndex(gridDimension.tracks);
+-
+-    for (let i = 0; i < gridDimension.lines.length; i++) {
+-      let line = gridDimension.lines[i];
+-      let linePos = line.start;
+-
+-      if (i == 0 || i == lastEdgeLineIndex) {
+-        this.renderLine(linePos, lineStartPos, lineEndPos, dimensionType, "edge");
+-      } else {
+-        this.renderLine(linePos, lineStartPos, lineEndPos, dimensionType,
+-                        gridDimension.tracks[i - 1].type);
+-      }
+-
+-      // Render a second line to illustrate the gutter for non-zero breadth.
+-      if (line.breadth > 0) {
+-        this.renderGridGap(linePos, lineStartPos, lineEndPos, line.breadth,
+-                           dimensionType);
+-        this.renderLine(linePos + line.breadth, lineStartPos, lineEndPos, dimensionType,
+-                        gridDimension.tracks[i].type);
+-      }
+-    }
+-  }
+-
+-  /**
+-   * Render the grid lines given the grid dimension information of the
+-   * column or row lines.
+-   *
+-   * see @param for renderLines.
+-   */
+-  renderLineNumbers(gridDimension, dimensionType, mainSide, crossSide,
+-              startPos) {
+-    let lineStartPos = startPos;
+-
+-    // Keep track of the number of collapsed lines per line position
+-    let stackedLines = [];
+-
+-    const { lines } = gridDimension;
+-
+-    for (let i = 0, line; (line = lines[i++]);) {
+-      let linePos = line.start;
+-
+-      // If you place something using negative numbers, you can trigger some implicit grid
+-      // creation above and to the left of the explicit grid (assuming a horizontal-tb
+-      // writing mode).
+-      // The first explicit grid line gets the number of 1; any implicit grid lines
+-      // before 1 get negative numbers, but do not get any positivity numbers.
+-      // Since here we're rendering only the positive line numbers, we have to skip any
+-      // implicit grid lines before the first tha is explicit.
+-      // For such lines the API returns always 0 as line's number.
+-      if (line.number === 0) {
+-        continue;
+-      }
+-
+-      // Check for overlapping lines. We render a second box beneath the last overlapping
+-      // line number to indicate there are lines beneath it.
+-      const gridLine = gridDimension.tracks[line.number - 1];
+-
+-      if (gridLine) {
+-        const { breadth }  = gridLine;
+-
+-        if (breadth === 0) {
+-          stackedLines.push(gridDimension.lines[i].number);
+-
+-          if (stackedLines.length > 0) {
+-            this.renderGridLineNumber(line.number, linePos, lineStartPos, line.breadth,
+-              dimensionType, 1);
+-          }
+-
+-          continue;
+-        }
+-      }
+-
+-      this.renderGridLineNumber(line.number, linePos, lineStartPos, line.breadth,
+-        dimensionType);
+-    }
+-  }
+-
+-  /**
+-   * Render the grid line on the css grid highlighter canvas.
+-   *
+-   * @param  {Number} linePos
+-   *         The line position along the x-axis for a column grid line and
+-   *         y-axis for a row grid line.
+-   * @param  {Number} startPos
+-   *         The start position of the cross side of the grid line.
+-   * @param  {Number} endPos
+-   *         The end position of the cross side of the grid line.
+-   * @param  {String} dimensionType
+-   *         The grid dimension type which is either the constant COLUMNS or ROWS.
+-   * @param  {String} lineType
+-   *         The grid line type - "edge", "explicit", or "implicit".
+-   */
+-  renderLine(linePos, startPos, endPos, dimensionType, lineType) {
+-    let { devicePixelRatio } = this.win;
+-    let lineWidth = getDisplayPixelRatio(this.win);
+-    let offset = (lineWidth / 2) % 1;
+-
+-    let x = Math.round(this._canvasPosition.x * devicePixelRatio);
+-    let y = Math.round(this._canvasPosition.y * devicePixelRatio);
+-
+-    linePos = Math.round(linePos);
+-    startPos = Math.round(startPos);
+-    endPos = Math.round(endPos);
+-
+-    this.ctx.save();
+-    this.ctx.setLineDash(GRID_LINES_PROPERTIES[lineType].lineDash);
+-    this.ctx.beginPath();
+-    this.ctx.translate(offset - x, offset - y);
+-
+-    let lineOptions = {
+-      matrix: this.currentMatrix
+-    };
+-
+-    if (this.options.showInfiniteLines) {
+-      lineOptions.extendToBoundaries = [x, y, x + CANVAS_SIZE, y + CANVAS_SIZE];
+-    }
+-
+-    if (dimensionType === COLUMNS) {
+-      drawLine(this.ctx, linePos, startPos, linePos, endPos, lineOptions);
+-    } else {
+-      drawLine(this.ctx, startPos, linePos, endPos, linePos, lineOptions);
+-    }
+-
+-    this.ctx.strokeStyle = this.color;
+-    this.ctx.globalAlpha = GRID_LINES_PROPERTIES[lineType].alpha;
+-
+-    if (GRID_LINES_PROPERTIES[lineType].lineWidth) {
+-      this.ctx.lineWidth = GRID_LINES_PROPERTIES[lineType].lineWidth * devicePixelRatio;
+-    } else {
+-      this.ctx.lineWidth = lineWidth;
+-    }
+-
+-    this.ctx.stroke();
+-    this.ctx.restore();
+-  }
+-
+-  /**
+-   * Render the grid line number on the css grid highlighter canvas.
+-   *
+-   * @param  {Number} lineNumber
+-   *         The grid line number.
+-   * @param  {Number} linePos
+-   *         The line position along the x-axis for a column grid line and
+-   *         y-axis for a row grid line.
+-   * @param  {Number} startPos
+-   *         The start position of the cross side of the grid line.
+-   * @param  {Number} breadth
+-   *         The grid line breadth value.
+-   * @param  {String} dimensionType
+-   *         The grid dimension type which is either the constant COLUMNS or ROWS.
+-   * @param  {Number||undefined} stackedLineIndex
+-   *         The line index position of the stacked line.
+-   */
+-  renderGridLineNumber(lineNumber, linePos, startPos, breadth, dimensionType,
+-    stackedLineIndex) {
+-    let displayPixelRatio = getDisplayPixelRatio(this.win);
+-    let { devicePixelRatio } = this.win;
+-    let offset = (displayPixelRatio / 2) % 1;
+-
+-    linePos = Math.round(linePos);
+-    startPos = Math.round(startPos);
+-    breadth = Math.round(breadth);
+-
+-    if (linePos + breadth < 0) {
+-      // The line is not visible on screen, don't render the line number
+-      return;
+-    }
+-
+-    this.ctx.save();
+-    let canvasX = Math.round(this._canvasPosition.x * devicePixelRatio);
+-    let canvasY = Math.round(this._canvasPosition.y * devicePixelRatio);
+-    this.ctx.translate(offset - canvasX, offset - canvasY);
+-
+-    let fontSize = (GRID_FONT_SIZE * displayPixelRatio);
+-    this.ctx.font = fontSize + "px " + GRID_FONT_FAMILY;
+-
+-    // For a general grid box, the height of the character "m" will be its minimum width
+-    // and height. If line number's text width is greater then grid box's text width
+-    // will use that instead.
+-    let textHeight = this.ctx.measureText("m").width;
+-    let textWidth = Math.max(textHeight, this.ctx.measureText(lineNumber).width);
+-
+-    // Padding in pixels for the line number text inside of the line number container.
+-    let padding = 3 * displayPixelRatio;
+-    let offsetFromEdge = 2 * displayPixelRatio;
+-
+-    let boxWidth = textWidth + 2 * padding;
+-    let boxHeight = textHeight + 2 * padding;
+-
+-     // Calculate the x & y coordinates for the line number container, so that its arrow
+-     // tip is centered on the line (or the gap if there is one), and is offset by the
+-     // calculated padding value from the grid container edge.
+-    let x, y;
+-
+-    if (dimensionType === COLUMNS) {
+-      x = linePos + breadth / 2;
+-      y = startPos;
+-
+-      if (lineNumber > 0) {
+-        y -= offsetFromEdge;
+-      } else {
+-        y += offsetFromEdge;
+-      }
+-    } else if (dimensionType === ROWS) {
+-      x = startPos;
+-      y = linePos + breadth / 2;
+-
+-      if (lineNumber > 0) {
+-        x -= offsetFromEdge;
+-      } else {
+-        x += offsetFromEdge;
+-      }
+-    }
+-
+-    [x, y] = apply(this.currentMatrix, [x, y]);
+-
+-    if (stackedLineIndex) {
+-      // Offset the stacked line number by half of the box's width/height
+-      const xOffset = boxWidth / 4;
+-      const yOffset = boxHeight / 4;
+-
+-      if (lineNumber > 0) {
+-        x -= xOffset;
+-        y -= yOffset;
+-      } else {
+-        x += xOffset;
+-        y += yOffset;
+-      }
+-    }
+-
+-    if (!this.hasNodeTransformations) {
+-      x = Math.max(x, padding);
+-      y = Math.max(y, padding);
+-    }
+-
+-    // Draw a bubble rectanglular arrow with a border width of 2 pixels, a border color
+-    // matching the grid color and a white background (the line number will be written in
+-    // black).
+-    this.ctx.lineWidth = 2 * displayPixelRatio;
+-    this.ctx.strokeStyle = this.color;
+-    this.ctx.fillStyle = "white";
+-
+-    // See param definitions of drawBubbleRect
+-    let radius = 2 * displayPixelRatio;
+-    let margin = 2 * displayPixelRatio;
+-    let arrowSize = 8 * displayPixelRatio;
+-
+-    let minBoxSize = arrowSize * 2 + padding;
+-    boxWidth = Math.max(boxWidth, minBoxSize);
+-    boxHeight = Math.max(boxHeight, minBoxSize);
+-
+-    if (dimensionType === COLUMNS) {
+-      if (lineNumber > 0) {
+-        drawBubbleRect(this.ctx, x, y, boxWidth, boxHeight, radius, margin, arrowSize,
+-          "top");
+-        // After drawing the number box, we need to center the x/y coordinates of the
+-        // number text written it.
+-        y -= (boxHeight + arrowSize + radius) - boxHeight / 2;
+-      } else {
+-        drawBubbleRect(this.ctx, x, y, boxWidth, boxHeight, radius, margin, arrowSize,
+-          "bottom");
+-        y += (boxHeight + arrowSize + radius) - boxHeight / 2;
+-      }
+-    } else if (dimensionType === ROWS) {
+-      if (lineNumber > 0) {
+-        drawBubbleRect(this.ctx, x, y, boxWidth, boxHeight, radius, margin, arrowSize,
+-          "left");
+-        x -= (boxWidth + arrowSize + radius) - boxWidth / 2;
+-      } else {
+-        drawBubbleRect(this.ctx, x, y, boxWidth, boxHeight, radius, margin, arrowSize,
+-          "right");
+-        x += (boxWidth + arrowSize + radius) - boxWidth / 2;
+-      }
+-    }
+-
+-    // Write the line number inside of the rectangle.
+-    this.ctx.textAlign = "center";
+-    this.ctx.textBaseline = "middle";
+-    this.ctx.fillStyle = "black";
+-    const numberText = stackedLineIndex ? "" : lineNumber;
+-    this.ctx.fillText(numberText, x, y);
+-
+-    this.ctx.restore();
+-  }
+-
+-  /**
+-   * Render the grid gap area on the css grid highlighter canvas.
+-   *
+-   * @param  {Number} linePos
+-   *         The line position along the x-axis for a column grid line and
+-   *         y-axis for a row grid line.
+-   * @param  {Number} startPos
+-   *         The start position of the cross side of the grid line.
+-   * @param  {Number} endPos
+-   *         The end position of the cross side of the grid line.
+-   * @param  {Number} breadth
+-   *         The grid line breadth value.
+-   * @param  {String} dimensionType
+-   *         The grid dimension type which is either the constant COLUMNS or ROWS.
+-   */
+-  renderGridGap(linePos, startPos, endPos, breadth, dimensionType) {
+-    let { devicePixelRatio } = this.win;
+-    let displayPixelRatio = getDisplayPixelRatio(this.win);
+-    let offset = (displayPixelRatio / 2) % 1;
+-
+-    let canvasX = Math.round(this._canvasPosition.x * devicePixelRatio);
+-    let canvasY = Math.round(this._canvasPosition.y * devicePixelRatio);
+-
+-    linePos = Math.round(linePos);
+-    startPos = Math.round(startPos);
+-    breadth = Math.round(breadth);
+-
+-    this.ctx.save();
+-    this.ctx.fillStyle = this.getGridGapPattern(devicePixelRatio, dimensionType);
+-    this.ctx.translate(offset - canvasX, offset - canvasY);
+-
+-    if (dimensionType === COLUMNS) {
+-      if (isFinite(endPos)) {
+-        endPos = Math.round(endPos);
+-      } else {
+-        endPos = this._winDimensions.height;
+-        startPos = -endPos;
+-      }
+-      drawRect(this.ctx, linePos, startPos, linePos + breadth, endPos,
+-        this.currentMatrix);
+-    } else {
+-      if (isFinite(endPos)) {
+-        endPos = Math.round(endPos);
+-      } else {
+-        endPos = this._winDimensions.width;
+-        startPos = -endPos;
+-      }
+-      drawRect(this.ctx, startPos, linePos, endPos, linePos + breadth,
+-        this.currentMatrix);
+-    }
+-    this.ctx.fill();
+-    this.ctx.restore();
+-  }
+-
+-  /**
+-   * Render the grid area highlight for the given area name or for all the grid areas.
+-   *
+-   * @param  {String} areaName
+-   *         Name of the grid area to be highlighted. If no area name is provided, all
+-   *         the grid areas should be highlighted.
+-   */
+-  renderGridArea(areaName) {
+-    let paths = [];
+-    let { devicePixelRatio } = this.win;
+-    let displayPixelRatio = getDisplayPixelRatio(this.win);
+-
+-    for (let i = 0; i < this.gridData.length; i++) {
+-      let fragment = this.gridData[i];
+-
+-      for (let area of fragment.areas) {
+-        if (areaName && areaName != area.name) {
+-          continue;
+-        }
+-
+-        let rowStart = fragment.rows.lines[area.rowStart - 1];
+-        let rowEnd = fragment.rows.lines[area.rowEnd - 1];
+-        let columnStart = fragment.cols.lines[area.columnStart - 1];
+-        let columnEnd = fragment.cols.lines[area.columnEnd - 1];
+-
+-        let x1 = columnStart.start + columnStart.breadth;
+-        let y1 = rowStart.start + rowStart.breadth;
+-        let x2 = columnEnd.start;
+-        let y2 = rowEnd.start;
+-
+-        let points = getPointsFromDiagonal(x1, y1, x2, y2, this.currentMatrix);
+-
+-        // Scale down by `devicePixelRatio` since SVG element already take them into
+-        // account.
+-        let svgPoints = points.map(point => ({
+-          x: Math.round(point.x / devicePixelRatio),
+-          y: Math.round(point.y / devicePixelRatio)
+-        }));
+-
+-        // Scale down by `displayPixelRatio` since infobar's HTML elements already take it
+-        // into account; and the zoom scaling is handled by `moveInfobar`.
+-        let bounds = getBoundsFromPoints(points.map(point => ({
+-          x: Math.round(point.x / displayPixelRatio),
+-          y: Math.round(point.y / displayPixelRatio)
+-        })));
+-
+-        paths.push(getPathDescriptionFromPoints(svgPoints));
+-
+-        // Update and show the info bar when only displaying a single grid area.
+-        if (areaName) {
+-          this._showGridAreaInfoBar();
+-          this._updateGridAreaInfobar(area, bounds);
+-        }
+-      }
+-    }
+-
+-    let areas = this.getElement("areas");
+-    areas.setAttribute("d", paths.join(" "));
+-  }
+-
+-  /**
+-   * Render the grid cell highlight for the given grid fragment index, row and column
+-   * number.
+-   *
+-   * @param  {Number} gridFragmentIndex
+-   *         Index of the grid fragment to render the grid cell highlight.
+-   * @param  {Number} rowNumber
+-   *         Row number of the grid cell to highlight.
+-   * @param  {Number} columnNumber
+-   *         Column number of the grid cell to highlight.
+-   */
+-  renderGridCell(gridFragmentIndex, rowNumber, columnNumber) {
+-    let fragment = this.gridData[gridFragmentIndex];
+-
+-    if (!fragment) {
+-      return;
+-    }
+-
+-    let row = fragment.rows.tracks[rowNumber - 1];
+-    let column = fragment.cols.tracks[columnNumber - 1];
+-
+-    if (!row || !column) {
+-      return;
+-    }
+-
+-    let x1 = column.start;
+-    let y1 = row.start;
+-    let x2 = column.start + column.breadth;
+-    let y2 = row.start + row.breadth;
+-
+-    let { devicePixelRatio } = this.win;
+-    let displayPixelRatio = getDisplayPixelRatio(this.win);
+-
+-    let points = getPointsFromDiagonal(x1, y1, x2, y2, this.currentMatrix);
+-
+-    // Scale down by `devicePixelRatio` since SVG element already take them into account.
+-    let svgPoints = points.map(point => ({
+-      x: Math.round(point.x / devicePixelRatio),
+-      y: Math.round(point.y / devicePixelRatio)
+-    }));
+-
+-    // Scale down by `displayPixelRatio` since infobar's HTML elements already take it
+-    // into account, and the zoom scaling is handled by `moveInfobar`.
+-    let bounds = getBoundsFromPoints(points.map(point => ({
+-      x: Math.round(point.x / displayPixelRatio),
+-      y: Math.round(point.y / displayPixelRatio)
+-    })));
+-
+-    let cells = this.getElement("cells");
+-    cells.setAttribute("d", getPathDescriptionFromPoints(svgPoints));
+-
+-    this._showGridCellInfoBar();
+-    this._updateGridCellInfobar(rowNumber, columnNumber, bounds);
+-  }
+-
+-  /**
+-   * Render the grid line name highlight for the given grid fragment index, lineNumber,
+-   * and dimensionType.
+-   *
+-   * @param  {Number} gridFragmentIndex
+-   *         Index of the grid fragment to render the grid line highlight.
+-   * @param  {Number} lineNumber
+-   *         Line number of the grid line to highlight.
+-   * @param  {String} dimensionType
+-   *         The dimension type of the grid line.
+-   */
+-  renderGridLineNames(gridFragmentIndex, lineNumber, dimensionType) {
+-    let fragment = this.gridData[gridFragmentIndex];
+-
+-    if (!fragment || !lineNumber || !dimensionType) {
+-      return;
+-    }
+-
+-    const { names } = fragment[dimensionType].lines[lineNumber - 1];
+-    let linePos;
+-
+-    if (dimensionType === ROWS) {
+-      linePos = fragment.rows.lines[lineNumber - 1];
+-    } else if (dimensionType === COLUMNS) {
+-      linePos = fragment.cols.lines[lineNumber - 1];
+-    }
+-
+-    if (!linePos) {
+-      return;
+-    }
+-
+-    let currentZoom = getCurrentZoom(this.win);
+-    let { bounds } = this.currentQuads.content[gridFragmentIndex];
+-
+-    const rowYPosition = fragment.rows.lines[0];
+-    const colXPosition = fragment.rows.lines[0];
+-
+-    let x = dimensionType === COLUMNS
+-      ? linePos.start + (bounds.left / currentZoom)
+-      : colXPosition.start + (bounds.left / currentZoom);
+-
+-    let y = dimensionType === ROWS
+-      ? linePos.start + (bounds.top / currentZoom)
+-      : rowYPosition.start + (bounds.top / currentZoom);
+-
+-    this._showGridLineInfoBar();
+-    this._updateGridLineInfobar(names.join(", "), lineNumber, x, y);
+-  }
+-
+-  /**
+-   * Hide the highlighter, the canvas and the infobars.
+-   */
+-  _hide() {
+-    setIgnoreLayoutChanges(true);
+-    this._hideGrid();
+-    this._hideGridElements();
+-    this._hideGridAreaInfoBar();
+-    this._hideGridCellInfoBar();
+-    this._hideGridLineInfoBar();
+-    setIgnoreLayoutChanges(false, this.highlighterEnv.document.documentElement);
+-  }
+-
+-  _hideGrid() {
+-    this.getElement("canvas").setAttribute("hidden", "true");
+-  }
+-
+-  _showGrid() {
+-    this.getElement("canvas").removeAttribute("hidden");
+-  }
+-
+-  _hideGridElements() {
+-    this.getElement("elements").setAttribute("hidden", "true");
+-  }
+-
+-  _showGridElements() {
+-    this.getElement("elements").removeAttribute("hidden");
+-  }
+-
+-  _hideGridAreaInfoBar() {
+-    this.getElement("area-infobar-container").setAttribute("hidden", "true");
+-  }
+-
+-  _showGridAreaInfoBar() {
+-    this.getElement("area-infobar-container").removeAttribute("hidden");
+-  }
+-
+-  _hideGridCellInfoBar() {
+-    this.getElement("cell-infobar-container").setAttribute("hidden", "true");
+-  }
+-
+-  _showGridCellInfoBar() {
+-    this.getElement("cell-infobar-container").removeAttribute("hidden");
+-  }
+-
+-  _hideGridLineInfoBar() {
+-    this.getElement("line-infobar-container").setAttribute("hidden", "true");
+-  }
+-
+-  _showGridLineInfoBar() {
+-    this.getElement("line-infobar-container").removeAttribute("hidden");
++    moveInfobar(container, getBoundsFromPoints([{x, y}, {x, y}, {x, y}, {x, y}]),
++      this.win);
+   }
+ }
+ 
+ exports.CssGridHighlighter = CssGridHighlighter;

+ 8688 - 0
mozilla-release/patches/1393900-57a1.patch

@@ -0,0 +1,8688 @@
+# HG changeset patch
+# User Andrew Halberstadt <ahalberstadt@mozilla.com>
+# Date 1503687918 14400
+# Node ID d87bd54dc409c481e1c28a16be50e76ea91cf6c3
+# Parent  53097dcb6b5a52b01423e8699dff3dc13b338c0f
+Bug 1393900 - Update mochitest runtimes files to balance the chunks, r=jmaher
+
+MozReview-Commit-ID: FWsc3rBv7cL
+
+diff --git a/testing/runtimes/mochitest-browser-chrome-e10s.runtimes.json b/testing/runtimes/mochitest-browser-chrome-e10s.runtimes.json
+--- a/testing/runtimes/mochitest-browser-chrome-e10s.runtimes.json
++++ b/testing/runtimes/mochitest-browser-chrome-e10s.runtimes.json
+@@ -1,831 +1,1081 @@
+ {
+-  "excluded_test_average": 1310, 
++  "excluded_test_average": 1197, 
+   "runtimes": {
+-    "Main app process exited normally": 2031025, 
+-    "accessible/tests/browser/browser_caching_attributes.js": 2753, 
+-    "accessible/tests/browser/browser_shutdown_acc_reference.js": 3187, 
+-    "accessible/tests/browser/browser_shutdown_doc_acc_reference.js": 2817, 
+-    "accessible/tests/browser/browser_shutdown_multi_acc_reference_doc.js": 4118, 
+-    "accessible/tests/browser/browser_shutdown_multi_acc_reference_obj.js": 4032, 
+-    "accessible/tests/browser/browser_shutdown_multi_proxy_acc_reference_doc.js": 4807, 
+-    "accessible/tests/browser/browser_shutdown_multi_proxy_acc_reference_obj.js": 4805, 
+-    "accessible/tests/browser/browser_shutdown_multi_reference.js": 2720, 
+-    "accessible/tests/browser/browser_shutdown_proxy_acc_reference.js": 3799, 
+-    "accessible/tests/browser/browser_shutdown_proxy_doc_acc_reference.js": 3746, 
+-    "accessible/tests/browser/browser_shutdown_start_restart.js": 2701, 
+-    "accessible/tests/browser/e10s/browser_caching_name.js": 9803, 
+-    "browser/base/content/test/alerts/browser_notification_open_settings.js": 2814, 
+-    "browser/base/content/test/captivePortal/browser_captivePortal_certErrorUI.js": 3183, 
+-    "browser/base/content/test/chat/browser_chatwindow.js": 5602, 
+-    "browser/base/content/test/chat/browser_focus.js": 4750, 
+-    "browser/base/content/test/chat/browser_tearoff.js": 3032, 
++    "Main app process exited normally": 466980, 
++    "accessible/tests/browser/bounds/browser_test_zoom.js": 3016, 
++    "accessible/tests/browser/browser_shutdown_acc_reference.js": 4925, 
++    "accessible/tests/browser/browser_shutdown_doc_acc_reference.js": 3911, 
++    "accessible/tests/browser/browser_shutdown_multi_acc_reference_doc.js": 5545, 
++    "accessible/tests/browser/browser_shutdown_multi_acc_reference_obj.js": 5096, 
++    "accessible/tests/browser/browser_shutdown_multi_proxy_acc_reference_doc.js": 5370, 
++    "accessible/tests/browser/browser_shutdown_multi_proxy_acc_reference_obj.js": 5494, 
++    "accessible/tests/browser/browser_shutdown_multi_reference.js": 3569, 
++    "accessible/tests/browser/browser_shutdown_parent_own_reference.js": 2652, 
++    "accessible/tests/browser/browser_shutdown_proxy_acc_reference.js": 3125, 
++    "accessible/tests/browser/browser_shutdown_proxy_doc_acc_reference.js": 4305, 
++    "accessible/tests/browser/browser_shutdown_remote_no_reference.js": 2481, 
++    "accessible/tests/browser/browser_shutdown_remote_own_reference.js": 2884, 
++    "accessible/tests/browser/browser_shutdown_start_restart.js": 3627, 
++    "accessible/tests/browser/e10s/browser_caching_attributes.js": 3109, 
++    "accessible/tests/browser/e10s/browser_caching_name.js": 8802, 
++    "accessible/tests/browser/events/browser_test_focus_browserui.js": 3575, 
++    "accessible/tests/browser/events/browser_test_focus_dialog.js": 4751, 
++    "accessible/tests/browser/scroll/browser_test_zoom_text.js": 3265, 
++    "accessible/tests/browser/states/browser_test_link.js": 5125, 
++    "accessible/tests/browser/tree/browser_aria_owns.js": 7503, 
++    "accessible/tests/browser/tree/browser_test_aria_owns.js": 2966, 
++    "browser/base/content/test/about/browser_aboutCertError.js": 11678, 
++    "browser/base/content/test/about/browser_aboutHome.js": 19984, 
++    "browser/base/content/test/about/browser_aboutHome_wrapsCorrectly.js": 3137, 
++    "browser/base/content/test/about/browser_aboutStopReload.js": 6781, 
++    "browser/base/content/test/alerts/browser_notification_close.js": 2771, 
++    "browser/base/content/test/alerts/browser_notification_do_not_disturb.js": 4115, 
++    "browser/base/content/test/alerts/browser_notification_open_settings.js": 7254, 
++    "browser/base/content/test/alerts/browser_notification_tab_switching.js": 2445, 
++    "browser/base/content/test/captivePortal/browser_CaptivePortalWatcher.js": 20510, 
++    "browser/base/content/test/captivePortal/browser_CaptivePortalWatcher_1.js": 5391, 
++    "browser/base/content/test/captivePortal/browser_captivePortal_certErrorUI.js": 3364, 
++    "browser/base/content/test/forms/browser_selectpopup.js": 9971, 
++    "browser/base/content/test/forms/browser_selectpopup_colors.js": 6841, 
++    "browser/base/content/test/forms/browser_selectpopup_searchfocus.js": 2522, 
++    "browser/base/content/test/general/browser_PageMetaData_pushstate.js": 2817, 
+     "browser/base/content/test/general/browser_aboutAccounts.js": 4700, 
+-    "browser/base/content/test/general/browser_aboutCertError.js": 11629, 
+-    "browser/base/content/test/general/browser_aboutHome.js": 24998, 
+-    "browser/base/content/test/general/browser_aboutHome_wrapsCorrectly.js": 3959, 
+-    "browser/base/content/test/general/browser_aboutTabCrashed.js": 14550, 
+-    "browser/base/content/test/general/browser_aboutTabCrashed_clearEmail.js": 2776, 
+-    "browser/base/content/test/general/browser_addCertException.js": 3849, 
+-    "browser/base/content/test/general/browser_addKeywordSearch.js": 2907, 
+-    "browser/base/content/test/general/browser_alltabslistener.js": 3702, 
++    "browser/base/content/test/general/browser_aboutCertError.js": 9175, 
++    "browser/base/content/test/general/browser_aboutHome.js": 20595, 
++    "browser/base/content/test/general/browser_aboutHome_wrapsCorrectly.js": 3214, 
++    "browser/base/content/test/general/browser_accesskeys.js": 3200, 
++    "browser/base/content/test/general/browser_alltabslistener.js": 2516, 
+     "browser/base/content/test/general/browser_audioTabIcon.js": 41909, 
+-    "browser/base/content/test/general/browser_beforeunload_duplicate_dialogs.js": 7882, 
+-    "browser/base/content/test/general/browser_blockHPKP.js": 3461, 
+-    "browser/base/content/test/general/browser_bookmark_popup.js": 14200, 
++    "browser/base/content/test/general/browser_beforeunload_duplicate_dialogs.js": 6870, 
++    "browser/base/content/test/general/browser_blockHPKP.js": 3184, 
++    "browser/base/content/test/general/browser_bookmark_popup.js": 22529, 
+     "browser/base/content/test/general/browser_bookmark_titles.js": 2930, 
+-    "browser/base/content/test/general/browser_bug1299667.js": 9269, 
+-    "browser/base/content/test/general/browser_bug386835.js": 5032, 
+-    "browser/base/content/test/general/browser_bug406216.js": 4791, 
+-    "browser/base/content/test/general/browser_bug422590.js": 9050, 
+-    "browser/base/content/test/general/browser_bug460146.js": 4439, 
+-    "browser/base/content/test/general/browser_bug462673.js": 5101, 
+-    "browser/base/content/test/general/browser_bug491431.js": 2670, 
+-    "browser/base/content/test/general/browser_bug495058.js": 6831, 
+-    "browser/base/content/test/general/browser_bug550565.js": 3997, 
+-    "browser/base/content/test/general/browser_bug553455.js": 37176, 
+-    "browser/base/content/test/general/browser_bug575561.js": 13472, 
+-    "browser/base/content/test/general/browser_bug585558.js": 3058, 
+-    "browser/base/content/test/general/browser_bug590206.js": 13742, 
+-    "browser/base/content/test/general/browser_bug592338.js": 5715, 
+-    "browser/base/content/test/general/browser_bug609700.js": 3600, 
+-    "browser/base/content/test/general/browser_bug623893.js": 4495, 
+-    "browser/base/content/test/general/browser_bug676619.js": 12005, 
+-    "browser/base/content/test/general/browser_bug719271.js": 5308, 
+-    "browser/base/content/test/general/browser_bug734076.js": 4225, 
+-    "browser/base/content/test/general/browser_bug763468_perwindowpb.js": 8245, 
+-    "browser/base/content/test/general/browser_bug767836_perwindowpb.js": 8317, 
+-    "browser/base/content/test/general/browser_bug817947.js": 4167, 
+-    "browser/base/content/test/general/browser_bug822367.js": 9554, 
+-    "browser/base/content/test/general/browser_bug902156.js": 5042, 
+-    "browser/base/content/test/general/browser_bug906190.js": 28243, 
+-    "browser/base/content/test/general/browser_bug963945.js": 3613, 
+-    "browser/base/content/test/general/browser_close_dependent_tabs.js": 2877, 
++    "browser/base/content/test/general/browser_bug1299667.js": 8413, 
++    "browser/base/content/test/general/browser_bug386835.js": 4147, 
++    "browser/base/content/test/general/browser_bug422590.js": 5858, 
++    "browser/base/content/test/general/browser_bug460146.js": 3612, 
++    "browser/base/content/test/general/browser_bug462673.js": 4134, 
++    "browser/base/content/test/general/browser_bug495058.js": 5134, 
++    "browser/base/content/test/general/browser_bug553455.js": 23417, 
++    "browser/base/content/test/general/browser_bug575561.js": 9164, 
++    "browser/base/content/test/general/browser_bug590206.js": 11437, 
++    "browser/base/content/test/general/browser_bug592338.js": 2921, 
++    "browser/base/content/test/general/browser_bug609700.js": 2818, 
++    "browser/base/content/test/general/browser_bug623893.js": 3407, 
++    "browser/base/content/test/general/browser_bug676619.js": 7171, 
++    "browser/base/content/test/general/browser_bug719271.js": 4304, 
++    "browser/base/content/test/general/browser_bug724239.js": 5469, 
++    "browser/base/content/test/general/browser_bug734076.js": 3405, 
++    "browser/base/content/test/general/browser_bug735471.js": 3566, 
++    "browser/base/content/test/general/browser_bug763468_perwindowpb.js": 6702, 
++    "browser/base/content/test/general/browser_bug767836_perwindowpb.js": 6638, 
++    "browser/base/content/test/general/browser_bug817947.js": 2516, 
++    "browser/base/content/test/general/browser_bug822367.js": 8432, 
++    "browser/base/content/test/general/browser_bug902156.js": 4478, 
++    "browser/base/content/test/general/browser_bug906190.js": 24249, 
++    "browser/base/content/test/general/browser_bug963945.js": 2845, 
+     "browser/base/content/test/general/browser_contentAltClick.js": 3557, 
+-    "browser/base/content/test/general/browser_contentSearchUI.js": 20488, 
+-    "browser/base/content/test/general/browser_contextmenu.js": 4785, 
+-    "browser/base/content/test/general/browser_contextmenu_childprocess.js": 5501, 
+-    "browser/base/content/test/general/browser_ctrlTab.js": 5609, 
+-    "browser/base/content/test/general/browser_datachoices_notification.js": 6696, 
++    "browser/base/content/test/general/browser_contentSearchUI.js": 18914, 
++    "browser/base/content/test/general/browser_contextmenu_childprocess.js": 4294, 
++    "browser/base/content/test/general/browser_ctrlTab.js": 5041, 
++    "browser/base/content/test/general/browser_datachoices_notification.js": 4427, 
+     "browser/base/content/test/general/browser_decoderDoctor.js": 4428, 
+-    "browser/base/content/test/general/browser_devices_get_user_media.js": 14991, 
+-    "browser/base/content/test/general/browser_devices_get_user_media_in_frame.js": 4616, 
+-    "browser/base/content/test/general/browser_documentnavigation.js": 6759, 
++    "browser/base/content/test/general/browser_documentnavigation.js": 5229, 
+     "browser/base/content/test/general/browser_domFullscreen_fullscreenMode.js": 5545, 
+-    "browser/base/content/test/general/browser_e10s_chrome_process.js": 8580, 
+-    "browser/base/content/test/general/browser_e10s_switchbrowser.js": 12757, 
+-    "browser/base/content/test/general/browser_fullscreen-window-open.js": 4312, 
+-    "browser/base/content/test/general/browser_fxa_oauth.js": 5410, 
+-    "browser/base/content/test/general/browser_fxa_web_channel.js": 4727, 
+-    "browser/base/content/test/general/browser_fxaccounts.js": 2909, 
+-    "browser/base/content/test/general/browser_getshortcutoruri.js": 3083, 
+-    "browser/base/content/test/general/browser_identity_UI.js": 20930, 
+-    "browser/base/content/test/general/browser_insecureLoginForms.js": 4482, 
+-    "browser/base/content/test/general/browser_mcb_redirect.js": 9425, 
+-    "browser/base/content/test/general/browser_misused_characters_in_strings.js": 5746, 
+-    "browser/base/content/test/general/browser_mixedContentFromOnunload.js": 2915, 
+-    "browser/base/content/test/general/browser_mixed_content_cert_override.js": 4893, 
+-    "browser/base/content/test/general/browser_mixedcontent_securityflags.js": 3358, 
+-    "browser/base/content/test/general/browser_newTabDrop.js": 6573, 
+-    "browser/base/content/test/general/browser_newWindowDrop.js": 26213, 
+-    "browser/base/content/test/general/browser_newwindow_focus.js": 6189, 
+-    "browser/base/content/test/general/browser_no_mcb_on_http_site.js": 3587, 
+-    "browser/base/content/test/general/browser_offlineQuotaNotification.js": 3595, 
+-    "browser/base/content/test/general/browser_overflowScroll.js": 13531, 
+-    "browser/base/content/test/general/browser_pageInfo.js": 2735, 
+-    "browser/base/content/test/general/browser_parsable_css.js": 2783, 
+-    "browser/base/content/test/general/browser_parsable_script.js": 8620, 
+-    "browser/base/content/test/general/browser_permissions.js": 7325, 
+-    "browser/base/content/test/general/browser_plainTextLinks.js": 3173, 
+-    "browser/base/content/test/general/browser_popupUI.js": 2907, 
+-    "browser/base/content/test/general/browser_printpreview.js": 6858, 
+-    "browser/base/content/test/general/browser_private_browsing_window.js": 3954, 
+-    "browser/base/content/test/general/browser_readerMode.js": 3992, 
+-    "browser/base/content/test/general/browser_refreshBlocker.js": 11983, 
+-    "browser/base/content/test/general/browser_relatedTabs.js": 9815, 
+-    "browser/base/content/test/general/browser_remoteTroubleshoot.js": 4239, 
++    "browser/base/content/test/general/browser_e10s_about_page_triggeringprincipal.js": 3596, 
++    "browser/base/content/test/general/browser_e10s_chrome_process.js": 5619, 
++    "browser/base/content/test/general/browser_e10s_switchbrowser.js": 8682, 
++    "browser/base/content/test/general/browser_fullscreen-window-open.js": 4789, 
++    "browser/base/content/test/general/browser_fxa_oauth.js": 4742, 
++    "browser/base/content/test/general/browser_fxa_web_channel.js": 4164, 
++    "browser/base/content/test/general/browser_fxaccounts.js": 3112, 
++    "browser/base/content/test/general/browser_identity_UI.js": 18804, 
++    "browser/base/content/test/general/browser_insecureLoginForms.js": 5626, 
++    "browser/base/content/test/general/browser_mcb_redirect.js": 8770, 
++    "browser/base/content/test/general/browser_misused_characters_in_strings.js": 5350, 
++    "browser/base/content/test/general/browser_mixedContentFromOnunload.js": 2439, 
++    "browser/base/content/test/general/browser_mixed_content_cert_override.js": 4285, 
++    "browser/base/content/test/general/browser_mixedcontent_securityflags.js": 2832, 
++    "browser/base/content/test/general/browser_newTabDrop.js": 3998, 
++    "browser/base/content/test/general/browser_newWindowDrop.js": 23039, 
++    "browser/base/content/test/general/browser_new_http_window_opened_from_file_tab.js": 5905, 
++    "browser/base/content/test/general/browser_newwindow_focus.js": 4932, 
++    "browser/base/content/test/general/browser_no_mcb_on_http_site.js": 3168, 
++    "browser/base/content/test/general/browser_offlineQuotaNotification.js": 2757, 
++    "browser/base/content/test/general/browser_overflowScroll.js": 2845, 
++    "browser/base/content/test/general/browser_pageInfo.js": 2505, 
++    "browser/base/content/test/general/browser_pageinfo_svg_image.js": 2502, 
++    "browser/base/content/test/general/browser_parsable_script.js": 8066, 
++    "browser/base/content/test/general/browser_permissions.js": 6099, 
++    "browser/base/content/test/general/browser_plainTextLinks.js": 4229, 
++    "browser/base/content/test/general/browser_printpreview.js": 5765, 
++    "browser/base/content/test/general/browser_private_browsing_window.js": 3048, 
++    "browser/base/content/test/general/browser_refreshBlocker.js": 8767, 
++    "browser/base/content/test/general/browser_relatedTabs.js": 6518, 
++    "browser/base/content/test/general/browser_remoteTroubleshoot.js": 3807, 
+     "browser/base/content/test/general/browser_restore_isAppTab.js": 6238, 
+-    "browser/base/content/test/general/browser_sanitize-timespans.js": 6091, 
+-    "browser/base/content/test/general/browser_sanitizeDialog.js": 21552, 
+-    "browser/base/content/test/general/browser_save_link-perwindowpb.js": 4886, 
+-    "browser/base/content/test/general/browser_save_link_when_window_navigates.js": 6001, 
+-    "browser/base/content/test/general/browser_save_private_link_perwindowpb.js": 3473, 
+-    "browser/base/content/test/general/browser_selectpopup.js": 25885, 
++    "browser/base/content/test/general/browser_sanitize-timespans.js": 3632, 
++    "browser/base/content/test/general/browser_sanitizeDialog.js": 11937, 
++    "browser/base/content/test/general/browser_save_link-perwindowpb.js": 3245, 
++    "browser/base/content/test/general/browser_save_link_when_window_navigates.js": 4074, 
++    "browser/base/content/test/general/browser_save_private_link_perwindowpb.js": 2595, 
++    "browser/base/content/test/general/browser_selectpopup.js": 22296, 
+     "browser/base/content/test/general/browser_ssl_error_reports.js": 10048, 
+-    "browser/base/content/test/general/browser_syncui.js": 5116, 
+-    "browser/base/content/test/general/browser_tabDrop.js": 5665, 
+-    "browser/base/content/test/general/browser_tab_close_dependent_window.js": 3872, 
+-    "browser/base/content/test/general/browser_tab_detach_restore.js": 4869, 
++    "browser/base/content/test/general/browser_storagePressure_notification.js": 7539, 
++    "browser/base/content/test/general/browser_syncui.js": 15178, 
++    "browser/base/content/test/general/browser_tabDrop.js": 3588, 
++    "browser/base/content/test/general/browser_tab_close_dependent_window.js": 3400, 
++    "browser/base/content/test/general/browser_tab_detach_restore.js": 3656, 
+     "browser/base/content/test/general/browser_tab_drag_drop_perwindow.js": 22451, 
+-    "browser/base/content/test/general/browser_tab_dragdrop.js": 3603, 
+-    "browser/base/content/test/general/browser_tab_dragdrop2.js": 6579, 
+-    "browser/base/content/test/general/browser_tabfocus.js": 5898, 
+-    "browser/base/content/test/general/browser_tabkeynavigation.js": 3751, 
+-    "browser/base/content/test/general/browser_tabs_isActive.js": 3883, 
+-    "browser/base/content/test/general/browser_testOpenNewRemoteTabsFromNonRemoteBrowsers.js": 18627, 
+-    "browser/base/content/test/general/browser_trackingUI_1.js": 10728, 
+-    "browser/base/content/test/general/browser_trackingUI_2.js": 8000, 
+-    "browser/base/content/test/general/browser_trackingUI_4.js": 10177, 
+-    "browser/base/content/test/general/browser_trackingUI_5.js": 10282, 
+-    "browser/base/content/test/general/browser_trackingUI_telemetry.js": 14193, 
+-    "browser/base/content/test/general/browser_typeAheadFind.js": 2889, 
+-    "browser/base/content/test/general/browser_unloaddialogs.js": 2918, 
+-    "browser/base/content/test/general/browser_utilityOverlay.js": 3089, 
+-    "browser/base/content/test/general/browser_viewSourceInTabOnViewSource.js": 3445, 
+-    "browser/base/content/test/general/browser_web_channel.js": 15741, 
+-    "browser/base/content/test/general/browser_windowactivation.js": 4655, 
+-    "browser/base/content/test/newtab/browser_newtab_block.js": 4959, 
+-    "browser/base/content/test/newtab/browser_newtab_bug1194895.js": 7308, 
+-    "browser/base/content/test/newtab/browser_newtab_drag_drop.js": 4697, 
+-    "browser/base/content/test/newtab/browser_newtab_drag_drop_ext.js": 6606, 
+-    "browser/base/content/test/newtab/browser_newtab_enhanced.js": 4411, 
+-    "browser/base/content/test/newtab/browser_newtab_perwindow_private_browsing.js": 2913, 
+-    "browser/base/content/test/newtab/browser_newtab_unpin.js": 3032, 
+-    "browser/base/content/test/plugins/browser_CTP_crashreporting.js": 4878, 
++    "browser/base/content/test/general/browser_tab_dragdrop2.js": 5164, 
++    "browser/base/content/test/general/browser_tabfocus.js": 5313, 
++    "browser/base/content/test/general/browser_tabkeynavigation.js": 2646, 
++    "browser/base/content/test/general/browser_tabs_isActive.js": 3475, 
++    "browser/base/content/test/general/browser_testOpenNewRemoteTabsFromNonRemoteBrowsers.js": 15403, 
++    "browser/base/content/test/general/browser_trackingUI_1.js": 8279, 
++    "browser/base/content/test/general/browser_trackingUI_2.js": 5909, 
++    "browser/base/content/test/general/browser_trackingUI_4.js": 7255, 
++    "browser/base/content/test/general/browser_trackingUI_5.js": 7727, 
++    "browser/base/content/test/general/browser_trackingUI_telemetry.js": 11039, 
++    "browser/base/content/test/general/browser_viewSourceInTabOnViewSource.js": 2524, 
++    "browser/base/content/test/general/browser_web_channel.js": 12574, 
++    "browser/base/content/test/general/browser_windowactivation.js": 3196, 
++    "browser/base/content/test/newtab/browser_newtab_background_captures.js": 2477, 
++    "browser/base/content/test/newtab/browser_newtab_block.js": 4308, 
++    "browser/base/content/test/newtab/browser_newtab_bug1194895.js": 9194, 
++    "browser/base/content/test/newtab/browser_newtab_bug752841.js": 2466, 
++    "browser/base/content/test/newtab/browser_newtab_drag_drop.js": 4338, 
++    "browser/base/content/test/newtab/browser_newtab_enhanced.js": 5440, 
++    "browser/base/content/test/newtab/browser_newtab_perwindow_private_browsing.js": 3545, 
++    "browser/base/content/test/newtab/browser_newtab_unpin.js": 3641, 
++    "browser/base/content/test/pageinfo/browser_pageInfo.js": 3436, 
++    "browser/base/content/test/performance/browser_appmenu_reflows.js": 7483, 
++    "browser/base/content/test/performance/browser_tabstrip_overflow_underflow_reflows.js": 3176, 
++    "browser/base/content/test/performance/browser_toolbariconcolor_restyles.js": 2939, 
++    "browser/base/content/test/performance/browser_urlbar_keyed_search_reflows.js": 51127, 
++    "browser/base/content/test/performance/browser_urlbar_search_reflows.js": 14893, 
++    "browser/base/content/test/permissions/browser_permissions.js": 7037, 
++    "browser/base/content/test/permissions/browser_temporary_permissions_expiry.js": 2897, 
++    "browser/base/content/test/permissions/browser_temporary_permissions_navigation.js": 5449, 
++    "browser/base/content/test/permissions/browser_temporary_permissions_tabs.js": 3988, 
++    "browser/base/content/test/plugins/browser_CTP_crashreporting.js": 7441, 
++    "browser/base/content/test/plugins/browser_CTP_data_urls.js": 3333, 
+     "browser/base/content/test/plugins/browser_CTP_drag_drop.js": 5737, 
+-    "browser/base/content/test/plugins/browser_blocking.js": 9383, 
+-    "browser/base/content/test/plugins/browser_blocklist_content.js": 3661, 
+-    "browser/base/content/test/plugins/browser_iterate_hidden_plugins.js": 5033, 
+-    "browser/base/content/test/plugins/browser_pluginCrashCommentAndURL.js": 4166, 
+-    "browser/base/content/test/plugins/browser_pluginnotification.js": 13366, 
+-    "browser/base/content/test/plugins/browser_plugins_added_dynamically.js": 2827, 
+-    "browser/base/content/test/plugins/browser_private_clicktoplay.js": 8632, 
+-    "browser/base/content/test/popupNotifications/browser_popupNotification_2.js": 4734, 
+-    "browser/base/content/test/popupNotifications/browser_popupNotification_3.js": 3791, 
+-    "browser/base/content/test/popupNotifications/browser_popupNotification_4.js": 3407, 
++    "browser/base/content/test/plugins/browser_CTP_favorfallback.js": 4197, 
++    "browser/base/content/test/plugins/browser_blocking.js": 8271, 
++    "browser/base/content/test/plugins/browser_blocklist_content.js": 3470, 
++    "browser/base/content/test/plugins/browser_clearplugindata.js": 2972, 
++    "browser/base/content/test/plugins/browser_iterate_hidden_plugins.js": 3683, 
++    "browser/base/content/test/plugins/browser_pluginCrashCommentAndURL.js": 4903, 
++    "browser/base/content/test/plugins/browser_pluginnotification.js": 10941, 
++    "browser/base/content/test/plugins/browser_plugins_added_dynamically.js": 2627, 
++    "browser/base/content/test/plugins/browser_private_browsing_eme_persistent_state.js": 4030, 
++    "browser/base/content/test/plugins/browser_private_clicktoplay.js": 7605, 
++    "browser/base/content/test/popupNotifications/browser_popupNotification.js": 2717, 
++    "browser/base/content/test/popupNotifications/browser_popupNotification_2.js": 5048, 
++    "browser/base/content/test/popupNotifications/browser_popupNotification_3.js": 4707, 
++    "browser/base/content/test/popupNotifications/browser_popupNotification_4.js": 4432, 
+     "browser/base/content/test/popupNotifications/browser_popupNotification_5.js": 4197, 
+-    "browser/base/content/test/popupNotifications/browser_popupNotification_no_anchors.js": 3514, 
+-    "browser/base/content/test/referrer/browser_referrer_middle_click.js": 22708, 
+-    "browser/base/content/test/referrer/browser_referrer_middle_click_in_container.js": 21681, 
+-    "browser/base/content/test/referrer/browser_referrer_open_link_in_container_tab.js": 4029, 
+-    "browser/base/content/test/referrer/browser_referrer_open_link_in_container_tab2.js": 3993, 
+-    "browser/base/content/test/referrer/browser_referrer_open_link_in_container_tab3.js": 4107, 
+-    "browser/base/content/test/referrer/browser_referrer_open_link_in_private.js": 6835, 
+-    "browser/base/content/test/referrer/browser_referrer_open_link_in_tab.js": 4075, 
+-    "browser/base/content/test/referrer/browser_referrer_open_link_in_window.js": 7014, 
+-    "browser/base/content/test/referrer/browser_referrer_open_link_in_window_in_container.js": 7292, 
+-    "browser/base/content/test/referrer/browser_referrer_simple_click.js": 15480, 
+-    "browser/base/content/test/social/browser_aboutHome_activation.js": 6065, 
+-    "browser/base/content/test/social/browser_blocklist.js": 4105, 
+-    "browser/base/content/test/social/browser_share.js": 12077, 
+-    "browser/base/content/test/social/browser_social_activation.js": 10299, 
+-    "browser/base/content/test/social/browser_social_chatwindow_resize.js": 2879, 
+-    "browser/base/content/test/social/browser_social_marks.js": 2931, 
+-    "browser/base/content/test/social/browser_social_marks_context.js": 3212, 
+-    "browser/base/content/test/social/browser_social_window.js": 8012, 
+-    "browser/base/content/test/tabcrashed/browser_autoSubmitRequest.js": 10853, 
+-    "browser/base/content/test/tabcrashed/browser_clearEmail.js": 6353, 
+-    "browser/base/content/test/tabcrashed/browser_showForm.js": 3905, 
+-    "browser/base/content/test/tabcrashed/browser_shown.js": 25688, 
+-    "browser/base/content/test/tabcrashed/browser_withoutDump.js": 3481, 
+-    "browser/base/content/test/tabs/browser_navigatePinnedTab.js": 4864, 
+-    "browser/base/content/test/tabs/browser_tabSpinnerProbe.js": 5417, 
++    "browser/base/content/test/popupNotifications/browser_popupNotification_checkbox.js": 2551, 
++    "browser/base/content/test/popupNotifications/browser_popupNotification_keyboard.js": 2466, 
++    "browser/base/content/test/popupNotifications/browser_popupNotification_no_anchors.js": 4303, 
++    "browser/base/content/test/popups/browser_popupUI.js": 3400, 
++    "browser/base/content/test/popups/browser_popup_frames.js": 3027, 
++    "browser/base/content/test/referrer/browser_referrer_middle_click.js": 20817, 
++    "browser/base/content/test/referrer/browser_referrer_middle_click_in_container.js": 18871, 
++    "browser/base/content/test/referrer/browser_referrer_open_link_in_container_tab.js": 6236, 
++    "browser/base/content/test/referrer/browser_referrer_open_link_in_container_tab2.js": 6040, 
++    "browser/base/content/test/referrer/browser_referrer_open_link_in_container_tab3.js": 6265, 
++    "browser/base/content/test/referrer/browser_referrer_open_link_in_private.js": 10055, 
++    "browser/base/content/test/referrer/browser_referrer_open_link_in_tab.js": 6285, 
++    "browser/base/content/test/referrer/browser_referrer_open_link_in_window.js": 10231, 
++    "browser/base/content/test/referrer/browser_referrer_open_link_in_window_in_container.js": 10492, 
++    "browser/base/content/test/referrer/browser_referrer_simple_click.js": 14124, 
++    "browser/base/content/test/siteIdentity/browser_bug1045809.js": 3690, 
++    "browser/base/content/test/siteIdentity/browser_bug822367.js": 5834, 
++    "browser/base/content/test/siteIdentity/browser_bug902156.js": 3960, 
++    "browser/base/content/test/siteIdentity/browser_bug906190.js": 18694, 
++    "browser/base/content/test/siteIdentity/browser_identityBlock_focus.js": 2594, 
++    "browser/base/content/test/siteIdentity/browser_identity_UI.js": 13528, 
++    "browser/base/content/test/siteIdentity/browser_insecureLoginForms.js": 4441, 
++    "browser/base/content/test/siteIdentity/browser_mcb_redirect.js": 4209, 
++    "browser/base/content/test/siteIdentity/browser_mixed_content_cert_override.js": 3316, 
++    "browser/base/content/test/siteIdentity/browser_no_mcb_for_loopback.js": 2881, 
++    "browser/base/content/test/social/browser_aboutHome_activation.js": 4802, 
++    "browser/base/content/test/social/browser_blocklist.js": 3525, 
++    "browser/base/content/test/social/browser_share.js": 9282, 
++    "browser/base/content/test/social/browser_social_activation.js": 7557, 
++    "browser/base/content/test/static/browser_all_files_referenced.js": 4286, 
++    "browser/base/content/test/static/browser_parsable_script.js": 8642, 
++    "browser/base/content/test/sync/browser_aboutAccounts.js": 5532, 
++    "browser/base/content/test/sync/browser_contextmenu_sendpage.js": 2980, 
++    "browser/base/content/test/sync/browser_fxa_web_channel.js": 3637, 
++    "browser/base/content/test/tabcrashed/browser_autoSubmitRequest.js": 10197, 
++    "browser/base/content/test/tabcrashed/browser_clearEmail.js": 4434, 
++    "browser/base/content/test/tabcrashed/browser_noPermanentKey.js": 4700, 
++    "browser/base/content/test/tabcrashed/browser_shown.js": 24100, 
++    "browser/base/content/test/tabs/browser_abandonment_telemetry.js": 11129, 
++    "browser/base/content/test/tabs/browser_allow_process_switches_despite_related_browser.js": 2629, 
++    "browser/base/content/test/tabs/browser_navigatePinnedTab.js": 3451, 
++    "browser/base/content/test/tabs/browser_new_file_whitelisted_http_tab.js": 2798, 
++    "browser/base/content/test/tabs/browser_new_web_tab_in_file_process_pref.js": 6874, 
++    "browser/base/content/test/tabs/browser_opened_file_tab_navigated_to_web.js": 4092, 
++    "browser/base/content/test/tabs/browser_overflowScroll.js": 9642, 
++    "browser/base/content/test/tabs/browser_preloadedBrowser_zoom.js": 7129, 
++    "browser/base/content/test/tabs/browser_reload_deleted_file.js": 2968, 
++    "browser/base/content/test/tabs/browser_tabSpinnerProbe.js": 4894, 
+     "browser/base/content/test/tabs/browser_tabSwitchPrintPreview.js": 2875, 
+-    "browser/base/content/test/urlbar/browser_URLBarSetURI.js": 5330, 
+-    "browser/base/content/test/urlbar/browser_action_searchengine_alias.js": 2728, 
+-    "browser/base/content/test/urlbar/browser_autocomplete_enter_race.js": 7424, 
+-    "browser/base/content/test/urlbar/browser_autocomplete_tag_star_visibility.js": 3225, 
+-    "browser/base/content/test/urlbar/browser_bug1025195_switchToTabHavingURI_aOpenParams.js": 12054, 
+-    "browser/base/content/test/urlbar/browser_bug304198.js": 4204, 
+-    "browser/base/content/test/urlbar/browser_canonizeURL.js": 3722, 
+-    "browser/base/content/test/urlbar/browser_moz_action_link.js": 4514, 
+-    "browser/base/content/test/urlbar/browser_tabMatchesInAwesomebar.js": 11900, 
+-    "browser/base/content/test/urlbar/browser_tabMatchesInAwesomebar_perwindowpb.js": 4119, 
++    "browser/base/content/test/tabs/browser_viewsource_of_data_URI_in_file_process.js": 2842, 
++    "browser/base/content/test/urlbar/browser_URLBarSetURI.js": 3717, 
++    "browser/base/content/test/urlbar/browser_action_searchengine.js": 2593, 
++    "browser/base/content/test/urlbar/browser_autocomplete_enter_race.js": 5138, 
++    "browser/base/content/test/urlbar/browser_bug1025195_switchToTabHavingURI_aOpenParams.js": 9110, 
++    "browser/base/content/test/urlbar/browser_bug304198.js": 3674, 
++    "browser/base/content/test/urlbar/browser_canonizeURL.js": 3273, 
++    "browser/base/content/test/urlbar/browser_locationBarCommand.js": 7919, 
++    "browser/base/content/test/urlbar/browser_moz_action_link.js": 4256, 
++    "browser/base/content/test/urlbar/browser_page_action_menu.js": 38078, 
++    "browser/base/content/test/urlbar/browser_tabMatchesInAwesomebar.js": 9069, 
++    "browser/base/content/test/urlbar/browser_tabMatchesInAwesomebar_perwindowpb.js": 5644, 
+     "browser/base/content/test/urlbar/browser_urlbarAboutHomeLoading.js": 12974, 
+-    "browser/base/content/test/urlbar/browser_urlbarDecode.js": 2975, 
+-    "browser/base/content/test/urlbar/browser_urlbarEnter.js": 2959, 
+-    "browser/base/content/test/urlbar/browser_urlbarHashChangeProxyState.js": 4051, 
+-    "browser/base/content/test/urlbar/browser_urlbarKeepStateAcrossTabSwitches.js": 5226, 
+-    "browser/base/content/test/urlbar/browser_urlbarOneOffs.js": 8093, 
+-    "browser/base/content/test/urlbar/browser_urlbarRaceWithTabs.js": 2691, 
+-    "browser/base/content/test/urlbar/browser_urlbarSearchSingleWordNotification.js": 19159, 
+-    "browser/base/content/test/urlbar/browser_urlbarSearchSuggestions.js": 2764, 
+-    "browser/base/content/test/urlbar/browser_urlbarSearchSuggestionsNotification.js": 12217, 
+-    "browser/base/content/test/urlbar/browser_urlbarSearchTelemetry.js": 7549, 
+-    "browser/base/content/test/urlbar/browser_urlbar_autoFill_backspaced.js": 7083, 
+-    "browser/base/content/test/urlbar/browser_urlbar_blanking.js": 4755, 
+-    "browser/base/content/test/urlbar/browser_urlbar_remoteness_switch.js": 3145, 
+-    "browser/base/content/test/webrtc/browser_devices_get_user_media.js": 15015, 
+-    "browser/base/content/test/webrtc/browser_devices_get_user_media_anim.js": 6437, 
+-    "browser/base/content/test/webrtc/browser_devices_get_user_media_in_frame.js": 9186, 
+-    "browser/base/content/test/webrtc/browser_devices_get_user_media_tear_off_tab.js": 4002, 
+-    "browser/components/contextualidentity/test/browser/browser_aboutURLs.js": 20655, 
+-    "browser/components/contextualidentity/test/browser/browser_favicon.js": 8811, 
+-    "browser/components/contextualidentity/test/browser/browser_forgetAPI_EME_forgetThisSite.js": 5468, 
+-    "browser/components/contextualidentity/test/browser/browser_forgetAPI_quota_clearStoragesForPrincipal.js": 4645, 
+-    "browser/components/contextualidentity/test/browser/browser_forgetaboutsite.js": 15613, 
+-    "browser/components/contextualidentity/test/browser/browser_imageCache.js": 5556, 
+-    "browser/components/contextualidentity/test/browser/browser_newtabButton.js": 5962, 
+-    "browser/components/contextualidentity/test/browser/browser_serviceworkers.js": 3328, 
+-    "browser/components/contextualidentity/test/browser/browser_usercontext.js": 5298, 
+-    "browser/components/contextualidentity/test/browser/browser_usercontextid_tabdrop.js": 6384, 
+-    "browser/components/customizableui/test/browser_1003588_no_specials_in_panel.js": 4117, 
+-    "browser/components/customizableui/test/browser_1007336_lwthemes_in_customize_mode.js": 2698, 
+-    "browser/components/customizableui/test/browser_1008559_anchor_undo_restore.js": 10158, 
+-    "browser/components/customizableui/test/browser_1089591_still_customizable_after_reset.js": 5476, 
+-    "browser/components/customizableui/test/browser_876926_customize_mode_wrapping.js": 9557, 
+-    "browser/components/customizableui/test/browser_878452_drag_to_panel.js": 3840, 
+-    "browser/components/customizableui/test/browser_880164_customization_context_menus.js": 16584, 
+-    "browser/components/customizableui/test/browser_880382_drag_wide_widgets_in_panel.js": 8933, 
+-    "browser/components/customizableui/test/browser_885052_customize_mode_observers_disabed.js": 2964, 
+-    "browser/components/customizableui/test/browser_885530_showInPrivateBrowsing.js": 13156, 
+-    "browser/components/customizableui/test/browser_890140_orphaned_placeholders.js": 16100, 
+-    "browser/components/customizableui/test/browser_918049_skipintoolbarset_dnd.js": 2884, 
+-    "browser/components/customizableui/test/browser_923857_customize_mode_event_wrapping_during_reset.js": 4475, 
+-    "browser/components/customizableui/test/browser_927717_customize_drag_empty_toolbar.js": 2696, 
+-    "browser/components/customizableui/test/browser_934951_zoom_in_toolbar.js": 3110, 
+-    "browser/components/customizableui/test/browser_938980_navbar_collapsed.js": 18610, 
+-    "browser/components/customizableui/test/browser_956602_remove_special_widget.js": 2754, 
+-    "browser/components/customizableui/test/browser_962884_opt_in_disable_hyphens.js": 2843, 
+-    "browser/components/customizableui/test/browser_963639_customizing_attribute_non_customizable_toolbar.js": 2665, 
+-    "browser/components/customizableui/test/browser_967000_button_sync.js": 21565, 
+-    "browser/components/customizableui/test/browser_968565_insert_before_hidden_items.js": 3967, 
+-    "browser/components/customizableui/test/browser_969661_character_encoding_navbar_disabled.js": 2788, 
+-    "browser/components/customizableui/test/browser_970511_undo_restore_default.js": 16172, 
+-    "browser/components/customizableui/test/browser_973932_addonbar_currentset.js": 4063, 
+-    "browser/components/customizableui/test/browser_975719_customtoolbars_behaviour.js": 12717, 
+-    "browser/components/customizableui/test/browser_978084_dragEnd_after_move.js": 5406, 
+-    "browser/components/customizableui/test/browser_985815_propagate_setToolbarVisibility.js": 6881, 
+-    "browser/components/customizableui/test/browser_987640_charEncoding.js": 2958, 
+-    "browser/components/customizableui/test/browser_988072_sidebar_events.js": 5655, 
+-    "browser/components/customizableui/test/browser_993322_widget_notoolbar.js": 2659, 
+-    "browser/components/customizableui/test/browser_995164_registerArea_during_customize_mode.js": 9798, 
+-    "browser/components/customizableui/test/browser_bootstrapped_custom_toolbar.js": 9780, 
+-    "browser/components/customizableui/test/browser_customizemode_contextmenu_menubuttonstate.js": 2711, 
+-    "browser/components/customizableui/test/browser_switch_to_customize_mode.js": 6446, 
+-    "browser/components/downloads/test/browser/browser_confirm_unblock_download.js": 5673, 
+-    "browser/components/downloads/test/browser/browser_downloads_panel_block.js": 22665, 
+-    "browser/components/downloads/test/browser/browser_iframe_gone_mid_download.js": 10126, 
+-    "browser/components/downloads/test/browser/browser_indicatorDrop.js": 5207, 
+-    "browser/components/downloads/test/browser/browser_libraryDrop.js": 6573, 
+-    "browser/components/extensions/test/browser/browser_ext_browserAction_context.js": 6300, 
+-    "browser/components/extensions/test/browser/browser_ext_browserAction_pageAction_icon.js": 14329, 
+-    "browser/components/extensions/test/browser/browser_ext_browserAction_pageAction_icon_permissions.js": 4795, 
+-    "browser/components/extensions/test/browser/browser_ext_browserAction_popup.js": 13629, 
++    "browser/base/content/test/urlbar/browser_urlbarAddonIframe.js": 2523, 
++    "browser/base/content/test/urlbar/browser_urlbarHashChangeProxyState.js": 2558, 
++    "browser/base/content/test/urlbar/browser_urlbarKeepStateAcrossTabSwitches.js": 3744, 
++    "browser/base/content/test/urlbar/browser_urlbarOneOffs.js": 4524, 
++    "browser/base/content/test/urlbar/browser_urlbarOneOffs_searchSuggestions.js": 3654, 
++    "browser/base/content/test/urlbar/browser_urlbarSearchSingleWordNotification.js": 16459, 
++    "browser/base/content/test/urlbar/browser_urlbarSearchSuggestions.js": 4085, 
++    "browser/base/content/test/urlbar/browser_urlbarSearchSuggestionsNotification.js": 10786, 
++    "browser/base/content/test/urlbar/browser_urlbarSearchSuggestions_opt-in.js": 8813, 
++    "browser/base/content/test/urlbar/browser_urlbarSearchSuggestions_opt-out.js": 4153, 
++    "browser/base/content/test/urlbar/browser_urlbarSearchTelemetry.js": 5768, 
++    "browser/base/content/test/urlbar/browser_urlbar_autoFill_backspaced.js": 5194, 
++    "browser/base/content/test/urlbar/browser_urlbar_blanking.js": 3831, 
++    "browser/base/content/test/urlbar/browser_urlbar_remoteness_switch.js": 2859, 
++    "browser/base/content/test/urlbar/browser_urlbar_search_speculative_connect.js": 4281, 
++    "browser/base/content/test/urlbar/browser_urlbar_stop_pending.js": 4851, 
++    "browser/base/content/test/webextensions/browser_extension_sideloading.js": 9275, 
++    "browser/base/content/test/webextensions/browser_extension_update_background.js": 17282, 
++    "browser/base/content/test/webextensions/browser_extension_update_background_noprompt.js": 5270, 
++    "browser/base/content/test/webextensions/browser_permissions_addons_search.js": 8026, 
++    "browser/base/content/test/webextensions/browser_permissions_installTrigger.js": 4345, 
++    "browser/base/content/test/webextensions/browser_permissions_local_file.js": 7651, 
++    "browser/base/content/test/webextensions/browser_permissions_mozAddonManager.js": 3762, 
++    "browser/base/content/test/webextensions/browser_update_checkForUpdates.js": 9804, 
++    "browser/base/content/test/webextensions/browser_update_findUpdates.js": 8998, 
++    "browser/base/content/test/webextensions/browser_update_interactive_noprompt.js": 8183, 
++    "browser/base/content/test/webrtc/browser_devices_get_user_media.js": 19031, 
++    "browser/base/content/test/webrtc/browser_devices_get_user_media_anim.js": 7321, 
++    "browser/base/content/test/webrtc/browser_devices_get_user_media_in_frame.js": 5518, 
++    "browser/base/content/test/webrtc/browser_devices_get_user_media_queue_request.js": 3446, 
++    "browser/base/content/test/webrtc/browser_devices_get_user_media_screen.js": 14400, 
++    "browser/base/content/test/webrtc/browser_devices_get_user_media_tear_off_tab.js": 3664, 
++    "browser/base/content/test/webrtc/browser_devices_get_user_media_unprompted_access.js": 8200, 
++    "browser/base/content/test/webrtc/browser_devices_get_user_media_unprompted_access_in_frame.js": 10541, 
++    "browser/base/content/test/webrtc/browser_devices_get_user_media_unprompted_access_tear_off_tab.js": 3565, 
++    "browser/components/contextualidentity/test/browser/browser_aboutURLs.js": 18143, 
++    "browser/components/contextualidentity/test/browser/browser_favicon.js": 9453, 
++    "browser/components/contextualidentity/test/browser/browser_forgetAPI_EME_forgetThisSite.js": 4694, 
++    "browser/components/contextualidentity/test/browser/browser_forgetAPI_quota_clearStoragesForPrincipal.js": 3982, 
++    "browser/components/contextualidentity/test/browser/browser_forgetaboutsite.js": 12362, 
++    "browser/components/contextualidentity/test/browser/browser_imageCache.js": 4416, 
++    "browser/components/contextualidentity/test/browser/browser_newtabButton.js": 8969, 
++    "browser/components/contextualidentity/test/browser/browser_serviceworkers.js": 2766, 
++    "browser/components/contextualidentity/test/browser/browser_usercontext.js": 3752, 
++    "browser/components/contextualidentity/test/browser/browser_usercontextid_tabdrop.js": 3785, 
++    "browser/components/customizableui/test/browser_1003588_no_specials_in_panel.js": 2551, 
++    "browser/components/customizableui/test/browser_1008559_anchor_undo_restore.js": 3216, 
++    "browser/components/customizableui/test/browser_1087303_button_preferences.js": 2666, 
++    "browser/components/customizableui/test/browser_876926_customize_mode_wrapping.js": 5695, 
++    "browser/components/customizableui/test/browser_880164_customization_context_menus.js": 11192, 
++    "browser/components/customizableui/test/browser_880382_drag_wide_widgets_in_panel.js": 6148, 
++    "browser/components/customizableui/test/browser_885530_showInPrivateBrowsing.js": 9573, 
++    "browser/components/customizableui/test/browser_890140_orphaned_placeholders.js": 10064, 
++    "browser/components/customizableui/test/browser_901207_searchbar_in_panel.js": 2549, 
++    "browser/components/customizableui/test/browser_934951_zoom_in_toolbar.js": 2755, 
++    "browser/components/customizableui/test/browser_938980_navbar_collapsed.js": 7668, 
++    "browser/components/customizableui/test/browser_967000_button_sync.js": 16919, 
++    "browser/components/customizableui/test/browser_970511_undo_restore_default.js": 6747, 
++    "browser/components/customizableui/test/browser_975719_customtoolbars_behaviour.js": 7958, 
++    "browser/components/customizableui/test/browser_985815_propagate_setToolbarVisibility.js": 3980, 
++    "browser/components/customizableui/test/browser_988072_sidebar_events.js": 4693, 
++    "browser/components/customizableui/test/browser_995164_registerArea_during_customize_mode.js": 4842, 
++    "browser/components/customizableui/test/browser_backfwd_enabled_post_customize.js": 2686, 
++    "browser/components/customizableui/test/browser_bootstrapped_custom_toolbar.js": 4247, 
++    "browser/components/customizableui/test/browser_customization_context_menus.js": 11071, 
++    "browser/components/customizableui/test/browser_customizemode_uidensity.js": 7146, 
++    "browser/components/customizableui/test/browser_exit_background_customize_mode.js": 2757, 
++    "browser/components/customizableui/test/browser_panelUINotifications.js": 4736, 
++    "browser/components/customizableui/test/browser_panelUINotifications_multiWindow.js": 6718, 
++    "browser/components/customizableui/test/browser_panel_keyboard_navigation.js": 2881, 
++    "browser/components/customizableui/test/browser_photon_customization_context_menus.js": 10156, 
++    "browser/components/customizableui/test/browser_switch_to_customize_mode.js": 2650, 
++    "browser/components/customizableui/test/browser_synced_tabs_menu.js": 11665, 
++    "browser/components/downloads/test/browser/browser_confirm_unblock_download.js": 3808, 
++    "browser/components/downloads/test/browser/browser_iframe_gone_mid_download.js": 7485, 
++    "browser/components/downloads/test/browser/browser_indicatorDrop.js": 4650, 
++    "browser/components/downloads/test/browser/browser_libraryDrop.js": 4676, 
++    "browser/components/extensions/test/browser/browser_ext_autocompletepopup.js": 5914, 
++    "browser/components/extensions/test/browser/browser_ext_browserAction_context.js": 4595, 
++    "browser/components/extensions/test/browser/browser_ext_browserAction_pageAction_icon.js": 6429, 
++    "browser/components/extensions/test/browser/browser_ext_browserAction_pageAction_icon_permissions.js": 2816, 
++    "browser/components/extensions/test/browser/browser_ext_browserAction_popup.js": 9824, 
+     "browser/components/extensions/test/browser/browser_ext_browserAction_popup_preload.js": 5212, 
+-    "browser/components/extensions/test/browser/browser_ext_browserAction_popup_resize.js": 12029, 
+-    "browser/components/extensions/test/browser/browser_ext_browserAction_simple.js": 2864, 
+-    "browser/components/extensions/test/browser/browser_ext_commands_execute_browser_action.js": 4052, 
+-    "browser/components/extensions/test/browser/browser_ext_commands_onCommand.js": 5729, 
+-    "browser/components/extensions/test/browser/browser_ext_contentscript_connect.js": 2752, 
+-    "browser/components/extensions/test/browser/browser_ext_contextMenus.js": 8163, 
+-    "browser/components/extensions/test/browser/browser_ext_contextMenus_onclick.js": 20234, 
+-    "browser/components/extensions/test/browser/browser_ext_currentWindow.js": 10238, 
+-    "browser/components/extensions/test/browser/browser_ext_getViews.js": 10194, 
+-    "browser/components/extensions/test/browser/browser_ext_history.js": 2761, 
+-    "browser/components/extensions/test/browser/browser_ext_incognito_popup.js": 5523, 
+-    "browser/components/extensions/test/browser/browser_ext_incognito_views.js": 4503, 
+-    "browser/components/extensions/test/browser/browser_ext_legacy_extension_context_contentscript.js": 3826, 
+-    "browser/components/extensions/test/browser/browser_ext_omnibox.js": 8347, 
+-    "browser/components/extensions/test/browser/browser_ext_optionsPage_privileges.js": 5250, 
+-    "browser/components/extensions/test/browser/browser_ext_pageAction_context.js": 8940, 
+-    "browser/components/extensions/test/browser/browser_ext_pageAction_popup.js": 6095, 
+-    "browser/components/extensions/test/browser/browser_ext_pageAction_title.js": 9914, 
+-    "browser/components/extensions/test/browser/browser_ext_popup_api_injection.js": 3388, 
+-    "browser/components/extensions/test/browser/browser_ext_popup_background.js": 3376, 
+-    "browser/components/extensions/test/browser/browser_ext_popup_corners.js": 2832, 
+-    "browser/components/extensions/test/browser/browser_ext_popup_shutdown.js": 4009, 
+-    "browser/components/extensions/test/browser/browser_ext_runtime_openOptionsPage.js": 25951, 
+-    "browser/components/extensions/test/browser/browser_ext_runtime_openOptionsPage_uninstall.js": 5089, 
+-    "browser/components/extensions/test/browser/browser_ext_runtime_setUninstallURL.js": 4242, 
+-    "browser/components/extensions/test/browser/browser_ext_sessions_getRecentlyClosed.js": 16179, 
+-    "browser/components/extensions/test/browser/browser_ext_sessions_getRecentlyClosed_private.js": 4967, 
+-    "browser/components/extensions/test/browser/browser_ext_sessions_restore.js": 13155, 
+-    "browser/components/extensions/test/browser/browser_ext_tab_runtimeConnect.js": 2778, 
+-    "browser/components/extensions/test/browser/browser_ext_tabs_audio.js": 3403, 
+-    "browser/components/extensions/test/browser/browser_ext_tabs_captureVisibleTab.js": 8268, 
+-    "browser/components/extensions/test/browser/browser_ext_tabs_cookieStoreId.js": 12419, 
+-    "browser/components/extensions/test/browser/browser_ext_tabs_create.js": 9721, 
+-    "browser/components/extensions/test/browser/browser_ext_tabs_detectLanguage.js": 3805, 
+-    "browser/components/extensions/test/browser/browser_ext_tabs_duplicate.js": 8420, 
+-    "browser/components/extensions/test/browser/browser_ext_tabs_events.js": 13310, 
+-    "browser/components/extensions/test/browser/browser_ext_tabs_executeScript.js": 4795, 
+-    "browser/components/extensions/test/browser/browser_ext_tabs_executeScript_bad.js": 7985, 
++    "browser/components/extensions/test/browser/browser_ext_browserAction_popup_resize.js": 7980, 
++    "browser/components/extensions/test/browser/browser_ext_browserAction_telemetry.js": 3789, 
++    "browser/components/extensions/test/browser/browser_ext_browserAction_theme_icons.js": 2588, 
++    "browser/components/extensions/test/browser/browser_ext_browsingData_formData.js": 2916, 
++    "browser/components/extensions/test/browser/browser_ext_browsingData_localStorage.js": 3288, 
++    "browser/components/extensions/test/browser/browser_ext_browsingData_pluginData.js": 5323, 
++    "browser/components/extensions/test/browser/browser_ext_browsingData_serviceWorkers.js": 3757, 
++    "browser/components/extensions/test/browser/browser_ext_commands_execute_browser_action.js": 3135, 
++    "browser/components/extensions/test/browser/browser_ext_commands_onCommand.js": 4017, 
++    "browser/components/extensions/test/browser/browser_ext_contextMenus.js": 7143, 
++    "browser/components/extensions/test/browser/browser_ext_contextMenus_commands.js": 3003, 
++    "browser/components/extensions/test/browser/browser_ext_contextMenus_icons.js": 3102, 
++    "browser/components/extensions/test/browser/browser_ext_contextMenus_onclick.js": 23063, 
++    "browser/components/extensions/test/browser/browser_ext_currentWindow.js": 7371, 
++    "browser/components/extensions/test/browser/browser_ext_devtools_inspectedWindow.js": 10428, 
++    "browser/components/extensions/test/browser/browser_ext_devtools_inspectedWindow_eval_bindings.js": 8984, 
++    "browser/components/extensions/test/browser/browser_ext_devtools_inspectedWindow_reload.js": 13295, 
++    "browser/components/extensions/test/browser/browser_ext_devtools_network.js": 5147, 
++    "browser/components/extensions/test/browser/browser_ext_devtools_page.js": 3207, 
++    "browser/components/extensions/test/browser/browser_ext_devtools_panel.js": 9604, 
++    "browser/components/extensions/test/browser/browser_ext_devtools_panels_elements.js": 5153, 
++    "browser/components/extensions/test/browser/browser_ext_find.js": 2509, 
++    "browser/components/extensions/test/browser/browser_ext_getViews.js": 8019, 
++    "browser/components/extensions/test/browser/browser_ext_incognito_popup.js": 4293, 
++    "browser/components/extensions/test/browser/browser_ext_incognito_views.js": 3318, 
++    "browser/components/extensions/test/browser/browser_ext_menus.js": 9249, 
++    "browser/components/extensions/test/browser/browser_ext_openPanel.js": 4698, 
++    "browser/components/extensions/test/browser/browser_ext_optionsPage_browser_style.js": 12593, 
++    "browser/components/extensions/test/browser/browser_ext_optionsPage_privileges.js": 4610, 
++    "browser/components/extensions/test/browser/browser_ext_pageAction_context.js": 7460, 
++    "browser/components/extensions/test/browser/browser_ext_pageAction_contextMenu.js": 3980, 
++    "browser/components/extensions/test/browser/browser_ext_pageAction_popup.js": 5354, 
++    "browser/components/extensions/test/browser/browser_ext_pageAction_popup_resize.js": 2577, 
++    "browser/components/extensions/test/browser/browser_ext_pageAction_telemetry.js": 2451, 
++    "browser/components/extensions/test/browser/browser_ext_pageAction_title.js": 9137, 
++    "browser/components/extensions/test/browser/browser_ext_popup_api_injection.js": 3135, 
++    "browser/components/extensions/test/browser/browser_ext_popup_background.js": 2453, 
++    "browser/components/extensions/test/browser/browser_ext_popup_shutdown.js": 2988, 
++    "browser/components/extensions/test/browser/browser_ext_runtime_openOptionsPage.js": 19848, 
++    "browser/components/extensions/test/browser/browser_ext_runtime_openOptionsPage_uninstall.js": 4467, 
++    "browser/components/extensions/test/browser/browser_ext_runtime_setUninstallURL.js": 3226, 
++    "browser/components/extensions/test/browser/browser_ext_sessions_forgetClosedWindow.js": 5940, 
++    "browser/components/extensions/test/browser/browser_ext_sessions_getRecentlyClosed.js": 11925, 
++    "browser/components/extensions/test/browser/browser_ext_sessions_getRecentlyClosed_private.js": 3712, 
++    "browser/components/extensions/test/browser/browser_ext_sessions_getRecentlyClosed_tabs.js": 4084, 
++    "browser/components/extensions/test/browser/browser_ext_sessions_restore.js": 10737, 
++    "browser/components/extensions/test/browser/browser_ext_settings_overrides_default_search.js": 9529, 
++    "browser/components/extensions/test/browser/browser_ext_sidebarAction.js": 8385, 
++    "browser/components/extensions/test/browser/browser_ext_sidebarAction_browser_style.js": 7839, 
++    "browser/components/extensions/test/browser/browser_ext_sidebarAction_context.js": 8985, 
++    "browser/components/extensions/test/browser/browser_ext_sidebarAction_contextMenu.js": 6772, 
++    "browser/components/extensions/test/browser/browser_ext_sidebarAction_windows.js": 3709, 
++    "browser/components/extensions/test/browser/browser_ext_tabs_audio.js": 2501, 
++    "browser/components/extensions/test/browser/browser_ext_tabs_captureVisibleTab.js": 6530, 
++    "browser/components/extensions/test/browser/browser_ext_tabs_cookieStoreId.js": 10703, 
++    "browser/components/extensions/test/browser/browser_ext_tabs_create.js": 10748, 
++    "browser/components/extensions/test/browser/browser_ext_tabs_detectLanguage.js": 2601, 
++    "browser/components/extensions/test/browser/browser_ext_tabs_duplicate.js": 5433, 
++    "browser/components/extensions/test/browser/browser_ext_tabs_events.js": 9511, 
++    "browser/components/extensions/test/browser/browser_ext_tabs_executeScript.js": 3439, 
++    "browser/components/extensions/test/browser/browser_ext_tabs_executeScript_bad.js": 15140, 
+     "browser/components/extensions/test/browser/browser_ext_tabs_executeScript_good.js": 9270, 
+-    "browser/components/extensions/test/browser/browser_ext_tabs_executeScript_runAt.js": 3031, 
+-    "browser/components/extensions/test/browser/browser_ext_tabs_move.js": 4072, 
+-    "browser/components/extensions/test/browser/browser_ext_tabs_move_window.js": 8759, 
+-    "browser/components/extensions/test/browser/browser_ext_tabs_move_window_multiple.js": 7095, 
+-    "browser/components/extensions/test/browser/browser_ext_tabs_move_window_pinned.js": 5873, 
+-    "browser/components/extensions/test/browser/browser_ext_tabs_onHighlighted.js": 3548, 
++    "browser/components/extensions/test/browser/browser_ext_tabs_executeScript_runAt.js": 2628, 
++    "browser/components/extensions/test/browser/browser_ext_tabs_insertCSS.js": 2752, 
++    "browser/components/extensions/test/browser/browser_ext_tabs_move.js": 3458, 
++    "browser/components/extensions/test/browser/browser_ext_tabs_move_array.js": 4311, 
++    "browser/components/extensions/test/browser/browser_ext_tabs_move_window.js": 6316, 
++    "browser/components/extensions/test/browser/browser_ext_tabs_move_window_multiple.js": 5205, 
++    "browser/components/extensions/test/browser/browser_ext_tabs_move_window_pinned.js": 4117, 
++    "browser/components/extensions/test/browser/browser_ext_tabs_onHighlighted.js": 8947, 
+     "browser/components/extensions/test/browser/browser_ext_tabs_onUpdated.js": 17361, 
+-    "browser/components/extensions/test/browser/browser_ext_tabs_query.js": 10703, 
+-    "browser/components/extensions/test/browser/browser_ext_tabs_sendMessage.js": 5331, 
+-    "browser/components/extensions/test/browser/browser_ext_tabs_update.js": 2635, 
+-    "browser/components/extensions/test/browser/browser_ext_tabs_update_url.js": 6590, 
+-    "browser/components/extensions/test/browser/browser_ext_tabs_zoom.js": 6108, 
+-    "browser/components/extensions/test/browser/browser_ext_webNavigation_urlbar_transitions.js": 8815, 
+-    "browser/components/extensions/test/browser/browser_ext_webRequest.js": 5725, 
+-    "browser/components/extensions/test/browser/browser_ext_windows_allowScriptsToClose.js": 7452, 
+-    "browser/components/extensions/test/browser/browser_ext_windows_create.js": 12038, 
+-    "browser/components/extensions/test/browser/browser_ext_windows_create_tabId.js": 11520, 
+-    "browser/components/extensions/test/browser/browser_ext_windows_create_url.js": 10253, 
+-    "browser/components/extensions/test/browser/browser_ext_windows_events.js": 4538, 
+-    "browser/components/extensions/test/browser/browser_ext_windows_size.js": 3534, 
+-    "browser/components/extensions/test/browser/browser_ext_windows_update.js": 8075, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_browserAction_context.js": 8695, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_browserAction_pageAction_icon.js": 14635, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_browserAction_pageAction_icon_permissions.js": 8121, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_browserAction_popup.js": 15769, 
++    "browser/components/extensions/test/browser/browser_ext_tabs_opener.js": 3795, 
++    "browser/components/extensions/test/browser/browser_ext_tabs_printPreview.js": 3503, 
++    "browser/components/extensions/test/browser/browser_ext_tabs_query.js": 7697, 
++    "browser/components/extensions/test/browser/browser_ext_tabs_removeCSS.js": 3603, 
++    "browser/components/extensions/test/browser/browser_ext_tabs_sendMessage.js": 4560, 
++    "browser/components/extensions/test/browser/browser_ext_tabs_update_url.js": 4937, 
++    "browser/components/extensions/test/browser/browser_ext_tabs_zoom.js": 4136, 
++    "browser/components/extensions/test/browser/browser_ext_themes_icons.js": 2579, 
++    "browser/components/extensions/test/browser/browser_ext_url_overrides_home.js": 3132, 
++    "browser/components/extensions/test/browser/browser_ext_webNavigation_onCreatedNavigationTarget.js": 10505, 
++    "browser/components/extensions/test/browser/browser_ext_webNavigation_onCreatedNavigationTarget_contextmenu.js": 6935, 
++    "browser/components/extensions/test/browser/browser_ext_webNavigation_onCreatedNavigationTarget_window_open.js": 6998, 
++    "browser/components/extensions/test/browser/browser_ext_webNavigation_urlbar_transitions.js": 6273, 
++    "browser/components/extensions/test/browser/browser_ext_webRequest.js": 4571, 
++    "browser/components/extensions/test/browser/browser_ext_windows.js": 5620, 
++    "browser/components/extensions/test/browser/browser_ext_windows_allowScriptsToClose.js": 5592, 
++    "browser/components/extensions/test/browser/browser_ext_windows_create.js": 11110, 
++    "browser/components/extensions/test/browser/browser_ext_windows_create_tabId.js": 10199, 
++    "browser/components/extensions/test/browser/browser_ext_windows_create_url.js": 8694, 
++    "browser/components/extensions/test/browser/browser_ext_windows_events.js": 3727, 
++    "browser/components/extensions/test/browser/browser_ext_windows_update.js": 6007, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_browserAction_context.js": 5957, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_browserAction_pageAction_icon.js": 6468, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_browserAction_pageAction_icon_permissions.js": 3377, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_browserAction_popup.js": 12911, 
+     "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_browserAction_popup_preload.js": 5990, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_browserAction_popup_resize.js": 12165, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_browserAction_simple.js": 3453, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_commands_execute_browser_action.js": 6277, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_commands_execute_page_action.js": 2762, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_commands_onCommand.js": 6624, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_contextMenus.js": 10290, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_contextMenus_actionMenus.js": 3063, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_contextMenus_checkboxes.js": 3168, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_contextMenus_chrome.js": 5107, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_browserAction_popup_resize.js": 10162, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_browserAction_simple.js": 2458, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_browserAction_telemetry.js": 4210, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_browserAction_theme_icons.js": 3121, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_browsingData_formData.js": 2627, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_browsingData_localStorage.js": 2499, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_browsingData_pluginData.js": 5403, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_browsingData_serviceWorkers.js": 3898, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_commands_execute_browser_action.js": 3590, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_commands_onCommand.js": 4145, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_contextMenus.js": 7496, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_contextMenus_commands.js": 3311, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_contextMenus_icons.js": 3267, 
+     "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_contextMenus_onclick.js": 21945, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_contextMenus_radioGroups.js": 2916, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_contextMenus_uninstall.js": 3330, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_contextMenus_urlPatterns.js": 3045, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_currentWindow.js": 11330, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_getViews.js": 11257, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_incognito_popup.js": 6068, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_incognito_views.js": 5153, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_lastError.js": 3287, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_omnibox.js": 9337, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_optionsPage_privileges.js": 5639, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_pageAction_context.js": 9585, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_pageAction_popup.js": 6144, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_pageAction_popup_resize.js": 3622, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_pageAction_title.js": 11366, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_popup_api_injection.js": 3817, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_popup_background.js": 3841, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_popup_corners.js": 3373, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_popup_sendMessage.js": 3224, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_popup_shutdown.js": 5734, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_runtime_openOptionsPage.js": 29757, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_runtime_openOptionsPage_uninstall.js": 6092, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_runtime_setUninstallURL.js": 5937, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_sessions_getRecentlyClosed.js": 16618, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_sessions_getRecentlyClosed_private.js": 5558, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_sessions_restore.js": 13634, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_tab_runtimeConnect.js": 3585, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_tabs_audio.js": 4175, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_tabs_captureVisibleTab.js": 11402, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_tabs_cookieStoreId.js": 12035, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_tabs_create.js": 10233, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_tabs_create_invalid_url.js": 3392, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_tabs_detectLanguage.js": 4729, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_tabs_duplicate.js": 10649, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_tabs_events.js": 15209, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_tabs_executeScript.js": 5652, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_tabs_executeScript_bad.js": 11694, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_tabs_executeScript_good.js": 13878, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_tabs_executeScript_runAt.js": 3664, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_tabs_getCurrent.js": 3280, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_tabs_insertCSS.js": 2850, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_tabs_move.js": 6226, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_tabs_move_window.js": 10003, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_tabs_move_window_multiple.js": 8105, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_tabs_move_window_pinned.js": 6474, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_tabs_onHighlighted.js": 3136, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_tabs_onUpdated.js": 19503, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_tabs_query.js": 14949, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_tabs_reload.js": 2811, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_tabs_reload_bypass_cache.js": 2932, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_tabs_removeCSS.js": 3081, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_tabs_sendMessage.js": 6988, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_tabs_update.js": 3288, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_tabs_update_url.js": 9245, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_tabs_zoom.js": 7363, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_theme_extreme.js": 2812, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_theme_icons.js": 2792, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_theme_lwtsupport.js": 3092, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_webNavigation_getFrames.js": 3528, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_webNavigation_urlbar_transitions.js": 11560, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_webRequest.js": 6269, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_windows.js": 3597, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_windows_create.js": 12054, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_windows_create_tabId.js": 12150, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_windows_create_url.js": 9935, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_windows_events.js": 5159, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_windows_size.js": 4025, 
+-    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_windows_update.js": 9662, 
+-    "browser/components/newtab/tests/browser/browser_newtab_overrides.js": 6212, 
+-    "browser/components/newtab/tests/browser/browser_newtabwebchannel.js": 6703, 
+-    "browser/components/originattributes/test/browser/browser_blobURLIsolation.js": 12696, 
+-    "browser/components/originattributes/test/browser/browser_broadcastChannel.js": 11739, 
+-    "browser/components/originattributes/test/browser/browser_cache.js": 23362, 
+-    "browser/components/originattributes/test/browser/browser_cacheAPI.js": 16149, 
+-    "browser/components/originattributes/test/browser/browser_clientAuth.js": 17197, 
+-    "browser/components/originattributes/test/browser/browser_cookieIsolation.js": 9713, 
+-    "browser/components/originattributes/test/browser/browser_favicon_firstParty.js": 11267, 
+-    "browser/components/originattributes/test/browser/browser_favicon_userContextId.js": 7680, 
+-    "browser/components/originattributes/test/browser/browser_firstPartyIsolation.js": 17088, 
+-    "browser/components/originattributes/test/browser/browser_httpauth.js": 22120, 
+-    "browser/components/originattributes/test/browser/browser_imageCacheIsolation.js": 19931, 
+-    "browser/components/originattributes/test/browser/browser_localStorageIsolation.js": 9519, 
+-    "browser/components/originattributes/test/browser/browser_permissions.js": 10375, 
+-    "browser/components/originattributes/test/browser/browser_sanitize.js": 10658, 
+-    "browser/components/originattributes/test/browser/browser_sharedworker.js": 10557, 
+-    "browser/components/places/tests/browser/browser_bookmarkProperties_addKeywordForThisSearch.js": 6689, 
+-    "browser/components/places/tests/browser/browser_bookmarkProperties_editTagContainer.js": 2668, 
+-    "browser/components/places/tests/browser/browser_bookmarklet_windowOpen.js": 2811, 
+-    "browser/components/places/tests/browser/browser_bookmarksProperties.js": 4908, 
+-    "browser/components/places/tests/browser/browser_forgetthissite_single.js": 2712, 
+-    "browser/components/places/tests/browser/browser_library_commands.js": 6259, 
+-    "browser/components/places/tests/browser/browser_library_middleclick.js": 4930, 
+-    "browser/components/places/tests/browser/browser_library_views_liveupdate.js": 9129, 
+-    "browser/components/places/tests/browser/browser_sort_in_library.js": 2771, 
+-    "browser/components/places/tests/browser/browser_views_liveupdate.js": 4735, 
+-    "browser/components/preferences/in-content-new/tests/browser_advanced_siteData.js": 5809, 
+-    "browser/components/preferences/in-content-new/tests/browser_advanced_update.js": 4994, 
+-    "browser/components/preferences/in-content-new/tests/browser_basic_rebuild_fonts_test.js": 3402, 
+-    "browser/components/preferences/in-content-new/tests/browser_bug1020245_openPreferences_to_paneContent.js": 8840, 
+-    "browser/components/preferences/in-content-new/tests/browser_bug1184989_prevent_scrolling_when_preferences_flipped.js": 3776, 
+-    "browser/components/preferences/in-content-new/tests/browser_bug731866.js": 4124, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_currentWindow.js": 7729, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_devtools_inspectedWindow.js": 10844, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_devtools_inspectedWindow_eval_bindings.js": 8837, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_devtools_inspectedWindow_reload.js": 13835, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_devtools_network.js": 5394, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_devtools_page.js": 3349, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_devtools_panel.js": 9720, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_devtools_panels_elements.js": 5024, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_find.js": 2994, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_getViews.js": 8901, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_incognito_popup.js": 4742, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_incognito_views.js": 3598, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_menus.js": 10522, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_openPanel.js": 4603, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_optionsPage_browser_style.js": 10602, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_optionsPage_privileges.js": 4005, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_pageAction_context.js": 7085, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_pageAction_contextMenu.js": 4486, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_pageAction_popup.js": 5356, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_pageAction_popup_resize.js": 2630, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_pageAction_telemetry.js": 2840, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_pageAction_title.js": 9527, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_popup_api_injection.js": 3204, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_popup_background.js": 3020, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_popup_corners.js": 2604, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_popup_shutdown.js": 3636, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_runtime_openOptionsPage.js": 18230, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_runtime_openOptionsPage_uninstall.js": 4107, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_runtime_setUninstallURL.js": 3096, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_sessions_forgetClosedTab.js": 2546, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_sessions_forgetClosedWindow.js": 5566, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_sessions_getRecentlyClosed.js": 12322, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_sessions_getRecentlyClosed_private.js": 4097, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_sessions_getRecentlyClosed_tabs.js": 4509, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_sessions_restore.js": 10589, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_settings_overrides_default_search.js": 10290, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_settings_overrides_search.js": 2468, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_sidebarAction.js": 9241, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_sidebarAction_browser_style.js": 7655, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_sidebarAction_context.js": 9661, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_sidebarAction_contextMenu.js": 6559, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_sidebarAction_windows.js": 3734, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_tabs_audio.js": 2805, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_tabs_captureVisibleTab.js": 7496, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_tabs_cookieStoreId.js": 10292, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_tabs_create.js": 15424, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_tabs_detectLanguage.js": 3067, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_tabs_duplicate.js": 6026, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_tabs_events.js": 9368, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_tabs_executeScript.js": 3629, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_tabs_executeScript_bad.js": 15936, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_tabs_executeScript_good.js": 10550, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_tabs_executeScript_runAt.js": 2799, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_tabs_insertCSS.js": 3027, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_tabs_move.js": 3091, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_tabs_move_array.js": 4678, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_tabs_move_window.js": 6740, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_tabs_move_window_multiple.js": 5458, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_tabs_move_window_pinned.js": 4323, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_tabs_onHighlighted.js": 8963, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_tabs_onUpdated.js": 17975, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_tabs_opener.js": 3758, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_tabs_printPreview.js": 3913, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_tabs_query.js": 8001, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_tabs_removeCSS.js": 3590, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_tabs_sendMessage.js": 3828, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_tabs_update_url.js": 5272, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_tabs_zoom.js": 4443, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_themes_icons.js": 2642, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_url_overrides_home.js": 3017, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_webNavigation_onCreatedNavigationTarget.js": 9813, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_webNavigation_onCreatedNavigationTarget_contextmenu.js": 7164, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_webNavigation_onCreatedNavigationTarget_window_open.js": 7425, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_webNavigation_urlbar_transitions.js": 6776, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_webRequest.js": 4816, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_windows.js": 5971, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_windows_create.js": 11223, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_windows_create_tabId.js": 10058, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_windows_create_url.js": 8840, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_windows_events.js": 3597, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_windows_size.js": 2578, 
++    "browser/components/extensions/test/browser/test-oop-extensions/browser_ext_windows_update.js": 6128, 
++    "browser/components/migration/tests/browser/browser_undo_notification.js": 7753, 
++    "browser/components/migration/tests/browser/browser_undo_notification_wording.js": 4915, 
++    "browser/components/newtab/tests/browser/browser_newtab_overrides.js": 7590, 
++    "browser/components/newtab/tests/browser/browser_newtabwebchannel.js": 5674, 
++    "browser/components/originattributes/test/browser/browser_blobURLIsolation.js": 10180, 
++    "browser/components/originattributes/test/browser/browser_broadcastChannel.js": 9190, 
++    "browser/components/originattributes/test/browser/browser_cache.js": 18020, 
++    "browser/components/originattributes/test/browser/browser_cacheAPI.js": 11331, 
++    "browser/components/originattributes/test/browser/browser_clientAuth.js": 12176, 
++    "browser/components/originattributes/test/browser/browser_cookieIsolation.js": 8025, 
++    "browser/components/originattributes/test/browser/browser_favicon_firstParty.js": 8326, 
++    "browser/components/originattributes/test/browser/browser_favicon_userContextId.js": 5772, 
++    "browser/components/originattributes/test/browser/browser_firstPartyIsolation.js": 12615, 
++    "browser/components/originattributes/test/browser/browser_firstPartyIsolation_aboutPages.js": 8812, 
++    "browser/components/originattributes/test/browser/browser_firstPartyIsolation_about_newtab.js": 2673, 
++    "browser/components/originattributes/test/browser/browser_firstPartyIsolation_js_uri.js": 2979, 
++    "browser/components/originattributes/test/browser/browser_httpauth.js": 19740, 
++    "browser/components/originattributes/test/browser/browser_imageCacheIsolation.js": 15798, 
++    "browser/components/originattributes/test/browser/browser_localStorageIsolation.js": 7320, 
++    "browser/components/originattributes/test/browser/browser_permissions.js": 19381, 
++    "browser/components/originattributes/test/browser/browser_sanitize.js": 20163, 
++    "browser/components/originattributes/test/browser/browser_sharedworker.js": 8372, 
++    "browser/components/originattributes/test/browser/browser_windowOpenerRestriction.js": 5013, 
++    "browser/components/places/tests/browser/browser_475045.js": 7878, 
++    "browser/components/places/tests/browser/browser_addBookmarkForFrame.js": 4018, 
++    "browser/components/places/tests/browser/browser_bookmarkProperties_addKeywordForThisSearch.js": 4678, 
++    "browser/components/places/tests/browser/browser_bookmarksProperties.js": 4433, 
++    "browser/components/places/tests/browser/browser_library_commands.js": 3936, 
++    "browser/components/places/tests/browser/browser_library_middleclick.js": 2810, 
++    "browser/components/places/tests/browser/browser_library_views_liveupdate.js": 6440, 
++    "browser/components/places/tests/browser/browser_views_iconsupdate.js": 7208, 
++    "browser/components/places/tests/browser/browser_views_liveupdate.js": 2717, 
++    "browser/components/preferences/in-content-new/tests/browser_advanced_update.js": 7946, 
++    "browser/components/preferences/in-content-new/tests/browser_applications_selection.js": 3248, 
++    "browser/components/preferences/in-content-new/tests/browser_basic_rebuild_fonts_test.js": 4307, 
++    "browser/components/preferences/in-content-new/tests/browser_bug1018066_resetScrollPosition.js": 2630, 
++    "browser/components/preferences/in-content-new/tests/browser_bug1020245_openPreferences_to_paneContent.js": 11659, 
++    "browser/components/preferences/in-content-new/tests/browser_bug1184989_prevent_scrolling_when_preferences_flipped.js": 3149, 
++    "browser/components/preferences/in-content-new/tests/browser_bug410900.js": 2599, 
++    "browser/components/preferences/in-content-new/tests/browser_bug731866.js": 2568, 
++    "browser/components/preferences/in-content-new/tests/browser_checkspelling.js": 2536, 
++    "browser/components/preferences/in-content-new/tests/browser_connection.js": 2703, 
+     "browser/components/preferences/in-content-new/tests/browser_connection_bug388287.js": 5029, 
++    "browser/components/preferences/in-content-new/tests/browser_cookies_dialog.js": 3184, 
+     "browser/components/preferences/in-content-new/tests/browser_cookies_exceptions.js": 32201, 
+-    "browser/components/preferences/in-content-new/tests/browser_defaultbrowser_alwayscheck.js": 3689, 
+-    "browser/components/preferences/in-content-new/tests/browser_homepages_filter_aboutpreferences.js": 3358, 
+-    "browser/components/preferences/in-content-new/tests/browser_permissions_urlFieldHidden.js": 4320, 
+-    "browser/components/preferences/in-content-new/tests/browser_privacypane_1.js": 13262, 
+-    "browser/components/preferences/in-content-new/tests/browser_privacypane_3.js": 12449, 
+-    "browser/components/preferences/in-content-new/tests/browser_privacypane_4.js": 21002, 
+-    "browser/components/preferences/in-content-new/tests/browser_privacypane_5.js": 12584, 
+-    "browser/components/preferences/in-content-new/tests/browser_privacypane_8.js": 12359, 
++    "browser/components/preferences/in-content-new/tests/browser_defaultbrowser_alwayscheck.js": 4635, 
++    "browser/components/preferences/in-content-new/tests/browser_homepages_filter_aboutpreferences.js": 3838, 
++    "browser/components/preferences/in-content-new/tests/browser_layersacceleration.js": 2508, 
++    "browser/components/preferences/in-content-new/tests/browser_password_management.js": 2994, 
++    "browser/components/preferences/in-content-new/tests/browser_performance.js": 13789, 
++    "browser/components/preferences/in-content-new/tests/browser_performance_e10srollout.js": 8605, 
++    "browser/components/preferences/in-content-new/tests/browser_permissions_dialog.js": 6297, 
++    "browser/components/preferences/in-content-new/tests/browser_permissions_urlFieldHidden.js": 2995, 
++    "browser/components/preferences/in-content-new/tests/browser_privacypane_1.js": 16697, 
++    "browser/components/preferences/in-content-new/tests/browser_privacypane_3.js": 16474, 
++    "browser/components/preferences/in-content-new/tests/browser_privacypane_4.js": 27807, 
++    "browser/components/preferences/in-content-new/tests/browser_privacypane_5.js": 16543, 
++    "browser/components/preferences/in-content-new/tests/browser_privacypane_8.js": 16470, 
++    "browser/components/preferences/in-content-new/tests/browser_proxy_backup.js": 2928, 
+     "browser/components/preferences/in-content-new/tests/browser_sanitizeOnShutdown_prefLocked.js": 4144, 
+-    "browser/components/preferences/in-content-new/tests/browser_searchsuggestions.js": 3473, 
+-    "browser/components/preferences/in-content-new/tests/browser_security.js": 16398, 
++    "browser/components/preferences/in-content-new/tests/browser_search_subdialogs_within_preferences_1.js": 17206, 
++    "browser/components/preferences/in-content-new/tests/browser_search_subdialogs_within_preferences_2.js": 16050, 
++    "browser/components/preferences/in-content-new/tests/browser_search_subdialogs_within_preferences_3.js": 16890, 
++    "browser/components/preferences/in-content-new/tests/browser_search_subdialogs_within_preferences_4.js": 16537, 
++    "browser/components/preferences/in-content-new/tests/browser_search_subdialogs_within_preferences_5.js": 23560, 
++    "browser/components/preferences/in-content-new/tests/browser_search_subdialogs_within_preferences_6.js": 15572, 
++    "browser/components/preferences/in-content-new/tests/browser_search_subdialogs_within_preferences_7.js": 25603, 
++    "browser/components/preferences/in-content-new/tests/browser_search_subdialogs_within_preferences_8.js": 24165, 
++    "browser/components/preferences/in-content-new/tests/browser_search_within_preferences.js": 24358, 
++    "browser/components/preferences/in-content-new/tests/browser_search_within_preferences_1.js": 52187, 
++    "browser/components/preferences/in-content-new/tests/browser_search_within_preferences_2.js": 8412, 
++    "browser/components/preferences/in-content-new/tests/browser_search_within_preferences_command.js": 7313, 
++    "browser/components/preferences/in-content-new/tests/browser_searchsuggestions.js": 4066, 
++    "browser/components/preferences/in-content-new/tests/browser_security-1.js": 6323, 
++    "browser/components/preferences/in-content-new/tests/browser_security-2.js": 9356, 
++    "browser/components/preferences/in-content-new/tests/browser_security.js": 19427, 
++    "browser/components/preferences/in-content-new/tests/browser_siteData.js": 17980, 
++    "browser/components/preferences/in-content-new/tests/browser_siteData2.js": 16383, 
++    "browser/components/preferences/in-content-new/tests/browser_site_login_exceptions.js": 3228, 
+     "browser/components/preferences/in-content-new/tests/browser_subdialogs.js": 9718, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_DownloadLastDirWithCPS.js": 6766, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_about.js": 5869, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_aboutHomeButtonAfterWindowClose.js": 4184, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_aboutSessionRestore.js": 4488, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_blobUrl.js": 4308, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_cache.js": 3564, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_certexceptionsui.js": 2834, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_concurrent.js": 8634, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_context_and_chromeFlags.js": 3429, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_crh.js": 4396, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_downloadLastDir.js": 5198, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_downloadLastDir_c.js": 5365, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_downloadLastDir_toggle.js": 10849, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_favicon.js": 10071, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_geoprompt.js": 6547, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_lastpbcontextexited.js": 6603, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_localStorage.js": 3786, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_localStorage_before_after.js": 5353, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_newtab_from_popup.js": 5469, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_noSessionRestoreMenuOption.js": 3943, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_nonbrowser.js": 2977, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_opendir.js": 3419, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_placesTitleNoUpdate.js": 3645, 
++    "browser/components/preferences/in-content/tests/browser_advanced_update.js": 5836, 
++    "browser/components/preferences/in-content/tests/browser_basic_rebuild_fonts_test.js": 2578, 
++    "browser/components/preferences/in-content/tests/browser_bug1020245_openPreferences_to_paneContent.js": 6134, 
++    "browser/components/preferences/in-content/tests/browser_bug1184989_prevent_scrolling_when_preferences_flipped.js": 2822, 
++    "browser/components/preferences/in-content/tests/browser_bug731866.js": 2580, 
++    "browser/components/preferences/in-content/tests/browser_connection_bug388287.js": 4074, 
++    "browser/components/preferences/in-content/tests/browser_cookies_exceptions.js": 21992, 
++    "browser/components/preferences/in-content/tests/browser_defaultbrowser_alwayscheck.js": 2650, 
++    "browser/components/preferences/in-content/tests/browser_homepages_filter_aboutpreferences.js": 2711, 
++    "browser/components/preferences/in-content/tests/browser_performance.js": 8337, 
++    "browser/components/preferences/in-content/tests/browser_performance_e10srollout.js": 6055, 
++    "browser/components/preferences/in-content/tests/browser_permissions_dialog.js": 3857, 
++    "browser/components/preferences/in-content/tests/browser_permissions_urlFieldHidden.js": 3673, 
++    "browser/components/preferences/in-content/tests/browser_privacypane_1.js": 11424, 
++    "browser/components/preferences/in-content/tests/browser_privacypane_3.js": 9253, 
++    "browser/components/preferences/in-content/tests/browser_privacypane_4.js": 15706, 
++    "browser/components/preferences/in-content/tests/browser_privacypane_5.js": 9661, 
++    "browser/components/preferences/in-content/tests/browser_privacypane_8.js": 9127, 
++    "browser/components/preferences/in-content/tests/browser_sanitizeOnShutdown_prefLocked.js": 2922, 
++    "browser/components/preferences/in-content/tests/browser_search_subdialogs_within_preferences_1.js": 10721, 
++    "browser/components/preferences/in-content/tests/browser_search_subdialogs_within_preferences_2.js": 10254, 
++    "browser/components/preferences/in-content/tests/browser_search_subdialogs_within_preferences_3.js": 10535, 
++    "browser/components/preferences/in-content/tests/browser_search_subdialogs_within_preferences_4.js": 11050, 
++    "browser/components/preferences/in-content/tests/browser_search_subdialogs_within_preferences_5.js": 14785, 
++    "browser/components/preferences/in-content/tests/browser_search_subdialogs_within_preferences_6.js": 9357, 
++    "browser/components/preferences/in-content/tests/browser_search_subdialogs_within_preferences_7.js": 15989, 
++    "browser/components/preferences/in-content/tests/browser_search_subdialogs_within_preferences_8.js": 15407, 
++    "browser/components/preferences/in-content/tests/browser_search_within_preferences_1.js": 32965, 
++    "browser/components/preferences/in-content/tests/browser_search_within_preferences_2.js": 5618, 
++    "browser/components/preferences/in-content/tests/browser_search_within_preferences_command.js": 3962, 
++    "browser/components/preferences/in-content/tests/browser_searchsuggestions.js": 2805, 
++    "browser/components/preferences/in-content/tests/browser_security-1.js": 3586, 
++    "browser/components/preferences/in-content/tests/browser_security-2.js": 5460, 
++    "browser/components/preferences/in-content/tests/browser_security.js": 7215, 
++    "browser/components/preferences/in-content/tests/browser_siteData.js": 17919, 
++    "browser/components/preferences/in-content/tests/browser_siteData2.js": 10010, 
++    "browser/components/preferences/in-content/tests/browser_subdialogs.js": 7837, 
++    "browser/components/privatebrowsing/test/browser/browser_oa_private_browsing_window.js": 4956, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_DownloadLastDirWithCPS.js": 4549, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_about.js": 4341, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_aboutHomeButtonAfterWindowClose.js": 2987, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_aboutSessionRestore.js": 3006, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_blobUrl.js": 3000, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_cache.js": 2543, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_concurrent.js": 7714, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_context_and_chromeFlags.js": 2756, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_crh.js": 3636, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_downloadLastDir.js": 3934, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_downloadLastDir_c.js": 4121, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_downloadLastDir_toggle.js": 7709, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_favicon.js": 7468, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_geoprompt.js": 5573, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_lastpbcontextexited.js": 5863, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_localStorage.js": 3551, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_localStorage_before_after.js": 4054, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_newtab_from_popup.js": 4333, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_noSessionRestoreMenuOption.js": 2846, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_placesTitleNoUpdate.js": 4157, 
+     "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_placestitle.js": 7026, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_popupblocker.js": 6747, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_protocolhandler.js": 5606, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_sidebar.js": 14661, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_ui.js": 3892, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_urlbarfocus.js": 3978, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_windowtitle.js": 33528, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_zoom.js": 4290, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_popupblocker.js": 5411, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_protocolhandler.js": 4655, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_sidebar.js": 11233, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_ui.js": 3146, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_urlbarfocus.js": 3024, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_windowtitle.js": 23845, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_zoom.js": 3610, 
+     "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_zoomrestore.js": 3805, 
+-    "browser/components/search/test/browser_426329.js": 9526, 
+-    "browser/components/search/test/browser_aboutSearchReset.js": 5717, 
+-    "browser/components/search/test/browser_amazon_behavior.js": 2653, 
+-    "browser/components/search/test/browser_contextmenu.js": 3521, 
+-    "browser/components/search/test/browser_google_behavior.js": 2646, 
+-    "browser/components/search/test/browser_private_search_perwindowpb.js": 7022, 
+-    "browser/components/search/test/browser_searchbar_keyboard_navigation.js": 2877, 
+-    "browser/components/search/test/browser_webapi.js": 7355, 
+-    "browser/components/search/test/browser_yahoo_behavior.js": 2951, 
+-    "browser/components/sessionstore/test/browser_339445.js": 2878, 
+-    "browser/components/sessionstore/test/browser_354894_perwindowpb.js": 38482, 
+-    "browser/components/sessionstore/test/browser_393716.js": 3037, 
+-    "browser/components/sessionstore/test/browser_394759_behavior.js": 23801, 
+-    "browser/components/sessionstore/test/browser_394759_perwindowpb.js": 8814, 
+-    "browser/components/sessionstore/test/browser_423132.js": 2951, 
++    "browser/components/resistfingerprinting/test/browser/browser_bug1369357_site_specific_zoom_level.js": 4835, 
++    "browser/components/resistfingerprinting/test/browser/browser_navigator.js": 3021, 
++    "browser/components/resistfingerprinting/test/browser/browser_roundedWindow_newWindow.js": 4560, 
++    "browser/components/resistfingerprinting/test/browser/browser_roundedWindow_open_max.js": 13232, 
++    "browser/components/resistfingerprinting/test/browser/browser_roundedWindow_open_mid.js": 12919, 
++    "browser/components/resistfingerprinting/test/browser/browser_roundedWindow_open_min.js": 10400, 
++    "browser/components/resistfingerprinting/test/browser/browser_roundedWindow_windowSetting_max.js": 14424, 
++    "browser/components/resistfingerprinting/test/browser/browser_roundedWindow_windowSetting_mid.js": 14656, 
++    "browser/components/resistfingerprinting/test/browser/browser_roundedWindow_windowSetting_min.js": 11530, 
++    "browser/components/safebrowsing/content/test/browser_bug400731.js": 2747, 
++    "browser/components/search/test/browser_426329.js": 10676, 
++    "browser/components/search/test/browser_aboutSearchReset.js": 5266, 
++    "browser/components/search/test/browser_private_search_perwindowpb.js": 5428, 
++    "browser/components/search/test/browser_searchEngine_behaviors.js": 8928, 
++    "browser/components/search/test/browser_searchbar_openpopup.js": 2969, 
++    "browser/components/search/test/browser_webapi.js": 5646, 
++    "browser/components/sessionstore/test/browser_1234021.js": 2460, 
++    "browser/components/sessionstore/test/browser_1284886_suspend_tab.js": 3847, 
++    "browser/components/sessionstore/test/browser_354894_perwindowpb.js": 24041, 
++    "browser/components/sessionstore/test/browser_394759_behavior.js": 14771, 
++    "browser/components/sessionstore/test/browser_394759_perwindowpb.js": 5348, 
++    "browser/components/sessionstore/test/browser_464199.js": 2517, 
+     "browser/components/sessionstore/test/browser_477657.js": 2742, 
+-    "browser/components/sessionstore/test/browser_480893.js": 2844, 
+-    "browser/components/sessionstore/test/browser_490040.js": 8565, 
+-    "browser/components/sessionstore/test/browser_491168.js": 3299, 
+-    "browser/components/sessionstore/test/browser_495495.js": 7224, 
+-    "browser/components/sessionstore/test/browser_500328.js": 2931, 
+-    "browser/components/sessionstore/test/browser_522545.js": 32199, 
+-    "browser/components/sessionstore/test/browser_524745.js": 2799, 
+-    "browser/components/sessionstore/test/browser_586068-apptabs.js": 6714, 
+-    "browser/components/sessionstore/test/browser_586068-apptabs_ondemand.js": 9566, 
+-    "browser/components/sessionstore/test/browser_586068-browser_state_interrupted.js": 14276, 
+-    "browser/components/sessionstore/test/browser_586068-cascade.js": 8020, 
+-    "browser/components/sessionstore/test/browser_586068-multi_window.js": 10010, 
+-    "browser/components/sessionstore/test/browser_586068-reload.js": 11933, 
+-    "browser/components/sessionstore/test/browser_586068-select.js": 8171, 
+-    "browser/components/sessionstore/test/browser_586068-window_state.js": 12011, 
+-    "browser/components/sessionstore/test/browser_586068-window_state_override.js": 8031, 
+-    "browser/components/sessionstore/test/browser_588426.js": 3153, 
+-    "browser/components/sessionstore/test/browser_590268.js": 15053, 
+-    "browser/components/sessionstore/test/browser_590563.js": 4510, 
+-    "browser/components/sessionstore/test/browser_595601-restore_hidden.js": 18914, 
+-    "browser/components/sessionstore/test/browser_600545.js": 12385, 
++    "browser/components/sessionstore/test/browser_490040.js": 7584, 
++    "browser/components/sessionstore/test/browser_495495.js": 5523, 
++    "browser/components/sessionstore/test/browser_500328.js": 2668, 
++    "browser/components/sessionstore/test/browser_522545.js": 14482, 
++    "browser/components/sessionstore/test/browser_586068-apptabs.js": 3194, 
++    "browser/components/sessionstore/test/browser_586068-browser_state_interrupted.js": 7303, 
++    "browser/components/sessionstore/test/browser_586068-cascade.js": 4269, 
++    "browser/components/sessionstore/test/browser_586068-multi_window.js": 6339, 
++    "browser/components/sessionstore/test/browser_586068-reload.js": 6292, 
++    "browser/components/sessionstore/test/browser_586068-select.js": 5083, 
++    "browser/components/sessionstore/test/browser_586068-window_state.js": 5783, 
++    "browser/components/sessionstore/test/browser_586068-window_state_override.js": 5423, 
++    "browser/components/sessionstore/test/browser_590268.js": 7147, 
++    "browser/components/sessionstore/test/browser_590563.js": 4202, 
++    "browser/components/sessionstore/test/browser_595601-restore_hidden.js": 9914, 
++    "browser/components/sessionstore/test/browser_600545.js": 5952, 
+     "browser/components/sessionstore/test/browser_601955.js": 5227, 
+-    "browser/components/sessionstore/test/browser_607016.js": 3238, 
+-    "browser/components/sessionstore/test/browser_615394-SSWindowState_events.js": 40936, 
+-    "browser/components/sessionstore/test/browser_618151.js": 2796, 
+-    "browser/components/sessionstore/test/browser_625016.js": 3721, 
++    "browser/components/sessionstore/test/browser_607016.js": 2710, 
++    "browser/components/sessionstore/test/browser_615394-SSWindowState_events.js": 33107, 
++    "browser/components/sessionstore/test/browser_615394-SSWindowState_events_setBrowserState.js": 3702, 
++    "browser/components/sessionstore/test/browser_615394-SSWindowState_events_undoCloseWindow.js": 8445, 
+     "browser/components/sessionstore/test/browser_635418.js": 4968, 
+-    "browser/components/sessionstore/test/browser_636279.js": 4428, 
+-    "browser/components/sessionstore/test/browser_637020.js": 7404, 
+-    "browser/components/sessionstore/test/browser_644409-scratchpads.js": 5537, 
+-    "browser/components/sessionstore/test/browser_659591.js": 2763, 
+-    "browser/components/sessionstore/test/browser_662743.js": 4945, 
+-    "browser/components/sessionstore/test/browser_701377.js": 5796, 
+-    "browser/components/sessionstore/test/browser_819510_perwindowpb.js": 30564, 
+-    "browser/components/sessionstore/test/browser_911547.js": 2917, 
+-    "browser/components/sessionstore/test/browser_aboutSessionRestore.js": 3512, 
+-    "browser/components/sessionstore/test/browser_async_duplicate_tab.js": 3388, 
+-    "browser/components/sessionstore/test/browser_async_flushes.js": 4768, 
+-    "browser/components/sessionstore/test/browser_async_remove_tab.js": 9518, 
+-    "browser/components/sessionstore/test/browser_async_window_flushing.js": 8162, 
+-    "browser/components/sessionstore/test/browser_background_tab_crash.js": 32355, 
+-    "browser/components/sessionstore/test/browser_backup_recovery.js": 12682, 
+-    "browser/components/sessionstore/test/browser_broadcast.js": 9539, 
+-    "browser/components/sessionstore/test/browser_cleaner.js": 12624, 
+-    "browser/components/sessionstore/test/browser_closed_objects_changed_notifications_tabs.js": 12485, 
+-    "browser/components/sessionstore/test/browser_closed_objects_changed_notifications_windows.js": 19432, 
+-    "browser/components/sessionstore/test/browser_cookies.js": 25064, 
+-    "browser/components/sessionstore/test/browser_crashedTabs.js": 45302, 
+-    "browser/components/sessionstore/test/browser_docshell_uuid_consistency.js": 4298, 
+-    "browser/components/sessionstore/test/browser_dying_cache.js": 4078, 
+-    "browser/components/sessionstore/test/browser_forget_async_closings.js": 8652, 
+-    "browser/components/sessionstore/test/browser_formdata.js": 9252, 
+-    "browser/components/sessionstore/test/browser_formdata_cc.js": 28234, 
+-    "browser/components/sessionstore/test/browser_formdata_format.js": 14684, 
+-    "browser/components/sessionstore/test/browser_formdata_xpath.js": 3662, 
+-    "browser/components/sessionstore/test/browser_frame_history.js": 8320, 
+-    "browser/components/sessionstore/test/browser_frametree.js": 4303, 
+-    "browser/components/sessionstore/test/browser_grouped_session_store.js": 8304, 
+-    "browser/components/sessionstore/test/browser_history_persist.js": 3533, 
+-    "browser/components/sessionstore/test/browser_merge_closed_tabs.js": 3484, 
+-    "browser/components/sessionstore/test/browser_newtab_userTypedValue.js": 33336, 
+-    "browser/components/sessionstore/test/browser_pageStyle.js": 9837, 
+-    "browser/components/sessionstore/test/browser_privatetabs.js": 9934, 
+-    "browser/components/sessionstore/test/browser_remoteness_flip_on_restore.js": 31140, 
+-    "browser/components/sessionstore/test/browser_replace_load.js": 3307, 
+-    "browser/components/sessionstore/test/browser_restore_cookies_noOriginAttributes.js": 4540, 
+-    "browser/components/sessionstore/test/browser_revive_crashed_bg_tabs.js": 5862, 
+-    "browser/components/sessionstore/test/browser_scrollPositions.js": 22895, 
+-    "browser/components/sessionstore/test/browser_scrollPositionsReaderMode.js": 9633, 
+-    "browser/components/sessionstore/test/browser_sessionHistory.js": 10252, 
+-    "browser/components/sessionstore/test/browser_sessionStorage.js": 8711, 
+-    "browser/components/sessionstore/test/browser_sessionStoreContainer.js": 15636, 
+-    "browser/components/sessionstore/test/browser_swapDocShells.js": 4691, 
+-    "browser/components/sessionstore/test/browser_switch_remoteness.js": 8180, 
+-    "browser/components/sessionstore/test/browser_undoCloseById.js": 6570, 
+-    "browser/components/sessionstore/test/browser_unrestored_crashedTabs.js": 5777, 
+-    "browser/components/sessionstore/test/browser_windowRestore_perwindowpb.js": 3309, 
+-    "browser/components/sessionstore/test/browser_windowStateContainer.js": 27550, 
+-    "browser/components/syncedtabs/test/browser/browser_sidebar_syncedtabslist.js": 3056, 
+-    "browser/components/tests/browser/browser_bug538331.js": 2826, 
+-    "browser/components/translation/test/browser_translation_exceptions.js": 5142, 
+-    "browser/components/translation/test/browser_translation_telemetry.js": 14685, 
++    "browser/components/sessionstore/test/browser_636279.js": 2528, 
++    "browser/components/sessionstore/test/browser_637020.js": 3373, 
++    "browser/components/sessionstore/test/browser_644409-scratchpads.js": 4714, 
++    "browser/components/sessionstore/test/browser_662743.js": 3701, 
++    "browser/components/sessionstore/test/browser_819510_perwindowpb.js": 16619, 
++    "browser/components/sessionstore/test/browser_906076_lazy_tabs.js": 17372, 
++    "browser/components/sessionstore/test/browser_async_window_flushing.js": 4627, 
++    "browser/components/sessionstore/test/browser_background_tab_crash.js": 19998, 
++    "browser/components/sessionstore/test/browser_backup_recovery.js": 10068, 
++    "browser/components/sessionstore/test/browser_broadcast.js": 5404, 
++    "browser/components/sessionstore/test/browser_cleaner.js": 8911, 
++    "browser/components/sessionstore/test/browser_closed_objects_changed_notifications_tabs.js": 7367, 
++    "browser/components/sessionstore/test/browser_closed_objects_changed_notifications_windows.js": 11843, 
++    "browser/components/sessionstore/test/browser_cookies_legacy.js": 3026, 
++    "browser/components/sessionstore/test/browser_crashedTabs.js": 30376, 
++    "browser/components/sessionstore/test/browser_forget_async_closings.js": 4981, 
++    "browser/components/sessionstore/test/browser_formdata.js": 5958, 
++    "browser/components/sessionstore/test/browser_formdata_cc.js": 20578, 
++    "browser/components/sessionstore/test/browser_formdata_format.js": 9293, 
++    "browser/components/sessionstore/test/browser_frame_history.js": 4618, 
++    "browser/components/sessionstore/test/browser_grouped_session_store.js": 4029, 
++    "browser/components/sessionstore/test/browser_newtab_userTypedValue.js": 23044, 
++    "browser/components/sessionstore/test/browser_not_collect_when_idle.js": 7388, 
++    "browser/components/sessionstore/test/browser_pageStyle.js": 7533, 
++    "browser/components/sessionstore/test/browser_privatetabs.js": 5141, 
++    "browser/components/sessionstore/test/browser_remoteness_flip_on_restore.js": 15908, 
++    "browser/components/sessionstore/test/browser_restore_reversed_z_order.js": 8154, 
++    "browser/components/sessionstore/test/browser_revive_crashed_bg_tabs.js": 3195, 
++    "browser/components/sessionstore/test/browser_scrollPositions.js": 19220, 
++    "browser/components/sessionstore/test/browser_scrollPositionsReaderMode.js": 7160, 
++    "browser/components/sessionstore/test/browser_sessionHistory.js": 6732, 
++    "browser/components/sessionstore/test/browser_sessionStorage.js": 6083, 
++    "browser/components/sessionstore/test/browser_sessionStoreContainer.js": 8605, 
++    "browser/components/sessionstore/test/browser_speculative_connect.js": 10790, 
++    "browser/components/sessionstore/test/browser_swapDocShells.js": 2660, 
++    "browser/components/sessionstore/test/browser_switch_remoteness.js": 4839, 
++    "browser/components/sessionstore/test/browser_tab_label_during_restore.js": 4622, 
++    "browser/components/sessionstore/test/browser_undoCloseById.js": 3554, 
++    "browser/components/sessionstore/test/browser_unrestored_crashedTabs.js": 4152, 
++    "browser/components/sessionstore/test/browser_windowStateContainer.js": 11273, 
++    "browser/components/syncedtabs/test/browser/browser_sidebar_syncedtabslist.js": 2711, 
++    "browser/components/tests/browser/browser_bug538331.js": 3179, 
++    "browser/components/translation/test/browser_translation_bing.js": 4471, 
++    "browser/components/translation/test/browser_translation_exceptions.js": 3842, 
++    "browser/components/translation/test/browser_translation_telemetry.js": 11224, 
+     "browser/components/translation/test/browser_translation_yandex.js": 3797, 
+-    "browser/extensions/pdfjs/test/browser_pdfjs_main.js": 6849, 
+-    "browser/extensions/pdfjs/test/browser_pdfjs_navigation.js": 9323, 
+-    "browser/extensions/pdfjs/test/browser_pdfjs_views.js": 5701, 
+-    "browser/extensions/pdfjs/test/browser_pdfjs_zoom.js": 10608, 
+-    "browser/extensions/shield-recipe-client/test/browser_Heartbeat.js": 8542, 
+-    "browser/modules/test/browser_CaptivePortalWatcher.js": 17780, 
++    "browser/extensions/formautofill/test/browser/browser_autocomplete_footer.js": 17244, 
++    "browser/extensions/formautofill/test/browser/browser_autocomplete_marked_back_forward.js": 6893, 
++    "browser/extensions/formautofill/test/browser/browser_autocomplete_marked_detached_tab.js": 4885, 
++    "browser/extensions/formautofill/test/browser/browser_dropdown_layout.js": 8435, 
++    "browser/extensions/formautofill/test/browser/browser_first_time_use_doorhanger.js": 6568, 
++    "browser/extensions/formautofill/test/browser/browser_insecure_form.js": 18831, 
++    "browser/extensions/formautofill/test/browser/browser_manageCreditCardsDialog.js": 2481, 
++    "browser/extensions/formautofill/test/browser/browser_privacyPreferences.js": 5291, 
++    "browser/extensions/formautofill/test/browser/browser_submission_in_private_mode.js": 3202, 
++    "browser/extensions/formautofill/test/browser/browser_update_doorhanger.js": 22139, 
++    "browser/extensions/pdfjs/test/browser_pdfjs_main.js": 6022, 
++    "browser/extensions/pdfjs/test/browser_pdfjs_navigation.js": 6302, 
++    "browser/extensions/pdfjs/test/browser_pdfjs_views.js": 4247, 
++    "browser/extensions/pdfjs/test/browser_pdfjs_zoom.js": 6099, 
++    "browser/modules/test/browser/browser_ContentSearch.js": 5429, 
++    "browser/modules/test/browser/browser_PageActions.js": 8479, 
++    "browser/modules/test/browser/browser_PermissionUI.js": 7457, 
++    "browser/modules/test/browser/browser_PermissionUI_prompts.js": 3852, 
++    "browser/modules/test/browser/browser_SitePermissions_combinations.js": 3200, 
++    "browser/modules/test/browser/browser_SitePermissions_tab_urls.js": 15340, 
++    "browser/modules/test/browser/browser_UnsubmittedCrashHandler.js": 3056, 
++    "browser/modules/test/browser/browser_UsageTelemetry.js": 17651, 
++    "browser/modules/test/browser/browser_UsageTelemetry_content.js": 3815, 
++    "browser/modules/test/browser/browser_UsageTelemetry_content_aboutHome.js": 2484, 
++    "browser/modules/test/browser/browser_UsageTelemetry_private_and_restore.js": 2818, 
++    "browser/modules/test/browser/browser_UsageTelemetry_searchbar.js": 8194, 
++    "browser/modules/test/browser/browser_UsageTelemetry_urlbar.js": 8847, 
+     "browser/modules/test/browser_ContentSearch.js": 6354, 
+-    "browser/modules/test/browser_NetworkPrioritizer.js": 10398, 
+-    "browser/modules/test/browser_PermissionUI.js": 6192, 
+-    "browser/modules/test/browser_UnsubmittedCrashHandler.js": 3787, 
+-    "browser/modules/test/browser_UsageTelemetry.js": 16257, 
+-    "browser/modules/test/browser_UsageTelemetry_content.js": 4343, 
+-    "browser/modules/test/browser_UsageTelemetry_content_aboutHome.js": 2857, 
+-    "browser/modules/test/browser_UsageTelemetry_private_and_restore.js": 3264, 
+-    "browser/modules/test/browser_UsageTelemetry_searchbar.js": 5439, 
+-    "browser/modules/test/browser_UsageTelemetry_urlbar.js": 8094, 
+-    "docshell/test/browser/browser_bug1309900_crossProcessHistoryNavigation.js": 3678, 
+-    "docshell/test/browser/browser_bug388121-2.js": 3125, 
+-    "docshell/test/browser/browser_bug422543.js": 3630, 
+-    "docshell/test/browser/browser_bug852909.js": 2710, 
+-    "docshell/test/browser/browser_bug92473.js": 3676, 
+-    "docshell/test/browser/browser_grouped_shistory_bfcache_cleaning.js": 3003, 
+-    "docshell/test/browser/browser_onbeforeunload_navigation.js": 6741, 
++    "browser/modules/test/browser_NetworkPrioritizer.js": 7917, 
++    "browser/modules/test/browser_PermissionUI.js": 5119, 
++    "browser/modules/test/browser_UnsubmittedCrashHandler.js": 2991, 
++    "browser/modules/test/browser_UsageTelemetry.js": 12884, 
++    "browser/modules/test/browser_UsageTelemetry_content.js": 3978, 
++    "browser/modules/test/browser_UsageTelemetry_private_and_restore.js": 2645, 
++    "browser/modules/test/browser_UsageTelemetry_searchbar.js": 4426, 
++    "browser/modules/test/browser_UsageTelemetry_urlbar.js": 6733, 
++    "caps/tests/mochitest/browser_checkloaduri.js": 3104, 
++    "docshell/test/browser/browser_bug1309900_crossProcessHistoryNavigation.js": 4212, 
++    "docshell/test/browser/browser_bug1347823.js": 5533, 
++    "docshell/test/browser/browser_bug388121-2.js": 2526, 
++    "docshell/test/browser/browser_bug422543.js": 2572, 
++    "docshell/test/browser/browser_bug92473.js": 2588, 
++    "docshell/test/browser/browser_click_link_within_view_source.js": 2966, 
++    "docshell/test/browser/browser_onbeforeunload_navigation.js": 4273, 
+     "docshell/test/browser/browser_timelineMarkers-03.js": 6428, 
+-    "docshell/test/browser/browser_uriFixupIntegration.js": 2851, 
+-    "docshell/test/navigation/browser_bug343515.js": 4657, 
+-    "dom/base/test/browser_bug1058164.js": 4112, 
+-    "dom/base/test/browser_bug1307747.js": 3267, 
+-    "dom/base/test/browser_bug593387.js": 2717, 
+-    "dom/base/test/browser_messagemanager_loadprocessscript.js": 3636, 
+-    "dom/base/test/browser_use_counters.js": 30338, 
++    "docshell/test/navigation/browser_bug343515.js": 5954, 
++    "dom/base/test/browser_aboutnewtab_process_selection.js": 4779, 
++    "dom/base/test/browser_blocking_image.js": 4373, 
++    "dom/base/test/browser_bug1303838.js": 21384, 
++    "dom/base/test/browser_bug1307747.js": 2663, 
++    "dom/base/test/browser_force_process_selector.js": 9173, 
++    "dom/base/test/browser_inputStream_structuredClone.js": 2963, 
++    "dom/base/test/browser_messagemanager_loadprocessscript.js": 4592, 
++    "dom/base/test/browser_timeout_throttling_with_audio_playback.js": 5387, 
++    "dom/base/test/browser_use_counters.js": 32238, 
+     "dom/broadcastchannel/tests/browser_private_browsing.js": 5734, 
+-    "dom/html/test/browser_bug1108547.js": 17434, 
+-    "dom/html/test/browser_fullscreen-contextmenu-esc.js": 2742, 
++    "dom/cache/test/mochitest/browser_cache_pb_window.js": 4600, 
++    "dom/file/ipc/tests/browser_ipcBlob.js": 12237, 
++    "dom/html/test/browser_bug1108547.js": 13201, 
++    "dom/html/test/browser_form_post_from_file_to_http.js": 2763, 
++    "dom/html/test/browser_fullscreen-contextmenu-esc.js": 2604, 
+     "dom/indexedDB/test/browser_forgetThisSite.js": 5385, 
+-    "dom/indexedDB/test/browser_permissionsPromptDeny.js": 4758, 
+-    "dom/indexedDB/test/browser_permissionsPromptWorker.js": 2634, 
+-    "dom/indexedDB/test/browser_perwindow_privateBrowsing.js": 3983, 
++    "dom/indexedDB/test/browser_permissionsPromptDeny.js": 3612, 
++    "dom/indexedDB/test/browser_perwindow_privateBrowsing.js": 2805, 
+     "dom/ipc/tests/browser_domainPolicy.js": 11725, 
+-    "dom/manifest/test/browser_ManifestFinder_browserHasManifestLink.js": 3021, 
+-    "dom/manifest/test/browser_ManifestObtainer_obtain.js": 23387, 
+-    "dom/media/webaudio/test/browser_bug1181073.js": 4703, 
+-    "dom/notification/test/browser/browser_permission_dismiss.js": 2646, 
+-    "dom/security/test/contentverifier/browser_verify_content_about_newtab.js": 14195, 
+-    "dom/security/test/contentverifier/browser_verify_content_about_newtab2.js": 12159, 
+-    "dom/security/test/csp/browser_test_web_manifest.js": 6022, 
+-    "dom/tests/browser/browser_ConsoleStoragePBTest_perwindowpb.js": 3659, 
+-    "dom/tests/browser/browser_bug396843.js": 6574, 
++    "dom/ipc/tests/browser_remote_navigation_delay_telemetry.js": 3031, 
++    "dom/manifest/test/browser_ManifestFinder_browserHasManifestLink.js": 3947, 
++    "dom/manifest/test/browser_ManifestObtainer_obtain.js": 14873, 
++    "dom/media/webaudio/test/browser_bug1181073.js": 4303, 
++    "dom/notification/test/browser/browser_permission_dismiss.js": 5164, 
++    "dom/plugins/test/mochitest/browser_bug1335475.js": 4625, 
++    "dom/quota/test/browser_globalLimitValidation.js": 13879, 
++    "dom/quota/test/browser_permissionsPromptAllow.js": 4851, 
++    "dom/security/test/contentverifier/browser_verify_content_about_newtab.js": 11393, 
++    "dom/security/test/contentverifier/browser_verify_content_about_newtab2.js": 9718, 
++    "dom/security/test/cors/browser_CORS-console-warnings.js": 35545, 
++    "dom/security/test/csp/browser_manifest-src-override-default-src.js": 3586, 
++    "dom/security/test/csp/browser_test_web_manifest.js": 4283, 
++    "dom/tests/browser/browser_ConsoleStorageAPITests.js": 3370, 
++    "dom/tests/browser/browser_ConsoleStoragePBTest_perwindowpb.js": 2854, 
++    "dom/tests/browser/browser_beforeunload_between_chrome_content.js": 7725, 
++    "dom/tests/browser/browser_bug1316330.js": 3249, 
++    "dom/tests/browser/browser_bug396843.js": 4783, 
+     "dom/tests/browser/browser_focus_steal_from_chrome.js": 25508, 
+-    "dom/tests/browser/browser_largeAllocation.js": 16126, 
+-    "dom/tests/browser/browser_localStorage_privatestorageevent.js": 5312, 
++    "dom/tests/browser/browser_hasbeforeunload.js": 13659, 
++    "dom/tests/browser/browser_largeAllocation.js": 12862, 
++    "dom/tests/browser/browser_largeAllocation_non_win32.js": 32350, 
++    "dom/tests/browser/browser_largeAllocation_win32.js": 4791, 
++    "dom/tests/browser/browser_localStorage_e10s.js": 10213, 
++    "dom/tests/browser/browser_localStorage_privatestorageevent.js": 4170, 
++    "dom/tests/browser/browser_noopener.js": 309746, 
+     "dom/tests/browser/browser_prerendering.js": 2938, 
+-    "dom/tests/browser/browser_test_new_window_from_content.js": 34364, 
+-    "dom/tests/browser/browser_test_toolbars_visibility.js": 9886, 
+-    "dom/workers/test/serviceworkers/browser_download.js": 2983, 
+-    "editor/libeditor/tests/browser_bug527935.js": 2758, 
+-    "embedding/components/windowwatcher/test/browser_new_content_window_chromeflags.js": 4855, 
+-    "embedding/components/windowwatcher/test/browser_new_remote_window_flags.js": 6497, 
+-    "embedding/components/windowwatcher/test/browser_new_sized_window.js": 6044, 
+-    "embedding/test/browser_bug1204626.js": 6998, 
+-    "layout/base/tests/browser_bug617076.js": 3093, 
+-    "layout/base/tests/browser_disableDialogs_onbeforeunload.js": 4037, 
+-    "layout/base/tests/browser_onbeforeunload_only_after_interaction.js": 3215, 
+-    "layout/base/tests/browser_onbeforeunload_only_after_interaction_in_frame.js": 3325, 
+-    "netwerk/cookie/test/browser/browser_originattributes.js": 6540, 
+-    "netwerk/test/browser/browser_child_resource.js": 12411, 
+-    "netwerk/test/browser/browser_post_file.js": 4241, 
++    "dom/tests/browser/browser_test_new_window_from_content.js": 24219, 
++    "dom/tests/browser/browser_test_toolbars_visibility.js": 8780, 
++    "dom/url/tests/browser_download_after_revoke.js": 2548, 
++    "dom/webauthn/tests/browser/browser_webauthn_telemetry.js": 7061, 
++    "dom/workers/test/browser_bug1047663.js": 2922, 
++    "dom/workers/test/serviceworkers/browser_download.js": 3673, 
++    "dom/workers/test/serviceworkers/browser_multie10s_update.js": 6873, 
++    "dom/xhr/tests/browser_xhr_onchange_leak.js": 2714, 
++    "editor/libeditor/tests/browser_bug527935.js": 3595, 
++    "embedding/components/windowwatcher/test/browser_new_content_window_chromeflags.js": 3763, 
++    "embedding/components/windowwatcher/test/browser_new_remote_window_flags.js": 5384, 
++    "embedding/components/windowwatcher/test/browser_new_sized_window.js": 3877, 
++    "embedding/test/browser_bug1204626.js": 5589, 
++    "extensions/cookie/test/browser_permmgr_viewsrc.js": 3361, 
++    "image/test/browser/browser_docshell_type_editor.js": 4708, 
++    "js/xpconnect/tests/browser/browser_dead_object.js": 3269, 
++    "layout/base/tests/browser_bug617076.js": 3640, 
++    "layout/base/tests/browser_disableDialogs_onbeforeunload.js": 3050, 
++    "netwerk/cookie/test/browser/browser_originattributes.js": 7131, 
++    "netwerk/test/browser/browser_about_cache.js": 3544, 
++    "netwerk/test/browser/browser_child_resource.js": 7413, 
++    "netwerk/test/browser/browser_resource_navigation.js": 3132, 
+     "security/manager/ssl/tests/mochitest/browser/browser_bug627234_perwindowpb.js": 5670, 
+-    "security/manager/ssl/tests/mochitest/browser/browser_certViewer.js": 7173, 
+-    "security/manager/ssl/tests/mochitest/browser/browser_clientAuth_connection.js": 3739, 
+-    "security/manager/ssl/tests/mochitest/browser/browser_deleteCert_ui.js": 3388, 
+-    "testing/mochitest/tests/browser/browser_async.js": 10091, 
+-    "testing/mochitest/tests/browser/browser_browserLoaded_content_loaded.js": 3364, 
++    "security/manager/ssl/tests/mochitest/browser/browser_certViewer.js": 3630, 
++    "security/manager/ssl/tests/mochitest/browser/browser_clientAuth_connection.js": 2953, 
++    "security/sandbox/test/browser_content_sandbox_fs.js": 2887, 
++    "services/fxaccounts/tests/browser/browser_device_connected.js": 5400, 
++    "testing/mochitest/tests/browser/browser_BrowserTestUtils.js": 3128, 
+     "toolkit/components/aboutperformance/tests/browser/browser_aboutperformance.js": 8789, 
+-    "toolkit/components/addoncompat/tests/browser/browser_addonShims.js": 9473, 
+-    "toolkit/components/narrate/test/browser_narrate.js": 7247, 
++    "toolkit/components/addoncompat/tests/browser/browser_addonShims.js": 8449, 
++    "toolkit/components/extensions/test/browser/browser_ext_management_themes.js": 3309, 
++    "toolkit/components/narrate/test/browser_narrate.js": 5682, 
+     "toolkit/components/narrate/test/browser_narrate_disable.js": 3577, 
+-    "toolkit/components/narrate/test/browser_narrate_language.js": 2765, 
+-    "toolkit/components/narrate/test/browser_voiceselect.js": 4199, 
+-    "toolkit/components/narrate/test/browser_word_highlight.js": 4310, 
+-    "toolkit/components/passwordmgr/test/browser/browser_capture_doorhanger.js": 36259, 
+-    "toolkit/components/passwordmgr/test/browser/browser_capture_doorhanger_httpsUpgrade.js": 5705, 
+-    "toolkit/components/passwordmgr/test/browser/browser_capture_doorhanger_window_open.js": 11188, 
+-    "toolkit/components/passwordmgr/test/browser/browser_formless_submit_chrome.js": 7185, 
+-    "toolkit/components/passwordmgr/test/browser/browser_hasInsecureLoginForms.js": 3532, 
+-    "toolkit/components/passwordmgr/test/browser/browser_http_autofill.js": 5749, 
+-    "toolkit/components/passwordmgr/test/browser/browser_insecurePasswordWarning.js": 12930, 
+-    "toolkit/components/passwordmgr/test/browser/browser_notifications.js": 5286, 
+-    "toolkit/components/passwordmgr/test/browser/browser_notifications_password.js": 6651, 
+-    "toolkit/components/passwordmgr/test/browser/browser_notifications_username.js": 10188, 
+-    "toolkit/components/passwordmgr/test/browser/browser_passwordmgrdlg.js": 8993, 
+-    "toolkit/components/passwordmgr/test/browser/browser_username_select_dialog.js": 3961, 
++    "toolkit/components/narrate/test/browser_narrate_language.js": 2524, 
++    "toolkit/components/narrate/test/browser_voiceselect.js": 3452, 
++    "toolkit/components/narrate/test/browser_word_highlight.js": 3117, 
++    "toolkit/components/passwordmgr/test/browser/browser_DOMFormHasPassword.js": 2589, 
++    "toolkit/components/passwordmgr/test/browser/browser_capture_doorhanger.js": 17787, 
++    "toolkit/components/passwordmgr/test/browser/browser_capture_doorhanger_httpsUpgrade.js": 4785, 
++    "toolkit/components/passwordmgr/test/browser/browser_capture_doorhanger_window_open.js": 3285, 
++    "toolkit/components/passwordmgr/test/browser/browser_context_menu.js": 16424, 
++    "toolkit/components/passwordmgr/test/browser/browser_context_menu_autocomplete_interaction.js": 3865, 
++    "toolkit/components/passwordmgr/test/browser/browser_formless_submit_chrome.js": 5305, 
++    "toolkit/components/passwordmgr/test/browser/browser_hasInsecureLoginForms.js": 2754, 
++    "toolkit/components/passwordmgr/test/browser/browser_http_autofill.js": 4518, 
++    "toolkit/components/passwordmgr/test/browser/browser_insecurePasswordConsoleWarning.js": 10213, 
++    "toolkit/components/passwordmgr/test/browser/browser_master_password_autocomplete.js": 5605, 
++    "toolkit/components/passwordmgr/test/browser/browser_notifications.js": 4179, 
++    "toolkit/components/passwordmgr/test/browser/browser_notifications_password.js": 5170, 
++    "toolkit/components/passwordmgr/test/browser/browser_notifications_username.js": 8166, 
++    "toolkit/components/passwordmgr/test/browser/browser_passwordmgrdlg.js": 5287, 
++    "toolkit/components/passwordmgr/test/browser/browser_username_select_dialog.js": 2839, 
++    "toolkit/components/payments/test/browser/browser_show_dialog.js": 2434, 
+     "toolkit/components/perfmonitoring/tests/browser/browser_AddonWatcher.js": 12083, 
+     "toolkit/components/perfmonitoring/tests/browser/browser_addonPerformanceAlerts.js": 25867, 
+     "toolkit/components/perfmonitoring/tests/browser/browser_addonPerformanceAlerts_2.js": 6786, 
++    "toolkit/components/perfmonitoring/tests/browser/browser_compartments.js": 3507, 
+     "toolkit/components/perfmonitoring/tests/browser/browser_webpagePerformanceAlerts.js": 32808, 
+-    "toolkit/components/places/tests/browser/browser_bug248970.js": 6832, 
+-    "toolkit/components/places/tests/browser/browser_bug399606.js": 12353, 
+-    "toolkit/components/places/tests/browser/browser_bug461710.js": 4764, 
+-    "toolkit/components/places/tests/browser/browser_favicon_setAndFetchFaviconForPage.js": 6593, 
+-    "toolkit/components/places/tests/browser/browser_favicon_setAndFetchFaviconForPage_failures.js": 11993, 
+-    "toolkit/components/places/tests/browser/browser_visituri_privatebrowsing_perwindowpb.js": 4136, 
+-    "toolkit/components/reader/test/browser_readerMode.js": 6766, 
+-    "toolkit/components/reader/test/browser_readerMode_readingTime.js": 3200, 
+-    "toolkit/components/remotebrowserutils/tests/browser/browser_RemoteWebNavigation.js": 4608, 
+-    "toolkit/components/satchel/test/browser/browser_privbrowsing_perwindowpb.js": 5319, 
+-    "toolkit/components/startup/tests/browser/browser_bug511456.js": 3606, 
++    "toolkit/components/places/tests/browser/browser_bug248970.js": 4917, 
++    "toolkit/components/places/tests/browser/browser_bug399606.js": 18045, 
++    "toolkit/components/places/tests/browser/browser_bug461710.js": 3839, 
++    "toolkit/components/places/tests/browser/browser_favicon_setAndFetchFaviconForPage.js": 5067, 
++    "toolkit/components/places/tests/browser/browser_favicon_setAndFetchFaviconForPage_failures.js": 9343, 
++    "toolkit/components/places/tests/browser/browser_multi_redirect_frecency.js": 2657, 
++    "toolkit/components/places/tests/browser/browser_visituri_privatebrowsing_perwindowpb.js": 2986, 
++    "toolkit/components/printing/tests/browser_page_change_print_original.js": 3251, 
++    "toolkit/components/printing/tests/browser_preview_switch_print_selected.js": 3987, 
++    "toolkit/components/reader/test/browser_bug1124271_readerModePinnedTab.js": 3196, 
++    "toolkit/components/reader/test/browser_readerMode.js": 6234, 
++    "toolkit/components/reader/test/browser_readerMode_readingTime.js": 4461, 
++    "toolkit/components/reader/test/browser_readerMode_with_anchor.js": 2607, 
++    "toolkit/components/remotebrowserutils/tests/browser/browser_RemoteWebNavigation.js": 5585, 
++    "toolkit/components/satchel/test/browser/browser_popup_mouseover.js": 3199, 
++    "toolkit/components/satchel/test/browser/browser_privbrowsing_perwindowpb.js": 3809, 
++    "toolkit/components/startup/tests/browser/browser_bug511456.js": 4061, 
+     "toolkit/components/startup/tests/browser/browser_crash_detection.js": 35078, 
+-    "toolkit/components/thumbnails/test/browser_thumbnails_bg_destroy_browser.js": 2825, 
+-    "toolkit/components/thumbnails/test/browser_thumbnails_privacy.js": 10033, 
+-    "toolkit/components/thumbnails/test/browser_thumbnails_storage.js": 4779, 
+-    "toolkit/components/thumbnails/test/browser_thumbnails_update.js": 5801, 
+-    "toolkit/components/tooltiptext/tests/browser_input_file_tooltips.js": 6114, 
+-    "toolkit/components/viewsource/test/browser/browser_bug464222.js": 3341, 
+-    "toolkit/components/viewsource/test/browser/browser_bug713810.js": 3131, 
+-    "toolkit/components/viewsource/test/browser/browser_viewsourceprefs.js": 3150, 
+-    "toolkit/content/tests/browser/browser_audioCompeting.js": 4693, 
+-    "toolkit/content/tests/browser/browser_bug1170531.js": 2687, 
+-    "toolkit/content/tests/browser/browser_bug295977_autoscroll_overflow.js": 7231, 
+-    "toolkit/content/tests/browser/browser_content_url_annotation.js": 2753, 
+-    "toolkit/content/tests/browser/browser_crash_previous_frameloader.js": 3003, 
+-    "toolkit/content/tests/browser/browser_f7_caret_browsing.js": 5261, 
++    "toolkit/components/thumbnails/test/browser_thumbnails_bg_basic.js": 2990, 
++    "toolkit/components/thumbnails/test/browser_thumbnails_bg_captureIfMissing.js": 2733, 
++    "toolkit/components/thumbnails/test/browser_thumbnails_bg_crash_during_capture.js": 6361, 
++    "toolkit/components/thumbnails/test/browser_thumbnails_bg_crash_while_idle.js": 6134, 
++    "toolkit/components/thumbnails/test/browser_thumbnails_bg_destroy_browser.js": 6243, 
++    "toolkit/components/thumbnails/test/browser_thumbnails_bg_no_alert.js": 2553, 
++    "toolkit/components/thumbnails/test/browser_thumbnails_bg_no_auth_prompt.js": 2570, 
++    "toolkit/components/thumbnails/test/browser_thumbnails_bg_no_cookies_sent.js": 3750, 
++    "toolkit/components/thumbnails/test/browser_thumbnails_bg_no_cookies_stored.js": 3441, 
++    "toolkit/components/thumbnails/test/browser_thumbnails_bg_no_duplicates.js": 2614, 
++    "toolkit/components/thumbnails/test/browser_thumbnails_bg_queueing.js": 7757, 
++    "toolkit/components/thumbnails/test/browser_thumbnails_bg_redirect.js": 2657, 
++    "toolkit/components/thumbnails/test/browser_thumbnails_privacy.js": 7660, 
++    "toolkit/components/thumbnails/test/browser_thumbnails_storage.js": 4274, 
++    "toolkit/components/thumbnails/test/browser_thumbnails_update.js": 4493, 
++    "toolkit/components/tooltiptext/tests/browser_bug329212.js": 2568, 
++    "toolkit/components/tooltiptext/tests/browser_input_file_tooltips.js": 5613, 
++    "toolkit/components/url-classifier/tests/browser/browser_flashblock_off_with_always_activate.js": 21231, 
++    "toolkit/components/url-classifier/tests/browser/browser_flashblock_off_with_ask_to_activate.js": 17909, 
++    "toolkit/components/url-classifier/tests/browser/browser_flashblock_off_with_never_activate.js": 16228, 
++    "toolkit/components/url-classifier/tests/browser/browser_flashblock_on_with_always_activate.js": 17435, 
++    "toolkit/components/url-classifier/tests/browser/browser_flashblock_on_with_ask_to_activate.js": 17488, 
++    "toolkit/components/url-classifier/tests/browser/browser_flashblock_on_with_never_activate.js": 16252, 
++    "toolkit/components/viewsource/test/browser/browser_bug464222.js": 4798, 
++    "toolkit/components/viewsource/test/browser/browser_bug713810.js": 2465, 
++    "toolkit/components/viewsource/test/browser/browser_open_docgroup.js": 4375, 
++    "toolkit/components/windowcreator/test/browser_bug1204626.js": 8302, 
++    "toolkit/components/windowwatcher/test/browser_new_content_window_chromeflags.js": 6097, 
++    "toolkit/components/windowwatcher/test/browser_new_remote_window_flags.js": 4561, 
++    "toolkit/components/windowwatcher/test/browser_new_sized_window.js": 4013, 
++    "toolkit/content/tests/browser/browser_audioCompeting.js": 4445, 
++    "toolkit/content/tests/browser/browser_audioCompeting_onlyForActiveAgent.js": 2895, 
++    "toolkit/content/tests/browser/browser_block_silentAudioTrack_media.js": 2825, 
++    "toolkit/content/tests/browser/browser_bug1170531.js": 3951, 
++    "toolkit/content/tests/browser/browser_bug295977_autoscroll_overflow.js": 6420, 
++    "toolkit/content/tests/browser/browser_content_url_annotation.js": 2926, 
++    "toolkit/content/tests/browser/browser_datetime_datepicker.js": 8506, 
++    "toolkit/content/tests/browser/browser_f7_caret_browsing.js": 4406, 
+     "toolkit/content/tests/browser/browser_findbar.js": 12430, 
+-    "toolkit/content/tests/browser/browser_label_textlink.js": 3976, 
+-    "toolkit/content/tests/browser/browser_mediaPlayback.js": 6889, 
+-    "toolkit/content/tests/browser/browser_mediaPlayback_mute.js": 9990, 
+-    "toolkit/content/tests/browser/browser_mediaPlayback_suspended.js": 5188, 
+-    "toolkit/content/tests/browser/browser_mediaPlayback_suspended_multipleAudio.js": 9034, 
+-    "toolkit/content/tests/browser/browser_quickfind_editable.js": 4005, 
+-    "toolkit/forgetaboutsite/test/browser/browser_clearplugindata.js": 2879, 
++    "toolkit/content/tests/browser/browser_label_textlink.js": 2551, 
++    "toolkit/content/tests/browser/browser_mediaPlayback.js": 7505, 
++    "toolkit/content/tests/browser/browser_mediaPlayback_mute.js": 3268, 
++    "toolkit/content/tests/browser/browser_mediaPlayback_suspended.js": 2573, 
++    "toolkit/content/tests/browser/browser_mediaPlayback_suspended_multipleAudio.js": 7298, 
++    "toolkit/content/tests/browser/browser_mute_plugIn.js": 2515, 
++    "toolkit/content/tests/browser/browser_quickfind_editable.js": 3657, 
++    "toolkit/content/tests/browser/browser_resume_bkg_video_on_tab_hover.js": 4739, 
++    "toolkit/content/tests/browser/browser_sound_indicator_silent_video.js": 6178, 
++    "toolkit/crashreporter/test/browser/browser_aboutCrashesResubmit.js": 3497, 
++    "toolkit/forgetaboutsite/test/browser/browser_clearplugindata.js": 3476, 
+     "toolkit/modules/tests/browser/browser_RemotePageManager.js": 9725, 
+-    "toolkit/modules/tests/browser/browser_WebRequest.js": 5284, 
+-    "toolkit/mozapps/extensions/test/browser/browser_CTP_plugins.js": 13838, 
+-    "toolkit/mozapps/extensions/test/browser/browser_bug557943.js": 2647, 
+-    "toolkit/mozapps/extensions/test/browser/browser_bug557956.js": 30736, 
+-    "toolkit/mozapps/extensions/test/browser/browser_bug562797.js": 69412, 
+-    "toolkit/mozapps/extensions/test/browser/browser_bug562854.js": 7206, 
+-    "toolkit/mozapps/extensions/test/browser/browser_bug562890.js": 3000, 
+-    "toolkit/mozapps/extensions/test/browser/browser_bug562899.js": 4375, 
+-    "toolkit/mozapps/extensions/test/browser/browser_bug562992.js": 3076, 
+-    "toolkit/mozapps/extensions/test/browser/browser_bug567127.js": 2900, 
+-    "toolkit/mozapps/extensions/test/browser/browser_bug567137.js": 7355, 
+-    "toolkit/mozapps/extensions/test/browser/browser_bug572561.js": 6580, 
+-    "toolkit/mozapps/extensions/test/browser/browser_bug577990.js": 17549, 
+-    "toolkit/mozapps/extensions/test/browser/browser_bug580298.js": 3569, 
+-    "toolkit/mozapps/extensions/test/browser/browser_bug581076.js": 11480, 
+-    "toolkit/mozapps/extensions/test/browser/browser_bug586574.js": 3823, 
+-    "toolkit/mozapps/extensions/test/browser/browser_bug587970.js": 3230, 
+-    "toolkit/mozapps/extensions/test/browser/browser_bug590347.js": 3586, 
+-    "toolkit/mozapps/extensions/test/browser/browser_bug591465.js": 7348, 
+-    "toolkit/mozapps/extensions/test/browser/browser_bug591663.js": 5829, 
+-    "toolkit/mozapps/extensions/test/browser/browser_bug596336.js": 7869, 
+-    "toolkit/mozapps/extensions/test/browser/browser_bug608316.js": 3286, 
+-    "toolkit/mozapps/extensions/test/browser/browser_bug610764.js": 4074, 
+-    "toolkit/mozapps/extensions/test/browser/browser_bug618502.js": 3939, 
+-    "toolkit/mozapps/extensions/test/browser/browser_bug679604.js": 4171, 
+-    "toolkit/mozapps/extensions/test/browser/browser_bug714593.js": 3279, 
+-    "toolkit/mozapps/extensions/test/browser/browser_cancelCompatCheck.js": 20610, 
+-    "toolkit/mozapps/extensions/test/browser/browser_details.js": 44528, 
+-    "toolkit/mozapps/extensions/test/browser/browser_discovery.js": 62860, 
+-    "toolkit/mozapps/extensions/test/browser/browser_discovery_install.js": 16361, 
+-    "toolkit/mozapps/extensions/test/browser/browser_dragdrop.js": 6710, 
+-    "toolkit/mozapps/extensions/test/browser/browser_eula.js": 4062, 
+-    "toolkit/mozapps/extensions/test/browser/browser_experiments.js": 11973, 
+-    "toolkit/mozapps/extensions/test/browser/browser_globalwarnings.js": 5113, 
+-    "toolkit/mozapps/extensions/test/browser/browser_gmpProvider.js": 53557, 
+-    "toolkit/mozapps/extensions/test/browser/browser_hotfix.js": 4078, 
+-    "toolkit/mozapps/extensions/test/browser/browser_inlinesettings.js": 10764, 
+-    "toolkit/mozapps/extensions/test/browser/browser_inlinesettings_browser.js": 7811, 
+-    "toolkit/mozapps/extensions/test/browser/browser_inlinesettings_custom.js": 3870, 
+-    "toolkit/mozapps/extensions/test/browser/browser_inlinesettings_info.js": 10507, 
+-    "toolkit/mozapps/extensions/test/browser/browser_install.js": 20304, 
+-    "toolkit/mozapps/extensions/test/browser/browser_installssl.js": 13849, 
+-    "toolkit/mozapps/extensions/test/browser/browser_list.js": 16456, 
+-    "toolkit/mozapps/extensions/test/browser/browser_manualupdates.js": 6810, 
+-    "toolkit/mozapps/extensions/test/browser/browser_newaddon.js": 5304, 
+-    "toolkit/mozapps/extensions/test/browser/browser_openDialog.js": 3149, 
+-    "toolkit/mozapps/extensions/test/browser/browser_plugin_enabled_state_locked.js": 4336, 
+-    "toolkit/mozapps/extensions/test/browser/browser_pluginprefs.js": 2734, 
+-    "toolkit/mozapps/extensions/test/browser/browser_purchase.js": 6251, 
+-    "toolkit/mozapps/extensions/test/browser/browser_recentupdates.js": 8887, 
+-    "toolkit/mozapps/extensions/test/browser/browser_searching.js": 26394, 
+-    "toolkit/mozapps/extensions/test/browser/browser_sorting.js": 7486, 
+-    "toolkit/mozapps/extensions/test/browser/browser_sorting_plugins.js": 3145, 
+-    "toolkit/mozapps/extensions/test/browser/browser_tabsettings.js": 3391, 
+-    "toolkit/mozapps/extensions/test/browser/browser_types.js": 33981, 
+-    "toolkit/mozapps/extensions/test/browser/browser_uninstalling.js": 22055, 
+-    "toolkit/mozapps/extensions/test/browser/browser_updateid.js": 3257, 
++    "toolkit/modules/tests/browser/browser_WebRequest.js": 4327, 
++    "toolkit/mozapps/extensions/test/browser/browser_CTP_plugins.js": 12262, 
++    "toolkit/mozapps/extensions/test/browser/browser_bug557956.js": 21819, 
++    "toolkit/mozapps/extensions/test/browser/browser_bug562797.js": 44420, 
++    "toolkit/mozapps/extensions/test/browser/browser_bug562854.js": 4901, 
++    "toolkit/mozapps/extensions/test/browser/browser_bug562899.js": 2673, 
++    "toolkit/mozapps/extensions/test/browser/browser_bug567127.js": 2483, 
++    "toolkit/mozapps/extensions/test/browser/browser_bug567137.js": 4643, 
++    "toolkit/mozapps/extensions/test/browser/browser_bug572561.js": 4492, 
++    "toolkit/mozapps/extensions/test/browser/browser_bug577990.js": 11330, 
++    "toolkit/mozapps/extensions/test/browser/browser_bug580298.js": 2594, 
++    "toolkit/mozapps/extensions/test/browser/browser_bug581076.js": 7800, 
++    "toolkit/mozapps/extensions/test/browser/browser_bug586574.js": 2901, 
++    "toolkit/mozapps/extensions/test/browser/browser_bug591465.js": 4664, 
++    "toolkit/mozapps/extensions/test/browser/browser_bug591663.js": 4342, 
++    "toolkit/mozapps/extensions/test/browser/browser_bug596336.js": 5335, 
++    "toolkit/mozapps/extensions/test/browser/browser_bug610764.js": 2818, 
++    "toolkit/mozapps/extensions/test/browser/browser_bug618502.js": 2657, 
++    "toolkit/mozapps/extensions/test/browser/browser_bug679604.js": 2922, 
++    "toolkit/mozapps/extensions/test/browser/browser_cancelCompatCheck.js": 15925, 
++    "toolkit/mozapps/extensions/test/browser/browser_details.js": 30113, 
++    "toolkit/mozapps/extensions/test/browser/browser_discovery.js": 41672, 
++    "toolkit/mozapps/extensions/test/browser/browser_discovery_install.js": 12059, 
++    "toolkit/mozapps/extensions/test/browser/browser_dragdrop.js": 5401, 
++    "toolkit/mozapps/extensions/test/browser/browser_eula.js": 2821, 
++    "toolkit/mozapps/extensions/test/browser/browser_experiments.js": 8859, 
++    "toolkit/mozapps/extensions/test/browser/browser_file_xpi_no_process_switch.js": 5731, 
++    "toolkit/mozapps/extensions/test/browser/browser_getmorethemes.js": 4381, 
++    "toolkit/mozapps/extensions/test/browser/browser_globalwarnings.js": 3530, 
++    "toolkit/mozapps/extensions/test/browser/browser_gmpProvider.js": 22018, 
++    "toolkit/mozapps/extensions/test/browser/browser_hotfix.js": 2587, 
++    "toolkit/mozapps/extensions/test/browser/browser_inlinesettings.js": 6891, 
++    "toolkit/mozapps/extensions/test/browser/browser_inlinesettings_browser.js": 6355, 
++    "toolkit/mozapps/extensions/test/browser/browser_inlinesettings_custom.js": 2507, 
++    "toolkit/mozapps/extensions/test/browser/browser_inlinesettings_info.js": 6930, 
++    "toolkit/mozapps/extensions/test/browser/browser_install.js": 14677, 
++    "toolkit/mozapps/extensions/test/browser/browser_installssl.js": 11898, 
++    "toolkit/mozapps/extensions/test/browser/browser_legacy.js": 6395, 
++    "toolkit/mozapps/extensions/test/browser/browser_legacy_pre57.js": 2941, 
++    "toolkit/mozapps/extensions/test/browser/browser_list.js": 10375, 
++    "toolkit/mozapps/extensions/test/browser/browser_manualupdates.js": 4886, 
++    "toolkit/mozapps/extensions/test/browser/browser_newaddon.js": 3802, 
++    "toolkit/mozapps/extensions/test/browser/browser_non_mpc.js": 4949, 
++    "toolkit/mozapps/extensions/test/browser/browser_plugin_enabled_state_locked.js": 2451, 
++    "toolkit/mozapps/extensions/test/browser/browser_purchase.js": 3600, 
++    "toolkit/mozapps/extensions/test/browser/browser_recentupdates.js": 5650, 
++    "toolkit/mozapps/extensions/test/browser/browser_searching.js": 17868, 
++    "toolkit/mozapps/extensions/test/browser/browser_sorting.js": 4337, 
++    "toolkit/mozapps/extensions/test/browser/browser_types.js": 21267, 
++    "toolkit/mozapps/extensions/test/browser/browser_uninstalling.js": 14547, 
+     "toolkit/mozapps/extensions/test/browser/browser_updatessl.js": 20643, 
+-    "toolkit/mozapps/extensions/test/browser/browser_webapi_access.js": 8925, 
+-    "toolkit/mozapps/extensions/test/browser/browser_webapi_addon_listener.js": 5518, 
+-    "toolkit/mozapps/extensions/test/browser/browser_webapi_install.js": 9827, 
+-    "toolkit/mozapps/extensions/test/browser/browser_webext_options.js": 8145, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_CTP_plugins.js": 12575, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug562797.js": 31916, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug562854.js": 5907, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug562899.js": 4155, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug567137.js": 6618, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug572561.js": 5521, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug577990.js": 13724, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug580298.js": 2993, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug581076.js": 9600, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug586574.js": 3185, 
++    "toolkit/mozapps/extensions/test/browser/browser_webapi_access.js": 7428, 
++    "toolkit/mozapps/extensions/test/browser/browser_webapi_addon_listener.js": 4413, 
++    "toolkit/mozapps/extensions/test/browser/browser_webapi_install.js": 8933, 
++    "toolkit/mozapps/extensions/test/browser/browser_webext_options.js": 6090, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_CTP_plugins.js": 10818, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug562797.js": 28029, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug562854.js": 5068, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug562899.js": 3853, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug567137.js": 5836, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug572561.js": 4919, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug577990.js": 11914, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug580298.js": 2762, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug581076.js": 8388, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug586574.js": 2958, 
+     "toolkit/mozapps/extensions/test/browser/test-window/browser_bug590347.js": 2952, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug591465.js": 6409, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug591465.js": 5382, 
+     "toolkit/mozapps/extensions/test/browser/test-window/browser_bug591663.js": 4501, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug596336.js": 6843, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug610764.js": 3232, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug596336.js": 5615, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug608316.js": 2699, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug610764.js": 2599, 
+     "toolkit/mozapps/extensions/test/browser/test-window/browser_bug618502.js": 2769, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug679604.js": 3301, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug679604.js": 3100, 
+     "toolkit/mozapps/extensions/test/browser/test-window/browser_bug714593.js": 2702, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_details.js": 39524, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_discovery.js": 47140, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_dragdrop.js": 4667, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_eula.js": 3478, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_experiments.js": 8203, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_globalwarnings.js": 4084, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_inlinesettings.js": 9106, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_inlinesettings_browser.js": 7250, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_inlinesettings_custom.js": 3430, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_inlinesettings_info.js": 9317, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_install.js": 17430, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_list.js": 14900, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_manualupdates.js": 5859, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_openDialog.js": 2825, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_details.js": 35536, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_discovery.js": 41998, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_dragdrop.js": 3809, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_eula.js": 3044, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_experiments.js": 7386, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_globalwarnings.js": 3577, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_inlinesettings.js": 8114, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_inlinesettings_browser.js": 6666, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_inlinesettings_custom.js": 2856, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_inlinesettings_info.js": 8334, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_install.js": 15819, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_list.js": 12968, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_manualupdates.js": 5060, 
+     "toolkit/mozapps/extensions/test/browser/test-window/browser_plugin_enabled_state_locked.js": 3748, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_purchase.js": 5235, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_recentupdates.js": 7919, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_searching.js": 22098, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_sorting.js": 6879, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_purchase.js": 4200, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_recentupdates.js": 7499, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_searching.js": 18960, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_sorting.js": 6034, 
+     "toolkit/mozapps/extensions/test/browser/test-window/browser_sorting_plugins.js": 3288, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_tabsettings.js": 2676, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_types.js": 28168, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_uninstalling.js": 19153, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_webext_options.js": 6971, 
+-    "toolkit/mozapps/extensions/test/xpinstall/browser_amosigned_trigger.js": 2920, 
+-    "toolkit/mozapps/extensions/test/xpinstall/browser_auth.js": 2849, 
+-    "toolkit/mozapps/extensions/test/xpinstall/browser_auth4.js": 2724, 
+-    "toolkit/mozapps/extensions/test/xpinstall/browser_bug638292.js": 3676, 
+-    "toolkit/mozapps/extensions/test/xpinstall/browser_concurrent_installs.js": 3441, 
+-    "toolkit/mozapps/extensions/test/xpinstall/browser_localfile.js": 3563, 
+-    "toolkit/mozapps/extensions/test/xpinstall/browser_localfile3.js": 2933, 
+-    "toolkit/mozapps/extensions/test/xpinstall/browser_localfile4.js": 3829, 
+-    "toolkit/mozapps/extensions/test/xpinstall/browser_signed_multiple.js": 2684, 
+-    "uriloader/exthandler/tests/mochitest/browser_web_protocol_handlers.js": 4533
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_types.js": 25997, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_uninstalling.js": 17367, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_webext_options.js": 6144, 
++    "toolkit/mozapps/extensions/test/xpinstall/browser_amosigned_trigger.js": 3947, 
++    "toolkit/mozapps/extensions/test/xpinstall/browser_bug638292.js": 3292, 
++    "toolkit/mozapps/extensions/test/xpinstall/browser_concurrent_installs.js": 2634, 
++    "toolkit/mozapps/update/tests/browser/browser_TelemetryUpdatePing.js": 2499, 
++    "toolkit/mozapps/update/tests/browser/browser_updatesBackgroundWindow.js": 3227, 
++    "toolkit/mozapps/update/tests/browser/browser_updatesBackgroundWindowFailures.js": 3956, 
++    "toolkit/mozapps/update/tests/browser/browser_updatesCompleteAndPartialPatchesWithBadSizes.js": 3131, 
++    "toolkit/mozapps/update/tests/browser/browser_updatesDownloadFailures.js": 3094, 
++    "uriloader/exthandler/tests/mochitest/browser_auto_close_window.js": 8318, 
++    "uriloader/exthandler/tests/mochitest/browser_web_protocol_handlers.js": 3133
+   }
+ }
+diff --git a/testing/runtimes/mochitest-browser-chrome.runtimes.json b/testing/runtimes/mochitest-browser-chrome.runtimes.json
+--- a/testing/runtimes/mochitest-browser-chrome.runtimes.json
++++ b/testing/runtimes/mochitest-browser-chrome.runtimes.json
+@@ -1,829 +1,976 @@
+ {
+-  "excluded_test_average": 943, 
++  "excluded_test_average": 776, 
+   "runtimes": {
+-    "Main app process exited normally": 256712, 
+-    "accessible/tests/browser/browser_caching_name.js": 4954, 
+-    "accessible/tests/browser/browser_shutdown_acc_reference.js": 3209, 
+-    "accessible/tests/browser/browser_shutdown_doc_acc_reference.js": 2929, 
+-    "accessible/tests/browser/browser_shutdown_multi_acc_reference_doc.js": 4225, 
+-    "accessible/tests/browser/browser_shutdown_multi_acc_reference_obj.js": 4138, 
+-    "accessible/tests/browser/browser_shutdown_multi_reference.js": 2710, 
+-    "accessible/tests/browser/browser_shutdown_start_restart.js": 2713, 
+-    "accessible/tests/browser/e10s/browser_caching_name.js": 8501, 
+-    "accessible/tests/browser/e10s/browser_treeupdate_ariaowns.js": 2316, 
+-    "accessible/tests/browser/e10s/browser_treeupdate_visibility.js": 2005, 
+-    "browser/base/content/test/alerts/browser_notification_close.js": 2055, 
+-    "browser/base/content/test/alerts/browser_notification_open_settings.js": 2448, 
+-    "browser/base/content/test/captivePortal/browser_captivePortal_certErrorUI.js": 2503, 
+-    "browser/base/content/test/chat/browser_chatwindow.js": 8674, 
+-    "browser/base/content/test/chat/browser_focus.js": 6450, 
+-    "browser/base/content/test/chat/browser_tearoff.js": 4319, 
+-    "browser/base/content/test/general/browser_URLBarSetURI.js": 4590, 
+-    "browser/base/content/test/general/browser_aboutAccounts.js": 4535, 
+-    "browser/base/content/test/general/browser_aboutCertError.js": 9211, 
+-    "browser/base/content/test/general/browser_aboutHome.js": 22363, 
+-    "browser/base/content/test/general/browser_aboutHome_wrapsCorrectly.js": 3441, 
+-    "browser/base/content/test/general/browser_action_keyword.js": 2708, 
+-    "browser/base/content/test/general/browser_addCertException.js": 3136, 
+-    "browser/base/content/test/general/browser_addKeywordSearch.js": 2128, 
+-    "browser/base/content/test/general/browser_alltabslistener.js": 2755, 
+-    "browser/base/content/test/general/browser_audioTabIcon.js": 39786, 
+-    "browser/base/content/test/general/browser_autocomplete_edit_completed.js": 2099, 
+-    "browser/base/content/test/general/browser_beforeunload_duplicate_dialogs.js": 6496, 
+-    "browser/base/content/test/general/browser_blockHPKP.js": 2540, 
+-    "browser/base/content/test/general/browser_bookmark_popup.js": 12455, 
+-    "browser/base/content/test/general/browser_bookmark_titles.js": 2409, 
+-    "browser/base/content/test/general/browser_bug1025195_switchToTabHavingURI_aOpenParams.js": 4631, 
+-    "browser/base/content/test/general/browser_bug1045809.js": 1960, 
++    "Main app process exited normally": 1849, 
++    "accessible/tests/browser/browser_shutdown_acc_reference.js": 4628, 
++    "accessible/tests/browser/browser_shutdown_doc_acc_reference.js": 4333, 
++    "accessible/tests/browser/browser_shutdown_multi_acc_reference_doc.js": 6083, 
++    "accessible/tests/browser/browser_shutdown_multi_acc_reference_obj.js": 6191, 
++    "accessible/tests/browser/browser_shutdown_multi_reference.js": 4102, 
++    "accessible/tests/browser/browser_shutdown_scope_lifecycle.js": 2063, 
++    "accessible/tests/browser/browser_shutdown_start_restart.js": 4062, 
++    "accessible/tests/browser/e10s/browser_caching_name.js": 5828, 
++    "accessible/tests/browser/events/browser_test_docload.js": 2449, 
++    "accessible/tests/browser/events/browser_test_focus_dialog.js": 2695, 
++    "accessible/tests/browser/states/browser_test_link.js": 1905, 
++    "accessible/tests/browser/tree/browser_aria_owns.js": 2588, 
++    "browser/base/content/test/about/browser_aboutCertError.js": 5953, 
++    "browser/base/content/test/about/browser_aboutHome.js": 12651, 
++    "browser/base/content/test/about/browser_aboutHome_wrapsCorrectly.js": 2273, 
++    "browser/base/content/test/about/browser_aboutStopReload.js": 3487, 
++    "browser/base/content/test/about/browser_aboutSupport.js": 1757, 
++    "browser/base/content/test/alerts/browser_notification_do_not_disturb.js": 4796, 
++    "browser/base/content/test/alerts/browser_notification_open_settings.js": 6495, 
++    "browser/base/content/test/alerts/browser_notification_remove_permission.js": 2956, 
++    "browser/base/content/test/alerts/browser_notification_replace.js": 2233, 
++    "browser/base/content/test/alerts/browser_notification_tab_switching.js": 2263, 
++    "browser/base/content/test/captivePortal/browser_CaptivePortalWatcher.js": 7623, 
++    "browser/base/content/test/captivePortal/browser_CaptivePortalWatcher_1.js": 1713, 
++    "browser/base/content/test/forms/browser_selectpopup.js": 10130, 
++    "browser/base/content/test/forms/browser_selectpopup_colors.js": 6783, 
++    "browser/base/content/test/general/browser_aboutAccounts.js": 5611, 
++    "browser/base/content/test/general/browser_aboutCertError.js": 6835, 
++    "browser/base/content/test/general/browser_aboutHome.js": 16991, 
++    "browser/base/content/test/general/browser_aboutHome_wrapsCorrectly.js": 2741, 
++    "browser/base/content/test/general/browser_alltabslistener.js": 1790, 
++    "browser/base/content/test/general/browser_audioTabIcon.js": 37190, 
++    "browser/base/content/test/general/browser_beforeunload_duplicate_dialogs.js": 4313, 
++    "browser/base/content/test/general/browser_blockHPKP.js": 1705, 
++    "browser/base/content/test/general/browser_bookmark_popup.js": 19269, 
+     "browser/base/content/test/general/browser_bug1299667.js": 8754, 
+-    "browser/base/content/test/general/browser_bug386835.js": 3234, 
+-    "browser/base/content/test/general/browser_bug406216.js": 2261, 
+-    "browser/base/content/test/general/browser_bug422590.js": 8139, 
+-    "browser/base/content/test/general/browser_bug462673.js": 4036, 
+-    "browser/base/content/test/general/browser_bug491431.js": 2127, 
+-    "browser/base/content/test/general/browser_bug495058.js": 5673, 
+-    "browser/base/content/test/general/browser_bug537013.js": 4228, 
+-    "browser/base/content/test/general/browser_bug553455.js": 32427, 
+-    "browser/base/content/test/general/browser_bug567306.js": 5920, 
+-    "browser/base/content/test/general/browser_bug575561.js": 10730, 
++    "browser/base/content/test/general/browser_bug386835.js": 1863, 
++    "browser/base/content/test/general/browser_bug406216.js": 1871, 
++    "browser/base/content/test/general/browser_bug422590.js": 6070, 
++    "browser/base/content/test/general/browser_bug462673.js": 3151, 
++    "browser/base/content/test/general/browser_bug495058.js": 4053, 
++    "browser/base/content/test/general/browser_bug553455.js": 19119, 
++    "browser/base/content/test/general/browser_bug575561.js": 6788, 
+     "browser/base/content/test/general/browser_bug581242.js": 2704, 
+-    "browser/base/content/test/general/browser_bug585558.js": 2040, 
+-    "browser/base/content/test/general/browser_bug590206.js": 10362, 
+-    "browser/base/content/test/general/browser_bug592338.js": 4611, 
++    "browser/base/content/test/general/browser_bug581253.js": 3046, 
++    "browser/base/content/test/general/browser_bug590206.js": 9684, 
++    "browser/base/content/test/general/browser_bug592338.js": 2322, 
+     "browser/base/content/test/general/browser_bug609700.js": 4015, 
+-    "browser/base/content/test/general/browser_bug623893.js": 3163, 
+-    "browser/base/content/test/general/browser_bug676619.js": 11546, 
+-    "browser/base/content/test/general/browser_bug719271.js": 3871, 
+-    "browser/base/content/test/general/browser_bug734076.js": 3261, 
+-    "browser/base/content/test/general/browser_bug735471.js": 2085, 
+-    "browser/base/content/test/general/browser_bug763468_perwindowpb.js": 6924, 
+-    "browser/base/content/test/general/browser_bug767836_perwindowpb.js": 6682, 
+-    "browser/base/content/test/general/browser_bug817947.js": 2969, 
+-    "browser/base/content/test/general/browser_bug822367.js": 7570, 
+-    "browser/base/content/test/general/browser_bug882977.js": 2116, 
+-    "browser/base/content/test/general/browser_bug902156.js": 4323, 
+-    "browser/base/content/test/general/browser_bug906190.js": 23834, 
+-    "browser/base/content/test/general/browser_bug963945.js": 3860, 
+-    "browser/base/content/test/general/browser_contentAltClick.js": 3194, 
+-    "browser/base/content/test/general/browser_contentAreaClick.js": 2520, 
+-    "browser/base/content/test/general/browser_contentSearchUI.js": 16302, 
+-    "browser/base/content/test/general/browser_contextmenu.js": 6404, 
+-    "browser/base/content/test/general/browser_contextmenu_childprocess.js": 4201, 
+-    "browser/base/content/test/general/browser_ctrlTab.js": 4962, 
+-    "browser/base/content/test/general/browser_datachoices_notification.js": 3564, 
+-    "browser/base/content/test/general/browser_datareporting_notification.js": 4123, 
+-    "browser/base/content/test/general/browser_decoderDoctor.js": 1926, 
+-    "browser/base/content/test/general/browser_devices_get_user_media.js": 20295, 
+-    "browser/base/content/test/general/browser_devices_get_user_media_in_frame.js": 6180, 
+-    "browser/base/content/test/general/browser_documentnavigation.js": 5228, 
+-    "browser/base/content/test/general/browser_domFullscreen_fullscreenMode.js": 4787, 
+-    "browser/base/content/test/general/browser_e10s_chrome_process.js": 4526, 
+-    "browser/base/content/test/general/browser_e10s_switchbrowser.js": 5444, 
+-    "browser/base/content/test/general/browser_fullscreen-window-open.js": 2830, 
+-    "browser/base/content/test/general/browser_fxa_oauth.js": 4120, 
+-    "browser/base/content/test/general/browser_fxa_web_channel.js": 3535, 
++    "browser/base/content/test/general/browser_bug623893.js": 1855, 
++    "browser/base/content/test/general/browser_bug676619.js": 7587, 
++    "browser/base/content/test/general/browser_bug719271.js": 2743, 
++    "browser/base/content/test/general/browser_bug724239.js": 1727, 
++    "browser/base/content/test/general/browser_bug734076.js": 2457, 
++    "browser/base/content/test/general/browser_bug735471.js": 3323, 
++    "browser/base/content/test/general/browser_bug763468_perwindowpb.js": 5575, 
++    "browser/base/content/test/general/browser_bug767836_perwindowpb.js": 4499, 
++    "browser/base/content/test/general/browser_bug817947.js": 2067, 
++    "browser/base/content/test/general/browser_bug822367.js": 6755, 
++    "browser/base/content/test/general/browser_bug902156.js": 3567, 
++    "browser/base/content/test/general/browser_bug906190.js": 20590, 
++    "browser/base/content/test/general/browser_bug963945.js": 3584, 
++    "browser/base/content/test/general/browser_contentAltClick.js": 4319, 
++    "browser/base/content/test/general/browser_contentSearchUI.js": 13540, 
++    "browser/base/content/test/general/browser_contextmenu_childprocess.js": 2922, 
++    "browser/base/content/test/general/browser_contextmenu_input.js": 3091, 
++    "browser/base/content/test/general/browser_ctrlTab.js": 4695, 
++    "browser/base/content/test/general/browser_datachoices_notification.js": 4024, 
++    "browser/base/content/test/general/browser_decoderDoctor.js": 2240, 
++    "browser/base/content/test/general/browser_documentnavigation.js": 3451, 
++    "browser/base/content/test/general/browser_domFullscreen_fullscreenMode.js": 3265, 
++    "browser/base/content/test/general/browser_e10s_about_page_triggeringprincipal.js": 1802, 
++    "browser/base/content/test/general/browser_e10s_chrome_process.js": 2528, 
++    "browser/base/content/test/general/browser_e10s_switchbrowser.js": 2956, 
++    "browser/base/content/test/general/browser_fullscreen-window-open.js": 4807, 
++    "browser/base/content/test/general/browser_fxa_oauth.js": 3693, 
++    "browser/base/content/test/general/browser_fxa_web_channel.js": 3045, 
+     "browser/base/content/test/general/browser_fxaccounts.js": 3175, 
+-    "browser/base/content/test/general/browser_getshortcutoruri.js": 3344, 
+-    "browser/base/content/test/general/browser_identity_UI.js": 19308, 
+-    "browser/base/content/test/general/browser_insecureLoginForms.js": 3538, 
+-    "browser/base/content/test/general/browser_locationBarCommand.js": 3188, 
+-    "browser/base/content/test/general/browser_mcb_redirect.js": 8524, 
+-    "browser/base/content/test/general/browser_misused_characters_in_strings.js": 6197, 
+-    "browser/base/content/test/general/browser_mixedContentFromOnunload.js": 2355, 
+-    "browser/base/content/test/general/browser_mixed_content_cert_override.js": 4309, 
+-    "browser/base/content/test/general/browser_mixedcontent_securityflags.js": 2629, 
+-    "browser/base/content/test/general/browser_newTabDrop.js": 4928, 
++    "browser/base/content/test/general/browser_getshortcutoruri.js": 2899, 
++    "browser/base/content/test/general/browser_identity_UI.js": 16947, 
++    "browser/base/content/test/general/browser_insecureLoginForms.js": 4522, 
++    "browser/base/content/test/general/browser_mcb_redirect.js": 7856, 
++    "browser/base/content/test/general/browser_misused_characters_in_strings.js": 5126, 
++    "browser/base/content/test/general/browser_mixedContentFromOnunload.js": 1979, 
++    "browser/base/content/test/general/browser_mixed_content_cert_override.js": 3200, 
++    "browser/base/content/test/general/browser_mixedcontent_securityflags.js": 2168, 
++    "browser/base/content/test/general/browser_newTabDrop.js": 3631, 
+     "browser/base/content/test/general/browser_newWindowDrop.js": 21114, 
+-    "browser/base/content/test/general/browser_no_mcb_on_http_site.js": 2901, 
+-    "browser/base/content/test/general/browser_offlineQuotaNotification.js": 2814, 
+-    "browser/base/content/test/general/browser_overflowScroll.js": 7265, 
+-    "browser/base/content/test/general/browser_pageInfo.js": 2273, 
+-    "browser/base/content/test/general/browser_parsable_css.js": 2523, 
+-    "browser/base/content/test/general/browser_parsable_script.js": 8547, 
+-    "browser/base/content/test/general/browser_permissions.js": 4518, 
+-    "browser/base/content/test/general/browser_plainTextLinks.js": 2170, 
+-    "browser/base/content/test/general/browser_popupUI.js": 2245, 
+-    "browser/base/content/test/general/browser_printpreview.js": 5871, 
+-    "browser/base/content/test/general/browser_private_browsing_window.js": 3607, 
+-    "browser/base/content/test/general/browser_private_no_prompt.js": 2065, 
+-    "browser/base/content/test/general/browser_readerMode.js": 3581, 
+-    "browser/base/content/test/general/browser_refreshBlocker.js": 10694, 
+-    "browser/base/content/test/general/browser_relatedTabs.js": 8578, 
+-    "browser/base/content/test/general/browser_remoteTroubleshoot.js": 3548, 
+-    "browser/base/content/test/general/browser_remoteWebNavigation_postdata.js": 2176, 
+-    "browser/base/content/test/general/browser_sanitize-timespans.js": 6246, 
+-    "browser/base/content/test/general/browser_sanitizeDialog.js": 21078, 
+-    "browser/base/content/test/general/browser_save_link-perwindowpb.js": 5222, 
+-    "browser/base/content/test/general/browser_save_link_when_window_navigates.js": 4887, 
+-    "browser/base/content/test/general/browser_save_private_link_perwindowpb.js": 3032, 
+-    "browser/base/content/test/general/browser_selectTabAtIndex.js": 2787, 
+-    "browser/base/content/test/general/browser_ssl_error_reports.js": 8220, 
+-    "browser/base/content/test/general/browser_syncui.js": 5402, 
+-    "browser/base/content/test/general/browser_tabDrop.js": 3870, 
+-    "browser/base/content/test/general/browser_tabMatchesInAwesomebar.js": 12675, 
+-    "browser/base/content/test/general/browser_tabMatchesInAwesomebar_perwindowpb.js": 8317, 
+-    "browser/base/content/test/general/browser_tab_close_dependent_window.js": 3170, 
+-    "browser/base/content/test/general/browser_tab_detach_restore.js": 3826, 
+-    "browser/base/content/test/general/browser_tab_drag_drop_perwindow.js": 9358, 
+-    "browser/base/content/test/general/browser_tab_dragdrop.js": 5989, 
+-    "browser/base/content/test/general/browser_tab_dragdrop2.js": 5365, 
+-    "browser/base/content/test/general/browser_tabfocus.js": 3234, 
+-    "browser/base/content/test/general/browser_tabkeynavigation.js": 2058, 
+-    "browser/base/content/test/general/browser_tabs_isActive.js": 2148, 
+-    "browser/base/content/test/general/browser_trackingUI_1.js": 8610, 
+-    "browser/base/content/test/general/browser_trackingUI_2.js": 5972, 
+-    "browser/base/content/test/general/browser_trackingUI_3.js": 2056, 
+-    "browser/base/content/test/general/browser_trackingUI_4.js": 7873, 
+-    "browser/base/content/test/general/browser_trackingUI_5.js": 8397, 
+-    "browser/base/content/test/general/browser_trackingUI_telemetry.js": 12210, 
+-    "browser/base/content/test/general/browser_typeAheadFind.js": 2104, 
+-    "browser/base/content/test/general/browser_unloaddialogs.js": 1989, 
+-    "browser/base/content/test/general/browser_urlbarCopying.js": 3291, 
+-    "browser/base/content/test/general/browser_urlbarDelete.js": 2349, 
+-    "browser/base/content/test/general/browser_urlbarSearchSingleWordNotification.js": 12733, 
+-    "browser/base/content/test/general/browser_urlbarSearchSuggestionsNotification.js": 11224, 
+-    "browser/base/content/test/general/browser_urlbarSearchTelemetry.js": 3252, 
+-    "browser/base/content/test/general/browser_urlbar_autoFill_backspaced.js": 5662, 
+-    "browser/base/content/test/general/browser_utilityOverlay.js": 2079, 
+-    "browser/base/content/test/general/browser_viewSourceInTabOnViewSource.js": 2435, 
+-    "browser/base/content/test/general/browser_web_channel.js": 13287, 
++    "browser/base/content/test/general/browser_new_http_window_opened_from_file_tab.js": 4259, 
++    "browser/base/content/test/general/browser_newwindow_focus.js": 2838, 
++    "browser/base/content/test/general/browser_no_mcb_on_http_site.js": 2753, 
++    "browser/base/content/test/general/browser_offlineQuotaNotification.js": 3858, 
++    "browser/base/content/test/general/browser_overflowScroll.js": 5114, 
++    "browser/base/content/test/general/browser_pageInfo.js": 1818, 
++    "browser/base/content/test/general/browser_pageinfo_svg_image.js": 1900, 
++    "browser/base/content/test/general/browser_parsable_script.js": 8073, 
++    "browser/base/content/test/general/browser_permissions.js": 3818, 
++    "browser/base/content/test/general/browser_plainTextLinks.js": 3131, 
++    "browser/base/content/test/general/browser_printpreview.js": 4070, 
++    "browser/base/content/test/general/browser_private_browsing_window.js": 2750, 
++    "browser/base/content/test/general/browser_private_no_prompt.js": 1878, 
++    "browser/base/content/test/general/browser_refreshBlocker.js": 5525, 
++    "browser/base/content/test/general/browser_relatedTabs.js": 5315, 
++    "browser/base/content/test/general/browser_remoteTroubleshoot.js": 3215, 
++    "browser/base/content/test/general/browser_remoteWebNavigation_postdata.js": 2816, 
++    "browser/base/content/test/general/browser_sanitize-timespans.js": 4613, 
++    "browser/base/content/test/general/browser_sanitizeDialog.js": 12014, 
++    "browser/base/content/test/general/browser_save_link-perwindowpb.js": 3513, 
++    "browser/base/content/test/general/browser_save_link_when_window_navigates.js": 3234, 
++    "browser/base/content/test/general/browser_save_private_link_perwindowpb.js": 2141, 
++    "browser/base/content/test/general/browser_selectTabAtIndex.js": 2464, 
++    "browser/base/content/test/general/browser_ssl_error_reports.js": 5356, 
++    "browser/base/content/test/general/browser_storagePressure_notification.js": 6804, 
++    "browser/base/content/test/general/browser_syncui.js": 13476, 
++    "browser/base/content/test/general/browser_tabDrop.js": 3365, 
++    "browser/base/content/test/general/browser_tab_close_dependent_window.js": 2036, 
++    "browser/base/content/test/general/browser_tab_detach_restore.js": 3151, 
++    "browser/base/content/test/general/browser_tab_drag_drop_perwindow.js": 10895, 
++    "browser/base/content/test/general/browser_tab_dragdrop.js": 4862, 
++    "browser/base/content/test/general/browser_tab_dragdrop2.js": 3684, 
++    "browser/base/content/test/general/browser_tabfocus.js": 2051, 
++    "browser/base/content/test/general/browser_trackingUI_1.js": 6999, 
++    "browser/base/content/test/general/browser_trackingUI_2.js": 4247, 
++    "browser/base/content/test/general/browser_trackingUI_4.js": 5312, 
++    "browser/base/content/test/general/browser_trackingUI_5.js": 6080, 
++    "browser/base/content/test/general/browser_trackingUI_telemetry.js": 8690, 
++    "browser/base/content/test/general/browser_utilityOverlay.js": 2527, 
++    "browser/base/content/test/general/browser_viewSourceInTabOnViewSource.js": 2044, 
++    "browser/base/content/test/general/browser_web_channel.js": 9261, 
+     "browser/base/content/test/general/browser_windowactivation.js": 5022, 
+-    "browser/base/content/test/newtab/browser_newtab_block.js": 4694, 
+-    "browser/base/content/test/newtab/browser_newtab_bug1194895.js": 7375, 
+-    "browser/base/content/test/newtab/browser_newtab_drag_drop.js": 4524, 
+-    "browser/base/content/test/newtab/browser_newtab_drag_drop_ext.js": 10077, 
+-    "browser/base/content/test/newtab/browser_newtab_enhanced.js": 4317, 
+-    "browser/base/content/test/newtab/browser_newtab_intro.js": 2152, 
+-    "browser/base/content/test/newtab/browser_newtab_perwindow_private_browsing.js": 2984, 
+-    "browser/base/content/test/newtab/browser_newtab_unpin.js": 2896, 
+-    "browser/base/content/test/plugins/browser_CTP_crashreporting.js": 4623, 
+-    "browser/base/content/test/plugins/browser_CTP_drag_drop.js": 5004, 
+-    "browser/base/content/test/plugins/browser_CTP_outsideScrollArea.js": 2057, 
+-    "browser/base/content/test/plugins/browser_CTP_zoom.js": 2497, 
+-    "browser/base/content/test/plugins/browser_blocking.js": 8859, 
+-    "browser/base/content/test/plugins/browser_bug743421.js": 1953, 
++    "browser/base/content/test/newtab/browser_newtab_background_captures.js": 2766, 
++    "browser/base/content/test/newtab/browser_newtab_block.js": 5480, 
++    "browser/base/content/test/newtab/browser_newtab_bug1178586.js": 1996, 
++    "browser/base/content/test/newtab/browser_newtab_bug1194895.js": 9339, 
++    "browser/base/content/test/newtab/browser_newtab_bug1271075.js": 2270, 
++    "browser/base/content/test/newtab/browser_newtab_bug735987.js": 2603, 
++    "browser/base/content/test/newtab/browser_newtab_bug752841.js": 2632, 
++    "browser/base/content/test/newtab/browser_newtab_disable.js": 1685, 
++    "browser/base/content/test/newtab/browser_newtab_drag_drop.js": 7041, 
++    "browser/base/content/test/newtab/browser_newtab_enhanced.js": 5362, 
++    "browser/base/content/test/newtab/browser_newtab_focus.js": 1766, 
++    "browser/base/content/test/newtab/browser_newtab_perwindow_private_browsing.js": 4842, 
++    "browser/base/content/test/newtab/browser_newtab_reflow_load.js": 2167, 
++    "browser/base/content/test/newtab/browser_newtab_search.js": 1708, 
++    "browser/base/content/test/newtab/browser_newtab_unpin.js": 4823, 
++    "browser/base/content/test/newtab/browser_newtab_update.js": 2040, 
++    "browser/base/content/test/performance/browser_appmenu_reflows.js": 2497, 
++    "browser/base/content/test/performance/browser_tabclose_grow_reflows.js": 1803, 
++    "browser/base/content/test/performance/browser_tabopen_squeeze_reflows.js": 2431, 
++    "browser/base/content/test/performance/browser_tabstrip_overflow_underflow_reflows.js": 3248, 
++    "browser/base/content/test/performance/browser_toolbariconcolor_restyles.js": 2089, 
++    "browser/base/content/test/performance/browser_urlbar_keyed_search_reflows.js": 2996, 
++    "browser/base/content/test/performance/browser_urlbar_search_reflows.js": 7523, 
++    "browser/base/content/test/performance/browser_windowopen_reflows.js": 1827, 
++    "browser/base/content/test/permissions/browser_permissions.js": 2989, 
++    "browser/base/content/test/permissions/browser_temporary_permissions_expiry.js": 2114, 
++    "browser/base/content/test/permissions/browser_temporary_permissions_navigation.js": 4130, 
++    "browser/base/content/test/permissions/browser_temporary_permissions_tabs.js": 2615, 
++    "browser/base/content/test/plugins/browser_CTP_crashreporting.js": 4284, 
++    "browser/base/content/test/plugins/browser_CTP_data_urls.js": 2870, 
++    "browser/base/content/test/plugins/browser_CTP_drag_drop.js": 4272, 
++    "browser/base/content/test/plugins/browser_CTP_favorfallback.js": 7380, 
++    "browser/base/content/test/plugins/browser_CTP_multi_allow.js": 2872, 
++    "browser/base/content/test/plugins/browser_CTP_outsideScrollArea.js": 1716, 
++    "browser/base/content/test/plugins/browser_CTP_zoom.js": 2291, 
++    "browser/base/content/test/plugins/browser_blocking.js": 6301, 
+     "browser/base/content/test/plugins/browser_clearplugindata.js": 1970, 
+-    "browser/base/content/test/plugins/browser_iterate_hidden_plugins.js": 3842, 
+-    "browser/base/content/test/plugins/browser_pluginCrashCommentAndURL.js": 3975, 
+-    "browser/base/content/test/plugins/browser_plugin_infolink.js": 2392, 
+-    "browser/base/content/test/plugins/browser_pluginnotification.js": 10634, 
+-    "browser/base/content/test/plugins/browser_plugins_added_dynamically.js": 2310, 
+-    "browser/base/content/test/plugins/browser_private_clicktoplay.js": 7542, 
+-    "browser/base/content/test/popupNotifications/browser_popupNotification_2.js": 4242, 
+-    "browser/base/content/test/popupNotifications/browser_popupNotification_3.js": 3418, 
+-    "browser/base/content/test/popupNotifications/browser_popupNotification_4.js": 2958, 
++    "browser/base/content/test/plugins/browser_iterate_hidden_plugins.js": 2260, 
++    "browser/base/content/test/plugins/browser_pluginCrashCommentAndURL.js": 3550, 
++    "browser/base/content/test/plugins/browser_pluginCrashReportNonDeterminism.js": 3141, 
++    "browser/base/content/test/plugins/browser_pluginnotification.js": 8135, 
++    "browser/base/content/test/plugins/browser_plugins_added_dynamically.js": 2075, 
++    "browser/base/content/test/plugins/browser_private_browsing_eme_persistent_state.js": 3061, 
++    "browser/base/content/test/plugins/browser_private_clicktoplay.js": 5946, 
++    "browser/base/content/test/popupNotifications/browser_popupNotification.js": 2262, 
++    "browser/base/content/test/popupNotifications/browser_popupNotification_2.js": 5117, 
++    "browser/base/content/test/popupNotifications/browser_popupNotification_3.js": 4647, 
++    "browser/base/content/test/popupNotifications/browser_popupNotification_4.js": 4446, 
+     "browser/base/content/test/popupNotifications/browser_popupNotification_5.js": 3582, 
+-    "browser/base/content/test/popupNotifications/browser_popupNotification_no_anchors.js": 2846, 
+-    "browser/base/content/test/referrer/browser_referrer_middle_click.js": 17578, 
+-    "browser/base/content/test/referrer/browser_referrer_middle_click_in_container.js": 17296, 
+-    "browser/base/content/test/referrer/browser_referrer_open_link_in_container_tab.js": 4884, 
+-    "browser/base/content/test/referrer/browser_referrer_open_link_in_container_tab2.js": 4456, 
+-    "browser/base/content/test/referrer/browser_referrer_open_link_in_container_tab3.js": 4761, 
+-    "browser/base/content/test/referrer/browser_referrer_open_link_in_private.js": 7624, 
+-    "browser/base/content/test/referrer/browser_referrer_open_link_in_tab.js": 5245, 
+-    "browser/base/content/test/referrer/browser_referrer_open_link_in_window.js": 8155, 
+-    "browser/base/content/test/referrer/browser_referrer_open_link_in_window_in_container.js": 8389, 
+-    "browser/base/content/test/referrer/browser_referrer_simple_click.js": 13704, 
+-    "browser/base/content/test/social/browser_aboutHome_activation.js": 4928, 
+-    "browser/base/content/test/social/browser_blocklist.js": 3946, 
+-    "browser/base/content/test/social/browser_share.js": 9928, 
+-    "browser/base/content/test/social/browser_social_activation.js": 8652, 
+-    "browser/base/content/test/social/browser_social_chatwindow.js": 7424, 
+-    "browser/base/content/test/social/browser_social_chatwindow_resize.js": 4743, 
+-    "browser/base/content/test/social/browser_social_chatwindowfocus.js": 3147, 
+-    "browser/base/content/test/social/browser_social_contextmenu.js": 3014, 
+-    "browser/base/content/test/social/browser_social_errorPage.js": 5261, 
+-    "browser/base/content/test/social/browser_social_flyout.js": 2181, 
+-    "browser/base/content/test/social/browser_social_marks.js": 8438, 
+-    "browser/base/content/test/social/browser_social_marks_context.js": 5938, 
+-    "browser/base/content/test/social/browser_social_multiworker.js": 2746, 
+-    "browser/base/content/test/social/browser_social_perwindowPB.js": 5727, 
+-    "browser/base/content/test/social/browser_social_status.js": 4890, 
+-    "browser/base/content/test/social/browser_social_window.js": 19940, 
+-    "browser/base/content/test/tabs/browser_navigatePinnedTab.js": 3563, 
+-    "browser/base/content/test/tabs/browser_tabSwitchPrintPreview.js": 2163, 
+-    "browser/base/content/test/urlbar/browser_URLBarSetURI.js": 4770, 
+-    "browser/base/content/test/urlbar/browser_action_searchengine.js": 2122, 
+-    "browser/base/content/test/urlbar/browser_action_searchengine_alias.js": 1986, 
+-    "browser/base/content/test/urlbar/browser_autocomplete_a11y_label.js": 1965, 
+-    "browser/base/content/test/urlbar/browser_autocomplete_autoselect.js": 2100, 
+-    "browser/base/content/test/urlbar/browser_autocomplete_enter_race.js": 5982, 
+-    "browser/base/content/test/urlbar/browser_autocomplete_tag_star_visibility.js": 3463, 
+-    "browser/base/content/test/urlbar/browser_bug1025195_switchToTabHavingURI_aOpenParams.js": 8349, 
+-    "browser/base/content/test/urlbar/browser_bug1070778.js": 2199, 
+-    "browser/base/content/test/urlbar/browser_bug304198.js": 1925, 
+-    "browser/base/content/test/urlbar/browser_canonizeURL.js": 2985, 
+-    "browser/base/content/test/urlbar/browser_moz_action_link.js": 2323, 
+-    "browser/base/content/test/urlbar/browser_tabMatchesInAwesomebar.js": 9636, 
+-    "browser/base/content/test/urlbar/browser_tabMatchesInAwesomebar_perwindowpb.js": 4170, 
+-    "browser/base/content/test/urlbar/browser_urlbarAboutHomeLoading.js": 9206, 
+-    "browser/base/content/test/urlbar/browser_urlbarDecode.js": 2299, 
+-    "browser/base/content/test/urlbar/browser_urlbarHashChangeProxyState.js": 2294, 
+-    "browser/base/content/test/urlbar/browser_urlbarKeepStateAcrossTabSwitches.js": 2583, 
+-    "browser/base/content/test/urlbar/browser_urlbarOneOffs.js": 6115, 
+-    "browser/base/content/test/urlbar/browser_urlbarRaceWithTabs.js": 2282, 
+-    "browser/base/content/test/urlbar/browser_urlbarSearchSingleWordNotification.js": 16819, 
+-    "browser/base/content/test/urlbar/browser_urlbarSearchSuggestions.js": 2251, 
+-    "browser/base/content/test/urlbar/browser_urlbarSearchSuggestionsNotification.js": 10936, 
+-    "browser/base/content/test/urlbar/browser_urlbarSearchTelemetry.js": 5890, 
+-    "browser/base/content/test/urlbar/browser_urlbarStop.js": 2092, 
+-    "browser/base/content/test/urlbar/browser_urlbar_autoFill_backspaced.js": 7004, 
+-    "browser/base/content/test/urlbar/browser_urlbar_blanking.js": 3691, 
+-    "browser/base/content/test/webrtc/browser_devices_get_user_media.js": 13978, 
+-    "browser/base/content/test/webrtc/browser_devices_get_user_media_anim.js": 5250, 
+-    "browser/base/content/test/webrtc/browser_devices_get_user_media_in_frame.js": 8327, 
+-    "browser/base/content/test/webrtc/browser_devices_get_user_media_screen.js": 6249, 
+-    "browser/base/content/test/webrtc/browser_devices_get_user_media_tear_off_tab.js": 3249, 
+-    "browser/components/contextualidentity/test/browser/browser_aboutURLs.js": 19159, 
+-    "browser/components/contextualidentity/test/browser/browser_broadcastchannel.js": 1991, 
+-    "browser/components/contextualidentity/test/browser/browser_eme.js": 2237, 
++    "browser/base/content/test/popupNotifications/browser_popupNotification_checkbox.js": 2675, 
++    "browser/base/content/test/popupNotifications/browser_popupNotification_keyboard.js": 2517, 
++    "browser/base/content/test/popupNotifications/browser_popupNotification_no_anchors.js": 3746, 
++    "browser/base/content/test/referrer/browser_referrer_middle_click.js": 11011, 
++    "browser/base/content/test/referrer/browser_referrer_middle_click_in_container.js": 11388, 
++    "browser/base/content/test/referrer/browser_referrer_open_link_in_container_tab.js": 9206, 
++    "browser/base/content/test/referrer/browser_referrer_open_link_in_container_tab2.js": 7503, 
++    "browser/base/content/test/referrer/browser_referrer_open_link_in_container_tab3.js": 8461, 
++    "browser/base/content/test/referrer/browser_referrer_open_link_in_private.js": 14237, 
++    "browser/base/content/test/referrer/browser_referrer_open_link_in_tab.js": 9656, 
++    "browser/base/content/test/referrer/browser_referrer_open_link_in_window.js": 15352, 
++    "browser/base/content/test/referrer/browser_referrer_open_link_in_window_in_container.js": 14829, 
++    "browser/base/content/test/referrer/browser_referrer_simple_click.js": 10453, 
++    "browser/base/content/test/siteIdentity/browser_bug822367.js": 3846, 
++    "browser/base/content/test/siteIdentity/browser_bug902156.js": 2212, 
++    "browser/base/content/test/siteIdentity/browser_bug906190.js": 13030, 
++    "browser/base/content/test/siteIdentity/browser_identity_UI.js": 12078, 
++    "browser/base/content/test/siteIdentity/browser_insecureLoginForms.js": 2963, 
++    "browser/base/content/test/siteIdentity/browser_mcb_redirect.js": 3628, 
++    "browser/base/content/test/siteIdentity/browser_mixed_content_cert_override.js": 2148, 
++    "browser/base/content/test/siteIdentity/browser_no_mcb_for_loopback.js": 3643, 
++    "browser/base/content/test/siteIdentity/browser_no_mcb_on_http_site.js": 1782, 
++    "browser/base/content/test/social/browser_aboutHome_activation.js": 3319, 
++    "browser/base/content/test/social/browser_blocklist.js": 3450, 
++    "browser/base/content/test/social/browser_share.js": 7159, 
++    "browser/base/content/test/social/browser_social_activation.js": 6056, 
++    "browser/base/content/test/static/browser_all_files_referenced.js": 2185, 
++    "browser/base/content/test/static/browser_parsable_script.js": 5158, 
++    "browser/base/content/test/sync/browser_aboutAccounts.js": 6830, 
++    "browser/base/content/test/sync/browser_contextmenu_sendpage.js": 1643, 
++    "browser/base/content/test/sync/browser_fxa_web_channel.js": 2023, 
++    "browser/base/content/test/sync/browser_sync.js": 2410, 
++    "browser/base/content/test/tabs/browser_abandonment_telemetry.js": 5270, 
++    "browser/base/content/test/tabs/browser_navigatePinnedTab.js": 2014, 
++    "browser/base/content/test/tabs/browser_overflowScroll.js": 6442, 
++    "browser/base/content/test/tabs/browser_preloadedBrowser_zoom.js": 5016, 
++    "browser/base/content/test/tabs/browser_tabSwitchPrintPreview.js": 2340, 
++    "browser/base/content/test/urlbar/browser_URLBarSetURI.js": 3253, 
++    "browser/base/content/test/urlbar/browser_action_keyword.js": 1969, 
++    "browser/base/content/test/urlbar/browser_autocomplete_enter_race.js": 3854, 
++    "browser/base/content/test/urlbar/browser_autocomplete_tag_star_visibility.js": 2531, 
++    "browser/base/content/test/urlbar/browser_bug1025195_switchToTabHavingURI_aOpenParams.js": 5745, 
++    "browser/base/content/test/urlbar/browser_canonizeURL.js": 2642, 
++    "browser/base/content/test/urlbar/browser_locationBarCommand.js": 4523, 
++    "browser/base/content/test/urlbar/browser_moz_action_link.js": 1666, 
++    "browser/base/content/test/urlbar/browser_page_action_menu.js": 20990, 
++    "browser/base/content/test/urlbar/browser_tabMatchesInAwesomebar.js": 6383, 
++    "browser/base/content/test/urlbar/browser_tabMatchesInAwesomebar_perwindowpb.js": 7386, 
++    "browser/base/content/test/urlbar/browser_urlbarAboutHomeLoading.js": 9862, 
++    "browser/base/content/test/urlbar/browser_urlbarAddonIframe.js": 2238, 
++    "browser/base/content/test/urlbar/browser_urlbarDecode.js": 1994, 
++    "browser/base/content/test/urlbar/browser_urlbarHashChangeProxyState.js": 1723, 
++    "browser/base/content/test/urlbar/browser_urlbarKeepStateAcrossTabSwitches.js": 1719, 
++    "browser/base/content/test/urlbar/browser_urlbarOneOffs.js": 3791, 
++    "browser/base/content/test/urlbar/browser_urlbarOneOffs_searchSuggestions.js": 2490, 
++    "browser/base/content/test/urlbar/browser_urlbarRaceWithTabs.js": 1781, 
++    "browser/base/content/test/urlbar/browser_urlbarSearchSingleWordNotification.js": 15180, 
++    "browser/base/content/test/urlbar/browser_urlbarSearchSuggestions.js": 2747, 
++    "browser/base/content/test/urlbar/browser_urlbarSearchSuggestionsNotification.js": 9662, 
++    "browser/base/content/test/urlbar/browser_urlbarSearchSuggestions_opt-in.js": 8019, 
++    "browser/base/content/test/urlbar/browser_urlbarSearchSuggestions_opt-out.js": 2967, 
++    "browser/base/content/test/urlbar/browser_urlbarSearchTelemetry.js": 4201, 
++    "browser/base/content/test/urlbar/browser_urlbarUpdateForDomainCompletion.js": 2649, 
++    "browser/base/content/test/urlbar/browser_urlbar_autoFill_backspaced.js": 5169, 
++    "browser/base/content/test/urlbar/browser_urlbar_blanking.js": 2391, 
++    "browser/base/content/test/urlbar/browser_urlbar_search_speculative_connect.js": 3281, 
++    "browser/base/content/test/urlbar/browser_urlbar_search_speculative_connect_engine.js": 1823, 
++    "browser/base/content/test/urlbar/browser_urlbar_search_speculative_connect_mousedown.js": 3773, 
++    "browser/base/content/test/urlbar/browser_urlbar_stop_pending.js": 3215, 
++    "browser/base/content/test/webextensions/browser_extension_sideloading.js": 7031, 
++    "browser/base/content/test/webextensions/browser_extension_update_background.js": 14207, 
++    "browser/base/content/test/webextensions/browser_extension_update_background_noprompt.js": 3655, 
++    "browser/base/content/test/webextensions/browser_permissions_addons_search.js": 5573, 
++    "browser/base/content/test/webextensions/browser_permissions_installTrigger.js": 2667, 
++    "browser/base/content/test/webextensions/browser_permissions_local_file.js": 5217, 
++    "browser/base/content/test/webextensions/browser_permissions_mozAddonManager.js": 2545, 
++    "browser/base/content/test/webextensions/browser_update_checkForUpdates.js": 10209, 
++    "browser/base/content/test/webextensions/browser_update_findUpdates.js": 7844, 
++    "browser/base/content/test/webextensions/browser_update_interactive_noprompt.js": 6487, 
++    "browser/base/content/test/webrtc/browser_devices_get_user_media.js": 17102, 
++    "browser/base/content/test/webrtc/browser_devices_get_user_media_anim.js": 4011, 
++    "browser/base/content/test/webrtc/browser_devices_get_user_media_in_frame.js": 4174, 
++    "browser/base/content/test/webrtc/browser_devices_get_user_media_multi_process.js": 2049, 
++    "browser/base/content/test/webrtc/browser_devices_get_user_media_queue_request.js": 2473, 
++    "browser/base/content/test/webrtc/browser_devices_get_user_media_screen.js": 12776, 
++    "browser/base/content/test/webrtc/browser_devices_get_user_media_tear_off_tab.js": 4427, 
++    "browser/base/content/test/webrtc/browser_devices_get_user_media_unprompted_access.js": 7908, 
++    "browser/base/content/test/webrtc/browser_devices_get_user_media_unprompted_access_in_frame.js": 9142, 
++    "browser/base/content/test/webrtc/browser_devices_get_user_media_unprompted_access_queue_request.js": 3223, 
++    "browser/base/content/test/webrtc/browser_devices_get_user_media_unprompted_access_tear_off_tab.js": 4512, 
++    "browser/base/content/test/webrtc/browser_webrtc_hooks.js": 3049, 
++    "browser/components/contextualidentity/test/browser/browser_aboutURLs.js": 13545, 
++    "browser/components/contextualidentity/test/browser/browser_eme.js": 1652, 
+     "browser/components/contextualidentity/test/browser/browser_favicon.js": 9300, 
+-    "browser/components/contextualidentity/test/browser/browser_forgetAPI_EME_forgetThisSite.js": 5300, 
+-    "browser/components/contextualidentity/test/browser/browser_forgetAPI_quota_clearStoragesForPrincipal.js": 3675, 
+-    "browser/components/contextualidentity/test/browser/browser_forgetaboutsite.js": 13411, 
+-    "browser/components/contextualidentity/test/browser/browser_imageCache.js": 4815, 
++    "browser/components/contextualidentity/test/browser/browser_forgetAPI_EME_forgetThisSite.js": 3741, 
++    "browser/components/contextualidentity/test/browser/browser_forgetAPI_quota_clearStoragesForPrincipal.js": 2587, 
++    "browser/components/contextualidentity/test/browser/browser_forgetaboutsite.js": 10822, 
++    "browser/components/contextualidentity/test/browser/browser_imageCache.js": 4026, 
+     "browser/components/contextualidentity/test/browser/browser_newtabButton.js": 5498, 
+-    "browser/components/contextualidentity/test/browser/browser_serviceworkers.js": 2686, 
+-    "browser/components/contextualidentity/test/browser/browser_usercontext.js": 4116, 
+-    "browser/components/contextualidentity/test/browser/browser_usercontextid_tabdrop.js": 4974, 
+-    "browser/components/contextualidentity/test/browser/browser_windowOpen.js": 2486, 
+-    "browser/components/customizableui/test/browser_1003588_no_specials_in_panel.js": 3488, 
+-    "browser/components/customizableui/test/browser_1007336_lwthemes_in_customize_mode.js": 2654, 
+-    "browser/components/customizableui/test/browser_1008559_anchor_undo_restore.js": 8718, 
+-    "browser/components/customizableui/test/browser_1089591_still_customizable_after_reset.js": 3416, 
+-    "browser/components/customizableui/test/browser_876926_customize_mode_wrapping.js": 8648, 
+-    "browser/components/customizableui/test/browser_876944_customize_mode_create_destroy.js": 1987, 
+-    "browser/components/customizableui/test/browser_878452_drag_to_panel.js": 3304, 
+-    "browser/components/customizableui/test/browser_880164_customization_context_menus.js": 14163, 
+-    "browser/components/customizableui/test/browser_880382_drag_wide_widgets_in_panel.js": 8111, 
+-    "browser/components/customizableui/test/browser_885052_customize_mode_observers_disabed.js": 2613, 
+-    "browser/components/customizableui/test/browser_885530_showInPrivateBrowsing.js": 10316, 
+-    "browser/components/customizableui/test/browser_889120_customize_tab_merging.js": 6271, 
+-    "browser/components/customizableui/test/browser_890140_orphaned_placeholders.js": 13730, 
+-    "browser/components/customizableui/test/browser_901207_searchbar_in_panel.js": 2327, 
+-    "browser/components/customizableui/test/browser_914863_disabled_help_quit_buttons.js": 2058, 
+-    "browser/components/customizableui/test/browser_918049_skipintoolbarset_dnd.js": 2438, 
+-    "browser/components/customizableui/test/browser_923857_customize_mode_event_wrapping_during_reset.js": 3920, 
+-    "browser/components/customizableui/test/browser_927717_customize_drag_empty_toolbar.js": 2338, 
+-    "browser/components/customizableui/test/browser_934951_zoom_in_toolbar.js": 1922, 
+-    "browser/components/customizableui/test/browser_938980_navbar_collapsed.js": 12517, 
+-    "browser/components/customizableui/test/browser_940946_removable_from_navbar_customizemode.js": 1994, 
+-    "browser/components/customizableui/test/browser_944887_destroyWidget_should_destroy_in_palette.js": 1960, 
+-    "browser/components/customizableui/test/browser_956602_remove_special_widget.js": 2334, 
+-    "browser/components/customizableui/test/browser_962884_opt_in_disable_hyphens.js": 2399, 
+-    "browser/components/customizableui/test/browser_963639_customizing_attribute_non_customizable_toolbar.js": 2295, 
+-    "browser/components/customizableui/test/browser_967000_button_sync.js": 7471, 
+-    "browser/components/customizableui/test/browser_968565_insert_before_hidden_items.js": 2534, 
+-    "browser/components/customizableui/test/browser_969661_character_encoding_navbar_disabled.js": 2362, 
+-    "browser/components/customizableui/test/browser_970511_undo_restore_default.js": 14354, 
+-    "browser/components/customizableui/test/browser_973932_addonbar_currentset.js": 3456, 
+-    "browser/components/customizableui/test/browser_975719_customtoolbars_behaviour.js": 10607, 
+-    "browser/components/customizableui/test/browser_978084_dragEnd_after_move.js": 4609, 
+-    "browser/components/customizableui/test/browser_985815_propagate_setToolbarVisibility.js": 5794, 
+-    "browser/components/customizableui/test/browser_987640_charEncoding.js": 2372, 
+-    "browser/components/customizableui/test/browser_988072_sidebar_events.js": 4880, 
+-    "browser/components/customizableui/test/browser_993322_widget_notoolbar.js": 2224, 
+-    "browser/components/customizableui/test/browser_995164_registerArea_during_customize_mode.js": 8583, 
+-    "browser/components/customizableui/test/browser_bootstrapped_custom_toolbar.js": 8390, 
+-    "browser/components/customizableui/test/browser_check_tooltips_in_navbar.js": 2096, 
+-    "browser/components/customizableui/test/browser_customizemode_contextmenu_menubuttonstate.js": 2284, 
+-    "browser/components/customizableui/test/browser_switch_to_customize_mode.js": 5363, 
+-    "browser/components/downloads/test/browser/browser_confirm_unblock_download.js": 5417, 
+-    "browser/components/downloads/test/browser/browser_downloads_panel_block.js": 22516, 
+-    "browser/components/downloads/test/browser/browser_iframe_gone_mid_download.js": 7385, 
+-    "browser/components/downloads/test/browser/browser_indicatorDrop.js": 5075, 
+-    "browser/components/downloads/test/browser/browser_libraryDrop.js": 6251, 
+-    "browser/components/extensions/test/browser/browser_ext_browserAction_context.js": 6063, 
+-    "browser/components/extensions/test/browser/browser_ext_browserAction_pageAction_icon.js": 13426, 
+-    "browser/components/extensions/test/browser/browser_ext_browserAction_pageAction_icon_permissions.js": 4447, 
+-    "browser/components/extensions/test/browser/browser_ext_browserAction_popup.js": 13072, 
++    "browser/components/contextualidentity/test/browser/browser_serviceworkers.js": 1957, 
++    "browser/components/contextualidentity/test/browser/browser_usercontext.js": 2642, 
++    "browser/components/contextualidentity/test/browser/browser_usercontextid_tabdrop.js": 1636, 
++    "browser/components/customizableui/test/browser_1003588_no_specials_in_panel.js": 2017, 
++    "browser/components/customizableui/test/browser_1007336_lwthemes_in_customize_mode.js": 3252, 
++    "browser/components/customizableui/test/browser_1008559_anchor_undo_restore.js": 4045, 
++    "browser/components/customizableui/test/browser_1087303_button_preferences.js": 1970, 
++    "browser/components/customizableui/test/browser_876926_customize_mode_wrapping.js": 5324, 
++    "browser/components/customizableui/test/browser_878452_drag_to_panel.js": 2053, 
++    "browser/components/customizableui/test/browser_880164_customization_context_menus.js": 10312, 
++    "browser/components/customizableui/test/browser_880382_drag_wide_widgets_in_panel.js": 5875, 
++    "browser/components/customizableui/test/browser_885052_customize_mode_observers_disabed.js": 1905, 
++    "browser/components/customizableui/test/browser_885530_showInPrivateBrowsing.js": 7425, 
++    "browser/components/customizableui/test/browser_890140_orphaned_placeholders.js": 9385, 
++    "browser/components/customizableui/test/browser_901207_searchbar_in_panel.js": 2509, 
++    "browser/components/customizableui/test/browser_923857_customize_mode_event_wrapping_during_reset.js": 2197, 
++    "browser/components/customizableui/test/browser_938980_navbar_collapsed.js": 6984, 
++    "browser/components/customizableui/test/browser_947914_button_print.js": 1654, 
++    "browser/components/customizableui/test/browser_962884_opt_in_disable_hyphens.js": 1708, 
++    "browser/components/customizableui/test/browser_967000_button_sync.js": 6363, 
++    "browser/components/customizableui/test/browser_969661_character_encoding_navbar_disabled.js": 1647, 
++    "browser/components/customizableui/test/browser_970511_undo_restore_default.js": 7997, 
++    "browser/components/customizableui/test/browser_973641_button_addon.js": 1661, 
++    "browser/components/customizableui/test/browser_973932_addonbar_currentset.js": 2326, 
++    "browser/components/customizableui/test/browser_975719_customtoolbars_behaviour.js": 8124, 
++    "browser/components/customizableui/test/browser_976792_insertNodeInWindow.js": 2252, 
++    "browser/components/customizableui/test/browser_978084_dragEnd_after_move.js": 2527, 
++    "browser/components/customizableui/test/browser_984455_bookmarks_items_reparenting.js": 2688, 
++    "browser/components/customizableui/test/browser_985815_propagate_setToolbarVisibility.js": 3774, 
++    "browser/components/customizableui/test/browser_987640_charEncoding.js": 2065, 
++    "browser/components/customizableui/test/browser_988072_sidebar_events.js": 4205, 
++    "browser/components/customizableui/test/browser_995164_registerArea_during_customize_mode.js": 5257, 
++    "browser/components/customizableui/test/browser_backfwd_enabled_post_customize.js": 1837, 
++    "browser/components/customizableui/test/browser_bootstrapped_custom_toolbar.js": 4679, 
++    "browser/components/customizableui/test/browser_customization_context_menus.js": 7903, 
++    "browser/components/customizableui/test/browser_customizemode_uidensity.js": 4865, 
++    "browser/components/customizableui/test/browser_exit_background_customize_mode.js": 2971, 
++    "browser/components/customizableui/test/browser_open_from_popup.js": 1964, 
++    "browser/components/customizableui/test/browser_panelUINotifications.js": 2902, 
++    "browser/components/customizableui/test/browser_panelUINotifications_multiWindow.js": 5012, 
++    "browser/components/customizableui/test/browser_panel_keyboard_navigation.js": 2956, 
++    "browser/components/customizableui/test/browser_photon_customization_context_menus.js": 8816, 
++    "browser/components/customizableui/test/browser_switch_to_customize_mode.js": 3446, 
++    "browser/components/customizableui/test/browser_synced_tabs_menu.js": 9920, 
++    "browser/components/downloads/test/browser/browser_confirm_unblock_download.js": 2351, 
++    "browser/components/downloads/test/browser/browser_downloads_panel_block.js": 2191, 
++    "browser/components/downloads/test/browser/browser_first_download_panel.js": 1766, 
++    "browser/components/downloads/test/browser/browser_iframe_gone_mid_download.js": 5508, 
++    "browser/components/downloads/test/browser/browser_indicatorDrop.js": 4113, 
++    "browser/components/downloads/test/browser/browser_libraryDrop.js": 4534, 
++    "browser/components/extensions/test/browser/browser_ext_autocompletepopup.js": 3478, 
++    "browser/components/extensions/test/browser/browser_ext_browserAction_context.js": 3303, 
++    "browser/components/extensions/test/browser/browser_ext_browserAction_contextMenu.js": 2753, 
++    "browser/components/extensions/test/browser/browser_ext_browserAction_pageAction_icon.js": 7082, 
++    "browser/components/extensions/test/browser/browser_ext_browserAction_pageAction_icon_permissions.js": 2728, 
++    "browser/components/extensions/test/browser/browser_ext_browserAction_popup.js": 10673, 
+     "browser/components/extensions/test/browser/browser_ext_browserAction_popup_preload.js": 4825, 
+-    "browser/components/extensions/test/browser/browser_ext_browserAction_popup_resize.js": 11396, 
+-    "browser/components/extensions/test/browser/browser_ext_browserAction_simple.js": 2631, 
+-    "browser/components/extensions/test/browser/browser_ext_commands_execute_browser_action.js": 3773, 
+-    "browser/components/extensions/test/browser/browser_ext_commands_onCommand.js": 4519, 
+-    "browser/components/extensions/test/browser/browser_ext_contextMenus.js": 6844, 
+-    "browser/components/extensions/test/browser/browser_ext_contextMenus_actionMenus.js": 2209, 
+-    "browser/components/extensions/test/browser/browser_ext_contextMenus_checkboxes.js": 2087, 
+-    "browser/components/extensions/test/browser/browser_ext_contextMenus_chrome.js": 2877, 
+-    "browser/components/extensions/test/browser/browser_ext_contextMenus_onclick.js": 19241, 
+-    "browser/components/extensions/test/browser/browser_ext_contextMenus_radioGroups.js": 2043, 
+-    "browser/components/extensions/test/browser/browser_ext_currentWindow.js": 8998, 
+-    "browser/components/extensions/test/browser/browser_ext_getViews.js": 9544, 
+-    "browser/components/extensions/test/browser/browser_ext_incognito_popup.js": 5140, 
+-    "browser/components/extensions/test/browser/browser_ext_incognito_views.js": 4075, 
+-    "browser/components/extensions/test/browser/browser_ext_legacy_extension_context_contentscript.js": 2629, 
+-    "browser/components/extensions/test/browser/browser_ext_omnibox.js": 7971, 
+-    "browser/components/extensions/test/browser/browser_ext_optionsPage_privileges.js": 5073, 
+-    "browser/components/extensions/test/browser/browser_ext_pageAction_context.js": 8016, 
+-    "browser/components/extensions/test/browser/browser_ext_pageAction_popup.js": 5772, 
+-    "browser/components/extensions/test/browser/browser_ext_pageAction_popup_resize.js": 2346, 
+-    "browser/components/extensions/test/browser/browser_ext_pageAction_title.js": 9209, 
+-    "browser/components/extensions/test/browser/browser_ext_popup_api_injection.js": 3126, 
+-    "browser/components/extensions/test/browser/browser_ext_popup_background.js": 3195, 
+-    "browser/components/extensions/test/browser/browser_ext_popup_corners.js": 2673, 
+-    "browser/components/extensions/test/browser/browser_ext_popup_sendMessage.js": 2454, 
+-    "browser/components/extensions/test/browser/browser_ext_popup_shutdown.js": 3823, 
+-    "browser/components/extensions/test/browser/browser_ext_runtime_openOptionsPage.js": 24202, 
+-    "browser/components/extensions/test/browser/browser_ext_runtime_openOptionsPage_uninstall.js": 4739, 
+-    "browser/components/extensions/test/browser/browser_ext_runtime_setUninstallURL.js": 3413, 
+-    "browser/components/extensions/test/browser/browser_ext_sessions_getRecentlyClosed.js": 14654, 
+-    "browser/components/extensions/test/browser/browser_ext_sessions_getRecentlyClosed_private.js": 4249, 
+-    "browser/components/extensions/test/browser/browser_ext_sessions_restore.js": 11395, 
+-    "browser/components/extensions/test/browser/browser_ext_tab_runtimeConnect.js": 2306, 
+-    "browser/components/extensions/test/browser/browser_ext_tabs_audio.js": 3006, 
+-    "browser/components/extensions/test/browser/browser_ext_tabs_captureVisibleTab.js": 7471, 
+-    "browser/components/extensions/test/browser/browser_ext_tabs_cookieStoreId.js": 11426, 
+-    "browser/components/extensions/test/browser/browser_ext_tabs_create.js": 8814, 
+-    "browser/components/extensions/test/browser/browser_ext_tabs_detectLanguage.js": 3680, 
+-    "browser/components/extensions/test/browser/browser_ext_tabs_duplicate.js": 7481, 
+-    "browser/components/extensions/test/browser/browser_ext_tabs_events.js": 11709, 
+-    "browser/components/extensions/test/browser/browser_ext_tabs_executeScript.js": 4252, 
+-    "browser/components/extensions/test/browser/browser_ext_tabs_executeScript_bad.js": 7803, 
+-    "browser/components/extensions/test/browser/browser_ext_tabs_executeScript_good.js": 9378, 
+-    "browser/components/extensions/test/browser/browser_ext_tabs_executeScript_runAt.js": 2717, 
+-    "browser/components/extensions/test/browser/browser_ext_tabs_getCurrent.js": 2190, 
+-    "browser/components/extensions/test/browser/browser_ext_tabs_move.js": 3728, 
+-    "browser/components/extensions/test/browser/browser_ext_tabs_move_window.js": 7730, 
+-    "browser/components/extensions/test/browser/browser_ext_tabs_move_window_multiple.js": 6397, 
+-    "browser/components/extensions/test/browser/browser_ext_tabs_move_window_pinned.js": 4922, 
+-    "browser/components/extensions/test/browser/browser_ext_tabs_onHighlighted.js": 3195, 
++    "browser/components/extensions/test/browser/browser_ext_browserAction_popup_resize.js": 7302, 
++    "browser/components/extensions/test/browser/browser_ext_browserAction_simple.js": 1806, 
++    "browser/components/extensions/test/browser/browser_ext_browserAction_telemetry.js": 3405, 
++    "browser/components/extensions/test/browser/browser_ext_browserAction_theme_icons.js": 2536, 
++    "browser/components/extensions/test/browser/browser_ext_browsingData_formData.js": 3384, 
++    "browser/components/extensions/test/browser/browser_ext_browsingData_history.js": 2442, 
++    "browser/components/extensions/test/browser/browser_ext_browsingData_pluginData.js": 4359, 
++    "browser/components/extensions/test/browser/browser_ext_browsingData_serviceWorkers.js": 2809, 
++    "browser/components/extensions/test/browser/browser_ext_commands_execute_browser_action.js": 2693, 
++    "browser/components/extensions/test/browser/browser_ext_commands_onCommand.js": 3468, 
++    "browser/components/extensions/test/browser/browser_ext_contextMenus.js": 5103, 
++    "browser/components/extensions/test/browser/browser_ext_contextMenus_commands.js": 2352, 
++    "browser/components/extensions/test/browser/browser_ext_contextMenus_icons.js": 1922, 
++    "browser/components/extensions/test/browser/browser_ext_contextMenus_onclick.js": 20614, 
++    "browser/components/extensions/test/browser/browser_ext_currentWindow.js": 5966, 
++    "browser/components/extensions/test/browser/browser_ext_devtools_inspectedWindow.js": 23723, 
++    "browser/components/extensions/test/browser/browser_ext_devtools_inspectedWindow_eval_bindings.js": 8567, 
++    "browser/components/extensions/test/browser/browser_ext_devtools_inspectedWindow_reload.js": 12867, 
++    "browser/components/extensions/test/browser/browser_ext_devtools_network.js": 5523, 
++    "browser/components/extensions/test/browser/browser_ext_devtools_page.js": 3138, 
++    "browser/components/extensions/test/browser/browser_ext_devtools_panel.js": 8219, 
++    "browser/components/extensions/test/browser/browser_ext_devtools_panels_elements.js": 5392, 
++    "browser/components/extensions/test/browser/browser_ext_find.js": 2526, 
++    "browser/components/extensions/test/browser/browser_ext_getViews.js": 6850, 
++    "browser/components/extensions/test/browser/browser_ext_incognito_popup.js": 3694, 
++    "browser/components/extensions/test/browser/browser_ext_incognito_views.js": 3033, 
++    "browser/components/extensions/test/browser/browser_ext_menus.js": 7901, 
++    "browser/components/extensions/test/browser/browser_ext_omnibox.js": 1776, 
++    "browser/components/extensions/test/browser/browser_ext_openPanel.js": 3381, 
++    "browser/components/extensions/test/browser/browser_ext_optionsPage_browser_style.js": 10819, 
++    "browser/components/extensions/test/browser/browser_ext_optionsPage_privileges.js": 4585, 
++    "browser/components/extensions/test/browser/browser_ext_pageAction_context.js": 6823, 
++    "browser/components/extensions/test/browser/browser_ext_pageAction_contextMenu.js": 3487, 
++    "browser/components/extensions/test/browser/browser_ext_pageAction_popup.js": 4894, 
++    "browser/components/extensions/test/browser/browser_ext_pageAction_popup_resize.js": 2492, 
++    "browser/components/extensions/test/browser/browser_ext_pageAction_telemetry.js": 2342, 
++    "browser/components/extensions/test/browser/browser_ext_pageAction_title.js": 8562, 
++    "browser/components/extensions/test/browser/browser_ext_popup_api_injection.js": 2700, 
++    "browser/components/extensions/test/browser/browser_ext_popup_background.js": 2330, 
++    "browser/components/extensions/test/browser/browser_ext_popup_corners.js": 1920, 
++    "browser/components/extensions/test/browser/browser_ext_popup_sendMessage.js": 1809, 
++    "browser/components/extensions/test/browser/browser_ext_popup_shutdown.js": 2671, 
++    "browser/components/extensions/test/browser/browser_ext_runtime_openOptionsPage.js": 18672, 
++    "browser/components/extensions/test/browser/browser_ext_runtime_openOptionsPage_uninstall.js": 4489, 
++    "browser/components/extensions/test/browser/browser_ext_runtime_setUninstallURL.js": 3072, 
++    "browser/components/extensions/test/browser/browser_ext_sessions_forgetClosedWindow.js": 6213, 
++    "browser/components/extensions/test/browser/browser_ext_sessions_getRecentlyClosed.js": 9882, 
++    "browser/components/extensions/test/browser/browser_ext_sessions_getRecentlyClosed_private.js": 2643, 
++    "browser/components/extensions/test/browser/browser_ext_sessions_getRecentlyClosed_tabs.js": 3157, 
++    "browser/components/extensions/test/browser/browser_ext_sessions_restore.js": 8576, 
++    "browser/components/extensions/test/browser/browser_ext_settings_overrides_default_search.js": 7407, 
++    "browser/components/extensions/test/browser/browser_ext_settings_overrides_search.js": 2032, 
++    "browser/components/extensions/test/browser/browser_ext_sidebarAction.js": 8608, 
++    "browser/components/extensions/test/browser/browser_ext_sidebarAction_browser_style.js": 8188, 
++    "browser/components/extensions/test/browser/browser_ext_sidebarAction_context.js": 8803, 
++    "browser/components/extensions/test/browser/browser_ext_sidebarAction_contextMenu.js": 6776, 
++    "browser/components/extensions/test/browser/browser_ext_sidebarAction_tabs.js": 1761, 
++    "browser/components/extensions/test/browser/browser_ext_sidebarAction_windows.js": 2895, 
++    "browser/components/extensions/test/browser/browser_ext_tabs_audio.js": 1835, 
++    "browser/components/extensions/test/browser/browser_ext_tabs_captureVisibleTab.js": 4435, 
++    "browser/components/extensions/test/browser/browser_ext_tabs_cookieStoreId.js": 9893, 
++    "browser/components/extensions/test/browser/browser_ext_tabs_create.js": 7577, 
++    "browser/components/extensions/test/browser/browser_ext_tabs_detectLanguage.js": 2164, 
++    "browser/components/extensions/test/browser/browser_ext_tabs_duplicate.js": 4306, 
++    "browser/components/extensions/test/browser/browser_ext_tabs_events.js": 8197, 
++    "browser/components/extensions/test/browser/browser_ext_tabs_executeScript.js": 3375, 
++    "browser/components/extensions/test/browser/browser_ext_tabs_executeScript_bad.js": 13509, 
++    "browser/components/extensions/test/browser/browser_ext_tabs_executeScript_good.js": 8065, 
++    "browser/components/extensions/test/browser/browser_ext_tabs_executeScript_multiple.js": 2185, 
++    "browser/components/extensions/test/browser/browser_ext_tabs_executeScript_runAt.js": 2373, 
++    "browser/components/extensions/test/browser/browser_ext_tabs_insertCSS.js": 1690, 
++    "browser/components/extensions/test/browser/browser_ext_tabs_move.js": 3095, 
++    "browser/components/extensions/test/browser/browser_ext_tabs_move_array.js": 3234, 
++    "browser/components/extensions/test/browser/browser_ext_tabs_move_window.js": 5100, 
++    "browser/components/extensions/test/browser/browser_ext_tabs_move_window_multiple.js": 3631, 
++    "browser/components/extensions/test/browser/browser_ext_tabs_move_window_pinned.js": 3304, 
++    "browser/components/extensions/test/browser/browser_ext_tabs_onHighlighted.js": 6343, 
+     "browser/components/extensions/test/browser/browser_ext_tabs_onUpdated.js": 16368, 
+-    "browser/components/extensions/test/browser/browser_ext_tabs_query.js": 9851, 
+-    "browser/components/extensions/test/browser/browser_ext_tabs_reload.js": 1956, 
+-    "browser/components/extensions/test/browser/browser_ext_tabs_reload_bypass_cache.js": 2218, 
++    "browser/components/extensions/test/browser/browser_ext_tabs_printPreview.js": 5686, 
++    "browser/components/extensions/test/browser/browser_ext_tabs_query.js": 5939, 
++    "browser/components/extensions/test/browser/browser_ext_tabs_reload_bypass_cache.js": 1832, 
+     "browser/components/extensions/test/browser/browser_ext_tabs_removeCSS.js": 2097, 
+-    "browser/components/extensions/test/browser/browser_ext_tabs_sendMessage.js": 4951, 
+-    "browser/components/extensions/test/browser/browser_ext_tabs_update.js": 2279, 
+-    "browser/components/extensions/test/browser/browser_ext_tabs_update_url.js": 5491, 
+-    "browser/components/extensions/test/browser/browser_ext_tabs_zoom.js": 4946, 
+-    "browser/components/extensions/test/browser/browser_ext_webNavigation_getFrames.js": 2319, 
+-    "browser/components/extensions/test/browser/browser_ext_webNavigation_urlbar_transitions.js": 8373, 
+-    "browser/components/extensions/test/browser/browser_ext_webRequest.js": 5295, 
+-    "browser/components/extensions/test/browser/browser_ext_windows.js": 2319, 
+-    "browser/components/extensions/test/browser/browser_ext_windows_allowScriptsToClose.js": 6112, 
+-    "browser/components/extensions/test/browser/browser_ext_windows_create.js": 10089, 
+-    "browser/components/extensions/test/browser/browser_ext_windows_create_tabId.js": 10142, 
+-    "browser/components/extensions/test/browser/browser_ext_windows_create_url.js": 8076, 
+-    "browser/components/extensions/test/browser/browser_ext_windows_events.js": 4114, 
+-    "browser/components/extensions/test/browser/browser_ext_windows_size.js": 3006, 
+-    "browser/components/extensions/test/browser/browser_ext_windows_update.js": 7168, 
+-    "browser/components/newtab/tests/browser/browser_PreviewProvider.js": 2721, 
+-    "browser/components/newtab/tests/browser/browser_newtab_overrides.js": 5220, 
+-    "browser/components/newtab/tests/browser/browser_newtabwebchannel.js": 5901, 
+-    "browser/components/originattributes/test/browser/browser_blobURLIsolation.js": 11316, 
+-    "browser/components/originattributes/test/browser/browser_broadcastChannel.js": 9848, 
+-    "browser/components/originattributes/test/browser/browser_cache.js": 20014, 
+-    "browser/components/originattributes/test/browser/browser_cacheAPI.js": 13788, 
+-    "browser/components/originattributes/test/browser/browser_clientAuth.js": 14758, 
+-    "browser/components/originattributes/test/browser/browser_cookieIsolation.js": 8153, 
+-    "browser/components/originattributes/test/browser/browser_favicon_firstParty.js": 9326, 
+-    "browser/components/originattributes/test/browser/browser_favicon_userContextId.js": 6434, 
+-    "browser/components/originattributes/test/browser/browser_firstPartyIsolation.js": 15130, 
+-    "browser/components/originattributes/test/browser/browser_httpauth.js": 22525, 
+-    "browser/components/originattributes/test/browser/browser_imageCacheIsolation.js": 19571, 
+-    "browser/components/originattributes/test/browser/browser_localStorageIsolation.js": 7981, 
+-    "browser/components/originattributes/test/browser/browser_permissions.js": 31916, 
+-    "browser/components/originattributes/test/browser/browser_sanitize.js": 36498, 
+-    "browser/components/originattributes/test/browser/browser_sharedworker.js": 8933, 
+-    "browser/components/places/tests/browser/browser_0_library_left_pane_migration.js": 1932, 
+-    "browser/components/places/tests/browser/browser_410196_paste_into_tags.js": 2102, 
+-    "browser/components/places/tests/browser/browser_475045.js": 2023, 
+-    "browser/components/places/tests/browser/browser_bookmarkProperties_addKeywordForThisSearch.js": 5613, 
+-    "browser/components/places/tests/browser/browser_bookmarkProperties_editTagContainer.js": 2424, 
+-    "browser/components/places/tests/browser/browser_bookmarklet_windowOpen.js": 2011, 
+-    "browser/components/places/tests/browser/browser_bookmarksProperties.js": 4787, 
+-    "browser/components/places/tests/browser/browser_forgetthissite_single.js": 2492, 
+-    "browser/components/places/tests/browser/browser_library_batch_delete.js": 2138, 
+-    "browser/components/places/tests/browser/browser_library_commands.js": 5823, 
+-    "browser/components/places/tests/browser/browser_library_infoBox.js": 2070, 
+-    "browser/components/places/tests/browser/browser_library_middleclick.js": 4660, 
+-    "browser/components/places/tests/browser/browser_library_views_liveupdate.js": 9015, 
+-    "browser/components/places/tests/browser/browser_sort_in_library.js": 2706, 
+-    "browser/components/places/tests/browser/browser_views_liveupdate.js": 4275, 
+-    "browser/components/preferences/in-content-new/tests/browser_advanced_siteData.js": 4546, 
+-    "browser/components/preferences/in-content-new/tests/browser_advanced_update.js": 3765, 
+-    "browser/components/preferences/in-content-new/tests/browser_basic_rebuild_fonts_test.js": 2815, 
+-    "browser/components/preferences/in-content-new/tests/browser_bug1020245_openPreferences_to_paneContent.js": 7119, 
+-    "browser/components/preferences/in-content-new/tests/browser_bug1184989_prevent_scrolling_when_preferences_flipped.js": 3072, 
+-    "browser/components/preferences/in-content-new/tests/browser_bug731866.js": 3887, 
++    "browser/components/extensions/test/browser/browser_ext_tabs_sendMessage.js": 2852, 
++    "browser/components/extensions/test/browser/browser_ext_tabs_update_url.js": 3773, 
++    "browser/components/extensions/test/browser/browser_ext_tabs_zoom.js": 3371, 
++    "browser/components/extensions/test/browser/browser_ext_themes_icons.js": 2880, 
++    "browser/components/extensions/test/browser/browser_ext_url_overrides_home.js": 2932, 
++    "browser/components/extensions/test/browser/browser_ext_user_events.js": 1708, 
++    "browser/components/extensions/test/browser/browser_ext_webNavigation_getFrames.js": 1746, 
++    "browser/components/extensions/test/browser/browser_ext_webNavigation_onCreatedNavigationTarget.js": 10394, 
++    "browser/components/extensions/test/browser/browser_ext_webNavigation_onCreatedNavigationTarget_contextmenu.js": 5884, 
++    "browser/components/extensions/test/browser/browser_ext_webNavigation_onCreatedNavigationTarget_window_open.js": 5689, 
++    "browser/components/extensions/test/browser/browser_ext_webNavigation_urlbar_transitions.js": 5267, 
++    "browser/components/extensions/test/browser/browser_ext_webRequest.js": 3827, 
++    "browser/components/extensions/test/browser/browser_ext_windows.js": 4453, 
++    "browser/components/extensions/test/browser/browser_ext_windows_allowScriptsToClose.js": 4160, 
++    "browser/components/extensions/test/browser/browser_ext_windows_create.js": 11697, 
++    "browser/components/extensions/test/browser/browser_ext_windows_create_tabId.js": 7704, 
++    "browser/components/extensions/test/browser/browser_ext_windows_create_url.js": 6155, 
++    "browser/components/extensions/test/browser/browser_ext_windows_events.js": 3213, 
++    "browser/components/extensions/test/browser/browser_ext_windows_size.js": 2470, 
++    "browser/components/extensions/test/browser/browser_ext_windows_update.js": 5418, 
++    "browser/components/migration/tests/browser/browser_undo_notification.js": 3007, 
++    "browser/components/migration/tests/browser/browser_undo_notification_wording.js": 2986, 
++    "browser/components/newtab/tests/browser/browser_newtab_overrides.js": 3264, 
++    "browser/components/newtab/tests/browser/browser_newtabwebchannel.js": 5105, 
++    "browser/components/originattributes/test/browser/browser_blobURLIsolation.js": 6902, 
++    "browser/components/originattributes/test/browser/browser_broadcastChannel.js": 5799, 
++    "browser/components/originattributes/test/browser/browser_cache.js": 12837, 
++    "browser/components/originattributes/test/browser/browser_cacheAPI.js": 8477, 
++    "browser/components/originattributes/test/browser/browser_clientAuth.js": 8408, 
++    "browser/components/originattributes/test/browser/browser_cookieIsolation.js": 5274, 
++    "browser/components/originattributes/test/browser/browser_favicon_firstParty.js": 6393, 
++    "browser/components/originattributes/test/browser/browser_favicon_userContextId.js": 4564, 
++    "browser/components/originattributes/test/browser/browser_firstPartyIsolation.js": 10140, 
++    "browser/components/originattributes/test/browser/browser_firstPartyIsolation_aboutPages.js": 11985, 
++    "browser/components/originattributes/test/browser/browser_firstPartyIsolation_about_newtab.js": 2344, 
++    "browser/components/originattributes/test/browser/browser_firstPartyIsolation_blobURI.js": 2117, 
++    "browser/components/originattributes/test/browser/browser_firstPartyIsolation_js_uri.js": 3991, 
++    "browser/components/originattributes/test/browser/browser_httpauth.js": 20076, 
++    "browser/components/originattributes/test/browser/browser_imageCacheIsolation.js": 15875, 
++    "browser/components/originattributes/test/browser/browser_localStorageIsolation.js": 5394, 
++    "browser/components/originattributes/test/browser/browser_permissions.js": 13267, 
++    "browser/components/originattributes/test/browser/browser_sanitize.js": 14505, 
++    "browser/components/originattributes/test/browser/browser_sharedworker.js": 6506, 
++    "browser/components/originattributes/test/browser/browser_windowOpenerRestriction.js": 4139, 
++    "browser/components/places/tests/browser/browser_475045.js": 5785, 
++    "browser/components/places/tests/browser/browser_addBookmarkForFrame.js": 2496, 
++    "browser/components/places/tests/browser/browser_bookmarkProperties_addKeywordForThisSearch.js": 3234, 
++    "browser/components/places/tests/browser/browser_bookmarksProperties.js": 4167, 
++    "browser/components/places/tests/browser/browser_library_commands.js": 3626, 
++    "browser/components/places/tests/browser/browser_library_middleclick.js": 2452, 
++    "browser/components/places/tests/browser/browser_library_views_liveupdate.js": 6086, 
++    "browser/components/places/tests/browser/browser_sort_in_library.js": 1676, 
++    "browser/components/places/tests/browser/browser_views_iconsupdate.js": 7325, 
++    "browser/components/places/tests/browser/browser_views_liveupdate.js": 2458, 
++    "browser/components/preferences/in-content-new/tests/browser_advanced_update.js": 3290, 
++    "browser/components/preferences/in-content-new/tests/browser_applications_selection.js": 1843, 
++    "browser/components/preferences/in-content-new/tests/browser_basic_rebuild_fonts_test.js": 3097, 
++    "browser/components/preferences/in-content-new/tests/browser_bug1018066_resetScrollPosition.js": 1989, 
++    "browser/components/preferences/in-content-new/tests/browser_bug1020245_openPreferences_to_paneContent.js": 8840, 
++    "browser/components/preferences/in-content-new/tests/browser_bug1184989_prevent_scrolling_when_preferences_flipped.js": 2401, 
++    "browser/components/preferences/in-content-new/tests/browser_bug731866.js": 1921, 
++    "browser/components/preferences/in-content-new/tests/browser_bug795764_cachedisabled.js": 2138, 
++    "browser/components/preferences/in-content-new/tests/browser_checkspelling.js": 1859, 
+     "browser/components/preferences/in-content-new/tests/browser_connection.js": 2059, 
+-    "browser/components/preferences/in-content-new/tests/browser_connection_bug388287.js": 4792, 
++    "browser/components/preferences/in-content-new/tests/browser_connection_bug388287.js": 4090, 
++    "browser/components/preferences/in-content-new/tests/browser_cookies_dialog.js": 2371, 
+     "browser/components/preferences/in-content-new/tests/browser_cookies_exceptions.js": 24898, 
+-    "browser/components/preferences/in-content-new/tests/browser_defaultbrowser_alwayscheck.js": 3312, 
+-    "browser/components/preferences/in-content-new/tests/browser_homepages_filter_aboutpreferences.js": 2566, 
+-    "browser/components/preferences/in-content-new/tests/browser_permissions_urlFieldHidden.js": 3240, 
+-    "browser/components/preferences/in-content-new/tests/browser_privacypane_1.js": 12582, 
+-    "browser/components/preferences/in-content-new/tests/browser_privacypane_3.js": 11813, 
+-    "browser/components/preferences/in-content-new/tests/browser_privacypane_4.js": 19735, 
+-    "browser/components/preferences/in-content-new/tests/browser_privacypane_5.js": 11639, 
+-    "browser/components/preferences/in-content-new/tests/browser_privacypane_8.js": 11650, 
+-    "browser/components/preferences/in-content-new/tests/browser_proxy_backup.js": 2184, 
++    "browser/components/preferences/in-content-new/tests/browser_defaultbrowser_alwayscheck.js": 3679, 
++    "browser/components/preferences/in-content-new/tests/browser_homepages_filter_aboutpreferences.js": 2392, 
++    "browser/components/preferences/in-content-new/tests/browser_layersacceleration.js": 2023, 
++    "browser/components/preferences/in-content-new/tests/browser_password_management.js": 2241, 
++    "browser/components/preferences/in-content-new/tests/browser_performance_non_e10s.js": 5220, 
++    "browser/components/preferences/in-content-new/tests/browser_permissions_dialog.js": 4758, 
++    "browser/components/preferences/in-content-new/tests/browser_permissions_urlFieldHidden.js": 2816, 
++    "browser/components/preferences/in-content-new/tests/browser_privacypane_1.js": 15244, 
++    "browser/components/preferences/in-content-new/tests/browser_privacypane_3.js": 13945, 
++    "browser/components/preferences/in-content-new/tests/browser_privacypane_4.js": 24255, 
++    "browser/components/preferences/in-content-new/tests/browser_privacypane_5.js": 14253, 
++    "browser/components/preferences/in-content-new/tests/browser_privacypane_8.js": 14332, 
++    "browser/components/preferences/in-content-new/tests/browser_proxy_backup.js": 2385, 
+     "browser/components/preferences/in-content-new/tests/browser_sanitizeOnShutdown_prefLocked.js": 3107, 
+-    "browser/components/preferences/in-content-new/tests/browser_searchsuggestions.js": 2438, 
+-    "browser/components/preferences/in-content-new/tests/browser_security.js": 11804, 
+-    "browser/components/preferences/in-content-new/tests/browser_subdialogs.js": 8790, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_DownloadLastDirWithCPS.js": 6301, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_about.js": 4713, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_aboutHomeButtonAfterWindowClose.js": 3379, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_aboutSessionRestore.js": 3345, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_blobUrl.js": 3606, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_cache.js": 2957, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_certexceptionsui.js": 2477, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_concurrent.js": 7935, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_context_and_chromeFlags.js": 3542, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_crh.js": 3685, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_downloadLastDir.js": 4398, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_downloadLastDir_c.js": 4479, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_downloadLastDir_toggle.js": 9423, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_favicon.js": 9058, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_geoprompt.js": 5966, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_lastpbcontextexited.js": 5888, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_localStorage.js": 3665, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_localStorage_before_after.js": 4699, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_newtab_from_popup.js": 4326, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_noSessionRestoreMenuOption.js": 3144, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_nonbrowser.js": 2557, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_opendir.js": 2563, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_placesTitleNoUpdate.js": 3953, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_placestitle.js": 6580, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_popupblocker.js": 5971, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_protocolhandler.js": 5707, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_sidebar.js": 12408, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_ui.js": 3242, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_urlbarfocus.js": 3376, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_windowtitle.js": 25463, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_zoom.js": 3568, 
+-    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_zoomrestore.js": 3486, 
+-    "browser/components/safebrowsing/content/test/browser_bug400731.js": 1919, 
+-    "browser/components/safebrowsing/content/test/browser_bug415846.js": 1921, 
+-    "browser/components/search/test/browser_426329.js": 8841, 
+-    "browser/components/search/test/browser_aboutSearchReset.js": 4146, 
+-    "browser/components/search/test/browser_contextmenu.js": 2251, 
+-    "browser/components/search/test/browser_oneOffContextMenu.js": 1931, 
+-    "browser/components/search/test/browser_private_search_perwindowpb.js": 5217, 
+-    "browser/components/search/test/browser_searchbar_keyboard_navigation.js": 2679, 
+-    "browser/components/search/test/browser_searchbar_smallpanel_keyboard_navigation.js": 2229, 
+-    "browser/components/search/test/browser_webapi.js": 6207, 
+-    "browser/components/search/test/browser_yahoo_behavior.js": 2213, 
+-    "browser/components/sessionstore/test/browser_354894_perwindowpb.js": 31054, 
+-    "browser/components/sessionstore/test/browser_393716.js": 2257, 
+-    "browser/components/sessionstore/test/browser_394759_behavior.js": 18512, 
+-    "browser/components/sessionstore/test/browser_394759_perwindowpb.js": 6367, 
+-    "browser/components/sessionstore/test/browser_423132.js": 2267, 
+-    "browser/components/sessionstore/test/browser_463206.js": 2312, 
+-    "browser/components/sessionstore/test/browser_464199.js": 1996, 
+-    "browser/components/sessionstore/test/browser_465223.js": 1931, 
+-    "browser/components/sessionstore/test/browser_477657.js": 2209, 
+-    "browser/components/sessionstore/test/browser_480893.js": 2061, 
+-    "browser/components/sessionstore/test/browser_490040.js": 7018, 
+-    "browser/components/sessionstore/test/browser_491168.js": 2636, 
+-    "browser/components/sessionstore/test/browser_495495.js": 5815, 
+-    "browser/components/sessionstore/test/browser_500328.js": 2461, 
+-    "browser/components/sessionstore/test/browser_522545.js": 15600, 
+-    "browser/components/sessionstore/test/browser_524745.js": 2696, 
+-    "browser/components/sessionstore/test/browser_586068-apptabs.js": 4253, 
+-    "browser/components/sessionstore/test/browser_586068-apptabs_ondemand.js": 3099, 
+-    "browser/components/sessionstore/test/browser_586068-browser_state_interrupted.js": 7824, 
+-    "browser/components/sessionstore/test/browser_586068-cascade.js": 4403, 
+-    "browser/components/sessionstore/test/browser_586068-multi_window.js": 6783, 
+-    "browser/components/sessionstore/test/browser_586068-reload.js": 5703, 
+-    "browser/components/sessionstore/test/browser_586068-select.js": 5048, 
+-    "browser/components/sessionstore/test/browser_586068-window_state.js": 7307, 
+-    "browser/components/sessionstore/test/browser_586068-window_state_override.js": 5164, 
+-    "browser/components/sessionstore/test/browser_588426.js": 2657, 
+-    "browser/components/sessionstore/test/browser_590268.js": 8307, 
+-    "browser/components/sessionstore/test/browser_590563.js": 3125, 
+-    "browser/components/sessionstore/test/browser_595601-restore_hidden.js": 12818, 
+-    "browser/components/sessionstore/test/browser_599909.js": 2060, 
+-    "browser/components/sessionstore/test/browser_600545.js": 8725, 
+-    "browser/components/sessionstore/test/browser_601955.js": 5447, 
+-    "browser/components/sessionstore/test/browser_607016.js": 2705, 
++    "browser/components/preferences/in-content-new/tests/browser_search_subdialogs_within_preferences_1.js": 13910, 
++    "browser/components/preferences/in-content-new/tests/browser_search_subdialogs_within_preferences_2.js": 13239, 
++    "browser/components/preferences/in-content-new/tests/browser_search_subdialogs_within_preferences_3.js": 13673, 
++    "browser/components/preferences/in-content-new/tests/browser_search_subdialogs_within_preferences_4.js": 9131, 
++    "browser/components/preferences/in-content-new/tests/browser_search_subdialogs_within_preferences_5.js": 22181, 
++    "browser/components/preferences/in-content-new/tests/browser_search_subdialogs_within_preferences_6.js": 13954, 
++    "browser/components/preferences/in-content-new/tests/browser_search_subdialogs_within_preferences_7.js": 23086, 
++    "browser/components/preferences/in-content-new/tests/browser_search_subdialogs_within_preferences_8.js": 22394, 
++    "browser/components/preferences/in-content-new/tests/browser_search_within_preferences.js": 20032, 
++    "browser/components/preferences/in-content-new/tests/browser_search_within_preferences_1.js": 34601, 
++    "browser/components/preferences/in-content-new/tests/browser_search_within_preferences_2.js": 5227, 
++    "browser/components/preferences/in-content-new/tests/browser_search_within_preferences_command.js": 6537, 
++    "browser/components/preferences/in-content-new/tests/browser_searchsuggestions.js": 2732, 
++    "browser/components/preferences/in-content-new/tests/browser_security-1.js": 5409, 
++    "browser/components/preferences/in-content-new/tests/browser_security-2.js": 8491, 
++    "browser/components/preferences/in-content-new/tests/browser_security.js": 18246, 
++    "browser/components/preferences/in-content-new/tests/browser_siteData.js": 11940, 
++    "browser/components/preferences/in-content-new/tests/browser_siteData2.js": 11229, 
++    "browser/components/preferences/in-content-new/tests/browser_site_login_exceptions.js": 2663, 
++    "browser/components/preferences/in-content-new/tests/browser_subdialogs.js": 6833, 
++    "browser/components/preferences/in-content/tests/browser_advanced_update.js": 2525, 
++    "browser/components/preferences/in-content/tests/browser_basic_rebuild_fonts_test.js": 2006, 
++    "browser/components/preferences/in-content/tests/browser_bug1020245_openPreferences_to_paneContent.js": 4426, 
++    "browser/components/preferences/in-content/tests/browser_bug1184989_prevent_scrolling_when_preferences_flipped.js": 1867, 
++    "browser/components/preferences/in-content/tests/browser_bug731866.js": 2132, 
++    "browser/components/preferences/in-content/tests/browser_connection_bug388287.js": 3073, 
++    "browser/components/preferences/in-content/tests/browser_cookies_exceptions.js": 16910, 
++    "browser/components/preferences/in-content/tests/browser_defaultbrowser_alwayscheck.js": 2030, 
++    "browser/components/preferences/in-content/tests/browser_layersacceleration.js": 2643, 
++    "browser/components/preferences/in-content/tests/browser_masterpassword.js": 2177, 
++    "browser/components/preferences/in-content/tests/browser_performance_non_e10s.js": 2873, 
++    "browser/components/preferences/in-content/tests/browser_permissions_dialog.js": 5092, 
++    "browser/components/preferences/in-content/tests/browser_permissions_urlFieldHidden.js": 2608, 
++    "browser/components/preferences/in-content/tests/browser_privacypane_1.js": 9307, 
++    "browser/components/preferences/in-content/tests/browser_privacypane_3.js": 7777, 
++    "browser/components/preferences/in-content/tests/browser_privacypane_4.js": 13047, 
++    "browser/components/preferences/in-content/tests/browser_privacypane_5.js": 7806, 
++    "browser/components/preferences/in-content/tests/browser_privacypane_8.js": 8973, 
++    "browser/components/preferences/in-content/tests/browser_sanitizeOnShutdown_prefLocked.js": 1989, 
++    "browser/components/preferences/in-content/tests/browser_search_subdialogs_within_preferences_1.js": 16248, 
++    "browser/components/preferences/in-content/tests/browser_search_subdialogs_within_preferences_2.js": 15445, 
++    "browser/components/preferences/in-content/tests/browser_search_subdialogs_within_preferences_3.js": 14932, 
++    "browser/components/preferences/in-content/tests/browser_search_subdialogs_within_preferences_4.js": 15279, 
++    "browser/components/preferences/in-content/tests/browser_search_subdialogs_within_preferences_5.js": 22973, 
++    "browser/components/preferences/in-content/tests/browser_search_subdialogs_within_preferences_6.js": 13365, 
++    "browser/components/preferences/in-content/tests/browser_search_subdialogs_within_preferences_7.js": 24250, 
++    "browser/components/preferences/in-content/tests/browser_search_subdialogs_within_preferences_8.js": 22520, 
++    "browser/components/preferences/in-content/tests/browser_search_within_preferences_1.js": 50372, 
++    "browser/components/preferences/in-content/tests/browser_search_within_preferences_2.js": 9072, 
++    "browser/components/preferences/in-content/tests/browser_search_within_preferences_command.js": 5140, 
++    "browser/components/preferences/in-content/tests/browser_searchsuggestions.js": 1809, 
++    "browser/components/preferences/in-content/tests/browser_security-1.js": 3731, 
++    "browser/components/preferences/in-content/tests/browser_security-2.js": 8070, 
++    "browser/components/preferences/in-content/tests/browser_security.js": 6126, 
++    "browser/components/preferences/in-content/tests/browser_siteData.js": 9382, 
++    "browser/components/preferences/in-content/tests/browser_siteData2.js": 7196, 
++    "browser/components/preferences/in-content/tests/browser_site_login_exceptions.js": 1775, 
++    "browser/components/preferences/in-content/tests/browser_subdialogs.js": 7190, 
++    "browser/components/privatebrowsing/test/browser/browser_oa_private_browsing_window.js": 1890, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_DownloadLastDirWithCPS.js": 3790, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_about.js": 3235, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_aboutHomeButtonAfterWindowClose.js": 2334, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_aboutSessionRestore.js": 2264, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_blobUrl.js": 2244, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_cache.js": 1760, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_certexceptionsui.js": 1700, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_concurrent.js": 6345, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_context_and_chromeFlags.js": 2106, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_crh.js": 3917, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_downloadLastDir.js": 3020, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_downloadLastDir_c.js": 3063, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_downloadLastDir_toggle.js": 6742, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_favicon.js": 5373, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_geoprompt.js": 5226, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_lastpbcontextexited.js": 5495, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_localStorage.js": 2229, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_localStorage_before_after.js": 4077, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_newtab_from_popup.js": 2898, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_noSessionRestoreMenuOption.js": 2315, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_nonbrowser.js": 1709, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_opendir.js": 2023, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_placesTitleNoUpdate.js": 3019, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_placestitle.js": 4992, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_popupblocker.js": 4267, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_protocolhandler.js": 4212, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_sidebar.js": 9001, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_ui.js": 2497, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_urlbarfocus.js": 2494, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_windowtitle.js": 18395, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_zoom.js": 2876, 
++    "browser/components/privatebrowsing/test/browser/browser_privatebrowsing_zoomrestore.js": 2994, 
++    "browser/components/resistfingerprinting/test/browser/browser_roundedWindow_newWindow.js": 2858, 
++    "browser/components/resistfingerprinting/test/browser/browser_roundedWindow_open_max.js": 8490, 
++    "browser/components/resistfingerprinting/test/browser/browser_roundedWindow_open_mid.js": 8568, 
++    "browser/components/resistfingerprinting/test/browser/browser_roundedWindow_open_min.js": 7621, 
++    "browser/components/resistfingerprinting/test/browser/browser_roundedWindow_windowSetting_max.js": 11149, 
++    "browser/components/resistfingerprinting/test/browser/browser_roundedWindow_windowSetting_mid.js": 9767, 
++    "browser/components/resistfingerprinting/test/browser/browser_roundedWindow_windowSetting_min.js": 7897, 
++    "browser/components/search/test/browser_426329.js": 7373, 
++    "browser/components/search/test/browser_aboutSearchReset.js": 3275, 
++    "browser/components/search/test/browser_private_search_perwindowpb.js": 3648, 
++    "browser/components/search/test/browser_searchEngine_behaviors.js": 4545, 
++    "browser/components/search/test/browser_searchbar_keyboard_navigation.js": 2080, 
++    "browser/components/search/test/browser_searchbar_openpopup.js": 4084, 
++    "browser/components/search/test/browser_webapi.js": 4193, 
++    "browser/components/sessionstore/test/browser_354894_perwindowpb.js": 17297, 
++    "browser/components/sessionstore/test/browser_394759_behavior.js": 11682, 
++    "browser/components/sessionstore/test/browser_394759_perwindowpb.js": 3049, 
++    "browser/components/sessionstore/test/browser_465223.js": 1666, 
++    "browser/components/sessionstore/test/browser_477657.js": 1878, 
++    "browser/components/sessionstore/test/browser_490040.js": 5025, 
++    "browser/components/sessionstore/test/browser_495495.js": 3594, 
++    "browser/components/sessionstore/test/browser_522545.js": 12227, 
++    "browser/components/sessionstore/test/browser_524745.js": 1659, 
++    "browser/components/sessionstore/test/browser_586068-apptabs.js": 1917, 
++    "browser/components/sessionstore/test/browser_586068-browser_state_interrupted.js": 4496, 
++    "browser/components/sessionstore/test/browser_586068-cascade.js": 3022, 
++    "browser/components/sessionstore/test/browser_586068-multi_window.js": 5276, 
++    "browser/components/sessionstore/test/browser_586068-reload.js": 6062, 
++    "browser/components/sessionstore/test/browser_586068-select.js": 3252, 
++    "browser/components/sessionstore/test/browser_586068-window_state.js": 3799, 
++    "browser/components/sessionstore/test/browser_586068-window_state_override.js": 4089, 
++    "browser/components/sessionstore/test/browser_588426.js": 2311, 
++    "browser/components/sessionstore/test/browser_590268.js": 6137, 
++    "browser/components/sessionstore/test/browser_590563.js": 4725, 
++    "browser/components/sessionstore/test/browser_595601-restore_hidden.js": 7202, 
++    "browser/components/sessionstore/test/browser_599909.js": 3039, 
++    "browser/components/sessionstore/test/browser_600545.js": 4944, 
++    "browser/components/sessionstore/test/browser_601955.js": 4497, 
++    "browser/components/sessionstore/test/browser_607016.js": 2040, 
+     "browser/components/sessionstore/test/browser_615394-SSWindowState_events.js": 23104, 
++    "browser/components/sessionstore/test/browser_615394-SSWindowState_events_duplicateTab.js": 1754, 
++    "browser/components/sessionstore/test/browser_615394-SSWindowState_events_setBrowserState.js": 4635, 
++    "browser/components/sessionstore/test/browser_615394-SSWindowState_events_setWindowState.js": 1686, 
++    "browser/components/sessionstore/test/browser_615394-SSWindowState_events_undoCloseWindow.js": 5699, 
++    "browser/components/sessionstore/test/browser_618151.js": 2170, 
+     "browser/components/sessionstore/test/browser_625016.js": 2891, 
+-    "browser/components/sessionstore/test/browser_635418.js": 5002, 
+-    "browser/components/sessionstore/test/browser_636279.js": 2253, 
+-    "browser/components/sessionstore/test/browser_637020.js": 3577, 
+-    "browser/components/sessionstore/test/browser_644409-scratchpads.js": 4627, 
+-    "browser/components/sessionstore/test/browser_662743.js": 4474, 
+-    "browser/components/sessionstore/test/browser_701377.js": 2504, 
+-    "browser/components/sessionstore/test/browser_819510_perwindowpb.js": 23642, 
+-    "browser/components/sessionstore/test/browser_911547.js": 2187, 
+-    "browser/components/sessionstore/test/browser_aboutSessionRestore.js": 2603, 
+-    "browser/components/sessionstore/test/browser_async_duplicate_tab.js": 2606, 
+-    "browser/components/sessionstore/test/browser_async_window_flushing.js": 6549, 
+-    "browser/components/sessionstore/test/browser_backup_recovery.js": 11615, 
+-    "browser/components/sessionstore/test/browser_broadcast.js": 8420, 
+-    "browser/components/sessionstore/test/browser_cleaner.js": 9836, 
+-    "browser/components/sessionstore/test/browser_closed_objects_changed_notifications_tabs.js": 9435, 
+-    "browser/components/sessionstore/test/browser_closed_objects_changed_notifications_windows.js": 14452, 
+-    "browser/components/sessionstore/test/browser_cookies.js": 20675, 
++    "browser/components/sessionstore/test/browser_635418.js": 4287, 
++    "browser/components/sessionstore/test/browser_636279.js": 2676, 
++    "browser/components/sessionstore/test/browser_637020.js": 2693, 
++    "browser/components/sessionstore/test/browser_644409-scratchpads.js": 4326, 
++    "browser/components/sessionstore/test/browser_662743.js": 3351, 
++    "browser/components/sessionstore/test/browser_819510_perwindowpb.js": 14972, 
++    "browser/components/sessionstore/test/browser_906076_lazy_tabs.js": 13059, 
++    "browser/components/sessionstore/test/browser_async_window_flushing.js": 3215, 
++    "browser/components/sessionstore/test/browser_backup_recovery.js": 4538, 
++    "browser/components/sessionstore/test/browser_broadcast.js": 4129, 
++    "browser/components/sessionstore/test/browser_cleaner.js": 5964, 
++    "browser/components/sessionstore/test/browser_closed_objects_changed_notifications_tabs.js": 4446, 
++    "browser/components/sessionstore/test/browser_closed_objects_changed_notifications_windows.js": 7155, 
++    "browser/components/sessionstore/test/browser_cookies.js": 2520, 
++    "browser/components/sessionstore/test/browser_cookies_legacy.js": 1781, 
+     "browser/components/sessionstore/test/browser_docshell_uuid_consistency.js": 1991, 
+-    "browser/components/sessionstore/test/browser_dying_cache.js": 2972, 
+-    "browser/components/sessionstore/test/browser_forget_async_closings.js": 6728, 
+-    "browser/components/sessionstore/test/browser_formdata.js": 7492, 
+-    "browser/components/sessionstore/test/browser_formdata_cc.js": 29674, 
+-    "browser/components/sessionstore/test/browser_formdata_format.js": 10315, 
+-    "browser/components/sessionstore/test/browser_formdata_xpath.js": 2650, 
+-    "browser/components/sessionstore/test/browser_frame_history.js": 5986, 
+-    "browser/components/sessionstore/test/browser_frametree.js": 3151, 
+-    "browser/components/sessionstore/test/browser_history_persist.js": 2496, 
+-    "browser/components/sessionstore/test/browser_merge_closed_tabs.js": 2586, 
+-    "browser/components/sessionstore/test/browser_newtab_userTypedValue.js": 27350, 
++    "browser/components/sessionstore/test/browser_forget_async_closings.js": 3595, 
++    "browser/components/sessionstore/test/browser_formdata.js": 4108, 
++    "browser/components/sessionstore/test/browser_formdata_cc.js": 21200, 
++    "browser/components/sessionstore/test/browser_formdata_format.js": 6550, 
++    "browser/components/sessionstore/test/browser_formdata_xpath.js": 1704, 
++    "browser/components/sessionstore/test/browser_frame_history.js": 3096, 
++    "browser/components/sessionstore/test/browser_frametree.js": 1818, 
++    "browser/components/sessionstore/test/browser_merge_closed_tabs.js": 2014, 
++    "browser/components/sessionstore/test/browser_newtab_userTypedValue.js": 18470, 
++    "browser/components/sessionstore/test/browser_not_collect_when_idle.js": 6593, 
+     "browser/components/sessionstore/test/browser_pageStyle.js": 8178, 
+-    "browser/components/sessionstore/test/browser_privatetabs.js": 7866, 
+-    "browser/components/sessionstore/test/browser_purge_shistory.js": 2055, 
+-    "browser/components/sessionstore/test/browser_replace_load.js": 2189, 
+-    "browser/components/sessionstore/test/browser_restore_cookies_noOriginAttributes.js": 2962, 
+-    "browser/components/sessionstore/test/browser_restore_redirect.js": 2148, 
+-    "browser/components/sessionstore/test/browser_scrollPositions.js": 31762, 
+-    "browser/components/sessionstore/test/browser_scrollPositionsReaderMode.js": 9403, 
+-    "browser/components/sessionstore/test/browser_sessionHistory.js": 7939, 
+-    "browser/components/sessionstore/test/browser_sessionStorage.js": 7579, 
+-    "browser/components/sessionstore/test/browser_sessionStoreContainer.js": 12959, 
+-    "browser/components/sessionstore/test/browser_swapDocShells.js": 3819, 
+-    "browser/components/sessionstore/test/browser_undoCloseById.js": 5522, 
+-    "browser/components/sessionstore/test/browser_windowRestore_perwindowpb.js": 1935, 
+-    "browser/components/sessionstore/test/browser_windowStateContainer.js": 21687, 
+-    "browser/components/syncedtabs/test/browser/browser_sidebar_syncedtabslist.js": 2649, 
+-    "browser/components/translation/test/browser_translation_bing.js": 2069, 
+-    "browser/components/translation/test/browser_translation_exceptions.js": 4586, 
+-    "browser/components/translation/test/browser_translation_telemetry.js": 9736, 
+-    "browser/components/translation/test/browser_translation_yandex.js": 3022, 
+-    "browser/extensions/loop/chrome/test/mochitest/browser_LoopRooms_channel.js": 3910, 
+-    "browser/extensions/loop/chrome/test/mochitest/browser_fxa_login.js": 11542, 
+-    "browser/extensions/loop/chrome/test/mochitest/browser_mozLoop_chat.js": 5094, 
+-    "browser/extensions/loop/chrome/test/mochitest/browser_mozLoop_sharingListeners.js": 2227, 
+-    "browser/extensions/loop/chrome/test/mochitest/browser_toolbarbutton.js": 3852, 
+-    "browser/extensions/pdfjs/test/browser_pdfjs_main.js": 6113, 
+-    "browser/extensions/pdfjs/test/browser_pdfjs_navigation.js": 8730, 
+-    "browser/extensions/pdfjs/test/browser_pdfjs_views.js": 5372, 
+-    "browser/extensions/pdfjs/test/browser_pdfjs_zoom.js": 9760, 
+-    "browser/extensions/pocket/test/browser_pocket_ui_check.js": 2012, 
+-    "browser/extensions/shield-recipe-client/test/browser_Heartbeat.js": 7131, 
+-    "browser/modules/test/browser_CaptivePortalWatcher.js": 13616, 
++    "browser/components/sessionstore/test/browser_privatetabs.js": 3832, 
++    "browser/components/sessionstore/test/browser_restore_cookies_noOriginAttributes.js": 1714, 
++    "browser/components/sessionstore/test/browser_restore_reversed_z_order.js": 8671, 
++    "browser/components/sessionstore/test/browser_scrollPositions.js": 22016, 
++    "browser/components/sessionstore/test/browser_scrollPositionsReaderMode.js": 6067, 
++    "browser/components/sessionstore/test/browser_sessionHistory.js": 4965, 
++    "browser/components/sessionstore/test/browser_sessionStorage.js": 4332, 
++    "browser/components/sessionstore/test/browser_sessionStoreContainer.js": 5611, 
++    "browser/components/sessionstore/test/browser_speculative_connect.js": 6804, 
++    "browser/components/sessionstore/test/browser_swapDocShells.js": 1994, 
++    "browser/components/sessionstore/test/browser_tab_label_during_restore.js": 2828, 
++    "browser/components/sessionstore/test/browser_windowStateContainer.js": 11372, 
++    "browser/components/syncedtabs/test/browser/browser_sidebar_syncedtabslist.js": 1677, 
++    "browser/components/translation/test/browser_translation_exceptions.js": 3250, 
++    "browser/components/translation/test/browser_translation_telemetry.js": 6445, 
++    "browser/extensions/formautofill/test/browser/browser_autocomplete_footer.js": 13953, 
++    "browser/extensions/formautofill/test/browser/browser_autocomplete_marked_back_forward.js": 6186, 
++    "browser/extensions/formautofill/test/browser/browser_autocomplete_marked_detached_tab.js": 4110, 
++    "browser/extensions/formautofill/test/browser/browser_dropdown_layout.js": 7063, 
++    "browser/extensions/formautofill/test/browser/browser_first_time_use_doorhanger.js": 5167, 
++    "browser/extensions/formautofill/test/browser/browser_insecure_form.js": 16973, 
++    "browser/extensions/formautofill/test/browser/browser_privacyPreferences.js": 4360, 
++    "browser/extensions/formautofill/test/browser/browser_submission_in_private_mode.js": 2484, 
++    "browser/extensions/formautofill/test/browser/browser_update_doorhanger.js": 20453, 
++    "browser/extensions/pdfjs/test/browser_pdfjs_main.js": 3613, 
++    "browser/extensions/pdfjs/test/browser_pdfjs_navigation.js": 4838, 
++    "browser/extensions/pdfjs/test/browser_pdfjs_views.js": 4281, 
++    "browser/extensions/pdfjs/test/browser_pdfjs_zoom.js": 5317, 
++    "browser/modules/test/browser/browser_ContentSearch.js": 3184, 
++    "browser/modules/test/browser/browser_PageActions.js": 4615, 
++    "browser/modules/test/browser/browser_PermissionUI.js": 5472, 
++    "browser/modules/test/browser/browser_PermissionUI_prompts.js": 2617, 
++    "browser/modules/test/browser/browser_SitePermissions_combinations.js": 1937, 
++    "browser/modules/test/browser/browser_SitePermissions_tab_urls.js": 11488, 
++    "browser/modules/test/browser/browser_UnsubmittedCrashHandler.js": 3304, 
++    "browser/modules/test/browser/browser_UsageTelemetry.js": 9446, 
++    "browser/modules/test/browser/browser_UsageTelemetry_content.js": 2519, 
++    "browser/modules/test/browser/browser_UsageTelemetry_content_aboutHome.js": 1892, 
++    "browser/modules/test/browser/browser_UsageTelemetry_private_and_restore.js": 2310, 
++    "browser/modules/test/browser/browser_UsageTelemetry_searchbar.js": 5740, 
++    "browser/modules/test/browser/browser_UsageTelemetry_urlbar.js": 6699, 
+     "browser/modules/test/browser_ContentSearch.js": 5221, 
+-    "browser/modules/test/browser_NetworkPrioritizer.js": 4842, 
+-    "browser/modules/test/browser_PermissionUI.js": 4839, 
+-    "browser/modules/test/browser_UnsubmittedCrashHandler.js": 3442, 
+-    "browser/modules/test/browser_UsageTelemetry.js": 12643, 
+-    "browser/modules/test/browser_UsageTelemetry_content.js": 3285, 
+-    "browser/modules/test/browser_UsageTelemetry_content_aboutHome.js": 2240, 
+-    "browser/modules/test/browser_UsageTelemetry_private_and_restore.js": 2664, 
+-    "browser/modules/test/browser_UsageTelemetry_searchbar.js": 4280, 
+-    "browser/modules/test/browser_UsageTelemetry_urlbar.js": 6533, 
+-    "docshell/test/browser/browser_bug388121-2.js": 2635, 
+-    "docshell/test/browser/browser_bug422543.js": 2484, 
++    "browser/modules/test/browser_NetworkPrioritizer.js": 4005, 
++    "browser/modules/test/browser_PermissionUI.js": 4020, 
++    "browser/modules/test/browser_UnsubmittedCrashHandler.js": 2842, 
++    "browser/modules/test/browser_UsageTelemetry.js": 9979, 
++    "browser/modules/test/browser_UsageTelemetry_content.js": 3073, 
++    "browser/modules/test/browser_UsageTelemetry_content_aboutHome.js": 1812, 
++    "browser/modules/test/browser_UsageTelemetry_private_and_restore.js": 2215, 
++    "browser/modules/test/browser_UsageTelemetry_searchbar.js": 3575, 
++    "browser/modules/test/browser_UsageTelemetry_urlbar.js": 5256, 
++    "docshell/test/browser/browser_bug1347823.js": 4094, 
++    "docshell/test/browser/browser_bug388121-2.js": 1964, 
++    "docshell/test/browser/browser_bug422543.js": 1760, 
+     "docshell/test/browser/browser_bug852909.js": 1992, 
+-    "docshell/test/browser/browser_onbeforeunload_navigation.js": 4636, 
+-    "docshell/test/browser/browser_timelineMarkers-03.js": 6194, 
+-    "docshell/test/browser/browser_uriFixupIntegration.js": 2103, 
+-    "docshell/test/navigation/browser_bug343515.js": 3292, 
+-    "docshell/test/navigation/browser_test-content-chromeflags.js": 1978, 
+-    "dom/base/test/browser_bug1058164.js": 2748, 
+-    "dom/base/test/browser_bug1307747.js": 2805, 
+-    "dom/base/test/browser_use_counters.js": 23404, 
+-    "dom/broadcastchannel/tests/browser_private_browsing.js": 4978, 
+-    "dom/html/test/browser_bug1108547.js": 13316, 
+-    "dom/html/test/browser_fullscreen-contextmenu-esc.js": 2445, 
+-    "dom/indexedDB/test/browser_forgetThisSite.js": 4885, 
+-    "dom/indexedDB/test/browser_permissionsPromptAllow.js": 1920, 
+-    "dom/indexedDB/test/browser_permissionsPromptDeny.js": 3954, 
+-    "dom/indexedDB/test/browser_permissionsPromptWorker.js": 2071, 
+-    "dom/indexedDB/test/browser_perwindow_privateBrowsing.js": 2972, 
+-    "dom/ipc/tests/browser_domainPolicy.js": 9706, 
+-    "dom/manifest/test/browser_ManifestFinder_browserHasManifestLink.js": 2363, 
+-    "dom/manifest/test/browser_ManifestObtainer_obtain.js": 18836, 
++    "docshell/test/browser/browser_onbeforeunload_navigation.js": 2620, 
++    "docshell/test/browser/browser_timelineMarkers-03.js": 8009, 
++    "docshell/test/browser/browser_uriFixupAlternateRedirects.js": 2253, 
++    "docshell/test/navigation/browser_bug343515.js": 2104, 
++    "dom/base/test/browser_blocking_image.js": 1709, 
++    "dom/base/test/browser_bug1058164.js": 1793, 
++    "dom/base/test/browser_bug1303838.js": 9126, 
++    "dom/base/test/browser_bug1307747.js": 2425, 
++    "dom/base/test/browser_timeout_throttling_with_audio_playback.js": 2901, 
++    "dom/base/test/browser_use_counters.js": 25361, 
++    "dom/broadcastchannel/tests/browser_private_browsing.js": 3134, 
++    "dom/cache/test/mochitest/browser_cache_pb_window.js": 1638, 
++    "dom/file/ipc/tests/browser_ipcBlob.js": 5901, 
++    "dom/html/test/browser_bug1108547.js": 8889, 
++    "dom/html/test/browser_fullscreen-contextmenu-esc.js": 1836, 
++    "dom/indexedDB/test/browser_forgetThisSite.js": 2928, 
++    "dom/indexedDB/test/browser_permissionsPromptDeny.js": 2509, 
++    "dom/indexedDB/test/browser_perwindow_privateBrowsing.js": 1761, 
++    "dom/ipc/tests/browser_domainPolicy.js": 5685, 
++    "dom/manifest/test/browser_ManifestObtainer_obtain.js": 11397, 
+     "dom/media/webaudio/test/browser_bug1181073.js": 4083, 
+-    "dom/notification/test/browser/browser_permission_dismiss.js": 2250, 
+-    "dom/power/test/browser_wakelocks.js": 4354, 
+-    "dom/security/test/contentverifier/browser_verify_content_about_newtab.js": 12181, 
+-    "dom/security/test/contentverifier/browser_verify_content_about_newtab2.js": 10284, 
+-    "dom/security/test/csp/browser_manifest-src-override-default-src.js": 1939, 
+-    "dom/security/test/csp/browser_test_web_manifest.js": 5639, 
+-    "dom/tests/browser/browser_ConsoleAPITests.js": 3520, 
+-    "dom/tests/browser/browser_ConsoleStoragePBTest_perwindowpb.js": 2914, 
+-    "dom/tests/browser/browser_bug396843.js": 6050, 
++    "dom/notification/test/browser/browser_permission_dismiss.js": 1940, 
++    "dom/power/test/browser_wakelocks.js": 2666, 
++    "dom/quota/test/browser_globalLimitValidation.js": 26569, 
++    "dom/quota/test/browser_permissionsPromptAllow.js": 1638, 
++    "dom/security/test/contentverifier/browser_verify_content_about_newtab.js": 9485, 
++    "dom/security/test/contentverifier/browser_verify_content_about_newtab2.js": 7915, 
++    "dom/security/test/cors/browser_CORS-console-warnings.js": 22469, 
++    "dom/security/test/csp/browser_test_web_manifest.js": 3266, 
++    "dom/tests/browser/browser_ConsoleAPITests.js": 2336, 
++    "dom/tests/browser/browser_ConsoleStorageAPITests.js": 1843, 
++    "dom/tests/browser/browser_ConsoleStoragePBTest_perwindowpb.js": 2170, 
++    "dom/tests/browser/browser_bug396843.js": 3369, 
+     "dom/tests/browser/browser_focus_steal_from_chrome.js": 24015, 
+-    "dom/tests/browser/browser_localStorage_privatestorageevent.js": 4393, 
++    "dom/tests/browser/browser_localStorage_privatestorageevent.js": 3038, 
++    "dom/tests/browser/browser_noopener.js": 243905, 
+     "dom/tests/browser/browser_test_new_window_from_content.js": 31428, 
+-    "dom/tests/browser/browser_test_toolbars_visibility.js": 7831, 
+-    "dom/workers/test/serviceworkers/browser_download.js": 2556, 
+-    "editor/libeditor/tests/browser_bug527935.js": 2560, 
+-    "embedding/components/windowwatcher/test/browser_new_content_window_chromeflags.js": 3909, 
+-    "embedding/components/windowwatcher/test/browser_new_content_window_from_chrome_principal.js": 2168, 
+-    "embedding/components/windowwatcher/test/browser_new_sized_window.js": 4285, 
+-    "embedding/test/browser_bug1204626.js": 5652, 
+-    "layout/base/tests/browser_bug617076.js": 2453, 
+-    "layout/base/tests/browser_disableDialogs_onbeforeunload.js": 2230, 
+-    "layout/base/tests/browser_onbeforeunload_only_after_interaction.js": 2284, 
+-    "layout/base/tests/browser_onbeforeunload_only_after_interaction_in_frame.js": 2441, 
+-    "netwerk/cookie/test/browser/browser_originattributes.js": 5489, 
+-    "netwerk/test/browser/browser_child_resource.js": 2440, 
+-    "security/manager/ssl/tests/mochitest/browser/browser_bug627234_perwindowpb.js": 4724, 
+-    "security/manager/ssl/tests/mochitest/browser/browser_certViewer.js": 6507, 
+-    "security/manager/ssl/tests/mochitest/browser/browser_clientAuth_connection.js": 3321, 
+-    "security/manager/ssl/tests/mochitest/browser/browser_deleteCert_ui.js": 2969, 
+-    "testing/mochitest/tests/browser/browser_async.js": 10083, 
+-    "testing/mochitest/tests/browser/browser_browserLoaded_content_loaded.js": 2864, 
+-    "testing/mochitest/tests/browser/browser_waitForFocus.js": 2067, 
+-    "toolkit/components/aboutperformance/tests/browser/browser_aboutperformance.js": 8669, 
+-    "toolkit/components/addoncompat/tests/browser/browser_addonShims.js": 6424, 
+-    "toolkit/components/narrate/test/browser_narrate.js": 3896, 
+-    "toolkit/components/narrate/test/browser_narrate_disable.js": 2528, 
+-    "toolkit/components/narrate/test/browser_narrate_language.js": 2241, 
+-    "toolkit/components/narrate/test/browser_voiceselect.js": 3199, 
+-    "toolkit/components/narrate/test/browser_word_highlight.js": 3436, 
+-    "toolkit/components/passwordmgr/test/browser/browser_capture_doorhanger.js": 30201, 
+-    "toolkit/components/passwordmgr/test/browser/browser_capture_doorhanger_httpsUpgrade.js": 5048, 
+-    "toolkit/components/passwordmgr/test/browser/browser_capture_doorhanger_window_open.js": 9295, 
+-    "toolkit/components/passwordmgr/test/browser/browser_context_menu.js": 14753, 
+-    "toolkit/components/passwordmgr/test/browser/browser_formless_submit_chrome.js": 5973, 
+-    "toolkit/components/passwordmgr/test/browser/browser_hasInsecureLoginForms.js": 2667, 
+-    "toolkit/components/passwordmgr/test/browser/browser_http_autofill.js": 4404, 
+-    "toolkit/components/passwordmgr/test/browser/browser_insecurePasswordWarning.js": 9300, 
+-    "toolkit/components/passwordmgr/test/browser/browser_notifications.js": 3980, 
+-    "toolkit/components/passwordmgr/test/browser/browser_notifications_password.js": 4966, 
+-    "toolkit/components/passwordmgr/test/browser/browser_notifications_username.js": 7874, 
+-    "toolkit/components/passwordmgr/test/browser/browser_passwordmgrdlg.js": 8504, 
+-    "toolkit/components/passwordmgr/test/browser/browser_username_select_dialog.js": 3380, 
+-    "toolkit/components/perfmonitoring/tests/browser/browser_AddonWatcher.js": 2539, 
++    "dom/tests/browser/browser_test_toolbars_visibility.js": 7358, 
++    "dom/workers/test/serviceworkers/browser_download.js": 1695, 
++    "editor/libeditor/tests/browser_bug527935.js": 1811, 
++    "embedding/components/windowwatcher/test/browser_new_content_window_chromeflags.js": 3230, 
++    "embedding/components/windowwatcher/test/browser_new_sized_window.js": 2576, 
++    "embedding/test/browser_bug1204626.js": 4311, 
++    "netwerk/cookie/test/browser/browser_originattributes.js": 3252, 
++    "security/manager/ssl/tests/mochitest/browser/browser_bug627234_perwindowpb.js": 3135, 
++    "security/manager/ssl/tests/mochitest/browser/browser_certViewer.js": 3220, 
++    "security/manager/ssl/tests/mochitest/browser/browser_clientAuth_connection.js": 2066, 
++    "services/fxaccounts/tests/browser/browser_device_connected.js": 3094, 
++    "services/fxaccounts/tests/browser/browser_verify_login.js": 1763, 
++    "toolkit/components/aboutperformance/tests/browser/browser_aboutperformance.js": 6246, 
++    "toolkit/components/addoncompat/tests/browser/browser_addonShims.js": 3823, 
++    "toolkit/components/extensions/test/browser/browser_ext_management_themes.js": 2922, 
++    "toolkit/components/extensions/test/browser/browser_ext_themes_persistence.js": 1948, 
++    "toolkit/components/downloads/test/browser/browser_DownloadPDFSaver.js": 4102, 
++    "toolkit/components/narrate/test/browser_narrate.js": 2700, 
++    "toolkit/components/narrate/test/browser_voiceselect.js": 2254, 
++    "toolkit/components/narrate/test/browser_word_highlight.js": 2215, 
++    "toolkit/components/passwordmgr/test/browser/browser_capture_doorhanger.js": 15909, 
++    "toolkit/components/passwordmgr/test/browser/browser_capture_doorhanger_httpsUpgrade.js": 3296, 
++    "toolkit/components/passwordmgr/test/browser/browser_capture_doorhanger_window_open.js": 4673, 
++    "toolkit/components/passwordmgr/test/browser/browser_context_menu.js": 12686, 
++    "toolkit/components/passwordmgr/test/browser/browser_context_menu_autocomplete_interaction.js": 3297, 
++    "toolkit/components/passwordmgr/test/browser/browser_formless_submit_chrome.js": 4008, 
++    "toolkit/components/passwordmgr/test/browser/browser_hasInsecureLoginForms.js": 1889, 
++    "toolkit/components/passwordmgr/test/browser/browser_http_autofill.js": 2781, 
++    "toolkit/components/passwordmgr/test/browser/browser_insecurePasswordConsoleWarning.js": 6160, 
++    "toolkit/components/passwordmgr/test/browser/browser_master_password_autocomplete.js": 5787, 
++    "toolkit/components/passwordmgr/test/browser/browser_notifications.js": 3055, 
++    "toolkit/components/passwordmgr/test/browser/browser_notifications_password.js": 3558, 
++    "toolkit/components/passwordmgr/test/browser/browser_notifications_username.js": 5535, 
++    "toolkit/components/passwordmgr/test/browser/browser_passwordmgrdlg.js": 4065, 
++    "toolkit/components/passwordmgr/test/browser/browser_username_select_dialog.js": 2468, 
++    "toolkit/components/perfmonitoring/tests/browser/browser_AddonWatcher.js": 2274, 
+     "toolkit/components/perfmonitoring/tests/browser/browser_addonPerformanceAlerts.js": 23826, 
+     "toolkit/components/perfmonitoring/tests/browser/browser_addonPerformanceAlerts_2.js": 5789, 
+-    "toolkit/components/perfmonitoring/tests/browser/browser_compartments.js": 5699, 
+-    "toolkit/components/perfmonitoring/tests/browser/browser_webpagePerformanceAlerts.js": 35101, 
+-    "toolkit/components/places/tests/browser/browser_bug248970.js": 6353, 
+-    "toolkit/components/places/tests/browser/browser_bug399606.js": 8916, 
+-    "toolkit/components/places/tests/browser/browser_bug461710.js": 4239, 
+-    "toolkit/components/places/tests/browser/browser_favicon_setAndFetchFaviconForPage.js": 5677, 
+-    "toolkit/components/places/tests/browser/browser_favicon_setAndFetchFaviconForPage_failures.js": 10364, 
+-    "toolkit/components/places/tests/browser/browser_visituri_privatebrowsing_perwindowpb.js": 3319, 
+-    "toolkit/components/reader/test/browser_bug1124271_readerModePinnedTab.js": 2067, 
+-    "toolkit/components/reader/test/browser_readerMode.js": 5178, 
+-    "toolkit/components/reader/test/browser_readerMode_readingTime.js": 2362, 
+-    "toolkit/components/satchel/test/browser/browser_privbrowsing_perwindowpb.js": 4898, 
+-    "toolkit/components/social/test/browser/browser_SocialProvider.js": 2324, 
+-    "toolkit/components/social/test/browser/browser_frameworker.js": 5888, 
+-    "toolkit/components/social/test/browser/browser_frameworker_sandbox.js": 5738, 
+-    "toolkit/components/social/test/browser/browser_workerAPI.js": 2483, 
+-    "toolkit/components/startup/tests/browser/browser_bug511456.js": 2803, 
++    "toolkit/components/perfmonitoring/tests/browser/browser_compartments.js": 2449, 
++    "toolkit/components/perfmonitoring/tests/browser/browser_webpagePerformanceAlerts.js": 32274, 
++    "toolkit/components/places/tests/browser/browser_bug248970.js": 4471, 
++    "toolkit/components/places/tests/browser/browser_bug399606.js": 13367, 
++    "toolkit/components/places/tests/browser/browser_bug461710.js": 2826, 
++    "toolkit/components/places/tests/browser/browser_favicon_setAndFetchFaviconForPage.js": 4095, 
++    "toolkit/components/places/tests/browser/browser_favicon_setAndFetchFaviconForPage_failures.js": 7429, 
++    "toolkit/components/places/tests/browser/browser_multi_redirect_frecency.js": 1883, 
++    "toolkit/components/places/tests/browser/browser_visituri_privatebrowsing_perwindowpb.js": 2311, 
++    "toolkit/components/printing/tests/browser_page_change_print_original.js": 1873, 
++    "toolkit/components/printing/tests/browser_preview_switch_print_selected.js": 2821, 
++    "toolkit/components/reader/test/browser_readerMode.js": 3706, 
++    "toolkit/components/reader/test/browser_readerMode_readingTime.js": 1960, 
++    "toolkit/components/satchel/test/browser/browser_privbrowsing_perwindowpb.js": 2572, 
+     "toolkit/components/startup/tests/browser/browser_crash_detection.js": 35076, 
+-    "toolkit/components/thumbnails/test/browser_thumbnails_bg_bad_url.js": 2260, 
+-    "toolkit/components/thumbnails/test/browser_thumbnails_bg_crash_during_capture.js": 2281, 
+-    "toolkit/components/thumbnails/test/browser_thumbnails_bg_crash_while_idle.js": 2113, 
++    "toolkit/components/thumbnails/test/browser_thumbnails_bg_crash_during_capture.js": 4107, 
++    "toolkit/components/thumbnails/test/browser_thumbnails_bg_crash_while_idle.js": 3680, 
+     "toolkit/components/thumbnails/test/browser_thumbnails_bg_destroy_browser.js": 4497, 
+-    "toolkit/components/thumbnails/test/browser_thumbnails_privacy.js": 7688, 
+-    "toolkit/components/thumbnails/test/browser_thumbnails_storage.js": 4654, 
+-    "toolkit/components/thumbnails/test/browser_thumbnails_update.js": 4615, 
+-    "toolkit/components/tooltiptext/tests/browser_input_file_tooltips.js": 4764, 
+-    "toolkit/components/viewsource/test/browser/browser_bug464222.js": 2589, 
+-    "toolkit/components/viewsource/test/browser/browser_bug713810.js": 2305, 
+-    "toolkit/components/viewsource/test/browser/browser_contextmenu.js": 3464, 
+-    "toolkit/components/viewsource/test/browser/browser_gotoline.js": 2177, 
+-    "toolkit/components/viewsource/test/browser/browser_viewsourceprefs.js": 3124, 
+-    "toolkit/content/tests/browser/browser_audioCompeting.js": 3484, 
+-    "toolkit/content/tests/browser/browser_bug1170531.js": 2083, 
+-    "toolkit/content/tests/browser/browser_bug295977_autoscroll_overflow.js": 7223, 
+-    "toolkit/content/tests/browser/browser_f7_caret_browsing.js": 4806, 
++    "toolkit/components/thumbnails/test/browser_thumbnails_bg_no_cookies_sent.js": 1987, 
++    "toolkit/components/thumbnails/test/browser_thumbnails_bg_no_cookies_stored.js": 2519, 
++    "toolkit/components/thumbnails/test/browser_thumbnails_bg_no_duplicates.js": 2058, 
++    "toolkit/components/thumbnails/test/browser_thumbnails_bg_queueing.js": 3982, 
++    "toolkit/components/thumbnails/test/browser_thumbnails_privacy.js": 5082, 
++    "toolkit/components/thumbnails/test/browser_thumbnails_storage.js": 3846, 
++    "toolkit/components/thumbnails/test/browser_thumbnails_update.js": 2951, 
++    "toolkit/components/tooltiptext/tests/browser_input_file_tooltips.js": 3949, 
++    "toolkit/components/url-classifier/tests/browser/browser_flashblock_off_with_always_activate.js": 15907, 
++    "toolkit/components/url-classifier/tests/browser/browser_flashblock_off_with_ask_to_activate.js": 20995, 
++    "toolkit/components/url-classifier/tests/browser/browser_flashblock_off_with_never_activate.js": 11254, 
++    "toolkit/components/url-classifier/tests/browser/browser_flashblock_on_with_always_activate.js": 15886, 
++    "toolkit/components/url-classifier/tests/browser/browser_flashblock_on_with_ask_to_activate.js": 18043, 
++    "toolkit/components/url-classifier/tests/browser/browser_flashblock_on_with_never_activate.js": 11702, 
++    "toolkit/components/viewsource/test/browser/browser_bug464222.js": 1778, 
++    "toolkit/components/viewsource/test/browser/browser_open_docgroup.js": 2607, 
++    "toolkit/components/viewsource/test/browser/browser_viewsourceprefs.js": 1832, 
++    "toolkit/components/windowcreator/test/browser_bug1204626.js": 3285, 
++    "toolkit/components/windowwatcher/test/browser_new_content_window_chromeflags.js": 2492, 
++    "toolkit/content/tests/browser/browser_audioCompeting.js": 2079, 
++    "toolkit/content/tests/browser/browser_block_notInTreeAudio.js": 2351, 
++    "toolkit/content/tests/browser/browser_block_silentAudioTrack_media.js": 2398, 
++    "toolkit/content/tests/browser/browser_bug1170531.js": 2892, 
++    "toolkit/content/tests/browser/browser_bug295977_autoscroll_overflow.js": 6016, 
++    "toolkit/content/tests/browser/browser_datetime_datepicker.js": 5164, 
++    "toolkit/content/tests/browser/browser_f7_caret_browsing.js": 2919, 
+     "toolkit/content/tests/browser/browser_findbar.js": 9522, 
+-    "toolkit/content/tests/browser/browser_label_textlink.js": 2560, 
+     "toolkit/content/tests/browser/browser_mediaPlayback.js": 6217, 
+-    "toolkit/content/tests/browser/browser_mediaPlayback_mute.js": 9273, 
+-    "toolkit/content/tests/browser/browser_mediaPlayback_suspended.js": 4139, 
+-    "toolkit/content/tests/browser/browser_mediaPlayback_suspended_multipleAudio.js": 8178, 
+-    "toolkit/content/tests/browser/browser_quickfind_editable.js": 3343, 
+-    "toolkit/forgetaboutsite/test/browser/browser_clearplugindata.js": 2527, 
+-    "toolkit/modules/tests/browser/browser_RemotePageManager.js": 7969, 
+-    "toolkit/modules/tests/browser/browser_WebRequest.js": 4238, 
+-    "toolkit/mozapps/extensions/test/browser/browser_CTP_plugins.js": 11117, 
+-    "toolkit/mozapps/extensions/test/browser/browser_bug557943.js": 2060, 
+-    "toolkit/mozapps/extensions/test/browser/browser_bug557956.js": 30339, 
+-    "toolkit/mozapps/extensions/test/browser/browser_bug562797.js": 52689, 
+-    "toolkit/mozapps/extensions/test/browser/browser_bug562854.js": 5473, 
+-    "toolkit/mozapps/extensions/test/browser/browser_bug562890.js": 2183, 
+-    "toolkit/mozapps/extensions/test/browser/browser_bug562899.js": 3720, 
+-    "toolkit/mozapps/extensions/test/browser/browser_bug562992.js": 2158, 
+-    "toolkit/mozapps/extensions/test/browser/browser_bug567127.js": 2149, 
+-    "toolkit/mozapps/extensions/test/browser/browser_bug567137.js": 5681, 
+-    "toolkit/mozapps/extensions/test/browser/browser_bug572561.js": 4890, 
+-    "toolkit/mozapps/extensions/test/browser/browser_bug573062.js": 2049, 
+-    "toolkit/mozapps/extensions/test/browser/browser_bug577990.js": 12990, 
+-    "toolkit/mozapps/extensions/test/browser/browser_bug580298.js": 3033, 
+-    "toolkit/mozapps/extensions/test/browser/browser_bug581076.js": 9096, 
+-    "toolkit/mozapps/extensions/test/browser/browser_bug586574.js": 3052, 
+-    "toolkit/mozapps/extensions/test/browser/browser_bug587970.js": 2401, 
+-    "toolkit/mozapps/extensions/test/browser/browser_bug590347.js": 2933, 
+-    "toolkit/mozapps/extensions/test/browser/browser_bug591465.js": 6457, 
+-    "toolkit/mozapps/extensions/test/browser/browser_bug591663.js": 4259, 
+-    "toolkit/mozapps/extensions/test/browser/browser_bug596336.js": 6496, 
+-    "toolkit/mozapps/extensions/test/browser/browser_bug608316.js": 2414, 
+-    "toolkit/mozapps/extensions/test/browser/browser_bug610764.js": 2823, 
+-    "toolkit/mozapps/extensions/test/browser/browser_bug618502.js": 2623, 
+-    "toolkit/mozapps/extensions/test/browser/browser_bug679604.js": 2893, 
+-    "toolkit/mozapps/extensions/test/browser/browser_bug714593.js": 2617, 
+-    "toolkit/mozapps/extensions/test/browser/browser_cancelCompatCheck.js": 20447, 
+-    "toolkit/mozapps/extensions/test/browser/browser_debug_button.js": 6544, 
+-    "toolkit/mozapps/extensions/test/browser/browser_details.js": 38493, 
+-    "toolkit/mozapps/extensions/test/browser/browser_discovery.js": 47540, 
+-    "toolkit/mozapps/extensions/test/browser/browser_discovery_install.js": 13023, 
+-    "toolkit/mozapps/extensions/test/browser/browser_dragdrop.js": 5732, 
+-    "toolkit/mozapps/extensions/test/browser/browser_eula.js": 3411, 
+-    "toolkit/mozapps/extensions/test/browser/browser_experiments.js": 10751, 
+-    "toolkit/mozapps/extensions/test/browser/browser_globalinformations.js": 3474, 
+-    "toolkit/mozapps/extensions/test/browser/browser_globalwarnings.js": 3905, 
+-    "toolkit/mozapps/extensions/test/browser/browser_gmpProvider.js": 46765, 
+-    "toolkit/mozapps/extensions/test/browser/browser_hotfix.js": 3851, 
+-    "toolkit/mozapps/extensions/test/browser/browser_inlinesettings.js": 9334, 
+-    "toolkit/mozapps/extensions/test/browser/browser_inlinesettings_browser.js": 7072, 
+-    "toolkit/mozapps/extensions/test/browser/browser_inlinesettings_custom.js": 3215, 
+-    "toolkit/mozapps/extensions/test/browser/browser_inlinesettings_info.js": 9210, 
+-    "toolkit/mozapps/extensions/test/browser/browser_install.js": 16713, 
+-    "toolkit/mozapps/extensions/test/browser/browser_installssl.js": 14037, 
+-    "toolkit/mozapps/extensions/test/browser/browser_list.js": 13804, 
+-    "toolkit/mozapps/extensions/test/browser/browser_manualupdates.js": 5553, 
+-    "toolkit/mozapps/extensions/test/browser/browser_newaddon.js": 3395, 
+-    "toolkit/mozapps/extensions/test/browser/browser_openDialog.js": 2435, 
+-    "toolkit/mozapps/extensions/test/browser/browser_plugin_enabled_state_locked.js": 3727, 
+-    "toolkit/mozapps/extensions/test/browser/browser_pluginprefs.js": 2051, 
+-    "toolkit/mozapps/extensions/test/browser/browser_purchase.js": 4428, 
+-    "toolkit/mozapps/extensions/test/browser/browser_recentupdates.js": 7583, 
+-    "toolkit/mozapps/extensions/test/browser/browser_searching.js": 21947, 
+-    "toolkit/mozapps/extensions/test/browser/browser_select_compatoverrides.js": 2440, 
+-    "toolkit/mozapps/extensions/test/browser/browser_select_confirm.js": 2470, 
+-    "toolkit/mozapps/extensions/test/browser/browser_select_selection.js": 2535, 
+-    "toolkit/mozapps/extensions/test/browser/browser_select_update.js": 2276, 
+-    "toolkit/mozapps/extensions/test/browser/browser_sorting.js": 6235, 
+-    "toolkit/mozapps/extensions/test/browser/browser_sorting_plugins.js": 2582, 
+-    "toolkit/mozapps/extensions/test/browser/browser_tabsettings.js": 2334, 
+-    "toolkit/mozapps/extensions/test/browser/browser_types.js": 27100, 
+-    "toolkit/mozapps/extensions/test/browser/browser_uninstalling.js": 19569, 
+-    "toolkit/mozapps/extensions/test/browser/browser_updateid.js": 2102, 
+-    "toolkit/mozapps/extensions/test/browser/browser_updatessl.js": 20828, 
+-    "toolkit/mozapps/extensions/test/browser/browser_webapi_access.js": 7026, 
+-    "toolkit/mozapps/extensions/test/browser/browser_webapi_addon_listener.js": 4087, 
+-    "toolkit/mozapps/extensions/test/browser/browser_webapi_install.js": 8577, 
+-    "toolkit/mozapps/extensions/test/browser/browser_webext_options.js": 6565, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_CTP_plugins.js": 11673, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug557943.js": 2147, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug562797.js": 31447, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug562854.js": 5682, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug562890.js": 2120, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug562899.js": 4089, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug562992.js": 2199, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug567127.js": 2082, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug567137.js": 6395, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug572561.js": 5249, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug573062.js": 1997, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug577990.js": 13657, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug580298.js": 2852, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug581076.js": 9272, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug586574.js": 2970, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug587970.js": 2399, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug590347.js": 2813, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug591465.js": 6131, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug591663.js": 4516, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug596336.js": 6574, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug608316.js": 2469, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug610764.js": 2979, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug618502.js": 2773, 
++    "toolkit/content/tests/browser/browser_mediaPlayback_mute.js": 2504, 
++    "toolkit/content/tests/browser/browser_mediaPlayback_suspended.js": 1715, 
++    "toolkit/content/tests/browser/browser_mediaPlayback_suspended_multipleAudio.js": 6416, 
++    "toolkit/content/tests/browser/browser_mute_plugIn.js": 1905, 
++    "toolkit/content/tests/browser/browser_mute_webAudio.js": 1651, 
++    "toolkit/content/tests/browser/browser_quickfind_editable.js": 3010, 
++    "toolkit/content/tests/browser/browser_sound_indicator_silent_video.js": 3540, 
++    "toolkit/modules/tests/browser/browser_RemotePageManager.js": 5949, 
++    "toolkit/modules/tests/browser/browser_WebRequest.js": 2563, 
++    "toolkit/mozapps/extensions/test/browser/browser_CTP_plugins.js": 8300, 
++    "toolkit/mozapps/extensions/test/browser/browser_bug557956.js": 17636, 
++    "toolkit/mozapps/extensions/test/browser/browser_bug562797.js": 33838, 
++    "toolkit/mozapps/extensions/test/browser/browser_bug562854.js": 3852, 
++    "toolkit/mozapps/extensions/test/browser/browser_bug562899.js": 2466, 
++    "toolkit/mozapps/extensions/test/browser/browser_bug567127.js": 1810, 
++    "toolkit/mozapps/extensions/test/browser/browser_bug567137.js": 3745, 
++    "toolkit/mozapps/extensions/test/browser/browser_bug572561.js": 3518, 
++    "toolkit/mozapps/extensions/test/browser/browser_bug577990.js": 9318, 
++    "toolkit/mozapps/extensions/test/browser/browser_bug580298.js": 2287, 
++    "toolkit/mozapps/extensions/test/browser/browser_bug581076.js": 6716, 
++    "toolkit/mozapps/extensions/test/browser/browser_bug586574.js": 2217, 
++    "toolkit/mozapps/extensions/test/browser/browser_bug587970.js": 1838, 
++    "toolkit/mozapps/extensions/test/browser/browser_bug590347.js": 2159, 
++    "toolkit/mozapps/extensions/test/browser/browser_bug591465.js": 4132, 
++    "toolkit/mozapps/extensions/test/browser/browser_bug591663.js": 3436, 
++    "toolkit/mozapps/extensions/test/browser/browser_bug596336.js": 4569, 
++    "toolkit/mozapps/extensions/test/browser/browser_bug608316.js": 2196, 
++    "toolkit/mozapps/extensions/test/browser/browser_bug610764.js": 2248, 
++    "toolkit/mozapps/extensions/test/browser/browser_bug618502.js": 1774, 
++    "toolkit/mozapps/extensions/test/browser/browser_bug679604.js": 1835, 
++    "toolkit/mozapps/extensions/test/browser/browser_bug714593.js": 1931, 
++    "toolkit/mozapps/extensions/test/browser/browser_cancelCompatCheck.js": 14750, 
++    "toolkit/mozapps/extensions/test/browser/browser_details.js": 28206, 
++    "toolkit/mozapps/extensions/test/browser/browser_discovery.js": 33532, 
++    "toolkit/mozapps/extensions/test/browser/browser_discovery_install.js": 8146, 
++    "toolkit/mozapps/extensions/test/browser/browser_dragdrop.js": 3819, 
++    "toolkit/mozapps/extensions/test/browser/browser_dragdrop_incompat.js": 1847, 
++    "toolkit/mozapps/extensions/test/browser/browser_eula.js": 2093, 
++    "toolkit/mozapps/extensions/test/browser/browser_experiments.js": 8174, 
++    "toolkit/mozapps/extensions/test/browser/browser_file_xpi_no_process_switch.js": 3253, 
++    "toolkit/mozapps/extensions/test/browser/browser_getmorethemes.js": 3355, 
++    "toolkit/mozapps/extensions/test/browser/browser_globalwarnings.js": 3075, 
++    "toolkit/mozapps/extensions/test/browser/browser_gmpProvider.js": 19604, 
++    "toolkit/mozapps/extensions/test/browser/browser_inlinesettings.js": 6647, 
++    "toolkit/mozapps/extensions/test/browser/browser_inlinesettings_browser.js": 6466, 
++    "toolkit/mozapps/extensions/test/browser/browser_inlinesettings_custom.js": 2386, 
++    "toolkit/mozapps/extensions/test/browser/browser_inlinesettings_info.js": 6069, 
++    "toolkit/mozapps/extensions/test/browser/browser_install.js": 11642, 
++    "toolkit/mozapps/extensions/test/browser/browser_installssl.js": 10808, 
++    "toolkit/mozapps/extensions/test/browser/browser_legacy.js": 4773, 
++    "toolkit/mozapps/extensions/test/browser/browser_legacy_pre57.js": 2257, 
++    "toolkit/mozapps/extensions/test/browser/browser_list.js": 9431, 
++    "toolkit/mozapps/extensions/test/browser/browser_manualupdates.js": 4114, 
++    "toolkit/mozapps/extensions/test/browser/browser_newaddon.js": 2264, 
++    "toolkit/mozapps/extensions/test/browser/browser_non_mpc.js": 4234, 
++    "toolkit/mozapps/extensions/test/browser/browser_plugin_enabled_state_locked.js": 2027, 
++    "toolkit/mozapps/extensions/test/browser/browser_pluginprefs.js": 1791, 
++    "toolkit/mozapps/extensions/test/browser/browser_purchase.js": 3037, 
++    "toolkit/mozapps/extensions/test/browser/browser_recentupdates.js": 4986, 
++    "toolkit/mozapps/extensions/test/browser/browser_searching.js": 15056, 
++    "toolkit/mozapps/extensions/test/browser/browser_sorting.js": 4127, 
++    "toolkit/mozapps/extensions/test/browser/browser_sorting_plugins.js": 1834, 
++    "toolkit/mozapps/extensions/test/browser/browser_tabsettings.js": 1736, 
++    "toolkit/mozapps/extensions/test/browser/browser_types.js": 18768, 
++    "toolkit/mozapps/extensions/test/browser/browser_uninstalling.js": 13491, 
++    "toolkit/mozapps/extensions/test/browser/browser_updateid.js": 1958, 
++    "toolkit/mozapps/extensions/test/browser/browser_updatessl.js": 17844, 
++    "toolkit/mozapps/extensions/test/browser/browser_webapi_access.js": 4427, 
++    "toolkit/mozapps/extensions/test/browser/browser_webapi_addon_listener.js": 2472, 
++    "toolkit/mozapps/extensions/test/browser/browser_webapi_install.js": 6195, 
++    "toolkit/mozapps/extensions/test/browser/browser_webext_options.js": 5306, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_CTP_plugins.js": 9547, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug557943.js": 2015, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug562797.js": 26476, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug562854.js": 4778, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug562890.js": 1832, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug562899.js": 3433, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug562992.js": 1980, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug567127.js": 1736, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug567137.js": 5554, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug572561.js": 4822, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug573062.js": 1788, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug577990.js": 11188, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug580298.js": 2463, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug581076.js": 8298, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug586574.js": 2672, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug587970.js": 2108, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug590347.js": 2586, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug591465.js": 5155, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug591663.js": 4259, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug596336.js": 5484, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug608316.js": 2768, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug610764.js": 2339, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_bug618502.js": 2347, 
+     "toolkit/mozapps/extensions/test/browser/test-window/browser_bug679604.js": 3002, 
+     "toolkit/mozapps/extensions/test/browser/test-window/browser_bug714593.js": 2619, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_debug_button.js": 7434, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_details.js": 39353, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_discovery.js": 46972, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_dragdrop.js": 4499, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_eula.js": 3261, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_experiments.js": 8135, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_globalinformations.js": 3232, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_globalwarnings.js": 3836, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_inlinesettings.js": 8986, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_inlinesettings_browser.js": 7042, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_inlinesettings_custom.js": 3359, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_inlinesettings_info.js": 9014, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_install.js": 17201, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_list.js": 14575, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_manualupdates.js": 5677, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_openDialog.js": 2587, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_details.js": 34528, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_discovery.js": 39906, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_dragdrop.js": 3589, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_eula.js": 2903, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_experiments.js": 6974, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_globalwarnings.js": 3248, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_inlinesettings.js": 7622, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_inlinesettings_browser.js": 6376, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_inlinesettings_custom.js": 2522, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_inlinesettings_info.js": 8216, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_install.js": 15373, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_list.js": 12071, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_manualupdates.js": 4484, 
+     "toolkit/mozapps/extensions/test/browser/test-window/browser_plugin_enabled_state_locked.js": 3670, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_pluginprefs.js": 2519, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_purchase.js": 4643, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_recentupdates.js": 7785, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_searching.js": 21951, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_sorting.js": 6477, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_sorting_plugins.js": 3129, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_tabsettings.js": 2300, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_types.js": 28129, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_uninstalling.js": 18998, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_updateid.js": 2226, 
+-    "toolkit/mozapps/extensions/test/browser/test-window/browser_webext_options.js": 6669, 
+-    "toolkit/mozapps/extensions/test/xpinstall/browser_amosigned_trigger.js": 2568, 
+-    "toolkit/mozapps/extensions/test/xpinstall/browser_auth.js": 2405, 
+-    "toolkit/mozapps/extensions/test/xpinstall/browser_auth4.js": 2193, 
+-    "toolkit/mozapps/extensions/test/xpinstall/browser_bug638292.js": 2663, 
+-    "toolkit/mozapps/extensions/test/xpinstall/browser_concurrent_installs.js": 2840, 
+-    "toolkit/mozapps/extensions/test/xpinstall/browser_httphash5.js": 1977, 
+-    "toolkit/mozapps/extensions/test/xpinstall/browser_httphash6.js": 2262, 
+-    "toolkit/mozapps/extensions/test/xpinstall/browser_signed_multiple.js": 2368, 
+-    "uriloader/exthandler/tests/mochitest/browser_web_protocol_handlers.js": 4136
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_pluginprefs.js": 2304, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_purchase.js": 3652, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_recentupdates.js": 7288, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_searching.js": 18377, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_sorting.js": 5632, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_sorting_plugins.js": 2836, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_tabsettings.js": 1715, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_types.js": 25335, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_uninstalling.js": 16773, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_updateid.js": 1883, 
++    "toolkit/mozapps/extensions/test/browser/test-window/browser_webext_options.js": 5864, 
++    "toolkit/mozapps/extensions/test/xpinstall/browser_bug638292.js": 1711, 
++    "toolkit/mozapps/extensions/test/xpinstall/browser_concurrent_installs.js": 1759, 
++    "toolkit/mozapps/extensions/test/xpinstall/browser_signed_multiple.js": 2017, 
++    "toolkit/mozapps/extensions/test/xpinstall/browser_signed_naming.js": 1638, 
++    "toolkit/mozapps/update/tests/browser/browser_TelemetryUpdatePing.js": 1847, 
++    "toolkit/mozapps/update/tests/browser/browser_updatesBackgroundWindow.js": 1819, 
++    "toolkit/mozapps/update/tests/browser/browser_updatesBackgroundWindowFailures.js": 3440, 
++    "toolkit/mozapps/update/tests/browser/browser_updatesCompleteAndPartialPatchesWithBadSizes.js": 2769, 
++    "toolkit/mozapps/update/tests/browser/browser_updatesCompletePatchWithBadCompleteSize.js": 2115, 
++    "toolkit/mozapps/update/tests/browser/browser_updatesDownloadFailures.js": 2872, 
++    "toolkit/mozapps/update/tests/browser/browser_updatesPartialPatchWithBadPartialSize.js": 1852, 
++    "uriloader/exthandler/tests/mochitest/browser_web_protocol_handlers.js": 2437
+   }
+ }
+diff --git a/testing/runtimes/mochitest-browser-chrome.runtimes.json.1363061.later b/testing/runtimes/mochitest-browser-chrome.runtimes.json.1363061.later
+deleted file mode 100644
+--- a/testing/runtimes/mochitest-browser-chrome.runtimes.json.1363061.later
++++ /dev/null
+@@ -1,21 +0,0 @@
+---- mochitest-browser-chrome.runtimes.json
+-+++ mochitest-browser-chrome.runtimes.json
+-@@ -800,17 +800,17 @@
+-     "security/manager/ssl/tests/mochitest/browser/browser_certViewer.js": 3220,
+-     "security/manager/ssl/tests/mochitest/browser/browser_clientAuth_connection.js": 2066,
+-     "services/fxaccounts/tests/browser/browser_device_connected.js": 3094,
+-     "services/fxaccounts/tests/browser/browser_verify_login.js": 1763,
+-     "toolkit/components/aboutperformance/tests/browser/browser_aboutperformance.js": 6246,
+-     "toolkit/components/addoncompat/tests/browser/browser_addonShims.js": 3823,
+-     "toolkit/components/extensions/test/browser/browser_ext_management_themes.js": 2922,
+-     "toolkit/components/extensions/test/browser/browser_ext_themes_persistence.js": 1948,
+--    "toolkit/components/jsdownloads/test/browser/browser_DownloadPDFSaver.js": 4102,
+-+    "toolkit/components/downloads/test/browser/browser_DownloadPDFSaver.js": 4102,
+-     "toolkit/components/narrate/test/browser_narrate.js": 2700,
+-     "toolkit/components/narrate/test/browser_voiceselect.js": 2254,
+-     "toolkit/components/narrate/test/browser_word_highlight.js": 2215,
+-     "toolkit/components/passwordmgr/test/browser/browser_capture_doorhanger.js": 15909,
+-     "toolkit/components/passwordmgr/test/browser/browser_capture_doorhanger_httpsUpgrade.js": 3296,
+-     "toolkit/components/passwordmgr/test/browser/browser_capture_doorhanger_window_open.js": 4673,
+-     "toolkit/components/passwordmgr/test/browser/browser_context_menu.js": 12686,
+-     "toolkit/components/passwordmgr/test/browser/browser_context_menu_autocomplete_interaction.js": 3297,
+diff --git a/testing/runtimes/mochitest-devtools-chrome-e10s.runtimes.json b/testing/runtimes/mochitest-devtools-chrome-e10s.runtimes.json
+--- a/testing/runtimes/mochitest-devtools-chrome-e10s.runtimes.json
++++ b/testing/runtimes/mochitest-devtools-chrome-e10s.runtimes.json
+@@ -1,828 +1,915 @@
+ {
+-  "excluded_test_average": 2737, 
++  "excluded_test_average": 1805, 
+   "runtimes": {
+-    "Main app process exited normally": 1088010, 
+-    "devtools/client/aboutdebugging/test/browser_addons_debug_bootstrapped.js": 16666, 
+-    "devtools/client/aboutdebugging/test/browser_addons_debug_webextension.js": 15375, 
+-    "devtools/client/aboutdebugging/test/browser_addons_debug_webextension_inspector.js": 16630, 
+-    "devtools/client/aboutdebugging/test/browser_addons_debug_webextension_nobg.js": 16054, 
+-    "devtools/client/aboutdebugging/test/browser_addons_debug_webextension_popup.js": 16332, 
+-    "devtools/client/aboutdebugging/test/browser_addons_debugging_initial_state.js": 9722, 
+-    "devtools/client/aboutdebugging/test/browser_addons_install.js": 5032, 
+-    "devtools/client/aboutdebugging/test/browser_addons_reload.js": 7988, 
+-    "devtools/client/aboutdebugging/test/browser_service_workers_not_compatible.js": 6634, 
+-    "devtools/client/aboutdebugging/test/browser_service_workers_status.js": 6493, 
+-    "devtools/client/animationinspector/test/browser_animation_animated_properties_displayed.js": 15078, 
+-    "devtools/client/animationinspector/test/browser_animation_click_selects_animation.js": 13152, 
+-    "devtools/client/animationinspector/test/browser_animation_empty_on_invalid_nodes.js": 14272, 
+-    "devtools/client/animationinspector/test/browser_animation_keyframe_click_to_set_time.js": 8243, 
+-    "devtools/client/animationinspector/test/browser_animation_keyframe_markers.js": 8178, 
+-    "devtools/client/animationinspector/test/browser_animation_mutations_with_same_names.js": 5906, 
+-    "devtools/client/animationinspector/test/browser_animation_participate_in_inspector_update.js": 13784, 
+-    "devtools/client/animationinspector/test/browser_animation_playerFronts_are_refreshed.js": 15055, 
+-    "devtools/client/animationinspector/test/browser_animation_playerWidgets_appear_on_panel_init.js": 6530, 
+-    "devtools/client/animationinspector/test/browser_animation_playerWidgets_target_nodes.js": 13834, 
+-    "devtools/client/animationinspector/test/browser_animation_pseudo_elements.js": 10608, 
+-    "devtools/client/animationinspector/test/browser_animation_refresh_on_added_animation.js": 15072, 
+-    "devtools/client/animationinspector/test/browser_animation_refresh_when_active.js": 17272, 
+-    "devtools/client/animationinspector/test/browser_animation_running_on_compositor.js": 14969, 
+-    "devtools/client/animationinspector/test/browser_animation_same_nb_of_playerWidgets_and_playerFronts.js": 13965, 
+-    "devtools/client/animationinspector/test/browser_animation_shows_player_on_valid_node.js": 13910, 
+-    "devtools/client/animationinspector/test/browser_animation_spacebar_toggles_animations.js": 14055, 
+-    "devtools/client/animationinspector/test/browser_animation_spacebar_toggles_node_animations.js": 15596, 
+-    "devtools/client/animationinspector/test/browser_animation_target_highlight_select.js": 16323, 
+-    "devtools/client/animationinspector/test/browser_animation_target_highlighter_lock.js": 14282, 
+-    "devtools/client/animationinspector/test/browser_animation_timeline_currentTime.js": 14593, 
+-    "devtools/client/animationinspector/test/browser_animation_timeline_header.js": 12767, 
+-    "devtools/client/animationinspector/test/browser_animation_timeline_iterationStart.js": 5382, 
+-    "devtools/client/animationinspector/test/browser_animation_timeline_pause_button.js": 18428, 
+-    "devtools/client/animationinspector/test/browser_animation_timeline_pause_button_01.js": 16298, 
+-    "devtools/client/animationinspector/test/browser_animation_timeline_pause_button_02.js": 16369, 
+-    "devtools/client/animationinspector/test/browser_animation_timeline_pause_button_03.js": 22277, 
+-    "devtools/client/animationinspector/test/browser_animation_timeline_rate_selector.js": 22536, 
+-    "devtools/client/animationinspector/test/browser_animation_timeline_rewind_button.js": 17330, 
+-    "devtools/client/animationinspector/test/browser_animation_timeline_scrubber_exists.js": 12727, 
+-    "devtools/client/animationinspector/test/browser_animation_timeline_scrubber_movable.js": 12555, 
+-    "devtools/client/animationinspector/test/browser_animation_timeline_scrubber_moves.js": 14775, 
+-    "devtools/client/animationinspector/test/browser_animation_timeline_setCurrentTime.js": 8274, 
+-    "devtools/client/animationinspector/test/browser_animation_timeline_short_duration.js": 5893, 
+-    "devtools/client/animationinspector/test/browser_animation_timeline_shows_delay.js": 15566, 
+-    "devtools/client/animationinspector/test/browser_animation_timeline_shows_endDelay.js": 7056, 
+-    "devtools/client/animationinspector/test/browser_animation_timeline_shows_iterations.js": 14638, 
+-    "devtools/client/animationinspector/test/browser_animation_timeline_shows_name_label.js": 14903, 
+-    "devtools/client/animationinspector/test/browser_animation_timeline_shows_time_info.js": 13065, 
+-    "devtools/client/animationinspector/test/browser_animation_timeline_takes_rate_into_account.js": 5252, 
+-    "devtools/client/animationinspector/test/browser_animation_timeline_ui.js": 12591, 
+-    "devtools/client/animationinspector/test/browser_animation_toggle_button_resets_on_navigate.js": 17782, 
+-    "devtools/client/animationinspector/test/browser_animation_toggle_button_toggles_animations.js": 13877, 
+-    "devtools/client/animationinspector/test/browser_animation_toolbar_exists.js": 13538, 
+-    "devtools/client/animationinspector/test/browser_animation_ui_updates_when_animation_data_changes.js": 15802, 
+-    "devtools/client/canvasdebugger/test/browser_canvas-frontend-call-highlight.js": 6365, 
+-    "devtools/client/canvasdebugger/test/browser_canvas-frontend-call-stack-01.js": 7139, 
+-    "devtools/client/canvasdebugger/test/browser_canvas-frontend-call-stack-02.js": 6135, 
+-    "devtools/client/debugger/new/test/mochitest/browser_dbg-breaking-from-console.js": 11600, 
+-    "devtools/client/debugger/new/test/mochitest/browser_dbg-breaking.js": 14528, 
+-    "devtools/client/debugger/new/test/mochitest/browser_dbg-breakpoints-cond.js": 10208, 
+-    "devtools/client/debugger/new/test/mochitest/browser_dbg-breakpoints.js": 17373, 
+-    "devtools/client/debugger/new/test/mochitest/browser_dbg-call-stack.js": 15491, 
+-    "devtools/client/debugger/new/test/mochitest/browser_dbg-console.js": 5813, 
+-    "devtools/client/debugger/new/test/mochitest/browser_dbg-debugger-buttons.js": 13601, 
+-    "devtools/client/debugger/new/test/mochitest/browser_dbg-editor-gutter.js": 10957, 
+-    "devtools/client/debugger/new/test/mochitest/browser_dbg-editor-highlight.js": 11201, 
+-    "devtools/client/debugger/new/test/mochitest/browser_dbg-editor-mode.js": 7867, 
+-    "devtools/client/debugger/new/test/mochitest/browser_dbg-editor-select.js": 17748, 
+-    "devtools/client/debugger/new/test/mochitest/browser_dbg-iframes.js": 11879, 
+-    "devtools/client/debugger/new/test/mochitest/browser_dbg-navigation.js": 16967, 
+-    "devtools/client/debugger/new/test/mochitest/browser_dbg-pause-exceptions.js": 10917, 
+-    "devtools/client/debugger/new/test/mochitest/browser_dbg-pretty-print-paused.js": 9732, 
+-    "devtools/client/debugger/new/test/mochitest/browser_dbg-pretty-print.js": 12632, 
+-    "devtools/client/debugger/new/test/mochitest/browser_dbg-scopes.js": 18214, 
+-    "devtools/client/debugger/new/test/mochitest/browser_dbg-sourcemaps-bogus.js": 7272, 
+-    "devtools/client/debugger/new/test/mochitest/browser_dbg-sourcemaps.js": 17903, 
+-    "devtools/client/debugger/new/test/mochitest/browser_dbg-sources.js": 6850, 
+-    "devtools/client/debugger/new/test/mochitest/browser_dbg_keyboard-shortcuts.js": 12509, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_aaa_run_first_leaktest.js": 5663, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_addon-panels.js": 6842, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_addon-sources.js": 6940, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_addon-workers-dbg-enabled.js": 7399, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_auto-pretty-print-01.js": 7231, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_auto-pretty-print-02.js": 4916, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_blackboxing-02.js": 5535, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_blackboxing-03.js": 5592, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_blackboxing-04.js": 5576, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_blackboxing-06.js": 5576, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_breadcrumbs-access.js": 5615, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_break-in-anon.js": 4984, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_break-on-dom-02.js": 7489, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_break-on-dom-03.js": 5124, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_break-on-dom-04.js": 5065, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_break-on-dom-05.js": 5190, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_break-on-dom-06.js": 7151, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_break-on-dom-08.js": 5424, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_break-on-next-console.js": 7240, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_break-on-next.js": 5905, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_break-unselected.js": 5869, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-actual-location.js": 5338, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-actual-location2.js": 6412, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-button-01.js": 4943, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-contextmenu-add.js": 5523, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-contextmenu.js": 15275, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-other-tabs.js": 4951, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_closure-inspection.js": 6496, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_conditional-breakpoints-01.js": 8307, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_host-layout.js": 15475, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_pause-warning.js": 5180, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_reload-same-script.js": 5060, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_search-global-06.js": 5317, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_server-conditional-bp-01.js": 7472, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_sources-cache.js": 5708, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_sources-large.js": 5101, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_sources-webext-contentscript.js": 6988, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-edit-getset-01.js": 12270, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-edit-value.js": 6445, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-edit-watch.js": 5047, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-filter-01.js": 8441, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-filter-02.js": 8601, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-filter-03.js": 6950, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-filter-04.js": 6216, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-filter-05.js": 6403, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-frame-parameters-01.js": 5723, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-frame-parameters-03.js": 8030, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-hide-non-enums.js": 5042, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-large-array-buffer.js": 18383, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-override-01.js": 6200, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-01.js": 5028, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-13.js": 6174, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-16.js": 8745, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-reexpand-01.js": 15428, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-reexpand-02.js": 18643, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-webidl.js": 7990, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_watch-expressions-02.js": 7985, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_worker-source-map.js": 5102, 
+-    "devtools/client/dom/test/browser_dom_array.js": 14192, 
+-    "devtools/client/dom/test/browser_dom_basic.js": 10227, 
+-    "devtools/client/dom/test/browser_dom_refresh.js": 12990, 
+-    "devtools/client/framework/test/browser_browser_toolbox.js": 23211, 
+-    "devtools/client/framework/test/browser_browser_toolbox_debugger.js": 20545, 
+-    "devtools/client/framework/test/browser_devtools_api.js": 6121, 
+-    "devtools/client/framework/test/browser_ignore_toolbox_network_requests.js": 5200, 
+-    "devtools/client/framework/test/browser_keybindings_01.js": 8671, 
+-    "devtools/client/framework/test/browser_keybindings_02.js": 5198, 
+-    "devtools/client/framework/test/browser_new_activation_workflow.js": 8167, 
+-    "devtools/client/framework/test/browser_toolbox_highlight.js": 5258, 
+-    "devtools/client/framework/test/browser_toolbox_hosts.js": 13758, 
+-    "devtools/client/framework/test/browser_toolbox_hosts_size.js": 9535, 
+-    "devtools/client/framework/test/browser_toolbox_hosts_telemetry.js": 4910, 
+-    "devtools/client/framework/test/browser_toolbox_options.js": 5657, 
+-    "devtools/client/framework/test/browser_toolbox_options_disable_buttons.js": 6875, 
+-    "devtools/client/framework/test/browser_toolbox_options_disable_cache-01.js": 10789, 
+-    "devtools/client/framework/test/browser_toolbox_options_disable_cache-02.js": 13356, 
+-    "devtools/client/framework/test/browser_toolbox_remoteness_change.js": 6065, 
+-    "devtools/client/framework/test/browser_toolbox_tabsswitch_shortcuts.js": 12628, 
+-    "devtools/client/framework/test/browser_toolbox_target.js": 4988, 
+-    "devtools/client/framework/test/browser_toolbox_textbox_context_menu.js": 5111, 
+-    "devtools/client/framework/test/browser_toolbox_toggle.js": 12579, 
+-    "devtools/client/framework/test/browser_toolbox_tool_ready.js": 21463, 
+-    "devtools/client/framework/test/browser_toolbox_tool_remote_reopen.js": 15566, 
+-    "devtools/client/framework/test/browser_toolbox_transport_events.js": 5083, 
+-    "devtools/client/framework/test/browser_toolbox_view_source_01.js": 4993, 
+-    "devtools/client/framework/test/browser_toolbox_view_source_03.js": 5959, 
+-    "devtools/client/framework/test/browser_toolbox_view_source_04.js": 6407, 
+-    "devtools/client/framework/test/browser_toolbox_window_reload_target.js": 25595, 
+-    "devtools/client/framework/test/browser_toolbox_window_shortcuts.js": 10792, 
+-    "devtools/client/framework/test/browser_toolbox_window_title_changes.js": 11902, 
+-    "devtools/client/framework/test/browser_toolbox_window_title_frame_select.js": 8318, 
+-    "devtools/client/inspector/components/test/browser_boxmodel.js": 10201, 
+-    "devtools/client/inspector/components/test/browser_boxmodel_editablemodel.js": 11826, 
+-    "devtools/client/inspector/components/test/browser_boxmodel_editablemodel_bluronclick.js": 5720, 
+-    "devtools/client/inspector/components/test/browser_boxmodel_editablemodel_border.js": 6849, 
+-    "devtools/client/inspector/components/test/browser_boxmodel_editablemodel_stylerules.js": 9251, 
+-    "devtools/client/inspector/components/test/browser_boxmodel_guides.js": 5585, 
+-    "devtools/client/inspector/components/test/browser_boxmodel_rotate-labels-on-sides.js": 5462, 
++    "Main app process exited normally": 464459, 
++    "browser/base/content/test/static/browser_all_files_referenced.js": 4755, 
++    "devtools/client/aboutdebugging/test/browser_addons_debug_bootstrapped.js": 10703, 
++    "devtools/client/aboutdebugging/test/browser_addons_debug_info.js": 6509, 
++    "devtools/client/aboutdebugging/test/browser_addons_debug_webextension.js": 20926, 
++    "devtools/client/aboutdebugging/test/browser_addons_debug_webextension_inspector.js": 19517, 
++    "devtools/client/aboutdebugging/test/browser_addons_debug_webextension_nobg.js": 17886, 
++    "devtools/client/aboutdebugging/test/browser_addons_debug_webextension_popup.js": 18958, 
++    "devtools/client/aboutdebugging/test/browser_addons_debugging_initial_state.js": 5614, 
++    "devtools/client/aboutdebugging/test/browser_addons_install.js": 4482, 
++    "devtools/client/aboutdebugging/test/browser_addons_reload.js": 4785, 
++    "devtools/client/aboutdebugging/test/browser_addons_remove.js": 4510, 
++    "devtools/client/aboutdebugging/test/browser_service_workers_not_compatible.js": 5357, 
++    "devtools/client/aboutdebugging/test/browser_service_workers_status.js": 5267, 
++    "devtools/client/animationinspector/test/browser_animation_animated_properties_displayed.js": 7724, 
++    "devtools/client/animationinspector/test/browser_animation_animated_properties_for_delayed_starttime_animations.js": 6036, 
++    "devtools/client/animationinspector/test/browser_animation_animated_properties_path.js": 4763, 
++    "devtools/client/animationinspector/test/browser_animation_animated_properties_progress_indicator.js": 5945, 
++    "devtools/client/animationinspector/test/browser_animation_click_selects_animation.js": 6788, 
++    "devtools/client/animationinspector/test/browser_animation_controller_exposes_document_currentTime.js": 7357, 
++    "devtools/client/animationinspector/test/browser_animation_detail_displayed.js": 5715, 
++    "devtools/client/animationinspector/test/browser_animation_empty_on_invalid_nodes.js": 8005, 
++    "devtools/client/animationinspector/test/browser_animation_keyframe_click_to_set_time.js": 6897, 
++    "devtools/client/animationinspector/test/browser_animation_keyframe_markers.js": 5533, 
++    "devtools/client/animationinspector/test/browser_animation_mutations_with_same_names.js": 4216, 
++    "devtools/client/animationinspector/test/browser_animation_participate_in_inspector_update.js": 6660, 
++    "devtools/client/animationinspector/test/browser_animation_playerFronts_are_refreshed.js": 7225, 
++    "devtools/client/animationinspector/test/browser_animation_playerWidgets_appear_on_panel_init.js": 4172, 
++    "devtools/client/animationinspector/test/browser_animation_playerWidgets_target_nodes.js": 6783, 
++    "devtools/client/animationinspector/test/browser_animation_pseudo_elements.js": 7457, 
++    "devtools/client/animationinspector/test/browser_animation_refresh_on_added_animation.js": 6898, 
++    "devtools/client/animationinspector/test/browser_animation_refresh_on_removed_animation.js": 5848, 
++    "devtools/client/animationinspector/test/browser_animation_refresh_when_active.js": 7633, 
++    "devtools/client/animationinspector/test/browser_animation_running_on_compositor.js": 7633, 
++    "devtools/client/animationinspector/test/browser_animation_same_nb_of_playerWidgets_and_playerFronts.js": 6679, 
++    "devtools/client/animationinspector/test/browser_animation_shows_player_on_valid_node.js": 6281, 
++    "devtools/client/animationinspector/test/browser_animation_spacebar_toggles_animations.js": 6640, 
++    "devtools/client/animationinspector/test/browser_animation_spacebar_toggles_node_animations.js": 9149, 
++    "devtools/client/animationinspector/test/browser_animation_summarygraph_for_multiple_easings.js": 4155, 
++    "devtools/client/animationinspector/test/browser_animation_target_highlight_select.js": 9027, 
++    "devtools/client/animationinspector/test/browser_animation_target_highlighter_lock.js": 6835, 
++    "devtools/client/animationinspector/test/browser_animation_timeline_currentTime.js": 9465, 
++    "devtools/client/animationinspector/test/browser_animation_timeline_header.js": 5782, 
++    "devtools/client/animationinspector/test/browser_animation_timeline_iterationStart.js": 4077, 
++    "devtools/client/animationinspector/test/browser_animation_timeline_pause_button_01.js": 9881, 
++    "devtools/client/animationinspector/test/browser_animation_timeline_pause_button_02.js": 9686, 
++    "devtools/client/animationinspector/test/browser_animation_timeline_pause_button_03.js": 14425, 
++    "devtools/client/animationinspector/test/browser_animation_timeline_rate_selector.js": 13016, 
++    "devtools/client/animationinspector/test/browser_animation_timeline_rewind_button.js": 12155, 
++    "devtools/client/animationinspector/test/browser_animation_timeline_scrubber_exists.js": 5786, 
++    "devtools/client/animationinspector/test/browser_animation_timeline_scrubber_movable.js": 5949, 
++    "devtools/client/animationinspector/test/browser_animation_timeline_scrubber_moves.js": 7929, 
++    "devtools/client/animationinspector/test/browser_animation_timeline_setCurrentTime.js": 6432, 
++    "devtools/client/animationinspector/test/browser_animation_timeline_short_duration.js": 3816, 
++    "devtools/client/animationinspector/test/browser_animation_timeline_shows_delay.js": 7551, 
++    "devtools/client/animationinspector/test/browser_animation_timeline_shows_endDelay.js": 5156, 
++    "devtools/client/animationinspector/test/browser_animation_timeline_shows_iterations.js": 7247, 
++    "devtools/client/animationinspector/test/browser_animation_timeline_shows_name_label.js": 7004, 
++    "devtools/client/animationinspector/test/browser_animation_timeline_shows_time_info.js": 6168, 
++    "devtools/client/animationinspector/test/browser_animation_timeline_takes_rate_into_account.js": 3730, 
++    "devtools/client/animationinspector/test/browser_animation_timeline_ui.js": 6088, 
++    "devtools/client/animationinspector/test/browser_animation_toggle_button_resets_on_navigate.js": 8616, 
++    "devtools/client/animationinspector/test/browser_animation_toggle_button_toggles_animations.js": 6542, 
++    "devtools/client/animationinspector/test/browser_animation_toolbar_exists.js": 6439, 
++    "devtools/client/animationinspector/test/browser_animation_ui_updates_when_animation_data_changes.js": 8531, 
++    "devtools/client/canvasdebugger/test/browser_canvas-frontend-call-stack-01.js": 4584, 
++    "devtools/client/canvasdebugger/test/browser_canvas-frontend-call-stack-02.js": 4191, 
++    "devtools/client/debugger/new/test/mochitest/browser_dbg-breaking-from-console.js": 7303, 
++    "devtools/client/debugger/new/test/mochitest/browser_dbg-breaking.js": 7881, 
++    "devtools/client/debugger/new/test/mochitest/browser_dbg-breakpoints-cond.js": 5276, 
++    "devtools/client/debugger/new/test/mochitest/browser_dbg-breakpoints-reloading.js": 7538, 
++    "devtools/client/debugger/new/test/mochitest/browser_dbg-breakpoints.js": 10182, 
++    "devtools/client/debugger/new/test/mochitest/browser_dbg-call-stack.js": 9493, 
++    "devtools/client/debugger/new/test/mochitest/browser_dbg-console.js": 4155, 
++    "devtools/client/debugger/new/test/mochitest/browser_dbg-debugger-buttons.js": 9855, 
++    "devtools/client/debugger/new/test/mochitest/browser_dbg-editor-gutter.js": 5728, 
++    "devtools/client/debugger/new/test/mochitest/browser_dbg-editor-highlight.js": 5959, 
++    "devtools/client/debugger/new/test/mochitest/browser_dbg-editor-mode.js": 6946, 
++    "devtools/client/debugger/new/test/mochitest/browser_dbg-editor-select.js": 10780, 
++    "devtools/client/debugger/new/test/mochitest/browser_dbg-expressions.js": 7688, 
++    "devtools/client/debugger/new/test/mochitest/browser_dbg-iframes.js": 7488, 
++    "devtools/client/debugger/new/test/mochitest/browser_dbg-navigation.js": 11012, 
++    "devtools/client/debugger/new/test/mochitest/browser_dbg-pause-exceptions.js": 7356, 
++    "devtools/client/debugger/new/test/mochitest/browser_dbg-pretty-print-paused.js": 7409, 
++    "devtools/client/debugger/new/test/mochitest/browser_dbg-pretty-print.js": 8390, 
++    "devtools/client/debugger/new/test/mochitest/browser_dbg-scopes-mutations.js": 8656, 
++    "devtools/client/debugger/new/test/mochitest/browser_dbg-scopes.js": 6767, 
++    "devtools/client/debugger/new/test/mochitest/browser_dbg-search-file.js": 5707, 
++    "devtools/client/debugger/new/test/mochitest/browser_dbg-search-project.js": 5490, 
++    "devtools/client/debugger/new/test/mochitest/browser_dbg-search-sources.js": 4359, 
++    "devtools/client/debugger/new/test/mochitest/browser_dbg-sourcemaps-bogus.js": 5731, 
++    "devtools/client/debugger/new/test/mochitest/browser_dbg-sourcemaps-reloading.js": 7493, 
++    "devtools/client/debugger/new/test/mochitest/browser_dbg-sourcemaps.js": 12821, 
++    "devtools/client/debugger/new/test/mochitest/browser_dbg-sourcemaps2.js": 6064, 
++    "devtools/client/debugger/new/test/mochitest/browser_dbg-sources.js": 8745, 
++    "devtools/client/debugger/new/test/mochitest/browser_dbg-tabs.js": 13022, 
++    "devtools/client/debugger/new/test/mochitest/browser_dbg-toggling-tools.js": 5105, 
++    "devtools/client/debugger/new/test/mochitest/browser_dbg_keyboard-shortcuts.js": 5173, 
++    "devtools/client/debugger/new/test/mochitest/browser_dbg_keyboard_navigation.js": 4535, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_addon-panels.js": 4824, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_addon-sources.js": 4421, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_addon-workers-dbg-enabled.js": 4600, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_auto-pretty-print-01.js": 5839, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_auto-pretty-print-02.js": 4084, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_auto-pretty-print-03.js": 3662, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_blackboxing-01.js": 3722, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_blackboxing-02.js": 4330, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_blackboxing-03.js": 4413, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_blackboxing-04.js": 4450, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_blackboxing-05.js": 4019, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_blackboxing-06.js": 4318, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_blackboxing-07.js": 3543, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_breadcrumbs-access.js": 4520, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_break-in-anon.js": 3827, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_break-on-dom-02.js": 6034, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_break-on-dom-03.js": 3826, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_break-on-dom-04.js": 3989, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_break-on-dom-05.js": 4204, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_break-on-dom-06.js": 5570, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_break-on-dom-08.js": 4333, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_break-on-next-console.js": 4670, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_break-on-next.js": 4596, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_break-unselected.js": 3959, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-actual-location.js": 4106, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-actual-location2.js": 4851, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-button-01.js": 4010, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-button-02.js": 3867, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-contextmenu-add.js": 4293, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-contextmenu.js": 12337, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_conditional-breakpoints-01.js": 3520, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_host-layout.js": 6495, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_instruments-pane-collapse_keyboard.js": 3543, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_post-page.js": 4653, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_sources-cache.js": 4566, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_sources-eval-02.js": 3669, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_sources-iframe-reload.js": 3710, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_sources-large.js": 4276, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_sources-webext-contentscript.js": 4936, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-edit-getset-01.js": 4011, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-edit-value.js": 4302, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-hide-non-enums.js": 4239, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-large-array-buffer.js": 13221, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-reexpand-01.js": 5677, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-reexpand-02.js": 6571, 
++    "devtools/client/dom/test/browser_dom_array.js": 10408, 
++    "devtools/client/dom/test/browser_dom_basic.js": 8536, 
++    "devtools/client/dom/test/browser_dom_refresh.js": 10131, 
++    "devtools/client/framework/test/browser_browser_toolbox.js": 13551, 
++    "devtools/client/framework/test/browser_browser_toolbox_debugger.js": 12184, 
++    "devtools/client/framework/test/browser_ignore_toolbox_network_requests.js": 3622, 
++    "devtools/client/framework/test/browser_keybindings_01.js": 5700, 
++    "devtools/client/framework/test/browser_keybindings_02.js": 4729, 
++    "devtools/client/framework/test/browser_new_activation_workflow.js": 5970, 
++    "devtools/client/framework/test/browser_source_map-inline.js": 3595, 
++    "devtools/client/framework/test/browser_source_map-reload.js": 3710, 
++    "devtools/client/framework/test/browser_toolbox_highlight.js": 3746, 
++    "devtools/client/framework/test/browser_toolbox_hosts.js": 10291, 
++    "devtools/client/framework/test/browser_toolbox_hosts_size.js": 7074, 
++    "devtools/client/framework/test/browser_toolbox_hosts_telemetry.js": 3935, 
++    "devtools/client/framework/test/browser_toolbox_options.js": 8206, 
++    "devtools/client/framework/test/browser_toolbox_options_disable_buttons.js": 5046, 
++    "devtools/client/framework/test/browser_toolbox_options_disable_cache-01.js": 7747, 
++    "devtools/client/framework/test/browser_toolbox_options_disable_cache-02.js": 10903, 
++    "devtools/client/framework/test/browser_toolbox_races.js": 6045, 
++    "devtools/client/framework/test/browser_toolbox_raise.js": 5437, 
++    "devtools/client/framework/test/browser_toolbox_remoteness_change.js": 3878, 
++    "devtools/client/framework/test/browser_toolbox_selected_tool_unavailable.js": 3754, 
++    "devtools/client/framework/test/browser_toolbox_tabsswitch_shortcuts.js": 11146, 
++    "devtools/client/framework/test/browser_toolbox_target.js": 3981, 
++    "devtools/client/framework/test/browser_toolbox_textbox_context_menu.js": 4025, 
++    "devtools/client/framework/test/browser_toolbox_toggle.js": 8992, 
++    "devtools/client/framework/test/browser_toolbox_tool_ready.js": 16445, 
++    "devtools/client/framework/test/browser_toolbox_tool_remote_reopen.js": 11519, 
++    "devtools/client/framework/test/browser_toolbox_toolbar_overflow.js": 3944, 
++    "devtools/client/framework/test/browser_toolbox_tools_per_toolbox_registration.js": 3941, 
++    "devtools/client/framework/test/browser_toolbox_view_source_03.js": 4458, 
++    "devtools/client/framework/test/browser_toolbox_view_source_04.js": 4362, 
++    "devtools/client/framework/test/browser_toolbox_window_reload_target.js": 17448, 
++    "devtools/client/framework/test/browser_toolbox_window_shortcuts.js": 7518, 
++    "devtools/client/framework/test/browser_toolbox_window_title_changes.js": 8289, 
++    "devtools/client/framework/test/browser_toolbox_window_title_frame_select.js": 5581, 
++    "devtools/client/inspector/boxmodel/test/browser_boxmodel.js": 7500, 
++    "devtools/client/inspector/boxmodel/test/browser_boxmodel_computed-accordion-state.js": 7453, 
++    "devtools/client/inspector/boxmodel/test/browser_boxmodel_editablemodel.js": 10137, 
++    "devtools/client/inspector/boxmodel/test/browser_boxmodel_editablemodel_bluronclick.js": 4964, 
++    "devtools/client/inspector/boxmodel/test/browser_boxmodel_editablemodel_border.js": 6025, 
++    "devtools/client/inspector/boxmodel/test/browser_boxmodel_editablemodel_pseudo.js": 5360, 
++    "devtools/client/inspector/boxmodel/test/browser_boxmodel_editablemodel_stylerules.js": 7790, 
++    "devtools/client/inspector/boxmodel/test/browser_boxmodel_guides.js": 4925, 
++    "devtools/client/inspector/boxmodel/test/browser_boxmodel_layout-accordion-state.js": 7854, 
++    "devtools/client/inspector/boxmodel/test/browser_boxmodel_navigation.js": 5406, 
++    "devtools/client/inspector/boxmodel/test/browser_boxmodel_offsetparent.js": 5970, 
++    "devtools/client/inspector/boxmodel/test/browser_boxmodel_positions.js": 4785, 
++    "devtools/client/inspector/boxmodel/test/browser_boxmodel_properties.js": 4760, 
++    "devtools/client/inspector/boxmodel/test/browser_boxmodel_pseudo-element.js": 4530, 
++    "devtools/client/inspector/boxmodel/test/browser_boxmodel_rotate-labels-on-sides.js": 4608, 
++    "devtools/client/inspector/boxmodel/test/browser_boxmodel_sync.js": 5227, 
++    "devtools/client/inspector/boxmodel/test/browser_boxmodel_update-after-navigation.js": 9877, 
++    "devtools/client/inspector/boxmodel/test/browser_boxmodel_update-after-reload.js": 7538, 
++    "devtools/client/inspector/components/test/browser_boxmodel.js": 8687, 
++    "devtools/client/inspector/components/test/browser_boxmodel_editablemodel.js": 10773, 
++    "devtools/client/inspector/components/test/browser_boxmodel_editablemodel_bluronclick.js": 5149, 
++    "devtools/client/inspector/components/test/browser_boxmodel_editablemodel_border.js": 6278, 
++    "devtools/client/inspector/components/test/browser_boxmodel_editablemodel_stylerules.js": 8336, 
++    "devtools/client/inspector/components/test/browser_boxmodel_guides.js": 4912, 
++    "devtools/client/inspector/components/test/browser_boxmodel_rotate-labels-on-sides.js": 4896, 
+     "devtools/client/inspector/components/test/browser_boxmodel_sync.js": 6243, 
+-    "devtools/client/inspector/components/test/browser_boxmodel_tooltips.js": 6161, 
+-    "devtools/client/inspector/components/test/browser_boxmodel_update-after-navigation.js": 11998, 
+-    "devtools/client/inspector/components/test/browser_boxmodel_update-after-reload.js": 8700, 
+-    "devtools/client/inspector/computed/test/browser_computed_browser-styles.js": 11233, 
+-    "devtools/client/inspector/computed/test/browser_computed_cycle_color.js": 5369, 
+-    "devtools/client/inspector/computed/test/browser_computed_getNodeInfo.js": 5894, 
+-    "devtools/client/inspector/computed/test/browser_computed_keybindings_01.js": 5530, 
+-    "devtools/client/inspector/computed/test/browser_computed_keybindings_02.js": 6057, 
+-    "devtools/client/inspector/computed/test/browser_computed_matched-selectors-toggle.js": 5476, 
+-    "devtools/client/inspector/computed/test/browser_computed_matched-selectors_01.js": 6225, 
+-    "devtools/client/inspector/computed/test/browser_computed_matched-selectors_02.js": 4989, 
+-    "devtools/client/inspector/computed/test/browser_computed_media-queries.js": 5758, 
+-    "devtools/client/inspector/computed/test/browser_computed_no-results-placeholder.js": 5930, 
+-    "devtools/client/inspector/computed/test/browser_computed_original-source-link.js": 8411, 
+-    "devtools/client/inspector/computed/test/browser_computed_pseudo-element_01.js": 7388, 
+-    "devtools/client/inspector/computed/test/browser_computed_refresh-on-style-change_01.js": 5600, 
+-    "devtools/client/inspector/computed/test/browser_computed_search-filter.js": 8635, 
+-    "devtools/client/inspector/computed/test/browser_computed_search-filter_clear.js": 6808, 
+-    "devtools/client/inspector/computed/test/browser_computed_search-filter_escape-keypress.js": 10700, 
+-    "devtools/client/inspector/computed/test/browser_computed_search-filter_noproperties.js": 6140, 
+-    "devtools/client/inspector/computed/test/browser_computed_style-editor-link.js": 9532, 
+-    "devtools/client/inspector/fonts/test/browser_fontinspector.js": 10453, 
+-    "devtools/client/inspector/fonts/test/browser_fontinspector_edit-previews-show-all.js": 5369, 
+-    "devtools/client/inspector/fonts/test/browser_fontinspector_edit-previews.js": 5938, 
+-    "devtools/client/inspector/fonts/test/browser_fontinspector_theme-change.js": 6053, 
+-    "devtools/client/inspector/layout/test/browser_layout_editablemodel.js": 4995, 
+-    "devtools/client/inspector/markup/test/browser_markup_accessibility_focus_blur.js": 9353, 
++    "devtools/client/inspector/components/test/browser_boxmodel_tooltips.js": 5837, 
++    "devtools/client/inspector/components/test/browser_boxmodel_update-after-navigation.js": 10440, 
++    "devtools/client/inspector/components/test/browser_boxmodel_update-after-reload.js": 8010, 
++    "devtools/client/inspector/computed/test/browser_computed_browser-styles.js": 7753, 
++    "devtools/client/inspector/computed/test/browser_computed_cycle_color.js": 4269, 
++    "devtools/client/inspector/computed/test/browser_computed_getNodeInfo.js": 4222, 
++    "devtools/client/inspector/computed/test/browser_computed_keybindings_01.js": 4528, 
++    "devtools/client/inspector/computed/test/browser_computed_keybindings_02.js": 4578, 
++    "devtools/client/inspector/computed/test/browser_computed_matched-selectors-toggle.js": 4449, 
++    "devtools/client/inspector/computed/test/browser_computed_matched-selectors_01.js": 4916, 
++    "devtools/client/inspector/computed/test/browser_computed_matched-selectors_02.js": 4239, 
++    "devtools/client/inspector/computed/test/browser_computed_media-queries.js": 4597, 
++    "devtools/client/inspector/computed/test/browser_computed_no-results-placeholder.js": 4761, 
++    "devtools/client/inspector/computed/test/browser_computed_original-source-link.js": 6254, 
++    "devtools/client/inspector/computed/test/browser_computed_pseudo-element_01.js": 5396, 
++    "devtools/client/inspector/computed/test/browser_computed_refresh-on-style-change_01.js": 4430, 
++    "devtools/client/inspector/computed/test/browser_computed_search-filter.js": 6788, 
++    "devtools/client/inspector/computed/test/browser_computed_search-filter_clear.js": 6436, 
++    "devtools/client/inspector/computed/test/browser_computed_search-filter_escape-keypress.js": 8306, 
++    "devtools/client/inspector/computed/test/browser_computed_search-filter_noproperties.js": 5295, 
++    "devtools/client/inspector/fonts/test/browser_fontinspector.js": 6571, 
++    "devtools/client/inspector/fonts/test/browser_fontinspector_edit-previews-show-all.js": 4505, 
++    "devtools/client/inspector/fonts/test/browser_fontinspector_edit-previews.js": 4739, 
++    "devtools/client/inspector/fonts/test/browser_fontinspector_theme-change.js": 4390, 
++    "devtools/client/inspector/grids/test/browser_grids_accordion-state.js": 9374, 
++    "devtools/client/inspector/grids/test/browser_grids_color-in-rules-grid-toggle.js": 4645, 
++    "devtools/client/inspector/grids/test/browser_grids_display-setting-extend-grid-lines.js": 3872, 
++    "devtools/client/inspector/grids/test/browser_grids_display-setting-show-grid-areas.js": 4154, 
++    "devtools/client/inspector/grids/test/browser_grids_display-setting-show-grid-line-numbers.js": 3932, 
++    "devtools/client/inspector/grids/test/browser_grids_grid-list-color-picker-on-ESC.js": 4095, 
++    "devtools/client/inspector/grids/test/browser_grids_grid-list-color-picker-on-RETURN.js": 3916, 
++    "devtools/client/inspector/grids/test/browser_grids_grid-list-element-rep.js": 4174, 
++    "devtools/client/inspector/grids/test/browser_grids_grid-list-no-grids.js": 3906, 
++    "devtools/client/inspector/grids/test/browser_grids_grid-list-on-iframe-reloaded.js": 5439, 
++    "devtools/client/inspector/grids/test/browser_grids_grid-list-on-mutation-element-added.js": 5082, 
++    "devtools/client/inspector/grids/test/browser_grids_grid-list-on-mutation-element-removed.js": 4902, 
++    "devtools/client/inspector/grids/test/browser_grids_grid-list-toggle-multiple-grids.js": 4852, 
++    "devtools/client/inspector/grids/test/browser_grids_grid-list-toggle-single-grid.js": 4519, 
++    "devtools/client/inspector/grids/test/browser_grids_grid-outline-cannot-show-outline.js": 4674, 
++    "devtools/client/inspector/grids/test/browser_grids_grid-outline-highlight-area.js": 4778, 
++    "devtools/client/inspector/grids/test/browser_grids_grid-outline-highlight-cell.js": 4718, 
++    "devtools/client/inspector/grids/test/browser_grids_grid-outline-selected-grid.js": 4199, 
++    "devtools/client/inspector/grids/test/browser_grids_grid-outline-updates-on-grid-change.js": 4572, 
++    "devtools/client/inspector/grids/test/browser_grids_highlighter-setting-rules-grid-toggle.js": 4327, 
++    "devtools/client/inspector/grids/test/browser_grids_number-of-css-grids-telemetry.js": 4820, 
++    "devtools/client/inspector/grids/test/browser_grids_restored-after-reload.js": 7256, 
++    "devtools/client/inspector/markup/test/browser_markup_accessibility_focus_blur.js": 5702, 
+     "devtools/client/inspector/markup/test/browser_markup_accessibility_navigation.js": 7558, 
+-    "devtools/client/inspector/markup/test/browser_markup_accessibility_semantics.js": 5507, 
+-    "devtools/client/inspector/markup/test/browser_markup_anonymous_01.js": 6043, 
+-    "devtools/client/inspector/markup/test/browser_markup_anonymous_03.js": 5843, 
+-    "devtools/client/inspector/markup/test/browser_markup_anonymous_04.js": 6292, 
+-    "devtools/client/inspector/markup/test/browser_markup_css_completion_style_attribute_01.js": 9471, 
+-    "devtools/client/inspector/markup/test/browser_markup_css_completion_style_attribute_02.js": 12064, 
+-    "devtools/client/inspector/markup/test/browser_markup_css_completion_style_attribute_03.js": 8196, 
+-    "devtools/client/inspector/markup/test/browser_markup_dragdrop_autoscroll_01.js": 10602, 
+-    "devtools/client/inspector/markup/test/browser_markup_dragdrop_autoscroll_02.js": 11720, 
+-    "devtools/client/inspector/markup/test/browser_markup_dragdrop_distance.js": 5671, 
+-    "devtools/client/inspector/markup/test/browser_markup_dragdrop_dragRootNode.js": 5569, 
+-    "devtools/client/inspector/markup/test/browser_markup_dragdrop_draggable.js": 5540, 
+-    "devtools/client/inspector/markup/test/browser_markup_dragdrop_escapeKeyPress.js": 5173, 
+-    "devtools/client/inspector/markup/test/browser_markup_dragdrop_invalidNodes.js": 5997, 
+-    "devtools/client/inspector/markup/test/browser_markup_dragdrop_reorder.js": 9886, 
+-    "devtools/client/inspector/markup/test/browser_markup_dragdrop_tooltip.js": 4960, 
+-    "devtools/client/inspector/markup/test/browser_markup_events-windowed-host.js": 13032, 
++    "devtools/client/inspector/markup/test/browser_markup_accessibility_navigation_after_edit.js": 4067, 
++    "devtools/client/inspector/markup/test/browser_markup_accessibility_semantics.js": 4080, 
++    "devtools/client/inspector/markup/test/browser_markup_anonymous_01.js": 4320, 
++    "devtools/client/inspector/markup/test/browser_markup_anonymous_04.js": 3931, 
++    "devtools/client/inspector/markup/test/browser_markup_css_completion_style_attribute_01.js": 5734, 
++    "devtools/client/inspector/markup/test/browser_markup_css_completion_style_attribute_02.js": 7196, 
++    "devtools/client/inspector/markup/test/browser_markup_css_completion_style_attribute_03.js": 5268, 
++    "devtools/client/inspector/markup/test/browser_markup_dragdrop_autoscroll_01.js": 8452, 
++    "devtools/client/inspector/markup/test/browser_markup_dragdrop_autoscroll_02.js": 9722, 
++    "devtools/client/inspector/markup/test/browser_markup_dragdrop_distance.js": 3683, 
++    "devtools/client/inspector/markup/test/browser_markup_dragdrop_dragRootNode.js": 3949, 
++    "devtools/client/inspector/markup/test/browser_markup_dragdrop_draggable.js": 3744, 
++    "devtools/client/inspector/markup/test/browser_markup_dragdrop_invalidNodes.js": 3829, 
++    "devtools/client/inspector/markup/test/browser_markup_dragdrop_reorder.js": 7424, 
++    "devtools/client/inspector/markup/test/browser_markup_dragdrop_tooltip.js": 3613, 
++    "devtools/client/inspector/markup/test/browser_markup_events-windowed-host.js": 11589, 
+     "devtools/client/inspector/markup/test/browser_markup_events1.js": 9734, 
+-    "devtools/client/inspector/markup/test/browser_markup_events2.js": 10486, 
+-    "devtools/client/inspector/markup/test/browser_markup_events3.js": 11163, 
+-    "devtools/client/inspector/markup/test/browser_markup_events_01.js": 11814, 
+-    "devtools/client/inspector/markup/test/browser_markup_events_02.js": 12496, 
+-    "devtools/client/inspector/markup/test/browser_markup_events_03.js": 10715, 
+-    "devtools/client/inspector/markup/test/browser_markup_events_04.js": 12996, 
+-    "devtools/client/inspector/markup/test/browser_markup_events_form.js": 6197, 
+-    "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.0.js": 10675, 
+-    "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.1.js": 10934, 
+-    "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.11.1.js": 11341, 
+-    "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.2.js": 9700, 
+-    "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.3.js": 13655, 
+-    "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.4.js": 12951, 
+-    "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.6.js": 14910, 
+-    "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.7.js": 13775, 
+-    "devtools/client/inspector/markup/test/browser_markup_events_jquery_2.1.1.js": 11548, 
+-    "devtools/client/inspector/markup/test/browser_markup_html_edit_01.js": 15757, 
+-    "devtools/client/inspector/markup/test/browser_markup_html_edit_02.js": 12583, 
+-    "devtools/client/inspector/markup/test/browser_markup_html_edit_03.js": 10358, 
+-    "devtools/client/inspector/markup/test/browser_markup_image_tooltip.js": 5155, 
+-    "devtools/client/inspector/markup/test/browser_markup_keybindings_01.js": 4986, 
+-    "devtools/client/inspector/markup/test/browser_markup_keybindings_02.js": 5464, 
+-    "devtools/client/inspector/markup/test/browser_markup_keybindings_03.js": 6879, 
+-    "devtools/client/inspector/markup/test/browser_markup_keybindings_04.js": 8498, 
+-    "devtools/client/inspector/markup/test/browser_markup_keybindings_scrolltonode.js": 5517, 
+-    "devtools/client/inspector/markup/test/browser_markup_links_01.js": 9121, 
+-    "devtools/client/inspector/markup/test/browser_markup_links_02.js": 5753, 
+-    "devtools/client/inspector/markup/test/browser_markup_links_03.js": 5413, 
+-    "devtools/client/inspector/markup/test/browser_markup_links_05.js": 8040, 
+-    "devtools/client/inspector/markup/test/browser_markup_links_06.js": 10484, 
+-    "devtools/client/inspector/markup/test/browser_markup_links_07.js": 8784, 
+-    "devtools/client/inspector/markup/test/browser_markup_load_01.js": 7648, 
+-    "devtools/client/inspector/markup/test/browser_markup_mutation_01.js": 9416, 
+-    "devtools/client/inspector/markup/test/browser_markup_mutation_02.js": 5622, 
+-    "devtools/client/inspector/markup/test/browser_markup_navigation.js": 14847, 
+-    "devtools/client/inspector/markup/test/browser_markup_node_not_displayed_02.js": 6958, 
+-    "devtools/client/inspector/markup/test/browser_markup_pagesize_01.js": 6603, 
+-    "devtools/client/inspector/markup/test/browser_markup_pagesize_02.js": 8210, 
+-    "devtools/client/inspector/markup/test/browser_markup_search_01.js": 9445, 
+-    "devtools/client/inspector/markup/test/browser_markup_tag_edit_01.js": 10127, 
+-    "devtools/client/inspector/markup/test/browser_markup_tag_edit_02.js": 5066, 
+-    "devtools/client/inspector/markup/test/browser_markup_tag_edit_03.js": 5473, 
+-    "devtools/client/inspector/markup/test/browser_markup_tag_edit_04-backspace.js": 14069, 
+-    "devtools/client/inspector/markup/test/browser_markup_tag_edit_04-delete.js": 13327, 
+-    "devtools/client/inspector/markup/test/browser_markup_tag_edit_05.js": 7278, 
+-    "devtools/client/inspector/markup/test/browser_markup_tag_edit_06.js": 7830, 
+-    "devtools/client/inspector/markup/test/browser_markup_tag_edit_07.js": 8178, 
+-    "devtools/client/inspector/markup/test/browser_markup_tag_edit_08.js": 8286, 
+-    "devtools/client/inspector/markup/test/browser_markup_tag_edit_09.js": 5628, 
+-    "devtools/client/inspector/markup/test/browser_markup_tag_edit_10.js": 5146, 
+-    "devtools/client/inspector/markup/test/browser_markup_tag_edit_12.js": 5375, 
+-    "devtools/client/inspector/markup/test/browser_markup_textcontent_display.js": 5394, 
+-    "devtools/client/inspector/markup/test/browser_markup_textcontent_edit_01.js": 9860, 
+-    "devtools/client/inspector/markup/test/browser_markup_textcontent_edit_02.js": 7045, 
+-    "devtools/client/inspector/markup/test/browser_markup_toggle_01.js": 6500, 
+-    "devtools/client/inspector/markup/test/browser_markup_toggle_02.js": 6311, 
+-    "devtools/client/inspector/markup/test/browser_markup_toggle_03.js": 6962, 
+-    "devtools/client/inspector/markup/test/browser_markup_update-on-navigtion.js": 6235, 
+-    "devtools/client/inspector/markup/test/browser_markup_whitespace.js": 5632, 
+-    "devtools/client/inspector/rules/test/browser_rules_add-property-and-reselect.js": 11294, 
+-    "devtools/client/inspector/rules/test/browser_rules_add-property-cancel_02.js": 6070, 
+-    "devtools/client/inspector/rules/test/browser_rules_add-property-cancel_03.js": 5252, 
+-    "devtools/client/inspector/rules/test/browser_rules_add-property-commented.js": 5425, 
+-    "devtools/client/inspector/rules/test/browser_rules_add-property-svg.js": 6095, 
+-    "devtools/client/inspector/rules/test/browser_rules_add-property_01.js": 6299, 
+-    "devtools/client/inspector/rules/test/browser_rules_add-property_02.js": 5764, 
+-    "devtools/client/inspector/rules/test/browser_rules_add-rule-and-property.js": 5169, 
+-    "devtools/client/inspector/rules/test/browser_rules_add-rule-button-state.js": 5563, 
+-    "devtools/client/inspector/rules/test/browser_rules_add-rule-edit-selector.js": 5908, 
+-    "devtools/client/inspector/rules/test/browser_rules_add-rule-iframes.js": 7840, 
+-    "devtools/client/inspector/rules/test/browser_rules_add-rule-namespace-elements.js": 6806, 
+-    "devtools/client/inspector/rules/test/browser_rules_add-rule-pseudo-class.js": 10439, 
+-    "devtools/client/inspector/rules/test/browser_rules_add-rule-then-property-edit-selector.js": 6157, 
+-    "devtools/client/inspector/rules/test/browser_rules_add-rule-with-menu.js": 5119, 
+-    "devtools/client/inspector/rules/test/browser_rules_add-rule.js": 9561, 
+-    "devtools/client/inspector/rules/test/browser_rules_authored_color.js": 6967, 
+-    "devtools/client/inspector/rules/test/browser_rules_blob_stylesheet.js": 5260, 
+-    "devtools/client/inspector/rules/test/browser_rules_colorUnit.js": 11215, 
+-    "devtools/client/inspector/rules/test/browser_rules_colorpicker-and-image-tooltip_02.js": 5006, 
+-    "devtools/client/inspector/rules/test/browser_rules_colorpicker-appears-on-swatch-click.js": 4976, 
+-    "devtools/client/inspector/rules/test/browser_rules_colorpicker-commit-on-ENTER.js": 5022, 
+-    "devtools/client/inspector/rules/test/browser_rules_colorpicker-multiple-changes.js": 6756, 
+-    "devtools/client/inspector/rules/test/browser_rules_completion-existing-property_01.js": 11723, 
+-    "devtools/client/inspector/rules/test/browser_rules_completion-existing-property_02.js": 11455, 
+-    "devtools/client/inspector/rules/test/browser_rules_completion-new-property_01.js": 8833, 
+-    "devtools/client/inspector/rules/test/browser_rules_completion-new-property_02.js": 12385, 
+-    "devtools/client/inspector/rules/test/browser_rules_completion-new-property_03.js": 6123, 
+-    "devtools/client/inspector/rules/test/browser_rules_completion-new-property_04.js": 6779, 
+-    "devtools/client/inspector/rules/test/browser_rules_completion-new-property_multiline.js": 5945, 
+-    "devtools/client/inspector/rules/test/browser_rules_completion-popup-hidden-after-navigation.js": 5927, 
+-    "devtools/client/inspector/rules/test/browser_rules_computed-lists_02.js": 4917, 
+-    "devtools/client/inspector/rules/test/browser_rules_content_01.js": 4922, 
+-    "devtools/client/inspector/rules/test/browser_rules_context-menu-show-mdn-docs-01.js": 6232, 
+-    "devtools/client/inspector/rules/test/browser_rules_context-menu-show-mdn-docs-03.js": 9284, 
+-    "devtools/client/inspector/rules/test/browser_rules_cubicbezier-appears-on-swatch-click.js": 5418, 
+-    "devtools/client/inspector/rules/test/browser_rules_cubicbezier-commit-on-ENTER.js": 5135, 
+-    "devtools/client/inspector/rules/test/browser_rules_cubicbezier-revert-on-ESC.js": 4965, 
+-    "devtools/client/inspector/rules/test/browser_rules_custom.js": 7059, 
+-    "devtools/client/inspector/rules/test/browser_rules_cycle-angle.js": 5546, 
+-    "devtools/client/inspector/rules/test/browser_rules_cycle-color.js": 6420, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-display-grid-property.js": 5582, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-property-cancel.js": 5569, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-property-click.js": 5751, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-property-commit.js": 7067, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-property-computed.js": 5729, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-property-increments.js": 12456, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-property-order.js": 8776, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-property-remove_01.js": 5820, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-property-remove_02.js": 5852, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-property-remove_03.js": 6054, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-property_01.js": 10220, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-property_02.js": 8191, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-property_03.js": 5993, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-property_04.js": 6275, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-property_05.js": 6881, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-property_06.js": 6014, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-property_07.js": 5585, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-property_08.js": 6029, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-property_09.js": 6097, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-selector-click-on-scrollbar.js": 5460, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-selector-commit.js": 7670, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-selector_01.js": 5702, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-selector_02.js": 7086, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-selector_03.js": 5288, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-selector_04.js": 6125, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-selector_05.js": 6660, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-selector_06.js": 6245, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-selector_07.js": 5650, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-selector_08.js": 6291, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-selector_09.js": 7372, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-selector_10.js": 5806, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-selector_11.js": 5997, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-value-after-name_01.js": 5662, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-value-after-name_02.js": 5448, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-value-after-name_03.js": 5493, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-value-after-name_04.js": 5680, 
+-    "devtools/client/inspector/rules/test/browser_rules_editable-field-focus_01.js": 9759, 
+-    "devtools/client/inspector/rules/test/browser_rules_editable-field-focus_02.js": 7290, 
+-    "devtools/client/inspector/rules/test/browser_rules_eyedropper.js": 5934, 
+-    "devtools/client/inspector/rules/test/browser_rules_filtereditor-appears-on-swatch-click.js": 5156, 
+-    "devtools/client/inspector/rules/test/browser_rules_filtereditor-commit-on-ENTER.js": 5299, 
+-    "devtools/client/inspector/rules/test/browser_rules_grid-highlighter-on-navigate.js": 6210, 
+-    "devtools/client/inspector/rules/test/browser_rules_grid-toggle_01.js": 4950, 
+-    "devtools/client/inspector/rules/test/browser_rules_grid-toggle_02.js": 5246, 
+-    "devtools/client/inspector/rules/test/browser_rules_grid-toggle_03.js": 5800, 
+-    "devtools/client/inspector/rules/test/browser_rules_guessIndentation.js": 7175, 
+-    "devtools/client/inspector/rules/test/browser_rules_inline-source-map.js": 4999, 
+-    "devtools/client/inspector/rules/test/browser_rules_invalid-source-map.js": 5192, 
+-    "devtools/client/inspector/rules/test/browser_rules_keybindings.js": 5393, 
+-    "devtools/client/inspector/rules/test/browser_rules_keyframeLineNumbers.js": 9017, 
+-    "devtools/client/inspector/rules/test/browser_rules_keyframes-rule_01.js": 9286, 
+-    "devtools/client/inspector/rules/test/browser_rules_keyframes-rule_02.js": 8414, 
+-    "devtools/client/inspector/rules/test/browser_rules_lineNumbers.js": 6040, 
+-    "devtools/client/inspector/rules/test/browser_rules_livepreview.js": 7952, 
+-    "devtools/client/inspector/rules/test/browser_rules_mark_overridden_01.js": 5857, 
+-    "devtools/client/inspector/rules/test/browser_rules_mark_overridden_05.js": 5921, 
+-    "devtools/client/inspector/rules/test/browser_rules_mark_overridden_06.js": 5667, 
+-    "devtools/client/inspector/rules/test/browser_rules_mark_overridden_07.js": 5215, 
+-    "devtools/client/inspector/rules/test/browser_rules_mathml-element.js": 5681, 
+-    "devtools/client/inspector/rules/test/browser_rules_media-queries.js": 5079, 
+-    "devtools/client/inspector/rules/test/browser_rules_multiple-properties-duplicates.js": 6057, 
+-    "devtools/client/inspector/rules/test/browser_rules_multiple-properties-priority.js": 5373, 
+-    "devtools/client/inspector/rules/test/browser_rules_multiple-properties-unfinished_01.js": 5916, 
+-    "devtools/client/inspector/rules/test/browser_rules_multiple-properties-unfinished_02.js": 5757, 
+-    "devtools/client/inspector/rules/test/browser_rules_multiple_properties_01.js": 5492, 
+-    "devtools/client/inspector/rules/test/browser_rules_multiple_properties_02.js": 5661, 
+-    "devtools/client/inspector/rules/test/browser_rules_original-source-link.js": 7078, 
+-    "devtools/client/inspector/rules/test/browser_rules_pseudo-element_01.js": 9883, 
+-    "devtools/client/inspector/rules/test/browser_rules_pseudo-element_02.js": 5788, 
+-    "devtools/client/inspector/rules/test/browser_rules_pseudo_lock_options.js": 7254, 
+-    "devtools/client/inspector/rules/test/browser_rules_refresh-on-attribute-change_01.js": 5044, 
+-    "devtools/client/inspector/rules/test/browser_rules_refresh-on-attribute-change_02.js": 6149, 
+-    "devtools/client/inspector/rules/test/browser_rules_search-filter-computed-list_01.js": 6704, 
+-    "devtools/client/inspector/rules/test/browser_rules_search-filter-computed-list_02.js": 5313, 
+-    "devtools/client/inspector/rules/test/browser_rules_search-filter-computed-list_03.js": 5034, 
+-    "devtools/client/inspector/rules/test/browser_rules_search-filter-computed-list_04.js": 5794, 
+-    "devtools/client/inspector/rules/test/browser_rules_search-filter-computed-list_expander.js": 5181, 
+-    "devtools/client/inspector/rules/test/browser_rules_search-filter-overridden-property.js": 5197, 
+-    "devtools/client/inspector/rules/test/browser_rules_search-filter_01.js": 6553, 
+-    "devtools/client/inspector/rules/test/browser_rules_search-filter_02.js": 7946, 
+-    "devtools/client/inspector/rules/test/browser_rules_search-filter_03.js": 4937, 
+-    "devtools/client/inspector/rules/test/browser_rules_search-filter_04.js": 5343, 
+-    "devtools/client/inspector/rules/test/browser_rules_search-filter_05.js": 5626, 
+-    "devtools/client/inspector/rules/test/browser_rules_search-filter_06.js": 5688, 
+-    "devtools/client/inspector/rules/test/browser_rules_search-filter_07.js": 6031, 
+-    "devtools/client/inspector/rules/test/browser_rules_search-filter_08.js": 5721, 
+-    "devtools/client/inspector/rules/test/browser_rules_search-filter_09.js": 5748, 
+-    "devtools/client/inspector/rules/test/browser_rules_search-filter_10.js": 5730, 
+-    "devtools/client/inspector/rules/test/browser_rules_search-filter_escape-keypress.js": 5194, 
+-    "devtools/client/inspector/rules/test/browser_rules_selector-highlighter-on-navigate.js": 5842, 
+-    "devtools/client/inspector/rules/test/browser_rules_selector-highlighter_02.js": 5138, 
+-    "devtools/client/inspector/rules/test/browser_rules_selector-highlighter_03.js": 5445, 
+-    "devtools/client/inspector/rules/test/browser_rules_selector_highlight.js": 7123, 
+-    "devtools/client/inspector/rules/test/browser_rules_strict-search-filter-computed-list_01.js": 7535, 
+-    "devtools/client/inspector/rules/test/browser_rules_strict-search-filter_01.js": 7447, 
+-    "devtools/client/inspector/rules/test/browser_rules_strict-search-filter_02.js": 5644, 
+-    "devtools/client/inspector/rules/test/browser_rules_strict-search-filter_03.js": 5046, 
+-    "devtools/client/inspector/rules/test/browser_rules_style-editor-link.js": 10287, 
+-    "devtools/client/inspector/rules/test/browser_rules_urls-clickable.js": 6470, 
+-    "devtools/client/inspector/rules/test/browser_rules_user-agent-styles-uneditable.js": 6078, 
+-    "devtools/client/inspector/rules/test/browser_rules_user-agent-styles.js": 25481, 
+-    "devtools/client/inspector/rules/test/browser_rules_user-property-reset.js": 7767, 
+-    "devtools/client/inspector/shared/test/browser_styleinspector_context-menu-copy-color_01.js": 19668, 
+-    "devtools/client/inspector/shared/test/browser_styleinspector_csslogic-content-stylesheets.js": 11082, 
+-    "devtools/client/inspector/shared/test/browser_styleinspector_refresh_when_active.js": 5648, 
+-    "devtools/client/inspector/shared/test/browser_styleinspector_tooltip-background-image.js": 6218, 
+-    "devtools/client/inspector/shared/test/browser_styleinspector_tooltip-longhand-fontfamily.js": 5967, 
+-    "devtools/client/inspector/shared/test/browser_styleinspector_tooltip-multiple-background-images.js": 5516, 
+-    "devtools/client/inspector/shared/test/browser_styleinspector_tooltip-shorthand-fontfamily.js": 5062, 
+-    "devtools/client/inspector/shared/test/browser_styleinspector_tooltip-size.js": 5016, 
+-    "devtools/client/inspector/shared/test/browser_styleinspector_transform-highlighter-01.js": 5350, 
+-    "devtools/client/inspector/shared/test/browser_styleinspector_transform-highlighter-02.js": 5686, 
+-    "devtools/client/inspector/shared/test/browser_styleinspector_transform-highlighter-03.js": 5133, 
+-    "devtools/client/inspector/shared/test/browser_styleinspector_transform-highlighter-04.js": 5638, 
+-    "devtools/client/inspector/test/browser_inspector_addNode_01.js": 9199, 
+-    "devtools/client/inspector/test/browser_inspector_addNode_02.js": 5969, 
+-    "devtools/client/inspector/test/browser_inspector_addNode_03.js": 7433, 
+-    "devtools/client/inspector/test/browser_inspector_breadcrumbs.js": 10090, 
+-    "devtools/client/inspector/test/browser_inspector_breadcrumbs_highlight_hover.js": 5337, 
+-    "devtools/client/inspector/test/browser_inspector_breadcrumbs_keybinding.js": 6397, 
+-    "devtools/client/inspector/test/browser_inspector_breadcrumbs_mutations.js": 8295, 
+-    "devtools/client/inspector/test/browser_inspector_breadcrumbs_visibility.js": 6376, 
+-    "devtools/client/inspector/test/browser_inspector_delete-selected-node-01.js": 6536, 
+-    "devtools/client/inspector/test/browser_inspector_delete-selected-node-02.js": 12775, 
+-    "devtools/client/inspector/test/browser_inspector_delete-selected-node-03.js": 6060, 
+-    "devtools/client/inspector/test/browser_inspector_destroy-after-navigation.js": 5757, 
+-    "devtools/client/inspector/test/browser_inspector_destroy-before-ready.js": 5769, 
+-    "devtools/client/inspector/test/browser_inspector_gcli-inspect-command.js": 7999, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-01.js": 5656, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-02.js": 9583, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-03.js": 6842, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-cancel.js": 8115, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-comments.js": 7905, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-csstransform_01.js": 4993, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-embed.js": 6012, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-eyedropper-events.js": 5111, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-eyedropper-label.js": 5165, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-eyedropper-xul.js": 7076, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-geometry_01.js": 4918, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-geometry_02.js": 5488, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-geometry_03.js": 5225, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-geometry_04.js": 6060, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-geometry_05.js": 6558, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-geometry_06.js": 7284, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-hover_01.js": 6411, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-hover_02.js": 5059, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-hover_03.js": 6686, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-iframes_01.js": 8139, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-iframes_02.js": 6904, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-inline.js": 17802, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-keybinding_01.js": 7281, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-keybinding_02.js": 6671, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-keybinding_03.js": 5759, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-keybinding_04.js": 6021, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-options.js": 6169, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-preview.js": 7961, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-selector_01.js": 6836, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-xbl.js": 5674, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-zoom.js": 6600, 
+-    "devtools/client/inspector/test/browser_inspector_iframe-navigation.js": 5010, 
+-    "devtools/client/inspector/test/browser_inspector_infobar_01.js": 10910, 
+-    "devtools/client/inspector/test/browser_inspector_infobar_02.js": 6433, 
+-    "devtools/client/inspector/test/browser_inspector_infobar_03.js": 5861, 
+-    "devtools/client/inspector/test/browser_inspector_infobar_textnode.js": 7853, 
+-    "devtools/client/inspector/test/browser_inspector_initialization.js": 8399, 
+-    "devtools/client/inspector/test/browser_inspector_invalidate.js": 4988, 
+-    "devtools/client/inspector/test/browser_inspector_keyboard-shortcuts.js": 10669, 
+-    "devtools/client/inspector/test/browser_inspector_menu-04-use-in-console.js": 6965, 
+-    "devtools/client/inspector/test/browser_inspector_menu-05-attribute-items.js": 5949, 
+-    "devtools/client/inspector/test/browser_inspector_menu-06-other.js": 10591, 
+-    "devtools/client/inspector/test/browser_inspector_navigate_to_errors.js": 13589, 
+-    "devtools/client/inspector/test/browser_inspector_navigation.js": 8612, 
+-    "devtools/client/inspector/test/browser_inspector_open_on_neterror.js": 7032, 
+-    "devtools/client/inspector/test/browser_inspector_pane-toggle-02.js": 5186, 
+-    "devtools/client/inspector/test/browser_inspector_pane-toggle-03.js": 4981, 
+-    "devtools/client/inspector/test/browser_inspector_picker-stop-on-destroy.js": 5355, 
+-    "devtools/client/inspector/test/browser_inspector_picker-stop-on-tool-change.js": 5401, 
+-    "devtools/client/inspector/test/browser_inspector_portrait_mode.js": 9215, 
+-    "devtools/client/inspector/test/browser_inspector_pseudoclass-lock.js": 8923, 
+-    "devtools/client/inspector/test/browser_inspector_pseudoclass-menu.js": 4954, 
+-    "devtools/client/inspector/test/browser_inspector_reload-01.js": 5854, 
+-    "devtools/client/inspector/test/browser_inspector_reload-02.js": 6146, 
+-    "devtools/client/inspector/test/browser_inspector_remove-iframe-during-load.js": 5890, 
+-    "devtools/client/inspector/test/browser_inspector_search-01.js": 12616, 
+-    "devtools/client/inspector/test/browser_inspector_search-02.js": 7235, 
+-    "devtools/client/inspector/test/browser_inspector_search-03.js": 7320, 
+-    "devtools/client/inspector/test/browser_inspector_search-04.js": 5373, 
+-    "devtools/client/inspector/test/browser_inspector_search-05.js": 14584, 
+-    "devtools/client/inspector/test/browser_inspector_search-06.js": 9073, 
+-    "devtools/client/inspector/test/browser_inspector_search-label.js": 6173, 
+-    "devtools/client/inspector/test/browser_inspector_search-navigation.js": 7122, 
+-    "devtools/client/inspector/test/browser_inspector_search-reserved.js": 6232, 
+-    "devtools/client/inspector/test/browser_inspector_search-selection.js": 10932, 
+-    "devtools/client/inspector/test/browser_inspector_search-sidebar.js": 6775, 
+-    "devtools/client/inspector/test/browser_inspector_search_keyboard_trap.js": 5313, 
+-    "devtools/client/inspector/test/browser_inspector_select-docshell.js": 5763, 
+-    "devtools/client/inspector/test/browser_inspector_select-last-selected.js": 16193, 
+-    "devtools/client/inspector/test/browser_inspector_sidebarstate.js": 8902, 
+-    "devtools/client/inspector/test/browser_inspector_startup.js": 5985, 
+-    "devtools/client/inspector/test/browser_inspector_switch-to-inspector-on-pick.js": 5411, 
+-    "devtools/client/inspector/test/browser_inspector_textbox-menu.js": 6809, 
+-    "devtools/client/memory/test/browser/browser_memory_allocationStackDisplay_01.js": 6841, 
+-    "devtools/client/memory/test/browser/browser_memory_clear_snapshots.js": 7578, 
+-    "devtools/client/memory/test/browser/browser_memory_diff_01.js": 6003, 
+-    "devtools/client/memory/test/browser/browser_memory_displays_01.js": 4914, 
+-    "devtools/client/memory/test/browser/browser_memory_dominator_trees_01.js": 20227, 
+-    "devtools/client/memory/test/browser/browser_memory_dominator_trees_02.js": 6883, 
+-    "devtools/client/memory/test/browser/browser_memory_filter_01.js": 6727, 
+-    "devtools/client/memory/test/browser/browser_memory_individuals_01.js": 8165, 
+-    "devtools/client/memory/test/browser/browser_memory_keyboard-snapshot-list.js": 8628, 
+-    "devtools/client/memory/test/browser/browser_memory_keyboard.js": 5793, 
+-    "devtools/client/memory/test/browser/browser_memory_no_allocation_stacks.js": 4927, 
+-    "devtools/client/memory/test/browser/browser_memory_simple_01.js": 5826, 
+-    "devtools/client/netmonitor/test/browser_net_aaa_leaktest.js": 7143, 
+-    "devtools/client/netmonitor/test/browser_net_accessibility-01.js": 18530, 
+-    "devtools/client/netmonitor/test/browser_net_accessibility-02.js": 16038, 
+-    "devtools/client/netmonitor/test/browser_net_api-calls.js": 6337, 
+-    "devtools/client/netmonitor/test/browser_net_autoscroll.js": 15924, 
+-    "devtools/client/netmonitor/test/browser_net_brotli.js": 5268, 
+-    "devtools/client/netmonitor/test/browser_net_cached-status.js": 6904, 
+-    "devtools/client/netmonitor/test/browser_net_cause.js": 8602, 
+-    "devtools/client/netmonitor/test/browser_net_cause_redirect.js": 5983, 
++    "devtools/client/inspector/markup/test/browser_markup_events2.js": 11281, 
++    "devtools/client/inspector/markup/test/browser_markup_events3.js": 12275, 
++    "devtools/client/inspector/markup/test/browser_markup_events_01.js": 6776, 
++    "devtools/client/inspector/markup/test/browser_markup_events_02.js": 8267, 
++    "devtools/client/inspector/markup/test/browser_markup_events_03.js": 7466, 
++    "devtools/client/inspector/markup/test/browser_markup_events_04.js": 8638, 
++    "devtools/client/inspector/markup/test/browser_markup_events_click_to_close.js": 4472, 
++    "devtools/client/inspector/markup/test/browser_markup_events_form.js": 4864, 
++    "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.0.js": 7471, 
++    "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.1.js": 7643, 
++    "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.11.1.js": 7715, 
++    "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.2.js": 6882, 
++    "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.3.js": 10036, 
++    "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.4.js": 9392, 
++    "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.6.js": 10709, 
++    "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.7.js": 10108, 
++    "devtools/client/inspector/markup/test/browser_markup_events_jquery_2.1.1.js": 8658, 
++    "devtools/client/inspector/markup/test/browser_markup_events_react_development_15.4.1.js": 9277, 
++    "devtools/client/inspector/markup/test/browser_markup_events_react_development_15.4.1_jsx.js": 10500, 
++    "devtools/client/inspector/markup/test/browser_markup_events_react_production_15.3.1.js": 8153, 
++    "devtools/client/inspector/markup/test/browser_markup_events_react_production_15.3.1_jsx.js": 8318, 
++    "devtools/client/inspector/markup/test/browser_markup_events_source_map.js": 6672, 
++    "devtools/client/inspector/markup/test/browser_markup_html_edit_01.js": 12005, 
++    "devtools/client/inspector/markup/test/browser_markup_html_edit_02.js": 9615, 
++    "devtools/client/inspector/markup/test/browser_markup_html_edit_03.js": 6963, 
++    "devtools/client/inspector/markup/test/browser_markup_image_tooltip.js": 4314, 
++    "devtools/client/inspector/markup/test/browser_markup_image_tooltip_mutations.js": 3854, 
++    "devtools/client/inspector/markup/test/browser_markup_keybindings_02.js": 3609, 
++    "devtools/client/inspector/markup/test/browser_markup_keybindings_03.js": 5530, 
++    "devtools/client/inspector/markup/test/browser_markup_keybindings_04.js": 6754, 
++    "devtools/client/inspector/markup/test/browser_markup_keybindings_scrolltonode.js": 3801, 
++    "devtools/client/inspector/markup/test/browser_markup_links_01.js": 5727, 
++    "devtools/client/inspector/markup/test/browser_markup_links_02.js": 3907, 
++    "devtools/client/inspector/markup/test/browser_markup_links_03.js": 3741, 
++    "devtools/client/inspector/markup/test/browser_markup_links_05.js": 4939, 
++    "devtools/client/inspector/markup/test/browser_markup_links_06.js": 7434, 
++    "devtools/client/inspector/markup/test/browser_markup_links_07.js": 5782, 
++    "devtools/client/inspector/markup/test/browser_markup_load_01.js": 5999, 
++    "devtools/client/inspector/markup/test/browser_markup_mutation_01.js": 5942, 
++    "devtools/client/inspector/markup/test/browser_markup_mutation_02.js": 4240, 
++    "devtools/client/inspector/markup/test/browser_markup_navigation.js": 8587, 
++    "devtools/client/inspector/markup/test/browser_markup_node_not_displayed_01.js": 3603, 
++    "devtools/client/inspector/markup/test/browser_markup_node_not_displayed_02.js": 5821, 
++    "devtools/client/inspector/markup/test/browser_markup_pagesize_01.js": 4407, 
++    "devtools/client/inspector/markup/test/browser_markup_pagesize_02.js": 6136, 
++    "devtools/client/inspector/markup/test/browser_markup_search_01.js": 8035, 
++    "devtools/client/inspector/markup/test/browser_markup_tag_delete_whitespace_node.js": 5872, 
++    "devtools/client/inspector/markup/test/browser_markup_tag_edit_01.js": 6073, 
++    "devtools/client/inspector/markup/test/browser_markup_tag_edit_02.js": 3603, 
++    "devtools/client/inspector/markup/test/browser_markup_tag_edit_03.js": 3826, 
++    "devtools/client/inspector/markup/test/browser_markup_tag_edit_04-backspace.js": 10740, 
++    "devtools/client/inspector/markup/test/browser_markup_tag_edit_04-delete.js": 10258, 
++    "devtools/client/inspector/markup/test/browser_markup_tag_edit_05.js": 4865, 
++    "devtools/client/inspector/markup/test/browser_markup_tag_edit_06.js": 5390, 
++    "devtools/client/inspector/markup/test/browser_markup_tag_edit_07.js": 5560, 
++    "devtools/client/inspector/markup/test/browser_markup_tag_edit_08.js": 4937, 
++    "devtools/client/inspector/markup/test/browser_markup_tag_edit_09.js": 4027, 
++    "devtools/client/inspector/markup/test/browser_markup_tag_edit_10.js": 3563, 
++    "devtools/client/inspector/markup/test/browser_markup_tag_edit_12.js": 3870, 
++    "devtools/client/inspector/markup/test/browser_markup_tag_edit_long-classname.js": 3657, 
++    "devtools/client/inspector/markup/test/browser_markup_textcontent_display.js": 3692, 
++    "devtools/client/inspector/markup/test/browser_markup_textcontent_edit_01.js": 5813, 
++    "devtools/client/inspector/markup/test/browser_markup_textcontent_edit_02.js": 4566, 
++    "devtools/client/inspector/markup/test/browser_markup_toggle_01.js": 4883, 
++    "devtools/client/inspector/markup/test/browser_markup_toggle_02.js": 4779, 
++    "devtools/client/inspector/markup/test/browser_markup_toggle_03.js": 4636, 
++    "devtools/client/inspector/markup/test/browser_markup_update-on-navigtion.js": 4244, 
++    "devtools/client/inspector/markup/test/browser_markup_whitespace.js": 3942, 
++    "devtools/client/inspector/rules/test/browser_rules_add-property-and-reselect.js": 5483, 
++    "devtools/client/inspector/rules/test/browser_rules_add-property-cancel_01.js": 4019, 
++    "devtools/client/inspector/rules/test/browser_rules_add-property-cancel_02.js": 3646, 
++    "devtools/client/inspector/rules/test/browser_rules_add-property-cancel_03.js": 3766, 
++    "devtools/client/inspector/rules/test/browser_rules_add-property-commented.js": 3621, 
++    "devtools/client/inspector/rules/test/browser_rules_add-property-svg.js": 4234, 
++    "devtools/client/inspector/rules/test/browser_rules_add-property_01.js": 4014, 
++    "devtools/client/inspector/rules/test/browser_rules_add-property_02.js": 4067, 
++    "devtools/client/inspector/rules/test/browser_rules_add-rule-and-property.js": 3611, 
++    "devtools/client/inspector/rules/test/browser_rules_add-rule-button-state.js": 3924, 
++    "devtools/client/inspector/rules/test/browser_rules_add-rule-edit-selector.js": 4032, 
++    "devtools/client/inspector/rules/test/browser_rules_add-rule-iframes.js": 4984, 
++    "devtools/client/inspector/rules/test/browser_rules_add-rule-namespace-elements.js": 4570, 
++    "devtools/client/inspector/rules/test/browser_rules_add-rule-pseudo-class.js": 6510, 
++    "devtools/client/inspector/rules/test/browser_rules_add-rule-then-property-edit-selector.js": 4308, 
++    "devtools/client/inspector/rules/test/browser_rules_add-rule-with-menu.js": 3736, 
++    "devtools/client/inspector/rules/test/browser_rules_add-rule.js": 5754, 
++    "devtools/client/inspector/rules/test/browser_rules_authored_color.js": 5356, 
++    "devtools/client/inspector/rules/test/browser_rules_blob_stylesheet.js": 3562, 
++    "devtools/client/inspector/rules/test/browser_rules_class_panel_add.js": 4962, 
++    "devtools/client/inspector/rules/test/browser_rules_class_panel_content.js": 3938, 
++    "devtools/client/inspector/rules/test/browser_rules_class_panel_edit.js": 3639, 
++    "devtools/client/inspector/rules/test/browser_rules_class_panel_invalid_nodes.js": 3636, 
++    "devtools/client/inspector/rules/test/browser_rules_class_panel_mutation.js": 3897, 
++    "devtools/client/inspector/rules/test/browser_rules_class_panel_state_preserved.js": 3655, 
++    "devtools/client/inspector/rules/test/browser_rules_colorUnit.js": 8353, 
++    "devtools/client/inspector/rules/test/browser_rules_colorpicker-and-image-tooltip_02.js": 3600, 
++    "devtools/client/inspector/rules/test/browser_rules_colorpicker-appears-on-swatch-click.js": 3714, 
++    "devtools/client/inspector/rules/test/browser_rules_colorpicker-hides-on-tooltip.js": 3620, 
++    "devtools/client/inspector/rules/test/browser_rules_colorpicker-multiple-changes.js": 4665, 
++    "devtools/client/inspector/rules/test/browser_rules_colorpicker-revert-on-ESC.js": 3580, 
++    "devtools/client/inspector/rules/test/browser_rules_colorpicker-swatch-displayed.js": 3532, 
++    "devtools/client/inspector/rules/test/browser_rules_completion-existing-property_01.js": 7167, 
++    "devtools/client/inspector/rules/test/browser_rules_completion-existing-property_02.js": 7211, 
++    "devtools/client/inspector/rules/test/browser_rules_completion-new-property_01.js": 5722, 
++    "devtools/client/inspector/rules/test/browser_rules_completion-new-property_02.js": 7922, 
++    "devtools/client/inspector/rules/test/browser_rules_completion-new-property_03.js": 4183, 
++    "devtools/client/inspector/rules/test/browser_rules_completion-new-property_04.js": 4618, 
++    "devtools/client/inspector/rules/test/browser_rules_completion-new-property_multiline.js": 4256, 
++    "devtools/client/inspector/rules/test/browser_rules_completion-popup-hidden-after-navigation.js": 4417, 
++    "devtools/client/inspector/rules/test/browser_rules_content_01.js": 3581, 
++    "devtools/client/inspector/rules/test/browser_rules_context-menu-show-mdn-docs-01.js": 4172, 
++    "devtools/client/inspector/rules/test/browser_rules_context-menu-show-mdn-docs-02.js": 3555, 
++    "devtools/client/inspector/rules/test/browser_rules_context-menu-show-mdn-docs-03.js": 6725, 
++    "devtools/client/inspector/rules/test/browser_rules_cubicbezier-appears-on-swatch-click.js": 3889, 
++    "devtools/client/inspector/rules/test/browser_rules_cubicbezier-commit-on-ENTER.js": 3835, 
++    "devtools/client/inspector/rules/test/browser_rules_cubicbezier-revert-on-ESC.js": 3678, 
++    "devtools/client/inspector/rules/test/browser_rules_cycle-angle.js": 4094, 
++    "devtools/client/inspector/rules/test/browser_rules_cycle-color.js": 4325, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-property-cancel.js": 3736, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-property-click.js": 3863, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-property-commit.js": 4494, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-property-computed.js": 4046, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-property-increments.js": 8167, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-property-order.js": 5681, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-property-remove_01.js": 4126, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-property-remove_02.js": 4001, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-property-remove_03.js": 4098, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-property_01.js": 6047, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-property_02.js": 5323, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-property_03.js": 4142, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-property_04.js": 4226, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-property_05.js": 4479, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-property_07.js": 3913, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-property_08.js": 3990, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-property_09.js": 3736, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-selector-click-on-scrollbar.js": 3561, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-selector-click.js": 3608, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-selector-commit.js": 4742, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-selector_01.js": 4016, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-selector_02.js": 4669, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-selector_03.js": 3777, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-selector_04.js": 4114, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-selector_05.js": 4454, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-selector_06.js": 4281, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-selector_07.js": 3941, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-selector_08.js": 4195, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-selector_09.js": 4730, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-selector_10.js": 4008, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-selector_11.js": 4027, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-value-after-name_01.js": 3928, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-value-after-name_02.js": 3924, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-value-after-name_03.js": 3803, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-value-after-name_04.js": 3978, 
++    "devtools/client/inspector/rules/test/browser_rules_editable-field-focus_01.js": 5940, 
++    "devtools/client/inspector/rules/test/browser_rules_editable-field-focus_02.js": 4976, 
++    "devtools/client/inspector/rules/test/browser_rules_eyedropper.js": 5192, 
++    "devtools/client/inspector/rules/test/browser_rules_filtereditor-appears-on-swatch-click.js": 3738, 
++    "devtools/client/inspector/rules/test/browser_rules_filtereditor-commit-on-ENTER.js": 3751, 
++    "devtools/client/inspector/rules/test/browser_rules_grid-highlighter-on-mutation.js": 4041, 
++    "devtools/client/inspector/rules/test/browser_rules_grid-highlighter-on-navigate.js": 4608, 
++    "devtools/client/inspector/rules/test/browser_rules_grid-highlighter-on-reload.js": 7231, 
++    "devtools/client/inspector/rules/test/browser_rules_grid-highlighter-restored-after-reload.js": 5544, 
++    "devtools/client/inspector/rules/test/browser_rules_grid-toggle_01.js": 3580, 
++    "devtools/client/inspector/rules/test/browser_rules_grid-toggle_01b.js": 3633, 
++    "devtools/client/inspector/rules/test/browser_rules_grid-toggle_02.js": 3816, 
++    "devtools/client/inspector/rules/test/browser_rules_grid-toggle_03.js": 4120, 
++    "devtools/client/inspector/rules/test/browser_rules_grid-toggle_04.js": 3710, 
++    "devtools/client/inspector/rules/test/browser_rules_guessIndentation.js": 4963, 
++    "devtools/client/inspector/rules/test/browser_rules_inherited-properties_01.js": 3720, 
++    "devtools/client/inspector/rules/test/browser_rules_inherited-properties_03.js": 3559, 
++    "devtools/client/inspector/rules/test/browser_rules_inline-source-map.js": 3785, 
++    "devtools/client/inspector/rules/test/browser_rules_invalid-source-map.js": 3770, 
++    "devtools/client/inspector/rules/test/browser_rules_keybindings.js": 4324, 
++    "devtools/client/inspector/rules/test/browser_rules_keyframeLineNumbers.js": 4040, 
++    "devtools/client/inspector/rules/test/browser_rules_keyframes-rule_01.js": 4001, 
++    "devtools/client/inspector/rules/test/browser_rules_keyframes-rule_02.js": 3698, 
++    "devtools/client/inspector/rules/test/browser_rules_lineNumbers.js": 4225, 
++    "devtools/client/inspector/rules/test/browser_rules_livepreview.js": 5167, 
++    "devtools/client/inspector/rules/test/browser_rules_mark_overridden_01.js": 4205, 
++    "devtools/client/inspector/rules/test/browser_rules_mark_overridden_02.js": 3555, 
++    "devtools/client/inspector/rules/test/browser_rules_mark_overridden_04.js": 3595, 
++    "devtools/client/inspector/rules/test/browser_rules_mark_overridden_05.js": 4000, 
++    "devtools/client/inspector/rules/test/browser_rules_mark_overridden_06.js": 4001, 
++    "devtools/client/inspector/rules/test/browser_rules_mark_overridden_07.js": 3696, 
++    "devtools/client/inspector/rules/test/browser_rules_mathml-element.js": 3995, 
++    "devtools/client/inspector/rules/test/browser_rules_media-queries.js": 3693, 
++    "devtools/client/inspector/rules/test/browser_rules_multiple-properties-duplicates.js": 4201, 
++    "devtools/client/inspector/rules/test/browser_rules_multiple-properties-priority.js": 3873, 
++    "devtools/client/inspector/rules/test/browser_rules_multiple-properties-unfinished_01.js": 4086, 
++    "devtools/client/inspector/rules/test/browser_rules_multiple-properties-unfinished_02.js": 4033, 
++    "devtools/client/inspector/rules/test/browser_rules_multiple_properties_01.js": 3920, 
++    "devtools/client/inspector/rules/test/browser_rules_multiple_properties_02.js": 3911, 
++    "devtools/client/inspector/rules/test/browser_rules_original-source-link.js": 5130, 
++    "devtools/client/inspector/rules/test/browser_rules_original-source-link2.js": 5168, 
++    "devtools/client/inspector/rules/test/browser_rules_pseudo-element_01.js": 6701, 
++    "devtools/client/inspector/rules/test/browser_rules_pseudo-element_02.js": 4390, 
++    "devtools/client/inspector/rules/test/browser_rules_pseudo_lock_options.js": 5169, 
++    "devtools/client/inspector/rules/test/browser_rules_refresh-no-flicker.js": 3596, 
++    "devtools/client/inspector/rules/test/browser_rules_refresh-on-attribute-change_01.js": 3739, 
++    "devtools/client/inspector/rules/test/browser_rules_refresh-on-attribute-change_02.js": 4407, 
++    "devtools/client/inspector/rules/test/browser_rules_refresh-on-style-change.js": 3645, 
++    "devtools/client/inspector/rules/test/browser_rules_search-filter-computed-list_01.js": 4876, 
++    "devtools/client/inspector/rules/test/browser_rules_search-filter-computed-list_02.js": 4054, 
++    "devtools/client/inspector/rules/test/browser_rules_search-filter-computed-list_03.js": 3823, 
++    "devtools/client/inspector/rules/test/browser_rules_search-filter-computed-list_04.js": 4046, 
++    "devtools/client/inspector/rules/test/browser_rules_search-filter-computed-list_expander.js": 3867, 
++    "devtools/client/inspector/rules/test/browser_rules_search-filter-overridden-property.js": 3794, 
++    "devtools/client/inspector/rules/test/browser_rules_search-filter_01.js": 4922, 
++    "devtools/client/inspector/rules/test/browser_rules_search-filter_02.js": 3657, 
++    "devtools/client/inspector/rules/test/browser_rules_search-filter_03.js": 3732, 
++    "devtools/client/inspector/rules/test/browser_rules_search-filter_04.js": 3981, 
++    "devtools/client/inspector/rules/test/browser_rules_search-filter_05.js": 4234, 
++    "devtools/client/inspector/rules/test/browser_rules_search-filter_06.js": 4050, 
++    "devtools/client/inspector/rules/test/browser_rules_search-filter_07.js": 4176, 
++    "devtools/client/inspector/rules/test/browser_rules_search-filter_08.js": 4097, 
++    "devtools/client/inspector/rules/test/browser_rules_search-filter_09.js": 4162, 
++    "devtools/client/inspector/rules/test/browser_rules_search-filter_10.js": 4229, 
++    "devtools/client/inspector/rules/test/browser_rules_search-filter_escape-keypress.js": 3872, 
++    "devtools/client/inspector/rules/test/browser_rules_selector-highlighter-on-navigate.js": 4326, 
++    "devtools/client/inspector/rules/test/browser_rules_selector-highlighter_02.js": 3790, 
++    "devtools/client/inspector/rules/test/browser_rules_selector-highlighter_03.js": 3978, 
++    "devtools/client/inspector/rules/test/browser_rules_selector-highlighter_04.js": 3581, 
++    "devtools/client/inspector/rules/test/browser_rules_selector-highlighter_05.js": 3584, 
++    "devtools/client/inspector/rules/test/browser_rules_selector_highlight.js": 5091, 
++    "devtools/client/inspector/rules/test/browser_rules_shapes-toggle_01.js": 3695, 
++    "devtools/client/inspector/rules/test/browser_rules_shapes-toggle_02.js": 3606, 
++    "devtools/client/inspector/rules/test/browser_rules_shapes-toggle_03.js": 4088, 
++    "devtools/client/inspector/rules/test/browser_rules_shapes-toggle_04.js": 4014, 
++    "devtools/client/inspector/rules/test/browser_rules_shapes-toggle_05.js": 3866, 
++    "devtools/client/inspector/rules/test/browser_rules_shapes-toggle_06.js": 4077, 
++    "devtools/client/inspector/rules/test/browser_rules_shorthand-overridden-lists.js": 3640, 
++    "devtools/client/inspector/rules/test/browser_rules_strict-search-filter-computed-list_01.js": 5498, 
++    "devtools/client/inspector/rules/test/browser_rules_strict-search-filter_01.js": 5587, 
++    "devtools/client/inspector/rules/test/browser_rules_strict-search-filter_02.js": 4206, 
++    "devtools/client/inspector/rules/test/browser_rules_strict-search-filter_03.js": 3700, 
++    "devtools/client/inspector/rules/test/browser_rules_url-click-opens-new-tab.js": 3803, 
++    "devtools/client/inspector/rules/test/browser_rules_urls-clickable.js": 4511, 
++    "devtools/client/inspector/rules/test/browser_rules_user-agent-styles-uneditable.js": 4337, 
++    "devtools/client/inspector/rules/test/browser_rules_user-agent-styles.js": 16061, 
++    "devtools/client/inspector/rules/test/browser_rules_user-property-reset.js": 5565, 
++    "devtools/client/inspector/shared/test/browser_styleinspector_context-menu-copy-color_01.js": 13139, 
++    "devtools/client/inspector/shared/test/browser_styleinspector_csslogic-content-stylesheets.js": 4492, 
++    "devtools/client/inspector/shared/test/browser_styleinspector_refresh_when_active.js": 3851, 
++    "devtools/client/inspector/shared/test/browser_styleinspector_tooltip-background-image.js": 5575, 
++    "devtools/client/inspector/shared/test/browser_styleinspector_tooltip-longhand-fontfamily.js": 4961, 
++    "devtools/client/inspector/shared/test/browser_styleinspector_tooltip-multiple-background-images.js": 4912, 
++    "devtools/client/inspector/shared/test/browser_styleinspector_tooltip-shorthand-fontfamily.js": 3832, 
++    "devtools/client/inspector/shared/test/browser_styleinspector_tooltip-size.js": 3739, 
++    "devtools/client/inspector/shared/test/browser_styleinspector_transform-highlighter-01.js": 4053, 
++    "devtools/client/inspector/shared/test/browser_styleinspector_transform-highlighter-02.js": 4252, 
++    "devtools/client/inspector/shared/test/browser_styleinspector_transform-highlighter-03.js": 3576, 
++    "devtools/client/inspector/shared/test/browser_styleinspector_transform-highlighter-04.js": 3605, 
++    "devtools/client/inspector/test/browser_inspector_addNode_01.js": 5536, 
++    "devtools/client/inspector/test/browser_inspector_addNode_02.js": 4614, 
++    "devtools/client/inspector/test/browser_inspector_addNode_03.js": 3965, 
++    "devtools/client/inspector/test/browser_inspector_breadcrumbs.js": 7164, 
++    "devtools/client/inspector/test/browser_inspector_breadcrumbs_highlight_hover.js": 3818, 
++    "devtools/client/inspector/test/browser_inspector_breadcrumbs_keybinding.js": 4064, 
++    "devtools/client/inspector/test/browser_inspector_breadcrumbs_mutations.js": 5804, 
++    "devtools/client/inspector/test/browser_inspector_breadcrumbs_visibility.js": 4651, 
++    "devtools/client/inspector/test/browser_inspector_delete-selected-node-01.js": 5036, 
++    "devtools/client/inspector/test/browser_inspector_delete-selected-node-02.js": 10492, 
++    "devtools/client/inspector/test/browser_inspector_delete-selected-node-03.js": 4379, 
++    "devtools/client/inspector/test/browser_inspector_destroy-after-navigation.js": 4406, 
++    "devtools/client/inspector/test/browser_inspector_destroy-before-ready.js": 3897, 
++    "devtools/client/inspector/test/browser_inspector_gcli-inspect-command.js": 6065, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-01.js": 4060, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-02.js": 8115, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-03.js": 4585, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-05.js": 6206, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-cancel.js": 5943, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-comments.js": 5512, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-cssshape_01.js": 4139, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-cssshape_02.js": 3936, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-cssshape_03.js": 4413, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-cssshape_04.js": 5865, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-cssshape_05.js": 4826, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-csstransform_01.js": 4019, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-embed.js": 4727, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-eyedropper-csp.js": 3544, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-eyedropper-events.js": 4127, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-eyedropper-label.js": 4150, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-eyedropper-xul.js": 4991, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-geometry_01.js": 3854, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-geometry_02.js": 3961, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-geometry_03.js": 3632, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-geometry_04.js": 4644, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-geometry_05.js": 4917, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-geometry_06.js": 5392, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-hover_01.js": 4642, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-hover_02.js": 3537, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-hover_03.js": 5547, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-iframes_01.js": 4736, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-iframes_02.js": 5562, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-inline.js": 13375, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-keybinding_01.js": 5056, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-keybinding_02.js": 4709, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-keybinding_03.js": 3816, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-keybinding_04.js": 3957, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-measure_02.js": 3707, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-options.js": 4514, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-preview.js": 6517, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-rect_01.js": 4735, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-rect_02.js": 4146, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-rulers_02.js": 3534, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-selector_01.js": 3959, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-selector_02.js": 3542, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-xbl.js": 3933, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-zoom.js": 5110, 
++    "devtools/client/inspector/test/browser_inspector_iframe-navigation.js": 3530, 
++    "devtools/client/inspector/test/browser_inspector_infobar_01.js": 9500, 
++    "devtools/client/inspector/test/browser_inspector_infobar_02.js": 4920, 
++    "devtools/client/inspector/test/browser_inspector_infobar_03.js": 4535, 
++    "devtools/client/inspector/test/browser_inspector_infobar_04.js": 5736, 
++    "devtools/client/inspector/test/browser_inspector_infobar_textnode.js": 6844, 
++    "devtools/client/inspector/test/browser_inspector_inspect_node_contextmenu.js": 4581, 
++    "devtools/client/inspector/test/browser_inspector_invalidate.js": 4226, 
++    "devtools/client/inspector/test/browser_inspector_keyboard-shortcuts.js": 9800, 
++    "devtools/client/inspector/test/browser_inspector_menu-04-use-in-console.js": 4561, 
++    "devtools/client/inspector/test/browser_inspector_menu-05-attribute-items.js": 4173, 
++    "devtools/client/inspector/test/browser_inspector_menu-06-other.js": 7817, 
++    "devtools/client/inspector/test/browser_inspector_navigate_to_errors.js": 9272, 
++    "devtools/client/inspector/test/browser_inspector_navigation.js": 10497, 
++    "devtools/client/inspector/test/browser_inspector_open_on_neterror.js": 5152, 
++    "devtools/client/inspector/test/browser_inspector_pane-toggle-02.js": 4249, 
++    "devtools/client/inspector/test/browser_inspector_pane-toggle-03.js": 4155, 
++    "devtools/client/inspector/test/browser_inspector_picker-stop-on-destroy.js": 4468, 
++    "devtools/client/inspector/test/browser_inspector_portrait_mode.js": 6475, 
++    "devtools/client/inspector/test/browser_inspector_pseudoclass-lock.js": 6832, 
++    "devtools/client/inspector/test/browser_inspector_reload-01.js": 3854, 
++    "devtools/client/inspector/test/browser_inspector_reload-02.js": 4292, 
++    "devtools/client/inspector/test/browser_inspector_remove-iframe-during-load.js": 4302, 
++    "devtools/client/inspector/test/browser_inspector_search-01.js": 8346, 
++    "devtools/client/inspector/test/browser_inspector_search-02.js": 5615, 
++    "devtools/client/inspector/test/browser_inspector_search-03.js": 5170, 
++    "devtools/client/inspector/test/browser_inspector_search-04.js": 4088, 
++    "devtools/client/inspector/test/browser_inspector_search-05.js": 10572, 
++    "devtools/client/inspector/test/browser_inspector_search-06.js": 6637, 
++    "devtools/client/inspector/test/browser_inspector_search-07.js": 3595, 
++    "devtools/client/inspector/test/browser_inspector_search-label.js": 4643, 
++    "devtools/client/inspector/test/browser_inspector_search-navigation.js": 4923, 
++    "devtools/client/inspector/test/browser_inspector_search-reserved.js": 4611, 
++    "devtools/client/inspector/test/browser_inspector_search-selection.js": 9848, 
++    "devtools/client/inspector/test/browser_inspector_search-sidebar.js": 5678, 
++    "devtools/client/inspector/test/browser_inspector_search-suggests-ids-and-classes.js": 4077, 
++    "devtools/client/inspector/test/browser_inspector_search_keyboard_trap.js": 3814, 
++    "devtools/client/inspector/test/browser_inspector_select-docshell.js": 4275, 
++    "devtools/client/inspector/test/browser_inspector_select-last-selected.js": 11227, 
++    "devtools/client/inspector/test/browser_inspector_sidebarstate.js": 7007, 
++    "devtools/client/inspector/test/browser_inspector_startup.js": 4933, 
++    "devtools/client/inspector/test/browser_inspector_switch-to-inspector-on-pick.js": 3864, 
++    "devtools/client/inspector/test/browser_inspector_textbox-menu.js": 5238, 
++    "devtools/client/memory/test/browser/browser_memory_clear_snapshots.js": 4375, 
++    "devtools/client/memory/test/browser/browser_memory_diff_01.js": 4372, 
++    "devtools/client/memory/test/browser/browser_memory_dominator_trees_01.js": 12693, 
++    "devtools/client/memory/test/browser/browser_memory_dominator_trees_02.js": 4417, 
++    "devtools/client/memory/test/browser/browser_memory_filter_01.js": 4394, 
++    "devtools/client/memory/test/browser/browser_memory_individuals_01.js": 5529, 
++    "devtools/client/memory/test/browser/browser_memory_keyboard-snapshot-list.js": 5282, 
++    "devtools/client/memory/test/browser/browser_memory_keyboard.js": 3707, 
++    "devtools/client/netmonitor/test/browser_net_aaa_leaktest.js": 5101, 
++    "devtools/client/netmonitor/test/browser_net_accessibility-01.js": 12490, 
++    "devtools/client/netmonitor/test/browser_net_accessibility-02.js": 12148, 
++    "devtools/client/netmonitor/test/browser_net_api-calls.js": 5047, 
++    "devtools/client/netmonitor/test/browser_net_autoscroll.js": 14300, 
++    "devtools/client/netmonitor/test/browser_net_brotli.js": 5590, 
++    "devtools/client/netmonitor/test/browser_net_cached-status.js": 4931, 
++    "devtools/client/netmonitor/test/browser_net_cause.js": 6361, 
++    "devtools/client/netmonitor/test/browser_net_cause_redirect.js": 4761, 
++    "devtools/client/netmonitor/test/browser_net_cause_source_map.js": 5425, 
++    "devtools/client/netmonitor/test/browser_net_clear.js": 3846, 
++    "devtools/client/netmonitor/test/browser_net_columns_last_column.js": 4068, 
++    "devtools/client/netmonitor/test/browser_net_columns_showhide.js": 5393, 
+     "devtools/client/netmonitor/test/browser_net_complex-params.js": 8947, 
+-    "devtools/client/netmonitor/test/browser_net_content-type.js": 10323, 
+-    "devtools/client/netmonitor/test/browser_net_curl-utils.js": 6612, 
+-    "devtools/client/netmonitor/test/browser_net_cyrillic-02.js": 5050, 
+-    "devtools/client/netmonitor/test/browser_net_filter-01.js": 14286, 
+-    "devtools/client/netmonitor/test/browser_net_filter-02.js": 21601, 
+-    "devtools/client/netmonitor/test/browser_net_filter-03.js": 16048, 
+-    "devtools/client/netmonitor/test/browser_net_filter-04.js": 7228, 
+-    "devtools/client/netmonitor/test/browser_net_footer-summary.js": 15713, 
+-    "devtools/client/netmonitor/test/browser_net_frame.js": 13230, 
+-    "devtools/client/netmonitor/test/browser_net_html-preview.js": 7595, 
+-    "devtools/client/netmonitor/test/browser_net_icon-preview.js": 9115, 
+-    "devtools/client/netmonitor/test/browser_net_image-tooltip.js": 7228, 
+-    "devtools/client/netmonitor/test/browser_net_json-long.js": 21691, 
+-    "devtools/client/netmonitor/test/browser_net_json-malformed.js": 5888, 
+-    "devtools/client/netmonitor/test/browser_net_json_custom_mime.js": 5780, 
++    "devtools/client/netmonitor/test/browser_net_content-type.js": 8875, 
++    "devtools/client/netmonitor/test/browser_net_cors_requests.js": 4958, 
++    "devtools/client/netmonitor/test/browser_net_curl-utils.js": 5084, 
++    "devtools/client/netmonitor/test/browser_net_cyrillic-01.js": 4486, 
++    "devtools/client/netmonitor/test/browser_net_cyrillic-02.js": 4667, 
++    "devtools/client/netmonitor/test/browser_net_details-no-duplicated-content.js": 5257, 
++    "devtools/client/netmonitor/test/browser_net_filter-01.js": 11032, 
++    "devtools/client/netmonitor/test/browser_net_filter-02.js": 12983, 
++    "devtools/client/netmonitor/test/browser_net_filter-03.js": 10594, 
++    "devtools/client/netmonitor/test/browser_net_filter-04.js": 6255, 
++    "devtools/client/netmonitor/test/browser_net_filter-autocomplete.js": 7367, 
++    "devtools/client/netmonitor/test/browser_net_filter-flags.js": 12792, 
++    "devtools/client/netmonitor/test/browser_net_footer-summary.js": 11293, 
++    "devtools/client/netmonitor/test/browser_net_frame.js": 9392, 
++    "devtools/client/netmonitor/test/browser_net_header-docs.js": 4467, 
++    "devtools/client/netmonitor/test/browser_net_html-preview.js": 4829, 
++    "devtools/client/netmonitor/test/browser_net_icon-preview.js": 7404, 
++    "devtools/client/netmonitor/test/browser_net_image-tooltip.js": 6206, 
++    "devtools/client/netmonitor/test/browser_net_json-b64.js": 4430, 
++    "devtools/client/netmonitor/test/browser_net_json-long.js": 32915, 
++    "devtools/client/netmonitor/test/browser_net_json-malformed.js": 4786, 
++    "devtools/client/netmonitor/test/browser_net_json-null.js": 4498, 
++    "devtools/client/netmonitor/test/browser_net_json_custom_mime.js": 4497, 
++    "devtools/client/netmonitor/test/browser_net_json_text_mime.js": 4427, 
+     "devtools/client/netmonitor/test/browser_net_jsonp.js": 5120, 
+     "devtools/client/netmonitor/test/browser_net_large-response.js": 5466, 
+-    "devtools/client/netmonitor/test/browser_net_persistent_logs.js": 7117, 
+-    "devtools/client/netmonitor/test/browser_net_post-data-01.js": 5991, 
+-    "devtools/client/netmonitor/test/browser_net_prefs-reload.js": 22731, 
++    "devtools/client/netmonitor/test/browser_net_open_in_debugger.js": 8313, 
++    "devtools/client/netmonitor/test/browser_net_open_in_style_editor.js": 8743, 
++    "devtools/client/netmonitor/test/browser_net_open_request_in_tab.js": 4042, 
++    "devtools/client/netmonitor/test/browser_net_pane-collapse.js": 4536, 
++    "devtools/client/netmonitor/test/browser_net_pane-toggle.js": 3736, 
++    "devtools/client/netmonitor/test/browser_net_persistent_logs.js": 5779, 
++    "devtools/client/netmonitor/test/browser_net_post-data-01.js": 5353, 
++    "devtools/client/netmonitor/test/browser_net_post-data-02.js": 4409, 
++    "devtools/client/netmonitor/test/browser_net_post-data-03.js": 4391, 
++    "devtools/client/netmonitor/test/browser_net_post-data-04.js": 4221, 
++    "devtools/client/netmonitor/test/browser_net_prefs-reload.js": 31616, 
+     "devtools/client/netmonitor/test/browser_net_raw_headers.js": 5081, 
+-    "devtools/client/netmonitor/test/browser_net_req-resp-bodies.js": 7903, 
+-    "devtools/client/netmonitor/test/browser_net_resend.js": 8999, 
+-    "devtools/client/netmonitor/test/browser_net_resend_cors.js": 8137, 
+-    "devtools/client/netmonitor/test/browser_net_security-icon-click.js": 5500, 
+-    "devtools/client/netmonitor/test/browser_net_security-state.js": 6018, 
+-    "devtools/client/netmonitor/test/browser_net_security-tab-deselect.js": 5227, 
+-    "devtools/client/netmonitor/test/browser_net_security-tab-visibility.js": 7968, 
+-    "devtools/client/netmonitor/test/browser_net_simple-request.js": 5249, 
+-    "devtools/client/netmonitor/test/browser_net_sort-02.js": 12212, 
+-    "devtools/client/netmonitor/test/browser_net_sort-03.js": 18962, 
+-    "devtools/client/netmonitor/test/browser_net_statistics-01.js": 8823, 
+-    "devtools/client/netmonitor/test/browser_net_statistics-02.js": 10084, 
+-    "devtools/client/netmonitor/test/browser_net_status-codes.js": 7771, 
++    "devtools/client/netmonitor/test/browser_net_reload-button.js": 4356, 
++    "devtools/client/netmonitor/test/browser_net_reload-markers.js": 4124, 
++    "devtools/client/netmonitor/test/browser_net_req-resp-bodies.js": 6208, 
++    "devtools/client/netmonitor/test/browser_net_resend.js": 6610, 
++    "devtools/client/netmonitor/test/browser_net_resend_cors.js": 5807, 
++    "devtools/client/netmonitor/test/browser_net_resend_headers.js": 4039, 
++    "devtools/client/netmonitor/test/browser_net_security-details.js": 4406, 
++    "devtools/client/netmonitor/test/browser_net_security-error.js": 4111, 
++    "devtools/client/netmonitor/test/browser_net_security-icon-click.js": 5086, 
++    "devtools/client/netmonitor/test/browser_net_security-redirect.js": 4453, 
++    "devtools/client/netmonitor/test/browser_net_security-state.js": 5665, 
++    "devtools/client/netmonitor/test/browser_net_security-tab-deselect.js": 4642, 
++    "devtools/client/netmonitor/test/browser_net_security-tab-visibility.js": 5664, 
++    "devtools/client/netmonitor/test/browser_net_security-warnings.js": 4688, 
++    "devtools/client/netmonitor/test/browser_net_send-beacon-other-tab.js": 4306, 
++    "devtools/client/netmonitor/test/browser_net_send-beacon.js": 3756, 
++    "devtools/client/netmonitor/test/browser_net_simple-request-data.js": 4076, 
++    "devtools/client/netmonitor/test/browser_net_simple-request.js": 4806, 
++    "devtools/client/netmonitor/test/browser_net_sort-01.js": 11103, 
++    "devtools/client/netmonitor/test/browser_net_sort-02.js": 9513, 
++    "devtools/client/netmonitor/test/browser_net_sort-03.js": 10463, 
++    "devtools/client/netmonitor/test/browser_net_statistics-01.js": 7278, 
++    "devtools/client/netmonitor/test/browser_net_statistics-02.js": 4499, 
++    "devtools/client/netmonitor/test/browser_net_status-codes.js": 6389, 
+     "devtools/client/netmonitor/test/browser_net_streaming-response.js": 5701, 
+     "devtools/client/netmonitor/test/browser_net_throttle.js": 9461, 
++    "devtools/client/netmonitor/test/browser_net_thumbnail-click.js": 5404, 
+     "devtools/client/netmonitor/test/browser_net_timing-division.js": 7122, 
+-    "devtools/client/performance/test/browser_aaa-run-first-leaktest.js": 6395, 
+-    "devtools/client/performance/test/browser_perf-button-states.js": 5600, 
+-    "devtools/client/performance/test/browser_perf-calltree-js-categories.js": 6540, 
+-    "devtools/client/performance/test/browser_perf-calltree-js-columns.js": 6707, 
+-    "devtools/client/performance/test/browser_perf-calltree-js-events.js": 6102, 
+-    "devtools/client/performance/test/browser_perf-calltree-memory-columns.js": 5530, 
+-    "devtools/client/performance/test/browser_perf-console-record-01.js": 6916, 
+-    "devtools/client/performance/test/browser_perf-console-record-02.js": 11250, 
+-    "devtools/client/performance/test/browser_perf-console-record-03.js": 6787, 
+-    "devtools/client/performance/test/browser_perf-console-record-04.js": 8629, 
+-    "devtools/client/performance/test/browser_perf-console-record-05.js": 9700, 
+-    "devtools/client/performance/test/browser_perf-console-record-06.js": 13428, 
+-    "devtools/client/performance/test/browser_perf-console-record-07.js": 11800, 
+-    "devtools/client/performance/test/browser_perf-console-record-08.js": 21590, 
+-    "devtools/client/performance/test/browser_perf-console-record-09.js": 8449, 
+-    "devtools/client/performance/test/browser_perf-details-01-toggle.js": 5968, 
+-    "devtools/client/performance/test/browser_perf-details-02-utility-fun.js": 5907, 
+-    "devtools/client/performance/test/browser_perf-details-03-without-allocations.js": 7829, 
+-    "devtools/client/performance/test/browser_perf-details-04-toolbar-buttons.js": 7357, 
+-    "devtools/client/performance/test/browser_perf-details-05-preserve-view.js": 7057, 
+-    "devtools/client/performance/test/browser_perf-details-06-rerender-on-selection.js": 5935, 
+-    "devtools/client/performance/test/browser_perf-details-07-bleed-events.js": 7230, 
+-    "devtools/client/performance/test/browser_perf-details-render-00-waterfall.js": 6838, 
+-    "devtools/client/performance/test/browser_perf-details-render-01-js-calltree.js": 6930, 
+-    "devtools/client/performance/test/browser_perf-details-render-02-js-flamegraph.js": 6852, 
+-    "devtools/client/performance/test/browser_perf-details-render-03-memory-calltree.js": 6548, 
+-    "devtools/client/performance/test/browser_perf-details-render-04-memory-flamegraph.js": 6709, 
+-    "devtools/client/performance/test/browser_perf-docload.js": 6282, 
+-    "devtools/client/performance/test/browser_perf-highlighted.js": 8019, 
+-    "devtools/client/performance/test/browser_perf-loading-01.js": 5361, 
+-    "devtools/client/performance/test/browser_perf-loading-02.js": 7505, 
+-    "devtools/client/performance/test/browser_perf-options-02-toggle-throw-alt.js": 4980, 
+-    "devtools/client/performance/test/browser_perf-options-enable-framerate-01.js": 6432, 
+-    "devtools/client/performance/test/browser_perf-options-enable-framerate-02.js": 6346, 
+-    "devtools/client/performance/test/browser_perf-options-enable-memory-01.js": 7230, 
+-    "devtools/client/performance/test/browser_perf-options-enable-memory-02.js": 7217, 
+-    "devtools/client/performance/test/browser_perf-options-flatten-tree-recursion-01.js": 5808, 
+-    "devtools/client/performance/test/browser_perf-options-flatten-tree-recursion-02.js": 5617, 
+-    "devtools/client/performance/test/browser_perf-options-invert-call-tree-01.js": 6012, 
+-    "devtools/client/performance/test/browser_perf-options-invert-call-tree-02.js": 5542, 
+-    "devtools/client/performance/test/browser_perf-options-invert-flame-graph-01.js": 5793, 
+-    "devtools/client/performance/test/browser_perf-options-invert-flame-graph-02.js": 5625, 
+-    "devtools/client/performance/test/browser_perf-options-propagate-allocations.js": 5582, 
+-    "devtools/client/performance/test/browser_perf-options-propagate-profiler.js": 5929, 
+-    "devtools/client/performance/test/browser_perf-options-show-idle-blocks-01.js": 5808, 
+-    "devtools/client/performance/test/browser_perf-options-show-idle-blocks-02.js": 5638, 
+-    "devtools/client/performance/test/browser_perf-options-show-platform-data-01.js": 7302, 
+-    "devtools/client/performance/test/browser_perf-options-show-platform-data-02.js": 5905, 
+-    "devtools/client/performance/test/browser_perf-overview-render-01.js": 7402, 
+-    "devtools/client/performance/test/browser_perf-overview-render-02.js": 7865, 
+-    "devtools/client/performance/test/browser_perf-overview-render-03.js": 5878, 
+-    "devtools/client/performance/test/browser_perf-overview-render-04.js": 7120, 
+-    "devtools/client/performance/test/browser_perf-overview-selection-01.js": 5499, 
+-    "devtools/client/performance/test/browser_perf-overview-selection-02.js": 7302, 
+-    "devtools/client/performance/test/browser_perf-overview-selection-03.js": 5808, 
+-    "devtools/client/performance/test/browser_perf-overview-time-interval.js": 5479, 
+-    "devtools/client/performance/test/browser_perf-range-changed-render.js": 6501, 
+-    "devtools/client/performance/test/browser_perf-recording-notices-01.js": 5484, 
+-    "devtools/client/performance/test/browser_perf-recording-notices-02.js": 7455, 
+-    "devtools/client/performance/test/browser_perf-recording-notices-03.js": 8753, 
+-    "devtools/client/performance/test/browser_perf-recording-notices-04.js": 6312, 
+-    "devtools/client/performance/test/browser_perf-recording-selected-01.js": 9042, 
+-    "devtools/client/performance/test/browser_perf-recording-selected-02.js": 8650, 
+-    "devtools/client/performance/test/browser_perf-recording-selected-03.js": 8921, 
+-    "devtools/client/performance/test/browser_perf-recording-selected-04.js": 12586, 
+-    "devtools/client/performance/test/browser_perf-recordings-clear-01.js": 8147, 
+-    "devtools/client/performance/test/browser_perf-recordings-clear-02.js": 10319, 
+-    "devtools/client/performance/test/browser_perf-refresh.js": 7224, 
+-    "devtools/client/performance/test/browser_perf-states.js": 7265, 
+-    "devtools/client/performance/test/browser_perf-telemetry-01.js": 8724, 
+-    "devtools/client/performance/test/browser_perf-telemetry-02.js": 7421, 
+-    "devtools/client/performance/test/browser_perf-telemetry-03.js": 7081, 
+-    "devtools/client/performance/test/browser_perf-telemetry-04.js": 7901, 
+-    "devtools/client/performance/test/browser_perf-ui-recording.js": 7496, 
+-    "devtools/client/performance/test/browser_timeline-waterfall-background.js": 7789, 
+-    "devtools/client/performance/test/browser_timeline-waterfall-generic.js": 8503, 
+-    "devtools/client/projecteditor/test/browser_projecteditor_editing_01.js": 5391, 
+-    "devtools/client/projecteditor/test/browser_projecteditor_external_change.js": 6150, 
+-    "devtools/client/projecteditor/test/browser_projecteditor_rename_file_01.js": 7606, 
+-    "devtools/client/projecteditor/test/browser_projecteditor_rename_file_02.js": 7466, 
+-    "devtools/client/projecteditor/test/browser_projecteditor_saveall.js": 5911, 
+-    "devtools/client/projecteditor/test/browser_projecteditor_tree_selection_01.js": 5494, 
+-    "devtools/client/responsive.html/test/browser/browser_device_change.js": 6423, 
+-    "devtools/client/responsive.html/test/browser/browser_device_modal_exit.js": 5112, 
+-    "devtools/client/responsive.html/test/browser/browser_device_modal_submit.js": 10943, 
+-    "devtools/client/responsive.html/test/browser/browser_device_width.js": 5193, 
+-    "devtools/client/responsive.html/test/browser/browser_dpr_change.js": 5765, 
+-    "devtools/client/responsive.html/test/browser/browser_exit_button.js": 14943, 
+-    "devtools/client/responsive.html/test/browser/browser_frame_script_active.js": 11234, 
+-    "devtools/client/responsive.html/test/browser/browser_menu_item_01.js": 5756, 
+-    "devtools/client/responsive.html/test/browser/browser_menu_item_02.js": 6415, 
+-    "devtools/client/responsive.html/test/browser/browser_mouse_resize.js": 5770, 
+-    "devtools/client/responsive.html/test/browser/browser_navigation.js": 7404, 
+-    "devtools/client/responsive.html/test/browser/browser_network_throttling.js": 6154, 
+-    "devtools/client/responsive.html/test/browser/browser_page_state.js": 6690, 
+-    "devtools/client/responsive.html/test/browser/browser_permission_doorhanger.js": 6697, 
+-    "devtools/client/responsive.html/test/browser/browser_resize_cmd.js": 19710, 
+-    "devtools/client/responsive.html/test/browser/browser_screenshot_button.js": 5968, 
+-    "devtools/client/responsive.html/test/browser/browser_shutdown_close_sync.js": 8182, 
+-    "devtools/client/responsive.html/test/browser/browser_tab_close.js": 11162, 
+-    "devtools/client/responsive.html/test/browser/browser_tab_remoteness_change.js": 12341, 
+-    "devtools/client/responsive.html/test/browser/browser_toolbox_computed_view.js": 13850, 
+-    "devtools/client/responsive.html/test/browser/browser_toolbox_rule_view.js": 10899, 
+-    "devtools/client/responsive.html/test/browser/browser_toolbox_swap_browsers.js": 20399, 
+-    "devtools/client/responsive.html/test/browser/browser_touch_simulation.js": 5954, 
+-    "devtools/client/responsive.html/test/browser/browser_viewport_basics.js": 5565, 
+-    "devtools/client/responsive.html/test/browser/browser_window_close.js": 5799, 
+-    "devtools/client/responsivedesign/test/browser_responsive_cmd.js": 5598, 
+-    "devtools/client/responsivedesign/test/browser_responsivecomputedview.js": 5357, 
+-    "devtools/client/scratchpad/test/browser_scratchpad_close_toolbox.js": 7806, 
+-    "devtools/client/scratchpad/test/browser_scratchpad_disable_view_menu_items.js": 8310, 
+-    "devtools/client/scratchpad/test/browser_scratchpad_restore.js": 6143, 
+-    "devtools/client/scratchpad/test/browser_scratchpad_wrong_window_focus.js": 5481, 
+-    "devtools/client/shared/components/test/browser/browser_notification_box_basic.js": 6354, 
+-    "devtools/client/shared/test/browser_telemetry_button_eyedropper.js": 8019, 
+-    "devtools/client/shared/test/browser_telemetry_button_scratchpad.js": 9308, 
++    "devtools/client/netmonitor/test/browser_net_truncate.js": 11425, 
++    "devtools/client/netmonitor/test/browser_net_waterfall-click.js": 5107, 
++    "devtools/client/performance/test/browser_aaa-run-first-leaktest.js": 3798, 
++    "devtools/client/performance/test/browser_perf-button-states.js": 3520, 
++    "devtools/client/performance/test/browser_perf-calltree-js-categories.js": 3524, 
++    "devtools/client/performance/test/browser_perf-calltree-js-columns.js": 3922, 
++    "devtools/client/performance/test/browser_perf-console-record-02.js": 5040, 
++    "devtools/client/performance/test/browser_perf-console-record-04.js": 4225, 
++    "devtools/client/performance/test/browser_perf-console-record-05.js": 4568, 
++    "devtools/client/performance/test/browser_perf-console-record-06.js": 5853, 
++    "devtools/client/performance/test/browser_perf-console-record-07.js": 6446, 
++    "devtools/client/performance/test/browser_perf-console-record-08.js": 9379, 
++    "devtools/client/performance/test/browser_perf-console-record-09.js": 4551, 
++    "devtools/client/performance/test/browser_perf-details-03-without-allocations.js": 3967, 
++    "devtools/client/performance/test/browser_perf-details-04-toolbar-buttons.js": 3698, 
++    "devtools/client/performance/test/browser_perf-details-05-preserve-view.js": 3555, 
++    "devtools/client/performance/test/browser_perf-details-07-bleed-events.js": 3621, 
++    "devtools/client/performance/test/browser_perf-details-render-01-js-calltree.js": 3522, 
++    "devtools/client/performance/test/browser_perf-details-render-02-js-flamegraph.js": 3546, 
++    "devtools/client/performance/test/browser_perf-highlighted.js": 3807, 
++    "devtools/client/performance/test/browser_perf-loading-02.js": 3740, 
++    "devtools/client/performance/test/browser_perf-options-enable-memory-01.js": 3629, 
++    "devtools/client/performance/test/browser_perf-options-enable-memory-02.js": 3613, 
++    "devtools/client/performance/test/browser_perf-overview-render-01.js": 3715, 
++    "devtools/client/performance/test/browser_perf-overview-render-02.js": 3887, 
++    "devtools/client/performance/test/browser_perf-overview-render-04.js": 3719, 
++    "devtools/client/performance/test/browser_perf-overview-selection-02.js": 3647, 
++    "devtools/client/performance/test/browser_perf-recording-notices-02.js": 3688, 
++    "devtools/client/performance/test/browser_perf-recording-notices-03.js": 4809, 
++    "devtools/client/performance/test/browser_perf-recording-selected-01.js": 4097, 
++    "devtools/client/performance/test/browser_perf-recording-selected-02.js": 3976, 
++    "devtools/client/performance/test/browser_perf-recording-selected-03.js": 4056, 
++    "devtools/client/performance/test/browser_perf-recording-selected-04.js": 4990, 
++    "devtools/client/performance/test/browser_perf-recordings-clear-01.js": 3787, 
++    "devtools/client/performance/test/browser_perf-recordings-clear-02.js": 4532, 
++    "devtools/client/performance/test/browser_perf-telemetry-01.js": 3959, 
++    "devtools/client/performance/test/browser_timeline-waterfall-background.js": 4017, 
++    "devtools/client/performance/test/browser_timeline-waterfall-generic.js": 4240, 
++    "devtools/client/projecteditor/test/browser_projecteditor_editing_01.js": 4299, 
++    "devtools/client/projecteditor/test/browser_projecteditor_external_change.js": 4965, 
++    "devtools/client/projecteditor/test/browser_projecteditor_rename_file_01.js": 6040, 
++    "devtools/client/projecteditor/test/browser_projecteditor_rename_file_02.js": 5946, 
++    "devtools/client/projecteditor/test/browser_projecteditor_saveall.js": 4816, 
++    "devtools/client/projecteditor/test/browser_projecteditor_tree_selection_01.js": 4600, 
++    "devtools/client/projecteditor/test/browser_projecteditor_tree_selection_02.js": 3895, 
++    "devtools/client/responsive.html/test/browser/browser_device_change.js": 3727, 
++    "devtools/client/responsive.html/test/browser/browser_device_custom.js": 4458, 
++    "devtools/client/responsive.html/test/browser/browser_device_modal_submit.js": 4384, 
++    "devtools/client/responsive.html/test/browser/browser_exit_button.js": 6731, 
++    "devtools/client/responsive.html/test/browser/browser_frame_script_active.js": 4307, 
++    "devtools/client/responsive.html/test/browser/browser_hide_container.js": 5954, 
++    "devtools/client/responsive.html/test/browser/browser_resize_cmd.js": 8457, 
++    "devtools/client/responsive.html/test/browser/browser_toolbox_computed_view.js": 7938, 
++    "devtools/client/responsive.html/test/browser/browser_toolbox_rule_view.js": 5761, 
++    "devtools/client/responsive.html/test/browser/browser_toolbox_swap_browsers.js": 8137, 
++    "devtools/client/responsivedesign/test/browser_responsive_cmd.js": 4247, 
++    "devtools/client/scratchpad/test/browser_scratchpad_close_toolbox.js": 4208, 
++    "devtools/client/scratchpad/test/browser_scratchpad_disable_view_menu_items.js": 5533, 
++    "devtools/client/scratchpad/test/browser_scratchpad_restore.js": 3578, 
++    "devtools/client/scratchpad/test/browser_scratchpad_wrong_window_focus.js": 3807, 
++    "devtools/client/shared/test/browser_html_tooltip-01.js": 4027, 
++    "devtools/client/shared/test/browser_telemetry_button_eyedropper.js": 5610, 
++    "devtools/client/shared/test/browser_telemetry_button_scratchpad.js": 6338, 
+     "devtools/client/shared/test/browser_telemetry_sidebar.js": 8463, 
+-    "devtools/client/shared/test/browser_telemetry_toolbox.js": 11441, 
+-    "devtools/client/shared/test/browser_telemetry_toolboxtabs_inspector.js": 7533, 
+-    "devtools/client/shared/test/browser_telemetry_toolboxtabs_jsdebugger.js": 6945, 
+-    "devtools/client/shared/test/browser_telemetry_toolboxtabs_jsprofiler.js": 5039, 
+-    "devtools/client/shared/test/browser_telemetry_toolboxtabs_netmonitor.js": 5476, 
+-    "devtools/client/shared/test/browser_telemetry_toolboxtabs_storage.js": 5531, 
+-    "devtools/client/shared/test/browser_telemetry_toolboxtabs_webconsole.js": 5876, 
+-    "devtools/client/sourceeditor/test/browser_codemirror.js": 6453, 
+-    "devtools/client/sourceeditor/test/browser_vimemacs.js": 59401, 
+-    "devtools/client/storage/test/browser_storage_basic.js": 13195, 
+-    "devtools/client/storage/test/browser_storage_cache_delete.js": 6798, 
+-    "devtools/client/storage/test/browser_storage_cookies_delete_all.js": 7223, 
+-    "devtools/client/storage/test/browser_storage_cookies_edit.js": 6613, 
+-    "devtools/client/storage/test/browser_storage_cookies_edit_keyboard.js": 6170, 
+-    "devtools/client/storage/test/browser_storage_delete.js": 8609, 
+-    "devtools/client/storage/test/browser_storage_delete_all.js": 9145, 
+-    "devtools/client/storage/test/browser_storage_delete_tree.js": 8542, 
++    "devtools/client/shared/test/browser_telemetry_toolbox.js": 8455, 
++    "devtools/client/shared/test/browser_telemetry_toolboxtabs_canvasdebugger.js": 3573, 
++    "devtools/client/shared/test/browser_telemetry_toolboxtabs_inspector.js": 5534, 
++    "devtools/client/shared/test/browser_telemetry_toolboxtabs_jsdebugger.js": 5675, 
++    "devtools/client/shared/test/browser_telemetry_toolboxtabs_jsprofiler.js": 4270, 
++    "devtools/client/shared/test/browser_telemetry_toolboxtabs_netmonitor.js": 4626, 
++    "devtools/client/shared/test/browser_telemetry_toolboxtabs_storage.js": 5075, 
++    "devtools/client/shared/test/browser_telemetry_toolboxtabs_styleeditor.js": 3852, 
++    "devtools/client/shared/test/browser_telemetry_toolboxtabs_webaudioeditor.js": 4088, 
++    "devtools/client/shared/test/browser_telemetry_toolboxtabs_webconsole.js": 4427, 
++    "devtools/client/sourceeditor/test/browser_codemirror.js": 4764, 
++    "devtools/client/sourceeditor/test/browser_vimemacs.js": 31688, 
++    "devtools/client/storage/test/browser_storage_basic.js": 7188, 
++    "devtools/client/storage/test/browser_storage_basic_usercontextid_1.js": 4958, 
++    "devtools/client/storage/test/browser_storage_basic_usercontextid_2.js": 4889, 
++    "devtools/client/storage/test/browser_storage_basic_with_fragment.js": 5053, 
++    "devtools/client/storage/test/browser_storage_cache_delete.js": 3929, 
++    "devtools/client/storage/test/browser_storage_cookies_add.js": 4323, 
++    "devtools/client/storage/test/browser_storage_cookies_delete_all.js": 4568, 
++    "devtools/client/storage/test/browser_storage_cookies_edit.js": 5202, 
++    "devtools/client/storage/test/browser_storage_cookies_edit_keyboard.js": 4634, 
++    "devtools/client/storage/test/browser_storage_delete.js": 5518, 
++    "devtools/client/storage/test/browser_storage_delete_all.js": 5456, 
++    "devtools/client/storage/test/browser_storage_delete_tree.js": 5138, 
++    "devtools/client/storage/test/browser_storage_delete_usercontextid.js": 10166, 
++    "devtools/client/storage/test/browser_storage_dom_cache_disabled.js": 4388, 
+     "devtools/client/storage/test/browser_storage_dynamic_updates.js": 6442, 
+-    "devtools/client/storage/test/browser_storage_dynamic_updates_cookies.js": 5712, 
+-    "devtools/client/storage/test/browser_storage_indexeddb_duplicate_names.js": 5130, 
+-    "devtools/client/storage/test/browser_storage_localstorage_edit.js": 5530, 
+-    "devtools/client/storage/test/browser_storage_overflow.js": 12507, 
+-    "devtools/client/storage/test/browser_storage_sessionstorage_edit.js": 5773, 
+-    "devtools/client/storage/test/browser_storage_sidebar.js": 10866, 
+-    "devtools/client/storage/test/browser_storage_sidebar_update.js": 4919, 
+-    "devtools/client/storage/test/browser_storage_values.js": 8302, 
+-    "devtools/client/styleeditor/test/browser_styleeditor_autocomplete-disabled.js": 7836, 
+-    "devtools/client/styleeditor/test/browser_styleeditor_autocomplete.js": 6363, 
++    "devtools/client/storage/test/browser_storage_dynamic_updates_cookies.js": 4594, 
++    "devtools/client/storage/test/browser_storage_dynamic_updates_sessionStorage.js": 3854, 
++    "devtools/client/storage/test/browser_storage_localstorage_add.js": 4015, 
++    "devtools/client/storage/test/browser_storage_localstorage_edit.js": 4477, 
++    "devtools/client/storage/test/browser_storage_overflow.js": 8178, 
++    "devtools/client/storage/test/browser_storage_sessionstorage_add.js": 4593, 
++    "devtools/client/storage/test/browser_storage_sessionstorage_edit.js": 5124, 
++    "devtools/client/storage/test/browser_storage_sidebar.js": 6866, 
++    "devtools/client/storage/test/browser_storage_sidebar_toggle.js": 4093, 
++    "devtools/client/storage/test/browser_storage_values.js": 6707, 
++    "devtools/client/styleeditor/test/browser_styleeditor_autocomplete-disabled.js": 4436, 
++    "devtools/client/styleeditor/test/browser_styleeditor_autocomplete.js": 4280, 
+     "devtools/client/styleeditor/test/browser_styleeditor_cmd_edit.js": 6238, 
+-    "devtools/client/styleeditor/test/browser_styleeditor_fetch-from-cache.js": 6079, 
+-    "devtools/client/styleeditor/test/browser_styleeditor_filesave.js": 5907, 
+-    "devtools/client/styleeditor/test/browser_styleeditor_inline_friendly_names.js": 5273, 
+-    "devtools/client/styleeditor/test/browser_styleeditor_media_sidebar.js": 5078, 
+-    "devtools/client/styleeditor/test/browser_styleeditor_media_sidebar_links.js": 5768, 
+-    "devtools/client/styleeditor/test/browser_styleeditor_navigate.js": 5092, 
+-    "devtools/client/styleeditor/test/browser_styleeditor_private_perwindowpb.js": 5351, 
+-    "devtools/client/styleeditor/test/browser_styleeditor_reload.js": 5657, 
+-    "devtools/client/styleeditor/test/browser_styleeditor_sourcemap_watching.js": 9625, 
+-    "devtools/client/styleeditor/test/browser_styleeditor_sourcemaps.js": 8175, 
++    "devtools/client/styleeditor/test/browser_styleeditor_fetch-from-cache.js": 3917, 
++    "devtools/client/styleeditor/test/browser_styleeditor_loading.js": 3908, 
++    "devtools/client/styleeditor/test/browser_styleeditor_media_sidebar.js": 3791, 
++    "devtools/client/styleeditor/test/browser_styleeditor_navigate.js": 3775, 
++    "devtools/client/styleeditor/test/browser_styleeditor_new.js": 3953, 
++    "devtools/client/styleeditor/test/browser_styleeditor_private_perwindowpb.js": 6516, 
++    "devtools/client/styleeditor/test/browser_styleeditor_reload.js": 3702, 
++    "devtools/client/styleeditor/test/browser_styleeditor_sourcemap_watching.js": 7300, 
++    "devtools/client/styleeditor/test/browser_styleeditor_sourcemaps.js": 5904, 
+     "devtools/client/styleeditor/test/browser_styleeditor_sync.js": 9523, 
+-    "devtools/client/styleeditor/test/browser_styleeditor_syncAddProperty.js": 6377, 
+-    "devtools/client/styleeditor/test/browser_styleeditor_syncAddRule.js": 6879, 
+-    "devtools/client/styleeditor/test/browser_styleeditor_syncAlreadyOpen.js": 5931, 
+-    "devtools/client/styleeditor/test/browser_styleeditor_syncEditSelector.js": 6432, 
+-    "devtools/client/styleeditor/test/browser_styleeditor_syncIntoRuleView.js": 8180, 
+-    "devtools/client/styleeditor/test/browser_styleeditor_transition_rule.js": 5104, 
+-    "devtools/client/webaudioeditor/test/browser_audionode-actor-connectnode-disconnect.js": 5981, 
+-    "devtools/client/webaudioeditor/test/browser_wa_properties-view-params.js": 5201, 
+-    "devtools/client/webconsole/net/test/mochitest/browser_net_basic.js": 7960, 
+-    "devtools/client/webconsole/net/test/mochitest/browser_net_params.js": 6302, 
+-    "devtools/client/webconsole/net/test/mochitest/browser_net_post.js": 10882, 
+-    "devtools/client/webconsole/net/test/mochitest/browser_net_response.js": 10161, 
+-    "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_batching.js": 13127, 
+-    "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_filters.js": 7241, 
+-    "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_keyboard_accessibility.js": 5548, 
+-    "devtools/client/webconsole/test/browser_bug1045902_console_csp_ignore_reflected_xss_message.js": 4958, 
+-    "devtools/client/webconsole/test/browser_bug664688_sandbox_update_after_navigation.js": 6199, 
+-    "devtools/client/webconsole/test/browser_bug_871156_ctrlw_close_tab.js": 5090, 
+-    "devtools/client/webconsole/test/browser_cached_messages.js": 7091, 
+-    "devtools/client/webconsole/test/browser_console_addonsdk_loader_exception.js": 5334, 
+-    "devtools/client/webconsole/test/browser_console_consolejsm_output.js": 7848, 
+-    "devtools/client/webconsole/test/browser_console_filters.js": 6307, 
+-    "devtools/client/webconsole/test/browser_console_hide_jsterm_when_devtools_chrome_enabled_false.js": 13106, 
+-    "devtools/client/webconsole/test/browser_console_history_persist.js": 13379, 
+-    "devtools/client/webconsole/test/browser_console_iframe_messages.js": 6408, 
+-    "devtools/client/webconsole/test/browser_console_native_getters.js": 8037, 
+-    "devtools/client/webconsole/test/browser_console_nsiconsolemessage.js": 6165, 
+-    "devtools/client/webconsole/test/browser_console_optimized_out_vars.js": 6946, 
+-    "devtools/client/webconsole/test/browser_console_server_logging.js": 6265, 
+-    "devtools/client/webconsole/test/browser_console_variables_view_dont_sort_non_sortable_classes_properties.js": 7708, 
+-    "devtools/client/webconsole/test/browser_console_variables_view_highlighter.js": 14476, 
+-    "devtools/client/webconsole/test/browser_console_variables_view_while_debugging.js": 5615, 
+-    "devtools/client/webconsole/test/browser_console_variables_view_while_debugging_and_inspecting.js": 8881, 
+-    "devtools/client/webconsole/test/browser_eval_in_debugger_stackframe.js": 7311, 
+-    "devtools/client/webconsole/test/browser_eval_in_debugger_stackframe2.js": 5048, 
+-    "devtools/client/webconsole/test/browser_jsterm_inspect.js": 6838, 
+-    "devtools/client/webconsole/test/browser_warn_user_about_replaced_api.js": 7628, 
+-    "devtools/client/webconsole/test/browser_webconsole_autocomplete_in_debugger_stackframe.js": 5895, 
+-    "devtools/client/webconsole/test/browser_webconsole_bug_593003_iframe_wrong_hud.js": 9578, 
+-    "devtools/client/webconsole/test/browser_webconsole_bug_595223_file_uri.js": 6033, 
+-    "devtools/client/webconsole/test/browser_webconsole_bug_597103_deactivateHUDForContext_unfocused_window.js": 10020, 
+-    "devtools/client/webconsole/test/browser_webconsole_bug_597460_filter_scroll.js": 6606, 
+-    "devtools/client/webconsole/test/browser_webconsole_bug_597756_reopen_closed_tab.js": 7495, 
+-    "devtools/client/webconsole/test/browser_webconsole_bug_613642_maintain_scroll.js": 5326, 
+-    "devtools/client/webconsole/test/browser_webconsole_bug_613642_prune_scroll.js": 5002, 
+-    "devtools/client/webconsole/test/browser_webconsole_bug_614793_jsterm_scroll.js": 8608, 
+-    "devtools/client/webconsole/test/browser_webconsole_bug_622303_persistent_filters.js": 9607, 
+-    "devtools/client/webconsole/test/browser_webconsole_bug_632275_getters_document_width.js": 5951, 
+-    "devtools/client/webconsole/test/browser_webconsole_bug_658368_time_methods.js": 6189, 
+-    "devtools/client/webconsole/test/browser_webconsole_bug_659907_console_dir.js": 7215, 
+-    "devtools/client/webconsole/test/browser_webconsole_bug_752559_ineffective_iframe_sandbox_warning.js": 19880, 
+-    "devtools/client/webconsole/test/browser_webconsole_bug_766001_JS_Console_in_Debugger.js": 10836, 
+-    "devtools/client/webconsole/test/browser_webconsole_bug_782653_CSS_links_in_Style_Editor.js": 6068, 
+-    "devtools/client/webconsole/test/browser_webconsole_cached_autocomplete.js": 5095, 
+-    "devtools/client/webconsole/test/browser_webconsole_cd_iframe.js": 6699, 
+-    "devtools/client/webconsole/test/browser_webconsole_clear_method.js": 6039, 
+-    "devtools/client/webconsole/test/browser_webconsole_clickable_urls.js": 12669, 
+-    "devtools/client/webconsole/test/browser_webconsole_closure_inspection.js": 10920, 
+-    "devtools/client/webconsole/test/browser_webconsole_hpkp_invalid-headers.js": 6357, 
+-    "devtools/client/webconsole/test/browser_webconsole_input_field_focus_on_panel_select.js": 5607, 
+-    "devtools/client/webconsole/test/browser_webconsole_inspect-parsed-documents.js": 5372, 
++    "devtools/client/styleeditor/test/browser_styleeditor_syncAddProperty.js": 4726, 
++    "devtools/client/styleeditor/test/browser_styleeditor_syncAddRule.js": 5026, 
++    "devtools/client/styleeditor/test/browser_styleeditor_syncAlreadyOpen.js": 4663, 
++    "devtools/client/styleeditor/test/browser_styleeditor_syncEditSelector.js": 4931, 
++    "devtools/client/styleeditor/test/browser_styleeditor_syncIntoRuleView.js": 6679, 
++    "devtools/client/styleeditor/test/browser_styleeditor_transition_rule.js": 4269, 
++    "devtools/client/webaudioeditor/test/browser_wa_properties-view-params.js": 3537, 
++    "devtools/client/webconsole/net/test/mochitest/browser_net_basic.js": 3836, 
++    "devtools/client/webconsole/net/test/mochitest/browser_net_params.js": 4263, 
++    "devtools/client/webconsole/net/test/mochitest/browser_net_post.js": 6898, 
++    "devtools/client/webconsole/net/test/mochitest/browser_net_response.js": 6123, 
++    "devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/browser_webconsole_check_stubs_console_api.js": 5892, 
++    "devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_inspect.js": 4413, 
++    "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_batching.js": 6416, 
++    "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_filters.js": 5265, 
++    "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_filters_persist.js": 7767, 
++    "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_location_debugger_link.js": 5592, 
++    "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_location_scratchpad_link.js": 4971, 
++    "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_location_styleeditor_link.js": 4469, 
++    "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_network_messages_click.js": 3871, 
++    "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_nodes_select.js": 5570, 
++    "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_object_inspector_entries.js": 3676, 
++    "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_observer_notifications.js": 4639, 
++    "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_scroll.js": 3616, 
++    "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_sourcemap_error.js": 3529, 
++    "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_sourcemap_nosource.js": 4008, 
++    "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_stacktrace_location_debugger_link.js": 5160, 
++    "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_stacktrace_location_scratchpad_link.js": 3645, 
++    "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_warn_about_replaced_api.js": 6869, 
++    "devtools/client/webconsole/test/browser_bug664688_sandbox_update_after_navigation.js": 3934, 
++    "devtools/client/webconsole/test/browser_cached_messages.js": 4512, 
++    "devtools/client/webconsole/test/browser_console_addonsdk_loader_exception.js": 3748, 
++    "devtools/client/webconsole/test/browser_console_consolejsm_output.js": 4138, 
++    "devtools/client/webconsole/test/browser_console_filters.js": 4025, 
++    "devtools/client/webconsole/test/browser_console_hide_jsterm_when_devtools_chrome_enabled_false.js": 9069, 
++    "devtools/client/webconsole/test/browser_console_history_persist.js": 7397, 
++    "devtools/client/webconsole/test/browser_console_iframe_messages.js": 5006, 
++    "devtools/client/webconsole/test/browser_console_native_getters.js": 6389, 
++    "devtools/client/webconsole/test/browser_console_nsiconsolemessage.js": 5074, 
++    "devtools/client/webconsole/test/browser_console_optimized_out_vars.js": 4977, 
++    "devtools/client/webconsole/test/browser_console_server_logging.js": 5339, 
++    "devtools/client/webconsole/test/browser_console_variables_view.js": 4545, 
++    "devtools/client/webconsole/test/browser_console_variables_view_dom_nodes.js": 4534, 
++    "devtools/client/webconsole/test/browser_console_variables_view_dont_sort_non_sortable_classes_properties.js": 5134, 
++    "devtools/client/webconsole/test/browser_console_variables_view_highlighter.js": 9326, 
++    "devtools/client/webconsole/test/browser_console_variables_view_while_debugging_and_inspecting.js": 6097, 
++    "devtools/client/webconsole/test/browser_eval_in_debugger_stackframe.js": 5348, 
++    "devtools/client/webconsole/test/browser_jsterm_inspect.js": 4304, 
++    "devtools/client/webconsole/test/browser_warn_user_about_replaced_api.js": 6188, 
++    "devtools/client/webconsole/test/browser_webconsole_autocomplete_crossdomain_iframe.js": 3777, 
++    "devtools/client/webconsole/test/browser_webconsole_bug_580001_closing_after_completion.js": 4292, 
++    "devtools/client/webconsole/test/browser_webconsole_bug_588342_document_focus.js": 3872, 
++    "devtools/client/webconsole/test/browser_webconsole_bug_593003_iframe_wrong_hud.js": 6910, 
++    "devtools/client/webconsole/test/browser_webconsole_bug_597103_deactivateHUDForContext_unfocused_window.js": 6792, 
++    "devtools/client/webconsole/test/browser_webconsole_bug_597460_filter_scroll.js": 4126, 
++    "devtools/client/webconsole/test/browser_webconsole_bug_597756_reopen_closed_tab.js": 4727, 
++    "devtools/client/webconsole/test/browser_webconsole_bug_614793_jsterm_scroll.js": 4711, 
++    "devtools/client/webconsole/test/browser_webconsole_bug_622303_persistent_filters.js": 7457, 
++    "devtools/client/webconsole/test/browser_webconsole_bug_632275_getters_document_width.js": 3893, 
++    "devtools/client/webconsole/test/browser_webconsole_bug_659907_console_dir.js": 4399, 
++    "devtools/client/webconsole/test/browser_webconsole_bug_752559_ineffective_iframe_sandbox_warning.js": 13081, 
++    "devtools/client/webconsole/test/browser_webconsole_bug_766001_JS_Console_in_Debugger.js": 8826, 
++    "devtools/client/webconsole/test/browser_webconsole_bug_782653_CSS_links_in_Style_Editor.js": 4121, 
++    "devtools/client/webconsole/test/browser_webconsole_cd_iframe.js": 5464, 
++    "devtools/client/webconsole/test/browser_webconsole_clear_method.js": 3989, 
++    "devtools/client/webconsole/test/browser_webconsole_clickable_urls.js": 6977, 
++    "devtools/client/webconsole/test/browser_webconsole_closure_inspection.js": 7941, 
++    "devtools/client/webconsole/test/browser_webconsole_input_field_focus_on_panel_select.js": 3920, 
+     "devtools/client/webconsole/test/browser_webconsole_netlogging.js": 16982, 
+-    "devtools/client/webconsole/test/browser_webconsole_netlogging_reset_filter.js": 5216, 
+-    "devtools/client/webconsole/test/browser_webconsole_output_01.js": 7384, 
+-    "devtools/client/webconsole/test/browser_webconsole_output_02.js": 10487, 
+-    "devtools/client/webconsole/test/browser_webconsole_output_03.js": 9448, 
+-    "devtools/client/webconsole/test/browser_webconsole_output_04.js": 8364, 
+-    "devtools/client/webconsole/test/browser_webconsole_output_05.js": 9768, 
+-    "devtools/client/webconsole/test/browser_webconsole_output_06.js": 14630, 
+-    "devtools/client/webconsole/test/browser_webconsole_output_dom_elements_01.js": 7935, 
+-    "devtools/client/webconsole/test/browser_webconsole_output_dom_elements_05.js": 9637, 
+-    "devtools/client/webconsole/test/browser_webconsole_output_table.js": 5144, 
+-    "devtools/client/webconsole/test/browser_webconsole_split.js": 19238, 
+-    "devtools/client/webconsole/test/browser_webconsole_split_escape_key.js": 7203, 
+-    "devtools/client/webconsole/test/browser_webconsole_split_focus.js": 6380, 
+-    "devtools/client/webconsole/test/browser_webconsole_split_persist.js": 15081, 
+-    "devtools/client/webconsole/test/browser_webconsole_view_source.js": 10583, 
+-    "devtools/server/tests/browser/browser_markers-cycle-collection.js": 6404, 
+-    "devtools/server/tests/browser/browser_storage_dynamic_windows.js": 5272, 
+-    "devtools/server/tests/browser/browser_storage_listings.js": 5790, 
+-    "devtools/server/tests/browser/browser_webextension_inspected_window.js": 10352
++    "devtools/client/webconsole/test/browser_webconsole_open-links-without-callback.js": 6541, 
++    "devtools/client/webconsole/test/browser_webconsole_output_01.js": 5598, 
++    "devtools/client/webconsole/test/browser_webconsole_output_02.js": 7341, 
++    "devtools/client/webconsole/test/browser_webconsole_output_03.js": 6283, 
++    "devtools/client/webconsole/test/browser_webconsole_output_04.js": 5452, 
++    "devtools/client/webconsole/test/browser_webconsole_output_05.js": 6567, 
++    "devtools/client/webconsole/test/browser_webconsole_output_06.js": 10194, 
++    "devtools/client/webconsole/test/browser_webconsole_output_dom_elements_01.js": 4770, 
++    "devtools/client/webconsole/test/browser_webconsole_output_dom_elements_05.js": 6878, 
++    "devtools/client/webconsole/test/browser_webconsole_split.js": 15452, 
++    "devtools/client/webconsole/test/browser_webconsole_split_escape_key.js": 4380, 
++    "devtools/client/webconsole/test/browser_webconsole_split_focus.js": 3758, 
++    "devtools/client/webconsole/test/browser_webconsole_split_persist.js": 10510, 
++    "devtools/client/webconsole/test/browser_webconsole_view_source.js": 5746, 
++    "devtools/server/tests/browser/browser_markers-cycle-collection.js": 5381, 
++    "devtools/server/tests/browser/browser_webextension_inspected_window.js": 5888
+   }
+ }
+\ No newline at end of file
+diff --git a/testing/runtimes/mochitest-devtools-chrome.runtimes.json b/testing/runtimes/mochitest-devtools-chrome.runtimes.json
+--- a/testing/runtimes/mochitest-devtools-chrome.runtimes.json
++++ b/testing/runtimes/mochitest-devtools-chrome.runtimes.json
+@@ -1,1098 +1,975 @@
+ {
+-  "excluded_test_average": 2911, 
++  "excluded_test_average": 2393, 
+   "runtimes": {
+-    "devtools/client/aboutdebugging/test/browser_addons_debug_bootstrapped.js": 18612, 
+-    "devtools/client/aboutdebugging/test/browser_addons_debug_webextension.js": 17533, 
+-    "devtools/client/aboutdebugging/test/browser_addons_debug_webextension_inspector.js": 22229, 
+-    "devtools/client/aboutdebugging/test/browser_addons_debug_webextension_nobg.js": 19392, 
+-    "devtools/client/aboutdebugging/test/browser_addons_debug_webextension_popup.js": 18519, 
+-    "devtools/client/aboutdebugging/test/browser_addons_debugging_initial_state.js": 10705, 
+-    "devtools/client/aboutdebugging/test/browser_addons_reload.js": 8875, 
+-    "devtools/client/aboutdebugging/test/browser_service_workers_not_compatible.js": 7688, 
+-    "devtools/client/aboutdebugging/test/browser_service_workers_push.js": 23344, 
+-    "devtools/client/aboutdebugging/test/browser_service_workers_push_service.js": 19964, 
+-    "devtools/client/aboutdebugging/test/browser_service_workers_status.js": 5600, 
+-    "devtools/client/animationinspector/test/browser_animation_animated_properties_displayed.js": 11959, 
+-    "devtools/client/animationinspector/test/browser_animation_click_selects_animation.js": 10951, 
+-    "devtools/client/animationinspector/test/browser_animation_controller_exposes_document_currentTime.js": 6183, 
+-    "devtools/client/animationinspector/test/browser_animation_empty_on_invalid_nodes.js": 11530, 
+-    "devtools/client/animationinspector/test/browser_animation_keyframe_click_to_set_time.js": 7369, 
+-    "devtools/client/animationinspector/test/browser_animation_keyframe_markers.js": 7210, 
+-    "devtools/client/animationinspector/test/browser_animation_mutations_with_same_names.js": 6443, 
+-    "devtools/client/animationinspector/test/browser_animation_participate_in_inspector_update.js": 11743, 
+-    "devtools/client/animationinspector/test/browser_animation_playerFronts_are_refreshed.js": 12343, 
+-    "devtools/client/animationinspector/test/browser_animation_playerWidgets_appear_on_panel_init.js": 6718, 
+-    "devtools/client/animationinspector/test/browser_animation_playerWidgets_target_nodes.js": 11913, 
+-    "devtools/client/animationinspector/test/browser_animation_pseudo_elements.js": 12957, 
+-    "devtools/client/animationinspector/test/browser_animation_refresh_on_added_animation.js": 12186, 
+-    "devtools/client/animationinspector/test/browser_animation_refresh_on_removed_animation.js": 8374, 
+-    "devtools/client/animationinspector/test/browser_animation_refresh_when_active.js": 14499, 
+-    "devtools/client/animationinspector/test/browser_animation_running_on_compositor.js": 12264, 
+-    "devtools/client/animationinspector/test/browser_animation_same_nb_of_playerWidgets_and_playerFronts.js": 11259, 
+-    "devtools/client/animationinspector/test/browser_animation_shows_player_on_valid_node.js": 11288, 
+-    "devtools/client/animationinspector/test/browser_animation_spacebar_toggles_animations.js": 11791, 
+-    "devtools/client/animationinspector/test/browser_animation_spacebar_toggles_node_animations.js": 14960, 
+-    "devtools/client/animationinspector/test/browser_animation_target_highlight_select.js": 13562, 
+-    "devtools/client/animationinspector/test/browser_animation_target_highlighter_lock.js": 11829, 
++    "devtools/client/aboutdebugging/test/browser_addons_debug_bootstrapped.js": 10925, 
++    "devtools/client/aboutdebugging/test/browser_addons_debug_info.js": 6014, 
++    "devtools/client/aboutdebugging/test/browser_addons_debug_webextension.js": 11755, 
++    "devtools/client/aboutdebugging/test/browser_addons_debug_webextension_inspector.js": 11262, 
++    "devtools/client/aboutdebugging/test/browser_addons_debug_webextension_nobg.js": 11217, 
++    "devtools/client/aboutdebugging/test/browser_addons_debug_webextension_popup.js": 10958, 
++    "devtools/client/aboutdebugging/test/browser_addons_debugging_initial_state.js": 5865, 
++    "devtools/client/aboutdebugging/test/browser_addons_reload.js": 5484, 
++    "devtools/client/aboutdebugging/test/browser_service_workers_not_compatible.js": 5813, 
++    "devtools/client/aboutdebugging/test/browser_service_workers_push.js": 29415, 
++    "devtools/client/aboutdebugging/test/browser_service_workers_push_service.js": 29953, 
++    "devtools/client/animationinspector/test/browser_animation_animated_properties_displayed.js": 10309, 
++    "devtools/client/animationinspector/test/browser_animation_animated_properties_for_delayed_starttime_animations.js": 5954, 
++    "devtools/client/animationinspector/test/browser_animation_animated_properties_path.js": 6085, 
++    "devtools/client/animationinspector/test/browser_animation_animated_properties_progress_indicator.js": 7245, 
++    "devtools/client/animationinspector/test/browser_animation_click_selects_animation.js": 9920, 
++    "devtools/client/animationinspector/test/browser_animation_controller_exposes_document_currentTime.js": 10620, 
++    "devtools/client/animationinspector/test/browser_animation_detail_displayed.js": 6401, 
++    "devtools/client/animationinspector/test/browser_animation_empty_on_invalid_nodes.js": 9727, 
++    "devtools/client/animationinspector/test/browser_animation_keyframe_click_to_set_time.js": 5929, 
++    "devtools/client/animationinspector/test/browser_animation_keyframe_markers.js": 8722, 
++    "devtools/client/animationinspector/test/browser_animation_mutations_with_same_names.js": 5005, 
++    "devtools/client/animationinspector/test/browser_animation_participate_in_inspector_update.js": 8673, 
++    "devtools/client/animationinspector/test/browser_animation_playerFronts_are_refreshed.js": 9964, 
++    "devtools/client/animationinspector/test/browser_animation_playerWidgets_appear_on_panel_init.js": 6372, 
++    "devtools/client/animationinspector/test/browser_animation_playerWidgets_target_nodes.js": 7762, 
++    "devtools/client/animationinspector/test/browser_animation_pseudo_elements.js": 14193, 
++    "devtools/client/animationinspector/test/browser_animation_refresh_on_added_animation.js": 10529, 
++    "devtools/client/animationinspector/test/browser_animation_refresh_on_removed_animation.js": 9822, 
++    "devtools/client/animationinspector/test/browser_animation_refresh_when_active.js": 11279, 
++    "devtools/client/animationinspector/test/browser_animation_running_on_compositor.js": 11095, 
++    "devtools/client/animationinspector/test/browser_animation_same_nb_of_playerWidgets_and_playerFronts.js": 9960, 
++    "devtools/client/animationinspector/test/browser_animation_shows_player_on_valid_node.js": 10131, 
++    "devtools/client/animationinspector/test/browser_animation_spacebar_toggles_animations.js": 9824, 
++    "devtools/client/animationinspector/test/browser_animation_spacebar_toggles_node_animations.js": 13391, 
++    "devtools/client/animationinspector/test/browser_animation_summarygraph_for_multiple_easings.js": 6937, 
++    "devtools/client/animationinspector/test/browser_animation_target_highlight_select.js": 10710, 
++    "devtools/client/animationinspector/test/browser_animation_target_highlighter_lock.js": 9962, 
+     "devtools/client/animationinspector/test/browser_animation_timeline_currentTime.js": 13059, 
+-    "devtools/client/animationinspector/test/browser_animation_timeline_header.js": 10475, 
+-    "devtools/client/animationinspector/test/browser_animation_timeline_iterationStart.js": 6218, 
+-    "devtools/client/animationinspector/test/browser_animation_timeline_pause_button.js": 17750, 
+-    "devtools/client/animationinspector/test/browser_animation_timeline_pause_button_01.js": 16257, 
+-    "devtools/client/animationinspector/test/browser_animation_timeline_pause_button_02.js": 13674, 
+-    "devtools/client/animationinspector/test/browser_animation_timeline_pause_button_03.js": 19248, 
+-    "devtools/client/animationinspector/test/browser_animation_timeline_rate_selector.js": 17563, 
+-    "devtools/client/animationinspector/test/browser_animation_timeline_rewind_button.js": 17273, 
+-    "devtools/client/animationinspector/test/browser_animation_timeline_scrubber_exists.js": 10283, 
+-    "devtools/client/animationinspector/test/browser_animation_timeline_scrubber_movable.js": 10268, 
+-    "devtools/client/animationinspector/test/browser_animation_timeline_scrubber_moves.js": 12572, 
++    "devtools/client/animationinspector/test/browser_animation_timeline_header.js": 8965, 
++    "devtools/client/animationinspector/test/browser_animation_timeline_iterationStart.js": 5254, 
++    "devtools/client/animationinspector/test/browser_animation_timeline_pause_button_01.js": 13241, 
++    "devtools/client/animationinspector/test/browser_animation_timeline_pause_button_02.js": 10091, 
++    "devtools/client/animationinspector/test/browser_animation_timeline_pause_button_03.js": 16815, 
++    "devtools/client/animationinspector/test/browser_animation_timeline_rate_selector.js": 16320, 
++    "devtools/client/animationinspector/test/browser_animation_timeline_rewind_button.js": 15680, 
++    "devtools/client/animationinspector/test/browser_animation_timeline_scrubber_exists.js": 6323, 
++    "devtools/client/animationinspector/test/browser_animation_timeline_scrubber_movable.js": 9314, 
++    "devtools/client/animationinspector/test/browser_animation_timeline_scrubber_moves.js": 11475, 
+     "devtools/client/animationinspector/test/browser_animation_timeline_setCurrentTime.js": 10011, 
+-    "devtools/client/animationinspector/test/browser_animation_timeline_short_duration.js": 6390, 
+-    "devtools/client/animationinspector/test/browser_animation_timeline_shows_delay.js": 12474, 
+-    "devtools/client/animationinspector/test/browser_animation_timeline_shows_endDelay.js": 7912, 
+-    "devtools/client/animationinspector/test/browser_animation_timeline_shows_iterations.js": 12333, 
+-    "devtools/client/animationinspector/test/browser_animation_timeline_shows_name_label.js": 11086, 
+-    "devtools/client/animationinspector/test/browser_animation_timeline_shows_time_info.js": 10700, 
++    "devtools/client/animationinspector/test/browser_animation_timeline_short_duration.js": 5706, 
++    "devtools/client/animationinspector/test/browser_animation_timeline_shows_delay.js": 10441, 
++    "devtools/client/animationinspector/test/browser_animation_timeline_shows_endDelay.js": 8865, 
++    "devtools/client/animationinspector/test/browser_animation_timeline_shows_iterations.js": 9966, 
++    "devtools/client/animationinspector/test/browser_animation_timeline_shows_name_label.js": 9965, 
++    "devtools/client/animationinspector/test/browser_animation_timeline_shows_time_info.js": 9132, 
+     "devtools/client/animationinspector/test/browser_animation_timeline_takes_rate_into_account.js": 5973, 
+-    "devtools/client/animationinspector/test/browser_animation_timeline_ui.js": 10733, 
+-    "devtools/client/animationinspector/test/browser_animation_toggle_button_resets_on_navigate.js": 14549, 
+-    "devtools/client/animationinspector/test/browser_animation_toggle_button_toggles_animations.js": 11848, 
+-    "devtools/client/animationinspector/test/browser_animation_toolbar_exists.js": 11156, 
+-    "devtools/client/animationinspector/test/browser_animation_ui_updates_when_animation_data_changes.js": 12667, 
+-    "devtools/client/canvasdebugger/test/browser_canvas-frontend-call-stack-01.js": 6768, 
+-    "devtools/client/canvasdebugger/test/browser_canvas-frontend-call-stack-02.js": 6171, 
+-    "devtools/client/commandline/test/browser_cmd_addon.js": 6375, 
+-    "devtools/client/commandline/test/browser_cmd_commands.js": 6019, 
+-    "devtools/client/commandline/test/browser_cmd_csscoverage_startstop.js": 7542, 
+-    "devtools/client/commandline/test/browser_cmd_highlight_04.js": 14801, 
+-    "devtools/client/commandline/test/browser_cmd_screenshot.js": 17808, 
+-    "devtools/client/commandline/test/browser_gcli_exec.js": 5572, 
+-    "devtools/client/debugger/new/test/mochitest/browser_dbg-breaking-from-console.js": 9602, 
+-    "devtools/client/debugger/new/test/mochitest/browser_dbg-breaking.js": 13927, 
+-    "devtools/client/debugger/new/test/mochitest/browser_dbg-breakpoints-cond.js": 9372, 
+-    "devtools/client/debugger/new/test/mochitest/browser_dbg-breakpoints.js": 15856, 
+-    "devtools/client/debugger/new/test/mochitest/browser_dbg-call-stack.js": 14046, 
+-    "devtools/client/debugger/new/test/mochitest/browser_dbg-console.js": 5371, 
++    "devtools/client/animationinspector/test/browser_animation_timeline_ui.js": 6851, 
++    "devtools/client/animationinspector/test/browser_animation_toggle_button_resets_on_navigate.js": 11224, 
++    "devtools/client/animationinspector/test/browser_animation_toggle_button_toggles_animations.js": 9841, 
++    "devtools/client/animationinspector/test/browser_animation_toolbar_exists.js": 9659, 
++    "devtools/client/animationinspector/test/browser_animation_ui_updates_when_animation_data_changes.js": 10789, 
++    "devtools/client/canvasdebugger/test/browser_canvas-frontend-call-stack-01.js": 5152, 
++    "devtools/client/canvasdebugger/test/browser_canvas-frontend-call-stack-02.js": 4743, 
++    "devtools/client/commandline/test/browser_cmd_addon.js": 5312, 
++    "devtools/client/commandline/test/browser_cmd_commands.js": 4915, 
++    "devtools/client/commandline/test/browser_cmd_csscoverage_startstop.js": 5247, 
++    "devtools/client/commandline/test/browser_cmd_highlight_04.js": 8023, 
++    "devtools/client/debugger/new/test/mochitest/browser_dbg-breaking-from-console.js": 7179, 
++    "devtools/client/debugger/new/test/mochitest/browser_dbg-breaking.js": 9496, 
++    "devtools/client/debugger/new/test/mochitest/browser_dbg-breakpoints-cond.js": 6806, 
++    "devtools/client/debugger/new/test/mochitest/browser_dbg-breakpoints.js": 12290, 
++    "devtools/client/debugger/new/test/mochitest/browser_dbg-call-stack.js": 10108, 
+     "devtools/client/debugger/new/test/mochitest/browser_dbg-debugger-buttons.js": 12733, 
+-    "devtools/client/debugger/new/test/mochitest/browser_dbg-editor-gutter.js": 10029, 
+-    "devtools/client/debugger/new/test/mochitest/browser_dbg-editor-highlight.js": 10077, 
++    "devtools/client/debugger/new/test/mochitest/browser_dbg-editor-gutter.js": 7846, 
++    "devtools/client/debugger/new/test/mochitest/browser_dbg-editor-highlight.js": 5898, 
+     "devtools/client/debugger/new/test/mochitest/browser_dbg-editor-mode.js": 7228, 
+     "devtools/client/debugger/new/test/mochitest/browser_dbg-editor-select.js": 16329, 
+-    "devtools/client/debugger/new/test/mochitest/browser_dbg-iframes.js": 10012, 
+-    "devtools/client/debugger/new/test/mochitest/browser_dbg-navigation.js": 15149, 
+-    "devtools/client/debugger/new/test/mochitest/browser_dbg-pause-exceptions.js": 9425, 
+-    "devtools/client/debugger/new/test/mochitest/browser_dbg-pretty-print-paused.js": 8647, 
+-    "devtools/client/debugger/new/test/mochitest/browser_dbg-pretty-print.js": 11541, 
+-    "devtools/client/debugger/new/test/mochitest/browser_dbg-scopes.js": 15957, 
+-    "devtools/client/debugger/new/test/mochitest/browser_dbg-sourcemaps-bogus.js": 6574, 
+-    "devtools/client/debugger/new/test/mochitest/browser_dbg-sourcemaps.js": 16114, 
+-    "devtools/client/debugger/new/test/mochitest/browser_dbg-sources.js": 5893, 
+-    "devtools/client/debugger/new/test/mochitest/browser_dbg_keyboard-shortcuts.js": 11206, 
++    "devtools/client/debugger/new/test/mochitest/browser_dbg-expressions.js": 7658, 
++    "devtools/client/debugger/new/test/mochitest/browser_dbg-iframes.js": 9124, 
++    "devtools/client/debugger/new/test/mochitest/browser_dbg-navigation.js": 13006, 
++    "devtools/client/debugger/new/test/mochitest/browser_dbg-pause-exceptions.js": 5784, 
++    "devtools/client/debugger/new/test/mochitest/browser_dbg-pretty-print-paused.js": 8012, 
++    "devtools/client/debugger/new/test/mochitest/browser_dbg-pretty-print.js": 10460, 
++    "devtools/client/debugger/new/test/mochitest/browser_dbg-scopes-mutations.js": 7819, 
++    "devtools/client/debugger/new/test/mochitest/browser_dbg-scopes.js": 7923, 
++    "devtools/client/debugger/new/test/mochitest/browser_dbg-sourcemaps-bogus.js": 5548, 
++    "devtools/client/debugger/new/test/mochitest/browser_dbg-sourcemaps-reloading.js": 8179, 
++    "devtools/client/debugger/new/test/mochitest/browser_dbg-sourcemaps.js": 13900, 
++    "devtools/client/debugger/new/test/mochitest/browser_dbg-sourcemaps2.js": 6133, 
++    "devtools/client/debugger/new/test/mochitest/browser_dbg-sources.js": 7369, 
++    "devtools/client/debugger/new/test/mochitest/browser_dbg-tabs.js": 13291, 
++    "devtools/client/debugger/new/test/mochitest/browser_dbg_keyboard-shortcuts.js": 9276, 
+     "devtools/client/debugger/test/mochitest/browser_dbg_aaa_run_first_leaktest.js": 6987, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_addon-panels.js": 5758, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_addon-sources.js": 6091, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_addon-workers-dbg-enabled.js": 6671, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_addon-modules-unpacked.js": 5029, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_addon-modules.js": 5403, 
+     "devtools/client/debugger/test/mochitest/browser_dbg_auto-pretty-print-01.js": 5552, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_auto-pretty-print-02.js": 4754, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_blackboxing-02.js": 5281, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_blackboxing-03.js": 5223, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_blackboxing-04.js": 5218, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_blackboxing-06.js": 5221, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_breadcrumbs-access.js": 5385, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_break-in-anon.js": 4666, 
+     "devtools/client/debugger/test/mochitest/browser_dbg_break-on-dom-02.js": 6803, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_break-on-dom-03.js": 4732, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_break-on-dom-04.js": 5078, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_break-on-dom-05.js": 5073, 
+     "devtools/client/debugger/test/mochitest/browser_dbg_break-on-dom-06.js": 6478, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_break-on-next-console.js": 6322, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_break-unselected.js": 5501, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-actual-location2.js": 5548, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_break-on-dom-08.js": 5541, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_break-on-next-console.js": 5812, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_break-on-next.js": 5716, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_break-unselected.js": 5004, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-actual-location.js": 5015, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-actual-location2.js": 5906, 
+     "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-break-on-last-line-of-script-on-reload.js": 6747, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-button-01.js": 4878, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-button-02.js": 4769, 
+     "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-condition-thrown-message.js": 5719, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-contextmenu.js": 12744, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-contextmenu-add.js": 5153, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-contextmenu.js": 13721, 
+     "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-disabled-reload.js": 9093, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-editor.js": 5288, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-eval.js": 4725, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-highlight.js": 5093, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-new-script.js": 5399, 
+     "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-other-tabs.js": 7022, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-pane.js": 5745, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_bug-896139.js": 5570, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_closure-inspection.js": 9998, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-pane.js": 5408, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-reload.js": 5209, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_bug-896139.js": 5964, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_closure-inspection.js": 9366, 
+     "devtools/client/debugger/test/mochitest/browser_dbg_cmd-blackbox.js": 6424, 
+     "devtools/client/debugger/test/mochitest/browser_dbg_cmd-break.js": 5927, 
+     "devtools/client/debugger/test/mochitest/browser_dbg_cmd-dbg.js": 6698, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_conditional-breakpoints-01.js": 11177, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_conditional-breakpoints-02.js": 5857, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_conditional-breakpoints-03.js": 5382, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_conditional-breakpoints-05.js": 6679, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_conditional-breakpoints-01.js": 11945, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_conditional-breakpoints-02.js": 6423, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_conditional-breakpoints-03.js": 5866, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_conditional-breakpoints-04.js": 5262, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_conditional-breakpoints-05.js": 7142, 
+     "devtools/client/debugger/test/mochitest/browser_dbg_console-eval.js": 5528, 
+     "devtools/client/debugger/test/mochitest/browser_dbg_console-named-eval.js": 5664, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_host-layout.js": 21821, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_interrupts.js": 5360, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_location-changes-01-simple.js": 5464, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_location-changes-03-new.js": 5432, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_controller-evaluate-01.js": 5482, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_controller-evaluate-02.js": 5298, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_editor-contextmenu.js": 5319, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_editor-mode.js": 5209, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_file-reload.js": 4923, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_function-display-name.js": 5195, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_global-method-override.js": 4665, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_hide-toolbar-buttons.js": 4961, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_host-layout.js": 24115, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_iframes.js": 4997, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_instruments-pane-collapse.js": 4791, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_instruments-pane-collapse_keyboard.js": 5448, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_interrupts.js": 5694, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_location-changes-01-simple.js": 5823, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_location-changes-02-blank.js": 5121, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_location-changes-03-new.js": 5856, 
+     "devtools/client/debugger/test/mochitest/browser_dbg_location-changes-04-breakpoint.js": 7180, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_on-pause-highlight.js": 6003, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_pause-exceptions-01.js": 5543, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_pause-exceptions-02.js": 5862, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_no-dangling-breakpoints.js": 4803, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_on-pause-highlight.js": 6455, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_on-pause-raise.js": 6677, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_optimized-out-vars.js": 5498, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_pause-exceptions-01.js": 6136, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_pause-exceptions-02.js": 6528, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_pause-no-step.js": 5637, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_pause-resume.js": 4935, 
+     "devtools/client/debugger/test/mochitest/browser_dbg_pause-warning.js": 8198, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_paused-keybindings.js": 6504, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_post-page.js": 4938, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_pretty-print-01.js": 5273, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_pretty-print-02.js": 5306, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_pretty-print-03.js": 5883, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_pretty-print-04.js": 5438, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_pretty-print-05.js": 4799, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_pretty-print-07.js": 4786, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_pretty-print-08.js": 5833, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_pretty-print-09.js": 5485, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_pretty-print-10.js": 5140, 
+     "devtools/client/debugger/test/mochitest/browser_dbg_pretty-print-11.js": 5813, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_pretty-print-on-paused.js": 5456, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_reload-same-script.js": 6892, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_scripts-switching-01.js": 5362, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_scripts-switching-02.js": 5428, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_pretty-print-12.js": 5162, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_pretty-print-13.js": 5300, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_pretty-print-on-paused.js": 5924, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_progress-listener-bug.js": 5179, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_promises-allocation-stack.js": 5051, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_promises-fulfillment-stack.js": 4776, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_promises-rejection-stack.js": 4756, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_reload-preferred-script-02.js": 4961, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_reload-preferred-script-03.js": 4962, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_reload-same-script.js": 7352, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_scripts-switching-01.js": 5860, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_scripts-switching-02.js": 5812, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_scripts-switching-03.js": 4637, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_search-autofill-identifier.js": 4863, 
+     "devtools/client/debugger/test/mochitest/browser_dbg_search-basic-01.js": 7125, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_search-basic-02.js": 6874, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_search-basic-03.js": 5752, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_search-global-01.js": 6015, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_search-global-02.js": 5529, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_search-global-03.js": 5657, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_search-global-05.js": 6320, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_search-global-06.js": 7341, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_search-popup-jank.js": 5417, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_search-sources-01.js": 5731, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_search-sources-02.js": 5805, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_search-basic-02.js": 7456, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_search-basic-03.js": 6264, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_search-basic-04.js": 4978, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_search-global-01.js": 7042, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_search-global-02.js": 6241, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_search-global-03.js": 6359, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_search-global-04.js": 5852, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_search-global-05.js": 7218, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_search-global-06.js": 8635, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_search-popup-jank.js": 6270, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_search-sources-01.js": 6590, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_search-sources-02.js": 6369, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_search-sources-03.js": 5454, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_search-symbols.js": 7088, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_searchbox-help-popup-01.js": 5695, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_searchbox-help-popup-02.js": 5404, 
+     "devtools/client/debugger/test/mochitest/browser_dbg_server-conditional-bp-01.js": 10666, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_server-conditional-bp-02.js": 6061, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_server-conditional-bp-03.js": 5636, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_server-conditional-bp-02.js": 6832, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_server-conditional-bp-03.js": 6057, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_server-conditional-bp-04.js": 5422, 
+     "devtools/client/debugger/test/mochitest/browser_dbg_server-conditional-bp-05.js": 6784, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_source-maps-02.js": 6006, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_source-maps-04.js": 5906, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_sources-webext-contentscript.js": 5963, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_split-console-keypress.js": 10419, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_stack-03.js": 11845, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_stack-07.js": 5966, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_step-out.js": 5627, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_source-maps-01.js": 5895, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_source-maps-02.js": 6763, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_source-maps-03.js": 5768, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_source-maps-04.js": 6688, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_sources-bookmarklet.js": 4972, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_sources-cache.js": 5498, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_sources-contextmenu-02.js": 5188, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_sources-eval-02.js": 4803, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_sources-iframe-reload.js": 5392, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_sources-labels.js": 4810, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_sources-large.js": 5396, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_sources-sorting.js": 4619, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_sources-webext-contentscript.js": 6448, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_stack-01.js": 5446, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_stack-02.js": 6282, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_stack-03.js": 4613, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_stack-contextmenu-01.js": 5113, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_step-out.js": 6387, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_terminate-on-tab-close.js": 5055, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-01.js": 4710, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-02.js": 4881, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-03.js": 4739, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-04.js": 4733, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-05.js": 4832, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-06.js": 5639, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-07.js": 5537, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-08.js": 5363, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-edit-cancel.js": 5897, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-edit-click.js": 5244, 
+     "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-edit-getset-01.js": 15720, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-edit-getset-02.js": 5984, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-edit-value.js": 9062, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-edit-watch.js": 7141, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-edit-getset-02.js": 6750, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-edit-value-01.js": 10050, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-edit-value-02.js": 6366, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-edit-value.js": 9559, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-edit-watch.js": 7787, 
+     "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-filter-01.js": 13366, 
+     "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-filter-02.js": 13948, 
+     "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-filter-03.js": 10745, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-filter-04.js": 9780, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-filter-05.js": 10108, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-frame-parameters-01.js": 8600, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-frame-parameters-02.js": 5769, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-filter-04.js": 10395, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-filter-05.js": 10646, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-filter-pref.js": 5341, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-filter-searchbox.js": 5061, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-frame-parameters-01.js": 9608, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-frame-parameters-02.js": 6519, 
+     "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-frame-parameters-03.js": 12588, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-frame-with.js": 5620, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-frame-with.js": 6475, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-frozen-sealed-nonext.js": 5432, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-hide-non-enums.js": 5415, 
+     "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-large-array-buffer.js": 16856, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-map-set.js": 6569, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-override-01.js": 9563, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-01.js": 7260, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-02.js": 6038, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-03.js": 5318, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-06.js": 5339, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-07.js": 7060, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-08.js": 5442, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-09.js": 5757, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-10.js": 5924, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-11.js": 6912, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-12.js": 6792, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-map-set.js": 7255, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-override-01.js": 10793, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-override-02.js": 5393, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-01.js": 7875, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-02.js": 6609, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-03.js": 5896, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-04.js": 5898, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-05.js": 5899, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-06.js": 5920, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-07.js": 7639, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-08.js": 6047, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-09.js": 6553, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-10.js": 6454, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-11.js": 7399, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-12.js": 7354, 
+     "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-13.js": 9668, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-15.js": 6242, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-15.js": 6916, 
+     "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-16.js": 13811, 
+     "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-popup-17.js": 6049, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-reexpand-01.js": 25497, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-reexpand-01.js": 26923, 
+     "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-reexpand-02.js": 31645, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-reexpand-03.js": 6679, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-reexpand-03.js": 6118, 
+     "devtools/client/debugger/test/mochitest/browser_dbg_variables-view-webidl.js": 12245, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_watch-expressions-01.js": 6091, 
+     "devtools/client/debugger/test/mochitest/browser_dbg_watch-expressions-02.js": 11093, 
+     "devtools/client/debugger/test/mochitest/browser_dbg_worker-console-02.js": 6032, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_worker-console-03.js": 5968, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_worker-console.js": 11622, 
+-    "devtools/client/debugger/test/mochitest/browser_dbg_worker-source-map.js": 8070, 
+-    "devtools/client/dom/test/browser_dom_array.js": 16886, 
+-    "devtools/client/dom/test/browser_dom_basic.js": 13447, 
+-    "devtools/client/dom/test/browser_dom_refresh.js": 16195, 
+-    "devtools/client/fontinspector/test/browser_fontinspector.js": 7848, 
+-    "devtools/client/framework/test/browser_browser_toolbox.js": 26738, 
+-    "devtools/client/framework/test/browser_browser_toolbox_debugger.js": 23732, 
+-    "devtools/client/framework/test/browser_keybindings_01.js": 10561, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_worker-console-03.js": 9590, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_worker-console-04.js": 6083, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_worker-source-map.js": 9954, 
++    "devtools/client/debugger/test/mochitest/browser_dbg_worker-window.js": 4882, 
++    "devtools/client/dom/test/browser_dom_array.js": 11502, 
++    "devtools/client/dom/test/browser_dom_basic.js": 10003, 
++    "devtools/client/dom/test/browser_dom_refresh.js": 11615, 
++    "devtools/client/framework/test/browser_browser_toolbox.js": 14762, 
++    "devtools/client/framework/test/browser_keybindings_01.js": 6630, 
+     "devtools/client/framework/test/browser_keybindings_02.js": 6178, 
+-    "devtools/client/framework/test/browser_new_activation_workflow.js": 9916, 
+-    "devtools/client/framework/test/browser_toolbox_getpanelwhenready.js": 5462, 
+-    "devtools/client/framework/test/browser_toolbox_highlight.js": 6103, 
+-    "devtools/client/framework/test/browser_toolbox_hosts.js": 16113, 
+-    "devtools/client/framework/test/browser_toolbox_hosts_size.js": 11373, 
+-    "devtools/client/framework/test/browser_toolbox_options.js": 6598, 
+-    "devtools/client/framework/test/browser_toolbox_options_disable_buttons.js": 8011, 
+-    "devtools/client/framework/test/browser_toolbox_options_disable_cache-01.js": 11970, 
+-    "devtools/client/framework/test/browser_toolbox_options_disable_cache-02.js": 14987, 
+-    "devtools/client/framework/test/browser_toolbox_options_disable_js.js": 5538, 
+-    "devtools/client/framework/test/browser_toolbox_options_enable_serviceworkers_testing.js": 5364, 
+-    "devtools/client/framework/test/browser_toolbox_select_event.js": 28851, 
+-    "devtools/client/framework/test/browser_toolbox_selected_tool_unavailable.js": 5915, 
+-    "devtools/client/framework/test/browser_toolbox_split_console.js": 5537, 
+-    "devtools/client/framework/test/browser_toolbox_tabsswitch_shortcuts.js": 18153, 
+-    "devtools/client/framework/test/browser_toolbox_target.js": 5461, 
+-    "devtools/client/framework/test/browser_toolbox_textbox_context_menu.js": 5858, 
+-    "devtools/client/framework/test/browser_toolbox_toggle.js": 14440, 
+-    "devtools/client/framework/test/browser_toolbox_tool_ready.js": 25677, 
+-    "devtools/client/framework/test/browser_toolbox_tool_remote_reopen.js": 18129, 
+-    "devtools/client/framework/test/browser_toolbox_transport_events.js": 6001, 
+-    "devtools/client/framework/test/browser_toolbox_view_source_01.js": 6079, 
+-    "devtools/client/framework/test/browser_toolbox_view_source_03.js": 6667, 
+-    "devtools/client/framework/test/browser_toolbox_view_source_04.js": 7228, 
+-    "devtools/client/framework/test/browser_toolbox_window_reload_target.js": 31308, 
+-    "devtools/client/framework/test/browser_toolbox_window_shortcuts.js": 13139, 
+-    "devtools/client/framework/test/browser_toolbox_window_title_changes.js": 14483, 
+-    "devtools/client/framework/test/browser_toolbox_window_title_frame_select.js": 9950, 
+-    "devtools/client/inspector/components/test/browser_boxmodel.js": 10398, 
+-    "devtools/client/inspector/components/test/browser_boxmodel_editablemodel.js": 14314, 
+-    "devtools/client/inspector/components/test/browser_boxmodel_editablemodel_bluronclick.js": 6991, 
+-    "devtools/client/inspector/components/test/browser_boxmodel_editablemodel_border.js": 8074, 
+-    "devtools/client/inspector/components/test/browser_boxmodel_editablemodel_stylerules.js": 11155, 
+-    "devtools/client/inspector/components/test/browser_boxmodel_guides.js": 6566, 
+-    "devtools/client/inspector/components/test/browser_boxmodel_rotate-labels-on-sides.js": 6347, 
+-    "devtools/client/inspector/components/test/browser_boxmodel_sync.js": 7129, 
+-    "devtools/client/inspector/components/test/browser_boxmodel_tooltips.js": 7454, 
+-    "devtools/client/inspector/components/test/browser_boxmodel_update-after-navigation.js": 13474, 
+-    "devtools/client/inspector/components/test/browser_boxmodel_update-after-reload.js": 10062, 
+-    "devtools/client/inspector/computed/test/browser_computed_browser-styles.js": 13206, 
+-    "devtools/client/inspector/computed/test/browser_computed_cycle_color.js": 6942, 
+-    "devtools/client/inspector/computed/test/browser_computed_getNodeInfo.js": 7597, 
+-    "devtools/client/inspector/computed/test/browser_computed_keybindings_01.js": 7463, 
+-    "devtools/client/inspector/computed/test/browser_computed_keybindings_02.js": 8115, 
+-    "devtools/client/inspector/computed/test/browser_computed_matched-selectors-toggle.js": 7442, 
+-    "devtools/client/inspector/computed/test/browser_computed_matched-selectors_01.js": 8133, 
+-    "devtools/client/inspector/computed/test/browser_computed_matched-selectors_02.js": 6673, 
+-    "devtools/client/inspector/computed/test/browser_computed_media-queries.js": 7312, 
+-    "devtools/client/inspector/computed/test/browser_computed_no-results-placeholder.js": 7674, 
+-    "devtools/client/inspector/computed/test/browser_computed_original-source-link.js": 10752, 
+-    "devtools/client/inspector/computed/test/browser_computed_pseudo-element_01.js": 9741, 
+-    "devtools/client/inspector/computed/test/browser_computed_refresh-on-style-change_01.js": 7220, 
+-    "devtools/client/inspector/computed/test/browser_computed_search-filter.js": 13362, 
+-    "devtools/client/inspector/computed/test/browser_computed_search-filter_clear.js": 11315, 
+-    "devtools/client/inspector/computed/test/browser_computed_search-filter_escape-keypress.js": 14995, 
+-    "devtools/client/inspector/computed/test/browser_computed_search-filter_noproperties.js": 8575, 
+-    "devtools/client/inspector/computed/test/browser_computed_style-editor-link.js": 12739, 
+-    "devtools/client/inspector/fonts/test/browser_fontinspector.js": 9819, 
+-    "devtools/client/inspector/fonts/test/browser_fontinspector_edit-previews-show-all.js": 5633, 
+-    "devtools/client/inspector/fonts/test/browser_fontinspector_edit-previews.js": 6513, 
+-    "devtools/client/inspector/fonts/test/browser_fontinspector_theme-change.js": 6766, 
+-    "devtools/client/inspector/layout/test/browser_layout_editablemodel.js": 5394, 
+-    "devtools/client/inspector/markup/test/browser_markup_accessibility_focus_blur.js": 10392, 
+-    "devtools/client/inspector/markup/test/browser_markup_accessibility_navigation.js": 9094, 
+-    "devtools/client/inspector/markup/test/browser_markup_accessibility_navigation_after_edit.js": 5962, 
+-    "devtools/client/inspector/markup/test/browser_markup_accessibility_semantics.js": 6530, 
+-    "devtools/client/inspector/markup/test/browser_markup_anonymous_01.js": 7336, 
+-    "devtools/client/inspector/markup/test/browser_markup_anonymous_02.js": 14787, 
+-    "devtools/client/inspector/markup/test/browser_markup_anonymous_03.js": 7334, 
+-    "devtools/client/inspector/markup/test/browser_markup_anonymous_04.js": 7535, 
+-    "devtools/client/inspector/markup/test/browser_markup_css_completion_style_attribute_01.js": 10997, 
+-    "devtools/client/inspector/markup/test/browser_markup_css_completion_style_attribute_02.js": 13827, 
+-    "devtools/client/inspector/markup/test/browser_markup_css_completion_style_attribute_03.js": 9603, 
+-    "devtools/client/inspector/markup/test/browser_markup_dragdrop_autoscroll_01.js": 12853, 
+-    "devtools/client/inspector/markup/test/browser_markup_dragdrop_autoscroll_02.js": 13364, 
+-    "devtools/client/inspector/markup/test/browser_markup_dragdrop_distance.js": 6444, 
+-    "devtools/client/inspector/markup/test/browser_markup_dragdrop_dragRootNode.js": 6793, 
+-    "devtools/client/inspector/markup/test/browser_markup_dragdrop_draggable.js": 6699, 
+-    "devtools/client/inspector/markup/test/browser_markup_dragdrop_escapeKeyPress.js": 6181, 
+-    "devtools/client/inspector/markup/test/browser_markup_dragdrop_invalidNodes.js": 6961, 
+-    "devtools/client/inspector/markup/test/browser_markup_dragdrop_reorder.js": 11460, 
+-    "devtools/client/inspector/markup/test/browser_markup_dragdrop_tooltip.js": 5998, 
+-    "devtools/client/inspector/markup/test/browser_markup_events-windowed-host.js": 14270, 
+-    "devtools/client/inspector/markup/test/browser_markup_events1.js": 16053, 
+-    "devtools/client/inspector/markup/test/browser_markup_events2.js": 17491, 
+-    "devtools/client/inspector/markup/test/browser_markup_events3.js": 18380, 
+-    "devtools/client/inspector/markup/test/browser_markup_events_01.js": 13115, 
+-    "devtools/client/inspector/markup/test/browser_markup_events_02.js": 14043, 
+-    "devtools/client/inspector/markup/test/browser_markup_events_03.js": 11945, 
+-    "devtools/client/inspector/markup/test/browser_markup_events_04.js": 14957, 
+-    "devtools/client/inspector/markup/test/browser_markup_events_form.js": 8179, 
+-    "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.0.js": 12207, 
+-    "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.1.js": 13953, 
+-    "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.11.1.js": 14551, 
+-    "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.2.js": 12892, 
+-    "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.3.js": 17441, 
+-    "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.4.js": 16970, 
+-    "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.6.js": 19743, 
+-    "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.7.js": 19626, 
+-    "devtools/client/inspector/markup/test/browser_markup_events_jquery_2.1.1.js": 15770, 
+-    "devtools/client/inspector/markup/test/browser_markup_html_edit_01.js": 21558, 
+-    "devtools/client/inspector/markup/test/browser_markup_html_edit_02.js": 15370, 
+-    "devtools/client/inspector/markup/test/browser_markup_html_edit_03.js": 12597, 
+-    "devtools/client/inspector/markup/test/browser_markup_image_tooltip.js": 6530, 
+-    "devtools/client/inspector/markup/test/browser_markup_image_tooltip_mutations.js": 5914, 
+-    "devtools/client/inspector/markup/test/browser_markup_keybindings_01.js": 6150, 
+-    "devtools/client/inspector/markup/test/browser_markup_keybindings_02.js": 6827, 
+-    "devtools/client/inspector/markup/test/browser_markup_keybindings_03.js": 8013, 
+-    "devtools/client/inspector/markup/test/browser_markup_keybindings_04.js": 9314, 
+-    "devtools/client/inspector/markup/test/browser_markup_keybindings_delete_attributes.js": 6119, 
+-    "devtools/client/inspector/markup/test/browser_markup_keybindings_scrolltonode.js": 6515, 
+-    "devtools/client/inspector/markup/test/browser_markup_links_01.js": 11198, 
+-    "devtools/client/inspector/markup/test/browser_markup_links_02.js": 7127, 
+-    "devtools/client/inspector/markup/test/browser_markup_links_03.js": 6434, 
+-    "devtools/client/inspector/markup/test/browser_markup_links_05.js": 9583, 
+-    "devtools/client/inspector/markup/test/browser_markup_links_06.js": 13375, 
+-    "devtools/client/inspector/markup/test/browser_markup_links_07.js": 9793, 
+-    "devtools/client/inspector/markup/test/browser_markup_load_01.js": 9489, 
+-    "devtools/client/inspector/markup/test/browser_markup_mutation_01.js": 10507, 
+-    "devtools/client/inspector/markup/test/browser_markup_mutation_02.js": 7097, 
+-    "devtools/client/inspector/markup/test/browser_markup_navigation.js": 16575, 
+-    "devtools/client/inspector/markup/test/browser_markup_node_names.js": 5423, 
+-    "devtools/client/inspector/markup/test/browser_markup_node_not_displayed_01.js": 6105, 
+-    "devtools/client/inspector/markup/test/browser_markup_node_not_displayed_02.js": 8254, 
+-    "devtools/client/inspector/markup/test/browser_markup_pagesize_01.js": 8273, 
+-    "devtools/client/inspector/markup/test/browser_markup_pagesize_02.js": 9954, 
+-    "devtools/client/inspector/markup/test/browser_markup_remove_xul_attributes.js": 5632, 
+-    "devtools/client/inspector/markup/test/browser_markup_search_01.js": 10255, 
+-    "devtools/client/inspector/markup/test/browser_markup_tag_edit_01.js": 11271, 
+-    "devtools/client/inspector/markup/test/browser_markup_tag_edit_02.js": 6017, 
+-    "devtools/client/inspector/markup/test/browser_markup_tag_edit_03.js": 6748, 
+-    "devtools/client/inspector/markup/test/browser_markup_tag_edit_04-backspace.js": 16152, 
+-    "devtools/client/inspector/markup/test/browser_markup_tag_edit_04-delete.js": 15457, 
+-    "devtools/client/inspector/markup/test/browser_markup_tag_edit_05.js": 8710, 
+-    "devtools/client/inspector/markup/test/browser_markup_tag_edit_06.js": 9433, 
+-    "devtools/client/inspector/markup/test/browser_markup_tag_edit_07.js": 9627, 
+-    "devtools/client/inspector/markup/test/browser_markup_tag_edit_08.js": 9687, 
+-    "devtools/client/inspector/markup/test/browser_markup_tag_edit_09.js": 7009, 
+-    "devtools/client/inspector/markup/test/browser_markup_tag_edit_10.js": 6233, 
+-    "devtools/client/inspector/markup/test/browser_markup_tag_edit_11.js": 5802, 
+-    "devtools/client/inspector/markup/test/browser_markup_tag_edit_12.js": 6516, 
+-    "devtools/client/inspector/markup/test/browser_markup_tag_edit_13-other.js": 5554, 
+-    "devtools/client/inspector/markup/test/browser_markup_textcontent_display.js": 6691, 
+-    "devtools/client/inspector/markup/test/browser_markup_textcontent_edit_01.js": 10957, 
+-    "devtools/client/inspector/markup/test/browser_markup_textcontent_edit_02.js": 8145, 
+-    "devtools/client/inspector/markup/test/browser_markup_toggle_01.js": 7644, 
+-    "devtools/client/inspector/markup/test/browser_markup_toggle_02.js": 7827, 
+-    "devtools/client/inspector/markup/test/browser_markup_toggle_03.js": 7489, 
+-    "devtools/client/inspector/markup/test/browser_markup_update-on-navigtion.js": 7406, 
+-    "devtools/client/inspector/markup/test/browser_markup_void_elements_html.js": 5880, 
+-    "devtools/client/inspector/markup/test/browser_markup_void_elements_xhtml.js": 5820, 
+-    "devtools/client/inspector/markup/test/browser_markup_whitespace.js": 6865, 
+-    "devtools/client/inspector/rules/test/browser_rules_add-property-and-reselect.js": 11284, 
+-    "devtools/client/inspector/rules/test/browser_rules_add-property-cancel_02.js": 6401, 
+-    "devtools/client/inspector/rules/test/browser_rules_add-property-cancel_03.js": 6161, 
+-    "devtools/client/inspector/rules/test/browser_rules_add-property-commented.js": 6214, 
+-    "devtools/client/inspector/rules/test/browser_rules_add-property-svg.js": 5942, 
+-    "devtools/client/inspector/rules/test/browser_rules_add-property_01.js": 6957, 
+-    "devtools/client/inspector/rules/test/browser_rules_add-property_02.js": 6494, 
+-    "devtools/client/inspector/rules/test/browser_rules_add-rule-and-property.js": 5929, 
+-    "devtools/client/inspector/rules/test/browser_rules_add-rule-button-state.js": 6145, 
+-    "devtools/client/inspector/rules/test/browser_rules_add-rule-edit-selector.js": 7112, 
+-    "devtools/client/inspector/rules/test/browser_rules_add-rule-iframes.js": 9178, 
+-    "devtools/client/inspector/rules/test/browser_rules_add-rule-namespace-elements.js": 8030, 
+-    "devtools/client/inspector/rules/test/browser_rules_add-rule-pseudo-class.js": 12486, 
+-    "devtools/client/inspector/rules/test/browser_rules_add-rule-then-property-edit-selector.js": 6960, 
+-    "devtools/client/inspector/rules/test/browser_rules_add-rule-with-menu.js": 5957, 
+-    "devtools/client/inspector/rules/test/browser_rules_add-rule.js": 10906, 
+-    "devtools/client/inspector/rules/test/browser_rules_authored_color.js": 9020, 
+-    "devtools/client/inspector/rules/test/browser_rules_blob_stylesheet.js": 5744, 
+-    "devtools/client/inspector/rules/test/browser_rules_colorUnit.js": 13117, 
+-    "devtools/client/inspector/rules/test/browser_rules_colorpicker-and-image-tooltip_01.js": 5319, 
+-    "devtools/client/inspector/rules/test/browser_rules_colorpicker-and-image-tooltip_02.js": 5534, 
+-    "devtools/client/inspector/rules/test/browser_rules_colorpicker-appears-on-swatch-click.js": 5560, 
+-    "devtools/client/inspector/rules/test/browser_rules_colorpicker-commit-on-ENTER.js": 5542, 
+-    "devtools/client/inspector/rules/test/browser_rules_colorpicker-hides-on-tooltip.js": 5500, 
+-    "devtools/client/inspector/rules/test/browser_rules_colorpicker-multiple-changes.js": 7877, 
+-    "devtools/client/inspector/rules/test/browser_rules_colorpicker-release-outside-frame.js": 5367, 
+-    "devtools/client/inspector/rules/test/browser_rules_colorpicker-revert-on-ESC.js": 5587, 
+-    "devtools/client/inspector/rules/test/browser_rules_colorpicker-swatch-displayed.js": 5516, 
+-    "devtools/client/inspector/rules/test/browser_rules_completion-existing-property_01.js": 13784, 
+-    "devtools/client/inspector/rules/test/browser_rules_completion-existing-property_02.js": 13155, 
+-    "devtools/client/inspector/rules/test/browser_rules_completion-new-property_01.js": 10286, 
+-    "devtools/client/inspector/rules/test/browser_rules_completion-new-property_02.js": 14681, 
+-    "devtools/client/inspector/rules/test/browser_rules_completion-new-property_03.js": 7107, 
+-    "devtools/client/inspector/rules/test/browser_rules_completion-new-property_04.js": 7836, 
+-    "devtools/client/inspector/rules/test/browser_rules_completion-new-property_multiline.js": 6840, 
+-    "devtools/client/inspector/rules/test/browser_rules_completion-popup-hidden-after-navigation.js": 6948, 
+-    "devtools/client/inspector/rules/test/browser_rules_computed-lists_02.js": 5610, 
+-    "devtools/client/inspector/rules/test/browser_rules_content_01.js": 5681, 
+-    "devtools/client/inspector/rules/test/browser_rules_content_02.js": 7191, 
+-    "devtools/client/inspector/rules/test/browser_rules_context-menu-show-mdn-docs-01.js": 6829, 
+-    "devtools/client/inspector/rules/test/browser_rules_context-menu-show-mdn-docs-02.js": 5747, 
+-    "devtools/client/inspector/rules/test/browser_rules_context-menu-show-mdn-docs-03.js": 10819, 
+-    "devtools/client/inspector/rules/test/browser_rules_cssom.js": 5630, 
+-    "devtools/client/inspector/rules/test/browser_rules_cubicbezier-appears-on-swatch-click.js": 5991, 
+-    "devtools/client/inspector/rules/test/browser_rules_cubicbezier-commit-on-ENTER.js": 6131, 
+-    "devtools/client/inspector/rules/test/browser_rules_cubicbezier-revert-on-ESC.js": 5488, 
+-    "devtools/client/inspector/rules/test/browser_rules_custom.js": 8084, 
+-    "devtools/client/inspector/rules/test/browser_rules_cycle-angle.js": 6628, 
+-    "devtools/client/inspector/rules/test/browser_rules_cycle-color.js": 7283, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-display-grid-property.js": 6155, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-property-cancel.js": 6319, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-property-click.js": 6309, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-property-commit.js": 8242, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-property-computed.js": 6506, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-property-increments.js": 14912, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-property-order.js": 10544, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-property-remove_01.js": 6904, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-property-remove_02.js": 6510, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-property-remove_03.js": 7009, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-property_01.js": 12199, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-property_02.js": 9845, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-property_03.js": 7037, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-property_04.js": 7129, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-property_05.js": 7936, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-property_06.js": 7251, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-property_07.js": 6499, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-property_08.js": 6868, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-property_09.js": 6157, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-selector-click-on-scrollbar.js": 6443, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-selector-click.js": 5861, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-selector-commit.js": 8941, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-selector_01.js": 6984, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-selector_02.js": 8130, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-selector_03.js": 6395, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-selector_04.js": 6718, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-selector_05.js": 7992, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-selector_06.js": 7501, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-selector_07.js": 6723, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-selector_08.js": 7249, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-selector_09.js": 8756, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-selector_10.js": 6863, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-selector_11.js": 6915, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-value-after-name_01.js": 6650, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-value-after-name_02.js": 6168, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-value-after-name_03.js": 6253, 
+-    "devtools/client/inspector/rules/test/browser_rules_edit-value-after-name_04.js": 6519, 
+-    "devtools/client/inspector/rules/test/browser_rules_editable-field-focus_01.js": 11676, 
+-    "devtools/client/inspector/rules/test/browser_rules_editable-field-focus_02.js": 8930, 
+-    "devtools/client/inspector/rules/test/browser_rules_eyedropper.js": 7004, 
+-    "devtools/client/inspector/rules/test/browser_rules_filtereditor-appears-on-swatch-click.js": 6053, 
+-    "devtools/client/inspector/rules/test/browser_rules_filtereditor-commit-on-ENTER.js": 5858, 
+-    "devtools/client/inspector/rules/test/browser_rules_filtereditor-revert-on-ESC.js": 5404, 
+-    "devtools/client/inspector/rules/test/browser_rules_grid-highlighter-on-navigate.js": 6884, 
+-    "devtools/client/inspector/rules/test/browser_rules_grid-toggle_01.js": 5335, 
+-    "devtools/client/inspector/rules/test/browser_rules_grid-toggle_02.js": 5870, 
+-    "devtools/client/inspector/rules/test/browser_rules_grid-toggle_03.js": 6164, 
+-    "devtools/client/inspector/rules/test/browser_rules_guessIndentation.js": 8217, 
+-    "devtools/client/inspector/rules/test/browser_rules_inherited-properties_01.js": 5792, 
+-    "devtools/client/inspector/rules/test/browser_rules_inherited-properties_03.js": 5565, 
+-    "devtools/client/inspector/rules/test/browser_rules_inline-source-map.js": 5633, 
+-    "devtools/client/inspector/rules/test/browser_rules_invalid-source-map.js": 6039, 
+-    "devtools/client/inspector/rules/test/browser_rules_invalid.js": 5386, 
+-    "devtools/client/inspector/rules/test/browser_rules_keybindings.js": 6454, 
+-    "devtools/client/inspector/rules/test/browser_rules_keyframeLineNumbers.js": 8416, 
+-    "devtools/client/inspector/rules/test/browser_rules_keyframes-rule_01.js": 8803, 
+-    "devtools/client/inspector/rules/test/browser_rules_keyframes-rule_02.js": 7797, 
+-    "devtools/client/inspector/rules/test/browser_rules_lineNumbers.js": 7116, 
+-    "devtools/client/inspector/rules/test/browser_rules_livepreview.js": 9232, 
+-    "devtools/client/inspector/rules/test/browser_rules_mark_overridden_01.js": 6799, 
+-    "devtools/client/inspector/rules/test/browser_rules_mark_overridden_02.js": 5401, 
+-    "devtools/client/inspector/rules/test/browser_rules_mark_overridden_03.js": 5527, 
+-    "devtools/client/inspector/rules/test/browser_rules_mark_overridden_04.js": 5469, 
+-    "devtools/client/inspector/rules/test/browser_rules_mark_overridden_05.js": 6818, 
+-    "devtools/client/inspector/rules/test/browser_rules_mark_overridden_06.js": 6599, 
+-    "devtools/client/inspector/rules/test/browser_rules_mark_overridden_07.js": 5912, 
+-    "devtools/client/inspector/rules/test/browser_rules_mathml-element.js": 6600, 
+-    "devtools/client/inspector/rules/test/browser_rules_media-queries.js": 5944, 
+-    "devtools/client/inspector/rules/test/browser_rules_multiple-properties-duplicates.js": 6928, 
+-    "devtools/client/inspector/rules/test/browser_rules_multiple-properties-priority.js": 6491, 
+-    "devtools/client/inspector/rules/test/browser_rules_multiple-properties-unfinished_01.js": 6689, 
+-    "devtools/client/inspector/rules/test/browser_rules_multiple-properties-unfinished_02.js": 6887, 
+-    "devtools/client/inspector/rules/test/browser_rules_multiple_properties_01.js": 6168, 
+-    "devtools/client/inspector/rules/test/browser_rules_multiple_properties_02.js": 6495, 
+-    "devtools/client/inspector/rules/test/browser_rules_original-source-link.js": 8025, 
+-    "devtools/client/inspector/rules/test/browser_rules_pseudo-element_01.js": 11271, 
+-    "devtools/client/inspector/rules/test/browser_rules_pseudo-element_02.js": 7305, 
+-    "devtools/client/inspector/rules/test/browser_rules_pseudo_lock_options.js": 8469, 
+-    "devtools/client/inspector/rules/test/browser_rules_refresh-no-flicker.js": 5521, 
+-    "devtools/client/inspector/rules/test/browser_rules_refresh-on-attribute-change_01.js": 5735, 
+-    "devtools/client/inspector/rules/test/browser_rules_refresh-on-attribute-change_02.js": 7135, 
+-    "devtools/client/inspector/rules/test/browser_rules_refresh-on-style-change.js": 5584, 
+-    "devtools/client/inspector/rules/test/browser_rules_search-filter-computed-list_01.js": 7474, 
+-    "devtools/client/inspector/rules/test/browser_rules_search-filter-computed-list_02.js": 6040, 
+-    "devtools/client/inspector/rules/test/browser_rules_search-filter-computed-list_03.js": 5679, 
+-    "devtools/client/inspector/rules/test/browser_rules_search-filter-computed-list_04.js": 6613, 
+-    "devtools/client/inspector/rules/test/browser_rules_search-filter-computed-list_expander.js": 5921, 
+-    "devtools/client/inspector/rules/test/browser_rules_search-filter-overridden-property.js": 5768, 
+-    "devtools/client/inspector/rules/test/browser_rules_search-filter_01.js": 7616, 
+-    "devtools/client/inspector/rules/test/browser_rules_search-filter_02.js": 7393, 
+-    "devtools/client/inspector/rules/test/browser_rules_search-filter_03.js": 5911, 
+-    "devtools/client/inspector/rules/test/browser_rules_search-filter_04.js": 5879, 
+-    "devtools/client/inspector/rules/test/browser_rules_search-filter_05.js": 6337, 
+-    "devtools/client/inspector/rules/test/browser_rules_search-filter_06.js": 6230, 
+-    "devtools/client/inspector/rules/test/browser_rules_search-filter_07.js": 6987, 
+-    "devtools/client/inspector/rules/test/browser_rules_search-filter_08.js": 6497, 
+-    "devtools/client/inspector/rules/test/browser_rules_search-filter_09.js": 6628, 
+-    "devtools/client/inspector/rules/test/browser_rules_search-filter_10.js": 6538, 
+-    "devtools/client/inspector/rules/test/browser_rules_search-filter_escape-keypress.js": 5909, 
+-    "devtools/client/inspector/rules/test/browser_rules_selector-highlighter-on-navigate.js": 6709, 
+-    "devtools/client/inspector/rules/test/browser_rules_selector-highlighter_02.js": 6087, 
+-    "devtools/client/inspector/rules/test/browser_rules_selector-highlighter_03.js": 6281, 
+-    "devtools/client/inspector/rules/test/browser_rules_selector-highlighter_04.js": 5684, 
+-    "devtools/client/inspector/rules/test/browser_rules_selector_highlight.js": 8297, 
+-    "devtools/client/inspector/rules/test/browser_rules_strict-search-filter-computed-list_01.js": 8851, 
+-    "devtools/client/inspector/rules/test/browser_rules_strict-search-filter_01.js": 8673, 
+-    "devtools/client/inspector/rules/test/browser_rules_strict-search-filter_02.js": 6589, 
+-    "devtools/client/inspector/rules/test/browser_rules_strict-search-filter_03.js": 5521, 
+-    "devtools/client/inspector/rules/test/browser_rules_style-editor-link.js": 12118, 
+-    "devtools/client/inspector/rules/test/browser_rules_urls-clickable.js": 7582, 
+-    "devtools/client/inspector/rules/test/browser_rules_user-agent-styles-uneditable.js": 7050, 
+-    "devtools/client/inspector/rules/test/browser_rules_user-agent-styles.js": 29600, 
+-    "devtools/client/inspector/rules/test/browser_rules_user-property-reset.js": 9326, 
+-    "devtools/client/inspector/shared/test/browser_styleinspector_context-menu-copy-color_01.js": 21308, 
+-    "devtools/client/inspector/shared/test/browser_styleinspector_csslogic-content-stylesheets.js": 18638, 
+-    "devtools/client/inspector/shared/test/browser_styleinspector_refresh_when_active.js": 6977, 
+-    "devtools/client/inspector/shared/test/browser_styleinspector_tooltip-background-image.js": 8333, 
+-    "devtools/client/inspector/shared/test/browser_styleinspector_tooltip-closes-on-new-selection.js": 7171, 
+-    "devtools/client/inspector/shared/test/browser_styleinspector_tooltip-longhand-fontfamily.js": 7167, 
+-    "devtools/client/inspector/shared/test/browser_styleinspector_tooltip-multiple-background-images.js": 6913, 
+-    "devtools/client/inspector/shared/test/browser_styleinspector_tooltip-shorthand-fontfamily.js": 5897, 
+-    "devtools/client/inspector/shared/test/browser_styleinspector_tooltip-size.js": 5940, 
+-    "devtools/client/inspector/shared/test/browser_styleinspector_transform-highlighter-01.js": 6472, 
+-    "devtools/client/inspector/shared/test/browser_styleinspector_transform-highlighter-02.js": 6840, 
+-    "devtools/client/inspector/shared/test/browser_styleinspector_transform-highlighter-03.js": 6061, 
+-    "devtools/client/inspector/shared/test/browser_styleinspector_transform-highlighter-04.js": 6201, 
+-    "devtools/client/inspector/test/browser_inspector_addNode_01.js": 9682, 
+-    "devtools/client/inspector/test/browser_inspector_addNode_02.js": 7458, 
+-    "devtools/client/inspector/test/browser_inspector_addNode_03.js": 8382, 
+-    "devtools/client/inspector/test/browser_inspector_addSidebarTab.js": 5517, 
+-    "devtools/client/inspector/test/browser_inspector_breadcrumbs.js": 11923, 
+-    "devtools/client/inspector/test/browser_inspector_breadcrumbs_highlight_hover.js": 7351, 
+-    "devtools/client/inspector/test/browser_inspector_breadcrumbs_keybinding.js": 7573, 
+-    "devtools/client/inspector/test/browser_inspector_breadcrumbs_keyboard_trap.js": 5952, 
+-    "devtools/client/inspector/test/browser_inspector_breadcrumbs_menu.js": 6754, 
+-    "devtools/client/inspector/test/browser_inspector_breadcrumbs_mutations.js": 9901, 
+-    "devtools/client/inspector/test/browser_inspector_breadcrumbs_namespaced.js": 5886, 
+-    "devtools/client/inspector/test/browser_inspector_breadcrumbs_visibility.js": 7954, 
+-    "devtools/client/inspector/test/browser_inspector_delete-selected-node-01.js": 7892, 
+-    "devtools/client/inspector/test/browser_inspector_delete-selected-node-02.js": 14815, 
+-    "devtools/client/inspector/test/browser_inspector_delete-selected-node-03.js": 7118, 
+-    "devtools/client/inspector/test/browser_inspector_destroy-after-navigation.js": 7455, 
+-    "devtools/client/inspector/test/browser_inspector_destroy-before-ready.js": 6915, 
+-    "devtools/client/inspector/test/browser_inspector_expand-collapse.js": 5385, 
+-    "devtools/client/inspector/test/browser_inspector_gcli-inspect-command.js": 8870, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-01.js": 7762, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-02.js": 11746, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-03.js": 9304, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-04.js": 5888, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-cancel.js": 10565, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-comments.js": 11245, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-cssgrid_01.js": 5761, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-csstransform_01.js": 6359, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-csstransform_02.js": 5928, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-embed.js": 6837, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-eyedropper-csp.js": 6082, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-eyedropper-events.js": 6778, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-eyedropper-image.js": 5747, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-eyedropper-label.js": 6865, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-eyedropper-show-hide.js": 5761, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-eyedropper-xul.js": 8460, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-geometry_01.js": 6311, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-geometry_02.js": 7287, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-geometry_03.js": 6546, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-geometry_04.js": 8028, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-geometry_05.js": 8955, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-geometry_06.js": 10458, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-hover_01.js": 7562, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-hover_02.js": 6256, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-hover_03.js": 7515, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-iframes.js": 7760, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-iframes_01.js": 9970, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-iframes_02.js": 8386, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-inline.js": 21092, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-keybinding_01.js": 10313, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-keybinding_02.js": 9157, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-keybinding_03.js": 7084, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-keybinding_04.js": 7394, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-measure_01.js": 5884, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-measure_02.js": 5903, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-options.js": 8394, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-preview.js": 9070, 
++    "devtools/client/framework/test/browser_new_activation_workflow.js": 7626, 
++    "devtools/client/framework/test/browser_source_map-inline.js": 4685, 
++    "devtools/client/framework/test/browser_toolbox_hosts.js": 13276, 
++    "devtools/client/framework/test/browser_toolbox_hosts_size.js": 8670, 
++    "devtools/client/framework/test/browser_toolbox_hosts_telemetry.js": 4942, 
++    "devtools/client/framework/test/browser_toolbox_options.js": 9428, 
++    "devtools/client/framework/test/browser_toolbox_options_disable_buttons.js": 6564, 
++    "devtools/client/framework/test/browser_toolbox_options_disable_cache-01.js": 9104, 
++    "devtools/client/framework/test/browser_toolbox_options_disable_cache-02.js": 13256, 
++    "devtools/client/framework/test/browser_toolbox_races.js": 7875, 
++    "devtools/client/framework/test/browser_toolbox_select_event.js": 19324, 
++    "devtools/client/framework/test/browser_toolbox_selected_tool_unavailable.js": 5117, 
++    "devtools/client/framework/test/browser_toolbox_tabsswitch_shortcuts.js": 12215, 
++    "devtools/client/framework/test/browser_toolbox_toggle.js": 11449, 
++    "devtools/client/framework/test/browser_toolbox_tool_ready.js": 20091, 
++    "devtools/client/framework/test/browser_toolbox_tool_remote_reopen.js": 14150, 
++    "devtools/client/framework/test/browser_toolbox_toolbar_overflow.js": 4613, 
++    "devtools/client/framework/test/browser_toolbox_tools_per_toolbox_registration.js": 5464, 
++    "devtools/client/framework/test/browser_toolbox_view_source_01.js": 4765, 
++    "devtools/client/framework/test/browser_toolbox_view_source_03.js": 5049, 
++    "devtools/client/framework/test/browser_toolbox_view_source_04.js": 5411, 
++    "devtools/client/framework/test/browser_toolbox_window_reload_target.js": 23446, 
++    "devtools/client/framework/test/browser_toolbox_window_shortcuts.js": 9604, 
++    "devtools/client/framework/test/browser_toolbox_window_title_changes.js": 10478, 
++    "devtools/client/framework/test/browser_toolbox_window_title_frame_select.js": 6927, 
++    "devtools/client/inspector/boxmodel/test/browser_boxmodel.js": 7419, 
++    "devtools/client/inspector/boxmodel/test/browser_boxmodel_computed-accordion-state.js": 8578, 
++    "devtools/client/inspector/boxmodel/test/browser_boxmodel_editablemodel.js": 11542, 
++    "devtools/client/inspector/boxmodel/test/browser_boxmodel_editablemodel_bluronclick.js": 5792, 
++    "devtools/client/inspector/boxmodel/test/browser_boxmodel_editablemodel_border.js": 6964, 
++    "devtools/client/inspector/boxmodel/test/browser_boxmodel_editablemodel_pseudo.js": 6446, 
++    "devtools/client/inspector/boxmodel/test/browser_boxmodel_editablemodel_stylerules.js": 9054, 
++    "devtools/client/inspector/boxmodel/test/browser_boxmodel_guides.js": 5696, 
++    "devtools/client/inspector/boxmodel/test/browser_boxmodel_layout-accordion-state.js": 8350, 
++    "devtools/client/inspector/boxmodel/test/browser_boxmodel_navigation.js": 6780, 
++    "devtools/client/inspector/boxmodel/test/browser_boxmodel_offsetparent.js": 6406, 
++    "devtools/client/inspector/boxmodel/test/browser_boxmodel_positions.js": 5978, 
++    "devtools/client/inspector/boxmodel/test/browser_boxmodel_properties.js": 5210, 
++    "devtools/client/inspector/boxmodel/test/browser_boxmodel_pseudo-element.js": 5131, 
++    "devtools/client/inspector/boxmodel/test/browser_boxmodel_rotate-labels-on-sides.js": 5336, 
++    "devtools/client/inspector/boxmodel/test/browser_boxmodel_sync.js": 6297, 
++    "devtools/client/inspector/boxmodel/test/browser_boxmodel_update-after-navigation.js": 11172, 
++    "devtools/client/inspector/boxmodel/test/browser_boxmodel_update-after-reload.js": 8367, 
++    "devtools/client/inspector/components/test/browser_boxmodel.js": 8827, 
++    "devtools/client/inspector/components/test/browser_boxmodel_editablemodel.js": 11818, 
++    "devtools/client/inspector/components/test/browser_boxmodel_editablemodel_bluronclick.js": 5915, 
++    "devtools/client/inspector/components/test/browser_boxmodel_editablemodel_border.js": 6812, 
++    "devtools/client/inspector/components/test/browser_boxmodel_editablemodel_stylerules.js": 9327, 
++    "devtools/client/inspector/components/test/browser_boxmodel_guides.js": 5861, 
++    "devtools/client/inspector/components/test/browser_boxmodel_rotate-labels-on-sides.js": 5910, 
++    "devtools/client/inspector/components/test/browser_boxmodel_sync.js": 6497, 
++    "devtools/client/inspector/components/test/browser_boxmodel_tooltips.js": 6470, 
++    "devtools/client/inspector/components/test/browser_boxmodel_update-after-navigation.js": 12153, 
++    "devtools/client/inspector/components/test/browser_boxmodel_update-after-reload.js": 8544, 
++    "devtools/client/inspector/computed/test/browser_computed_browser-styles.js": 7925, 
++    "devtools/client/inspector/computed/test/browser_computed_getNodeInfo.js": 5298, 
++    "devtools/client/inspector/computed/test/browser_computed_keybindings_01.js": 5452, 
++    "devtools/client/inspector/computed/test/browser_computed_keybindings_02.js": 5600, 
++    "devtools/client/inspector/computed/test/browser_computed_matched-selectors-toggle.js": 5370, 
++    "devtools/client/inspector/computed/test/browser_computed_matched-selectors_01.js": 5964, 
++    "devtools/client/inspector/computed/test/browser_computed_matched-selectors_02.js": 5020, 
++    "devtools/client/inspector/computed/test/browser_computed_media-queries.js": 4812, 
++    "devtools/client/inspector/computed/test/browser_computed_no-results-placeholder.js": 5406, 
++    "devtools/client/inspector/computed/test/browser_computed_original-source-link.js": 7155, 
++    "devtools/client/inspector/computed/test/browser_computed_pseudo-element_01.js": 6477, 
++    "devtools/client/inspector/computed/test/browser_computed_refresh-on-style-change_01.js": 5523, 
++    "devtools/client/inspector/computed/test/browser_computed_search-filter.js": 7843, 
++    "devtools/client/inspector/computed/test/browser_computed_search-filter_clear.js": 6628, 
++    "devtools/client/inspector/computed/test/browser_computed_search-filter_escape-keypress.js": 10012, 
++    "devtools/client/inspector/computed/test/browser_computed_search-filter_noproperties.js": 6056, 
++    "devtools/client/inspector/fonts/test/browser_fontinspector.js": 6699, 
++    "devtools/client/inspector/fonts/test/browser_fontinspector_edit-previews-show-all.js": 4961, 
++    "devtools/client/inspector/fonts/test/browser_fontinspector_edit-previews.js": 6174, 
++    "devtools/client/inspector/fonts/test/browser_fontinspector_theme-change.js": 5109, 
++    "devtools/client/inspector/grids/test/browser_grids_accordion-state.js": 9712, 
++    "devtools/client/inspector/grids/test/browser_grids_color-in-rules-grid-toggle.js": 5839, 
++    "devtools/client/inspector/grids/test/browser_grids_display-setting-extend-grid-lines.js": 4866, 
++    "devtools/client/inspector/grids/test/browser_grids_grid-list-color-picker-on-ESC.js": 4687, 
++    "devtools/client/inspector/grids/test/browser_grids_grid-list-color-picker-on-RETURN.js": 4801, 
++    "devtools/client/inspector/grids/test/browser_grids_grid-list-element-rep.js": 5009, 
++    "devtools/client/inspector/grids/test/browser_grids_grid-list-on-iframe-reloaded.js": 5584, 
++    "devtools/client/inspector/grids/test/browser_grids_grid-list-on-mutation-element-added.js": 6338, 
++    "devtools/client/inspector/grids/test/browser_grids_grid-list-on-mutation-element-removed.js": 6218, 
++    "devtools/client/inspector/grids/test/browser_grids_grid-list-toggle-multiple-grids.js": 6158, 
++    "devtools/client/inspector/grids/test/browser_grids_grid-list-toggle-single-grid.js": 5730, 
++    "devtools/client/inspector/grids/test/browser_grids_grid-outline-cannot-show-outline.js": 5674, 
++    "devtools/client/inspector/grids/test/browser_grids_grid-outline-highlight-area.js": 5788, 
++    "devtools/client/inspector/grids/test/browser_grids_grid-outline-highlight-cell.js": 5802, 
++    "devtools/client/inspector/grids/test/browser_grids_grid-outline-selected-grid.js": 5310, 
++    "devtools/client/inspector/grids/test/browser_grids_grid-outline-updates-on-grid-change.js": 5226, 
++    "devtools/client/inspector/grids/test/browser_grids_highlighter-setting-rules-grid-toggle.js": 5325, 
++    "devtools/client/inspector/grids/test/browser_grids_number-of-css-grids-telemetry.js": 5586, 
++    "devtools/client/inspector/grids/test/browser_grids_restored-after-reload.js": 9966, 
++    "devtools/client/inspector/markup/test/browser_markup_accessibility_focus_blur.js": 7197, 
++    "devtools/client/inspector/markup/test/browser_markup_accessibility_navigation.js": 7231, 
++    "devtools/client/inspector/markup/test/browser_markup_anonymous_01.js": 5212, 
++    "devtools/client/inspector/markup/test/browser_markup_anonymous_02.js": 9547, 
++    "devtools/client/inspector/markup/test/browser_markup_anonymous_03.js": 5061, 
++    "devtools/client/inspector/markup/test/browser_markup_anonymous_04.js": 4719, 
++    "devtools/client/inspector/markup/test/browser_markup_css_completion_style_attribute_01.js": 7202, 
++    "devtools/client/inspector/markup/test/browser_markup_css_completion_style_attribute_02.js": 8848, 
++    "devtools/client/inspector/markup/test/browser_markup_css_completion_style_attribute_03.js": 6456, 
++    "devtools/client/inspector/markup/test/browser_markup_dragdrop_autoscroll_01.js": 9708, 
++    "devtools/client/inspector/markup/test/browser_markup_dragdrop_autoscroll_02.js": 10649, 
++    "devtools/client/inspector/markup/test/browser_markup_dragdrop_distance.js": 4666, 
++    "devtools/client/inspector/markup/test/browser_markup_dragdrop_reorder.js": 8490, 
++    "devtools/client/inspector/markup/test/browser_markup_events-windowed-host.js": 12488, 
++    "devtools/client/inspector/markup/test/browser_markup_events1.js": 11020, 
++    "devtools/client/inspector/markup/test/browser_markup_events2.js": 12192, 
++    "devtools/client/inspector/markup/test/browser_markup_events3.js": 12712, 
++    "devtools/client/inspector/markup/test/browser_markup_events_01.js": 7923, 
++    "devtools/client/inspector/markup/test/browser_markup_events_02.js": 9836, 
++    "devtools/client/inspector/markup/test/browser_markup_events_03.js": 8537, 
++    "devtools/client/inspector/markup/test/browser_markup_events_04.js": 10698, 
++    "devtools/client/inspector/markup/test/browser_markup_events_click_to_close.js": 5899, 
++    "devtools/client/inspector/markup/test/browser_markup_events_form.js": 5090, 
++    "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.0.js": 9981, 
++    "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.1.js": 9286, 
++    "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.11.1.js": 9594, 
++    "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.2.js": 8909, 
++    "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.3.js": 11702, 
++    "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.4.js": 11902, 
++    "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.6.js": 13478, 
++    "devtools/client/inspector/markup/test/browser_markup_events_jquery_1.7.js": 13243, 
++    "devtools/client/inspector/markup/test/browser_markup_events_jquery_2.1.1.js": 11906, 
++    "devtools/client/inspector/markup/test/browser_markup_events_react_development_15.4.1.js": 18463, 
++    "devtools/client/inspector/markup/test/browser_markup_events_react_development_15.4.1_jsx.js": 16306, 
++    "devtools/client/inspector/markup/test/browser_markup_events_react_production_15.3.1.js": 13810, 
++    "devtools/client/inspector/markup/test/browser_markup_events_react_production_15.3.1_jsx.js": 14446, 
++    "devtools/client/inspector/markup/test/browser_markup_events_source_map.js": 7744, 
++    "devtools/client/inspector/markup/test/browser_markup_html_edit_01.js": 14883, 
++    "devtools/client/inspector/markup/test/browser_markup_html_edit_02.js": 12561, 
++    "devtools/client/inspector/markup/test/browser_markup_html_edit_03.js": 10346, 
++    "devtools/client/inspector/markup/test/browser_markup_image_tooltip.js": 6130, 
++    "devtools/client/inspector/markup/test/browser_markup_image_tooltip_mutations.js": 5546, 
++    "devtools/client/inspector/markup/test/browser_markup_keybindings_01.js": 4763, 
++    "devtools/client/inspector/markup/test/browser_markup_keybindings_02.js": 4841, 
++    "devtools/client/inspector/markup/test/browser_markup_keybindings_03.js": 6399, 
++    "devtools/client/inspector/markup/test/browser_markup_keybindings_04.js": 8151, 
++    "devtools/client/inspector/markup/test/browser_markup_links_01.js": 7184, 
++    "devtools/client/inspector/markup/test/browser_markup_links_02.js": 5452, 
++    "devtools/client/inspector/markup/test/browser_markup_links_05.js": 6306, 
++    "devtools/client/inspector/markup/test/browser_markup_links_06.js": 9114, 
++    "devtools/client/inspector/markup/test/browser_markup_links_07.js": 6839, 
++    "devtools/client/inspector/markup/test/browser_markup_load_01.js": 6863, 
++    "devtools/client/inspector/markup/test/browser_markup_mutation_01.js": 7340, 
++    "devtools/client/inspector/markup/test/browser_markup_mutation_02.js": 5534, 
++    "devtools/client/inspector/markup/test/browser_markup_navigation.js": 10263, 
++    "devtools/client/inspector/markup/test/browser_markup_node_not_displayed_02.js": 5831, 
++    "devtools/client/inspector/markup/test/browser_markup_pagesize_01.js": 5860, 
++    "devtools/client/inspector/markup/test/browser_markup_pagesize_02.js": 7476, 
++    "devtools/client/inspector/markup/test/browser_markup_search_01.js": 8257, 
++    "devtools/client/inspector/markup/test/browser_markup_tag_delete_whitespace_node.js": 7495, 
++    "devtools/client/inspector/markup/test/browser_markup_tag_edit_01.js": 7493, 
++    "devtools/client/inspector/markup/test/browser_markup_tag_edit_02.js": 4821, 
++    "devtools/client/inspector/markup/test/browser_markup_tag_edit_04-backspace.js": 12556, 
++    "devtools/client/inspector/markup/test/browser_markup_tag_edit_04-delete.js": 11653, 
++    "devtools/client/inspector/markup/test/browser_markup_tag_edit_05.js": 5938, 
++    "devtools/client/inspector/markup/test/browser_markup_tag_edit_06.js": 6660, 
++    "devtools/client/inspector/markup/test/browser_markup_tag_edit_07.js": 6553, 
++    "devtools/client/inspector/markup/test/browser_markup_tag_edit_08.js": 6260, 
++    "devtools/client/inspector/markup/test/browser_markup_tag_edit_09.js": 5046, 
++    "devtools/client/inspector/markup/test/browser_markup_textcontent_edit_01.js": 6988, 
++    "devtools/client/inspector/markup/test/browser_markup_textcontent_edit_02.js": 5972, 
++    "devtools/client/inspector/markup/test/browser_markup_toggle_01.js": 5253, 
++    "devtools/client/inspector/markup/test/browser_markup_toggle_02.js": 5140, 
++    "devtools/client/inspector/markup/test/browser_markup_toggle_03.js": 5363, 
++    "devtools/client/inspector/markup/test/browser_markup_update-on-navigtion.js": 5422, 
++    "devtools/client/inspector/markup/test/browser_markup_whitespace.js": 4693, 
++    "devtools/client/inspector/rules/test/browser_rules_add-property-and-reselect.js": 6842, 
++    "devtools/client/inspector/rules/test/browser_rules_add-property-cancel_03.js": 4619, 
++    "devtools/client/inspector/rules/test/browser_rules_add-property_02.js": 4653, 
++    "devtools/client/inspector/rules/test/browser_rules_add-rule-edit-selector.js": 4658, 
++    "devtools/client/inspector/rules/test/browser_rules_add-rule-iframes.js": 5999, 
++    "devtools/client/inspector/rules/test/browser_rules_add-rule-namespace-elements.js": 5578, 
++    "devtools/client/inspector/rules/test/browser_rules_add-rule-pseudo-class.js": 7790, 
++    "devtools/client/inspector/rules/test/browser_rules_add-rule-then-property-edit-selector.js": 5273, 
++    "devtools/client/inspector/rules/test/browser_rules_add-rule.js": 6491, 
++    "devtools/client/inspector/rules/test/browser_rules_authored_color.js": 5911, 
++    "devtools/client/inspector/rules/test/browser_rules_class_panel_add.js": 4875, 
++    "devtools/client/inspector/rules/test/browser_rules_class_panel_content.js": 5007, 
++    "devtools/client/inspector/rules/test/browser_rules_colorUnit.js": 10119, 
++    "devtools/client/inspector/rules/test/browser_rules_colorpicker-multiple-changes.js": 4989, 
++    "devtools/client/inspector/rules/test/browser_rules_completion-existing-property_01.js": 8882, 
++    "devtools/client/inspector/rules/test/browser_rules_completion-existing-property_02.js": 8534, 
++    "devtools/client/inspector/rules/test/browser_rules_completion-new-property_01.js": 6660, 
++    "devtools/client/inspector/rules/test/browser_rules_completion-new-property_02.js": 9523, 
++    "devtools/client/inspector/rules/test/browser_rules_completion-new-property_03.js": 5071, 
++    "devtools/client/inspector/rules/test/browser_rules_completion-new-property_04.js": 5118, 
++    "devtools/client/inspector/rules/test/browser_rules_completion-new-property_multiline.js": 5092, 
++    "devtools/client/inspector/rules/test/browser_rules_completion-popup-hidden-after-navigation.js": 4931, 
++    "devtools/client/inspector/rules/test/browser_rules_content_02.js": 5008, 
++    "devtools/client/inspector/rules/test/browser_rules_context-menu-show-mdn-docs-03.js": 7424, 
++    "devtools/client/inspector/rules/test/browser_rules_cubicbezier-commit-on-ENTER.js": 4862, 
++    "devtools/client/inspector/rules/test/browser_rules_custom.js": 5681, 
++    "devtools/client/inspector/rules/test/browser_rules_cycle-angle.js": 5142, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-property-commit.js": 5495, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-property-computed.js": 4947, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-property-increments.js": 9524, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-property-order.js": 6965, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-property-remove_01.js": 5094, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-property-remove_03.js": 5242, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-property_01.js": 7622, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-property_02.js": 6453, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-property_03.js": 5226, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-property_04.js": 4738, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-property_05.js": 5499, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-property_06.js": 5018, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-property_08.js": 4829, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-selector-click-on-scrollbar.js": 4656, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-selector-commit.js": 5374, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-selector_01.js": 5126, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-selector_02.js": 5377, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-selector_05.js": 5330, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-selector_06.js": 5081, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-selector_07.js": 4676, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-selector_08.js": 4650, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-selector_09.js": 5749, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-selector_10.js": 5037, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-selector_11.js": 4729, 
++    "devtools/client/inspector/rules/test/browser_rules_edit-value-after-name_04.js": 4721, 
++    "devtools/client/inspector/rules/test/browser_rules_editable-field-focus_01.js": 7620, 
++    "devtools/client/inspector/rules/test/browser_rules_editable-field-focus_02.js": 6299, 
++    "devtools/client/inspector/rules/test/browser_rules_eyedropper.js": 5619, 
++    "devtools/client/inspector/rules/test/browser_rules_grid-highlighter-on-navigate.js": 5455, 
++    "devtools/client/inspector/rules/test/browser_rules_grid-highlighter-on-reload.js": 8761, 
++    "devtools/client/inspector/rules/test/browser_rules_grid-highlighter-restored-after-reload.js": 6904, 
++    "devtools/client/inspector/rules/test/browser_rules_grid-toggle_03.js": 4807, 
++    "devtools/client/inspector/rules/test/browser_rules_grid-toggle_04.js": 4838, 
++    "devtools/client/inspector/rules/test/browser_rules_guessIndentation.js": 5442, 
++    "devtools/client/inspector/rules/test/browser_rules_keyframeLineNumbers.js": 7184, 
++    "devtools/client/inspector/rules/test/browser_rules_keyframes-rule_01.js": 6389, 
++    "devtools/client/inspector/rules/test/browser_rules_keyframes-rule_02.js": 6175, 
++    "devtools/client/inspector/rules/test/browser_rules_livepreview.js": 6418, 
++    "devtools/client/inspector/rules/test/browser_rules_mark_overridden_01.js": 5030, 
++    "devtools/client/inspector/rules/test/browser_rules_mark_overridden_05.js": 5122, 
++    "devtools/client/inspector/rules/test/browser_rules_mark_overridden_06.js": 4720, 
++    "devtools/client/inspector/rules/test/browser_rules_mathml-element.js": 4645, 
++    "devtools/client/inspector/rules/test/browser_rules_multiple-properties-priority.js": 4811, 
++    "devtools/client/inspector/rules/test/browser_rules_multiple-properties-unfinished_02.js": 4871, 
++    "devtools/client/inspector/rules/test/browser_rules_multiple_properties_02.js": 4820, 
++    "devtools/client/inspector/rules/test/browser_rules_original-source-link.js": 5559, 
++    "devtools/client/inspector/rules/test/browser_rules_original-source-link2.js": 5985, 
++    "devtools/client/inspector/rules/test/browser_rules_pseudo-element_01.js": 8034, 
++    "devtools/client/inspector/rules/test/browser_rules_pseudo-element_02.js": 5297, 
++    "devtools/client/inspector/rules/test/browser_rules_pseudo_lock_options.js": 5214, 
++    "devtools/client/inspector/rules/test/browser_rules_refresh-on-attribute-change_02.js": 5550, 
++    "devtools/client/inspector/rules/test/browser_rules_search-filter-computed-list_01.js": 5336, 
++    "devtools/client/inspector/rules/test/browser_rules_search-filter-computed-list_02.js": 4980, 
++    "devtools/client/inspector/rules/test/browser_rules_search-filter-computed-list_04.js": 4906, 
++    "devtools/client/inspector/rules/test/browser_rules_search-filter_01.js": 5430, 
++    "devtools/client/inspector/rules/test/browser_rules_search-filter_02.js": 6914, 
++    "devtools/client/inspector/rules/test/browser_rules_search-filter_04.js": 5063, 
++    "devtools/client/inspector/rules/test/browser_rules_search-filter_06.js": 4847, 
++    "devtools/client/inspector/rules/test/browser_rules_search-filter_07.js": 4847, 
++    "devtools/client/inspector/rules/test/browser_rules_search-filter_08.js": 4781, 
++    "devtools/client/inspector/rules/test/browser_rules_search-filter_09.js": 4744, 
++    "devtools/client/inspector/rules/test/browser_rules_search-filter_10.js": 4896, 
++    "devtools/client/inspector/rules/test/browser_rules_selector-highlighter-on-navigate.js": 4864, 
++    "devtools/client/inspector/rules/test/browser_rules_selector-highlighter_02.js": 4627, 
++    "devtools/client/inspector/rules/test/browser_rules_selector_highlight.js": 5710, 
++    "devtools/client/inspector/rules/test/browser_rules_shapes-toggle_01.js": 4771, 
++    "devtools/client/inspector/rules/test/browser_rules_shapes-toggle_03.js": 4748, 
++    "devtools/client/inspector/rules/test/browser_rules_shapes-toggle_06.js": 4733, 
++    "devtools/client/inspector/rules/test/browser_rules_strict-search-filter-computed-list_01.js": 5891, 
++    "devtools/client/inspector/rules/test/browser_rules_strict-search-filter_01.js": 6545, 
++    "devtools/client/inspector/rules/test/browser_rules_strict-search-filter_02.js": 5016, 
++    "devtools/client/inspector/rules/test/browser_rules_urls-clickable.js": 4928, 
++    "devtools/client/inspector/rules/test/browser_rules_user-agent-styles-uneditable.js": 5545, 
++    "devtools/client/inspector/rules/test/browser_rules_user-agent-styles.js": 19357, 
++    "devtools/client/inspector/rules/test/browser_rules_user-property-reset.js": 6304, 
++    "devtools/client/inspector/shared/test/browser_styleinspector_context-menu-copy-color_01.js": 13183, 
++    "devtools/client/inspector/shared/test/browser_styleinspector_csslogic-content-stylesheets.js": 12746, 
++    "devtools/client/inspector/shared/test/browser_styleinspector_refresh_when_active.js": 5346, 
++    "devtools/client/inspector/shared/test/browser_styleinspector_tooltip-background-image.js": 6905, 
++    "devtools/client/inspector/shared/test/browser_styleinspector_tooltip-closes-on-new-selection.js": 5871, 
++    "devtools/client/inspector/shared/test/browser_styleinspector_tooltip-longhand-fontfamily.js": 6002, 
++    "devtools/client/inspector/shared/test/browser_styleinspector_tooltip-multiple-background-images.js": 6381, 
++    "devtools/client/inspector/shared/test/browser_styleinspector_tooltip-shorthand-fontfamily.js": 5024, 
++    "devtools/client/inspector/shared/test/browser_styleinspector_transform-highlighter-01.js": 5433, 
++    "devtools/client/inspector/shared/test/browser_styleinspector_transform-highlighter-02.js": 5218, 
++    "devtools/client/inspector/test/browser_inspector_addNode_01.js": 5368, 
++    "devtools/client/inspector/test/browser_inspector_addNode_02.js": 4632, 
++    "devtools/client/inspector/test/browser_inspector_addNode_03.js": 5244, 
++    "devtools/client/inspector/test/browser_inspector_breadcrumbs.js": 7683, 
++    "devtools/client/inspector/test/browser_inspector_breadcrumbs_mutations.js": 6532, 
++    "devtools/client/inspector/test/browser_inspector_breadcrumbs_visibility.js": 4802, 
++    "devtools/client/inspector/test/browser_inspector_delete-selected-node-01.js": 5981, 
++    "devtools/client/inspector/test/browser_inspector_delete-selected-node-02.js": 11539, 
++    "devtools/client/inspector/test/browser_inspector_delete-selected-node-03.js": 5437, 
++    "devtools/client/inspector/test/browser_inspector_destroy-after-navigation.js": 6119, 
++    "devtools/client/inspector/test/browser_inspector_destroy-before-ready.js": 4741, 
++    "devtools/client/inspector/test/browser_inspector_gcli-inspect-command.js": 6794, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-01.js": 5142, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-02.js": 9080, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-03.js": 5569, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-05.js": 6244, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-cancel.js": 6461, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-comments.js": 6288, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-cssshape_01.js": 4769, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-cssshape_03.js": 5057, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-cssshape_04.js": 7146, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-cssshape_05.js": 6031, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-csstransform_01.js": 4712, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-embed.js": 5325, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-eyedropper-xul.js": 5701, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-geometry_02.js": 4983, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-geometry_04.js": 4884, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-geometry_05.js": 5380, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-geometry_06.js": 6262, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-hover_01.js": 5988, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-hover_03.js": 6095, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-iframes_01.js": 5429, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-iframes_02.js": 6775, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-inline.js": 14205, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-keybinding_01.js": 5559, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-keybinding_02.js": 6046, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-keybinding_03.js": 5237, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-keybinding_04.js": 4846, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-options.js": 4672, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-preview.js": 7775, 
+     "devtools/client/inspector/test/browser_inspector_highlighter-rect_01.js": 5657, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-rect_02.js": 6008, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-rulers_01.js": 5659, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-rulers_02.js": 5660, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-selector_01.js": 7152, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-selector_02.js": 5808, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-xbl.js": 7162, 
+-    "devtools/client/inspector/test/browser_inspector_highlighter-zoom.js": 9079, 
+-    "devtools/client/inspector/test/browser_inspector_iframe-navigation.js": 6417, 
+-    "devtools/client/inspector/test/browser_inspector_infobar_01.js": 12146, 
+-    "devtools/client/inspector/test/browser_inspector_infobar_02.js": 7496, 
+-    "devtools/client/inspector/test/browser_inspector_infobar_03.js": 6934, 
+-    "devtools/client/inspector/test/browser_inspector_infobar_textnode.js": 9024, 
+-    "devtools/client/inspector/test/browser_inspector_initialization.js": 15487, 
+-    "devtools/client/inspector/test/browser_inspector_invalidate.js": 6845, 
+-    "devtools/client/inspector/test/browser_inspector_keyboard-shortcuts-copy-outerhtml.js": 7032, 
+-    "devtools/client/inspector/test/browser_inspector_keyboard-shortcuts.js": 11812, 
+-    "devtools/client/inspector/test/browser_inspector_menu-01-sensitivity.js": 8346, 
+-    "devtools/client/inspector/test/browser_inspector_menu-03-paste-items.js": 7700, 
+-    "devtools/client/inspector/test/browser_inspector_menu-04-use-in-console.js": 8514, 
+-    "devtools/client/inspector/test/browser_inspector_menu-05-attribute-items.js": 7594, 
+-    "devtools/client/inspector/test/browser_inspector_menu-06-other.js": 13223, 
+-    "devtools/client/inspector/test/browser_inspector_navigate_to_errors.js": 17920, 
+-    "devtools/client/inspector/test/browser_inspector_navigation.js": 10599, 
+-    "devtools/client/inspector/test/browser_inspector_open_on_neterror.js": 9008, 
+-    "devtools/client/inspector/test/browser_inspector_pane-toggle-01.js": 5502, 
+-    "devtools/client/inspector/test/browser_inspector_pane-toggle-02.js": 6204, 
+-    "devtools/client/inspector/test/browser_inspector_pane-toggle-03.js": 6364, 
+-    "devtools/client/inspector/test/browser_inspector_pane-toggle-05.js": 5581, 
+-    "devtools/client/inspector/test/browser_inspector_picker-stop-on-destroy.js": 7292, 
+-    "devtools/client/inspector/test/browser_inspector_picker-stop-on-tool-change.js": 6665, 
+-    "devtools/client/inspector/test/browser_inspector_portrait_mode.js": 11807, 
+-    "devtools/client/inspector/test/browser_inspector_pseudoclass-lock.js": 11737, 
+-    "devtools/client/inspector/test/browser_inspector_pseudoclass-menu.js": 5955, 
+-    "devtools/client/inspector/test/browser_inspector_reload-01.js": 7024, 
+-    "devtools/client/inspector/test/browser_inspector_reload-02.js": 7472, 
+-    "devtools/client/inspector/test/browser_inspector_remove-iframe-during-load.js": 7393, 
+-    "devtools/client/inspector/test/browser_inspector_search-01.js": 20247, 
+-    "devtools/client/inspector/test/browser_inspector_search-02.js": 8974, 
+-    "devtools/client/inspector/test/browser_inspector_search-03.js": 8913, 
+-    "devtools/client/inspector/test/browser_inspector_search-04.js": 6800, 
+-    "devtools/client/inspector/test/browser_inspector_search-05.js": 14768, 
+-    "devtools/client/inspector/test/browser_inspector_search-06.js": 10631, 
+-    "devtools/client/inspector/test/browser_inspector_search-07.js": 6284, 
+-    "devtools/client/inspector/test/browser_inspector_search-08.js": 5777, 
+-    "devtools/client/inspector/test/browser_inspector_search-clear.js": 5810, 
+-    "devtools/client/inspector/test/browser_inspector_search-label.js": 7628, 
+-    "devtools/client/inspector/test/browser_inspector_search-navigation.js": 9089, 
+-    "devtools/client/inspector/test/browser_inspector_search-reserved.js": 8154, 
+-    "devtools/client/inspector/test/browser_inspector_search-selection.js": 12939, 
+-    "devtools/client/inspector/test/browser_inspector_search-sidebar.js": 8336, 
+-    "devtools/client/inspector/test/browser_inspector_search_keyboard_trap.js": 6893, 
+-    "devtools/client/inspector/test/browser_inspector_select-docshell.js": 7462, 
+-    "devtools/client/inspector/test/browser_inspector_select-last-selected.js": 20944, 
+-    "devtools/client/inspector/test/browser_inspector_sidebarstate.js": 12030, 
+-    "devtools/client/inspector/test/browser_inspector_startup.js": 7391, 
+-    "devtools/client/inspector/test/browser_inspector_switch-to-inspector-on-pick.js": 6604, 
+-    "devtools/client/inspector/test/browser_inspector_textbox-menu.js": 8490, 
+-    "devtools/client/layoutview/test/browser_layoutview.js": 6335, 
+-    "devtools/client/layoutview/test/browser_layoutview_editablemodel.js": 6802, 
+-    "devtools/client/layoutview/test/browser_layoutview_editablemodel_stylerules.js": 5375, 
+-    "devtools/client/layoutview/test/browser_layoutview_update-after-navigation.js": 7608, 
+-    "devtools/client/layoutview/test/browser_layoutview_update-after-reload.js": 6016, 
+-    "devtools/client/markupview/test/browser_markupview_anonymous_01.js": 8942, 
+-    "devtools/client/markupview/test/browser_markupview_anonymous_02.js": 10639, 
+-    "devtools/client/markupview/test/browser_markupview_anonymous_03.js": 6429, 
+-    "devtools/client/markupview/test/browser_markupview_copy_image_data.js": 5331, 
+-    "devtools/client/markupview/test/browser_markupview_css_completion_style_attribute.js": 8666, 
+-    "devtools/client/markupview/test/browser_markupview_dragdrop_autoscroll.js": 7414, 
+-    "devtools/client/markupview/test/browser_markupview_dragdrop_reorder.js": 10189, 
+-    "devtools/client/markupview/test/browser_markupview_events.js": 12519, 
+-    "devtools/client/markupview/test/browser_markupview_events_jquery_1.0.js": 9521, 
+-    "devtools/client/markupview/test/browser_markupview_events_jquery_1.1.js": 9805, 
+-    "devtools/client/markupview/test/browser_markupview_events_jquery_1.11.1.js": 11170, 
+-    "devtools/client/markupview/test/browser_markupview_events_jquery_1.2.js": 8346, 
+-    "devtools/client/markupview/test/browser_markupview_events_jquery_1.3.js": 12293, 
+-    "devtools/client/markupview/test/browser_markupview_events_jquery_1.4.js": 11845, 
+-    "devtools/client/markupview/test/browser_markupview_events_jquery_1.6.js": 14280, 
+-    "devtools/client/markupview/test/browser_markupview_events_jquery_1.7.js": 12839, 
+-    "devtools/client/markupview/test/browser_markupview_events_jquery_2.1.1.js": 11102, 
+-    "devtools/client/markupview/test/browser_markupview_html_edit_01.js": 15480, 
+-    "devtools/client/markupview/test/browser_markupview_html_edit_02.js": 13363, 
+-    "devtools/client/markupview/test/browser_markupview_html_edit_03.js": 8849, 
+-    "devtools/client/markupview/test/browser_markupview_keybindings_03.js": 6313, 
+-    "devtools/client/markupview/test/browser_markupview_keybindings_04.js": 7730, 
+-    "devtools/client/markupview/test/browser_markupview_links_01.js": 8486, 
+-    "devtools/client/markupview/test/browser_markupview_links_04.js": 6595, 
+-    "devtools/client/markupview/test/browser_markupview_links_05.js": 7450, 
+-    "devtools/client/markupview/test/browser_markupview_links_06.js": 9595, 
+-    "devtools/client/markupview/test/browser_markupview_links_07.js": 7709, 
+-    "devtools/client/markupview/test/browser_markupview_load_01.js": 7448, 
+-    "devtools/client/markupview/test/browser_markupview_mutation_01.js": 8746, 
+-    "devtools/client/markupview/test/browser_markupview_navigation.js": 11594, 
+-    "devtools/client/markupview/test/browser_markupview_node_not_displayed_02.js": 7116, 
+-    "devtools/client/markupview/test/browser_markupview_pagesize_01.js": 6016, 
+-    "devtools/client/markupview/test/browser_markupview_pagesize_02.js": 7467, 
+-    "devtools/client/markupview/test/browser_markupview_search_01.js": 8957, 
+-    "devtools/client/markupview/test/browser_markupview_tag_edit_01.js": 9396, 
+-    "devtools/client/markupview/test/browser_markupview_tag_edit_04.js": 19454, 
+-    "devtools/client/markupview/test/browser_markupview_tag_edit_05.js": 6616, 
+-    "devtools/client/markupview/test/browser_markupview_tag_edit_06.js": 6848, 
+-    "devtools/client/markupview/test/browser_markupview_tag_edit_07.js": 6474, 
+-    "devtools/client/markupview/test/browser_markupview_tag_edit_08.js": 6711, 
+-    "devtools/client/markupview/test/browser_markupview_textcontent_edit_01.js": 7442, 
+-    "devtools/client/markupview/test/browser_markupview_toggle_01.js": 5656, 
+-    "devtools/client/markupview/test/browser_markupview_toggle_02.js": 5807, 
+-    "devtools/client/markupview/test/browser_markupview_toggle_03.js": 6069, 
+-    "devtools/client/markupview/test/browser_markupview_update-on-navigtion.js": 5346, 
+-    "devtools/client/memory/test/browser/browser_memory_allocationStackBreakdown_01.js": 7916, 
+-    "devtools/client/memory/test/browser/browser_memory_clear_snapshots.js": 7346, 
+-    "devtools/client/memory/test/browser/browser_memory_diff_01.js": 6208, 
+-    "devtools/client/memory/test/browser/browser_memory_displays_01.js": 5712, 
+-    "devtools/client/memory/test/browser/browser_memory_dominator_trees_01.js": 28072, 
+-    "devtools/client/memory/test/browser/browser_memory_dominator_trees_02.js": 8191, 
+-    "devtools/client/memory/test/browser/browser_memory_filter_01.js": 7655, 
+-    "devtools/client/memory/test/browser/browser_memory_individuals_01.js": 11178, 
+-    "devtools/client/memory/test/browser/browser_memory_keyboard-snapshot-list.js": 9456, 
+-    "devtools/client/memory/test/browser/browser_memory_keyboard.js": 6909, 
+-    "devtools/client/memory/test/browser/browser_memory_no_allocation_stacks.js": 5618, 
+-    "devtools/client/memory/test/browser/browser_memory_percents_01.js": 5487, 
+-    "devtools/client/memory/test/browser/browser_memory_simple_01.js": 6241, 
+-    "devtools/client/netmonitor/har/test/browser_net_har_copy_all_as_har.js": 6714, 
+-    "devtools/client/netmonitor/test/browser_net_aaa_leaktest.js": 6268, 
+-    "devtools/client/netmonitor/test/browser_net_accessibility-01.js": 20877, 
+-    "devtools/client/netmonitor/test/browser_net_accessibility-02.js": 21826, 
+-    "devtools/client/netmonitor/test/browser_net_api-calls.js": 7547, 
+-    "devtools/client/netmonitor/test/browser_net_autoscroll.js": 16230, 
+-    "devtools/client/netmonitor/test/browser_net_brotli.js": 5973, 
+-    "devtools/client/netmonitor/test/browser_net_cached-status.js": 8256, 
+-    "devtools/client/netmonitor/test/browser_net_cause.js": 10479, 
+-    "devtools/client/netmonitor/test/browser_net_cause_redirect.js": 7235, 
+-    "devtools/client/netmonitor/test/browser_net_complex-params.js": 10937, 
+-    "devtools/client/netmonitor/test/browser_net_content-type.js": 13087, 
+-    "devtools/client/netmonitor/test/browser_net_cors_requests.js": 5776, 
+-    "devtools/client/netmonitor/test/browser_net_curl-utils.js": 7863, 
+-    "devtools/client/netmonitor/test/browser_net_cyrillic-01.js": 5626, 
+-    "devtools/client/netmonitor/test/browser_net_cyrillic-02.js": 6001, 
+-    "devtools/client/netmonitor/test/browser_net_filter-01.js": 15506, 
+-    "devtools/client/netmonitor/test/browser_net_filter-02.js": 25709, 
+-    "devtools/client/netmonitor/test/browser_net_filter-03.js": 19457, 
+-    "devtools/client/netmonitor/test/browser_net_filter-04.js": 8791, 
+-    "devtools/client/netmonitor/test/browser_net_footer-summary.js": 18538, 
+-    "devtools/client/netmonitor/test/browser_net_frame.js": 14499, 
+-    "devtools/client/netmonitor/test/browser_net_html-preview.js": 8982, 
+-    "devtools/client/netmonitor/test/browser_net_icon-preview.js": 10695, 
+-    "devtools/client/netmonitor/test/browser_net_image-tooltip.js": 8387, 
+-    "devtools/client/netmonitor/test/browser_net_json-long.js": 20922, 
+-    "devtools/client/netmonitor/test/browser_net_json-malformed.js": 7327, 
+-    "devtools/client/netmonitor/test/browser_net_json_custom_mime.js": 6813, 
+-    "devtools/client/netmonitor/test/browser_net_json_text_mime.js": 5318, 
+-    "devtools/client/netmonitor/test/browser_net_jsonp.js": 5911, 
+-    "devtools/client/netmonitor/test/browser_net_large-response.js": 6462, 
+-    "devtools/client/netmonitor/test/browser_net_persistent_logs.js": 7637, 
+-    "devtools/client/netmonitor/test/browser_net_post-data-01.js": 6943, 
+-    "devtools/client/netmonitor/test/browser_net_prefs-reload.js": 26318, 
+-    "devtools/client/netmonitor/test/browser_net_raw_headers.js": 5838, 
+-    "devtools/client/netmonitor/test/browser_net_req-resp-bodies.js": 9034, 
+-    "devtools/client/netmonitor/test/browser_net_resend.js": 10550, 
+-    "devtools/client/netmonitor/test/browser_net_resend_cors.js": 9971, 
+-    "devtools/client/netmonitor/test/browser_net_resend_headers.js": 5434, 
+-    "devtools/client/netmonitor/test/browser_net_security-icon-click.js": 6261, 
+-    "devtools/client/netmonitor/test/browser_net_security-redirect.js": 5558, 
+-    "devtools/client/netmonitor/test/browser_net_security-state.js": 7043, 
+-    "devtools/client/netmonitor/test/browser_net_security-tab-deselect.js": 5989, 
+-    "devtools/client/netmonitor/test/browser_net_security-tab-visibility.js": 9336, 
+-    "devtools/client/netmonitor/test/browser_net_send-beacon-other-tab.js": 5631, 
+-    "devtools/client/netmonitor/test/browser_net_simple-request.js": 6095, 
+-    "devtools/client/netmonitor/test/browser_net_sort-02.js": 14225, 
+-    "devtools/client/netmonitor/test/browser_net_sort-03.js": 21650, 
+-    "devtools/client/netmonitor/test/browser_net_statistics-01.js": 10115, 
+-    "devtools/client/netmonitor/test/browser_net_statistics-02.js": 11453, 
+-    "devtools/client/netmonitor/test/browser_net_status-codes.js": 9069, 
+-    "devtools/client/netmonitor/test/browser_net_streaming-response.js": 6780, 
+-    "devtools/client/netmonitor/test/browser_net_throttle.js": 11105, 
+-    "devtools/client/netmonitor/test/browser_net_timing-division.js": 7890, 
+-    "devtools/client/performance/test/browser_aaa-run-first-leaktest.js": 9866, 
+-    "devtools/client/performance/test/browser_perf-button-states.js": 12083, 
+-    "devtools/client/performance/test/browser_perf-calltree-js-categories.js": 14077, 
+-    "devtools/client/performance/test/browser_perf-calltree-js-columns.js": 14322, 
+-    "devtools/client/performance/test/browser_perf-calltree-js-events.js": 10706, 
+-    "devtools/client/performance/test/browser_perf-calltree-memory-columns.js": 9855, 
+-    "devtools/client/performance/test/browser_perf-categories-js-calltree.js": 9545, 
+-    "devtools/client/performance/test/browser_perf-clear-01.js": 7170, 
+-    "devtools/client/performance/test/browser_perf-clear-02.js": 8398, 
+-    "devtools/client/performance/test/browser_perf-columns-js-calltree.js": 8625, 
+-    "devtools/client/performance/test/browser_perf-columns-memory-calltree.js": 6401, 
+-    "devtools/client/performance/test/browser_perf-console-record-01.js": 11551, 
+-    "devtools/client/performance/test/browser_perf-console-record-02.js": 21919, 
+-    "devtools/client/performance/test/browser_perf-console-record-03.js": 12776, 
+-    "devtools/client/performance/test/browser_perf-console-record-04.js": 15426, 
+-    "devtools/client/performance/test/browser_perf-console-record-05.js": 17277, 
+-    "devtools/client/performance/test/browser_perf-console-record-06.js": 25411, 
+-    "devtools/client/performance/test/browser_perf-console-record-07.js": 22141, 
+-    "devtools/client/performance/test/browser_perf-console-record-08.js": 44011, 
+-    "devtools/client/performance/test/browser_perf-console-record-09.js": 14914, 
+-    "devtools/client/performance/test/browser_perf-details-01-toggle.js": 11249, 
+-    "devtools/client/performance/test/browser_perf-details-01.js": 5668, 
+-    "devtools/client/performance/test/browser_perf-details-02-utility-fun.js": 11086, 
+-    "devtools/client/performance/test/browser_perf-details-02.js": 5704, 
+-    "devtools/client/performance/test/browser_perf-details-03-without-allocations.js": 14763, 
+-    "devtools/client/performance/test/browser_perf-details-03.js": 8933, 
+-    "devtools/client/performance/test/browser_perf-details-04-toolbar-buttons.js": 13690, 
+-    "devtools/client/performance/test/browser_perf-details-04.js": 8241, 
+-    "devtools/client/performance/test/browser_perf-details-05-preserve-view.js": 14152, 
+-    "devtools/client/performance/test/browser_perf-details-05.js": 7168, 
+-    "devtools/client/performance/test/browser_perf-details-06-rerender-on-selection.js": 10708, 
+-    "devtools/client/performance/test/browser_perf-details-07-bleed-events.js": 14146, 
+-    "devtools/client/performance/test/browser_perf-details-07.js": 5554, 
+-    "devtools/client/performance/test/browser_perf-details-calltree-render.js": 8273, 
+-    "devtools/client/performance/test/browser_perf-details-flamegraph-render.js": 7759, 
+-    "devtools/client/performance/test/browser_perf-details-memory-calltree-render.js": 8279, 
+-    "devtools/client/performance/test/browser_perf-details-memory-flamegraph-render.js": 7833, 
+-    "devtools/client/performance/test/browser_perf-details-render-00-waterfall.js": 12885, 
+-    "devtools/client/performance/test/browser_perf-details-render-01-js-calltree.js": 13590, 
+-    "devtools/client/performance/test/browser_perf-details-render-02-js-flamegraph.js": 13161, 
+-    "devtools/client/performance/test/browser_perf-details-render-03-memory-calltree.js": 12737, 
+-    "devtools/client/performance/test/browser_perf-details-render-04-memory-flamegraph.js": 12892, 
+-    "devtools/client/performance/test/browser_perf-details-waterfall-render.js": 7374, 
+-    "devtools/client/performance/test/browser_perf-docload.js": 10762, 
+-    "devtools/client/performance/test/browser_perf-events-calltree.js": 5509, 
+-    "devtools/client/performance/test/browser_perf-highlighted.js": 14003, 
+-    "devtools/client/performance/test/browser_perf-jit-view-01.js": 8367, 
+-    "devtools/client/performance/test/browser_perf-jit-view-02.js": 7636, 
+-    "devtools/client/performance/test/browser_perf-legacy-front-01.js": 7450, 
+-    "devtools/client/performance/test/browser_perf-legacy-front-04.js": 5391, 
+-    "devtools/client/performance/test/browser_perf-legacy-front-05.js": 6461, 
+-    "devtools/client/performance/test/browser_perf-loading-01.js": 10037, 
+-    "devtools/client/performance/test/browser_perf-loading-02.js": 13463, 
+-    "devtools/client/performance/test/browser_perf-markers-docload.js": 6309, 
+-    "devtools/client/performance/test/browser_perf-options-02-toggle-throw-alt.js": 9411, 
+-    "devtools/client/performance/test/browser_perf-options-enable-framerate-01.js": 11665, 
+-    "devtools/client/performance/test/browser_perf-options-enable-framerate-02.js": 11724, 
+-    "devtools/client/performance/test/browser_perf-options-enable-framerate.js": 5939, 
+-    "devtools/client/performance/test/browser_perf-options-enable-memory-01.js": 13652, 
+-    "devtools/client/performance/test/browser_perf-options-enable-memory-02.js": 13656, 
+-    "devtools/client/performance/test/browser_perf-options-flatten-tree-recursion-01.js": 10468, 
+-    "devtools/client/performance/test/browser_perf-options-flatten-tree-recursion-02.js": 10137, 
+-    "devtools/client/performance/test/browser_perf-options-invert-call-tree-01.js": 11183, 
+-    "devtools/client/performance/test/browser_perf-options-invert-call-tree-02.js": 9884, 
+-    "devtools/client/performance/test/browser_perf-options-invert-flame-graph-01.js": 10455, 
+-    "devtools/client/performance/test/browser_perf-options-invert-flame-graph-02.js": 10133, 
+-    "devtools/client/performance/test/browser_perf-options-propagate-allocations.js": 9993, 
+-    "devtools/client/performance/test/browser_perf-options-propagate-profiler.js": 9016, 
+-    "devtools/client/performance/test/browser_perf-options-show-idle-blocks-01.js": 10454, 
+-    "devtools/client/performance/test/browser_perf-options-show-idle-blocks-02.js": 10158, 
+-    "devtools/client/performance/test/browser_perf-options-show-platform-data-01.js": 19934, 
+-    "devtools/client/performance/test/browser_perf-options-show-platform-data-02.js": 11159, 
+-    "devtools/client/performance/test/browser_perf-overview-render-01.js": 12823, 
+-    "devtools/client/performance/test/browser_perf-overview-render-02.js": 13604, 
+-    "devtools/client/performance/test/browser_perf-overview-render-03.js": 10246, 
+-    "devtools/client/performance/test/browser_perf-overview-render-04.js": 12019, 
+-    "devtools/client/performance/test/browser_perf-overview-selection-01.js": 9812, 
+-    "devtools/client/performance/test/browser_perf-overview-selection-02.js": 13581, 
+-    "devtools/client/performance/test/browser_perf-overview-selection-03.js": 10164, 
+-    "devtools/client/performance/test/browser_perf-overview-time-interval.js": 9810, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-rect_02.js": 5032, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-selector_01.js": 5272, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-xbl.js": 4754, 
++    "devtools/client/inspector/test/browser_inspector_highlighter-zoom.js": 5788, 
++    "devtools/client/inspector/test/browser_inspector_iframe-navigation.js": 5060, 
++    "devtools/client/inspector/test/browser_inspector_infobar_01.js": 9481, 
++    "devtools/client/inspector/test/browser_inspector_infobar_02.js": 5976, 
++    "devtools/client/inspector/test/browser_inspector_infobar_03.js": 5218, 
++    "devtools/client/inspector/test/browser_inspector_infobar_04.js": 5932, 
++    "devtools/client/inspector/test/browser_inspector_infobar_textnode.js": 7665, 
++    "devtools/client/inspector/test/browser_inspector_initialization.js": 10847, 
++    "devtools/client/inspector/test/browser_inspector_invalidate.js": 4987, 
++    "devtools/client/inspector/test/browser_inspector_keyboard-shortcuts.js": 9619, 
++    "devtools/client/inspector/test/browser_inspector_menu-04-use-in-console.js": 5627, 
++    "devtools/client/inspector/test/browser_inspector_menu-05-attribute-items.js": 5758, 
++    "devtools/client/inspector/test/browser_inspector_menu-06-other.js": 9195, 
++    "devtools/client/inspector/test/browser_inspector_navigate_to_errors.js": 11034, 
++    "devtools/client/inspector/test/browser_inspector_navigation.js": 11571, 
++    "devtools/client/inspector/test/browser_inspector_open_on_neterror.js": 6423, 
++    "devtools/client/inspector/test/browser_inspector_pane-toggle-02.js": 4764, 
++    "devtools/client/inspector/test/browser_inspector_pane-toggle-03.js": 5365, 
++    "devtools/client/inspector/test/browser_inspector_picker-stop-on-destroy.js": 5250, 
++    "devtools/client/inspector/test/browser_inspector_portrait_mode.js": 7147, 
++    "devtools/client/inspector/test/browser_inspector_pseudoclass-lock.js": 8837, 
++    "devtools/client/inspector/test/browser_inspector_reload-01.js": 5066, 
++    "devtools/client/inspector/test/browser_inspector_reload-02.js": 4851, 
++    "devtools/client/inspector/test/browser_inspector_remove-iframe-during-load.js": 5056, 
++    "devtools/client/inspector/test/browser_inspector_search-01.js": 9071, 
++    "devtools/client/inspector/test/browser_inspector_search-02.js": 6023, 
++    "devtools/client/inspector/test/browser_inspector_search-03.js": 6308, 
++    "devtools/client/inspector/test/browser_inspector_search-04.js": 4655, 
++    "devtools/client/inspector/test/browser_inspector_search-05.js": 10229, 
++    "devtools/client/inspector/test/browser_inspector_search-06.js": 8232, 
++    "devtools/client/inspector/test/browser_inspector_search-07.js": 4619, 
++    "devtools/client/inspector/test/browser_inspector_search-clear.js": 4628, 
++    "devtools/client/inspector/test/browser_inspector_search-label.js": 4817, 
++    "devtools/client/inspector/test/browser_inspector_search-navigation.js": 6501, 
++    "devtools/client/inspector/test/browser_inspector_search-reserved.js": 5801, 
++    "devtools/client/inspector/test/browser_inspector_search-selection.js": 9783, 
++    "devtools/client/inspector/test/browser_inspector_search-sidebar.js": 6573, 
++    "devtools/client/inspector/test/browser_inspector_search-suggests-ids-and-classes.js": 5142, 
++    "devtools/client/inspector/test/browser_inspector_select-docshell.js": 5066, 
++    "devtools/client/inspector/test/browser_inspector_select-last-selected.js": 13426, 
++    "devtools/client/inspector/test/browser_inspector_sidebarstate.js": 9348, 
++    "devtools/client/inspector/test/browser_inspector_startup.js": 5377, 
++    "devtools/client/inspector/test/browser_inspector_textbox-menu.js": 6253, 
++    "devtools/client/memory/test/browser/browser_memory_clear_snapshots.js": 4735, 
++    "devtools/client/memory/test/browser/browser_memory_diff_01.js": 4687, 
++    "devtools/client/memory/test/browser/browser_memory_dominator_trees_01.js": 15806, 
++    "devtools/client/memory/test/browser/browser_memory_dominator_trees_02.js": 5258, 
++    "devtools/client/memory/test/browser/browser_memory_filter_01.js": 5096, 
++    "devtools/client/memory/test/browser/browser_memory_individuals_01.js": 8125, 
++    "devtools/client/memory/test/browser/browser_memory_keyboard-snapshot-list.js": 5934, 
++    "devtools/client/netmonitor/test/browser_net_aaa_leaktest.js": 4629, 
++    "devtools/client/netmonitor/test/browser_net_accessibility-01.js": 11909, 
++    "devtools/client/netmonitor/test/browser_net_accessibility-02.js": 12460, 
++    "devtools/client/netmonitor/test/browser_net_api-calls.js": 5551, 
++    "devtools/client/netmonitor/test/browser_net_autoscroll.js": 13333, 
++    "devtools/client/netmonitor/test/browser_net_brotli.js": 5644, 
++    "devtools/client/netmonitor/test/browser_net_cached-status.js": 5228, 
++    "devtools/client/netmonitor/test/browser_net_cause.js": 6582, 
++    "devtools/client/netmonitor/test/browser_net_cause_redirect.js": 4995, 
++    "devtools/client/netmonitor/test/browser_net_cause_source_map.js": 5906, 
++    "devtools/client/netmonitor/test/browser_net_columns_showhide.js": 5817, 
++    "devtools/client/netmonitor/test/browser_net_complex-params.js": 7964, 
++    "devtools/client/netmonitor/test/browser_net_content-type.js": 9523, 
++    "devtools/client/netmonitor/test/browser_net_cors_requests.js": 5064, 
++    "devtools/client/netmonitor/test/browser_net_curl-utils.js": 5689, 
++    "devtools/client/netmonitor/test/browser_net_cyrillic-01.js": 4944, 
++    "devtools/client/netmonitor/test/browser_net_cyrillic-02.js": 5226, 
++    "devtools/client/netmonitor/test/browser_net_details-no-duplicated-content.js": 5408, 
++    "devtools/client/netmonitor/test/browser_net_filter-01.js": 12155, 
++    "devtools/client/netmonitor/test/browser_net_filter-02.js": 13763, 
++    "devtools/client/netmonitor/test/browser_net_filter-03.js": 11209, 
++    "devtools/client/netmonitor/test/browser_net_filter-04.js": 6380, 
++    "devtools/client/netmonitor/test/browser_net_filter-autocomplete.js": 8275, 
++    "devtools/client/netmonitor/test/browser_net_filter-flags.js": 14085, 
++    "devtools/client/netmonitor/test/browser_net_footer-summary.js": 12200, 
++    "devtools/client/netmonitor/test/browser_net_frame.js": 9526, 
++    "devtools/client/netmonitor/test/browser_net_header-docs.js": 4735, 
++    "devtools/client/netmonitor/test/browser_net_html-preview.js": 5071, 
++    "devtools/client/netmonitor/test/browser_net_icon-preview.js": 8044, 
++    "devtools/client/netmonitor/test/browser_net_image-tooltip.js": 6554, 
++    "devtools/client/netmonitor/test/browser_net_json-b64.js": 4862, 
++    "devtools/client/netmonitor/test/browser_net_json-long.js": 36479, 
++    "devtools/client/netmonitor/test/browser_net_json-malformed.js": 5365, 
++    "devtools/client/netmonitor/test/browser_net_json-null.js": 4997, 
++    "devtools/client/netmonitor/test/browser_net_json_custom_mime.js": 4939, 
++    "devtools/client/netmonitor/test/browser_net_json_text_mime.js": 4766, 
++    "devtools/client/netmonitor/test/browser_net_jsonp.js": 5265, 
++    "devtools/client/netmonitor/test/browser_net_large-response.js": 5710, 
++    "devtools/client/netmonitor/test/browser_net_open_in_debugger.js": 8970, 
++    "devtools/client/netmonitor/test/browser_net_open_in_style_editor.js": 8921, 
++    "devtools/client/netmonitor/test/browser_net_open_request_in_tab.js": 4654, 
++    "devtools/client/netmonitor/test/browser_net_pane-collapse.js": 4991, 
++    "devtools/client/netmonitor/test/browser_net_persistent_logs.js": 6200, 
++    "devtools/client/netmonitor/test/browser_net_post-data-01.js": 5996, 
++    "devtools/client/netmonitor/test/browser_net_post-data-02.js": 4745, 
++    "devtools/client/netmonitor/test/browser_net_post-data-03.js": 4740, 
++    "devtools/client/netmonitor/test/browser_net_post-data-04.js": 4621, 
++    "devtools/client/netmonitor/test/browser_net_prefs-reload.js": 16006, 
++    "devtools/client/netmonitor/test/browser_net_raw_headers.js": 5044, 
++    "devtools/client/netmonitor/test/browser_net_reload-button.js": 4673, 
++    "devtools/client/netmonitor/test/browser_net_req-resp-bodies.js": 6672, 
++    "devtools/client/netmonitor/test/browser_net_resend.js": 7298, 
++    "devtools/client/netmonitor/test/browser_net_resend_cors.js": 6330, 
++    "devtools/client/netmonitor/test/browser_net_security-details.js": 4725, 
++    "devtools/client/netmonitor/test/browser_net_security-error.js": 4645, 
++    "devtools/client/netmonitor/test/browser_net_security-icon-click.js": 5517, 
++    "devtools/client/netmonitor/test/browser_net_security-redirect.js": 4727, 
++    "devtools/client/netmonitor/test/browser_net_security-state.js": 6615, 
++    "devtools/client/netmonitor/test/browser_net_security-tab-deselect.js": 4921, 
++    "devtools/client/netmonitor/test/browser_net_security-tab-visibility.js": 6271, 
++    "devtools/client/netmonitor/test/browser_net_security-warnings.js": 4979, 
++    "devtools/client/netmonitor/test/browser_net_simple-request.js": 5200, 
++    "devtools/client/netmonitor/test/browser_net_sort-01.js": 11528, 
++    "devtools/client/netmonitor/test/browser_net_sort-02.js": 9794, 
++    "devtools/client/netmonitor/test/browser_net_sort-03.js": 10545, 
++    "devtools/client/netmonitor/test/browser_net_statistics-01.js": 7526, 
++    "devtools/client/netmonitor/test/browser_net_statistics-02.js": 5183, 
++    "devtools/client/netmonitor/test/browser_net_status-codes.js": 7089, 
++    "devtools/client/netmonitor/test/browser_net_streaming-response.js": 5901, 
++    "devtools/client/netmonitor/test/browser_net_throttle.js": 10446, 
++    "devtools/client/netmonitor/test/browser_net_thumbnail-click.js": 5891, 
++    "devtools/client/netmonitor/test/browser_net_timing-division.js": 7108, 
++    "devtools/client/netmonitor/test/browser_net_truncate.js": 11198, 
++    "devtools/client/netmonitor/test/browser_net_waterfall-click.js": 5739, 
++    "devtools/client/performance/test/browser_aaa-run-first-leaktest.js": 6182, 
++    "devtools/client/performance/test/browser_perf-button-states.js": 6725, 
++    "devtools/client/performance/test/browser_perf-calltree-js-categories.js": 9112, 
++    "devtools/client/performance/test/browser_perf-calltree-js-columns.js": 9434, 
++    "devtools/client/performance/test/browser_perf-calltree-js-events.js": 6792, 
++    "devtools/client/performance/test/browser_perf-calltree-memory-columns.js": 6409, 
++    "devtools/client/performance/test/browser_perf-console-record-01.js": 7078, 
++    "devtools/client/performance/test/browser_perf-console-record-02.js": 11579, 
++    "devtools/client/performance/test/browser_perf-console-record-03.js": 7576, 
++    "devtools/client/performance/test/browser_perf-console-record-04.js": 8773, 
++    "devtools/client/performance/test/browser_perf-console-record-05.js": 9820, 
++    "devtools/client/performance/test/browser_perf-console-record-06.js": 12894, 
++    "devtools/client/performance/test/browser_perf-console-record-07.js": 13701, 
++    "devtools/client/performance/test/browser_perf-console-record-08.js": 22183, 
++    "devtools/client/performance/test/browser_perf-console-record-09.js": 9287, 
++    "devtools/client/performance/test/browser_perf-details-01-toggle.js": 7019, 
++    "devtools/client/performance/test/browser_perf-details-02-utility-fun.js": 6954, 
++    "devtools/client/performance/test/browser_perf-details-03-without-allocations.js": 8960, 
++    "devtools/client/performance/test/browser_perf-details-04-toolbar-buttons.js": 8245, 
++    "devtools/client/performance/test/browser_perf-details-05-preserve-view.js": 8262, 
++    "devtools/client/performance/test/browser_perf-details-06-rerender-on-selection.js": 6886, 
++    "devtools/client/performance/test/browser_perf-details-07-bleed-events.js": 8481, 
++    "devtools/client/performance/test/browser_perf-details-render-00-waterfall.js": 7845, 
++    "devtools/client/performance/test/browser_perf-details-render-01-js-calltree.js": 8114, 
++    "devtools/client/performance/test/browser_perf-details-render-02-js-flamegraph.js": 8254, 
++    "devtools/client/performance/test/browser_perf-details-render-03-memory-calltree.js": 7941, 
++    "devtools/client/performance/test/browser_perf-details-render-04-memory-flamegraph.js": 8342, 
++    "devtools/client/performance/test/browser_perf-docload.js": 7069, 
++    "devtools/client/performance/test/browser_perf-highlighted.js": 8320, 
++    "devtools/client/performance/test/browser_perf-loading-01.js": 6333, 
++    "devtools/client/performance/test/browser_perf-loading-02.js": 8344, 
++    "devtools/client/performance/test/browser_perf-options-02-toggle-throw-alt.js": 6292, 
++    "devtools/client/performance/test/browser_perf-options-enable-framerate-01.js": 7671, 
++    "devtools/client/performance/test/browser_perf-options-enable-framerate-02.js": 7295, 
++    "devtools/client/performance/test/browser_perf-options-enable-memory-01.js": 8797, 
++    "devtools/client/performance/test/browser_perf-options-enable-memory-02.js": 8801, 
++    "devtools/client/performance/test/browser_perf-options-flatten-tree-recursion-01.js": 6720, 
++    "devtools/client/performance/test/browser_perf-options-flatten-tree-recursion-02.js": 6575, 
++    "devtools/client/performance/test/browser_perf-options-invert-call-tree-01.js": 7110, 
++    "devtools/client/performance/test/browser_perf-options-invert-call-tree-02.js": 6449, 
++    "devtools/client/performance/test/browser_perf-options-invert-flame-graph-01.js": 6702, 
++    "devtools/client/performance/test/browser_perf-options-invert-flame-graph-02.js": 6569, 
++    "devtools/client/performance/test/browser_perf-options-propagate-allocations.js": 6465, 
++    "devtools/client/performance/test/browser_perf-options-propagate-profiler.js": 6099, 
++    "devtools/client/performance/test/browser_perf-options-show-idle-blocks-01.js": 6688, 
++    "devtools/client/performance/test/browser_perf-options-show-idle-blocks-02.js": 6563, 
++    "devtools/client/performance/test/browser_perf-options-show-platform-data-01.js": 12699, 
++    "devtools/client/performance/test/browser_perf-options-show-platform-data-02.js": 7351, 
++    "devtools/client/performance/test/browser_perf-overview-render-01.js": 7805, 
++    "devtools/client/performance/test/browser_perf-overview-render-02.js": 8223, 
++    "devtools/client/performance/test/browser_perf-overview-render-03.js": 6732, 
++    "devtools/client/performance/test/browser_perf-overview-render-04.js": 8012, 
++    "devtools/client/performance/test/browser_perf-overview-selection-01.js": 6327, 
++    "devtools/client/performance/test/browser_perf-overview-selection-02.js": 8316, 
++    "devtools/client/performance/test/browser_perf-overview-selection-03.js": 6726, 
++    "devtools/client/performance/test/browser_perf-overview-time-interval.js": 6344, 
+     "devtools/client/performance/test/browser_perf-private-browsing.js": 5318, 
+-    "devtools/client/performance/test/browser_perf-range-changed-render.js": 12015, 
+-    "devtools/client/performance/test/browser_perf-recording-notices-01.js": 9813, 
+-    "devtools/client/performance/test/browser_perf-recording-notices-02.js": 13456, 
+-    "devtools/client/performance/test/browser_perf-recording-notices-03.js": 10885, 
+-    "devtools/client/performance/test/browser_perf-recording-notices-04.js": 9252, 
+-    "devtools/client/performance/test/browser_perf-recording-selected-01.js": 14701, 
+-    "devtools/client/performance/test/browser_perf-recording-selected-02.js": 14413, 
+-    "devtools/client/performance/test/browser_perf-recording-selected-03.js": 14519, 
+-    "devtools/client/performance/test/browser_perf-recording-selected-04.js": 20688, 
+-    "devtools/client/performance/test/browser_perf-recordings-clear-01.js": 14176, 
+-    "devtools/client/performance/test/browser_perf-recordings-clear-02.js": 16005, 
+-    "devtools/client/performance/test/browser_perf-refresh.js": 11581, 
+-    "devtools/client/performance/test/browser_perf-states.js": 11786, 
+-    "devtools/client/performance/test/browser_perf-telemetry-01.js": 14935, 
+-    "devtools/client/performance/test/browser_perf-telemetry-02.js": 11723, 
+-    "devtools/client/performance/test/browser_perf-telemetry-03.js": 11817, 
+-    "devtools/client/performance/test/browser_perf-telemetry-04.js": 13129, 
+-    "devtools/client/performance/test/browser_perf-telemetry.js": 9802, 
+-    "devtools/client/performance/test/browser_perf-theme-toggle-01.js": 9172, 
+-    "devtools/client/performance/test/browser_perf-ui-recording.js": 10415, 
+-    "devtools/client/performance/test/browser_profiler_tree-view-11.js": 5719, 
+-    "devtools/client/performance/test/browser_timeline-waterfall-background.js": 14072, 
+-    "devtools/client/performance/test/browser_timeline-waterfall-generic.js": 14705, 
+-    "devtools/client/projecteditor/test/browser_projecteditor_delete_file.js": 6471, 
+-    "devtools/client/projecteditor/test/browser_projecteditor_editing_01.js": 6582, 
+-    "devtools/client/projecteditor/test/browser_projecteditor_external_change.js": 6551, 
+-    "devtools/client/projecteditor/test/browser_projecteditor_rename_file.js": 14087, 
+-    "devtools/client/projecteditor/test/browser_projecteditor_rename_file_01.js": 8327, 
+-    "devtools/client/projecteditor/test/browser_projecteditor_rename_file_02.js": 8269, 
+-    "devtools/client/projecteditor/test/browser_projecteditor_saveall.js": 6454, 
+-    "devtools/client/projecteditor/test/browser_projecteditor_tree_selection_01.js": 6078, 
+-    "devtools/client/responsivedesign/test/browser_responsivecomputedview.js": 9674, 
+-    "devtools/client/responsivedesign/test/browser_responsiveruleview.js": 8006, 
+-    "devtools/client/scratchpad/test/browser_scratchpad_close_toolbox.js": 8098, 
+-    "devtools/client/scratchpad/test/browser_scratchpad_disable_view_menu_items.js": 9542, 
+-    "devtools/client/scratchpad/test/browser_scratchpad_restore.js": 7220, 
+-    "devtools/client/scratchpad/test/browser_scratchpad_unsaved.js": 5477, 
+-    "devtools/client/scratchpad/test/browser_scratchpad_wrong_window_focus.js": 6448, 
+-    "devtools/client/shared/components/test/browser/browser_notification_box_basic.js": 6780, 
+-    "devtools/client/shared/test/browser_telemetry_button_eyedropper.js": 9253, 
+-    "devtools/client/shared/test/browser_telemetry_button_paintflashing.js": 6708, 
+-    "devtools/client/shared/test/browser_telemetry_button_responsive.js": 7615, 
+-    "devtools/client/shared/test/browser_telemetry_button_scratchpad.js": 11334, 
+-    "devtools/client/shared/test/browser_telemetry_button_tilt.js": 10512, 
++    "devtools/client/performance/test/browser_perf-range-changed-render.js": 7714, 
++    "devtools/client/performance/test/browser_perf-recording-notices-01.js": 6330, 
++    "devtools/client/performance/test/browser_perf-recording-notices-02.js": 8305, 
++    "devtools/client/performance/test/browser_perf-recording-notices-04.js": 6193, 
++    "devtools/client/performance/test/browser_perf-recording-selected-01.js": 9389, 
++    "devtools/client/performance/test/browser_perf-recording-selected-02.js": 9099, 
++    "devtools/client/performance/test/browser_perf-recording-selected-03.js": 9054, 
++    "devtools/client/performance/test/browser_perf-recording-selected-04.js": 11716, 
++    "devtools/client/performance/test/browser_perf-recordings-clear-01.js": 8528, 
++    "devtools/client/performance/test/browser_perf-recordings-clear-02.js": 9891, 
++    "devtools/client/performance/test/browser_perf-refresh.js": 7887, 
++    "devtools/client/performance/test/browser_perf-states.js": 7421, 
++    "devtools/client/performance/test/browser_perf-telemetry-01.js": 9517, 
++    "devtools/client/performance/test/browser_perf-telemetry-02.js": 7484, 
++    "devtools/client/performance/test/browser_perf-telemetry-03.js": 7382, 
++    "devtools/client/performance/test/browser_perf-telemetry-04.js": 7682, 
++    "devtools/client/performance/test/browser_perf-ui-recording.js": 6814, 
++    "devtools/client/performance/test/browser_timeline-waterfall-background.js": 8786, 
++    "devtools/client/performance/test/browser_timeline-waterfall-generic.js": 8999, 
++    "devtools/client/projecteditor/test/browser_projecteditor_delete_file.js": 5089, 
++    "devtools/client/projecteditor/test/browser_projecteditor_editing_01.js": 4754, 
++    "devtools/client/projecteditor/test/browser_projecteditor_external_change.js": 5282, 
++    "devtools/client/projecteditor/test/browser_projecteditor_rename_file_01.js": 6274, 
++    "devtools/client/projecteditor/test/browser_projecteditor_rename_file_02.js": 6264, 
++    "devtools/client/projecteditor/test/browser_projecteditor_saveall.js": 5020, 
++    "devtools/client/projecteditor/test/browser_projecteditor_tree_selection_01.js": 4680, 
++    "devtools/client/responsivedesign/test/browser_responsivecomputedview.js": 7348, 
++    "devtools/client/responsivedesign/test/browser_responsiveruleview.js": 6732, 
++    "devtools/client/scratchpad/test/browser_scratchpad_close_toolbox.js": 5865, 
++    "devtools/client/scratchpad/test/browser_scratchpad_disable_view_menu_items.js": 6964, 
++    "devtools/client/shared/test/browser_telemetry_button_eyedropper.js": 7579, 
++    "devtools/client/shared/test/browser_telemetry_button_paintflashing.js": 5656, 
++    "devtools/client/shared/test/browser_telemetry_button_responsive.js": 5560, 
++    "devtools/client/shared/test/browser_telemetry_button_scratchpad.js": 7776, 
+     "devtools/client/shared/test/browser_telemetry_sidebar.js": 9719, 
+-    "devtools/client/shared/test/browser_telemetry_toolbox.js": 14304, 
+-    "devtools/client/shared/test/browser_telemetry_toolboxtabs_inspector.js": 9297, 
+-    "devtools/client/shared/test/browser_telemetry_toolboxtabs_jsdebugger.js": 8903, 
+-    "devtools/client/shared/test/browser_telemetry_toolboxtabs_jsprofiler.js": 5753, 
+-    "devtools/client/shared/test/browser_telemetry_toolboxtabs_netmonitor.js": 6660, 
++    "devtools/client/shared/test/browser_telemetry_toolbox.js": 10905, 
++    "devtools/client/shared/test/browser_telemetry_toolboxtabs_inspector.js": 6972, 
++    "devtools/client/shared/test/browser_telemetry_toolboxtabs_jsdebugger.js": 6941, 
++    "devtools/client/shared/test/browser_telemetry_toolboxtabs_jsprofiler.js": 5400, 
++    "devtools/client/shared/test/browser_telemetry_toolboxtabs_netmonitor.js": 5829, 
+     "devtools/client/shared/test/browser_telemetry_toolboxtabs_storage.js": 6201, 
+-    "devtools/client/shared/test/browser_telemetry_toolboxtabs_styleeditor.js": 5498, 
+-    "devtools/client/shared/test/browser_telemetry_toolboxtabs_webconsole.js": 7106, 
+-    "devtools/client/shared/test/browser_toolbar_basic.js": 6526, 
+-    "devtools/client/shared/test/browser_toolbar_webconsole_errors_count.js": 7241, 
+-    "devtools/client/sourceeditor/test/browser_codemirror.js": 7559, 
++    "devtools/client/shared/test/browser_telemetry_toolboxtabs_styleeditor.js": 4941, 
++    "devtools/client/shared/test/browser_telemetry_toolboxtabs_webaudioeditor.js": 5248, 
++    "devtools/client/shared/test/browser_telemetry_toolboxtabs_webconsole.js": 5253, 
++    "devtools/client/shared/test/browser_toolbar_webconsole_errors_count.js": 6160, 
++    "devtools/client/sourceeditor/test/browser_codemirror.js": 4888, 
+     "devtools/client/sourceeditor/test/browser_vimemacs.js": 47559, 
+-    "devtools/client/storage/test/browser_storage_basic.js": 12612, 
+-    "devtools/client/storage/test/browser_storage_cache_delete.js": 7658, 
+-    "devtools/client/storage/test/browser_storage_cookies_delete_all.js": 8287, 
+-    "devtools/client/storage/test/browser_storage_cookies_edit.js": 7942, 
+-    "devtools/client/storage/test/browser_storage_cookies_edit_keyboard.js": 7463, 
+-    "devtools/client/storage/test/browser_storage_cookies_tab_navigation.js": 5872, 
+-    "devtools/client/storage/test/browser_storage_delete.js": 9748, 
+-    "devtools/client/storage/test/browser_storage_delete_all.js": 10629, 
+-    "devtools/client/storage/test/browser_storage_delete_tree.js": 9771, 
+-    "devtools/client/storage/test/browser_storage_dynamic_updates.js": 9233, 
+-    "devtools/client/storage/test/browser_storage_dynamic_updates_cookies.js": 6523, 
+-    "devtools/client/storage/test/browser_storage_dynamic_updates_sessionStorage.js": 5750, 
+-    "devtools/client/storage/test/browser_storage_empty_objectstores.js": 5656, 
+-    "devtools/client/storage/test/browser_storage_indexeddb_delete.js": 5719, 
+-    "devtools/client/storage/test/browser_storage_indexeddb_duplicate_names.js": 5701, 
+-    "devtools/client/storage/test/browser_storage_localstorage_edit.js": 6711, 
+-    "devtools/client/storage/test/browser_storage_overflow.js": 16333, 
+-    "devtools/client/storage/test/browser_storage_sessionstorage_edit.js": 7891, 
+-    "devtools/client/storage/test/browser_storage_sidebar.js": 12879, 
+-    "devtools/client/storage/test/browser_storage_sidebar_update.js": 5920, 
+-    "devtools/client/storage/test/browser_storage_values.js": 9382, 
+-    "devtools/client/styleeditor/test/browser_styleeditor_autocomplete-disabled.js": 6928, 
+-    "devtools/client/styleeditor/test/browser_styleeditor_autocomplete.js": 7332, 
+-    "devtools/client/styleeditor/test/browser_styleeditor_cmd_edit.js": 7580, 
+-    "devtools/client/styleeditor/test/browser_styleeditor_fetch-from-cache.js": 7084, 
+-    "devtools/client/styleeditor/test/browser_styleeditor_inline_friendly_names.js": 6339, 
+-    "devtools/client/styleeditor/test/browser_styleeditor_media_sidebar.js": 5889, 
+-    "devtools/client/styleeditor/test/browser_styleeditor_media_sidebar_links.js": 5652, 
+-    "devtools/client/styleeditor/test/browser_styleeditor_navigate.js": 6149, 
+-    "devtools/client/styleeditor/test/browser_styleeditor_new.js": 5720, 
+-    "devtools/client/styleeditor/test/browser_styleeditor_private_perwindowpb.js": 6802, 
+-    "devtools/client/styleeditor/test/browser_styleeditor_reload.js": 6862, 
+-    "devtools/client/styleeditor/test/browser_styleeditor_sourcemap_large.js": 6427, 
+-    "devtools/client/styleeditor/test/browser_styleeditor_sourcemap_watching.js": 7553, 
+-    "devtools/client/styleeditor/test/browser_styleeditor_sourcemaps.js": 9371, 
++    "devtools/client/storage/test/browser_storage_basic.js": 8020, 
++    "devtools/client/storage/test/browser_storage_basic_usercontextid_1.js": 6343, 
++    "devtools/client/storage/test/browser_storage_basic_usercontextid_2.js": 6802, 
++    "devtools/client/storage/test/browser_storage_basic_with_fragment.js": 6413, 
++    "devtools/client/storage/test/browser_storage_cache_delete.js": 5384, 
++    "devtools/client/storage/test/browser_storage_cookies_add.js": 5518, 
++    "devtools/client/storage/test/browser_storage_cookies_delete_all.js": 6088, 
++    "devtools/client/storage/test/browser_storage_cookies_edit.js": 6426, 
++    "devtools/client/storage/test/browser_storage_cookies_edit_keyboard.js": 5858, 
++    "devtools/client/storage/test/browser_storage_delete.js": 7215, 
++    "devtools/client/storage/test/browser_storage_delete_all.js": 7312, 
++    "devtools/client/storage/test/browser_storage_delete_tree.js": 6878, 
++    "devtools/client/storage/test/browser_storage_delete_usercontextid.js": 12717, 
++    "devtools/client/storage/test/browser_storage_dom_cache_disabled.js": 6362, 
++    "devtools/client/storage/test/browser_storage_dynamic_updates.js": 6765, 
++    "devtools/client/storage/test/browser_storage_dynamic_updates_cookies.js": 5638, 
++    "devtools/client/storage/test/browser_storage_dynamic_updates_sessionStorage.js": 4885, 
++    "devtools/client/storage/test/browser_storage_indexeddb_delete.js": 4657, 
++    "devtools/client/storage/test/browser_storage_indexeddb_duplicate_names.js": 4625, 
++    "devtools/client/storage/test/browser_storage_localstorage_add.js": 5140, 
++    "devtools/client/storage/test/browser_storage_localstorage_edit.js": 5565, 
++    "devtools/client/storage/test/browser_storage_overflow.js": 10971, 
++    "devtools/client/storage/test/browser_storage_sessionstorage_add.js": 5173, 
++    "devtools/client/storage/test/browser_storage_sessionstorage_edit.js": 5616, 
++    "devtools/client/storage/test/browser_storage_sidebar.js": 8371, 
++    "devtools/client/storage/test/browser_storage_sidebar_toggle.js": 5668, 
++    "devtools/client/storage/test/browser_storage_values.js": 7964, 
++    "devtools/client/styleeditor/test/browser_styleeditor_autocomplete.js": 4915, 
++    "devtools/client/styleeditor/test/browser_styleeditor_cmd_edit.js": 6954, 
++    "devtools/client/styleeditor/test/browser_styleeditor_fetch-from-cache.js": 5042, 
++    "devtools/client/styleeditor/test/browser_styleeditor_new.js": 4960, 
++    "devtools/client/styleeditor/test/browser_styleeditor_private_perwindowpb.js": 8555, 
++    "devtools/client/styleeditor/test/browser_styleeditor_sourcemap_watching.js": 6086, 
++    "devtools/client/styleeditor/test/browser_styleeditor_sourcemaps.js": 6790, 
+     "devtools/client/styleeditor/test/browser_styleeditor_sync.js": 13270, 
+-    "devtools/client/styleeditor/test/browser_styleeditor_syncAddProperty.js": 7758, 
+-    "devtools/client/styleeditor/test/browser_styleeditor_syncAddRule.js": 8709, 
+-    "devtools/client/styleeditor/test/browser_styleeditor_syncAlreadyOpen.js": 7638, 
+-    "devtools/client/styleeditor/test/browser_styleeditor_syncEditSelector.js": 8106, 
+-    "devtools/client/styleeditor/test/browser_styleeditor_syncIntoRuleView.js": 9904, 
+-    "devtools/client/styleeditor/test/browser_styleeditor_transition_rule.js": 5756, 
+-    "devtools/client/styleinspector/test/browser_computedview_browser-styles.js": 9308, 
+-    "devtools/client/styleinspector/test/browser_computedview_getNodeInfo.js": 5344, 
+-    "devtools/client/styleinspector/test/browser_computedview_keybindings_02.js": 5691, 
+-    "devtools/client/styleinspector/test/browser_computedview_matched-selectors_01.js": 5524, 
+-    "devtools/client/styleinspector/test/browser_computedview_no-results-placeholder.js": 5430, 
+-    "devtools/client/styleinspector/test/browser_computedview_original-source-link.js": 7871, 
+-    "devtools/client/styleinspector/test/browser_computedview_pseudo-element_01.js": 6383, 
+-    "devtools/client/styleinspector/test/browser_computedview_search-filter.js": 7042, 
+-    "devtools/client/styleinspector/test/browser_computedview_search-filter_clear.js": 8809, 
+-    "devtools/client/styleinspector/test/browser_computedview_search-filter_escape-keypress.js": 8739, 
+-    "devtools/client/styleinspector/test/browser_computedview_style-editor-link.js": 8654, 
+-    "devtools/client/styleinspector/test/browser_ruleview_add-property-and-reselect.js": 5882, 
+-    "devtools/client/styleinspector/test/browser_ruleview_add-rule_01.js": 18883, 
+-    "devtools/client/styleinspector/test/browser_ruleview_add-rule_pseudo_class.js": 8081, 
+-    "devtools/client/styleinspector/test/browser_ruleview_authored.js": 19178, 
+-    "devtools/client/styleinspector/test/browser_ruleview_colorUnit.js": 11302, 
+-    "devtools/client/styleinspector/test/browser_ruleview_colorpicker-multiple-changes.js": 6068, 
+-    "devtools/client/styleinspector/test/browser_ruleview_colorpicker-revert-on-ESC.js": 6092, 
+-    "devtools/client/styleinspector/test/browser_ruleview_colorpicker-swatch-displayed.js": 5498, 
+-    "devtools/client/styleinspector/test/browser_ruleview_completion-existing-property_01.js": 11660, 
+-    "devtools/client/styleinspector/test/browser_ruleview_completion-existing-property_02.js": 9026, 
+-    "devtools/client/styleinspector/test/browser_ruleview_completion-new-property_01.js": 7798, 
+-    "devtools/client/styleinspector/test/browser_ruleview_completion-new-property_02.js": 9446, 
+-    "devtools/client/styleinspector/test/browser_ruleview_completion-new-property_03.js": 5361, 
+-    "devtools/client/styleinspector/test/browser_ruleview_context-menu-show-mdn-docs-03.js": 7766, 
+-    "devtools/client/styleinspector/test/browser_ruleview_copy_styles.js": 5640, 
+-    "devtools/client/styleinspector/test/browser_ruleview_custom.js": 5322, 
+-    "devtools/client/styleinspector/test/browser_ruleview_edit-property-increments.js": 8200, 
+-    "devtools/client/styleinspector/test/browser_ruleview_edit-property_01.js": 6699, 
+-    "devtools/client/styleinspector/test/browser_ruleview_edit-property_02.js": 5822, 
+-    "devtools/client/styleinspector/test/browser_ruleview_edit-selector-commit.js": 5572, 
+-    "devtools/client/styleinspector/test/browser_ruleview_edit-selector_02.js": 5687, 
+-    "devtools/client/styleinspector/test/browser_ruleview_editable-field-focus_01.js": 5604, 
+-    "devtools/client/styleinspector/test/browser_ruleview_eyedropper.js": 6120, 
+-    "devtools/client/styleinspector/test/browser_ruleview_guessIndentation.js": 5549, 
+-    "devtools/client/styleinspector/test/browser_ruleview_keyframeLineNumbers.js": 5712, 
+-    "devtools/client/styleinspector/test/browser_ruleview_keyframes-rule_01.js": 6973, 
+-    "devtools/client/styleinspector/test/browser_ruleview_keyframes-rule_02.js": 6314, 
+-    "devtools/client/styleinspector/test/browser_ruleview_livepreview.js": 5638, 
+-    "devtools/client/styleinspector/test/browser_ruleview_original-source-link.js": 6729, 
+-    "devtools/client/styleinspector/test/browser_ruleview_pseudo-element_01.js": 8406, 
+-    "devtools/client/styleinspector/test/browser_ruleview_pseudo-element_02.js": 5555, 
+-    "devtools/client/styleinspector/test/browser_ruleview_pseudo_lock_options.js": 6569, 
+-    "devtools/client/styleinspector/test/browser_ruleview_refresh-on-attribute-change_02.js": 5493, 
+-    "devtools/client/styleinspector/test/browser_ruleview_search-filter-computed-list_01.js": 5896, 
+-    "devtools/client/styleinspector/test/browser_ruleview_search-filter_01.js": 5743, 
+-    "devtools/client/styleinspector/test/browser_ruleview_search-filter_02.js": 5637, 
+-    "devtools/client/styleinspector/test/browser_ruleview_selector_highlight.js": 6914, 
+-    "devtools/client/styleinspector/test/browser_ruleview_strict-search-filter-computed-list_01.js": 6601, 
+-    "devtools/client/styleinspector/test/browser_ruleview_strict-search-filter_01.js": 6464, 
+-    "devtools/client/styleinspector/test/browser_ruleview_style-editor-link.js": 8055, 
+-    "devtools/client/styleinspector/test/browser_ruleview_urls-clickable.js": 6544, 
+-    "devtools/client/styleinspector/test/browser_ruleview_user-agent-styles-uneditable.js": 5538, 
+-    "devtools/client/styleinspector/test/browser_ruleview_user-agent-styles.js": 22345, 
+-    "devtools/client/styleinspector/test/browser_ruleview_user-property-reset.js": 6946, 
+-    "devtools/client/styleinspector/test/browser_styleinspector_context-menu-copy-color_01.js": 13423, 
+-    "devtools/client/styleinspector/test/browser_styleinspector_context-menu-copy-urls.js": 6980, 
+-    "devtools/client/styleinspector/test/browser_styleinspector_csslogic-content-stylesheets.js": 8538, 
+-    "devtools/client/styleinspector/test/browser_styleinspector_refresh_when_active.js": 5648, 
+-    "devtools/client/styleinspector/test/browser_styleinspector_tooltip-background-image.js": 5766, 
+-    "devtools/client/webaudioeditor/test/browser_audionode-actor-connectnode-disconnect.js": 6276, 
+-    "devtools/client/webaudioeditor/test/browser_wa_destroy-node-01.js": 5473, 
+-    "devtools/client/webaudioeditor/test/browser_wa_properties-view-params.js": 5999, 
+-    "devtools/client/webconsole/net/test/mochitest/browser_net_basic.js": 7346, 
+-    "devtools/client/webconsole/net/test/mochitest/browser_net_params.js": 8092, 
+-    "devtools/client/webconsole/net/test/mochitest/browser_net_post.js": 13463, 
+-    "devtools/client/webconsole/net/test/mochitest/browser_net_response.js": 13290, 
+-    "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_batching.js": 12498, 
+-    "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_filters.js": 8292, 
+-    "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_keyboard_accessibility.js": 6584, 
+-    "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_observer_notifications.js": 5927, 
+-    "devtools/client/webconsole/test/browser_bug1045902_console_csp_ignore_reflected_xss_message.js": 6880, 
+-    "devtools/client/webconsole/test/browser_bug_862916_console_dir_and_filter_off.js": 9331, 
+-    "devtools/client/webconsole/test/browser_bug_865871_variables_view_close_on_esc_key.js": 5556, 
+-    "devtools/client/webconsole/test/browser_bug_871156_ctrlw_close_tab.js": 5538, 
+-    "devtools/client/webconsole/test/browser_cached_messages.js": 7807, 
+-    "devtools/client/webconsole/test/browser_console_addonsdk_loader_exception.js": 6250, 
+-    "devtools/client/webconsole/test/browser_console_consolejsm_output.js": 9207, 
+-    "devtools/client/webconsole/test/browser_console_filters.js": 7985, 
+-    "devtools/client/webconsole/test/browser_console_hide_jsterm_when_devtools_chrome_enabled_false.js": 12933, 
+-    "devtools/client/webconsole/test/browser_console_history_persist.js": 14505, 
+-    "devtools/client/webconsole/test/browser_console_iframe_messages.js": 8881, 
+-    "devtools/client/webconsole/test/browser_console_native_getters.js": 12508, 
+-    "devtools/client/webconsole/test/browser_console_nsiconsolemessage.js": 7781, 
+-    "devtools/client/webconsole/test/browser_console_optimized_out_vars.js": 8419, 
+-    "devtools/client/webconsole/test/browser_console_private_browsing.js": 13385, 
++    "devtools/client/styleeditor/test/browser_styleeditor_syncAddProperty.js": 6001, 
++    "devtools/client/styleeditor/test/browser_styleeditor_syncAddRule.js": 6052, 
++    "devtools/client/styleeditor/test/browser_styleeditor_syncAlreadyOpen.js": 6090, 
++    "devtools/client/styleeditor/test/browser_styleeditor_syncEditSelector.js": 5715, 
++    "devtools/client/styleeditor/test/browser_styleeditor_syncIntoRuleView.js": 7828, 
++    "devtools/client/webaudioeditor/test/browser_audionode-actor-connectnode-disconnect.js": 5015, 
++    "devtools/client/webaudioeditor/test/browser_wa_destroy-node-01.js": 4842, 
++    "devtools/client/webconsole/net/test/mochitest/browser_net_post.js": 6853, 
++    "devtools/client/webconsole/net/test/mochitest/browser_net_response.js": 9220, 
++    "devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/browser_webconsole_check_stubs_console_api.js": 6083, 
++    "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_batching.js": 7183, 
++    "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_filters.js": 5547, 
++    "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_filters_persist.js": 9387, 
++    "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_location_debugger_link.js": 5895, 
++    "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_location_scratchpad_link.js": 5607, 
++    "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_location_styleeditor_link.js": 5394, 
++    "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_nodes_select.js": 5829, 
++    "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_object_inspector_entries.js": 4757, 
++    "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_scroll.js": 5061, 
++    "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_sourcemap_error.js": 5280, 
++    "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_sourcemap_nosource.js": 6324, 
++    "devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_warn_about_replaced_api.js": 6853, 
++    "devtools/client/webconsole/test/browser_bug_862916_console_dir_and_filter_off.js": 4852, 
++    "devtools/client/webconsole/test/browser_cached_messages.js": 5727, 
++    "devtools/client/webconsole/test/browser_console_filters.js": 5481, 
++    "devtools/client/webconsole/test/browser_console_hide_jsterm_when_devtools_chrome_enabled_false.js": 10031, 
++    "devtools/client/webconsole/test/browser_console_history_persist.js": 7948, 
++    "devtools/client/webconsole/test/browser_console_iframe_messages.js": 6600, 
++    "devtools/client/webconsole/test/browser_console_native_getters.js": 7380, 
++    "devtools/client/webconsole/test/browser_console_nsiconsolemessage.js": 4984, 
++    "devtools/client/webconsole/test/browser_console_optimized_out_vars.js": 6229, 
++    "devtools/client/webconsole/test/browser_console_private_browsing.js": 8996, 
+     "devtools/client/webconsole/test/browser_console_server_logging.js": 6682, 
+-    "devtools/client/webconsole/test/browser_console_variables_view.js": 5339, 
+-    "devtools/client/webconsole/test/browser_console_variables_view_dom_nodes.js": 5462, 
+-    "devtools/client/webconsole/test/browser_console_variables_view_dont_sort_non_sortable_classes_properties.js": 8928, 
+-    "devtools/client/webconsole/test/browser_console_variables_view_highlighter.js": 13896, 
+-    "devtools/client/webconsole/test/browser_console_variables_view_while_debugging.js": 6877, 
+-    "devtools/client/webconsole/test/browser_console_variables_view_while_debugging_and_inspecting.js": 10341, 
+-    "devtools/client/webconsole/test/browser_eval_in_debugger_stackframe.js": 8646, 
+-    "devtools/client/webconsole/test/browser_eval_in_debugger_stackframe2.js": 6504, 
+-    "devtools/client/webconsole/test/browser_jsterm_inspect.js": 12313, 
+-    "devtools/client/webconsole/test/browser_warn_user_about_replaced_api.js": 9617, 
+-    "devtools/client/webconsole/test/browser_webconsole_autocomplete_crossdomain_iframe.js": 6194, 
+-    "devtools/client/webconsole/test/browser_webconsole_autocomplete_in_debugger_stackframe.js": 7078, 
+-    "devtools/client/webconsole/test/browser_webconsole_bug_1050691_click_function_to_source.js": 5872, 
+-    "devtools/client/webconsole/test/browser_webconsole_bug_593003_iframe_wrong_hud.js": 11213, 
+-    "devtools/client/webconsole/test/browser_webconsole_bug_595350_multiple_windows_and_tabs.js": 12443, 
+-    "devtools/client/webconsole/test/browser_webconsole_bug_595934_message_categories.js": 11733, 
+-    "devtools/client/webconsole/test/browser_webconsole_bug_597103_deactivateHUDForContext_unfocused_window.js": 10313, 
+-    "devtools/client/webconsole/test/browser_webconsole_bug_597460_filter_scroll.js": 7099, 
+-    "devtools/client/webconsole/test/browser_webconsole_bug_597756_reopen_closed_tab.js": 8357, 
+-    "devtools/client/webconsole/test/browser_webconsole_bug_613642_maintain_scroll.js": 6186, 
+-    "devtools/client/webconsole/test/browser_webconsole_bug_613642_prune_scroll.js": 6212, 
+-    "devtools/client/webconsole/test/browser_webconsole_bug_614793_jsterm_scroll.js": 9602, 
+-    "devtools/client/webconsole/test/browser_webconsole_bug_622303_persistent_filters.js": 11251, 
+-    "devtools/client/webconsole/test/browser_webconsole_bug_632275_getters_document_width.js": 6846, 
+-    "devtools/client/webconsole/test/browser_webconsole_bug_644419_log_limits.js": 5670, 
+-    "devtools/client/webconsole/test/browser_webconsole_bug_658368_time_methods.js": 6592, 
+-    "devtools/client/webconsole/test/browser_webconsole_bug_659907_console_dir.js": 8414, 
+-    "devtools/client/webconsole/test/browser_webconsole_bug_752559_ineffective_iframe_sandbox_warning.js": 23971, 
+-    "devtools/client/webconsole/test/browser_webconsole_bug_766001_JS_Console_in_Debugger.js": 13530, 
+-    "devtools/client/webconsole/test/browser_webconsole_bug_782653_CSS_links_in_Style_Editor.js": 7014, 
+-    "devtools/client/webconsole/test/browser_webconsole_cached_autocomplete.js": 5787, 
+-    "devtools/client/webconsole/test/browser_webconsole_cd_iframe.js": 8071, 
+-    "devtools/client/webconsole/test/browser_webconsole_certificate_messages.js": 5450, 
+-    "devtools/client/webconsole/test/browser_webconsole_clear_method.js": 6906, 
+-    "devtools/client/webconsole/test/browser_webconsole_clickable_urls.js": 13224, 
+-    "devtools/client/webconsole/test/browser_webconsole_closure_inspection.js": 12893, 
+-    "devtools/client/webconsole/test/browser_webconsole_console_logging_api.js": 5561, 
+-    "devtools/client/webconsole/test/browser_webconsole_console_trace_duplicates.js": 5518, 
+-    "devtools/client/webconsole/test/browser_webconsole_count.js": 5331, 
+-    "devtools/client/webconsole/test/browser_webconsole_hpkp_invalid-headers.js": 7124, 
+-    "devtools/client/webconsole/test/browser_webconsole_hsts_invalid-headers.js": 6108, 
+-    "devtools/client/webconsole/test/browser_webconsole_input_field_focus_on_panel_select.js": 6674, 
+-    "devtools/client/webconsole/test/browser_webconsole_inspect-parsed-documents.js": 5971, 
+-    "devtools/client/webconsole/test/browser_webconsole_jsterm.js": 6336, 
+-    "devtools/client/webconsole/test/browser_webconsole_live_filtering_on_search_strings.js": 5593, 
++    "devtools/client/webconsole/test/browser_console_variables_view_dom_nodes.js": 4965, 
++    "devtools/client/webconsole/test/browser_console_variables_view_dont_sort_non_sortable_classes_properties.js": 6534, 
++    "devtools/client/webconsole/test/browser_console_variables_view_highlighter.js": 15021, 
++    "devtools/client/webconsole/test/browser_console_variables_view_while_debugging_and_inspecting.js": 6418, 
++    "devtools/client/webconsole/test/browser_eval_in_debugger_stackframe.js": 7408, 
++    "devtools/client/webconsole/test/browser_jsterm_inspect.js": 7508, 
++    "devtools/client/webconsole/test/browser_warn_user_about_replaced_api.js": 6415, 
++    "devtools/client/webconsole/test/browser_webconsole_autocomplete_crossdomain_iframe.js": 4634, 
++    "devtools/client/webconsole/test/browser_webconsole_autocomplete_in_debugger_stackframe.js": 4644, 
++    "devtools/client/webconsole/test/browser_webconsole_bug_593003_iframe_wrong_hud.js": 8906, 
++    "devtools/client/webconsole/test/browser_webconsole_bug_595350_multiple_windows_and_tabs.js": 6850, 
++    "devtools/client/webconsole/test/browser_webconsole_bug_595934_message_categories.js": 9213, 
++    "devtools/client/webconsole/test/browser_webconsole_bug_597103_deactivateHUDForContext_unfocused_window.js": 8038, 
++    "devtools/client/webconsole/test/browser_webconsole_bug_597756_reopen_closed_tab.js": 5957, 
++    "devtools/client/webconsole/test/browser_webconsole_bug_613642_maintain_scroll.js": 4806, 
++    "devtools/client/webconsole/test/browser_webconsole_bug_613642_prune_scroll.js": 4955, 
++    "devtools/client/webconsole/test/browser_webconsole_bug_614793_jsterm_scroll.js": 5859, 
++    "devtools/client/webconsole/test/browser_webconsole_bug_622303_persistent_filters.js": 7488, 
++    "devtools/client/webconsole/test/browser_webconsole_bug_632275_getters_document_width.js": 4845, 
++    "devtools/client/webconsole/test/browser_webconsole_bug_659907_console_dir.js": 5619, 
++    "devtools/client/webconsole/test/browser_webconsole_bug_752559_ineffective_iframe_sandbox_warning.js": 15571, 
++    "devtools/client/webconsole/test/browser_webconsole_bug_766001_JS_Console_in_Debugger.js": 10938, 
++    "devtools/client/webconsole/test/browser_webconsole_cd_iframe.js": 5996, 
++    "devtools/client/webconsole/test/browser_webconsole_clear_method.js": 4662, 
++    "devtools/client/webconsole/test/browser_webconsole_clickable_urls.js": 7804, 
++    "devtools/client/webconsole/test/browser_webconsole_closure_inspection.js": 10136, 
+     "devtools/client/webconsole/test/browser_webconsole_netlogging.js": 20548, 
+-    "devtools/client/webconsole/test/browser_webconsole_netlogging_reset_filter.js": 5984, 
+-    "devtools/client/webconsole/test/browser_webconsole_open-links-without-callback.js": 5544, 
+-    "devtools/client/webconsole/test/browser_webconsole_output_01.js": 8287, 
+-    "devtools/client/webconsole/test/browser_webconsole_output_02.js": 12091, 
+-    "devtools/client/webconsole/test/browser_webconsole_output_03.js": 10914, 
+-    "devtools/client/webconsole/test/browser_webconsole_output_04.js": 9597, 
+-    "devtools/client/webconsole/test/browser_webconsole_output_05.js": 10954, 
+-    "devtools/client/webconsole/test/browser_webconsole_output_06.js": 16496, 
+-    "devtools/client/webconsole/test/browser_webconsole_output_dom_elements_01.js": 9101, 
+-    "devtools/client/webconsole/test/browser_webconsole_output_dom_elements_02.js": 15394, 
+-    "devtools/client/webconsole/test/browser_webconsole_output_dom_elements_03.js": 8259, 
+-    "devtools/client/webconsole/test/browser_webconsole_output_dom_elements_04.js": 12485, 
+-    "devtools/client/webconsole/test/browser_webconsole_output_dom_elements_05.js": 11204, 
+-    "devtools/client/webconsole/test/browser_webconsole_output_table.js": 5661, 
+-    "devtools/client/webconsole/test/browser_webconsole_shows_reqs_in_netmonitor.js": 5527, 
+-    "devtools/client/webconsole/test/browser_webconsole_split.js": 23370, 
+-    "devtools/client/webconsole/test/browser_webconsole_split_escape_key.js": 8298, 
+-    "devtools/client/webconsole/test/browser_webconsole_split_focus.js": 7356, 
+-    "devtools/client/webconsole/test/browser_webconsole_split_persist.js": 17739, 
+-    "devtools/client/webconsole/test/browser_webconsole_view_source.js": 12130, 
+-    "devtools/client/webide/test/browser_tabs.js": 10262, 
+-    "devtools/server/tests/browser/browser_markers-cycle-collection.js": 7846, 
+-    "devtools/server/tests/browser/browser_storage_dynamic_windows.js": 6285, 
+-    "devtools/server/tests/browser/browser_storage_listings.js": 6592, 
+-    "devtools/server/tests/browser/browser_webextension_inspected_window.js": 10884
++    "devtools/client/webconsole/test/browser_webconsole_open-links-without-callback.js": 4860, 
++    "devtools/client/webconsole/test/browser_webconsole_output_01.js": 6168, 
++    "devtools/client/webconsole/test/browser_webconsole_output_02.js": 8660, 
++    "devtools/client/webconsole/test/browser_webconsole_output_03.js": 7693, 
++    "devtools/client/webconsole/test/browser_webconsole_output_04.js": 6705, 
++    "devtools/client/webconsole/test/browser_webconsole_output_05.js": 8054, 
++    "devtools/client/webconsole/test/browser_webconsole_output_06.js": 12333, 
++    "devtools/client/webconsole/test/browser_webconsole_output_dom_elements_01.js": 5889, 
++    "devtools/client/webconsole/test/browser_webconsole_output_dom_elements_02.js": 11649, 
++    "devtools/client/webconsole/test/browser_webconsole_output_dom_elements_03.js": 5047, 
++    "devtools/client/webconsole/test/browser_webconsole_output_dom_elements_04.js": 8622, 
++    "devtools/client/webconsole/test/browser_webconsole_output_dom_elements_05.js": 8407, 
++    "devtools/client/webconsole/test/browser_webconsole_split.js": 17554, 
++    "devtools/client/webconsole/test/browser_webconsole_split_escape_key.js": 5579, 
++    "devtools/client/webconsole/test/browser_webconsole_split_focus.js": 4700, 
++    "devtools/client/webconsole/test/browser_webconsole_split_persist.js": 12517, 
++    "devtools/client/webconsole/test/browser_webconsole_view_source.js": 7309, 
++    "devtools/server/tests/browser/browser_markers-cycle-collection.js": 13330, 
++    "devtools/server/tests/browser/browser_storage_cookies-duplicate-names.js": 6196, 
++    "devtools/server/tests/browser/browser_storage_dynamic_windows.js": 4992, 
++    "devtools/server/tests/browser/browser_storage_listings.js": 4871, 
++    "devtools/server/tests/browser/browser_webextension_inspected_window.js": 6198
+   }
+ }
+\ No newline at end of file
+diff --git a/testing/runtimes/mochitest-media-e10s.runtimes.json b/testing/runtimes/mochitest-media-e10s.runtimes.json
+--- a/testing/runtimes/mochitest-media-e10s.runtimes.json
++++ b/testing/runtimes/mochitest-media-e10s.runtimes.json
+@@ -1,318 +1,337 @@
+ {
+-  "excluded_test_average": 584, 
++  "excluded_test_average": 497, 
+   "runtimes": {
+-    "Main app process exited normally": 341984, 
+-    "dom/media/mediasource/test/test_AudioChange_mp4.html": 9348, 
+-    "dom/media/mediasource/test/test_BufferedSeek_mp4.html": 2356, 
+-    "dom/media/mediasource/test/test_BufferingWait.html": 4700, 
+-    "dom/media/mediasource/test/test_BufferingWait_mp4.html": 6328, 
+-    "dom/media/mediasource/test/test_DrainOnMissingData_mp4.html": 1927, 
+-    "dom/media/mediasource/test/test_Eviction_mp4.html": 2337, 
++    "Main app process exited normally": 15321, 
++    "dom/media/mediasource/test/test_AVC3_mp4.html": 6679, 
++    "dom/media/mediasource/test/test_AudioChange_mp4.html": 7596, 
++    "dom/media/mediasource/test/test_BufferingWait.html": 4461, 
++    "dom/media/mediasource/test/test_BufferingWait_mp4.html": 5711, 
++    "dom/media/mediasource/test/test_ChangeWhileWaitingOnMissingData_mp4.html": 4922, 
++    "dom/media/mediasource/test/test_DrainOnMissingData_mp4.html": 1314, 
+     "dom/media/mediasource/test/test_FrameSelection_mp4.html": 3445, 
+-    "dom/media/mediasource/test/test_HaveMetadataUnbufferedSeek.html": 2302, 
+-    "dom/media/mediasource/test/test_HaveMetadataUnbufferedSeek_mp4.html": 1878, 
+-    "dom/media/mediasource/test/test_LoadedDataFired_mp4.html": 1969, 
+     "dom/media/mediasource/test/test_MediaSource.html": 4656, 
+-    "dom/media/mediasource/test/test_MediaSource_memory_reporting.html": 3949, 
+-    "dom/media/mediasource/test/test_MediaSource_mp4.html": 2821, 
+-    "dom/media/mediasource/test/test_PlayEvents.html": 6231, 
+-    "dom/media/mediasource/test/test_ResumeAfterClearing_mp4.html": 5251, 
+-    "dom/media/mediasource/test/test_SeekNoData_mp4.html": 4373, 
+-    "dom/media/mediasource/test/test_SeekToEnd_mp4.html": 2081, 
+-    "dom/media/mediasource/test/test_SeekTwice_mp4.html": 6168, 
++    "dom/media/mediasource/test/test_MediaSource_flac_mp4.html": 10400, 
++    "dom/media/mediasource/test/test_MediaSource_memory_reporting.html": 4547, 
++    "dom/media/mediasource/test/test_MediaSource_mp4.html": 2633, 
++    "dom/media/mediasource/test/test_PlayEvents.html": 4377, 
++    "dom/media/mediasource/test/test_PlayEventsAutoPlaying.html": 1997, 
++    "dom/media/mediasource/test/test_ResumeAfterClearing_mp4.html": 3860, 
++    "dom/media/mediasource/test/test_SeekNoData_mp4.html": 3929, 
++    "dom/media/mediasource/test/test_SeekToEnd_mp4.html": 1654, 
++    "dom/media/mediasource/test/test_SeekToLastFrame_mp4.html": 1287, 
++    "dom/media/mediasource/test/test_SeekTwice_mp4.html": 5601, 
+     "dom/media/mediasource/test/test_SplitAppend.html": 4647, 
+     "dom/media/mediasource/test/test_SplitAppendDelay.html": 5661, 
+     "dom/media/mediasource/test/test_SplitAppendDelay_mp4.html": 3808, 
+     "dom/media/mediasource/test/test_SplitAppend_mp4.html": 2641, 
+-    "dom/media/mediasource/test/test_Threshold_mp4.html": 11771, 
++    "dom/media/mediasource/test/test_Threshold_mp4.html": 11165, 
+     "dom/media/mediasource/test/test_TimestampOffset_mp4.html": 9424, 
+     "dom/media/mediasource/test/test_WaitingOnMissingData.html": 4579, 
+-    "dom/media/mediasource/test/test_WaitingOnMissingDataEnded_mp4.html": 4149, 
++    "dom/media/mediasource/test/test_WaitingOnMissingDataEnded_mp4.html": 3818, 
+     "dom/media/mediasource/test/test_WaitingOnMissingData_mp4.html": 12654, 
+-    "dom/media/mediasource/test/test_WaitingToEndedTransition_mp4.html": 5452, 
+-    "dom/media/test/test_VideoPlaybackQuality.html": 6425, 
+-    "dom/media/test/test_access_control.html": 7205, 
+-    "dom/media/test/test_aspectratio_mp4.html": 2482, 
+-    "dom/media/test/test_audio1.html": 1667, 
+-    "dom/media/test/test_autoplay_contentEditable.html": 3051, 
+-    "dom/media/test/test_background_video_no_suspend_disabled.html": 16282, 
++    "dom/media/mediasource/test/test_WaitingToEndedTransition_mp4.html": 5780, 
++    "dom/media/test/test_VideoPlaybackQuality.html": 5925, 
++    "dom/media/test/test_access_control.html": 6493, 
++    "dom/media/test/test_audio1.html": 1266, 
++    "dom/media/test/test_autoplay_contentEditable.html": 2073, 
++    "dom/media/test/test_background_video_cancel_suspend_taint.html": 2948, 
++    "dom/media/test/test_background_video_drawimage_with_suspended_video.html": 3043, 
++    "dom/media/test/test_background_video_ended_event.html": 19667, 
++    "dom/media/test/test_background_video_no_suspend_disabled.html": 13913, 
++    "dom/media/test/test_background_video_no_suspend_not_in_tree.html": 13713, 
+     "dom/media/test/test_background_video_no_suspend_short_vid.html": 14338, 
+-    "dom/media/test/test_background_video_suspend.html": 15367, 
++    "dom/media/test/test_background_video_resume_after_end_show_last_frame.html": 18543, 
++    "dom/media/test/test_background_video_suspend.html": 12970, 
+     "dom/media/test/test_background_video_suspend_ends.html": 14220, 
+-    "dom/media/test/test_buffered.html": 5602, 
+-    "dom/media/test/test_bug1018933.html": 1479, 
++    "dom/media/test/test_background_video_tainted_by_capturestream.html": 11214, 
++    "dom/media/test/test_background_video_tainted_by_createimagebitmap.html": 14021, 
++    "dom/media/test/test_background_video_tainted_by_drawimage.html": 13893, 
++    "dom/media/test/test_buffered.html": 2899, 
+     "dom/media/test/test_bug1113600.html": 11019, 
+-    "dom/media/test/test_bug1242338.html": 4338, 
+-    "dom/media/test/test_bug448534.html": 2217, 
+-    "dom/media/test/test_bug465498.html": 9813, 
++    "dom/media/test/test_bug1242338.html": 3128, 
++    "dom/media/test/test_bug448534.html": 1435, 
++    "dom/media/test/test_bug465498.html": 10377, 
+     "dom/media/test/test_bug495145.html": 21199, 
+-    "dom/media/test/test_bug495300.html": 4116, 
+-    "dom/media/test/test_bug686942.html": 6173, 
+-    "dom/media/test/test_bug874897.html": 2604, 
+-    "dom/media/test/test_bug879717.html": 2941, 
+-    "dom/media/test/test_bug895091.html": 2461, 
++    "dom/media/test/test_bug495300.html": 2900, 
++    "dom/media/test/test_bug686942.html": 5047, 
++    "dom/media/test/test_bug874897.html": 1870, 
++    "dom/media/test/test_bug879717.html": 2137, 
++    "dom/media/test/test_bug895091.html": 1413, 
+     "dom/media/test/test_chaining.html": 14415, 
+-    "dom/media/test/test_clone_media_element.html": 22705, 
+-    "dom/media/test/test_closing_connections.html": 5233, 
+-    "dom/media/test/test_cueless_webm_seek-1.html": 3060, 
+-    "dom/media/test/test_cueless_webm_seek-2.html": 2980, 
+-    "dom/media/test/test_delay_load.html": 2135, 
+-    "dom/media/test/test_dormant_playback.html": 3139, 
+-    "dom/media/test/test_eme_canvas_blocked.html": 7431, 
+-    "dom/media/test/test_eme_non_mse_fails.html": 1458, 
+-    "dom/media/test/test_eme_playback.html": 34730, 
+-    "dom/media/test/test_eme_request_notifications.html": 1392, 
+-    "dom/media/test/test_eme_stream_capture_blocked_case1.html": 6058, 
+-    "dom/media/test/test_eme_stream_capture_blocked_case2.html": 7110, 
+-    "dom/media/test/test_eme_stream_capture_blocked_case3.html": 6720, 
++    "dom/media/test/test_clone_media_element.html": 24368, 
++    "dom/media/test/test_closing_connections.html": 3348, 
++    "dom/media/test/test_cueless_webm_seek-1.html": 2822, 
++    "dom/media/test/test_cueless_webm_seek-2.html": 2777, 
++    "dom/media/test/test_delay_load.html": 3204, 
++    "dom/media/test/test_eme_autoplay.html": 1318, 
++    "dom/media/test/test_eme_canvas_blocked.html": 8304, 
++    "dom/media/test/test_eme_non_mse_fails.html": 1569, 
++    "dom/media/test/test_eme_playback.html": 30576, 
++    "dom/media/test/test_eme_pssh_in_moof.html": 4354, 
++    "dom/media/test/test_eme_sample_groups_playback.html": 2031, 
++    "dom/media/test/test_eme_stream_capture_blocked_case1.html": 7893, 
++    "dom/media/test/test_eme_stream_capture_blocked_case2.html": 9442, 
++    "dom/media/test/test_eme_stream_capture_blocked_case3.html": 11344, 
+     "dom/media/test/test_eme_waitingforkey.html": 33190, 
+-    "dom/media/test/test_fastSeek-forwards.html": 2112, 
+-    "dom/media/test/test_fastSeek.html": 2315, 
+-    "dom/media/test/test_fragment_noplay.html": 11859, 
++    "dom/media/test/test_fastSeek-forwards.html": 1803, 
++    "dom/media/test/test_fastSeek.html": 1813, 
++    "dom/media/test/test_fragment_noplay.html": 9672, 
+     "dom/media/test/test_fragment_play.html": 74338, 
+-    "dom/media/test/test_info_leak.html": 8174, 
++    "dom/media/test/test_info_leak.html": 8606, 
+     "dom/media/test/test_load.html": 11141, 
+-    "dom/media/test/test_load_candidates.html": 2499, 
+-    "dom/media/test/test_load_same_resource.html": 2874, 
++    "dom/media/test/test_load_candidates.html": 2270, 
+     "dom/media/test/test_load_source.html": 3867, 
+     "dom/media/test/test_loop.html": 22891, 
+-    "dom/media/test/test_media_selection.html": 10305, 
+-    "dom/media/test/test_media_sniffer.html": 5052, 
+-    "dom/media/test/test_mediarecorder_bitrate.html": 2289, 
+-    "dom/media/test/test_mediarecorder_principals.html": 2315, 
+-    "dom/media/test/test_mediarecorder_record_4ch_audiocontext.html": 1445, 
+-    "dom/media/test/test_mediarecorder_record_audiocontext.html": 1362, 
+-    "dom/media/test/test_mediarecorder_record_audionode.html": 1819, 
+-    "dom/media/test/test_mediarecorder_record_changing_video_resolution.html": 1645, 
++    "dom/media/test/test_media_selection.html": 9091, 
++    "dom/media/test/test_media_sniffer.html": 4014, 
++    "dom/media/test/test_mediarecorder_pause_resume_video.html": 4152, 
++    "dom/media/test/test_mediarecorder_playback_can_repeat.html": 2223, 
++    "dom/media/test/test_mediarecorder_principals.html": 4960, 
++    "dom/media/test/test_mediarecorder_record_4ch_audiocontext.html": 1669, 
++    "dom/media/test/test_mediarecorder_record_addtracked_stream.html": 24025, 
++    "dom/media/test/test_mediarecorder_record_audiocontext.html": 1264, 
++    "dom/media/test/test_mediarecorder_record_audionode.html": 1699, 
++    "dom/media/test/test_mediarecorder_record_startstopstart.html": 1370, 
+     "dom/media/test/test_mediatrack_consuming_mediaresource.html": 7957, 
+-    "dom/media/test/test_mediatrack_replay_from_end.html": 8597, 
+-    "dom/media/test/test_metadata.html": 2651, 
++    "dom/media/test/test_mediatrack_replay_from_end.html": 8026, 
++    "dom/media/test/test_metadata.html": 2239, 
+     "dom/media/test/test_mixed_principals.html": 29107, 
+-    "dom/media/test/test_mozHasAudio.html": 1452, 
++    "dom/media/test/test_mozHasAudio.html": 1340, 
+     "dom/media/test/test_new_audio.html": 5731, 
+     "dom/media/test/test_paused_after_ended.html": 9715, 
+     "dom/media/test/test_play_events.html": 9588, 
+     "dom/media/test/test_play_events_2.html": 9558, 
+-    "dom/media/test/test_play_promise_1.html": 1939, 
+-    "dom/media/test/test_play_promise_12.html": 2432, 
+-    "dom/media/test/test_play_promise_13.html": 2214, 
+-    "dom/media/test/test_play_promise_14.html": 2287, 
++    "dom/media/test/test_play_promise_1.html": 1582, 
++    "dom/media/test/test_play_promise_12.html": 2167, 
++    "dom/media/test/test_play_promise_13.html": 1933, 
++    "dom/media/test/test_play_promise_14.html": 1890, 
+     "dom/media/test/test_play_promise_16.html": 2615, 
+-    "dom/media/test/test_play_promise_18.html": 2366, 
+-    "dom/media/test/test_play_promise_2.html": 1919, 
+-    "dom/media/test/test_play_promise_3.html": 1947, 
++    "dom/media/test/test_play_promise_18.html": 2122, 
++    "dom/media/test/test_play_promise_2.html": 1633, 
++    "dom/media/test/test_play_promise_3.html": 1723, 
+     "dom/media/test/test_play_promise_6.html": 2308, 
+-    "dom/media/test/test_play_promise_7.html": 1491, 
++    "dom/media/test/test_play_promise_7.html": 1620, 
+     "dom/media/test/test_play_promise_8.html": 1750, 
+     "dom/media/test/test_play_twice.html": 16766, 
+     "dom/media/test/test_playback.html": 89110, 
+     "dom/media/test/test_playback_errors.html": 1725, 
+-    "dom/media/test/test_playback_rate.html": 8757, 
++    "dom/media/test/test_playback_rate.html": 26431, 
+     "dom/media/test/test_playback_rate_playpause.html": 2986, 
+     "dom/media/test/test_playback_reactivate.html": 21458, 
+     "dom/media/test/test_played.html": 21013, 
+-    "dom/media/test/test_preload_actions.html": 30330, 
+-    "dom/media/test/test_preload_suspend.html": 2815, 
+-    "dom/media/test/test_progress.html": 4194, 
+-    "dom/media/test/test_reactivate.html": 3672, 
++    "dom/media/test/test_preload_actions.html": 33723, 
++    "dom/media/test/test_preload_suspend.html": 2498, 
++    "dom/media/test/test_progress.html": 3694, 
+     "dom/media/test/test_replay_metadata.html": 16567, 
+-    "dom/media/test/test_reset_src.html": 15540, 
++    "dom/media/test/test_reset_src.html": 14733, 
+     "dom/media/test/test_resolution_change.html": 7130, 
+     "dom/media/test/test_seek-1.html": 13681, 
+-    "dom/media/test/test_seek-10.html": 4243, 
+-    "dom/media/test/test_seek-11.html": 3966, 
+-    "dom/media/test/test_seek-12.html": 3728, 
+-    "dom/media/test/test_seek-13.html": 3898, 
+-    "dom/media/test/test_seek-14.html": 7487, 
++    "dom/media/test/test_seek-10.html": 3746, 
++    "dom/media/test/test_seek-11.html": 3320, 
++    "dom/media/test/test_seek-12.html": 3213, 
++    "dom/media/test/test_seek-13.html": 3314, 
++    "dom/media/test/test_seek-14.html": 6967, 
+     "dom/media/test/test_seek-2.html": 24471, 
+-    "dom/media/test/test_seek-3.html": 3703, 
+-    "dom/media/test/test_seek-4.html": 3583, 
++    "dom/media/test/test_seek-3.html": 3339, 
++    "dom/media/test/test_seek-4.html": 3162, 
+     "dom/media/test/test_seek-5.html": 13449, 
+-    "dom/media/test/test_seek-6.html": 4197, 
+-    "dom/media/test/test_seek-7.html": 3261, 
+-    "dom/media/test/test_seek-8.html": 3768, 
+-    "dom/media/test/test_seek-9.html": 3399, 
+-    "dom/media/test/test_seekToNextFrame.html": 15135, 
+-    "dom/media/test/test_seek_negative.html": 10131, 
++    "dom/media/test/test_seek-6.html": 3486, 
++    "dom/media/test/test_seek-7.html": 2875, 
++    "dom/media/test/test_seek-8.html": 3283, 
++    "dom/media/test/test_seek-9.html": 2994, 
++    "dom/media/test/test_seekToNextFrame.html": 20048, 
++    "dom/media/test/test_seek_negative.html": 11081, 
+     "dom/media/test/test_seek_out_of_range.html": 10572, 
++    "dom/media/test/test_seek_promise_bug1344357.html": 6756, 
+     "dom/media/test/test_seekable1.html": 2000, 
+-    "dom/media/test/test_streams_gc.html": 1411, 
+-    "dom/media/test/test_streams_tracks.html": 5981, 
+-    "dom/media/test/test_texttrackcue.html": 5136, 
++    "dom/media/test/test_streams_element_capture_createObjectURL.html": 1189, 
++    "dom/media/test/test_streams_gc.html": 1831, 
++    "dom/media/test/test_streams_tracks.html": 5560, 
++    "dom/media/test/test_temporary_file_blob_video_plays.html": 1177, 
++    "dom/media/test/test_texttrackcue.html": 4781, 
+     "dom/media/test/test_texttrackevents_video.html": 9504, 
+-    "dom/media/test/test_timeupdate_small_files.html": 12465, 
+-    "dom/media/test/test_trackelementevent.html": 1785, 
+-    "dom/media/test/test_trackelementsrc.html": 4665, 
+-    "dom/media/test/test_video_dimensions.html": 1815, 
+-    "dom/media/test/test_video_in_audio_element.html": 3241, 
+-    "dom/media/test/test_video_to_canvas.html": 3690, 
+-    "dom/media/test/test_webvtt_empty_displaystate.html": 1750, 
++    "dom/media/test/test_timeupdate_small_files.html": 13290, 
++    "dom/media/test/test_trackelementsrc.html": 4341, 
++    "dom/media/test/test_videoPlaybackQuality_totalFrames.html": 8348, 
++    "dom/media/test/test_video_dimensions.html": 1292, 
++    "dom/media/test/test_video_gzip_encoding.html": 1509, 
++    "dom/media/test/test_video_in_audio_element.html": 1766, 
++    "dom/media/test/test_video_stats_resistfingerprinting.html": 7844, 
++    "dom/media/test/test_video_to_canvas.html": 2136, 
++    "dom/media/test/test_webvtt_empty_displaystate.html": 2557, 
++    "dom/media/test/test_webvtt_event_same_time.html": 2254, 
+     "dom/media/tests/mochitest/identity/test_fingerprints.html": 1762, 
+-    "dom/media/tests/mochitest/identity/test_getIdentityAssertion.html": 1344, 
+-    "dom/media/tests/mochitest/identity/test_loginNeeded.html": 2365, 
+-    "dom/media/tests/mochitest/identity/test_peerConnection_asymmetricIsolation.html": 6473, 
+-    "dom/media/tests/mochitest/identity/test_peerConnection_peerIdentity.html": 7710, 
+-    "dom/media/tests/mochitest/identity/test_setIdentityProvider.html": 6310, 
+-    "dom/media/tests/mochitest/identity/test_setIdentityProviderWithErrors.html": 6057, 
+-    "dom/media/tests/mochitest/test_a_noOp.html": 2515, 
+-    "dom/media/tests/mochitest/test_dataChannel_basicAudio.html": 5865, 
+-    "dom/media/tests/mochitest/test_dataChannel_basicAudioVideo.html": 7423, 
+-    "dom/media/tests/mochitest/test_dataChannel_basicAudioVideoCombined.html": 8060, 
+-    "dom/media/tests/mochitest/test_dataChannel_basicAudioVideoNoBundle.html": 8549, 
+-    "dom/media/tests/mochitest/test_dataChannel_basicDataOnly.html": 1500, 
+-    "dom/media/tests/mochitest/test_dataChannel_basicVideo.html": 4804, 
+-    "dom/media/tests/mochitest/test_dataChannel_bug1013809.html": 4822, 
+-    "dom/media/tests/mochitest/test_enumerateDevices.html": 3023, 
+-    "dom/media/tests/mochitest/test_getUserMedia_addTrackRemoveTrack.html": 11104, 
+-    "dom/media/tests/mochitest/test_getUserMedia_audioCapture.html": 3307, 
+-    "dom/media/tests/mochitest/test_getUserMedia_basicScreenshare.html": 2731, 
+-    "dom/media/tests/mochitest/test_getUserMedia_basicVideo_playAfterLoadedmetadata.html": 2495, 
++    "dom/media/tests/mochitest/identity/test_getIdentityAssertion.html": 1427, 
++    "dom/media/tests/mochitest/identity/test_loginNeeded.html": 2593, 
++    "dom/media/tests/mochitest/identity/test_peerConnection_asymmetricIsolation.html": 5048, 
++    "dom/media/tests/mochitest/identity/test_peerConnection_peerIdentity.html": 5466, 
++    "dom/media/tests/mochitest/identity/test_setIdentityProvider.html": 4459, 
++    "dom/media/tests/mochitest/identity/test_setIdentityProviderWithErrors.html": 4331, 
++    "dom/media/tests/mochitest/test_a_noOp.html": 2191, 
++    "dom/media/tests/mochitest/test_dataChannel_basicAudio.html": 4939, 
++    "dom/media/tests/mochitest/test_dataChannel_basicAudioVideo.html": 5347, 
++    "dom/media/tests/mochitest/test_dataChannel_basicAudioVideoCombined.html": 4811, 
++    "dom/media/tests/mochitest/test_dataChannel_basicAudioVideoNoBundle.html": 4818, 
++    "dom/media/tests/mochitest/test_dataChannel_basicDataOnly.html": 1349, 
++    "dom/media/tests/mochitest/test_dataChannel_basicVideo.html": 2319, 
++    "dom/media/tests/mochitest/test_dataChannel_bug1013809.html": 4078, 
++    "dom/media/tests/mochitest/test_enumerateDevices.html": 1714, 
++    "dom/media/tests/mochitest/test_getUserMedia_addTrackRemoveTrack.html": 1388, 
++    "dom/media/tests/mochitest/test_getUserMedia_addtrack_removetrack_events.html": 1489, 
++    "dom/media/tests/mochitest/test_getUserMedia_audioCapture.html": 2356, 
++    "dom/media/tests/mochitest/test_getUserMedia_basicScreenshare.html": 1250, 
+     "dom/media/tests/mochitest/test_getUserMedia_bug1223696.html": 3281, 
+-    "dom/media/tests/mochitest/test_getUserMedia_callbacks.html": 2972, 
+-    "dom/media/tests/mochitest/test_getUserMedia_constraints.html": 5560, 
+-    "dom/media/tests/mochitest/test_getUserMedia_getTrackById.html": 1692, 
+-    "dom/media/tests/mochitest/test_getUserMedia_gumWithinGum.html": 1869, 
+-    "dom/media/tests/mochitest/test_getUserMedia_loadedmetadata.html": 2382, 
+-    "dom/media/tests/mochitest/test_getUserMedia_mediaElementCapture_audio.html": 7119, 
+-    "dom/media/tests/mochitest/test_getUserMedia_mediaElementCapture_tracks.html": 5522, 
+-    "dom/media/tests/mochitest/test_getUserMedia_mediaElementCapture_video.html": 10779, 
+-    "dom/media/tests/mochitest/test_getUserMedia_mediaStreamClone.html": 9461, 
+-    "dom/media/tests/mochitest/test_getUserMedia_mediaStreamConstructors.html": 5688, 
+-    "dom/media/tests/mochitest/test_getUserMedia_mediaStreamTrackClone.html": 7248, 
+-    "dom/media/tests/mochitest/test_getUserMedia_peerIdentity.html": 4164, 
+-    "dom/media/tests/mochitest/test_getUserMedia_playAudioTwice.html": 3936, 
+-    "dom/media/tests/mochitest/test_getUserMedia_playVideoAudioTwice.html": 4136, 
+-    "dom/media/tests/mochitest/test_getUserMedia_playVideoTwice.html": 3034, 
+-    "dom/media/tests/mochitest/test_getUserMedia_stopAudioStream.html": 2266, 
+-    "dom/media/tests/mochitest/test_getUserMedia_stopAudioStreamWithFollowupAudio.html": 4492, 
+-    "dom/media/tests/mochitest/test_getUserMedia_stopVideoAudioStream.html": 2384, 
+-    "dom/media/tests/mochitest/test_getUserMedia_stopVideoAudioStreamWithFollowupVideoAudio.html": 4639, 
+-    "dom/media/tests/mochitest/test_getUserMedia_stopVideoStream.html": 2311, 
+-    "dom/media/tests/mochitest/test_getUserMedia_trackEnded.html": 2190, 
+-    "dom/media/tests/mochitest/test_ondevicechange.html": 10060, 
+-    "dom/media/tests/mochitest/test_peerConnection_addAudioTrackToExistingVideoStream.html": 11089, 
+-    "dom/media/tests/mochitest/test_peerConnection_addDataChannel.html": 7676, 
+-    "dom/media/tests/mochitest/test_peerConnection_addDataChannelNoBundle.html": 8379, 
+-    "dom/media/tests/mochitest/test_peerConnection_addIceCandidate.html": 4419, 
+-    "dom/media/tests/mochitest/test_peerConnection_addSecondAudioStream.html": 8411, 
+-    "dom/media/tests/mochitest/test_peerConnection_addSecondAudioStreamNoBundle.html": 9481, 
+-    "dom/media/tests/mochitest/test_peerConnection_addSecondVideoStream.html": 7261, 
+-    "dom/media/tests/mochitest/test_peerConnection_addSecondVideoStreamNoBundle.html": 5377, 
++    "dom/media/tests/mochitest/test_getUserMedia_callbacks.html": 1793, 
++    "dom/media/tests/mochitest/test_getUserMedia_constraints.html": 5262, 
++    "dom/media/tests/mochitest/test_getUserMedia_gumWithinGum.html": 1465, 
++    "dom/media/tests/mochitest/test_getUserMedia_loadedmetadata.html": 1600, 
++    "dom/media/tests/mochitest/test_getUserMedia_mediaElementCapture_audio.html": 5221, 
++    "dom/media/tests/mochitest/test_getUserMedia_mediaElementCapture_tracks.html": 3759, 
++    "dom/media/tests/mochitest/test_getUserMedia_mediaElementCapture_video.html": 9925, 
++    "dom/media/tests/mochitest/test_getUserMedia_mediaStreamClone.html": 5919, 
++    "dom/media/tests/mochitest/test_getUserMedia_mediaStreamConstructors.html": 6658, 
++    "dom/media/tests/mochitest/test_getUserMedia_mediaStreamTrackClone.html": 7745, 
++    "dom/media/tests/mochitest/test_getUserMedia_peerIdentity.html": 2463, 
++    "dom/media/tests/mochitest/test_getUserMedia_playAudioTwice.html": 2225, 
++    "dom/media/tests/mochitest/test_getUserMedia_playVideoAudioTwice.html": 2363, 
++    "dom/media/tests/mochitest/test_getUserMedia_stopAudioStreamWithFollowupAudio.html": 3726, 
++    "dom/media/tests/mochitest/test_getUserMedia_stopVideoAudioStream.html": 1556, 
++    "dom/media/tests/mochitest/test_getUserMedia_stopVideoAudioStreamWithFollowupVideoAudio.html": 4286, 
++    "dom/media/tests/mochitest/test_getUserMedia_trackEnded.html": 1481, 
++    "dom/media/tests/mochitest/test_ondevicechange.html": 12324, 
++    "dom/media/tests/mochitest/test_peerConnection_addAudioTrackToExistingVideoStream.html": 9858, 
++    "dom/media/tests/mochitest/test_peerConnection_addDataChannel.html": 7161, 
++    "dom/media/tests/mochitest/test_peerConnection_addDataChannelNoBundle.html": 5772, 
++    "dom/media/tests/mochitest/test_peerConnection_addIceCandidate.html": 2780, 
++    "dom/media/tests/mochitest/test_peerConnection_addSecondAudioStream.html": 7165, 
++    "dom/media/tests/mochitest/test_peerConnection_addSecondAudioStreamNoBundle.html": 7108, 
++    "dom/media/tests/mochitest/test_peerConnection_addSecondVideoStream.html": 4352, 
++    "dom/media/tests/mochitest/test_peerConnection_addSecondVideoStreamNoBundle.html": 4183, 
+     "dom/media/tests/mochitest/test_peerConnection_addtrack_removetrack_events.html": 8868, 
+-    "dom/media/tests/mochitest/test_peerConnection_answererAddSecondAudioStream.html": 8687, 
+-    "dom/media/tests/mochitest/test_peerConnection_audioRenegotiationInactiveAnswer.html": 9598, 
+-    "dom/media/tests/mochitest/test_peerConnection_basicAudio.html": 5743, 
+-    "dom/media/tests/mochitest/test_peerConnection_basicAudioDynamicPtMissingRtpmap.html": 6001, 
+-    "dom/media/tests/mochitest/test_peerConnection_basicAudioNATRelay.html": 6449, 
+-    "dom/media/tests/mochitest/test_peerConnection_basicAudioNATRelayTCP.html": 6462, 
+-    "dom/media/tests/mochitest/test_peerConnection_basicAudioNATSrflx.html": 7011, 
+-    "dom/media/tests/mochitest/test_peerConnection_basicAudioPcmaPcmuOnly.html": 6171, 
+-    "dom/media/tests/mochitest/test_peerConnection_basicAudioRequireEOC.html": 5790, 
+-    "dom/media/tests/mochitest/test_peerConnection_basicAudioVideo.html": 6826, 
+-    "dom/media/tests/mochitest/test_peerConnection_basicAudioVideoCombined.html": 6975, 
+-    "dom/media/tests/mochitest/test_peerConnection_basicAudioVideoNoBundle.html": 7271, 
+-    "dom/media/tests/mochitest/test_peerConnection_basicAudioVideoNoBundleNoRtcpMux.html": 7824, 
+-    "dom/media/tests/mochitest/test_peerConnection_basicAudioVideoNoRtcpMux.html": 7469, 
+-    "dom/media/tests/mochitest/test_peerConnection_basicH264Video.html": 5421, 
+-    "dom/media/tests/mochitest/test_peerConnection_basicScreenshare.html": 4576, 
+-    "dom/media/tests/mochitest/test_peerConnection_basicVideo.html": 2731, 
+-    "dom/media/tests/mochitest/test_peerConnection_basicWindowshare.html": 3293, 
++    "dom/media/tests/mochitest/test_peerConnection_answererAddSecondAudioStream.html": 6707, 
++    "dom/media/tests/mochitest/test_peerConnection_audioRenegotiationInactiveAnswer.html": 7762, 
++    "dom/media/tests/mochitest/test_peerConnection_basicAudio.html": 4367, 
++    "dom/media/tests/mochitest/test_peerConnection_basicAudioDynamicPtMissingRtpmap.html": 4451, 
++    "dom/media/tests/mochitest/test_peerConnection_basicAudioNATRelay.html": 7378, 
++    "dom/media/tests/mochitest/test_peerConnection_basicAudioNATRelayTCP.html": 4754, 
++    "dom/media/tests/mochitest/test_peerConnection_basicAudioNATSrflx.html": 7565, 
++    "dom/media/tests/mochitest/test_peerConnection_basicAudioPcmaPcmuOnly.html": 4839, 
++    "dom/media/tests/mochitest/test_peerConnection_basicAudioRequireEOC.html": 4461, 
++    "dom/media/tests/mochitest/test_peerConnection_basicAudioVideo.html": 4631, 
++    "dom/media/tests/mochitest/test_peerConnection_basicAudioVideoCombined.html": 4509, 
++    "dom/media/tests/mochitest/test_peerConnection_basicAudioVideoNoBundle.html": 4733, 
++    "dom/media/tests/mochitest/test_peerConnection_basicAudioVideoNoBundleNoRtcpMux.html": 4836, 
++    "dom/media/tests/mochitest/test_peerConnection_basicAudioVideoNoRtcpMux.html": 4859, 
++    "dom/media/tests/mochitest/test_peerConnection_basicH264Video.html": 3126, 
++    "dom/media/tests/mochitest/test_peerConnection_basicScreenshare.html": 2684, 
++    "dom/media/tests/mochitest/test_peerConnection_basicVideo.html": 2068, 
++    "dom/media/tests/mochitest/test_peerConnection_basicWindowshare.html": 2395, 
+     "dom/media/tests/mochitest/test_peerConnection_bug1013809.html": 4341, 
+-    "dom/media/tests/mochitest/test_peerConnection_bug1042791.html": 2761, 
+-    "dom/media/tests/mochitest/test_peerConnection_bug827843.html": 3576, 
+-    "dom/media/tests/mochitest/test_peerConnection_callbacks.html": 3514, 
+-    "dom/media/tests/mochitest/test_peerConnection_captureStream_canvas_2d.html": 3905, 
+-    "dom/media/tests/mochitest/test_peerConnection_captureStream_canvas_webgl.html": 2272, 
+-    "dom/media/tests/mochitest/test_peerConnection_capturedVideo.html": 9032, 
+-    "dom/media/tests/mochitest/test_peerConnection_close.html": 1633, 
+-    "dom/media/tests/mochitest/test_peerConnection_closeDuringIce.html": 1699, 
+-    "dom/media/tests/mochitest/test_peerConnection_constructedStream.html": 10280, 
+-    "dom/media/tests/mochitest/test_peerConnection_forwarding_basicAudioVideoCombined.html": 9580, 
+-    "dom/media/tests/mochitest/test_peerConnection_insertDTMF.html": 6532, 
+-    "dom/media/tests/mochitest/test_peerConnection_localReofferRollback.html": 8643, 
+-    "dom/media/tests/mochitest/test_peerConnection_localRollback.html": 6115, 
+-    "dom/media/tests/mochitest/test_peerConnection_mapLikeToLegacyStatsMapping.html": 5650, 
+-    "dom/media/tests/mochitest/test_peerConnection_multiple_captureStream_canvas_2d.html": 4132, 
+-    "dom/media/tests/mochitest/test_peerConnection_noTrickleAnswer.html": 4256, 
+-    "dom/media/tests/mochitest/test_peerConnection_noTrickleOffer.html": 5886, 
+-    "dom/media/tests/mochitest/test_peerConnection_noTrickleOfferAnswer.html": 5925, 
+-    "dom/media/tests/mochitest/test_peerConnection_offerRequiresReceiveAudio.html": 4989, 
+-    "dom/media/tests/mochitest/test_peerConnection_offerRequiresReceiveVideo.html": 3700, 
+-    "dom/media/tests/mochitest/test_peerConnection_offerRequiresReceiveVideoAudio.html": 4089, 
+-    "dom/media/tests/mochitest/test_peerConnection_promiseSendOnly.html": 3455, 
+-    "dom/media/tests/mochitest/test_peerConnection_remoteReofferRollback.html": 8842, 
+-    "dom/media/tests/mochitest/test_peerConnection_remoteRollback.html": 6121, 
++    "dom/media/tests/mochitest/test_peerConnection_bug827843.html": 3964, 
++    "dom/media/tests/mochitest/test_peerConnection_callbacks.html": 1966, 
++    "dom/media/tests/mochitest/test_peerConnection_captureStream_canvas_2d.html": 2591, 
++    "dom/media/tests/mochitest/test_peerConnection_captureStream_canvas_2d_noSSRC.html": 2471, 
++    "dom/media/tests/mochitest/test_peerConnection_capturedVideo.html": 5894, 
++    "dom/media/tests/mochitest/test_peerConnection_close.html": 1803, 
++    "dom/media/tests/mochitest/test_peerConnection_closeDuringIce.html": 1426, 
++    "dom/media/tests/mochitest/test_peerConnection_constructedStream.html": 5084, 
++    "dom/media/tests/mochitest/test_peerConnection_forwarding_basicAudioVideoCombined.html": 5577, 
++    "dom/media/tests/mochitest/test_peerConnection_insertDTMF.html": 4481, 
++    "dom/media/tests/mochitest/test_peerConnection_localReofferRollback.html": 6196, 
++    "dom/media/tests/mochitest/test_peerConnection_localRollback.html": 4187, 
++    "dom/media/tests/mochitest/test_peerConnection_multiple_captureStream_canvas_2d.html": 3231, 
++    "dom/media/tests/mochitest/test_peerConnection_noTrickleAnswer.html": 3765, 
++    "dom/media/tests/mochitest/test_peerConnection_noTrickleOffer.html": 4324, 
++    "dom/media/tests/mochitest/test_peerConnection_noTrickleOfferAnswer.html": 4346, 
++    "dom/media/tests/mochitest/test_peerConnection_offerRequiresReceiveAudio.html": 3710, 
++    "dom/media/tests/mochitest/test_peerConnection_offerRequiresReceiveVideo.html": 1938, 
++    "dom/media/tests/mochitest/test_peerConnection_offerRequiresReceiveVideoAudio.html": 3473, 
++    "dom/media/tests/mochitest/test_peerConnection_promiseSendOnly.html": 2270, 
++    "dom/media/tests/mochitest/test_peerConnection_remoteReofferRollback.html": 6385, 
++    "dom/media/tests/mochitest/test_peerConnection_remoteRollback.html": 4030, 
+     "dom/media/tests/mochitest/test_peerConnection_removeAudioTrack.html": 7367, 
+-    "dom/media/tests/mochitest/test_peerConnection_removeThenAddAudioTrack.html": 8147, 
+-    "dom/media/tests/mochitest/test_peerConnection_removeThenAddAudioTrackNoBundle.html": 8243, 
+-    "dom/media/tests/mochitest/test_peerConnection_removeThenAddVideoTrack.html": 6025, 
+-    "dom/media/tests/mochitest/test_peerConnection_removeThenAddVideoTrackNoBundle.html": 3817, 
+-    "dom/media/tests/mochitest/test_peerConnection_removeVideoTrack.html": 3276, 
+-    "dom/media/tests/mochitest/test_peerConnection_renderAfterRenegotiation.html": 1451, 
+-    "dom/media/tests/mochitest/test_peerConnection_replaceTrack.html": 12235, 
+-    "dom/media/tests/mochitest/test_peerConnection_replaceVideoThenRenegotiate.html": 7866, 
+-    "dom/media/tests/mochitest/test_peerConnection_restartIce.html": 8151, 
+-    "dom/media/tests/mochitest/test_peerConnection_restartIceLocalAndRemoteRollback.html": 8573, 
+-    "dom/media/tests/mochitest/test_peerConnection_restartIceLocalRollback.html": 7924, 
+-    "dom/media/tests/mochitest/test_peerConnection_restartIceNoBundle.html": 10016, 
+-    "dom/media/tests/mochitest/test_peerConnection_restartIceNoBundleNoRtcpMux.html": 11878, 
+-    "dom/media/tests/mochitest/test_peerConnection_restartIceNoRtcpMux.html": 11093, 
+-    "dom/media/tests/mochitest/test_peerConnection_scaleResolution.html": 11715, 
+-    "dom/media/tests/mochitest/test_peerConnection_setLocalAnswerInHaveLocalOffer.html": 2342, 
+-    "dom/media/tests/mochitest/test_peerConnection_setLocalAnswerInStable.html": 2368, 
+-    "dom/media/tests/mochitest/test_peerConnection_setLocalOfferInHaveRemoteOffer.html": 3341, 
+-    "dom/media/tests/mochitest/test_peerConnection_setParameters.html": 4621, 
++    "dom/media/tests/mochitest/test_peerConnection_removeThenAddAudioTrack.html": 7150, 
++    "dom/media/tests/mochitest/test_peerConnection_removeThenAddAudioTrackNoBundle.html": 6841, 
++    "dom/media/tests/mochitest/test_peerConnection_removeThenAddVideoTrack.html": 4228, 
++    "dom/media/tests/mochitest/test_peerConnection_removeThenAddVideoTrackNoBundle.html": 4046, 
++    "dom/media/tests/mochitest/test_peerConnection_removeVideoTrack.html": 2623, 
++    "dom/media/tests/mochitest/test_peerConnection_renderAfterRenegotiation.html": 2317, 
++    "dom/media/tests/mochitest/test_peerConnection_replaceTrack.html": 9697, 
++    "dom/media/tests/mochitest/test_peerConnection_replaceVideoThenRenegotiate.html": 4222, 
++    "dom/media/tests/mochitest/test_peerConnection_restartIce.html": 6436, 
++    "dom/media/tests/mochitest/test_peerConnection_restartIceLocalAndRemoteRollback.html": 6198, 
++    "dom/media/tests/mochitest/test_peerConnection_restartIceLocalRollback.html": 6018, 
++    "dom/media/tests/mochitest/test_peerConnection_restartIceNoBundle.html": 6276, 
++    "dom/media/tests/mochitest/test_peerConnection_restartIceNoBundleNoRtcpMux.html": 6497, 
++    "dom/media/tests/mochitest/test_peerConnection_restartIceNoRtcpMux.html": 6466, 
++    "dom/media/tests/mochitest/test_peerConnection_restrictBandwidthWithTias.html": 2107, 
++    "dom/media/tests/mochitest/test_peerConnection_scaleResolution.html": 10247, 
++    "dom/media/tests/mochitest/test_peerConnection_sender_and_receiver_stats.html": 11087, 
++    "dom/media/tests/mochitest/test_peerConnection_setLocalAnswerInHaveLocalOffer.html": 2087, 
++    "dom/media/tests/mochitest/test_peerConnection_setLocalAnswerInStable.html": 1736, 
++    "dom/media/tests/mochitest/test_peerConnection_setLocalOfferInHaveRemoteOffer.html": 2711, 
++    "dom/media/tests/mochitest/test_peerConnection_setParameters.html": 2182, 
++    "dom/media/tests/mochitest/test_peerConnection_setParameters_scaleResolutionDownBy.html": 1316, 
+     "dom/media/tests/mochitest/test_peerConnection_setRemoteAnswerInHaveRemoteOffer.html": 1893, 
+-    "dom/media/tests/mochitest/test_peerConnection_setRemoteAnswerInStable.html": 2797, 
+-    "dom/media/tests/mochitest/test_peerConnection_setRemoteOfferInHaveLocalOffer.html": 2827, 
+-    "dom/media/tests/mochitest/test_peerConnection_simulcastOffer.html": 15297, 
+-    "dom/media/tests/mochitest/test_peerConnection_syncSetDescription.html": 3399, 
+-    "dom/media/tests/mochitest/test_peerConnection_trackDisabling.html": 4865, 
+-    "dom/media/tests/mochitest/test_peerConnection_trackDisabling_clones.html": 5496, 
+-    "dom/media/tests/mochitest/test_peerConnection_twoAudioStreams.html": 5139, 
+-    "dom/media/tests/mochitest/test_peerConnection_twoAudioTracksInOneStream.html": 6630, 
+-    "dom/media/tests/mochitest/test_peerConnection_twoAudioVideoStreams.html": 5371, 
+-    "dom/media/tests/mochitest/test_peerConnection_twoAudioVideoStreamsCombined.html": 6260, 
+-    "dom/media/tests/mochitest/test_peerConnection_twoVideoStreams.html": 8079, 
+-    "dom/media/tests/mochitest/test_peerConnection_twoVideoTracksInOneStream.html": 4975, 
+-    "dom/media/tests/mochitest/test_peerConnection_verifyAudioAfterRenegotiation.html": 10718, 
+-    "dom/media/tests/mochitest/test_peerConnection_verifyVideoAfterRenegotiation.html": 5421, 
+-    "dom/media/tests/mochitest/test_peerConnection_videoRenegotiationInactiveAnswer.html": 11893, 
++    "dom/media/tests/mochitest/test_peerConnection_setRemoteAnswerInStable.html": 1982, 
++    "dom/media/tests/mochitest/test_peerConnection_setRemoteOfferInHaveLocalOffer.html": 2101, 
++    "dom/media/tests/mochitest/test_peerConnection_simulcastAnswer.html": 5789, 
++    "dom/media/tests/mochitest/test_peerConnection_simulcastOffer.html": 5654, 
++    "dom/media/tests/mochitest/test_peerConnection_stats.html": 12734, 
++    "dom/media/tests/mochitest/test_peerConnection_syncSetDescription.html": 2353, 
++    "dom/media/tests/mochitest/test_peerConnection_threeUnbundledConnections.html": 3166, 
++    "dom/media/tests/mochitest/test_peerConnection_trackDisabling.html": 3514, 
++    "dom/media/tests/mochitest/test_peerConnection_trackDisabling_clones.html": 4588, 
++    "dom/media/tests/mochitest/test_peerConnection_transceivers.html": 1928, 
++    "dom/media/tests/mochitest/test_peerConnection_twoAudioStreams.html": 3742, 
++    "dom/media/tests/mochitest/test_peerConnection_twoAudioTracksInOneStream.html": 4339, 
++    "dom/media/tests/mochitest/test_peerConnection_twoAudioVideoStreams.html": 2391, 
++    "dom/media/tests/mochitest/test_peerConnection_twoAudioVideoStreamsCombined.html": 2587, 
++    "dom/media/tests/mochitest/test_peerConnection_twoVideoStreams.html": 2285, 
++    "dom/media/tests/mochitest/test_peerConnection_twoVideoTracksInOneStream.html": 2240, 
++    "dom/media/tests/mochitest/test_peerConnection_verifyAudioAfterRenegotiation.html": 9744, 
++    "dom/media/tests/mochitest/test_peerConnection_verifyVideoAfterRenegotiation.html": 4089, 
++    "dom/media/tests/mochitest/test_peerConnection_videoRenegotiationInactiveAnswer.html": 9697, 
+     "dom/media/tests/mochitest/test_peerConnection_webAudio.html": 2377, 
+-    "dom/media/webaudio/test/blink/test_biquadFilterNodeAllPass.html": 1707, 
+-    "dom/media/webaudio/test/test_AudioBuffer.html": 3250, 
+-    "dom/media/webaudio/test/test_audioBufferSourceNodeDetached.html": 2981, 
+-    "dom/media/webaudio/test/test_audioContextSuspendResumeClose.html": 3812, 
++    "dom/media/webaudio/test/blink/test_biquadFilterNodeAllPass.html": 1487, 
++    "dom/media/webaudio/test/test_AudioBuffer.html": 2180, 
++    "dom/media/webaudio/test/test_analyserNodeMinimum.html": 1360, 
++    "dom/media/webaudio/test/test_audioBufferSourceNodeDetached.html": 1898, 
++    "dom/media/webaudio/test/test_audioBufferSourceNodeLoop.html": 1198, 
++    "dom/media/webaudio/test/test_audioBufferSourceNodeLoopStartEnd.html": 1198, 
++    "dom/media/webaudio/test/test_audioContextSuspendResumeClose.html": 4599, 
+     "dom/media/webaudio/test/test_bug1027864.html": 6948, 
+-    "dom/media/webaudio/test/test_bug1113634.html": 1323, 
+-    "dom/media/webaudio/test/test_bug964376.html": 1362, 
+-    "dom/media/webaudio/test/test_bug966247.html": 1627, 
+-    "dom/media/webaudio/test/test_delayNodeTailIncrease.html": 1843, 
+-    "dom/media/webaudio/test/test_delayNodeTailWithDisconnect.html": 2619, 
+-    "dom/media/webaudio/test/test_delayNodeTailWithGain.html": 1862, 
+-    "dom/media/webaudio/test/test_delayNodeTailWithReconnect.html": 3047, 
+-    "dom/media/webaudio/test/test_dynamicsCompressorNode.html": 2358, 
++    "dom/media/webaudio/test/test_bug875221.html": 1268, 
++    "dom/media/webaudio/test/test_bug875402.html": 1220, 
++    "dom/media/webaudio/test/test_bug956489.html": 1195, 
++    "dom/media/webaudio/test/test_bug966247.html": 1795, 
++    "dom/media/webaudio/test/test_delayNodeTailIncrease.html": 1617, 
++    "dom/media/webaudio/test/test_delayNodeTailWithDisconnect.html": 2898, 
++    "dom/media/webaudio/test/test_delayNodeTailWithGain.html": 2157, 
++    "dom/media/webaudio/test/test_delayNodeTailWithReconnect.html": 3332, 
++    "dom/media/webaudio/test/test_dynamicsCompressorNode.html": 1694, 
+     "dom/media/webaudio/test/test_mediaDecoding.html": 2097, 
+-    "dom/media/webaudio/test/test_mediaElementAudioSourceNodeFidelity.html": 2988, 
+-    "dom/media/webaudio/test/test_mediaElementAudioSourceNodeVideo.html": 2334, 
++    "dom/media/webaudio/test/test_mediaElementAudioSourceNodeFidelity.html": 33918, 
+     "dom/media/webaudio/test/test_mediaStreamAudioDestinationNode.html": 2213, 
+     "dom/media/webaudio/test/test_mediaStreamAudioSourceNodeNoGC.html": 5505, 
+-    "dom/media/webaudio/test/test_pannerNodeAbove.html": 1308, 
+-    "dom/media/webaudio/test/test_pannerNodeTail.html": 3040, 
++    "dom/media/webaudio/test/test_nodeCreationDocumentGone.html": 1679, 
++    "dom/media/webaudio/test/test_pannerNodeHRTFSymmetry.html": 1182, 
++    "dom/media/webaudio/test/test_pannerNodeTail.html": 3348, 
+     "dom/media/webaudio/test/test_scriptProcessorNodeNotConnected.html": 4171, 
+-    "dom/media/webaudio/test/test_waveShaper.html": 1314, 
++    "dom/media/webaudio/test/test_scriptProcessorNode_playbackTime1.html": 1184, 
++    "dom/media/webaudio/test/test_waveShaperPassThrough.html": 1429, 
+     "dom/media/webspeech/recognition/test/test_abort.html": 5461, 
+     "dom/media/webspeech/recognition/test/test_audio_capture_error.html": 1712, 
+     "dom/media/webspeech/recognition/test/test_call_start_from_end_handler.html": 1730, 
+-    "dom/media/webspeech/recognition/test/test_recognition_service_error.html": 1702, 
+-    "dom/media/webspeech/recognition/test/test_success_without_recognition_service.html": 1743, 
++    "dom/media/webspeech/recognition/test/test_recognition_service_error.html": 1601, 
++    "dom/media/webspeech/recognition/test/test_success_without_recognition_service.html": 1584, 
+     "dom/media/webspeech/recognition/test/test_timeout.html": 10217, 
+-    "dom/media/webspeech/synth/test/startup/test_voiceschanged.html": 1589, 
+-    "dom/media/webspeech/synth/test/test_bfcache.html": 2814, 
+-    "dom/media/webspeech/synth/test/test_global_queue.html": 1841, 
++    "dom/media/webspeech/synth/test/startup/test_voiceschanged.html": 1375, 
++    "dom/media/webspeech/synth/test/test_bfcache.html": 2332, 
++    "dom/media/webspeech/synth/test/test_global_queue.html": 1595, 
+     "dom/media/webspeech/synth/test/test_global_queue_pause.html": 2030, 
+-    "dom/media/webspeech/synth/test/test_indirect_service_events.html": 2536, 
+-    "dom/media/webspeech/synth/test/test_speech_cancel.html": 1566, 
++    "dom/media/webspeech/synth/test/test_indirect_service_events.html": 2336, 
++    "dom/media/webspeech/synth/test/test_speech_cancel.html": 1472, 
+     "dom/media/webspeech/synth/test/test_speech_queue.html": 6645
+   }
+ }
+\ No newline at end of file
+diff --git a/testing/runtimes/mochitest-media.runtimes.json b/testing/runtimes/mochitest-media.runtimes.json
+--- a/testing/runtimes/mochitest-media.runtimes.json
++++ b/testing/runtimes/mochitest-media.runtimes.json
+@@ -1,319 +1,335 @@
+ {
+-  "excluded_test_average": 986, 
++  "excluded_test_average": 896, 
+   "runtimes": {
+-    "(SimpleTest/TestRunner.js)": 14172, 
+-    "Main app process exited normally": 36320, 
+-    "dom/media/mediasource/test/test_AudioChange_mp4.html": 7933, 
+-    "dom/media/mediasource/test/test_BufferedSeek.html": 2604, 
+-    "dom/media/mediasource/test/test_BufferingWait.html": 3927, 
+-    "dom/media/mediasource/test/test_BufferingWait_mp4.html": 4992, 
+-    "dom/media/mediasource/test/test_Eviction_mp4.html": 16733, 
+-    "dom/media/mediasource/test/test_FrameSelection_mp4.html": 3326, 
+-    "dom/media/mediasource/test/test_MediaSource.html": 5447, 
+-    "dom/media/mediasource/test/test_MediaSource_memory_reporting.html": 5924, 
+-    "dom/media/mediasource/test/test_MediaSource_mp4.html": 2423, 
+-    "dom/media/mediasource/test/test_PlayEvents.html": 4419, 
+-    "dom/media/mediasource/test/test_ResumeAfterClearing_mp4.html": 3649, 
+-    "dom/media/mediasource/test/test_SeekNoData_mp4.html": 3749, 
+-    "dom/media/mediasource/test/test_SeekTwice_mp4.html": 5234, 
+-    "dom/media/mediasource/test/test_SplitAppend.html": 5241, 
+-    "dom/media/mediasource/test/test_SplitAppendDelay.html": 6382, 
+-    "dom/media/mediasource/test/test_SplitAppendDelay_mp4.html": 3274, 
+-    "dom/media/mediasource/test/test_SplitAppend_mp4.html": 2259, 
+-    "dom/media/mediasource/test/test_Threshold_mp4.html": 9893, 
+-    "dom/media/mediasource/test/test_TimestampOffset_mp4.html": 8002, 
+-    "dom/media/mediasource/test/test_WaitingOnMissingData.html": 3880, 
+-    "dom/media/mediasource/test/test_WaitingOnMissingDataEnded_mp4.html": 3487, 
+-    "dom/media/mediasource/test/test_WaitingOnMissingData_mp4.html": 10757, 
+-    "dom/media/mediasource/test/test_WaitingToEndedTransition_mp4.html": 4647, 
+-    "dom/media/test/test_VideoPlaybackQuality.html": 4947, 
+-    "dom/media/test/test_access_control.html": 10799, 
+-    "dom/media/test/test_autoplay_contentEditable.html": 2755, 
+-    "dom/media/test/test_background_video_no_suspend_disabled.html": 12886, 
+-    "dom/media/test/test_background_video_no_suspend_short_vid.html": 12305, 
+-    "dom/media/test/test_background_video_suspend.html": 12433, 
+-    "dom/media/test/test_background_video_suspend_ends.html": 12382, 
+-    "dom/media/test/test_buffered.html": 4861, 
+-    "dom/media/test/test_bug1113600.html": 9962, 
+-    "dom/media/test/test_bug1242338.html": 3793, 
+-    "dom/media/test/test_bug448534.html": 2140, 
+-    "dom/media/test/test_bug465498.html": 9168, 
+-    "dom/media/test/test_bug495145.html": 18939, 
+-    "dom/media/test/test_bug495300.html": 3639, 
+-    "dom/media/test/test_bug686942.html": 5387, 
+-    "dom/media/test/test_bug874897.html": 2458, 
+-    "dom/media/test/test_bug879717.html": 2795, 
+-    "dom/media/test/test_chaining.html": 12803, 
+-    "dom/media/test/test_clone_media_element.html": 20321, 
+-    "dom/media/test/test_closing_connections.html": 4324, 
+-    "dom/media/test/test_cueless_webm_seek-1.html": 2883, 
+-    "dom/media/test/test_cueless_webm_seek-2.html": 2821, 
+-    "dom/media/test/test_dormant_playback.html": 2410, 
+-    "dom/media/test/test_eme_canvas_blocked.html": 6294, 
+-    "dom/media/test/test_eme_playback.html": 29650, 
+-    "dom/media/test/test_eme_stream_capture_blocked_case1.html": 4955, 
+-    "dom/media/test/test_eme_stream_capture_blocked_case2.html": 6055, 
+-    "dom/media/test/test_eme_stream_capture_blocked_case3.html": 5618, 
+-    "dom/media/test/test_eme_waitingforkey.html": 28600, 
+-    "dom/media/test/test_fastSeek.html": 2077, 
+-    "dom/media/test/test_fragment_noplay.html": 9845, 
+-    "dom/media/test/test_fragment_play.html": 64205, 
+-    "dom/media/test/test_info_leak.html": 7296, 
+-    "dom/media/test/test_load.html": 8546, 
+-    "dom/media/test/test_load_candidates.html": 2435, 
+-    "dom/media/test/test_load_same_resource.html": 2493, 
+-    "dom/media/test/test_load_source.html": 3375, 
+-    "dom/media/test/test_loop.html": 20034, 
+-    "dom/media/test/test_media_selection.html": 8367, 
+-    "dom/media/test/test_media_sniffer.html": 4100, 
+-    "dom/media/test/test_mediatrack_consuming_mediaresource.html": 7090, 
+-    "dom/media/test/test_mediatrack_replay_from_end.html": 7837, 
+-    "dom/media/test/test_metadata.html": 2223, 
+-    "dom/media/test/test_mixed_principals.html": 24477, 
+-    "dom/media/test/test_new_audio.html": 5230, 
+-    "dom/media/test/test_paused_after_ended.html": 8555, 
+-    "dom/media/test/test_play_events.html": 8395, 
+-    "dom/media/test/test_play_events_2.html": 8326, 
+-    "dom/media/test/test_play_promise_12.html": 2355, 
+-    "dom/media/test/test_play_promise_14.html": 2099, 
+-    "dom/media/test/test_play_promise_16.html": 2316, 
+-    "dom/media/test/test_play_promise_18.html": 2285, 
+-    "dom/media/test/test_play_promise_6.html": 2216, 
+-    "dom/media/test/test_play_twice.html": 14229, 
+-    "dom/media/test/test_playback.html": 76179, 
+-    "dom/media/test/test_playback_rate.html": 7902, 
+-    "dom/media/test/test_playback_rate_playpause.html": 2984, 
+-    "dom/media/test/test_playback_reactivate.html": 18530, 
+-    "dom/media/test/test_played.html": 18215, 
+-    "dom/media/test/test_preload_actions.html": 26225, 
+-    "dom/media/test/test_preload_suspend.html": 2497, 
+-    "dom/media/test/test_progress.html": 3962, 
+-    "dom/media/test/test_reactivate.html": 3526, 
+-    "dom/media/test/test_replay_metadata.html": 14580, 
+-    "dom/media/test/test_reset_src.html": 13129, 
+-    "dom/media/test/test_resolution_change.html": 6441, 
+-    "dom/media/test/test_seek-1.html": 11931, 
+-    "dom/media/test/test_seek-10.html": 3667, 
+-    "dom/media/test/test_seek-11.html": 3453, 
+-    "dom/media/test/test_seek-12.html": 3227, 
+-    "dom/media/test/test_seek-13.html": 3398, 
+-    "dom/media/test/test_seek-14.html": 6461, 
+-    "dom/media/test/test_seek-2.html": 21295, 
+-    "dom/media/test/test_seek-3.html": 3197, 
+-    "dom/media/test/test_seek-4.html": 3393, 
+-    "dom/media/test/test_seek-5.html": 11744, 
+-    "dom/media/test/test_seek-6.html": 3660, 
+-    "dom/media/test/test_seek-7.html": 2849, 
+-    "dom/media/test/test_seek-8.html": 3267, 
+-    "dom/media/test/test_seek-9.html": 2993, 
+-    "dom/media/test/test_seekToNextFrame.html": 12736, 
+-    "dom/media/test/test_seek_negative.html": 9139, 
+-    "dom/media/test/test_seek_out_of_range.html": 9314, 
+-    "dom/media/test/test_streams_tracks.html": 5382, 
+-    "dom/media/test/test_texttrackcue.html": 4182, 
+-    "dom/media/test/test_texttrackevents_video.html": 8116, 
+-    "dom/media/test/test_timeupdate_small_files.html": 11065, 
+-    "dom/media/test/test_trackelementsrc.html": 3896, 
+-    "dom/media/test/test_video_in_audio_element.html": 2261, 
+-    "dom/media/test/test_video_to_canvas.html": 2844, 
+-    "dom/media/tests/mochitest/identity/test_peerConnection_asymmetricIsolation.html": 2595, 
+-    "dom/media/tests/mochitest/identity/test_peerConnection_peerIdentity.html": 2442, 
+-    "dom/media/tests/mochitest/identity/test_setIdentityProvider.html": 2351, 
+-    "dom/media/tests/mochitest/identity/test_setIdentityProviderWithErrors.html": 2230, 
+-    "dom/media/tests/mochitest/test_a_noOp.html": 3419, 
+-    "dom/media/tests/mochitest/test_dataChannel_basicAudio.html": 5367, 
+-    "dom/media/tests/mochitest/test_dataChannel_basicAudioVideo.html": 5580, 
+-    "dom/media/tests/mochitest/test_dataChannel_basicAudioVideoCombined.html": 6117, 
+-    "dom/media/tests/mochitest/test_dataChannel_basicAudioVideoNoBundle.html": 6193, 
+-    "dom/media/tests/mochitest/test_dataChannel_basicDataOnly.html": 7244, 
+-    "dom/media/tests/mochitest/test_dataChannel_basicVideo.html": 3232, 
+-    "dom/media/tests/mochitest/test_dataChannel_bug1013809.html": 4337, 
+-    "dom/media/tests/mochitest/test_dataChannel_noOffer.html": 3451, 
+-    "dom/media/tests/mochitest/test_enumerateDevices.html": 5292, 
+-    "dom/media/tests/mochitest/test_getUserMedia_active_autoplay.html": 3659, 
+-    "dom/media/tests/mochitest/test_getUserMedia_addTrackRemoveTrack.html": 10408, 
+-    "dom/media/tests/mochitest/test_getUserMedia_addtrack_removetrack_events.html": 3699, 
+-    "dom/media/tests/mochitest/test_getUserMedia_audioCapture.html": 2784, 
+-    "dom/media/tests/mochitest/test_getUserMedia_basicAudio.html": 3392, 
+-    "dom/media/tests/mochitest/test_getUserMedia_basicScreenshare.html": 2862, 
+-    "dom/media/tests/mochitest/test_getUserMedia_basicVideo.html": 2929, 
+-    "dom/media/tests/mochitest/test_getUserMedia_basicVideoAudio.html": 3220, 
+-    "dom/media/tests/mochitest/test_getUserMedia_basicVideo_playAfterLoadedmetadata.html": 4502, 
+-    "dom/media/tests/mochitest/test_getUserMedia_bug1223696.html": 6041, 
+-    "dom/media/tests/mochitest/test_getUserMedia_callbacks.html": 5040, 
+-    "dom/media/tests/mochitest/test_getUserMedia_constraints.html": 7750, 
+-    "dom/media/tests/mochitest/test_getUserMedia_getTrackById.html": 4125, 
+-    "dom/media/tests/mochitest/test_getUserMedia_gumWithinGum.html": 4396, 
+-    "dom/media/tests/mochitest/test_getUserMedia_loadedmetadata.html": 4541, 
+-    "dom/media/tests/mochitest/test_getUserMedia_mediaElementCapture_audio.html": 6601, 
+-    "dom/media/tests/mochitest/test_getUserMedia_mediaElementCapture_tracks.html": 5187, 
+-    "dom/media/tests/mochitest/test_getUserMedia_mediaElementCapture_video.html": 9516, 
+-    "dom/media/tests/mochitest/test_getUserMedia_mediaStreamClone.html": 15222, 
+-    "dom/media/tests/mochitest/test_getUserMedia_mediaStreamConstructors.html": 9331, 
+-    "dom/media/tests/mochitest/test_getUserMedia_mediaStreamTrackClone.html": 11248, 
+-    "dom/media/tests/mochitest/test_getUserMedia_peerIdentity.html": 6813, 
+-    "dom/media/tests/mochitest/test_getUserMedia_playAudioTwice.html": 6611, 
+-    "dom/media/tests/mochitest/test_getUserMedia_playVideoAudioTwice.html": 6338, 
+-    "dom/media/tests/mochitest/test_getUserMedia_playVideoTwice.html": 5253, 
+-    "dom/media/tests/mochitest/test_getUserMedia_spinEventLoop.html": 2976, 
+-    "dom/media/tests/mochitest/test_getUserMedia_stopAudioStream.html": 4339, 
+-    "dom/media/tests/mochitest/test_getUserMedia_stopAudioStreamWithFollowupAudio.html": 6850, 
+-    "dom/media/tests/mochitest/test_getUserMedia_stopVideoAudioStream.html": 4884, 
+-    "dom/media/tests/mochitest/test_getUserMedia_stopVideoAudioStreamWithFollowupVideoAudio.html": 7404, 
+-    "dom/media/tests/mochitest/test_getUserMedia_stopVideoStream.html": 4830, 
+-    "dom/media/tests/mochitest/test_getUserMedia_stopVideoStreamWithFollowupVideo.html": 3397, 
+-    "dom/media/tests/mochitest/test_getUserMedia_trackCloneCleanup.html": 3077, 
+-    "dom/media/tests/mochitest/test_getUserMedia_trackEnded.html": 4713, 
+-    "dom/media/tests/mochitest/test_ondevicechange.html": 8529, 
+-    "dom/media/tests/mochitest/test_peerConnection_addAudioTrackToExistingVideoStream.html": 10081, 
+-    "dom/media/tests/mochitest/test_peerConnection_addDataChannel.html": 6529, 
+-    "dom/media/tests/mochitest/test_peerConnection_addDataChannelNoBundle.html": 7030, 
+-    "dom/media/tests/mochitest/test_peerConnection_addIceCandidate.html": 7175, 
+-    "dom/media/tests/mochitest/test_peerConnection_addSecondAudioStream.html": 7185, 
+-    "dom/media/tests/mochitest/test_peerConnection_addSecondAudioStreamNoBundle.html": 7709, 
+-    "dom/media/tests/mochitest/test_peerConnection_addSecondVideoStream.html": 5092, 
+-    "dom/media/tests/mochitest/test_peerConnection_addSecondVideoStreamNoBundle.html": 3405, 
+-    "dom/media/tests/mochitest/test_peerConnection_addtrack_removetrack_events.html": 8255, 
+-    "dom/media/tests/mochitest/test_peerConnection_answererAddSecondAudioStream.html": 7126, 
+-    "dom/media/tests/mochitest/test_peerConnection_audioRenegotiationInactiveAnswer.html": 9008, 
+-    "dom/media/tests/mochitest/test_peerConnection_basicAudio.html": 5295, 
+-    "dom/media/tests/mochitest/test_peerConnection_basicAudioDynamicPtMissingRtpmap.html": 5307, 
+-    "dom/media/tests/mochitest/test_peerConnection_basicAudioNATRelay.html": 5687, 
+-    "dom/media/tests/mochitest/test_peerConnection_basicAudioNATRelayTCP.html": 5660, 
+-    "dom/media/tests/mochitest/test_peerConnection_basicAudioNATSrflx.html": 5939, 
+-    "dom/media/tests/mochitest/test_peerConnection_basicAudioPcmaPcmuOnly.html": 5565, 
+-    "dom/media/tests/mochitest/test_peerConnection_basicAudioRequireEOC.html": 10048, 
+-    "dom/media/tests/mochitest/test_peerConnection_basicAudioVideo.html": 5610, 
+-    "dom/media/tests/mochitest/test_peerConnection_basicAudioVideoCombined.html": 5672, 
+-    "dom/media/tests/mochitest/test_peerConnection_basicAudioVideoNoBundle.html": 5805, 
+-    "dom/media/tests/mochitest/test_peerConnection_basicAudioVideoNoBundleNoRtcpMux.html": 5994, 
+-    "dom/media/tests/mochitest/test_peerConnection_basicAudioVideoNoRtcpMux.html": 5836, 
+-    "dom/media/tests/mochitest/test_peerConnection_basicH264Video.html": 4095, 
+-    "dom/media/tests/mochitest/test_peerConnection_basicScreenshare.html": 3590, 
+-    "dom/media/tests/mochitest/test_peerConnection_basicVideo.html": 3691, 
+-    "dom/media/tests/mochitest/test_peerConnection_basicWindowshare.html": 2678, 
+-    "dom/media/tests/mochitest/test_peerConnection_bug1013809.html": 4001, 
+-    "dom/media/tests/mochitest/test_peerConnection_bug1042791.html": 2516, 
+-    "dom/media/tests/mochitest/test_peerConnection_bug1064223.html": 3289, 
+-    "dom/media/tests/mochitest/test_peerConnection_bug1227781.html": 3080, 
+-    "dom/media/tests/mochitest/test_peerConnection_bug822674.html": 3055, 
+-    "dom/media/tests/mochitest/test_peerConnection_bug825703.html": 3574, 
+-    "dom/media/tests/mochitest/test_peerConnection_bug827843.html": 7751, 
+-    "dom/media/tests/mochitest/test_peerConnection_bug834153.html": 3457, 
+-    "dom/media/tests/mochitest/test_peerConnection_callbacks.html": 6208, 
+-    "dom/media/tests/mochitest/test_peerConnection_captureStream_canvas_2d.html": 3683, 
+-    "dom/media/tests/mochitest/test_peerConnection_captureStream_canvas_webgl.html": 6849, 
+-    "dom/media/tests/mochitest/test_peerConnection_capturedVideo.html": 6239, 
+-    "dom/media/tests/mochitest/test_peerConnection_close.html": 4746, 
+-    "dom/media/tests/mochitest/test_peerConnection_closeDuringIce.html": 5050, 
+-    "dom/media/tests/mochitest/test_peerConnection_constructedStream.html": 6567, 
+-    "dom/media/tests/mochitest/test_peerConnection_errorCallbacks.html": 3535, 
+-    "dom/media/tests/mochitest/test_peerConnection_forwarding_basicAudioVideoCombined.html": 6883, 
+-    "dom/media/tests/mochitest/test_peerConnection_insertDTMF.html": 5185, 
+-    "dom/media/tests/mochitest/test_peerConnection_localReofferRollback.html": 7357, 
+-    "dom/media/tests/mochitest/test_peerConnection_localRollback.html": 5333, 
+-    "dom/media/tests/mochitest/test_peerConnection_multiple_captureStream_canvas_2d.html": 5186, 
+-    "dom/media/tests/mochitest/test_peerConnection_noTrickleAnswer.html": 3941, 
+-    "dom/media/tests/mochitest/test_peerConnection_noTrickleOffer.html": 5222, 
+-    "dom/media/tests/mochitest/test_peerConnection_noTrickleOfferAnswer.html": 5232, 
+-    "dom/media/tests/mochitest/test_peerConnection_offerRequiresReceiveAudio.html": 4628, 
+-    "dom/media/tests/mochitest/test_peerConnection_offerRequiresReceiveVideo.html": 8450, 
+-    "dom/media/tests/mochitest/test_peerConnection_offerRequiresReceiveVideoAudio.html": 3840, 
+-    "dom/media/tests/mochitest/test_peerConnection_promiseSendOnly.html": 9428, 
+-    "dom/media/tests/mochitest/test_peerConnection_remoteReofferRollback.html": 7604, 
+-    "dom/media/tests/mochitest/test_peerConnection_remoteRollback.html": 5372, 
+-    "dom/media/tests/mochitest/test_peerConnection_removeAudioTrack.html": 6696, 
+-    "dom/media/tests/mochitest/test_peerConnection_removeThenAddAudioTrack.html": 7217, 
+-    "dom/media/tests/mochitest/test_peerConnection_removeThenAddAudioTrackNoBundle.html": 7206, 
+-    "dom/media/tests/mochitest/test_peerConnection_removeThenAddVideoTrack.html": 7943, 
+-    "dom/media/tests/mochitest/test_peerConnection_removeThenAddVideoTrackNoBundle.html": 2718, 
+-    "dom/media/tests/mochitest/test_peerConnection_removeVideoTrack.html": 4998, 
+-    "dom/media/tests/mochitest/test_peerConnection_renderAfterRenegotiation.html": 2110, 
+-    "dom/media/tests/mochitest/test_peerConnection_replaceTrack.html": 9788, 
+-    "dom/media/tests/mochitest/test_peerConnection_replaceVideoThenRenegotiate.html": 11008, 
+-    "dom/media/tests/mochitest/test_peerConnection_restartIce.html": 6085, 
+-    "dom/media/tests/mochitest/test_peerConnection_restartIceLocalAndRemoteRollback.html": 6723, 
+-    "dom/media/tests/mochitest/test_peerConnection_restartIceLocalRollback.html": 6709, 
+-    "dom/media/tests/mochitest/test_peerConnection_restartIceNoBundle.html": 7463, 
+-    "dom/media/tests/mochitest/test_peerConnection_restartIceNoBundleNoRtcpMux.html": 8001, 
+-    "dom/media/tests/mochitest/test_peerConnection_restartIceNoRtcpMux.html": 7706, 
+-    "dom/media/tests/mochitest/test_peerConnection_scaleResolution.html": 9955, 
+-    "dom/media/tests/mochitest/test_peerConnection_setLocalAnswerInHaveLocalOffer.html": 4827, 
+-    "dom/media/tests/mochitest/test_peerConnection_setLocalAnswerInStable.html": 5810, 
+-    "dom/media/tests/mochitest/test_peerConnection_setLocalOfferInHaveRemoteOffer.html": 6196, 
+-    "dom/media/tests/mochitest/test_peerConnection_setParameters.html": 3737, 
+-    "dom/media/tests/mochitest/test_peerConnection_setRemoteAnswerInHaveRemoteOffer.html": 5241, 
+-    "dom/media/tests/mochitest/test_peerConnection_setRemoteAnswerInStable.html": 5645, 
+-    "dom/media/tests/mochitest/test_peerConnection_setRemoteOfferInHaveLocalOffer.html": 5696, 
+-    "dom/media/tests/mochitest/test_peerConnection_simulcastOffer.html": 13242, 
+-    "dom/media/tests/mochitest/test_peerConnection_syncSetDescription.html": 2438, 
+-    "dom/media/tests/mochitest/test_peerConnection_throwInCallbacks.html": 4474, 
+-    "dom/media/tests/mochitest/test_peerConnection_toJSON.html": 3542, 
+-    "dom/media/tests/mochitest/test_peerConnection_trackDisabling.html": 3269, 
+-    "dom/media/tests/mochitest/test_peerConnection_trackDisabling_clones.html": 5158, 
+-    "dom/media/tests/mochitest/test_peerConnection_twoAudioStreams.html": 4285, 
+-    "dom/media/tests/mochitest/test_peerConnection_twoAudioTracksInOneStream.html": 5393, 
+-    "dom/media/tests/mochitest/test_peerConnection_twoAudioVideoStreams.html": 7058, 
+-    "dom/media/tests/mochitest/test_peerConnection_twoAudioVideoStreamsCombined.html": 7478, 
+-    "dom/media/tests/mochitest/test_peerConnection_twoVideoStreams.html": 5152, 
+-    "dom/media/tests/mochitest/test_peerConnection_twoVideoTracksInOneStream.html": 2751, 
+-    "dom/media/tests/mochitest/test_peerConnection_verifyAudioAfterRenegotiation.html": 9818, 
+-    "dom/media/tests/mochitest/test_peerConnection_verifyVideoAfterRenegotiation.html": 4894, 
+-    "dom/media/tests/mochitest/test_peerConnection_videoRenegotiationInactiveAnswer.html": 10240, 
+-    "dom/media/tests/mochitest/test_peerConnection_webAudio.html": 2279, 
+-    "dom/media/tests/mochitest/test_selftest.html": 3334, 
+-    "dom/media/webaudio/test/blink/test_biquadFilterNodeAllPass.html": 2235, 
+-    "dom/media/webaudio/test/blink/test_iirFilterNode.html": 1989, 
+-    "dom/media/webaudio/test/test_AudioBuffer.html": 7560, 
+-    "dom/media/webaudio/test/test_AudioNodeDevtoolsAPI.html": 5133, 
+-    "dom/media/webaudio/test/test_ScriptProcessorCollected1.html": 4011, 
+-    "dom/media/webaudio/test/test_WebAudioMemoryReporting.html": 2594, 
++    "dom/media/mediasource/test/test_AVC3_mp4.html": 3190, 
++    "dom/media/mediasource/test/test_AudioChange_mp4.html": 4210, 
++    "dom/media/mediasource/test/test_AutoRevocation.html": 2790, 
++    "dom/media/mediasource/test/test_BufferedSeek.html": 4604, 
++    "dom/media/mediasource/test/test_BufferingWait.html": 2443, 
++    "dom/media/mediasource/test/test_BufferingWait_mp4.html": 3211, 
++    "dom/media/mediasource/test/test_ChangeWhileWaitingOnMissingData_mp4.html": 2454, 
++    "dom/media/mediasource/test/test_DurationChange.html": 3445, 
++    "dom/media/mediasource/test/test_DurationUpdated.html": 2138, 
++    "dom/media/mediasource/test/test_EndOfStream.html": 1937, 
++    "dom/media/mediasource/test/test_EndedEvent.html": 2507, 
++    "dom/media/mediasource/test/test_Eviction_mp4.html": 10434, 
++    "dom/media/mediasource/test/test_FrameSelection.html": 3234, 
++    "dom/media/mediasource/test/test_FrameSelection_mp4.html": 1948, 
++    "dom/media/mediasource/test/test_HaveMetadataUnbufferedSeek.html": 2367, 
++    "dom/media/mediasource/test/test_MediaSource.html": 7010, 
++    "dom/media/mediasource/test/test_MediaSource_flac_mp4.html": 5366, 
++    "dom/media/mediasource/test/test_MediaSource_memory_reporting.html": 9498, 
++    "dom/media/mediasource/test/test_MultipleInitSegments.html": 1886, 
++    "dom/media/mediasource/test/test_OnEvents.html": 2337, 
++    "dom/media/mediasource/test/test_PlayEvents.html": 2379, 
++    "dom/media/mediasource/test/test_ResumeAfterClearing_mp4.html": 2236, 
++    "dom/media/mediasource/test/test_SeekNoData_mp4.html": 2287, 
++    "dom/media/mediasource/test/test_SeekTwice_mp4.html": 3203, 
++    "dom/media/mediasource/test/test_SeekableAfterEndOfStream.html": 1869, 
++    "dom/media/mediasource/test/test_SeekableBeforeEndOfStream.html": 1844, 
++    "dom/media/mediasource/test/test_SeekableBeforeEndOfStreamSplit.html": 2129, 
++    "dom/media/mediasource/test/test_SplitAppend.html": 7123, 
++    "dom/media/mediasource/test/test_SplitAppendDelay.html": 7839, 
++    "dom/media/mediasource/test/test_SplitAppendDelay_mp4.html": 2197, 
++    "dom/media/mediasource/test/test_Threshold_mp4.html": 6040, 
++    "dom/media/mediasource/test/test_TimestampOffset_mp4.html": 5256, 
++    "dom/media/mediasource/test/test_TruncatedDuration.html": 2161, 
++    "dom/media/mediasource/test/test_WaitingOnMissingData.html": 2443, 
++    "dom/media/mediasource/test/test_WaitingOnMissingDataEnded_mp4.html": 2056, 
++    "dom/media/mediasource/test/test_WaitingOnMissingData_mp4.html": 6698, 
++    "dom/media/mediasource/test/test_WaitingToEndedTransition_mp4.html": 2917, 
++    "dom/media/test/test_VideoPlaybackQuality.html": 3013, 
++    "dom/media/test/test_access_control.html": 5097, 
++    "dom/media/test/test_background_video_ended_event.html": 9912, 
++    "dom/media/test/test_background_video_no_suspend_disabled.html": 7580, 
++    "dom/media/test/test_background_video_no_suspend_not_in_tree.html": 6928, 
++    "dom/media/test/test_background_video_no_suspend_short_vid.html": 7629, 
++    "dom/media/test/test_background_video_resume_after_end_show_last_frame.html": 7688, 
++    "dom/media/test/test_background_video_suspend.html": 7194, 
++    "dom/media/test/test_background_video_suspend_ends.html": 7520, 
++    "dom/media/test/test_background_video_tainted_by_capturestream.html": 5907, 
++    "dom/media/test/test_background_video_tainted_by_createimagebitmap.html": 6980, 
++    "dom/media/test/test_background_video_tainted_by_drawimage.html": 7054, 
++    "dom/media/test/test_bug1113600.html": 6750, 
++    "dom/media/test/test_bug465498.html": 5588, 
++    "dom/media/test/test_bug495145.html": 11804, 
++    "dom/media/test/test_bug686942.html": 2956, 
++    "dom/media/test/test_chaining.html": 8251, 
++    "dom/media/test/test_clone_media_element.html": 14563, 
++    "dom/media/test/test_closing_connections.html": 1922, 
++    "dom/media/test/test_eme_canvas_blocked.html": 3992, 
++    "dom/media/test/test_eme_playback.html": 18551, 
++    "dom/media/test/test_eme_pssh_in_moof.html": 2277, 
++    "dom/media/test/test_eme_stream_capture_blocked_case1.html": 3791, 
++    "dom/media/test/test_eme_stream_capture_blocked_case2.html": 4635, 
++    "dom/media/test/test_eme_stream_capture_blocked_case3.html": 5221, 
++    "dom/media/test/test_eme_waitingforkey.html": 19586, 
++    "dom/media/test/test_fragment_noplay.html": 4809, 
++    "dom/media/test/test_fragment_play.html": 40635, 
++    "dom/media/test/test_info_leak.html": 4809, 
++    "dom/media/test/test_load.html": 5378, 
++    "dom/media/test/test_load_source.html": 2401, 
++    "dom/media/test/test_loop.html": 13041, 
++    "dom/media/test/test_media_selection.html": 4556, 
++    "dom/media/test/test_media_sniffer.html": 2145, 
++    "dom/media/test/test_mediarecorder_pause_resume_video.html": 2127, 
++    "dom/media/test/test_mediarecorder_principals.html": 2254, 
++    "dom/media/test/test_mediatrack_consuming_mediaresource.html": 4688, 
++    "dom/media/test/test_mediatrack_replay_from_end.html": 4868, 
++    "dom/media/test/test_mixed_principals.html": 15923, 
++    "dom/media/test/test_new_audio.html": 3415, 
++    "dom/media/test/test_paused_after_ended.html": 5579, 
++    "dom/media/test/test_play_events.html": 5613, 
++    "dom/media/test/test_play_events_2.html": 5591, 
++    "dom/media/test/test_play_twice.html": 9276, 
++    "dom/media/test/test_playback.html": 48346, 
++    "dom/media/test/test_playback_rate.html": 12633, 
++    "dom/media/test/test_playback_reactivate.html": 11693, 
++    "dom/media/test/test_played.html": 11614, 
++    "dom/media/test/test_preload_actions.html": 18126, 
++    "dom/media/test/test_progress.html": 2323, 
++    "dom/media/test/test_reactivate.html": 3206, 
++    "dom/media/test/test_replay_metadata.html": 9807, 
++    "dom/media/test/test_reset_src.html": 7819, 
++    "dom/media/test/test_resolution_change.html": 4068, 
++    "dom/media/test/test_seek-1.html": 7532, 
++    "dom/media/test/test_seek-10.html": 1924, 
++    "dom/media/test/test_seek-14.html": 3468, 
++    "dom/media/test/test_seek-2.html": 13873, 
++    "dom/media/test/test_seek-5.html": 7351, 
++    "dom/media/test/test_seek-6.html": 1869, 
++    "dom/media/test/test_seekToNextFrame.html": 10516, 
++    "dom/media/test/test_seek_negative.html": 5959, 
++    "dom/media/test/test_seek_out_of_range.html": 5816, 
++    "dom/media/test/test_seek_promise_bug1344357.html": 1940, 
++    "dom/media/test/test_streams_tracks.html": 3299, 
++    "dom/media/test/test_texttrackcue.html": 2459, 
++    "dom/media/test/test_texttrackevents_video.html": 5223, 
++    "dom/media/test/test_timeupdate_small_files.html": 7503, 
++    "dom/media/test/test_trackelementsrc.html": 2351, 
++    "dom/media/test/test_videoPlaybackQuality_totalFrames.html": 4189, 
++    "dom/media/tests/mochitest/test_a_noOp.html": 5722, 
++    "dom/media/tests/mochitest/test_dataChannel_basicAudio.html": 2014, 
++    "dom/media/tests/mochitest/test_dataChannel_basicAudioVideo.html": 2102, 
++    "dom/media/tests/mochitest/test_dataChannel_basicAudioVideoCombined.html": 2272, 
++    "dom/media/tests/mochitest/test_dataChannel_basicAudioVideoNoBundle.html": 2243, 
++    "dom/media/tests/mochitest/test_dataChannel_basicDataOnly.html": 22943, 
++    "dom/media/tests/mochitest/test_dataChannel_noOffer.html": 10046, 
++    "dom/media/tests/mochitest/test_enumerateDevices.html": 14965, 
++    "dom/media/tests/mochitest/test_getUserMedia_active_autoplay.html": 11126, 
++    "dom/media/tests/mochitest/test_getUserMedia_addtrack_removetrack_events.html": 8693, 
++    "dom/media/tests/mochitest/test_getUserMedia_basicAudio.html": 9693, 
++    "dom/media/tests/mochitest/test_getUserMedia_basicVideo.html": 8342, 
++    "dom/media/tests/mochitest/test_getUserMedia_basicVideoAudio.html": 9446, 
++    "dom/media/tests/mochitest/test_getUserMedia_basicVideo_playAfterLoadedmetadata.html": 8279, 
++    "dom/media/tests/mochitest/test_getUserMedia_bug1223696.html": 14744, 
++    "dom/media/tests/mochitest/test_getUserMedia_callbacks.html": 10011, 
++    "dom/media/tests/mochitest/test_getUserMedia_constraints.html": 12549, 
++    "dom/media/tests/mochitest/test_getUserMedia_getTrackById.html": 10005, 
++    "dom/media/tests/mochitest/test_getUserMedia_gumWithinGum.html": 9749, 
++    "dom/media/tests/mochitest/test_getUserMedia_loadedmetadata.html": 9701, 
++    "dom/media/tests/mochitest/test_getUserMedia_mediaElementCapture_audio.html": 2485, 
++    "dom/media/tests/mochitest/test_getUserMedia_mediaElementCapture_tracks.html": 1941, 
++    "dom/media/tests/mochitest/test_getUserMedia_mediaElementCapture_video.html": 4212, 
++    "dom/media/tests/mochitest/test_getUserMedia_mediaStreamClone.html": 43610, 
++    "dom/media/tests/mochitest/test_getUserMedia_mediaStreamConstructors.html": 17445, 
++    "dom/media/tests/mochitest/test_getUserMedia_mediaStreamTrackClone.html": 17623, 
++    "dom/media/tests/mochitest/test_getUserMedia_peerIdentity.html": 12991, 
++    "dom/media/tests/mochitest/test_getUserMedia_playAudioTwice.html": 9986, 
++    "dom/media/tests/mochitest/test_getUserMedia_playVideoAudioTwice.html": 11009, 
++    "dom/media/tests/mochitest/test_getUserMedia_playVideoTwice.html": 8726, 
++    "dom/media/tests/mochitest/test_getUserMedia_spinEventLoop.html": 9057, 
++    "dom/media/tests/mochitest/test_getUserMedia_stopAudioStream.html": 9331, 
++    "dom/media/tests/mochitest/test_getUserMedia_stopAudioStreamWithFollowupAudio.html": 10770, 
++    "dom/media/tests/mochitest/test_getUserMedia_stopVideoAudioStream.html": 9700, 
++    "dom/media/tests/mochitest/test_getUserMedia_stopVideoAudioStreamWithFollowupVideoAudio.html": 11469, 
++    "dom/media/tests/mochitest/test_getUserMedia_stopVideoStream.html": 9606, 
++    "dom/media/tests/mochitest/test_getUserMedia_stopVideoStreamWithFollowupVideo.html": 9232, 
++    "dom/media/tests/mochitest/test_getUserMedia_trackCloneCleanup.html": 8734, 
++    "dom/media/tests/mochitest/test_getUserMedia_trackEnded.html": 11563, 
++    "dom/media/tests/mochitest/test_ondevicechange.html": 4940, 
++    "dom/media/tests/mochitest/test_peerConnection_addAudioTrackToExistingVideoStream.html": 4198, 
++    "dom/media/tests/mochitest/test_peerConnection_addDataChannel.html": 2930, 
++    "dom/media/tests/mochitest/test_peerConnection_addDataChannelNoBundle.html": 2596, 
++    "dom/media/tests/mochitest/test_peerConnection_addIceCandidate.html": 15965, 
++    "dom/media/tests/mochitest/test_peerConnection_addSecondAudioStream.html": 3046, 
++    "dom/media/tests/mochitest/test_peerConnection_addSecondAudioStreamNoBundle.html": 3161, 
++    "dom/media/tests/mochitest/test_peerConnection_addtrack_removetrack_events.html": 3541, 
++    "dom/media/tests/mochitest/test_peerConnection_answererAddSecondAudioStream.html": 2862, 
++    "dom/media/tests/mochitest/test_peerConnection_audioRenegotiationInactiveAnswer.html": 3526, 
++    "dom/media/tests/mochitest/test_peerConnection_basicAudio.html": 1874, 
++    "dom/media/tests/mochitest/test_peerConnection_basicAudioDynamicPtMissingRtpmap.html": 1938, 
++    "dom/media/tests/mochitest/test_peerConnection_basicAudioNATRelay.html": 2092, 
++    "dom/media/tests/mochitest/test_peerConnection_basicAudioNATRelayTCP.html": 2075, 
++    "dom/media/tests/mochitest/test_peerConnection_basicAudioNATSrflx.html": 2187, 
++    "dom/media/tests/mochitest/test_peerConnection_basicAudioPcmaPcmuOnly.html": 2044, 
++    "dom/media/tests/mochitest/test_peerConnection_basicAudioRequireEOC.html": 1926, 
++    "dom/media/tests/mochitest/test_peerConnection_basicAudioVideo.html": 2094, 
++    "dom/media/tests/mochitest/test_peerConnection_basicAudioVideoCombined.html": 2071, 
++    "dom/media/tests/mochitest/test_peerConnection_basicAudioVideoNoBundle.html": 2155, 
++    "dom/media/tests/mochitest/test_peerConnection_basicAudioVideoNoBundleNoRtcpMux.html": 2193, 
++    "dom/media/tests/mochitest/test_peerConnection_basicAudioVideoNoRtcpMux.html": 2211, 
++    "dom/media/tests/mochitest/test_peerConnection_basicVideo.html": 9981, 
++    "dom/media/tests/mochitest/test_peerConnection_basicVideoRemoteHwEncoder.html": 2888, 
++    "dom/media/tests/mochitest/test_peerConnection_bug1064223.html": 11040, 
++    "dom/media/tests/mochitest/test_peerConnection_bug1227781.html": 10572, 
++    "dom/media/tests/mochitest/test_peerConnection_bug822674.html": 9798, 
++    "dom/media/tests/mochitest/test_peerConnection_bug825703.html": 12667, 
++    "dom/media/tests/mochitest/test_peerConnection_bug834153.html": 10980, 
++    "dom/media/tests/mochitest/test_peerConnection_capturedVideo.html": 2367, 
++    "dom/media/tests/mochitest/test_peerConnection_close.html": 11996, 
++    "dom/media/tests/mochitest/test_peerConnection_closeDuringIce.html": 16421, 
++    "dom/media/tests/mochitest/test_peerConnection_constructedStream.html": 2244, 
++    "dom/media/tests/mochitest/test_peerConnection_errorCallbacks.html": 12706, 
++    "dom/media/tests/mochitest/test_peerConnection_forwarding_basicAudioVideoCombined.html": 2418, 
++    "dom/media/tests/mochitest/test_peerConnection_insertDTMF.html": 1916, 
++    "dom/media/tests/mochitest/test_peerConnection_localReofferRollback.html": 2807, 
++    "dom/media/tests/mochitest/test_peerConnection_localRollback.html": 1919, 
++    "dom/media/tests/mochitest/test_peerConnection_multiple_captureStream_canvas_2d.html": 5991, 
++    "dom/media/tests/mochitest/test_peerConnection_noTrickleOfferAnswer.html": 1913, 
++    "dom/media/tests/mochitest/test_peerConnection_offerRequiresReceiveVideo.html": 25190, 
++    "dom/media/tests/mochitest/test_peerConnection_remoteReofferRollback.html": 2933, 
++    "dom/media/tests/mochitest/test_peerConnection_remoteRollback.html": 1959, 
++    "dom/media/tests/mochitest/test_peerConnection_removeAudioTrack.html": 2956, 
++    "dom/media/tests/mochitest/test_peerConnection_removeThenAddAudioTrack.html": 3049, 
++    "dom/media/tests/mochitest/test_peerConnection_removeThenAddAudioTrackNoBundle.html": 3112, 
++    "dom/media/tests/mochitest/test_peerConnection_removeThenAddVideoTrack.html": 17052, 
++    "dom/media/tests/mochitest/test_peerConnection_removeVideoTrack.html": 12604, 
++    "dom/media/tests/mochitest/test_peerConnection_replaceTrack.html": 4083, 
++    "dom/media/tests/mochitest/test_peerConnection_replaceVideoThenRenegotiate.html": 19111, 
++    "dom/media/tests/mochitest/test_peerConnection_restartIce.html": 2675, 
++    "dom/media/tests/mochitest/test_peerConnection_restartIceLocalAndRemoteRollback.html": 2587, 
++    "dom/media/tests/mochitest/test_peerConnection_restartIceLocalRollback.html": 2581, 
++    "dom/media/tests/mochitest/test_peerConnection_restartIceNoBundle.html": 2819, 
++    "dom/media/tests/mochitest/test_peerConnection_restartIceNoBundleNoRtcpMux.html": 2863, 
++    "dom/media/tests/mochitest/test_peerConnection_restartIceNoRtcpMux.html": 2873, 
++    "dom/media/tests/mochitest/test_peerConnection_scaleResolution.html": 3987, 
++    "dom/media/tests/mochitest/test_peerConnection_sender_and_receiver_stats.html": 3818, 
++    "dom/media/tests/mochitest/test_peerConnection_setLocalAnswerInHaveLocalOffer.html": 14326, 
++    "dom/media/tests/mochitest/test_peerConnection_setLocalAnswerInStable.html": 13337, 
++    "dom/media/tests/mochitest/test_peerConnection_setLocalOfferInHaveRemoteOffer.html": 14968, 
++    "dom/media/tests/mochitest/test_peerConnection_setRemoteAnswerInHaveRemoteOffer.html": 13867, 
++    "dom/media/tests/mochitest/test_peerConnection_setRemoteAnswerInStable.html": 13953, 
++    "dom/media/tests/mochitest/test_peerConnection_setRemoteOfferInHaveLocalOffer.html": 13659, 
++    "dom/media/tests/mochitest/test_peerConnection_simulcastAnswer.html": 1940, 
++    "dom/media/tests/mochitest/test_peerConnection_simulcastOffer.html": 2751, 
++    "dom/media/tests/mochitest/test_peerConnection_stats.html": 4379, 
++    "dom/media/tests/mochitest/test_peerConnection_throwInCallbacks.html": 13467, 
++    "dom/media/tests/mochitest/test_peerConnection_toJSON.html": 12761, 
++    "dom/media/tests/mochitest/test_peerConnection_twoAudioVideoStreams.html": 2186, 
++    "dom/media/tests/mochitest/test_peerConnection_twoAudioVideoStreamsCombined.html": 2231, 
++    "dom/media/tests/mochitest/test_peerConnection_verifyAudioAfterRenegotiation.html": 4179, 
++    "dom/media/tests/mochitest/test_peerConnection_videoRenegotiationInactiveAnswer.html": 4037, 
++    "dom/media/tests/mochitest/test_selftest.html": 11037, 
++    "dom/media/webaudio/test/blink/test_biquadFilterNodeAllPass.html": 2578, 
++    "dom/media/webaudio/test/blink/test_biquadFilterNodeNotch.html": 1847, 
++    "dom/media/webaudio/test/blink/test_iirFilterNode.html": 4473, 
++    "dom/media/webaudio/test/test_AudioBuffer.html": 11003, 
++    "dom/media/webaudio/test/test_AudioNodeDevtoolsAPI.html": 6687, 
++    "dom/media/webaudio/test/test_ScriptProcessorCollected1.html": 5696, 
++    "dom/media/webaudio/test/test_WebAudioMemoryReporting.html": 3693, 
++    "dom/media/webaudio/test/test_analyserNodeMinimum.html": 2500, 
+     "dom/media/webaudio/test/test_analyserNodeOutput.html": 2036, 
+-    "dom/media/webaudio/test/test_audioBufferSourceNodeDetached.html": 6965, 
++    "dom/media/webaudio/test/test_analyserNodePassThrough.html": 1933, 
++    "dom/media/webaudio/test/test_audioBufferSourceNode.html": 2620, 
++    "dom/media/webaudio/test/test_audioBufferSourceNodeDetached.html": 12922, 
++    "dom/media/webaudio/test/test_audioBufferSourceNodeLazyLoopParam.html": 2045, 
++    "dom/media/webaudio/test/test_audioBufferSourceNodeLoop.html": 2119, 
++    "dom/media/webaudio/test/test_audioBufferSourceNodeLoopStartEnd.html": 2189, 
++    "dom/media/webaudio/test/test_audioBufferSourceNodeLoopStartEndSame.html": 2009, 
++    "dom/media/webaudio/test/test_audioBufferSourceNodeNoStart.html": 1898, 
++    "dom/media/webaudio/test/test_audioBufferSourceNodeNullBuffer.html": 2087, 
++    "dom/media/webaudio/test/test_audioBufferSourceNodePassThrough.html": 2164, 
+     "dom/media/webaudio/test/test_audioContextSuspendResumeClose.html": 4991, 
+-    "dom/media/webaudio/test/test_bug1027864.html": 12874, 
+-    "dom/media/webaudio/test/test_bug866737.html": 2230, 
+-    "dom/media/webaudio/test/test_bug875221.html": 3379, 
++    "dom/media/webaudio/test/test_audioParamExponentialRamp.html": 1887, 
++    "dom/media/webaudio/test/test_audioParamSetTargetAtTime.html": 1861, 
++    "dom/media/webaudio/test/test_audioParamSetTargetAtTimeZeroTimeConstant.html": 1846, 
++    "dom/media/webaudio/test/test_audioParamTimelineDestinationOffset.html": 2299, 
++    "dom/media/webaudio/test/test_biquadFilterNodePassThrough.html": 1959, 
++    "dom/media/webaudio/test/test_biquadFilterNodeWithGain.html": 1940, 
++    "dom/media/webaudio/test/test_bug1027864.html": 16514, 
++    "dom/media/webaudio/test/test_bug1113634.html": 2218, 
++    "dom/media/webaudio/test/test_bug1255618.html": 2864, 
++    "dom/media/webaudio/test/test_bug866737.html": 3701, 
++    "dom/media/webaudio/test/test_bug867203.html": 3229, 
++    "dom/media/webaudio/test/test_bug875221.html": 4147, 
+     "dom/media/webaudio/test/test_bug875402.html": 3253, 
+-    "dom/media/webaudio/test/test_bug964376.html": 2349, 
+-    "dom/media/webaudio/test/test_bug966247.html": 10376, 
+-    "dom/media/webaudio/test/test_convolverNodeDelay.html": 2561, 
+-    "dom/media/webaudio/test/test_delayNode.html": 2129, 
+-    "dom/media/webaudio/test/test_delayNodeTailIncrease.html": 3521, 
+-    "dom/media/webaudio/test/test_delayNodeTailWithDisconnect.html": 3904, 
+-    "dom/media/webaudio/test/test_delayNodeTailWithGain.html": 3150, 
+-    "dom/media/webaudio/test/test_delayNodeTailWithReconnect.html": 4324, 
+-    "dom/media/webaudio/test/test_dynamicsCompressorNode.html": 3266, 
+-    "dom/media/webaudio/test/test_maxChannelCount.html": 2293, 
+-    "dom/media/webaudio/test/test_mediaDecoding.html": 4323, 
+-    "dom/media/webaudio/test/test_mediaElementAudioSourceNode.html": 2024, 
+-    "dom/media/webaudio/test/test_mediaElementAudioSourceNodeFidelity.html": 2819, 
+-    "dom/media/webaudio/test/test_mediaElementAudioSourceNodeVideo.html": 4320, 
+-    "dom/media/webaudio/test/test_mediaStreamAudioDestinationNode.html": 3101, 
+-    "dom/media/webaudio/test/test_mediaStreamAudioSourceNodeNoGC.html": 9747, 
+-    "dom/media/webaudio/test/test_oscillatorNode2.html": 4684, 
+-    "dom/media/webaudio/test/test_pannerNodeAbove.html": 2093, 
+-    "dom/media/webaudio/test/test_pannerNodeTail.html": 5026, 
+-    "dom/media/webaudio/test/test_periodicWaveBandLimiting.html": 2294, 
+-    "dom/media/webaudio/test/test_scriptProcessorNode.html": 2902, 
+-    "dom/media/webaudio/test/test_scriptProcessorNodeNotConnected.html": 4687, 
+-    "dom/media/webaudio/test/test_scriptProcessorNodePassThrough.html": 2060, 
+-    "dom/media/webaudio/test/test_sequentialBufferSourceWithResampling.html": 2180, 
+-    "dom/media/webaudio/test/test_waveShaper.html": 2117, 
+-    "dom/media/webspeech/recognition/test/test_abort.html": 4146, 
+-    "dom/media/webspeech/recognition/test/test_audio_capture_error.html": 2299, 
+-    "dom/media/webspeech/recognition/test/test_recognition_service_error.html": 2541, 
+-    "dom/media/webspeech/recognition/test/test_success_without_recognition_service.html": 2324, 
+-    "dom/media/webspeech/recognition/test/test_timeout.html": 10821, 
+-    "dom/media/webspeech/synth/test/startup/test_voiceschanged.html": 2275, 
+-    "dom/media/webspeech/synth/test/test_bfcache.html": 4391, 
+-    "dom/media/webspeech/synth/test/test_global_queue.html": 4323, 
+-    "dom/media/webspeech/synth/test/test_global_queue_cancel.html": 3166, 
+-    "dom/media/webspeech/synth/test/test_global_queue_pause.html": 4655, 
+-    "dom/media/webspeech/synth/test/test_indirect_service_events.html": 4333, 
+-    "dom/media/webspeech/synth/test/test_speech_cancel.html": 3720, 
+-    "dom/media/webspeech/synth/test/test_speech_error.html": 2155, 
+-    "dom/media/webspeech/synth/test/test_speech_queue.html": 8880, 
+-    "dom/media/webspeech/synth/test/test_speech_simple.html": 2453
++    "dom/media/webaudio/test/test_bug894150.html": 2555, 
++    "dom/media/webaudio/test/test_bug956489.html": 1932, 
++    "dom/media/webaudio/test/test_bug964376.html": 3271, 
++    "dom/media/webaudio/test/test_bug966247.html": 8951, 
++    "dom/media/webaudio/test/test_bug972678.html": 1969, 
++    "dom/media/webaudio/test/test_channelMergerNode.html": 2297, 
++    "dom/media/webaudio/test/test_channelMergerNodeWithVolume.html": 2359, 
++    "dom/media/webaudio/test/test_channelSplitterNode.html": 2113, 
++    "dom/media/webaudio/test/test_convolverNode.html": 2687, 
++    "dom/media/webaudio/test/test_convolverNodeChannelCount.html": 2810, 
++    "dom/media/webaudio/test/test_convolverNodeDelay.html": 5103, 
++    "dom/media/webaudio/test/test_convolverNodePassThrough.html": 2035, 
++    "dom/media/webaudio/test/test_convolverNodeWithGain.html": 2079, 
++    "dom/media/webaudio/test/test_convolverNode_mono_mono.html": 3843, 
++    "dom/media/webaudio/test/test_currentTime.html": 1963, 
++    "dom/media/webaudio/test/test_delayNode.html": 2683, 
++    "dom/media/webaudio/test/test_delayNodeCycles.html": 2203, 
++    "dom/media/webaudio/test/test_delayNodePassThrough.html": 2237, 
++    "dom/media/webaudio/test/test_delayNodeSmallMaxDelay.html": 1844, 
++    "dom/media/webaudio/test/test_delayNodeTailIncrease.html": 4961, 
++    "dom/media/webaudio/test/test_delayNodeTailWithDisconnect.html": 5056, 
++    "dom/media/webaudio/test/test_delayNodeTailWithGain.html": 4016, 
++    "dom/media/webaudio/test/test_delayNodeTailWithReconnect.html": 5259, 
++    "dom/media/webaudio/test/test_delayNodeWithGain.html": 2331, 
++    "dom/media/webaudio/test/test_dynamicsCompressorNode.html": 4753, 
++    "dom/media/webaudio/test/test_dynamicsCompressorNodePassThrough.html": 2443, 
++    "dom/media/webaudio/test/test_gainNode.html": 2507, 
++    "dom/media/webaudio/test/test_gainNodeInLoop.html": 2257, 
++    "dom/media/webaudio/test/test_gainNodePassThrough.html": 2199, 
++    "dom/media/webaudio/test/test_iirFilterNodePassThrough.html": 2501, 
++    "dom/media/webaudio/test/test_maxChannelCount.html": 3944, 
++    "dom/media/webaudio/test/test_mediaDecoding.html": 12519, 
++    "dom/media/webaudio/test/test_mediaElementAudioSourceNode.html": 2370, 
++    "dom/media/webaudio/test/test_mediaElementAudioSourceNodeFidelity.html": 37812, 
++    "dom/media/webaudio/test/test_mediaStreamAudioDestinationNode.html": 3704, 
++    "dom/media/webaudio/test/test_mediaStreamAudioSourceNodeCrossOrigin.html": 2338, 
++    "dom/media/webaudio/test/test_mediaStreamAudioSourceNodeNoGC.html": 12240, 
++    "dom/media/webaudio/test/test_mediaStreamAudioSourceNodeResampling.html": 2119, 
++    "dom/media/webaudio/test/test_nodeCreationDocumentGone.html": 7034, 
++    "dom/media/webaudio/test/test_nodeToParamConnection.html": 2229, 
++    "dom/media/webaudio/test/test_oscillatorNode2.html": 7969, 
++    "dom/media/webaudio/test/test_oscillatorNodePassThrough.html": 2068, 
++    "dom/media/webaudio/test/test_pannerNodeAbove.html": 2518, 
++    "dom/media/webaudio/test/test_pannerNodeChannelCount.html": 2231, 
++    "dom/media/webaudio/test/test_pannerNodeHRTFSymmetry.html": 2421, 
++    "dom/media/webaudio/test/test_pannerNodeTail.html": 5874, 
++    "dom/media/webaudio/test/test_periodicWave.html": 2995, 
++    "dom/media/webaudio/test/test_periodicWaveBandLimiting.html": 4551, 
++    "dom/media/webaudio/test/test_periodicWaveDisableNormalization.html": 2866, 
++    "dom/media/webaudio/test/test_scriptProcessorNode.html": 4334, 
++    "dom/media/webaudio/test/test_scriptProcessorNodeChannelCount.html": 2523, 
++    "dom/media/webaudio/test/test_scriptProcessorNodeNotConnected.html": 5273, 
++    "dom/media/webaudio/test/test_scriptProcessorNodePassThrough.html": 2946, 
++    "dom/media/webaudio/test/test_scriptProcessorNode_playbackTime1.html": 1913, 
++    "dom/media/webaudio/test/test_sequentialBufferSourceWithResampling.html": 5278, 
++    "dom/media/webaudio/test/test_stereoPannerNodePassThrough.html": 1952, 
++    "dom/media/webaudio/test/test_waveShaper.html": 2678, 
++    "dom/media/webaudio/test/test_waveShaperInvalidLengthCurve.html": 2178, 
++    "dom/media/webaudio/test/test_waveShaperNoCurve.html": 2099, 
++    "dom/media/webaudio/test/test_waveShaperPassThrough.html": 2639, 
++    "dom/media/webspeech/recognition/test/test_abort.html": 2753, 
++    "dom/media/webspeech/recognition/test/test_audio_capture_error.html": 3150, 
++    "dom/media/webspeech/recognition/test/test_call_start_from_end_handler.html": 2362, 
++    "dom/media/webspeech/recognition/test/test_recognition_service_error.html": 3203, 
++    "dom/media/webspeech/recognition/test/test_success_without_recognition_service.html": 3262, 
++    "dom/media/webspeech/recognition/test/test_timeout.html": 12037, 
++    "dom/media/webspeech/synth/test/startup/test_voiceschanged.html": 3446, 
++    "dom/media/webspeech/synth/test/test_bfcache.html": 6962, 
++    "dom/media/webspeech/synth/test/test_global_queue.html": 8148, 
++    "dom/media/webspeech/synth/test/test_global_queue_cancel.html": 6752, 
++    "dom/media/webspeech/synth/test/test_global_queue_pause.html": 8877, 
++    "dom/media/webspeech/synth/test/test_indirect_service_events.html": 6641, 
++    "dom/media/webspeech/synth/test/test_setup.html": 3126, 
++    "dom/media/webspeech/synth/test/test_speech_cancel.html": 6803, 
++    "dom/media/webspeech/synth/test/test_speech_error.html": 4592, 
++    "dom/media/webspeech/synth/test/test_speech_queue.html": 11847, 
++    "dom/media/webspeech/synth/test/test_speech_simple.html": 4871
+   }
+ }
+\ No newline at end of file
+diff --git a/testing/runtimes/writeruntimes.py b/testing/runtimes/writeruntimes.py
+old mode 100644
+new mode 100755
+--- a/testing/runtimes/writeruntimes.py
++++ b/testing/runtimes/writeruntimes.py
+@@ -1,11 +1,12 @@
+ 
+ from __future__ import absolute_import, print_function
+ 
++#!/usr/bin/env python
+ from argparse import ArgumentParser
+ from collections import defaultdict
+ import json
+ import os
+ import sys
+ 
+ import requests
+ 

+ 51 - 0
mozilla-release/patches/1395990-1no2-57a1.patch

@@ -0,0 +1,51 @@
+# HG changeset patch
+# User Julian Descottes <jdescottes@mozilla.com>
+# Date 1504283288 -7200
+# Node ID 7d8b0d8d0043676ebebffff324066d783112f579
+# Parent  99690367361a56e11a8851e85f24b158ac8a6fba
+Bug 1395990 - use constant MOZILLA_OFFICIAL to check for local build in ToolboxProcess.jsm;r=bgrins
+
+MozReview-Commit-ID: mzBOBwruL9
+
+diff --git a/devtools/client/framework/ToolboxProcess.jsm b/devtools/client/framework/ToolboxProcess.jsm
+--- a/devtools/client/framework/ToolboxProcess.jsm
++++ b/devtools/client/framework/ToolboxProcess.jsm
+@@ -15,16 +15,19 @@ const { XPCOMUtils } = require("resource
+ 
+ ChromeUtils.defineModuleGetter(this, "Subprocess", "resource://gre/modules/Subprocess.jsm");
+ XPCOMUtils.defineLazyGetter(this, "Telemetry", function () {
+   return require("devtools/client/shared/telemetry");
+ });
+ XPCOMUtils.defineLazyGetter(this, "EventEmitter", function () {
+   return require("devtools/shared/old-event-emitter");
+ });
++XPCOMUtils.defineLazyGetter(this, "system", function () {
++  return require("devtools/shared/system");
++});
+ const promise = require("promise");
+ const Services = require("Services");
+ 
+ this.EXPORTED_SYMBOLS = ["BrowserToolboxProcess"];
+ 
+ var processes = new Set();
+ 
+ /**
+@@ -263,17 +266,17 @@ BrowserToolboxProcess.prototype = {
+ 
+     // During local development, incremental builds can trigger the main process
+     // to clear its startup cache with the "flag file" .purgecaches, but this
+     // file is removed during app startup time, so we aren't able to know if it
+     // was present in order to also clear the child profile's startup cache as
+     // well.
+     //
+     // As an approximation of "isLocalBuild", check for an unofficial build.
+-    if (!Services.appinfo.isOfficial) {
++    if (!system.constants.MOZILLA_OFFICIAL) {
+       args.push("-purgecaches");
+     }
+ 
+     this._dbgProcessPromise = Subprocess.call({
+       command,
+       arguments: args,
+       environmentAppend: true,
+       stderr: "stdout",

+ 62 - 0
mozilla-release/patches/1395990-3-57a1.patch

@@ -0,0 +1,62 @@
+# HG changeset patch
+# User Julian Descottes <jdescottes@mozilla.com>
+# Date 1504285063 -7200
+# Node ID de9a050e5ff08453e47e21e2490a4d40db15df49
+# Parent  7267029c02c66dd2e4b20c2eb410e3f26c5ed6dd
+Bug 1395990 - remove Services.appinfo.isOfficial;r=mossop
+
+MozReview-Commit-ID: 1hohMqK7K90
+
+diff --git a/toolkit/xre/nsAppRunner.cpp b/toolkit/xre/nsAppRunner.cpp
+--- a/toolkit/xre/nsAppRunner.cpp
++++ b/toolkit/xre/nsAppRunner.cpp
+@@ -1011,27 +1011,16 @@ nsXULAppInfo::GetDefaultUpdateChannel(ns
+ NS_IMETHODIMP
+ nsXULAppInfo::GetDistributionID(nsACString& aResult)
+ {
+   aResult.AssignLiteral(MOZ_DISTRIBUTION_ID);
+   return NS_OK;
+ }
+ 
+ NS_IMETHODIMP
+-nsXULAppInfo::GetIsOfficial(bool* aResult)
+-{
+-#ifdef MOZILLA_OFFICIAL
+-  *aResult = true;
+-#else
+-  *aResult = false;
+-#endif
+-  return NS_OK;
+-}
+-
+-NS_IMETHODIMP
+ nsXULAppInfo::GetWindowsDLLBlocklistStatus(bool* aResult)
+ {
+ #if defined(HAS_DLL_BLOCKLIST)
+   *aResult = DllBlocklist_CheckStatus();
+ #else
+   *aResult = false;
+ #endif
+   return NS_OK;
+diff --git a/xpcom/system/nsIXULRuntime.idl b/xpcom/system/nsIXULRuntime.idl
+--- a/xpcom/system/nsIXULRuntime.idl
++++ b/xpcom/system/nsIXULRuntime.idl
+@@ -183,18 +183,13 @@ interface nsIXULRuntime : nsISupports
+   readonly attribute AUTF8String defaultUpdateChannel;
+ 
+   /**
+    * The distribution ID for this build (MOZ_DISTRIBUTION_ID).
+    */
+   readonly attribute AUTF8String distributionID;
+ 
+   /**
+-   * True if this is an official build (MOZILLA_OFFICIAL).
+-   */
+-  readonly attribute boolean isOfficial;
+-
+-  /**
+    * True if Windows DLL blocklist initialized correctly. This is
+    * primarily for automated testing purposes.
+    */
+   readonly attribute boolean windowsDLLBlocklistStatus;
+ };

+ 179 - 0
mozilla-release/patches/1396666-59a1.patch

@@ -0,0 +1,179 @@
+# HG changeset patch
+# User Micah Tigley <tigleym@gmail.com>
+# Date 1515124408 25200
+# Node ID 215da04e16beed4f07f0194cee3333715f510777
+# Parent  9fc080edf812e05cf9f6f136971e3ba89b116330
+Bug 1396666 - Flip the grid line box's number position if there is not enough space along the container edge. r=pbro
+
+MozReview-Commit-ID: 22UyufRUIhH
+
+diff --git a/devtools/server/actors/highlighters/css-grid.js b/devtools/server/actors/highlighters/css-grid.js
+--- a/devtools/server/actors/highlighters/css-grid.js
++++ b/devtools/server/actors/highlighters/css-grid.js
+@@ -64,16 +64,20 @@ const GRID_LINES_PROPERTIES = {
+   }
+ };
+ 
+ const GRID_GAP_PATTERN_WIDTH = 14; // px
+ const GRID_GAP_PATTERN_HEIGHT = 14; // px
+ const GRID_GAP_PATTERN_LINE_DASH = [5, 3]; // px
+ const GRID_GAP_ALPHA = 0.5;
+ 
++// 25 is a good margin distance between the document grid container edge without cutting
++// off parts of the arrow box container.
++const OFFSET_FROM_EDGE = 25;
++
+ /**
+  * Cached used by `CssGridHighlighter.getGridGapPattern`.
+  */
+ const gCachedGridPattern = new Map();
+ 
+ /**
+  * The CssGridHighlighter is the class that overlays a visual grid on top of
+  * display:[inline-]grid elements.
+@@ -1163,58 +1167,130 @@ class CssGridHighlighter extends AutoRef
+         x -= xOffset;
+         y -= yOffset;
+       } else {
+         x += xOffset;
+         y += yOffset;
+       }
+     }
+ 
+-    if (!this.hasNodeTransformations) {
+-      x = Math.max(x, padding);
+-      y = Math.max(y, padding);
+-    }
+-
+-    // Draw a bubble rectanglular arrow with a border width of 2 pixels, a border color
++    // Draw a bubble rectangular arrow with a border width of 2 pixels, a border color
+     // matching the grid color and a white background (the line number will be written in
+     // black).
+     this.ctx.lineWidth = 2 * displayPixelRatio;
+     this.ctx.strokeStyle = this.color;
+     this.ctx.fillStyle = "white";
+ 
+     // See param definitions of drawBubbleRect.
+     let radius = 2 * displayPixelRatio;
+     let margin = 2 * displayPixelRatio;
+     let arrowSize = 8 * displayPixelRatio;
+ 
++    let minOffsetFromEdge = OFFSET_FROM_EDGE * displayPixelRatio;
++
+     let minBoxSize = arrowSize * 2 + padding;
+     boxWidth = Math.max(boxWidth, minBoxSize);
+     boxHeight = Math.max(boxHeight, minBoxSize);
+ 
++    let { width, height } = this._winDimensions;
++
++    let boxAlignment;
++    let textCenterPos;
++
+     if (dimensionType === COLUMNS) {
+       if (lineNumber > 0) {
++        boxAlignment = "top";
++        textCenterPos = (boxHeight + arrowSize + radius) - boxHeight / 2;
++
++        // If there is not enough space for the box number, flip its alignment and
++        // its text position.
++        if (y <= minOffsetFromEdge) {
++          boxAlignment = "bottom";
++          textCenterPos = -((boxHeight + arrowSize + radius) - boxHeight / 2);
++
++          // Maintain a consistent margin between the pointer and viewport edge when the
++          // grid edge falls out of view. We can use the arrow text's padding value to
++          // maintain this distance.
++          if (y + padding < 0 || y === padding) {
++            y = padding;
++          } else {
++            // If the grid edge is still visible, increment the pointer position by its
++            // arrow size so that the it does not cross over edge.
++            y += arrowSize;
++          }
++        }
++
+         drawBubbleRect(this.ctx, x, y, boxWidth, boxHeight, radius, margin, arrowSize,
+-          "top");
++          boxAlignment);
++
+         // After drawing the number box, we need to center the x/y coordinates of the
+         // number text written it.
+-        y -= (boxHeight + arrowSize + radius) - boxHeight / 2;
++        y -= textCenterPos;
+       } else {
++        boxAlignment = "bottom";
++        textCenterPos = (boxHeight + arrowSize + radius) - boxHeight / 2;
++
++        // Flip the negative number when its position reaches 95% of the document's
++        // height/width.
++        if (y / displayPixelRatio >= height * .95) {
++          boxAlignment = "top";
++          textCenterPos = -((boxHeight + arrowSize + radius) - boxHeight / 2);
++
++          if (y + padding > height) {
++            y -= arrowSize;
++          }
++        }
++
+         drawBubbleRect(this.ctx, x, y, boxWidth, boxHeight, radius, margin, arrowSize,
+-          "bottom");
+-        y += (boxHeight + arrowSize + radius) - boxHeight / 2;
++                       boxAlignment);
++
++        y += textCenterPos;
+       }
+-    } else if (dimensionType === ROWS) {
++    }
++
++    if (dimensionType === ROWS) {
+       if (lineNumber > 0) {
++        boxAlignment = "left";
++        textCenterPos = (boxWidth + arrowSize + radius) - boxWidth / 2;
++
++        if (x <= minOffsetFromEdge) {
++          boxAlignment = "right";
++          textCenterPos = -((boxWidth + arrowSize + radius) - boxWidth / 2);
++
++          // See comment above for maintaining a consistent distance between the arrow box
++          // pointer and the edge of the viewport.
++          if (x + padding < 0 || x === padding) {
++            x = padding;
++          } else {
++            x += arrowSize;
++          }
++        }
++
+         drawBubbleRect(this.ctx, x, y, boxWidth, boxHeight, radius, margin, arrowSize,
+-          "left");
+-        x -= (boxWidth + arrowSize + radius) - boxWidth / 2;
++                       boxAlignment);
++
++        x -= textCenterPos;
+       } else {
++        boxAlignment = "right";
++        textCenterPos = (boxWidth + arrowSize + radius) - boxWidth / 2;
++
++        // See above comment for flipping negative numbers .
++        if (x / displayPixelRatio >= width * .95) {
++          boxAlignment = "left";
++          textCenterPos = -((boxWidth + arrowSize + radius) - boxWidth / 2);
++
++          if (x + padding > width) {
++            x -= arrowSize;
++          }
++        }
++
+         drawBubbleRect(this.ctx, x, y, boxWidth, boxHeight, radius, margin, arrowSize,
+-          "right");
+-        x += (boxWidth + arrowSize + radius) - boxWidth / 2;
++                       boxAlignment);
++
++        x += textCenterPos;
+       }
+     }
+ 
+     // Write the line number inside of the rectangle.
+     this.ctx.textAlign = "center";
+     this.ctx.textBaseline = "middle";
+     this.ctx.fillStyle = "black";
+     const numberText = stackedLineIndex ? "" : lineNumber;

+ 31 - 0
mozilla-release/patches/1398904-59a1.patch

@@ -0,0 +1,31 @@
+# HG changeset patch
+# User Brian Grinstead <bgrinstead@mozilla.com>
+# Date 1515471095 28800
+# Node ID ac7f70f6635ab948e746b41d2c812a500858a191
+# Parent  abcda6555f1715609399768aa12e3c50d9e52e54
+Bug 1398904 - Request a longer timeout for browser_webconsole_network_messages_expand.js;r=bgrins
+
+MozReview-Commit-ID: 5DGHBud7tTH
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_network_messages_expand.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_network_messages_expand.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_network_messages_expand.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_network_messages_expand.js
+@@ -5,16 +5,18 @@
+ 
+ const TEST_FILE = "test-network-request.html";
+ const TEST_PATH = "http://example.com/browser/devtools/client/webconsole/new-console-output/test/mochitest/";
+ const TEST_URI = TEST_PATH + TEST_FILE;
+ 
+ const NET_PREF = "devtools.webconsole.filter.net";
+ const XHR_PREF = "devtools.webconsole.filter.netxhr";
+ 
++requestLongerTimeout(2);
++
+ Services.prefs.setBoolPref(NET_PREF, false);
+ Services.prefs.setBoolPref(XHR_PREF, true);
+ registerCleanupFunction(() => {
+   Services.prefs.clearUserPref(NET_PREF);
+   Services.prefs.clearUserPref(XHR_PREF);
+ });
+ 
+ let tabs = [{

+ 254 - 0
mozilla-release/patches/1401548-59a1.patch

@@ -0,0 +1,254 @@
+# HG changeset patch
+# User Julian Descottes <jdescottes@mozilla.com>
+# Date 1511968290 -3600
+# Node ID 897dda0b93d8e34d32bf607749414285cb912be9
+# Parent  93b864f872a2e41d9c22144b5f3950556dde380d
+Bug 1401548 - rename and enable browser_bug_869003_inspect_cross_domain_object.js;r=nchevobbe
+
+MozReview-Commit-ID: 6RnfOEsLQW1
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -79,18 +79,16 @@ support-files =
+   test-bug-766001-console-log.js
+   test-bug-766001-js-console-links.html
+   test-bug-766001-js-errors.js
+   test-bug-782653-css-errors-1.css
+   test-bug-782653-css-errors-2.css
+   test-bug-782653-css-errors.html
+   test-bug-837351-security-errors.html
+   test-bug-859170-longstring-hang.html
+-  test-bug-869003-iframe.html
+-  test-bug-869003-top-window.html
+   test-bug-952277-highlight-nodes-in-vview.html
+   test-iframe-child.html
+   test-iframe-parent.html
+   test-certificate-messages.html
+   test-click-function-to-source.html
+   test-click-function-to-source.js
+   test-closure-optimized-out.html
+   test-closures.html
+@@ -128,16 +126,18 @@ support-files =
+   test-filter.html
+   test-for-of.html
+   test-iframe-762593-insecure-form-action.html
+   test-iframe-762593-insecure-frame.html
+   test-iframe1.html
+   test-iframe2.html
+   test-iframe3.html
+   test-image.png
++  test-inspect-cross-domain-objects-frame.html
++  test-inspect-cross-domain-objects-top.html
+   test-jsterm-dollar.html
+   test-location-debugger-link-console-log.js
+   test-location-debugger-link-errors.js
+   test-location-debugger-link.html
+   test-location-styleeditor-link-1.css
+   test-location-styleeditor-link-2.css
+   test-location-styleeditor-link.html
+   test-mixedcontent-securityerrors.html
+@@ -310,17 +310,16 @@ skip-if = true #       Bug 1404371
+ skip-if = true #       Bug 1405343
+ [browser_webconsole_input_focus.js]
+ [browser_webconsole_insecure_passwords_about_blank_web_console_warning.js]
+ skip-if = true #       Bug 1404884
+ [browser_webconsole_insecure_passwords_web_console_warning.js]
+ skip-if = true #       Bug 1404888
+ # old console skip-if = true # Bug 1110500 - mouse event failure in test
+ [browser_webconsole_inspect_cross_domain_object.js]
+-skip-if = true #       Bug 1401548
+ [browser_webconsole_iterators_generators.js]
+ skip-if = true #       Bug 1404849
+ # old console skip-if = e10s # Bug 1042253 - webconsole tests disabled with e10s
+ [browser_webconsole_js_input_expansion.js]
+ [browser_webconsole_jsterm.js]
+ skip-if = true #       Bug 1405352
+ # old console skip-if = e10s # Bug 1042253 - webconsole e10s tests (Linux debug timeout)
+ [browser_webconsole_jsterm_copy.js]
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_inspect_cross_domain_object.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_inspect_cross_domain_object.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_inspect_cross_domain_object.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_inspect_cross_domain_object.js
+@@ -4,80 +4,72 @@
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+ // Check that users can inspect objects logged from cross-domain iframes -
+ // bug 869003.
+ 
+ "use strict";
+ 
+ const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
+-                 "test/test-bug-869003-top-window.html";
++                 "new-console-output/test/mochitest/" +
++                 "test-inspect-cross-domain-objects-top.html";
+ 
+-add_task(function* () {
+-  // This test is slightly more involved: it opens the web console, then the
+-  // variables view for a given object, it updates a property in the view and
+-  // checks the result. We can get a timeout with debug builds on slower
+-  // machines.
++add_task(async function () {
+   requestLongerTimeout(2);
+ 
+-  yield loadTab("data:text/html;charset=utf8,<p>hello");
+-  let hud = yield openConsole();
++  let hud = await openNewTabAndConsole("data:text/html;charset=utf8,<p>hello");
++
++  info("Wait for the 'foobar' message to be logged by the frame");
++  let onMessage = waitForMessage(hud, "foobar");
++  BrowserTestUtils.loadURI(gBrowser.selectedBrowser, TEST_URI);
++  let {node} = await onMessage;
++
++  const objectInspectors = [...node.querySelectorAll(".tree")];
++  is(objectInspectors.length, 2, "There is the expected number of object inspectors");
++
++  const [oi1, oi2] = objectInspectors;
+ 
+-  BrowserTestUtils.loadURI(gBrowser.selectedBrowser, TEST_URI);
++  info("Expanding the first object inspector");
++  await expandObjectInspector(oi1);
++
++  // The first object inspector now looks like:
++  // ▼ {…}
++  // |  bug: 869003
++  // |  hello: "world!"
++  // |  ▶︎ __proto__: Object { … }
++
++  let oi1Nodes = oi1.querySelectorAll(".node");
++  is(oi1Nodes.length, 4, "There is the expected number of nodes in the tree");
++  ok(oi1.textContent.includes("bug: 869003"), "Expected content");
++  ok(oi1.textContent.includes('hello: "world!"'), "Expected content");
+ 
+-  let [result] = yield waitForMessages({
+-    webconsole: hud,
+-    messages: [{
+-      name: "console.log message",
+-      text: "foobar",
+-      category: CATEGORY_WEBDEV,
+-      severity: SEVERITY_LOG,
+-      objects: true,
+-    }],
++  info("Expanding the second object inspector");
++  await expandObjectInspector(oi2);
++
++  // The second object inspector now looks like:
++  // ▼ func()
++  // |  arguments: null
++  // |  bug: 869003
++  // |  caller: null
++  // |  hello: "world!"
++  // |  length: 1
++  // |  name: "func"
++  // |  ▶︎ prototype: Object { … }
++  // |  ▶︎ __proto__: function ()
++
++  let oi2Nodes = oi2.querySelectorAll(".node");
++  is(oi2Nodes.length, 9, "There is the expected number of nodes in the tree");
++  ok(oi2.textContent.includes("arguments: null"), "Expected content");
++  ok(oi2.textContent.includes("bug: 869003"), "Expected content");
++  ok(oi2.textContent.includes("caller: null"), "Expected content");
++  ok(oi2.textContent.includes('hello: "world!"'), "Expected content");
++  ok(oi2.textContent.includes("length: 1"), "Expected content");
++  ok(oi2.textContent.includes('name: "func"'), "Expected content");
++});
++
++function expandObjectInspector(oi) {
++  let onMutation = waitForNodeMutation(oi, {
++    childList: true
+   });
+ 
+-  let msg = [...result.matched][0];
+-  ok(msg, "message element");
+-
+-  let body = msg.querySelector(".message-body");
+-  ok(body, "message body");
+-  ok(body.textContent.includes('{ hello: "world!",'), "message text check");
+-  ok(body.textContent.includes('function func()'), "message text check");
+-
+-  yield testClickable(result.clickableElements[0], [
+-    { name: "hello", value: "world!" },
+-    { name: "bug", value: 869003 },
+-  ], hud);
+-  yield testClickable(result.clickableElements[1], [
+-    { name: "hello", value: "world!" },
+-    { name: "name", value: "func" },
+-    { name: "length", value: 1 },
+-  ], hud);
+-});
+-
+-function* testClickable(clickable, props, hud) {
+-  ok(clickable, "clickable object found");
+-
+-  executeSoon(() => {
+-    EventUtils.synthesizeMouse(clickable, 2, 2, {}, hud.iframeWindow);
+-  });
+-
+-  let aVar = yield hud.jsterm.once("variablesview-fetched");
+-  ok(aVar, "variables view fetched");
+-  ok(aVar._variablesView, "variables view object");
+-
+-  let [result] = yield findVariableViewProperties(aVar, props, { webconsole: hud });
+-  let prop = result.matchedProp;
+-  ok(prop, "matched the |" + props[0].name + "| property in the variables view");
+-
+-  // Check that property value updates work.
+-  aVar = yield updateVariablesViewProperty({
+-    property: prop,
+-    field: "value",
+-    string: "'omgtest'",
+-    webconsole: hud,
+-  });
+-
+-  info("onFetchAfterUpdate");
+-
+-  props[0].value = "omgtest";
+-  yield findVariableViewProperties(aVar, props, { webconsole: hud });
++  oi.querySelector(".arrow").click();
++  return onMutation;
+ }
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-869003-iframe.html b/devtools/client/webconsole/new-console-output/test/mochitest/test-inspect-cross-domain-objects-frame.html
+rename from devtools/client/webconsole/new-console-output/test/mochitest/test-bug-869003-iframe.html
+rename to devtools/client/webconsole/new-console-output/test/mochitest/test-inspect-cross-domain-objects-frame.html
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-869003-iframe.html
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/test-inspect-cross-domain-objects-frame.html
+@@ -3,19 +3,19 @@
+   <head>
+     <meta charset="utf-8">
+     <title>Web Console test for bug 869003</title>
+     <!-- Any copyright is dedicated to the Public Domain.
+        - http://creativecommons.org/publicdomain/zero/1.0/ -->
+     <script type="text/javascript"><!--
+       window.onload = function testConsoleLogging()
+       {
+-        var o = { hello: "world!", bug: 869003 };
+-        var f = Object.assign(function func(arg){}, o);
+-        console.log("foobar", o, f);
++        var obj1 = { hello: "world!", bug: 869003 };
++        var obj2 = Object.assign(function func(arg){}, obj1);
++        console.log("foobar", obj1, obj2);
+       };
+     // --></script>
+   </head>
+   <body>
+     <p>Make sure users can inspect objects from cross-domain iframes.</p>
+     <p>Iframe window.</p>
+   </body>
+ </html>
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-869003-top-window.html b/devtools/client/webconsole/new-console-output/test/mochitest/test-inspect-cross-domain-objects-top.html
+rename from devtools/client/webconsole/new-console-output/test/mochitest/test-bug-869003-top-window.html
+rename to devtools/client/webconsole/new-console-output/test/mochitest/test-inspect-cross-domain-objects-top.html
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-869003-top-window.html
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/test-inspect-cross-domain-objects-top.html
+@@ -4,11 +4,11 @@
+     <meta charset="utf-8">
+     <title>Web Console test for bug 869003</title>
+     <!-- Any copyright is dedicated to the Public Domain.
+        - http://creativecommons.org/publicdomain/zero/1.0/ -->
+   </head>
+   <body>
+     <p>Make sure users can inspect objects from cross-domain iframes.</p>
+     <p>Top window.</p>
+-    <iframe src="http://example.org/browser/devtools/client/webconsole/test/test-bug-869003-iframe.html"></iframe>
++    <iframe src="http://example.org/browser/devtools/client/webconsole/new-console-output/test/mochitest/test-inspect-cross-domain-objects-frame.html"></iframe>
+   </body>
+ </html>

+ 198 - 0
mozilla-release/patches/1401944-59a1.patch

@@ -0,0 +1,198 @@
+# HG changeset patch
+# User Nicolas Chevobbe <nchevobbe@mozilla.com>
+# Date 1512463762 -3600
+# Node ID ea00ea69cb7e1b80a9cb31cf797efa891cbccc5f
+# Parent  40fa69b2a422464ee3c4c978cc856d0ae250b1f2
+Bug 1401944 - Delete browser_webconsole_copy_link_location in new console frontend; r=jdescottes.
+
+The test was already migrated. Took this as an opportunity to refactor the
+migrated test a bit.
+
+MozReview-Commit-ID: CjbBelrWjS8
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -254,18 +254,16 @@ skip-if = (os == 'linux' && bits == 32 &
+ [browser_webconsole_context_menu_copy_link_location.js]
+ subsuite = clipboard
+ skip-if = (os == 'linux' && bits == 32 && debug) # bug 1328915, disable linux32 debug devtools for timeouts
+ [browser_webconsole_context_menu_copy_object.js]
+ subsuite = clipboard
+ [browser_webconsole_context_menu_object_in_sidebar.js]
+ [browser_webconsole_context_menu_open_url.js]
+ [browser_webconsole_context_menu_store_as_global.js]
+-[browser_webconsole_copy_link_location.js]
+-skip-if = true # Bug 1401944
+ [browser_webconsole_csp_ignore_reflected_xss_message.js]
+ skip-if = (e10s && debug) || (e10s && os == 'win') # Bug 1221499 enabled these on windows
+ [browser_webconsole_cspro.js]
+ skip-if = true # Bug 1408932
+ # old console skip-if = e10s && (os == 'win' || os == 'mac') # Bug 1243967
+ [browser_webconsole_ctrl_key_nav.js]
+ skip-if = true # Bug 1408933
+ # old console skip-if = os != "mac"
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_context_menu_copy_link_location.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_context_menu_copy_link_location.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_context_menu_copy_link_location.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_context_menu_copy_link_location.js
+@@ -17,42 +17,44 @@ add_task(async function() {
+   await pushPref("devtools.webconsole.filter.net", true);
+ 
+   let hud = await openNewTabAndConsole(TEST_URI);
+   hud.jsterm.clearOutput();
+ 
+   info("Test Copy URL menu item for text log");
+ 
+   info("Logging a text message in the content window");
++  let onLogMessage = waitForMessage(hud, "simple text message");
+   await ContentTask.spawn(gBrowser.selectedBrowser, null, () => {
+     content.wrappedJSObject.console.log("simple text message");
+   });
+-  let message = await waitFor(() => findMessage(hud, "simple text message"));
++  let message = await onLogMessage;
+   ok(message, "Text log found in the console");
+ 
+   info("Open and check the context menu for the logged text message");
+-  let menuPopup = await openContextMenu(hud, message);
++  let menuPopup = await openContextMenu(hud, message.node);
+   let copyURLItem = menuPopup.querySelector(CONTEXT_MENU_ID);
+   ok(!copyURLItem, "Copy URL menu item is hidden for a simple text message");
+ 
+   await hideContextMenu(hud);
+   hud.jsterm.clearOutput();
+ 
+   info("Test Copy URL menu item for network log");
+ 
+   info("Reload the content window to produce a network log");
++  let onNetworkMessage = waitForMessage(hud, "test-console.html");
+   await ContentTask.spawn(gBrowser.selectedBrowser, null, () => {
+     content.wrappedJSObject.location.reload();
+   });
+ 
+-  message = await waitFor(() => findMessage(hud, "test-console.html"));
++  message = await onNetworkMessage;
+   ok(message, "Network log found in the console");
+ 
+   info("Open and check the context menu for the logged network message");
+-  menuPopup = await openContextMenu(hud, message);
++  menuPopup = await openContextMenu(hud, message.node);
+   copyURLItem = menuPopup.querySelector(CONTEXT_MENU_ID);
+   ok(copyURLItem, "Copy url menu item is available in context menu");
+ 
+   info("Click on Copy URL menu item and wait for clipboard to be updated");
+   await waitForClipboardPromise(() => copyURLItem.click(), TEST_URI);
+   ok(true, "Expected text was copied to the clipboard.");
+ 
+   await hideContextMenu(hud);
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_copy_link_location.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_copy_link_location.js
+deleted file mode 100644
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_copy_link_location.js
++++ /dev/null
+@@ -1,107 +0,0 @@
+-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+-/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+-/* Any copyright is dedicated to the Public Domain.
+- * http://creativecommons.org/publicdomain/zero/1.0/ */
+-
+-// Test for the "Copy link location" context menu item shown when you right
+-// click network requests in the output. See Bug 638949.
+-
+-"use strict";
+-
+-add_task(function* () {
+-  const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
+-    "test/test-console.html?_date=" + Date.now();
+-  const COMMAND_NAME = "consoleCmd_copyURL";
+-  const CONTEXT_MENU_ID = "#menu_copyURL";
+-
+-  registerCleanupFunction(() => {
+-    Services.prefs.clearUserPref("devtools.webconsole.filter.networkinfo");
+-  });
+-
+-  Services.prefs.setBoolPref("devtools.webconsole.filter.networkinfo", true);
+-
+-  yield loadTab(TEST_URI);
+-  let hud = yield openConsole();
+-  let output = hud.outputNode;
+-  let menu = hud.iframeWindow.document.getElementById("output-contextmenu");
+-
+-  hud.jsterm.clearOutput();
+-  content.console.log("bug 638949");
+-
+-  // Test that the "Copy Link Location" command is disabled for non-network
+-  // messages.
+-  let [result] = yield waitForMessages({
+-    webconsole: hud,
+-    messages: [{
+-      text: "bug 638949",
+-      category: CATEGORY_WEBDEV,
+-      severity: SEVERITY_LOG,
+-    }],
+-  });
+-
+-  output.focus();
+-  let message = [...result.matched][0];
+-
+-  goUpdateCommand(COMMAND_NAME);
+-  ok(!isEnabled(), COMMAND_NAME + " is disabled");
+-
+-  // Test that the "Copy Link Location" menu item is hidden for non-network
+-  // messages.
+-  yield waitForContextMenu(menu, message, () => {
+-    let isHidden = menu.querySelector(CONTEXT_MENU_ID).hidden;
+-    ok(isHidden, CONTEXT_MENU_ID + " is hidden");
+-  });
+-
+-  hud.jsterm.clearOutput();
+-  // Reloading will produce network logging
+-  content.location.reload();
+-
+-  // Test that the "Copy Link Location" command is enabled and works
+-  // as expected for any network-related message.
+-  // This command should copy only the URL.
+-  [result] = yield waitForMessages({
+-    webconsole: hud,
+-    messages: [{
+-      text: "test-console.html",
+-      category: CATEGORY_NETWORK,
+-      severity: SEVERITY_LOG,
+-    }],
+-  });
+-
+-  output.focus();
+-  message = [...result.matched][0];
+-  hud.ui.output.selectMessage(message);
+-
+-  goUpdateCommand(COMMAND_NAME);
+-  ok(isEnabled(), COMMAND_NAME + " is enabled");
+-
+-  info("expected clipboard value: " + message.url);
+-
+-  let deferred = defer();
+-
+-  waitForClipboard((aData) => {
+-    return aData.trim() == message.url;
+-  }, () => {
+-    goDoCommand(COMMAND_NAME);
+-  }, () => {
+-    deferred.resolve(null);
+-  }, () => {
+-    deferred.reject(null);
+-  });
+-
+-  yield deferred.promise;
+-
+-  // Test that the "Copy Link Location" menu item is visible for network-related
+-  // messages.
+-  yield waitForContextMenu(menu, message, () => {
+-    let isVisible = !menu.querySelector(CONTEXT_MENU_ID).hidden;
+-    ok(isVisible, CONTEXT_MENU_ID + " is visible");
+-  });
+-
+-  // Return whether "Copy Link Location" command is enabled or not.
+-  function isEnabled() {
+-    let controller = top.document.commandDispatcher
+-                     .getControllerForCommand(COMMAND_NAME);
+-    return controller && controller.isCommandEnabled(COMMAND_NAME);
+-  }
+-});

+ 3 - 3
mozilla-release/patches/1401953-59a1.patch

@@ -2,7 +2,7 @@
 # User Julian Descottes <jdescottes@mozilla.com>
 # Date 1515441985 -3600
 # Node ID d9afc5417979939d64843b12458ada9f64445f4f
-# Parent  611f58ea48ecf7e56106c3c4a325d33b0e0e71a5
+# Parent  13d4bf9010b306de379192f6bf5028cf57842b29
 Bug 1401953 - enable browser_webconsole_repeat_different_objects.js;r=nchevobbe
 
 MozReview-Commit-ID: AVWJGeKrcCe
@@ -10,14 +10,14 @@ MozReview-Commit-ID: AVWJGeKrcCe
 diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
 --- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
 +++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
-@@ -410,17 +410,16 @@ skip-if = true # Bug 1406841
+@@ -358,17 +358,16 @@ skip-if = true #       Bug 1405641
+ skip-if = true # Bug 1406841
  #old console skip-if = e10s # Bug 1042253 - webconsole tests disabled with e10s
  [browser_webconsole_prune_scroll.js]
  skip-if = true #       Bug 1404832
  [browser_webconsole_reflow.js]
  skip-if = true #       Bug 1406022
  [browser_webconsole_reopen_closed_tab.js]
- skip-if = true # Bug 1408947
  [browser_webconsole_repeat_different_objects.js]
 -skip-if = true #       Bug 1401953
  [browser_webconsole_repeated_messages_accuracy.js]

+ 137 - 0
mozilla-release/patches/1401958-58a1.patch

@@ -0,0 +1,137 @@
+# HG changeset patch
+# User Nicolas Chevobbe <nchevobbe@mozilla.com>
+# Date 1510052757 -3600
+# Node ID 4c387a97b26ed2c8eda0d013c03dddc6619b8d84
+# Parent  4af191813173743ea7363d78a26adf84909d8f26
+Bug 1401958 - Remove browser_webconsole_copy_entire_message_context_menu.js; r=Honza.
+
+The test already exists with a different name (browser_webconsole_context_menu_copy_entire_message).
+
+MozReview-Commit-ID: 9NmXosnAVAi
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -260,20 +260,16 @@ skip-if = (os == 'linux' && bits == 32 &
+ [browser_webconsole_context_menu_copy_link_location.js]
+ subsuite = clipboard
+ skip-if = (os == 'linux' && bits == 32 && debug) # bug 1328915, disable linux32 debug devtools for timeouts
+ [browser_webconsole_context_menu_copy_object.js]
+ subsuite = clipboard
+ [browser_webconsole_context_menu_object_in_sidebar.js]
+ [browser_webconsole_context_menu_open_url.js]
+ [browser_webconsole_context_menu_store_as_global.js]
+-[browser_webconsole_copy_entire_message_context_menu.js]
+-subsuite = clipboard
+-skip-if = true #       Bug 1401958
+-# old console skip-if = (os == 'linux' && bits == 32 && debug) # bug 1328915, disable linux32 debug devtools for timeouts
+ [browser_webconsole_copy_link_location.js]
+ skip-if = true #       Bug 1401944
+ [browser_webconsole_csp_ignore_reflected_xss_message.js]
+ skip-if = true # Bug 1408931
+ # old console skip-if = (e10s && debug) || (e10s && os == 'win') # Bug 1221499 enabled these on windows
+ [browser_webconsole_cspro.js]
+ skip-if = true # Bug 1408932
+ # old console skip-if = e10s && (os == 'win' || os == 'mac') # Bug 1243967
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_copy_entire_message_context_menu.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_copy_entire_message_context_menu.js
+deleted file mode 100644
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_copy_entire_message_context_menu.js
++++ /dev/null
+@@ -1,97 +0,0 @@
+-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+-/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+-/* Any copyright is dedicated to the Public Domain.
+- * http://creativecommons.org/publicdomain/zero/1.0/ */
+-
+-/* globals goDoCommand */
+-
+-"use strict";
+-
+-// Test copying of the entire console message when right-clicked
+-// with no other text selected. See Bug 1100562.
+-
+-add_task(function* () {
+-  let hud;
+-  let outputNode;
+-  let contextMenu;
+-
+-  const TEST_URI = "http://example.com/browser/devtools/client/webconsole/test/test-console.html";
+-
+-  const { tab, browser } = yield loadTab(TEST_URI);
+-  hud = yield openConsole(tab);
+-  outputNode = hud.outputNode;
+-  contextMenu = hud.iframeWindow.document.getElementById("output-contextmenu");
+-
+-  registerCleanupFunction(() => {
+-    hud = outputNode = contextMenu = null;
+-  });
+-
+-  hud.jsterm.clearOutput();
+-
+-  yield ContentTask.spawn(browser, {}, function* () {
+-    let button = content.document.getElementById("testTrace");
+-    button.click();
+-  });
+-
+-  let results = yield waitForMessages({
+-    webconsole: hud,
+-    messages: [
+-      {
+-        text: "bug 1100562",
+-        category: CATEGORY_WEBDEV,
+-        severity: SEVERITY_LOG,
+-        lines: 1,
+-      },
+-      {
+-        name: "console.trace output",
+-        consoleTrace: true,
+-        lines: 3,
+-      },
+-    ]
+-  });
+-
+-  outputNode.focus();
+-
+-  for (let result of results) {
+-    let message = [...result.matched][0];
+-
+-    yield waitForContextMenu(contextMenu, message, () => {
+-      let copyItem = contextMenu.querySelector("#cMenu_copy");
+-      copyItem.doCommand();
+-
+-      let controller = top.document.commandDispatcher
+-                                   .getControllerForCommand("cmd_copy");
+-      is(controller.isCommandEnabled("cmd_copy"), true, "cmd_copy is enabled");
+-    });
+-
+-    let clipboardText;
+-
+-    yield waitForClipboardPromise(
+-      () => goDoCommand("cmd_copy"),
+-      (str) => {
+-        clipboardText = str;
+-        return message.textContent == clipboardText;
+-      }
+-    );
+-
+-    ok(clipboardText, "Clipboard text was found and saved");
+-
+-    let lines = clipboardText.split("\n");
+-    ok(lines.length > 0, "There is at least one newline in the message");
+-    is(lines.pop(), "", "There is a newline at the end");
+-    is(lines.length, result.lines, `There are ${result.lines} lines in the message`);
+-
+-    // Test the first line for "timestamp message repeat file:line"
+-    let firstLine = lines.shift();
+-    ok(/^[\d:.]+ .+ \d+ .+:\d+$/.test(firstLine),
+-      "The message's first line has the right format");
+-
+-    // Test the remaining lines (stack trace) for "TABfunctionName sourceURL:line:col"
+-    for (let line of lines) {
+-      ok(/^\t.+ .+:\d+:\d+$/.test(line), "The stack trace line has the right format");
+-    }
+-  }
+-
+-  yield closeConsole(tab);
+-  yield finishTest();
+-});

+ 258 - 0
mozilla-release/patches/1403196-60a1.patch

@@ -0,0 +1,258 @@
+# HG changeset patch
+# User Julian Descottes <jdescottes@mozilla.com>
+# Date 1518439654 -3600
+# Node ID 168e7da279d577da4e8d72d712b578571c0de00d
+# Parent  eeef24142009678e68b822f960a563b2317f1449
+Bug 1403196 - rename and enable browser_webconsole_object_inspector_key_sorting.js;r=bgrins
+
+MozReview-Commit-ID: DfjO8aQqnsD
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -314,16 +314,17 @@ skip-if = true #       Bug 1403448
+ [browser_webconsole_network_messages_status_code.js]
+ [browser_webconsole_network_requests_from_chrome.js]
+ [browser_webconsole_network_reset_filter.js]
+ [browser_webconsole_nodes_highlight.js]
+ [browser_webconsole_nodes_select.js]
+ [browser_webconsole_object_in_sidebar.js]
+ [browser_webconsole_object_inspector.js]
+ [browser_webconsole_object_inspector_entries.js]
++[browser_webconsole_object_inspector_key_sorting.js]
+ [browser_webconsole_object_inspector_while_debugging_and_inspecting.js]
+ [browser_webconsole_observer_notifications.js]
+ [browser_webconsole_optimized_out_vars.js]
+ [browser_webconsole_output_copy.js]
+ subsuite = clipboard
+ [browser_webconsole_output_copy_newlines.js]
+ subsuite = clipboard
+ [browser_webconsole_output_order.js]
+@@ -356,17 +357,15 @@ skip-if = true #       Bug 1405649
+ [browser_webconsole_stacktrace_location_scratchpad_link.js]
+ [browser_webconsole_strict_mode_errors.js]
+ [browser_webconsole_string.js]
+ [browser_webconsole_time_methods.js]
+ skip-if = true #       Bug 1404877
+ [browser_webconsole_timestamps.js]
+ [browser_webconsole_trackingprotection_errors.js]
+ tags = trackingprotection
+-[browser_webconsole_variables_view_dont_sort_non_sortable_classes_properties.js]
+-skip-if = true #       Bug 1403196
+ [browser_webconsole_view_source.js]
+ [browser_webconsole_violation.js]
+ skip-if = true #       Bug 1405245
+ # old console skip-if = e10s && (os == 'win') # Bug 1264955
+ [browser_webconsole_visibility_messages.js]
+ [browser_webconsole_warn_about_replaced_api.js]
+ [browser_webconsole_websocket.js]
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_variables_view_dont_sort_non_sortable_classes_properties.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_object_inspector_key_sorting.js
+rename from devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_variables_view_dont_sort_non_sortable_classes_properties.js
+rename to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_object_inspector_key_sorting.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_variables_view_dont_sort_non_sortable_classes_properties.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_object_inspector_key_sorting.js
+@@ -1,135 +1,100 @@
+ /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+ /* Any copyright is dedicated to the Public Domain.
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+ "use strict";
+ 
+-/* Test case that ensures Array and other list types are not sorted in variables
+- * view.
++/* Test case that ensures Array and other list types are not alphabetically sorted in the
++ * Object Inspector.
+  *
+  * The tested types are:
+  *  - Array
++ *  - NodeList
++ *  - Object
+  *  - Int8Array
+  *  - Int16Array
+  *  - Int32Array
+  *  - Uint8Array
+  *  - Uint16Array
+  *  - Uint32Array
+  *  - Uint8ClampedArray
+  *  - Float32Array
+  *  - Float64Array
+- *  - NodeList
+  */
+ 
+-function test() {
+-  const TEST_URI = "data:text/html;charset=utf-8,   \
+-    <html>                                          \
+-      <head>                                        \
+-        <title>Test document for bug 977500</title> \
+-      </head>                                       \
+-      <body>                                        \
+-      <div></div>                                   \
+-      <div></div>                                   \
+-      <div></div>                                   \
+-      <div></div>                                   \
+-      <div></div>                                   \
+-      <div></div>                                   \
+-      <div></div>                                   \
+-      <div></div>                                   \
+-      <div></div>                                   \
+-      <div></div>                                   \
+-      <div></div>                                   \
+-      <div></div>                                   \
+-      </body>                                       \
+-    </html>";
+-
+-  let jsterm;
++const TEST_URI = `data:text/html;charset=utf-8,
++  <html>
++    <head>
++      <title>Test document for bug 977500</title>
++    </head>
++    <body>
++    <div></div> <div></div> <div></div>
++    <div></div> <div></div> <div></div>
++    <div></div> <div></div> <div></div>
++    <div></div> <div></div> <div></div>
++    </body>
++  </html>`;
+ 
+-  function* runner() {
+-    const typedArrayTypes = ["Int8Array", "Int16Array", "Int32Array",
+-                             "Uint8Array", "Uint16Array", "Uint32Array",
+-                             "Uint8ClampedArray", "Float32Array",
+-                             "Float64Array"];
+-
+-    const {tab} = yield loadTab(TEST_URI);
+-    const hud = yield openConsole(tab);
+-    jsterm = hud.jsterm;
++const typedArrayTypes = [
++  "Int8Array",
++  "Int16Array",
++  "Int32Array",
++  "Uint8Array",
++  "Uint16Array",
++  "Uint32Array",
++  "Uint8ClampedArray",
++  "Float32Array",
++  "Float64Array"
++];
+ 
+-    // Create an ArrayBuffer of 80 bytes to test TypedArrays. 80 bytes is
+-    // enough to get 10 items in all different TypedArrays.
+-    yield jsterm.execute("let buf = new ArrayBuffer(80);");
++add_task(async function () {
++  const hud = await openNewTabAndConsole(TEST_URI);
+ 
+-    // Array
+-    yield testNotSorted("Array(0,1,2,3,4,5,6,7,8,9,10)");
+-    // NodeList
+-    yield testNotSorted("document.querySelectorAll('div')");
+-    // Object
+-    yield testSorted("Object({'hello':1,1:5,10:2,4:2,'abc':1})");
+-
+-    // Typed arrays.
+-    for (let type of typedArrayTypes) {
+-      yield testNotSorted("new " + type + "(buf)");
+-    }
+-  }
++  // Array
++  await testKeyOrder(hud, "Array(0,1,2,3,4,5,6,7,8,9,10)",
++                    ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]);
++  // NodeList
++  await testKeyOrder(hud, "document.querySelectorAll('div')",
++                    ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]);
++  // Object
++  await testKeyOrder(hud, "Object({'hello':1, 1:5, 10:2, 4:2, 'abc':1})",
++                    ["1", "4", "10", "abc", "hello"]);
+ 
+-  /**
+-   * A helper that ensures the properties are not sorted when an object
+-   * specified by aObject is inspected.
+-   *
+-   * @param string aObject
+-   *        A string that, once executed, creates and returns the object to
+-   *        inspect.
+-   */
+-  function* testNotSorted(aObject) {
+-    info("Testing " + aObject);
+-    let deferred = defer();
+-    jsterm.once("variablesview-fetched", (_, aVar) => deferred.resolve(aVar));
+-    jsterm.execute("inspect(" + aObject + ")");
+-
+-    let variableScope = yield deferred.promise;
+-    ok(variableScope, "Variables view opened");
+-
+-    // If the properties are sorted: keys = ["0", "1", "10",...] <- incorrect
+-    // If the properties are not sorted: keys = ["0", "1", "2",...] <- correct
+-    let keyIterator = variableScope._store.keys();
+-    is(keyIterator.next().value, "0", "First key is 0");
+-    is(keyIterator.next().value, "1", "Second key is 1");
+-
+-    // If the properties are sorted, the next one will be 10.
+-    is(keyIterator.next().value, "2", "Third key is 2, not 10");
++  // Typed arrays.
++  for (let type of typedArrayTypes) {
++    // size of 80 is enough to get 11 items on all ArrayTypes except for Float64Array.
++    let size = type === "Float64Array" ? 120 : 80;
++    await testKeyOrder(hud, `new ${type}(new ArrayBuffer(${size}))`,
++                      ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]);
+   }
+-  /**
+-   * A helper that ensures the properties are sorted when an object
+-   * specified by aObject is inspected.
+-   *
+-   * @param string aObject
+-   *        A string that, once executed, creates and returns the object to
+-   *        inspect.
+-   */
+-  function* testSorted(aObject) {
+-    info("Testing " + aObject);
+-    let deferred = defer();
+-    jsterm.once("variablesview-fetched", (_, aVar) => deferred.resolve(aVar));
+-    jsterm.execute("inspect(" + aObject + ")");
++});
+ 
+-    let variableScope = yield deferred.promise;
+-    ok(variableScope, "Variables view opened");
++async function testKeyOrder(hud, command, expectedKeys) {
++  info(`Testing command: [${command}]`);
+ 
+-    // If the properties are sorted:
+-    // keys = ["1", "4", "10",..., "abc", "hello"] <- correct
+-    // If the properties are not sorted:
+-    // keys = ["1", "10", "4",...] <- incorrect
+-    let keyIterator = variableScope._store.keys();
+-    is(keyIterator.next().value, "1", "First key should be 1");
+-    is(keyIterator.next().value, "4", "Second key should be 4");
++  info("Wait for a new .result message with an object inspector to be displayed");
++  let resultsCount = findMessages(hud, "", ".result").length;
++  hud.jsterm.execute(command);
++  let oi = await waitFor(() => {
++    let results = findMessages(hud, "", ".result");
++    if (results.length == resultsCount + 1) {
++      return results.pop().querySelector(".tree");
++    }
++    return false;
++  });
+ 
+-    // If the properties are sorted, the next one will be 10.
+-    is(keyIterator.next().value, "10", "Third key is 10");
+-    // If sorted next properties should be "abc" then "hello"
+-    is(keyIterator.next().value, "abc", "Fourth key is abc");
+-    is(keyIterator.next().value, "hello", "Fifth key is hello");
++  info("Expand object inspector");
++  let onOiExpanded = waitFor(() => {
++    return oi.querySelectorAll(".node").length >= expectedKeys.length;
++  });
++  oi.querySelector(".arrow").click();
++  await onOiExpanded;
++
++  let labelNodes = oi.querySelectorAll(".object-label");
++  for (let i = 0; i < expectedKeys.length; i++) {
++    let key = expectedKeys[i];
++    let labelNode = labelNodes[i];
++    is(labelNode.textContent, key, `Object inspector key is sorted as expected (${key})`);
+   }
+-
+-  Task.spawn(runner).then(finishTest);
+ }

+ 149 - 0
mozilla-release/patches/1403200-60a1.patch

@@ -0,0 +1,149 @@
+# HG changeset patch
+# User Julian Descottes <jdescottes@mozilla.com>
+# Date 1518208665 -3600
+# Node ID c9bb64098fcd79b765b0461ccb5da2457e71b7b3
+# Parent  39ccf9763a646caebd330f5482f4b22562c3dc01
+Bug 1403200 - remove browser_webconsole_variables_view_while_debugging.js;r=bgrins
+
+This test is an exact duplicate of browser_webconsole_variables_view_while_debugging_and_inspecting.js
+except it doesn't start the inspector before performing the test.
+I don't think it's worth keeping and maintaining both tests.
+
+MozReview-Commit-ID: 7EcdVmJjAfu
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -357,18 +357,16 @@ skip-if = true #       Bug 1405649
+ [browser_webconsole_string.js]
+ [browser_webconsole_time_methods.js]
+ skip-if = true #       Bug 1404877
+ [browser_webconsole_timestamps.js]
+ [browser_webconsole_trackingprotection_errors.js]
+ tags = trackingprotection
+ [browser_webconsole_variables_view_dont_sort_non_sortable_classes_properties.js]
+ skip-if = true #       Bug 1403196
+-[browser_webconsole_variables_view_while_debugging.js]
+-skip-if = true #       Bug 1403200
+ [browser_webconsole_variables_view_while_debugging_and_inspecting.js]
+ skip-if = true #       Bug 1403205
+ [browser_webconsole_view_source.js]
+ [browser_webconsole_violation.js]
+ skip-if = true #       Bug 1405245
+ # old console skip-if = e10s && (os == 'win') # Bug 1264955
+ [browser_webconsole_visibility_messages.js]
+ [browser_webconsole_warn_about_replaced_api.js]
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_variables_view_while_debugging.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_variables_view_while_debugging.js
+deleted file mode 100644
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_variables_view_while_debugging.js
++++ /dev/null
+@@ -1,109 +0,0 @@
+-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+-/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+-/* Any copyright is dedicated to the Public Domain.
+- * http://creativecommons.org/publicdomain/zero/1.0/ */
+-
+-// Test that makes sure web console eval happens in the user-selected stackframe
+-// from the js debugger, when changing the value of a property in the variables
+-// view.
+-
+-"use strict";
+-
+-const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
+-                 "test/test-eval-in-stackframe.html";
+-
+-// Force the old debugger UI since it's directly used (see Bug 1301705)
+-Services.prefs.setBoolPref("devtools.debugger.new-debugger-frontend", false);
+-registerCleanupFunction(function* () {
+-  Services.prefs.clearUserPref("devtools.debugger.new-debugger-frontend");
+-});
+-
+-add_task(function* () {
+-  yield loadTab(TEST_URI);
+-  let hud = yield openConsole();
+-
+-  let dbgPanel = yield openDebugger();
+-  yield waitForFrameAdded();
+-  yield openConsole();
+-  yield testVariablesView(hud);
+-});
+-
+-function* waitForFrameAdded() {
+-  let target = TargetFactory.forTab(gBrowser.selectedTab);
+-  let toolbox = gDevTools.getToolbox(target);
+-  let thread = toolbox.threadClient;
+-
+-  info("Waiting for framesadded");
+-  yield new Promise(resolve => {
+-    thread.addOneTimeListener("framesadded", resolve);
+-    ContentTask.spawn(gBrowser.selectedBrowser, {}, function* () {
+-      content.wrappedJSObject.firstCall();
+-    });
+-  });
+-}
+-
+-function* testVariablesView(hud) {
+-  let jsterm = hud.jsterm;
+-  let msg = yield jsterm.execute("fooObj");
+-  ok(msg, "output message found");
+-  ok(msg.textContent.includes('{ testProp2: "testValue2" }'),
+-                              "message text check");
+-
+-  let anchor = msg.querySelector("a");
+-  ok(anchor, "object link found");
+-
+-  info("Waiting for variable view to appear");
+-  let variable = yield new Promise(resolve => {
+-    jsterm.once("variablesview-fetched", (e, variable) => {
+-      resolve(variable);
+-    });
+-    executeSoon(() => EventUtils.synthesizeMouse(anchor, 2, 2, {},
+-                                                 hud.iframeWindow));
+-  });
+-
+-  info("Waiting for findVariableViewProperties");
+-  let results = yield findVariableViewProperties(variable, [
+-    { name: "testProp2", value: "testValue2" },
+-    { name: "testProp", value: "testValue", dontMatch: true },
+-  ], { webconsole: hud });
+-
+-  let prop = results[0].matchedProp;
+-  ok(prop, "matched the |testProp2| property in the variables view");
+-
+-  // Check that property value updates work and that jsterm functions can be
+-  // used.
+-  variable = yield updateVariablesViewProperty({
+-    property: prop,
+-    field: "value",
+-    string: "document.title + foo2 + $('p')",
+-    webconsole: hud
+-  });
+-
+-  info("onFooObjFetchAfterUpdate");
+-  let expectedValue = yield ContentTask.spawn(gBrowser.selectedBrowser, {}, function* () {
+-    let para = content.wrappedJSObject.document.querySelector("p");
+-    return content.document.title + "foo2SecondCall" + para;
+-  });
+-
+-  results = yield findVariableViewProperties(variable, [
+-    { name: "testProp2", value: expectedValue },
+-  ], { webconsole: hud });
+-
+-  prop = results[0].matchedProp;
+-  ok(prop, "matched the updated |testProp2| property value");
+-
+-  // Check that testProp2 was updated.
+-  yield new Promise(resolve => {
+-    executeSoon(() => {
+-      jsterm.execute("fooObj.testProp2").then(resolve);
+-    });
+-  });
+-
+-  expectedValue = yield ContentTask.spawn(gBrowser.selectedBrowser, {}, function* () {
+-    let para = content.wrappedJSObject.document.querySelector("p");
+-    return content.document.title + "foo2SecondCall" + para;
+-  });
+-
+-  isnot(hud.outputNode.textContent.indexOf(expectedValue), -1,
+-        "fooObj.testProp2 is correct");
+-}

+ 218 - 0
mozilla-release/patches/1403205-60a1.patch

@@ -0,0 +1,218 @@
+# HG changeset patch
+# User Julian Descottes <jdescottes@mozilla.com>
+# Date 1518208354 -3600
+# Node ID d8b74f789f8c97f3a3145ab527a6179b3ae07501
+# Parent  5aa192c0bec384a760ef41045acbd72c92572183
+Bug 1403205 - rename and enable browser_webconsole_object_inspector_while_debugging_and_inspecting.js;r=bgrins
+
+MozReview-Commit-ID: 571TaV6KZzl
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -314,16 +314,17 @@ skip-if = true #       Bug 1403448
+ [browser_webconsole_network_messages_status_code.js]
+ [browser_webconsole_network_requests_from_chrome.js]
+ [browser_webconsole_network_reset_filter.js]
+ [browser_webconsole_nodes_highlight.js]
+ [browser_webconsole_nodes_select.js]
+ [browser_webconsole_object_in_sidebar.js]
+ [browser_webconsole_object_inspector.js]
+ [browser_webconsole_object_inspector_entries.js]
++[browser_webconsole_object_inspector_while_debugging_and_inspecting.js]
+ [browser_webconsole_observer_notifications.js]
+ [browser_webconsole_optimized_out_vars.js]
+ [browser_webconsole_output_copy.js]
+ subsuite = clipboard
+ [browser_webconsole_output_copy_newlines.js]
+ subsuite = clipboard
+ [browser_webconsole_output_order.js]
+ [browser_webconsole_persist.js]
+@@ -357,17 +358,15 @@ skip-if = true #       Bug 1405649
+ [browser_webconsole_string.js]
+ [browser_webconsole_time_methods.js]
+ skip-if = true #       Bug 1404877
+ [browser_webconsole_timestamps.js]
+ [browser_webconsole_trackingprotection_errors.js]
+ tags = trackingprotection
+ [browser_webconsole_variables_view_dont_sort_non_sortable_classes_properties.js]
+ skip-if = true #       Bug 1403196
+-[browser_webconsole_variables_view_while_debugging_and_inspecting.js]
+-skip-if = true #       Bug 1403205
+ [browser_webconsole_view_source.js]
+ [browser_webconsole_violation.js]
+ skip-if = true #       Bug 1405245
+ # old console skip-if = e10s && (os == 'win') # Bug 1264955
+ [browser_webconsole_visibility_messages.js]
+ [browser_webconsole_warn_about_replaced_api.js]
+ [browser_webconsole_websocket.js]
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_variables_view_while_debugging_and_inspecting.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_object_inspector_while_debugging_and_inspecting.js
+rename from devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_variables_view_while_debugging_and_inspecting.js
+rename to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_object_inspector_while_debugging_and_inspecting.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_variables_view_while_debugging_and_inspecting.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_object_inspector_while_debugging_and_inspecting.js
+@@ -3,110 +3,76 @@
+ /* Any copyright is dedicated to the Public Domain.
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+ // Test that makes sure web console eval works while the js debugger paused the
+ // page, and while the inspector is active. See bug 886137.
+ 
+ "use strict";
+ 
+-const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
+-                 "test/test-eval-in-stackframe.html";
++const TEST_URI = "https://example.com/browser/devtools/client/webconsole/" +
++                 "new-console-output/test/mochitest/test-eval-in-stackframe.html";
++
++add_task(async function () {
++  // Force the old debugger UI since it's directly used (see Bug 1301705)
++  await pushPref("devtools.debugger.new-debugger-frontend", false);
++  let hud = await openNewTabAndConsole(TEST_URI);
++
++  info("Switch to the debugger");
++  await openDebugger();
++
++  info("Switch to the inspector");
++  let target = TargetFactory.forTab(gBrowser.selectedTab);
++  await gDevTools.showToolbox(target, "inspector");
++
++  info("Call firstCall() and wait for the debugger statement to be reached.");
++  await waitForFrameAdded();
++
++  info("Switch back to the console");
++  await gDevTools.showToolbox(target, "webconsole");
++
++  info("Test logging and inspecting objects while on a breakpoint.");
++  let jsterm = hud.jsterm;
+ 
+-// Force the old debugger UI since it's directly used (see Bug 1301705)
+-Services.prefs.setBoolPref("devtools.debugger.new-debugger-frontend", false);
+-registerCleanupFunction(function* () {
+-  Services.prefs.clearUserPref("devtools.debugger.new-debugger-frontend");
++  let onMessage = waitForMessage(hud, '{ testProp2: "testValue2" }');
++  jsterm.execute("fooObj");
++  let message = await onMessage;
++
++  const objectInspectors = [...message.node.querySelectorAll(".tree")];
++  is(objectInspectors.length, 1, "There should be one object inspector");
++
++  info("Expanding the array object inspector");
++  const [oi] = objectInspectors;
++  let onOiExpanded = waitFor(() => {
++    return oi.querySelectorAll(".node").length === 3;
++  });
++  oi.querySelector(".arrow").click();
++  await onOiExpanded;
++
++  ok(oi.querySelector(".arrow").classList.contains("expanded"),
++    "Object inspector expanded");
++
++  // The object inspector now looks like:
++  // {...}
++  // |  testProp2: "testValue2"
++  // |  __proto__: Object { ... }
++
++  let oiNodes = oi.querySelectorAll(".node");
++  is(oiNodes.length, 3, "There is the expected number of nodes in the tree");
++
++  ok(oiNodes[0].textContent.includes(`{\u2026}`));
++  ok(oiNodes[1].textContent.includes(`testProp2: "testValue2"`));
++  ok(oiNodes[2].textContent.includes(`__proto__: Object { \u2026 }`));
+ });
+ 
+-add_task(function* () {
+-  yield loadTab(TEST_URI);
+-  let hud = yield openConsole();
+-
+-  let dbgPanel = yield openDebugger();
+-  yield openInspector();
+-  yield waitForFrameAdded();
+-
+-  yield openConsole();
+-  yield testVariablesView(hud);
+-});
+-
+-function* waitForFrameAdded() {
++async function waitForFrameAdded() {
+   let target = TargetFactory.forTab(gBrowser.selectedTab);
+   let toolbox = gDevTools.getToolbox(target);
+   let thread = toolbox.threadClient;
+ 
+   info("Waiting for framesadded");
+-  yield new Promise(resolve => {
++  await new Promise(resolve => {
+     thread.addOneTimeListener("framesadded", resolve);
+     ContentTask.spawn(gBrowser.selectedBrowser, {}, function* () {
+       content.wrappedJSObject.firstCall();
+     });
+   });
+ }
+-
+-function* testVariablesView(hud) {
+-  info("testVariablesView");
+-  let jsterm = hud.jsterm;
+-
+-  let msg = yield jsterm.execute("fooObj");
+-  ok(msg, "output message found");
+-  ok(msg.textContent.includes('{ testProp2: "testValue2" }'),
+-                              "message text check");
+-
+-  let anchor = msg.querySelector("a");
+-  ok(anchor, "object link found");
+-
+-  info("Waiting for variable view to appear");
+-  let variable = yield new Promise(resolve => {
+-    jsterm.once("variablesview-fetched", (e, variable) => {
+-      resolve(variable);
+-    });
+-    executeSoon(() => EventUtils.synthesizeMouse(anchor, 2, 2, {},
+-                                                 hud.iframeWindow));
+-  });
+-
+-  info("Waiting for findVariableViewProperties");
+-  let results = yield findVariableViewProperties(variable, [
+-    { name: "testProp2", value: "testValue2" },
+-    { name: "testProp", value: "testValue", dontMatch: true },
+-  ], { webconsole: hud });
+-
+-  let prop = results[0].matchedProp;
+-  ok(prop, "matched the |testProp2| property in the variables view");
+-
+-  // Check that property value updates work and that jsterm functions can be
+-  // used.
+-  variable = yield updateVariablesViewProperty({
+-    property: prop,
+-    field: "value",
+-    string: "document.title + foo2 + $('p')",
+-    webconsole: hud
+-  });
+-
+-  info("onFooObjFetchAfterUpdate");
+-  let expectedValue = yield ContentTask.spawn(gBrowser.selectedBrowser, {}, function* () {
+-    let para = content.wrappedJSObject.document.querySelector("p");
+-    return content.document.title + "foo2SecondCall" + para;
+-  });
+-
+-  results = yield findVariableViewProperties(variable, [
+-    { name: "testProp2", value: expectedValue },
+-  ], { webconsole: hud });
+-
+-  prop = results[0].matchedProp;
+-  ok(prop, "matched the updated |testProp2| property value");
+-
+-  // Check that testProp2 was updated.
+-  yield new Promise(resolve => {
+-    executeSoon(() => {
+-      jsterm.execute("fooObj.testProp2").then(resolve);
+-    });
+-  });
+-
+-  expectedValue = yield ContentTask.spawn(gBrowser.selectedBrowser, {}, function* () {
+-    let para = content.wrappedJSObject.document.querySelector("p");
+-    return content.document.title + "foo2SecondCall" + para;
+-  });
+-
+-  isnot(hud.outputNode.textContent.indexOf(expectedValue), -1,
+-        "fooObj.testProp2 is correct");
+-}

+ 101 - 0
mozilla-release/patches/1403449-58a1.patch

@@ -0,0 +1,101 @@
+# HG changeset patch
+# User Nicolas Chevobbe <nchevobbe@mozilla.com>
+# Date 1510043706 -3600
+# Node ID 888caf45e5efb1d4cb7c816e7d61e5895a02c13e
+# Parent  a0565706def33521043d7f52f9937eff86ae6eb9
+Bug 1403449 - Enable browser_webconsole_console_dir_uninspectable.js in new frontend; r=jdescottes.
+
+MozReview-Commit-ID: 5d0vbbVKi2T
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -245,17 +245,16 @@ skip-if = true # Bug 1408928
+ [browser_webconsole_closure_inspection.js]
+ skip-if = true #       Bug 1405250
+ [browser_webconsole_completion.js]
+ skip-if = true # Bug 1408929
+ [browser_webconsole_console_api_iframe.js]
+ skip-if = true # Bug 1408930
+ [browser_webconsole_console_dir.js]
+ [browser_webconsole_console_dir_uninspectable.js]
+-skip-if = true #       Bug 1403449
+ [browser_webconsole_console_group.js]
+ [browser_webconsole_console_logging_workers_api.js]
+ skip-if = true # Bug 1405252
+ [browser_webconsole_console_table.js]
+ [browser_webconsole_context_menu_copy_entire_message.js]
+ subsuite = clipboard
+ skip-if = (os == 'linux' && bits == 32 && debug) # bug 1328915, disable linux32 debug devtools for timeouts
+ [browser_webconsole_context_menu_copy_link_location.js]
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_console_dir_uninspectable.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_console_dir_uninspectable.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_console_dir_uninspectable.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_console_dir_uninspectable.js
+@@ -3,45 +3,36 @@
+ /* Any copyright is dedicated to the Public Domain.
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+ // Make sure that the Web Console output does not break after we try to call
+ // console.dir() for objects that are not inspectable.
+ 
+ "use strict";
+ 
+-const TEST_URI = "data:text/html;charset=utf8,test for bug 773466";
+-
+-add_task(function* () {
+-  yield loadTab(TEST_URI);
++const TEST_URI = "data:text/html;charset=utf8,test console.dir on uninspectable object";
++const FIRST_LOG_MESSAGE = "fooBug773466a";
++const SECOND_LOG_MESSAGE = "fooBug773466b";
+ 
+-  let hud = yield openConsole();
+-
+-  hud.jsterm.clearOutput(true);
++add_task(async function () {
++  const hud = await openNewTabAndConsole(TEST_URI);
++  const {jsterm} = hud;
+ 
+-  hud.jsterm.execute("console.log('fooBug773466a')");
+-  hud.jsterm.execute("myObj = Object.create(null)");
+-  hud.jsterm.execute("console.dir(myObj)");
++  info("Logging a first message to make sure everything is working");
++  let onLogMessage = waitForMessage(hud, FIRST_LOG_MESSAGE);
++  jsterm.execute(`console.log("${FIRST_LOG_MESSAGE}")`);
++  await onLogMessage;
+ 
+-  yield waitForMessages({
+-    webconsole: hud,
+-    messages: [{
+-      text: "fooBug773466a",
+-      category: CATEGORY_WEBDEV,
+-      severity: SEVERITY_LOG,
+-    },
+-    {
+-      name: "console.dir output",
+-      consoleDir: "[object Object]",
+-    }],
++  info("console.dir on an uninspectable object");
++  const onDirMessage = waitForMessage(hud, "Object {  }");
++  jsterm.execute("console.dir(Object.create(null))");
++  await onDirMessage;
++
++  info("Logging a second message to make sure the console is not broken");
++  onLogMessage = waitForMessage(hud, SECOND_LOG_MESSAGE);
++  // Logging from content to make sure the console API is working.
++  ContentTask.spawn(gBrowser.selectedBrowser, SECOND_LOG_MESSAGE, (string) => {
++    content.console.log(string);
+   });
+-
+-  content.console.log("fooBug773466b");
++  await onLogMessage;
+ 
+-  yield waitForMessages({
+-    webconsole: hud,
+-    messages: [{
+-      text: "fooBug773466b",
+-      category: CATEGORY_WEBDEV,
+-      severity: SEVERITY_LOG,
+-    }],
+-  });
++  ok(true, "The console.dir call on an uninspectable object did not break the console");
+ });

+ 16 - 16
mozilla-release/patches/1403450-60a1.patch

@@ -2,7 +2,7 @@
 # User Nicolas Chevobbe <nchevobbe@mozilla.com>
 # Date 1518505044 -3600
 # Node ID 0b6f87dae8adf7fc137763af4196c6217b2fedf5
-# Parent  0cac749aa070fbf180dfa6ff9e40edab26327782
+# Parent  6b2f63be296de5dffe05203bd98c902c86bee0d6
 Bug 1403450 - Add test cases from browser_webconsole_repeated_messages_accuracy.js to mocha; r=jdescottes.
 
 This test had some cases that weren't covered in our mocha tests,
@@ -111,15 +111,15 @@ diff --git a/devtools/client/webconsole/new-console-output/test/fixtures/stubs/e
 diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
 --- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
 +++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
-@@ -148,17 +148,16 @@ support-files =
-   test-location-styleeditor-link.html
-   test-mixedcontent-securityerrors.html
+@@ -139,17 +139,16 @@ support-files =
    test-mutation.html
+   test-network-exceptions.html
    test-network-request.html
    test-network.html
    test-observe-http-ajax.html
    test-own-console.html
    test-property-provider.html
+   test-reopen-closed-tab.html
 -  test-repeated-messages.html
    test-result-format-as-string.html
    test-sourcemap-error-01.html
@@ -127,27 +127,27 @@ diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browse
    test-sourcemap-error-02.html
    test-sourcemap-error-02.js
    test-stacktrace-location-debugger-link.html
-   test-trackingprotection-securityerrors.html
-   test-webconsole-error-observer.html
-@@ -411,18 +410,16 @@ skip-if = true # Bug 1406841
- #old console skip-if = e10s # Bug 1042253 - webconsole tests disabled with e10s
- [browser_webconsole_prune_scroll.js]
- skip-if = true #       Bug 1404832
- [browser_webconsole_reflow.js]
- skip-if = true #       Bug 1406022
+   test-subresource-security-error.html
+   test-subresource-security-error.js
+@@ -327,18 +326,16 @@ skip-if = true #       Bug 1403448
+ [browser_webconsole_output_copy.js]
+ subsuite = clipboard
+ [browser_webconsole_output_copy_newlines.js]
+ subsuite = clipboard
+ [browser_webconsole_output_order.js]
+ [browser_webconsole_persist.js]
  [browser_webconsole_reopen_closed_tab.js]
- skip-if = true # Bug 1408947
  [browser_webconsole_repeat_different_objects.js]
 -[browser_webconsole_repeated_messages_accuracy.js]
 -skip-if = true #       Bug 1403450
  [browser_webconsole_sandbox_update_after_navigation.js]
  [browser_webconsole_script_errordoc_urls.js]
- skip-if = true #       Bug 1403454
- # old console skip-if = e10s # Bug 1042253 - webconsole tests disabled with e10s
  [browser_webconsole_scroll.js]
  [browser_webconsole_select_all.js]
- skip-if = true #       Bug 1404359
  [browser_webconsole_show_subresource_security_errors.js]
+ [browser_webconsole_shows_reqs_in_netmonitor.js]
+ [browser_webconsole_sourcemap_css.js]
+ [browser_webconsole_sourcemap_error.js]
 diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_repeat_different_objects.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_repeat_different_objects.js
 --- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_repeat_different_objects.js
 +++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_repeat_different_objects.js

+ 131 - 0
mozilla-release/patches/1403454-60a1.patch

@@ -0,0 +1,131 @@
+# HG changeset patch
+# User Michael Ratcliffe <mratcliffe@mozilla.com>
+# Date 1518521405 0
+# Node ID 17454f8c2ea8a1a600a95207b6856976178494a7
+# Parent  b4148c183c2116386d40687e9194be7bbdfad6d0
+Bug 1403454 - Migrate browser_webconsole_script_errordoc_urls.js to the new frontend r=jdescottes
+
+MozReview-Commit-ID: 6BBCqrmRelw
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -331,18 +331,16 @@ subsuite = clipboard
+ [browser_webconsole_output_order.js]
+ [browser_webconsole_persist.js]
+ [browser_webconsole_reopen_closed_tab.js]
+ [browser_webconsole_repeat_different_objects.js]
+ [browser_webconsole_repeated_messages_accuracy.js]
+ skip-if = true #       Bug 1403450
+ [browser_webconsole_sandbox_update_after_navigation.js]
+ [browser_webconsole_script_errordoc_urls.js]
+-skip-if = true #       Bug 1403454
+-# old console skip-if = e10s # Bug 1042253 - webconsole tests disabled with e10s
+ [browser_webconsole_scroll.js]
+ [browser_webconsole_select_all.js]
+ [browser_webconsole_show_subresource_security_errors.js]
+ [browser_webconsole_shows_reqs_in_netmonitor.js]
+ [browser_webconsole_sourcemap_css.js]
+ [browser_webconsole_sourcemap_error.js]
+ [browser_webconsole_sourcemap_invalid.js]
+ [browser_webconsole_sourcemap_nosource.js]
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_script_errordoc_urls.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_script_errordoc_urls.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_script_errordoc_urls.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_script_errordoc_urls.js
+@@ -1,67 +1,72 @@
+ /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+ /* Any copyright is dedicated to the Public Domain.
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
++/* import-globals-from head.js */
++
+ // Ensure that [Learn More] links appear alongside any errors listed
+ // in "errordocs.js". Note: this only tests script execution.
+ 
+ "use strict";
+ 
+ const ErrorDocs = require("devtools/server/actors/errordocs");
++const TEST_URI = "data:text/html;charset=utf8,errordoc tests";
+ 
+ function makeURIData(script) {
+   return `data:text/html;charset=utf8,<script>${script}</script>`;
+ }
+ 
+ const TestData = [
+   {
+     jsmsg: "JSMSG_READ_ONLY",
+     script: "'use strict'; (Object.freeze({name: 'Elsa', score: 157})).score = 0;",
+     isException: true,
++    expected: 'TypeError: "score" is read-only',
+   },
+   {
+     jsmsg: "JSMSG_STMT_AFTER_RETURN",
+     script: "function a() { return; 1 + 1; };",
+     isException: false,
++    expected: "unreachable code after return statement",
+   }
+ ];
+ 
+-add_task(function* () {
+-  yield loadTab("data:text/html;charset=utf8,errordoc tests");
++add_task(async function () {
++  let hud = await openNewTabAndConsole(TEST_URI);
+ 
+-  let hud = yield openConsole();
+-
+-  for (let i = 0; i < TestData.length; i++) {
+-    yield testScriptError(hud, TestData[i]);
++  for (let data of TestData) {
++    await testScriptError(hud, data);
+   }
+ });
+ 
+-function* testScriptError(hud, testData) {
+-  if (testData.isException === true) {
++async function testScriptError(hud, testData) {
++  let isE10s = Services.appinfo.browserTabsRemoteAutostart;
++  if (testData.isException && !isE10s) {
+     expectUncaughtException();
+   }
+ 
+-  BrowserTestUtils.loadURI(gBrowser.selectedBrowser, makeURIData(testData.script));
++  await loadDocument(makeURIData(testData.script));
++
++  let msg = "the expected error message was displayed";
++  info(`waiting for ${msg} to be displayed`);
++  await waitFor(() => findMessage(hud, testData.expected));
++  ok(true, msg);
+ 
+-  yield waitForMessages({
+-    webconsole: hud,
+-    messages: [
+-      {
+-        category: CATEGORY_JS
+-      }
+-    ]
+-  });
++  // grab the most current error doc URL.
++  let urlObj = new URL(ErrorDocs.GetURL({ errorMessageName: testData.jsmsg }));
++
++  // strip all params from the URL.
++  let url = `${urlObj.origin}${urlObj.pathname}`;
+ 
+-  // grab the most current error doc URL
+-  let url = ErrorDocs.GetURL({ errorMessageName: testData.jsmsg });
+-
+-  let hrefs = {};
+-  for (let link of hud.jsterm.outputNode.querySelectorAll("a")) {
+-    hrefs[link.href] = true;
++  // Gather all URLs displayed in the console. [Learn More] links have no href
++  // but have the URL in the title attribute.
++  let hrefs = new Set();
++  for (let link of hud.ui.outputNode.querySelectorAll("a")) {
++    hrefs.add(link.title);
+   }
+ 
+-  ok(url in hrefs, `Expected a link to ${url}.`);
++  ok(hrefs.has(url), `Expected a link to ${url}.`);
+ 
+   hud.jsterm.clearOutput();
+ }

+ 8 - 8
mozilla-release/patches/1403458-58a1.patch

@@ -2,7 +2,7 @@
 # User Nicolas Chevobbe <nchevobbe@mozilla.com>
 # Date 1508834729 -7200
 # Node ID 1f415318428ed52e300b9f2c5c41064dec1dea68
-# Parent  b959440605b29e5277116834ef0c609be1249abe
+# Parent  8e4352134bcc15f249a5a36a0712e431213d523e
 Bug 1403458 - Convert browser_webconsole_assert.js to a backend test; r=bgrins.
 
 The test ensures that packet are sent for falsy console.assert calls,
@@ -32,7 +32,7 @@ diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browse
    test-console-filters.html
    test-console-group.html
    test-console-output-02.html
-@@ -215,18 +214,16 @@ subsuite = clipboard
+@@ -215,18 +214,16 @@ skip-if = true #       Bug 1403188
  [browser_jsterm_no_input_change_and_tab_key_pressed.js]
  [browser_jsterm_popup_close_on_tab_switch.js]
  [browser_jsterm_popup.js]
@@ -43,14 +43,14 @@ diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browse
  tags = mcb
 -[browser_webconsole_assert.js]
 -skip-if = true #       Bug 1403458
- [browser_webconsole_autocomplete-properties-with-non-alphanumeric-names.js]
- skip-if = true # Bug 1408916
- [browser_webconsole_autocomplete_JSTerm_helpers.js]
- skip-if = true # Bug 1408917
- [browser_webconsole_autocomplete_accessibility.js]
- skip-if = true # Bug 1408918
  [browser_webconsole_autocomplete_crossdomain_iframe.js]
  skip-if = true # Bug 1408919
+ [browser_webconsole_autocomplete_in_debugger_stackframe.js]
+ skip-if = true # Bug 1408920
+ [browser_webconsole_batching.js]
+ [browser_webconsole_block_mixedcontent_securityerrors.js]
+ tags = mcb
+ [browser_webconsole_cached_autocomplete.js]
 diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_assert.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_assert.js
 deleted file mode 100644
 --- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_assert.js

+ 91 - 0
mozilla-release/patches/1403907-59a1.patch

@@ -0,0 +1,91 @@
+# HG changeset patch
+# User Nicolas Chevobbe <nchevobbe@mozilla.com>
+# Date 1515085429 -3600
+# Node ID b542c2c398bbde6096964a5b8d4ad806f3623017
+# Parent  ef1e04130ebe9f310dd375d0a76afe5ce9dc9878
+Bug 1403907 - Enable browser_webconsole_duplicate_errors.js in new console frontend; r=bgrins.
+
+MozReview-Commit-ID: 5LvsTa8zpdN
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -263,17 +263,16 @@ subsuite = clipboard
+ [browser_webconsole_context_menu_object_in_sidebar.js]
+ [browser_webconsole_context_menu_open_url.js]
+ [browser_webconsole_context_menu_store_as_global.js]
+ [browser_webconsole_csp_ignore_reflected_xss_message.js]
+ skip-if = (e10s && debug) || (e10s && os == 'win') # Bug 1221499 enabled these on windows
+ [browser_webconsole_cspro.js]
+ [browser_webconsole_document_focus.js]
+ [browser_webconsole_duplicate_errors.js]
+-skip-if = true #       Bug 1403907
+ [browser_webconsole_errors_after_page_reload.js]
+ [browser_webconsole_eval_in_debugger_stackframe.js]
+ [browser_webconsole_eval_in_debugger_stackframe2.js]
+ [browser_webconsole_execution_scope.js]
+ [browser_webconsole_external_script_errors.js]
+ [browser_webconsole_file_uri.js]
+ skip-if = true #       Bug 1404382
+ [browser_webconsole_filter_scroll.js]
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_duplicate_errors.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_duplicate_errors.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_duplicate_errors.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_duplicate_errors.js
+@@ -1,49 +1,27 @@
+-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+-/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+ /* Any copyright is dedicated to the Public Domain.
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+ // Tests that exceptions thrown by content don't show up twice in the Web
+ // Console. See Bug 582201.
+ 
+ "use strict";
+ 
+ const INIT_URI = "data:text/html;charset=utf8,hello world";
+ const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
+-                 "test/test-duplicate-error.html";
++  "new-console-output/test/mochitest/test-duplicate-error.html";
+ 
+-add_task(function* () {
+-  yield loadTab(INIT_URI);
+-
+-  let hud = yield openConsole();
+-
++add_task(async function () {
+   // On e10s, the exception is triggered in child process
+   // and is ignored by test harness
+   if (!Services.appinfo.browserTabsRemoteAutostart) {
+     expectUncaughtException();
+   }
++  let hud = await openNewTabAndConsole(TEST_URI);
+ 
+-  BrowserTestUtils.loadURI(gBrowser.selectedBrowser, TEST_URI);
++  await waitFor(() => findMessage(hud, "fooDuplicateError1", ".message.error"));
+ 
+-  yield waitForMessages({
+-    webconsole: hud,
+-    messages: [{
+-      text: "fooDuplicateError1",
+-      category: CATEGORY_JS,
+-      severity: SEVERITY_ERROR,
+-    },
+-    {
+-      text: "test-duplicate-error.html",
+-      category: CATEGORY_NETWORK,
+-      severity: SEVERITY_LOG,
+-    }],
+-  });
+-
+-  let text = hud.outputNode.textContent;
+-  let error1pos = text.indexOf("fooDuplicateError1");
+-  ok(error1pos > -1, "found fooDuplicateError1");
+-  if (error1pos > -1) {
+-    ok(!text.includes("fooDuplicateError1", error1pos + 1),
+-      "no duplicate for fooDuplicateError1");
+-  }
++  const errorMessages = hud.outputNode.querySelectorAll(".message.error");
++  is(errorMessages.length, 1, "There's only one error message for fooDuplicateError1");
++  is(errorMessages[0].querySelector(".message-repeats"), null,
++    "There is no repeat bubble on the error message")
+ });

+ 175 - 0
mozilla-release/patches/1404359-60a1.patch

@@ -0,0 +1,175 @@
+# HG changeset patch
+# User Michael Ratcliffe <mratcliffe@mozilla.com>
+# Date 1518476151 0
+# Node ID b61c885acf48ba69d2d0916e9bc0fd946114bf3c
+# Parent  40e57f20cc140b68ea51f6a0d7ceb6bbb7853a92
+Bug 1404359 - Migrate browser_webconsole_bug_586388_select_all.js to the new frontend r=jdescottes
+
+MozReview-Commit-ID: 38FpS7RaSky
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -334,17 +334,16 @@ subsuite = clipboard
+ [browser_webconsole_repeated_messages_accuracy.js]
+ skip-if = true #       Bug 1403450
+ [browser_webconsole_sandbox_update_after_navigation.js]
+ [browser_webconsole_script_errordoc_urls.js]
+ skip-if = true #       Bug 1403454
+ # old console skip-if = e10s # Bug 1042253 - webconsole tests disabled with e10s
+ [browser_webconsole_scroll.js]
+ [browser_webconsole_select_all.js]
+-skip-if = true #       Bug 1404359
+ [browser_webconsole_show_subresource_security_errors.js]
+ [browser_webconsole_shows_reqs_in_netmonitor.js]
+ [browser_webconsole_sourcemap_css.js]
+ [browser_webconsole_sourcemap_error.js]
+ [browser_webconsole_sourcemap_invalid.js]
+ [browser_webconsole_sourcemap_nosource.js]
+ [browser_webconsole_split.js]
+ [browser_webconsole_split_escape_key.js]
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_select_all.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_select_all.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_select_all.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_select_all.js
+@@ -1,86 +1,80 @@
+ /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+ /* Any copyright is dedicated to the Public Domain.
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+ "use strict";
+ 
+-// See Bug 586388.
++// Test that the global Firefox "Select All" functionality (e.g. Edit >
++// Select All) works properly in the Web Console.
++
++/* import-globals-from head.js */
+ 
+ const TEST_URI = "http://example.com/";
+ 
+-add_task(function* () {
+-  yield loadTab(TEST_URI);
+-
+-  let hud = yield openConsole();
+-  yield testSelectionWhenMovingBetweenBoxes(hud);
+-  performTestsAfterOutput(hud);
++add_task(async function testSelectAll() {
++  let hud = await openNewTabAndConsole(TEST_URI);
++  await testSelectionWhenMovingBetweenBoxes(hud);
++  testBrowserMenuSelectAll(hud);
++  await testContextMenuSelectAll(hud);
+ });
+ 
+-var testSelectionWhenMovingBetweenBoxes = Task.async(function* (hud) {
++async function testSelectionWhenMovingBetweenBoxes(hud) {
+   let jsterm = hud.jsterm;
+ 
+   // Fill the console with some output.
+   jsterm.clearOutput();
+-  yield jsterm.execute("1 + 2");
+-  yield jsterm.execute("3 + 4");
+-  yield jsterm.execute("5 + 6");
++  await jsterm.execute("1 + 2");
++  await waitFor(() => findMessage(hud, "3"));
++  await jsterm.execute("3 + 4");
++  await waitFor(() => findMessage(hud, "7"));
++  await jsterm.execute("5 + 6");
++  await waitFor(() => findMessage(hud, "11"));
++}
+ 
+-  return waitForMessages({
+-    webconsole: hud,
+-    messages: [{
+-      text: "3",
+-      category: CATEGORY_OUTPUT,
+-    },
+-      {
+-        text: "7",
+-        category: CATEGORY_OUTPUT,
+-      },
+-      {
+-        text: "11",
+-        category: CATEGORY_OUTPUT,
+-      }],
+-  });
+-});
++function testBrowserMenuSelectAll(hud) {
++  let { ui } = hud;
++  let outputContainer = ui.outputNode.querySelector(".webconsole-output");
+ 
+-function performTestsAfterOutput(hud) {
+-  let outputNode = hud.outputNode;
++  is(outputContainer.childNodes.length, 6,
++    "the output node contains the expected number of children");
+ 
+-  ok(outputNode.childNodes.length >= 3, "the output node has children after " +
+-     "executing some JavaScript");
++  // The focus is on the JsTerm, so we need to blur it for the copy comand to
++  // work.
++  outputContainer.ownerDocument.activeElement.blur();
+ 
+   // Test that the global Firefox "Select All" functionality (e.g. Edit >
+   // Select All) works properly in the Web Console.
+-  let commandController = hud.ui._commandController;
+-  ok(commandController != null, "the window has a command controller object");
+-
+-  commandController.selectAll();
+-
+-  let selectedCount = hud.ui.output.getSelectedMessages().length;
+-  is(selectedCount, outputNode.childNodes.length,
+-     "all console messages are selected after performing a regular browser " +
+-     "select-all operation");
+-
+-  hud.iframeWindow.getSelection().removeAllRanges();
++  goDoCommand("cmd_selectAll");
+ 
+-  // Test the context menu "Select All" (which has a different code path) works
+-  // properly as well.
+-  let contextMenuId = hud.ui.outputWrapper.getAttribute("context");
+-  let contextMenu = hud.ui.document.getElementById(contextMenuId);
+-  ok(contextMenu != null, "the output node has a context menu");
+-
+-  let selectAllItem = contextMenu.querySelector("*[command='cmd_selectAll']");
+-  ok(selectAllItem != null,
+-     "the context menu on the output node has a \"Select All\" item");
+-
+-  outputNode.focus();
+-
+-  selectAllItem.doCommand();
+-
+-  selectedCount = hud.ui.output.getSelectedMessages().length;
+-  is(selectedCount, outputNode.childNodes.length,
+-     "all console messages are selected after performing a select-all " +
+-     "operation from the context menu");
+-
++  checkMessagesSelected(outputContainer);
+   hud.iframeWindow.getSelection().removeAllRanges();
+ }
++
++// Test the context menu "Select All" (which has a different code path) works
++// properly as well.
++async function testContextMenuSelectAll(hud) {
++  let { ui } = hud;
++  let outputContainer = ui.outputNode.querySelector(".webconsole-output");
++  let contextMenu = await openContextMenu(hud, outputContainer);
++
++  let selectAllItem = contextMenu.querySelector("#console-menu-select");
++  ok(selectAllItem,
++     `the context menu on the output node has a "Select All" item`);
++
++  outputContainer.focus();
++  selectAllItem.click();
++
++  checkMessagesSelected(outputContainer);
++  hud.iframeWindow.getSelection().removeAllRanges();
++}
++
++function checkMessagesSelected(outputContainer) {
++  let selection = outputContainer.ownerDocument.getSelection();
++  let messages = outputContainer.querySelectorAll(".message");
++
++  for (let message of messages) {
++    let selected = selection.containsNode(message);
++    ok(selected, `Node containing text "${message.textContent}" was selected`);
++  }
++}

+ 268 - 0
mozilla-release/patches/1404364-60a1.patch

@@ -0,0 +1,268 @@
+# HG changeset patch
+# User Nicolas Chevobbe <nchevobbe@mozilla.com>
+# Date 1518077004 -3600
+# Node ID 67200889cdc11f49cfca5f53cf2e857090432d49
+# Parent  99074cafaff22ef74785f0805aa2eed402de8c4c
+Bug 1404364 - Enable browser_webconsole_output_copy.js in new console frontend; r=jdescottes.
+
+The part on the copy context menu was removed since we have a dedicated test
+for that.
+We also delete browser_webconsole_jsterm_copy.js which was doing the same thing.
+
+MozReview-Commit-ID: BGPkeHWb2bL
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -291,20 +291,16 @@ skip-if = true #       Bug 1405343
+ [browser_webconsole_input_focus.js]
+ [browser_webconsole_insecure_passwords_about_blank_web_console_warning.js]
+ [browser_webconsole_insecure_passwords_web_console_warning.js]
+ [browser_webconsole_inspect_cross_domain_object.js]
+ [browser_webconsole_js_input_expansion.js]
+ [browser_webconsole_jsterm.js]
+ skip-if = true #       Bug 1405352
+ # old console skip-if = e10s # Bug 1042253 - webconsole e10s tests (Linux debug timeout)
+-[browser_webconsole_jsterm_copy.js]
+-subsuite = clipboard
+-skip-if = true #       Bug 1404831
+-# old console skip-if = (os == 'linux' && bits == 32 && debug) # bug 1328915, disable linux32 debug devtools for timeouts
+ [browser_webconsole_keyboard_accessibility.js]
+ [browser_webconsole_location_debugger_link.js]
+ [browser_webconsole_location_scratchpad_link.js]
+ [browser_webconsole_location_styleeditor_link.js]
+ [browser_webconsole_logErrorInPage.js]
+ [browser_webconsole_longstring_expand.js]
+ skip-if = true #       Bug 1403448
+ [browser_webconsole_longstring_hang.js]
+@@ -325,18 +321,16 @@ skip-if = true #       Bug 1404886
+ [browser_webconsole_nodes_select.js]
+ [browser_webconsole_object_in_sidebar.js]
+ [browser_webconsole_object_inspector.js]
+ [browser_webconsole_object_inspector_entries.js]
+ [browser_webconsole_observer_notifications.js]
+ [browser_webconsole_optimized_out_vars.js]
+ [browser_webconsole_output_copy.js]
+ subsuite = clipboard
+-skip-if = true #       Bug 1404364
+-# old console skip-if = (os == 'linux' && bits == 32 && debug) # bug 1328915, disable linux32 debug devtools for timeouts
+ [browser_webconsole_output_copy_newlines.js]
+ subsuite = clipboard
+ skip-if = true #       Bug 1405641
+ # old console skip-if = (os == 'linux' && bits == 32 && debug) # bug 1328915, disable linux32 debug devtools for timeouts
+ [browser_webconsole_output_order.js]
+ [browser_webconsole_persist.js]
+ [browser_webconsole_prune_scroll.js]
+ skip-if = true #       Bug 1404832
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_jsterm_copy.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_jsterm_copy.js
+deleted file mode 100644
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_jsterm_copy.js
++++ /dev/null
+@@ -1,66 +0,0 @@
+-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+-/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+-/* Any copyright is dedicated to the Public Domain.
+- * http://creativecommons.org/publicdomain/zero/1.0/ */
+-
+-"use strict";
+-
+-// See Bug 613280.
+-
+-const TEST_URI = "data:text/html;charset=utf-8,Web Console test for bug 613280";
+-
+-function test() {
+-  loadTab(TEST_URI).then(() => {
+-    openConsole().then((HUD) => {
+-      ContentTask.spawn(gBrowser.selectedBrowser, null, function*(){
+-        content.console.log("foobarBazBug613280");
+-      });
+-      waitForMessages({
+-        webconsole: HUD,
+-        messages: [{
+-          text: "foobarBazBug613280",
+-          category: CATEGORY_WEBDEV,
+-          severity: SEVERITY_LOG,
+-        }],
+-      }).then(performTest.bind(null, HUD));
+-    });
+-  });
+-}
+-
+-function performTest(HUD, [result]) {
+-  let msg = [...result.matched][0];
+-  let input = HUD.jsterm.inputNode;
+-
+-  let clipboardSetup = function () {
+-    goDoCommand("cmd_copy");
+-  };
+-
+-  let clipboardCopyDone = function () {
+-    finishTest();
+-  };
+-
+-  let controller = top.document.commandDispatcher
+-                               .getControllerForCommand("cmd_copy");
+-  is(controller.isCommandEnabled("cmd_copy"), false, "cmd_copy is disabled");
+-
+-  HUD.ui.output.selectMessage(msg);
+-  HUD.outputNode.focus();
+-
+-  goUpdateCommand("cmd_copy");
+-
+-  controller = top.document.commandDispatcher
+-                           .getControllerForCommand("cmd_copy");
+-  is(controller.isCommandEnabled("cmd_copy"), true, "cmd_copy is enabled");
+-
+-  // Remove new lines and whitespace since getSelection() includes
+-  // a new line between message and line number, but the clipboard doesn't
+-  // @see bug 1119503
+-  let selectionText = (HUD.iframeWindow.getSelection() + "")
+-    .replace(/\r?\n|\r| /g, "");
+-  isnot(selectionText.indexOf("foobarBazBug613280"), -1,
+-        "selection text includes 'foobarBazBug613280'");
+-
+-  waitForClipboard((str) => {
+-    return selectionText.trim() === str.trim().replace(/ /g, "");
+-  }, clipboardSetup, clipboardCopyDone, clipboardCopyDone);
+-}
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_output_copy.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_output_copy.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_output_copy.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_output_copy.js
+@@ -1,108 +1,41 @@
+ /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+ /* Any copyright is dedicated to the Public Domain.
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+-/* globals goUpdateCommand goDoCommand */
+ 
+ "use strict";
+ 
+-// See Bug 587617.
+-
+-const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
+-                 "test/test-console.html";
+-
+-var HUD, outputNode;
+-
+-add_task(function* () {
+-  yield loadTab(TEST_URI);
++// Test copy to clipboard on the console output. See Bug 587617.
++const TEST_URI = "data:text/html,Test copy to clipboard on the console output";
+ 
+-  let hud = yield openConsole();
+-  yield consoleOpened(hud);
+-  yield testContextMenuCopy();
+-
+-  HUD = outputNode = null;
+-});
+-
+-function consoleOpened(hud) {
+-  HUD = hud;
+-
+-  let deferred = defer();
++add_task(async function () {
++  let hud = await openNewTabAndConsole(TEST_URI);
+ 
+-  // See bugs 574036, 586386 and 587617.
+-  outputNode = HUD.outputNode;
+-
+-  HUD.jsterm.clearOutput();
+-
+-  let controller = top.document.commandDispatcher
+-                               .getControllerForCommand("cmd_copy");
+-  is(controller.isCommandEnabled("cmd_copy"), false, "cmd_copy is disabled");
+-
+-  ContentTask.spawn(gBrowser.selectedBrowser, null,
+-    "() => content.console.log('Hello world! bug587617')");
+-
+-  waitForMessages({
+-    webconsole: HUD,
+-    messages: [{
+-      text: "bug587617",
+-      category: CATEGORY_WEBDEV,
+-      severity: SEVERITY_LOG,
+-    }],
+-  }).then(([result]) => {
+-    let msg = [...result.matched][0];
+-    HUD.ui.output.selectMessage(msg);
+-
+-    outputNode.focus();
++  const smokeMessage = "Hello world!";
++  let onMessage = waitForMessage(hud, smokeMessage);
++  ContentTask.spawn(gBrowser.selectedBrowser, smokeMessage, function (msg) {
++    content.wrappedJSObject.console.log(msg);
++  });
++  const {node} = await onMessage;
++  ok(true, "Message was logged");
+ 
+-    goUpdateCommand("cmd_copy");
+-    controller = top.document.commandDispatcher
+-                             .getControllerForCommand("cmd_copy");
+-    is(controller.isCommandEnabled("cmd_copy"), true, "cmd_copy is enabled");
++  const selection = node.ownerDocument.getSelection();
++  const range = document.createRange();
++  range.selectNodeContents(node);
++  selection.removeAllRanges();
++  selection.addRange(range);
+ 
+-    // Remove new lines and whitespace since getSelection() includes
+-    // a new line between message and line number, but the clipboard doesn't
+-    // @see bug 1119503
+-    let selection = (HUD.iframeWindow.getSelection() + "")
+-      .replace(/\r?\n|\r| /g, "");
+-    isnot(selection.indexOf("bug587617"), -1,
+-          "selection text includes 'bug587617'");
+-
+-    waitForClipboard((str) => {
+-      // Strip out spaces for comparison ease
+-      return selection.trim() == str.trim().replace(/ /g, "");
+-    }, () => {
+-      goDoCommand("cmd_copy");
+-    }, deferred.resolve, deferred.resolve);
+-  });
+-  return deferred.promise;
+-}
++  const selectionString = selection.toString().trim();
++  is(selectionString, smokeMessage, `selection has expected "${smokeMessage}" value`);
+ 
+-// Test that the context menu "Copy" (which has a different code path) works
+-// properly as well.
+-function testContextMenuCopy() {
+-  let deferred = defer();
+-
+-  let contextMenuId = HUD.ui.outputWrapper.getAttribute("context");
+-  let contextMenu = HUD.ui.document.getElementById(contextMenuId);
+-  ok(contextMenu, "the output node has a context menu");
+-
+-  let copyItem = contextMenu.querySelector("*[command='cmd_copy']");
+-  ok(copyItem, "the context menu on the output node has a \"Copy\" item");
+-
+-  // Remove new lines and whitespace since getSelection() includes
+-  // a new line between message and line number, but the clipboard doesn't
+-  // @see bug 1119503
+-  let selection = (HUD.iframeWindow.getSelection() + "")
+-    .replace(/\r?\n|\r| /g, "");
+-
+-  copyItem.doCommand();
+-
+-  waitForClipboard((str) => {
+-    // Strip out spaces for comparison ease
+-    return selection.trim() == str.trim().replace(/ /g, "");
+-  }, () => {
+-    goDoCommand("cmd_copy");
+-  }, deferred.resolve, deferred.resolve);
+-  HUD = outputNode = null;
+-
+-  return deferred.promise;
+-}
++  await waitForClipboardPromise(
++    () => {
++      // The focus is on the JsTerm, so we need to blur it for the copy comand to work.
++      node.ownerDocument.activeElement.blur();
++      goDoCommand("cmd_copy");
++    },
++    data => {
++      return data.trim() === smokeMessage;
++    }
++  );
++});

+ 84 - 0
mozilla-release/patches/1404368-59a1.patch

@@ -0,0 +1,84 @@
+# HG changeset patch
+# User Nicolas Chevobbe <nchevobbe@mozilla.com>
+# Date 1515065706 -3600
+# Node ID 39a358d362671cc16d31d4660924d286fb3c16b8
+# Parent  c302ff435a1b2355d3b4ef2377208bffca8d1712
+Bug 1404368 - Enable browser_webconsole_document_focus.js in new frontend;r=jdescottes.
+
+MozReview-Commit-ID: Fd9p0oigRpB
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -259,17 +259,16 @@ skip-if = (os == 'linux' && bits == 32 &
+ subsuite = clipboard
+ [browser_webconsole_context_menu_object_in_sidebar.js]
+ [browser_webconsole_context_menu_open_url.js]
+ [browser_webconsole_context_menu_store_as_global.js]
+ [browser_webconsole_csp_ignore_reflected_xss_message.js]
+ skip-if = (e10s && debug) || (e10s && os == 'win') # Bug 1221499 enabled these on windows
+ [browser_webconsole_cspro.js]
+ [browser_webconsole_document_focus.js]
+-skip-if = true #       Bug 1404368
+ [browser_webconsole_duplicate_errors.js]
+ skip-if = true #       Bug 1403907
+ [browser_webconsole_errors_after_page_reload.js]
+ [browser_webconsole_eval_in_debugger_stackframe.js]
+ [browser_webconsole_eval_in_debugger_stackframe2.js]
+ skip-if = true # Bug 1408893
+ [browser_webconsole_execution_scope.js]
+ skip-if = true #       Bug 1405333
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_document_focus.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_document_focus.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_document_focus.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_document_focus.js
+@@ -1,37 +1,24 @@
+-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+-/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+ /* Any copyright is dedicated to the Public Domain.
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+ "use strict";
+ 
+-// See Bug 588342.
++// Check that focus is restored to content page after closing the console. See Bug 588342.
++const TEST_URI = "data:text/html;charset=utf-8,Test content focus after closing console";
+ 
+-const TEST_URI = "data:text/html;charset=utf-8,Web Console test for bug 588342";
++add_task(async function () {
++  let hud = await openNewTabAndConsole(TEST_URI);
+ 
+-add_task(function* () {
+-  let { browser } = yield loadTab(TEST_URI);
+-  let hud = yield openConsole();
++  let inputNode = hud.jsterm.inputNode;
++  info("Focus after console is opened");
++  ok(hasFocus(inputNode), "input node is focused after console is opened");
+ 
+-  yield checkConsoleFocus(hud);
+-
+-  let isFocused = yield ContentTask.spawn(browser, { }, function* () {
+-    var fm = Cc["@mozilla.org/focus-manager;1"].getService(Ci.nsIFocusManager);
++  info("Closing console");
++  await closeConsole();
++  const isFocused = await ContentTask.spawn(gBrowser.selectedBrowser, { }, function () {
++    const cmp = "@mozilla.org/focus-manager;1";
++    const fm = Cc[cmp].getService(Ci.nsIFocusManager);
+     return fm.focusedWindow == content;
+   });
+-
+-  ok(isFocused, "content document has focus");
++  ok(isFocused, "content document has focus after closing the console");
+ });
+-
+-function* checkConsoleFocus(hud) {
+-  let fm = Cc["@mozilla.org/focus-manager;1"].getService(Ci.nsIFocusManager);
+-
+-  yield new Promise(resolve => {
+-    waitForFocus(resolve);
+-  });
+-
+-  is(hud.jsterm.inputNode.getAttribute("focused"), "true",
+-     "jsterm input is focused on web console open");
+-  is(fm.focusedWindow, hud.iframeWindow, "hud window is focused");
+-  yield closeConsole(null);
+-}

+ 113 - 0
mozilla-release/patches/1404371-59a1.patch

@@ -0,0 +1,113 @@
+# HG changeset patch
+# User Julian Descottes <jdescottes@mozilla.com>
+# Date 1516192441 -3600
+# Node ID d7bb0c1fef886df88f8971f9474b4d678f6a67ec
+# Parent  51d490c2ee87fa5be5b352dbb4227f0e12529e15
+Bug 1404371 - migrate and rename browser_webconsole_input_expansion.js;r=Honza
+
+MozReview-Commit-ID: JAS13KdCDoP
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -215,16 +215,17 @@ skip-if = true #       Bug 1403188
+ [browser_jsterm_completion.js]
+ [browser_jsterm_copy_command.js]
+ [browser_jsterm_ctrl_key_nav.js]
+ skip-if = os != 'mac' # The tested ctrl+key shortcuts are OSX only
+ [browser_jsterm_dollar.js]
+ [browser_jsterm_history.js]
+ [browser_jsterm_history_persist.js]
+ [browser_jsterm_history_nav.js]
++[browser_jsterm_input_expansion.js]
+ [browser_jsterm_inspect.js]
+ [browser_jsterm_multiline.js]
+ [browser_jsterm_no_autocompletion_on_defined_variables.js]
+ [browser_jsterm_no_input_and_tab_key_pressed.js]
+ [browser_jsterm_no_input_change_and_tab_key_pressed.js]
+ [browser_jsterm_popup_close_on_tab_switch.js]
+ [browser_jsterm_popup.js]
+ [browser_jsterm_selfxss.js]
+@@ -281,18 +282,16 @@ skip-if = true #       Bug 1404382
+ [browser_webconsole_history_arrow_keys.js]
+ [browser_webconsole_hpkp_invalid-headers.js]
+ [browser_webconsole_hsts_invalid-headers.js]
+ [browser_webconsole_iframe_wrong_hud.js]
+ [browser_webconsole_ineffective_iframe_sandbox_warning.js]
+ skip-if = true #       Bug 1404883
+ # old console skip-if = (os == 'win' && bits == 64) # Bug 1390001
+ [browser_webconsole_init.js]
+-[browser_webconsole_input_expansion.js]
+-skip-if = true #       Bug 1404371
+ [browser_webconsole_input_field_focus_on_panel_select.js]
+ skip-if = true #       Bug 1405343
+ [browser_webconsole_input_focus.js]
+ [browser_webconsole_insecure_passwords_about_blank_web_console_warning.js]
+ skip-if = true #       Bug 1404884
+ [browser_webconsole_insecure_passwords_web_console_warning.js]
+ skip-if = true #       Bug 1404888
+ # old console skip-if = true # Bug 1110500 - mouse event failure in test
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_input_expansion.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_input_expansion.js
+rename from devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_input_expansion.js
+rename to devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_input_expansion.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_input_expansion.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_input_expansion.js
+@@ -1,46 +1,38 @@
+ /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+ /* Any copyright is dedicated to the Public Domain.
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+ "use strict";
+ 
+-// See Bug 588967.
++// Check that the jsterm input supports multiline values. See Bug 588967.
+ 
+-const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
+-                 "test/test-console.html";
++const TEST_URI = "data:text/html;charset=utf-8,Test for jsterm multine input";
+ 
+-add_task(function* () {
+-  yield loadTab(TEST_URI);
+-
+-  let hud = yield openConsole();
++add_task(async function () {
++  let hud = await openNewTabAndConsole(TEST_URI);
+ 
+-  testInputExpansion(hud);
+-});
+-
+-function testInputExpansion(hud) {
+   let input = hud.jsterm.inputNode;
+ 
++  info("Focus the jsterm input");
+   input.focus();
+ 
+-  is(input.getAttribute("multiline"), "true", "multiline is enabled");
+-
+   let ordinaryHeight = input.clientHeight;
+ 
+-  // Tests if the inputNode expands.
++  // Set a multiline value
+   input.value = "hello\nworld\n";
++
++  // Set the caret at the end of input
+   let length = input.value.length;
+   input.selectionEnd = length;
+   input.selectionStart = length;
+-  // Performs an "d". This will trigger/test for the input event that should
+-  // change the height of the inputNode.
++
++  info("Type 'd' in jsterm to trigger height change for the input");
+   EventUtils.synthesizeKey("d", {});
+   ok(input.clientHeight > ordinaryHeight, "the input expanded");
+ 
+-  // Test if the inputNode shrinks again.
++  info("Erase the value and test if the inputNode shrinks again");
+   input.value = "";
+   EventUtils.synthesizeKey("d", {});
+   is(input.clientHeight, ordinaryHeight, "the input's height is normal again");
+-
+-  input = length = null;
+-}
++});

+ 185 - 0
mozilla-release/patches/1404378-59a1.patch

@@ -0,0 +1,185 @@
+# HG changeset patch
+# User Nicolas Chevobbe <nchevobbe@mozilla.com>
+# Date 1516177392 -3600
+# Node ID 7aef6a844efc2bc14c564c901057f2bf37e49409
+# Parent  ade4ae57c702014e6b1205dcfd3bc0f2ba7507a1
+Bug 1404378 - Enable browser_webconsole_iframe_wrong_hud.js in new console frontend; r=jdescottes.
+
+MozReview-Commit-ID: HBfA7lXjVdI
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -20,18 +20,16 @@ support-files =
+   test_hsts-invalid-headers.sjs
+   test-autocomplete-in-stackframe.html
+   test-batching.html
+   test-bug_923281_console_log_filter.html
+   test-bug_923281_test1.js
+   test-bug_923281_test2.js
+   test-bug_939783_console_trace_duplicates.html
+   test-bug-585956-console-trace.html
+-  test-bug-593003-iframe-wrong-hud-iframe.html
+-  test-bug-593003-iframe-wrong-hud.html
+   test-bug-595934-canvas-css.html
+   test-bug-595934-canvas-css.js
+   test-bug-595934-css-loader.css
+   test-bug-595934-css-loader.css^headers^
+   test-bug-595934-css-loader.html
+   test-bug-595934-css-parser.css
+   test-bug-595934-css-parser.html
+   test-bug-595934-empty-getelementbyid.html
+@@ -122,16 +120,18 @@ support-files =
+   test-file-location.js
+   test-filter.html
+   test-for-of.html
+   test-iframe-762593-insecure-form-action.html
+   test-iframe-762593-insecure-frame.html
+   test-iframe1.html
+   test-iframe2.html
+   test-iframe3.html
++  test-iframe-wrong-hud-iframe.html
++  test-iframe-wrong-hud.html
+   test-image.png
+   test-inspect-cross-domain-objects-frame.html
+   test-inspect-cross-domain-objects-top.html
+   test-jsterm-dollar.html
+   test-location-debugger-link-console-log.js
+   test-location-debugger-link-errors.js
+   test-location-debugger-link.html
+   test-location-styleeditor-link-1.css
+@@ -277,17 +277,16 @@ skip-if = true #       Bug 1404382
+ [browser_webconsole_filter_scroll.js]
+ [browser_webconsole_filters.js]
+ [browser_webconsole_filters_persist.js]
+ [browser_webconsole_highlighter_console_helper.js]
+ [browser_webconsole_history_arrow_keys.js]
+ [browser_webconsole_hpkp_invalid-headers.js]
+ [browser_webconsole_hsts_invalid-headers.js]
+ [browser_webconsole_iframe_wrong_hud.js]
+-skip-if = true #       Bug 1404378
+ [browser_webconsole_ineffective_iframe_sandbox_warning.js]
+ skip-if = true #       Bug 1404883
+ # old console skip-if = (os == 'win' && bits == 64) # Bug 1390001
+ [browser_webconsole_init.js]
+ [browser_webconsole_input_expansion.js]
+ skip-if = true #       Bug 1404371
+ [browser_webconsole_input_field_focus_on_panel_select.js]
+ skip-if = true #       Bug 1405343
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_iframe_wrong_hud.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_iframe_wrong_hud.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_iframe_wrong_hud.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_iframe_wrong_hud.js
+@@ -1,70 +1,42 @@
+ /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+ /* Any copyright is dedicated to the Public Domain.
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+ "use strict";
+ 
+-// See Bug 593003.
++// Ensure that iframes are not associated with the wrong hud. See Bug 593003.
+ 
+ const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
+-                 "test/test-bug-593003-iframe-wrong-hud.html";
++  "new-console-output/test/mochitest/test-iframe-wrong-hud.html";
+ 
+-const TEST_IFRAME_URI = "http://example.com/browser/devtools/client/" +
+-                        "webconsole/test/test-bug-593003-iframe-wrong-" +
+-                        "hud-iframe.html";
++const TEST_IFRAME_URI = "http://example.com/browser/devtools/client/webconsole/" +
++  "new-console-output/test/mochitest/test-iframe-wrong-hud-iframe.html";
+ 
+-const TEST_DUMMY_URI = "http://example.com/browser/devtools/client/" +
+-                       "webconsole/test/test-console.html";
++const TEST_DUMMY_URI = "http://example.com/browser/devtools/client/webconsole/" +
++  "new-console-output/test/mochitest/test-console.html";
+ 
+-add_task(function* () {
++add_task(async function () {
++  await pushPref("devtools.webconsole.filter.net", true);
++  const tab1 = await addTab(TEST_URI);
++  const hud1 = await openConsole(tab1);
+ 
+-  let tab1 = (yield loadTab(TEST_URI)).tab;
+-  yield ContentTask.spawn(gBrowser.selectedBrowser, {}, function* () {
+-    content.console.log("FOO");
+-  });
+-  yield openConsole();
+-
+-  let tab2 = (yield loadTab(TEST_DUMMY_URI)).tab;
+-  yield openConsole(gBrowser.selectedTab);
++  const tab2 = await addTab(TEST_DUMMY_URI);
++  await openConsole(gBrowser.selectedTab);
+ 
+   info("Reloading tab 1");
+-  yield reloadTab(tab1);
++  await reloadTab(tab1);
+ 
+-  info("Checking for messages");
+-  yield checkMessages(tab1, tab2);
++  info("Waiting for messages");
++  await waitFor(() => findMessage(hud1, TEST_IFRAME_URI, ".message.network"));
+ 
+-  info("Cleaning up");
+-  yield closeConsole(tab1);
+-  yield closeConsole(tab2);
++  const hud2 = await openConsole(tab2);
++  is(findMessage(hud2, TEST_IFRAME_URI), null,
++    "iframe network request is not displayed in tab2");
+ });
+ 
+-function* reloadTab(tab) {
++function reloadTab(tab) {
+   let loaded = BrowserTestUtils.browserLoaded(tab.linkedBrowser);
+   tab.linkedBrowser.reload();
+-  yield loaded;
++  return loaded;
+ }
+-
+-function* checkMessages(tab1, tab2) {
+-  let hud1 = yield openConsole(tab1);
+-  let outputNode1 = hud1.outputNode;
+-
+-  info("Waiting for messages");
+-  yield waitForMessages({
+-    webconsole: hud1,
+-    messages: [{
+-      text: TEST_IFRAME_URI,
+-      category: CATEGORY_NETWORK,
+-      severity: SEVERITY_LOG,
+-    }]
+-  });
+-
+-  let hud2 = yield openConsole(tab2);
+-  let outputNode2 = hud2.outputNode;
+-
+-  isnot(outputNode1, outputNode2,
+-    "the two HUD outputNodes must be different");
+-
+-  let msg = "Didn't find the iframe network request in tab2";
+-  testLogEntry(outputNode2, TEST_IFRAME_URI, msg, true, true);
+-}
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-593003-iframe-wrong-hud-iframe.html b/devtools/client/webconsole/new-console-output/test/mochitest/test-iframe-wrong-hud-iframe.html
+rename from devtools/client/webconsole/new-console-output/test/mochitest/test-bug-593003-iframe-wrong-hud-iframe.html
+rename to devtools/client/webconsole/new-console-output/test/mochitest/test-iframe-wrong-hud-iframe.html
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-593003-iframe-wrong-hud.html b/devtools/client/webconsole/new-console-output/test/mochitest/test-iframe-wrong-hud.html
+rename from devtools/client/webconsole/new-console-output/test/mochitest/test-bug-593003-iframe-wrong-hud.html
+rename to devtools/client/webconsole/new-console-output/test/mochitest/test-iframe-wrong-hud.html
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-593003-iframe-wrong-hud.html
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/test-iframe-wrong-hud.html
+@@ -3,12 +3,12 @@
+   <head>
+     <meta charset="utf-8">
+     <title>WebConsole test: iframe associated to the wrong HUD</title>
+ <!-- Any copyright is dedicated to the Public Domain.
+      http://creativecommons.org/publicdomain/zero/1.0/ -->
+    </head>
+    <body>
+      <p>WebConsole test: iframe associated to the wrong HUD.</p>
+-     <iframe 
+-       src="http://example.com/browser/devtools/client/webconsole/test/test-bug-593003-iframe-wrong-hud-iframe.html"></iframe>
++     <iframe
++       src="http://example.com/browser/devtools/client/webconsole/new-console-output/test/mochitest/test-iframe-wrong-hud-iframe.html"></iframe>
+    </body>
+  </html>

+ 562 - 0
mozilla-release/patches/1404384-59a1.patch

@@ -0,0 +1,562 @@
+# HG changeset patch
+# User Julian Descottes <jdescottes@mozilla.com>
+# Date 1516363181 -3600
+# Node ID 0bef38b1872694147dfab8d543b90f19d4a1ebb4
+# Parent  fa3d4030087a91612aaf223440f3eacbd18f8eec
+Bug 1404384 - enable browser_webconsole_message_categories;r=bgrins
+
+MozReview-Commit-ID: 5TCviNEy4tg
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -20,35 +20,16 @@ support-files =
+   test_hsts-invalid-headers.sjs
+   test-autocomplete-in-stackframe.html
+   test-batching.html
+   test-bug_923281_console_log_filter.html
+   test-bug_923281_test1.js
+   test-bug_923281_test2.js
+   test-bug_939783_console_trace_duplicates.html
+   test-bug-585956-console-trace.html
+-  test-bug-595934-canvas-css.html
+-  test-bug-595934-canvas-css.js
+-  test-bug-595934-css-loader.css
+-  test-bug-595934-css-loader.css^headers^
+-  test-bug-595934-css-loader.html
+-  test-bug-595934-css-parser.css
+-  test-bug-595934-css-parser.html
+-  test-bug-595934-empty-getelementbyid.html
+-  test-bug-595934-empty-getelementbyid.js
+-  test-bug-595934-html.html
+-  test-bug-595934-image.html
+-  test-bug-595934-image.jpg
+-  test-bug-595934-imagemap.html
+-  test-bug-595934-malformedxml-external.html
+-  test-bug-595934-malformedxml-external.xml
+-  test-bug-595934-malformedxml.xhtml
+-  test-bug-595934-svg.xhtml
+-  test-bug-595934-workers.html
+-  test-bug-595934-workers.js
+   test-bug-599725-response-headers.sjs
+   test-bug-601177-log-levels.html
+   test-bug-601177-log-levels.js
+   test-bug-630733-response-redirect-headers.sjs
+   test-bug-632275-getters.html
+   test-bug-644419-log-limits.html
+   test-bug-646025-console-file-location.html
+   test-bug-658368-time-methods.html
+@@ -132,16 +113,35 @@ support-files =
+   test-inspect-cross-domain-objects-top.html
+   test-jsterm-dollar.html
+   test-location-debugger-link-console-log.js
+   test-location-debugger-link-errors.js
+   test-location-debugger-link.html
+   test-location-styleeditor-link-1.css
+   test-location-styleeditor-link-2.css
+   test-location-styleeditor-link.html
++  test-message-categories-canvas-css.html
++  test-message-categories-canvas-css.js
++  test-message-categories-css-loader.css
++  test-message-categories-css-loader.css^headers^
++  test-message-categories-css-loader.html
++  test-message-categories-css-parser.css
++  test-message-categories-css-parser.html
++  test-message-categories-empty-getelementbyid.html
++  test-message-categories-empty-getelementbyid.js
++  test-message-categories-html.html
++  test-message-categories-image.html
++  test-message-categories-image.jpg
++  test-message-categories-imagemap.html
++  test-message-categories-malformedxml-external.html
++  test-message-categories-malformedxml-external.xml
++  test-message-categories-malformedxml.xhtml
++  test-message-categories-svg.xhtml
++  test-message-categories-workers.html
++  test-message-categories-workers.js
+   test-mixedcontent-securityerrors.html
+   test-mutation.html
+   test-network-exceptions.html
+   test-network-request.html
+   test-network.html
+   test-observe-http-ajax.html
+   test-own-console.html
+   test-property-provider.html
+@@ -309,18 +309,16 @@ skip-if = true #       Bug 1404831
+ [browser_webconsole_location_scratchpad_link.js]
+ [browser_webconsole_location_styleeditor_link.js]
+ [browser_webconsole_logErrorInPage.js]
+ [browser_webconsole_longstring_expand.js]
+ skip-if = true #       Bug 1403448
+ [browser_webconsole_longstring_hang.js]
+ skip-if = true #       Bug 1403448
+ [browser_webconsole_message_categories.js]
+-skip-if = true #       Bug 1404384
+-# old console skip-if = e10s # Bug 1042253 - webconsole tests disabled with e10s
+ [browser_webconsole_mixedcontent.js]
+ tags = mcb
+ skip-if = true #       Bug 1404886
+ [browser_webconsole_multiple_windows_and_tabs.js]
+ [browser_webconsole_network_attach.js]
+ [browser_webconsole_network_exceptions.js]
+ [browser_webconsole_network_messages_expand.js]
+ [browser_webconsole_network_messages_openinnet.js]
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_message_categories.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_message_categories.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_message_categories.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_message_categories.js
+@@ -1,212 +1,143 @@
+ /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+ /* Any copyright is dedicated to the Public Domain.
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+ "use strict";
+ 
+-// See Bug 595934.
++// Check that messages are logged and observed with the correct category. See Bug 595934.
+ 
+ const TEST_URI = "data:text/html;charset=utf-8,Web Console test for " +
+                  "bug 595934 - message categories coverage.";
+ const TESTS_PATH = "http://example.com/browser/devtools/client/webconsole/" +
+-                   "test/";
++                   "new-console-output/test/mochitest/";
+ const TESTS = [
+   {
+     // #0
+-    file: "test-bug-595934-css-loader.html",
++    file: "test-message-categories-css-loader.html",
+     category: "CSS Loader",
+     matchString: "text/css",
+   },
+   {
+     // #1
+-    file: "test-bug-595934-imagemap.html",
++    file: "test-message-categories-imagemap.html",
+     category: "Layout: ImageMap",
+     matchString: "shape=\"rect\"",
+   },
+   {
+     // #2
+-    file: "test-bug-595934-html.html",
++    file: "test-message-categories-html.html",
+     category: "HTML",
+     matchString: "multipart/form-data",
+     onload: function () {
+-      let form = content.document.querySelector("form");
+-      form.submit();
++      ContentTask.spawn(gBrowser.selectedBrowser, null, function* () {
++        let form = content.document.querySelector("form");
++        form.submit();
++      });
+     },
+   },
+   {
+     // #3
+-    file: "test-bug-595934-workers.html",
++    file: "test-message-categories-workers.html",
+     category: "Web Worker",
+     matchString: "fooBarWorker",
+   },
+   {
+     // #4
+-    file: "test-bug-595934-malformedxml.xhtml",
++    file: "test-message-categories-malformedxml.xhtml",
+     category: "malformed-xml",
+     matchString: "no root element found",
+   },
+   {
+     // #5
+-    file: "test-bug-595934-svg.xhtml",
++    file: "test-message-categories-svg.xhtml",
+     category: "SVG",
+     matchString: "fooBarSVG",
+   },
+   {
+     // #6
+-    file: "test-bug-595934-css-parser.html",
++    file: "test-message-categories-css-parser.html",
+     category: "CSS Parser",
+     matchString: "foobarCssParser",
+   },
+   {
+     // #7
+-    file: "test-bug-595934-malformedxml-external.html",
++    file: "test-message-categories-malformedxml-external.html",
+     category: "malformed-xml",
+     matchString: "</html>",
+   },
+   {
+     // #8
+-    file: "test-bug-595934-empty-getelementbyid.html",
++    file: "test-message-categories-empty-getelementbyid.html",
+     category: "DOM",
+     matchString: "getElementById",
+   },
+   {
+     // #9
+-    file: "test-bug-595934-canvas-css.html",
++    file: "test-message-categories-canvas-css.html",
+     category: "CSS Parser",
+     matchString: "foobarCanvasCssParser",
+   },
+   {
+     // #10
+-    file: "test-bug-595934-image.html",
++    file: "test-message-categories-image.html",
+     category: "Image",
+     matchString: "corrupt",
++    // This message is not displayed in the main console in e10s. Bug 1431731
++    skipInE10s: true,
+   },
+ ];
+ 
+-var pos = -1;
+-
+-var foundCategory = false;
+-var foundText = false;
+-var pageLoaded = false;
+-var pageError = false;
+-var output = null;
+-var jsterm = null;
+-var hud = null;
+-var testEnded = false;
+-
+-var TestObserver = {
+-  QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver]),
++add_task(async function () {
++  requestLongerTimeout(2);
+ 
+-  observe: function testObserve(subject) {
+-    if (testEnded || !(subject instanceof Ci.nsIScriptError)) {
+-      return;
+-    }
+-
+-    let expectedCategory = TESTS[pos].category;
+-
+-    info("test #" + pos + " console observer got " + subject.category +
+-         ", is expecting " + expectedCategory);
+-
+-    if (subject.category == expectedCategory) {
+-      foundCategory = true;
+-      startNextTest();
+-    } else {
+-      info("unexpected message was: " + subject.sourceName + ":" +
+-           subject.lineNumber + "; " + subject.errorMessage);
+-    }
+-  }
+-};
++  await pushPref("devtools.webconsole.filter.css", true);
++  await pushPref("devtools.webconsole.filter.net", true);
+ 
+-function consoleOpened(hudConsole) {
+-  hud = hudConsole;
+-  output = hud.outputNode;
+-  jsterm = hud.jsterm;
+-
+-  Services.console.registerListener(TestObserver);
+-
+-  registerCleanupFunction(testEnd);
+-
+-  testNext();
+-}
+-
+-function testNext() {
+-  jsterm.clearOutput();
+-  foundCategory = false;
+-  foundText = false;
+-  pageLoaded = false;
+-  pageError = false;
++  let hud = await openNewTabAndConsole(TEST_URI);
++  for (let i = 0; i < TESTS.length; i++) {
++    let test = TESTS[i];
++    info("Running test #" + i);
++    await runTest(test, hud);
++  }
++});
+ 
+-  pos++;
+-  info("testNext: #" + pos);
+-  if (pos < TESTS.length) {
+-    test = TESTS[pos];
++async function runTest(test, hud) {
++  let {file, category, matchString, onload, skipInE10s} = test;
+ 
+-    waitForMessages({
+-      webconsole: hud,
+-      messages: [{
+-        name: "message for test #" + pos + ": '" + test.matchString + "'",
+-        text: test.matchString,
+-      }],
+-    }).then(() => {
+-      foundText = true;
+-      startNextTest();
+-    });
++  if (skipInE10s && Services.appinfo.browserTabsRemoteAutostart) {
++    return;
++  }
+ 
+-    let testLocation = TESTS_PATH + test.file;
+-    gBrowser.selectedBrowser.addEventListener("load", function onLoad(evt) {
+-      if (content.location.href != testLocation) {
++  let onMessageLogged = waitForMessage(hud, matchString);
++
++  let onMessageObserved = new Promise(resolve => {
++    Services.console.registerListener(function listener(subject) {
++      if (!(subject instanceof Ci.nsIScriptError)) {
+         return;
+       }
+-      gBrowser.selectedBrowser.removeEventListener(evt.type, onLoad, true);
+ 
+-      pageLoaded = true;
+-      test.onload && test.onload(evt);
+-
+-      if (test.expectError) {
+-        content.addEventListener("error", function () {
+-          pageError = true;
+-          startNextTest();
+-        }, {once: true});
+-        // On e10s, the exception is triggered in child process
+-        // and is ignored by test harness
+-        if (!Services.appinfo.browserTabsRemoteAutostart) {
+-          expectUncaughtException();
+-        }
+-      } else {
+-        pageError = true;
++      if (subject.category != category) {
++        return;
+       }
+ 
+-      startNextTest();
+-    }, true);
++      ok(true, "Expected category [" + category + "] received in observer");
++      Services.console.unregisterListener(listener);
++      resolve();
++    });
++  });
+ 
+-    BrowserTestUtils.loadURI(gBrowser.selectedBrowser, testLocation);
+-  } else {
+-    testEnded = true;
+-    finishTest();
+-  }
+-}
++  info("Load test file " + file);
++  await loadDocument(TESTS_PATH + file);
+ 
+-function testEnd() {
+-  if (!testEnded) {
+-    info("foundCategory " + foundCategory + " foundText " + foundText +
+-         " pageLoaded " + pageLoaded + " pageError " + pageError);
++  // Call test specific callback if defined
++  if (onload) {
++    onload();
+   }
+ 
+-  Services.console.unregisterListener(TestObserver);
+-  hud = TestObserver = output = jsterm = null;
+-}
++  info("Wait for log message to be observed with the correct category");
++  await onMessageObserved;
+ 
+-function startNextTest() {
+-  if (!testEnded && foundCategory && foundText && pageLoaded && pageError) {
+-    testNext();
+-  }
++  info("Wait for log message to be displayed in the hud");
++  await onMessageLogged;
+ }
+-
+-function test() {
+-  requestLongerTimeout(2);
+-
+-  loadTab(TEST_URI).then(() => {
+-    openConsole().then(consoleOpened);
+-  });
+-}
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-canvas-css.html b/devtools/client/webconsole/new-console-output/test/mochitest/test-message-categories-canvas-css.html
+rename from devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-canvas-css.html
+rename to devtools/client/webconsole/new-console-output/test/mochitest/test-message-categories-canvas-css.html
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-canvas-css.html
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/test-message-categories-canvas-css.html
+@@ -2,16 +2,16 @@
+ <html lang="en">
+   <head>
+     <meta charset="utf-8">
+     <title>Web Console test for bug 595934 - category: CSS Parser (with
+       Canvas)</title>
+     <!-- Any copyright is dedicated to the Public Domain.
+          http://creativecommons.org/publicdomain/zero/1.0/ -->
+     <script type="text/javascript"
+-            src="test-bug-595934-canvas-css.js"></script>
++            src="test-message-categories-canvas-css.js"></script>
+   </head>
+   <body>
+     <p>Web Console test for bug 595934 - category "CSS Parser" (with
+     Canvas).</p>
+     <p><canvas width="200" height="200">Canvas support is required!</canvas></p>
+   </body>
+ </html>
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-canvas-css.js b/devtools/client/webconsole/new-console-output/test/mochitest/test-message-categories-canvas-css.js
+rename from devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-canvas-css.js
+rename to devtools/client/webconsole/new-console-output/test/mochitest/test-message-categories-canvas-css.js
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-css-loader.css b/devtools/client/webconsole/new-console-output/test/mochitest/test-message-categories-css-loader.css
+rename from devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-css-loader.css
+rename to devtools/client/webconsole/new-console-output/test/mochitest/test-message-categories-css-loader.css
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-css-loader.css^headers^ b/devtools/client/webconsole/new-console-output/test/mochitest/test-message-categories-css-loader.css^headers^
+rename from devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-css-loader.css^headers^
+rename to devtools/client/webconsole/new-console-output/test/mochitest/test-message-categories-css-loader.css^headers^
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-css-loader.html b/devtools/client/webconsole/new-console-output/test/mochitest/test-message-categories-css-loader.html
+rename from devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-css-loader.html
+rename to devtools/client/webconsole/new-console-output/test/mochitest/test-message-categories-css-loader.html
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-css-loader.html
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/test-message-categories-css-loader.html
+@@ -1,13 +1,13 @@
+ <!DOCTYPE html>
+ <html lang="en">
+   <head>
+     <meta charset="utf-8">
+     <title>Web Console test for bug 595934 - category: CSS Loader</title>
+ <!-- Any copyright is dedicated to the Public Domain.
+      http://creativecommons.org/publicdomain/zero/1.0/ -->
+-    <link rel="stylesheet" href="test-bug-595934-css-loader.css">
++    <link rel="stylesheet" href="test-message-categories-css-loader.css">
+   </head>
+   <body>
+     <p>Web Console test for bug 595934 - category "CSS Loader".</p>
+   </body>
+ </html>
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-css-parser.css b/devtools/client/webconsole/new-console-output/test/mochitest/test-message-categories-css-parser.css
+rename from devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-css-parser.css
+rename to devtools/client/webconsole/new-console-output/test/mochitest/test-message-categories-css-parser.css
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-css-parser.html b/devtools/client/webconsole/new-console-output/test/mochitest/test-message-categories-css-parser.html
+rename from devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-css-parser.html
+rename to devtools/client/webconsole/new-console-output/test/mochitest/test-message-categories-css-parser.html
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-css-parser.html
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/test-message-categories-css-parser.html
+@@ -1,14 +1,14 @@
+ <!DOCTYPE html>
+ <html lang="en">
+   <head>
+     <meta charset="utf-8">
+     <title>Web Console test for bug 595934 - category: CSS Parser</title>
+ <!-- Any copyright is dedicated to the Public Domain.
+      http://creativecommons.org/publicdomain/zero/1.0/ -->
+      <link rel="stylesheet" type="text/css"
+-     href="test-bug-595934-css-parser.css">
++     href="test-message-categories-css-parser.css">
+   </head>
+   <body>
+     <p>Web Console test for bug 595934 - category "CSS Parser".</p>
+   </body>
+ </html>
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-empty-getelementbyid.html b/devtools/client/webconsole/new-console-output/test/mochitest/test-message-categories-empty-getelementbyid.html
+rename from devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-empty-getelementbyid.html
+rename to devtools/client/webconsole/new-console-output/test/mochitest/test-message-categories-empty-getelementbyid.html
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-empty-getelementbyid.html
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/test-message-categories-empty-getelementbyid.html
+@@ -2,15 +2,15 @@
+ <html lang="en">
+   <head>
+     <meta charset="utf-8">
+     <title>Web Console test for bug 595934 - category: DOM.
+     (empty getElementById())</title>
+ <!-- Any copyright is dedicated to the Public Domain.
+      http://creativecommons.org/publicdomain/zero/1.0/ -->
+     <script type="text/javascript"
+-      src="test-bug-595934-empty-getelementbyid.js"></script>
++      src="test-message-categories-empty-getelementbyid.js"></script>
+   </head>
+   <body>
+     <p>Web Console test for bug 595934 - category "DOM"
+     (empty getElementById()).</p>
+   </body>
+ </html>
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-empty-getelementbyid.js b/devtools/client/webconsole/new-console-output/test/mochitest/test-message-categories-empty-getelementbyid.js
+rename from devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-empty-getelementbyid.js
+rename to devtools/client/webconsole/new-console-output/test/mochitest/test-message-categories-empty-getelementbyid.js
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-html.html b/devtools/client/webconsole/new-console-output/test/mochitest/test-message-categories-html.html
+rename from devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-html.html
+rename to devtools/client/webconsole/new-console-output/test/mochitest/test-message-categories-html.html
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-image.html b/devtools/client/webconsole/new-console-output/test/mochitest/test-message-categories-image.html
+rename from devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-image.html
+rename to devtools/client/webconsole/new-console-output/test/mochitest/test-message-categories-image.html
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-image.html
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/test-message-categories-image.html
+@@ -3,13 +3,13 @@
+   <head>
+     <meta charset="utf-8">
+     <title>Web Console test for bug 595934 - category: Image</title>
+ <!-- Any copyright is dedicated to the Public Domain.
+      http://creativecommons.org/publicdomain/zero/1.0/ -->
+   </head>
+   <body>
+     <p>Web Console test for bug 595934 - category Image.</p>
+-    <p><img src="test-bug-595934-image.jpg" alt="corrupted image"></p>
++    <p><img src="test-message-categories-image.jpg" alt="corrupted image"></p>
+   </body>
+ </html>
+ 
+ 
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-image.jpg b/devtools/client/webconsole/new-console-output/test/mochitest/test-message-categories-image.jpg
+rename from devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-image.jpg
+rename to devtools/client/webconsole/new-console-output/test/mochitest/test-message-categories-image.jpg
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-imagemap.html b/devtools/client/webconsole/new-console-output/test/mochitest/test-message-categories-imagemap.html
+rename from devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-imagemap.html
+rename to devtools/client/webconsole/new-console-output/test/mochitest/test-message-categories-imagemap.html
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-malformedxml-external.html b/devtools/client/webconsole/new-console-output/test/mochitest/test-message-categories-malformedxml-external.html
+rename from devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-malformedxml-external.html
+rename to devtools/client/webconsole/new-console-output/test/mochitest/test-message-categories-malformedxml-external.html
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-malformedxml-external.html
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/test-message-categories-malformedxml-external.html
+@@ -3,17 +3,17 @@
+   <head>
+     <meta charset="utf-8">
+     <title>Web Console test for bug 595934 - category: malformed-xml.
+       (external file)</title>
+ <!-- Any copyright is dedicated to the Public Domain.
+      http://creativecommons.org/publicdomain/zero/1.0/ -->
+      <script type="text/javascript"><!--
+        var req = new XMLHttpRequest();
+-       req.open("GET", "test-bug-595934-malformedxml-external.xml", true);
++       req.open("GET", "test-message-categories-malformedxml-external.xml", true);
+        req.send(null);
+      // --></script>
+   </head>
+   <body>
+     <p>Web Console test for bug 595934 - category "malformed-xml"
+     (external file).</p>
+   </body>
+ </html>
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-malformedxml-external.xml b/devtools/client/webconsole/new-console-output/test/mochitest/test-message-categories-malformedxml-external.xml
+rename from devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-malformedxml-external.xml
+rename to devtools/client/webconsole/new-console-output/test/mochitest/test-message-categories-malformedxml-external.xml
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-malformedxml.xhtml b/devtools/client/webconsole/new-console-output/test/mochitest/test-message-categories-malformedxml.xhtml
+rename from devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-malformedxml.xhtml
+rename to devtools/client/webconsole/new-console-output/test/mochitest/test-message-categories-malformedxml.xhtml
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-svg.xhtml b/devtools/client/webconsole/new-console-output/test/mochitest/test-message-categories-svg.xhtml
+rename from devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-svg.xhtml
+rename to devtools/client/webconsole/new-console-output/test/mochitest/test-message-categories-svg.xhtml
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-workers.html b/devtools/client/webconsole/new-console-output/test/mochitest/test-message-categories-workers.html
+rename from devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-workers.html
+rename to devtools/client/webconsole/new-console-output/test/mochitest/test-message-categories-workers.html
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-workers.html
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/test-message-categories-workers.html
+@@ -5,14 +5,14 @@
+       javascript</title>
+     <!-- Any copyright is dedicated to the Public Domain.
+          http://creativecommons.org/publicdomain/zero/1.0/ -->
+   </head>
+   <body>
+     <p id="foobar">Web Console test for bug 595934 - category "DOM Worker
+     javascript".</p>
+     <script type="text/javascript">
+-      var myWorker = new Worker("test-bug-595934-workers.js");
++      var myWorker = new Worker("test-message-categories-workers.js");
+       myWorker.postMessage("hello world");
+     </script>
+   </body>
+ </html>
+ 
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-workers.js b/devtools/client/webconsole/new-console-output/test/mochitest/test-message-categories-workers.js
+rename from devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-workers.js
+rename to devtools/client/webconsole/new-console-output/test/mochitest/test-message-categories-workers.js

+ 176 - 0
mozilla-release/patches/1404392-59a1.patch

@@ -0,0 +1,176 @@
+# HG changeset patch
+# User Nicolas Chevobbe <nchevobbe@mozilla.com>
+# Date 1515430971 -3600
+# Node ID 6575fa09e55f5405a69b7c64c050174cd0536922
+# Parent  888bb98e2bbae19e91daa5093d1beb169015a3df
+Bug 1404392 - Enable and refactor browser_webconsole_filter_scroll.js to check that filtering does not affect scroll position; r=bgrins.
+
+MozReview-Commit-ID: DEZDnblICnh
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -272,17 +272,16 @@ skip-if = true #       Bug 1403907
+ [browser_webconsole_errors_after_page_reload.js]
+ [browser_webconsole_eval_in_debugger_stackframe.js]
+ [browser_webconsole_eval_in_debugger_stackframe2.js]
+ [browser_webconsole_execution_scope.js]
+ [browser_webconsole_external_script_errors.js]
+ [browser_webconsole_file_uri.js]
+ skip-if = true #       Bug 1404382
+ [browser_webconsole_filter_scroll.js]
+-skip-if = true #       Bug 1404392
+ [browser_webconsole_filters.js]
+ [browser_webconsole_filters_persist.js]
+ [browser_webconsole_highlighter_console_helper.js]
+ [browser_webconsole_history_arrow_keys.js]
+ [browser_webconsole_hpkp_invalid-headers.js]
+ [browser_webconsole_hsts_invalid-headers.js]
+ [browser_webconsole_iframe_wrong_hud.js]
+ skip-if = true #       Bug 1404378
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_filter_scroll.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_filter_scroll.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_filter_scroll.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_filter_scroll.js
+@@ -1,82 +1,78 @@
+ /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+ /* Any copyright is dedicated to the Public Domain.
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+ "use strict";
+ 
+-// See Bug 597460.
++const TEST_URI =
++`data:text/html;charset=utf-8,
++  <p>Web Console test for scroll when filtering.</p>
++  <script>
++  for (let i = 0; i < 100; i++) {
++    console.log("init-" + i);
++  }
++  </script>
++`;
++add_task(async function () {
++  const hud = await openNewTabAndConsole(TEST_URI);
++  let {ui} = hud;
++  const outputContainer = ui.outputNode.querySelector(".webconsole-output");
+ 
+-const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
+-                 "test/test-network.html";
+-const PREF = "devtools.webconsole.persistlog";
++  info("Console should be scrolled to bottom on initial load from page logs");
++  await waitFor(() => findMessage(hud, "init-99"));
++  ok(hasVerticalOverflow(outputContainer), "There is a vertical overflow");
++  ok(isScrolledToBottom(outputContainer), "The console is scrolled to the bottom");
+ 
+-add_task(function* () {
+-  Services.prefs.setBoolPref(PREF, true);
++  info("Filter out some messages and check that the scroll position is not impacted");
++  const filterInput = hud.ui.outputNode.querySelector(".text-filter");
+ 
+-  yield loadTab(TEST_URI);
+-  let hud = yield openConsole();
++  filterInput.value = "init-";
++  filterInput.focus();
++  let onMessagesFiltered = waitFor(() => !findMessage(hud, "init-1"), null, 200);
++  EventUtils.synthesizeKey("9", {});
++  await onMessagesFiltered;
++  ok(isScrolledToBottom(outputContainer),
++    "The console is still scrolled to the bottom after filtering");
++
++  info("Clear the text filter and check that the scroll position is not impacted");
++  let onMessagesUnFiltered = waitFor(() => findMessage(hud, "init-1"), null, 200);
++  filterInput.select();
++  EventUtils.synthesizeKey("VK_DELETE", {});
++  await onMessagesUnFiltered;
++  ok(isScrolledToBottom(outputContainer),
++    "The console is still scrolled to the bottom after clearing the filter");
+ 
+-  let results = yield consoleOpened(hud);
++  info("Scroll up");
++  outputContainer.scrollTop = 0;
+ 
+-  testScroll(results, hud);
++  filterInput.value = "init-";
++  filterInput.focus();
++  onMessagesFiltered = waitFor(() => !findMessage(hud, "init-1"), null, 200);
++  EventUtils.synthesizeKey("9", {});
++  await onMessagesFiltered;
++  is(outputContainer.scrollTop, 0,
++    "The console is still scrolled to the top after filtering");
+ 
+-  Services.prefs.clearUserPref(PREF);
++  info("Clear the text filter and check that the scroll position is not impacted");
++  onMessagesUnFiltered = waitFor(() => findMessage(hud, "init-1"), null, 200);
++  filterInput.select();
++  EventUtils.synthesizeKey("VK_DELETE", {});
++  await onMessagesUnFiltered;
++  is(outputContainer.scrollTop, 0,
++    "The console is still scrolled to the top after clearing the filter");
++
+ });
+ 
+-function consoleOpened(hud) {
+-  let deferred = defer();
+-
+-  for (let i = 0; i < 200; i++) {
+-    content.console.log("test message " + i);
+-  }
+-
+-  hud.setFilterState("network", false);
+-  hud.setFilterState("networkinfo", false);
+-
+-  hud.ui.filterBox.value = "test message";
+-  hud.ui.adjustVisibilityOnSearchStringChange();
+-
+-  waitForMessages({
+-    webconsole: hud,
+-    messages: [{
+-      name: "console messages displayed",
+-      text: "test message 199",
+-      category: CATEGORY_WEBDEV,
+-      severity: SEVERITY_LOG,
+-    }],
+-  }).then(() => {
+-    waitForMessages({
+-      webconsole: hud,
+-      messages: [{
+-        text: "test-network.html",
+-        category: CATEGORY_NETWORK,
+-        severity: SEVERITY_LOG,
+-      }],
+-    }).then(deferred.resolve);
+-
+-    content.location.reload();
+-  });
+-
+-  return deferred.promise;
++function hasVerticalOverflow(container) {
++  return container.scrollHeight > container.clientHeight;
+ }
+ 
+-function testScroll([result], hud) {
+-  let scrollNode = hud.ui.outputWrapper;
+-  let msgNode = [...result.matched][0];
+-  ok(msgNode.classList.contains("filtered-by-type"),
+-    "network message is filtered by type");
+-  ok(msgNode.classList.contains("filtered-by-string"),
+-    "network message is filtered by string");
+-
+-  ok(scrollNode.scrollTop > 0, "scroll location is not at the top");
+-
+-  // Make sure the Web Console output is scrolled as near as possible to the
+-  // bottom.
+-  let nodeHeight = msgNode.clientHeight;
+-  ok(scrollNode.scrollTop >= scrollNode.scrollHeight - scrollNode.clientHeight -
+-     nodeHeight * 2, "scroll location is correct");
+-
+-  hud.setFilterState("network", true);
+-  hud.setFilterState("networkinfo", true);
++function isScrolledToBottom(container) {
++  if (!container.lastChild) {
++    return true;
++  }
++  let lastNodeHeight = container.lastChild.clientHeight;
++  return container.scrollTop + container.clientHeight >=
++         container.scrollHeight - lastNodeHeight / 2;
+ }

+ 139 - 0
mozilla-release/patches/1404400-59a1.patch

@@ -0,0 +1,139 @@
+# HG changeset patch
+# User Nicolas Chevobbe <nchevobbe@mozilla.com>
+# Date 1510732678 -3600
+# Node ID 1c30145251a460fc34d1ca50a718dff3b911fa45
+# Parent  739d3b9fe1b204b63ee3290b3dd6f757fa0704c1
+Bug 1404400 - Delete browser_webconsole_charset.js from new frontend;r=Honza.
+
+This test was checking the HTTPinspector by directly calling a WebConsoleClient function
+which is no longer used in console code.
+
+MozReview-Commit-ID: LxjhhO2rB0W
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -50,18 +50,16 @@ support-files =
+   test-bug-595934-malformedxml.xhtml
+   test-bug-595934-svg.xhtml
+   test-bug-595934-workers.html
+   test-bug-595934-workers.js
+   test-bug-597136-external-script-errors.html
+   test-bug-597136-external-script-errors.js
+   test-bug-597756-reopen-closed-tab.html
+   test-bug-599725-response-headers.sjs
+-  test-bug-600183-charset.html
+-  test-bug-600183-charset.html^headers^
+   test-bug-601177-log-levels.html
+   test-bug-601177-log-levels.js
+   test-bug-603750-websocket.html
+   test-bug-603750-websocket.js
+   test-cd-iframe-child.html
+   test-cd-iframe-parent.html
+   test-bug-613013-console-api-iframe.html
+   test-bug-618078-network-exceptions.html
+@@ -226,18 +224,16 @@ subsuite = clipboard
+ [browser_webconsole_allow_mixedcontent_securityerrors.js]
+ tags = mcb
+ [browser_webconsole_batching.js]
+ [browser_webconsole_block_mixedcontent_securityerrors.js]
+ tags = mcb
+ [browser_webconsole_cached_messages.js]
+ [browser_webconsole_cd_iframe.js]
+ [browser_webconsole_certificate_messages.js]
+-[browser_webconsole_charset.js]
+-skip-if = true #       Bug 1404400
+ [browser_webconsole_click_function_to_source.js]
+ [browser_webconsole_clickable_urls.js]
+ [browser_webconsole_closing_after_completion.js]
+ [browser_webconsole_close_sidebar.js]
+ [browser_webconsole_closure_inspection.js]
+ skip-if = true #       Bug 1405250
+ [browser_webconsole_completion.js]
+ skip-if = true # Bug 1408929
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_charset.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_charset.js
+deleted file mode 100644
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_charset.js
++++ /dev/null
+@@ -1,61 +0,0 @@
+-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+-/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+-/* Any copyright is dedicated to the Public Domain.
+- * http://creativecommons.org/publicdomain/zero/1.0/ */
+-
+-"use strict";
+-
+-// See Bug 600183.
+-
+-const INIT_URI = "data:text/html;charset=utf-8,Web Console - bug 600183 test";
+-const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
+-                 "test/test-bug-600183-charset.html";
+-
+-function performTest(lastFinishedRequest, console) {
+-  let deferred = defer();
+-
+-  ok(lastFinishedRequest, "charset test page was loaded and logged");
+-  HUDService.lastFinishedRequest.callback = null;
+-
+-  executeSoon(() => {
+-    console.webConsoleClient.getResponseContent(lastFinishedRequest.actor,
+-      (response) => {
+-        ok(!response.contentDiscarded, "response body was not discarded");
+-
+-        let body = response.content.text;
+-        ok(body, "we have the response body");
+-
+-        // 的问候!
+-        let chars = "\u7684\u95ee\u5019!";
+-        isnot(body.indexOf("<p>" + chars + "</p>"), -1,
+-          "found the chinese simplified string");
+-
+-        HUDService.lastFinishedRequest.callback = null;
+-        executeSoon(deferred.resolve);
+-      });
+-  });
+-
+-  return deferred.promise;
+-}
+-
+-function waitForRequest() {
+-  let deferred = defer();
+-  HUDService.lastFinishedRequest.callback = (req, console) => {
+-    performTest(req, console).then(deferred.resolve);
+-  };
+-  return deferred.promise;
+-}
+-
+-add_task(function* () {
+-  let { browser } = yield loadTab(INIT_URI);
+-
+-  yield openConsole();
+-
+-  let gotLastRequest = waitForRequest();
+-
+-  let loaded = loadBrowser(browser);
+-  BrowserTestUtils.loadURI(browser, TEST_URI);
+-  yield loaded;
+-
+-  yield gotLastRequest;
+-});
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-600183-charset.html b/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-600183-charset.html
+deleted file mode 100644
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-600183-charset.html
++++ /dev/null
+@@ -1,9 +0,0 @@
+-<!DOCTYPE HTML>
+-<html dir="ltr" xml:lang="en-US" lang="en-US"><head>
+-    <meta charset="gb2312">
+-    <title>Console HTTP test page (chinese)</title>
+-  </head>
+-  <body>
+-    <p>µÄÎʺò!</p>
+-  </body>
+-</html>
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-600183-charset.html^headers^ b/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-600183-charset.html^headers^
+deleted file mode 100644
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-600183-charset.html^headers^
++++ /dev/null
+@@ -1,1 +0,0 @@
+-Content-Type: text/html; charset=gb2312

+ 159 - 0
mozilla-release/patches/1404832-1-60a1.patch

@@ -0,0 +1,159 @@
+# HG changeset patch
+# User Julian Descottes <jdescottes@mozilla.com>
+# Date 1518191493 -3600
+# Node ID 1e36136d7dda14351dc8a2945410e6faa735b021
+# Parent  b24e0fb4e8031488e28d7847f229688713be4d48
+Bug 1404832 - rename and enable browser_webconsole_loglimit.js;r=nchevobbe
+
+The scrolling part of the test already seems covered in
+browser_webconsole_scroll.js
+
+MozReview-Commit-ID: 3CX9HKkPzqW
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -296,16 +296,17 @@ skip-if = true #       Bug 1405343
+ [browser_webconsole_jsterm.js]
+ skip-if = true #       Bug 1405352
+ # old console skip-if = e10s # Bug 1042253 - webconsole e10s tests (Linux debug timeout)
+ [browser_webconsole_keyboard_accessibility.js]
+ [browser_webconsole_location_debugger_link.js]
+ [browser_webconsole_location_scratchpad_link.js]
+ [browser_webconsole_location_styleeditor_link.js]
+ [browser_webconsole_logErrorInPage.js]
++[browser_webconsole_loglimit.js]
+ [browser_webconsole_longstring_expand.js]
+ skip-if = true #       Bug 1403448
+ [browser_webconsole_longstring_hang.js]
+ skip-if = true #       Bug 1403448
+ [browser_webconsole_message_categories.js]
+ [browser_webconsole_multiple_windows_and_tabs.js]
+ [browser_webconsole_network_attach.js]
+ [browser_webconsole_network_exceptions.js]
+@@ -322,18 +323,16 @@ skip-if = true #       Bug 1403448
+ [browser_webconsole_observer_notifications.js]
+ [browser_webconsole_optimized_out_vars.js]
+ [browser_webconsole_output_copy.js]
+ subsuite = clipboard
+ [browser_webconsole_output_copy_newlines.js]
+ subsuite = clipboard
+ [browser_webconsole_output_order.js]
+ [browser_webconsole_persist.js]
+-[browser_webconsole_prune_scroll.js]
+-skip-if = true #       Bug 1404832
+ [browser_webconsole_reopen_closed_tab.js]
+ [browser_webconsole_repeat_different_objects.js]
+ [browser_webconsole_repeated_messages_accuracy.js]
+ skip-if = true #       Bug 1403450
+ [browser_webconsole_sandbox_update_after_navigation.js]
+ [browser_webconsole_script_errordoc_urls.js]
+ skip-if = true #       Bug 1403454
+ # old console skip-if = e10s # Bug 1042253 - webconsole tests disabled with e10s
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_prune_scroll.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_loglimit.js
+rename from devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_prune_scroll.js
+rename to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_loglimit.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_prune_scroll.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_loglimit.js
+@@ -1,84 +1,40 @@
+ /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+ /* Any copyright is dedicated to the Public Domain.
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+ "use strict";
+ 
+-// See Bug 613642.
++// Test that messages are properly updated when the log limit is reached.
+ 
+ const TEST_URI = "data:text/html;charset=utf-8,Web Console test for " +
+-                 "bug 613642: maintain scroll with pruning of old messages";
+-
+-var hud;
++                 "Old messages are removed after passing devtools.hud.loglimit";
+ 
+-add_task(function* () {
+-  yield loadTab(TEST_URI);
+-
+-  hud = yield openConsole();
+-
++add_task(async function () {
++  await pushPref("devtools.hud.loglimit", 140);
++  let hud = await openNewTabAndConsole(TEST_URI);
+   hud.jsterm.clearOutput();
+ 
+-  let outputNode = hud.outputNode;
+-
+-  Services.prefs.setIntPref("devtools.hud.loglimit.console", 140);
+-  let scrollBoxElement = hud.ui.outputWrapper;
+-
++  let onMessage = waitForMessage(hud, "test message [149]");
+   ContentTask.spawn(gBrowser.selectedBrowser, {}, function* () {
+     for (let i = 0; i < 150; i++) {
+-      content.console.log("test message " + i);
++      content.console.log(`test message [${i}]`);
+     }
+   });
+-
+-  yield waitForMessages({
+-    webconsole: hud,
+-    messages: [{
+-      text: "test message 149",
+-      category: CATEGORY_WEBDEV,
+-      severity: SEVERITY_LOG,
+-    }],
+-  });
+-
+-  let oldScrollTop = scrollBoxElement.scrollTop;
+-  isnot(oldScrollTop, 0, "scroll location is not at the top");
++  await onMessage;
+ 
+-  let firstNode = outputNode.firstChild;
+-  ok(firstNode, "found the first message");
+-
+-  let msgNode = outputNode.children[80];
+-  ok(msgNode, "found the 80th message");
++  ok(!findMessage(hud, "test message [0]"), "Message 0 has been pruned");
++  ok(!findMessage(hud, "test message [9]"), "Message 9 has been pruned");
++  ok(findMessage(hud, "test message [10]"), "Message 10 is still displayed");
++  is(findMessages(hud, "").length, 140, "Number of displayed messages is correct");
+ 
+-  // scroll to the middle message node
+-  msgNode.scrollIntoView(false);
+-
+-  isnot(scrollBoxElement.scrollTop, oldScrollTop,
+-        "scroll location updated (scrolled to message)");
+-
+-  oldScrollTop = scrollBoxElement.scrollTop;
+-
+-  // add a message
++  onMessage = waitForMessage(hud, "hello world");
+   ContentTask.spawn(gBrowser.selectedBrowser, {}, function* () {
+     content.console.log("hello world");
+   });
+-
+-  yield waitForMessages({
+-    webconsole: hud,
+-    messages: [{
+-      text: "hello world",
+-      category: CATEGORY_WEBDEV,
+-      severity: SEVERITY_LOG,
+-    }],
+-  });
++  await onMessage;
+ 
+-  // Scroll location needs to change, because one message is also removed, and
+-  // we need to scroll a bit towards the top, to keep the current view in sync.
+-  isnot(scrollBoxElement.scrollTop, oldScrollTop,
+-        "scroll location updated (added a message)");
+-
+-  isnot(outputNode.firstChild, firstNode,
+-        "first message removed");
+-
+-  Services.prefs.clearUserPref("devtools.hud.loglimit.console");
+-
+-  hud = null;
++  ok(!findMessage(hud, "test message [10]"), "Message 10 has been pruned");
++  ok(findMessage(hud, "test message [11]"), "Message 11 is still displayed");
++  is(findMessages(hud, "").length, 140, "Number of displayed messages is still correct");
+ });

+ 60 - 0
mozilla-release/patches/1404832-2-60a1.patch

@@ -0,0 +1,60 @@
+# HG changeset patch
+# User Julian Descottes <jdescottes@mozilla.com>
+# Date 1518191542 -3600
+# Node ID 0f14e2c1aba3a44fced747e97a473a684236b48f
+# Parent  297f6d7f5d29f6f750cce4c19370cd0465fcd2cc
+Bug 1404832 - remove unused support file;r=nchevobbe
+
+The test browser_webconsole_bug_644419_log_limits.js was marked
+as irrelevant for the new console frontend, but the support file
+was still copied to the new frontend folder.
+
+MozReview-Commit-ID: 7malhunu3N8
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -25,17 +25,16 @@ support-files =
+   test-bug_923281_test2.js
+   test-console-trace-duplicates.html
+   test-bug-585956-console-trace.html
+   test-bug-599725-response-headers.sjs
+   test-bug-601177-log-levels.html
+   test-bug-601177-log-levels.js
+   test-bug-630733-response-redirect-headers.sjs
+   test-bug-632275-getters.html
+-  test-bug-644419-log-limits.html
+   test-bug-646025-console-file-location.html
+   test-bug-658368-time-methods.html
+   test-bug-766001-console-log.js
+   test-bug-766001-js-console-links.html
+   test-bug-766001-js-errors.js
+   test-bug-782653-css-errors-1.css
+   test-bug-782653-css-errors-2.css
+   test-bug-782653-css-errors.html
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-644419-log-limits.html b/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-644419-log-limits.html
+deleted file mode 100644
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-644419-log-limits.html
++++ /dev/null
+@@ -1,21 +0,0 @@
+-<!DOCTYPE html>
+-<html>
+-<!-- Any copyright is dedicated to the Public Domain.
+-   http://creativecommons.org/publicdomain/zero/1.0/ -->
+-  <head>
+-    <meta charset="utf-8">
+-    <title>Test for bug 644419: console log limits</title>
+-  </head>
+-  <body>
+-    <h1>Test for bug 644419:  Console should have user-settable log limits for
+-      each message category</h1>
+-
+-    <script type="text/javascript">
+-      function foo() {
+-        bar.baz();
+-      }
+-      foo();
+-    </script>
+-  </body>
+-</html>
+-

+ 87 - 0
mozilla-release/patches/1404844-60a1.patch

@@ -0,0 +1,87 @@
+# HG changeset patch
+# User Michael Ratcliffe <mratcliffe@mozilla.com>
+# Date 1518451186 0
+# Node ID 436c339d3305183f066d6b123d38f5ddc4278c73
+# Parent  24c8bb898a142113aeedd6eea5bb0549bac34efb
+Bug 1404844 - Migrate browser_webconsole_bug_623749_ctrl_a_select_all_winnt.js to the new frontend r=jdescottes
+
+MozReview-Commit-ID: 6GbekLySWc9
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -207,16 +207,17 @@ skip-if = true #       Bug 1403188
+ [browser_jsterm_autocomplete_inside_text.js]
+ [browser_jsterm_autocomplete_native_getters.js]
+ [browser_jsterm_autocomplete_nav_and_tab_key.js]
+ [browser_jsterm_autocomplete_return_key_no_selection.js]
+ [browser_jsterm_autocomplete_return_key.js]
+ [browser_jsterm_autocomplete-properties-with-non-alphanumeric-names.js]
+ [browser_jsterm_completion.js]
+ [browser_jsterm_copy_command.js]
++[browser_jsterm_ctrl_a_select_all.js]
+ [browser_jsterm_ctrl_key_nav.js]
+ skip-if = os != 'mac' # The tested ctrl+key shortcuts are OSX only
+ [browser_jsterm_dollar.js]
+ [browser_jsterm_helper_clear.js]
+ [browser_jsterm_history.js]
+ [browser_jsterm_history_persist.js]
+ [browser_jsterm_history_nav.js]
+ [browser_jsterm_input_expansion.js]
+diff --git a/devtools/client/webconsole/test/browser_webconsole_bug_623749_ctrl_a_select_all_winnt.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_ctrl_a_select_all.js
+copy from devtools/client/webconsole/test/browser_webconsole_bug_623749_ctrl_a_select_all_winnt.js
+copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_ctrl_a_select_all.js
+--- a/devtools/client/webconsole/test/browser_webconsole_bug_623749_ctrl_a_select_all_winnt.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_ctrl_a_select_all.js
+@@ -1,32 +1,37 @@
+ /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+ /* Any copyright is dedicated to the Public Domain.
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+-// Test for https://bugzilla.mozilla.org/show_bug.cgi?id=623749
+-// Map Control + A to Select All, In the web console input, on Windows
++// Map Control + A to Select All, In the web console input
++
++/* import-globals-from head.js */
+ 
+ "use strict";
+ 
+-const TEST_URI = "data:text/html;charset=utf-8,Test console for bug 623749";
++const TEST_URI = "data:text/html;charset=utf-8,Test console select all";
+ 
+-add_task(function* () {
+-  yield loadTab(TEST_URI);
+-
+-  let hud = yield openConsole();
++add_task(async function testCtrlA() {
++  let hud = await openNewTabAndConsole(TEST_URI);
+ 
+   let jsterm = hud.jsterm;
+   jsterm.setInputValue("Ignore These Four Words");
+   let inputNode = jsterm.inputNode;
+ 
+-  // Test select all with Control + A.
+-  EventUtils.synthesizeKey("a", { ctrlKey: true });
++  // Test select all with (cmd|control) + a.
++  EventUtils.synthesizeKey("a", { accelKey: true });
++
+   let inputLength = inputNode.selectionEnd - inputNode.selectionStart;
+   is(inputLength, jsterm.getInputValue().length, "Select all of input");
+ 
+-  // Test do nothing on Control + E.
+-  jsterm.setInputValue("Ignore These Four Words");
+-  inputNode.selectionStart = 0;
+-  EventUtils.synthesizeKey("e", { ctrlKey: true });
+-  is(inputNode.selectionStart, 0, "Control + E does not move to end of input");
++  // (cmd|control) + e cannot be disabled on Linux so skip this section on that
++  // OS.
++  if (Services.appinfo.OS !== "Linux") {
++   // Test do nothing on Control + E.
++    jsterm.setInputValue("Ignore These Four Words");
++    inputNode.selectionStart = 0;
++    EventUtils.synthesizeKey("e", { accelKey: true });
++    is(inputNode.selectionStart, 0,
++      "control|cmd + e does not move to end of input");
++  }
+ });

+ 248 - 0
mozilla-release/patches/1404849-59a1.patch

@@ -0,0 +1,248 @@
+# HG changeset patch
+# User Julian Descottes <jdescottes@mozilla.com>
+# Date 1515582252 -3600
+# Node ID 48cb9676ec2c0041967861731d11920a0fa1680b
+# Parent  f01b5e6ed4ff38e3b0f2473460169f5519a242ef
+Bug 1404849 - migrate mochitest for generators autocompletion to xpcshell;r=nchevobbe
+
+MozReview-Commit-ID: 74EaFkIZva7
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -46,17 +46,16 @@ support-files =
+   test-bug-595934-svg.xhtml
+   test-bug-595934-workers.html
+   test-bug-595934-workers.js
+   test-bug-599725-response-headers.sjs
+   test-bug-601177-log-levels.html
+   test-bug-601177-log-levels.js
+   test-bug-630733-response-redirect-headers.sjs
+   test-bug-632275-getters.html
+-  test-bug-632347-iterators-generators.html
+   test-bug-644419-log-limits.html
+   test-bug-646025-console-file-location.html
+   test-bug-658368-time-methods.html
+   test-bug-737873-mixedcontent.html
+   test-bug-752559-ineffective-iframe-sandbox-warning-inner.html
+   test-bug-752559-ineffective-iframe-sandbox-warning-nested1.html
+   test-bug-752559-ineffective-iframe-sandbox-warning-nested2.html
+   test-bug-752559-ineffective-iframe-sandbox-warning0.html
+@@ -294,19 +293,16 @@ skip-if = true #       Bug 1404371
+ skip-if = true #       Bug 1405343
+ [browser_webconsole_input_focus.js]
+ [browser_webconsole_insecure_passwords_about_blank_web_console_warning.js]
+ skip-if = true #       Bug 1404884
+ [browser_webconsole_insecure_passwords_web_console_warning.js]
+ skip-if = true #       Bug 1404888
+ # old console skip-if = true # Bug 1110500 - mouse event failure in test
+ [browser_webconsole_inspect_cross_domain_object.js]
+-[browser_webconsole_iterators_generators.js]
+-skip-if = true #       Bug 1404849
+-# old console skip-if = e10s # Bug 1042253 - webconsole tests disabled with e10s
+ [browser_webconsole_js_input_expansion.js]
+ [browser_webconsole_jsterm.js]
+ skip-if = true #       Bug 1405352
+ # old console skip-if = e10s # Bug 1042253 - webconsole e10s tests (Linux debug timeout)
+ [browser_webconsole_jsterm_copy.js]
+ subsuite = clipboard
+ skip-if = true #       Bug 1404831
+ # old console skip-if = (os == 'linux' && bits == 32 && debug) # bug 1328915, disable linux32 debug devtools for timeouts
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_iterators_generators.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_iterators_generators.js
+deleted file mode 100644
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_iterators_generators.js
++++ /dev/null
+@@ -1,69 +0,0 @@
+-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+-/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+-/* Any copyright is dedicated to the Public Domain.
+- * http://creativecommons.org/publicdomain/zero/1.0/ */
+-
+-"use strict";
+-
+-// See Bug 632347.
+-
+-const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
+-                 "test/test-bug-632347-iterators-generators.html";
+-
+-function test() {
+-  requestLongerTimeout(6);
+-
+-  loadTab(TEST_URI).then(() => {
+-    openConsole().then(consoleOpened);
+-  });
+-}
+-
+-function consoleOpened(HUD) {
+-  let {JSPropertyProvider} = require("devtools/shared/webconsole/js-property-provider");
+-
+-  let tmp = ChromeUtils.import("resource://gre/modules/jsdebugger.jsm", {});
+-  tmp.addDebuggerToGlobal(tmp);
+-  let dbg = new tmp.Debugger();
+-
+-  let jsterm = HUD.jsterm;
+-  let win = content.wrappedJSObject;
+-  let dbgWindow = dbg.addDebuggee(content);
+-  let container = win._container;
+-
+-  // Make sure autocomplete does not walk through generators.
+-  let result = container.gen1.next().value;
+-  let completion = JSPropertyProvider(dbgWindow, null, "_container.gen1.");
+-  isnot(completion.matches.length, 0, "Got matches for gen1");
+-
+-  is(result + 1, container.gen1.next().value, "gen1.next() did not execute");
+-
+-  result = container.gen2.next().value;
+-
+-  completion = JSPropertyProvider(dbgWindow, null, "_container.gen2.");
+-  isnot(completion.matches.length, 0, "Got matches for gen2");
+-
+-  is((result / 2 + 1) * 2, container.gen2.next().value,
+-     "gen2.next() did not execute");
+-
+-  completion = JSPropertyProvider(dbgWindow, null, "window._container.");
+-  ok(completion, "matches available for window._container");
+-  ok(completion.matches.length, "matches available for window (length)");
+-
+-  dbg.removeDebuggee(content);
+-  jsterm.clearOutput();
+-
+-  jsterm.execute("window._container", (msg) => {
+-    jsterm.once("variablesview-fetched", testVariablesView.bind(null, HUD));
+-    let anchor = msg.querySelector(".message-body a");
+-    EventUtils.synthesizeMouse(anchor, 2, 2, {}, HUD.iframeWindow);
+-  });
+-}
+-
+-function testVariablesView(aWebconsole, aEvent, aView) {
+-  findVariableViewProperties(aView, [
+-    { name: "gen1", isGenerator: true },
+-    { name: "gen2", isGenerator: true },
+-  ], { webconsole: aWebconsole }).then(function () {
+-    executeSoon(finishTest);
+-  });
+-}
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-632347-iterators-generators.html b/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-632347-iterators-generators.html
+deleted file mode 100644
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-632347-iterators-generators.html
++++ /dev/null
+@@ -1,29 +0,0 @@
+-<!DOCTYPE html>
+-<html lang="en">
+-  <head>
+-    <meta charset="utf-8">
+-    <title>Web Console test for bug 632347 - generators</title>
+-    <!-- Any copyright is dedicated to the Public Domain.
+-         http://creativecommons.org/publicdomain/zero/1.0/ -->
+-<script type="application/javascript;version=1.8">
+-(function(){
+-function* genFunc() {
+-  var a = 5;
+-  while (a < 10) {
+-    yield a++;
+-  }
+-}
+-
+-window._container = {};
+-
+-_container.gen1 = genFunc();
+-_container.gen1.next();
+-
+-_container.gen2 = (function* () { for (let i = 3; i <= 15; ++i) yield i * 2; })();
+-})();
+-</script>
+-  </head>
+-  <body>
+-    <p>Web Console test for bug 632347 - generators.</p>
+-  </body>
+-</html>
+diff --git a/devtools/shared/webconsole/test/unit/test_js_property_provider.js b/devtools/shared/webconsole/test/unit/test_js_property_provider.js
+--- a/devtools/shared/webconsole/test/unit/test_js_property_provider.js
++++ b/devtools/shared/webconsole/test/unit/test_js_property_provider.js
+@@ -23,33 +23,51 @@ function run_test() {
+       {propE: "E"}
+     ]
+   ]`;
+ 
+   const testObject = 'var testObject = {"propA": [{"propB": "B"}]}';
+   const testHyphenated = 'var testHyphenated = {"prop-A": "res-A"}';
+   const testLet = "let foobar = {a: ''}; const blargh = {a: 1};";
+ 
++  const testGenerators = `
++  // Test with generator using a named function.
++  function* genFunc() {
++    for (let i = 0; i < 10; i++) {
++      yield i;
++    }
++  }
++  let gen1 = genFunc();
++  gen1.next();
++
++  // Test with generator using an anonymous function.
++  let gen2 = (function* () {
++    for (let i = 0; i < 10; i++) {
++      yield i;
++    }
++  })();`;
++
+   let sandbox = Cu.Sandbox("http://example.com");
+   let dbg = new Debugger();
+   let dbgObject = dbg.addDebuggee(sandbox);
+   let dbgEnv = dbgObject.asEnvironment();
+   Cu.evalInSandbox(testArray, sandbox);
+   Cu.evalInSandbox(testObject, sandbox);
+   Cu.evalInSandbox(testHyphenated, sandbox);
+   Cu.evalInSandbox(testLet, sandbox);
++  Cu.evalInSandbox(testGenerators, sandbox);
+ 
+   info("Running tests with dbgObject");
+-  runChecks(dbgObject, null);
++  runChecks(dbgObject, null, sandbox);
+ 
+   info("Running tests with dbgEnv");
+-  runChecks(null, dbgEnv);
++  runChecks(null, dbgEnv, sandbox);
+ }
+ 
+-function runChecks(dbgObject, dbgEnv) {
++function runChecks(dbgObject, dbgEnv, sandbox) {
+   info("Test that suggestions are given for 'this'");
+   let results = JSPropertyProvider(dbgObject, dbgEnv, "t");
+   test_has_result(results, "this");
+ 
+   if (dbgObject != null) {
+     info("Test that suggestions are given for 'this.'");
+     results = JSPropertyProvider(dbgObject, dbgEnv, "this.");
+     test_has_result(results, "testObject");
+@@ -140,16 +158,31 @@ function runChecks(dbgObject, dbgEnv) {
+   Assert.equal(null, results);
+ 
+   results = JSPropertyProvider(dbgObject, dbgEnv, "testArray[][1].");
+   Assert.equal(null, results);
+ 
+   info("Test that suggestions are not given if there is an hyphen in the chain.");
+   results = JSPropertyProvider(dbgObject, dbgEnv, "testHyphenated['prop-A'].");
+   Assert.equal(null, results);
++
++  info("Test that we have suggestions for generators.");
++  let gen1Result = Cu.evalInSandbox("gen1.next().value", sandbox);
++  results = JSPropertyProvider(dbgObject, dbgEnv, "gen1.");
++  test_has_result(results, "next");
++  info("Test that the generator next() was not executed");
++  let gen1NextResult = Cu.evalInSandbox("gen1.next().value", sandbox);
++  Assert.equal(gen1Result + 1, gen1NextResult);
++
++  info("Test with an anonymous generator.");
++  let gen2Result = Cu.evalInSandbox("gen2.next().value", sandbox);
++  results = JSPropertyProvider(dbgObject, dbgEnv, "gen2.");
++  test_has_result(results, "next");
++  let gen2NextResult = Cu.evalInSandbox("gen2.next().value", sandbox);
++  Assert.equal(gen2Result + 1, gen2NextResult);
+ }
+ 
+ /**
+  * A helper that ensures an empty array of results were found.
+  * @param Object results
+  *        The results returned by JSPropertyProvider.
+  */
+ function test_has_no_results(results) {

+ 192 - 0
mozilla-release/patches/1404851-59a1.patch

@@ -0,0 +1,192 @@
+# HG changeset patch
+# User Nicolas Chevobbe <nchevobbe@mozilla.com>
+# Date 1511951277 -3600
+# Node ID 4a91f7382c9694820cac432d6540f73778e1751e
+# Parent  a430afe1a5efcc652b2994229f2c3c16d8d6e3aa
+Bug 1404851 - Rename, adapt and enable browser_webconsole_document_body_autocomplete; r=jdescottes.
+
+We drop the part of the test which tests the output of document.body
+since it's already tested in reps.
+
+MozReview-Commit-ID: JKmGNHRw6Iu
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -200,16 +200,17 @@ skip-if = true #       Bug 1403188
+ [browser_jsterm_autocomplete_cached_results.js]
+ [browser_jsterm_autocomplete_crossdomain_iframe.js]
+ [browser_jsterm_autocomplete_escape_key.js]
+ [browser_jsterm_autocomplete_extraneous_closing_brackets.js]
+ [browser_jsterm_autocomplete_helpers.js]
+ [browser_jsterm_autocomplete_in_chrome_tab.js]
+ [browser_jsterm_autocomplete_in_debugger_stackframe.js]
+ [browser_jsterm_autocomplete_inside_text.js]
++[browser_jsterm_autocomplete_native_getters.js]
+ [browser_jsterm_autocomplete_nav_and_tab_key.js]
+ [browser_jsterm_autocomplete_return_key_no_selection.js]
+ [browser_jsterm_autocomplete_return_key.js]
+ [browser_jsterm_autocomplete-properties-with-non-alphanumeric-names.js]
+ [browser_jsterm_completion.js]
+ [browser_jsterm_copy_command.js]
+ [browser_jsterm_dollar.js]
+ [browser_jsterm_history.js]
+@@ -263,18 +264,16 @@ skip-if = (e10s && debug) || (e10s && os
+ [browser_webconsole_cspro.js]
+ skip-if = true # Bug 1408932
+ # old console skip-if = e10s && (os == 'win' || os == 'mac') # Bug 1243967
+ [browser_webconsole_ctrl_key_nav.js]
+ skip-if = true # Bug 1408933
+ # old console skip-if = os != "mac"
+ [browser_webconsole_deactivateHUDForContext_unfocused_window.js]
+ skip-if = true # Bug 1408934
+-[browser_webconsole_document_body_autocomplete.js]
+-skip-if = true #       Bug 1404851
+ [browser_webconsole_document_focus.js]
+ skip-if = true #       Bug 1404368
+ [browser_webconsole_duplicate_errors.js]
+ skip-if = true #       Bug 1403907
+ [browser_webconsole_errors_after_page_reload.js]
+ skip-if = true # Bug 1408935
+ [browser_webconsole_eval_in_debugger_stackframe.js]
+ skip-if = true # Bug 1408936
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_document_body_autocomplete.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_autocomplete_native_getters.js
+rename from devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_document_body_autocomplete.js
+rename to devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_autocomplete_native_getters.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_document_body_autocomplete.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_autocomplete_native_getters.js
+@@ -1,102 +1,57 @@
+ /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+ /* Any copyright is dedicated to the Public Domain.
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+-// Tests that document.body autocompletes in the web console. See Bug 651501.
++// Tests that native getters (e.g. document.body) autocompletes in the web console.
++// See Bug 651501.
+ 
+ "use strict";
+ 
+-const TEST_URI = "data:text/html;charset=utf-8,Web Console autocompletion " +
+-                 "bug in document.body";
+-
+-var gHUD;
++const TEST_URI = "data:text/html;charset=utf-8,Test document.body autocompletion";
+ 
+-add_task(function* () {
+-  yield loadTab(TEST_URI);
+-
+-  gHUD = yield openConsole();
++add_task(async function () {
++  let { jsterm } = await openNewTabAndConsole(TEST_URI);
+ 
+-  yield consoleOpened();
+-  yield autocompletePopupHidden();
+-  let view = yield testPropertyPanel();
+-  yield onVariablesViewReady(view);
+-
+-  gHUD = null;
+-});
+-
+-function consoleOpened() {
+-  let deferred = defer();
+-
+-  let jsterm = gHUD.jsterm;
+-  let popup = jsterm.autocompletePopup;
++  const {
++    autocompletePopup: popup,
++    completeNode,
++  } = jsterm;
+ 
+   ok(!popup.isOpen, "popup is not open");
+-
+-  popup.once("popup-opened", () => {
+-    ok(popup.isOpen, "popup is open");
+-
+-    is(popup.itemCount, jsterm._autocompleteCache.length,
+-       "popup.itemCount is correct");
+-    isnot(jsterm._autocompleteCache.indexOf("addEventListener"), -1,
+-          "addEventListener is in the list of suggestions");
+-    isnot(jsterm._autocompleteCache.indexOf("bgColor"), -1,
+-          "bgColor is in the list of suggestions");
+-    isnot(jsterm._autocompleteCache.indexOf("ATTRIBUTE_NODE"), -1,
+-          "ATTRIBUTE_NODE is in the list of suggestions");
+-
+-    popup.once("popup-closed", () => {
+-      deferred.resolve();
+-    });
+-    EventUtils.synthesizeKey("VK_ESCAPE", {});
+-  });
++  let onPopupOpen = popup.once("popup-opened");
+ 
+   jsterm.setInputValue("document.body");
+   EventUtils.synthesizeKey(".", {});
+ 
+-  return deferred.promise;
+-}
++  await onPopupOpen;
+ 
+-function autocompletePopupHidden() {
+-  let deferred = defer();
++  ok(popup.isOpen, "popup is open");
++  is(popup.itemCount, jsterm._autocompleteCache.length, "popup.itemCount is correct");
++  ok(jsterm._autocompleteCache.includes("addEventListener"),
++        "addEventListener is in the list of suggestions");
++  ok(jsterm._autocompleteCache.includes("bgColor"),
++    "bgColor is in the list of suggestions");
++  ok(jsterm._autocompleteCache.includes("ATTRIBUTE_NODE"),
++    "ATTRIBUTE_NODE is in the list of suggestions");
+ 
+-  let jsterm = gHUD.jsterm;
+-  let popup = jsterm.autocompletePopup;
+-  let completeNode = jsterm.completeNode;
++  let onPopupClose = popup.once("popup-closed");
++  EventUtils.synthesizeKey("VK_ESCAPE", {});
++
++  await onPopupClose;
+ 
+   ok(!popup.isOpen, "popup is not open");
+-
+-  jsterm.once("autocomplete-updated", function () {
+-    is(completeNode.value, testStr + "dy", "autocomplete shows document.body");
+-    deferred.resolve();
+-  });
+-
++  let onAutoCompleteUpdated = jsterm.once("autocomplete-updated");
+   let inputStr = "document.b";
+   jsterm.setInputValue(inputStr);
+   EventUtils.synthesizeKey("o", {});
+-  let testStr = inputStr.replace(/./g, " ") + " ";
+ 
+-  return deferred.promise;
+-}
+-
+-function testPropertyPanel() {
+-  let deferred = defer();
++  await onAutoCompleteUpdated;
+ 
+-  let jsterm = gHUD.jsterm;
+-  jsterm.clearOutput();
+-  jsterm.execute("document", (msg) => {
+-    jsterm.once("variablesview-fetched", (evt, view) => {
+-      deferred.resolve(view);
+-    });
+-    let anchor = msg.querySelector(".message-body a");
+-    EventUtils.synthesizeMouse(anchor, 2, 2, {}, gHUD.iframeWindow);
+-  });
+-
+-  return deferred.promise;
+-}
+-
+-function onVariablesViewReady(view) {
+-  return findVariableViewProperties(view, [
+-    { name: "body", value: "<body>" },
+-  ], { webconsole: gHUD });
+-}
++  // Build the spaces that are placed in the input to place the autocompletion result at
++  // the expected spot:
++  // > document.bo        <-- input
++  // > -----------dy      <-- autocomplete
++  const spaces = " ".repeat(inputStr.length + 1);
++  is(completeNode.value, spaces + "dy", "autocomplete shows document.body");
++});

+ 246 - 0
mozilla-release/patches/1404853-59a1.patch

@@ -0,0 +1,246 @@
+# HG changeset patch
+# User Nicolas Chevobbe <nchevobbe@mozilla.com>
+# Date 1512971660 -3600
+# Node ID e14fbde5349138be557996ca3f55c687ebcfb7be
+# Parent  c6dc85434c9b44caf19cfe1adc5c4ae0e47a614f
+Bug 1404853 - Enable browser_webconsole_highlighter_console_helper.js in new console frontend; r=Honza.
+
+This changes the code of the test since it was relying on direct access to the content page.
+In order to be able to interact with the element picker, the test-actor and test-actor-registery
+files are loaded by head.js.
+
+MozReview-Commit-ID: FyebIiyF31j
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -160,16 +160,19 @@ support-files =
+   test-trackingprotection-securityerrors.html
+   test-webconsole-error-observer.html
+   test-websocket.html
+   test-websocket.js
+   testscript.js
+   !/devtools/client/netmonitor/test/sjs_cors-test-server.sjs
+   !/image/test/mochitest/blue.png
+   !/devtools/client/shared/test/shared-head.js
++  !/devtools/client/shared/test/test-actor.js
++  !/devtools/client/shared/test/test-actor-registry.js
++
+ [browser_console.js]
+ skip-if = true # Bug 1406060
+ [browser_console_addonsdk_loader_exception.js]
+ skip-if = true # Bug 1406060
+ [browser_console_clear_method.js]
+ skip-if = true # Bug 1406060
+ [browser_console_consolejsm_output.js]
+ skip-if = true # Bug 1406060
+@@ -275,18 +278,16 @@ skip-if = true #       Bug 1405333
+ [browser_webconsole_external_script_errors.js]
+ [browser_webconsole_file_uri.js]
+ skip-if = true #       Bug 1404382
+ [browser_webconsole_filter_scroll.js]
+ skip-if = true #       Bug 1404392
+ [browser_webconsole_filters.js]
+ [browser_webconsole_filters_persist.js]
+ [browser_webconsole_highlighter_console_helper.js]
+-skip-if = true #       Bug 1404853
+-# old console skip-if = true # Requires direct access to content nodes
+ [browser_webconsole_history_arrow_keys.js]
+ [browser_webconsole_hpkp_invalid-headers.js]
+ [browser_webconsole_hsts_invalid-headers.js]
+ [browser_webconsole_iframe_wrong_hud.js]
+ skip-if = true #       Bug 1404378
+ [browser_webconsole_ineffective_iframe_sandbox_warning.js]
+ skip-if = true #       Bug 1404883
+ # old console skip-if = (os == 'win' && bits == 64) # Bug 1390001
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_highlighter_console_helper.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_highlighter_console_helper.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_highlighter_console_helper.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_highlighter_console_helper.js
+@@ -1,108 +1,79 @@
+-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+-/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+ /* Any copyright is dedicated to the Public Domain.
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+ // Tests that the $0 console helper works as intended. See Bug 653531.
+ 
+ "use strict";
+ 
+-var inspector, h1, outputNode;
++const TEST_URI = `data:text/html;charset=utf-8,
++<head>
++  <title>Inspector Tree Selection Test</title>
++</head>
++<body>
++  <div>
++    <h1>Inspector Tree Selection Test</h1>
++    <p>This is some example text</p>
++    <p>${loremIpsum()}</p>
++  </div>
++  <div>
++    <p>${loremIpsum()}</p>
++  </div>
++</body>`.replace("\n", "");
+ 
+-function createDocument() {
+-  let doc = content.document;
+-  let div = doc.createElement("div");
+-  h1 = doc.createElement("h1");
+-  let p1 = doc.createElement("p");
+-  let p2 = doc.createElement("p");
+-  let div2 = doc.createElement("div");
+-  let p3 = doc.createElement("p");
+-  doc.title = "Inspector Tree Selection Test";
+-  h1.textContent = "Inspector Tree Selection Test";
+-  p1.textContent = "This is some example text";
+-  p2.textContent = "Lorem ipsum dolor sit amet, consectetur adipisicing " +
+-    "elit, sed do eiusmod tempor incididunt ut labore et dolore magna " +
+-    "aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco " +
+-    "laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure " +
+-    "dolor in reprehenderit in voluptate velit esse cillum dolore eu " +
+-    "fugiat nulla pariatur. Excepteur sint occaecat cupidatat non " +
+-    "proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";
+-  p3.textContent = "Lorem ipsum dolor sit amet, consectetur adipisicing " +
+-    "elit, sed do eiusmod tempor incididunt ut labore et dolore magna " +
+-    "aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco " +
+-    "laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure " +
+-    "dolor in reprehenderit in voluptate velit esse cillum dolore eu " +
+-    "fugiat nulla pariatur. Excepteur sint occaecat cupidatat non " +
+-    "proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";
+-  div.appendChild(h1);
+-  div.appendChild(p1);
+-  div.appendChild(p2);
+-  div2.appendChild(p3);
+-  doc.body.appendChild(div);
+-  doc.body.appendChild(div2);
+-  setupHighlighterTests();
+-}
++add_task(async function () {
++  const toolbox = await openNewTabAndToolbox(TEST_URI, "inspector");
++  const inspector = toolbox.getPanel("inspector");
+ 
+-function setupHighlighterTests() {
+-  ok(h1, "we have the header node");
+-  openInspector().then(runSelectionTests);
+-}
+-
+-var runSelectionTests = Task.async(function* (aInspector) {
+-  inspector = aInspector;
++  await registerTestActor(toolbox.target.client);
++  let testActor = await getTestActor(toolbox);
+ 
+   let onPickerStarted = inspector.toolbox.once("picker-started");
+   inspector.toolbox.highlighterUtils.startPicker();
+-  yield onPickerStarted;
++  await onPickerStarted;
+ 
+-  info("Picker mode started, now clicking on H1 to select that node");
+-  h1.scrollIntoView();
+-  let onPickerStopped = inspector.toolbox.once("picker-stopped");
++  info("Picker mode started, now clicking on <h1> to select that node");
++  let onPickerStopped = toolbox.once("picker-stopped");
+   let onInspectorUpdated = inspector.once("inspector-updated");
+-  EventUtils.synthesizeMouseAtCenter(h1, {}, content);
+-  yield onPickerStopped;
+-  yield onInspectorUpdated;
+ 
+-  info("Picker mode stopped, H1 selected, now switching to the console");
+-  let hud = yield openConsole(gBrowser.selectedTab);
++  testActor.synthesizeMouse({
++    selector: "h1",
++    center: true,
++    options: {}
++  });
+ 
+-  performWebConsoleTests(hud);
+-});
++  await onPickerStopped;
++  await onInspectorUpdated;
+ 
+-function performWebConsoleTests(hud) {
+-  let jsterm = hud.jsterm;
+-  outputNode = hud.outputNode;
++  info("Picker mode stopped, <h1> selected, now switching to the console");
++  const hud = await openConsole();
++  const {jsterm} = hud;
+ 
+   jsterm.clearOutput();
+-  jsterm.execute("$0", onNodeOutput);
+ 
+-  function onNodeOutput(node) {
+-    isnot(node.textContent.indexOf("<h1>"), -1, "correct output for $0");
++  let onEvaluationResult = waitForMessage(hud, "<h1>");
++  jsterm.execute("$0");
++  await onEvaluationResult;
++  ok(true, "correct output for $0");
+ 
+-    jsterm.clearOutput();
+-    jsterm.execute("$0.textContent = 'bug653531'", onNodeUpdate);
+-  }
++  jsterm.clearOutput();
+ 
+-  function onNodeUpdate(node) {
+-    isnot(node.textContent.indexOf("bug653531"), -1,
+-          "correct output for $0.textContent");
+-    is(inspector.selection.node.textContent, "bug653531",
+-       "node successfully updated");
++  const newH1Content = "newH1Content";
++  let onAssignmentResult = waitForMessage(hud, "<h1>");
++  jsterm.execute(`$0.textContent = "${newH1Content}";$0`);
++  await onAssignmentResult;
+ 
+-    inspector = h1 = outputNode = null;
+-    gBrowser.removeCurrentTab();
+-    finishTest();
+-  }
+-}
+-
+-function test() {
+-  waitForExplicitFinish();
++  ok(true, "correct output for $0 after setting $0.textContent");
++  const {textContent} = await testActor.getNodeInfo("h1");
++  is(textContent, newH1Content, "node successfully updated");
++});
+ 
+-  gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser);
+-  gBrowser.selectedBrowser.addEventListener("load", function () {
+-    waitForFocus(createDocument, content);
+-  }, {capture: true, once: true});
+-
+-  BrowserTestUtils.loadURI(gBrowser.selectedBrowser,
+-    "data:text/html;charset=utf-8,test for highlighter helper in web console");
++function loremIpsum() {
++  return `Lorem ipsum dolor sit amet, consectetur adipisicing
++elit, sed do eiusmod tempor incididunt ut labore et dolore magna
++aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco
++laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure
++dolor in reprehenderit in voluptate velit esse cillum dolore eu
++fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
++proident, sunt in culpa qui officia deserunt mollit anim id est laborum.`
++  .replace("\n", "");
+ }
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/head.js b/devtools/client/webconsole/new-console-output/test/mochitest/head.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/head.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/head.js
+@@ -2,16 +2,21 @@
+ /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+ /* Any copyright is dedicated to the Public Domain.
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ /* import-globals-from ../../../../shared/test/shared-head.js */
+ /* eslint no-unused-vars: [2, {"vars": "local"}] */
+ 
+ "use strict";
+ 
++// Import helpers registering the test-actor in remote targets
++Services.scriptloader.loadSubScript(
++  "chrome://mochitests/content/browser/devtools/client/shared/test/test-actor-registry.js",
++  this);
++
+ // shared-head.js handles imports, constants, and utility functions
+ // Load the shared-head file first.
+ Services.scriptloader.loadSubScript(
+   "chrome://mochitests/content/browser/devtools/client/shared/test/shared-head.js",
+   this);
+ 
+ var {HUDService} = require("devtools/client/webconsole/hudservice");
+ var WCUL10n = require("devtools/client/webconsole/webconsole-l10n");

+ 179 - 0
mozilla-release/patches/1404877-60a1.patch

@@ -0,0 +1,179 @@
+# HG changeset patch
+# User sole <spenades@mozilla.com>
+# Date 1518791109 0
+# Node ID 06c8e6e3303cb4787fb15038d074301e84342726
+# Parent  8e950503e00f2d56de53175ea8a88fb1e38c383c
+Bug 1404877 - Migrate browser_webconsole_bug_658368_time_methods.js to the new frontend. r=nchevobbe
+
+MozReview-Commit-ID: 3Z6097zECDn
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -25,17 +25,16 @@ support-files =
+   test-console-trace-duplicates.html
+   test-bug-585956-console-trace.html
+   test-bug-599725-response-headers.sjs
+   test-bug-601177-log-levels.html
+   test-bug-601177-log-levels.js
+   test-bug-630733-response-redirect-headers.sjs
+   test-bug-632275-getters.html
+   test-bug-646025-console-file-location.html
+-  test-bug-658368-time-methods.html
+   test-bug-766001-console-log.js
+   test-bug-766001-js-console-links.html
+   test-bug-766001-js-errors.js
+   test-bug-782653-css-errors-1.css
+   test-bug-782653-css-errors-2.css
+   test-bug-782653-css-errors.html
+   test-bug-837351-security-errors.html
+   test-bug-859170-longstring-hang.html
+@@ -148,16 +147,17 @@ support-files =
+   test-sourcemap-error-01.html
+   test-sourcemap-error-01.js
+   test-sourcemap-error-02.html
+   test-sourcemap-error-02.js
+   test-stacktrace-location-debugger-link.html
+   test-subresource-security-error.html
+   test-subresource-security-error.js
+   test-subresource-security-error.js^headers^
++  test-time-methods.html
+   test-trackingprotection-securityerrors.html
+   test-webconsole-error-observer.html
+   test-websocket.html
+   test-websocket.js
+   testscript.js
+   !/devtools/client/netmonitor/test/sjs_cors-test-server.sjs
+   !/image/test/mochitest/blue.png
+   !/devtools/client/shared/test/shared-head.js
+@@ -346,16 +346,15 @@ subsuite = clipboard
+ [browser_webconsole_split_escape_key.js]
+ [browser_webconsole_split_focus.js]
+ [browser_webconsole_split_persist.js]
+ [browser_webconsole_stacktrace_location_debugger_link.js]
+ [browser_webconsole_stacktrace_location_scratchpad_link.js]
+ [browser_webconsole_strict_mode_errors.js]
+ [browser_webconsole_string.js]
+ [browser_webconsole_time_methods.js]
+-skip-if = true #       Bug 1404877
+ [browser_webconsole_timestamps.js]
+ [browser_webconsole_trackingprotection_errors.js]
+ tags = trackingprotection
+ [browser_webconsole_view_source.js]
+ [browser_webconsole_visibility_messages.js]
+ [browser_webconsole_warn_about_replaced_api.js]
+ [browser_webconsole_websocket.js]
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_time_methods.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_time_methods.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_time_methods.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_time_methods.js
+@@ -1,67 +1,68 @@
+ /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+ /* Any copyright is dedicated to the Public Domain.
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+-// Tests that the Console API implements the time() and timeEnd() methods. See Bug 658368.
++// Tests that the Console API implements the time() and timeEnd() methods.
+ 
+ "use strict";
+ 
+ const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
+-                 "test/test-bug-658368-time-methods.html";
++                 "new-console-output/test/mochitest/test-time-methods.html";
+ 
+ const TEST_URI2 = "data:text/html;charset=utf-8,<script>" +
+                   "console.timeEnd('bTimer');</script>";
+ 
+ const TEST_URI3 = "data:text/html;charset=utf-8,<script>" +
+-                  "console.time('bTimer');</script>";
++                  "console.time('bTimer');console.log('smoke signal');</script>";
+ 
+ const TEST_URI4 = "data:text/html;charset=utf-8," +
+                   "<script>console.timeEnd('bTimer');</script>";
+ 
+-add_task(function* () {
+-  yield loadTab(TEST_URI);
+-
+-  let hud1 = yield openConsole();
++add_task(async function () {
++  // Calling console.time('aTimer') followed by console.timeEnd('aTimer')
++  // should result in the aTimer being ended, and a message like aTimer: 123ms
++  // printed to the console
++  let hud1 = await openNewTabAndConsole(TEST_URI);
+ 
+-  yield waitForMessages({
+-    webconsole: hud1,
+-    messages: [{
+-      name: "aTimer started",
+-      consoleTime: "aTimer",
+-    }, {
+-      name: "aTimer end",
+-      consoleTimeEnd: "aTimer",
+-    }],
+-  });
++  let aTimerCompleted = await waitFor(() => findMessage(hud1, "aTimer: "));
++  ok(aTimerCompleted, "Calling console.time('a') and console.timeEnd('a')"
++    + "ends the 'a' timer");
++
++  // Calling console.time('bTimer') in the current tab, opening a new tab
++  // and calling console.timeEnd('bTimer') in the new tab should not result in
++  // the bTimer in the initial tab being ended, but rather a warning message
++  // output to the console: Timer "bTimer" doesn't exist
++  let hud2 = await openNewTabAndConsole(TEST_URI2);
+ 
+-  // The next test makes sure that timers with the same name but in separate
+-  // tabs, do not contain the same value.
+-  let { browser } = yield loadTab(TEST_URI2);
+-  let hud2 = yield openConsole();
++  let error1 = await waitFor(() => findMessage(hud2, "bTimer", ".message.timeEnd.warn"));
++  ok(error1, "Timers with the same name but in separate tabs do not contain "
++    + "the same value");
+ 
+-  testLogEntry(hud2.outputNode, "bTimer: timer started",
+-               "bTimer was not started", false, true);
++  // The next tests make sure that timers with the same name but in separate
++  // pages do not contain the same value.
++  await BrowserTestUtils.loadURI(gBrowser.selectedBrowser, TEST_URI3);
+ 
+-  // The next test makes sure that timers with the same name but in separate
+-  // pages, do not contain the same value.
+-  BrowserTestUtils.loadURI(gBrowser.selectedBrowser, TEST_URI3);
++  // The new console front-end does not display a message when timers are started,
++  // so there should not be a 'bTimer started' message on the output
+ 
+-  yield waitForMessages({
+-    webconsole: hud2,
+-    messages: [{
+-      name: "bTimer started",
+-      consoleTime: "bTimer",
+-    }],
+-  });
++  // We use this await to 'sync' until the message appears, as the console API
++  // guarantees us that the smoke signal will be printed after the message for
++  // console.time("bTimer") (if there were any)
++  await waitFor(() => findMessage(hud2, "smoke signal"));
++
++  is(findMessage(hud2, "bTimer started"), null, "No message is printed to "
++    + "the console when the timer starts");
+ 
+   hud2.jsterm.clearOutput();
+ 
+-  // Now the following console.timeEnd() call shouldn't display anything,
+-  // if the timers in different pages are not related.
+-  BrowserTestUtils.loadURI(gBrowser.selectedBrowser, TEST_URI4);
+-  yield loadBrowser(browser);
++  // Calling console.time('bTimer') on a page, then navigating to another page
++  // and calling console.timeEnd('bTimer') on the new console front-end should
++  // result on a warning message: 'Timer "bTimer" does not exist',
++  // as the timers in different pages are not related
++  await BrowserTestUtils.loadURI(gBrowser.selectedBrowser, TEST_URI4);
+ 
+-  testLogEntry(hud2.outputNode, "bTimer: timer started",
+-               "bTimer was not started", false, true);
++  let error2 = await waitFor(() => findMessage(hud2, "bTimer", ".message.timeEnd.warn"));
++  ok(error2, "Timers with the same name but in separate pages do not contain "
++    + "the same value");
+ });
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-658368-time-methods.html b/devtools/client/webconsole/new-console-output/test/mochitest/test-time-methods.html
+rename from devtools/client/webconsole/new-console-output/test/mochitest/test-bug-658368-time-methods.html
+rename to devtools/client/webconsole/new-console-output/test/mochitest/test-time-methods.html

+ 335 - 0
mozilla-release/patches/1404883-60a1.patch

@@ -0,0 +1,335 @@
+# HG changeset patch
+# User Nicolas Chevobbe <nchevobbe@mozilla.com>
+# Date 1516633291 -3600
+# Node ID 4536fd333b16bfa86eb1fdf94616d2d067bfc41f
+# Parent  eeefd6f6da0628d7cbde089c17aac6121fb48507
+Bug 1404883 - Enable browser_webconsole_ineffective_iframe_sandbox_warning.js in new console frontend; r=Honza.
+
+MozReview-Commit-ID: 46OaPZHvJ7Z
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -29,25 +29,16 @@ support-files =
+   test-bug-601177-log-levels.html
+   test-bug-601177-log-levels.js
+   test-bug-630733-response-redirect-headers.sjs
+   test-bug-632275-getters.html
+   test-bug-644419-log-limits.html
+   test-bug-646025-console-file-location.html
+   test-bug-658368-time-methods.html
+   test-bug-737873-mixedcontent.html
+-  test-bug-752559-ineffective-iframe-sandbox-warning-inner.html
+-  test-bug-752559-ineffective-iframe-sandbox-warning-nested1.html
+-  test-bug-752559-ineffective-iframe-sandbox-warning-nested2.html
+-  test-bug-752559-ineffective-iframe-sandbox-warning0.html
+-  test-bug-752559-ineffective-iframe-sandbox-warning1.html
+-  test-bug-752559-ineffective-iframe-sandbox-warning2.html
+-  test-bug-752559-ineffective-iframe-sandbox-warning3.html
+-  test-bug-752559-ineffective-iframe-sandbox-warning4.html
+-  test-bug-752559-ineffective-iframe-sandbox-warning5.html
+   test-bug-762593-insecure-passwords-about-blank-web-console-warning.html
+   test-bug-762593-insecure-passwords-web-console-warning.html
+   test-bug-766001-console-log.js
+   test-bug-766001-js-console-links.html
+   test-bug-766001-js-errors.js
+   test-bug-782653-css-errors-1.css
+   test-bug-782653-css-errors-2.css
+   test-bug-782653-css-errors.html
+@@ -104,16 +95,25 @@ support-files =
+   test-iframe-762593-insecure-form-action.html
+   test-iframe-762593-insecure-frame.html
+   test-iframe1.html
+   test-iframe2.html
+   test-iframe3.html
+   test-iframe-wrong-hud-iframe.html
+   test-iframe-wrong-hud.html
+   test-image.png
++  test-ineffective-iframe-sandbox-warning-inner.html
++  test-ineffective-iframe-sandbox-warning-nested1.html
++  test-ineffective-iframe-sandbox-warning-nested2.html
++  test-ineffective-iframe-sandbox-warning0.html
++  test-ineffective-iframe-sandbox-warning1.html
++  test-ineffective-iframe-sandbox-warning2.html
++  test-ineffective-iframe-sandbox-warning3.html
++  test-ineffective-iframe-sandbox-warning4.html
++  test-ineffective-iframe-sandbox-warning5.html
+   test-inspect-cross-domain-objects-frame.html
+   test-inspect-cross-domain-objects-top.html
+   test-jsterm-dollar.html
+   test-location-debugger-link-console-log.js
+   test-location-debugger-link-errors.js
+   test-location-debugger-link.html
+   test-location-styleeditor-link-1.css
+   test-location-styleeditor-link-2.css
+@@ -279,18 +279,16 @@ skip-if = true #       Bug 1404382
+ [browser_webconsole_filters.js]
+ [browser_webconsole_filters_persist.js]
+ [browser_webconsole_highlighter_console_helper.js]
+ [browser_webconsole_history_arrow_keys.js]
+ [browser_webconsole_hpkp_invalid-headers.js]
+ [browser_webconsole_hsts_invalid-headers.js]
+ [browser_webconsole_iframe_wrong_hud.js]
+ [browser_webconsole_ineffective_iframe_sandbox_warning.js]
+-skip-if = true #       Bug 1404883
+-# old console skip-if = (os == 'win' && bits == 64) # Bug 1390001
+ [browser_webconsole_init.js]
+ [browser_webconsole_input_field_focus_on_panel_select.js]
+ skip-if = true #       Bug 1405343
+ [browser_webconsole_input_focus.js]
+ [browser_webconsole_insecure_passwords_about_blank_web_console_warning.js]
+ skip-if = true #       Bug 1404884
+ [browser_webconsole_insecure_passwords_web_console_warning.js]
+ skip-if = true #       Bug 1404888
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_ineffective_iframe_sandbox_warning.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_ineffective_iframe_sandbox_warning.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_ineffective_iframe_sandbox_warning.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_ineffective_iframe_sandbox_warning.js
+@@ -5,79 +5,47 @@
+ 
+ // Tests that warnings about ineffective iframe sandboxing are logged to the
+ // web console when necessary (and not otherwise). See Bug 752559.
+ 
+ "use strict";
+ 
+ requestLongerTimeout(2);
+ 
+-const TEST_URI_WARNING = "http://example.com/browser/devtools/client/webconsole/test/test-bug-752559-ineffective-iframe-sandbox-warning0.html";
++const TEST_PATH = "http://example.com/browser/devtools/client/webconsole/" +
++                  "new-console-output/test/mochitest/";
++const TEST_URI_WARNING = `${TEST_PATH}test-ineffective-iframe-sandbox-warning0.html`;
+ const TEST_URI_NOWARNING = [
+-  "http://example.com/browser/devtools/client/webconsole/test/test-bug-752559-ineffective-iframe-sandbox-warning1.html",
+-  "http://example.com/browser/devtools/client/webconsole/test/test-bug-752559-ineffective-iframe-sandbox-warning2.html",
+-  "http://example.com/browser/devtools/client/webconsole/test/test-bug-752559-ineffective-iframe-sandbox-warning3.html",
+-  "http://example.com/browser/devtools/client/webconsole/test/test-bug-752559-ineffective-iframe-sandbox-warning4.html",
+-  "http://example.com/browser/devtools/client/webconsole/test/test-bug-752559-ineffective-iframe-sandbox-warning5.html"
++  `${TEST_PATH}test-ineffective-iframe-sandbox-warning1.html`,
++  `${TEST_PATH}test-ineffective-iframe-sandbox-warning2.html`,
++  `${TEST_PATH}test-ineffective-iframe-sandbox-warning3.html`,
++  `${TEST_PATH}test-ineffective-iframe-sandbox-warning4.html`,
++  `${TEST_PATH}test-ineffective-iframe-sandbox-warning5.html`
+ ];
+ 
+ const INEFFECTIVE_IFRAME_SANDBOXING_MSG = "An iframe which has both " +
+   "allow-scripts and allow-same-origin for its sandbox attribute can remove " +
+   "its sandboxing.";
+ const SENTINEL_MSG = "testing ineffective sandboxing message";
+ 
+-add_task(function* () {
+-  yield testYesWarning();
++add_task(async function () {
++  await testWarningMessageVisibility(TEST_URI_WARNING, true);
+ 
+-  for (let id = 0; id < TEST_URI_NOWARNING.length; id++) {
+-    yield testNoWarning(id);
++  for (const testUri of TEST_URI_NOWARNING) {
++    await testWarningMessageVisibility(testUri, false);
+   }
+ });
+ 
+-function* testYesWarning() {
+-  yield loadTab(TEST_URI_WARNING);
+-  let hud = yield openConsole();
++async function testWarningMessageVisibility(uri, visible) {
++  const hud = await openNewTabAndConsole(uri, true);
+ 
+-  ContentTask.spawn(gBrowser.selectedBrowser, SENTINEL_MSG, function* (msg) {
++  const sentinel = SENTINEL_MSG + Date.now();
++  const onSentinelMessage = waitForMessage(hud, sentinel);
++
++  ContentTask.spawn(gBrowser.selectedBrowser, sentinel, function (msg) {
+     content.console.log(msg);
+   });
+-
+-  yield waitForMessages({
+-    webconsole: hud,
+-    messages: [
+-      {
+-        name: "Ineffective iframe sandboxing warning displayed successfully",
+-        text: INEFFECTIVE_IFRAME_SANDBOXING_MSG,
+-        category: CATEGORY_SECURITY,
+-        severity: SEVERITY_WARNING
+-      },
+-      {
+-        text: SENTINEL_MSG,
+-        severity: SEVERITY_LOG
+-      }
+-    ]
+-  });
+-
+-  let msgs = hud.outputNode.querySelectorAll(".message[category=security]");
+-  is(msgs.length, 1, "one security message");
+-}
++  await onSentinelMessage;
+ 
+-function* testNoWarning(id) {
+-  yield loadTab(TEST_URI_NOWARNING[id]);
+-  let hud = yield openConsole();
+-
+-  ContentTask.spawn(gBrowser.selectedBrowser, SENTINEL_MSG, function* (msg) {
+-    content.console.log(msg);
+-  });
+-
+-  yield waitForMessages({
+-    webconsole: hud,
+-    messages: [
+-      {
+-        text: SENTINEL_MSG,
+-        severity: SEVERITY_LOG
+-      }
+-    ]
+-  });
+-
+-  let msgs = hud.outputNode.querySelectorAll(".message[category=security]");
+-  is(msgs.length, 0, "no security messages (case " + id + ")");
++  const warning = findMessage(hud, INEFFECTIVE_IFRAME_SANDBOXING_MSG, ".message.warn");
++  is(!!warning, visible,
++    `The warning message is${visible ? "": " not"} visible on ${uri}`);
+ }
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-752559-ineffective-iframe-sandbox-warning-inner.html b/devtools/client/webconsole/new-console-output/test/mochitest/test-ineffective-iframe-sandbox-warning-inner.html
+rename from devtools/client/webconsole/new-console-output/test/mochitest/test-bug-752559-ineffective-iframe-sandbox-warning-inner.html
+rename to devtools/client/webconsole/new-console-output/test/mochitest/test-ineffective-iframe-sandbox-warning-inner.html
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-752559-ineffective-iframe-sandbox-warning-nested1.html b/devtools/client/webconsole/new-console-output/test/mochitest/test-ineffective-iframe-sandbox-warning-nested1.html
+rename from devtools/client/webconsole/new-console-output/test/mochitest/test-bug-752559-ineffective-iframe-sandbox-warning-nested1.html
+rename to devtools/client/webconsole/new-console-output/test/mochitest/test-ineffective-iframe-sandbox-warning-nested1.html
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-752559-ineffective-iframe-sandbox-warning-nested1.html
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/test-ineffective-iframe-sandbox-warning-nested1.html
+@@ -4,11 +4,11 @@
+     <meta charset="utf8">
+     <title>Bug 752559 - print warning to error console when iframe sandbox
+       is being used ineffectively</title>
+       <!-- Any copyright is dedicated to the Public Domain.
+         http://creativecommons.org/publicdomain/zero/1.0/ -->
+   </head>
+   <body>
+     <iframe
+-src="http://www.example.com/browser/devtools/client/webconsole/test/test-bug-752559-ineffective-iframe-sandbox-warning-inner.html"></iframe>
++src="http://www.example.com/browser/devtools/client/webconsole/new-console-output/test/mochitest/test-ineffective-iframe-sandbox-warning-inner.html"></iframe>
+   </body>
+ </html>
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-752559-ineffective-iframe-sandbox-warning-nested2.html b/devtools/client/webconsole/new-console-output/test/mochitest/test-ineffective-iframe-sandbox-warning-nested2.html
+rename from devtools/client/webconsole/new-console-output/test/mochitest/test-bug-752559-ineffective-iframe-sandbox-warning-nested2.html
+rename to devtools/client/webconsole/new-console-output/test/mochitest/test-ineffective-iframe-sandbox-warning-nested2.html
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-752559-ineffective-iframe-sandbox-warning-nested2.html
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/test-ineffective-iframe-sandbox-warning-nested2.html
+@@ -4,11 +4,11 @@
+     <meta charset="utf8">
+     <title>Bug 752559 - print warning to error console when iframe sandbox
+       is being used ineffectively</title>
+       <!-- Any copyright is dedicated to the Public Domain.
+         http://creativecommons.org/publicdomain/zero/1.0/ -->
+   </head>
+   <body>
+     <iframe
+-src="http://www.example.com/browser/devtools/client/webconsole/test/test-bug-752559-ineffective-iframe-sandbox-warning-inner.html" sandbox="allow-scripts allow-same-origin"></iframe>
++src="http://www.example.com/browser/devtools/client/webconsole/new-console-output/test/mochitest/test-ineffective-iframe-sandbox-warning-inner.html" sandbox="allow-scripts allow-same-origin"></iframe>
+   </body>
+ </html>
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-752559-ineffective-iframe-sandbox-warning0.html b/devtools/client/webconsole/new-console-output/test/mochitest/test-ineffective-iframe-sandbox-warning0.html
+rename from devtools/client/webconsole/new-console-output/test/mochitest/test-bug-752559-ineffective-iframe-sandbox-warning0.html
+rename to devtools/client/webconsole/new-console-output/test/mochitest/test-ineffective-iframe-sandbox-warning0.html
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-752559-ineffective-iframe-sandbox-warning0.html
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/test-ineffective-iframe-sandbox-warning0.html
+@@ -3,11 +3,11 @@
+   <head>
+     <meta charset="utf8">
+     <title>Bug 752559 - print warning to error console when iframe sandbox
+       is being used ineffectively (allow-scripts, allow-same-origin)</title>
+       <!-- Any copyright is dedicated to the Public Domain.
+         http://creativecommons.org/publicdomain/zero/1.0/ -->
+   </head>
+   <body>
+-    <iframe src="test-bug-752559-ineffective-iframe-sandbox-warning-inner.html" sandbox="allow-scripts allow-same-origin"></iframe>
++    <iframe src="test-ineffective-iframe-sandbox-warning-inner.html" sandbox="allow-scripts allow-same-origin"></iframe>
+   </body>
+ </html>
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-752559-ineffective-iframe-sandbox-warning1.html b/devtools/client/webconsole/new-console-output/test/mochitest/test-ineffective-iframe-sandbox-warning1.html
+rename from devtools/client/webconsole/new-console-output/test/mochitest/test-bug-752559-ineffective-iframe-sandbox-warning1.html
+rename to devtools/client/webconsole/new-console-output/test/mochitest/test-ineffective-iframe-sandbox-warning1.html
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-752559-ineffective-iframe-sandbox-warning1.html
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/test-ineffective-iframe-sandbox-warning1.html
+@@ -3,11 +3,11 @@
+   <head>
+     <meta charset="utf8">
+     <title>Bug 752559 - print warning to error console when iframe sandbox
+       is being used ineffectively (allow-scripts, no allow-same-origin)</title>
+       <!-- Any copyright is dedicated to the Public Domain.
+         http://creativecommons.org/publicdomain/zero/1.0/ -->
+   </head>
+   <body>
+-    <iframe src="test-bug-752559-ineffective-iframe-sandbox-warning-inner.html" sandbox="allow-scripts"></iframe>
++    <iframe src="test-ineffective-iframe-sandbox-warning-inner.html" sandbox="allow-scripts"></iframe>
+   </body>
+ </html>
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-752559-ineffective-iframe-sandbox-warning2.html b/devtools/client/webconsole/new-console-output/test/mochitest/test-ineffective-iframe-sandbox-warning2.html
+rename from devtools/client/webconsole/new-console-output/test/mochitest/test-bug-752559-ineffective-iframe-sandbox-warning2.html
+rename to devtools/client/webconsole/new-console-output/test/mochitest/test-ineffective-iframe-sandbox-warning2.html
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-752559-ineffective-iframe-sandbox-warning2.html
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/test-ineffective-iframe-sandbox-warning2.html
+@@ -3,11 +3,11 @@
+   <head>
+     <meta charset="utf8">
+     <title>Bug 752559 - print warning to error console when iframe sandbox
+       is being used ineffectively (no allow-scripts, allow-same-origin)</title>
+       <!-- Any copyright is dedicated to the Public Domain.
+         http://creativecommons.org/publicdomain/zero/1.0/ -->
+   </head>
+   <body>
+-    <iframe src="test-bug-752559-ineffective-iframe-sandbox-warning-inner.html" sandbox="allow-same-origin"></iframe>
++    <iframe src="test-ineffective-iframe-sandbox-warning-inner.html" sandbox="allow-same-origin"></iframe>
+   </body>
+ </html>
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-752559-ineffective-iframe-sandbox-warning3.html b/devtools/client/webconsole/new-console-output/test/mochitest/test-ineffective-iframe-sandbox-warning3.html
+rename from devtools/client/webconsole/new-console-output/test/mochitest/test-bug-752559-ineffective-iframe-sandbox-warning3.html
+rename to devtools/client/webconsole/new-console-output/test/mochitest/test-ineffective-iframe-sandbox-warning3.html
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-752559-ineffective-iframe-sandbox-warning3.html
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/test-ineffective-iframe-sandbox-warning3.html
+@@ -4,11 +4,11 @@
+     <meta charset="utf8">
+     <title>Bug 752559 - print warning to error console when iframe sandbox
+       is being used ineffectively (allow-scripts, allow-same-origin)</title>
+       <!-- Any copyright is dedicated to the Public Domain.
+         http://creativecommons.org/publicdomain/zero/1.0/ -->
+   </head>
+   <body>
+     <iframe
+-src="http://www.example.com/browser/devtools/client/webconsole/test/test-bug-752559-ineffective-iframe-sandbox-warning-inner.html" sandbox="allow-scripts allow-same-origin"></iframe>
++src="http://www.example.com/browser/devtools/client/webconsole/new-console-output/test/mochitest/test-ineffective-iframe-sandbox-warning-inner.html" sandbox="allow-scripts allow-same-origin"></iframe>
+   </body>
+ </html>
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-752559-ineffective-iframe-sandbox-warning4.html b/devtools/client/webconsole/new-console-output/test/mochitest/test-ineffective-iframe-sandbox-warning4.html
+rename from devtools/client/webconsole/new-console-output/test/mochitest/test-bug-752559-ineffective-iframe-sandbox-warning4.html
+rename to devtools/client/webconsole/new-console-output/test/mochitest/test-ineffective-iframe-sandbox-warning4.html
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-752559-ineffective-iframe-sandbox-warning4.html
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/test-ineffective-iframe-sandbox-warning4.html
+@@ -4,11 +4,11 @@
+     <meta charset="utf8">
+     <title>Bug 752559 - print warning to error console when iframe sandbox
+       is being used ineffectively (allow-scripts, allow-same-origin, nested)</title>
+       <!-- Any copyright is dedicated to the Public Domain.
+         http://creativecommons.org/publicdomain/zero/1.0/ -->
+   </head>
+   <body>
+     <iframe
+-src="http://www.example.com/browser/devtools/client/webconsole/test/test-bug-752559-ineffective-iframe-sandbox-warning-nested1.html" sandbox="allow-scripts allow-same-origin"></iframe>
++src="http://www.example.com/browser/devtools/client/webconsole/new-console-output/test/mochitest/test-ineffective-iframe-sandbox-warning-nested1.html" sandbox="allow-scripts allow-same-origin"></iframe>
+   </body>
+ </html>
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-752559-ineffective-iframe-sandbox-warning5.html b/devtools/client/webconsole/new-console-output/test/mochitest/test-ineffective-iframe-sandbox-warning5.html
+rename from devtools/client/webconsole/new-console-output/test/mochitest/test-bug-752559-ineffective-iframe-sandbox-warning5.html
+rename to devtools/client/webconsole/new-console-output/test/mochitest/test-ineffective-iframe-sandbox-warning5.html
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-752559-ineffective-iframe-sandbox-warning5.html
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/test-ineffective-iframe-sandbox-warning5.html
+@@ -4,11 +4,11 @@
+     <meta charset="utf8">
+     <title>Bug 752559 - print warning to error console when iframe sandbox
+       is being used ineffectively (nested, allow-scripts, allow-same-origin)</title>
+       <!-- Any copyright is dedicated to the Public Domain.
+         http://creativecommons.org/publicdomain/zero/1.0/ -->
+   </head>
+   <body>
+     <iframe
+-src="http://www.example.com/browser/devtools/client/webconsole/test/test-bug-752559-ineffective-iframe-sandbox-warning-nested2.html"></iframe>
++src="http://www.example.com/browser/devtools/client/webconsole/new-console-output/test/mochitest/test-ineffective-iframe-sandbox-warning-nested2.html"></iframe>
+   </body>
+ </html>

+ 116 - 0
mozilla-release/patches/1404884-60a1.patch

@@ -0,0 +1,116 @@
+# HG changeset patch
+# User Nicolas Chevobbe <nchevobbe@mozilla.com>
+# Date 1516697456 -3600
+# Node ID 7b380c5152f9b14b3fe510d07acac1186a0b5fda
+# Parent  16719c3e2f8473182e01195cbc97916be4d52dd4
+Bug 1404884 - Enable browser_webconsole_insecure_passwords_about_blank_web_console_warning.js in new console frontend; r=jdescottes.
+
+MozReview-Commit-ID: 7fQc3hOp8hT
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -29,17 +29,16 @@ support-files =
+   test-bug-601177-log-levels.html
+   test-bug-601177-log-levels.js
+   test-bug-630733-response-redirect-headers.sjs
+   test-bug-632275-getters.html
+   test-bug-644419-log-limits.html
+   test-bug-646025-console-file-location.html
+   test-bug-658368-time-methods.html
+   test-bug-737873-mixedcontent.html
+-  test-bug-762593-insecure-passwords-about-blank-web-console-warning.html
+   test-bug-762593-insecure-passwords-web-console-warning.html
+   test-bug-766001-console-log.js
+   test-bug-766001-js-console-links.html
+   test-bug-766001-js-errors.js
+   test-bug-782653-css-errors-1.css
+   test-bug-782653-css-errors-2.css
+   test-bug-782653-css-errors.html
+   test-bug-837351-security-errors.html
+@@ -104,16 +103,17 @@ support-files =
+   test-ineffective-iframe-sandbox-warning-nested1.html
+   test-ineffective-iframe-sandbox-warning-nested2.html
+   test-ineffective-iframe-sandbox-warning0.html
+   test-ineffective-iframe-sandbox-warning1.html
+   test-ineffective-iframe-sandbox-warning2.html
+   test-ineffective-iframe-sandbox-warning3.html
+   test-ineffective-iframe-sandbox-warning4.html
+   test-ineffective-iframe-sandbox-warning5.html
++  test-insecure-passwords-about-blank-web-console-warning.html
+   test-inspect-cross-domain-objects-frame.html
+   test-inspect-cross-domain-objects-top.html
+   test-jsterm-dollar.html
+   test-location-debugger-link-console-log.js
+   test-location-debugger-link-errors.js
+   test-location-debugger-link.html
+   test-location-styleeditor-link-1.css
+   test-location-styleeditor-link-2.css
+@@ -284,17 +284,16 @@ skip-if = true #       Bug 1404382
+ [browser_webconsole_hsts_invalid-headers.js]
+ [browser_webconsole_iframe_wrong_hud.js]
+ [browser_webconsole_ineffective_iframe_sandbox_warning.js]
+ [browser_webconsole_init.js]
+ [browser_webconsole_input_field_focus_on_panel_select.js]
+ skip-if = true #       Bug 1405343
+ [browser_webconsole_input_focus.js]
+ [browser_webconsole_insecure_passwords_about_blank_web_console_warning.js]
+-skip-if = true #       Bug 1404884
+ [browser_webconsole_insecure_passwords_web_console_warning.js]
+ skip-if = true #       Bug 1404888
+ # old console skip-if = true # Bug 1110500 - mouse event failure in test
+ [browser_webconsole_inspect_cross_domain_object.js]
+ [browser_webconsole_js_input_expansion.js]
+ [browser_webconsole_jsterm.js]
+ skip-if = true #       Bug 1405352
+ # old console skip-if = e10s # Bug 1042253 - webconsole e10s tests (Linux debug timeout)
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_insecure_passwords_about_blank_web_console_warning.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_insecure_passwords_about_blank_web_console_warning.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_insecure_passwords_about_blank_web_console_warning.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_insecure_passwords_about_blank_web_console_warning.js
+@@ -1,32 +1,21 @@
+ /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+ /* Any copyright is dedicated to the Public Domain.
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+-// Tests that errors about insecure passwords are logged to the web console. See Bug 762593.
++// Tests that errors about insecure passwords are logged to the web console.
++// See Bug 762593.
+ 
+ "use strict";
+ 
+-const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
+-                 "test/test-bug-762593-insecure-passwords-about-blank-web-console-warning.html";
+-const INSECURE_PASSWORD_MSG = "Password fields present on an insecure " +
+-  "(http://) iframe. This is a security risk that allows user login " +
+-  "credentials to be stolen.";
+-
+-add_task(function* () {
+-  yield loadTab(TEST_URI);
+-
+-  let hud = yield openConsole();
++const TEST_URI =
++  "http://example.com/browser/devtools/client/webconsole/new-console-output/test/" +
++  "mochitest/test-insecure-passwords-about-blank-web-console-warning.html";
++const INSECURE_PASSWORD_MSG = "Password fields present on an insecure (http://) iframe." +
++  " This is a security risk that allows user login credentials to be stolen.";
+ 
+-  yield waitForMessages({
+-    webconsole: hud,
+-    messages: [
+-      {
+-        name: "Insecure password error displayed successfully",
+-        text: INSECURE_PASSWORD_MSG,
+-        category: CATEGORY_SECURITY,
+-        severity: SEVERITY_WARNING
+-      },
+-    ],
+-  });
++add_task(async function () {
++  const hud = await openNewTabAndConsole(TEST_URI);
++  await waitFor(()=> findMessage(hud, INSECURE_PASSWORD_MSG, ".message.warn"), "", 100);
++  ok(true, "Insecure password error displayed successfully");
+ });
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-762593-insecure-passwords-about-blank-web-console-warning.html b/devtools/client/webconsole/new-console-output/test/mochitest/test-insecure-passwords-about-blank-web-console-warning.html
+rename from devtools/client/webconsole/new-console-output/test/mochitest/test-bug-762593-insecure-passwords-about-blank-web-console-warning.html
+rename to devtools/client/webconsole/new-console-output/test/mochitest/test-insecure-passwords-about-blank-web-console-warning.html

+ 142 - 0
mozilla-release/patches/1404886-60a1.patch

@@ -0,0 +1,142 @@
+# HG changeset patch
+# User Julian Descottes <jdescottes@mozilla.com>
+# Date 1518112528 -3600
+# Node ID 63f96ae8a3ff968cca3c4b7bb527facd25d8a4bd
+# Parent  9d5a5a429faed2d1c01285817e01d33244f58a86
+Bug 1404886 - remove browser_webconsole_mixedcontent;r=nchevobbe
+
+All the content from this test is already covered in
+- browser_webconsole_allow_mixedcontent_securityerrors.js
+- browser_webconsole_filters.js
+
+MozReview-Commit-ID: LUVDI6DmJiB
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -28,17 +28,16 @@ support-files =
+   test-bug-599725-response-headers.sjs
+   test-bug-601177-log-levels.html
+   test-bug-601177-log-levels.js
+   test-bug-630733-response-redirect-headers.sjs
+   test-bug-632275-getters.html
+   test-bug-644419-log-limits.html
+   test-bug-646025-console-file-location.html
+   test-bug-658368-time-methods.html
+-  test-bug-737873-mixedcontent.html
+   test-bug-766001-console-log.js
+   test-bug-766001-js-console-links.html
+   test-bug-766001-js-errors.js
+   test-bug-782653-css-errors-1.css
+   test-bug-782653-css-errors-2.css
+   test-bug-782653-css-errors.html
+   test-bug-837351-security-errors.html
+   test-bug-859170-longstring-hang.html
+@@ -301,19 +300,16 @@ skip-if = true #       Bug 1405352
+ [browser_webconsole_location_scratchpad_link.js]
+ [browser_webconsole_location_styleeditor_link.js]
+ [browser_webconsole_logErrorInPage.js]
+ [browser_webconsole_longstring_expand.js]
+ skip-if = true #       Bug 1403448
+ [browser_webconsole_longstring_hang.js]
+ skip-if = true #       Bug 1403448
+ [browser_webconsole_message_categories.js]
+-[browser_webconsole_mixedcontent.js]
+-tags = mcb
+-skip-if = true #       Bug 1404886
+ [browser_webconsole_multiple_windows_and_tabs.js]
+ [browser_webconsole_network_attach.js]
+ [browser_webconsole_network_exceptions.js]
+ [browser_webconsole_network_messages_expand.js]
+ [browser_webconsole_network_messages_openinnet.js]
+ [browser_webconsole_network_messages_status_code.js]
+ [browser_webconsole_network_requests_from_chrome.js]
+ [browser_webconsole_network_reset_filter.js]
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_mixedcontent.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_mixedcontent.js
+deleted file mode 100644
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_mixedcontent.js
++++ /dev/null
+@@ -1,63 +0,0 @@
+-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+-/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+-/* Any copyright is dedicated to the Public Domain.
+- * http://creativecommons.org/publicdomain/zero/1.0/ */
+-
+-// Tests that the Web Console Mixed Content messages are displayed. See Bug 737873.
+-
+-"use strict";
+-
+-const TEST_URI = "data:text/html;charset=utf8,Web Console mixed content test";
+-const TEST_HTTPS_URI = "https://example.com/browser/devtools/client/" +
+-                       "webconsole/test/test-bug-737873-mixedcontent.html";
+-const LEARN_MORE_URI = "https://developer.mozilla.org/docs/Web/Security/" +
+-                       "Mixed_content";
+-
+-registerCleanupFunction(function*() {
+-  Services.prefs.clearUserPref("security.mixed_content.block_display_content");
+-  Services.prefs.clearUserPref("security.mixed_content.block_active_content");
+-});
+-
+-add_task(function* () {
+-  Services.prefs.setBoolPref("security.mixed_content.block_display_content",
+-                             false);
+-  Services.prefs.setBoolPref("security.mixed_content.block_active_content",
+-                             false);
+-
+-  yield loadTab(TEST_URI);
+-
+-  let hud = yield openConsole();
+-
+-  yield testMixedContent(hud);
+-});
+-
+-var testMixedContent = Task.async(function* (hud) {
+-  BrowserTestUtils.loadURI(gBrowser.selectedBrowser, TEST_HTTPS_URI);
+-
+-  let results = yield waitForMessages({
+-    webconsole: hud,
+-    messages: [{
+-      text: "example.com",
+-      category: CATEGORY_NETWORK,
+-      severity: SEVERITY_WARNING,
+-    }],
+-  });
+-
+-  let msg = [...results[0].matched][0];
+-  ok(msg, "page load logged");
+-  ok(msg.classList.contains("mixed-content"), ".mixed-content element");
+-
+-  let link = msg.querySelector(".learn-more-link");
+-  ok(link, "mixed content link element");
+-  is(link.textContent, "[Mixed Content]", "link text is accurate");
+-
+-  yield simulateMessageLinkClick(link, LEARN_MORE_URI);
+-
+-  ok(!msg.classList.contains("filtered-by-type"), "message is not filtered");
+-
+-  hud.setFilterState("netwarn", false);
+-
+-  ok(msg.classList.contains("filtered-by-type"), "message is filtered");
+-
+-  hud.setFilterState("netwarn", true);
+-});
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-737873-mixedcontent.html b/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-737873-mixedcontent.html
+deleted file mode 100644
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-737873-mixedcontent.html
++++ /dev/null
+@@ -1,15 +0,0 @@
+-<!DOCTYPE HTML>
+-<html dir="ltr" xml:lang="en-US" lang="en-US"><head>
+-    <meta charset="utf8">
+-    <title>Mixed Content test - http on https</title>
+-    <script src="testscript.js"></script>
+-    <!--
+-       - Any copyright is dedicated to the Public Domain.
+-       - http://creativecommons.org/publicdomain/zero/1.0/
+-       -->
+-  </head>
+-  <body>
+-    <iframe src = "http://example.com"></iframe>
+-  </body>
+-</html>
+-

+ 231 - 0
mozilla-release/patches/1404888-60a1.patch

@@ -0,0 +1,231 @@
+# HG changeset patch
+# User Nicolas Chevobbe <nchevobbe@mozilla.com>
+# Date 1516703949 -3600
+# Node ID 3e4b0027e470dab9c4f64ecdbcc998d6dca03d89
+# Parent  b060730f1786aae48a9a39b4d0e4ce125f726424
+Bug 1404888 - Enable browser_webconsole_insecure_passwords_web_console_warning.js in new console frontend; r=jdescottes.
+
+The test needed to be rewritten as we can't have the 3 warning messages
+at the same time (see https://hg.mozilla.org/mozilla-central/rev/084f217c4d49#l1.76
+and https://hg.mozilla.org/mozilla-central/diff/817eb00ba702/toolkit/components/passwordmgr/InsecurePasswordUtils.jsm#l1.106).
+This wasn't picked up by the old frontend test because it is disabled.
+In order to test the different warning messages we open 3 different pages
+which log the appropriate warning.
+
+MozReview-Commit-ID: Gqa8GrMh8iR
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -29,17 +29,16 @@ support-files =
+   test-bug-601177-log-levels.html
+   test-bug-601177-log-levels.js
+   test-bug-630733-response-redirect-headers.sjs
+   test-bug-632275-getters.html
+   test-bug-644419-log-limits.html
+   test-bug-646025-console-file-location.html
+   test-bug-658368-time-methods.html
+   test-bug-737873-mixedcontent.html
+-  test-bug-762593-insecure-passwords-web-console-warning.html
+   test-bug-766001-console-log.js
+   test-bug-766001-js-console-links.html
+   test-bug-766001-js-errors.js
+   test-bug-782653-css-errors-1.css
+   test-bug-782653-css-errors-2.css
+   test-bug-782653-css-errors.html
+   test-bug-837351-security-errors.html
+   test-bug-859170-longstring-hang.html
+@@ -86,34 +85,35 @@ support-files =
+   test-error.html
+   test-eval-in-stackframe.html
+   test-exception-stackframe.html
+   test-external-script-errors.html
+   test-external-script-errors.js
+   test-file-location.js
+   test-filter.html
+   test-for-of.html
+-  test-iframe-762593-insecure-form-action.html
+-  test-iframe-762593-insecure-frame.html
++  test-iframe-insecure-form-action.html
+   test-iframe1.html
+   test-iframe2.html
+   test-iframe3.html
+   test-iframe-wrong-hud-iframe.html
+   test-iframe-wrong-hud.html
+   test-image.png
+   test-ineffective-iframe-sandbox-warning-inner.html
+   test-ineffective-iframe-sandbox-warning-nested1.html
+   test-ineffective-iframe-sandbox-warning-nested2.html
+   test-ineffective-iframe-sandbox-warning0.html
+   test-ineffective-iframe-sandbox-warning1.html
+   test-ineffective-iframe-sandbox-warning2.html
+   test-ineffective-iframe-sandbox-warning3.html
+   test-ineffective-iframe-sandbox-warning4.html
+   test-ineffective-iframe-sandbox-warning5.html
++  test-insecure-frame.html
+   test-insecure-passwords-about-blank-web-console-warning.html
++  test-insecure-passwords-web-console-warning.html
+   test-inspect-cross-domain-objects-frame.html
+   test-inspect-cross-domain-objects-top.html
+   test-jsterm-dollar.html
+   test-location-debugger-link-console-log.js
+   test-location-debugger-link-errors.js
+   test-location-debugger-link.html
+   test-location-styleeditor-link-1.css
+   test-location-styleeditor-link-2.css
+@@ -285,18 +285,16 @@ skip-if = true #       Bug 1404382
+ [browser_webconsole_iframe_wrong_hud.js]
+ [browser_webconsole_ineffective_iframe_sandbox_warning.js]
+ [browser_webconsole_init.js]
+ [browser_webconsole_input_field_focus_on_panel_select.js]
+ skip-if = true #       Bug 1405343
+ [browser_webconsole_input_focus.js]
+ [browser_webconsole_insecure_passwords_about_blank_web_console_warning.js]
+ [browser_webconsole_insecure_passwords_web_console_warning.js]
+-skip-if = true #       Bug 1404888
+-# old console skip-if = true # Bug 1110500 - mouse event failure in test
+ [browser_webconsole_inspect_cross_domain_object.js]
+ [browser_webconsole_js_input_expansion.js]
+ [browser_webconsole_jsterm.js]
+ skip-if = true #       Bug 1405352
+ # old console skip-if = e10s # Bug 1042253 - webconsole e10s tests (Linux debug timeout)
+ [browser_webconsole_jsterm_copy.js]
+ subsuite = clipboard
+ skip-if = true #       Bug 1404831
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_insecure_passwords_web_console_warning.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_insecure_passwords_web_console_warning.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_insecure_passwords_web_console_warning.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_insecure_passwords_web_console_warning.js
+@@ -3,61 +3,44 @@
+ /* Any copyright is dedicated to the Public Domain.
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+  // Tests that errors about insecure passwords are logged to the web console.
+  // See Bug 762593.
+ 
+ "use strict";
+ 
+-const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
+-                 "test/test-bug-762593-insecure-passwords-web-" +
+-                 "console-warning.html";
+-const INSECURE_PASSWORD_MSG = "Password fields present on an insecure " +
+-                 "(http://) page. This is a security risk that allows user " +
+-                 "login credentials to be stolen.";
+-const INSECURE_FORM_ACTION_MSG = "Password fields present in a form with an " +
+-                 "insecure (http://) form action. This is a security risk " +
+-                 "that allows user login credentials to be stolen.";
+-const INSECURE_IFRAME_MSG = "Password fields present on an insecure " +
+-                 "(http://) iframe. This is a security risk that allows " +
+-                 "user login credentials to be stolen.";
+-const INSECURE_PASSWORDS_URI = "https://developer.mozilla.org/docs/Web/" +
+-                               "Security/Insecure_passwords" + DOCS_GA_PARAMS;
+-
+-add_task(function* () {
+-  yield loadTab(TEST_URI);
+-
+-  let hud = yield openConsole();
++const INSECURE_IFRAME_URI = "http://example.com/browser/devtools/client/webconsole/" +
++  "new-console-output/test/mochitest/test-insecure-passwords-web-console-warning.html";
++const INSECURE_PASSWORD_URI = "http://example.com/browser/devtools/client/webconsole/" +
++  "new-console-output/test/mochitest/test-iframe-insecure-form-action.html";
++const INSECURE_FORM_ACTION_URI = "https://example.com/browser/devtools/client/" +
++  "webconsole/new-console-output/test/mochitest/test-iframe-insecure-form-action.html";
+ 
+-  let result = yield waitForMessages({
+-    webconsole: hud,
+-    messages: [
+-      {
+-        name: "Insecure password error displayed successfully",
+-        text: INSECURE_PASSWORD_MSG,
+-        category: CATEGORY_SECURITY,
+-        severity: SEVERITY_WARNING
+-      },
+-      {
+-        name: "Insecure iframe error displayed successfully",
+-        text: INSECURE_IFRAME_MSG,
+-        category: CATEGORY_SECURITY,
+-        severity: SEVERITY_WARNING
+-      },
+-      {
+-        name: "Insecure form action error displayed successfully",
+-        text: INSECURE_FORM_ACTION_MSG,
+-        category: CATEGORY_SECURITY,
+-        severity: SEVERITY_WARNING
+-      },
+-    ],
+-  });
++const STOLEN = "This is a security risk that allows user login credentials to be stolen.";
++const INSECURE_PASSWORD_MSG =
++  "Password fields present on an insecure (http://) page. " + STOLEN;
++const INSECURE_FORM_ACTION_MSG =
++  "Password fields present in a form with an insecure (http://) form action. " + STOLEN;
++const INSECURE_IFRAME_MSG =
++  "Password fields present on an insecure (http://) iframe. " + STOLEN;
++const INSECURE_PASSWORDS_URI =
++  "https://developer.mozilla.org/docs/Web/Security/Insecure_passwords" + DOCS_GA_PARAMS;
+ 
+-  yield testClickOpenNewTab(hud, result);
++add_task(async function () {
++  await testUriWarningMessage(INSECURE_IFRAME_URI, INSECURE_IFRAME_MSG);
++  await testUriWarningMessage(INSECURE_PASSWORD_URI, INSECURE_PASSWORD_MSG);
++  await testUriWarningMessage(INSECURE_FORM_ACTION_URI, INSECURE_FORM_ACTION_MSG);
+ });
+ 
+-function testClickOpenNewTab(hud, [result]) {
+-  let msg = [...result.matched][0];
+-  let warningNode = msg.querySelector(".learn-more-link");
+-  ok(warningNode, "learn more link");
+-  return simulateMessageLinkClick(warningNode, INSECURE_PASSWORDS_URI);
++async function testUriWarningMessage(uri, warningMessage) {
++  let hud = await openNewTabAndConsole(uri);
++  let message = await waitFor(()=> findMessage(hud, warningMessage, ".message.warn"));
++  ok(message, "Warning message displayed successfully");
++  await testLearnMoreLinkClick(message, INSECURE_PASSWORDS_URI);
+ }
++
++async function testLearnMoreLinkClick(message, expectedUri) {
++  let learnMoreLink = message.querySelector(".learn-more-link");
++  ok(learnMoreLink, "There is a [Learn More] link");
++  const {link} = await simulateLinkClick(learnMoreLink);
++  is(link, expectedUri, "Click on [Learn More] link navigates user to " + expectedUri);
++}
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/test-iframe-762593-insecure-form-action.html b/devtools/client/webconsole/new-console-output/test/mochitest/test-iframe-insecure-form-action.html
+rename from devtools/client/webconsole/new-console-output/test/mochitest/test-iframe-762593-insecure-form-action.html
+rename to devtools/client/webconsole/new-console-output/test/mochitest/test-iframe-insecure-form-action.html
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/test-iframe-762593-insecure-frame.html b/devtools/client/webconsole/new-console-output/test/mochitest/test-insecure-frame.html
+rename from devtools/client/webconsole/new-console-output/test/mochitest/test-iframe-762593-insecure-frame.html
+rename to devtools/client/webconsole/new-console-output/test/mochitest/test-insecure-frame.html
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/test-iframe-762593-insecure-frame.html
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/test-insecure-frame.html
+@@ -4,12 +4,12 @@
+     <meta http-equiv="Content-type" content="text/html;charset=UTF-8">
+     <!-- Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/ -->
+   </head>
+   <body>
+     <h1>iframe 1</h1>
+     <p>This frame is served with an insecure password field.</p>
+     <iframe src=
+-      "http://example.com/browser/devtools/client/webconsole/test/test-iframe-762593-insecure-form-action.html">
++      "http://example.com/browser/devtools/client/webconsole/new-console-output/test/mochitest/test-iframe-insecure-form-action.html">
+     </iframe>
+   </body>
+ </html>
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-762593-insecure-passwords-web-console-warning.html b/devtools/client/webconsole/new-console-output/test/mochitest/test-insecure-passwords-web-console-warning.html
+rename from devtools/client/webconsole/new-console-output/test/mochitest/test-bug-762593-insecure-passwords-web-console-warning.html
+rename to devtools/client/webconsole/new-console-output/test/mochitest/test-insecure-passwords-web-console-warning.html
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-762593-insecure-passwords-web-console-warning.html
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/test-insecure-passwords-web-console-warning.html
+@@ -5,12 +5,12 @@
+     <title>Bug 762593 - Add warning/error Message to Web Console when the
+       page includes Insecure Password fields</title>
+     <!-- Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/ -->
+   </head>
+   <body>
+     <p>This page is served with an iframe with insecure password field.</p>
+     <iframe src
+-      ="http://example.com/browser/devtools/client/webconsole/test/test-iframe-762593-insecure-frame.html">
++      ="http://example.com/browser/devtools/client/webconsole/new-console-output/test/mochitest/test-insecure-frame.html">
+     </iframe>
+   </body>
+ </html>

+ 41 - 0
mozilla-release/patches/1405245-1-60a1.patch

@@ -0,0 +1,41 @@
+# HG changeset patch
+# User Julian Descottes <jdescottes@mozilla.com>
+# Date 1517827743 -3600
+# Node ID 37f69ad9559fa036df5496d49f09b9527f090eb1
+# Parent  9000a8ab759641592fa3d8625fe3f7540d56ca6e
+Bug 1405245 - webconsole PageError component read repeat from props;r=nchevobbe
+
+MozReview-Commit-ID: C3Vs4Uv6gGv
+
+diff --git a/devtools/client/webconsole/new-console-output/components/message-types/PageError.js b/devtools/client/webconsole/new-console-output/components/message-types/PageError.js
+--- a/devtools/client/webconsole/new-console-output/components/message-types/PageError.js
++++ b/devtools/client/webconsole/new-console-output/components/message-types/PageError.js
+@@ -24,27 +24,27 @@ PageError.defaultProps = {
+   open: false,
+ };
+ 
+ function PageError(props) {
+   const {
+     dispatch,
+     message,
+     open,
++    repeat,
+     serviceContainer,
+     timestampsVisible,
+   } = props;
+   const {
+     id: messageId,
+     indent,
+     source,
+     type,
+     level,
+     messageText,
+-    repeat,
+     stacktrace,
+     frame,
+     exceptionDocURL,
+     timeStamp,
+     notes,
+   } = message;
+ 
+   let messageBody;

+ 199 - 0
mozilla-release/patches/1405245-2-60a1.patch

@@ -0,0 +1,199 @@
+# HG changeset patch
+# User Julian Descottes <jdescottes@mozilla.com>
+# Date 1517827777 -3600
+# Node ID f349f28b9689446dfe45b63fd6bbeaa428bdaf44
+# Parent  2a6158a489fde8f3827fd2d30bc5bc6e4c44daae
+Bug 1405245 - enable test-csp-violation.html for new webconsole;r=nchevobbe
+
+MozReview-Commit-ID: IgONHkE3Pjk
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -6,17 +6,16 @@ support-files =
+   code_bundle_invalidmap.js.map
+   code_bundle_nosource.js
+   code_bundle_nosource.js.map
+   head.js
+   sjs_slow-response-test-server.sjs
+   source-mapped.css
+   source-mapped.css.map
+   source-mapped.scss
+-  test_bug_1247459_violation.html
+   test_bug_770099_violation.html
+   test_bug_770099_violation.html^headers^
+   test_console_csp_ignore_reflected_xss_message.html
+   test_console_csp_ignore_reflected_xss_message.html^headers^
+   test_hpkp-invalid-headers.sjs
+   test_hsts-invalid-headers.sjs
+   test-autocomplete-in-stackframe.html
+   test-batching.html
+@@ -39,16 +38,17 @@ support-files =
+   test-bug-782653-css-errors-2.css
+   test-bug-782653-css-errors.html
+   test-bug-837351-security-errors.html
+   test-bug-859170-longstring-hang.html
+   test-bug-952277-highlight-nodes-in-vview.html
+   test-cd-iframe-child.html
+   test-cd-iframe-parent.html
+   test-console-api-iframe.html
++  test-csp-violation.html
+   test-cspro.html
+   test-cspro.html^headers^
+   test-iframe-child.html
+   test-iframe-parent.html
+   test-certificate-messages.html
+   test-click-function-to-source.html
+   test-click-function-to-source.js
+   test-closure-optimized-out.html
+@@ -260,16 +260,17 @@ subsuite = clipboard
+ skip-if = (os == 'linux' && bits == 32 && debug) # bug 1328915, disable linux32 debug devtools for timeouts
+ [browser_webconsole_context_menu_copy_object.js]
+ subsuite = clipboard
+ [browser_webconsole_context_menu_object_in_sidebar.js]
+ [browser_webconsole_context_menu_open_url.js]
+ [browser_webconsole_context_menu_store_as_global.js]
+ [browser_webconsole_csp_ignore_reflected_xss_message.js]
+ skip-if = (e10s && debug) || (e10s && os == 'win') # Bug 1221499 enabled these on windows
++[browser_webconsole_csp_violation.js]
+ [browser_webconsole_cspro.js]
+ [browser_webconsole_document_focus.js]
+ [browser_webconsole_duplicate_errors.js]
+ [browser_webconsole_errors_after_page_reload.js]
+ [browser_webconsole_eval_in_debugger_stackframe.js]
+ [browser_webconsole_eval_in_debugger_stackframe2.js]
+ [browser_webconsole_execution_scope.js]
+ [browser_webconsole_external_script_errors.js]
+@@ -353,14 +354,11 @@ skip-if = true #       Bug 1405649
+ [browser_webconsole_strict_mode_errors.js]
+ [browser_webconsole_string.js]
+ [browser_webconsole_time_methods.js]
+ skip-if = true #       Bug 1404877
+ [browser_webconsole_timestamps.js]
+ [browser_webconsole_trackingprotection_errors.js]
+ tags = trackingprotection
+ [browser_webconsole_view_source.js]
+-[browser_webconsole_violation.js]
+-skip-if = true #       Bug 1405245
+-# old console skip-if = e10s && (os == 'win') # Bug 1264955
+ [browser_webconsole_visibility_messages.js]
+ [browser_webconsole_warn_about_replaced_api.js]
+ [browser_webconsole_websocket.js]
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_violation.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_csp_violation.js
+rename from devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_violation.js
+rename to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_csp_violation.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_violation.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_csp_violation.js
+@@ -4,37 +4,24 @@
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+ // Tests that the Web Console CSP messages for two META policies
+ // are correctly displayed. See Bug 1247459.
+ 
+ "use strict";
+ 
+ const TEST_URI = "data:text/html;charset=utf8,Web Console CSP violation test";
+-const TEST_VIOLATION = "https://example.com/browser/devtools/client/" +
+-                       "webconsole/test/test_bug_1247459_violation.html";
++const TEST_VIOLATION = "https://example.com/browser/devtools/client/webconsole/" +
++                       "new-console-output/test/mochitest/test-csp-violation.html";
+ const CSP_VIOLATION_MSG = "Content Security Policy: The page\u2019s settings " +
+                           "blocked the loading of a resource at " +
+-                          "http://some.example.com/test.png (\u201cimg-src " +
+-                          "https://example.com\u201d).";
++                          "http://some.example.com/test.png (\u201cimg-src\u201d).";
+ 
+-add_task(function* () {
+-  let { browser } = yield loadTab(TEST_URI);
+-
+-  let hud = yield openConsole();
+-
++add_task(async function () {
++  let hud = await openNewTabAndConsole(TEST_URI);
+   hud.jsterm.clearOutput();
+ 
+-  let loaded = loadBrowser(browser);
+-  BrowserTestUtils.loadURI(browser, TEST_VIOLATION);
+-  yield loaded;
++  let onRepeatedMessage = waitForRepeatedMessage(hud, CSP_VIOLATION_MSG, 2);
++  await loadDocument(TEST_VIOLATION);
++  await onRepeatedMessage;
+ 
+-  yield waitForMessages({
+-    webconsole: hud,
+-    messages: [
+-      {
+-        name: "CSP policy URI warning displayed successfully",
+-        text: CSP_VIOLATION_MSG,
+-        repeats: 2
+-      }
+-    ]
+-  });
++  ok(true, "Received expected messages");
+ });
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/head.js b/devtools/client/webconsole/new-console-output/test/mochitest/head.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/head.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/head.js
+@@ -134,16 +134,41 @@ function waitForMessages({ hud, messages
+             return;
+           }
+         }
+       });
+   });
+ }
+ 
+ /**
++ * Wait for a message with the provided text and showing the provided repeat count.
++ *
++ * @param {Object} hud : the webconsole
++ * @param {String} text : text included in .message-body
++ * @param {Number} repeat : expected repeat count in .message-repeats
++ */
++function waitForRepeatedMessage(hud, text, repeat) {
++  return waitFor(() => {
++    // Wait for a message matching the provided text.
++    let node = findMessage(hud, text);
++    if (!node) {
++      return false;
++    }
++
++    // Check if there is a repeat node with the expected count.
++    let repeatNode = node.querySelector(".message-repeats");
++    if (repeatNode && parseInt(repeatNode.textContent, 10) === repeat) {
++      return node;
++    }
++
++    return false;
++  });
++}
++
++/**
+  * Wait for a single message in the web console output, resolving once it is received.
+  *
+  * @param {Object} hud : the webconsole
+  * @param {String} text : text included in .message-body
+  */
+ async function waitForMessage(hud, text) {
+   const messages = await waitForMessages({hud, messages: [{text}]});
+   return messages[0];
+@@ -172,16 +197,17 @@ async function waitFor(condition, messag
+  * Find a message in the output.
+  *
+  * @param object hud
+  *        The web console.
+  * @param string text
+  *        A substring that can be found in the message.
+  * @param selector [optional]
+  *        The selector to use in finding the message.
++ * @return {Node} the node corresponding the found message
+  */
+ function findMessage(hud, text, selector = ".message") {
+   const elements = findMessages(hud, text, selector);
+   return elements.pop();
+ }
+ 
+ /**
+  * Find multiple messages in the output.
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/test_bug_1247459_violation.html b/devtools/client/webconsole/new-console-output/test/mochitest/test-csp-violation.html
+rename from devtools/client/webconsole/new-console-output/test/mochitest/test_bug_1247459_violation.html
+rename to devtools/client/webconsole/new-console-output/test/mochitest/test-csp-violation.html

+ 101 - 0
mozilla-release/patches/1405252-59a1.patch

@@ -0,0 +1,101 @@
+# HG changeset patch
+# User Nicolas Chevobbe <nchevobbe@mozilla.com>
+# Date 1511252611 -3600
+# Node ID cac561542218fe92e17c611b7236afb6a362d6d1
+# Parent  0393076e6f7db42246da850f09829eb07df2cf6b
+Bug 1405252 - Enable browser_webconsole_console_logging_workers_api.js in the new frontend; r=Honza.
+
+MozReview-Commit-ID: I7b45uLfNkw
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -243,17 +243,16 @@ tags = mcb
+ [browser_webconsole_close_sidebar.js]
+ [browser_webconsole_closure_inspection.js]
+ skip-if = true # Bug 1405250
+ [browser_webconsole_console_api_iframe.js]
+ [browser_webconsole_console_dir.js]
+ [browser_webconsole_console_dir_uninspectable.js]
+ [browser_webconsole_console_group.js]
+ [browser_webconsole_console_logging_workers_api.js]
+-skip-if = true # Bug 1405252
+ [browser_webconsole_console_table.js]
+ [browser_webconsole_context_menu_copy_entire_message.js]
+ subsuite = clipboard
+ skip-if = (os == 'linux' && bits == 32 && debug) # bug 1328915, disable linux32 debug devtools for timeouts
+ [browser_webconsole_context_menu_copy_link_location.js]
+ subsuite = clipboard
+ skip-if = (os == 'linux' && bits == 32 && debug) # bug 1328915, disable linux32 debug devtools for timeouts
+ [browser_webconsole_context_menu_copy_object.js]
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_console_logging_workers_api.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_console_logging_workers_api.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_console_logging_workers_api.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_console_logging_workers_api.js
+@@ -4,36 +4,23 @@
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+ // Tests that the basic console.log()-style APIs and filtering work for
+ // sharedWorkers
+ 
+ "use strict";
+ 
+ const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
+-                 "test/test-console-workers.html";
+-
+-add_task(function* () {
+-  yield loadTab(TEST_URI);
+-
+-  let hud = yield openConsole();
+-
+-  yield waitForMessages({
+-    webconsole: hud,
+-    messages: [{
+-      text: "foo-bar-shared-worker"
+-    }],
+-  });
++                 "new-console-output/test/mochitest/test-console-workers.html";
+ 
+-  hud.setFilterState("sharedworkers", false);
+-
+-  is(hud.outputNode.querySelectorAll(".filtered-by-type").length, 1,
+-     "1 message hidden for sharedworkers (logging turned off)");
+-
+-  hud.setFilterState("sharedworkers", true);
++add_task(async function () {
++  const hud = await openNewTabAndConsole(TEST_URI);
++  const message = await waitFor(() => findMessage(hud, "foo-bar-shared-worker"));
++  is(
++    message.querySelector(".message-body").textContent,
++    `foo-bar-shared-worker Object { foo: "bar" }`,
++    "log from SharedWorker is displayed as expected"
++  );
+ 
+-  is(hud.outputNode.querySelectorAll(".filtered-by-type").length, 0,
+-     "1 message shown for sharedworkers (logging turned on)");
+-
+-  hud.setFilterState("sharedworkers", false);
+-
++  let onMessagesCleared = hud.jsterm.once("messages-cleared");
+   hud.jsterm.clearOutput(true);
++  await onMessagesCleared;
+ });
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/test-console-workers.html b/devtools/client/webconsole/new-console-output/test/mochitest/test-console-workers.html
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/test-console-workers.html
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/test-console-workers.html
+@@ -2,12 +2,15 @@
+      http://creativecommons.org/publicdomain/zero/1.0/ -->
+ <!DOCTYPE HTML>
+ <html dir="ltr" xml:lang="en-US" lang="en-US"><head>
+     <meta charset="utf-8">
+     <title>Console test</title>
+   </head>
+   <body>
+     <script type="text/javascript">
+-var sw = new SharedWorker('data:application/javascript,console.log("foo-bar-shared-worker");');
++      new SharedWorker(`data:application/javascript,
++        console.log("foo-bar-shared-worker", {foo: "bar"});
++        self.close();
++      `);
+     </script>
+   </body>
+ </html>

+ 82 - 0
mozilla-release/patches/1405333-59a1.patch

@@ -0,0 +1,82 @@
+# HG changeset patch
+# User Nicolas Chevobbe <nchevobbe@mozilla.com>
+# Date 1515157423 -3600
+# Node ID 4f14d7f5ffdf32a469df8e5644c533fb17ecb2a9
+# Parent  bbea7cc924a60cfb2c766c0c2d69b8eb7c8d4336
+Bug 1405333 - Enable browser_webconsole_execution_scope.js in new console frontend;r=jdescottes.
+
+MozReview-Commit-ID: IE8AQdMR867
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -269,17 +269,16 @@ skip-if = (e10s && debug) || (e10s && os
+ [browser_webconsole_document_focus.js]
+ [browser_webconsole_duplicate_errors.js]
+ skip-if = true #       Bug 1403907
+ [browser_webconsole_errors_after_page_reload.js]
+ [browser_webconsole_eval_in_debugger_stackframe.js]
+ [browser_webconsole_eval_in_debugger_stackframe2.js]
+ skip-if = true # Bug 1408893
+ [browser_webconsole_execution_scope.js]
+-skip-if = true #       Bug 1405333
+ [browser_webconsole_external_script_errors.js]
+ [browser_webconsole_file_uri.js]
+ skip-if = true #       Bug 1404382
+ [browser_webconsole_filter_scroll.js]
+ skip-if = true #       Bug 1404392
+ [browser_webconsole_filters.js]
+ [browser_webconsole_filters_persist.js]
+ [browser_webconsole_highlighter_console_helper.js]
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_execution_scope.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_execution_scope.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_execution_scope.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_execution_scope.js
+@@ -3,35 +3,25 @@
+ /* Any copyright is dedicated to the Public Domain.
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+ // Tests that commands run by the user are executed in content space.
+ 
+ "use strict";
+ 
+ const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
+-                 "test/test-console.html";
++                 "new-console-output/test/mochitest/test-console.html";
+ 
+-add_task(function* () {
+-  yield loadTab(TEST_URI);
+-  let hud = yield openConsole();
+-  hud.jsterm.clearOutput();
+-  hud.jsterm.execute("window.location.href;");
++add_task(async function () {
++  const hud = await openNewTabAndConsole(TEST_URI);
++  const {jsterm} = hud;
++  jsterm.clearOutput();
+ 
+-  let [input, output] = yield waitForMessages({
+-    webconsole: hud,
+-    messages: [{
+-      text: "window.location.href;",
+-      category: CATEGORY_INPUT,
+-    },
+-      {
+-        text: TEST_URI,
+-        category: CATEGORY_OUTPUT,
+-      }],
+-  });
++  const onInputMessage = waitForMessage(hud, "window.location.href;", ".message.command");
++  const onEvaluationResultMessage = waitForMessage(hud, TEST_URI, ".message.result");
++  jsterm.execute("window.location.href;");
+ 
+-  let inputNode = [...input.matched][0];
+-  let outputNode = [...output.matched][0];
+-  is(inputNode.getAttribute("category"), "input",
+-     "input node category is correct");
+-  is(outputNode.getAttribute("category"), "output",
+-     "output node category is correct");
++  let message = await onInputMessage;
++  ok(message, "Input message is displayed with the expected class");
++
++  message = await onEvaluationResultMessage;
++  ok(message, "EvaluationResult message is displayed with the expected class");
+ });

+ 115 - 0
mozilla-release/patches/1405350-59a1.patch

@@ -0,0 +1,115 @@
+# HG changeset patch
+# User Patrick Brosset <pbrosset@mozilla.com>
+# Date 1511362079 -3600
+# Node ID 3d1f3f9db640098a9e2559e3cf44a0ba99f2a691
+# Parent  6776b8799222124a5c3f103c7e19556319517dc8
+Bug 1405350 - Slightly rewrite, simplify and enable browser_webconsole_js_input_expansion.js; r=Honza
+
+MozReview-Commit-ID: 3vpUl69Qk4w
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -316,17 +316,16 @@ skip-if = true #       Bug 1404884
+ skip-if = true #       Bug 1404888
+ # old console skip-if = true # Bug 1110500 - mouse event failure in test
+ [browser_webconsole_inspect_cross_domain_object.js]
+ skip-if = true #       Bug 1401548
+ [browser_webconsole_iterators_generators.js]
+ skip-if = true #       Bug 1404849
+ # old console skip-if = e10s # Bug 1042253 - webconsole tests disabled with e10s
+ [browser_webconsole_js_input_expansion.js]
+-skip-if = true #       Bug 1405350
+ [browser_webconsole_jsterm.js]
+ skip-if = true #       Bug 1405352
+ # old console skip-if = e10s # Bug 1042253 - webconsole e10s tests (Linux debug timeout)
+ [browser_webconsole_jsterm_copy.js]
+ subsuite = clipboard
+ skip-if = true #       Bug 1404831
+ # old console skip-if = (os == 'linux' && bits == 32 && debug) # bug 1328915, disable linux32 debug devtools for timeouts
+ [browser_webconsole_keyboard_accessibility.js]
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_js_input_expansion.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_js_input_expansion.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_js_input_expansion.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_js_input_expansion.js
+@@ -5,51 +5,43 @@
+ 
+ // Tests that the input box expands as the user types long lines.
+ 
+ "use strict";
+ 
+ const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
+                  "test/test-console.html";
+ 
+-add_task(function* () {
+-  yield loadTab(TEST_URI);
+-  let hud = yield openConsole();
+-  hud.jsterm.clearOutput();
++add_task(async function () {
++  const { jsterm } = await openNewTabAndConsole(TEST_URI);
++  jsterm.clearOutput();
++
++  const { inputNode } = jsterm;
++  const getInputHeight = () => inputNode.clientHeight;
+ 
+-  let input = hud.jsterm.inputNode;
+-  input.focus();
++  info("Get the initial (empty) height of the input");
++  const emptyHeight = getInputHeight();
++
++  info("Set some multiline text in the input");
++  jsterm.setInputValue("hello\nworld\n");
++
++  info("Get the new height of the input");
++  const multiLineHeight = getInputHeight();
+ 
+-  is(input.getAttribute("multiline"), "true", "multiline is enabled");
+-  // Tests if the inputNode expands.
+-  input.value = "hello\nworld\n";
+-  let length = input.value.length;
+-  input.selectionEnd = length;
+-  input.selectionStart = length;
+-  function getHeight() {
+-    return input.clientHeight;
+-  }
+-  let initialHeight = getHeight();
+-  // Performs an "d". This will trigger/test for the input event that should
+-  // change the "row" attribute of the inputNode.
+-  EventUtils.synthesizeKey("d", {});
+-  let newHeight = getHeight();
+-  ok(initialHeight < newHeight, "Height changed: " + newHeight);
++  ok(emptyHeight < multiLineHeight,
++     `Height changed from ${emptyHeight} to ${multiLineHeight}`);
++
++  info("Add some new, longer, multiline text");
++  jsterm.setInputValue("row1\nrow2\nrow3\nrow4\nrow5\nrow6\nrow7\nrow8\nrow9\nrow10\n");
++
++  info("Get the new height of the input");
++  const longerHeight = getInputHeight();
+ 
+-  // Add some more rows. Tests for the 8 row limit.
+-  input.value = "row1\nrow2\nrow3\nrow4\nrow5\nrow6\nrow7\nrow8\nrow9\nrow10\n";
+-  length = input.value.length;
+-  input.selectionEnd = length;
+-  input.selectionStart = length;
+-  EventUtils.synthesizeKey("d", {});
+-  let newerHeight = getHeight();
+-
+-  ok(newerHeight > newHeight, "height changed: " + newerHeight);
++  ok(multiLineHeight < longerHeight,
++     `Height changed from ${multiLineHeight} to ${longerHeight}`);
+ 
+-  // Test if the inputNode shrinks again.
+-  input.value = "";
+-  EventUtils.synthesizeKey("d", {});
+-  let height = getHeight();
+-  info("height: " + height);
+-  info("initialHeight: " + initialHeight);
+-  let finalHeightDifference = Math.abs(initialHeight - height);
+-  ok(finalHeightDifference <= 1, "height shrank to original size within 1px");
++  info("Test that the inputNode shrinks again");
++  jsterm.setInputValue("");
++
++  const backToEmptyHeight = getInputHeight();
++  const diff = Math.abs(backToEmptyHeight - emptyHeight);
++  ok(diff <= 1, "The input shrank back to its original size (within 1px)");
+ });

+ 2476 - 0
mozilla-release/patches/1405352-60a1.patch

@@ -0,0 +1,2476 @@
+# HG changeset patch
+# User Nicolas Chevobbe <nchevobbe@mozilla.com>
+# Date 1516790070 -3600
+# Node ID 9b0cf7518d66126b66ef609078784b0c60b18297
+# Parent  b3108b8d36e24187fc34b9282d1929d2103d2520
+Bug 1405352 - Split browser_webconsole_jsterm.js in multiple tests; r=Honza.
+
+The test was doing a lot of things and was hard to follow.
+Here we split it so we can have dedicated tests for each helpers.
+
+MozReview-Commit-ID: 6YGR3aq6jYn
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -208,27 +208,38 @@ skip-if = true #       Bug 1403188
+ [browser_jsterm_autocomplete_return_key_no_selection.js]
+ [browser_jsterm_autocomplete_return_key.js]
+ [browser_jsterm_autocomplete-properties-with-non-alphanumeric-names.js]
+ [browser_jsterm_completion.js]
+ [browser_jsterm_copy_command.js]
+ [browser_jsterm_ctrl_a_select_all.js]
+ [browser_jsterm_ctrl_key_nav.js]
+ skip-if = os != 'mac' # The tested ctrl+key shortcuts are OSX only
++[browser_jsterm_document_no_xray.js]
+ [browser_jsterm_dollar.js]
++[browser_jsterm_error_docs.js]
++[browser_jsterm_error_outside_valid_range.js]
+ [browser_jsterm_helper_clear.js]
++[browser_jsterm_helper_dollar_dollar.js]
++[browser_jsterm_helper_dollar_x.js]
++[browser_jsterm_helper_dollar.js]
++[browser_jsterm_helper_help.js]
++[browser_jsterm_helper_keys_values.js]
++[browser_jsterm_helper_pprint.js]
+ [browser_jsterm_history.js]
+ [browser_jsterm_history_persist.js]
+ [browser_jsterm_history_nav.js]
+ [browser_jsterm_input_expansion.js]
+ [browser_jsterm_inspect.js]
++[browser_jsterm_instance_of.js]
+ [browser_jsterm_multiline.js]
+ [browser_jsterm_no_autocompletion_on_defined_variables.js]
+ [browser_jsterm_no_input_and_tab_key_pressed.js]
+ [browser_jsterm_no_input_change_and_tab_key_pressed.js]
++[browser_jsterm_null_undefined.js]
+ [browser_jsterm_popup_close_on_tab_switch.js]
+ [browser_jsterm_popup.js]
+ [browser_jsterm_selfxss.js]
+ subsuite = clipboard
+ [browser_netmonitor_shows_reqs_in_webconsole.js]
+ [browser_webconsole_allow_mixedcontent_securityerrors.js]
+ tags = mcb
+ [browser_webconsole_batching.js]
+@@ -287,19 +298,16 @@ skip-if = true #       Bug 1404382
+ [browser_webconsole_init.js]
+ [browser_webconsole_input_field_focus_on_panel_select.js]
+ skip-if = true #       Bug 1405343
+ [browser_webconsole_input_focus.js]
+ [browser_webconsole_insecure_passwords_about_blank_web_console_warning.js]
+ [browser_webconsole_insecure_passwords_web_console_warning.js]
+ [browser_webconsole_inspect_cross_domain_object.js]
+ [browser_webconsole_js_input_expansion.js]
+-[browser_webconsole_jsterm.js]
+-skip-if = true #       Bug 1405352
+-# old console skip-if = e10s # Bug 1042253 - webconsole e10s tests (Linux debug timeout)
+ [browser_webconsole_keyboard_accessibility.js]
+ [browser_webconsole_location_debugger_link.js]
+ [browser_webconsole_location_scratchpad_link.js]
+ [browser_webconsole_location_styleeditor_link.js]
+ [browser_webconsole_logErrorInPage.js]
+ [browser_webconsole_loglimit.js]
+ [browser_webconsole_longstring_expand.js]
+ skip-if = true #       Bug 1403448
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_jsterm.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_document_no_xray.js
+rename from devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_jsterm.js
+rename to devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_document_no_xray.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_jsterm.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_document_no_xray.js
+@@ -1,194 +1,17 @@
+-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+-/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+ /* Any copyright is dedicated to the Public Domain.
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+ "use strict";
+ 
+-const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
+-                 "test/test-console.html";
+-
+-var jsterm;
+-
+-add_task(function* () {
+-  yield loadTab(TEST_URI);
+-  let hud = yield openConsole();
+-  jsterm = hud.jsterm;
+-  yield testJSTerm(hud);
+-  jsterm = null;
+-});
+-
+-function checkResult(msg, desc) {
+-  let def = defer();
+-  waitForMessages({
+-    webconsole: jsterm.hud.owner,
+-    messages: [{
+-      name: desc,
+-      category: CATEGORY_OUTPUT,
+-    }],
+-  }).then(([result]) => {
+-    let node = [...result.matched][0].querySelector(".message-body");
+-    if (typeof msg == "string") {
+-      is(node.textContent.trim(), msg,
+-        "correct message shown for " + desc);
+-    } else if (typeof msg == "function") {
+-      ok(msg(node), "correct message shown for " + desc);
+-    }
+-
+-    def.resolve();
+-  });
+-  return def.promise;
+-}
+-
+-function* testJSTerm(hud) {
+-  const HELP_URL = "https://developer.mozilla.org/docs/Tools/" +
+-                   "Web_Console/Helpers";
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("$('#header').getAttribute('id')");
+-  yield checkResult('"header"', "$() worked");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("$$('h1').length");
+-  yield checkResult("1", "$$() worked");
++const TEST_URI = "data:text/html,Test evaluating document";
+ 
+-  jsterm.clearOutput();
+-  yield jsterm.execute("$x('.//*', document.body)[0] == $$('h1')[0]");
+-  yield checkResult("true", "$x() worked");
+-
+-  // no jsterm.clearOutput() here as we clear the output using the clear() fn.
+-  yield jsterm.execute("clear()");
+-
+-  yield waitForSuccess({
+-    name: "clear() worked",
+-    validator: function () {
+-      return jsterm.outputNode.childNodes.length == 0;
+-    }
+-  });
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("keys({b:1})[0] == 'b'");
+-  yield checkResult("true", "keys() worked", 1);
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("values({b:1})[0] == 1");
+-  yield checkResult("true", "values() worked", 1);
+-
+-  jsterm.clearOutput();
+-
+-  let openedLinks = 0;
+-  let oldOpenLink = hud.openLink;
+-  hud.openLink = (url) => {
+-    if (url == HELP_URL) {
+-      openedLinks++;
+-    }
+-  };
+-
+-  yield jsterm.execute("help()");
+-  yield jsterm.execute("help");
+-  yield jsterm.execute("?");
+-
+-  let output = jsterm.outputNode.querySelector(".message[category='output']");
+-  ok(!output, "no output for help() calls");
+-  is(openedLinks, 3, "correct number of pages opened by the help calls");
+-  hud.openLink = oldOpenLink;
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("pprint({b:2, a:1})");
+-  yield checkResult("\"  b: 2\n  a: 1\"", "pprint()");
+-
+-  // check instanceof correctness, bug 599940
+-  jsterm.clearOutput();
+-  yield jsterm.execute("[] instanceof Array");
+-  yield checkResult("true", "[] instanceof Array == true");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("({}) instanceof Object");
+-  yield checkResult("true", "({}) instanceof Object == true");
++add_task(async function () {
++  const hud = await openNewTabAndConsole(TEST_URI);
++  const {jsterm} = hud;
+ 
+   // check for occurrences of Object XRayWrapper, bug 604430
+-  jsterm.clearOutput();
+-  yield jsterm.execute("document");
+-  yield checkResult(function (node) {
+-    return node.textContent.search(/\[object xraywrapper/i) == -1;
+-  }, "document - no XrayWrapper");
+-
+-  // check that pprint(window) and keys(window) don't throw, bug 608358
+-  jsterm.clearOutput();
+-  yield jsterm.execute("pprint(window)");
+-  yield checkResult(null, "pprint(window)");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("keys(window)");
+-  yield checkResult(null, "keys(window)");
+-
+-  // bug 614561
+-  jsterm.clearOutput();
+-  yield jsterm.execute("pprint('hi')");
+-  yield checkResult("\"  0: \"h\"\n  1: \"i\"\"", "pprint('hi')");
+-
+-  // check that pprint(function) shows function source, bug 618344
+-  jsterm.clearOutput();
+-  yield jsterm.execute("pprint(function() { var someCanaryValue = 42; })");
+-  yield checkResult(function (node) {
+-    return node.textContent.indexOf("someCanaryValue") > -1;
+-  }, "pprint(function) shows source");
+-
+-  // check that an evaluated null produces "null", bug 650780
+-  jsterm.clearOutput();
+-  yield jsterm.execute("null");
+-  yield checkResult("null", "null is null");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("undefined");
+-  yield checkResult("undefined", "undefined is printed");
+-
+-  // check that thrown strings produce error messages,
+-  // and the message text matches that of a stringified error object
+-  // bug 1099071
+-  jsterm.clearOutput();
+-  yield jsterm.execute("throw '';");
+-  yield checkResult((node) => {
+-    return node.closest(".message").getAttribute("severity") === "error" &&
+-      node.textContent === new Error("").toString();
+-  }, "thrown empty string generates error message");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("throw 'tomatoes';");
+-  yield checkResult((node) => {
+-    return node.closest(".message").getAttribute("severity") === "error" &&
+-      node.textContent === new Error("tomatoes").toString();
+-  }, "thrown non-empty string generates error message");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("throw { foo: 'bar' };");
+-  yield checkResult((node) => {
+-    return node.closest(".message").getAttribute("severity") === "error" &&
+-      node.textContent === Object.prototype.toString();
+-  }, "thrown object generates error message");
+-
+-  // check that errors with entires in errordocs.js display links
+-  // alongside their messages.
+-  const ErrorDocs = require("devtools/server/actors/errordocs");
+-
+-  const ErrorDocStatements = {
+-    "JSMSG_BAD_RADIX": "(42).toString(0);",
+-    "JSMSG_BAD_ARRAY_LENGTH": "([]).length = -1",
+-    "JSMSG_NEGATIVE_REPETITION_COUNT": "'abc'.repeat(-1);",
+-    "JSMSG_PRECISION_RANGE": "77.1234.toExponential(-1);",
+-  };
+-
+-  for (let errorMessageName of Object.keys(ErrorDocStatements)) {
+-    let title = ErrorDocs.GetURL({ errorMessageName }).split("?")[0];
+-
+-    jsterm.clearOutput();
+-    yield jsterm.execute(ErrorDocStatements[errorMessageName]);
+-    yield checkResult((node) => {
+-      return node.parentNode.getElementsByTagName("a")[0].title == title;
+-    }, `error links to ${title}`);
+-  }
+-
+-  // Ensure that dom errors, with error numbers outside of the range
+-  // of valid js.msg errors, don't cause crashes (bug 1270721).
+-  yield jsterm.execute("new Request('',{redirect:'foo'})");
+-}
++  const onMessage = waitForMessage(hud, "HTMLDocument");
++  jsterm.execute("document");
++  const {node} = await onMessage;
++  is(node.textContent.includes("xray"), false, "document - no XrayWrapper");
++});
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_jsterm.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_error_docs.js
+copy from devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_jsterm.js
+copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_error_docs.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_jsterm.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_error_docs.js
+@@ -1,194 +1,33 @@
+-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+-/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+ /* Any copyright is dedicated to the Public Domain.
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+ "use strict";
+ 
+-const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
+-                 "test/test-console.html";
+-
+-var jsterm;
+-
+-add_task(function* () {
+-  yield loadTab(TEST_URI);
+-  let hud = yield openConsole();
+-  jsterm = hud.jsterm;
+-  yield testJSTerm(hud);
+-  jsterm = null;
+-});
+-
+-function checkResult(msg, desc) {
+-  let def = defer();
+-  waitForMessages({
+-    webconsole: jsterm.hud.owner,
+-    messages: [{
+-      name: desc,
+-      category: CATEGORY_OUTPUT,
+-    }],
+-  }).then(([result]) => {
+-    let node = [...result.matched][0].querySelector(".message-body");
+-    if (typeof msg == "string") {
+-      is(node.textContent.trim(), msg,
+-        "correct message shown for " + desc);
+-    } else if (typeof msg == "function") {
+-      ok(msg(node), "correct message shown for " + desc);
+-    }
+-
+-    def.resolve();
+-  });
+-  return def.promise;
+-}
+-
+-function* testJSTerm(hud) {
+-  const HELP_URL = "https://developer.mozilla.org/docs/Tools/" +
+-                   "Web_Console/Helpers";
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("$('#header').getAttribute('id')");
+-  yield checkResult('"header"', "$() worked");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("$$('h1').length");
+-  yield checkResult("1", "$$() worked");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("$x('.//*', document.body)[0] == $$('h1')[0]");
+-  yield checkResult("true", "$x() worked");
+-
+-  // no jsterm.clearOutput() here as we clear the output using the clear() fn.
+-  yield jsterm.execute("clear()");
+-
+-  yield waitForSuccess({
+-    name: "clear() worked",
+-    validator: function () {
+-      return jsterm.outputNode.childNodes.length == 0;
+-    }
+-  });
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("keys({b:1})[0] == 'b'");
+-  yield checkResult("true", "keys() worked", 1);
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("values({b:1})[0] == 1");
+-  yield checkResult("true", "values() worked", 1);
+-
+-  jsterm.clearOutput();
+-
+-  let openedLinks = 0;
+-  let oldOpenLink = hud.openLink;
+-  hud.openLink = (url) => {
+-    if (url == HELP_URL) {
+-      openedLinks++;
+-    }
+-  };
++const TEST_URI = "data:text/html,Test error documentation";
+ 
+-  yield jsterm.execute("help()");
+-  yield jsterm.execute("help");
+-  yield jsterm.execute("?");
+-
+-  let output = jsterm.outputNode.querySelector(".message[category='output']");
+-  ok(!output, "no output for help() calls");
+-  is(openedLinks, 3, "correct number of pages opened by the help calls");
+-  hud.openLink = oldOpenLink;
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("pprint({b:2, a:1})");
+-  yield checkResult("\"  b: 2\n  a: 1\"", "pprint()");
+-
+-  // check instanceof correctness, bug 599940
+-  jsterm.clearOutput();
+-  yield jsterm.execute("[] instanceof Array");
+-  yield checkResult("true", "[] instanceof Array == true");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("({}) instanceof Object");
+-  yield checkResult("true", "({}) instanceof Object == true");
+-
+-  // check for occurrences of Object XRayWrapper, bug 604430
+-  jsterm.clearOutput();
+-  yield jsterm.execute("document");
+-  yield checkResult(function (node) {
+-    return node.textContent.search(/\[object xraywrapper/i) == -1;
+-  }, "document - no XrayWrapper");
+-
+-  // check that pprint(window) and keys(window) don't throw, bug 608358
+-  jsterm.clearOutput();
+-  yield jsterm.execute("pprint(window)");
+-  yield checkResult(null, "pprint(window)");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("keys(window)");
+-  yield checkResult(null, "keys(window)");
+-
+-  // bug 614561
+-  jsterm.clearOutput();
+-  yield jsterm.execute("pprint('hi')");
+-  yield checkResult("\"  0: \"h\"\n  1: \"i\"\"", "pprint('hi')");
++add_task(async function () {
++  const hud = await openNewTabAndConsole(TEST_URI);
++  const {jsterm} = hud;
+ 
+-  // check that pprint(function) shows function source, bug 618344
+-  jsterm.clearOutput();
+-  yield jsterm.execute("pprint(function() { var someCanaryValue = 42; })");
+-  yield checkResult(function (node) {
+-    return node.textContent.indexOf("someCanaryValue") > -1;
+-  }, "pprint(function) shows source");
+-
+-  // check that an evaluated null produces "null", bug 650780
+-  jsterm.clearOutput();
+-  yield jsterm.execute("null");
+-  yield checkResult("null", "null is null");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("undefined");
+-  yield checkResult("undefined", "undefined is printed");
+-
+-  // check that thrown strings produce error messages,
+-  // and the message text matches that of a stringified error object
+-  // bug 1099071
+-  jsterm.clearOutput();
+-  yield jsterm.execute("throw '';");
+-  yield checkResult((node) => {
+-    return node.closest(".message").getAttribute("severity") === "error" &&
+-      node.textContent === new Error("").toString();
+-  }, "thrown empty string generates error message");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("throw 'tomatoes';");
+-  yield checkResult((node) => {
+-    return node.closest(".message").getAttribute("severity") === "error" &&
+-      node.textContent === new Error("tomatoes").toString();
+-  }, "thrown non-empty string generates error message");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("throw { foo: 'bar' };");
+-  yield checkResult((node) => {
+-    return node.closest(".message").getAttribute("severity") === "error" &&
+-      node.textContent === Object.prototype.toString();
+-  }, "thrown object generates error message");
+-
+-  // check that errors with entires in errordocs.js display links
+-  // alongside their messages.
++  // Check that errors with entries in errordocs.js display links next to their messages.
+   const ErrorDocs = require("devtools/server/actors/errordocs");
+ 
+   const ErrorDocStatements = {
+     "JSMSG_BAD_RADIX": "(42).toString(0);",
+     "JSMSG_BAD_ARRAY_LENGTH": "([]).length = -1",
+     "JSMSG_NEGATIVE_REPETITION_COUNT": "'abc'.repeat(-1);",
+     "JSMSG_PRECISION_RANGE": "77.1234.toExponential(-1);",
+   };
+ 
+-  for (let errorMessageName of Object.keys(ErrorDocStatements)) {
++  for (let [errorMessageName, expression] of Object.entries(ErrorDocStatements)) {
+     let title = ErrorDocs.GetURL({ errorMessageName }).split("?")[0];
+ 
+     jsterm.clearOutput();
+-    yield jsterm.execute(ErrorDocStatements[errorMessageName]);
+-    yield checkResult((node) => {
+-      return node.parentNode.getElementsByTagName("a")[0].title == title;
+-    }, `error links to ${title}`);
++    const onMessage = waitForMessage(hud, "RangeError:")
++    jsterm.execute(expression);
++    const {node} = await onMessage;
++    const learnMoreLink = node.querySelector(".learn-more-link");
++    ok(learnMoreLink, `There is a [Learn More] link for "${errorMessageName}" error`);
++    is(learnMoreLink.title, title, `The link has the expected "${title}" title`);
+   }
+-
+-  // Ensure that dom errors, with error numbers outside of the range
+-  // of valid js.msg errors, don't cause crashes (bug 1270721).
+-  yield jsterm.execute("new Request('',{redirect:'foo'})");
+-}
++});
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_jsterm.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_error_outside_valid_range.js
+copy from devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_jsterm.js
+copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_error_outside_valid_range.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_jsterm.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_error_outside_valid_range.js
+@@ -1,194 +1,21 @@
+-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+-/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+ /* Any copyright is dedicated to the Public Domain.
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+ "use strict";
+ 
+-const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
+-                 "test/test-console.html";
+-
+-var jsterm;
+-
+-add_task(function* () {
+-  yield loadTab(TEST_URI);
+-  let hud = yield openConsole();
+-  jsterm = hud.jsterm;
+-  yield testJSTerm(hud);
+-  jsterm = null;
+-});
+-
+-function checkResult(msg, desc) {
+-  let def = defer();
+-  waitForMessages({
+-    webconsole: jsterm.hud.owner,
+-    messages: [{
+-      name: desc,
+-      category: CATEGORY_OUTPUT,
+-    }],
+-  }).then(([result]) => {
+-    let node = [...result.matched][0].querySelector(".message-body");
+-    if (typeof msg == "string") {
+-      is(node.textContent.trim(), msg,
+-        "correct message shown for " + desc);
+-    } else if (typeof msg == "function") {
+-      ok(msg(node), "correct message shown for " + desc);
+-    }
+-
+-    def.resolve();
+-  });
+-  return def.promise;
+-}
+-
+-function* testJSTerm(hud) {
+-  const HELP_URL = "https://developer.mozilla.org/docs/Tools/" +
+-                   "Web_Console/Helpers";
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("$('#header').getAttribute('id')");
+-  yield checkResult('"header"', "$() worked");
++// Ensure that dom errors, with error numbers outside of the range
++// of valid js.msg errors, don't cause crashes (See Bug 1270721).
+ 
+-  jsterm.clearOutput();
+-  yield jsterm.execute("$$('h1').length");
+-  yield checkResult("1", "$$() worked");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("$x('.//*', document.body)[0] == $$('h1')[0]");
+-  yield checkResult("true", "$x() worked");
+-
+-  // no jsterm.clearOutput() here as we clear the output using the clear() fn.
+-  yield jsterm.execute("clear()");
+-
+-  yield waitForSuccess({
+-    name: "clear() worked",
+-    validator: function () {
+-      return jsterm.outputNode.childNodes.length == 0;
+-    }
+-  });
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("keys({b:1})[0] == 'b'");
+-  yield checkResult("true", "keys() worked", 1);
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("values({b:1})[0] == 1");
+-  yield checkResult("true", "values() worked", 1);
+-
+-  jsterm.clearOutput();
+-
+-  let openedLinks = 0;
+-  let oldOpenLink = hud.openLink;
+-  hud.openLink = (url) => {
+-    if (url == HELP_URL) {
+-      openedLinks++;
+-    }
+-  };
+-
+-  yield jsterm.execute("help()");
+-  yield jsterm.execute("help");
+-  yield jsterm.execute("?");
+-
+-  let output = jsterm.outputNode.querySelector(".message[category='output']");
+-  ok(!output, "no output for help() calls");
+-  is(openedLinks, 3, "correct number of pages opened by the help calls");
+-  hud.openLink = oldOpenLink;
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("pprint({b:2, a:1})");
+-  yield checkResult("\"  b: 2\n  a: 1\"", "pprint()");
++const TEST_URI = "data:text/html,Test error documentation";
+ 
+-  // check instanceof correctness, bug 599940
+-  jsterm.clearOutput();
+-  yield jsterm.execute("[] instanceof Array");
+-  yield checkResult("true", "[] instanceof Array == true");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("({}) instanceof Object");
+-  yield checkResult("true", "({}) instanceof Object == true");
+-
+-  // check for occurrences of Object XRayWrapper, bug 604430
+-  jsterm.clearOutput();
+-  yield jsterm.execute("document");
+-  yield checkResult(function (node) {
+-    return node.textContent.search(/\[object xraywrapper/i) == -1;
+-  }, "document - no XrayWrapper");
+-
+-  // check that pprint(window) and keys(window) don't throw, bug 608358
+-  jsterm.clearOutput();
+-  yield jsterm.execute("pprint(window)");
+-  yield checkResult(null, "pprint(window)");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("keys(window)");
+-  yield checkResult(null, "keys(window)");
+-
+-  // bug 614561
+-  jsterm.clearOutput();
+-  yield jsterm.execute("pprint('hi')");
+-  yield checkResult("\"  0: \"h\"\n  1: \"i\"\"", "pprint('hi')");
+-
+-  // check that pprint(function) shows function source, bug 618344
+-  jsterm.clearOutput();
+-  yield jsterm.execute("pprint(function() { var someCanaryValue = 42; })");
+-  yield checkResult(function (node) {
+-    return node.textContent.indexOf("someCanaryValue") > -1;
+-  }, "pprint(function) shows source");
+-
+-  // check that an evaluated null produces "null", bug 650780
+-  jsterm.clearOutput();
+-  yield jsterm.execute("null");
+-  yield checkResult("null", "null is null");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("undefined");
+-  yield checkResult("undefined", "undefined is printed");
++add_task(async function () {
++  const hud = await openNewTabAndConsole(TEST_URI);
++  const {jsterm} = hud;
+ 
+-  // check that thrown strings produce error messages,
+-  // and the message text matches that of a stringified error object
+-  // bug 1099071
+-  jsterm.clearOutput();
+-  yield jsterm.execute("throw '';");
+-  yield checkResult((node) => {
+-    return node.closest(".message").getAttribute("severity") === "error" &&
+-      node.textContent === new Error("").toString();
+-  }, "thrown empty string generates error message");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("throw 'tomatoes';");
+-  yield checkResult((node) => {
+-    return node.closest(".message").getAttribute("severity") === "error" &&
+-      node.textContent === new Error("tomatoes").toString();
+-  }, "thrown non-empty string generates error message");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("throw { foo: 'bar' };");
+-  yield checkResult((node) => {
+-    return node.closest(".message").getAttribute("severity") === "error" &&
+-      node.textContent === Object.prototype.toString();
+-  }, "thrown object generates error message");
+-
+-  // check that errors with entires in errordocs.js display links
+-  // alongside their messages.
+-  const ErrorDocs = require("devtools/server/actors/errordocs");
+-
+-  const ErrorDocStatements = {
+-    "JSMSG_BAD_RADIX": "(42).toString(0);",
+-    "JSMSG_BAD_ARRAY_LENGTH": "([]).length = -1",
+-    "JSMSG_NEGATIVE_REPETITION_COUNT": "'abc'.repeat(-1);",
+-    "JSMSG_PRECISION_RANGE": "77.1234.toExponential(-1);",
+-  };
+-
+-  for (let errorMessageName of Object.keys(ErrorDocStatements)) {
+-    let title = ErrorDocs.GetURL({ errorMessageName }).split("?")[0];
+-
+-    jsterm.clearOutput();
+-    yield jsterm.execute(ErrorDocStatements[errorMessageName]);
+-    yield checkResult((node) => {
+-      return node.parentNode.getElementsByTagName("a")[0].title == title;
+-    }, `error links to ${title}`);
+-  }
+-
+-  // Ensure that dom errors, with error numbers outside of the range
+-  // of valid js.msg errors, don't cause crashes (bug 1270721).
+-  yield jsterm.execute("new Request('',{redirect:'foo'})");
+-}
++  const text = "TypeError: 'redirect' member of RequestInit 'foo' is not a valid value " +
++               "for enumeration RequestRedirect";
++  const onErrorMessage =  waitForMessage(hud, text, ".message.error");
++  jsterm.execute("new Request('',{redirect:'foo'})");
++  await onErrorMessage;
++  ok(true, "Error message displayed as expected, without crashing the console.");
++});
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_jsterm.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_helper_dollar.js
+copy from devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_jsterm.js
+copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_helper_dollar.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_jsterm.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_helper_dollar.js
+@@ -1,194 +1,41 @@
+ /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+ /* Any copyright is dedicated to the Public Domain.
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+ "use strict";
+ 
+-const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
+-                 "test/test-console.html";
+-
+-var jsterm;
+-
+-add_task(function* () {
+-  yield loadTab(TEST_URI);
+-  let hud = yield openConsole();
+-  jsterm = hud.jsterm;
+-  yield testJSTerm(hud);
+-  jsterm = null;
+-});
+-
+-function checkResult(msg, desc) {
+-  let def = defer();
+-  waitForMessages({
+-    webconsole: jsterm.hud.owner,
+-    messages: [{
+-      name: desc,
+-      category: CATEGORY_OUTPUT,
+-    }],
+-  }).then(([result]) => {
+-    let node = [...result.matched][0].querySelector(".message-body");
+-    if (typeof msg == "string") {
+-      is(node.textContent.trim(), msg,
+-        "correct message shown for " + desc);
+-    } else if (typeof msg == "function") {
+-      ok(msg(node), "correct message shown for " + desc);
+-    }
+-
+-    def.resolve();
+-  });
+-  return def.promise;
+-}
+-
+-function* testJSTerm(hud) {
+-  const HELP_URL = "https://developer.mozilla.org/docs/Tools/" +
+-                   "Web_Console/Helpers";
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("$('#header').getAttribute('id')");
+-  yield checkResult('"header"', "$() worked");
++const TEST_URI = `data:text/html,
++<main>
++  <ul>
++    <li>First</li>
++    <li>Second</li>
++  </ul>
++  <aside>Sidebar</aside>
++</main>
++`;
+ 
+-  jsterm.clearOutput();
+-  yield jsterm.execute("$$('h1').length");
+-  yield checkResult("1", "$$() worked");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("$x('.//*', document.body)[0] == $$('h1')[0]");
+-  yield checkResult("true", "$x() worked");
+-
+-  // no jsterm.clearOutput() here as we clear the output using the clear() fn.
+-  yield jsterm.execute("clear()");
+-
+-  yield waitForSuccess({
+-    name: "clear() worked",
+-    validator: function () {
+-      return jsterm.outputNode.childNodes.length == 0;
+-    }
+-  });
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("keys({b:1})[0] == 'b'");
+-  yield checkResult("true", "keys() worked", 1);
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("values({b:1})[0] == 1");
+-  yield checkResult("true", "values() worked", 1);
+-
+-  jsterm.clearOutput();
+-
+-  let openedLinks = 0;
+-  let oldOpenLink = hud.openLink;
+-  hud.openLink = (url) => {
+-    if (url == HELP_URL) {
+-      openedLinks++;
+-    }
+-  };
+-
+-  yield jsterm.execute("help()");
+-  yield jsterm.execute("help");
+-  yield jsterm.execute("?");
+-
+-  let output = jsterm.outputNode.querySelector(".message[category='output']");
+-  ok(!output, "no output for help() calls");
+-  is(openedLinks, 3, "correct number of pages opened by the help calls");
+-  hud.openLink = oldOpenLink;
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("pprint({b:2, a:1})");
+-  yield checkResult("\"  b: 2\n  a: 1\"", "pprint()");
++add_task(async function () {
++  const hud = await openNewTabAndConsole(TEST_URI);
++  const jsterm = hud.jsterm;
+ 
+-  // check instanceof correctness, bug 599940
+-  jsterm.clearOutput();
+-  yield jsterm.execute("[] instanceof Array");
+-  yield checkResult("true", "[] instanceof Array == true");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("({}) instanceof Object");
+-  yield checkResult("true", "({}) instanceof Object == true");
+-
+-  // check for occurrences of Object XRayWrapper, bug 604430
+-  jsterm.clearOutput();
+-  yield jsterm.execute("document");
+-  yield checkResult(function (node) {
+-    return node.textContent.search(/\[object xraywrapper/i) == -1;
+-  }, "document - no XrayWrapper");
+-
+-  // check that pprint(window) and keys(window) don't throw, bug 608358
+-  jsterm.clearOutput();
+-  yield jsterm.execute("pprint(window)");
+-  yield checkResult(null, "pprint(window)");
++  let onMessage = waitForMessage(hud, "<main>");
++  jsterm.execute("$('main')");
++  let message = await onMessage;
++  ok(message, "`$('main')` worked");
+ 
+-  jsterm.clearOutput();
+-  yield jsterm.execute("keys(window)");
+-  yield checkResult(null, "keys(window)");
+-
+-  // bug 614561
+-  jsterm.clearOutput();
+-  yield jsterm.execute("pprint('hi')");
+-  yield checkResult("\"  0: \"h\"\n  1: \"i\"\"", "pprint('hi')");
+-
+-  // check that pprint(function) shows function source, bug 618344
+-  jsterm.clearOutput();
+-  yield jsterm.execute("pprint(function() { var someCanaryValue = 42; })");
+-  yield checkResult(function (node) {
+-    return node.textContent.indexOf("someCanaryValue") > -1;
+-  }, "pprint(function) shows source");
+-
+-  // check that an evaluated null produces "null", bug 650780
+-  jsterm.clearOutput();
+-  yield jsterm.execute("null");
+-  yield checkResult("null", "null is null");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("undefined");
+-  yield checkResult("undefined", "undefined is printed");
++  onMessage = waitForMessage(hud, "<li>");
++  jsterm.execute("$('main > ul > li')");
++  message = await onMessage;
++  ok(message, "`$('main > ul > li')` worked");
+ 
+-  // check that thrown strings produce error messages,
+-  // and the message text matches that of a stringified error object
+-  // bug 1099071
+-  jsterm.clearOutput();
+-  yield jsterm.execute("throw '';");
+-  yield checkResult((node) => {
+-    return node.closest(".message").getAttribute("severity") === "error" &&
+-      node.textContent === new Error("").toString();
+-  }, "thrown empty string generates error message");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("throw 'tomatoes';");
+-  yield checkResult((node) => {
+-    return node.closest(".message").getAttribute("severity") === "error" &&
+-      node.textContent === new Error("tomatoes").toString();
+-  }, "thrown non-empty string generates error message");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("throw { foo: 'bar' };");
+-  yield checkResult((node) => {
+-    return node.closest(".message").getAttribute("severity") === "error" &&
+-      node.textContent === Object.prototype.toString();
+-  }, "thrown object generates error message");
++  onMessage = waitForMessage(hud, "LI");
++  jsterm.execute("$('main > ul > li').tagName");
++  message = await onMessage;
++  ok(message, "`$` result can be used right away");
+ 
+-  // check that errors with entires in errordocs.js display links
+-  // alongside their messages.
+-  const ErrorDocs = require("devtools/server/actors/errordocs");
+-
+-  const ErrorDocStatements = {
+-    "JSMSG_BAD_RADIX": "(42).toString(0);",
+-    "JSMSG_BAD_ARRAY_LENGTH": "([]).length = -1",
+-    "JSMSG_NEGATIVE_REPETITION_COUNT": "'abc'.repeat(-1);",
+-    "JSMSG_PRECISION_RANGE": "77.1234.toExponential(-1);",
+-  };
+-
+-  for (let errorMessageName of Object.keys(ErrorDocStatements)) {
+-    let title = ErrorDocs.GetURL({ errorMessageName }).split("?")[0];
+-
+-    jsterm.clearOutput();
+-    yield jsterm.execute(ErrorDocStatements[errorMessageName]);
+-    yield checkResult((node) => {
+-      return node.parentNode.getElementsByTagName("a")[0].title == title;
+-    }, `error links to ${title}`);
+-  }
+-
+-  // Ensure that dom errors, with error numbers outside of the range
+-  // of valid js.msg errors, don't cause crashes (bug 1270721).
+-  yield jsterm.execute("new Request('',{redirect:'foo'})");
+-}
++  onMessage = waitForMessage(hud, "null");
++  jsterm.execute("$('div')");
++  message = await onMessage;
++  ok(message, "`$('div')` does return null");
++});
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_jsterm.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_helper_dollar_dollar.js
+copy from devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_jsterm.js
+copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_helper_dollar_dollar.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_jsterm.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_helper_dollar_dollar.js
+@@ -1,194 +1,41 @@
+ /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+ /* Any copyright is dedicated to the Public Domain.
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+ "use strict";
+ 
+-const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
+-                 "test/test-console.html";
+-
+-var jsterm;
+-
+-add_task(function* () {
+-  yield loadTab(TEST_URI);
+-  let hud = yield openConsole();
+-  jsterm = hud.jsterm;
+-  yield testJSTerm(hud);
+-  jsterm = null;
+-});
+-
+-function checkResult(msg, desc) {
+-  let def = defer();
+-  waitForMessages({
+-    webconsole: jsterm.hud.owner,
+-    messages: [{
+-      name: desc,
+-      category: CATEGORY_OUTPUT,
+-    }],
+-  }).then(([result]) => {
+-    let node = [...result.matched][0].querySelector(".message-body");
+-    if (typeof msg == "string") {
+-      is(node.textContent.trim(), msg,
+-        "correct message shown for " + desc);
+-    } else if (typeof msg == "function") {
+-      ok(msg(node), "correct message shown for " + desc);
+-    }
+-
+-    def.resolve();
+-  });
+-  return def.promise;
+-}
+-
+-function* testJSTerm(hud) {
+-  const HELP_URL = "https://developer.mozilla.org/docs/Tools/" +
+-                   "Web_Console/Helpers";
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("$('#header').getAttribute('id')");
+-  yield checkResult('"header"', "$() worked");
++const TEST_URI = `data:text/html,
++<main>
++  <ul>
++    <li>First</li>
++    <li>Second</li>
++  </ul>
++  <aside>Sidebar</aside>
++</main>
++`;
+ 
+-  jsterm.clearOutput();
+-  yield jsterm.execute("$$('h1').length");
+-  yield checkResult("1", "$$() worked");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("$x('.//*', document.body)[0] == $$('h1')[0]");
+-  yield checkResult("true", "$x() worked");
+-
+-  // no jsterm.clearOutput() here as we clear the output using the clear() fn.
+-  yield jsterm.execute("clear()");
+-
+-  yield waitForSuccess({
+-    name: "clear() worked",
+-    validator: function () {
+-      return jsterm.outputNode.childNodes.length == 0;
+-    }
+-  });
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("keys({b:1})[0] == 'b'");
+-  yield checkResult("true", "keys() worked", 1);
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("values({b:1})[0] == 1");
+-  yield checkResult("true", "values() worked", 1);
+-
+-  jsterm.clearOutput();
+-
+-  let openedLinks = 0;
+-  let oldOpenLink = hud.openLink;
+-  hud.openLink = (url) => {
+-    if (url == HELP_URL) {
+-      openedLinks++;
+-    }
+-  };
+-
+-  yield jsterm.execute("help()");
+-  yield jsterm.execute("help");
+-  yield jsterm.execute("?");
+-
+-  let output = jsterm.outputNode.querySelector(".message[category='output']");
+-  ok(!output, "no output for help() calls");
+-  is(openedLinks, 3, "correct number of pages opened by the help calls");
+-  hud.openLink = oldOpenLink;
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("pprint({b:2, a:1})");
+-  yield checkResult("\"  b: 2\n  a: 1\"", "pprint()");
++add_task(async function () {
++  const hud = await openNewTabAndConsole(TEST_URI);
++  const jsterm = hud.jsterm;
+ 
+-  // check instanceof correctness, bug 599940
+-  jsterm.clearOutput();
+-  yield jsterm.execute("[] instanceof Array");
+-  yield checkResult("true", "[] instanceof Array == true");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("({}) instanceof Object");
+-  yield checkResult("true", "({}) instanceof Object == true");
+-
+-  // check for occurrences of Object XRayWrapper, bug 604430
+-  jsterm.clearOutput();
+-  yield jsterm.execute("document");
+-  yield checkResult(function (node) {
+-    return node.textContent.search(/\[object xraywrapper/i) == -1;
+-  }, "document - no XrayWrapper");
+-
+-  // check that pprint(window) and keys(window) don't throw, bug 608358
+-  jsterm.clearOutput();
+-  yield jsterm.execute("pprint(window)");
+-  yield checkResult(null, "pprint(window)");
++  let onMessage = waitForMessage(hud, "Array [ main ]");
++  jsterm.execute("$$('main')");
++  let message = await onMessage;
++  ok(message, "`$$('main')` worked");
+ 
+-  jsterm.clearOutput();
+-  yield jsterm.execute("keys(window)");
+-  yield checkResult(null, "keys(window)");
+-
+-  // bug 614561
+-  jsterm.clearOutput();
+-  yield jsterm.execute("pprint('hi')");
+-  yield checkResult("\"  0: \"h\"\n  1: \"i\"\"", "pprint('hi')");
+-
+-  // check that pprint(function) shows function source, bug 618344
+-  jsterm.clearOutput();
+-  yield jsterm.execute("pprint(function() { var someCanaryValue = 42; })");
+-  yield checkResult(function (node) {
+-    return node.textContent.indexOf("someCanaryValue") > -1;
+-  }, "pprint(function) shows source");
+-
+-  // check that an evaluated null produces "null", bug 650780
+-  jsterm.clearOutput();
+-  yield jsterm.execute("null");
+-  yield checkResult("null", "null is null");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("undefined");
+-  yield checkResult("undefined", "undefined is printed");
++  onMessage = waitForMessage(hud, "Array [ li, li ]");
++  jsterm.execute("$$('main > ul > li')");
++  message = await onMessage;
++  ok(message, "`$$('main > ul > li')` worked");
+ 
+-  // check that thrown strings produce error messages,
+-  // and the message text matches that of a stringified error object
+-  // bug 1099071
+-  jsterm.clearOutput();
+-  yield jsterm.execute("throw '';");
+-  yield checkResult((node) => {
+-    return node.closest(".message").getAttribute("severity") === "error" &&
+-      node.textContent === new Error("").toString();
+-  }, "thrown empty string generates error message");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("throw 'tomatoes';");
+-  yield checkResult((node) => {
+-    return node.closest(".message").getAttribute("severity") === "error" &&
+-      node.textContent === new Error("tomatoes").toString();
+-  }, "thrown non-empty string generates error message");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("throw { foo: 'bar' };");
+-  yield checkResult((node) => {
+-    return node.closest(".message").getAttribute("severity") === "error" &&
+-      node.textContent === Object.prototype.toString();
+-  }, "thrown object generates error message");
++  onMessage = waitForMessage(hud, "LI - LI");
++  jsterm.execute("$$('main > ul > li').map(el => el.tagName).join(' - ')");
++  message = await onMessage;
++  ok(message, "`$$` result can be used right away");
+ 
+-  // check that errors with entires in errordocs.js display links
+-  // alongside their messages.
+-  const ErrorDocs = require("devtools/server/actors/errordocs");
+-
+-  const ErrorDocStatements = {
+-    "JSMSG_BAD_RADIX": "(42).toString(0);",
+-    "JSMSG_BAD_ARRAY_LENGTH": "([]).length = -1",
+-    "JSMSG_NEGATIVE_REPETITION_COUNT": "'abc'.repeat(-1);",
+-    "JSMSG_PRECISION_RANGE": "77.1234.toExponential(-1);",
+-  };
+-
+-  for (let errorMessageName of Object.keys(ErrorDocStatements)) {
+-    let title = ErrorDocs.GetURL({ errorMessageName }).split("?")[0];
+-
+-    jsterm.clearOutput();
+-    yield jsterm.execute(ErrorDocStatements[errorMessageName]);
+-    yield checkResult((node) => {
+-      return node.parentNode.getElementsByTagName("a")[0].title == title;
+-    }, `error links to ${title}`);
+-  }
+-
+-  // Ensure that dom errors, with error numbers outside of the range
+-  // of valid js.msg errors, don't cause crashes (bug 1270721).
+-  yield jsterm.execute("new Request('',{redirect:'foo'})");
+-}
++  onMessage = waitForMessage(hud, "Array []");
++  jsterm.execute("$$('div')");
++  message = await onMessage;
++  ok(message, "`$$('div')` returns an empty array");
++});
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_jsterm.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_helper_dollar_x.js
+copy from devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_jsterm.js
+copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_helper_dollar_x.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_jsterm.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_helper_dollar_x.js
+@@ -1,194 +1,31 @@
+ /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+ /* Any copyright is dedicated to the Public Domain.
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+ "use strict";
+ 
+-const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
+-                 "test/test-console.html";
+-
+-var jsterm;
+-
+-add_task(function* () {
+-  yield loadTab(TEST_URI);
+-  let hud = yield openConsole();
+-  jsterm = hud.jsterm;
+-  yield testJSTerm(hud);
+-  jsterm = null;
+-});
+-
+-function checkResult(msg, desc) {
+-  let def = defer();
+-  waitForMessages({
+-    webconsole: jsterm.hud.owner,
+-    messages: [{
+-      name: desc,
+-      category: CATEGORY_OUTPUT,
+-    }],
+-  }).then(([result]) => {
+-    let node = [...result.matched][0].querySelector(".message-body");
+-    if (typeof msg == "string") {
+-      is(node.textContent.trim(), msg,
+-        "correct message shown for " + desc);
+-    } else if (typeof msg == "function") {
+-      ok(msg(node), "correct message shown for " + desc);
+-    }
+-
+-    def.resolve();
+-  });
+-  return def.promise;
+-}
+-
+-function* testJSTerm(hud) {
+-  const HELP_URL = "https://developer.mozilla.org/docs/Tools/" +
+-                   "Web_Console/Helpers";
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("$('#header').getAttribute('id')");
+-  yield checkResult('"header"', "$() worked");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("$$('h1').length");
+-  yield checkResult("1", "$$() worked");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("$x('.//*', document.body)[0] == $$('h1')[0]");
+-  yield checkResult("true", "$x() worked");
+-
+-  // no jsterm.clearOutput() here as we clear the output using the clear() fn.
+-  yield jsterm.execute("clear()");
+-
+-  yield waitForSuccess({
+-    name: "clear() worked",
+-    validator: function () {
+-      return jsterm.outputNode.childNodes.length == 0;
+-    }
+-  });
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("keys({b:1})[0] == 'b'");
+-  yield checkResult("true", "keys() worked", 1);
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("values({b:1})[0] == 1");
+-  yield checkResult("true", "values() worked", 1);
+-
+-  jsterm.clearOutput();
+-
+-  let openedLinks = 0;
+-  let oldOpenLink = hud.openLink;
+-  hud.openLink = (url) => {
+-    if (url == HELP_URL) {
+-      openedLinks++;
+-    }
+-  };
+-
+-  yield jsterm.execute("help()");
+-  yield jsterm.execute("help");
+-  yield jsterm.execute("?");
+-
+-  let output = jsterm.outputNode.querySelector(".message[category='output']");
+-  ok(!output, "no output for help() calls");
+-  is(openedLinks, 3, "correct number of pages opened by the help calls");
+-  hud.openLink = oldOpenLink;
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("pprint({b:2, a:1})");
+-  yield checkResult("\"  b: 2\n  a: 1\"", "pprint()");
++const TEST_URI = `data:text/html,
++<main>
++  <ul>
++    <li>First</li>
++    <li>Second</li>
++  </ul>
++  <aside>Sidebar</aside>
++</main>
++`;
+ 
+-  // check instanceof correctness, bug 599940
+-  jsterm.clearOutput();
+-  yield jsterm.execute("[] instanceof Array");
+-  yield checkResult("true", "[] instanceof Array == true");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("({}) instanceof Object");
+-  yield checkResult("true", "({}) instanceof Object == true");
+-
+-  // check for occurrences of Object XRayWrapper, bug 604430
+-  jsterm.clearOutput();
+-  yield jsterm.execute("document");
+-  yield checkResult(function (node) {
+-    return node.textContent.search(/\[object xraywrapper/i) == -1;
+-  }, "document - no XrayWrapper");
+-
+-  // check that pprint(window) and keys(window) don't throw, bug 608358
+-  jsterm.clearOutput();
+-  yield jsterm.execute("pprint(window)");
+-  yield checkResult(null, "pprint(window)");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("keys(window)");
+-  yield checkResult(null, "keys(window)");
+-
+-  // bug 614561
+-  jsterm.clearOutput();
+-  yield jsterm.execute("pprint('hi')");
+-  yield checkResult("\"  0: \"h\"\n  1: \"i\"\"", "pprint('hi')");
+-
+-  // check that pprint(function) shows function source, bug 618344
+-  jsterm.clearOutput();
+-  yield jsterm.execute("pprint(function() { var someCanaryValue = 42; })");
+-  yield checkResult(function (node) {
+-    return node.textContent.indexOf("someCanaryValue") > -1;
+-  }, "pprint(function) shows source");
+-
+-  // check that an evaluated null produces "null", bug 650780
+-  jsterm.clearOutput();
+-  yield jsterm.execute("null");
+-  yield checkResult("null", "null is null");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("undefined");
+-  yield checkResult("undefined", "undefined is printed");
++add_task(async function () {
++  const hud = await openNewTabAndConsole(TEST_URI);
++  const jsterm = hud.jsterm;
+ 
+-  // check that thrown strings produce error messages,
+-  // and the message text matches that of a stringified error object
+-  // bug 1099071
+-  jsterm.clearOutput();
+-  yield jsterm.execute("throw '';");
+-  yield checkResult((node) => {
+-    return node.closest(".message").getAttribute("severity") === "error" &&
+-      node.textContent === new Error("").toString();
+-  }, "thrown empty string generates error message");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("throw 'tomatoes';");
+-  yield checkResult((node) => {
+-    return node.closest(".message").getAttribute("severity") === "error" &&
+-      node.textContent === new Error("tomatoes").toString();
+-  }, "thrown non-empty string generates error message");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("throw { foo: 'bar' };");
+-  yield checkResult((node) => {
+-    return node.closest(".message").getAttribute("severity") === "error" &&
+-      node.textContent === Object.prototype.toString();
+-  }, "thrown object generates error message");
++  let onMessage = waitForMessage(hud, "Array [ li, li ]");
++  jsterm.execute("$x('.//li')");
++  let message = await onMessage;
++  ok(message, "`$x` worked");
+ 
+-  // check that errors with entires in errordocs.js display links
+-  // alongside their messages.
+-  const ErrorDocs = require("devtools/server/actors/errordocs");
+-
+-  const ErrorDocStatements = {
+-    "JSMSG_BAD_RADIX": "(42).toString(0);",
+-    "JSMSG_BAD_ARRAY_LENGTH": "([]).length = -1",
+-    "JSMSG_NEGATIVE_REPETITION_COUNT": "'abc'.repeat(-1);",
+-    "JSMSG_PRECISION_RANGE": "77.1234.toExponential(-1);",
+-  };
+-
+-  for (let errorMessageName of Object.keys(ErrorDocStatements)) {
+-    let title = ErrorDocs.GetURL({ errorMessageName }).split("?")[0];
+-
+-    jsterm.clearOutput();
+-    yield jsterm.execute(ErrorDocStatements[errorMessageName]);
+-    yield checkResult((node) => {
+-      return node.parentNode.getElementsByTagName("a")[0].title == title;
+-    }, `error links to ${title}`);
+-  }
+-
+-  // Ensure that dom errors, with error numbers outside of the range
+-  // of valid js.msg errors, don't cause crashes (bug 1270721).
+-  yield jsterm.execute("new Request('',{redirect:'foo'})");
+-}
++  onMessage = waitForMessage(hud, "<li>");
++  jsterm.execute("$x('.//li', document.body)[0]");
++  message = await onMessage;
++  ok(message, "`$x()` result can be used right away");
++});
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_jsterm.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_helper_help.js
+copy from devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_jsterm.js
+copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_helper_help.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_jsterm.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_helper_help.js
+@@ -1,194 +1,31 @@
+-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+-/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+ /* Any copyright is dedicated to the Public Domain.
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+ "use strict";
+ 
+-const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
+-                 "test/test-console.html";
+-
+-var jsterm;
+-
+-add_task(function* () {
+-  yield loadTab(TEST_URI);
+-  let hud = yield openConsole();
+-  jsterm = hud.jsterm;
+-  yield testJSTerm(hud);
+-  jsterm = null;
+-});
+-
+-function checkResult(msg, desc) {
+-  let def = defer();
+-  waitForMessages({
+-    webconsole: jsterm.hud.owner,
+-    messages: [{
+-      name: desc,
+-      category: CATEGORY_OUTPUT,
+-    }],
+-  }).then(([result]) => {
+-    let node = [...result.matched][0].querySelector(".message-body");
+-    if (typeof msg == "string") {
+-      is(node.textContent.trim(), msg,
+-        "correct message shown for " + desc);
+-    } else if (typeof msg == "function") {
+-      ok(msg(node), "correct message shown for " + desc);
+-    }
+-
+-    def.resolve();
+-  });
+-  return def.promise;
+-}
++const TEST_URI = "data:text/html,Test <code>help()</code> jsterm helper";
++const HELP_URL = "https://developer.mozilla.org/docs/Tools/Web_Console/Helpers";
+ 
+-function* testJSTerm(hud) {
+-  const HELP_URL = "https://developer.mozilla.org/docs/Tools/" +
+-                   "Web_Console/Helpers";
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("$('#header').getAttribute('id')");
+-  yield checkResult('"header"', "$() worked");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("$$('h1').length");
+-  yield checkResult("1", "$$() worked");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("$x('.//*', document.body)[0] == $$('h1')[0]");
+-  yield checkResult("true", "$x() worked");
+-
+-  // no jsterm.clearOutput() here as we clear the output using the clear() fn.
+-  yield jsterm.execute("clear()");
+-
+-  yield waitForSuccess({
+-    name: "clear() worked",
+-    validator: function () {
+-      return jsterm.outputNode.childNodes.length == 0;
+-    }
+-  });
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("keys({b:1})[0] == 'b'");
+-  yield checkResult("true", "keys() worked", 1);
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("values({b:1})[0] == 1");
+-  yield checkResult("true", "values() worked", 1);
+-
+-  jsterm.clearOutput();
++add_task(async function () {
++  const hud = await openNewTabAndConsole(TEST_URI);
++  const jsterm = hud.jsterm;
+ 
+   let openedLinks = 0;
+   let oldOpenLink = hud.openLink;
+   hud.openLink = (url) => {
+     if (url == HELP_URL) {
+       openedLinks++;
+     }
+   };
+ 
+-  yield jsterm.execute("help()");
+-  yield jsterm.execute("help");
+-  yield jsterm.execute("?");
++  jsterm.clearOutput();
++  await jsterm.execute("help()");
++  await jsterm.execute("help");
++  await jsterm.execute("?");
+ 
+-  let output = jsterm.outputNode.querySelector(".message[category='output']");
+-  ok(!output, "no output for help() calls");
++  let messages = Array.from(jsterm.outputNode.querySelectorAll(".message"));
++  ok(messages.every(msg => msg.classList.contains("command")),
++    "There is no results shown for the help commands");
+   is(openedLinks, 3, "correct number of pages opened by the help calls");
+   hud.openLink = oldOpenLink;
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("pprint({b:2, a:1})");
+-  yield checkResult("\"  b: 2\n  a: 1\"", "pprint()");
+-
+-  // check instanceof correctness, bug 599940
+-  jsterm.clearOutput();
+-  yield jsterm.execute("[] instanceof Array");
+-  yield checkResult("true", "[] instanceof Array == true");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("({}) instanceof Object");
+-  yield checkResult("true", "({}) instanceof Object == true");
+-
+-  // check for occurrences of Object XRayWrapper, bug 604430
+-  jsterm.clearOutput();
+-  yield jsterm.execute("document");
+-  yield checkResult(function (node) {
+-    return node.textContent.search(/\[object xraywrapper/i) == -1;
+-  }, "document - no XrayWrapper");
+-
+-  // check that pprint(window) and keys(window) don't throw, bug 608358
+-  jsterm.clearOutput();
+-  yield jsterm.execute("pprint(window)");
+-  yield checkResult(null, "pprint(window)");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("keys(window)");
+-  yield checkResult(null, "keys(window)");
+-
+-  // bug 614561
+-  jsterm.clearOutput();
+-  yield jsterm.execute("pprint('hi')");
+-  yield checkResult("\"  0: \"h\"\n  1: \"i\"\"", "pprint('hi')");
+-
+-  // check that pprint(function) shows function source, bug 618344
+-  jsterm.clearOutput();
+-  yield jsterm.execute("pprint(function() { var someCanaryValue = 42; })");
+-  yield checkResult(function (node) {
+-    return node.textContent.indexOf("someCanaryValue") > -1;
+-  }, "pprint(function) shows source");
+-
+-  // check that an evaluated null produces "null", bug 650780
+-  jsterm.clearOutput();
+-  yield jsterm.execute("null");
+-  yield checkResult("null", "null is null");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("undefined");
+-  yield checkResult("undefined", "undefined is printed");
+-
+-  // check that thrown strings produce error messages,
+-  // and the message text matches that of a stringified error object
+-  // bug 1099071
+-  jsterm.clearOutput();
+-  yield jsterm.execute("throw '';");
+-  yield checkResult((node) => {
+-    return node.closest(".message").getAttribute("severity") === "error" &&
+-      node.textContent === new Error("").toString();
+-  }, "thrown empty string generates error message");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("throw 'tomatoes';");
+-  yield checkResult((node) => {
+-    return node.closest(".message").getAttribute("severity") === "error" &&
+-      node.textContent === new Error("tomatoes").toString();
+-  }, "thrown non-empty string generates error message");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("throw { foo: 'bar' };");
+-  yield checkResult((node) => {
+-    return node.closest(".message").getAttribute("severity") === "error" &&
+-      node.textContent === Object.prototype.toString();
+-  }, "thrown object generates error message");
+-
+-  // check that errors with entires in errordocs.js display links
+-  // alongside their messages.
+-  const ErrorDocs = require("devtools/server/actors/errordocs");
+-
+-  const ErrorDocStatements = {
+-    "JSMSG_BAD_RADIX": "(42).toString(0);",
+-    "JSMSG_BAD_ARRAY_LENGTH": "([]).length = -1",
+-    "JSMSG_NEGATIVE_REPETITION_COUNT": "'abc'.repeat(-1);",
+-    "JSMSG_PRECISION_RANGE": "77.1234.toExponential(-1);",
+-  };
+-
+-  for (let errorMessageName of Object.keys(ErrorDocStatements)) {
+-    let title = ErrorDocs.GetURL({ errorMessageName }).split("?")[0];
+-
+-    jsterm.clearOutput();
+-    yield jsterm.execute(ErrorDocStatements[errorMessageName]);
+-    yield checkResult((node) => {
+-      return node.parentNode.getElementsByTagName("a")[0].title == title;
+-    }, `error links to ${title}`);
+-  }
+-
+-  // Ensure that dom errors, with error numbers outside of the range
+-  // of valid js.msg errors, don't cause crashes (bug 1270721).
+-  yield jsterm.execute("new Request('',{redirect:'foo'})");
+-}
++});
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_jsterm.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_helper_keys_values.js
+copy from devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_jsterm.js
+copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_helper_keys_values.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_jsterm.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_helper_keys_values.js
+@@ -1,194 +1,27 @@
+-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+-/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+ /* Any copyright is dedicated to the Public Domain.
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+ "use strict";
+ 
+-const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
+-                 "test/test-console.html";
+-
+-var jsterm;
+-
+-add_task(function* () {
+-  yield loadTab(TEST_URI);
+-  let hud = yield openConsole();
+-  jsterm = hud.jsterm;
+-  yield testJSTerm(hud);
+-  jsterm = null;
+-});
+-
+-function checkResult(msg, desc) {
+-  let def = defer();
+-  waitForMessages({
+-    webconsole: jsterm.hud.owner,
+-    messages: [{
+-      name: desc,
+-      category: CATEGORY_OUTPUT,
+-    }],
+-  }).then(([result]) => {
+-    let node = [...result.matched][0].querySelector(".message-body");
+-    if (typeof msg == "string") {
+-      is(node.textContent.trim(), msg,
+-        "correct message shown for " + desc);
+-    } else if (typeof msg == "function") {
+-      ok(msg(node), "correct message shown for " + desc);
+-    }
+-
+-    def.resolve();
+-  });
+-  return def.promise;
+-}
+-
+-function* testJSTerm(hud) {
+-  const HELP_URL = "https://developer.mozilla.org/docs/Tools/" +
+-                   "Web_Console/Helpers";
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("$('#header').getAttribute('id')");
+-  yield checkResult('"header"', "$() worked");
++const TEST_URI =
++  "data:text/html,Test <code>keys()</code> & <code>values()</code> jsterm helper";
+ 
+-  jsterm.clearOutput();
+-  yield jsterm.execute("$$('h1').length");
+-  yield checkResult("1", "$$() worked");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("$x('.//*', document.body)[0] == $$('h1')[0]");
+-  yield checkResult("true", "$x() worked");
+-
+-  // no jsterm.clearOutput() here as we clear the output using the clear() fn.
+-  yield jsterm.execute("clear()");
+-
+-  yield waitForSuccess({
+-    name: "clear() worked",
+-    validator: function () {
+-      return jsterm.outputNode.childNodes.length == 0;
+-    }
+-  });
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("keys({b:1})[0] == 'b'");
+-  yield checkResult("true", "keys() worked", 1);
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("values({b:1})[0] == 1");
+-  yield checkResult("true", "values() worked", 1);
+-
+-  jsterm.clearOutput();
+-
+-  let openedLinks = 0;
+-  let oldOpenLink = hud.openLink;
+-  hud.openLink = (url) => {
+-    if (url == HELP_URL) {
+-      openedLinks++;
+-    }
+-  };
+-
+-  yield jsterm.execute("help()");
+-  yield jsterm.execute("help");
+-  yield jsterm.execute("?");
+-
+-  let output = jsterm.outputNode.querySelector(".message[category='output']");
+-  ok(!output, "no output for help() calls");
+-  is(openedLinks, 3, "correct number of pages opened by the help calls");
+-  hud.openLink = oldOpenLink;
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("pprint({b:2, a:1})");
+-  yield checkResult("\"  b: 2\n  a: 1\"", "pprint()");
++add_task(async function () {
++  const hud = await openNewTabAndConsole(TEST_URI);
++  const jsterm = hud.jsterm;
+ 
+-  // check instanceof correctness, bug 599940
+-  jsterm.clearOutput();
+-  yield jsterm.execute("[] instanceof Array");
+-  yield checkResult("true", "[] instanceof Array == true");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("({}) instanceof Object");
+-  yield checkResult("true", "({}) instanceof Object == true");
+-
+-  // check for occurrences of Object XRayWrapper, bug 604430
+-  jsterm.clearOutput();
+-  yield jsterm.execute("document");
+-  yield checkResult(function (node) {
+-    return node.textContent.search(/\[object xraywrapper/i) == -1;
+-  }, "document - no XrayWrapper");
+-
+-  // check that pprint(window) and keys(window) don't throw, bug 608358
+-  jsterm.clearOutput();
+-  yield jsterm.execute("pprint(window)");
+-  yield checkResult(null, "pprint(window)");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("keys(window)");
+-  yield checkResult(null, "keys(window)");
+-
+-  // bug 614561
+-  jsterm.clearOutput();
+-  yield jsterm.execute("pprint('hi')");
+-  yield checkResult("\"  0: \"h\"\n  1: \"i\"\"", "pprint('hi')");
+-
+-  // check that pprint(function) shows function source, bug 618344
+-  jsterm.clearOutput();
+-  yield jsterm.execute("pprint(function() { var someCanaryValue = 42; })");
+-  yield checkResult(function (node) {
+-    return node.textContent.indexOf("someCanaryValue") > -1;
+-  }, "pprint(function) shows source");
+-
+-  // check that an evaluated null produces "null", bug 650780
+-  jsterm.clearOutput();
+-  yield jsterm.execute("null");
+-  yield checkResult("null", "null is null");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("undefined");
+-  yield checkResult("undefined", "undefined is printed");
++  let onMessage = waitForMessage(hud, `Array [ "a", "b" ]`);
++  jsterm.execute("keys({a: 2, b:1})");
++  let message = await onMessage;
++  ok(message, "`keys()` worked");
+ 
+-  // check that thrown strings produce error messages,
+-  // and the message text matches that of a stringified error object
+-  // bug 1099071
+-  jsterm.clearOutput();
+-  yield jsterm.execute("throw '';");
+-  yield checkResult((node) => {
+-    return node.closest(".message").getAttribute("severity") === "error" &&
+-      node.textContent === new Error("").toString();
+-  }, "thrown empty string generates error message");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("throw 'tomatoes';");
+-  yield checkResult((node) => {
+-    return node.closest(".message").getAttribute("severity") === "error" &&
+-      node.textContent === new Error("tomatoes").toString();
+-  }, "thrown non-empty string generates error message");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("throw { foo: 'bar' };");
+-  yield checkResult((node) => {
+-    return node.closest(".message").getAttribute("severity") === "error" &&
+-      node.textContent === Object.prototype.toString();
+-  }, "thrown object generates error message");
++  onMessage = waitForMessage(hud, "Array [ 2, 1 ]");
++  jsterm.execute("values({a: 2, b:1})");
++  message = await onMessage;
++  ok(message, "`values()` worked");
+ 
+-  // check that errors with entires in errordocs.js display links
+-  // alongside their messages.
+-  const ErrorDocs = require("devtools/server/actors/errordocs");
+-
+-  const ErrorDocStatements = {
+-    "JSMSG_BAD_RADIX": "(42).toString(0);",
+-    "JSMSG_BAD_ARRAY_LENGTH": "([]).length = -1",
+-    "JSMSG_NEGATIVE_REPETITION_COUNT": "'abc'.repeat(-1);",
+-    "JSMSG_PRECISION_RANGE": "77.1234.toExponential(-1);",
+-  };
+-
+-  for (let errorMessageName of Object.keys(ErrorDocStatements)) {
+-    let title = ErrorDocs.GetURL({ errorMessageName }).split("?")[0];
+-
+-    jsterm.clearOutput();
+-    yield jsterm.execute(ErrorDocStatements[errorMessageName]);
+-    yield checkResult((node) => {
+-      return node.parentNode.getElementsByTagName("a")[0].title == title;
+-    }, `error links to ${title}`);
+-  }
+-
+-  // Ensure that dom errors, with error numbers outside of the range
+-  // of valid js.msg errors, don't cause crashes (bug 1270721).
+-  yield jsterm.execute("new Request('',{redirect:'foo'})");
+-}
++  onMessage = waitForMessage(hud, "Array");
++  jsterm.execute("keys(window)");
++  message = await onMessage;
++  ok(message, "`keys(window)` worked");
++});
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_jsterm.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_helper_pprint.js
+copy from devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_jsterm.js
+copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_helper_pprint.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_jsterm.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_helper_pprint.js
+@@ -1,194 +1,34 @@
+-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+-/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+ /* Any copyright is dedicated to the Public Domain.
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+ "use strict";
+ 
+-const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
+-                 "test/test-console.html";
+-
+-var jsterm;
+-
+-add_task(function* () {
+-  yield loadTab(TEST_URI);
+-  let hud = yield openConsole();
+-  jsterm = hud.jsterm;
+-  yield testJSTerm(hud);
+-  jsterm = null;
+-});
+-
+-function checkResult(msg, desc) {
+-  let def = defer();
+-  waitForMessages({
+-    webconsole: jsterm.hud.owner,
+-    messages: [{
+-      name: desc,
+-      category: CATEGORY_OUTPUT,
+-    }],
+-  }).then(([result]) => {
+-    let node = [...result.matched][0].querySelector(".message-body");
+-    if (typeof msg == "string") {
+-      is(node.textContent.trim(), msg,
+-        "correct message shown for " + desc);
+-    } else if (typeof msg == "function") {
+-      ok(msg(node), "correct message shown for " + desc);
+-    }
+-
+-    def.resolve();
+-  });
+-  return def.promise;
+-}
+-
+-function* testJSTerm(hud) {
+-  const HELP_URL = "https://developer.mozilla.org/docs/Tools/" +
+-                   "Web_Console/Helpers";
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("$('#header').getAttribute('id')");
+-  yield checkResult('"header"', "$() worked");
++const TEST_URI = "data:text/html,Test <code>pprint()</code> jsterm helper";
+ 
+-  jsterm.clearOutput();
+-  yield jsterm.execute("$$('h1').length");
+-  yield checkResult("1", "$$() worked");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("$x('.//*', document.body)[0] == $$('h1')[0]");
+-  yield checkResult("true", "$x() worked");
+-
+-  // no jsterm.clearOutput() here as we clear the output using the clear() fn.
+-  yield jsterm.execute("clear()");
+-
+-  yield waitForSuccess({
+-    name: "clear() worked",
+-    validator: function () {
+-      return jsterm.outputNode.childNodes.length == 0;
+-    }
+-  });
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("keys({b:1})[0] == 'b'");
+-  yield checkResult("true", "keys() worked", 1);
++add_task(async function () {
++  const hud = await openNewTabAndConsole(TEST_URI);
++  const {jsterm} = hud;
+ 
+-  jsterm.clearOutput();
+-  yield jsterm.execute("values({b:1})[0] == 1");
+-  yield checkResult("true", "values() worked", 1);
+-
+-  jsterm.clearOutput();
+-
+-  let openedLinks = 0;
+-  let oldOpenLink = hud.openLink;
+-  hud.openLink = (url) => {
+-    if (url == HELP_URL) {
+-      openedLinks++;
+-    }
+-  };
+-
+-  yield jsterm.execute("help()");
+-  yield jsterm.execute("help");
+-  yield jsterm.execute("?");
+-
+-  let output = jsterm.outputNode.querySelector(".message[category='output']");
+-  ok(!output, "no output for help() calls");
+-  is(openedLinks, 3, "correct number of pages opened by the help calls");
+-  hud.openLink = oldOpenLink;
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("pprint({b:2, a:1})");
+-  yield checkResult("\"  b: 2\n  a: 1\"", "pprint()");
++  let onMessage = waitForMessage(hud, `"  b: 2\n  a: 1"`);
++  jsterm.execute("pprint({b:2, a:1})");
++  let message = await onMessage;
++  ok(message, "`pprint()` worked");
+ 
+-  // check instanceof correctness, bug 599940
+-  jsterm.clearOutput();
+-  yield jsterm.execute("[] instanceof Array");
+-  yield checkResult("true", "[] instanceof Array == true");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("({}) instanceof Object");
+-  yield checkResult("true", "({}) instanceof Object == true");
+-
+-  // check for occurrences of Object XRayWrapper, bug 604430
+-  jsterm.clearOutput();
+-  yield jsterm.execute("document");
+-  yield checkResult(function (node) {
+-    return node.textContent.search(/\[object xraywrapper/i) == -1;
+-  }, "document - no XrayWrapper");
+-
+-  // check that pprint(window) and keys(window) don't throw, bug 608358
+-  jsterm.clearOutput();
+-  yield jsterm.execute("pprint(window)");
+-  yield checkResult(null, "pprint(window)");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("keys(window)");
+-  yield checkResult(null, "keys(window)");
+-
+-  // bug 614561
+-  jsterm.clearOutput();
+-  yield jsterm.execute("pprint('hi')");
+-  yield checkResult("\"  0: \"h\"\n  1: \"i\"\"", "pprint('hi')");
+-
+-  // check that pprint(function) shows function source, bug 618344
+-  jsterm.clearOutput();
+-  yield jsterm.execute("pprint(function() { var someCanaryValue = 42; })");
+-  yield checkResult(function (node) {
+-    return node.textContent.indexOf("someCanaryValue") > -1;
+-  }, "pprint(function) shows source");
+-
+-  // check that an evaluated null produces "null", bug 650780
+-  jsterm.clearOutput();
+-  yield jsterm.execute("null");
+-  yield checkResult("null", "null is null");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("undefined");
+-  yield checkResult("undefined", "undefined is printed");
++  // check that pprint(window) does not throw (see Bug 608358).
++  onMessage = waitForMessage(hud, `window:`);
++  jsterm.execute("pprint(window)");
++  message = await onMessage;
++  ok(message, "`pprint(window)` worked");
+ 
+-  // check that thrown strings produce error messages,
+-  // and the message text matches that of a stringified error object
+-  // bug 1099071
+-  jsterm.clearOutput();
+-  yield jsterm.execute("throw '';");
+-  yield checkResult((node) => {
+-    return node.closest(".message").getAttribute("severity") === "error" &&
+-      node.textContent === new Error("").toString();
+-  }, "thrown empty string generates error message");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("throw 'tomatoes';");
+-  yield checkResult((node) => {
+-    return node.closest(".message").getAttribute("severity") === "error" &&
+-      node.textContent === new Error("tomatoes").toString();
+-  }, "thrown non-empty string generates error message");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("throw { foo: 'bar' };");
+-  yield checkResult((node) => {
+-    return node.closest(".message").getAttribute("severity") === "error" &&
+-      node.textContent === Object.prototype.toString();
+-  }, "thrown object generates error message");
++  // check that calling pprint with a string does not throw (See Bug 614561).
++  onMessage = waitForMessage(hud, `"  0: \\"h\\"\n  1: \\"i\\""`);
++  jsterm.execute("pprint('hi')");
++  message = await onMessage;
++  ok(message, "`pprint('hi')` worked");
+ 
+-  // check that errors with entires in errordocs.js display links
+-  // alongside their messages.
+-  const ErrorDocs = require("devtools/server/actors/errordocs");
+-
+-  const ErrorDocStatements = {
+-    "JSMSG_BAD_RADIX": "(42).toString(0);",
+-    "JSMSG_BAD_ARRAY_LENGTH": "([]).length = -1",
+-    "JSMSG_NEGATIVE_REPETITION_COUNT": "'abc'.repeat(-1);",
+-    "JSMSG_PRECISION_RANGE": "77.1234.toExponential(-1);",
+-  };
+-
+-  for (let errorMessageName of Object.keys(ErrorDocStatements)) {
+-    let title = ErrorDocs.GetURL({ errorMessageName }).split("?")[0];
+-
+-    jsterm.clearOutput();
+-    yield jsterm.execute(ErrorDocStatements[errorMessageName]);
+-    yield checkResult((node) => {
+-      return node.parentNode.getElementsByTagName("a")[0].title == title;
+-    }, `error links to ${title}`);
+-  }
+-
+-  // Ensure that dom errors, with error numbers outside of the range
+-  // of valid js.msg errors, don't cause crashes (bug 1270721).
+-  yield jsterm.execute("new Request('',{redirect:'foo'})");
+-}
++  // check that pprint(function) shows function source (See Bug 618344).
++  onMessage = waitForMessage(hud, `"function() { var someCanaryValue = 42; }`);
++  jsterm.execute("pprint(function() { var someCanaryValue = 42; })");
++  message = await onMessage;
++  ok(message, "`pprint(function)` shows function source");
++});
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_jsterm.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_instance_of.js
+copy from devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_jsterm.js
+copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_instance_of.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_jsterm.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_instance_of.js
+@@ -1,194 +1,27 @@
+-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+-/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+ /* Any copyright is dedicated to the Public Domain.
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+ "use strict";
+ 
+-const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
+-                 "test/test-console.html";
+-
+-var jsterm;
+-
+-add_task(function* () {
+-  yield loadTab(TEST_URI);
+-  let hud = yield openConsole();
+-  jsterm = hud.jsterm;
+-  yield testJSTerm(hud);
+-  jsterm = null;
+-});
+-
+-function checkResult(msg, desc) {
+-  let def = defer();
+-  waitForMessages({
+-    webconsole: jsterm.hud.owner,
+-    messages: [{
+-      name: desc,
+-      category: CATEGORY_OUTPUT,
+-    }],
+-  }).then(([result]) => {
+-    let node = [...result.matched][0].querySelector(".message-body");
+-    if (typeof msg == "string") {
+-      is(node.textContent.trim(), msg,
+-        "correct message shown for " + desc);
+-    } else if (typeof msg == "function") {
+-      ok(msg(node), "correct message shown for " + desc);
+-    }
+-
+-    def.resolve();
+-  });
+-  return def.promise;
+-}
+-
+-function* testJSTerm(hud) {
+-  const HELP_URL = "https://developer.mozilla.org/docs/Tools/" +
+-                   "Web_Console/Helpers";
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("$('#header').getAttribute('id')");
+-  yield checkResult('"header"', "$() worked");
++// Check instanceof correctness. See Bug 599940.
++const TEST_URI = "data:text/html,Test <code>instanceof</code> evaluation";
+ 
+-  jsterm.clearOutput();
+-  yield jsterm.execute("$$('h1').length");
+-  yield checkResult("1", "$$() worked");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("$x('.//*', document.body)[0] == $$('h1')[0]");
+-  yield checkResult("true", "$x() worked");
+-
+-  // no jsterm.clearOutput() here as we clear the output using the clear() fn.
+-  yield jsterm.execute("clear()");
+-
+-  yield waitForSuccess({
+-    name: "clear() worked",
+-    validator: function () {
+-      return jsterm.outputNode.childNodes.length == 0;
+-    }
+-  });
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("keys({b:1})[0] == 'b'");
+-  yield checkResult("true", "keys() worked", 1);
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("values({b:1})[0] == 1");
+-  yield checkResult("true", "values() worked", 1);
+-
+-  jsterm.clearOutput();
+-
+-  let openedLinks = 0;
+-  let oldOpenLink = hud.openLink;
+-  hud.openLink = (url) => {
+-    if (url == HELP_URL) {
+-      openedLinks++;
+-    }
+-  };
+-
+-  yield jsterm.execute("help()");
+-  yield jsterm.execute("help");
+-  yield jsterm.execute("?");
+-
+-  let output = jsterm.outputNode.querySelector(".message[category='output']");
+-  ok(!output, "no output for help() calls");
+-  is(openedLinks, 3, "correct number of pages opened by the help calls");
+-  hud.openLink = oldOpenLink;
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("pprint({b:2, a:1})");
+-  yield checkResult("\"  b: 2\n  a: 1\"", "pprint()");
++add_task(async function () {
++  const hud = await openNewTabAndConsole(TEST_URI);
++  const {jsterm} = hud;
+ 
+-  // check instanceof correctness, bug 599940
+-  jsterm.clearOutput();
+-  yield jsterm.execute("[] instanceof Array");
+-  yield checkResult("true", "[] instanceof Array == true");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("({}) instanceof Object");
+-  yield checkResult("true", "({}) instanceof Object == true");
+-
+-  // check for occurrences of Object XRayWrapper, bug 604430
+-  jsterm.clearOutput();
+-  yield jsterm.execute("document");
+-  yield checkResult(function (node) {
+-    return node.textContent.search(/\[object xraywrapper/i) == -1;
+-  }, "document - no XrayWrapper");
+-
+-  // check that pprint(window) and keys(window) don't throw, bug 608358
+-  jsterm.clearOutput();
+-  yield jsterm.execute("pprint(window)");
+-  yield checkResult(null, "pprint(window)");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("keys(window)");
+-  yield checkResult(null, "keys(window)");
+-
+-  // bug 614561
+-  jsterm.clearOutput();
+-  yield jsterm.execute("pprint('hi')");
+-  yield checkResult("\"  0: \"h\"\n  1: \"i\"\"", "pprint('hi')");
+-
+-  // check that pprint(function) shows function source, bug 618344
+-  jsterm.clearOutput();
+-  yield jsterm.execute("pprint(function() { var someCanaryValue = 42; })");
+-  yield checkResult(function (node) {
+-    return node.textContent.indexOf("someCanaryValue") > -1;
+-  }, "pprint(function) shows source");
+-
+-  // check that an evaluated null produces "null", bug 650780
+-  jsterm.clearOutput();
+-  yield jsterm.execute("null");
+-  yield checkResult("null", "null is null");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("undefined");
+-  yield checkResult("undefined", "undefined is printed");
++  let onMessage = waitForMessage(hud, "true");
++  jsterm.execute("[] instanceof Array");
++  let message = await onMessage;
++  ok(message, "`instanceof Array` is correct");
+ 
+-  // check that thrown strings produce error messages,
+-  // and the message text matches that of a stringified error object
+-  // bug 1099071
+-  jsterm.clearOutput();
+-  yield jsterm.execute("throw '';");
+-  yield checkResult((node) => {
+-    return node.closest(".message").getAttribute("severity") === "error" &&
+-      node.textContent === new Error("").toString();
+-  }, "thrown empty string generates error message");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("throw 'tomatoes';");
+-  yield checkResult((node) => {
+-    return node.closest(".message").getAttribute("severity") === "error" &&
+-      node.textContent === new Error("tomatoes").toString();
+-  }, "thrown non-empty string generates error message");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("throw { foo: 'bar' };");
+-  yield checkResult((node) => {
+-    return node.closest(".message").getAttribute("severity") === "error" &&
+-      node.textContent === Object.prototype.toString();
+-  }, "thrown object generates error message");
++  onMessage = waitForMessage(hud, "true");
++  jsterm.execute("({}) instanceof Object");
++  message = await onMessage;
++  ok(message, "`instanceof Object` is correct");
+ 
+-  // check that errors with entires in errordocs.js display links
+-  // alongside their messages.
+-  const ErrorDocs = require("devtools/server/actors/errordocs");
+-
+-  const ErrorDocStatements = {
+-    "JSMSG_BAD_RADIX": "(42).toString(0);",
+-    "JSMSG_BAD_ARRAY_LENGTH": "([]).length = -1",
+-    "JSMSG_NEGATIVE_REPETITION_COUNT": "'abc'.repeat(-1);",
+-    "JSMSG_PRECISION_RANGE": "77.1234.toExponential(-1);",
+-  };
+-
+-  for (let errorMessageName of Object.keys(ErrorDocStatements)) {
+-    let title = ErrorDocs.GetURL({ errorMessageName }).split("?")[0];
+-
+-    jsterm.clearOutput();
+-    yield jsterm.execute(ErrorDocStatements[errorMessageName]);
+-    yield checkResult((node) => {
+-      return node.parentNode.getElementsByTagName("a")[0].title == title;
+-    }, `error links to ${title}`);
+-  }
+-
+-  // Ensure that dom errors, with error numbers outside of the range
+-  // of valid js.msg errors, don't cause crashes (bug 1270721).
+-  yield jsterm.execute("new Request('',{redirect:'foo'})");
+-}
++  onMessage = waitForMessage(hud, "false");
++  jsterm.execute("({}) instanceof Array");
++  message = await onMessage;
++  ok(message, "`instanceof Array` has expected result");
++});
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_jsterm.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_null_undefined.js
+copy from devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_jsterm.js
+copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_null_undefined.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_jsterm.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_null_undefined.js
+@@ -1,194 +1,23 @@
+-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+-/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+ /* Any copyright is dedicated to the Public Domain.
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+ "use strict";
+ 
+-const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
+-                 "test/test-console.html";
+-
+-var jsterm;
+-
+-add_task(function* () {
+-  yield loadTab(TEST_URI);
+-  let hud = yield openConsole();
+-  jsterm = hud.jsterm;
+-  yield testJSTerm(hud);
+-  jsterm = null;
+-});
+-
+-function checkResult(msg, desc) {
+-  let def = defer();
+-  waitForMessages({
+-    webconsole: jsterm.hud.owner,
+-    messages: [{
+-      name: desc,
+-      category: CATEGORY_OUTPUT,
+-    }],
+-  }).then(([result]) => {
+-    let node = [...result.matched][0].querySelector(".message-body");
+-    if (typeof msg == "string") {
+-      is(node.textContent.trim(), msg,
+-        "correct message shown for " + desc);
+-    } else if (typeof msg == "function") {
+-      ok(msg(node), "correct message shown for " + desc);
+-    }
+-
+-    def.resolve();
+-  });
+-  return def.promise;
+-}
+-
+-function* testJSTerm(hud) {
+-  const HELP_URL = "https://developer.mozilla.org/docs/Tools/" +
+-                   "Web_Console/Helpers";
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("$('#header').getAttribute('id')");
+-  yield checkResult('"header"', "$() worked");
++const TEST_URI =
++  "data:text/html,Test evaluating null and undefined";
+ 
+-  jsterm.clearOutput();
+-  yield jsterm.execute("$$('h1').length");
+-  yield checkResult("1", "$$() worked");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("$x('.//*', document.body)[0] == $$('h1')[0]");
+-  yield checkResult("true", "$x() worked");
+-
+-  // no jsterm.clearOutput() here as we clear the output using the clear() fn.
+-  yield jsterm.execute("clear()");
+-
+-  yield waitForSuccess({
+-    name: "clear() worked",
+-    validator: function () {
+-      return jsterm.outputNode.childNodes.length == 0;
+-    }
+-  });
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("keys({b:1})[0] == 'b'");
+-  yield checkResult("true", "keys() worked", 1);
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("values({b:1})[0] == 1");
+-  yield checkResult("true", "values() worked", 1);
+-
+-  jsterm.clearOutput();
+-
+-  let openedLinks = 0;
+-  let oldOpenLink = hud.openLink;
+-  hud.openLink = (url) => {
+-    if (url == HELP_URL) {
+-      openedLinks++;
+-    }
+-  };
+-
+-  yield jsterm.execute("help()");
+-  yield jsterm.execute("help");
+-  yield jsterm.execute("?");
+-
+-  let output = jsterm.outputNode.querySelector(".message[category='output']");
+-  ok(!output, "no output for help() calls");
+-  is(openedLinks, 3, "correct number of pages opened by the help calls");
+-  hud.openLink = oldOpenLink;
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("pprint({b:2, a:1})");
+-  yield checkResult("\"  b: 2\n  a: 1\"", "pprint()");
++add_task(async function () {
++  const hud = await openNewTabAndConsole(TEST_URI);
++  const jsterm = hud.jsterm;
+ 
+-  // check instanceof correctness, bug 599940
+-  jsterm.clearOutput();
+-  yield jsterm.execute("[] instanceof Array");
+-  yield checkResult("true", "[] instanceof Array == true");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("({}) instanceof Object");
+-  yield checkResult("true", "({}) instanceof Object == true");
+-
+-  // check for occurrences of Object XRayWrapper, bug 604430
+-  jsterm.clearOutput();
+-  yield jsterm.execute("document");
+-  yield checkResult(function (node) {
+-    return node.textContent.search(/\[object xraywrapper/i) == -1;
+-  }, "document - no XrayWrapper");
+-
+-  // check that pprint(window) and keys(window) don't throw, bug 608358
+-  jsterm.clearOutput();
+-  yield jsterm.execute("pprint(window)");
+-  yield checkResult(null, "pprint(window)");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("keys(window)");
+-  yield checkResult(null, "keys(window)");
+-
+-  // bug 614561
+-  jsterm.clearOutput();
+-  yield jsterm.execute("pprint('hi')");
+-  yield checkResult("\"  0: \"h\"\n  1: \"i\"\"", "pprint('hi')");
+-
+-  // check that pprint(function) shows function source, bug 618344
+-  jsterm.clearOutput();
+-  yield jsterm.execute("pprint(function() { var someCanaryValue = 42; })");
+-  yield checkResult(function (node) {
+-    return node.textContent.indexOf("someCanaryValue") > -1;
+-  }, "pprint(function) shows source");
+-
+-  // check that an evaluated null produces "null", bug 650780
+-  jsterm.clearOutput();
+-  yield jsterm.execute("null");
+-  yield checkResult("null", "null is null");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("undefined");
+-  yield checkResult("undefined", "undefined is printed");
++  // Check that an evaluated null produces "null". See Bug 650780.
++  let onMessage = waitForMessage(hud, `null`);
++  jsterm.execute("null");
++  let message = await onMessage;
++  ok(message, "`null` returned the expected value");
+ 
+-  // check that thrown strings produce error messages,
+-  // and the message text matches that of a stringified error object
+-  // bug 1099071
+-  jsterm.clearOutput();
+-  yield jsterm.execute("throw '';");
+-  yield checkResult((node) => {
+-    return node.closest(".message").getAttribute("severity") === "error" &&
+-      node.textContent === new Error("").toString();
+-  }, "thrown empty string generates error message");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("throw 'tomatoes';");
+-  yield checkResult((node) => {
+-    return node.closest(".message").getAttribute("severity") === "error" &&
+-      node.textContent === new Error("tomatoes").toString();
+-  }, "thrown non-empty string generates error message");
+-
+-  jsterm.clearOutput();
+-  yield jsterm.execute("throw { foo: 'bar' };");
+-  yield checkResult((node) => {
+-    return node.closest(".message").getAttribute("severity") === "error" &&
+-      node.textContent === Object.prototype.toString();
+-  }, "thrown object generates error message");
+-
+-  // check that errors with entires in errordocs.js display links
+-  // alongside their messages.
+-  const ErrorDocs = require("devtools/server/actors/errordocs");
+-
+-  const ErrorDocStatements = {
+-    "JSMSG_BAD_RADIX": "(42).toString(0);",
+-    "JSMSG_BAD_ARRAY_LENGTH": "([]).length = -1",
+-    "JSMSG_NEGATIVE_REPETITION_COUNT": "'abc'.repeat(-1);",
+-    "JSMSG_PRECISION_RANGE": "77.1234.toExponential(-1);",
+-  };
+-
+-  for (let errorMessageName of Object.keys(ErrorDocStatements)) {
+-    let title = ErrorDocs.GetURL({ errorMessageName }).split("?")[0];
+-
+-    jsterm.clearOutput();
+-    yield jsterm.execute(ErrorDocStatements[errorMessageName]);
+-    yield checkResult((node) => {
+-      return node.parentNode.getElementsByTagName("a")[0].title == title;
+-    }, `error links to ${title}`);
+-  }
+-
+-  // Ensure that dom errors, with error numbers outside of the range
+-  // of valid js.msg errors, don't cause crashes (bug 1270721).
+-  yield jsterm.execute("new Request('',{redirect:'foo'})");
+-}
++  onMessage = waitForMessage(hud, "undefined");
++  jsterm.execute("undefined");
++  message = await onMessage;
++  ok(message, "`undefined` returned the expected value");
++});

+ 283 - 0
mozilla-release/patches/1405636-59a1.patch

@@ -0,0 +1,283 @@
+# HG changeset patch
+# User Julian Descottes <jdescottes@mozilla.com>
+# Date 1515487710 -3600
+# Node ID 5f6417128acb05b280c3c59a611e605458214dfd
+# Parent  0effc64f1fe302e32c4dd748365df5ba0d3942d8
+Bug 1405636 - enable and rename browser_webconsole_netlogging_reset_filter.js;r=Honza
+
+MozReview-Commit-ID: IcFW6itKo7I
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -317,24 +317,23 @@ skip-if = true #       Bug 1403448
+ skip-if = true #       Bug 1403448
+ [browser_webconsole_message_categories.js]
+ skip-if = true #       Bug 1404384
+ # old console skip-if = e10s # Bug 1042253 - webconsole tests disabled with e10s
+ [browser_webconsole_mixedcontent.js]
+ tags = mcb
+ skip-if = true #       Bug 1404886
+ [browser_webconsole_multiple_windows_and_tabs.js]
+-[browser_webconsole_netlogging_reset_filter.js]
+-skip-if = true #       Bug 1405636
+ [browser_webconsole_network_attach.js]
+ [browser_webconsole_network_exceptions.js]
+ [browser_webconsole_network_messages_expand.js]
+ [browser_webconsole_network_messages_openinnet.js]
+ [browser_webconsole_network_messages_status_code.js]
+ [browser_webconsole_network_requests_from_chrome.js]
++[browser_webconsole_network_reset_filter.js]
+ [browser_webconsole_nodes_highlight.js]
+ [browser_webconsole_nodes_select.js]
+ [browser_webconsole_notifications.js]
+ skip-if = true #       Bug 1405637
+ [browser_webconsole_object_in_sidebar.js]
+ [browser_webconsole_object_inspector.js]
+ [browser_webconsole_object_inspector_entries.js]
+ [browser_webconsole_observer_notifications.js]
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_network_messages_openinnet.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_network_messages_openinnet.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_network_messages_openinnet.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_network_messages_openinnet.js
+@@ -26,53 +26,22 @@ add_task(async function task() {
+   const currentTab = gBrowser.selectedTab;
+   let target = TargetFactory.forTab(currentTab);
+   let toolbox = gDevTools.getToolbox(target);
+ 
+   const documentUrl = TEST_PATH + TEST_FILE;
+   await loadDocument(documentUrl);
+   info("Document loaded.");
+ 
+-  await testNetmonitorLink(toolbox, hud, documentUrl);
++  await openMessageInNetmonitor(toolbox, hud, documentUrl);
+ 
+   // Go back to console.
+   await toolbox.selectTool("webconsole");
+   info("console panel open again.");
+ 
+   // Fire an XHR request.
+   await ContentTask.spawn(gBrowser.selectedBrowser, null, function () {
+     content.wrappedJSObject.testXhrGet();
+   });
+ 
+   const jsonUrl = TEST_PATH + JSON_TEST_URL;
+-  await testNetmonitorLink(toolbox, hud, jsonUrl);
++  await openMessageInNetmonitor(toolbox, hud, jsonUrl);
+ });
+-
+-async function testNetmonitorLink(toolbox, hud, url) {
+-  let messageNode = await waitFor(() => findMessage(hud, url));
+-  info("Network message found.");
+-
+-  let onNetmonitorSelected = toolbox.once("netmonitor-selected", (event, panel) => {
+-    return panel;
+-  });
+-
+-  let menuPopup = await openContextMenu(hud, messageNode);
+-  let openInNetMenuItem = menuPopup.querySelector("#console-menu-open-in-network-panel");
+-  ok(openInNetMenuItem, "open in network panel item is enabled");
+-  openInNetMenuItem.click();
+-
+-  const {panelWin} = await onNetmonitorSelected;
+-  ok(true, "The netmonitor panel is selected when clicking on the network message");
+-
+-  let { store, windowRequire } = panelWin;
+-  let actions = windowRequire("devtools/client/netmonitor/src/actions/index");
+-  let { getSelectedRequest } =
+-    windowRequire("devtools/client/netmonitor/src/selectors/index");
+-
+-  store.dispatch(actions.batchEnable(false));
+-
+-  await waitUntil(() => {
+-    const selected = getSelectedRequest(store.getState());
+-    return selected && selected.url === url;
+-  });
+-
+-  ok(true, "The attached url is correct.");
+-}
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_netlogging_reset_filter.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_network_reset_filter.js
+rename from devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_netlogging_reset_filter.js
+rename to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_network_reset_filter.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_netlogging_reset_filter.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_network_reset_filter.js
+@@ -3,95 +3,53 @@
+ /* Any copyright is dedicated to the Public Domain.
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+ // Tests that network log messages bring up the network panel and select the
+ // right request even if it was previously filtered off.
+ 
+ "use strict";
+ 
+-const TEST_FILE_URI =
+-  "http://example.com/browser/devtools/client/webconsole/test/" +
+-  "test-network.html";
++const TEST_PATH = "http://example.com/browser/devtools/client/webconsole/" +
++                  "new-console-output/test/mochitest/";
+ const TEST_URI = "data:text/html;charset=utf8,<p>test file URI";
+ 
+-var hud;
++add_task(async function () {
++  await pushPref("devtools.webconsole.filter.net", true);
+ 
+-add_task(function* () {
+-  let requests = [];
+-  let { browser } = yield loadTab(TEST_URI);
++  let toolbox = await openNewTabAndToolbox(TEST_URI, "webconsole");
++  let hud = toolbox.getCurrentPanel().hud;
+ 
+-  yield pushPrefEnv();
+-  hud = yield openConsole();
+-  hud.jsterm.clearOutput();
+-
+-  HUDService.lastFinishedRequest.callback = request => requests.push(request);
++  let onMessages = waitForMessages({
++    hud,
++    messages: [
++      { text: "running network console logging tests" },
++      { text: "test-network.html" },
++      { text: "testscript.js" }
++    ],
++  });
+ 
+-  let loaded = loadBrowser(browser);
+-  BrowserTestUtils.loadURI(gBrowser.selectedBrowser, TEST_FILE_URI);
+-  yield loaded;
++  info("Wait for document to load");
++  await loadDocument(TEST_PATH + "test-network.html");
++
++  info("Wait for expected messages to appear");
++  await onMessages;
+ 
+-  yield testMessages();
+-  let htmlRequest = requests.find(e => e.request.url.endsWith("html"));
+-  ok(htmlRequest, "htmlRequest was a html");
++  let url = TEST_PATH + "testscript.js?foo";
++  // The url as it appears in the webconsole, without the GET parameters
++  let shortUrl = TEST_PATH + "testscript.js";
+ 
+-  yield hud.ui.openNetworkPanel(htmlRequest.actor);
+-  let toolbox = gDevTools.getToolbox(hud.target);
+-  is(toolbox.currentToolId, "netmonitor", "Network panel was opened");
++  info("Open the testscript.js request in the network monitor");
++  await openMessageInNetmonitor(toolbox, hud, url, shortUrl);
+ 
++  info("Filter out the current request");
+   let panel = toolbox.getCurrentPanel();
+   let { store, windowRequire } = panel.panelWin;
+   let Actions = windowRequire("devtools/client/netmonitor/src/actions/index");
+-  let { getSelectedRequest } = windowRequire("devtools/client/netmonitor/src/selectors/index");
+-
+-  let selected = getSelectedRequest(store.getState());
+-  is(selected.method, htmlRequest.request.method,
+-     "The correct request is selected");
+-  is(selected.url, htmlRequest.request.url,
+-     "The correct request is definitely selected");
+-
+-  // Filter out the HTML request.
+   store.dispatch(Actions.toggleRequestFilterType("js"));
+ 
+-  yield toolbox.selectTool("webconsole");
++  info("Select back the webconsole");
++  await toolbox.selectTool("webconsole");
+   is(toolbox.currentToolId, "webconsole", "Web console was selected");
+-  yield hud.ui.openNetworkPanel(htmlRequest.actor);
+-
+-  selected = getSelectedRequest(store.getState());
+-  is(selected.method, htmlRequest.request.method,
+-     "The correct request is selected");
+-  is(selected.url, htmlRequest.request.url,
+-     "The correct request is definitely selected");
+-
+-  // All tests are done. Shutdown.
+-  HUDService.lastFinishedRequest.callback = null;
+-  htmlRequest = browser = requests = hud = null;
+-});
+ 
+-function testMessages() {
+-  return waitForMessages({
+-    webconsole: hud,
+-    messages: [{
+-      text: "running network console logging tests",
+-      category: CATEGORY_WEBDEV,
+-      severity: SEVERITY_LOG,
+-    },
+-    {
+-      text: "test-network.html",
+-      category: CATEGORY_NETWORK,
+-      severity: SEVERITY_LOG,
+-    },
+-    {
+-      text: "testscript.js",
+-      category: CATEGORY_NETWORK,
+-      severity: SEVERITY_LOG,
+-    }],
+-  });
+-}
+-
+-function pushPrefEnv() {
+-  let deferred = defer();
+-  let options = {
+-    set: [["devtools.webconsole.filter.networkinfo", true]]
+-  };
+-  SpecialPowers.pushPrefEnv(options, deferred.resolve);
+-  return deferred.promise;
+-}
++  info("Open the testscript.js request again in the network monitor");
++  await openMessageInNetmonitor(toolbox, hud, url, shortUrl);
++});
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/head.js b/devtools/client/webconsole/new-console-output/test/mochitest/head.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/head.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/head.js
+@@ -484,8 +484,51 @@ function openNewBrowserWindow() {
+     Services.obs.addObserver(function observer(subject, topic) {
+       if (win == subject) {
+         Services.obs.removeObserver(observer, topic);
+         resolve(win);
+       }
+     }, "browser-delayed-startup-finished");
+   });
+ }
++
++/**
++ * Open a network request logged in the webconsole in the netmonitor panel.
++ *
++ * @param {Object} toolbox
++ * @param {Object} hud
++ * @param {String} url
++ *        URL of the request as logged in the netmonitor.
++ * @param {String} urlInConsole
++ *        (optional) Use if the logged URL in webconsole is different from the real URL.
++ */
++async function openMessageInNetmonitor(toolbox, hud, url, urlInConsole) {
++  // By default urlInConsole should be the same as the complete url.
++  urlInConsole = urlInConsole || url;
++
++  let message = await waitFor(() => findMessage(hud, urlInConsole));
++
++  let onNetmonitorSelected = toolbox.once("netmonitor-selected", (event, panel) => {
++    return panel;
++  });
++
++  let menuPopup = await openContextMenu(hud, message);
++  let openInNetMenuItem = menuPopup.querySelector("#console-menu-open-in-network-panel");
++  ok(openInNetMenuItem, "open in network panel item is enabled");
++  openInNetMenuItem.click();
++
++  const {panelWin} = await onNetmonitorSelected;
++  ok(true, "The netmonitor panel is selected when clicking on the network message");
++
++  let { store, windowRequire } = panelWin;
++  let actions = windowRequire("devtools/client/netmonitor/src/actions/index");
++  let { getSelectedRequest } =
++    windowRequire("devtools/client/netmonitor/src/selectors/index");
++
++  store.dispatch(actions.batchEnable(false));
++
++  await waitUntil(() => {
++    const selected = getSelectedRequest(store.getState());
++    return selected && selected.url === url;
++  });
++
++  ok(true, "The attached url is correct.");
++}

+ 143 - 0
mozilla-release/patches/1405637-59a1.patch

@@ -0,0 +1,143 @@
+# HG changeset patch
+# User Julian Descottes <jdescottes@mozilla.com>
+# Date 1516183592 -3600
+# Node ID 680f59bf29d1fb284e5cb87dfe6fa84a41d0c749
+# Parent  ff4e6b18051adf9bd70d49d8444cb4a2687f66ea
+Bug 1405637 - Remove duplicated test browser_webconsole_notifications;r=nchevobbe
+
+Test was already migrated in Bug 1304003 to browser_webconsole_observer_notifications.js.
+
+MozReview-Commit-ID: DyfVJ49ksSd
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -326,18 +326,16 @@ skip-if = true #       Bug 1404886
+ [browser_webconsole_network_exceptions.js]
+ [browser_webconsole_network_messages_expand.js]
+ [browser_webconsole_network_messages_openinnet.js]
+ [browser_webconsole_network_messages_status_code.js]
+ [browser_webconsole_network_requests_from_chrome.js]
+ [browser_webconsole_network_reset_filter.js]
+ [browser_webconsole_nodes_highlight.js]
+ [browser_webconsole_nodes_select.js]
+-[browser_webconsole_notifications.js]
+-skip-if = true #       Bug 1405637
+ [browser_webconsole_object_in_sidebar.js]
+ [browser_webconsole_object_inspector.js]
+ [browser_webconsole_object_inspector_entries.js]
+ [browser_webconsole_observer_notifications.js]
+ [browser_webconsole_optimized_out_vars.js]
+ [browser_webconsole_output_copy.js]
+ subsuite = clipboard
+ skip-if = true #       Bug 1404364
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_notifications.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_notifications.js
+deleted file mode 100644
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_notifications.js
++++ /dev/null
+@@ -1,77 +0,0 @@
+-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+-/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+-/* Any copyright is dedicated to the Public Domain.
+- * http://creativecommons.org/publicdomain/zero/1.0/ */
+-
+-"use strict";
+-
+-const TEST_URI = "data:text/html;charset=utf-8,<p>Web Console test for " +
+-                 "notifications";
+-
+-add_task(function* () {
+-  yield loadTab(TEST_URI);
+-
+-  let consoleOpened = defer();
+-  let gotEvents = waitForEvents(consoleOpened.promise);
+-  yield openConsole().then(() => {
+-    consoleOpened.resolve();
+-  });
+-
+-  yield gotEvents;
+-});
+-
+-function waitForEvents(onConsoleOpened) {
+-  let deferred = defer();
+-
+-  function webConsoleCreated(id) {
+-    Services.obs.removeObserver(observer, "web-console-created");
+-    ok(HUDService.getHudReferenceById(id), "We have a hud reference");
+-    content.wrappedJSObject.console.log("adding a log message");
+-  }
+-
+-  function webConsoleDestroyed(id) {
+-    Services.obs.removeObserver(observer, "web-console-destroyed");
+-    ok(!HUDService.getHudReferenceById(id), "We do not have a hud reference");
+-    executeSoon(deferred.resolve);
+-  }
+-
+-  function webConsoleMessage(id, nodeID) {
+-    Services.obs.removeObserver(observer, "web-console-message-created");
+-    ok(id, "we have a console ID");
+-    is(typeof nodeID, "string", "message node id is a string");
+-    onConsoleOpened.then(closeConsole);
+-  }
+-
+-  let observer = {
+-
+-    QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver]),
+-
+-    observe: function observe(subject, topic, data) {
+-      subject = subject.QueryInterface(Ci.nsISupportsString);
+-
+-      switch (topic) {
+-        case "web-console-created":
+-          webConsoleCreated(subject.data);
+-          break;
+-        case "web-console-destroyed":
+-          webConsoleDestroyed(subject.data);
+-          break;
+-        case "web-console-message-created":
+-          webConsoleMessage(subject, data);
+-          break;
+-        default:
+-          break;
+-      }
+-    },
+-
+-    init: function init() {
+-      Services.obs.addObserver(this, "web-console-created");
+-      Services.obs.addObserver(this, "web-console-destroyed");
+-      Services.obs.addObserver(this, "web-console-message-created");
+-    }
+-  };
+-
+-  observer.init();
+-
+-  return deferred.promise;
+-}
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_observer_notifications.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_observer_notifications.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_observer_notifications.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_observer_notifications.js
+@@ -1,22 +1,22 @@
+ /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+ /* Any copyright is dedicated to the Public Domain.
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+ "use strict";
+ 
+ const TEST_URI = "data:text/html;charset=utf-8,<p>Web Console test for " +
+-                 "obeserver notifications";
++                 "observer notifications";
+ 
+ let created = false;
+ let destroyed = false;
+ 
+-add_task(async function() {
++add_task(async function () {
+   setupObserver();
+   await openNewTabAndConsole(TEST_URI);
+   await waitFor(() => created);
+ 
+   await closeTabAndToolbox(gBrowser.selectedTab);
+   await waitFor(() => destroyed);
+ });
+ 

+ 133 - 0
mozilla-release/patches/1405641-60a1.patch

@@ -0,0 +1,133 @@
+# HG changeset patch
+# User Nicolas Chevobbe <nchevobbe@mozilla.com>
+# Date 1518196168 -3600
+# Node ID 84ef4e4f8804ebf928e22eb84a54b7454b8387f1
+# Parent  61294be866e753c76194c8b49917fbb18bda5c8d
+Bug 1405641 - Enable browser_webconsole_output_copy_newlines.js in new console frontend; r=jdescottes.
+
+MozReview-Commit-ID: 8KtpDUXpuj7
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -319,18 +319,16 @@ skip-if = true #       Bug 1403448
+ [browser_webconsole_object_inspector.js]
+ [browser_webconsole_object_inspector_entries.js]
+ [browser_webconsole_observer_notifications.js]
+ [browser_webconsole_optimized_out_vars.js]
+ [browser_webconsole_output_copy.js]
+ subsuite = clipboard
+ [browser_webconsole_output_copy_newlines.js]
+ subsuite = clipboard
+-skip-if = true #       Bug 1405641
+-# old console skip-if = (os == 'linux' && bits == 32 && debug) # bug 1328915, disable linux32 debug devtools for timeouts
+ [browser_webconsole_output_order.js]
+ [browser_webconsole_persist.js]
+ [browser_webconsole_prune_scroll.js]
+ skip-if = true #       Bug 1404832
+ [browser_webconsole_reopen_closed_tab.js]
+ [browser_webconsole_repeat_different_objects.js]
+ [browser_webconsole_repeated_messages_accuracy.js]
+ skip-if = true #       Bug 1403450
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_output_copy_newlines.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_output_copy_newlines.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_output_copy_newlines.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_output_copy_newlines.js
+@@ -1,72 +1,42 @@
+ /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+ /* Any copyright is dedicated to the Public Domain.
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+-// Test that multiple messages are copied into the clipboard and that they are
+-// separated by new lines. See bug 916997.
+-
+ "use strict";
+ 
+-add_task(function* () {
+-  const TEST_URI = "data:text/html;charset=utf8,<p>hello world, bug 916997";
+-  let clipboardValue = "";
++// Test that multiple messages are copied into the clipboard and that they are
++// separated by new lines. See bug 916997.
++const TEST_URI = "data:text/html,<meta charset=utf8>" +
++  "Test copy multiple messages to clipboard";
+ 
+-  yield loadTab(TEST_URI);
+-  let hud = yield openConsole();
+-  hud.jsterm.clearOutput();
+-
+-  let controller = top.document.commandDispatcher
+-                   .getControllerForCommand("cmd_copy");
+-  is(controller.isCommandEnabled("cmd_copy"), false, "cmd_copy is disabled");
+-
+-  content.console.log("Hello world! bug916997a");
+-  content.console.log("Hello world 2! bug916997b");
++add_task(async function () {
++  let hud = await openNewTabAndConsole(TEST_URI);
+ 
+-  yield waitForMessages({
+-    webconsole: hud,
+-    messages: [{
+-      text: "Hello world! bug916997a",
+-      category: CATEGORY_WEBDEV,
+-      severity: SEVERITY_LOG,
+-    }, {
+-      text: "Hello world 2! bug916997b",
+-      category: CATEGORY_WEBDEV,
+-      severity: SEVERITY_LOG,
+-    }],
++  const messages = Array.from({length: 10}, (_, i) => `Message number ${i + 1}`);
++  const lastMessage = [...messages].pop();
++  let onMessage = waitForMessage(hud, lastMessage);
++  ContentTask.spawn(gBrowser.selectedBrowser, messages, msgs => {
++    msgs.forEach(msg => content.wrappedJSObject.console.log(msg));
+   });
++  const {node} = await onMessage;
++  ok(node, "Messages were logged");
+ 
+-  hud.ui.output.selectAllMessages();
+-  hud.outputNode.focus();
+-
+-  goUpdateCommand("cmd_copy");
+-  controller = top.document.commandDispatcher
+-               .getControllerForCommand("cmd_copy");
+-  is(controller.isCommandEnabled("cmd_copy"), true, "cmd_copy is enabled");
++  // Select the whole output.
++  const output = node.closest(".webconsole-output");
++  const selection = node.ownerDocument.getSelection();
++  const range = document.createRange();
++  range.selectNodeContents(output);
++  selection.removeAllRanges();
++  selection.addRange(range);
+ 
+-  let selection = hud.iframeWindow.getSelection() + "";
+-  info("selection '" + selection + "'");
+-
+-  waitForClipboard((str) => {
+-    clipboardValue = str;
+-    return str.indexOf("bug916997a") > -1 && str.indexOf("bug916997b") > -1;
+-  },
++  info("Wait for the clipboard to contain the text corresponding to all the messages");
++  await waitForClipboardPromise(
+     () => {
++      // The focus is on the JsTerm, so we need to blur it for the copy comand to work.
++      output.ownerDocument.activeElement.blur();
+       goDoCommand("cmd_copy");
+     },
+-    () => {
+-      info("clipboard value '" + clipboardValue + "'");
+-      let lines = clipboardValue.trim().split("\n");
+-      is(hud.outputNode.children.length, 2, "number of messages");
+-      is(lines.length, hud.outputNode.children.length, "number of lines");
+-      isnot(lines[0].indexOf("bug916997a"), -1,
+-            "first message text includes 'bug916997a'");
+-      isnot(lines[1].indexOf("bug916997b"), -1,
+-            "second message text includes 'bug916997b'");
+-      is(lines[0].indexOf("bug916997b"), -1,
+-         "first message text does not include 'bug916997b'");
+-    },
+-    () => {
+-      info("last clipboard value: '" + clipboardValue + "'");
+-    });
++    data => data.trim() === messages.join("\n")
++  );
+ });

+ 224 - 0
mozilla-release/patches/1405647-60a1.patch

@@ -0,0 +1,224 @@
+# HG changeset patch
+# User Julian Descottes <jdescottes@mozilla.com>
+# Date 1518194959 -3600
+# Node ID cd43c8ae2714ba863156c3c502a4cd0d75943370
+# Parent  13a03060f72cefcee5bb9e390b26ea10958fe129
+Bug 1405647 - enable browser_webconsole_split_escape_key.js;r=Honza
+
+MozReview-Commit-ID: 2p5VNzKhwo2
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -339,17 +339,16 @@ subsuite = clipboard
+ [browser_webconsole_show_subresource_security_errors.js]
+ [browser_webconsole_shows_reqs_in_netmonitor.js]
+ [browser_webconsole_sourcemap_css.js]
+ [browser_webconsole_sourcemap_error.js]
+ [browser_webconsole_sourcemap_invalid.js]
+ [browser_webconsole_sourcemap_nosource.js]
+ [browser_webconsole_split.js]
+ [browser_webconsole_split_escape_key.js]
+-skip-if = true #       Bug 1405647
+ [browser_webconsole_split_focus.js]
+ skip-if = true #       Bug 1405648
+ [browser_webconsole_split_persist.js]
+ skip-if = true #       Bug 1405649
+ [browser_webconsole_stacktrace_location_debugger_link.js]
+ [browser_webconsole_stacktrace_location_scratchpad_link.js]
+ [browser_webconsole_strict_mode_errors.js]
+ [browser_webconsole_string.js]
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_split_escape_key.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_split_escape_key.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_split_escape_key.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_split_escape_key.js
+@@ -1,158 +1,49 @@
+ /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+ /* Any copyright is dedicated to the Public Domain.
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+- "use strict";
+-
+- function test() {
+-   info("Test various cases where the escape key should hide the split console.");
++"use strict";
+ 
+-   let toolbox;
+-   let hud;
+-   let jsterm;
+-   let hudMessages;
+-   let variablesView;
+-
+-   Task.spawn(runner).then(finish);
++const TEST_URI = "data:text/html;charset=utf-8,<p>Web Console test for splitting";
+ 
+-   function* runner() {
+-     let {tab} = yield loadTab("data:text/html;charset=utf-8,<p>Web Console " +
+-                              "test for splitting");
+-     let target = TargetFactory.forTab(tab);
+-     toolbox = yield gDevTools.showToolbox(target, "inspector");
+-
+-     yield testCreateSplitConsoleAfterEscape();
+-
+-     yield showAutoCompletePopoup();
++add_task(async function () {
++  info("Test various cases where the escape key should hide the split console.");
+ 
+-     yield testHideAutoCompletePopupAfterEscape();
+-
+-     yield executeJS();
+-     yield clickMessageAndShowVariablesView();
+-     jsterm.focus();
+-
+-     yield testHideVariablesViewAfterEscape();
+-
+-     yield clickMessageAndShowVariablesView();
+-     yield startPropertyEditor();
++  let toolbox = await openNewTabAndToolbox(TEST_URI, "inspector");
+ 
+-     yield testCancelPropertyEditorAfterEscape();
+-     yield testHideVariablesViewAfterEscape();
+-     yield testHideSplitConsoleAfterEscape();
+-   }
+-
+-   function testCreateSplitConsoleAfterEscape() {
+-     let result = toolbox.once("webconsole-ready", () => {
+-       hud = toolbox.getPanel("webconsole").hud;
+-       jsterm = hud.jsterm;
+-       ok(toolbox.splitConsole, "Split console is created.");
+-     });
+-
+-     let contentWindow = toolbox.win;
+-     contentWindow.focus();
+-     EventUtils.sendKey("ESCAPE", contentWindow);
+-
+-     return result;
+-   }
++  info("Send ESCAPE key and wait for the split console to be displayed");
+ 
+-   function testHideSplitConsoleAfterEscape() {
+-     let result = toolbox.once("split-console", () => {
+-       ok(!toolbox.splitConsole, "Split console is hidden.");
+-     });
+-     EventUtils.sendKey("ESCAPE", toolbox.win);
+-
+-     return result;
+-   }
++  let onSplitConsoleReady = toolbox.once("webconsole-ready");
++  toolbox.win.focus();
++  EventUtils.sendKey("ESCAPE", toolbox.win);
++  await onSplitConsoleReady;
+ 
+-   function testHideVariablesViewAfterEscape() {
+-     let result = jsterm.once("sidebar-closed", () => {
+-       ok(!hud.ui.jsterm.sidebar,
+-        "Variables view is hidden.");
+-       ok(toolbox.splitConsole,
+-        "Split console is open after hiding the variables view.");
+-     });
+-     EventUtils.sendKey("ESCAPE", toolbox.win);
+-
+-     return result;
+-   }
++  let hud = toolbox.getPanel("webconsole").hud;
++  let jsterm = hud.jsterm;
++  ok(toolbox.splitConsole, "Split console is created.");
+ 
+-   function testHideAutoCompletePopupAfterEscape() {
+-     let deferred = defer();
+-     let popup = jsterm.autocompletePopup;
+-
+-     popup.once("popup-closed", () => {
+-       ok(!popup.isOpen,
+-        "Auto complete popup is hidden.");
+-       ok(toolbox.splitConsole,
+-        "Split console is open after hiding the autocomplete popup.");
+-
+-       deferred.resolve();
+-     });
+-
+-     EventUtils.sendKey("ESCAPE", toolbox.win);
+-
+-     return deferred.promise;
+-   }
++  info("Wait for the autocomplete to show suggestions for `document.location.`");
++  let popup = jsterm.autocompletePopup;
++  let onPopupShown = popup.once("popup-opened");
++  jsterm.focus();
++  jsterm.setInputValue("document.location.");
++  EventUtils.sendKey("TAB", hud.iframeWindow);
++  await onPopupShown;
+ 
+-   function testCancelPropertyEditorAfterEscape() {
+-     EventUtils.sendKey("ESCAPE", variablesView.window);
+-     ok(hud.ui.jsterm.sidebar,
+-      "Variables view is open after canceling property editor.");
+-     ok(toolbox.splitConsole,
+-      "Split console is open after editing.");
+-   }
+-
+-   function* executeJS() {
+-     jsterm.execute("var foo = { bar: \"baz\" }; foo;");
+-     hudMessages = yield waitForMessages({
+-       webconsole: hud,
+-       messages: [{
+-         text: "Object { bar: \"baz\" }",
+-         category: CATEGORY_OUTPUT,
+-         objects: true
+-       }],
+-     });
+-   }
++  info("Send ESCAPE key and check that it only hides the autocomplete suggestions");
+ 
+-   function clickMessageAndShowVariablesView() {
+-     let result = jsterm.once("variablesview-fetched", (event, vview) => {
+-       variablesView = vview;
+-     });
+-
+-     let clickable = hudMessages[0].clickableElements[0];
+-     EventUtils.synthesizeMouse(clickable, 2, 2, {}, hud.iframeWindow);
++  let onPopupClosed = popup.once("popup-closed");
++  EventUtils.sendKey("ESCAPE", toolbox.win);
++  await onPopupClosed;
+ 
+-     return result;
+-   }
+-
+-   function* startPropertyEditor() {
+-     let results = yield findVariableViewProperties(variablesView, [
+-      {name: "bar", value: "baz"}
+-     ], {webconsole: hud});
+-     results[0].matchedProp.focus();
+-     EventUtils.synthesizeKey("VK_RETURN", variablesView.window);
+-   }
++  ok(!popup.isOpen, "Auto complete popup is hidden.");
++  ok(toolbox.splitConsole, "Split console is open after hiding the autocomplete popup.");
+ 
+-   function showAutoCompletePopoup() {
+-     let onPopupShown = jsterm.autocompletePopup.once("popup-opened");
+-
+-     jsterm.focus();
+-     jsterm.setInputValue("document.location.");
+-     EventUtils.sendKey("TAB", hud.iframeWindow);
+-
+-     return onPopupShown;
+-   }
++  info("Send ESCAPE key again and check that now closes the splitconsole");
++  let onSplitConsoleEvent = toolbox.once("split-console");
++  EventUtils.sendKey("ESCAPE", toolbox.win);
++  await onSplitConsoleEvent;
+ 
+-   function finish() {
+-     toolbox.destroy().then(() => {
+-       toolbox = null;
+-       hud = null;
+-       jsterm = null;
+-       hudMessages = null;
+-       variablesView = null;
+-
+-       finishTest();
+-     });
+-   }
+- }
++  ok(!toolbox.splitConsole, "Split console is hidden.");
++});

+ 126 - 0
mozilla-release/patches/1405648-60a1.patch

@@ -0,0 +1,126 @@
+# HG changeset patch
+# User Julian Descottes <jdescottes@mozilla.com>
+# Date 1518196554 -3600
+# Node ID 10d0ac990b609028c5f30cdb8a67201e6095be27
+# Parent  d3336133f59858212d35cfe4f4a094694f58623b
+Bug 1405648 - enable browser_webconsole_split_focus.js;r=Honza
+
+MozReview-Commit-ID: 6SLfByzAsFF
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -340,17 +340,16 @@ subsuite = clipboard
+ [browser_webconsole_shows_reqs_in_netmonitor.js]
+ [browser_webconsole_sourcemap_css.js]
+ [browser_webconsole_sourcemap_error.js]
+ [browser_webconsole_sourcemap_invalid.js]
+ [browser_webconsole_sourcemap_nosource.js]
+ [browser_webconsole_split.js]
+ [browser_webconsole_split_escape_key.js]
+ [browser_webconsole_split_focus.js]
+-skip-if = true #       Bug 1405648
+ [browser_webconsole_split_persist.js]
+ skip-if = true #       Bug 1405649
+ [browser_webconsole_stacktrace_location_debugger_link.js]
+ [browser_webconsole_stacktrace_location_scratchpad_link.js]
+ [browser_webconsole_strict_mode_errors.js]
+ [browser_webconsole_string.js]
+ [browser_webconsole_time_methods.js]
+ skip-if = true #       Bug 1404877
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_split_focus.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_split_focus.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_split_focus.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_split_focus.js
+@@ -1,64 +1,44 @@
+ /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+ /* Any copyright is dedicated to the Public Domain.
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+- "use strict";
+-
+- function test() {
+-  info("Test that the split console state is persisted");
++"use strict";
+ 
+-  let toolbox;
+-  let TEST_URI = "data:text/html;charset=utf-8,<p>Web Console test for " +
+-                 "splitting</p>";
++const TEST_URI = "data:text/html;charset=utf-8,<p>Web Console test for splitting</p>";
+ 
+-  Task.spawn(runner).then(finish);
++add_task(async function () {
++  info("Test that the split console input is focused and restores the focus properly.");
+ 
+-  function* runner() {
+-    info("Opening a tab while there is no user setting on split console pref");
+-    let {tab} = yield loadTab(TEST_URI);
+-    let target = TargetFactory.forTab(tab);
+-    toolbox = yield gDevTools.showToolbox(target, "inspector");
+-
+-    ok(!toolbox.splitConsole, "Split console is hidden by default");
++  let toolbox = await openNewTabAndToolbox(TEST_URI, "inspector");
++  ok(!toolbox.splitConsole, "Split console is hidden by default");
+ 
+-    info("Focusing the search box before opening the split console");
+-    let inspector = toolbox.getPanel("inspector");
+-    inspector.searchBox.focus();
++  info("Focusing the search box before opening the split console");
++  let inspector = toolbox.getPanel("inspector");
++  inspector.searchBox.focus();
+ 
+-    let activeElement = getActiveElement(inspector.panelDoc);
+-    is(activeElement, inspector.searchBox, "Search box is focused");
++  let activeElement = getActiveElement(inspector.panelDoc);
++  is(activeElement, inspector.searchBox, "Search box is focused");
+ 
+-    yield toolbox.openSplitConsole();
+-
+-    ok(toolbox.splitConsole, "Split console is now visible");
++  await toolbox.openSplitConsole();
+ 
+-    // Use the binding element since jsterm.inputNode is a XUL textarea element.
+-    activeElement = getActiveElement(toolbox.doc);
+-    activeElement = activeElement.ownerDocument.getBindingParent(activeElement);
+-    let inputNode = toolbox.getPanel("webconsole").hud.jsterm.inputNode;
+-    is(activeElement, inputNode, "Split console input is focused by default");
++  ok(toolbox.splitConsole, "Split console is now visible");
++
++  activeElement = getActiveElement(toolbox.doc);
++  let inputNode = toolbox.getPanel("webconsole").hud.jsterm.inputNode;
++  is(activeElement, inputNode, "Split console input is focused by default");
++
++  await toolbox.closeSplitConsole();
+ 
+-    yield toolbox.closeSplitConsole();
++  info("Making sure that the search box is refocused after closing the split console");
++  activeElement = getActiveElement(inspector.panelDoc);
++  is(activeElement, inspector.searchBox, "Search box is focused");
++});
+ 
+-    info("Making sure that the search box is refocused after closing the " +
+-         "split console");
+-    activeElement = getActiveElement(inspector.panelDoc);
+-    is(activeElement, inspector.searchBox, "Search box is focused");
+-
+-    yield toolbox.destroy();
++function getActiveElement(doc) {
++  let activeElement = doc.activeElement;
++  while (activeElement && activeElement.contentDocument) {
++    activeElement = activeElement.contentDocument.activeElement;
+   }
+-
+-  function getActiveElement(doc) {
+-    let activeElement = doc.activeElement;
+-    while (activeElement && activeElement.contentDocument) {
+-      activeElement = activeElement.contentDocument.activeElement;
+-    }
+-    return activeElement;
+-  }
+-
+-  function finish() {
+-    toolbox = TEST_URI = null;
+-    finishTest();
+-  }
++  return activeElement;
+ }

+ 218 - 0
mozilla-release/patches/1405649-60a1.patch

@@ -0,0 +1,218 @@
+# HG changeset patch
+# User Julian Descottes <jdescottes@mozilla.com>
+# Date 1518201659 -3600
+# Node ID 913378d620dff84aceb753308bec9d7c3dc3eda0
+# Parent  d8e06938d6f3e01fe8d514258bcb482a6de6bd4e
+Bug 1405649 - enable browser_webconsole_split_persist.js;r=Honza
+
+MozReview-Commit-ID: IISiwUya2x8
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -341,17 +341,16 @@ subsuite = clipboard
+ [browser_webconsole_sourcemap_css.js]
+ [browser_webconsole_sourcemap_error.js]
+ [browser_webconsole_sourcemap_invalid.js]
+ [browser_webconsole_sourcemap_nosource.js]
+ [browser_webconsole_split.js]
+ [browser_webconsole_split_escape_key.js]
+ [browser_webconsole_split_focus.js]
+ [browser_webconsole_split_persist.js]
+-skip-if = true #       Bug 1405649
+ [browser_webconsole_stacktrace_location_debugger_link.js]
+ [browser_webconsole_stacktrace_location_scratchpad_link.js]
+ [browser_webconsole_strict_mode_errors.js]
+ [browser_webconsole_string.js]
+ [browser_webconsole_time_methods.js]
+ skip-if = true #       Bug 1404877
+ [browser_webconsole_timestamps.js]
+ [browser_webconsole_trackingprotection_errors.js]
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_split_persist.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_split_persist.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_split_persist.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_split_persist.js
+@@ -1,117 +1,94 @@
+ /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+ /* Any copyright is dedicated to the Public Domain.
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+- "use strict";
+-
+- function test() {
+-  info("Test that the split console state is persisted");
++"use strict";
+ 
+-  let toolbox;
+-  let TEST_URI = "data:text/html;charset=utf-8,<p>Web Console test for " +
+-                 "splitting</p>";
++// Test that the split console state is persisted.
+ 
+-  Task.spawn(runner).then(finish);
++const TEST_URI = "data:text/html;charset=utf-8,<p>Web Console test for splitting</p>";
+ 
+-  function* runner() {
+-    info("Opening a tab while there is no user setting on split console pref");
+-    let {tab} = yield loadTab(TEST_URI);
+-    let target = TargetFactory.forTab(tab);
+-    toolbox = yield gDevTools.showToolbox(target, "inspector");
++add_task(async function () {
++  info("Opening a tab while there is no user setting on split console pref");
++  let toolbox = await openNewTabAndToolbox(TEST_URI, "inspector");
++  ok(!toolbox.splitConsole, "Split console is hidden by default");
++  ok(!isCommandButtonChecked(toolbox), "Split console button is unchecked by default.");
+ 
+-    ok(!toolbox.splitConsole, "Split console is hidden by default.");
+-    ok(!isCommandButtonChecked(), "Split console button is unchecked by " +
+-                                  "default.");
+-    yield toggleSplitConsoleWithEscape();
+-    ok(toolbox.splitConsole, "Split console is now visible.");
+-    ok(isCommandButtonChecked(), "Split console button is now checked.");
+-    ok(getVisiblePrefValue(), "Visibility pref is true");
++  await toggleSplitConsoleWithEscape(toolbox);
++  ok(toolbox.splitConsole, "Split console is now visible.");
++  ok(isCommandButtonChecked(toolbox), "Split console button is now checked.");
++  ok(getVisiblePrefValue(), "Visibility pref is true");
++
++  is(getHeightPrefValue(), toolbox.webconsolePanel.height,
++     "Panel height matches the pref");
++  toolbox.webconsolePanel.height = 200;
+ 
+-    is(getHeightPrefValue(), toolbox.webconsolePanel.height,
+-       "Panel height matches the pref");
+-    toolbox.webconsolePanel.height = 200;
+-
+-    yield toolbox.destroy();
++  await toolbox.destroy();
+ 
+-    info("Opening a tab while there is a true user setting on split console " +
+-         "pref");
+-    ({tab} = yield loadTab(TEST_URI));
+-    target = TargetFactory.forTab(tab);
+-    toolbox = yield gDevTools.showToolbox(target, "inspector");
++  info("Opening a tab while there is a true user setting on split console pref");
++  toolbox = await openNewTabAndToolbox(TEST_URI, "inspector");
++  ok(toolbox.splitConsole, "Split console is visible by default.");
++
++  ok(isCommandButtonChecked(toolbox), "Split console button is checked by default.");
++  is(getHeightPrefValue(), 200, "Height is set based on panel height after closing");
+ 
+-    ok(toolbox.splitConsole, "Split console is visible by default.");
+-    ok(isCommandButtonChecked(), "Split console button is checked by default.");
+-    is(getHeightPrefValue(), 200, "Height is set based on panel height after " +
+-                                  "closing");
++  let activeElement = getActiveElement(toolbox.doc);
++  let inputNode = toolbox.getPanel("webconsole").hud.jsterm.inputNode;
++  is(activeElement, inputNode, "Split console input is focused by default");
+ 
+-    // Use the binding element since jsterm.inputNode is a XUL textarea element.
+-    let activeElement = getActiveElement(toolbox.doc);
+-    activeElement = activeElement.ownerDocument.getBindingParent(activeElement);
+-    let inputNode = toolbox.getPanel("webconsole").hud.jsterm.inputNode;
+-    is(activeElement, inputNode, "Split console input is focused by default");
++  toolbox.webconsolePanel.height = 1;
++  ok(toolbox.webconsolePanel.clientHeight > 1,
++     "The actual height of the console is bound with a min height");
+ 
+-    toolbox.webconsolePanel.height = 1;
+-    ok(toolbox.webconsolePanel.clientHeight > 1,
+-       "The actual height of the console is bound with a min height");
+-
+-    toolbox.webconsolePanel.height = 10000;
+-    ok(toolbox.webconsolePanel.clientHeight < 10000,
+-       "The actual height of the console is bound with a max height");
++  toolbox.webconsolePanel.height = 10000;
++  ok(toolbox.webconsolePanel.clientHeight < 10000,
++     "The actual height of the console is bound with a max height");
+ 
+-    yield toggleSplitConsoleWithEscape();
+-    ok(!toolbox.splitConsole, "Split console is now hidden.");
+-    ok(!isCommandButtonChecked(), "Split console button is now unchecked.");
+-    ok(!getVisiblePrefValue(), "Visibility pref is false");
++  await toggleSplitConsoleWithEscape(toolbox);
++  ok(!toolbox.splitConsole, "Split console is now hidden.");
++  ok(!isCommandButtonChecked(toolbox), "Split console button is now unchecked.");
++  ok(!getVisiblePrefValue(), "Visibility pref is false");
+ 
+-    yield toolbox.destroy();
++  await toolbox.destroy();
+ 
+-    is(getHeightPrefValue(), 10000,
+-       "Height is set based on panel height after closing");
++  is(getHeightPrefValue(), 10000, "Height is set based on panel height after closing");
+ 
+-    info("Opening a tab while there is a false user setting on split " +
+-         "console pref");
+-    ({tab} = yield loadTab(TEST_URI));
+-    target = TargetFactory.forTab(tab);
+-    toolbox = yield gDevTools.showToolbox(target, "inspector");
++  info("Opening a tab while there is a false user setting on split " +
++       "console pref");
++  toolbox = await openNewTabAndToolbox(TEST_URI, "inspector");
+ 
+-    ok(!toolbox.splitConsole, "Split console is hidden by default.");
+-    ok(!getVisiblePrefValue(), "Visibility pref is false");
++  ok(!toolbox.splitConsole, "Split console is hidden by default.");
++  ok(!getVisiblePrefValue(), "Visibility pref is false");
+ 
+-    yield toolbox.destroy();
+-  }
++  await toolbox.destroy();
++});
+ 
+-  function getActiveElement(doc) {
+-    let activeElement = doc.activeElement;
+-    while (activeElement && activeElement.contentDocument) {
+-      activeElement = activeElement.contentDocument.activeElement;
+-    }
+-    return activeElement;
++function getActiveElement(doc) {
++  let activeElement = doc.activeElement;
++  while (activeElement && activeElement.contentDocument) {
++    activeElement = activeElement.contentDocument.activeElement;
+   }
++  return activeElement;
++}
+ 
+-  function getVisiblePrefValue() {
+-    return Services.prefs.getBoolPref("devtools.toolbox.splitconsoleEnabled");
+-  }
+-
+-  function getHeightPrefValue() {
+-    return Services.prefs.getIntPref("devtools.toolbox.splitconsoleHeight");
+-  }
++function getVisiblePrefValue() {
++  return Services.prefs.getBoolPref("devtools.toolbox.splitconsoleEnabled");
++}
+ 
+-  function isCommandButtonChecked() {
+-    return toolbox.doc.querySelector("#command-button-splitconsole")
+-      .classList.contains("checked");
+-  }
++function getHeightPrefValue() {
++  return Services.prefs.getIntPref("devtools.toolbox.splitconsoleHeight");
++}
+ 
+-  function toggleSplitConsoleWithEscape() {
+-    let onceSplitConsole = toolbox.once("split-console");
+-    let contentWindow = toolbox.win;
+-    contentWindow.focus();
+-    EventUtils.sendKey("ESCAPE", contentWindow);
+-    return onceSplitConsole;
+-  }
++function isCommandButtonChecked(toolbox) {
++  return toolbox.doc.querySelector("#command-button-splitconsole")
++    .classList.contains("checked");
++}
+ 
+-  function finish() {
+-    toolbox = TEST_URI = null;
+-    finishTest();
+-  }
++function toggleSplitConsoleWithEscape(toolbox) {
++  let onceSplitConsole = toolbox.once("split-console");
++  let toolboxWindow = toolbox.win;
++  toolboxWindow.focus();
++  EventUtils.sendKey("ESCAPE", toolboxWindow);
++  return onceSplitConsole;
+ }

+ 111 - 0
mozilla-release/patches/1405650-60a1.patch

@@ -0,0 +1,111 @@
+# HG changeset patch
+# User Michael Ratcliffe <mratcliffe@mozilla.com>
+# Date 1518197221 0
+# Node ID 5212d4f7b2b9ed82767ac29c984cb16b90e4e6ac
+# Parent  990560a61cec66ac70cdbd6cfbffd16588597da5
+Bug 1405650 - Migrate browser_webconsole_trackingprotection_errors.js to the new frontend r=jdescottes
+
+MozReview-Commit-ID: 2Et1H6ynnEL
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -358,18 +358,16 @@ skip-if = true #       Bug 1405649
+ [browser_webconsole_stacktrace_location_scratchpad_link.js]
+ [browser_webconsole_strict_mode_errors.js]
+ [browser_webconsole_string.js]
+ [browser_webconsole_time_methods.js]
+ skip-if = true #       Bug 1404877
+ [browser_webconsole_timestamps.js]
+ [browser_webconsole_trackingprotection_errors.js]
+ tags = trackingprotection
+-skip-if = true #       Bug 1405650
+-# old console skip-if = (os == 'win' && bits == 64) # Bug 1390001
+ [browser_webconsole_variables_view_dont_sort_non_sortable_classes_properties.js]
+ skip-if = true #       Bug 1403196
+ [browser_webconsole_variables_view_while_debugging.js]
+ skip-if = true #       Bug 1403200
+ [browser_webconsole_variables_view_while_debugging_and_inspecting.js]
+ skip-if = true #       Bug 1403205
+ [browser_webconsole_view_source.js]
+ [browser_webconsole_violation.js]
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_trackingprotection_errors.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_trackingprotection_errors.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_trackingprotection_errors.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_trackingprotection_errors.js
+@@ -4,51 +4,48 @@
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+ // Load a page with tracking elements that get blocked and make sure that a
+ // 'learn more' link shows up in the webconsole.
+ 
+ "use strict";
+ 
+ const TEST_URI = "http://tracking.example.org/browser/devtools/client/" +
+-                 "webconsole/test/test-trackingprotection-securityerrors.html";
++                 "webconsole/new-console-output/test/mochitest/" +
++                 "test-trackingprotection-securityerrors.html";
+ const LEARN_MORE_URI = "https://developer.mozilla.org/Firefox/Privacy/" +
+                        "Tracking_Protection" + DOCS_GA_PARAMS;
+-const PREF = "privacy.trackingprotection.enabled";
+ 
+ const {UrlClassifierTestUtils} = ChromeUtils.import("resource://testing-common/UrlClassifierTestUtils.jsm", {});
+ 
+ registerCleanupFunction(function () {
+-  Services.prefs.clearUserPref(PREF);
+   UrlClassifierTestUtils.cleanupTestTrackers();
+ });
+ 
+-add_task(function* testMessagesAppear() {
+-  yield UrlClassifierTestUtils.addTestTrackers();
+-  Services.prefs.setBoolPref(PREF, true);
++add_task(async function testMessagesAppear() {
++  await UrlClassifierTestUtils.addTestTrackers();
++  await pushPref("privacy.trackingprotection.enabled", true);
+ 
+-  let { browser } = yield loadTab(TEST_URI);
+-
+-  let hud = yield openConsole();
++  let hud = await openNewTabAndConsole(TEST_URI);
+ 
+-  let results = yield waitForMessages({
+-    webconsole: hud,
+-    messages: [
+-      {
+-        name: "Was blocked because tracking protection is enabled",
+-        text: "The resource at \u201chttp://tracking.example.com/\u201d was " +
+-              "blocked because tracking protection is enabled",
+-        category: CATEGORY_SECURITY,
+-        severity: SEVERITY_WARNING,
+-        objects: true,
+-      },
+-    ],
+-  });
++  let message = await waitFor(() => findMessage(hud,
++    "The resource at \u201chttp://tracking.example.com/\u201d was " +
++    "blocked because tracking protection is enabled"));
+ 
+-  yield testClickOpenNewTab(hud, results[0]);
++  await testClickOpenNewTab(hud, message);
+ });
+ 
+-function testClickOpenNewTab(hud, match) {
+-  let warningNode = match.clickableElements[0];
+-  ok(warningNode, "link element");
+-  ok(warningNode.classList.contains("learn-more-link"), "link class name");
+-  return simulateMessageLinkClick(warningNode, LEARN_MORE_URI);
++async function testClickOpenNewTab(hud, message) {
++  info("Clicking on the Learn More link");
++
++  const learnMoreLink = message.querySelector(".learn-more-link");
++  let linkSimulation = await simulateLinkClick(learnMoreLink);
++  checkLink({
++    ...linkSimulation,
++    expectedLink: LEARN_MORE_URI,
++    expectedTab: "tab"
++  });
+ }
++
++function checkLink({ link, where, expectedLink, expectedTab }) {
++  is(link, expectedLink, `Clicking the provided link opens ${link}`);
++  is(where, expectedTab, `Clicking the provided link opens in expected tab`);
++}

+ 88 - 0
mozilla-release/patches/1405652-58a1.patch

@@ -0,0 +1,88 @@
+# HG changeset patch
+# User Nicolas Chevobbe <nchevobbe@mozilla.com>
+# Date 1508482687 -7200
+# Node ID 810825b3ce199c6efe4efe5ffa6c8a69d3c9733f
+# Parent  c8418a2a9d45b8004265b958a800d1b0e28e2e96
+Bug 1405652 - Enable browser_webconsole_view_source.js in new console frontend; r=bgrins.
+
+MozReview-Commit-ID: DctteBfNgtC
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -457,17 +457,15 @@ skip-if = true #       Bug 1405650
+ # old console skip-if = (os == 'win' && bits == 64) # Bug 1390001
+ [browser_webconsole_variables_view_dont_sort_non_sortable_classes_properties.js]
+ skip-if = true #       Bug 1403196
+ [browser_webconsole_variables_view_while_debugging.js]
+ skip-if = true #       Bug 1403200
+ [browser_webconsole_variables_view_while_debugging_and_inspecting.js]
+ skip-if = true #       Bug 1403205
+ [browser_webconsole_view_source.js]
+-skip-if = true #       Bug 1405652
+-# old console skip-if = (os == 'win' && bits == 64) # Bug 1390001
+ [browser_webconsole_violation.js]
+ skip-if = true #       Bug 1405245
+ # old console skip-if = e10s && (os == 'win') # Bug 1264955
+ [browser_webconsole_visibility_messages.js]
+ [browser_webconsole_warn_about_replaced_api.js]
+ [browser_webconsole_websocket.js]
+ skip-if = true # Bug 1408950
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_view_source.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_view_source.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_view_source.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_view_source.js
+@@ -6,47 +6,25 @@
+ // Tests that source URLs in the Web Console can be clicked to display the
+ // standard View Source window. As JS exceptions and console.log() messages always
+ // have their locations opened in Debugger, we need to test a security message in
+ // order to have it opened in the standard View Source window.
+ 
+ "use strict";
+ 
+ const TEST_URI = "https://example.com/browser/devtools/client/webconsole/" +
+-                 "test/test-mixedcontent-securityerrors.html";
+-
+-add_task(function* () {
+-  yield actuallyTest();
+-});
++                 "new-console-output/test/mochitest/test-mixedcontent-securityerrors.html";
+ 
+-add_task(function* () {
+-  Services.prefs.setBoolPref("devtools.debugger.new-debugger-frontend", false);
+-  yield actuallyTest();
+-  Services.prefs.clearUserPref("devtools.debugger.new-debugger-frontend");
+-});
+-
+-var actuallyTest = Task.async(function*() {
+-  yield loadTab(TEST_URI);
+-  let hud = yield openConsole(null);
++add_task(async function () {
++  let hud = await openNewTabAndConsole(TEST_URI);
+   info("console opened");
+ 
+-  let [result] = yield waitForMessages({
+-    webconsole: hud,
+-    messages: [{
+-      text: "Blocked loading mixed active content",
+-      category: CATEGORY_SECURITY,
+-      severity: SEVERITY_ERROR,
+-    }],
+-  });
+-
+-  let msg = [...result.matched][0];
++  let msg = await waitFor(() => findMessage(hud, "Blocked loading mixed active content"));
+   ok(msg, "error message");
+   let locationNode = msg.querySelector(".message-location .frame-link-filename");
+   ok(locationNode, "location node");
+ 
+-  let onTabOpen = waitForTab();
+-
+-  EventUtils.sendMouseEvent({ type: "click" }, locationNode);
++  let onTabOpen = BrowserTestUtils.waitForNewTab(gBrowser, null, true);
+ 
+-  let tab = yield onTabOpen;
++  locationNode.click();
++  let tab = await onTabOpen;
+   ok(true, "the view source tab was opened in response to clicking the location node");
+-  gBrowser.removeTab(tab);
+ });

+ 69 - 0
mozilla-release/patches/1406022-60a1.patch

@@ -0,0 +1,69 @@
+# HG changeset patch
+# User Julian Descottes <jdescottes@mozilla.com>
+# Date 1518179291 -3600
+# Node ID 2f4bdadc6a94f56a6d77bbd68dd91cddbadd7e46
+# Parent  245b510dde9b6d55a9ec1d663aa534010b501588
+Bug 1406022 - remove browser_webconsole_reflow.js;r=nchevobbe
+
+MozReview-Commit-ID: GO2jdUugR58
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -325,18 +325,16 @@ subsuite = clipboard
+ [browser_webconsole_output_copy_newlines.js]
+ subsuite = clipboard
+ skip-if = true #       Bug 1405641
+ # old console skip-if = (os == 'linux' && bits == 32 && debug) # bug 1328915, disable linux32 debug devtools for timeouts
+ [browser_webconsole_output_order.js]
+ [browser_webconsole_persist.js]
+ [browser_webconsole_prune_scroll.js]
+ skip-if = true #       Bug 1404832
+-[browser_webconsole_reflow.js]
+-skip-if = true #       Bug 1406022
+ [browser_webconsole_reopen_closed_tab.js]
+ [browser_webconsole_repeat_different_objects.js]
+ [browser_webconsole_repeated_messages_accuracy.js]
+ skip-if = true #       Bug 1403450
+ [browser_webconsole_sandbox_update_after_navigation.js]
+ [browser_webconsole_script_errordoc_urls.js]
+ skip-if = true #       Bug 1403454
+ # old console skip-if = e10s # Bug 1042253 - webconsole tests disabled with e10s
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_reflow.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_reflow.js
+deleted file mode 100644
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_reflow.js
++++ /dev/null
+@@ -1,33 +0,0 @@
+-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+-/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+-/* Any copyright is dedicated to the Public Domain.
+- * http://creativecommons.org/publicdomain/zero/1.0/ */
+-
+-"use strict";
+-
+-const TEST_URI = "data:text/html;charset=utf-8,Web Console test for " +
+-                 "reflow activity";
+-
+-add_task(function* () {
+-  let { browser } = yield loadTab(TEST_URI);
+-
+-  let hud = yield openConsole();
+-
+-  function onReflowListenersReady() {
+-    browser.contentDocument.body.style.display = "none";
+-    browser.contentDocument.body.clientTop;
+-  }
+-
+-  Services.prefs.setBoolPref("devtools.webconsole.filter.csslog", true);
+-  hud.ui._updateReflowActivityListener(onReflowListenersReady);
+-  Services.prefs.clearUserPref("devtools.webconsole.filter.csslog");
+-
+-  yield waitForMessages({
+-    webconsole: hud,
+-    messages: [{
+-      text: /reflow: /,
+-      category: CATEGORY_CSS,
+-      severity: SEVERITY_LOG,
+-    }],
+-  });
+-});

+ 286 - 0
mozilla-release/patches/1406028-60a1.patch

@@ -0,0 +1,286 @@
+# HG changeset patch
+# User Michael Ratcliffe <mratcliffe@mozilla.com>
+# Date 1518280910 0
+# Node ID 955d0aaa5846fb5a1b00eddb5cfb7489ca9253fa
+# Parent  954215d96ebec33a33f991ba90de2bc80db8c6c5
+Bug 1406028 - Migrate browser_webconsole_console_trace_duplicates.js to the new frontend r=jdescottes
+
+MozReview-Commit-ID: IUrs0HGCaHk
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -18,17 +18,17 @@ support-files =
+   test_console_csp_ignore_reflected_xss_message.html^headers^
+   test_hpkp-invalid-headers.sjs
+   test_hsts-invalid-headers.sjs
+   test-autocomplete-in-stackframe.html
+   test-batching.html
+   test-bug_923281_console_log_filter.html
+   test-bug_923281_test1.js
+   test-bug_923281_test2.js
+-  test-bug_939783_console_trace_duplicates.html
++  test-console-trace-duplicates.html
+   test-bug-585956-console-trace.html
+   test-bug-599725-response-headers.sjs
+   test-bug-601177-log-levels.html
+   test-bug-601177-log-levels.js
+   test-bug-630733-response-redirect-headers.sjs
+   test-bug-632275-getters.html
+   test-bug-644419-log-limits.html
+   test-bug-646025-console-file-location.html
+@@ -247,16 +247,17 @@ tags = mcb
+ [browser_webconsole_closure_inspection.js]
+ skip-if = true # Bug 1405250
+ [browser_webconsole_console_api_iframe.js]
+ [browser_webconsole_console_dir.js]
+ [browser_webconsole_console_dir_uninspectable.js]
+ [browser_webconsole_console_group.js]
+ [browser_webconsole_console_logging_workers_api.js]
+ [browser_webconsole_console_table.js]
++[browser_webconsole_console_trace_duplicates.js]
+ [browser_webconsole_context_menu_copy_entire_message.js]
+ subsuite = clipboard
+ skip-if = (os == 'linux' && bits == 32 && debug) # bug 1328915, disable linux32 debug devtools for timeouts
+ [browser_webconsole_context_menu_copy_link_location.js]
+ subsuite = clipboard
+ skip-if = (os == 'linux' && bits == 32 && debug) # bug 1328915, disable linux32 debug devtools for timeouts
+ [browser_webconsole_context_menu_copy_object.js]
+ subsuite = clipboard
+diff --git a/devtools/client/webconsole/test/browser_webconsole_console_trace_duplicates.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_console_trace_duplicates.js
+copy from devtools/client/webconsole/test/browser_webconsole_console_trace_duplicates.js
+copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_console_trace_duplicates.js
+--- a/devtools/client/webconsole/test/browser_webconsole_console_trace_duplicates.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_console_trace_duplicates.js
+@@ -1,50 +1,171 @@
+ /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+ /* Any copyright is dedicated to the Public Domain.
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
++ /* import-globals-from head.js */
++
+ "use strict";
+ 
+-function test() {
+-  const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
+-                   "test/test-bug_939783_console_trace_duplicates.html";
++const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
++                  "new-console-output/test/mochitest/" +
++                  "test-console-trace-duplicates.html";
++
++add_task(async function testTraceMessages() {
++  let hud = await openNewTabAndConsole(TEST_URI);
+ 
+-  Task.spawn(runner).then(finishTest);
++  // NB: Now that stack frames include a column number multiple invocations
++  //     on the same line are considered unique. ie:
++  //       |foo(); foo();|
++  //     will generate two distinct trace entries.
++  let message = await waitFor(() => findMessage(hud, "foo1"));
++  let stackInfo = getStackInfo(message);
+ 
+-  function* runner() {
+-    const {tab} = yield loadTab("data:text/html;charset=utf8,<p>hello");
+-    const hud = yield openConsole(tab);
+-
+-    BrowserTestUtils.loadURI(gBrowser.selectedBrowser, TEST_URI);
++  checkStackInfo(stackInfo, {
++    variable: "console.trace()",
++    repeats: 3,
++    filename: "test-console-trace-duplicates.html",
++    line: 23,
++    column: 3,
++    stack: [{
++      functionName: "foo3",
++      filename: TEST_URI,
++      line: 23,
++      column: 3
++    }, {
++      functionName: "foo2",
++      filename: TEST_URI,
++      line: 19,
++      column: 3
++    }, {
++      functionName: "foo1",
++      filename: TEST_URI,
++      line: 11,
++      column: 3
++    }, {
++      functionName: "<anonymous>",
++      filename: TEST_URI,
++      line: 26,
++      column: 1
++    }]
++  });
++});
+ 
+-    // NB: Now that stack frames include a column number multiple invocations
+-    //     on the same line are considered unique. ie:
+-    //       |foo(); foo();|
+-    //     will generate two distinct trace entries.
+-    yield waitForMessages({
+-      webconsole: hud,
+-      messages: [{
+-        name: "console.trace output for foo1()",
+-        text: "foo1",
+-        consoleTrace: {
+-          file: "test-bug_939783_console_trace_duplicates.html",
+-          fn: "foo3",
+-        },
+-      }, {
+-        name: "console.trace output for foo1()",
+-        text: "foo1",
+-        consoleTrace: {
+-          file: "test-bug_939783_console_trace_duplicates.html",
+-          fn: "foo3",
+-        },
+-      }, {
+-        name: "console.trace output for foo1b()",
+-        text: "foo1b",
+-        consoleTrace: {
+-          file: "test-bug_939783_console_trace_duplicates.html",
+-          fn: "foo3",
+-        },
+-      }],
+-    });
++/**
++ * Get stack info from a message node. This is a companion to checkStackInfo().
++ *
++ * @param {MessageNode}
++ *        The message from which the stack info will be returned.
++ * @returns {Object}
++ *          An object in the following format:
++ *            {
++ *              variable: "console.trace()",
++ *              repeats: 3
++ *              filename: "some-filename.html"
++ *              line: 23
++ *              column: 3
++ *              stack: [
++ *                {
++ *                  "functionName": "foo3",
++ *                  "filename": "http://example.com/some-filename.html",
++ *                  "line":"23",
++ *                  "column":"3"
++ *                },
++ *                ...
++ *              ]
++ *            }
++ */
++function getStackInfo(message) {
++  let lineNode = message.querySelector(".frame-link-line");
++  let lc = getLineAndColumn(lineNode);
++  let result = {
++    variable: message.querySelector(".cm-variable").textContent,
++    repeats: message.querySelector(".message-repeats").textContent,
++    filename: message.querySelector(".frame-link-filename").textContent,
++    line: lc.line,
++    column: lc.column,
++    stack: []
++  };
++
++  let stack = message.querySelector(".stack-trace");
++  if (stack) {
++    let filenameNodes = stack.querySelectorAll(".frame-link-filename");
++    let lineNodes = stack.querySelectorAll(".frame-link-line");
++    let funcNodes = stack.querySelectorAll(".frame-link-function-display-name");
++
++    for (let i = 0; i < filenameNodes.length; i++) {
++      let filename = filenameNodes[i].textContent;
++      let functionName = funcNodes[i].textContent;
++      let { line, column } = getLineAndColumn(lineNodes[i]);
++
++      result.stack.push({
++        functionName,
++        filename,
++        line: line,
++        column: column
++      });
++    }
++  }
++
++  return result;
++}
++
++/**
++ * Check stack info returned by getStackInfo().
++ *
++ * @param {Object} stackInfo
++ *        A stackInfo object returned by getStackInfo().
++ * @param {Object} expected
++ *        An object in the same format as the expected stackInfo object.
++ */
++function checkStackInfo(stackInfo, expected) {
++  is(stackInfo.variable, expected.variable, `"$(expected.variable}" command logged`);
++  is(stackInfo.repeats, expected.repeats, "expected number of repeats are displayed");
++  is(stackInfo.filename, expected.filename, "expected filename is displayed");
++  is(stackInfo.line, expected.line, "expected line is displayed");
++  is(stackInfo.column, expected.column, "expected column is displayed");
++
++  ok(stackInfo.stack.length > 0, "a stack is displayed");
++  is(stackInfo.stack.length, expected.stack.length, "the stack is the expected length");
++
++  for (let i = 0; i < stackInfo.stack.length; i++) {
++    let actual = stackInfo.stack[i];
++    let stackExpected = expected.stack[i];
++
++    is(actual.functionName, stackExpected.functionName,
++      `expected function name is displayed for index ${i}`);
++    is(actual.filename, stackExpected.filename,
++      `expected filename is displayed for index ${i}`);
++    is(actual.line, stackExpected.line,
++      `expected line is displayed for index ${i}`);
++    is(actual.column, stackExpected.column,
++      `expected column is displayed for index ${i}`);
+   }
+ }
++
++/**
++ * Splits the line and column info from the node containing the line and column
++ * to be split e.g. ':10:15'.
++ *
++ * @param {HTMLNode} node
++ *        The HTML node containing the line and column to be split.
++ */
++function getLineAndColumn(node) {
++  let lineAndColumn = node.textContent;
++  let line = 0;
++  let column = 0;
++
++  // LineAndColumn should look something like ":10:15"
++  if (lineAndColumn.startsWith(":")) {
++    // Trim the first colon leaving e.g. "10:15"
++    lineAndColumn = lineAndColumn.substr(1);
++
++    // Split "10:15" into line and column variables.
++    [ line, column ] = lineAndColumn.split(":");
++  }
++
++  return {
++    line: line * 1,
++    column: column * 1
++  };
++}
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug_939783_console_trace_duplicates.html b/devtools/client/webconsole/new-console-output/test/mochitest/test-console-trace-duplicates.html
+rename from devtools/client/webconsole/new-console-output/test/mochitest/test-bug_939783_console_trace_duplicates.html
+rename to devtools/client/webconsole/new-console-output/test/mochitest/test-console-trace-duplicates.html
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug_939783_console_trace_duplicates.html
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/test-console-trace-duplicates.html
+@@ -1,14 +1,14 @@
+ <!DOCTYPE html>
+ <html lang="en">
+   <head>
+     <meta charset="utf-8">
+-    <title>Web Console test for bug 939783 - different console.trace() calls
+-      wrongly filtered as duplicates</title>
++    <title>Web Console test for checking that different console.trace() calls
++      are not wrongly filtered as duplicates</title>
+     <!-- Any copyright is dedicated to the Public Domain.
+          http://creativecommons.org/publicdomain/zero/1.0/ -->
+ <script type="application/javascript">
+ function foo1() {
+   foo2();
+ }
+ 
+ function foo1b() {

+ 142 - 0
mozilla-release/patches/1406039-59a1.patch

@@ -0,0 +1,142 @@
+# HG changeset patch
+# User Julian Descottes <jdescottes@mozilla.com>
+# Date 1516117862 -3600
+# Node ID f77e243145f2c08e6f7ba4f086400e874aad9463
+# Parent  e9e6e2ce7189210b358743250925f1901cea609f
+Bug 1406039 - migrate browser_webconsole_strict_mode_errors to new frontend;r=nchevobbe
+
+MozReview-Commit-ID: ATuyIFj5c4D
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -374,17 +374,16 @@ skip-if = true #       Bug 1404359
+ skip-if = true #       Bug 1405647
+ [browser_webconsole_split_focus.js]
+ skip-if = true #       Bug 1405648
+ [browser_webconsole_split_persist.js]
+ skip-if = true #       Bug 1405649
+ [browser_webconsole_stacktrace_location_debugger_link.js]
+ [browser_webconsole_stacktrace_location_scratchpad_link.js]
+ [browser_webconsole_strict_mode_errors.js]
+-skip-if = true #       Bug 1406039
+ [browser_webconsole_string.js]
+ [browser_webconsole_time_methods.js]
+ skip-if = true #       Bug 1404877
+ [browser_webconsole_timestamps.js]
+ [browser_webconsole_trackingprotection_errors.js]
+ tags = trackingprotection
+ skip-if = true #       Bug 1405650
+ # old console skip-if = (os == 'win' && bits == 64) # Bug 1390001
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_strict_mode_errors.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_strict_mode_errors.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_strict_mode_errors.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_strict_mode_errors.js
+@@ -2,82 +2,39 @@
+ /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+ /* Any copyright is dedicated to the Public Domain.
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+ // Check that "use strict" JS errors generate errors, not warnings.
+ 
+ "use strict";
+ 
+-add_task(function* () {
++add_task(async function () {
++  let hud = await openNewTabAndConsole("data:text/html;charset=utf8,empty page");
++
++  loadScriptURI("'use strict';var arguments;");
++  await waitForError(hud,
++    "SyntaxError: 'arguments' can't be defined or assigned to in strict mode code");
++
++  loadScriptURI("'use strict';function f(a, a) {};");
++  await waitForError(hud, "SyntaxError: duplicate formal argument a");
++
++  loadScriptURI("'use strict';var o = {get p() {}};o.p = 1;");
++  await waitForError(hud, 'TypeError: setting getter-only property "p"');
++
++  loadScriptURI("'use strict';v = 1;");
++  await waitForError(hud, "ReferenceError: assignment to undeclared variable v");
++});
++
++async function waitForError(hud, text) {
++  await waitFor(() => findMessage(hud, text, ".message.error"));
++  ok(true, "Received expected error message");
++}
++
++function loadScriptURI(script) {
+   // On e10s, the exception is triggered in child process
+   // and is ignored by test harness
+   if (!Services.appinfo.browserTabsRemoteAutostart) {
+     expectUncaughtException();
+   }
+-  yield loadTab("data:text/html;charset=utf8,<script>'use strict';var arguments;</script>");
+-
+-  let hud = yield openConsole();
+-
+-  yield waitForMessages({
+-    webconsole: hud,
+-    messages: [
+-      {
+-        text: "SyntaxError: 'arguments' can't be defined or assigned to in strict mode code",
+-        category: CATEGORY_JS,
+-        severity: SEVERITY_ERROR,
+-      },
+-    ],
+-  });
+-
+-  if (!Services.appinfo.browserTabsRemoteAutostart) {
+-    expectUncaughtException();
+-  }
+-  BrowserTestUtils.loadURI(gBrowser.selectedBrowser, "data:text/html;charset="
+-    + "utf8,<script>'use strict';function f(a, a) {};</script>");
+-
+-  yield waitForMessages({
+-    webconsole: hud,
+-    messages: [
+-      {
+-        text: "SyntaxError: duplicate formal argument a",
+-        category: CATEGORY_JS,
+-        severity: SEVERITY_ERROR,
+-      },
+-    ],
+-  });
+-
+-  if (!Services.appinfo.browserTabsRemoteAutostart) {
+-    expectUncaughtException();
+-  }
+-  BrowserTestUtils.loadURI(gBrowser.selectedBrowser, "data:text/html;charset="
+-    + "utf8,<script>'use strict';var o = {get p() {}};o.p = 1;</script>");
+-
+-  yield waitForMessages({
+-    webconsole: hud,
+-    messages: [
+-      {
+-        text: 'TypeError: setting getter-only property "p"',
+-        category: CATEGORY_JS,
+-        severity: SEVERITY_ERROR,
+-      },
+-    ],
+-  });
+-
+-  if (!Services.appinfo.browserTabsRemoteAutostart) {
+-    expectUncaughtException();
+-  }
+-  BrowserTestUtils.loadURI(gBrowser.selectedBrowser,
+-    "data:text/html;charset=utf8,<script>'use strict';v = 1;</script>");
+-
+-  yield waitForMessages({
+-    webconsole: hud,
+-    messages: [
+-      {
+-        text: "ReferenceError: assignment to undeclared variable v",
+-        category: CATEGORY_JS,
+-        severity: SEVERITY_ERROR,
+-      },
+-    ],
+-  });
+-
+-  hud = null;
+-});
++  let uri = "data:text/html;charset=utf8,<script>" + script + "</script>";
++  BrowserTestUtils.loadURI(gBrowser.selectedBrowser, uri);
++}

+ 72 - 0
mozilla-release/patches/1406061-58a1.patch

@@ -0,0 +1,72 @@
+# HG changeset patch
+# User Patrick Brosset <pbrosset@mozilla.com>
+# Date 1508399899 -7200
+# Node ID fc6cfc87908b324a06d742a8e573728f077ed331
+# Parent  d163aa353984332f1225df246da7b3cc563b9b55
+Bug 1406061 - Remove the unused Jsbeautify.jsm module; r=jdescottes
+
+MozReview-Commit-ID: KF39qXJ2s11
+
+diff --git a/devtools/client/shared/Jsbeautify.jsm b/devtools/client/shared/Jsbeautify.jsm
+deleted file mode 100644
+--- a/devtools/client/shared/Jsbeautify.jsm
++++ /dev/null
+@@ -1,16 +0,0 @@
+-/* This Source Code Form is subject to the terms of the Mozilla Public
+- * License, v. 2.0. If a copy of the MPL was not distributed with this
+- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+-
+-"use strict";
+-
+-/*
+- * JS Beautifier. Please use require("devtools/shared/jsbeautify/beautify") instead of
+- * this JSM.
+- */
+-
+-this.EXPORTED_SYMBOLS = [ "jsBeautify" ];
+-
+-const { require } = Cu.import("resource://devtools/shared/Loader.jsm", {});
+-const { beautify } = require("devtools/shared/jsbeautify/beautify");
+-const jsBeautify = beautify.js;
+diff --git a/devtools/client/shared/moz.build b/devtools/client/shared/moz.build
+--- a/devtools/client/shared/moz.build
++++ b/devtools/client/shared/moz.build
+@@ -29,17 +29,16 @@ DevToolsModules(
+     'developer-toolbar.js',
+     'devices.js',
+     'DOMHelpers.jsm',
+     'doorhanger.js',
+     'enum.js',
+     'file-saver.js',
+     'getjson.js',
+     'inplace-editor.js',
+-    'Jsbeautify.jsm',
+     'key-shortcuts.js',
+     'keycodes.js',
+     'natural-sort.js',
+     'network-throttling-profiles.js',
+     'node-attribute-parser.js',
+     'options-view.js',
+     'output-parser.js',
+     'poller.js',
+diff --git a/tools/lint/eslint/modules.json b/tools/lint/eslint/modules.json
+--- a/tools/lint/eslint/modules.json
++++ b/tools/lint/eslint/modules.json
+@@ -96,17 +96,16 @@
+   "history.jsm": ["HistoryEntry", "DumpHistory"],
+   "Http.jsm": ["httpRequest", "percentEncode"],
+   "httpd.js": ["HTTP_400", "HTTP_401", "HTTP_402", "HTTP_403", "HTTP_404", "HTTP_405", "HTTP_406", "HTTP_407", "HTTP_408", "HTTP_409", "HTTP_410", "HTTP_411", "HTTP_412", "HTTP_413", "HTTP_414", "HTTP_415", "HTTP_417", "HTTP_500", "HTTP_501", "HTTP_502", "HTTP_503", "HTTP_504", "HTTP_505", "HttpError", "HttpServer"],
+   "import_module.jsm": ["MODULE_IMPORTED", "MODULE_URI", "SUBMODULE_IMPORTED", "same_scope", "SUBMODULE_IMPORTED_TO_SCOPE"],
+   "import_sub_module.jsm": ["SUBMODULE_IMPORTED", "test_obj"],
+   "InlineSpellChecker.jsm": ["InlineSpellChecker", "SpellCheckHelper"],
+   "JNI.jsm": ["JNI", "android_log"],
+   "JSDOMParser.js": ["JSDOMParser"],
+-  "Jsbeautify.jsm": ["jsBeautify"],
+   "jsdebugger.jsm": ["addDebuggerToGlobal"],
+   "json2.js": ["JSON"],
+   "keys.js": ["BulkKeyBundle", "SyncKeyBundle"],
+   "kinto-http-client.js": ["KintoHttpClient"],
+   "kinto-offline-client.js": ["Kinto"],
+   "kinto-storage-adapter.js": ["FirefoxAdapter"],
+   "L10nRegistry.jsm": ["L10nRegistry", "FileSource", "IndexedFileSource"],
+   "loader-plugin-raw.jsm": ["requireRawId"],

+ 158 - 0
mozilla-release/patches/1406069-58a1.patch

@@ -0,0 +1,158 @@
+# HG changeset patch
+# User Nicolas Chevobbe <nchevobbe@mozilla.com>
+# Date 1509957796 -3600
+# Node ID deaf42e9dbecacba453afa921cad45f3dfeebc6c
+# Parent  e69006824024abdda5f7c751633f0d03de4a72c3
+Bug 1406069 - Enable browser_webconsole_cached_messages.js in new console frontend; r=jdescottes.
+
+MozReview-Commit-ID: EypyZoZUWeo
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -222,17 +222,16 @@ skip-if = true #       Bug 1403188
+ subsuite = clipboard
+ [browser_netmonitor_shows_reqs_in_webconsole.js]
+ [browser_webconsole_allow_mixedcontent_securityerrors.js]
+ tags = mcb
+ [browser_webconsole_batching.js]
+ [browser_webconsole_block_mixedcontent_securityerrors.js]
+ tags = mcb
+ [browser_webconsole_cached_messages.js]
+-skip-if = true #       Bug 1406069
+ [browser_webconsole_cd_iframe.js]
+ [browser_webconsole_certificate_messages.js]
+ skip-if = true # Bug 1408925
+ # old console skip-if = e10s # Bug 1042253 - webconsole tests disabled with e10s
+ [browser_webconsole_charset.js]
+ skip-if = true #       Bug 1404400
+ [browser_webconsole_chrome.js]
+ skip-if = true # Bug 1408926
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_cached_messages.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_cached_messages.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_cached_messages.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_cached_messages.js
+@@ -4,56 +4,46 @@
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+ // Test to see if the cached messages are displayed when the console UI is
+ // opened.
+ 
+ "use strict";
+ 
+ const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
+-                 "test/test-webconsole-error-observer.html";
++                 "new-console-output/test/mochitest/test-webconsole-error-observer.html";
+ 
+-// On e10s, the exception is triggered in child process
+-// and is ignored by test harness
+-if (!Services.appinfo.browserTabsRemoteAutostart) {
+-  expectUncaughtException();
+-}
++add_task(async function() {
++  // On e10s, the exception is triggered in child process
++  // and is ignored by test harness
++  if (!Services.appinfo.browserTabsRemoteAutostart) {
++    expectUncaughtException();
++  }
++  // Enable CSS filter for the test.
++  await pushPref("devtools.webconsole.filter.css", true);
+ 
+-function test() {
+-  waitForExplicitFinish();
++  await addTab(TEST_URI);
+ 
+-  loadTab(TEST_URI).then(testOpenUI);
+-}
++  info("Open the console");
++  let hud = await openConsole();
++  testMessagesVisibility(hud);
+ 
+-function testOpenUI(aTestReopen) {
+-  openConsole().then((hud) => {
+-    waitForMessages({
+-      webconsole: hud,
+-      messages: [
+-        {
+-          text: "log Bazzle",
+-          category: CATEGORY_WEBDEV,
+-          severity: SEVERITY_LOG,
+-        },
+-        {
+-          text: "error Bazzle",
+-          category: CATEGORY_WEBDEV,
+-          severity: SEVERITY_ERROR,
+-        },
+-        {
+-          text: "bazBug611032",
+-          category: CATEGORY_JS,
+-          severity: SEVERITY_ERROR,
+-        },
+-        {
+-          text: "cssColorBug611032",
+-          category: CATEGORY_CSS,
+-          severity: SEVERITY_WARNING,
+-        },
+-      ],
+-    }).then(() => {
+-      closeConsole(gBrowser.selectedTab).then(() => {
+-        aTestReopen && info("will reopen the Web Console");
+-        executeSoon(aTestReopen ? testOpenUI : finishTest);
+-      });
+-    });
+-  });
++  info("Close the toolbox");
++  await closeToolbox();
++
++  info("Open the console again");
++  hud = await openConsole();
++  testMessagesVisibility(hud);
++});
++
++function testMessagesVisibility(hud) {
++  let message = findMessage(hud, "log Bazzle", ".message.log");
++  ok(message, "console.log message is visible");
++
++  message = findMessage(hud, "error Bazzle", ".message.error");
++  ok(message, "console.error message is visible");
++
++  message = findMessage(hud, "bazBug611032", ".message.error");
++  ok(message, "exception message is visible");
++
++  message = findMessage(hud, "cssColorBug611032", ".message.warn.css");
++  ok(message, "css warning message is visible");
+ }
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/head.js b/devtools/client/webconsole/new-console-output/test/mochitest/head.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/head.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/head.js
+@@ -353,16 +353,31 @@ async function openDebugger(options = {}
+   // Do not clear VariableView lazily so it doesn't disturb test ending.
+   panel._view.Variables.lazyEmpty = false;
+ 
+   await panel.panelWin.DebuggerController.waitForSourcesLoaded();
+   return {target, toolbox, panel};
+ }
+ 
+ /**
++ * Open the Web Console for the given tab, or the current one if none given.
++ *
++ * @param nsIDOMElement tab
++ *        Optional tab element for which you want open the Web Console.
++ *        Defaults to current selected tab.
++ * @return Promise
++ *         A promise that is resolved with the console hud once the web console is open.
++ */
++async function openConsole(tab) {
++  let target = TargetFactory.forTab(tab || gBrowser.selectedTab);
++  const toolbox = await gDevTools.showToolbox(target, "webconsole");
++  return toolbox.getCurrentPanel().hud;
++};
++
++/**
+  * Fake clicking a link and return the URL we would have navigated to.
+  * This function should be used to check external links since we can't access
+  * network in tests.
+  * This can also be used to test that a click will not be fired.
+  *
+  * @param ElementNode element
+  *        The <a> element we want to simulate click on.
+  * @param Object clickEventProps

+ 160 - 0
mozilla-release/patches/1406841-59a1.patch

@@ -0,0 +1,160 @@
+# HG changeset patch
+# User Julian Descottes <jdescottes@mozilla.com>
+# Date 1515707703 -3600
+# Node ID 715ae6e13c973fefacf37fe9e2a6ba77a0c02e47
+# Parent  01d18c908b246e2d15db21aac6b54a84ca59af20
+Bug 1406841 - remove js property provider mochitests;r=bgrins
+
+The features tested here are already covered in
+- https://searchfox.org/mozilla-central/source/devtools/shared/webconsole/test/unit/test_js_property_provider.js
+- https://searchfox.org/mozilla-central/source/devtools/shared/webconsole/test/test_jsterm_autocomplete.html
+
+MozReview-Commit-ID: 1LY8mq5UvCA
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -343,19 +343,16 @@ subsuite = clipboard
+ skip-if = true #       Bug 1404364
+ # old console skip-if = (os == 'linux' && bits == 32 && debug) # bug 1328915, disable linux32 debug devtools for timeouts
+ [browser_webconsole_output_copy_newlines.js]
+ subsuite = clipboard
+ skip-if = true #       Bug 1405641
+ # old console skip-if = (os == 'linux' && bits == 32 && debug) # bug 1328915, disable linux32 debug devtools for timeouts
+ [browser_webconsole_output_order.js]
+ [browser_webconsole_persist.js]
+-[browser_webconsole_property_provider.js]
+-skip-if = true # Bug 1406841
+-#old console skip-if = e10s # Bug 1042253 - webconsole tests disabled with e10s
+ [browser_webconsole_prune_scroll.js]
+ skip-if = true #       Bug 1404832
+ [browser_webconsole_reflow.js]
+ skip-if = true #       Bug 1406022
+ [browser_webconsole_reopen_closed_tab.js]
+ [browser_webconsole_repeat_different_objects.js]
+ [browser_webconsole_repeated_messages_accuracy.js]
+ skip-if = true #       Bug 1403450
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_property_provider.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_property_provider.js
+deleted file mode 100644
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_property_provider.js
++++ /dev/null
+@@ -1,46 +0,0 @@
+-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+-/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+-/* Any copyright is dedicated to the Public Domain.
+- * http://creativecommons.org/publicdomain/zero/1.0/ */
+-
+-// Tests the property provider, which is part of the code completion
+-// infrastructure.
+-
+-"use strict";
+-
+-const TEST_URI = "data:text/html;charset=utf8,<p>test the JS property provider";
+-
+-function test() {
+-  loadTab(TEST_URI).then(testPropertyProvider);
+-}
+-
+-function testPropertyProvider({browser}) {
+-  browser.removeEventListener("load", testPropertyProvider, true);
+-  let {JSPropertyProvider} = require("devtools/shared/webconsole/js-property-provider");
+-
+-  let tmp = Cu.import("resource://gre/modules/jsdebugger.jsm", {});
+-  tmp.addDebuggerToGlobal(tmp);
+-  let dbg = new tmp.Debugger();
+-  let dbgWindow = dbg.addDebuggee(content);
+-
+-  let completion = JSPropertyProvider(dbgWindow, null, "thisIsNotDefined");
+-  is(completion.matches.length, 0, "no match for 'thisIsNotDefined");
+-
+-  // This is a case the PropertyProvider can't handle. Should return null.
+-  completion = JSPropertyProvider(dbgWindow, null, "window[1].acb");
+-  is(completion, null, "no match for 'window[1].acb");
+-
+-  // A very advanced completion case.
+-  let strComplete =
+-    "function a() { }document;document.getElementById(window.locatio";
+-  completion = JSPropertyProvider(dbgWindow, null, strComplete);
+-  ok(completion.matches.length == 2, "two matches found");
+-  ok(completion.matchProp == "locatio", "matching part is 'test'");
+-  let matches = completion.matches;
+-  matches.sort();
+-  ok(matches[0] == "location", "the first match is 'location'");
+-  ok(matches[1] == "locationbar", "the second match is 'locationbar'");
+-
+-  dbg.removeDebuggee(content);
+-  finishTest();
+-}
+diff --git a/devtools/client/webconsole/test/browser.ini b/devtools/client/webconsole/test/browser.ini
+--- a/devtools/client/webconsole/test/browser.ini
++++ b/devtools/client/webconsole/test/browser.ini
+@@ -344,18 +344,16 @@ skip-if = true # Bug 1298364
+ [browser_webconsole_netlogging_reset_filter.js]
+ [browser_webconsole_notifications.js]
+ [browser_webconsole_open-links-without-callback.js]
+ [browser_webconsole_promise.js]
+ [browser_webconsole_output_copy_newlines.js]
+ subsuite = clipboard
+ skip-if = (os == 'linux' && bits == 32 && debug) # bug 1328915, disable linux32 debug devtools for timeouts
+ [browser_webconsole_output_order.js]
+-[browser_webconsole_property_provider.js]
+-skip-if = e10s # Bug 1042253 - webconsole tests disabled with e10s
+ [browser_webconsole_scratchpad_panel_link.js]
+ [browser_webconsole_split.js]
+ [browser_webconsole_split_escape_key.js]
+ [browser_webconsole_split_focus.js]
+ [browser_webconsole_split_persist.js]
+ [browser_webconsole_trackingprotection_errors.js]
+ tags = trackingprotection
+ [browser_webconsole_view_source.js]
+diff --git a/devtools/client/webconsole/test/browser_webconsole_property_provider.js b/devtools/client/webconsole/test/browser_webconsole_property_provider.js
+deleted file mode 100644
+--- a/devtools/client/webconsole/test/browser_webconsole_property_provider.js
++++ /dev/null
+@@ -1,46 +0,0 @@
+-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+-/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+-/* Any copyright is dedicated to the Public Domain.
+- * http://creativecommons.org/publicdomain/zero/1.0/ */
+-
+-// Tests the property provider, which is part of the code completion
+-// infrastructure.
+-
+-"use strict";
+-
+-const TEST_URI = "data:text/html;charset=utf8,<p>test the JS property provider";
+-
+-function test() {
+-  loadTab(TEST_URI).then(testPropertyProvider);
+-}
+-
+-function testPropertyProvider({browser}) {
+-  browser.removeEventListener("load", testPropertyProvider, true);
+-  let {JSPropertyProvider} = require("devtools/shared/webconsole/js-property-provider");
+-
+-  let tmp = Cu.import("resource://gre/modules/jsdebugger.jsm", {});
+-  tmp.addDebuggerToGlobal(tmp);
+-  let dbg = new tmp.Debugger();
+-  let dbgWindow = dbg.addDebuggee(content);
+-
+-  let completion = JSPropertyProvider(dbgWindow, null, "thisIsNotDefined");
+-  is(completion.matches.length, 0, "no match for 'thisIsNotDefined");
+-
+-  // This is a case the PropertyProvider can't handle. Should return null.
+-  completion = JSPropertyProvider(dbgWindow, null, "window[1].acb");
+-  is(completion, null, "no match for 'window[1].acb");
+-
+-  // A very advanced completion case.
+-  let strComplete =
+-    "function a() { }document;document.getElementById(window.locatio";
+-  completion = JSPropertyProvider(dbgWindow, null, strComplete);
+-  ok(completion.matches.length == 2, "two matches found");
+-  ok(completion.matchProp == "locatio", "matching part is 'test'");
+-  let matches = completion.matches;
+-  matches.sort();
+-  ok(matches[0] == "location", "the first match is 'location'");
+-  ok(matches[1] == "locationbar", "the second match is 'locationbar'");
+-
+-  dbg.removeDebuggee(content);
+-  finishTest();
+-}

+ 166 - 0
mozilla-release/patches/1407178-59a1.patch

@@ -0,0 +1,166 @@
+# HG changeset patch
+# User Nicolas Chevobbe <nchevobbe@mozilla.com>
+# Date 1510145137 -3600
+# Node ID 4619d49c91f51f1d1297332991f2bfe0c51d3518
+# Parent  ab21020360fffdfd1ca187fea2c97bbaf3aaec9e
+Bug 1407178 - Enable browser_webconsole_certificate_messages.js in the new console; r=Honza.
+
+MozReview-Commit-ID: HbspABuW7e4
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -225,18 +225,16 @@ subsuite = clipboard
+ [browser_webconsole_allow_mixedcontent_securityerrors.js]
+ tags = mcb
+ [browser_webconsole_batching.js]
+ [browser_webconsole_block_mixedcontent_securityerrors.js]
+ tags = mcb
+ [browser_webconsole_cached_messages.js]
+ [browser_webconsole_cd_iframe.js]
+ [browser_webconsole_certificate_messages.js]
+-skip-if = true # Bug 1408925
+-# old console skip-if = e10s # Bug 1042253 - webconsole tests disabled with e10s
+ [browser_webconsole_charset.js]
+ skip-if = true #       Bug 1404400
+ [browser_webconsole_chrome.js]
+ skip-if = true # Bug 1408926
+ [browser_webconsole_click_function_to_source.js]
+ [browser_webconsole_clickable_urls.js]
+ [browser_webconsole_closing_after_completion.js]
+ skip-if = true # Bug 1408927
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_certificate_messages.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_certificate_messages.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_certificate_messages.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_certificate_messages.js
+@@ -2,80 +2,44 @@
+ /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+ /* Any copyright is dedicated to the Public Domain.
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+ // Tests that the Web Console shows weak crypto warnings (SHA-1 Certificate)
+ 
+ "use strict";
+ 
+-const TEST_URI = "data:text/html;charset=utf8,Web Console weak crypto " +
+-                 "warnings test";
+-const TEST_URI_PATH = "/browser/devtools/client/webconsole/test/" +
+-                      "test-certificate-messages.html";
++const TEST_URI = "data:text/html;charset=utf8,Web Console weak crypto warnings test";
++const TEST_URI_PATH = "/browser/devtools/client/webconsole/new-console-output/test/" +
++                      "mochitest/test-certificate-messages.html";
+ 
+-var gWebconsoleTests = [
+-  {url: "https://sha1ee.example.com" + TEST_URI_PATH,
+-   name: "SHA1 warning displayed successfully",
+-   warning: ["SHA-1"], nowarning: ["SSL 3.0", "RC4"]},
+-  {url: "https://sha256ee.example.com" + TEST_URI_PATH,
+-   name: "SSL warnings appropriately not present",
+-   warning: [], nowarning: ["SHA-1", "SSL 3.0", "RC4"]},
+-];
++const SHA1_URL = "https://sha1ee.example.com" + TEST_URI_PATH;
++const SHA256_URL = "https://sha256ee.example.com" + TEST_URI_PATH;
+ const TRIGGER_MSG = "If you haven't seen ssl warnings yet, you won't";
+ 
+-var gHud = undefined, gContentBrowser;
+-var gCurrentTest;
++const cache = Cc["@mozilla.org/netwerk/cache-storage-service;1"]
++  .getService(Ci.nsICacheStorageService);
++
++add_task(async function () {
++  const hud = await openNewTabAndConsole(TEST_URI);
+ 
+-function test() {
+-  registerCleanupFunction(function () {
+-    gHud = gContentBrowser = null;
+-  });
+-
+-  loadTab(TEST_URI).then(({browser}) => {
+-    gContentBrowser = browser;
+-    openConsole().then(runTestLoop);
+-  });
+-}
++  info("Test SHA1 warnings");
++  let onContentLog = waitForMessage(hud, TRIGGER_MSG);
++  let onSha1Warning = waitForMessage(hud, "SHA-1");
++  await loadDocument(SHA1_URL);
++  await Promise.all([onContentLog, onSha1Warning]);
+ 
+-function runTestLoop(theHud) {
+-  gCurrentTest = gWebconsoleTests.shift();
+-  if (!gCurrentTest) {
+-    finishTest();
+-    return;
+-  }
+-  if (!gHud) {
+-    gHud = theHud;
+-  }
+-  gHud.jsterm.clearOutput();
+-  gContentBrowser.addEventListener("load", onLoad, true);
+-  if (gCurrentTest.pref) {
+-    SpecialPowers.pushPrefEnv({"set": gCurrentTest.pref},
+-      function () {
+-        BrowserTestUtils.loadURI(gBrowser.selectedBrowser, gCurrentTest.url);
+-      });
+-  } else {
+-    BrowserTestUtils.loadURI(gBrowser.selectedBrowser, gCurrentTest.url);
+-  }
+-}
++  let {textContent} = hud.outputNode;
++  ok(!textContent.includes("SSL 3.0"), "There is no warning message for SSL 3.0");
++  ok(!textContent.includes("RC4"), "There is no warning message for RC4");
+ 
+-function onLoad() {
+-  gContentBrowser.removeEventListener("load", onLoad, true);
++  info("Test SSL warnings appropriately not present");
++  onContentLog = waitForMessage(hud, TRIGGER_MSG);
++  await loadDocument(SHA256_URL);
++  await onContentLog;
+ 
+-  waitForSuccess({
+-    name: gCurrentTest.name,
+-    validator: function () {
+-      if (gHud.outputNode.textContent.includes(TRIGGER_MSG)) {
+-        for (let warning of gCurrentTest.warning) {
+-          if (!gHud.outputNode.textContent.includes(warning)) {
+-            return false;
+-          }
+-        }
+-        for (let nowarning of gCurrentTest.nowarning) {
+-          if (gHud.outputNode.textContent.includes(nowarning)) {
+-            return false;
+-          }
+-        }
+-        return true;
+-      }
+-    }
+-  }).then(runTestLoop);
+-}
++  textContent = hud.outputNode.textContent;
++  ok(!textContent.includes("SHA-1"), "There is no warning message for SHA-1");
++  ok(!textContent.includes("SSL 3.0"), "There is no warning message for SSL 3.0");
++  ok(!textContent.includes("RC4"), "There is no warning message for RC4");
++
++  cache.clear();
++});
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/head.js b/devtools/client/webconsole/new-console-output/test/mochitest/head.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/head.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/head.js
+@@ -211,17 +211,17 @@ function hideContextMenu(hud) {
+   let onPopupHidden = once(popup, "popuphidden");
+   popup.hidePopup();
+   return onPopupHidden;
+ }
+ 
+ function loadDocument(url, browser = gBrowser.selectedBrowser) {
+   return new Promise(resolve => {
+     browser.addEventListener("load", resolve, {capture: true, once: true});
+-    BrowserTestUtils.loadURI(gBrowser.selectedBrowser, url);
++    BrowserTestUtils.loadURI(browser, url);
+   });
+ }
+ 
+ /**
+ * Returns a promise that resolves when the node passed as an argument mutate
+ * according to the passed configuration.
+ *
+ * @param {Node} node - The node to observe mutations on.

+ 137 - 0
mozilla-release/patches/1408893-59a1.patch

@@ -0,0 +1,137 @@
+# HG changeset patch
+# User Nicolas Chevobbe <nchevobbe@mozilla.com>
+# Date 1515153179 -3600
+# Node ID 253e9d9481f58e91e517626f171ba20ce38ce9d5
+# Parent  f3e1072ceb9f351e581733e770395312ccc9db46
+Bug 1408893 - Enable browser_webconsole_eval_in_debugger_stackframe2.js in the new console frontend; r=bgrins.
+
+MozReview-Commit-ID: Ej7flr2u3Ya
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -267,17 +267,16 @@ subsuite = clipboard
+ skip-if = (e10s && debug) || (e10s && os == 'win') # Bug 1221499 enabled these on windows
+ [browser_webconsole_cspro.js]
+ [browser_webconsole_document_focus.js]
+ [browser_webconsole_duplicate_errors.js]
+ skip-if = true #       Bug 1403907
+ [browser_webconsole_errors_after_page_reload.js]
+ [browser_webconsole_eval_in_debugger_stackframe.js]
+ [browser_webconsole_eval_in_debugger_stackframe2.js]
+-skip-if = true # Bug 1408893
+ [browser_webconsole_execution_scope.js]
+ [browser_webconsole_external_script_errors.js]
+ [browser_webconsole_file_uri.js]
+ skip-if = true #       Bug 1404382
+ [browser_webconsole_filter_scroll.js]
+ skip-if = true #       Bug 1404392
+ [browser_webconsole_filters.js]
+ [browser_webconsole_filters_persist.js]
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_eval_in_debugger_stackframe2.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_eval_in_debugger_stackframe2.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_eval_in_debugger_stackframe2.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_eval_in_debugger_stackframe2.js
+@@ -5,67 +5,61 @@
+ 
+ // Test to make sure that web console commands can fire while paused at a
+ // breakpoint that was triggered from a JS call.  Relies on asynchronous js
+ // evaluation over the protocol - see Bug 1088861.
+ 
+ "use strict";
+ 
+ const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
+-                 "test/test-eval-in-stackframe.html";
++                 "new-console-output/test/mochitest/test-eval-in-stackframe.html";
+ 
+-// Force the old debugger UI since it's directly used (see Bug 1301705)
+-Services.prefs.setBoolPref("devtools.debugger.new-debugger-frontend", false);
+-registerCleanupFunction(function* () {
+-  Services.prefs.clearUserPref("devtools.debugger.new-debugger-frontend");
+-});
++add_task(async function () {
++  // Force the old debugger UI since it's directly used (see Bug 1301705).
++  await pushPref("devtools.debugger.new-debugger-frontend", false);
+ 
+-add_task(function* () {
+-  yield loadTab(TEST_URI);
+-
+-  info("open the web console");
+-  let hud = yield openConsole();
+-  let {jsterm} = hud;
++  info("open the console");
++  const hud = await openNewTabAndConsole(TEST_URI);
++  const {jsterm} = hud;
+ 
+   info("open the debugger");
+-  let {panelWin} = yield openDebugger();
+-  let {DebuggerController} = panelWin;
+-  let {activeThread} = DebuggerController;
++  let {panel} = await openDebugger();
++  let {activeThread} = panel.panelWin.DebuggerController;
++
++  const onFirstCallFramesAdded = activeThread.addOneTimeListener("framesadded");
++  // firstCall calls secondCall, which has a debugger statement, so we'll be paused.
++  const onFirstCallMessageReceived = waitForMessage(hud, "undefined");
+ 
+-  let firstCall = defer();
+-  let frameAdded = defer();
+-  executeSoon(() => {
+-    info("Executing firstCall");
+-    activeThread.addOneTimeListener("framesadded", () => {
+-      executeSoon(frameAdded.resolve);
+-    });
+-    jsterm.execute("firstCall()").then(firstCall.resolve);
++  const unresolvedSymbol = Symbol();
++  let firstCallEvaluationResult = unresolvedSymbol;
++  onFirstCallMessageReceived.then(message => {
++    firstCallEvaluationResult = message;
+   });
++  jsterm.execute("firstCall()");
+ 
+   info("Waiting for a frame to be added");
+-  yield frameAdded.promise;
++  await onFirstCallFramesAdded;
++
++  info("frames added, select the console again");
++  await openConsole();
+ 
+   info("Executing basic command while paused");
+-  yield executeAndConfirm(jsterm, "1 + 2", "3");
++  let onMessageReceived = waitForMessage(hud, "3");
++  jsterm.execute("1 + 2");
++  let message = await onMessageReceived;
++  ok(message, "`1 + 2` was evaluated whith debugger paused");
+ 
+   info("Executing command using scoped variables while paused");
+-  yield executeAndConfirm(jsterm, "foo + foo2",
+-                          '"globalFooBug783499foo2SecondCall"');
++  onMessageReceived = waitForMessage(hud, `"globalFooBug783499foo2SecondCall"`);
++  jsterm.execute("foo + foo2");
++  message = await onMessageReceived;
++  ok(message, "`foo + foo2` was evaluated as expected with debugger paused");
++
++  info("Checking the first command, which is the last to resolve since it paused");
++  ok(firstCallEvaluationResult === unresolvedSymbol, "firstCall was not evaluated yet");
+ 
+   info("Resuming the thread");
+   activeThread.resume();
+ 
+-  info("Checking the first command, which is the last to resolve since it " +
+-       "paused");
+-  let node = yield firstCall.promise;
+-  is(node.querySelector(".message-body").textContent,
+-     "undefined",
+-     "firstCall() returned correct value");
++  message = await onFirstCallMessageReceived;
++  ok(firstCallEvaluationResult !== unresolvedSymbol,
++    "firstCall() returned correct value");
+ });
+-
+-function* executeAndConfirm(jsterm, input, output) {
+-  info("Executing command `" + input + "`");
+-
+-  let node = yield jsterm.execute(input);
+-
+-  is(node.querySelector(".message-body").textContent, output,
+-     "Expected result from call to " + input);
+-}

+ 122 - 0
mozilla-release/patches/1408916-58a1.patch

@@ -0,0 +1,122 @@
+# HG changeset patch
+# User Nicolas Chevobbe <nchevobbe@mozilla.com>
+# Date 1508397399 -7200
+# Node ID 3bbd725cdba3dbebbb5553a747b2f9acbf064da2
+# Parent  6270360e94ebe8d5a4a31ec75e12d29bb7491687
+Bug 1408916 - Rename and enable browser_webconsole_autocomplete-properties-with-non-alphanumeric-names.js in the new console frontend; r=bgrins.
+
+MozReview-Commit-ID: DCFWNLGhCSM
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -198,16 +198,17 @@ skip-if = true #       Bug 1403188
+ # old console skip-if = e10s # Bug 1042253 - webconsole e10s tests
+ [browser_jsterm_add_edited_input_to_history.js]
+ [browser_jsterm_autocomplete_array_no_index.js]
+ [browser_jsterm_autocomplete_escape_key.js]
+ [browser_jsterm_autocomplete_inside_text.js]
+ [browser_jsterm_autocomplete_nav_and_tab_key.js]
+ [browser_jsterm_autocomplete_return_key_no_selection.js]
+ [browser_jsterm_autocomplete_return_key.js]
++[browser_jsterm_autocomplete-properties-with-non-alphanumeric-names.js]
+ [browser_jsterm_copy_command.js]
+ skip-if = true
+ subsuite = clipboard
+ # old console skip-if = (os == 'linux' && bits == 32 && debug) # bug 1328915, disable linux32 debug devtools for timeouts
+ [browser_jsterm_dollar.js]
+ [browser_jsterm_history_persist.js]
+ [browser_jsterm_inspect.js]
+ [browser_jsterm_no_autocompletion_on_defined_variables.js]
+@@ -217,18 +218,16 @@ subsuite = clipboard
+ [browser_jsterm_popup.js]
+ [browser_jsterm_selfxss.js]
+ subsuite = clipboard
+ [browser_netmonitor_shows_reqs_in_webconsole.js]
+ [browser_webconsole_allow_mixedcontent_securityerrors.js]
+ tags = mcb
+ [browser_webconsole_assert.js]
+ skip-if = true #       Bug 1403458
+-[browser_webconsole_autocomplete-properties-with-non-alphanumeric-names.js]
+-skip-if = true # Bug 1408916
+ [browser_webconsole_autocomplete_JSTerm_helpers.js]
+ skip-if = true # Bug 1408917
+ [browser_webconsole_autocomplete_accessibility.js]
+ skip-if = true # Bug 1408918
+ [browser_webconsole_autocomplete_crossdomain_iframe.js]
+ skip-if = true # Bug 1408919
+ [browser_webconsole_autocomplete_in_debugger_stackframe.js]
+ skip-if = true # Bug 1408920
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_autocomplete-properties-with-non-alphanumeric-names.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_autocomplete-properties-with-non-alphanumeric-names.js
+rename from devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_autocomplete-properties-with-non-alphanumeric-names.js
+rename to devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_autocomplete-properties-with-non-alphanumeric-names.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_autocomplete-properties-with-non-alphanumeric-names.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_autocomplete-properties-with-non-alphanumeric-names.js
+@@ -2,46 +2,38 @@
+ /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+ /* Any copyright is dedicated to the Public Domain.
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+ "use strict";
+ 
+ // Test that properties starting with underscores or dollars can be
+ // autocompleted (bug 967468).
+-
+-add_task(function* () {
+-  const TEST_URI = "data:text/html;charset=utf8,test autocompletion with " +
+-                   "$ or _";
+-  yield loadTab(TEST_URI);
+-
+-  function* autocomplete(term) {
+-    let deferred = defer();
++const TEST_URI = "data:text/html;charset=utf8,test autocompletion with $ or _";
+ 
+-    jsterm.setInputValue(term);
+-    jsterm.complete(jsterm.COMPLETE_HINT_ONLY, deferred.resolve);
+-
+-    yield deferred.promise;
++add_task(async function () {
++  let { jsterm } = await openNewTabAndConsole(TEST_URI);
+ 
+-    ok(popup.itemCount > 0,
+-       "There's " + popup.itemCount + " suggestions for '" + term + "'");
+-  }
+-
+-  let { jsterm } = yield openConsole();
+-  let popup = jsterm.autocompletePopup;
+-
+-  yield jsterm.execute("var testObject = {$$aaab: '', $$aaac: ''}");
++  await jsterm.execute("var testObject = {$$aaab: '', $$aaac: ''}");
+ 
+   // Should work with bug 967468.
+-  yield autocomplete("Object.__d");
+-  yield autocomplete("testObject.$$a");
++  await testAutocomplete(jsterm, "Object.__d");
++  await testAutocomplete(jsterm, "testObject.$$a");
+ 
+   // Here's when things go wrong in bug 967468.
+-  yield autocomplete("Object.__de");
+-  yield autocomplete("testObject.$$aa");
++  await testAutocomplete(jsterm, "Object.__de");
++  await testAutocomplete(jsterm, "testObject.$$aa");
+ 
+   // Should work with bug 1207868.
+-  yield jsterm.execute("let foobar = {a: ''}; const blargh = {a: 1};");
+-  yield autocomplete("foobar");
+-  yield autocomplete("blargh");
+-  yield autocomplete("foobar.a");
+-  yield autocomplete("blargh.a");
++  await jsterm.execute("let foobar = {a: ''}; const blargh = {a: 1};");
++  await testAutocomplete(jsterm, "foobar");
++  await testAutocomplete(jsterm, "blargh");
++  await testAutocomplete(jsterm, "foobar.a");
++  await testAutocomplete(jsterm, "blargh.a");
+ });
++
++async function testAutocomplete(jsterm, inputString) {
++  jsterm.setInputValue(inputString);
++  await new Promise(resolve => jsterm.complete(jsterm.COMPLETE_HINT_ONLY, resolve));
++
++  let popup = jsterm.autocompletePopup;
++  ok(popup.itemCount > 0, `There's ${popup.itemCount} suggestions for '${inputString}'`);
++}

+ 155 - 0
mozilla-release/patches/1408917-58a1.patch

@@ -0,0 +1,155 @@
+# HG changeset patch
+# User Nicolas Chevobbe <nchevobbe@mozilla.com>
+# Date 1508485254 -7200
+# Node ID 7265bb271a9bac8d97755c050eaf8d12888e9f26
+# Parent  e6a26bb93868629f746e41f5dc7083f79c71dedd
+Bug 1408917 - Rename, refactor and enable browser_webconsole_autocomplete_JSTerm_helpers.js in new console frontend; r=Honza.
+
+MozReview-Commit-ID: 3TN6q63mnHp
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -194,16 +194,17 @@ skip-if = true # Bug 1406060
+ [browser_console_webconsole_iframe_messages.js]
+ skip-if = true # Bug 1406060
+ [browser_console_webconsole_private_browsing.js]
+ skip-if = true #       Bug 1403188
+ # old console skip-if = e10s # Bug 1042253 - webconsole e10s tests
+ [browser_jsterm_add_edited_input_to_history.js]
+ [browser_jsterm_autocomplete_array_no_index.js]
+ [browser_jsterm_autocomplete_escape_key.js]
++[browser_jsterm_autocomplete_helpers.js]
+ [browser_jsterm_autocomplete_inside_text.js]
+ [browser_jsterm_autocomplete_nav_and_tab_key.js]
+ [browser_jsterm_autocomplete_return_key_no_selection.js]
+ [browser_jsterm_autocomplete_return_key.js]
+ [browser_jsterm_autocomplete-properties-with-non-alphanumeric-names.js]
+ [browser_jsterm_copy_command.js]
+ skip-if = true
+ subsuite = clipboard
+@@ -218,18 +219,16 @@ subsuite = clipboard
+ [browser_jsterm_popup.js]
+ [browser_jsterm_selfxss.js]
+ subsuite = clipboard
+ [browser_netmonitor_shows_reqs_in_webconsole.js]
+ [browser_webconsole_allow_mixedcontent_securityerrors.js]
+ tags = mcb
+ [browser_webconsole_assert.js]
+ skip-if = true #       Bug 1403458
+-[browser_webconsole_autocomplete_JSTerm_helpers.js]
+-skip-if = true # Bug 1408917
+ [browser_webconsole_autocomplete_accessibility.js]
+ skip-if = true # Bug 1408918
+ [browser_webconsole_autocomplete_crossdomain_iframe.js]
+ skip-if = true # Bug 1408919
+ [browser_webconsole_autocomplete_in_debugger_stackframe.js]
+ skip-if = true # Bug 1408920
+ [browser_webconsole_batching.js]
+ [browser_webconsole_block_mixedcontent_securityerrors.js]
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_autocomplete_JSTerm_helpers.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_autocomplete_helpers.js
+rename from devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_autocomplete_JSTerm_helpers.js
+rename to devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_autocomplete_helpers.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_autocomplete_JSTerm_helpers.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_autocomplete_helpers.js
+@@ -1,77 +1,37 @@
+ /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+ /* Any copyright is dedicated to the Public Domain.
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+ // Tests that the autocompletion results contain the names of JSTerm helpers.
++// See Bug 686937.
+ 
+ "use strict";
+ 
+-// See Bug 686937.
+ 
+-const TEST_URI = "data:text/html;charset=utf8,<p>test JSTerm Helpers " +
+-                 "autocomplete";
+-
+-var jsterm;
+-
+-add_task(function* () {
+-  yield loadTab(TEST_URI);
+-
+-  let hud = yield openConsole();
+-
+-  jsterm = hud.jsterm;
+-  let input = jsterm.inputNode;
+-  let popup = jsterm.autocompletePopup;
+-
+-  // Test if 'i' gives 'inspect'
+-  input.value = "i";
+-  input.setSelectionRange(1, 1);
+-  yield complete(jsterm.COMPLETE_HINT_ONLY);
+-
+-  let newItems = popup.getItems().map(function (e) {
+-    return e.label;
+-  });
+-  ok(newItems.indexOf("inspect") > -1,
+-     "autocomplete results contain helper 'inspect'");
++const TEST_URI = "data:text/html;charset=utf8,<p>test JSTerm Helpers autocomplete";
+ 
+-  // Test if 'window.' does not give 'inspect'.
+-  input.value = "window.";
+-  input.setSelectionRange(7, 7);
+-  yield complete(jsterm.COMPLETE_HINT_ONLY);
+-
+-  newItems = popup.getItems().map(function (e) {
+-    return e.label;
+-  });
+-  is(newItems.indexOf("inspect"), -1,
+-     "autocomplete results do not contain helper 'inspect'");
+-
+-  // Test if 'dump(i' gives 'inspect'
+-  input.value = "dump(i";
+-  input.setSelectionRange(6, 6);
+-  yield complete(jsterm.COMPLETE_HINT_ONLY);
+-
+-  newItems = popup.getItems().map(function (e) {
+-    return e.label;
+-  });
+-  ok(newItems.indexOf("inspect") > -1,
+-     "autocomplete results contain helper 'inspect'");
+-
+-  // Test if 'window.dump(i' gives 'inspect'
+-  input.value = "window.dump(i";
+-  input.setSelectionRange(13, 13);
+-  yield complete(jsterm.COMPLETE_HINT_ONLY);
+-
+-  newItems = popup.getItems().map(function (e) {
+-    return e.label;
+-  });
+-  ok(newItems.indexOf("inspect") > -1,
+-     "autocomplete results contain helper 'inspect'");
+-
+-  jsterm = null;
++add_task(async function () {
++  const {jsterm} = await openNewTabAndConsole(TEST_URI);
++  await testInspectAutoCompletion(jsterm, "i", true);
++  await testInspectAutoCompletion(jsterm, "window.", false);
++  await testInspectAutoCompletion(jsterm, "dump(i", true);
++  await testInspectAutoCompletion(jsterm, "window.dump(i", true);
+ });
+ 
+-function complete(type) {
+-  let updated = jsterm.once("autocomplete-updated");
+-  jsterm.complete(type);
++async function testInspectAutoCompletion(jsterm, inputValue, expectInspect) {
++  jsterm.setInputValue(inputValue);
++  await complete(jsterm);
++  is(getPopupItemsLabel(jsterm.autocompletePopup).includes("inspect"), expectInspect,
++    `autocomplete results${expectInspect ? "" : " does not"} contain helper 'inspect'`);
++}
++
++function complete(jsterm) {
++  const updated = jsterm.once("autocomplete-updated");
++  jsterm.complete(jsterm.COMPLETE_HINT_ONLY);
+   return updated;
+ }
++
++function getPopupItemsLabel(popup) {
++  return popup.getItems().map(item => item.label);
++}
+\ No newline at end of file

+ 118 - 0
mozilla-release/patches/1408918-58a1.patch

@@ -0,0 +1,118 @@
+# HG changeset patch
+# User Nicolas Chevobbe <nchevobbe@mozilla.com>
+# Date 1508742434 -7200
+# Node ID 85bf688121c0da7a63e7b6018f225d731f768ffb
+# Parent  a6496e6269120799c5f3437359d40bb1ed15a456
+Bug 1408918 - Rename and enable browser_webconsole_autocomplete_accessibility.js in new console frontend; r=Honza
+
+MozReview-Commit-ID: CknvP7M1rVJ
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -191,16 +191,17 @@ skip-if = true # Bug 1406060
+ skip-if = true # Bug 1406060
+ [browser_console_webconsole_ctrlw_close_tab.js]
+ skip-if = true # Bug 1406060
+ [browser_console_webconsole_iframe_messages.js]
+ skip-if = true # Bug 1406060
+ [browser_console_webconsole_private_browsing.js]
+ skip-if = true #       Bug 1403188
+ # old console skip-if = e10s # Bug 1042253 - webconsole e10s tests
++[browser_jsterm_accessibility.js]
+ [browser_jsterm_add_edited_input_to_history.js]
+ [browser_jsterm_autocomplete_array_no_index.js]
+ [browser_jsterm_autocomplete_escape_key.js]
+ [browser_jsterm_autocomplete_helpers.js]
+ [browser_jsterm_autocomplete_inside_text.js]
+ [browser_jsterm_autocomplete_nav_and_tab_key.js]
+ [browser_jsterm_autocomplete_return_key_no_selection.js]
+ [browser_jsterm_autocomplete_return_key.js]
+@@ -216,18 +217,16 @@ skip-if = true #       Bug 1403188
+ [browser_jsterm_popup.js]
+ [browser_jsterm_selfxss.js]
+ subsuite = clipboard
+ [browser_netmonitor_shows_reqs_in_webconsole.js]
+ [browser_webconsole_allow_mixedcontent_securityerrors.js]
+ tags = mcb
+ [browser_webconsole_assert.js]
+ skip-if = true #       Bug 1403458
+-[browser_webconsole_autocomplete_accessibility.js]
+-skip-if = true # Bug 1408918
+ [browser_webconsole_autocomplete_crossdomain_iframe.js]
+ skip-if = true # Bug 1408919
+ [browser_webconsole_autocomplete_in_debugger_stackframe.js]
+ skip-if = true # Bug 1408920
+ [browser_webconsole_batching.js]
+ [browser_webconsole_block_mixedcontent_securityerrors.js]
+ tags = mcb
+ [browser_webconsole_cached_autocomplete.js]
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_autocomplete_accessibility.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_accessibility.js
+rename from devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_autocomplete_accessibility.js
+rename to devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_accessibility.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_autocomplete_accessibility.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_accessibility.js
+@@ -5,56 +5,54 @@
+ 
+ // Tests that the autocomplete input is being blurred and focused when selecting a value.
+ // This will help screen-readers notify users of the value that was set in the input.
+ 
+ "use strict";
+ 
+ const TEST_URI = "data:text/html;charset=utf8,<p>test code completion";
+ 
+-add_task(function* () {
+-  yield loadTab(TEST_URI);
+-
+-  let hud = yield openConsole();
++add_task(async function () {
++  let hud = await openNewTabAndConsole(TEST_URI);
+ 
+   let jsterm = hud.jsterm;
+   let input = jsterm.inputNode;
+ 
+   info("Type 'd' to open the autocomplete popup");
+-  yield autocomplete(jsterm, "d");
++  await autocomplete(jsterm, "d");
+ 
+   // Add listeners for focus and blur events.
+   let wasBlurred = false;
+   input.addEventListener("blur", () => {
+     wasBlurred = true;
+   }, {
+     once: true
+   });
+ 
+   let wasFocused = false;
+-  input.addEventListener("blur", () => {
++  input.addEventListener("focus", () => {
+     ok(wasBlurred, "jsterm input received a blur event before received back the focus");
+     wasFocused = true;
+   }, {
+     once: true
+   });
+ 
+   info("Close the autocomplete popup by simulating a TAB key event");
+   let onPopupClosed = jsterm.autocompletePopup.once("popup-closed");
+   EventUtils.synthesizeKey("VK_TAB", {});
+ 
+   info("Wait for the autocomplete popup to be closed");
+-  yield onPopupClosed;
++  await onPopupClosed;
+ 
+   ok(wasFocused, "jsterm input received a focus event");
+ });
+ 
+-function* autocomplete(jsterm, value) {
++async function autocomplete(jsterm, value) {
+   let popup = jsterm.autocompletePopup;
+ 
+-  yield new Promise(resolve => {
++  await new Promise(resolve => {
+     jsterm.setInputValue(value);
+     jsterm.complete(jsterm.COMPLETE_HINT_ONLY, resolve);
+   });
+ 
+   ok(popup.isOpen && popup.itemCount > 0,
+     "Autocomplete popup is open and contains suggestions");
+ }

+ 284 - 0
mozilla-release/patches/1408919-58a1.patch

@@ -0,0 +1,284 @@
+# HG changeset patch
+# User Nicolas Chevobbe <nchevobbe@mozilla.com>
+# Date 1509629085 -3600
+# Node ID ab8cb0873ccb66992d3fa34d7290125c910aee08
+# Parent  a538dd81a97ce4a0281dd307bc6f7ebed1ac6790
+Bug 1408919 - Rename and enable browser_webconsole_autocomplete_crossdomain_iframe.js; r=Honza.
+
+This bug also renames the support file, and create a dedicated one for the child iframe.
+An helper method is created to only wait for a single message with given text in it, as
+well as returning an array of matched message in waitForMessages (we were returning the
+result of setting the listener, which I doubt is useful for any test.
+
+MozReview-Commit-ID: Gz7zqX825oR
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -89,17 +89,18 @@ support-files =
+   test-bug-782653-css-errors-1.css
+   test-bug-782653-css-errors-2.css
+   test-bug-782653-css-errors.html
+   test-bug-837351-security-errors.html
+   test-bug-859170-longstring-hang.html
+   test-bug-869003-iframe.html
+   test-bug-869003-top-window.html
+   test-bug-952277-highlight-nodes-in-vview.html
+-  test-bug-989025-iframe-parent.html
++  test-iframe-child.html
++  test-iframe-parent.html
+   test-certificate-messages.html
+   test-click-function-to-source.html
+   test-click-function-to-source.js
+   test-closure-optimized-out.html
+   test-closures.html
+   test-console-api-stackframe.html
+   test-console-clear.html
+   test-console-column.html
+@@ -194,16 +195,17 @@ skip-if = true # Bug 1406060
+ skip-if = true # Bug 1406060
+ [browser_console_webconsole_private_browsing.js]
+ skip-if = true #       Bug 1403188
+ # old console skip-if = e10s # Bug 1042253 - webconsole e10s tests
+ [browser_jsterm_accessibility.js]
+ [browser_jsterm_add_edited_input_to_history.js]
+ [browser_jsterm_autocomplete_array_no_index.js]
+ [browser_jsterm_autocomplete_cached_results.js]
++[browser_jsterm_autocomplete_crossdomain_iframe.js]
+ [browser_jsterm_autocomplete_escape_key.js]
+ [browser_jsterm_autocomplete_helpers.js]
+ [browser_jsterm_autocomplete_inside_text.js]
+ [browser_jsterm_autocomplete_nav_and_tab_key.js]
+ [browser_jsterm_autocomplete_return_key_no_selection.js]
+ [browser_jsterm_autocomplete_return_key.js]
+ [browser_jsterm_autocomplete-properties-with-non-alphanumeric-names.js]
+ [browser_jsterm_copy_command.js]
+@@ -215,18 +217,16 @@ skip-if = true #       Bug 1403188
+ [browser_jsterm_no_input_change_and_tab_key_pressed.js]
+ [browser_jsterm_popup_close_on_tab_switch.js]
+ [browser_jsterm_popup.js]
+ [browser_jsterm_selfxss.js]
+ subsuite = clipboard
+ [browser_netmonitor_shows_reqs_in_webconsole.js]
+ [browser_webconsole_allow_mixedcontent_securityerrors.js]
+ tags = mcb
+-[browser_webconsole_autocomplete_crossdomain_iframe.js]
+-skip-if = true # Bug 1408919
+ [browser_webconsole_autocomplete_in_debugger_stackframe.js]
+ skip-if = true # Bug 1408920
+ [browser_webconsole_batching.js]
+ [browser_webconsole_block_mixedcontent_securityerrors.js]
+ tags = mcb
+ [browser_webconsole_cached_messages.js]
+ skip-if = true #       Bug 1406069
+ [browser_webconsole_cd_iframe.js]
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_autocomplete_crossdomain_iframe.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_autocomplete_crossdomain_iframe.js
+rename from devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_autocomplete_crossdomain_iframe.js
+rename to devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_autocomplete_crossdomain_iframe.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_autocomplete_crossdomain_iframe.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_autocomplete_crossdomain_iframe.js
+@@ -1,64 +1,37 @@
+-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+-/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+ /* Any copyright is dedicated to the Public Domain.
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+ // Test that autocomplete doesn't break when trying to reach into objects from
+-// a different domain, bug 989025.
++// a different domain. See Bug 989025.
+ 
+ "use strict";
+ 
+-function test() {
+-  let hud;
+-
+-  const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
+-                   "test/test-bug-989025-iframe-parent.html";
+-
+-  Task.spawn(function* () {
+-    const {tab} = yield loadTab(TEST_URI);
+-    hud = yield openConsole(tab);
+-
+-    hud.jsterm.execute("document.title");
++const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
++                 "new-console-output/test/mochitest/test-iframe-parent.html";
++add_task(async function () {
++  const hud = await openNewTabAndConsole(TEST_URI);
++  const { jsterm } = hud;
+ 
+-    yield waitForMessages({
+-      webconsole: hud,
+-      messages: [{
+-        text: "989025 - iframe parent",
+-        category: CATEGORY_OUTPUT,
+-      }],
+-    });
+-
+-    let autocompleteUpdated = hud.jsterm.once("autocomplete-updated");
+-
+-    hud.jsterm.setInputValue("window[0].document");
+-    executeSoon(() => {
+-      EventUtils.synthesizeKey(".", {});
+-    });
++  const onParentTitle = waitForMessage(hud, "iframe parent");
++  jsterm.execute("document.title");
++  await onParentTitle;
++  ok(true, "root document's title is accessible");
+ 
+-    yield autocompleteUpdated;
+-
+-    hud.jsterm.setInputValue("window[0].document.title");
+-    EventUtils.synthesizeKey("VK_RETURN", {});
+-
+-    yield waitForMessages({
+-      webconsole: hud,
+-      messages: [{
+-        text: "Permission denied",
+-        category: CATEGORY_OUTPUT,
+-        severity: SEVERITY_ERROR,
+-      }],
+-    });
++  // Make sure we don't throw when trying to autocomplete
++  let autocompleteUpdated = hud.jsterm.once("autocomplete-updated");
++  jsterm.setInputValue("window[0].document");
++  EventUtils.synthesizeKey(".", {});
++  await autocompleteUpdated;
+ 
+-    hud.jsterm.execute("window.location");
++  hud.jsterm.setInputValue("window[0].document.title");
++  const onPermissionDeniedMessage = waitForMessage(hud, "Permission denied");
++  EventUtils.synthesizeKey("VK_RETURN", {});
++  const permissionDenied = await onPermissionDeniedMessage;
++  ok(permissionDenied.node.classList.contains("error"),
++    "A message error is shown when trying to inspect window[0]");
+ 
+-    yield waitForMessages({
+-      webconsole: hud,
+-      messages: [{
+-        text: "test-bug-989025-iframe-parent.html",
+-        category: CATEGORY_OUTPUT,
+-      }],
+-    });
+-
+-    yield closeConsole(tab);
+-  }).then(finishTest);
+-}
++  const onParentLocation = waitForMessage(hud, "test-iframe-parent.html");
++  hud.jsterm.execute("window.location");
++  await onParentLocation;
++  ok(true, "root document's location is accessible");
++});
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/head.js b/devtools/client/webconsole/new-console-output/test/mochitest/head.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/head.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/head.js
+@@ -72,50 +72,64 @@ async function openNewTabAndConsole(url,
+ 
+ /**
+  * Wait for messages in the web console output, resolving once they are received.
+  *
+  * @param object options
+  *        - hud: the webconsole
+  *        - messages: Array[Object]. An array of messages to match.
+             Current supported options:
+- *            - text: Exact text match in .message-body
++ *            - text: Partial text match in .message-body
+  */
+ function waitForMessages({ hud, messages }) {
+   return new Promise(resolve => {
+-    let numMatched = 0;
++    const matchedMessages = [];
+     let receivedLog = hud.ui.on("new-messages",
+       function messagesReceived(e, newMessages) {
+         for (let message of messages) {
+           if (message.matched) {
+             continue;
+           }
+ 
+           for (let newMessage of newMessages) {
+             let messageBody = newMessage.node.querySelector(".message-body");
+             if (messageBody.textContent.includes(message.text)) {
+-              numMatched++;
++              matchedMessages.push(newMessage);
+               message.matched = true;
+-              info("Matched a message with text: " + message.text +
+-                ", still waiting for " + (messages.length - numMatched) + " messages");
++              const messagesLeft = messages.length - matchedMessages.length;
++              info(`Matched a message with text: "${message.text}", ` + (messagesLeft > 0
++                ? `still waiting for ${messagesLeft} messages.`
++                : `all messages received.`)
++              );
+               break;
+             }
+           }
+ 
+-          if (numMatched === messages.length) {
++          if (matchedMessages.length === messages.length) {
+             hud.ui.off("new-messages", messagesReceived);
+-            resolve(receivedLog);
++            resolve(matchedMessages);
+             return;
+           }
+         }
+       });
+   });
+ }
+ 
+ /**
++ * Wait for a single message in the web console output, resolving once it is received.
++ *
++ * @param {Object} hud : the webconsole
++ * @param {String} text : text included in .message-body
++ */
++async function waitForMessage(hud, text) {
++  const messages = await waitForMessages({hud, messages: [{text}]});
++  return messages[0];
++}
++
++/**
+  * Wait for a predicate to return a result.
+  *
+  * @param function condition
+  *        Invoked once in a while until it returns a truthy value. This should be an
+  *        idempotent function, since we have to run it a second time after it returns
+  *        true in order to return the value.
+  * @param string message [optional]
+  *        A message to output if the condition fails.
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/test-iframe-child.html b/devtools/client/webconsole/new-console-output/test/mochitest/test-iframe-child.html
+new file mode 100644
+--- /dev/null
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/test-iframe-child.html
+@@ -0,0 +1,12 @@
++<!-- Any copyright is dedicated to the Public Domain.
++     http://creativecommons.org/publicdomain/zero/1.0/ -->
++<!DOCTYPE html>
++<html lang="en">
++  <head>
++    <meta charset="utf-8">
++    <title>test for bug 989025 - iframe child</title>
++  </head>
++  <body>
++    <p>test for bug 989025 - iframe child</p>
++  </body>
++</html>
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-989025-iframe-parent.html b/devtools/client/webconsole/new-console-output/test/mochitest/test-iframe-parent.html
+rename from devtools/client/webconsole/new-console-output/test/mochitest/test-bug-989025-iframe-parent.html
+rename to devtools/client/webconsole/new-console-output/test/mochitest/test-iframe-parent.html
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-989025-iframe-parent.html
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/test-iframe-parent.html
+@@ -1,13 +1,13 @@
++<!-- Any copyright is dedicated to the Public Domain.
++     http://creativecommons.org/publicdomain/zero/1.0/ -->
+ <!DOCTYPE html>
+ <html lang="en">
+   <head>
+     <meta charset="utf-8">
+     <title>test for bug 989025 - iframe parent</title>
+-    <!-- Any copyright is dedicated to the Public Domain.
+-         http://creativecommons.org/publicdomain/zero/1.0/ -->
+   </head>
+   <body>
+     <p>test for bug 989025 - iframe parent</p>
+-    <iframe src="http://mochi.test:8888/browser/devtools/client/webconsole/test/test-bug-609872-cd-iframe-child.html"></iframe>
++    <iframe src="http://mochi.test:8888/browser/devtools/client/webconsole/new-console-output/test/mochitest/test-iframe-child.html"></iframe>
+   </body>
+ </html>

+ 576 - 0
mozilla-release/patches/1408920-58a1.patch

@@ -0,0 +1,576 @@
+# HG changeset patch
+# User Nicolas Chevobbe <nchevobbe@mozilla.com>
+# Date 1509702409 -3600
+# Node ID 8823f33351025e25a949160bc23bae9fba9aac5f
+# Parent  14ff22c2001aab9158d47d265e893f57e5475568
+Bug 1408920 - Rename and enable browser_webconsole_autocomplete_in_debugger_stackframe.js; r=jdescottes.
+
+We take this as an opportunity to add a jsterm helper function to set its value and
+wait for completion, and use it in a test where we did the same thing.
+This also copies the openDebugger helper from the old frontend head.js .
+The test still uses the old debugger, since it will be fixed in a specific bug
+for all the console tests.
+
+MozReview-Commit-ID: AKB3CBY8GPv
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -198,16 +198,17 @@ skip-if = true #       Bug 1403188
+ # old console skip-if = e10s # Bug 1042253 - webconsole e10s tests
+ [browser_jsterm_accessibility.js]
+ [browser_jsterm_add_edited_input_to_history.js]
+ [browser_jsterm_autocomplete_array_no_index.js]
+ [browser_jsterm_autocomplete_cached_results.js]
+ [browser_jsterm_autocomplete_crossdomain_iframe.js]
+ [browser_jsterm_autocomplete_escape_key.js]
+ [browser_jsterm_autocomplete_helpers.js]
++[browser_jsterm_autocomplete_in_debugger_stackframe.js]
+ [browser_jsterm_autocomplete_inside_text.js]
+ [browser_jsterm_autocomplete_nav_and_tab_key.js]
+ [browser_jsterm_autocomplete_return_key_no_selection.js]
+ [browser_jsterm_autocomplete_return_key.js]
+ [browser_jsterm_autocomplete-properties-with-non-alphanumeric-names.js]
+ [browser_jsterm_copy_command.js]
+ [browser_jsterm_dollar.js]
+ [browser_jsterm_history_persist.js]
+@@ -217,18 +218,16 @@ skip-if = true #       Bug 1403188
+ [browser_jsterm_no_input_change_and_tab_key_pressed.js]
+ [browser_jsterm_popup_close_on_tab_switch.js]
+ [browser_jsterm_popup.js]
+ [browser_jsterm_selfxss.js]
+ subsuite = clipboard
+ [browser_netmonitor_shows_reqs_in_webconsole.js]
+ [browser_webconsole_allow_mixedcontent_securityerrors.js]
+ tags = mcb
+-[browser_webconsole_autocomplete_in_debugger_stackframe.js]
+-skip-if = true # Bug 1408920
+ [browser_webconsole_batching.js]
+ [browser_webconsole_block_mixedcontent_securityerrors.js]
+ tags = mcb
+ [browser_webconsole_cached_messages.js]
+ skip-if = true #       Bug 1406069
+ [browser_webconsole_cd_iframe.js]
+ [browser_webconsole_certificate_messages.js]
+ skip-if = true # Bug 1408925
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_autocomplete_cached_results.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_autocomplete_cached_results.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_autocomplete_cached_results.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_autocomplete_cached_results.js
+@@ -13,17 +13,18 @@ const TEST_URI = "data:text/html;charset
+ add_task(async function () {
+   let { jsterm } = await openNewTabAndConsole(TEST_URI);
+   const {
+     autocompletePopup: popup,
+     completeNode,
+     inputNode: input,
+   } = jsterm;
+ 
+-  const jstermComplete = (value, delta) => complete(jsterm, input, value, delta);
++  const jstermComplete = (value, offset) =>
++    jstermSetValueAndComplete(jsterm, value, offset);
+ 
+   // Test if 'doc' gives 'document'
+   await jstermComplete("doc");
+   is(input.value, "doc", "'docu' completion (input.value)");
+   is(completeNode.value, "   ument", "'docu' completion (completeNode)");
+ 
+   // Test typing 'window.'.
+   await jstermComplete("window.");
+@@ -60,21 +61,11 @@ add_task(async function () {
+   await jsterm.execute("window.docfoobar = true");
+ 
+   // Make sure 'dump(window.doc)' does not contain 'docfoobar'.
+   await jstermComplete("dump(window.doc)", -1);
+   ok(!getPopupLabels(popup).includes("docfoobar"),
+     "autocomplete cached results do not contain docfoobar. list has not been updated");
+ });
+ 
+-function complete(jsterm, input, value, caretIndexDelta = 0) {
+-  input.value = value;
+-  let index = value.length + caretIndexDelta;
+-  input.setSelectionRange(index, index);
+-
+-  const updated = jsterm.once("autocomplete-updated");
+-  jsterm.complete(jsterm.COMPLETE_HINT_ONLY);
+-  return updated;
+-}
+-
+ function getPopupLabels(popup) {
+   return popup.getItems().map(item => item.label);
+ }
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_autocomplete_in_debugger_stackframe.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_autocomplete_in_debugger_stackframe.js
+rename from devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_autocomplete_in_debugger_stackframe.js
+rename to devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_autocomplete_in_debugger_stackframe.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_autocomplete_in_debugger_stackframe.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_autocomplete_in_debugger_stackframe.js
+@@ -4,242 +4,113 @@
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+ // Test that makes sure web console autocomplete happens in the user-selected
+ // stackframe from the js debugger.
+ 
+ "use strict";
+ 
+ const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
+-                 "test/test-autocomplete-in-stackframe.html";
++                 "new-console-output/test/mochitest/test-autocomplete-in-stackframe.html";
+ 
+-// Force the old debugger UI since it's directly used (see Bug 1301705)
+-Services.prefs.setBoolPref("devtools.debugger.new-debugger-frontend", false);
+-registerCleanupFunction(function* () {
+-  Services.prefs.clearUserPref("devtools.debugger.new-debugger-frontend");
+-});
++add_task(async function () {
++  // Force the old debugger UI since it's directly used (see Bug 1301705)
++  await pushPref("devtools.debugger.new-debugger-frontend", false);
+ 
+-var gStackframes;
+-registerCleanupFunction(function () {
+-  gStackframes = null;
+-});
++  let { jsterm } = await openNewTabAndConsole(TEST_URI);
++  const {
++    autocompletePopup: popup,
++  } = jsterm;
+ 
+-requestLongerTimeout(2);
+-add_task(function* () {
+-  yield loadTab(TEST_URI);
+-  let hud = yield openConsole();
+-  yield testCompletion(hud);
+-});
++  let target = TargetFactory.forTab(gBrowser.selectedTab);
++  let toolbox = gDevTools.getToolbox(target);
+ 
+-function* testCompletion(hud) {
+-  let jsterm = hud.jsterm;
+-  let input = jsterm.inputNode;
+-  let popup = jsterm.autocompletePopup;
++  const jstermComplete = value => jstermSetValueAndComplete(jsterm, value);
+ 
+   // Test that document.title gives string methods. Native getters must execute.
+-  input.value = "document.title.";
+-  input.setSelectionRange(input.value.length, input.value.length);
+-  yield new Promise(resolve => {
+-    jsterm.complete(jsterm.COMPLETE_HINT_ONLY, resolve);
+-  });
+-
+-  let newItems = popup.getItems();
+-  ok(newItems.length > 0, "'document.title.' gave a list of suggestions");
+-  ok(newItems.some(function (item) {
+-    return item.label == "substr";
+-  }), "autocomplete results do contain substr");
+-  ok(newItems.some(function (item) {
+-    return item.label == "toLowerCase";
+-  }), "autocomplete results do contain toLowerCase");
+-  ok(newItems.some(function (item) {
+-    return item.label == "strike";
+-  }), "autocomplete results do contain strike");
++  await jstermComplete("document.title.");
+ 
+-  // Test if 'f' gives 'foo1' but not 'foo2' or 'foo3'
+-  input.value = "f";
+-  input.setSelectionRange(1, 1);
+-  yield new Promise(resolve => {
+-    jsterm.complete(jsterm.COMPLETE_HINT_ONLY, resolve);
+-  });
++  let newItemsLabels = getPopupLabels(popup);
++  ok(newItemsLabels.length > 0, "'document.title.' gave a list of suggestions");
++  ok(newItemsLabels.includes("substr"), `results do contain "substr"`);
++  ok(newItemsLabels.includes("toLowerCase"), `results do contain "toLowerCase"`);
++  ok(newItemsLabels.includes("strike"), `results do contain "strike"`);
+ 
+-  newItems = popup.getItems();
+-  ok(newItems.length > 0, "'f' gave a list of suggestions");
+-  ok(!newItems.every(function (item) {
+-    return item.label != "foo1";
+-  }), "autocomplete results do contain foo1");
+-  ok(!newItems.every(function (item) {
+-    return item.label != "foo1Obj";
+-  }), "autocomplete results do contain foo1Obj");
+-  ok(newItems.every(function (item) {
+-    return item.label != "foo2";
+-  }), "autocomplete results do not contain foo2");
+-  ok(newItems.every(function (item) {
+-    return item.label != "foo2Obj";
+-  }), "autocomplete results do not contain foo2Obj");
+-  ok(newItems.every(function (item) {
+-    return item.label != "foo3";
+-  }), "autocomplete results do not contain foo3");
+-  ok(newItems.every(function (item) {
+-    return item.label != "foo3Obj";
+-  }), "autocomplete results do not contain foo3Obj");
++  // Test if 'foo' gives 'foo1' but not 'foo2' or 'foo3'
++  await jstermComplete("foo");
++  is(getPopupLabels(popup).join("-"), "foo1Obj-foo1",
++    `"foo" gave the expected suggestions`);
+ 
+   // Test if 'foo1Obj.' gives 'prop1' and 'prop2'
+-  input.value = "foo1Obj.";
+-  input.setSelectionRange(8, 8);
+-  yield new Promise(resolve => {
+-    jsterm.complete(jsterm.COMPLETE_HINT_ONLY, resolve);
+-  });
+-
+-  newItems = popup.getItems();
+-  ok(!newItems.every(function (item) {
+-    return item.label != "prop1";
+-  }), "autocomplete results do contain prop1");
+-  ok(!newItems.every(function (item) {
+-    return item.label != "prop2";
+-  }), "autocomplete results do contain prop2");
++  await jstermComplete("foo1Obj.");
++  is(getPopupLabels(popup).join("-"), "prop2-prop1",
++    `"foo1Obj." gave the expected suggestions`);
+ 
+   // Test if 'foo1Obj.prop2.' gives 'prop21'
+-  input.value = "foo1Obj.prop2.";
+-  input.setSelectionRange(14, 14);
+-  yield new Promise(resolve => {
+-    jsterm.complete(jsterm.COMPLETE_HINT_ONLY, resolve);
+-  });
+-
+-  newItems = popup.getItems();
+-  ok(!newItems.every(function (item) {
+-    return item.label != "prop21";
+-  }), "autocomplete results do contain prop21");
++  await jstermComplete("foo1Obj.prop2.");
++  ok(getPopupLabels(popup).includes("prop21"),
++    `"foo1Obj.prop2." gave the expected suggestions`);
+ 
+   info("Opening Debugger");
+-  let dbg = yield openDebugger();
++  let {panel} = await openDebugger();
+ 
+   info("Waiting for pause");
+-  yield pauseDebugger(dbg);
++  const stackFrames = await pauseDebugger(panel);
+ 
+   info("Opening Console again");
+-  yield openConsole();
+-
+-  // From this point on the
+-  // Test if 'f' gives 'foo3' and 'foo1' but not 'foo2'
+-  input.value = "f";
+-  input.setSelectionRange(1, 1);
+-  yield new Promise(resolve => {
+-    jsterm.complete(jsterm.COMPLETE_HINT_ONLY, resolve);
+-  });
++  await toolbox.selectTool("webconsole");
+ 
+-  newItems = popup.getItems();
+-  ok(newItems.length > 0, "'f' gave a list of suggestions");
+-  ok(!newItems.every(function (item) {
+-    return item.label != "foo3";
+-  }), "autocomplete results do contain foo3");
+-  ok(!newItems.every(function (item) {
+-    return item.label != "foo3Obj";
+-  }), "autocomplete results do contain foo3Obj");
+-  ok(!newItems.every(function (item) {
+-    return item.label != "foo1";
+-  }), "autocomplete results do contain foo1");
+-  ok(!newItems.every(function (item) {
+-    return item.label != "foo1Obj";
+-  }), "autocomplete results do contain foo1Obj");
+-  ok(newItems.every(function (item) {
+-    return item.label != "foo2";
+-  }), "autocomplete results do not contain foo2");
+-  ok(newItems.every(function (item) {
+-    return item.label != "foo2Obj";
+-  }), "autocomplete results do not contain foo2Obj");
++  // Test if 'foo' gives 'foo3' and 'foo1' but not 'foo2', since we are paused in
++  // the `secondCall` function (called by `firstCall`, which we call in `pauseDebugger`).
++  await jstermComplete("foo");
++  is(getPopupLabels(popup).join("-"), "foo3Obj-foo3-foo1Obj-foo1",
++    `"foo" gave the expected suggestions`);
+ 
+-  yield openDebugger();
++  await openDebugger();
+ 
+-  gStackframes.selectFrame(1);
++  // Select the frame for the `firstCall` function.
++  stackFrames.selectFrame(1);
+ 
+   info("openConsole");
+-  yield openConsole();
+-
+-  // Test if 'f' gives 'foo2' and 'foo1' but not 'foo3'
+-  input.value = "f";
+-  input.setSelectionRange(1, 1);
+-  yield new Promise(resolve => {
+-    jsterm.complete(jsterm.COMPLETE_HINT_ONLY, resolve);
+-  });
++  await toolbox.selectTool("webconsole");
+ 
+-  newItems = popup.getItems();
+-  ok(newItems.length > 0, "'f' gave a list of suggestions");
+-  ok(!newItems.every(function (item) {
+-    return item.label != "foo2";
+-  }), "autocomplete results do contain foo2");
+-  ok(!newItems.every(function (item) {
+-    return item.label != "foo2Obj";
+-  }), "autocomplete results do contain foo2Obj");
+-  ok(!newItems.every(function (item) {
+-    return item.label != "foo1";
+-  }), "autocomplete results do contain foo1");
+-  ok(!newItems.every(function (item) {
+-    return item.label != "foo1Obj";
+-  }), "autocomplete results do contain foo1Obj");
+-  ok(newItems.every(function (item) {
+-    return item.label != "foo3";
+-  }), "autocomplete results do not contain foo3");
+-  ok(newItems.every(function (item) {
+-    return item.label != "foo3Obj";
+-  }), "autocomplete results do not contain foo3Obj");
++  // Test if 'foo' gives 'foo2' and 'foo1' but not 'foo3', since we are now in the
++  // `firstCall` frame.
++  await jstermComplete("foo");
++  is(getPopupLabels(popup).join("-"), "foo2Obj-foo2-foo1Obj-foo1",
++    `"foo" gave the expected suggestions`);
+ 
+   // Test if 'foo2Obj.' gives 'prop1'
+-  input.value = "foo2Obj.";
+-  input.setSelectionRange(8, 8);
+-  yield new Promise(resolve => {
+-    jsterm.complete(jsterm.COMPLETE_HINT_ONLY, resolve);
+-  });
+-
+-  newItems = popup.getItems();
+-  ok(!newItems.every(function (item) {
+-    return item.label != "prop1";
+-  }), "autocomplete results do contain prop1");
++  await jstermComplete("foo2Obj.");
++  ok(getPopupLabels(popup).includes("prop1"), `"foo2Obj." returns "prop1"`);
+ 
+   // Test if 'foo2Obj.prop1.' gives 'prop11'
+-  input.value = "foo2Obj.prop1.";
+-  input.setSelectionRange(14, 14);
+-  yield new Promise(resolve => {
+-    jsterm.complete(jsterm.COMPLETE_HINT_ONLY, resolve);
+-  });
++  await jstermComplete("foo2Obj.prop1.");
++  ok(getPopupLabels(popup).includes("prop11"), `"foo2Obj.prop1" returns "prop11"`);
+ 
+-  newItems = popup.getItems();
+-  ok(!newItems.every(function (item) {
+-    return item.label != "prop11";
+-  }), "autocomplete results do contain prop11");
++  // Test if 'foo2Obj.prop1.prop11.' gives suggestions for a string,i.e. 'length'
++  await jstermComplete("foo2Obj.prop1.prop11.");
++  ok(getPopupLabels(popup).includes("length"), `results do contain "length"`);
+ 
+-  // Test if 'foo2Obj.prop1.prop11.' gives suggestions for a string
+-  // i.e. 'length'
+-  input.value = "foo2Obj.prop1.prop11.";
+-  input.setSelectionRange(21, 21);
+-  yield new Promise(resolve => {
+-    jsterm.complete(jsterm.COMPLETE_HINT_ONLY, resolve);
+-  });
++  // Test if 'foo2Obj[0].' throws no errors.
++  await jstermComplete("foo2Obj[0].");
++  is(getPopupLabels(popup).length, 0, "no items for foo2Obj[0]");
++});
+ 
+-  newItems = popup.getItems();
+-  ok(!newItems.every(function (item) {
+-    return item.label != "length";
+-  }), "autocomplete results do contain length");
+-
+-  // Test if 'foo1Obj[0].' throws no errors.
+-  input.value = "foo2Obj[0].";
+-  input.setSelectionRange(11, 11);
+-  yield new Promise(resolve => {
+-    jsterm.complete(jsterm.COMPLETE_HINT_ONLY, resolve);
+-  });
+-
+-  newItems = popup.getItems();
+-  is(newItems.length, 0, "no items for foo2Obj[0]");
++function getPopupLabels(popup) {
++  return popup.getItems().map(item => item.label);
+ }
+ 
+-function pauseDebugger(aResult) {
+-  let debuggerWin = aResult.panelWin;
+-  let debuggerController = debuggerWin.DebuggerController;
+-  let thread = debuggerController.activeThread;
+-  gStackframes = debuggerController.StackFrames;
++function pauseDebugger(debuggerPanel) {
++  const debuggerWin = debuggerPanel.panelWin;
++  const debuggerController = debuggerWin.DebuggerController;
++  const thread = debuggerController.activeThread;
++
+   return new Promise(resolve => {
+-    thread.addOneTimeListener("framesadded", resolve);
++    thread.addOneTimeListener("framesadded", () =>
++      resolve(debuggerController.StackFrames));
+ 
+     info("firstCall()");
+-    ContentTask.spawn(gBrowser.selectedBrowser, {}, function* () {
++    ContentTask.spawn(gBrowser.selectedBrowser, {}, function () {
+       content.wrappedJSObject.firstCall();
+     });
+   });
+ }
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/head.js b/devtools/client/webconsole/new-console-output/test/mochitest/head.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/head.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/head.js
+@@ -77,17 +77,17 @@ async function openNewTabAndConsole(url,
+  *        - hud: the webconsole
+  *        - messages: Array[Object]. An array of messages to match.
+             Current supported options:
+  *            - text: Partial text match in .message-body
+  */
+ function waitForMessages({ hud, messages }) {
+   return new Promise(resolve => {
+     const matchedMessages = [];
+-    let receivedLog = hud.ui.on("new-messages",
++    hud.ui.on("new-messages",
+       function messagesReceived(e, newMessages) {
+         for (let message of messages) {
+           if (message.matched) {
+             continue;
+           }
+ 
+           for (let newMessage of newMessages) {
+             let messageBody = newMessage.node.querySelector(".message-body");
+@@ -290,16 +290,79 @@ async function checkClickOnNode(hud, too
+  * Returns true if the give node is currently focused.
+  */
+ function hasFocus(node) {
+   return node.ownerDocument.activeElement == node
+     && node.ownerDocument.hasFocus();
+ }
+ 
+ /**
++ * Set the value of the JsTerm and its caret position, and fire a completion request.
++ *
++ * @param {JsTerm} jsterm
++ * @param {String} value : The value to set the jsterm to.
++ * @param {Integer} caretIndexOffset : A number that will be added to value.length
++ *                  when setting the caret. A negative number will place the caret
++ *                  in (end - offset) position. Default to 0 (caret set at the end)
++ * @returns {Promise} resolves when the jsterm is completed.
++ */
++function jstermSetValueAndComplete(jsterm, value, caretIndexOffset = 0) {
++  const {inputNode} = jsterm;
++  inputNode.value = value;
++  let index = value.length + caretIndexOffset;
++  inputNode.setSelectionRange(index, index);
++
++  const updated = jsterm.once("autocomplete-updated");
++  jsterm.complete(jsterm.COMPLETE_HINT_ONLY);
++  return updated;
++}
++
++/**
++ * Open the JavaScript debugger.
++ *
++ * @param object options
++ *        Options for opening the debugger:
++ *        - tab: the tab you want to open the debugger for.
++ * @return object
++ *         A promise that is resolved once the debugger opens, or rejected if
++ *         the open fails. The resolution callback is given one argument, an
++ *         object that holds the following properties:
++ *         - target: the Target object for the Tab.
++ *         - toolbox: the Toolbox instance.
++ *         - panel: the jsdebugger panel instance.
++ */
++async function openDebugger(options = {}) {
++  if (!options.tab) {
++    options.tab = gBrowser.selectedTab;
++  }
++
++  let target = TargetFactory.forTab(options.tab);
++  let toolbox = gDevTools.getToolbox(target);
++  let dbgPanelAlreadyOpen = toolbox && toolbox.getPanel("jsdebugger");
++  if (dbgPanelAlreadyOpen) {
++    await toolbox.selectTool("jsdebugger");
++
++    return {
++      target,
++      toolbox,
++      panel: toolbox.getCurrentPanel()
++    };
++  }
++
++  toolbox = await gDevTools.showToolbox(target, "jsdebugger");
++  let panel = toolbox.getCurrentPanel();
++
++  // Do not clear VariableView lazily so it doesn't disturb test ending.
++  panel._view.Variables.lazyEmpty = false;
++
++  await panel.panelWin.DebuggerController.waitForSourcesLoaded();
++  return {target, toolbox, panel};
++}
++
++/**
+  * Fake clicking a link and return the URL we would have navigated to.
+  * This function should be used to check external links since we can't access
+  * network in tests.
+  * This can also be used to test that a click will not be fired.
+  *
+  * @param ElementNode element
+  *        The <a> element we want to simulate click on.
+  * @param Object clickEventProps
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/test-autocomplete-in-stackframe.html b/devtools/client/webconsole/new-console-output/test/mochitest/test-autocomplete-in-stackframe.html
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/test-autocomplete-in-stackframe.html
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/test-autocomplete-in-stackframe.html
+@@ -5,45 +5,43 @@
+     <!--
+     - Any copyright is dedicated to the Public Domain.
+     - http://creativecommons.org/publicdomain/zero/1.0/
+     -->
+     <title>Test for bug 842682 - use the debugger API for web console autocomplete</title>
+     <script>
+       var foo1 = "globalFoo";
+ 
+-      var foo1Obj = {
++      var foo1Obj = Object.assign(Object.create(null), {
+         prop1: "111",
+         prop2: {
+           prop21: "212121"
+         }
+-      };
++      });
+ 
+-      function firstCall()
+-      {
++      function firstCall() {
+         var foo2 = "fooFirstCall";
+ 
+-        var foo2Obj = {
+-          prop1: {
++        var foo2Obj = Object.assign(Object.create(null), {
++          prop1: Object.assign(Object.create(null), {
+             prop11: "111111"
+-          }
+-        };
++          })
++        });
+ 
+         secondCall();
+       }
+ 
+-      function secondCall()
+-      {
++      function secondCall() {
+         var foo3 = "fooSecondCall";
+ 
+-        var foo3Obj = {
+-          prop1: {
++        var foo3Obj = Object.assign(Object.create(null), {
++          prop1: Object.assign(Object.create(null), {
+             prop11: "313131"
+-          }
+-        };
++          })
++        });
+ 
+         debugger;
+       }
+     </script>
+   </head>
+   <body>
+     <p>Hello world!</p>
+   </body>

+ 209 - 0
mozilla-release/patches/1408924-58a1.patch

@@ -0,0 +1,209 @@
+# HG changeset patch
+# User Nicolas Chevobbe <nchevobbe@mozilla.com>
+# Date 1509438026 -3600
+# Node ID 7a2c4ad9108478916f619a0b69c9585d16cb922d
+# Parent  9658f27847dc387d72d36976fbfbdb9d2ad4ece2
+Bug 1408924 - Rename and enable browser_webconsole_cached_autocomplete.js in the new console frontend; r=Honza.
+
+MozReview-Commit-ID: GiaKsuxfrKr
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -193,16 +193,17 @@ skip-if = true # Bug 1406060
+ [browser_console_webconsole_iframe_messages.js]
+ skip-if = true # Bug 1406060
+ [browser_console_webconsole_private_browsing.js]
+ skip-if = true #       Bug 1403188
+ # old console skip-if = e10s # Bug 1042253 - webconsole e10s tests
+ [browser_jsterm_accessibility.js]
+ [browser_jsterm_add_edited_input_to_history.js]
+ [browser_jsterm_autocomplete_array_no_index.js]
++[browser_jsterm_autocomplete_cached_results.js]
+ [browser_jsterm_autocomplete_escape_key.js]
+ [browser_jsterm_autocomplete_helpers.js]
+ [browser_jsterm_autocomplete_inside_text.js]
+ [browser_jsterm_autocomplete_nav_and_tab_key.js]
+ [browser_jsterm_autocomplete_return_key_no_selection.js]
+ [browser_jsterm_autocomplete_return_key.js]
+ [browser_jsterm_autocomplete-properties-with-non-alphanumeric-names.js]
+ [browser_jsterm_copy_command.js]
+@@ -221,18 +222,16 @@ subsuite = clipboard
+ tags = mcb
+ [browser_webconsole_autocomplete_crossdomain_iframe.js]
+ skip-if = true # Bug 1408919
+ [browser_webconsole_autocomplete_in_debugger_stackframe.js]
+ skip-if = true # Bug 1408920
+ [browser_webconsole_batching.js]
+ [browser_webconsole_block_mixedcontent_securityerrors.js]
+ tags = mcb
+-[browser_webconsole_cached_autocomplete.js]
+-skip-if = true # Bug 1408924
+ [browser_webconsole_cached_messages.js]
+ skip-if = true #       Bug 1406069
+ [browser_webconsole_cd_iframe.js]
+ [browser_webconsole_certificate_messages.js]
+ skip-if = true # Bug 1408925
+ # old console skip-if = e10s # Bug 1042253 - webconsole tests disabled with e10s
+ [browser_webconsole_charset.js]
+ skip-if = true #       Bug 1404400
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_cached_autocomplete.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_autocomplete_cached_results.js
+rename from devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_cached_autocomplete.js
+rename to devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_autocomplete_cached_results.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_cached_autocomplete.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_autocomplete_cached_results.js
+@@ -3,112 +3,78 @@
+ /* Any copyright is dedicated to the Public Domain.
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+ // Tests that the cached autocomplete results are used when the new
+ // user input is a subset of the existing completion results.
+ 
+ "use strict";
+ 
+-const TEST_URI = "data:text/html;charset=utf8,<p>test cached autocompletion " +
+-                 "results";
+-
+-var jsterm;
++const TEST_URI = "data:text/html;charset=utf8,<p>test cached autocompletion results";
+ 
+-add_task(function* () {
+-  yield loadTab(TEST_URI);
++add_task(async function () {
++  let { jsterm } = await openNewTabAndConsole(TEST_URI);
++  const {
++    autocompletePopup: popup,
++    completeNode,
++    inputNode: input,
++  } = jsterm;
+ 
+-  let hud = yield openConsole();
+-
+-  jsterm = hud.jsterm;
+-  let input = jsterm.inputNode;
+-  let popup = jsterm.autocompletePopup;
++  const jstermComplete = (value, delta) => complete(jsterm, input, value, delta);
+ 
+   // Test if 'doc' gives 'document'
+-  input.value = "doc";
+-  input.setSelectionRange(3, 3);
+-  yield complete(jsterm.COMPLETE_HINT_ONLY);
+-
++  await jstermComplete("doc");
+   is(input.value, "doc", "'docu' completion (input.value)");
+-  is(jsterm.completeNode.value, "   ument", "'docu' completion (completeNode)");
++  is(completeNode.value, "   ument", "'docu' completion (completeNode)");
+ 
+   // Test typing 'window.'.
+-  input.value = "window.";
+-  input.setSelectionRange(7, 7);
+-  yield complete(jsterm.COMPLETE_HINT_ONLY);
+-
++  await jstermComplete("window.");
+   ok(popup.getItems().length > 0, "'window.' gave a list of suggestions");
+ 
+-  yield jsterm.execute("window.docfoobar = true");
++  await jsterm.execute("window.docfoobar = true");
+ 
+   // Test typing 'window.doc'.
+-  input.value = "window.doc";
+-  input.setSelectionRange(10, 10);
+-  yield complete(jsterm.COMPLETE_HINT_ONLY);
+-
+-  let newItems = popup.getItems();
+-  ok(newItems.every(function (item) {
+-    return item.label != "docfoobar";
+-  }), "autocomplete cached results do not contain docfoobar. list has not " +
+-      "been updated");
++  await jstermComplete("window.doc");
++  ok(!getPopupLabels(popup).includes("docfoobar"),
++    "autocomplete cached results do not contain docfoobar. list has not been updated");
+ 
+   // Test that backspace does not cause a request to the server
+-  input.value = "window.do";
+-  input.setSelectionRange(9, 9);
+-  yield complete(jsterm.COMPLETE_HINT_ONLY);
++  await jstermComplete("window.do");
++  ok(!getPopupLabels(popup).includes("docfoobar"),
++    "autocomplete cached results do not contain docfoobar. list has not been updated");
+ 
+-  newItems = popup.getItems();
+-  ok(newItems.every(function (item) {
+-    return item.label != "docfoobar";
+-  }), "autocomplete cached results do not contain docfoobar. list has not " +
+-      "been updated");
+-
+-  yield jsterm.execute("delete window.docfoobar");
++  await jsterm.execute("delete window.docfoobar");
+ 
+   // Test if 'window.getC' gives 'getComputedStyle'
+-  input.value = "window.";
+-  input.setSelectionRange(7, 7);
+-  yield complete(jsterm.COMPLETE_HINT_ONLY);
+-
+-  input.value = "window.getC";
+-  input.setSelectionRange(11, 11);
+-  yield complete(jsterm.COMPLETE_HINT_ONLY);
+-
+-  newItems = popup.getItems();
+-  ok(!newItems.every(function (item) {
+-    return item.label != "getComputedStyle";
+-  }), "autocomplete results do contain getComputedStyle");
++  await jstermComplete("window.");
++  await jstermComplete("window.getC");
++  ok(getPopupLabels(popup).includes("getComputedStyle"),
++    "autocomplete results do contain getComputedStyle");
+ 
+   // Test if 'dump(d' gives non-zero results
+-  input.value = "dump(d";
+-  input.setSelectionRange(6, 6);
+-  yield complete(jsterm.COMPLETE_HINT_ONLY);
+-
++  await jstermComplete("dump(d");
+   ok(popup.getItems().length > 0, "'dump(d' gives non-zero results");
+ 
+   // Test that 'dump(window.)' works.
+-  input.value = "dump(window.)";
+-  input.setSelectionRange(12, 12);
+-  yield complete(jsterm.COMPLETE_HINT_ONLY);
++  await jstermComplete("dump(window.)", -1);
++  ok(popup.getItems().length > 0, "'dump(window.' gave a list of suggestions");
+ 
+-  yield jsterm.execute("window.docfoobar = true");
++  await jsterm.execute("window.docfoobar = true");
+ 
+   // Make sure 'dump(window.doc)' does not contain 'docfoobar'.
+-  input.value = "dump(window.doc)";
+-  input.setSelectionRange(15, 15);
+-  yield complete(jsterm.COMPLETE_HINT_ONLY);
+-
+-  newItems = popup.getItems();
+-  ok(newItems.every(function (item) {
+-    return item.label != "docfoobar";
+-  }), "autocomplete cached results do not contain docfoobar. list has not " +
+-      "been updated");
+-
+-  yield jsterm.execute("delete window.docfoobar");
+-
+-  jsterm = null;
++  await jstermComplete("dump(window.doc)", -1);
++  ok(!getPopupLabels(popup).includes("docfoobar"),
++    "autocomplete cached results do not contain docfoobar. list has not been updated");
+ });
+ 
+-function complete(type) {
+-  let updated = jsterm.once("autocomplete-updated");
+-  jsterm.complete(type);
++function complete(jsterm, input, value, caretIndexDelta = 0) {
++  input.value = value;
++  let index = value.length + caretIndexDelta;
++  input.setSelectionRange(index, index);
++
++  const updated = jsterm.once("autocomplete-updated");
++  jsterm.complete(jsterm.COMPLETE_HINT_ONLY);
+   return updated;
+ }
++
++function getPopupLabels(popup) {
++  return popup.getItems().map(item => item.label);
++}

+ 105 - 0
mozilla-release/patches/1408926-59a1.patch

@@ -0,0 +1,105 @@
+# HG changeset patch
+# User Nicolas Chevobbe <nchevobbe@mozilla.com>
+# Date 1510146250 -3600
+# Node ID d94d71ae256f437b75785d899769d561b41d62a4
+# Parent  6ffb73ac5731804e18fe437945743c2a1ee7fc9c
+Bug 1408926 - Rename and enable browser_webconsole_chrome.js in new console frontend; r=jdescottes.
+
+MozReview-Commit-ID: EAoATzKO9bF
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -199,16 +199,17 @@ skip-if = true #       Bug 1403188
+ [browser_jsterm_accessibility.js]
+ [browser_jsterm_add_edited_input_to_history.js]
+ [browser_jsterm_autocomplete_array_no_index.js]
+ [browser_jsterm_autocomplete_cached_results.js]
+ [browser_jsterm_autocomplete_crossdomain_iframe.js]
+ [browser_jsterm_autocomplete_escape_key.js]
+ [browser_jsterm_autocomplete_extraneous_closing_brackets.js]
+ [browser_jsterm_autocomplete_helpers.js]
++[browser_jsterm_autocomplete_in_chrome_tab.js]
+ [browser_jsterm_autocomplete_in_debugger_stackframe.js]
+ [browser_jsterm_autocomplete_inside_text.js]
+ [browser_jsterm_autocomplete_nav_and_tab_key.js]
+ [browser_jsterm_autocomplete_return_key_no_selection.js]
+ [browser_jsterm_autocomplete_return_key.js]
+ [browser_jsterm_autocomplete-properties-with-non-alphanumeric-names.js]
+ [browser_jsterm_copy_command.js]
+ [browser_jsterm_dollar.js]
+@@ -227,18 +228,16 @@ tags = mcb
+ [browser_webconsole_batching.js]
+ [browser_webconsole_block_mixedcontent_securityerrors.js]
+ tags = mcb
+ [browser_webconsole_cached_messages.js]
+ [browser_webconsole_cd_iframe.js]
+ [browser_webconsole_certificate_messages.js]
+ [browser_webconsole_charset.js]
+ skip-if = true #       Bug 1404400
+-[browser_webconsole_chrome.js]
+-skip-if = true # Bug 1408926
+ [browser_webconsole_click_function_to_source.js]
+ [browser_webconsole_clickable_urls.js]
+ [browser_webconsole_closing_after_completion.js]
+ skip-if = true # Bug 1408927
+ [browser_webconsole_close_sidebar.js]
+ [browser_webconsole_closure_inspection.js]
+ skip-if = true #       Bug 1405250
+ [browser_webconsole_completion.js]
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_chrome.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_autocomplete_in_chrome_tab.js
+rename from devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_chrome.js
+rename to devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_autocomplete_in_chrome_tab.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_chrome.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_autocomplete_in_chrome_tab.js
+@@ -1,38 +1,22 @@
+ /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+ /* Any copyright is dedicated to the Public Domain.
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+-// Tests that code completion works properly in chrome tabs, like about:credits.
++// Tests that code completion works properly in chrome tabs, like about:config.
+ 
+ "use strict";
+ 
+-function test() {
+-  Task.spawn(function* () {
+-    const {tab} = yield loadTab("about:config");
+-    ok(tab, "tab loaded");
+-
+-    const hud = yield openConsole(tab);
+-    ok(hud, "we have a console");
+-    ok(hud.iframeWindow, "we have the console UI window");
+-
+-    let jsterm = hud.jsterm;
+-    ok(jsterm, "we have a jsterm");
+-
+-    let input = jsterm.inputNode;
+-    ok(hud.outputNode, "we have an output node");
++add_task(async function () {
++  const hud = await openNewTabAndConsole("about:config");
++  ok(hud, "we have a console");
++  ok(hud.iframeWindow, "we have the console UI window");
+ 
+-    // Test typing 'docu'.
+-    input.value = "docu";
+-    input.setSelectionRange(4, 4);
+-
+-    let deferred = defer();
++  const {jsterm} = hud;
++  ok(jsterm, "we have a jsterm");
++  ok(hud.outputNode, "we have an output node");
+ 
+-    jsterm.complete(jsterm.COMPLETE_HINT_ONLY, function () {
+-      is(jsterm.completeNode.value, "    ment", "'docu' completion");
+-      deferred.resolve(null);
+-    });
+-
+-    yield deferred.promise;
+-  }).then(finishTest);
+-}
++  // Test typing 'docu'.
++  await jstermSetValueAndComplete(jsterm, "docu");
++  is(jsterm.completeNode.value, "    ment", "'docu' completion");
++});

+ 93 - 0
mozilla-release/patches/1408927-59a1.patch

@@ -0,0 +1,93 @@
+# HG changeset patch
+# User Nicolas Chevobbe <nchevobbe@mozilla.com>
+# Date 1510736096 -3600
+# Node ID b9c6e46ba1cc16167ecaf79693b0334d62d086c6
+# Parent  44262ba21c27c894478729790902741d1bd5c716
+Bug 1408927 - Enable browser_webconsole_closing_after_completion.js in the new console frontend; r=jdescottes.
+
+MozReview-Commit-ID: CrudyCnBlWh
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -231,17 +231,16 @@ tags = mcb
+ [browser_webconsole_cached_messages.js]
+ [browser_webconsole_cd_iframe.js]
+ [browser_webconsole_certificate_messages.js]
+ [browser_webconsole_charset.js]
+ skip-if = true #       Bug 1404400
+ [browser_webconsole_click_function_to_source.js]
+ [browser_webconsole_clickable_urls.js]
+ [browser_webconsole_closing_after_completion.js]
+-skip-if = true # Bug 1408927
+ [browser_webconsole_close_sidebar.js]
+ [browser_webconsole_closure_inspection.js]
+ skip-if = true #       Bug 1405250
+ [browser_webconsole_completion.js]
+ skip-if = true # Bug 1408929
+ [browser_webconsole_console_api_iframe.js]
+ skip-if = true # Bug 1408930
+ [browser_webconsole_console_dir.js]
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_closing_after_completion.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_closing_after_completion.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_closing_after_completion.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_closing_after_completion.js
+@@ -4,44 +4,38 @@
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+ // Tests to ensure that errors don't appear when the console is closed while a
+ // completion is being performed. See Bug 580001.
+ 
+ "use strict";
+ 
+ const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
+-                 "test/test-console.html";
+-
+-add_task(function* () {
+-  let { browser } = yield loadTab(TEST_URI);
++                 "new-console-output/test/mochitest/test-console.html";
+ 
+-  let hud = yield openConsole();
+-  yield testClosingAfterCompletion(hud, browser);
+-});
++add_task(async function () {
++  let tab = await addTab(TEST_URI);
++  const browser = tab.linkedBrowser;
++  const hud = await openConsole();
+ 
+-function testClosingAfterCompletion(hud, browser) {
+-  let deferred = defer();
++  // Fire a completion.
++  await jstermSetValueAndComplete(hud.jsterm, "doc");
+ 
+   let errorWhileClosing = false;
+   function errorListener() {
+     errorWhileClosing = true;
+   }
+ 
+   browser.addEventListener("error", errorListener);
++  const onToolboxDestroyed = gDevTools.once("toolbox-destroyed");
+ 
+   // Focus the jsterm and perform the keycombo to close the WebConsole.
+   hud.jsterm.focus();
+-
+-  gDevTools.once("toolbox-destroyed", function () {
+-    browser.removeEventListener("error", errorListener);
+-    is(errorWhileClosing, false, "no error while closing the WebConsole");
+-    deferred.resolve();
++  EventUtils.synthesizeKey("i", {
++    accelKey: true,
++    [Services.appinfo.OS == "Darwin" ? "altKey" : "shiftKey"]: true
+   });
+ 
+-  if (Services.appinfo.OS == "Darwin") {
+-    EventUtils.synthesizeKey("i", { accelKey: true, altKey: true });
+-  } else {
+-    EventUtils.synthesizeKey("i", { accelKey: true, shiftKey: true });
+-  }
++  await onToolboxDestroyed;
+ 
+-  return deferred.promise;
+-}
++  browser.removeEventListener("error", errorListener);
++  is(errorWhileClosing, false, "no error while closing the WebConsole");
++});

+ 85 - 0
mozilla-release/patches/1408928-58a1.patch

@@ -0,0 +1,85 @@
+# HG changeset patch
+# User Nicolas Chevobbe <nchevobbe@mozilla.com>
+# Date 1510053549 -3600
+# Node ID dfe08f7ae8d9e55f3bf412f437a9afabe72e9589
+# Parent  eb4497bc7d55aded17e5601a65b7a092faf31a03
+Bug 1408928 - Rename and enable browser_webconsole_closing_brackets.js in new console frontend; r=Honza.
+
+MozReview-Commit-ID: EEwk0mSD5Rs
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -197,16 +197,17 @@ skip-if = true # Bug 1406060
+ skip-if = true #       Bug 1403188
+ # old console skip-if = e10s # Bug 1042253 - webconsole e10s tests
+ [browser_jsterm_accessibility.js]
+ [browser_jsterm_add_edited_input_to_history.js]
+ [browser_jsterm_autocomplete_array_no_index.js]
+ [browser_jsterm_autocomplete_cached_results.js]
+ [browser_jsterm_autocomplete_crossdomain_iframe.js]
+ [browser_jsterm_autocomplete_escape_key.js]
++[browser_jsterm_autocomplete_extraneous_closing_brackets.js]
+ [browser_jsterm_autocomplete_helpers.js]
+ [browser_jsterm_autocomplete_in_debugger_stackframe.js]
+ [browser_jsterm_autocomplete_inside_text.js]
+ [browser_jsterm_autocomplete_nav_and_tab_key.js]
+ [browser_jsterm_autocomplete_return_key_no_selection.js]
+ [browser_jsterm_autocomplete_return_key.js]
+ [browser_jsterm_autocomplete-properties-with-non-alphanumeric-names.js]
+ [browser_jsterm_copy_command.js]
+@@ -234,18 +235,16 @@ skip-if = true # Bug 1408925
+ [browser_webconsole_charset.js]
+ skip-if = true #       Bug 1404400
+ [browser_webconsole_chrome.js]
+ skip-if = true # Bug 1408926
+ [browser_webconsole_click_function_to_source.js]
+ [browser_webconsole_clickable_urls.js]
+ [browser_webconsole_closing_after_completion.js]
+ skip-if = true # Bug 1408927
+-[browser_webconsole_closing_brackets.js]
+-skip-if = true # Bug 1408928
+ [browser_webconsole_close_sidebar.js]
+ [browser_webconsole_closure_inspection.js]
+ skip-if = true #       Bug 1405250
+ [browser_webconsole_completion.js]
+ skip-if = true # Bug 1408929
+ [browser_webconsole_console_api_iframe.js]
+ skip-if = true # Bug 1408930
+ [browser_webconsole_console_dir.js]
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_closing_brackets.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_autocomplete_extraneous_closing_brackets.js
+rename from devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_closing_brackets.js
+rename to devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_autocomplete_extraneous_closing_brackets.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_closing_brackets.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_autocomplete_extraneous_closing_brackets.js
+@@ -5,25 +5,18 @@
+ 
+ // Tests that, when the user types an extraneous closing bracket, no error
+ // appears. See Bug 592442.
+ 
+ "use strict";
+ 
+ const TEST_URI = "data:text/html;charset=utf-8,test for bug 592442";
+ 
+-add_task(function* () {
+-  yield loadTab(TEST_URI);
+-  let hud = yield openConsole();
+-  hud.jsterm.clearOutput();
+-  let jsterm = hud.jsterm;
+-
+-  jsterm.setInputValue("document.getElementById)");
++add_task(async function () {
++  let { jsterm } = await openNewTabAndConsole(TEST_URI);
+ 
+-  let error = false;
+   try {
+-    jsterm.complete(jsterm.COMPLETE_HINT_ONLY);
++    await jstermSetValueAndComplete(jsterm, "document.getElementById)");
++    ok(true, "no error was thrown when an extraneous bracket was inserted");
+   } catch (ex) {
+-    error = true;
++    ok(false, "an error was thrown when an extraneous bracket was inserted")
+   }
+-
+-  ok(!error, "no error was thrown when an extraneous bracket was inserted");
+ });

+ 229 - 0
mozilla-release/patches/1408929-59a1.patch

@@ -0,0 +1,229 @@
+# HG changeset patch
+# User Nicolas Chevobbe <nchevobbe@mozilla.com>
+# Date 1510917284 -3600
+# Node ID 02a2365fd62b825721b3e4161e79f8a19df55b55
+# Parent  26bd0f1be3357f565921a0568a3f7d13ebfd684d
+Bug 1408929 - Rename and enable browser_webconsole_completion.js in the new console frontend; r=jdescottes.
+
+MozReview-Commit-ID: ICu5aJViiW3
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -204,16 +204,17 @@ skip-if = true #       Bug 1403188
+ [browser_jsterm_autocomplete_helpers.js]
+ [browser_jsterm_autocomplete_in_chrome_tab.js]
+ [browser_jsterm_autocomplete_in_debugger_stackframe.js]
+ [browser_jsterm_autocomplete_inside_text.js]
+ [browser_jsterm_autocomplete_nav_and_tab_key.js]
+ [browser_jsterm_autocomplete_return_key_no_selection.js]
+ [browser_jsterm_autocomplete_return_key.js]
+ [browser_jsterm_autocomplete-properties-with-non-alphanumeric-names.js]
++[browser_jsterm_completion.js]
+ [browser_jsterm_copy_command.js]
+ [browser_jsterm_dollar.js]
+ [browser_jsterm_history_persist.js]
+ [browser_jsterm_inspect.js]
+ [browser_jsterm_no_autocompletion_on_defined_variables.js]
+ [browser_jsterm_no_input_and_tab_key_pressed.js]
+ [browser_jsterm_no_input_change_and_tab_key_pressed.js]
+ [browser_jsterm_popup_close_on_tab_switch.js]
+@@ -230,18 +231,16 @@ tags = mcb
+ [browser_webconsole_cd_iframe.js]
+ [browser_webconsole_certificate_messages.js]
+ [browser_webconsole_click_function_to_source.js]
+ [browser_webconsole_clickable_urls.js]
+ [browser_webconsole_closing_after_completion.js]
+ [browser_webconsole_close_sidebar.js]
+ [browser_webconsole_closure_inspection.js]
+ skip-if = true #       Bug 1405250
+-[browser_webconsole_completion.js]
+-skip-if = true # Bug 1408929
+ [browser_webconsole_console_api_iframe.js]
+ skip-if = true # Bug 1408930
+ [browser_webconsole_console_dir.js]
+ [browser_webconsole_console_dir_uninspectable.js]
+ [browser_webconsole_console_group.js]
+ [browser_webconsole_console_logging_workers_api.js]
+ skip-if = true # Bug 1405252
+ [browser_webconsole_console_table.js]
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_completion.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_completion.js
+rename from devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_completion.js
+rename to devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_completion.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_completion.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_completion.js
+@@ -4,103 +4,69 @@
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+ // Tests that code completion works properly.
+ 
+ "use strict";
+ 
+ const TEST_URI = "data:text/html;charset=utf8,<p>test code completion";
+ 
+-var jsterm;
+-
+-add_task(function* () {
+-  yield loadTab(TEST_URI);
+-
+-  let hud = yield openConsole();
+-
+-  jsterm = hud.jsterm;
++add_task(async function () {
++  let {jsterm} = await openNewTabAndConsole(TEST_URI);
+   let input = jsterm.inputNode;
+ 
+   // Test typing 'docu'.
+-  input.value = "docu";
+-  input.setSelectionRange(4, 4);
+-  yield complete(jsterm.COMPLETE_HINT_ONLY);
+-
++  await jstermSetValueAndComplete(jsterm, "docu");
+   is(input.value, "docu", "'docu' completion (input.value)");
+   is(jsterm.completeNode.value, "    ment", "'docu' completion (completeNode)");
+ 
+   // Test typing 'docu' and press tab.
+-  input.value = "docu";
+-  input.setSelectionRange(4, 4);
+-  yield complete(jsterm.COMPLETE_FORWARD);
+-
++  await jstermSetValueAndComplete(jsterm, "docu", undefined, jsterm.COMPLETE_FORWARD);
+   is(input.value, "document", "'docu' tab completion");
+   is(input.selectionStart, 8, "start selection is alright");
+   is(input.selectionEnd, 8, "end selection is alright");
+   is(jsterm.completeNode.value.replace(/ /g, ""), "", "'docu' completed");
+ 
+   // Test typing 'window.Ob' and press tab.  Just 'window.O' is
+   // ambiguous: could be window.Object, window.Option, etc.
+-  input.value = "window.Ob";
+-  input.setSelectionRange(9, 9);
+-  yield complete(jsterm.COMPLETE_FORWARD);
+-
++  await jstermSetValueAndComplete(jsterm, "window.Ob", undefined, jsterm.COMPLETE_FORWARD);
+   is(input.value, "window.Object", "'window.Ob' tab completion");
+ 
+   // Test typing 'document.getElem'.
+-  input.value = "document.getElem";
+-  input.setSelectionRange(16, 16);
+-  yield complete(jsterm.COMPLETE_FORWARD);
+-
++  await jstermSetValueAndComplete(
++    jsterm, "document.getElem", undefined, jsterm.COMPLETE_FORWARD);
+   is(input.value, "document.getElem", "'document.getElem' completion");
+   is(jsterm.completeNode.value, "                entsByTagNameNS",
+      "'document.getElem' completion");
+ 
+   // Test pressing tab another time.
+-  yield jsterm.complete(jsterm.COMPLETE_FORWARD);
+-
++  await jsterm.complete(jsterm.COMPLETE_FORWARD);
+   is(input.value, "document.getElem", "'document.getElem' completion");
+   is(jsterm.completeNode.value, "                entsByTagName",
+      "'document.getElem' another tab completion");
+ 
+   // Test pressing shift_tab.
+-  complete(jsterm.COMPLETE_BACKWARD);
+-
++  await jstermComplete(jsterm, jsterm.COMPLETE_BACKWARD);
+   is(input.value, "document.getElem", "'document.getElem' untab completion");
+   is(jsterm.completeNode.value, "                entsByTagNameNS",
+      "'document.getElem' completion");
+ 
+   jsterm.clearOutput();
+ 
+-  input.value = "docu";
+-  yield complete(jsterm.COMPLETE_HINT_ONLY);
++  await jstermSetValueAndComplete(jsterm, "docu");
++  is(jsterm.completeNode.value, "    ment", "'docu' completion");
+ 
+-  is(jsterm.completeNode.value, "    ment", "'docu' completion");
+-  yield jsterm.execute();
++  await jsterm.execute();
+   is(jsterm.completeNode.value, "", "clear completion on execute()");
+ 
+   // Test multi-line completion works
+-  input.value = "console.log('one');\nconsol";
+-  yield complete(jsterm.COMPLETE_HINT_ONLY);
+-
++  await jstermSetValueAndComplete(jsterm, "console.log('one');\nconsol");
+   is(jsterm.completeNode.value, "                   \n      e",
+      "multi-line completion");
+ 
+   // Test non-object autocompletion.
+-  input.value = "Object.name.sl";
+-  yield complete(jsterm.COMPLETE_HINT_ONLY);
+-
++  await jstermSetValueAndComplete(jsterm, "Object.name.sl");
+   is(jsterm.completeNode.value, "              ice", "non-object completion");
+ 
+   // Test string literal autocompletion.
+-  input.value = "'Asimov'.sl";
+-  yield complete(jsterm.COMPLETE_HINT_ONLY);
+-
++  await jstermSetValueAndComplete(jsterm, "'Asimov'.sl");
+   is(jsterm.completeNode.value, "           ice", "string literal completion");
+-
+-  jsterm = null;
+ });
+-
+-function complete(type) {
+-  let updated = jsterm.once("autocomplete-updated");
+-  jsterm.complete(type);
+-  return updated;
+-}
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/head.js b/devtools/client/webconsole/new-console-output/test/mochitest/head.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/head.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/head.js
+@@ -297,26 +297,50 @@ function hasFocus(node) {
+ /**
+  * Set the value of the JsTerm and its caret position, and fire a completion request.
+  *
+  * @param {JsTerm} jsterm
+  * @param {String} value : The value to set the jsterm to.
+  * @param {Integer} caretIndexOffset : A number that will be added to value.length
+  *                  when setting the caret. A negative number will place the caret
+  *                  in (end - offset) position. Default to 0 (caret set at the end)
++ * @param {Integer} completionType : One of the following jsterm property
++ *                   - COMPLETE_FORWARD
++ *                   - COMPLETE_BACKWARD
++ *                   - COMPLETE_HINT_ONLY
++ *                   - COMPLETE_PAGEUP
++ *                   - COMPLETE_PAGEDOWN
++ *                  Will default to COMPLETE_HINT_ONLY.
+  * @returns {Promise} resolves when the jsterm is completed.
+  */
+-function jstermSetValueAndComplete(jsterm, value, caretIndexOffset = 0) {
++function jstermSetValueAndComplete(jsterm, value, caretIndexOffset = 0, completionType) {
+   const {inputNode} = jsterm;
+   inputNode.value = value;
+   let index = value.length + caretIndexOffset;
+   inputNode.setSelectionRange(index, index);
+ 
++  return jstermComplete(jsterm, completionType);
++}
++
++/**
++ * Fires a completion request on the jsterm with the specified completionType
++ *
++ * @param {JsTerm} jsterm
++ * @param {Integer} completionType : One of the following jsterm property
++ *                   - COMPLETE_FORWARD
++ *                   - COMPLETE_BACKWARD
++ *                   - COMPLETE_HINT_ONLY
++ *                   - COMPLETE_PAGEUP
++ *                   - COMPLETE_PAGEDOWN
++ *                  Will default to COMPLETE_HINT_ONLY.
++ * @returns {Promise} resolves when the jsterm is completed.
++ */
++function jstermComplete(jsterm, completionType = jsterm.COMPLETE_HINT_ONLY) {
+   const updated = jsterm.once("autocomplete-updated");
+-  jsterm.complete(jsterm.COMPLETE_HINT_ONLY);
++  jsterm.complete(completionType);
+   return updated;
+ }
+ 
+ /**
+  * Open the JavaScript debugger.
+  *
+  * @param object options
+  *        Options for opening the debugger:

+ 125 - 0
mozilla-release/patches/1408930-59a1.patch

@@ -0,0 +1,125 @@
+# HG changeset patch
+# User Nicolas Chevobbe <nchevobbe@mozilla.com>
+# Date 1511167902 -3600
+# Node ID 7edea0ef408c652b83cce6742ff18a579193b6ab
+# Parent  edd1a4933795a5bcfc3c19a759ad2f7df251db25
+Bug 1408930 - Enable browser_webconsole_console_api_iframe.js in the new console frontend; r=jdescottes.
+
+MozReview-Commit-ID: KGGD7i8WbDZ
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -56,17 +56,17 @@ support-files =
+   test-bug-597756-reopen-closed-tab.html
+   test-bug-599725-response-headers.sjs
+   test-bug-601177-log-levels.html
+   test-bug-601177-log-levels.js
+   test-bug-603750-websocket.html
+   test-bug-603750-websocket.js
+   test-cd-iframe-child.html
+   test-cd-iframe-parent.html
+-  test-bug-613013-console-api-iframe.html
++  test-console-api-iframe.html
+   test-bug-618078-network-exceptions.html
+   test-bug-630733-response-redirect-headers.sjs
+   test-bug-632275-getters.html
+   test-bug-632347-iterators-generators.html
+   test-bug-644419-log-limits.html
+   test-bug-646025-console-file-location.html
+   test-bug-658368-time-methods.html
+   test-bug-737873-mixedcontent.html
+@@ -232,17 +232,16 @@ tags = mcb
+ [browser_webconsole_certificate_messages.js]
+ [browser_webconsole_click_function_to_source.js]
+ [browser_webconsole_clickable_urls.js]
+ [browser_webconsole_closing_after_completion.js]
+ [browser_webconsole_close_sidebar.js]
+ [browser_webconsole_closure_inspection.js]
+ skip-if = true #       Bug 1405250
+ [browser_webconsole_console_api_iframe.js]
+-skip-if = true # Bug 1408930
+ [browser_webconsole_console_dir.js]
+ [browser_webconsole_console_dir_uninspectable.js]
+ [browser_webconsole_console_group.js]
+ [browser_webconsole_console_logging_workers_api.js]
+ skip-if = true # Bug 1405252
+ [browser_webconsole_console_table.js]
+ [browser_webconsole_context_menu_copy_entire_message.js]
+ subsuite = clipboard
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_console_api_iframe.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_console_api_iframe.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_console_api_iframe.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_console_api_iframe.js
+@@ -1,28 +1,24 @@
+ /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+ /* Any copyright is dedicated to the Public Domain.
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+ "use strict";
+ 
+-// See Bug 613013.
++// Check that Console API works with iframes. See Bug 613013.
+ 
+ const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
+-                 "test/test-bug-613013-console-api-iframe.html";
+-
+-add_task(function* () {
+-  yield loadTab(TEST_URI);
+-
+-  let hud = yield openConsole();
+-
+-  BrowserReload();
++                 "new-console-output/test/mochitest/test-console-api-iframe.html";
+ 
+-  yield waitForMessages({
+-    webconsole: hud,
+-    messages: [{
+-      text: "foobarBug613013",
+-      category: CATEGORY_WEBDEV,
+-      severity: SEVERITY_LOG,
+-    }],
+-  });
++add_task(async function () {
++  const hud = await openNewTabAndConsole(TEST_URI);
++  const loggedString = "iframe added";
++  // Wait for the initial message to be displayed.
++  await waitFor(() => findMessage(hud, loggedString));
++  ok(true, "The initial message is displayed in the console");
++  // Create a promise for the message logged after the reload.
++  const onMessage = waitForMessage(hud, loggedString)
++  BrowserReload();
++  await onMessage;
++  ok(true, "The message is also displayed after a page reload");
+ });
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-613013-console-api-iframe.html b/devtools/client/webconsole/new-console-output/test/mochitest/test-console-api-iframe.html
+rename from devtools/client/webconsole/new-console-output/test/mochitest/test-bug-613013-console-api-iframe.html
+rename to devtools/client/webconsole/new-console-output/test/mochitest/test-console-api-iframe.html
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-613013-console-api-iframe.html
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/test-console-api-iframe.html
+@@ -1,21 +1,21 @@
+ <!DOCTYPE html>
+ <html lang="en">
+   <head>
+     <meta charset="utf-8">
+-    <title>test for bug 613013</title>
++    <title>Testing the console API after adding an iframe</title>
+     <!-- Any copyright is dedicated to the Public Domain.
+          http://creativecommons.org/publicdomain/zero/1.0/ -->
+   </head>
+   <body>
+     <p>test for bug 613013</p>
+-    <script type="text/javascript"><!--
++    <script type="text/javascript">
+       (function () {
+         var iframe = document.createElement('iframe');
+         iframe.src = 'data:text/html;charset=utf-8,little iframe';
+         document.body.appendChild(iframe);
+ 
+-        console.log("foobarBug613013");
++        console.log("iframe added");
+       })();
+-    // --></script>
++    </script>
+   </body>
+ </html>

+ 133 - 0
mozilla-release/patches/1408931-59a1.patch

@@ -0,0 +1,133 @@
+# HG changeset patch
+# User Nicolas Chevobbe <nchevobbe@mozilla.com>
+# Date 1511340974 -3600
+# Node ID 81a1024cd97a0bf6c50e41bf1c5edb466fc7ce87
+# Parent  62e40b3348181d0b62c4a3bfeda89df8604f9d72
+Bug 1408931 - Enable browser_webconsole_csp_ignore_reflected_xss_message.js in the new console frontend; r=jdescottes.
+
+This also renames the support files.
+
+MozReview-Commit-ID: 9TqERvD5EFA
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -11,18 +11,18 @@ support-files =
+   source-mapped.css
+   source-mapped.css.map
+   source-mapped.scss
+   test_bug_1010953_cspro.html
+   test_bug_1010953_cspro.html^headers^
+   test_bug_1247459_violation.html
+   test_bug_770099_violation.html
+   test_bug_770099_violation.html^headers^
+-  test_bug1045902_console_csp_ignore_reflected_xss_message.html
+-  test_bug1045902_console_csp_ignore_reflected_xss_message.html^headers^
++  test_console_csp_ignore_reflected_xss_message.html
++  test_console_csp_ignore_reflected_xss_message.html^headers^
+   test_bug1092055_shouldwarn.html
+   test_bug1092055_shouldwarn.js
+   test_bug1092055_shouldwarn.js^headers^
+   test_hpkp-invalid-headers.sjs
+   test_hsts-invalid-headers.sjs
+   test-autocomplete-in-stackframe.html
+   test-batching.html
+   test-bug_923281_console_log_filter.html
+@@ -252,18 +252,17 @@ skip-if = (os == 'linux' && bits == 32 &
+ [browser_webconsole_context_menu_copy_object.js]
+ subsuite = clipboard
+ [browser_webconsole_context_menu_object_in_sidebar.js]
+ [browser_webconsole_context_menu_open_url.js]
+ [browser_webconsole_context_menu_store_as_global.js]
+ [browser_webconsole_copy_link_location.js]
+ skip-if = true #       Bug 1401944
+ [browser_webconsole_csp_ignore_reflected_xss_message.js]
+-skip-if = true # Bug 1408931
+-# old console skip-if = (e10s && debug) || (e10s && os == 'win') # Bug 1221499 enabled these on windows
++skip-if = (e10s && debug) || (e10s && os == 'win') # Bug 1221499 enabled these on windows
+ [browser_webconsole_cspro.js]
+ skip-if = true # Bug 1408932
+ # old console skip-if = e10s && (os == 'win' || os == 'mac') # Bug 1243967
+ [browser_webconsole_ctrl_key_nav.js]
+ skip-if = true # Bug 1408933
+ # old console skip-if = os != "mac"
+ [browser_webconsole_deactivateHUDForContext_unfocused_window.js]
+ skip-if = true # Bug 1408934
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_csp_ignore_reflected_xss_message.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_csp_ignore_reflected_xss_message.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_csp_ignore_reflected_xss_message.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_csp_ignore_reflected_xss_message.js
+@@ -1,52 +1,31 @@
+ /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+ /* Any copyright is dedicated to the Public Domain.
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+ // Tests that a file with an unsupported CSP directive ('reflected-xss filter')
+-// displays the appropriate message to the console.
++// displays the appropriate message to the console. See Bug 1045902.
+ 
+ "use strict";
+ 
+ const EXPECTED_RESULT = "Not supporting directive \u2018reflected-xss\u2019. " +
+                         "Directive and values will be ignored.";
+-const TEST_FILE = "http://example.com/browser/devtools/client/webconsole/" +
+-                  "test/test_bug1045902_console_csp_ignore_reflected_xss_" +
+-                  "message.html";
+-
+-var hud = undefined;
+-
+-var TEST_URI = "data:text/html;charset=utf8,Web Console CSP ignoring " +
+-               "reflected XSS (bug 1045902)";
++const TEST_FILE =
++  "http://example.com/browser/devtools/client/webconsole/new-console-output/test/" +
++  "mochitest/test_console_csp_ignore_reflected_xss_message.html";
+ 
+-add_task(function* () {
+-  let { browser } = yield loadTab(TEST_URI);
+-
+-  hud = yield openConsole();
++const TEST_URI =
++  "data:text/html;charset=utf8,Web Console CSP ignoring reflected XSS (bug 1045902)";
+ 
+-  yield loadDocument(browser);
+-  yield testViolationMessage();
+-
+-  hud = null;
+-});
++const cache = Cc["@mozilla.org/netwerk/cache-storage-service;1"]
++  .getService(Ci.nsICacheStorageService);
+ 
+-function loadDocument(browser) {
+-  hud.jsterm.clearOutput();
+-  browser.loadURI(TEST_FILE);
+-  return BrowserTestUtils.browserLoaded(browser);
+-}
+-
+-function testViolationMessage() {
+-  let aOutputNode = hud.outputNode;
++add_task(async function () {
++  const hud = await openNewTabAndConsole(TEST_URI);
++  await loadDocument(TEST_FILE);
+ 
+-  return waitForSuccess({
+-    name: "Confirming that CSP logs messages to the console when " +
+-          "\u2018reflected-xss\u2019 directive is used!",
+-    validator: function () {
+-      console.log(aOutputNode.textContent);
+-      let success = false;
+-      success = aOutputNode.textContent.indexOf(EXPECTED_RESULT) > -1;
+-      return success;
+-    }
+-  });
+-}
++  await waitFor(() => findMessage(hud, EXPECTED_RESULT, ".message.warn"));
++  ok(true, `CSP logs displayed in console when using "reflected-xss" directive`);
++
++  cache.clear();
++});
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/test_bug1045902_console_csp_ignore_reflected_xss_message.html b/devtools/client/webconsole/new-console-output/test/mochitest/test_console_csp_ignore_reflected_xss_message.html
+rename from devtools/client/webconsole/new-console-output/test/mochitest/test_bug1045902_console_csp_ignore_reflected_xss_message.html
+rename to devtools/client/webconsole/new-console-output/test/mochitest/test_console_csp_ignore_reflected_xss_message.html
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/test_bug1045902_console_csp_ignore_reflected_xss_message.html^headers^ b/devtools/client/webconsole/new-console-output/test/mochitest/test_console_csp_ignore_reflected_xss_message.html^headers^
+rename from devtools/client/webconsole/new-console-output/test/mochitest/test_bug1045902_console_csp_ignore_reflected_xss_message.html^headers^
+rename to devtools/client/webconsole/new-console-output/test/mochitest/test_console_csp_ignore_reflected_xss_message.html^headers^

+ 181 - 0
mozilla-release/patches/1408932-59a1.patch

@@ -0,0 +1,181 @@
+# HG changeset patch
+# User Nicolas Chevobbe <nchevobbe@mozilla.com>
+# Date 1512652271 -3600
+# Node ID 150e5c84fc792f492d17e5527b8ddd3bb44498f6
+# Parent  38a87b0211748ab04526bcb0fd08e994ff8a1095
+Bug 1408932 - Rename and enable browser_webconsole_cspro.js in new frontend; r=Honza.
+
+MozReview-Commit-ID: 2qSue0CIO1c
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -6,18 +6,16 @@ support-files =
+   code_bundle_invalidmap.js.map
+   code_bundle_nosource.js
+   code_bundle_nosource.js.map
+   head.js
+   sjs_slow-response-test-server.sjs
+   source-mapped.css
+   source-mapped.css.map
+   source-mapped.scss
+-  test_bug_1010953_cspro.html
+-  test_bug_1010953_cspro.html^headers^
+   test_bug_1247459_violation.html
+   test_bug_770099_violation.html
+   test_bug_770099_violation.html^headers^
+   test_console_csp_ignore_reflected_xss_message.html
+   test_console_csp_ignore_reflected_xss_message.html^headers^
+   test_hpkp-invalid-headers.sjs
+   test_hsts-invalid-headers.sjs
+   test-autocomplete-in-stackframe.html
+@@ -48,19 +46,16 @@ support-files =
+   test-bug-595934-svg.xhtml
+   test-bug-595934-workers.html
+   test-bug-595934-workers.js
+   test-bug-599725-response-headers.sjs
+   test-bug-601177-log-levels.html
+   test-bug-601177-log-levels.js
+   test-bug-603750-websocket.html
+   test-bug-603750-websocket.js
+-  test-cd-iframe-child.html
+-  test-cd-iframe-parent.html
+-  test-console-api-iframe.html
+   test-bug-630733-response-redirect-headers.sjs
+   test-bug-632275-getters.html
+   test-bug-632347-iterators-generators.html
+   test-bug-644419-log-limits.html
+   test-bug-646025-console-file-location.html
+   test-bug-658368-time-methods.html
+   test-bug-737873-mixedcontent.html
+   test-bug-752559-ineffective-iframe-sandbox-warning-inner.html
+@@ -78,16 +73,21 @@ support-files =
+   test-bug-766001-js-console-links.html
+   test-bug-766001-js-errors.js
+   test-bug-782653-css-errors-1.css
+   test-bug-782653-css-errors-2.css
+   test-bug-782653-css-errors.html
+   test-bug-837351-security-errors.html
+   test-bug-859170-longstring-hang.html
+   test-bug-952277-highlight-nodes-in-vview.html
++  test-cd-iframe-child.html
++  test-cd-iframe-parent.html
++  test-console-api-iframe.html
++  test-cspro.html
++  test-cspro.html^headers^
+   test-iframe-child.html
+   test-iframe-parent.html
+   test-certificate-messages.html
+   test-click-function-to-source.html
+   test-click-function-to-source.js
+   test-closure-optimized-out.html
+   test-closures.html
+   test-console-api-stackframe.html
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_cspro.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_cspro.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_cspro.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_cspro.js
+@@ -1,10 +1,8 @@
+-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+-/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+ /* Any copyright is dedicated to the Public Domain.
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+ /* We are loading:
+ a script that is allowed by the CSP header but not by the CSPRO header
+ an image which is allowed by the CSPRO header but not by the CSP header.
+ 
+ So we expect a warning (image has been blocked) and a report
+@@ -13,45 +11,34 @@ So we expect a warning (image has been b
+ The expected console messages in the constants CSP_VIOLATION_MSG and
+ CSP_REPORT_MSG are confirmed to be found in the console messages.
+ 
+ See Bug 1010953.
+ */
+ 
+ "use strict";
+ 
+-const TEST_URI = "data:text/html;charset=utf8,Web Console CSP report only " +
+-                 "test (bug 1010953)";
+-const TEST_VIOLATION = "http://example.com/browser/devtools/client/" +
+-                       "webconsole/test/test_bug_1010953_cspro.html";
+-const CSP_VIOLATION_MSG = "Content Security Policy: The page\u2019s settings " +
+-                          "blocked the loading of a resource at " +
+-                          "http://some.example.com/test.png " +
+-                          "(\u201cimg-src http://example.com\u201d).";
+-const CSP_REPORT_MSG = "Content Security Policy: The page\u2019s settings " +
+-                       "observed the loading of a resource at " +
+-                       "http://some.example.com/test_bug_1010953_cspro.js " +
+-                       "(\u201cscript-src http://example.com\u201d). A CSP report is " +
+-                       "being sent.";
+-
+-add_task(function* () {
+-  let { browser } = yield loadTab(TEST_URI);
+-
+-  let hud = yield openConsole();
++const TEST_URI = "data:text/html;charset=utf8,Web Console CSP report only test";
++const TEST_VIOLATION = "http://example.com/browser/devtools/client/webconsole/" +
++                       "new-console-output/test/mochitest/test-cspro.html";
++const CSP_VIOLATION_MSG =
++  "Content Security Policy: The page\u2019s settings blocked the loading of a resource " +
++  "at http://some.example.com/cspro.png (\u201cimg-src http://example.com\u201d).";
++const CSP_REPORT_MSG =
++  "Content Security Policy: The page\u2019s settings observed the loading of a " +
++  "resource at http://some.example.com/cspro.js " +
++  "(\u201cscript-src http://example.com\u201d). A CSP report is being sent.";
+ 
+-  hud.jsterm.clearOutput();
++add_task(async function () {
++  let hud = await openNewTabAndConsole(TEST_URI);
+ 
+-  let loaded = loadBrowser(browser);
+-  BrowserTestUtils.loadURI(browser, TEST_VIOLATION);
+-  yield loaded;
++  let onCspViolationMessage = waitForMessage(hud, CSP_VIOLATION_MSG, ".message.error");
++  let onCspReportMessage = waitForMessage(hud, CSP_REPORT_MSG, ".message.error");
+ 
+-  yield waitForSuccess({
+-    name: "Confirmed that CSP and CSP-Report-Only log different messages to " +
+-          "the console.",
+-    validator: function () {
+-      console.log(hud.outputNode.textContent);
+-      let success = false;
+-      success = hud.outputNode.textContent.indexOf(CSP_VIOLATION_MSG) > -1 &&
+-                hud.outputNode.textContent.indexOf(CSP_REPORT_MSG) > -1;
+-      return success;
+-    }
+-  });
++  info("Load a page with CSP warnings.");
++  loadDocument(TEST_VIOLATION);
++
++  await onCspViolationMessage;
++  await onCspReportMessage;
++  ok(true, "Confirmed that CSP and CSP-Report-Only log different messages to console");
++
++  hud.jsterm.clearOutput(true);
+ });
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/test_bug_1010953_cspro.html b/devtools/client/webconsole/new-console-output/test/mochitest/test-cspro.html
+rename from devtools/client/webconsole/new-console-output/test/mochitest/test_bug_1010953_cspro.html
+rename to devtools/client/webconsole/new-console-output/test/mochitest/test-cspro.html
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/test_bug_1010953_cspro.html
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/test-cspro.html
+@@ -7,14 +7,14 @@ messages.</title>
+ <!-- Any copyright is dedicated to the Public Domain.
+      http://creativecommons.org/publicdomain/zero/1.0/ -->
+ </head>
+ <body>
+ <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1010953">Mozilla Bug 1010953</a>
+ 
+ 
+ <!-- this script file allowed by the CSP header (but not by the report-only header) -->
+-<script src="http://some.example.com/test_bug_1010953_cspro.js"></script>
++<script src="http://some.example.com/cspro.js"></script>
+ 
+ <!-- this image allowed only be the CSP report-only header. -->
+-<img src="http://some.example.com/test.png">
++<img src="http://some.example.com/cspro.png">
+ </body>
+ </html>
+\ No newline at end of file
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/test_bug_1010953_cspro.html^headers^ b/devtools/client/webconsole/new-console-output/test/mochitest/test-cspro.html^headers^
+rename from devtools/client/webconsole/new-console-output/test/mochitest/test_bug_1010953_cspro.html^headers^
+rename to devtools/client/webconsole/new-console-output/test/mochitest/test-cspro.html^headers^

+ 353 - 0
mozilla-release/patches/1408933-59a1.patch

@@ -0,0 +1,353 @@
+# HG changeset patch
+# User Julian Descottes <jdescottes@mozilla.com>
+# Date 1512410155 -3600
+# Node ID b871e0db43a1cbe71e400aa6794bfa13afe7b00c
+# Parent  7160c17138f3797244ae9061f6f364890f95cff5
+Bug 1408933 - enable and rename browser_webconsole_ctrl_key_nav.js;r=bgrins
+
+Initially tried to port the test to work on all OSes, relying on
+HOME/END/PAGEUP/PAGEDOWN, but the behavior is not really consistent
+(at least not on Linux). The shortcuts listed on MDN at
+https://developer.mozilla.org/en-US/docs/Tools/Web_Console/Keyboard_shortcuts
+seem a bit out of sync.
+
+Not sure why we cannot use home/end/pageup/pagedown on all platforms here
+but as it is not the purpose of this migration, I will leave that up for a
+follow up.
+
+MozReview-Commit-ID: DJbmYzYZUok
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -207,16 +207,18 @@ skip-if = true #       Bug 1403188
+ [browser_jsterm_autocomplete_inside_text.js]
+ [browser_jsterm_autocomplete_native_getters.js]
+ [browser_jsterm_autocomplete_nav_and_tab_key.js]
+ [browser_jsterm_autocomplete_return_key_no_selection.js]
+ [browser_jsterm_autocomplete_return_key.js]
+ [browser_jsterm_autocomplete-properties-with-non-alphanumeric-names.js]
+ [browser_jsterm_completion.js]
+ [browser_jsterm_copy_command.js]
++[browser_jsterm_ctrl_key_nav.js]
++skip-if = os != 'mac' # The tested ctrl+key shortcuts are OSX only
+ [browser_jsterm_dollar.js]
+ [browser_jsterm_history.js]
+ [browser_jsterm_history_persist.js]
+ [browser_jsterm_history_nav.js]
+ [browser_jsterm_inspect.js]
+ [browser_jsterm_multiline.js]
+ [browser_jsterm_no_autocompletion_on_defined_variables.js]
+ [browser_jsterm_no_input_and_tab_key_pressed.js]
+@@ -259,19 +261,16 @@ subsuite = clipboard
+ [browser_webconsole_context_menu_object_in_sidebar.js]
+ [browser_webconsole_context_menu_open_url.js]
+ [browser_webconsole_context_menu_store_as_global.js]
+ [browser_webconsole_csp_ignore_reflected_xss_message.js]
+ skip-if = (e10s && debug) || (e10s && os == 'win') # Bug 1221499 enabled these on windows
+ [browser_webconsole_cspro.js]
+ skip-if = true # Bug 1408932
+ # old console skip-if = e10s && (os == 'win' || os == 'mac') # Bug 1243967
+-[browser_webconsole_ctrl_key_nav.js]
+-skip-if = true # Bug 1408933
+-# old console skip-if = os != "mac"
+ [browser_webconsole_document_focus.js]
+ skip-if = true #       Bug 1404368
+ [browser_webconsole_duplicate_errors.js]
+ skip-if = true #       Bug 1403907
+ [browser_webconsole_errors_after_page_reload.js]
+ [browser_webconsole_eval_in_debugger_stackframe.js]
+ [browser_webconsole_eval_in_debugger_stackframe2.js]
+ skip-if = true # Bug 1408893
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_ctrl_key_nav.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_ctrl_key_nav.js
+rename from devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_ctrl_key_nav.js
+rename to devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_ctrl_key_nav.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_ctrl_key_nav.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_ctrl_key_nav.js
+@@ -1,96 +1,90 @@
+ /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+ /* Any copyright is dedicated to the Public Domain.
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+ // Test navigation of webconsole contents via ctrl-a, ctrl-e, ctrl-p, ctrl-n
+ // see https://bugzilla.mozilla.org/show_bug.cgi?id=804845
++//
++// The shortcuts tested here have platform limitations:
++// - ctrl-e does not work on windows,
++// - ctrl-a, ctrl-p and ctrl-n only work on OSX
+ "use strict";
+ 
+ const TEST_URI = "data:text/html;charset=utf-8,Web Console test for " +
+                  "bug 804845 and bug 619598";
+ 
+-var jsterm, inputNode;
+-
+-add_task(function* () {
+-  yield loadTab(TEST_URI);
+-
+-  let hud = yield openConsole();
++add_task(async function () {
++  const {jsterm} = await openNewTabAndConsole(TEST_URI);
+ 
+-  doTests(hud);
+-
+-  jsterm = inputNode = null;
+-});
+-
+-function doTests(HUD) {
+-  jsterm = HUD.jsterm;
+-  inputNode = jsterm.inputNode;
+   ok(!jsterm.getInputValue(), "jsterm.getInputValue() is empty");
+   is(jsterm.inputNode.selectionStart, 0);
+   is(jsterm.inputNode.selectionEnd, 0);
+ 
+-  testSingleLineInputNavNoHistory();
+-  testMultiLineInputNavNoHistory();
+-  testNavWithHistory();
+-}
++  testSingleLineInputNavNoHistory(jsterm);
++  testMultiLineInputNavNoHistory(jsterm);
++  testNavWithHistory(jsterm);
++});
+ 
+-function testSingleLineInputNavNoHistory() {
++function testSingleLineInputNavNoHistory(jsterm) {
++  let inputNode = jsterm.inputNode;
+   // Single char input
+   EventUtils.synthesizeKey("1", {});
+   is(inputNode.selectionStart, 1, "caret location after single char input");
+ 
+   // nav to start/end with ctrl-a and ctrl-e;
+-  EventUtils.synthesizeKey("a", { ctrlKey: true });
++  synthesizeLineStartKey();
+   is(inputNode.selectionStart, 0,
+      "caret location after single char input and ctrl-a");
+ 
+-  EventUtils.synthesizeKey("e", { ctrlKey: true });
++  synthesizeLineEndKey();
+   is(inputNode.selectionStart, 1,
+      "caret location after single char input and ctrl-e");
+ 
+   // Second char input
+   EventUtils.synthesizeKey("2", {});
+   // nav to start/end with up/down keys; verify behaviour using ctrl-p/ctrl-n
+   EventUtils.synthesizeKey("VK_UP", {});
+   is(inputNode.selectionStart, 0,
+      "caret location after two char input and VK_UP");
+   EventUtils.synthesizeKey("VK_DOWN", {});
+   is(inputNode.selectionStart, 2,
+      "caret location after two char input and VK_DOWN");
+ 
+-  EventUtils.synthesizeKey("a", { ctrlKey: true });
++  synthesizeLineStartKey();
+   is(inputNode.selectionStart, 0,
+      "move caret to beginning of 2 char input with ctrl-a");
+-  EventUtils.synthesizeKey("a", { ctrlKey: true });
++  synthesizeLineStartKey();
+   is(inputNode.selectionStart, 0,
+      "no change of caret location on repeat ctrl-a");
+-  EventUtils.synthesizeKey("p", { ctrlKey: true });
++  synthesizeLineUpKey();
+   is(inputNode.selectionStart, 0,
+      "no change of caret location on ctrl-p from beginning of line");
+ 
+-  EventUtils.synthesizeKey("e", { ctrlKey: true });
++  synthesizeLineEndKey();
+   is(inputNode.selectionStart, 2,
+      "move caret to end of 2 char input with ctrl-e");
+-  EventUtils.synthesizeKey("e", { ctrlKey: true });
++  synthesizeLineEndKey();
+   is(inputNode.selectionStart, 2,
+      "no change of caret location on repeat ctrl-e");
+-  EventUtils.synthesizeKey("n", { ctrlKey: true });
++  synthesizeLineDownKey();
+   is(inputNode.selectionStart, 2,
+      "no change of caret location on ctrl-n from end of line");
+ 
+-  EventUtils.synthesizeKey("p", { ctrlKey: true });
++  synthesizeLineUpKey();
+   is(inputNode.selectionStart, 0, "ctrl-p moves to start of line");
+ 
+-  EventUtils.synthesizeKey("n", { ctrlKey: true });
++  synthesizeLineDownKey();
+   is(inputNode.selectionStart, 2, "ctrl-n moves to end of line");
+ }
+ 
+-function testMultiLineInputNavNoHistory() {
++function testMultiLineInputNavNoHistory(jsterm) {
++  let inputNode = jsterm.inputNode;
+   let lineValues = ["one", "2", "something longer", "", "", "three!"];
+   jsterm.setInputValue("");
+   // simulate shift-return
+   for (let i = 0; i < lineValues.length; i++) {
+     jsterm.setInputValue(jsterm.getInputValue() + lineValues[i]);
+     EventUtils.synthesizeKey("VK_RETURN", { shiftKey: true });
+   }
+   let inputValue = jsterm.getInputValue();
+@@ -108,120 +102,141 @@ function testMultiLineInputNavNoHistory(
+   is(jsterm.getInputValue().slice(inputNode.selectionStart), expectedStringAfterCarat,
+      "up arrow from end of multiline");
+ 
+   EventUtils.synthesizeKey("VK_DOWN", {});
+   is(jsterm.getInputValue().slice(inputNode.selectionStart), "",
+      "down arrow from within multiline");
+ 
+   // navigate up through input lines
+-  EventUtils.synthesizeKey("p", { ctrlKey: true });
++  synthesizeLineUpKey();
+   is(jsterm.getInputValue().slice(inputNode.selectionStart), expectedStringAfterCarat,
+      "ctrl-p from end of multiline");
+ 
+   for (let i = 4; i >= 0; i--) {
+-    EventUtils.synthesizeKey("p", { ctrlKey: true });
++    synthesizeLineUpKey();
+     expectedStringAfterCarat = lineValues[i] + newlineString +
+       expectedStringAfterCarat;
+     is(jsterm.getInputValue().slice(inputNode.selectionStart),
+       expectedStringAfterCarat, "ctrl-p from within line " + i +
+       " of multiline input");
+   }
+-  EventUtils.synthesizeKey("p", { ctrlKey: true });
++  synthesizeLineUpKey();
+   is(inputNode.selectionStart, 0, "reached start of input");
+   is(jsterm.getInputValue(), inputValue,
+      "no change to multiline input on ctrl-p from beginning of multiline");
+ 
+   // navigate to end of first line
+-  EventUtils.synthesizeKey("e", { ctrlKey: true });
++  synthesizeLineEndKey();
+   let caretPos = inputNode.selectionStart;
+   let expectedStringBeforeCarat = lineValues[0];
+   is(jsterm.getInputValue().slice(0, caretPos), expectedStringBeforeCarat,
+      "ctrl-e into multiline input");
+-  EventUtils.synthesizeKey("e", { ctrlKey: true });
++  synthesizeLineEndKey();
+   is(inputNode.selectionStart, caretPos,
+      "repeat ctrl-e doesn't change caret position in multiline input");
+ 
+   // navigate down one line; ctrl-a to the beginning; ctrl-e to end
+   for (let i = 1; i < lineValues.length; i++) {
+-    EventUtils.synthesizeKey("n", { ctrlKey: true });
+-    EventUtils.synthesizeKey("a", { ctrlKey: true });
++    synthesizeLineDownKey();
++    synthesizeLineStartKey();
+     caretPos = inputNode.selectionStart;
+     expectedStringBeforeCarat += newlineString;
+     is(jsterm.getInputValue().slice(0, caretPos), expectedStringBeforeCarat,
+        "ctrl-a to beginning of line " + (i + 1) + " in multiline input");
+ 
+-    EventUtils.synthesizeKey("e", { ctrlKey: true });
++    synthesizeLineEndKey();
+     caretPos = inputNode.selectionStart;
+     expectedStringBeforeCarat += lineValues[i];
+     is(jsterm.getInputValue().slice(0, caretPos), expectedStringBeforeCarat,
+        "ctrl-e to end of line " + (i + 1) + "in multiline input");
+   }
+ }
+ 
+-function testNavWithHistory() {
++function testNavWithHistory(jsterm) {
++  let inputNode = jsterm.inputNode;
++
+   // NOTE: Tests does NOT currently define behaviour for ctrl-p/ctrl-n with
+   // caret placed _within_ single line input
+-  let values = ['"single line input"',
+-                '"a longer single-line input to check caret repositioning"',
+-                ['"multi-line"', '"input"', '"here!"'].join("\n"),
+-               ];
++  let values = [
++    '"single line input"',
++    '"a longer single-line input to check caret repositioning"',
++    '"multi-line"\n"input"\n"here!"',
++  ];
++
+   // submit to history
+   for (let i = 0; i < values.length; i++) {
+     jsterm.setInputValue(values[i]);
+     jsterm.execute();
+   }
+   is(inputNode.selectionStart, 0, "caret location at start of empty line");
+ 
+-  EventUtils.synthesizeKey("p", { ctrlKey: true });
++  synthesizeLineUpKey();
+   is(inputNode.selectionStart, values[values.length - 1].length,
+      "caret location correct at end of last history input");
+ 
+   // Navigate backwards history with ctrl-p
+   for (let i = values.length - 1; i > 0; i--) {
+     let match = values[i].match(/(\n)/g);
+     if (match) {
+       // multi-line inputs won't update from history unless caret at beginning
+-      EventUtils.synthesizeKey("a", { ctrlKey: true });
++      synthesizeLineStartKey();
+       for (let j = 0; j < match.length; j++) {
+-        EventUtils.synthesizeKey("p", { ctrlKey: true });
++        synthesizeLineUpKey();
+       }
+-      EventUtils.synthesizeKey("p", { ctrlKey: true });
++      synthesizeLineUpKey();
+     } else {
+       // single-line inputs will update from history from end of line
+-      EventUtils.synthesizeKey("p", { ctrlKey: true });
++      synthesizeLineUpKey();
+     }
+     is(jsterm.getInputValue(), values[i - 1],
+        "ctrl-p updates inputNode from backwards history values[" + i - 1 + "]");
+   }
++
+   let inputValue = jsterm.getInputValue();
+-  EventUtils.synthesizeKey("p", { ctrlKey: true });
++  synthesizeLineUpKey();
+   is(inputNode.selectionStart, 0,
+      "ctrl-p at beginning of history moves caret location to beginning " +
+      "of line");
+   is(jsterm.getInputValue(), inputValue,
+      "no change to input value on ctrl-p from beginning of line");
+ 
+   // Navigate forwards history with ctrl-n
+   for (let i = 1; i < values.length; i++) {
+-    EventUtils.synthesizeKey("n", { ctrlKey: true });
++    synthesizeLineDownKey();
+     is(jsterm.getInputValue(), values[i],
+        "ctrl-n updates inputNode from forwards history values[" + i + "]");
+     is(inputNode.selectionStart, values[i].length,
+        "caret location correct at end of history input for values[" + i + "]");
+   }
+-  EventUtils.synthesizeKey("n", { ctrlKey: true });
++  synthesizeLineDownKey();
+   ok(!jsterm.getInputValue(), "ctrl-n at end of history updates to empty input");
+ 
+   // Simulate editing multi-line
+   inputValue = "one\nlinebreak";
+   jsterm.setInputValue(inputValue);
+ 
+   // Attempt nav within input
+-  EventUtils.synthesizeKey("p", { ctrlKey: true });
++  synthesizeLineUpKey();
+   is(jsterm.getInputValue(), inputValue,
+      "ctrl-p from end of multi-line does not trigger history");
+ 
+-  EventUtils.synthesizeKey("a", { ctrlKey: true });
+-  EventUtils.synthesizeKey("p", { ctrlKey: true });
++  synthesizeLineStartKey();
++  synthesizeLineUpKey();
+   is(jsterm.getInputValue(), values[values.length - 1],
+      "ctrl-p from start of multi-line triggers history");
+ }
++
++function synthesizeLineStartKey() {
++  EventUtils.synthesizeKey("a", { ctrlKey: true });
++}
++
++function synthesizeLineEndKey() {
++  EventUtils.synthesizeKey("e", { ctrlKey: true });
++}
++
++function synthesizeLineUpKey() {
++  EventUtils.synthesizeKey("p", { ctrlKey: true });
++}
++
++function synthesizeLineDownKey() {
++  EventUtils.synthesizeKey("n", { ctrlKey: true });
++}

+ 225 - 0
mozilla-release/patches/1408934-59a1.patch

@@ -0,0 +1,225 @@
+# HG changeset patch
+# User Julian Descottes <jdescottes@mozilla.com>
+# Date 1512149370 -3600
+# Node ID c888dbc7f5fdd0e859f7bb1d3679e648a303ef5f
+# Parent  9b7e10fe3f51597f8e0a589aece968dfd601b073
+Bug 1408934 - enable browser_webconsole_deactivateHUDForContext_unfocused_window.js;r=Honza
+
+MozReview-Commit-ID: 8k5ISUxEPP7
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -231,20 +231,21 @@ tags = mcb
+ [browser_webconsole_batching.js]
+ [browser_webconsole_block_mixedcontent_securityerrors.js]
+ tags = mcb
+ [browser_webconsole_cached_messages.js]
+ [browser_webconsole_cd_iframe.js]
+ [browser_webconsole_certificate_messages.js]
+ [browser_webconsole_click_function_to_source.js]
+ [browser_webconsole_clickable_urls.js]
++[browser_webconsole_close_unfocused_window.js]
+ [browser_webconsole_closing_after_completion.js]
+ [browser_webconsole_close_sidebar.js]
+ [browser_webconsole_closure_inspection.js]
+-skip-if = true #       Bug 1405250
++skip-if = true # Bug 1405250
+ [browser_webconsole_console_api_iframe.js]
+ [browser_webconsole_console_dir.js]
+ [browser_webconsole_console_dir_uninspectable.js]
+ [browser_webconsole_console_group.js]
+ [browser_webconsole_console_logging_workers_api.js]
+ skip-if = true # Bug 1405252
+ [browser_webconsole_console_table.js]
+ [browser_webconsole_context_menu_copy_entire_message.js]
+@@ -254,27 +255,25 @@ skip-if = (os == 'linux' && bits == 32 &
+ subsuite = clipboard
+ skip-if = (os == 'linux' && bits == 32 && debug) # bug 1328915, disable linux32 debug devtools for timeouts
+ [browser_webconsole_context_menu_copy_object.js]
+ subsuite = clipboard
+ [browser_webconsole_context_menu_object_in_sidebar.js]
+ [browser_webconsole_context_menu_open_url.js]
+ [browser_webconsole_context_menu_store_as_global.js]
+ [browser_webconsole_copy_link_location.js]
+-skip-if = true #       Bug 1401944
++skip-if = true # Bug 1401944
+ [browser_webconsole_csp_ignore_reflected_xss_message.js]
+ skip-if = (e10s && debug) || (e10s && os == 'win') # Bug 1221499 enabled these on windows
+ [browser_webconsole_cspro.js]
+ skip-if = true # Bug 1408932
+ # old console skip-if = e10s && (os == 'win' || os == 'mac') # Bug 1243967
+ [browser_webconsole_ctrl_key_nav.js]
+ skip-if = true # Bug 1408933
+ # old console skip-if = os != "mac"
+-[browser_webconsole_deactivateHUDForContext_unfocused_window.js]
+-skip-if = true # Bug 1408934
+ [browser_webconsole_document_focus.js]
+ skip-if = true #       Bug 1404368
+ [browser_webconsole_duplicate_errors.js]
+ skip-if = true #       Bug 1403907
+ [browser_webconsole_errors_after_page_reload.js]
+ [browser_webconsole_eval_in_debugger_stackframe.js]
+ [browser_webconsole_eval_in_debugger_stackframe2.js]
+ skip-if = true # Bug 1408893
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_deactivateHUDForContext_unfocused_window.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_close_unfocused_window.js
+rename from devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_deactivateHUDForContext_unfocused_window.js
+rename to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_close_unfocused_window.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_deactivateHUDForContext_unfocused_window.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_close_unfocused_window.js
+@@ -1,99 +1,44 @@
+ /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+ /* Any copyright is dedicated to the Public Domain.
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+ "use strict";
+ 
+-// See Bug 597103.
++// See Bug 597103. Check that closing the console on an unfocused window does not trigger
++// any error.
+ 
+ const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
+-                 "test/test-console.html";
+-
+-var tab1, tab2, win1, win2;
+-var noErrors = true;
++                 "new-console-output/test/mochitest/test-console.html";
+ 
+-function tab1Loaded() {
+-  win2 = OpenBrowserWindow();
+-  whenDelayedStartupFinished(win2, win2Loaded);
+-}
++add_task(async function () {
++  let tab1 = await addTab(TEST_URI, {window});
+ 
+-function win2Loaded() {
+-  tab2 = win2.gBrowser.addTab(TEST_URI);
+-  win2.gBrowser.selectedTab = tab2;
+-  tab2.linkedBrowser.addEventListener("load", tab2Loaded, true);
+-}
+-
+-function tab2Loaded(aEvent) {
+-  tab2.linkedBrowser.removeEventListener(aEvent.type, tab2Loaded, true);
++  info("Open a second window");
++  let win2 = await openNewBrowserWindow();
+ 
+-  let consolesOpened = 0;
+-  function onWebConsoleOpen() {
+-    consolesOpened++;
+-    if (consolesOpened == 2) {
+-      executeSoon(closeConsoles);
+-    }
+-  }
++  info("Add a test tab in the second window");
++  let tab2 = await addTab(TEST_URI, {window: win2});
++  win2.gBrowser.selectedTab = tab2;
+ 
+-  function openConsoles() {
+-    try {
+-      let target1 = TargetFactory.forTab(tab1);
+-      gDevTools.showToolbox(target1, "webconsole").then(onWebConsoleOpen);
+-    } catch (ex) {
+-      ok(false, "gDevTools.showToolbox(target1) exception: " + ex);
+-      noErrors = false;
+-    }
+-
+-    try {
+-      let target2 = TargetFactory.forTab(tab2);
+-      gDevTools.showToolbox(target2, "webconsole").then(onWebConsoleOpen);
+-    } catch (ex) {
+-      ok(false, "gDevTools.showToolbox(target2) exception: " + ex);
+-      noErrors = false;
+-    }
+-  }
++  info("Open console in tabs located in different windows");
++  await openConsole(tab1);
++  await openConsole(tab2);
+ 
+-  function closeConsoles() {
+-    try {
+-      let target1 = TargetFactory.forTab(tab1);
+-      gDevTools.closeToolbox(target1).then(function () {
+-        try {
+-          let target2 = TargetFactory.forTab(tab2);
+-          gDevTools.closeToolbox(target2).then(testEnd);
+-        } catch (ex) {
+-          ok(false, "gDevTools.closeToolbox(target2) exception: " + ex);
+-          noErrors = false;
+-        }
+-      });
+-    } catch (ex) {
+-      ok(false, "gDevTools.closeToolbox(target1) exception: " + ex);
+-      noErrors = false;
+-    }
+-  }
++  info("Close toolboxes in tabs located in different windows, one of them not focused");
++  await closeToolboxForTab(tab1);
++  await closeToolboxForTab(tab2);
+ 
+-  function testEnd() {
+-    ok(noErrors, "there were no errors");
++  info("Close the second window");
++  win2.close();
+ 
+-    win1.gBrowser.removeTab(tab1);
+-
+-    Array.forEach(win2.gBrowser.tabs, function (aTab) {
+-      win2.gBrowser.removeTab(aTab);
+-    });
++  info("Close the test tab in the first window");
++  window.gBrowser.removeTab(tab1);
+ 
+-    executeSoon(function () {
+-      win2.close();
+-      tab1 = tab2 = win1 = win2 = null;
+-      finishTest();
+-    });
+-  }
++  ok(true, "No error was triggered during the test");
++});
+ 
+-  openConsoles();
++function closeToolboxForTab(tab) {
++  let target = TargetFactory.forTab(tab);
++  return gDevTools.closeToolbox(target);
+ }
+-
+-function test() {
+-  loadTab(TEST_URI).then(() => {
+-    tab1 = gBrowser.selectedTab;
+-    win1 = window;
+-    tab1Loaded();
+-  });
+-}
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/head.js b/devtools/client/webconsole/new-console-output/test/mochitest/head.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/head.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/head.js
+@@ -460,8 +460,27 @@ function simulateLinkClick(element, clic
+ 
+   onOpenLink.then(() => {
+     if (timeoutId) {
+       clearTimeout(timeoutId);
+     }
+   });
+   return Promise.race([onOpenLink, onTimeout]);
+ }
++
++/**
++ * Open a new browser window and return a promise that resolves when the new window has
++ * fired the "browser-delayed-startup-finished" event.
++ *
++ * @returns Promise
++ *          A Promise that resolves when the window is ready.
++ */
++function openNewBrowserWindow() {
++  let win = OpenBrowserWindow();
++  return new Promise(resolve => {
++    Services.obs.addObserver(function observer(subject, topic) {
++      if (win == subject) {
++        Services.obs.removeObserver(observer, topic);
++        resolve(win);
++      }
++    }, "browser-delayed-startup-finished");
++  });
++}

+ 101 - 0
mozilla-release/patches/1408935-59a1.patch

@@ -0,0 +1,101 @@
+# HG changeset patch
+# User Julian Descottes <jdescottes@mozilla.com>
+# Date 1512148537 -3600
+# Node ID 4c0dd19237a769785695179125454daf4dcb5bfb
+# Parent  edc8c112e4b88041fa79e786bac3021c844af1bf
+Bug 1408935 - enable browser_webconsole_errors_after_page_reload.js;r=nchevobbe
+
+MozReview-Commit-ID: LMfIeeIy61Y
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -269,17 +269,16 @@ skip-if = true # Bug 1408933
+ # old console skip-if = os != "mac"
+ [browser_webconsole_deactivateHUDForContext_unfocused_window.js]
+ skip-if = true # Bug 1408934
+ [browser_webconsole_document_focus.js]
+ skip-if = true #       Bug 1404368
+ [browser_webconsole_duplicate_errors.js]
+ skip-if = true #       Bug 1403907
+ [browser_webconsole_errors_after_page_reload.js]
+-skip-if = true # Bug 1408935
+ [browser_webconsole_eval_in_debugger_stackframe.js]
+ [browser_webconsole_eval_in_debugger_stackframe2.js]
+ skip-if = true # Bug 1408893
+ [browser_webconsole_execution_scope.js]
+ skip-if = true #       Bug 1405333
+ [browser_webconsole_external_script_errors.js]
+ [browser_webconsole_file_uri.js]
+ skip-if = true #       Bug 1404382
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_errors_after_page_reload.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_errors_after_page_reload.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_errors_after_page_reload.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_errors_after_page_reload.js
+@@ -5,46 +5,33 @@
+ 
+ // Tests that errors still show up in the Web Console after a page reload.
+ // See bug 580030: the error handler fails silently after page reload.
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=580030
+ 
+ "use strict";
+ 
+ const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
+-                 "test/test-error.html";
++                 "new-console-output/test/mochitest/test-error.html";
+ 
+-function test() {
+-  Task.spawn(function* () {
+-    const {tab} = yield loadTab(TEST_URI);
+-    const hud = yield openConsole(tab);
+-    info("console opened");
++add_task(async function () {
++  let hud = await openNewTabAndConsole(TEST_URI);
+ 
+-    executeSoon(() => {
+-      hud.jsterm.clearOutput();
+-      info("wait for reload");
+-      content.location.reload();
+-    });
+-
+-    yield hud.target.once("navigate");
+-    info("target navigated");
++  info("Reload the content window");
++  let onNavigate = hud.target.once("navigate");
++  ContentTask.spawn(gBrowser.selectedBrowser, null, () => {
++    content.wrappedJSObject.location.reload();
++  });
++  await onNavigate;
++  info("Target navigated");
+ 
+-    let button = content.document.querySelector("button");
+-    ok(button, "button found");
+-
+-    // On e10s, the exception is triggered in child process
+-    // and is ignored by test harness
+-    if (!Services.appinfo.browserTabsRemoteAutostart) {
+-      expectUncaughtException();
+-    }
+-
+-    EventUtils.sendMouseEvent({type: "click"}, button, content);
++  // On e10s, the exception is triggered in child process
++  // and is ignored by test harness
++  if (!Services.appinfo.browserTabsRemoteAutostart) {
++    expectUncaughtException();
++  }
+ 
+-    yield waitForMessages({
+-      webconsole: hud,
+-      messages: [{
+-        text: "fooBazBaz is not defined",
+-        category: CATEGORY_JS,
+-        severity: SEVERITY_ERROR,
+-      }],
+-    });
+-  }).then(finishTest);
+-}
++  let onMessage = waitForMessage(hud, "fooBazBaz is not defined");
++  BrowserTestUtils.synthesizeMouseAtCenter("button", {}, gBrowser.selectedBrowser);
++  await onMessage;
++
++  ok(true, "Received the expected error message");
++});

+ 243 - 0
mozilla-release/patches/1408936-59a1.patch

@@ -0,0 +1,243 @@
+# HG changeset patch
+# User Nicolas Chevobbe <nchevobbe@mozilla.com>
+# Date 1511970900 -3600
+# Node ID 4eb0f190d3aa4ab33858c31d563d28770b2b8281
+# Parent  a6a62f5fbd2facb87a6de764c5c0f629cf1683b7
+Bug 1408936 - Enable browser_webconsole_eval_in_debugger_stackframe.js in new console frontend; r=bgrins.
+
+MozReview-Commit-ID: 6IiuekmfENG
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -271,17 +271,16 @@ skip-if = true # Bug 1408933
+ skip-if = true # Bug 1408934
+ [browser_webconsole_document_focus.js]
+ skip-if = true #       Bug 1404368
+ [browser_webconsole_duplicate_errors.js]
+ skip-if = true #       Bug 1403907
+ [browser_webconsole_errors_after_page_reload.js]
+ skip-if = true # Bug 1408935
+ [browser_webconsole_eval_in_debugger_stackframe.js]
+-skip-if = true # Bug 1408936
+ [browser_webconsole_eval_in_debugger_stackframe2.js]
+ skip-if = true # Bug 1408893
+ [browser_webconsole_execution_scope.js]
+ skip-if = true #       Bug 1405333
+ [browser_webconsole_external_script_errors.js]
+ skip-if = true # Bug 1408937
+ [browser_webconsole_file_uri.js]
+ skip-if = true #       Bug 1404382
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_eval_in_debugger_stackframe.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_eval_in_debugger_stackframe.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_eval_in_debugger_stackframe.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_eval_in_debugger_stackframe.js
+@@ -4,154 +4,81 @@
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+ // Test that makes sure web console eval happens in the user-selected stackframe
+ // from the js debugger.
+ 
+ "use strict";
+ 
+ const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
+-                 "test/test-eval-in-stackframe.html";
+-
+-var gWebConsole, gJSTerm, gDebuggerWin, gThread, gDebuggerController;
+-var gStackframes;
++                 "new-console-output/test/mochitest/test-eval-in-stackframe.html";
+ 
+-// Force the old debugger UI since it's directly used (see Bug 1301705)
+-Services.prefs.setBoolPref("devtools.debugger.new-debugger-frontend", false);
+-registerCleanupFunction(function* () {
+-  Services.prefs.clearUserPref("devtools.debugger.new-debugger-frontend");
+-});
+-
+-function test() {
+-  loadTab(TEST_URI).then(() => {
+-    openConsole().then(consoleOpened);
+-  });
+-}
++add_task(async function () {
++  // Force the old debugger UI since it's directly used (see Bug 1301705).
++  await pushPref("devtools.debugger.new-debugger-frontend", false);
+ 
+-function consoleOpened(hud) {
+-  gWebConsole = hud;
+-  gJSTerm = hud.jsterm;
+-  gJSTerm.execute("foo").then(onExecuteFoo);
+-}
++  info("open the console");
++  const hud = await openNewTabAndConsole(TEST_URI);
++  const {jsterm} = hud;
+ 
+-function onExecuteFoo() {
+-  isnot(gWebConsole.outputNode.textContent.indexOf("globalFooBug783499"), -1,
+-        "|foo| value is correct");
+-
+-  gJSTerm.clearOutput();
+-
+-  // Test for Bug 690529 - Web Console and Scratchpad should evaluate
+-  // expressions in the scope of the content window, not in a sandbox.
+-  executeSoon(() => {
+-    gJSTerm.execute("foo2 = 'newFoo'; window.foo2").then(onNewFoo2);
+-  });
+-}
++  info("Check `foo` value");
++  let onResultMessage = waitForMessage(hud, "globalFooBug783499");
++  jsterm.execute("foo");
++  await onResultMessage;
++  ok(true, "|foo| value is correct");
+ 
+-function onNewFoo2(msg) {
+-  is(gWebConsole.outputNode.textContent.indexOf("undefined"), -1,
+-     "|undefined| is not displayed after adding |foo2|");
+-
+-  ok(msg, "output result found");
++  info("Assign and check `foo2` value");
++  onResultMessage = waitForMessage(hud, "newFoo");
++  jsterm.execute("foo2 = 'newFoo'; window.foo2");
++  await onResultMessage;
++  ok(true, "'newFoo' is displayed after adding `foo2`");
+ 
+-  isnot(msg.textContent.indexOf("newFoo"), -1,
+-        "'newFoo' is displayed after adding |foo2|");
+-
+-  gJSTerm.clearOutput();
+-
+-  info("openDebugger");
+-  executeSoon(() => openDebugger().then(debuggerOpened));
+-}
++  info("Open the debugger and then select the console again");
++  const {panel} = await openDebugger();
++  const {activeThread, StackFrames: stackFrames} = panel.panelWin.DebuggerController;
+ 
+-function debuggerOpened(aResult) {
+-  gDebuggerWin = aResult.panelWin;
+-  gDebuggerController = gDebuggerWin.DebuggerController;
+-  gThread = gDebuggerController.activeThread;
+-  gStackframes = gDebuggerController.StackFrames;
++  await openConsole();
+ 
+-  info("openConsole");
+-  executeSoon(() =>
+-    openConsole().then(() =>
+-      gJSTerm.execute("foo + foo2").then(onExecuteFooAndFoo2)
+-    )
+-  );
+-}
++  info("Check `foo + foo2` value");
++  onResultMessage = waitForMessage(hud, "globalFooBug783499newFoo");
++  jsterm.execute("foo + foo2");
++  await onResultMessage;
+ 
+-function onExecuteFooAndFoo2() {
+-  let expected = "globalFooBug783499newFoo";
+-  isnot(gWebConsole.outputNode.textContent.indexOf(expected), -1,
+-        "|foo + foo2| is displayed after starting the debugger");
+-
+-  executeSoon(() => {
+-    gJSTerm.clearOutput();
++  info("Select the debugger again");
++  await openDebugger();
+ 
+-    info("openDebugger");
+-    openDebugger().then(() => {
+-      gThread.addOneTimeListener("framesadded", onFramesAdded);
+-
+-      info("firstCall()");
+-      ContentTask.spawn(gBrowser.selectedBrowser, {}, function* () {
+-        content.wrappedJSObject.firstCall();
+-      });
+-    });
++  const onFirstCallFramesAdded = activeThread.addOneTimeListener("framesadded");
++  // firstCall calls secondCall, which has a debugger statement, so we'll be paused.
++  ContentTask.spawn(gBrowser.selectedBrowser, {}, function () {
++    content.wrappedJSObject.firstCall();
+   });
+-}
++  await onFirstCallFramesAdded;
+ 
+-function onFramesAdded() {
+-  info("onFramesAdded, openConsole() now");
+-  executeSoon(() =>
+-    openConsole().then(() =>
+-      gJSTerm.execute("foo + foo2").then(onExecuteFooAndFoo2InSecondCall)
+-    )
+-  );
+-}
++  info("frames added, select the console again");
++  await openConsole();
+ 
+-function onExecuteFooAndFoo2InSecondCall() {
+-  let expected = "globalFooBug783499foo2SecondCall";
+-  isnot(gWebConsole.outputNode.textContent.indexOf(expected), -1,
+-        "|foo + foo2| from |secondCall()|");
+-
+-  function runOpenConsole() {
+-    openConsole().then(() => {
+-      gJSTerm.execute("foo + foo2 + foo3").then(onExecuteFoo23InFirstCall);
+-    });
+-  }
+-
+-  executeSoon(() => {
+-    gJSTerm.clearOutput();
+-
+-    info("openDebugger and selectFrame(1)");
++  info("Check `foo + foo2` value when paused");
++  onResultMessage = waitForMessage(hud, "globalFooBug783499foo2SecondCall");
++  jsterm.execute("foo + foo2");
++  ok(true, "`foo + foo2` from `secondCall()`");
+ 
+-    openDebugger().then(() => {
+-      gStackframes.selectFrame(1);
++  info("select the debugger and select the frame (1)");
++  await openDebugger();
++  stackFrames.selectFrame(1);
++  await openConsole();
+ 
+-      info("openConsole");
+-      executeSoon(() => runOpenConsole());
+-    });
+-  });
+-}
+-
+-function onExecuteFoo23InFirstCall() {
+-  let expected = "fooFirstCallnewFoofoo3FirstCall";
+-  isnot(gWebConsole.outputNode.textContent.indexOf(expected), -1,
+-        "|foo + foo2 + foo3| from |firstCall()|");
++  info("Check `foo + foo2 + foo3` value when paused on a given frame");
++  onResultMessage = waitForMessage(hud, "fooFirstCallnewFoofoo3FirstCall");
++  jsterm.execute("foo + foo2 + foo3");
++  await onResultMessage;
++  ok(true, "`foo + foo2 + foo3` from `firstCall()`");
+ 
+-  executeSoon(() =>
+-    gJSTerm.execute("foo = 'abba'; foo3 = 'bug783499'; foo + foo3").then(
+-                    onExecuteFooAndFoo3ChangesInFirstCall));
+-}
+-
+-var onExecuteFooAndFoo3ChangesInFirstCall = Task.async(function*() {
+-  let expected = "abbabug783499";
+-  isnot(gWebConsole.outputNode.textContent.indexOf(expected), -1,
+-        "|foo + foo3| updated in |firstCall()|");
++  onResultMessage = waitForMessage(hud, "abbabug783499");
++  jsterm.execute("foo = 'abba'; foo3 = 'bug783499'; foo + foo3");
++  await onResultMessage;
++  ok(true, "`foo + foo3` updated in `firstCall()`");
+ 
+-  yield ContentTask.spawn(gBrowser.selectedBrowser, null, function*() {
+-    is(content.wrappedJSObject.foo, "globalFooBug783499",
+-       "|foo| in content window");
+-    is(content.wrappedJSObject.foo2, "newFoo", "|foo2| in content window");
+-    ok(!content.wrappedJSObject.foo3,
+-       "|foo3| was not added to the content window");
++  await ContentTask.spawn(gBrowser.selectedBrowser, null, function() {
++    is(content.wrappedJSObject.foo, "globalFooBug783499", "`foo` in content window");
++    is(content.wrappedJSObject.foo2, "newFoo", "`foo2` in content window");
++    ok(!content.wrappedJSObject.foo3, "`foo3` was not added to the content window");
+   });
+-
+-  gWebConsole = gJSTerm = gDebuggerWin = gThread = gDebuggerController =
+-    gStackframes = null;
+-  executeSoon(finishTest);
+ });

+ 144 - 0
mozilla-release/patches/1408937-59a1.patch

@@ -0,0 +1,144 @@
+# HG changeset patch
+# User Julian Descottes <jdescottes@mozilla.com>
+# Date 1512147545 -3600
+# Node ID 45b3e00844a345e7c1e4a55a0dbbdeaff1614f67
+# Parent  2b72daf85214be51379102f8b2a5843703696ef5
+Bug 1408937 - enable browser_webconsole_external_script_errors.js;r=bgrins
+
+MozReview-Commit-ID: 4GcSKa2ph4j
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -43,18 +43,16 @@ support-files =
+   test-bug-595934-image.jpg
+   test-bug-595934-imagemap.html
+   test-bug-595934-malformedxml-external.html
+   test-bug-595934-malformedxml-external.xml
+   test-bug-595934-malformedxml.xhtml
+   test-bug-595934-svg.xhtml
+   test-bug-595934-workers.html
+   test-bug-595934-workers.js
+-  test-bug-597136-external-script-errors.html
+-  test-bug-597136-external-script-errors.js
+   test-bug-599725-response-headers.sjs
+   test-bug-601177-log-levels.html
+   test-bug-601177-log-levels.js
+   test-bug-603750-websocket.html
+   test-bug-603750-websocket.js
+   test-cd-iframe-child.html
+   test-cd-iframe-parent.html
+   test-console-api-iframe.html
+@@ -117,16 +115,18 @@ support-files =
+   test-cu-reporterror.js
+   test-data.json
+   test-data.json^headers^
+   test-duplicate-error.html
+   test-encoding-ISO-8859-1.html
+   test-error.html
+   test-eval-in-stackframe.html
+   test-exception-stackframe.html
++  test-external-script-errors.html
++  test-external-script-errors.js
+   test-file-location.js
+   test-filter.html
+   test-for-of.html
+   test-iframe-762593-insecure-form-action.html
+   test-iframe-762593-insecure-frame.html
+   test-iframe1.html
+   test-iframe2.html
+   test-iframe3.html
+@@ -276,17 +276,16 @@ skip-if = true #       Bug 1403907
+ [browser_webconsole_errors_after_page_reload.js]
+ skip-if = true # Bug 1408935
+ [browser_webconsole_eval_in_debugger_stackframe.js]
+ [browser_webconsole_eval_in_debugger_stackframe2.js]
+ skip-if = true # Bug 1408893
+ [browser_webconsole_execution_scope.js]
+ skip-if = true #       Bug 1405333
+ [browser_webconsole_external_script_errors.js]
+-skip-if = true # Bug 1408937
+ [browser_webconsole_file_uri.js]
+ skip-if = true #       Bug 1404382
+ [browser_webconsole_filter_scroll.js]
+ skip-if = true #       Bug 1404392
+ [browser_webconsole_filters.js]
+ [browser_webconsole_filters_persist.js]
+ [browser_webconsole_highlighter_console_helper.js]
+ skip-if = true #       Bug 1404853
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_external_script_errors.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_external_script_errors.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_external_script_errors.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_external_script_errors.js
+@@ -2,34 +2,26 @@
+ /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+ /* Any copyright is dedicated to the Public Domain.
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+ "use strict";
+ 
+ // See Bug 597136.
+ 
+-const TEST_URI = "http://example.com/browser/devtools/client/" +
+-                 "webconsole/test/test-bug-597136-external-script-" +
+-                 "errors.html";
+-
+-function test() {
+-  Task.spawn(function* () {
+-    const {tab} = yield loadTab(TEST_URI);
+-    const hud = yield openConsole(tab);
++const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
++                 "new-console-output/test/mochitest/test-external-script-errors.html";
+ 
+-    // On e10s, the exception is triggered in child process
+-    // and is ignored by test harness
+-    if (!Services.appinfo.browserTabsRemoteAutostart) {
+-      expectUncaughtException();
+-    }
+-    BrowserTestUtils.synthesizeMouseAtCenter("button", {}, gBrowser.selectedBrowser);
++add_task(async function () {
++  // On e10s, the exception is triggered in child process
++  // and is ignored by test harness
++  if (!Services.appinfo.browserTabsRemoteAutostart) {
++    expectUncaughtException();
++  }
+ 
+-    yield waitForMessages({
+-      webconsole: hud,
+-      messages: [{
+-        text: "bogus is not defined",
+-        category: CATEGORY_JS,
+-        severity: SEVERITY_ERROR,
+-      }],
+-    });
+-  }).then(finishTest);
+-}
++  let hud = await openNewTabAndConsole(TEST_URI);
++
++  let onMessage = waitForMessage(hud, "bogus is not defined");
++  BrowserTestUtils.synthesizeMouseAtCenter("button", {}, gBrowser.selectedBrowser);
++  await onMessage;
++
++  ok(true, "Received the expected message");
++});
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-597136-external-script-errors.html b/devtools/client/webconsole/new-console-output/test/mochitest/test-external-script-errors.html
+rename from devtools/client/webconsole/new-console-output/test/mochitest/test-bug-597136-external-script-errors.html
+rename to devtools/client/webconsole/new-console-output/test/mochitest/test-external-script-errors.html
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-597136-external-script-errors.html
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/test-external-script-errors.html
+@@ -14,12 +14,12 @@
+   -->
+     <title>Test for bug 597136: external script errors</title>
+   </head>
+   <body>
+     <h1>Test for bug 597136: external script errors</h1>
+     <p><button onclick="f()">Click me</button</p>
+ 
+     <script type="text/javascript"
+-      src="test-bug-597136-external-script-errors.js"></script>
++      src="test-external-script-errors.js"></script>
+   </body>
+ </html>
+ 
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-597136-external-script-errors.js b/devtools/client/webconsole/new-console-output/test/mochitest/test-external-script-errors.js
+rename from devtools/client/webconsole/new-console-output/test/mochitest/test-bug-597136-external-script-errors.js
+rename to devtools/client/webconsole/new-console-output/test/mochitest/test-external-script-errors.js

+ 136 - 0
mozilla-release/patches/1408938-59a1.patch

@@ -0,0 +1,136 @@
+# HG changeset patch
+# User Patrick Brosset <pbrosset@mozilla.com>
+# Date 1511541512 -3600
+# Node ID 067659e3751f412350c514256689bc2253d6d7da
+# Parent  738625dbd25168e6fe9281ef3ccbe4b739995e08
+Bug 1408938 - Enable and rename browser_webconsole_history.js; r=nchevobbe
+
+MozReview-Commit-ID: GU4Z3ghCTmv
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -207,16 +207,17 @@ skip-if = true #       Bug 1403188
+ [browser_jsterm_autocomplete_inside_text.js]
+ [browser_jsterm_autocomplete_nav_and_tab_key.js]
+ [browser_jsterm_autocomplete_return_key_no_selection.js]
+ [browser_jsterm_autocomplete_return_key.js]
+ [browser_jsterm_autocomplete-properties-with-non-alphanumeric-names.js]
+ [browser_jsterm_completion.js]
+ [browser_jsterm_copy_command.js]
+ [browser_jsterm_dollar.js]
++[browser_jsterm_history.js]
+ [browser_jsterm_history_persist.js]
+ [browser_jsterm_inspect.js]
+ [browser_jsterm_no_autocompletion_on_defined_variables.js]
+ [browser_jsterm_no_input_and_tab_key_pressed.js]
+ [browser_jsterm_no_input_change_and_tab_key_pressed.js]
+ [browser_jsterm_popup_close_on_tab_switch.js]
+ [browser_jsterm_popup.js]
+ [browser_jsterm_selfxss.js]
+@@ -286,18 +287,16 @@ skip-if = true # Bug 1408937
+ skip-if = true #       Bug 1404382
+ [browser_webconsole_filter_scroll.js]
+ skip-if = true #       Bug 1404392
+ [browser_webconsole_filters.js]
+ [browser_webconsole_filters_persist.js]
+ [browser_webconsole_highlighter_console_helper.js]
+ skip-if = true #       Bug 1404853
+ # old console skip-if = true # Requires direct access to content nodes
+-[browser_webconsole_history.js]
+-skip-if = true # Bug 1408938
+ [browser_webconsole_history_arrow_keys.js]
+ skip-if = true # Bug 1408939
+ [browser_webconsole_history_nav.js]
+ skip-if = true # Bug 1408940
+ [browser_webconsole_hpkp_invalid-headers.js]
+ [browser_webconsole_hsts_invalid-headers.js]
+ [browser_webconsole_iframe_wrong_hud.js]
+ skip-if = true #       Bug 1404378
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_history.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_history.js
+rename from devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_history.js
+rename to devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_history.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_history.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_history.js
+@@ -2,61 +2,55 @@
+ /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+ /* Any copyright is dedicated to the Public Domain.
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+ // Tests the console history feature accessed via the up and down arrow keys.
+ 
+ "use strict";
+ 
+-const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
+-                 "test/test-console.html";
+-
+-// Constants used for defining the direction of JSTerm input history navigation.
++const TEST_URI = "data:text/html;charset=UTF-8,test";
+ const HISTORY_BACK = -1;
+ const HISTORY_FORWARD = 1;
+-
+-add_task(function* () {
+-  yield loadTab(TEST_URI);
+-  let hud = yield openConsole();
+-  hud.jsterm.clearOutput();
++const COMMANDS = ["document", "window", "window.location"];
+ 
+-  let jsterm = hud.jsterm;
+-  let input = jsterm.inputNode;
++add_task(async function () {
++  const { jsterm } = await openNewTabAndConsole(TEST_URI);
++  const { inputNode } = jsterm;
++  jsterm.clearOutput();
+ 
+-  let executeList = ["document", "window", "window.location"];
+-
+-  for (let item of executeList) {
+-    input.value = item;
+-    yield jsterm.execute();
++  for (let command of COMMANDS) {
++    info(`Executing command ${command}`);
++    jsterm.setInputValue(command);
++    await jsterm.execute();
+   }
+ 
+-  for (let x = executeList.length - 1; x != -1; x--) {
++  for (let x = COMMANDS.length - 1; x != -1; x--) {
+     jsterm.historyPeruse(HISTORY_BACK);
+-    is(input.value, executeList[x], "check history previous idx:" + x);
++    is(inputNode.value, COMMANDS[x], "check history previous idx:" + x);
+   }
+ 
+   jsterm.historyPeruse(HISTORY_BACK);
+-  is(input.value, executeList[0], "test that item is still index 0");
++  is(inputNode.value, COMMANDS[0], "test that item is still index 0");
+ 
+   jsterm.historyPeruse(HISTORY_BACK);
+-  is(input.value, executeList[0], "test that item is still still index 0");
++  is(inputNode.value, COMMANDS[0], "test that item is still still index 0");
+ 
+-  for (let i = 1; i < executeList.length; i++) {
++  for (let i = 1; i < COMMANDS.length; i++) {
+     jsterm.historyPeruse(HISTORY_FORWARD);
+-    is(input.value, executeList[i], "check history next idx:" + i);
++    is(inputNode.value, COMMANDS[i], "check history next idx:" + i);
+   }
+ 
+   jsterm.historyPeruse(HISTORY_FORWARD);
+-  is(input.value, "", "check input is empty again");
++  is(inputNode.value, "", "check input is empty again");
+ 
+   // Simulate pressing Arrow_Down a few times and then if Arrow_Up shows
+   // the previous item from history again.
+   jsterm.historyPeruse(HISTORY_FORWARD);
+   jsterm.historyPeruse(HISTORY_FORWARD);
+   jsterm.historyPeruse(HISTORY_FORWARD);
+ 
+-  is(input.value, "", "check input is still empty");
++  is(inputNode.value, "", "check input is still empty");
+ 
+-  let idxLast = executeList.length - 1;
++  let idxLast = COMMANDS.length - 1;
+   jsterm.historyPeruse(HISTORY_BACK);
+-  is(input.value, executeList[idxLast], "check history next idx:" + idxLast);
++  is(inputNode.value, COMMANDS[idxLast], "check history next idx:" + idxLast);
+ });

+ 129 - 0
mozilla-release/patches/1408939-59a1.patch

@@ -0,0 +1,129 @@
+# HG changeset patch
+# User Julian Descottes <jdescottes@mozilla.com>
+# Date 1512146562 -3600
+# Node ID 002f87c4339207515da014fe01440da99d8f63cb
+# Parent  dad6f4e2509496abf42aa3a6358bea6f0a2fe526
+Bug 1408939 - enable browser_webconsole_history_arrow_keys.js;r=Honza
+
+MozReview-Commit-ID: KvBrFRMW0W1
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -286,17 +286,16 @@ skip-if = true #       Bug 1404382
+ [browser_webconsole_filter_scroll.js]
+ skip-if = true #       Bug 1404392
+ [browser_webconsole_filters.js]
+ [browser_webconsole_filters_persist.js]
+ [browser_webconsole_highlighter_console_helper.js]
+ skip-if = true #       Bug 1404853
+ # old console skip-if = true # Requires direct access to content nodes
+ [browser_webconsole_history_arrow_keys.js]
+-skip-if = true # Bug 1408939
+ [browser_webconsole_hpkp_invalid-headers.js]
+ [browser_webconsole_hsts_invalid-headers.js]
+ [browser_webconsole_iframe_wrong_hud.js]
+ skip-if = true #       Bug 1404378
+ [browser_webconsole_ineffective_iframe_sandbox_warning.js]
+ skip-if = true #       Bug 1404883
+ # old console skip-if = (os == 'win' && bits == 64) # Bug 1390001
+ [browser_webconsole_init.js]
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_history_arrow_keys.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_history_arrow_keys.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_history_arrow_keys.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_history_arrow_keys.js
+@@ -2,54 +2,49 @@
+ /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+ /* Any copyright is dedicated to the Public Domain.
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+ "use strict";
+ 
+ // See Bugs 594497 and 619598.
+ 
+-var jsterm, inputNode, values;
+-
+-var TEST_URI = "data:text/html;charset=utf-8,Web Console test for " +
++const TEST_URI = "data:text/html;charset=utf-8,Web Console test for " +
+                "bug 594497 and bug 619598";
+ 
+-add_task(function* () {
+-  yield loadTab(TEST_URI);
+-
+-  let hud = yield openConsole();
++const TEST_VALUES = [
++  "document",
++  "window",
++  "document.body",
++  "document;\nwindow;\ndocument.body",
++  "document.location",
++];
+ 
+-  setup(hud);
+-  performTests();
++add_task(async function () {
++  let hud = await openNewTabAndConsole(TEST_URI);
++  let { jsterm } = hud;
++
++  jsterm.focus();
++  ok(!jsterm.getInputValue(), "jsterm.getInputValue() is empty");
+ 
+-  jsterm = inputNode = values = null;
++  info("Execute each test value in the console");
++  for (let value of TEST_VALUES) {
++    jsterm.setInputValue(value);
++    jsterm.execute();
++  }
++
++  performTests(jsterm);
+ });
+ 
+-function setup(HUD) {
+-  jsterm = HUD.jsterm;
+-  inputNode = jsterm.inputNode;
+-
+-  jsterm.focus();
+-
+-  ok(!jsterm.getInputValue(), "jsterm.getInputValue() is empty");
+-
+-  values = ["document", "window", "document.body"];
+-  values.push(values.join(";\n"), "document.location");
++function performTests(jsterm) {
++  let { inputNode } = jsterm;
++  let values = TEST_VALUES;
+ 
+-  // Execute each of the values;
+-  for (let i = 0; i < values.length; i++) {
+-    jsterm.setInputValue(values[i]);
+-    jsterm.execute();
+-  }
+-}
+-
+-function performTests() {
+   EventUtils.synthesizeKey("VK_UP", {});
+ 
+-
+   is(jsterm.getInputValue(), values[4],
+      "VK_UP: jsterm.getInputValue() #4 is correct");
+ 
+   ok(inputNode.selectionStart == values[4].length &&
+      inputNode.selectionStart == inputNode.selectionEnd,
+      "caret location is correct");
+ 
+   EventUtils.synthesizeKey("VK_UP", {});
+@@ -143,15 +138,15 @@ function performTests() {
+ 
+   ok(inputNode.selectionStart == values[3].length &&
+      inputNode.selectionStart == inputNode.selectionEnd,
+      "caret location is correct");
+ 
+   EventUtils.synthesizeKey("VK_DOWN", {});
+ 
+   is(jsterm.getInputValue(), values[4],
+-     "VK_DOWN: jsterm.getInputValue() #4 is correct");
++    "VK_DOWN: jsterm.getInputValue() #4 is correct");
+ 
+   EventUtils.synthesizeKey("VK_DOWN", {});
+ 
+   ok(!jsterm.getInputValue(),
+      "VK_DOWN: jsterm.getInputValue() is empty");
+ }

+ 125 - 0
mozilla-release/patches/1408940-59a1.patch

@@ -0,0 +1,125 @@
+# HG changeset patch
+# User Julian Descottes <jdescottes@mozilla.com>
+# Date 1512145181 -3600
+# Node ID 581fec9ba4f2d02f9ec416c1c2c3eaa3b748e003
+# Parent  cbe5934f7235292af1f4d4792caf2b28999b9824
+Bug 1408940 - enable browser_webconsole_history_nav.js;r=nchevobbe
+
+MozReview-Commit-ID: LCLeM9cj7TX
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -210,16 +210,17 @@ skip-if = true #       Bug 1403188
+ [browser_jsterm_autocomplete_return_key_no_selection.js]
+ [browser_jsterm_autocomplete_return_key.js]
+ [browser_jsterm_autocomplete-properties-with-non-alphanumeric-names.js]
+ [browser_jsterm_completion.js]
+ [browser_jsterm_copy_command.js]
+ [browser_jsterm_dollar.js]
+ [browser_jsterm_history.js]
+ [browser_jsterm_history_persist.js]
++[browser_jsterm_history_nav.js]
+ [browser_jsterm_inspect.js]
+ [browser_jsterm_multiline.js]
+ [browser_jsterm_no_autocompletion_on_defined_variables.js]
+ [browser_jsterm_no_input_and_tab_key_pressed.js]
+ [browser_jsterm_no_input_change_and_tab_key_pressed.js]
+ [browser_jsterm_popup_close_on_tab_switch.js]
+ [browser_jsterm_popup.js]
+ [browser_jsterm_selfxss.js]
+@@ -286,18 +287,16 @@ skip-if = true #       Bug 1404382
+ skip-if = true #       Bug 1404392
+ [browser_webconsole_filters.js]
+ [browser_webconsole_filters_persist.js]
+ [browser_webconsole_highlighter_console_helper.js]
+ skip-if = true #       Bug 1404853
+ # old console skip-if = true # Requires direct access to content nodes
+ [browser_webconsole_history_arrow_keys.js]
+ skip-if = true # Bug 1408939
+-[browser_webconsole_history_nav.js]
+-skip-if = true # Bug 1408940
+ [browser_webconsole_hpkp_invalid-headers.js]
+ [browser_webconsole_hsts_invalid-headers.js]
+ [browser_webconsole_iframe_wrong_hud.js]
+ skip-if = true #       Bug 1404378
+ [browser_webconsole_ineffective_iframe_sandbox_warning.js]
+ skip-if = true #       Bug 1404883
+ # old console skip-if = (os == 'win' && bits == 64) # Bug 1390001
+ [browser_webconsole_init.js]
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_history_nav.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_history_nav.js
+rename from devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_history_nav.js
+rename to devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_history_nav.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_history_nav.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_history_nav.js
+@@ -1,33 +1,26 @@
+ /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+ /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+ /* Any copyright is dedicated to the Public Domain.
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+ "use strict";
+ 
+-// See Bug 660806.
++// See Bug 660806. Check that history navigation with the UP/DOWN arrows does not trigger
++// autocompletion.
+ 
+ const TEST_URI = "data:text/html;charset=utf-8,<p>bug 660806 - history " +
+                  "navigation must not show the autocomplete popup";
+ 
+-add_task(function* () {
+-  yield loadTab(TEST_URI);
+-
+-  let hud = yield openConsole();
++add_task(async function () {
++  let { jsterm } = await openNewTabAndConsole(TEST_URI);
++  let popup = jsterm.autocompletePopup;
+ 
+-  yield consoleOpened(hud);
+-});
+-
+-function consoleOpened(HUD) {
+-  let deferred = defer();
+-
+-  let jsterm = HUD.jsterm;
+-  let popup = jsterm.autocompletePopup;
++  // The autocomplete popup should never be displayed during the test.
+   let onShown = function () {
+     ok(false, "popup shown");
+   };
+ 
+   jsterm.execute(`window.foobarBug660806 = {
+     'location': 'value0',
+     'locationbar': 'value1'
+   }`);
+@@ -37,20 +30,23 @@ function consoleOpened(HUD) {
+   ok(!popup.isOpen, "popup is not open");
+ 
+   ok(!jsterm.lastInputValue, "no lastInputValue");
+   jsterm.setInputValue("window.foobarBug660806.location");
+   is(jsterm.lastInputValue, "window.foobarBug660806.location",
+      "lastInputValue is correct");
+ 
+   EventUtils.synthesizeKey("VK_RETURN", {});
++
++  let onSetInputValue = jsterm.once("set-input-value");
+   EventUtils.synthesizeKey("VK_UP", {});
++  await onSetInputValue;
++
++  // We don't have an explicit event to wait for here, so we just wait for the next tick
++  // before checking the popup status.
++  await new Promise(executeSoon);
+ 
+   is(jsterm.lastInputValue, "window.foobarBug660806.location",
+      "lastInputValue is correct, again");
+ 
+-  executeSoon(function () {
+-    ok(!popup.isOpen, "popup is not open");
+-    popup.off("popup-opened", onShown);
+-    executeSoon(deferred.resolve);
+-  });
+-  return deferred.promise;
+-}
++  ok(!popup.isOpen, "popup is not open");
++  popup.off("popup-opened", onShown);
++});

+ 124 - 0
mozilla-release/patches/1408941-59a1.patch

@@ -0,0 +1,124 @@
+# HG changeset patch
+# User Julian Descottes <jdescottes@mozilla.com>
+# Date 1511905335 -3600
+# Node ID d7a40b75ddf0953812c4a386cb1d04a8bf0ac043
+# Parent  a0c3597fe22505061aa51c4544340381c173f7c1
+Bug 1408941 - Enable browser_webconsole_multiline_input.js;r=nchevobbe
+
+MozReview-Commit-ID: 5lzN37yWeOc
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -210,16 +210,17 @@ skip-if = true #       Bug 1403188
+ [browser_jsterm_autocomplete_return_key.js]
+ [browser_jsterm_autocomplete-properties-with-non-alphanumeric-names.js]
+ [browser_jsterm_completion.js]
+ [browser_jsterm_copy_command.js]
+ [browser_jsterm_dollar.js]
+ [browser_jsterm_history.js]
+ [browser_jsterm_history_persist.js]
+ [browser_jsterm_inspect.js]
++[browser_jsterm_multiline.js]
+ [browser_jsterm_no_autocompletion_on_defined_variables.js]
+ [browser_jsterm_no_input_and_tab_key_pressed.js]
+ [browser_jsterm_no_input_change_and_tab_key_pressed.js]
+ [browser_jsterm_popup_close_on_tab_switch.js]
+ [browser_jsterm_popup.js]
+ [browser_jsterm_selfxss.js]
+ subsuite = clipboard
+ [browser_netmonitor_shows_reqs_in_webconsole.js]
+@@ -337,18 +338,16 @@ skip-if = true #       Bug 1403448
+ [browser_webconsole_longstring_hang.js]
+ skip-if = true #       Bug 1403448
+ [browser_webconsole_message_categories.js]
+ skip-if = true #       Bug 1404384
+ # old console skip-if = e10s # Bug 1042253 - webconsole tests disabled with e10s
+ [browser_webconsole_mixedcontent.js]
+ tags = mcb
+ skip-if = true #       Bug 1404886
+-[browser_webconsole_multiline_input.js]
+-skip-if = true # Bug 1408941
+ [browser_webconsole_multiple_windows_and_tabs.js]
+ skip-if = true # Bug 1408942
+ [browser_webconsole_netlogging_reset_filter.js]
+ skip-if = true #       Bug 1405636
+ [browser_webconsole_network_attach.js]
+ [browser_webconsole_network_exceptions.js]
+ [browser_webconsole_network_messages_expand.js]
+ [browser_webconsole_network_messages_openinnet.js]
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_multiline_input.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_multiline.js
+rename from devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_multiline_input.js
+rename to devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_multiline.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_multiline_input.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_multiline.js
+@@ -5,17 +5,17 @@
+ 
+ // Tests that the console waits for more input instead of evaluating
+ // when valid, but incomplete, statements are present upon pressing enter
+ // -or- when the user ends a line with shift + enter.
+ 
+ "use strict";
+ 
+ const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
+-                 "test/test-console.html";
++                 "new-console-output/test/mochitest/test-console.html";
+ 
+ let SHOULD_ENTER_MULTILINE = [
+   {input: "function foo() {" },
+   {input: "var a = 1," },
+   {input: "var a = 1;", shiftKey: true },
+   {input: "function foo() { }", shiftKey: true },
+   {input: "function" },
+   {input: "(x) =>" },
+@@ -36,35 +36,34 @@ let SHOULD_EXECUTE = [
+   {input: "99 + 3" },
+   {input: "1, 2, 3" },
+   // errors
+   {input: "function f(x) { let y = 1, }" },
+   {input: "function f(x=,) {" },
+   {input: "{2,}" },
+ ];
+ 
+-add_task(function* () {
+-  let { tab, browser } = yield loadTab(TEST_URI);
+-  let hud = yield openConsole();
+-  let inputNode = hud.jsterm.inputNode;
++add_task(async function () {
++  let hud = await openNewTabAndConsole(TEST_URI);
++  let { inputNode } = hud.jsterm;
+ 
+-  for (let test of SHOULD_ENTER_MULTILINE) {
+-    hud.jsterm.setInputValue(test.input);
+-    EventUtils.synthesizeKey("VK_RETURN", { shiftKey: test.shiftKey });
++  for (let {input, shiftKey} of SHOULD_ENTER_MULTILINE) {
++    hud.jsterm.setInputValue(input);
++    EventUtils.synthesizeKey("VK_RETURN", { shiftKey });
++
+     let inputValue = hud.jsterm.getInputValue();
+-    is(inputNode.selectionStart, inputNode.selectionEnd,
+-       "selection is collapsed");
+-    is(inputNode.selectionStart, inputValue.length,
+-       "caret at end of multiline input");
+-    let inputWithNewline = test.input + "\n";
++    is(inputNode.selectionStart, inputNode.selectionEnd, "selection is collapsed");
++    is(inputNode.selectionStart, inputValue.length, "caret at end of multiline input");
++
++    let inputWithNewline = input + "\n";
+     is(inputValue, inputWithNewline, "Input value is correct");
+   }
+ 
+-  for (let test of SHOULD_EXECUTE) {
+-    hud.jsterm.setInputValue(test.input);
+-    EventUtils.synthesizeKey("VK_RETURN", { shiftKey: test.shiftKey });
++  for (let {input, shiftKey} of SHOULD_EXECUTE) {
++    hud.jsterm.setInputValue(input);
++    EventUtils.synthesizeKey("VK_RETURN", { shiftKey });
++
+     let inputValue = hud.jsterm.getInputValue();
+     is(inputNode.selectionStart, 0, "selection starts/ends at 0");
+     is(inputNode.selectionEnd, 0, "selection starts/ends at 0");
+     is(inputValue, "", "Input value is cleared");
+   }
+-
+ });

+ 188 - 0
mozilla-release/patches/1408942-59a1.patch

@@ -0,0 +1,188 @@
+# HG changeset patch
+# User Julian Descottes <jdescottes@mozilla.com>
+# Date 1511904857 -3600
+# Node ID e5e690295e32c7704e1cc1494dbb28a7319be4a3
+# Parent  6a661e6c7dcc7cb4925dfaa110439372d377a3a7
+Bug 1408942 - Enable browser_webconsole_multiple_windows_and_tabs.js;r=Honza
+
+MozReview-Commit-ID: 5AqqgKLvN7
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -338,17 +338,16 @@ skip-if = true #       Bug 1403448
+ skip-if = true #       Bug 1403448
+ [browser_webconsole_message_categories.js]
+ skip-if = true #       Bug 1404384
+ # old console skip-if = e10s # Bug 1042253 - webconsole tests disabled with e10s
+ [browser_webconsole_mixedcontent.js]
+ tags = mcb
+ skip-if = true #       Bug 1404886
+ [browser_webconsole_multiple_windows_and_tabs.js]
+-skip-if = true # Bug 1408942
+ [browser_webconsole_netlogging_reset_filter.js]
+ skip-if = true #       Bug 1405636
+ [browser_webconsole_network_attach.js]
+ [browser_webconsole_network_exceptions.js]
+ [browser_webconsole_network_messages_expand.js]
+ [browser_webconsole_network_messages_openinnet.js]
+ [browser_webconsole_network_messages_status_code.js]
+ [browser_webconsole_network_requests_from_chrome.js]
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_multiple_windows_and_tabs.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_multiple_windows_and_tabs.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_multiple_windows_and_tabs.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_multiple_windows_and_tabs.js
+@@ -5,96 +5,82 @@
+ 
+ // Tests that the Web Console doesn't leak when multiple tabs and windows are
+ // opened and then closed. See Bug 595350.
+ 
+ "use strict";
+ 
+ const TEST_URI = "data:text/html;charset=utf-8,Web Console test for bug 595350";
+ 
+-var win1 = window, win2;
+-var openTabs = [];
+-var loadedTabCount = 0;
+-
+-function test() {
++add_task(async function () {
+   requestLongerTimeout(3);
+ 
+-  // Add two tabs in the main window.
+-  addTabs(win1);
+-
+-  // Open a new window.
+-  win2 = OpenBrowserWindow();
+-  win2.addEventListener("load", onWindowLoad, true);
+-}
+-
+-function onWindowLoad(aEvent) {
+-  win2.removeEventListener(aEvent.type, onWindowLoad, true);
++  const win1 = window;
+ 
+-  // Add two tabs in the new window.
+-  addTabs(win2);
+-}
++  info("Add test tabs in first window");
++  let tab1 = await addTab(TEST_URI, {window: win1});
++  let tab2 = await addTab(TEST_URI, {window: win1});
++  info("Test tabs added in first window");
+ 
+-function addTabs(aWindow) {
+-  for (let i = 0; i < 2; i++) {
+-    let tab = aWindow.gBrowser.addTab(TEST_URI);
+-    openTabs.push(tab);
+-
+-    tab.linkedBrowser.addEventListener("load", function onLoad(aEvent) {
+-      tab.linkedBrowser.removeEventListener(aEvent.type, onLoad, true);
++  info("Open a second window");
++  const win2 = OpenBrowserWindow();
++  await new Promise(r => {
++    win2.addEventListener("load", r, {capture: true, once: true});
++  });
+ 
+-      loadedTabCount++;
+-      info("tabs loaded: " + loadedTabCount);
+-      if (loadedTabCount >= 4) {
+-        executeSoon(openConsoles);
+-      }
+-    }, true);
+-  }
+-}
++  info("Add test tabs in second window");
++  let tab3 = await addTab(TEST_URI, {window: win2});
++  let tab4 = await addTab(TEST_URI, {window: win2});
+ 
+-function openConsoles() {
+-  function open(i) {
+-    let tab = openTabs[i];
+-    openConsole(tab).then(function (hud) {
+-      ok(hud, "HUD is open for tab " + i);
+-      let window = hud.target.tab.linkedBrowser.contentWindow;
+-      window.console.log("message for tab " + i);
++  info("Opening console in each test tab");
++  let tabs = [tab1, tab2, tab3, tab4];
++  for (let tab of tabs) {
++    // Open the console in tab${i}.
++    let hud = await openConsole(tab);
++    let tabWindow = hud.target.tab.linkedBrowser.contentWindow;
++    let message = "message for tab " + tabs.indexOf(tab);
+ 
+-      if (i >= openTabs.length - 1) {
+-        // Use executeSoon() to allow the promise to resolve.
+-        executeSoon(closeConsoles);
+-      }
+-      else {
+-        executeSoon(() => open(i + 1));
+-      }
+-    });
++    // Log a message in the newly opened console.
++    let onMessage = waitForMessage(hud, message);
++    tabWindow.console.log(message);
++    await onMessage;
+   }
+ 
+-  // open the Web Console for each of the four tabs and log a message.
+-  open(0);
+-}
++  let onConsolesDestroyed = waitForNEvents("web-console-destroyed", 4);
++
++  info("Close the second window");
++  win2.close();
+ 
+-function closeConsoles() {
+-  let consolesClosed = 0;
++  info("Close the test tabs in the first window");
++  win1.gBrowser.removeTab(tab1);
++  win1.gBrowser.removeTab(tab2);
++
++  info("Wait for 4 web-console-destroyed events");
++  await onConsolesDestroyed;
++
++  ok(true, "Received web-console-destroyed for each console opened");
++});
+ 
+-  function onWebConsoleClose(aSubject, aTopic) {
+-    if (aTopic == "web-console-destroyed") {
+-      consolesClosed++;
+-      info("consoles destroyed: " + consolesClosed);
+-      if (consolesClosed == 4) {
+-        // Use executeSoon() to allow all the observers to execute.
+-        executeSoon(finishTest);
++/**
++ * Wait for N events helper customized to work with Services.obs.add/removeObserver.
++ */
++function waitForNEvents(expectedTopic, times) {
++  return new Promise(resolve => {
++    let count = 0;
++
++    function onEvent(subject, topic) {
++      if (topic !== expectedTopic) {
++        return;
++      }
++
++      count++;
++      info(`Received ${expectedTopic} ${count} time(s).`);
++      if (count == times) {
++        resolve();
+       }
+     }
+-  }
+ 
+-  Services.obs.addObserver(onWebConsoleClose, "web-console-destroyed");
+-
+-  registerCleanupFunction(() => {
+-    Services.obs.removeObserver(onWebConsoleClose, "web-console-destroyed");
++    registerCleanupFunction(() => {
++      Services.obs.removeObserver(onEvent, expectedTopic);
++    });
++    Services.obs.addObserver(onEvent, expectedTopic);
+   });
+-
+-  win2.close();
+-
+-  win1.gBrowser.removeTab(openTabs[0]);
+-  win1.gBrowser.removeTab(openTabs[1]);
+-
+-  openTabs = win1 = win2 = null;
+ }

+ 113 - 0
mozilla-release/patches/1408943-59a1.patch

@@ -0,0 +1,113 @@
+# HG changeset patch
+# User Julian Descottes <jdescottes@mozilla.com>
+# Date 1511457619 -3600
+# Node ID b032f58dc991b0bdb5da27ef3a8fcb6afe256b50
+# Parent  2bda258bcf7426538ecb5878c54768ebf7cfabc9
+Bug 1408943 - enable browser_webconsole_network_exceptions.js;r=nchevobbe
+
+MozReview-Commit-ID: 7Jb2y9AQ4fa
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -56,17 +56,16 @@ support-files =
+   test-bug-599725-response-headers.sjs
+   test-bug-601177-log-levels.html
+   test-bug-601177-log-levels.js
+   test-bug-603750-websocket.html
+   test-bug-603750-websocket.js
+   test-cd-iframe-child.html
+   test-cd-iframe-parent.html
+   test-console-api-iframe.html
+-  test-bug-618078-network-exceptions.html
+   test-bug-630733-response-redirect-headers.sjs
+   test-bug-632275-getters.html
+   test-bug-632347-iterators-generators.html
+   test-bug-644419-log-limits.html
+   test-bug-646025-console-file-location.html
+   test-bug-658368-time-methods.html
+   test-bug-737873-mixedcontent.html
+   test-bug-752559-ineffective-iframe-sandbox-warning-inner.html
+@@ -141,16 +140,17 @@ support-files =
+   test-location-debugger-link-console-log.js
+   test-location-debugger-link-errors.js
+   test-location-debugger-link.html
+   test-location-styleeditor-link-1.css
+   test-location-styleeditor-link-2.css
+   test-location-styleeditor-link.html
+   test-mixedcontent-securityerrors.html
+   test-mutation.html
++  test-network-exceptions.html
+   test-network-request.html
+   test-network.html
+   test-observe-http-ajax.html
+   test-own-console.html
+   test-property-provider.html
+   test-reopen-closed-tab.html
+   test-repeated-messages.html
+   test-result-format-as-string.html
+@@ -345,17 +345,16 @@ skip-if = true #       Bug 1404886
+ [browser_webconsole_multiline_input.js]
+ skip-if = true # Bug 1408941
+ [browser_webconsole_multiple_windows_and_tabs.js]
+ skip-if = true # Bug 1408942
+ [browser_webconsole_netlogging_reset_filter.js]
+ skip-if = true #       Bug 1405636
+ [browser_webconsole_network_attach.js]
+ [browser_webconsole_network_exceptions.js]
+-skip-if = true # Bug 1408943
+ [browser_webconsole_network_messages_expand.js]
+ [browser_webconsole_network_messages_openinnet.js]
+ [browser_webconsole_network_messages_status_code.js]
+ [browser_webconsole_network_requests_from_chrome.js]
+ [browser_webconsole_nodes_highlight.js]
+ [browser_webconsole_nodes_select.js]
+ [browser_webconsole_notifications.js]
+ skip-if = true #       Bug 1405637
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_network_exceptions.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_network_exceptions.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_network_exceptions.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_network_exceptions.js
+@@ -5,32 +5,25 @@
+ 
+ // Tests that we report JS exceptions in event handlers coming from
+ // network requests, like onreadystate for XHR. See bug 618078.
+ 
+ "use strict";
+ 
+ const TEST_URI = "data:text/html;charset=utf-8,Web Console test for bug 618078";
+ const TEST_URI2 = "http://example.com/browser/devtools/client/webconsole/" +
+-                  "test/test-bug-618078-network-exceptions.html";
++                  "new-console-output/test/mochitest/test-network-exceptions.html";
+ 
+-add_task(function* () {
+-  yield loadTab(TEST_URI);
+-
+-  let hud = yield openConsole();
++add_task(async function () {
++  let hud = await openNewTabAndConsole(TEST_URI);
+ 
+   // On e10s, the exception is triggered in child process
+   // and is ignored by test harness
+   if (!Services.appinfo.browserTabsRemoteAutostart) {
+     expectUncaughtException();
+   }
+ 
+-  BrowserTestUtils.loadURI(gBrowser.selectedBrowser, TEST_URI2);
+-
+-  yield waitForMessages({
+-    webconsole: hud,
+-    messages: [{
+-      text: "bug618078exception",
+-      category: CATEGORY_JS,
+-      severity: SEVERITY_ERROR,
+-    }],
+-  });
++  let onMessage = waitForMessage(hud, "bug618078exception");
++  await loadDocument(TEST_URI2);
++  let { node } = await onMessage;
++  ok(true, "Network exception logged as expected.");
++  ok(node.classList.contains("error"), "Network exception is logged as error.");
+ });
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/test-bug-618078-network-exceptions.html b/devtools/client/webconsole/new-console-output/test/mochitest/test-network-exceptions.html
+rename from devtools/client/webconsole/new-console-output/test/mochitest/test-bug-618078-network-exceptions.html
+rename to devtools/client/webconsole/new-console-output/test/mochitest/test-network-exceptions.html

+ 108 - 0
mozilla-release/patches/1408944-59a1.patch

@@ -0,0 +1,108 @@
+# HG changeset patch
+# User Patrick Brosset <pbrosset@mozilla.com>
+# Date 1511363763 -3600
+# Node ID 01298c757565d7277b81c396e873d7f8fb07cc42
+# Parent  ef59e3d5d0fd9da6b97019bc18e2ee87474747e9
+Bug 1408944 - Rewrite and enable browser_webconsole_network_requests_from_chrome.js; r=nchevobbe
+
+MozReview-Commit-ID: EPzTQhqhVFE
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -353,17 +353,16 @@ skip-if = true # Bug 1408942
+ skip-if = true #       Bug 1405636
+ [browser_webconsole_network_attach.js]
+ [browser_webconsole_network_exceptions.js]
+ skip-if = true # Bug 1408943
+ [browser_webconsole_network_messages_expand.js]
+ [browser_webconsole_network_messages_openinnet.js]
+ [browser_webconsole_network_messages_status_code.js]
+ [browser_webconsole_network_requests_from_chrome.js]
+-skip-if = true # Bug 1408944
+ [browser_webconsole_nodes_highlight.js]
+ [browser_webconsole_nodes_select.js]
+ [browser_webconsole_notifications.js]
+ skip-if = true #       Bug 1405637
+ [browser_webconsole_object_in_sidebar.js]
+ [browser_webconsole_object_inspector.js]
+ [browser_webconsole_object_inspector_entries.js]
+ [browser_webconsole_observer_notifications.js]
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_network_requests_from_chrome.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_network_requests_from_chrome.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_network_requests_from_chrome.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_network_requests_from_chrome.js
+@@ -5,48 +5,45 @@
+ 
+ // Tests that network requests from chrome don't cause the Web Console to
+ // throw exceptions. See Bug 597136.
+ 
+ "use strict";
+ 
+ const TEST_URI = "http://example.com/";
+ 
+-var good = true;
+-var listener = {
+-  QueryInterface: XPCOMUtils.generateQI([ Ci.nsIObserver ]),
+-  observe: function (subject) {
+-    if (subject instanceof Ci.nsIScriptError &&
+-        subject.category === "XPConnect JavaScript" &&
+-        subject.sourceName.includes("webconsole")) {
+-      good = false;
++add_task(async function () {
++  // Start a listener on the console service.
++  let good = true;
++  const listener = {
++    QueryInterface: XPCOMUtils.generateQI([ Ci.nsIObserver ]),
++    observe: function (subject) {
++      if (subject instanceof Ci.nsIScriptError &&
++          subject.category === "XPConnect JavaScript" &&
++          subject.sourceName.includes("webconsole")) {
++        good = false;
++      }
+     }
+-  }
+-};
+-
+-var xhr;
+-
+-function test() {
++  };
+   Services.console.registerListener(listener);
+ 
+   // trigger a lazy-load of the HUD Service
+   HUDService;
+ 
+-  xhr = new XMLHttpRequest();
+-  xhr.addEventListener("load", xhrComplete);
+-  xhr.open("GET", TEST_URI, true);
+-  xhr.send(null);
+-}
++  await sendRequestFromChrome();
+ 
+-function xhrComplete() {
+-  xhr.removeEventListener("load", xhrComplete);
+-  window.setTimeout(checkForException, 0);
+-}
+-
+-function checkForException() {
+-  ok(good, "no exception was thrown when sending a network request from a " +
+-     "chrome window");
++  ok(good, "No exception was thrown when sending a network request from a chrome window");
+ 
+   Services.console.unregisterListener(listener);
+-  listener = xhr = null;
++});
++
++function sendRequestFromChrome() {
++  return new Promise(resolve => {
++    const xhr = new XMLHttpRequest();
+ 
+-  finishTest();
++    xhr.addEventListener("load", () => {
++      window.setTimeout(resolve, 0);
++    }, { once: true });
++
++    xhr.open("GET", TEST_URI, true);
++    xhr.send(null);
++  });
+ }

+ 166 - 0
mozilla-release/patches/1408945-59a1.patch

@@ -0,0 +1,166 @@
+# HG changeset patch
+# User Julian Descottes <jdescottes@mozilla.com>
+# Date 1511455061 -3600
+# Node ID 7ef48daab640e292d0bb3b98eed36175335778a2
+# Parent  392676858ac5749784cd69f976ed8a0dacd57ba6
+Bug 1408945 - enable browser_webconsole_optimized_out_vars.js;r=nchevobbe
+
+MozReview-Commit-ID: CNPdSwF6kbc
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -359,17 +359,16 @@ skip-if = true # Bug 1408943
+ [browser_webconsole_nodes_select.js]
+ [browser_webconsole_notifications.js]
+ skip-if = true #       Bug 1405637
+ [browser_webconsole_object_in_sidebar.js]
+ [browser_webconsole_object_inspector.js]
+ [browser_webconsole_object_inspector_entries.js]
+ [browser_webconsole_observer_notifications.js]
+ [browser_webconsole_optimized_out_vars.js]
+-skip-if = true # Bug 1408945
+ [browser_webconsole_output_copy.js]
+ subsuite = clipboard
+ skip-if = true #       Bug 1404364
+ # old console skip-if = (os == 'linux' && bits == 32 && debug) # bug 1328915, disable linux32 debug devtools for timeouts
+ [browser_webconsole_output_copy_newlines.js]
+ subsuite = clipboard
+ skip-if = true #       Bug 1405641
+ # old console skip-if = (os == 'linux' && bits == 32 && debug) # bug 1328915, disable linux32 debug devtools for timeouts
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_optimized_out_vars.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_optimized_out_vars.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_optimized_out_vars.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_optimized_out_vars.js
+@@ -3,89 +3,56 @@
+ /* Any copyright is dedicated to the Public Domain.
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+ // Check that inspecting an optimized out variable works when execution is
+ // paused.
+ 
+ "use strict";
+ 
+-// Force the old debugger UI since it's directly used (see Bug 1301705)
+-Services.prefs.setBoolPref("devtools.debugger.new-debugger-frontend", false);
+-registerCleanupFunction(function* () {
+-  Services.prefs.clearUserPref("devtools.debugger.new-debugger-frontend");
++const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
++                 "new-console-output/test/mochitest/test-closure-optimized-out.html";
++
++add_task(async function () {
++  // Force the old debugger UI since it's directly used (see Bug 1301705)
++  await pushPref("devtools.debugger.new-debugger-frontend", false);
++
++  let hud = await openNewTabAndConsole(TEST_URI);
++  let { toolbox, panel: debuggerPanel } = await openDebugger();
++
++  let sources = debuggerPanel.panelWin.DebuggerView.Sources;
++  await debuggerPanel.addBreakpoint({ actor: sources.values[0], line: 18 });
++  await ensureThreadClientState(debuggerPanel, "resumed");
++
++  let { FETCHED_SCOPES } = debuggerPanel.panelWin.EVENTS;
++  let fetchedScopes = debuggerPanel.panelWin.once(FETCHED_SCOPES);
++
++  // Cause the debuggee to pause
++  ContentTask.spawn(gBrowser.selectedBrowser, {}, function* () {
++    let button = content.document.querySelector("button");
++    button.click();
++  });
++
++  await fetchedScopes;
++  ok(true, "Scopes were fetched");
++
++  await toolbox.selectTool("webconsole");
++
++  // This is the meat of the test: evaluate the optimized out variable.
++  let onMessage = waitForMessage(hud, "optimized out");
++  hud.jsterm.execute("upvar");
++
++  info("Waiting for optimized out message");
++  await onMessage;
++
++  ok(true, "Optimized out message logged");
+ });
+ 
+-function test() {
+-  Task.spawn(function* () {
+-    const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
+-                     "test/test-closure-optimized-out.html";
+-    let {tab} = yield loadTab(TEST_URI);
+-    let hud = yield openConsole(tab);
+-    let { toolbox, panel, panelWin } = yield openDebugger();
+-
+-    let sources = panelWin.DebuggerView.Sources;
+-    yield panel.addBreakpoint({ actor: sources.values[0], line: 18 });
+-    yield ensureThreadClientState(panel, "resumed");
+-
+-    let fetchedScopes = panelWin.once(panelWin.EVENTS.FETCHED_SCOPES);
+-
+-    // Cause the debuggee to pause
+-    ContentTask.spawn(gBrowser.selectedBrowser, {}, function* () {
+-      let button = content.document.querySelector("button");
+-      button.click();
+-    });
+-
+-    yield fetchedScopes;
+-    ok(true, "Scopes were fetched");
+-
+-    yield toolbox.selectTool("webconsole");
+-
+-    // This is the meat of the test: evaluate the optimized out variable.
+-    hud.jsterm.execute("upvar");
+-    yield waitForMessages({
+-      webconsole: hud,
+-      messages: [{
+-        text: "optimized out",
+-        category: CATEGORY_OUTPUT,
+-      }]
+-    });
++// Debugger helper functions adapted from devtools/client/debugger/test/head.js.
+ 
+-    finishTest();
+-  }).catch(aError => {
+-    ok(false, "Got an error: " + aError.message + "\n" + aError.stack);
+-  });
+-}
+-
+-// Debugger helper functions stolen from devtools/client/debugger/test/head.js.
+-
+-function ensureThreadClientState(aPanel, aState) {
+-  let thread = aPanel.panelWin.gThreadClient;
+-  let state = thread.state;
+-
+-  info("Thread is: '" + state + "'.");
+-
+-  if (state == aState) {
+-    return promise.resolve(null);
++async function ensureThreadClientState(debuggerPanel, state) {
++  let thread = debuggerPanel.panelWin.gThreadClient;
++  info(`Thread is: '${thread.state}'.`);
++  if (thread.state != state) {
++    info("Waiting for thread event: '${state}'.");
++    await thread.addOneTimeListener(state);
+   }
+-  return waitForThreadEvents(aPanel, aState);
+ }
+-
+-function waitForThreadEvents(aPanel, aEventName, aEventRepeat = 1) {
+-  info("Waiting for thread event: '" + aEventName + "' to fire: " +
+-       aEventRepeat + " time(s).");
+-
+-  let deferred = defer();
+-  let thread = aPanel.panelWin.gThreadClient;
+-  let count = 0;
+-
+-  thread.addListener(aEventName, function onEvent(eventName, ...args) {
+-    info("Thread event '" + eventName + "' fired: " + (++count) + " time(s).");
+-
+-    if (count == aEventRepeat) {
+-      ok(true, "Enough '" + eventName + "' thread events have been fired.");
+-      thread.removeListener(eventName, onEvent);
+-      deferred.resolve.apply(deferred, args);
+-    }
+-  });
+-
+-  return deferred.promise;
+-}

+ 92 - 0
mozilla-release/patches/1408946-59a1.patch

@@ -0,0 +1,92 @@
+# HG changeset patch
+# User Julian Descottes <jdescottes@mozilla.com>
+# Date 1511451679 -3600
+# Node ID dd5a8a6bb54e343027bf61b2375f856d20f464e8
+# Parent  ecffc76a4b783e3db056f1758922a463e07abdbe
+Bug 1408946 - enable browser_webconsole_output_order.js;r=nchevobbe
+
+MozReview-Commit-ID: 1yzQhoGqZTi
+
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+@@ -369,17 +369,16 @@ skip-if = true # Bug 1408945
+ subsuite = clipboard
+ skip-if = true #       Bug 1404364
+ # old console skip-if = (os == 'linux' && bits == 32 && debug) # bug 1328915, disable linux32 debug devtools for timeouts
+ [browser_webconsole_output_copy_newlines.js]
+ subsuite = clipboard
+ skip-if = true #       Bug 1405641
+ # old console skip-if = (os == 'linux' && bits == 32 && debug) # bug 1328915, disable linux32 debug devtools for timeouts
+ [browser_webconsole_output_order.js]
+-skip-if = true # Bug 1408946
+ [browser_webconsole_persist.js]
+ [browser_webconsole_property_provider.js]
+ skip-if = true # Bug 1406841
+ #old console skip-if = e10s # Bug 1042253 - webconsole tests disabled with e10s
+ [browser_webconsole_prune_scroll.js]
+ skip-if = true #       Bug 1404832
+ [browser_webconsole_reflow.js]
+ skip-if = true #       Bug 1406022
+diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_output_order.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_output_order.js
+--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_output_order.js
++++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_output_order.js
+@@ -4,44 +4,30 @@
+  * http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+ // Tests that any output created from calls to the console API comes before the
+ // echoed JavaScript.
+ 
+ "use strict";
+ 
+ const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
+-                 "test/test-console.html";
+-
+-add_task(function* () {
+-  yield loadTab(TEST_URI);
+-  let hud = yield openConsole();
+-
+-  let jsterm = hud.jsterm;
+-
+-  jsterm.clearOutput();
+-  jsterm.execute("console.log('foo', 'bar');");
++                 "new-console-output/test/mochitest/test-console.html";
+ 
+-  let [functionCall, consoleMessage, result] = yield waitForMessages({
+-    webconsole: hud,
+-    messages: [{
+-      text: "console.log('foo', 'bar');",
+-      category: CATEGORY_INPUT,
+-    },
+-      {
+-        text: "foo bar",
+-        category: CATEGORY_WEBDEV,
+-        severity: SEVERITY_LOG,
+-      },
+-      {
+-        text: "undefined",
+-        category: CATEGORY_OUTPUT,
+-      }]
++add_task(async function () {
++  let hud = await openNewTabAndConsole(TEST_URI);
++  hud.jsterm.clearOutput();
++
++  let messages = ["console.log('foo', 'bar');", "foo bar", "undefined"];
++  let onMessages = waitForMessages({
++    hud,
++    messages: messages.map(text => ({text}))
+   });
+ 
+-  let fncallNode = [...functionCall.matched][0];
+-  let consoleMessageNode = [...consoleMessage.matched][0];
+-  let resultNode = [...result.matched][0];
++  hud.jsterm.execute("console.log('foo', 'bar');");
++
++  const [fncallNode, consoleMessageNode, resultNode] =
++    (await onMessages).map(msg => msg.node);
++
+   is(fncallNode.nextElementSibling, consoleMessageNode,
+      "console.log() is followed by 'foo' 'bar'");
+   is(consoleMessageNode.nextElementSibling, resultNode,
+      "'foo' 'bar' is followed by undefined");
+ });

Some files were not shown because too many files changed in this diff