Browse Source

sync with release queue

Frank-Rainer Grahl 9 months ago
parent
commit
0cda2bcf2a
100 changed files with 39389 additions and 168 deletions
  1. 6 6
      frg/work-js/comm-release/patches/1373258-cc-58a1.patch
  2. 4 1
      frg/work-js/comm-release/patches/1611010-DOMEventListener-25319.patch
  3. 37 0
      frg/work-js/comm-release/patches/1871992-122a1.patch
  4. 45 13
      frg/work-js/comm-release/patches/TOP-1378089-4-bookmarks-wip-25319.patch
  5. 2 2
      frg/work-js/comm-release/patches/TOP-1872623-cancelbookmark-25319.patch
  6. 9 9
      frg/work-js/comm-release/patches/WIP-1370314-installer.patch
  7. 0 77
      frg/work-js/comm-release/patches/WIP-1378089-4-253.patch
  8. 28 27
      frg/work-js/comm-release/patches/series
  9. 5672 0
      frg/work-js/mozilla-release/patches/1134540-60a1.patch
  10. 71 0
      frg/work-js/mozilla-release/patches/1230369-1a-60a1.patch
  11. 475 0
      frg/work-js/mozilla-release/patches/1230373-3a-58a1.patch
  12. 537 0
      frg/work-js/mozilla-release/patches/1233890-60a1.patch
  13. 468 0
      frg/work-js/mozilla-release/patches/1241131-1-59a1.patch
  14. 67 0
      frg/work-js/mozilla-release/patches/1241131-2-59a1.patch
  15. 21 0
      frg/work-js/mozilla-release/patches/1294873-59a1.patch
  16. 292 0
      frg/work-js/mozilla-release/patches/1303171-59a1.patch
  17. 257 0
      frg/work-js/mozilla-release/patches/1307899-60a1.patch
  18. 110 0
      frg/work-js/mozilla-release/patches/1307925-60a1.patch
  19. 1974 0
      frg/work-js/mozilla-release/patches/1307928-1-60a1.patch
  20. 536 0
      frg/work-js/mozilla-release/patches/1307928-2-60a1.patch
  21. 230 0
      frg/work-js/mozilla-release/patches/1307928-3-60a1.patch
  22. 239 0
      frg/work-js/mozilla-release/patches/1307928-4-60a1.patch
  23. 31 0
      frg/work-js/mozilla-release/patches/1335316-60a1.patch
  24. 487 0
      frg/work-js/mozilla-release/patches/1339461-1a-60a1.patch
  25. 105 0
      frg/work-js/mozilla-release/patches/1349483-1-59a1.patch
  26. 103 0
      frg/work-js/mozilla-release/patches/1349483-2-59a1.patch
  27. 144 0
      frg/work-js/mozilla-release/patches/1371293-3-59a1.patch
  28. 106 0
      frg/work-js/mozilla-release/patches/1371293-4-59a1.patch
  29. 287 0
      frg/work-js/mozilla-release/patches/1371293-7-59a1.patch
  30. 34 0
      frg/work-js/mozilla-release/patches/1378524-59a1.patch
  31. 2464 0
      frg/work-js/mozilla-release/patches/1382605-60a1.patch
  32. 6 6
      frg/work-js/mozilla-release/patches/1382606-60a1.patch
  33. 893 0
      frg/work-js/mozilla-release/patches/1382609-60a1.patch
  34. 161 0
      frg/work-js/mozilla-release/patches/1384463-58a1.patch
  35. 184 0
      frg/work-js/mozilla-release/patches/1386523-60a1.patch
  36. 34 0
      frg/work-js/mozilla-release/patches/1387511-1-59a1.patch
  37. 2083 0
      frg/work-js/mozilla-release/patches/1387511-2-59a1.patch
  38. 58 0
      frg/work-js/mozilla-release/patches/1387827-58a1.patch
  39. 1179 0
      frg/work-js/mozilla-release/patches/1393464-59a1.patch
  40. 8688 0
      frg/work-js/mozilla-release/patches/1393900-57a1.patch
  41. 51 0
      frg/work-js/mozilla-release/patches/1395990-1no2-57a1.patch
  42. 62 0
      frg/work-js/mozilla-release/patches/1395990-3-57a1.patch
  43. 179 0
      frg/work-js/mozilla-release/patches/1396666-59a1.patch
  44. 210 0
      frg/work-js/mozilla-release/patches/1397366-59a1.patch
  45. 138 0
      frg/work-js/mozilla-release/patches/1398722-58a1.patch
  46. 31 0
      frg/work-js/mozilla-release/patches/1398904-59a1.patch
  47. 254 0
      frg/work-js/mozilla-release/patches/1401548-59a1.patch
  48. 314 0
      frg/work-js/mozilla-release/patches/1401847-60a1.patch
  49. 198 0
      frg/work-js/mozilla-release/patches/1401944-59a1.patch
  50. 3 3
      frg/work-js/mozilla-release/patches/1401953-59a1.patch
  51. 137 0
      frg/work-js/mozilla-release/patches/1401958-58a1.patch
  52. 39 0
      frg/work-js/mozilla-release/patches/1402485-59a1.patch
  53. 258 0
      frg/work-js/mozilla-release/patches/1403196-60a1.patch
  54. 149 0
      frg/work-js/mozilla-release/patches/1403200-60a1.patch
  55. 218 0
      frg/work-js/mozilla-release/patches/1403205-60a1.patch
  56. 141 0
      frg/work-js/mozilla-release/patches/1403334-1-60a1.patch
  57. 31 0
      frg/work-js/mozilla-release/patches/1403334-2-60a1.patch
  58. 67 0
      frg/work-js/mozilla-release/patches/1403389-58a1.patch
  59. 101 0
      frg/work-js/mozilla-release/patches/1403449-58a1.patch
  60. 16 16
      frg/work-js/mozilla-release/patches/1403450-60a1.patch
  61. 131 0
      frg/work-js/mozilla-release/patches/1403454-60a1.patch
  62. 8 8
      frg/work-js/mozilla-release/patches/1403458-58a1.patch
  63. 91 0
      frg/work-js/mozilla-release/patches/1403907-59a1.patch
  64. 31 0
      frg/work-js/mozilla-release/patches/1404197-58a1.patch
  65. 175 0
      frg/work-js/mozilla-release/patches/1404359-60a1.patch
  66. 268 0
      frg/work-js/mozilla-release/patches/1404364-60a1.patch
  67. 84 0
      frg/work-js/mozilla-release/patches/1404368-59a1.patch
  68. 113 0
      frg/work-js/mozilla-release/patches/1404371-59a1.patch
  69. 185 0
      frg/work-js/mozilla-release/patches/1404378-59a1.patch
  70. 562 0
      frg/work-js/mozilla-release/patches/1404384-59a1.patch
  71. 176 0
      frg/work-js/mozilla-release/patches/1404392-59a1.patch
  72. 139 0
      frg/work-js/mozilla-release/patches/1404400-59a1.patch
  73. 159 0
      frg/work-js/mozilla-release/patches/1404832-1-60a1.patch
  74. 60 0
      frg/work-js/mozilla-release/patches/1404832-2-60a1.patch
  75. 87 0
      frg/work-js/mozilla-release/patches/1404844-60a1.patch
  76. 248 0
      frg/work-js/mozilla-release/patches/1404849-59a1.patch
  77. 192 0
      frg/work-js/mozilla-release/patches/1404851-59a1.patch
  78. 246 0
      frg/work-js/mozilla-release/patches/1404853-59a1.patch
  79. 179 0
      frg/work-js/mozilla-release/patches/1404877-60a1.patch
  80. 335 0
      frg/work-js/mozilla-release/patches/1404883-60a1.patch
  81. 116 0
      frg/work-js/mozilla-release/patches/1404884-60a1.patch
  82. 142 0
      frg/work-js/mozilla-release/patches/1404886-60a1.patch
  83. 231 0
      frg/work-js/mozilla-release/patches/1404888-60a1.patch
  84. 41 0
      frg/work-js/mozilla-release/patches/1405245-1-60a1.patch
  85. 199 0
      frg/work-js/mozilla-release/patches/1405245-2-60a1.patch
  86. 101 0
      frg/work-js/mozilla-release/patches/1405252-59a1.patch
  87. 82 0
      frg/work-js/mozilla-release/patches/1405333-59a1.patch
  88. 115 0
      frg/work-js/mozilla-release/patches/1405350-59a1.patch
  89. 2476 0
      frg/work-js/mozilla-release/patches/1405352-60a1.patch
  90. 283 0
      frg/work-js/mozilla-release/patches/1405636-59a1.patch
  91. 143 0
      frg/work-js/mozilla-release/patches/1405637-59a1.patch
  92. 133 0
      frg/work-js/mozilla-release/patches/1405641-60a1.patch
  93. 224 0
      frg/work-js/mozilla-release/patches/1405647-60a1.patch
  94. 126 0
      frg/work-js/mozilla-release/patches/1405648-60a1.patch
  95. 218 0
      frg/work-js/mozilla-release/patches/1405649-60a1.patch
  96. 111 0
      frg/work-js/mozilla-release/patches/1405650-60a1.patch
  97. 88 0
      frg/work-js/mozilla-release/patches/1405652-58a1.patch
  98. 133 0
      frg/work-js/mozilla-release/patches/1405983-1-58a1.patch
  99. 165 0
      frg/work-js/mozilla-release/patches/1405983-2-58a1.patch
  100. 69 0
      frg/work-js/mozilla-release/patches/1406022-60a1.patch

+ 6 - 6
frg/work-js/comm-release/patches/1373258-cc-58a1.patch

@@ -2,7 +2,7 @@
 # User Jorg K <jorgk@jorgk.com>
 # User Jorg K <jorgk@jorgk.com>
 # Date 1509791015 -3600
 # Date 1509791015 -3600
 # Node ID d0dc1eb67db8a164c585ec53a8ca1aaa9394f504
 # Node ID d0dc1eb67db8a164c585ec53a8ca1aaa9394f504
-# Parent  505b48780e81c9078208176da4b18c19d8ddcf9a
+# Parent  eb3a711aa034368bfbbf4295f712708711506303
 Port bug 1373258 to TB/IB/SM [Convert PageThumbsProtocol.js to PageThumbsProtocol.cpp]. rs=bustage-fix
 Port bug 1373258 to TB/IB/SM [Convert PageThumbsProtocol.js to PageThumbsProtocol.cpp]. rs=bustage-fix
 
 
 diff --git a/mail/installer/package-manifest.in b/mail/installer/package-manifest.in
 diff --git a/mail/installer/package-manifest.in b/mail/installer/package-manifest.in
@@ -50,11 +50,11 @@ diff --git a/mail/installer/package-manifest.in b/mail/installer/package-manifes
 diff --git a/suite/installer/package-manifest.in b/suite/installer/package-manifest.in
 diff --git a/suite/installer/package-manifest.in b/suite/installer/package-manifest.in
 --- a/suite/installer/package-manifest.in
 --- a/suite/installer/package-manifest.in
 +++ b/suite/installer/package-manifest.in
 +++ b/suite/installer/package-manifest.in
-@@ -468,18 +468,19 @@
- @RESPATH@/components/nsUpdateServiceStub.js
- #endif
- @RESPATH@/components/nsUpdateTimerManager.js
- @RESPATH@/components/nsUpdateTimerManager.manifest
+@@ -456,18 +456,19 @@
+ @RESPATH@/components/nsURLClassifier.manifest
+ @RESPATH@/components/nsUrlClassifierHashCompleter.js
+ @RESPATH@/components/nsUrlClassifierLib.js
+ @RESPATH@/components/nsUrlClassifierListManager.js
  @RESPATH@/components/nsURLFormatter.js
  @RESPATH@/components/nsURLFormatter.js
  @RESPATH@/components/nsURLFormatter.manifest
  @RESPATH@/components/nsURLFormatter.manifest
  @RESPATH@/components/nsWebHandlerApp.js
  @RESPATH@/components/nsWebHandlerApp.js

+ 4 - 1
frg/work-js/comm-release/patches/1611010-DOMEventListener-25319.patch

@@ -2,7 +2,10 @@
 # User Ian Neal <iann_cvs@blueyonder.co.uk>
 # User Ian Neal <iann_cvs@blueyonder.co.uk>
 # Date 1700088805 0
 # Date 1700088805 0
 # Parent  8cb7542c7e62e2e1c9786168780588a9a378e904
 # Parent  8cb7542c7e62e2e1c9786168780588a9a378e904
-Port |Bug 1453345 part 5 - Remove pointless JS implemenations of QI to nsIDOMEventListener| and |Bug 1453487 part 2 - Remove useless implements="nsIDOMEventListener" from XBL bindings| to SeaMonkey. r=frg
+Bug 1611010 - Remove nsIDOMEventListener generateQI calls and xbl implementation from SeaMonkey. r=frg a=frg
+
+Port Bug 1453345 part 5 Remove pointless JS implementations of QI to nsIDOMEventListener.
+Port Bug 1453487 part 2 Remove useless implements="nsIDOMEventListener" from XBL bindings.
 
 
 diff --git a/suite/base/content/viewZoomOverlay.js b/suite/base/content/viewZoomOverlay.js
 diff --git a/suite/base/content/viewZoomOverlay.js b/suite/base/content/viewZoomOverlay.js
 --- a/suite/base/content/viewZoomOverlay.js
 --- a/suite/base/content/viewZoomOverlay.js

+ 37 - 0
frg/work-js/comm-release/patches/1871992-122a1.patch

@@ -0,0 +1,37 @@
+# HG changeset patch
+# User welpy-cw <h.w.forms@arcor.de>
+# Date 1703847133 -7200
+# Node ID 29aa9bd66ae812b2be0cfb1c53792aa872b09fc1
+# Parent  b61fae55c3f5b86184211fa57949499928b221d2
+Bug 1871992 - Fix bug in nsMsgXFViewThread::RemoveChildHdr. r=mkmelin
+
+Differential Revision: https://phabricator.services.mozilla.com/D197301
+
+diff --git a/mailnews/base/src/nsMsgXFViewThread.cpp b/mailnews/base/src/nsMsgXFViewThread.cpp
+--- a/mailnews/base/src/nsMsgXFViewThread.cpp
++++ b/mailnews/base/src/nsMsgXFViewThread.cpp
+@@ -328,21 +328,19 @@ nsMsgXFViewThread::RemoveChildHdr(nsIMsg
+   nsCOMPtr<nsIMsgFolder> msgFolder;
+   child->GetFolder(getter_AddRefs(msgFolder));
+   // If this was the newest msg, clear the newest msg date so we'll recalc.
+   uint32_t date;
+   child->GetDateInSeconds(&date);
+   if (date == m_newestMsgDate)
+     SetNewestMsgDate(0);
+ 
+-  for (uint32_t childIndex = 0; childIndex < m_keys.Length(); childIndex++)
+-  {
+-    if (m_keys[childIndex] == msgKey && m_folders[childIndex] == msgFolder)
+-    {
+-      uint8_t levelRemoved = m_keys[childIndex];
++  for (uint32_t childIndex = 0; childIndex < m_keys.Length(); childIndex++) {
++    if (m_keys[childIndex] == msgKey && m_folders[childIndex] == msgFolder) {
++      uint8_t levelRemoved = m_levels[childIndex];
+       // Adjust the levels of all the children of this header.
+       nsMsgViewIndex i;
+       for (i = childIndex + 1;
+            i < m_keys.Length() && m_levels[i] > levelRemoved;
+            i++)
+       {
+         m_levels[i] = m_levels[i] - 1;
+       }

+ 45 - 13
frg/work-js/comm-release/patches/TOP-1378089-4-bookmarks-25319.patch → frg/work-js/comm-release/patches/TOP-1378089-4-bookmarks-wip-25319.patch

@@ -1,8 +1,6 @@
 # HG changeset patch
 # HG changeset patch
 # User Frank-Rainer Grahl <frgrahl@gmx.net>
 # User Frank-Rainer Grahl <frgrahl@gmx.net>
 # Date 1525689689 -7200
 # Date 1525689689 -7200
-#      Mon May 07 12:41:29 2018 +0200
-# Node ID 551982a6e2bdc0ae160284e8c82c282a6ddd79e8
 # Parent  b23f5d85a03ce1c0ad3555ab87e595e57fb1fbe9
 # Parent  b23f5d85a03ce1c0ad3555ab87e595e57fb1fbe9
 Bug 1378089 - Part 4. Replace the Bookmarks Manager and the History viewer with the Firefox library. r=IanN a=IanN
 Bug 1378089 - Part 4. Replace the Bookmarks Manager and the History viewer with the Firefox library. r=IanN a=IanN
 From Fx 56 up to Bug 1383138 in m-c to Fx 60 up to tbd.
 From Fx 56 up to Bug 1383138 in m-c to Fx 60 up to tbd.
@@ -1656,7 +1654,7 @@ diff --git a/suite/components/places/content/controller.js b/suite/components/pl
      }
      }
  
  
      if (itemsToSelect.length > 0)
      if (itemsToSelect.length > 0)
-@@ -1526,27 +1465,31 @@ var PlacesControllerDragHelper = {
+@@ -1526,109 +1465,108 @@ var PlacesControllerDragHelper = {
      // removed.
      // removed.
      return !(PlacesUtils.nodeIsFolder(parentNode) &&
      return !(PlacesUtils.nodeIsFolder(parentNode) &&
               PlacesUIUtils.isContentsReadOnly(parentNode)) &&
               PlacesUIUtils.isContentsReadOnly(parentNode)) &&
@@ -1692,8 +1690,32 @@ diff --git a/suite/components/places/content/controller.js b/suite/components/pl
      duplicable.set(PlacesUtils.TYPE_UNICODE, new Set());
      duplicable.set(PlacesUtils.TYPE_UNICODE, new Set());
      duplicable.set(PlacesUtils.TYPE_X_MOZ_URL, new Set());
      duplicable.set(PlacesUtils.TYPE_X_MOZ_URL, new Set());
  
  
-     // Collect all data from the DataTransfer before processing it, as the
-@@ -1578,64 +1521,52 @@ var PlacesControllerDragHelper = {
++    // Collect all data from the DataTransfer before processing it, as the
++    // DataTransfer is only valid during the synchronous handling of the `drop`
++    // event handler callback.
++    let dtItems = [];
+     for (let i = 0; i < dropCount; ++i) {
+       let flavor = this.getFirstValidFlavor(dt.mozTypesAt(i));
+       if (!flavor)
+         return;
+ 
+       let data = dt.mozGetDataAt(flavor, i);
+       if (duplicable.has(flavor)) {
+         let handled = duplicable.get(flavor);
+         if (handled.has(data))
+           continue;
+         handled.add(data);
+       }
++      dtItems.push({flavor, data});
++    }
+ 
++    for (let {flavor, data} of dtItems) {
+       let nodes;
+       if (flavor != TAB_DROP_TYPE) {
+         nodes = PlacesUtils.unwrapNodes(data, flavor);
+       } else if (data instanceof XULElement && data.localName == "tab" &&
+                data.ownerGlobal instanceof ChromeWindow) {
+         let uri = data.linkedBrowser.currentURI;
          let spec = uri ? uri.spec : "about:blank";
          let spec = uri ? uri.spec : "about:blank";
          nodes = [{ uri: spec,
          nodes = [{ uri: spec,
                     title: data.label,
                     title: data.label,
@@ -2200,7 +2222,7 @@ diff --git a/suite/components/places/content/treeView.js b/suite/components/plac
      }
      }
  
  
      if (PlacesControllerDragHelper.disallowInsertion(container))
      if (PlacesControllerDragHelper.disallowInsertion(container))
-@@ -1438,26 +1438,27 @@ PlacesTreeView.prototype = {
+@@ -1438,30 +1438,34 @@ PlacesTreeView.prototype = {
        tagName = container.title;
        tagName = container.title;
        if (!tagName)
        if (!tagName)
          return null;
          return null;
@@ -2221,16 +2243,26 @@ diff --git a/suite/components/places/content/treeView.js b/suite/components/plac
      let ip = this._getInsertionPoint(aRow, aOrientation);
      let ip = this._getInsertionPoint(aRow, aOrientation);
      if (ip) {
      if (ip) {
 -      PlacesControllerDragHelper.onDrop(ip, aDataTransfer)
 -      PlacesControllerDragHelper.onDrop(ip, aDataTransfer)
+-                                .catch(Cu.reportError);
 +      PlacesControllerDragHelper.onDrop(ip, aDataTransfer, this)
 +      PlacesControllerDragHelper.onDrop(ip, aDataTransfer, this)
-                                 .catch(Cu.reportError)
-                                 .then(() => {
-                                   // We should only clear the drop target once
-                                   // the onDrop is complete, as it is an async function.
-                                   PlacesControllerDragHelper.currentDropTarget = null;
-                                 });
++                                .catch(Cu.reportError)
++                                .then(() => {
++                                  // We should only clear the drop target once
++                                  // the onDrop is complete, as it is an async function.
++                                  PlacesControllerDragHelper.currentDropTarget = null;
++                                });
      }
      }
+-
+-    PlacesControllerDragHelper.currentDropTarget = null;
+   },
+ 
+   getParentIndex: function PTV_getParentIndex(aRow) {
+     let [, parentRow] = this._getParentByChildRow(aRow);
+     return parentRow;
    },
    },
-@@ -1769,21 +1770,16 @@ PlacesTreeView.prototype = {
+ 
+   hasNextSibling: function PTV_hasNextSibling(aRow, aAfterIndex) {
+@@ -1766,21 +1770,16 @@ PlacesTreeView.prototype = {
  
  
      return true;
      return true;
    },
    },

+ 2 - 2
frg/work-js/comm-release/patches/TOP-9999999-cancelbookmark-25319.patch → frg/work-js/comm-release/patches/TOP-1872623-cancelbookmark-25319.patch

@@ -2,7 +2,7 @@
 # User Frank-Rainer Grahl <frgrahl@gmx.net>
 # User Frank-Rainer Grahl <frgrahl@gmx.net>
 # Date 1703347081 -3600
 # Date 1703347081 -3600
 # Parent  bea81d0e68cbad30d243a82df687ed0cdb96b9a6
 # Parent  bea81d0e68cbad30d243a82df687ed0cdb96b9a6
-Bug 9999999 - Remove Cancel button from bookmarking start ui. r=IanN a=IanN
+Bug 1872623 - Remove Cancel button from bookmarking star ui. r=IanN a=IanN
 
 
 Current code is not working in any 2.53 release and using undo has side effects.
 Current code is not working in any 2.53 release and using undo has side effects.
 Hide it first to see if we can figure out something later.
 Hide it first to see if we can figure out something later.
@@ -21,7 +21,7 @@ diff --git a/suite/browser/navigator.xul b/suite/browser/navigator.xul
                  accesskey="&editBookmark.removeBookmark.accessKey;"/>
                  accesskey="&editBookmark.removeBookmark.accessKey;"/>
 -        <spacer flex="1"/>
 -        <spacer flex="1"/>
 +        <spacer flex="1" hidden="true"/>
 +        <spacer flex="1" hidden="true"/>
-+        <!-- cancel is broken in 2.53 for now so hide it -->
++        <!-- Cancel is broken in 2.53 for now so hide it -->
          <button id="editBookmarkPanelDeleteButton"
          <button id="editBookmarkPanelDeleteButton"
 +                hidden="true"
 +                hidden="true"
                  class="editBookmarkPanelBottomButton"
                  class="editBookmarkPanelBottomButton"

+ 9 - 9
frg/work-js/comm-release/patches/WIP-1370314-installer.patch

@@ -1,13 +1,13 @@
 # HG changeset patch
 # HG changeset patch
 # User Frank-Rainer Grahl <frgrahl@gmx.net>
 # User Frank-Rainer Grahl <frgrahl@gmx.net>
 # Date 1621294441 -7200
 # Date 1621294441 -7200
-# Parent  674c1a4717cfe58acb4b5af0cee0bce8dfe74db7
+# Parent  8dbd89cf1ac27f435fe68bd336a2639ba967266a
 Bug 1370314 - installer wip patch
 Bug 1370314 - installer wip patch
 
 
 diff --git a/suite/installer/package-manifest.in b/suite/installer/package-manifest.in
 diff --git a/suite/installer/package-manifest.in b/suite/installer/package-manifest.in
 --- a/suite/installer/package-manifest.in
 --- a/suite/installer/package-manifest.in
 +++ b/suite/installer/package-manifest.in
 +++ b/suite/installer/package-manifest.in
-@@ -187,16 +187,18 @@
+@@ -188,16 +188,18 @@
  @RESPATH@/components/dom_file.xpt
  @RESPATH@/components/dom_file.xpt
  @RESPATH@/components/dom_geolocation.xpt
  @RESPATH@/components/dom_geolocation.xpt
  @RESPATH@/components/dom_html.xpt
  @RESPATH@/components/dom_html.xpt
@@ -97,11 +97,11 @@ diff --git a/suite/installer/package-manifest.in b/suite/installer/package-manif
  @RESPATH@/components/nsURLFormatter.manifest
  @RESPATH@/components/nsURLFormatter.manifest
  @RESPATH@/components/nsWebHandlerApp.js
  @RESPATH@/components/nsWebHandlerApp.js
  @RESPATH@/components/nsWebHandlerApp.manifest
  @RESPATH@/components/nsWebHandlerApp.manifest
- @RESPATH@/components/PageThumbsProtocol.js
- @RESPATH@/components/BrowserPageThumbs.manifest
+ @RESPATH@/components/PageThumbsStorageService.js
+ @RESPATH@/components/thumbnails.xpt
+ @RESPATH@/components/PageThumbsComponents.manifest
  @RESPATH@/components/PageIconProtocolHandler.js
  @RESPATH@/components/PageIconProtocolHandler.js
- @RESPATH@/components/passwordmgr.manifest
-@@ -470,16 +482,20 @@
+@@ -471,16 +483,20 @@
  #endif
  #endif
  @RESPATH@/components/PlacesCategoriesStarter.js
  @RESPATH@/components/PlacesCategoriesStarter.js
  @RESPATH@/components/ProcessSingleton.manifest
  @RESPATH@/components/ProcessSingleton.manifest
@@ -122,7 +122,7 @@ diff --git a/suite/installer/package-manifest.in b/suite/installer/package-manif
  @RESPATH@/components/SlowScriptDebug.js
  @RESPATH@/components/SlowScriptDebug.js
  @RESPATH@/components/SlowScriptDebug.manifest
  @RESPATH@/components/SlowScriptDebug.manifest
  @RESPATH@/components/smileApplication.js
  @RESPATH@/components/smileApplication.js
-@@ -508,16 +524,19 @@
+@@ -509,16 +525,19 @@
  
  
  ; [Extensions]
  ; [Extensions]
  @RESPATH@/components/extensions-toolkit.manifest
  @RESPATH@/components/extensions-toolkit.manifest
@@ -142,7 +142,7 @@ diff --git a/suite/installer/package-manifest.in b/suite/installer/package-manif
  ; [DevTools Startup Files]
  ; [DevTools Startup Files]
  @RESPATH@/chrome/devtools-startup@JAREXT@
  @RESPATH@/chrome/devtools-startup@JAREXT@
  @RESPATH@/chrome/devtools-startup.manifest
  @RESPATH@/chrome/devtools-startup.manifest
-@@ -745,16 +764,19 @@ bin/libfreebl_32int64_3.so
+@@ -746,16 +765,19 @@ bin/libfreebl_32int64_3.so
  #endif
  #endif
  
  
  ; [ minidump-analyzer ]
  ; [ minidump-analyzer ]
@@ -162,7 +162,7 @@ diff --git a/suite/installer/package-manifest.in b/suite/installer/package-manif
  @RESPATH@/components/import.xpt
  @RESPATH@/components/import.xpt
  @RESPATH@/components/mailview.xpt
  @RESPATH@/components/mailview.xpt
  @RESPATH@/components/mime.xpt
  @RESPATH@/components/mime.xpt
-@@ -858,16 +880,28 @@ bin/libfreebl_32int64_3.so
+@@ -859,16 +881,28 @@ bin/libfreebl_32int64_3.so
  #ifdef LLVM_SYMBOLIZER
  #ifdef LLVM_SYMBOLIZER
  @BINPATH@/@LLVM_SYMBOLIZER@
  @BINPATH@/@LLVM_SYMBOLIZER@
  #endif
  #endif

+ 0 - 77
frg/work-js/comm-release/patches/WIP-1378089-4-253.patch

@@ -1,77 +0,0 @@
-# HG changeset patch
-# User Frank-Rainer Grahl <frgrahl@gmx.net>
-# Date 1619653614 -7200
-# Parent  32145e5d395b2cf594971effe98c0727fb07bb6a
-Bug 1378089 - Part 4. Replace the Bookmarks Manager and the History viewer with the Firefox library. r=me a=me
-Late fixups for 2.53 backports.
-
-diff --git a/suite/components/places/content/controller.js b/suite/components/places/content/controller.js
---- a/suite/components/places/content/controller.js
-+++ b/suite/components/places/content/controller.js
-@@ -1544,29 +1544,36 @@ var PlacesControllerDragHelper = {
-                        (await insertionPoint.promiseGuid()) : null;
-     let tagName = insertionPoint.tagName;
- 
-     // Following flavors may contain duplicated data.
-     let duplicable = new Map();
-     duplicable.set(PlacesUtils.TYPE_UNICODE, new Set());
-     duplicable.set(PlacesUtils.TYPE_X_MOZ_URL, new Set());
- 
-+    // Collect all data from the DataTransfer before processing it, as the
-+    // DataTransfer is only valid during the synchronous handling of the `drop`
-+    // event handler callback.
-+    let dtItems = [];
-     for (let i = 0; i < dropCount; ++i) {
-       let flavor = this.getFirstValidFlavor(dt.mozTypesAt(i));
-       if (!flavor)
-         return;
- 
-       let data = dt.mozGetDataAt(flavor, i);
-       if (duplicable.has(flavor)) {
-         let handled = duplicable.get(flavor);
-         if (handled.has(data))
-           continue;
-         handled.add(data);
-       }
-+      dtItems.push({flavor, data});
-+    }
- 
-+    for (let {flavor, data} of dtItems) {
-       let nodes;
-       if (flavor != TAB_DROP_TYPE) {
-         nodes = PlacesUtils.unwrapNodes(data, flavor);
-       } else if (data instanceof XULElement && data.localName == "tab" &&
-                data.ownerGlobal instanceof ChromeWindow) {
-         let uri = data.linkedBrowser.currentURI;
-         let spec = uri ? uri.spec : "about:blank";
-         nodes = [{ uri: spec,
-diff --git a/suite/components/places/content/treeView.js b/suite/components/places/content/treeView.js
---- a/suite/components/places/content/treeView.js
-+++ b/suite/components/places/content/treeView.js
-@@ -1448,20 +1448,23 @@ PlacesTreeView.prototype = {
- 
-   drop: function PTV_drop(aRow, aOrientation, aDataTransfer) {
-     // We are responsible for translating the |index| and |orientation|
-     // parameters into a container id and index within the container,
-     // since this information is specific to the tree view.
-     let ip = this._getInsertionPoint(aRow, aOrientation);
-     if (ip) {
-       PlacesControllerDragHelper.onDrop(ip, aDataTransfer)
--                                .catch(Cu.reportError);
-+                                .catch(Cu.reportError)
-+                                .then(() => {
-+                                  // We should only clear the drop target once
-+                                  // the onDrop is complete, as it is an async function.
-+                                  PlacesControllerDragHelper.currentDropTarget = null;
-+                                });
-     }
--
--    PlacesControllerDragHelper.currentDropTarget = null;
-   },
- 
-   getParentIndex: function PTV_getParentIndex(aRow) {
-     let [, parentRow] = this._getParentByChildRow(aRow);
-     return parentRow;
-   },
- 
-   hasNextSibling: function PTV_hasNextSibling(aRow, aAfterIndex) {

+ 28 - 27
frg/work-js/comm-release/patches/series

@@ -2100,6 +2100,31 @@ NOBUG-fixcalbackend-25318.patch
 1858248-fiximport-25318.patch
 1858248-fiximport-25318.patch
 1859836-init-ftl-toolkit-1_1-25318.patch
 1859836-init-ftl-toolkit-1_1-25318.patch
 1841167-2-fixbranding-25318.patch
 1841167-2-fixbranding-25318.patch
+1837261-2-version-beta-cr-25318.patch
+1861842-version-release-cr-25318.patch
+1861843-1-version-prebeta-cr-25319.patch
+1388927-1-57a1.patch
+1388927-2-57a1.patch
+1373258-cc-58a1.patch
+1419657-1-59a1.patch
+1419657-2-59a1.patch
+1422541-59a1.patch
+1431913-2-PARTIAL-59a1.patch
+1434687-PARTIAL-60a1.patch
+1432908-60a1.patch
+1439883-1-60a1.patch
+1439883-2-60a1.patch
+1363061-cc-60a1.patch
+1453403-1-61a1.patch
+1453403-2-61a1.patch
+1430501-61a1.patch
+1864287-punycode-25319.patch
+1864355-standardurl-init-25319.patch
+1870930-czclean-25319.patch
+1611010-DOMEventListener-25319.patch
+1868034-registerAllActors-25319.patch
+1870934-debugqa-website-25319.patch
+1871992-122a1.patch
 PPPPPPP-tbbranding-253.patch
 PPPPPPP-tbbranding-253.patch
 PPPPPPP-privateprefs-253.patch
 PPPPPPP-privateprefs-253.patch
 TOP-1534155-PARTIAL-69a1.patch
 TOP-1534155-PARTIAL-69a1.patch
@@ -2118,34 +2143,10 @@ WIP-521861-Account_Creation.patch
 WIP-1584473-6x-71a1.patch
 WIP-1584473-6x-71a1.patch
 WIP-1584473-7x-71a1.patch
 WIP-1584473-7x-71a1.patch
 WIP-1687385-mozconfigs-v1_2-253.patch
 WIP-1687385-mozconfigs-v1_2-253.patch
-WIP-1378089-4-253.patch
 WIP-9999999-lintglobals.patch
 WIP-9999999-lintglobals.patch
-1837261-2-version-beta-cr-25318.patch
-1861842-version-release-cr-25318.patch
-1861843-1-version-prebeta-cr-25319.patch
-1388927-1-57a1.patch
-1388927-2-57a1.patch
-1419657-1-59a1.patch
-1419657-2-59a1.patch
-1864287-punycode-25319.patch
-1373258-cc-58a1.patch
-1422541-59a1.patch
-1431913-2-PARTIAL-59a1.patch
-1434687-PARTIAL-60a1.patch
-1432908-60a1.patch
-1439883-1-60a1.patch
-1439883-2-60a1.patch
-1864355-standardurl-init-25319.patch
-1453403-1-61a1.patch
-1453403-2-61a1.patch
-1611010-DOMEventListener-25319.patch
-1870930-czclean-25319.patch
-1363061-cc-60a1.patch
-1430501-61a1.patch
-1868034-registerAllActors-25319.patch
-1870934-debugqa-website-25319.patch
-TOP-1378089-4-bookmarks-25319.patch
-TOP-9999999-cancelbookmark-25319.patch
+TOP-1378089-4-bookmarks-wip-25319.patch
+TOP-1872623-cancelbookmark-25319.patch
+
 
 
 
 
 
 

+ 5672 - 0
frg/work-js/mozilla-release/patches/1134540-60a1.patch

@@ -0,0 +1,5672 @@
+# HG changeset patch
+# User Masayuki Nakano <masayuki@d-toybox.com>
+# Date 1517317544 -32400
+# Node ID e5450e8bff0463959ef5cb8d2e7de8f908a79bb8
+# Parent  ad04c68198a01edca781c6cd08ecd3df5f51b560
+Bug 1134540 - Make all tests stop using nsIDOMWindowUtils.sendKeyEvent() r=smaug
+
+nsIDOMWindowUtils.sendKeyEvent() can dispatch any keyboard events, i.e.,
+may dispatch different key events from actual Gecko's behavior.  Instead,
+they should use nsITextInputProcessor directly or synthesizeKey() of
+EventUtils which wraps nsITextInputProcessor.
+
+MozReview-Commit-ID: EDWqXy1OxJp
+
+diff --git a/browser/base/content/test/general/browser_clipboard.js b/browser/base/content/test/general/browser_clipboard.js
+--- a/browser/base/content/test/general/browser_clipboard.js
++++ b/browser/base/content/test/general/browser_clipboard.js
+@@ -14,36 +14,34 @@ add_task(async function() {
+ 
+   await promiseTabLoadEvent(tab, "data:text/html," + escape(testPage));
+   await SimpleTest.promiseFocus(browser.contentWindowAsCPOW);
+ 
+   const modifier = (navigator.platform.includes("Mac")) ?
+                    Ci.nsIDOMWindowUtils.MODIFIER_META :
+                    Ci.nsIDOMWindowUtils.MODIFIER_CONTROL;
+ 
++  function sendKey(message) {
++    BrowserTestUtils.synthesizeKey(message.data.key,
++                                   {code: message.data.code, accelKey: true},
++                                   browser);
++  }
++
++  browser.messageManager.addMessageListener("Test:SendKey", sendKey);
++
+   // On windows, HTML clipboard includes extra data.
+   // The values are from widget/windows/nsDataObj.cpp.
+   const htmlPrefix = (navigator.platform.includes("Win")) ? "<html><body>\n<!--StartFragment-->" : "";
+   const htmlPostfix = (navigator.platform.includes("Win")) ? "<!--EndFragment-->\n</body>\n</html>" : "";
+ 
+   await ContentTask.spawn(browser, { modifier, htmlPrefix, htmlPostfix }, async function(arg) {
+     var doc = content.document;
+     var main = doc.getElementById("main");
+     main.focus();
+ 
+-    const utils = content.QueryInterface(Ci.nsIInterfaceRequestor)
+-                         .getInterface(Ci.nsIDOMWindowUtils);
+-
+-    function sendKey(key) {
+-      if (utils.sendKeyEvent("keydown", key, 0, arg.modifier)) {
+-        utils.sendKeyEvent("keypress", key, key.charCodeAt(0), arg.modifier);
+-      }
+-      utils.sendKeyEvent("keyup", key, 0, arg.modifier);
+-    }
+-
+     // Select an area of the text.
+     let selection = doc.getSelection();
+     selection.modify("move", "left", "line");
+     selection.modify("move", "right", "character");
+     selection.modify("move", "right", "character");
+     selection.modify("move", "right", "character");
+     selection.modify("extend", "right", "word");
+     selection.modify("extend", "right", "word");
+@@ -51,17 +49,17 @@ add_task(async function() {
+     await new Promise((resolve, reject) => {
+       addEventListener("copy", function copyEvent(event) {
+         removeEventListener("copy", copyEvent, true);
+         // The data is empty as the selection is copied during the event default phase.
+         Assert.equal(event.clipboardData.mozItemCount, 0, "Zero items on clipboard");
+         resolve();
+       }, true);
+ 
+-      sendKey("c");
++      sendAsyncMessage("Test:SendKey", { key: "c", code: "KeyC" });
+     });
+ 
+     selection.modify("move", "right", "line");
+ 
+     await new Promise((resolve, reject) => {
+       addEventListener("paste", function copyEvent(event) {
+         removeEventListener("paste", copyEvent, true);
+         let clipboardData = event.clipboardData;
+@@ -69,17 +67,18 @@ add_task(async function() {
+         Assert.equal(clipboardData.types.length, 2, "Two types on clipboard");
+         Assert.equal(clipboardData.types[0], "text/html", "text/html on clipboard");
+         Assert.equal(clipboardData.types[1], "text/plain", "text/plain on clipboard");
+         Assert.equal(clipboardData.getData("text/html"), arg.htmlPrefix +
+           "t <b>Bold</b>" + arg.htmlPostfix, "text/html value");
+         Assert.equal(clipboardData.getData("text/plain"), "t Bold", "text/plain value");
+         resolve();
+       }, true);
+-      sendKey("v");
++
++      sendAsyncMessage("Test:SendKey", {key: "v", code: "KeyV"});
+     });
+ 
+     Assert.equal(main.innerHTML, "Test <b>Bold</b> After Textt <b>Bold</b>", "Copy and paste html");
+ 
+     selection.modify("extend", "left", "word");
+     selection.modify("extend", "left", "word");
+     selection.modify("extend", "left", "character");
+ 
+@@ -87,17 +86,18 @@ add_task(async function() {
+       addEventListener("cut", function copyEvent(event) {
+         removeEventListener("cut", copyEvent, true);
+         event.clipboardData.setData("text/plain", "Some text");
+         event.clipboardData.setData("text/html", "<i>Italic</i> ");
+         selection.deleteFromDocument();
+         event.preventDefault();
+         resolve();
+       }, true);
+-      sendKey("x");
++
++      sendAsyncMessage("Test:SendKey", {key: "x", code: "KeyX"});
+     });
+ 
+     selection.modify("move", "left", "line");
+ 
+     await new Promise((resolve, reject) => {
+       addEventListener("paste", function copyEvent(event) {
+         removeEventListener("paste", copyEvent, true);
+         let clipboardData = event.clipboardData;
+@@ -105,17 +105,18 @@ add_task(async function() {
+         Assert.equal(clipboardData.types.length, 2, "Two types on clipboard 2");
+         Assert.equal(clipboardData.types[0], "text/html", "text/html on clipboard 2");
+         Assert.equal(clipboardData.types[1], "text/plain", "text/plain on clipboard 2");
+         Assert.equal(clipboardData.getData("text/html"), arg.htmlPrefix +
+           "<i>Italic</i> " + arg.htmlPostfix, "text/html value 2");
+         Assert.equal(clipboardData.getData("text/plain"), "Some text", "text/plain value 2");
+         resolve();
+       }, true);
+-      sendKey("v");
++
++      sendAsyncMessage("Test:SendKey", {key: "v", code: "KeyV"});
+     });
+ 
+     Assert.equal(main.innerHTML, "<i>Italic</i> Test <b>Bold</b> After<b></b>",
+       "Copy and paste html 2");
+   });
+ 
+   // Next, check that the Copy Image command works.
+ 
+@@ -149,26 +150,22 @@ add_task(async function() {
+         if (clipboardData.getData("text/html") !== arg.htmlPrefix +
+             '<img id="img" tabindex="1" src="http://example.org/browser/browser/base/content/test/general/moz.png">' +
+             arg.htmlPostfix) {
+           reject("Clipboard Data did not contain an image, was " + clipboardData.getData("text/html"));
+         }
+         resolve();
+       }, true);
+ 
+-      const utils = content.QueryInterface(Ci.nsIInterfaceRequestor)
+-                           .getInterface(Ci.nsIDOMWindowUtils);
+-
+-      if (utils.sendKeyEvent("keydown", "v", 0, arg.modifier)) {
+-        utils.sendKeyEvent("keypress", "v", "v".charCodeAt(0), arg.modifier);
+-      }
+-      utils.sendKeyEvent("keyup", "v", 0, arg.modifier);
++      sendAsyncMessage("Test:SendKey", {key: "v", code: "KeyV"});
+     });
+ 
+     // The new content should now include an image.
+     Assert.equal(main.innerHTML, '<i>Italic</i> <img id="img" tabindex="1" ' +
+       'src="http://example.org/browser/browser/base/content/test/general/moz.png">' +
+       "Test <b>Bold</b> After<b></b>", "Paste after copy image");
+   });
+ 
++  browser.messageManager.removeMessageListener("Test:SendKey", sendKey);
++
+   gBrowser.removeCurrentTab();
+ });
+ 
+diff --git a/browser/components/sessionstore/test/browser_formdata.js b/browser/components/sessionstore/test/browser_formdata.js
+--- a/browser/components/sessionstore/test/browser_formdata.js
++++ b/browser/components/sessionstore/test/browser_formdata.js
+@@ -98,28 +98,28 @@ add_task(async function test_url_check()
+  */
+ add_task(async function test_nested() {
+   const URL = "data:text/html;charset=utf-8," +
+               "<iframe src='data:text/html;charset=utf-8," +
+               "<input autofocus=true>'/>";
+ 
+   const FORM_DATA = {
+     children: [{
+-      xpath: {"/xhtml:html/xhtml:body/xhtml:input": "M"},
++      xpath: {"/xhtml:html/xhtml:body/xhtml:input": "m"},
+       url: "data:text/html;charset=utf-8,<input autofocus=true>"
+     }]
+   };
+ 
+   // Create a tab with an iframe containing an input field.
+   let tab = gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser, URL);
+   let browser = tab.linkedBrowser;
+   await promiseBrowserLoaded(browser);
+ 
+   // Modify the input field's value.
+-  await sendMessage(browser, "ss-test:sendKeyEvent", {key: "m", frame: 0});
++  await BrowserTestUtils.synthesizeKey("m", {code: "KeyM"}, browser);
+ 
+   // Remove the tab and check that we stored form data correctly.
+   await promiseRemoveTabAndSessionState(tab);
+   let [{state: {formdata}}] = JSON.parse(ss.getClosedTabData(window));
+   is(JSON.stringify(formdata), JSON.stringify(FORM_DATA),
+     "formdata for iframe stored correctly");
+ 
+   // Restore the closed tab.
+@@ -146,38 +146,38 @@ add_task(async function test_design_mode
+               "<script>document.designMode='on'</script>";
+ 
+   // Load a tab with an editable document.
+   let tab = gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser, URL);
+   let browser = tab.linkedBrowser;
+   await promiseBrowserLoaded(browser);
+ 
+   // Modify the document content.
+-  await sendMessage(browser, "ss-test:sendKeyEvent", {key: "m"});
++  await BrowserTestUtils.synthesizeKey("m", {code: "KeyM"}, browser);
+ 
+   // Close and restore the tab.
+   await promiseRemoveTabAndSessionState(tab);
+   tab = ss.undoCloseTab(window, 0);
+   browser = tab.linkedBrowser;
+   await promiseTabRestored(tab);
+ 
+   // Check that the innerHTML value was restored.
+   let html = await getInnerHTML(browser);
+-  let expected = "<h1>Mmozilla</h1><script>document.designMode='on'</script>";
++  let expected = "<h1>mmozilla</h1><script>document.designMode='on'</script>";
+   is(html, expected, "editable document has been restored correctly");
+ 
+   // Close and restore the tab.
+   await promiseRemoveTabAndSessionState(tab);
+   tab = ss.undoCloseTab(window, 0);
+   browser = tab.linkedBrowser;
+   await promiseTabRestored(tab);
+ 
+   // Check that the innerHTML value was restored.
+   html = await getInnerHTML(browser);
+-  expected = "<h1>Mmozilla</h1><script>document.designMode='on'</script>";
++  expected = "<h1>mmozilla</h1><script>document.designMode='on'</script>";
+   is(html, expected, "editable document has been restored correctly");
+ 
+   // Cleanup.
+   gBrowser.removeTab(tab);
+ });
+ 
+ function getInputValue(browser, id) {
+   return sendMessage(browser, "ss-test:getInputValue", {id});
+diff --git a/browser/components/sessionstore/test/content-forms.js b/browser/components/sessionstore/test/content-forms.js
+--- a/browser/components/sessionstore/test/content-forms.js
++++ b/browser/components/sessionstore/test/content-forms.js
+@@ -43,33 +43,16 @@ function dispatchUIEvent(input, type) {
+ }
+ 
+ function defineListener(type, cb) {
+   addMessageListener("ss-test:" + type, function({data}) {
+     sendAsyncMessage("ss-test:" + type, cb(data));
+   });
+ }
+ 
+-defineListener("sendKeyEvent", function(data) {
+-  let frame = content;
+-  if (data.hasOwnProperty("frame")) {
+-    frame = content.frames[data.frame];
+-  }
+-
+-  let ifreq = frame.QueryInterface(Ci.nsIInterfaceRequestor);
+-  let utils = ifreq.getInterface(Ci.nsIDOMWindowUtils);
+-
+-  let keyCode = data.key.charCodeAt(0);
+-  let charCode = Ci.nsIDOMKeyEvent.DOM_VK_A + keyCode - "a".charCodeAt(0);
+-
+-  utils.sendKeyEvent("keydown", keyCode, charCode, null);
+-  utils.sendKeyEvent("keypress", keyCode, charCode, null);
+-  utils.sendKeyEvent("keyup", keyCode, charCode, null);
+-});
+-
+ defineListener("getInnerHTML", function(data) {
+   return queryElement(data).innerHTML;
+ });
+ 
+ defineListener("getTextContent", function(data) {
+   return queryElement(data).textContent;
+ });
+ 
+diff --git a/browser/extensions/formautofill/test/mochitest/formautofill_common.js b/browser/extensions/formautofill/test/mochitest/formautofill_common.js
+--- a/browser/extensions/formautofill/test/mochitest/formautofill_common.js
++++ b/browser/extensions/formautofill/test/mochitest/formautofill_common.js
+@@ -1,9 +1,10 @@
+ /* import-globals-from ../../../../../testing/mochitest/tests/SimpleTest/SimpleTest.js */
++/* import-globals-from ../../../../../testing/mochitest/tests/SimpleTest/EventUtils.js */
+ /* import-globals-from ../../../../../toolkit/components/satchel/test/satchel_common.js */
+ /* eslint-disable no-unused-vars */
+ 
+ "use strict";
+ 
+ let formFillChromeScript;
+ let defaultTextColor;
+ let expectingPopup = null;
+@@ -112,18 +113,18 @@ function triggerAutofillAndCheckProfile(
+     const expectingEvent = document.activeElement == element ? "DOMAutoComplete" : "change";
+     const checkFieldAutofilled = Promise.all([
+       new Promise(resolve => element.addEventListener("input", resolve, {once: true})),
+       new Promise(resolve => element.addEventListener(expectingEvent, resolve, {once: true})),
+     ]).then(() => checkFieldValue(element, value));
+ 
+     promises.push(checkFieldAutofilled);
+   }
+-  // Press return key and trigger form autofill.
+-  doKey("return");
++  // Press Enter key and trigger form autofill.
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+ 
+   return Promise.all(promises);
+ }
+ 
+ async function onStorageChanged(type) {
+   info(`expecting the storage changed: ${type}`);
+   return new Promise(resolve => {
+     formFillChromeScript.addMessageListener("formautofill-storage-changed", function onChanged(data) {
+@@ -237,20 +238,20 @@ function popupShownListener() {
+ }
+ 
+ function initPopupListener() {
+   registerPopupShownListener(popupShownListener);
+ }
+ 
+ async function triggerPopupAndHoverItem(fieldSelector, selectIndex) {
+   await focusAndWaitForFieldsIdentified(fieldSelector);
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   await expectPopup();
+   for (let i = 0; i <= selectIndex; i++) {
+-    doKey("down");
++    synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   }
+   await notifySelectedIndex(selectIndex);
+ }
+ 
+ function formAutoFillCommonSetup() {
+   let chromeURL = SimpleTest.getTestFileURL("formautofill_parent_utils.js");
+   formFillChromeScript = SpecialPowers.loadChromeScript(chromeURL);
+   formFillChromeScript.addMessageListener("onpopupshown", ({results}) => {
+diff --git a/browser/extensions/formautofill/test/mochitest/test_autofocus_form.html b/browser/extensions/formautofill/test/mochitest/test_autofocus_form.html
+--- a/browser/extensions/formautofill/test/mochitest/test_autofocus_form.html
++++ b/browser/extensions/formautofill/test/mochitest/test_autofocus_form.html
+@@ -1,14 +1,15 @@
+ <!DOCTYPE HTML>
+ <html>
+ <head>
+   <meta charset="utf-8">
+   <title>Test basic autofill</title>
+   <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
++  <script type="text/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
+   <script type="text/javascript" src="/tests/SimpleTest/SpawnTask.js"></script>
+   <script type="text/javascript" src="formautofill_common.js"></script>
+   <script type="text/javascript" src="satchel_common.js"></script>
+   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ </head>
+ <body>
+ Form autofill test: autocomplete on an autofocus form
+ 
+@@ -33,17 +34,17 @@ initPopupListener();
+ 
+ async function setupAddressStorage() {
+   await addAddress(MOCK_STORAGE[0]);
+   await addAddress(MOCK_STORAGE[1]);
+ }
+ 
+ add_task(async function check_autocomplete_on_autofocus_field() {
+   await setupAddressStorage();
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   await expectPopup();
+   checkMenuEntries(MOCK_STORAGE.map(address =>
+     JSON.stringify({primary: address.organization, secondary: address["street-address"]})
+   ));
+ });
+ 
+ </script>
+ 
+diff --git a/browser/extensions/formautofill/test/mochitest/test_basic_autocomplete_form.html b/browser/extensions/formautofill/test/mochitest/test_basic_autocomplete_form.html
+--- a/browser/extensions/formautofill/test/mochitest/test_basic_autocomplete_form.html
++++ b/browser/extensions/formautofill/test/mochitest/test_basic_autocomplete_form.html
+@@ -1,14 +1,15 @@
+ <!DOCTYPE HTML>
+ <html>
+ <head>
+   <meta charset="utf-8">
+   <title>Test basic autofill</title>
+   <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
++  <script type="text/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
+   <script type="text/javascript" src="/tests/SimpleTest/SpawnTask.js"></script>
+   <script type="text/javascript" src="formautofill_common.js"></script>
+   <script type="text/javascript" src="satchel_common.js"></script>
+   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ </head>
+ <body>
+ Form autofill test: simple form address autofill
+ 
+@@ -48,134 +49,134 @@ async function setupFormHistory() {
+ 
+ initPopupListener();
+ 
+ // Form with history only.
+ add_task(async function history_only_menu_checking() {
+   await setupFormHistory();
+ 
+   await setInput("#tel", "");
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   await expectPopup();
+   checkMenuEntries(["+1234567890"], false);
+ });
+ 
+ // Display history search result if less than 3 inputs are covered by all saved
+ // fields in the storage.
+ add_task(async function all_saved_fields_less_than_threshold() {
+   await addAddress({
+     email: "test@test.com",
+   });
+ 
+   await setInput("#email", "");
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   await expectPopup();
+   checkMenuEntries(["foo@mozilla.com"], false);
+ 
+   await cleanUpAddresses();
+ });
+ 
+ // Form with both history and address storage.
+ add_task(async function check_menu_when_both_existed() {
+   await setupAddressStorage();
+ 
+   await setInput("#organization", "");
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   await expectPopup();
+   checkMenuEntries(MOCK_STORAGE.map(address =>
+     JSON.stringify({
+       primary: address.organization,
+       secondary: FormAutofillUtils.toOneLineAddress(address["street-address"]),
+     })
+   ));
+ 
+   await setInput("#street-address", "");
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   await expectPopup();
+   checkMenuEntries(MOCK_STORAGE.map(address =>
+     JSON.stringify({
+       primary: FormAutofillUtils.toOneLineAddress(address["street-address"]),
+       secondary: address.organization,
+     })
+   ));
+ 
+   await setInput("#tel", "");
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   await expectPopup();
+   checkMenuEntries(MOCK_STORAGE.map(address =>
+     JSON.stringify({
+       primary: address.tel,
+       secondary: FormAutofillUtils.toOneLineAddress(address["street-address"]),
+     })
+   ));
+ 
+   await setInput("#address-line1", "");
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   await expectPopup();
+   checkMenuEntries(MOCK_STORAGE.map(address =>
+     JSON.stringify({
+       primary: FormAutofillUtils.toOneLineAddress(address["street-address"]),
+       secondary: address.organization,
+     })
+   ));
+ });
+ 
+ // Display history search result if no matched data in addresses.
+ add_task(async function check_fallback_for_mismatched_field() {
+   await setInput("#email", "");
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   await expectPopup();
+   checkMenuEntries(["foo@mozilla.com"], false);
+ });
+ 
+ // Display history search result if address autofill is disabled.
+ add_task(async function check_search_result_for_pref_off() {
+   await SpecialPowers.pushPrefEnv({
+     set: [["extensions.formautofill.addresses.enabled", false]],
+   });
+ 
+   await setInput("#tel", "");
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   await expectPopup();
+   checkMenuEntries(["+1234567890"], false);
+ 
+   await SpecialPowers.popPrefEnv();
+ });
+ 
+ // Autofill the address from dropdown menu.
+ add_task(async function check_fields_after_form_autofill() {
+   const focusedInput = await setInput("#organization", "Moz");
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   await expectPopup();
+   checkMenuEntries(MOCK_STORAGE.map(address =>
+     JSON.stringify({
+       primary: address.organization,
+       secondary: FormAutofillUtils.toOneLineAddress(address["street-address"]),
+     })
+   ).slice(1));
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   await triggerAutofillAndCheckProfile(MOCK_STORAGE[1]);
+-  doKey("escape");
++  synthesizeKey("KEY_Escape", {code: "Escape"});
+   is(focusedInput.value, "Mozilla", "Filled field shouldn't be reverted by ESC key");
+ });
+ 
+ // Fallback to history search after autofill address.
+ add_task(async function check_fallback_after_form_autofill() {
+   await setInput("#tel", "", true);
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   await expectPopup();
+   checkMenuEntries(["+1234567890"], false);
+ });
+ 
+ // Resume form autofill once all the autofilled fileds are changed.
+ add_task(async function check_form_autofill_resume() {
+   document.querySelector("#tel").blur();
+   document.querySelector("#form1").reset();
+   await setInput("#tel", "");
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   await expectPopup();
+   checkMenuEntries(MOCK_STORAGE.map(address =>
+     JSON.stringify({
+       primary: address.tel,
+       secondary: FormAutofillUtils.toOneLineAddress(address["street-address"]),
+     })
+   ));
+ });
+diff --git a/browser/extensions/formautofill/test/mochitest/test_basic_creditcard_autocomplete_form.html b/browser/extensions/formautofill/test/mochitest/test_basic_creditcard_autocomplete_form.html
+--- a/browser/extensions/formautofill/test/mochitest/test_basic_creditcard_autocomplete_form.html
++++ b/browser/extensions/formautofill/test/mochitest/test_basic_creditcard_autocomplete_form.html
+@@ -1,14 +1,15 @@
+ <!DOCTYPE HTML>
+ <html>
+ <head>
+   <meta charset="utf-8">
+   <title>Test basic autofill</title>
+   <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
++  <script type="text/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
+   <script type="text/javascript" src="/tests/SimpleTest/SpawnTask.js"></script>
+   <script type="text/javascript" src="formautofill_common.js"></script>
+   <script type="text/javascript" src="satchel_common.js"></script>
+   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ </head>
+ <body>
+ Form autofill test: simple form credit card autofill
+ 
+@@ -56,134 +57,134 @@ add_task(async function history_only_men
+   // timing to start.
+   //
+   // After test process was re-spawning to https scheme. Wait 2 secs
+   // to ensure the environment is ready to do storage setup.
+   await sleep(2000);
+   await setupFormHistory();
+ 
+   await setInput("#cc-exp-year", "");
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   await expectPopup();
+   checkMenuEntries(["2023"], false);
+ });
+ 
+ // Display credit card result even if the number of fillable fields is less than the threshold.
+ add_task(async function all_saved_fields_less_than_threshold() {
+   await addCreditCard(reducedMockRecord);
+ 
+   await setInput("#cc-name", "");
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   await expectPopup();
+   checkMenuEntries([reducedMockRecord].map(patchRecordCCNumber).map(cc => JSON.stringify({
+     primary: cc["cc-name"],
+     secondary: cc.ccNumberFmt.affix + cc.ccNumberFmt.label,
+   })));
+ 
+   await cleanUpCreditCards();
+ });
+ 
+ // Form with both history and credit card storage.
+ add_task(async function check_menu_when_both_existed() {
+   await setupCreditCardStorage();
+ 
+   await setInput("#cc-number", "");
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   await expectPopup();
+   checkMenuEntries(MOCK_STORAGE.map(patchRecordCCNumber).map(cc => JSON.stringify({
+     primaryAffix: cc.ccNumberFmt.affix,
+     primary: cc.ccNumberFmt.label,
+     secondary: cc["cc-name"],
+   })));
+ 
+   await setInput("#cc-name", "");
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   await expectPopup();
+   checkMenuEntries(MOCK_STORAGE.map(patchRecordCCNumber).map(cc => JSON.stringify({
+     primary: cc["cc-name"],
+     secondary: cc.ccNumberFmt.affix + cc.ccNumberFmt.label,
+   })));
+ 
+   await setInput("#cc-exp-year", "");
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   await expectPopup();
+   checkMenuEntries(MOCK_STORAGE.map(patchRecordCCNumber).map(cc => JSON.stringify({
+     primary: cc["cc-exp-year"],
+     secondary: cc.ccNumberFmt.affix + cc.ccNumberFmt.label,
+   })));
+ 
+   await setInput("#cc-exp-month", "");
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   await expectPopup();
+   checkMenuEntries(MOCK_STORAGE.map(patchRecordCCNumber).map(cc => JSON.stringify({
+     primary: cc["cc-exp-month"],
+     secondary: cc.ccNumberFmt.affix + cc.ccNumberFmt.label,
+   })));
+ 
+   await cleanUpCreditCards();
+ });
+ 
+ // Display history search result if no matched data in credit card.
+ add_task(async function check_fallback_for_mismatched_field() {
+   await addCreditCard(reducedMockRecord);
+ 
+   await setInput("#cc-exp-year", "");
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   await expectPopup();
+   checkMenuEntries(["2023"], false);
+ 
+   await cleanUpCreditCards();
+ });
+ 
+ // Display history search result if credit card autofill is disabled.
+ add_task(async function check_search_result_for_pref_off() {
+   await setupCreditCardStorage();
+ 
+   await SpecialPowers.pushPrefEnv({
+     set: [["extensions.formautofill.creditCards.enabled", false]],
+   });
+ 
+   await setInput("#cc-name", "");
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   await expectPopup();
+   checkMenuEntries(["John Smith"], false);
+ 
+   await SpecialPowers.popPrefEnv();
+ });
+ 
+ // Autofill the credit card from dropdown menu.
+ add_task(async function check_fields_after_form_autofill() {
+   await setInput("#cc-exp-year", 202);
+ 
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   await expectPopup();
+   checkMenuEntries(MOCK_STORAGE.slice(1).map(patchRecordCCNumber).map(cc => JSON.stringify({
+     primary: cc["cc-exp-year"],
+     secondary: cc.ccNumberFmt.affix + cc.ccNumberFmt.label,
+   })));
+ 
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   await triggerAutofillAndCheckProfile(MOCK_STORAGE[1]);
+ });
+ 
+ // Fallback to history search after autofill address.
+ add_task(async function check_fallback_after_form_autofill() {
+   await setInput("#cc-name", "", true);
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   await expectPopup();
+   checkMenuEntries(["John Smith"], false);
+ });
+ 
+ // Resume form autofill once all the autofilled fileds are changed.
+ add_task(async function check_form_autofill_resume() {
+   document.querySelector("#cc-name").blur();
+   document.querySelector("#form1").reset();
+ 
+   await setInput("#cc-name", "");
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   await expectPopup();
+   checkMenuEntries(MOCK_STORAGE.map(patchRecordCCNumber).map(cc => JSON.stringify({
+     primary: cc["cc-name"],
+     secondary: cc.ccNumberFmt.affix + cc.ccNumberFmt.label,
+   })));
+ });
+ 
+ </script>
+diff --git a/browser/extensions/formautofill/test/mochitest/test_clear_form.html b/browser/extensions/formautofill/test/mochitest/test_clear_form.html
+--- a/browser/extensions/formautofill/test/mochitest/test_clear_form.html
++++ b/browser/extensions/formautofill/test/mochitest/test_clear_form.html
+@@ -1,14 +1,15 @@
+ <!DOCTYPE HTML>
+ <html>
+ <head>
+   <meta charset="utf-8">
+   <title>Test form autofill - clear form button</title>
+   <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
++  <script type="text/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
+   <script type="text/javascript" src="/tests/SimpleTest/SpawnTask.js"></script>
+   <script type="text/javascript" src="formautofill_common.js"></script>
+   <script type="text/javascript" src="satchel_common.js"></script>
+   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ </head>
+ <body>
+ Form autofill test: clear form button
+ 
+@@ -65,61 +66,61 @@ function checkIsFormCleared(patch = {}) 
+   }
+ }
+ 
+ add_task(async function simple_clear() {
+   await triggerPopupAndHoverItem("#organization", 0);
+   await triggerAutofillAndCheckProfile(MOCK_ADDR_STORAGE[0]);
+ 
+   await triggerPopupAndHoverItem("#tel", 0);
+-  doKey("return");
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   checkIsFormCleared();
+ });
+ 
+ add_task(async function clear_adapted_record() {
+   await triggerPopupAndHoverItem("#street-address", 0);
+   await triggerAutofillAndCheckProfile(MOCK_ADDR_STORAGE[0]);
+ 
+   await triggerPopupAndHoverItem("#street-address", 0);
+-  doKey("return");
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   checkIsFormCleared();
+ });
+ 
+ add_task(async function clear_modified_form() {
+   await triggerPopupAndHoverItem("#organization", 0);
+   await triggerAutofillAndCheckProfile(MOCK_ADDR_STORAGE[0]);
+ 
+   await setInput("#tel", "+1111111111", true);
+ 
+   await triggerPopupAndHoverItem("#street-address", 0);
+-  doKey("return");
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   checkIsFormCleared({tel: "+1111111111"});
+ });
+ 
+ add_task(async function clear_distinct_section() {
+   document.getElementById("form1").reset();
+   await triggerPopupAndHoverItem("#cc-name", 0);
+   await triggerAutofillAndCheckProfile(MOCK_CC_STORAGE[0]);
+ 
+   await triggerPopupAndHoverItem("#organization", 0);
+   await triggerAutofillAndCheckProfile(MOCK_ADDR_STORAGE[0]);
+   await triggerPopupAndHoverItem("#street-address", 0);
+-  doKey("return");
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+ 
+   for (const [id, val] of Object.entries(MOCK_CC_STORAGE[0])) {
+     const element = document.getElementById(id);
+     if (!element) {
+       return;
+     }
+     checkFieldValue(element, val);
+     checkFieldHighlighted(element, true);
+   }
+ 
+   await triggerPopupAndHoverItem("#cc-name", 0);
+-  doKey("return");
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   checkIsFormCleared();
+ });
+ 
+ </script>
+ 
+ <p id="display"></p>
+ 
+ <div id="content">
+diff --git a/browser/extensions/formautofill/test/mochitest/test_creditcard_autocomplete_off.html b/browser/extensions/formautofill/test/mochitest/test_creditcard_autocomplete_off.html
+--- a/browser/extensions/formautofill/test/mochitest/test_creditcard_autocomplete_off.html
++++ b/browser/extensions/formautofill/test/mochitest/test_creditcard_autocomplete_off.html
+@@ -1,14 +1,15 @@
+ <!DOCTYPE HTML>
+ <html>
+ <head>
+   <meta charset="utf-8">
+   <title>Test basic autofill</title>
+   <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
++  <script type="text/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
+   <script type="text/javascript" src="/tests/SimpleTest/SpawnTask.js"></script>
+   <script type="text/javascript" src="formautofill_common.js"></script>
+   <script type="text/javascript" src="satchel_common.js"></script>
+   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ </head>
+ <body>
+ Form autofill test: simple form credit card autofill
+ 
+@@ -45,40 +46,40 @@ async function setupFormHistory() {
+ 
+ initPopupListener();
+ 
+ // Show Form History popup for non-autocomplete="off" field only
+ add_task(async function history_only_menu_checking() {
+   await setupFormHistory();
+ 
+   await setInput("#cc-number", "");
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   await expectPopup();
+   checkMenuEntries(["1234000056780000"], false);
+ 
+   await setInput("#cc-name", "");
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   await notExpectPopup();
+ });
+ 
+ // Show Form Autofill popup for the credit card fields.
+ add_task(async function check_menu_when_both_with_autocomplete_off() {
+   await setupCreditCardStorage();
+ 
+   await setInput("#cc-number", "");
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   await expectPopup();
+   checkMenuEntries(MOCK_STORAGE.map(patchRecordCCNumber).map(cc => JSON.stringify({
+     primaryAffix: cc.ccNumberFmt.affix,
+     primary: cc.ccNumberFmt.label,
+     secondary: cc["cc-name"],
+   })));
+ 
+   await setInput("#cc-name", "");
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   await expectPopup();
+   checkMenuEntries(MOCK_STORAGE.map(patchRecordCCNumber).map(cc => JSON.stringify({
+     primary: cc["cc-name"],
+     secondary: cc.ccNumberFmt.affix + cc.ccNumberFmt.label,
+   })));
+ });
+ 
+ </script>
+diff --git a/browser/extensions/formautofill/test/mochitest/test_form_changes.html b/browser/extensions/formautofill/test/mochitest/test_form_changes.html
+--- a/browser/extensions/formautofill/test/mochitest/test_form_changes.html
++++ b/browser/extensions/formautofill/test/mochitest/test_form_changes.html
+@@ -1,14 +1,15 @@
+ <!DOCTYPE HTML>
+ <html>
+ <head>
+   <meta charset="utf-8">
+   <title>Test basic autofill</title>
+   <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
++  <script type="text/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
+   <script type="text/javascript" src="/tests/SimpleTest/SpawnTask.js"></script>
+   <script type="text/javascript" src="formautofill_common.js"></script>
+   <script type="text/javascript" src="satchel_common.js"></script>
+   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ </head>
+ <body>
+ Form autofill test: autocomplete on an autofocus form
+ 
+@@ -44,38 +45,38 @@ function addInputField(form, className) 
+   newElem.autocomplete = className;
+   newElem.type = "text";
+   form.appendChild(newElem);
+ }
+ 
+ async function checkFormChangeHappened(formId) {
+   info("expecting form changed");
+   await focusAndWaitForFieldsIdentified(`#${formId} input[name=tel]`);
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   await expectPopup();
+   checkMenuEntries(MOCK_STORAGE.map(address =>
+     JSON.stringify({primary: address.tel, secondary: address.name})
+   ));
+ 
+   // This is for checking the changes of element count.
+   addInputField(document.querySelector(`#${formId}`), "address-level2");
+ 
+   await focusAndWaitForFieldsIdentified(`#${formId} input[name=name]`);
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   await expectPopup();
+   checkMenuEntries(MOCK_STORAGE.map(address =>
+     JSON.stringify({primary: address.name, secondary: address["address-level2"]})
+   ));
+ 
+   // This is for checking the changes of element removed and added then.
+   document.querySelector(`#${formId} input[name=address-level2]`).remove();
+   addInputField(document.querySelector(`#${formId}`), "address-level2");
+ 
+   await focusAndWaitForFieldsIdentified(`#${formId} input[name=address-level2]`, true);
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   await expectPopup();
+   checkMenuEntries(MOCK_STORAGE.map(address =>
+     JSON.stringify({primary: address["address-level2"], secondary: address.name})
+   ));
+ }
+ 
+ add_task(async function init_storage() {
+   await setupAddressStorage();
+diff --git a/browser/extensions/formautofill/test/mochitest/test_formautofill_preview_highlight.html b/browser/extensions/formautofill/test/mochitest/test_formautofill_preview_highlight.html
+--- a/browser/extensions/formautofill/test/mochitest/test_formautofill_preview_highlight.html
++++ b/browser/extensions/formautofill/test/mochitest/test_formautofill_preview_highlight.html
+@@ -1,14 +1,15 @@
+ <!DOCTYPE HTML>
+ <html>
+ <head>
+   <meta charset="utf-8">
+   <title>Test form autofill - preview and highlight</title>
+   <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
++  <script type="text/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
+   <script type="text/javascript" src="/tests/SimpleTest/SpawnTask.js"></script>
+   <script type="text/javascript" src="formautofill_common.js"></script>
+   <script type="text/javascript" src="satchel_common.js"></script>
+   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ </head>
+ <body>
+ Form autofill test: preview and highlight
+ 
+@@ -49,32 +50,32 @@ add_task(async function setup_storage() 
+   await addAddress(MOCK_STORAGE[0]);
+   await addAddress(MOCK_STORAGE[1]);
+   await addAddress(MOCK_STORAGE[2]);
+ });
+ 
+ add_task(async function check_preview() {
+   const focusedInput = await setInput("#organization", "");
+ 
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   await expectPopup();
+   checkFormFieldsStyle(null);
+ 
+   for (let i = 0; i < MOCK_STORAGE.length; i++) {
+-    doKey("down");
++    synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+     await notifySelectedIndex(i);
+     checkFormFieldsStyle(MOCK_STORAGE[i]);
+   }
+ 
+   // Navigate to the footer
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   await notifySelectedIndex(MOCK_STORAGE.length);
+   checkFormFieldsStyle(null);
+ 
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   await notifySelectedIndex(-1);
+   checkFormFieldsStyle(null);
+ 
+   focusedInput.blur();
+ });
+ 
+ add_task(async function check_filled_highlight() {
+   await triggerPopupAndHoverItem("#organization", 0);
+diff --git a/browser/extensions/formautofill/test/mochitest/test_multi_locale_CA_address_form.html b/browser/extensions/formautofill/test/mochitest/test_multi_locale_CA_address_form.html
+--- a/browser/extensions/formautofill/test/mochitest/test_multi_locale_CA_address_form.html
++++ b/browser/extensions/formautofill/test/mochitest/test_multi_locale_CA_address_form.html
+@@ -1,14 +1,15 @@
+ <!DOCTYPE HTML>
+ <html>
+ <head>
+   <meta charset="utf-8">
+   <title>Test basic autofill</title>
+   <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
++  <script type="text/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
+   <script type="text/javascript" src="/tests/SimpleTest/SpawnTask.js"></script>
+   <script type="text/javascript" src="formautofill_common.js"></script>
+   <script type="text/javascript" src="satchel_common.js"></script>
+   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ </head>
+ <body>
+ Form autofill test: simple form address autofill
+ 
+@@ -83,69 +84,69 @@ function checkFormFilled(selector, addre
+     } else {
+       let converted = address[prop];
+       if (prop == "street-address") {
+         converted = FormAutofillUtils.toOneLineAddress(converted);
+       }
+       promises.push(...checkElementFilled(element, converted));
+     }
+   }
+-  doKey("return");
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   return Promise.all(promises);
+ }
+ 
+ async function setupAddressStorage() {
+   for (let address of MOCK_STORAGE) {
+     await addAddress(address);
+   }
+ }
+ 
+ initPopupListener();
+ 
+ // Autofill the address with address level 1 code.
+ add_task(async function autofill_with_level1_code() {
+   await setupAddressStorage();
+ 
+   await setInput("#organization-en", "Mozilla Toronto");
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   await expectPopup();
+ 
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   // Replace address level 1 code with full name in English for test result
+   let result = Object.assign({}, MOCK_STORAGE[1], {"address-level1": "Ontario"});
+   await checkFormFilled("#form-en", result);
+ 
+   await setInput("#organization-fr", "Mozilla Vancouver");
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   await expectPopup();
+ 
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   // Replace address level 1 code with full name in French for test result
+   result = Object.assign({}, MOCK_STORAGE[0], {"address-level1": "Colombie-Britannique"});
+   await checkFormFilled("#form-fr", result);
+   document.querySelector("#form-en").reset();
+   document.querySelector("#form-fr").reset();
+ });
+ 
+ // Autofill the address with address level 1 full name.
+ add_task(async function autofill_with_level1_full_name() {
+   await setInput("#organization-en", "ExpoCité");
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   await expectPopup();
+ 
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   // Replace address level 1 code with full name in French for test result
+   let result = Object.assign({}, MOCK_STORAGE[3], {"address-level1": "Quebec"});
+   await checkFormFilled("#form-en", result);
+ 
+   await setInput("#organization-fr", "Prince of Wales Northern Heritage");
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   await expectPopup();
+ 
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   // Replace address level 1 code with full name in English for test result
+   result = Object.assign({}, MOCK_STORAGE[2], {"address-level1": "Territoires du Nord-Ouest"});
+   await checkFormFilled("#form-fr", result);
+ });
+ 
+ </script>
+ 
+ <p id="display"></p>
+diff --git a/browser/extensions/formautofill/test/mochitest/test_multiple_forms.html b/browser/extensions/formautofill/test/mochitest/test_multiple_forms.html
+--- a/browser/extensions/formautofill/test/mochitest/test_multiple_forms.html
++++ b/browser/extensions/formautofill/test/mochitest/test_multiple_forms.html
+@@ -28,29 +28,29 @@ let MOCK_STORAGE = [{
+ initPopupListener();
+ 
+ add_task(async function setupStorage() {
+   await addAddress(MOCK_STORAGE[0]);
+ });
+ 
+ add_task(async function check_switch_form_popup() {
+   await setInput("#additional-name", "");
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   await expectPopup();
+ 
+   // We need an intentional wait here before switching form.
+   await sleep();
+   await setInput("#organization", "");
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   const {open: popupOpen} = await getPopupState();
+   is(popupOpen, false);
+ 
+   await sleep();
+   await setInput("#given-name", "");
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   await expectPopup();
+ });
+ 
+ </script>
+ 
+ <div>
+ 
+   <form>
+diff --git a/browser/extensions/formautofill/test/mochitest/test_on_address_submission.html b/browser/extensions/formautofill/test/mochitest/test_on_address_submission.html
+--- a/browser/extensions/formautofill/test/mochitest/test_on_address_submission.html
++++ b/browser/extensions/formautofill/test/mochitest/test_on_address_submission.html
+@@ -1,14 +1,15 @@
+ <!DOCTYPE HTML>
+ <html>
+ <head>
+   <meta charset="utf-8">
+   <title>Test autofill submit</title>
+   <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
++  <script type="text/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
+   <script type="text/javascript" src="/tests/SimpleTest/SpawnTask.js"></script>
+   <script type="text/javascript" src="formautofill_common.js"></script>
+   <script type="text/javascript" src="satchel_common.js"></script>
+   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ </head>
+ <body>
+ Form autofill test: check if address is saved/updated correctly
+ 
+@@ -69,17 +70,17 @@ add_task(async function check_storage_af
+   addressesInMenu.push(TEST_ADDRESSES[0]);
+ 
+   // let expectedAddresses = TEST_ADDRESSES.slice(0);
+   await onStorageChanged("add");
+   let matching = await checkAddresses(TEST_ADDRESSES);
+   ok(matching, "New address saved as expected");
+ 
+   await setInput("#organization", "");
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   await expectPopup();
+   checkMenuEntries(addressesInMenu.map(address =>
+     JSON.stringify({primary: address.organization, secondary: address["street-address"]})
+   ));
+ });
+ 
+ // Submit another new address that is mergeable.
+ add_task(async function new_address_submitted_and_merged() {
+@@ -104,20 +105,20 @@ add_task(async function new_address_subm
+ // Submit an updated autofill address and merge.
+ add_task(async function check_storage_after_form_submitted() {
+   document.querySelector("form").reset();
+   // Add country to second address in storage
+   await setInput("#country", "US");
+   TEST_ADDRESSES[1].country = "US";
+ 
+   await setInput("#organization", "Moz");
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   await expectPopup();
+-  doKey("down");
+-  doKey("return");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   clickOnElement("input[type=submit]");
+ 
+   let expectedAddresses = TEST_ADDRESSES.slice(0);
+   await onStorageChanged("update");
+   let matching = await checkAddresses(expectedAddresses);
+   ok(matching, "Updated address merged as expected");
+ });
+ 
+diff --git a/dom/events/test/test_bug226361.xhtml b/dom/events/test/test_bug226361.xhtml
+--- a/dom/events/test/test_bug226361.xhtml
++++ b/dom/events/test/test_bug226361.xhtml
+@@ -1,15 +1,16 @@
+ <html xmlns="http://www.w3.org/1999/xhtml">
+ <!--
+ https://bugzilla.mozilla.org/show_bug.cgi?id=226361
+ -->
+ <head>
+   <title>Test for Bug 226361</title>
+   <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
++  <script type="application/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
+   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ </head>
+ <body id="body1">
+ <p id="display">
+ 
+  <a id="b1" tabindex="1" href="http://home.mozilla.org">start</a><br />
+ <br />
+ 
+@@ -32,18 +33,17 @@ https://bugzilla.mozilla.org/show_bug.cg
+ function setTabFocus() {
+   SpecialPowers.pushPrefEnv({ set: [[ "accessibility.tabfocus", 7 ]] }, doTest);
+ }
+ 
+ // =================================
+ 
+ var doc = document;
+ function tab_to(id) {
+-  var wu = SpecialPowers.DOMWindowUtils;
+-  wu.sendKeyEvent('keypress',  9, 0, 0);
++  synthesizeKey("KEY_Tab", {code: "Tab"});
+   is(doc.activeElement.id, id, "element with id=" + id + " should have focus");
+ }
+ 
+ function tab_iframe() {
+   doc = document;
+   tab_to('iframe');
+ 
+   // inside iframe
+diff --git a/dom/events/test/test_bug238987.html b/dom/events/test/test_bug238987.html
+--- a/dom/events/test/test_bug238987.html
++++ b/dom/events/test/test_bug238987.html
+@@ -1,50 +1,51 @@
+ <!DOCTYPE HTML>
+ <html>
+ <!--
+ https://bugzilla.mozilla.org/show_bug.cgi?id=238987
+ -->
+ <head>
+   <title>Test for Bug 238987</title>
+-  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>        
++  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
++  <script type="text/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
+   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ </head>
+ <body>
+ <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=238987">Mozilla Bug 238987</a>
+ <p id="display"></p>
+ <div id="content" style="display: none">
+   
+ </div>
+ <pre id="test">
+ <script class="testbody" type="text/javascript">
+ 
+   /** Test for Bug 238987 **/
+ 
+   var shouldStop = false;
+-  var modifier = 0;
++  var activateShift = false;
+   var expectedResult = "i1,i2,i3,i4,i5,i6,i7,i8,number,i9,i10,i11,i12";
+   var forwardFocusArray = expectedResult.split(",");
+   var backwardFocusArray = expectedResult.split(",");
+   var forwardBlurArray = expectedResult.split(",");
+   var backwardBlurArray = expectedResult.split(",");
+   // Adding 3 for "begin", "end", "begin" and one for the <a> in the Mochitest template,
+   var expectedWindowFocusCount = forwardFocusArray.length + backwardFocusArray.length + 4;
+   // but the last blur event goes to i1, not "begin".
+   var expectedWindowBlurCount = forwardFocusArray.length + backwardFocusArray.length + 3;
+ 
+   function handleFocus(e) {
+     if (e.target.id == "begin") {
+-      // if the modifier is set, the test is coming back from the end.
+-      if (modifier) {
++      // if the activateShift is set, the test is coming back from the end.
++      if (activateShift) {
+         shouldStop = true;
+       }
+     } else if (e.target.id == "end") {
+-      modifier = Ci.nsIDOMEvent.SHIFT_MASK;
+-    } else if (modifier) {
++      activateShift = true;
++    } else if (activateShift) {
+       var expected = backwardFocusArray.pop();
+       ok(expected == e.target.id,
+          "(focus) Backward tabbing, expected [" +
+          expected + "], got [" + e.target.id + "]");
+     } else {
+       var expected = forwardFocusArray.shift();
+       is(e.target, document.activeElement, "Wrong activeElement!");
+       ok(expected == e.target.id,
+@@ -61,17 +62,17 @@ https://bugzilla.mozilla.org/show_bug.cg
+     }
+     ok(e.eventPhase == Ci.nsIDOMEvent.CAPTURING_PHASE,
+        "|window| should not have got a focus event, " + s);
+   }
+ 
+   function handleBlur(e) {
+     if (e.target.id == "begin" || e.target.id == "end") {
+       return;
+-    } else if (modifier) {
++    } else if (activateShift) {
+       var expected = backwardBlurArray.pop();
+       ok(expected == e.target.id,
+          "(blur) backward tabbing, expected [" +
+          expected + "], got [" + e.target.id + "]");
+     } else {
+       var expected = forwardBlurArray.shift();
+       ok(expected == e.target.id,
+          "(blur) forward tabbing, expected [" +
+@@ -85,22 +86,18 @@ https://bugzilla.mozilla.org/show_bug.cg
+     if ("id" in e.target) {
+       s = s + ", id=\"" + e.target.id + "\"";
+     }
+     ok(e.eventPhase == Ci.nsIDOMEvent.CAPTURING_PHASE,
+        "|window| should not have got a blur event, " + s);
+   }
+ 
+   function tab() {
+-    var utils = SpecialPowers.DOMWindowUtils;
+     // Send tab key events.
+-    var key = Ci.nsIDOMKeyEvent.DOM_VK_TAB;
+-    utils.sendKeyEvent("keydown", key, 0, modifier);
+-    utils.sendKeyEvent("keypress", key, 0, modifier);
+-    utils.sendKeyEvent("keyup", key, 0, modifier);
++    synthesizeKey("KEY_Tab", {code: "Tab", shiftKey: activateShift});
+     if (shouldStop) {
+       // Did focus handling succeed
+       is(forwardFocusArray.length, 0,
+          "Not all forward tabbing focus tests were run, " +
+          forwardFocusArray.toString());
+       is(backwardFocusArray.length, 0,
+          "Not all backward tabbing focus tests were run, " +
+          backwardFocusArray.toString());
+diff --git a/dom/events/test/test_bug409604.html b/dom/events/test/test_bug409604.html
+--- a/dom/events/test/test_bug409604.html
++++ b/dom/events/test/test_bug409604.html
+@@ -1,31 +1,30 @@
+ <!DOCTYPE HTML>
+ <html>
+ <!--
+ https://bugzilla.mozilla.org/show_bug.cgi?id=409604
+ -->
+ <head>
+   <title>Test for Bug 409604</title>
+-  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>        
++  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
++  <script type="text/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
+   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ </head>
+ <body id="body">
+ <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=409604">Mozilla Bug 409604</a>
+ <p id="display"></p>
+ <div id="content" style="display: none">
+   
+ </div>
+ <pre id="test">
+ <script class="testbody" type="text/javascript">
+ 
+   /** Test for Bug 409604 **/
+ 
+-  var modifier = SpecialPowers.Ci.nsIDOMEvent.ALT_MASK |
+-                 SpecialPowers.Ci.nsIDOMEvent.SHIFT_MASK;
+   var expectedFocus = "a,c,d,e,f,g,h,i,j,k,l,m,n,p,x,y";
+   // XXX the "map" test is causing trouble, see bug 433089
+   var focusArray = expectedFocus.split(",");
+   var unfocusableElementId = "invalid";
+   var unfocusableTags = [
+       {tag: "abbr", content: "text", attribs: {title: "something"}},
+       {tag: "acronym", content: "text", attribs: {title: "something"}},
+       {tag: "address", content: "text"},
+@@ -115,28 +114,26 @@ https://bugzilla.mozilla.org/show_bug.cg
+ 
+   function handleInvalid(e) {
+     ok("accessKey" in e, "(invalid) accesskey property not found on element");
+     ok(false, "(invalid) accesskey should not have any effect on this element: " +
+        e.localName);
+   }
+ 
+   function pressAccessKey(key) {
+-    var utils = SpecialPowers.DOMWindowUtils;
+-    utils.sendKeyEvent("keydown", key, key, modifier);
+-    utils.sendKeyEvent("keypress", key, key, modifier);
+-    utils.sendKeyEvent("keyup", key, key, modifier);
++    synthesizeKey(key.key, {code: key.code, altKey: true, shiftKey: true});
+   }
+ 
+   function testFocusableElements() {
+     for (var code = "a".charCodeAt(0); code <= "y".charCodeAt(0); ++ code) {
+       // XXX the "map" test is causing trouble, see bug 433089
+       if (code == "b".charCodeAt(0))
+         continue;
+-      pressAccessKey(code);
++      var accessChar = String.fromCharCode(code).toUpperCase();
++      pressAccessKey({key: accessChar, code: "Key" + accessChar});
+     }
+     ok(focusArray.length == 0, "(focus) unhandled elements remaining: " + focusArray.join(","));
+   }
+ 
+   function createUnfocusableElement(elem, accesskey) {
+     ok("tag" in elem, "invalid object passed to createUnfocusableElement: " + elem.toString());
+     var e = document.createElement(elem.tag);
+     if ("content" in elem) {
+@@ -185,26 +182,26 @@ https://bugzilla.mozilla.org/show_bug.cg
+     el.remove();
+     ok(document.getElementById(unfocusableElementId) == null, "unfocusable element not properly removed");
+   }
+ 
+   function testUnfocusableElements() {
+     var i, e;
+     for (i = 0; i < unfocusableTags.length; ++ i) {
+       createUnfocusableElement(unfocusableTags[i], "z");
+-      pressAccessKey("z".charCodeAt(0));
++      pressAccessKey({key: "Z", code:"KeyZ"});
+       destroyUnfocusableElement();
+     }
+     for (i = 0; i < invalidElements.length; ++ i) {
+       e = document.getElementById(invalidElements[i]);
+       ok(e != null, "element with ID " + invalidElements[i] + " not found");
+       e.setAttribute("accesskey", "z");
+       e.setAttribute("onclick", "handleClick(event.target); event.preventDefault();");
+       e.setAttribute("onfocus", "handleInvalid(event.target);");
+-      pressAccessKey("z".charCodeAt(0));
++      pressAccessKey({key: "Z", code:"KeyZ"});
+       e.removeAttribute("accesskey");
+       e.removeAttribute("onclick");
+       e.removeAttribute("onfocus");
+     }
+   }
+ 
+   function start() {
+     testFocusableElements();
+diff --git a/dom/events/test/test_bug450876.html b/dom/events/test/test_bug450876.html
+--- a/dom/events/test/test_bug450876.html
++++ b/dom/events/test/test_bug450876.html
+@@ -1,15 +1,16 @@
+ <html>
+ <!--
+ https://bugzilla.mozilla.org/show_bug.cgi?id=450876
+ -->
+ <head>
+   <title>Test for Bug 450876 - Crash [@ nsEventStateManager::GetNextTabbableMapArea] with img usemap and tabindex</title>
+   <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
++  <script type="text/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
+   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ </head>
+ <body>
+ <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=450876">Mozilla Bug 450876</a>
+ <p id="display"><a href="#" id="a">link to focus from</a><img usemap="#a" tabindex="1"></p>
+ <div id="content" style="display: none">
+   
+ </div>
+@@ -19,17 +20,17 @@ https://bugzilla.mozilla.org/show_bug.cg
+ 
+ /** Test for Bug 450876 **/
+ 
+ function doTest() {
+   is(document.activeElement, document.body, "body element should be focused");
+   document.getElementById('a').focus();
+   is(document.activeElement, document.getElementById('a'), "link should have focus");
+   is(document.hasFocus(), true, "document should be focused");
+-  SpecialPowers.DOMWindowUtils.sendKeyEvent('keypress',  9, 0, 0);
++  synthesizeKey("KEY_Tab", {code: "Tab"});
+   is(document.activeElement, document.getElementById('a'), "body element should be focused");
+   is(document.hasFocus(), false, "document should not be focused");
+ 
+   SimpleTest.finish();
+ }
+ 
+ SimpleTest.waitForExplicitFinish();
+ addLoadEvent(doTest);
+diff --git a/dom/events/test/test_bug493251.html b/dom/events/test/test_bug493251.html
+--- a/dom/events/test/test_bug493251.html
++++ b/dom/events/test/test_bug493251.html
+@@ -1,16 +1,17 @@
+ <!DOCTYPE HTML>
+ <html>
+ <!--
+ https://bugzilla.mozilla.org/show_bug.cgi?id=493251
+ -->
+ <head>
+   <title>Test for Bug 493251</title>
+   <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
++  <script type="application/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
+   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ </head>
+ <body>
+ <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=493251">Mozilla Bug 493251</a>
+ <p id="display">
+ </p>
+ <div id="content" style="display: none">
+   
+@@ -31,24 +32,16 @@ https://bugzilla.mozilla.org/show_bug.cg
+   var keyUp = 0;
+ 
+   function suppressEventHandling(aSuppress) {
+     var utils = SpecialPowers.getDOMWindowUtils(win);
+     ok(true, "suppressEventHandling: aSuppress=" + aSuppress);
+     utils.suppressEventHandling(aSuppress);
+   }
+ 
+-  function dispatchKeyEvent(type) {
+-    var utils = SpecialPowers.getDOMWindowUtils(win);
+-    ok(true, "Dipatching key event: type=" + type);
+-    utils.sendKeyEvent(type, 
+-                       SpecialPowers.Ci.nsIDOMKeyEvent.DOM_VK_A,
+-                       0, 0);
+-  }
+-
+   function dispatchMouseEvent(aType, aX, aY, aButton, aClickCount, aModifiers) {
+     var utils = SpecialPowers.getDOMWindowUtils(win);
+     ok(true, "Dipatching mouse event: aType=" + aType + ", aX=" + aX + ", aY" +
+                aY + ", aButton=" + aButton + ", aClickCount=" + aClickCount +
+                ", aModifiers=" + aModifiers);
+     utils.sendMouseEvent(aType, aX, aY, aButton, aClickCount, aModifiers);
+   }
+ 
+@@ -100,45 +93,39 @@ https://bugzilla.mozilla.org/show_bug.cg
+     win.addEventListener("mousedown",
+                          function(e) { dumpEvent(e); ++mouseDown; }, true);
+     win.addEventListener("mouseup",
+                          function(e) { dumpEvent(e); ++mouseUp; }, true);
+     win.addEventListener("click",
+                          function(e) { dumpEvent(e); ++mouseClick; }, true);
+ 
+     ok(true, "doTest #1...");
+-    dispatchKeyEvent("keydown");
+-    dispatchKeyEvent("keypress");
+-    dispatchKeyEvent("keyup");
++    synthesizeKey("a", {code: "KeyA"}, win);
+     is(keyDown, 1, "Wrong number events (1)");
+     is(keyPress, 1, "Wrong number events (2)");
+     is(keyUp, 1, "Wrong number events (3)");
+ 
+     ok(true, "doTest #2...");
+     suppressEventHandling(true);
+-    dispatchKeyEvent("keydown");
+-    dispatchKeyEvent("keypress");
+-    dispatchKeyEvent("keyup");
++    synthesizeKey("a", {code: "KeyA"}, win);
+     is(keyDown, 1, "Wrong number events (4)");
+     is(keyPress, 1, "Wrong number events (5)");
+     is(keyUp, 1, "Wrong number events (6)");
+     suppressEventHandling(false);
+     is(keyDown, 1, "Wrong number events (7)");
+     is(keyPress, 1, "Wrong number events (8)");
+     is(keyUp, 1, "Wrong number events (9)");
+ 
+     setTimeout(continueTest1, 0);
+     }
+ 
+   function continueTest1() {
+     ok(true, "continueTest1...");
+-    dispatchKeyEvent("keydown");
+-    suppressEventHandling(true);
+-    dispatchKeyEvent("keypress");
+-    dispatchKeyEvent("keyup");
++    win.addEventListener("keydown", () => { suppressEventHandling(true); }, {once: true});
++    synthesizeKey("a", {code: "KeyA"}, win);
+     is(keyDown, 2, "Wrong number events (10)");
+     is(keyPress, 1, "Wrong number events (11)");
+     is(keyUp, 1, "Wrong number events (12)");
+     suppressEventHandling(false);
+     setTimeout(continueTest2, 0);
+   }
+ 
+   function continueTest2() {
+diff --git a/dom/events/test/test_bug545268.html b/dom/events/test/test_bug545268.html
+--- a/dom/events/test/test_bug545268.html
++++ b/dom/events/test/test_bug545268.html
+@@ -1,16 +1,17 @@
+ <!DOCTYPE HTML>
+ <html>
+ <!--
+ https://bugzilla.mozilla.org/show_bug.cgi?id=545268
+ -->
+ <head>
+   <title>Test for Bug 545268</title>
+   <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
++  <script type="application/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
+   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ </head>
+ <body>
+ <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=545268">Mozilla Bug 545268</a>
+ <p id="display">
+ </p>
+ <div id="content" style="display: none">
+   
+@@ -28,65 +29,52 @@ https://bugzilla.mozilla.org/show_bug.cg
+   var mouseDown = 0;
+   var mouseUp = 0;
+   var mouseClick = 0;
+ 
+   var keyDown = 0;
+   var keyPress = 0;
+   var keyUp = 0;
+ 
+-  function dispatchKeyEvent(type) {
+-    var utils = SpecialPowers.getDOMWindowUtils(subwin);
+-    utils.sendKeyEvent(type, 
+-                       SpecialPowers.Ci.nsIDOMKeyEvent.DOM_VK_A,
+-                       0, 0);
+-  }
+-
+   function doTest() {
+     var utils = SpecialPowers.getDOMWindowUtils(win);
+     var f = win.document.getElementById("f");
+     subwin = f.contentWindow;
+     subwin.document.getElementsByTagName("input")[0].focus();
+     subwin.addEventListener("keydown", function(e) { ++keyDown; }, true);
+     subwin.addEventListener("keypress", function(e) { ++keyPress; }, true);
+     subwin.addEventListener("keyup", function(e) { ++keyUp; }, true);
+     subwin.addEventListener("mousedown", function(e) { ++mouseDown; }, true);
+     subwin.addEventListener("mouseup", function(e) { ++mouseUp; }, true);
+     subwin.addEventListener("click", function(e) { ++mouseClick; }, true);
+ 
+-    dispatchKeyEvent("keydown");
+-    dispatchKeyEvent("keypress");
+-    dispatchKeyEvent("keyup");
++    synthesizeKey("a", {code: "KeyA"}, subwin);
+     is(keyDown, 1, "Wrong number events (1)");
+     is(keyPress, 1, "Wrong number events (2)");
+     is(keyUp, 1, "Wrong number events (3)");
+ 
+     // Test that suppressing events on the parent window prevents key
+     // events in the subdocument window
+     utils.suppressEventHandling(true);
+-    dispatchKeyEvent("keydown");
+-    dispatchKeyEvent("keypress");
+-    dispatchKeyEvent("keyup");
++    synthesizeKey("a", {code: "KeyA"}, subwin);
+     is(keyDown, 1, "Wrong number events (4)");
+     is(keyPress, 1, "Wrong number events (5)");
+     is(keyUp, 1, "Wrong number events (6)");
+     utils.suppressEventHandling(false);
+     is(keyDown, 1, "Wrong number events (7)");
+     is(keyPress, 1, "Wrong number events (8)");
+     is(keyUp, 1, "Wrong number events (9)");
+ 
+     setTimeout(continueTest1, 0);
+     }
+ 
+   function continueTest1() {
+     var utils = SpecialPowers.getDOMWindowUtils(win);
+-    dispatchKeyEvent("keydown");
+-    utils.suppressEventHandling(true);
+-    dispatchKeyEvent("keypress");
+-    dispatchKeyEvent("keyup");
++    subwin.addEventListener("keydown", () => { utils.suppressEventHandling(true); }, {once: true});
++    synthesizeKey("a", {code: "KeyA"}, subwin);
+     is(keyDown, 2, "Wrong number events (10)");
+     is(keyPress, 1, "Wrong number events (11)");
+     is(keyUp, 1, "Wrong number events (12)");
+     utils.suppressEventHandling(false);
+     setTimeout(continueTest2, 0);
+   }
+ 
+   function continueTest2() {
+diff --git a/layout/forms/test/test_bug348236.html b/layout/forms/test/test_bug348236.html
+--- a/layout/forms/test/test_bug348236.html
++++ b/layout/forms/test/test_bug348236.html
+@@ -2,16 +2,17 @@
+ <html>
+ <!--
+ https://bugzilla.mozilla.org/show_bug.cgi?id=348236
+ -->
+ <head>
+ 
+   <title>Test for Bug 348236</title>
+   <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
++  <script type="text/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
+   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+   <style type="text/css">
+   #eSelect {
+     position: fixed; top:0; left: 350px; font-size: 24px; width: 100px
+   }
+   #eSelect option {
+     margin: 0; padding: 0; height: 24px
+   }
+@@ -36,45 +37,41 @@ https://bugzilla.mozilla.org/show_bug.cg
+ SimpleTest.waitForExplicitFinish()
+ addLoadEvent(function test() {
+ 
+     var
+         CI = SpecialPowers.Components.interfaces,
+         WinUtils = SpecialPowers.getDOMWindowUtils(window),
+         sec = netscape.security,
+         eSelect = $("eSelect"),
+-        IDOMEvent = CI.nsIDOMEvent,
+-        IDOMKeyEvent = CI.nsIDOMKeyEvent,
+         timeout = 0 // Choose a larger value like 500 ms if you want to see what's happening.
+ 
+-    function keypressOnSelect(key, modifiers) {
++    function keypressOnSelect(key) {
+         WinUtils.focus(eSelect)
+-        WinUtils.sendKeyEvent("keyup", key, 0, modifiers)
+-        WinUtils.sendKeyEvent("keypress", key, 0, modifiers)
+-        WinUtils.sendKeyEvent("keydown", key, 0, modifiers)
++        synthesizeKey(key.key, {code: key.code, altKey: key.altKey});
+     }
+ 
+-    function testKey(key, modifiers, keyString, functionToContinue) {
++    function testKey(key, keyString, functionToContinue) {
+         var selectGotClick
+         function clickListener() { selectGotClick = true }
+         eSelect.selectedIndex = 0
+         eSelect.onchangeCount = 0
+ 
+         // Drop the SELECT down.
+-        keypressOnSelect(key, modifiers)
++        keypressOnSelect(key)
+         // This timeout and the following are necessary to let the sent events take effect.
+         setTimeout(cont1, timeout)
+         function cont1() {
+             // Move the mouse over option 3 (90 = 3 (rows) * 24 (row height) + 18).
+             WinUtils.sendMouseEvent("mousemove", 355, 92, 0, 0, 0, true)
+             setTimeout(cont2, timeout)
+         }
+         function cont2() {
+             // Close the select.
+-            keypressOnSelect(key, modifiers)
++            keypressOnSelect(key)
+             setTimeout(cont3, timeout)
+         }
+         function cont3() {
+             is(eSelect.value, "3", "Select's value should be 3 after hovering over option 3 and pressing " + keyString + ".")
+             is(eSelect.onchangeCount, 1, "Onchange should have fired once.")
+ 
+             // Simulate click on area to the left of the select.
+             eSelect.addEventListener("click", clickListener, true)
+@@ -91,29 +88,29 @@ addLoadEvent(function test() {
+     }
+ 
+ 
+     // Quick sanity checks.
+     is(eSelect.value, "1", "SELECT value should be 1 after load.")
+     is(eSelect.selectedIndex, 0, "SELECT selectedIndex should be 0 after load.")
+ 
+     // Check if sending key events works.
+-    keypressOnSelect(IDOMKeyEvent.DOM_VK_DOWN, 0)
++    keypressOnSelect({key: "KEY_ArrowDown", code: "ArrowDown"});
+     is(eSelect.value, "2", "SELECT value should be 2 after pressing Down.")
+       
+     // Test ALT-Down.
+-    testKey(IDOMKeyEvent.DOM_VK_DOWN, IDOMEvent.ALT_MASK, "ALT-Down", nextKey1)
++    testKey({key: "KEY_ArrowDown", code: "ArrowDown", altKey: true}, "ALT-Down", nextKey1)
+     function nextKey1() {
+         // Test ALT-Up.
+-        testKey(IDOMKeyEvent.DOM_VK_UP, IDOMEvent.ALT_MASK, "ALT-Up", nextKey2)
++        testKey({key: "KEY_ArrowUp", code: "ArrowUp", altKey: true}, "ALT-Up", nextKey2)
+     }
+     function nextKey2() {
+-        // Test the F4 key on OS/2 and Windows.
+-        if (/OS\/2|Win/i.test(navigator.platform))
+-            testKey(IDOMKeyEvent.DOM_VK_F4, 0, "F4", finished)
++        // Test the F4 key on Windows.
++        if (/Win/i.test(navigator.platform))
++            testKey({key: "KEY_F4", code: "F4"}, "F4", finished)
+         else
+             finished()
+     }
+     function finished() {
+     // Reset value to get the expected value if we reload the page.
+         eSelect.selectedIndex = 0
+         SimpleTest.finish()
+     }
+diff --git a/layout/forms/test/test_bug411236.html b/layout/forms/test/test_bug411236.html
+--- a/layout/forms/test/test_bug411236.html
++++ b/layout/forms/test/test_bug411236.html
+@@ -1,16 +1,17 @@
+ <!DOCTYPE HTML>
+ <html>
+ <!--
+ https://bugzilla.mozilla.org/show_bug.cgi?id=411236
+ -->
+ <head>
+   <title>Test for Bug 411236</title>
+   <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
++  <script type="text/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
+   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ </head>
+ <body>
+ <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=411236">Mozilla Bug 411236</a>
+ <p id="display"></p>
+ <div id="content">
+   <input type="file" onfocus="window.oTarget = event.originalTarget;"
+          onclick="window.fileInputGotClick = true; return false;"
+@@ -19,31 +20,22 @@ https://bugzilla.mozilla.org/show_bug.cg
+ <pre id="test">
+ <script class="testbody" type="text/javascript">
+ 
+ /** Test for Bug 411236 **/
+ 
+ window.oTarget = null;
+ window.fileInputGotClick = false;
+ 
+-function tab() {
+-  var utils = SpecialPowers.DOMWindowUtils;
+-  // Send tab key events.
+-  var key = SpecialPowers.Ci.nsIDOMKeyEvent.DOM_VK_TAB;
+-  utils.sendKeyEvent("keydown", key, 0, 0);
+-  utils.sendKeyEvent("keypress", key, 0, 0);
+-  utils.sendKeyEvent("keyup", key, 0, 0);
+-}
+-
+ function test() {
+   // Try to find the 'Browse...' using tabbing.
+   var i = 0;
+   while (!window.oTarget && i < 100) {
+     ++i;
+-    tab();
++    synthesizeKey("KEY_Tab", {code: "Tab"});
+   }
+ 
+   if (i >= 100) {
+     ok(false, "Couldn't find an input element!");
+     SimpleTest.finish();
+     return;
+   }
+ 
+diff --git a/layout/style/test/test_flexbox_focus_order.html b/layout/style/test/test_flexbox_focus_order.html
+--- a/layout/style/test/test_flexbox_focus_order.html
++++ b/layout/style/test/test_flexbox_focus_order.html
+@@ -1,16 +1,17 @@
+ <!DOCTYPE html>
+ <html>
+ <!--
+ https://bugzilla.mozilla.org/show_bug.cgi?id=812687
+ -->
+ <head>
+   <title>Test for Bug 812687: focus order of reordered flex items</title>
+   <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
++  <script type="text/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
+   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+   <style>
+     .container { display: flex; }
+ 
+     #focus1 { background: yellow;    }
+     #focus2 { background: lightgray; }
+     #focus3 { background: orange;    }
+     #focus4 { background: lightblue; }
+@@ -37,17 +38,16 @@ https://bugzilla.mozilla.org/show_bug.cg
+ </p>
+ <div id="content" style="display: none"></div>
+ 
+ <pre id="test">
+ <script class="testbody" type="text/javascript">
+ 
+ /** Test for Bug 812687 **/
+ 
+-const gKeyCodeForTab = 9;
+ const gExpectedFocusedIds = [
+   "focus1",
+   "focus2",
+   "focus3",
+   "focus4",
+   "focus5"
+ ];
+ 
+@@ -55,17 +55,17 @@ function doTest() {
+   // First, we focus something just before the flex container:
+   document.getElementById('beforeContainer').focus();
+   is(document.activeElement, document.getElementById('beforeContainer'),
+      "explicitly-focused link should gain focus");
+ 
+   // And then we advance focus across the focusable things in the flex container
+   // and check that we traverse them in the expected order:
+   for (let expectedId of gExpectedFocusedIds) {
+-    SpecialPowers.DOMWindowUtils.sendKeyEvent('keypress', gKeyCodeForTab, 0, 0);
++    synthesizeKey("KEY_Tab", {code: "Tab"});
+     is(document.activeElement, document.getElementById(expectedId),
+        "expecting element '#" + expectedId + "' to be focused");
+   }
+ 
+   SimpleTest.finish();
+ }
+ 
+ // Before we start, we have to bump Mac to make its 'tab'-key focus behavior
+diff --git a/toolkit/components/extensions/test/mochitest/test_chrome_ext_downloads_open.html b/toolkit/components/extensions/test/mochitest/test_chrome_ext_downloads_open.html
+--- a/toolkit/components/extensions/test/mochitest/test_chrome_ext_downloads_open.html
++++ b/toolkit/components/extensions/test/mochitest/test_chrome_ext_downloads_open.html
+@@ -1,14 +1,15 @@
+ <!DOCTYPE HTML>
+ <html>
+ <head>
+   <title>Test for permissions</title>
+   <script src="chrome://mochikit/content/tests/SimpleTest/SpawnTask.js"></script>
+   <script src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
++  <script src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"></script>
+   <script src="chrome://mochikit/content/tests/SimpleTest/ExtensionTestUtils.js"></script>
+   <link rel="stylesheet" href="chrome://mochikit/content/tests/SimpleTest/test.css"/>
+ </head>
+ <body>
+ 
+ <script type="text/javascript">
+ "use strict";
+ 
+@@ -95,18 +96,17 @@ add_task(async function downloads_open_i
+ 
+   let extension = ExtensionTestUtils.loadExtension(extensionData);
+   await extension.startup();
+ 
+   let url = await extension.awaitMessage("ready");
+   let win = window.open(url);
+   await extension.awaitMessage("page-ready");
+ 
+-  let winutils = SpecialPowers.getDOMWindowUtils(win);
+-  winutils.sendKeyEvent("keypress", KeyEvent.DOM_VK_A, 0, 0);
++  synthesizeKey("a", {code: "KeyA"}, win);
+   let result = await extension.awaitMessage("download-open.result");
+ 
+   is(result.success, false, "Opening download fails.");
+   is(result.error, "Invalid download id 10", "The error is informative.");
+ 
+ 
+   await extension.unload();
+ });
+diff --git a/toolkit/components/extensions/test/mochitest/test_chrome_ext_permissions.html b/toolkit/components/extensions/test/mochitest/test_chrome_ext_permissions.html
+--- a/toolkit/components/extensions/test/mochitest/test_chrome_ext_permissions.html
++++ b/toolkit/components/extensions/test/mochitest/test_chrome_ext_permissions.html
+@@ -1,14 +1,15 @@
+ <!DOCTYPE HTML>
+ <html>
+ <head>
+   <title>Test for permissions</title>
+   <script src="chrome://mochikit/content/tests/SimpleTest/SpawnTask.js"></script>
+   <script src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
++  <script src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"></script>
+   <script src="chrome://mochikit/content/tests/SimpleTest/ExtensionTestUtils.js"></script>
+   <link rel="stylesheet" href="chrome://mochikit/content/tests/SimpleTest/test.css"/>
+ </head>
+ <body>
+ 
+ <script type="text/javascript">
+ "use strict";
+ 
+@@ -116,19 +117,17 @@ function makeTest(manifestPermissions, o
+     }
+ 
+     // Making a cross-origin request from a content script should fail
+     if (checkFetch) {
+       result = await testContentScript();
+       is(result, false, "fetch() failed from content script due to lack of host permission");
+     }
+ 
+-    // Request some permissions
+-    let winutils = SpecialPowers.getDOMWindowUtils(win);
+-    winutils.sendKeyEvent("keypress", KeyEvent.DOM_VK_A, 0, 0);
++    synthesizeKey("a", {code: "KeyA"}, win);
+     result = await extension.awaitMessage("request.result");
+     is(result, true, "permissions.request() succeeded");
+ 
+     // Using the cookies API from an extension page should succeed
+     result = await call("set-cookie");
+     is(result.success, true, "setting cookie succeeded");
+ 
+     // Making a cross-origin request from a content script should succeed
+diff --git a/toolkit/components/passwordmgr/test/chrome/subtst_privbrowsing_4.html b/toolkit/components/passwordmgr/test/chrome/subtst_privbrowsing_4.html
+--- a/toolkit/components/passwordmgr/test/chrome/subtst_privbrowsing_4.html
++++ b/toolkit/components/passwordmgr/test/chrome/subtst_privbrowsing_4.html
+@@ -1,13 +1,14 @@
+ <!DOCTYPE html>
+ <html>
+ <head>
+   <meta charset="utf-8">
+   <title>Subtest for Login Manager notifications (private browsing)</title>
++  <script type="text/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
+   <script type="text/javascript" src="pwmgr_common.js"></script>
+ </head>
+ <body>
+ <h2>Subtest 4</h2>
+ <!--
+   Make sure that the user/pass fields have manual filling enabled
+   in private mode.
+ -->
+@@ -15,23 +16,23 @@
+   <input id="user" name="user" type="text">
+   <input id="pass" name="pass" type="password">
+   <button type='submit'>Submit</button>
+ </form>
+ 
+ <script>
+ function startAutocomplete() {
+   userField.focus();
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   setTimeout(submitForm, 100);
+ }
+ 
+ function submitForm() {
+-  doKey("down");
+-  doKey("return");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   setTimeout(function() { form.submit(); }, 100);
+ }
+ 
+ var form      = document.getElementById("form");
+ var userField = document.getElementById("user");
+ 
+ window.addEventListener("message", () => { startAutocomplete(); });
+ 
+diff --git a/toolkit/components/passwordmgr/test/mochitest/test_autocomplete_https_upgrade.html b/toolkit/components/passwordmgr/test/mochitest/test_autocomplete_https_upgrade.html
+--- a/toolkit/components/passwordmgr/test/mochitest/test_autocomplete_https_upgrade.html
++++ b/toolkit/components/passwordmgr/test/mochitest/test_autocomplete_https_upgrade.html
+@@ -50,18 +50,16 @@ runInParent(function addLogins() {
+ 
+ <!-- we presumably can't hide the content for this test. -->
+ <div id="content">
+   <iframe src="https://example.org/tests/toolkit/components/passwordmgr/test/mochitest/form_basic.html"></iframe>
+ </div>
+ 
+ <pre id="test">
+ <script class="testbody" type="text/javascript">
+-const shiftModifier = SpecialPowers.Ci.nsIDOMEvent.SHIFT_MASK;
+-
+ let iframe = SpecialPowers.wrap(document.getElementsByTagName("iframe")[0]);
+ let iframeDoc;
+ let uname;
+ let pword;
+ 
+ // Restore the form to the default state.
+ function restoreForm() {
+   pword.focus();
+@@ -94,123 +92,123 @@ add_task(async function setup() {
+ add_task(async function test_empty_first_entry() {
+   // Make sure initial form is empty.
+   checkACForm("", "");
+   // Trigger autocomplete popup
+   restoreForm();
+   let popupState = await getPopupState();
+   is(popupState.open, false, "Check popup is initially closed");
+   let shownPromise = promiseACShown();
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   let results = await shownPromise;
+   popupState = await getPopupState();
+   is(popupState.selectedIndex, -1, "Check no entries are selected");
+   checkArrayValues(results, ["name", "name1", "name2"], "initial");
+ 
+   // Check first entry
+   let index0Promise = notifySelectedIndex(0);
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   await index0Promise;
+   checkACForm("", ""); // value shouldn't update
+-  doKey("return"); // not "enter"!
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await promiseFormsProcessed();
+   checkACForm("name", "pass");
+ });
+ 
+ add_task(async function test_empty_second_entry() {
+   restoreForm();
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   await shownPromise;
+-  doKey("down"); // first
+-  doKey("down"); // second
+-  doKey("return"); // not "enter"!
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // first
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // second
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await promiseFormsProcessed();
+   checkACForm("name1", "pass1");
+ });
+ 
+ add_task(async function test_search() {
+   restoreForm();
+   let shownPromise = promiseACShown();
+   // We need to blur for the autocomplete controller to notice the forced value below.
+   uname.blur();
+   uname.value = "name";
+   uname.focus();
+   sendChar("1");
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   let results = await shownPromise;
+   checkArrayValues(results, ["name1"], "check result deduping for 'name1'");
+-  doKey("down"); // first
+-  doKey("return"); // not "enter"!
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // first
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await promiseFormsProcessed();
+   checkACForm("name1", "pass1");
+ 
+   let popupState = await getPopupState();
+   is(popupState.open, false, "Check popup is now closed");
+ });
+ 
+ add_task(async function test_delete_first_entry() {
+   restoreForm();
+   uname.focus();
+   let shownPromise = promiseACShown();
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   await shownPromise;
+ 
+   let index0Promise = notifySelectedIndex(0);
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   await index0Promise;
+ 
+   let deletionPromise = promiseStorageChanged(["removeLogin"]);
+   // On OS X, shift-backspace and shift-delete work, just delete does not.
+   // On Win/Linux, shift-backspace does not work, delete and shift-delete do.
+-  doKey("delete", shiftModifier);
++  synthesizeKey("KEY_Delete", {code: "Delete", shiftKey: true});
+   await deletionPromise;
+   checkACForm("", "");
+ 
+   let results = await notifyMenuChanged(2, "name1");
+ 
+   checkArrayValues(results, ["name1", "name2"], "two should remain after deleting the first");
+   let popupState = await getPopupState();
+   is(popupState.open, true, "Check popup stays open after deleting");
+-  doKey("escape");
++  synthesizeKey("KEY_Escape", {code: "Escape"});
+   popupState = await getPopupState();
+   is(popupState.open, false, "Check popup closed upon ESC");
+ });
+ 
+ add_task(async function test_delete_duplicate_entry() {
+   restoreForm();
+   uname.focus();
+   let shownPromise = promiseACShown();
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   await shownPromise;
+ 
+   let index0Promise = notifySelectedIndex(0);
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   await index0Promise;
+ 
+   let deletionPromise = promiseStorageChanged(["removeLogin"]);
+   // On OS X, shift-backspace and shift-delete work, just delete does not.
+   // On Win/Linux, shift-backspace does not work, delete and shift-delete do.
+-  doKey("delete", shiftModifier);
++  synthesizeKey("KEY_Delete", {code: "Delete", shiftKey: true});
+   await deletionPromise;
+   checkACForm("", "");
+ 
+   is(LoginManager.countLogins("http://example.org", "http://example.org", null), 1,
+      "Check that the HTTP login remains");
+   is(LoginManager.countLogins("https://example.org", "https://example.org", null), 0,
+      "Check that the HTTPS login was deleted");
+ 
+   // Two menu items should remain as the HTTPS login should have been deleted but
+   // the HTTP would remain.
+   let results = await notifyMenuChanged(1, "name2");
+ 
+   checkArrayValues(results, ["name2"], "one should remain after deleting the HTTPS name1");
+   let popupState = await getPopupState();
+   is(popupState.open, true, "Check popup stays open after deleting");
+-  doKey("escape");
++  synthesizeKey("KEY_Escape", {code: "Escape"});
+   popupState = await getPopupState();
+   is(popupState.open, false, "Check popup closed upon ESC");
+ });
+ 
+ </script>
+ </pre>
+ </body>
+ </html>
+diff --git a/toolkit/components/passwordmgr/test/mochitest/test_autofocus_js.html b/toolkit/components/passwordmgr/test/mochitest/test_autofocus_js.html
+--- a/toolkit/components/passwordmgr/test/mochitest/test_autofocus_js.html
++++ b/toolkit/components/passwordmgr/test/mochitest/test_autofocus_js.html
+@@ -57,18 +57,18 @@ add_task(async function setup() {
+   iframeDoc = iframe.contentDocument;
+ 
+   SimpleTest.requestFlakyTimeout("Giving a chance for the unexpected popupshown to occur");
+ });
+ 
+ add_task(async function test_initial_focus() {
+   let results = await notifyMenuChanged(2, "name");
+   checkArrayValues(results, ["name", "name1"], "Two results");
+-  doKey("down");
+-  doKey("return");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await promiseFormsProcessed();
+   is(iframeDoc.getElementById("form-basic-password").value, "pass", "Check first password filled");
+   let popupState = await getPopupState();
+   is(popupState.open, false, "Check popup is now closed");
+ });
+ 
+ // This depends on the filling from the previous test.
+ add_task(async function test_not_reopened_if_filled() {
+diff --git a/toolkit/components/passwordmgr/test/mochitest/test_basic_form_autocomplete.html b/toolkit/components/passwordmgr/test/mochitest/test_basic_form_autocomplete.html
+--- a/toolkit/components/passwordmgr/test/mochitest/test_basic_form_autocomplete.html
++++ b/toolkit/components/passwordmgr/test/mochitest/test_basic_form_autocomplete.html
+@@ -178,17 +178,16 @@ var setupScript = runInParent(function s
+ 
+ <pre id="test">
+ <script class="testbody" type="text/javascript">
+ 
+ /** Test for Login Manager: multiple login autocomplete. **/
+ 
+ var uname = $_(1, "uname");
+ var pword = $_(1, "pword");
+-const shiftModifier = SpecialPowers.Ci.nsIDOMEvent.SHIFT_MASK;
+ 
+ // Restore the form to the default state.
+ function restoreForm() {
+   uname.value = "";
+   pword.value = "";
+   uname.focus();
+ }
+ 
+@@ -224,214 +223,214 @@ add_task(async function test_form1_initi
+   is(popupState.open, false, "Check popup is initially closed");
+ });
+ 
+ add_task(async function test_form1_menuitems() {
+   await SimpleTest.promiseFocus(window);
+   // Trigger autocomplete popup
+   restoreForm();
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   let results = await shownPromise;
+ 
+   let popupState = await getPopupState();
+   is(popupState.selectedIndex, -1, "Check no entries are selected upon opening");
+ 
+   let expectedMenuItems = ["tempuser1",
+                            "testuser2",
+                            "testuser3",
+                            "zzzuser4"];
+   checkArrayValues(results, expectedMenuItems, "Check all menuitems are displayed correctly.");
+ 
+   checkACForm("", ""); // value shouldn't update just by selecting
+-  doKey("return"); // not "enter"!
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await spinEventLoop(); // let focus happen
+   checkACForm("", "");
+ });
+ 
+ add_task(async function test_form1_first_entry() {
+   await SimpleTest.promiseFocus(window);
+   // Trigger autocomplete popup
+   restoreForm();
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   await shownPromise;
+ 
+   let popupState = await getPopupState();
+   is(popupState.selectedIndex, -1, "Check no entries are selected upon opening");
+ 
+-  doKey("down"); // first
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // first
+   checkACForm("", ""); // value shouldn't update just by selecting
+-  doKey("return"); // not "enter"!
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await promiseFormsProcessed();
+   checkACForm("tempuser1", "temppass1");
+ });
+ 
+ add_task(async function test_form1_second_entry() {
+   // Trigger autocomplete popup
+   restoreForm();
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   await shownPromise;
+ 
+-  doKey("down"); // first
+-  doKey("down"); // second
+-  doKey("return"); // not "enter"!
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // first
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // second
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await promiseFormsProcessed();
+   checkACForm("testuser2", "testpass2");
+ });
+ 
+ add_task(async function test_form1_third_entry() {
+   // Trigger autocomplete popup
+   restoreForm();
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   await shownPromise;
+ 
+-  doKey("down"); // first
+-  doKey("down"); // second
+-  doKey("down"); // third
+-  doKey("return");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // first
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // second
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // third
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await promiseFormsProcessed();
+   checkACForm("testuser3", "testpass3");
+ });
+ 
+ add_task(async function test_form1_fourth_entry() {
+   // Trigger autocomplete popup
+   restoreForm();
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   await shownPromise;
+ 
+-  doKey("down"); // first
+-  doKey("down"); // second
+-  doKey("down"); // third
+-  doKey("down"); // fourth
+-  doKey("return");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // first
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // second
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // third
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // fourth
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await promiseFormsProcessed();
+   checkACForm("zzzuser4", "zzzpass4");
+ });
+ 
+ add_task(async function test_form1_wraparound_first_entry() {
+   // Trigger autocomplete popup
+   restoreForm();
+   await spinEventLoop(); // let focus happen
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   await shownPromise;
+ 
+-  doKey("down"); // first
+-  doKey("down"); // second
+-  doKey("down"); // third
+-  doKey("down"); // fourth
+-  doKey("down"); // deselects
+-  doKey("down"); // first
+-  doKey("return");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // first
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // second
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // third
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // fourth
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // deselects
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // first
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await promiseFormsProcessed();
+   checkACForm("tempuser1", "temppass1");
+ });
+ 
+ add_task(async function test_form1_wraparound_up_last_entry() {
+   // Trigger autocomplete popup
+   restoreForm();
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   await shownPromise;
+ 
+-  doKey("up"); // last (fourth)
+-  doKey("return");
++  synthesizeKey("KEY_ArrowUp", {code: "ArrowUp"}); // last (fourth)
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await promiseFormsProcessed();
+   checkACForm("zzzuser4", "zzzpass4");
+ });
+ 
+ add_task(async function test_form1_wraparound_down_up_up() {
+   // Trigger autocomplete popup
+   restoreForm();
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   await shownPromise;
+ 
+-  doKey("down"); // select first entry
+-  doKey("up");   // selects nothing!
+-  doKey("up");   // select last entry
+-  doKey("return");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // select first entry
++  synthesizeKey("KEY_ArrowUp", {code: "ArrowUp"}); // selects nothing!
++  synthesizeKey("KEY_ArrowUp", {code: "ArrowUp"}); // select last entry
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await promiseFormsProcessed();
+   checkACForm("zzzuser4", "zzzpass4");
+ });
+ 
+ add_task(async function test_form1_wraparound_up_last() {
+   restoreForm();
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   await shownPromise;
+ 
+-  doKey("down");
+-  doKey("up"); // deselects
+-  doKey("up"); // last entry
+-  doKey("up");
+-  doKey("up");
+-  doKey("up"); // first entry
+-  doKey("up"); // deselects
+-  doKey("up"); // last entry
+-  doKey("return");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++  synthesizeKey("KEY_ArrowUp", {code: "ArrowUp"}); // deselects
++  synthesizeKey("KEY_ArrowUp", {code: "ArrowUp"}); // last entry
++  synthesizeKey("KEY_ArrowUp", {code: "ArrowUp"});
++  synthesizeKey("KEY_ArrowUp", {code: "ArrowUp"});
++  synthesizeKey("KEY_ArrowUp", {code: "ArrowUp"}); // first entry
++  synthesizeKey("KEY_ArrowUp", {code: "ArrowUp"}); // deselects
++  synthesizeKey("KEY_ArrowUp", {code: "ArrowUp"}); // last entry
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await promiseFormsProcessed();
+   checkACForm("zzzuser4", "zzzpass4");
+ });
+ 
+ add_task(async function test_form1_fill_username_without_autofill_right() {
+   restoreForm();
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   await shownPromise;
+ 
+   // Set first entry w/o triggering autocomplete
+-  doKey("down"); // first
+-  doKey("right");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // first
++  synthesizeKey("KEY_ArrowRight", {code: "ArrowRight"});
+   await spinEventLoop();
+   checkACForm("tempuser1", ""); // empty password
+ });
+ 
+ add_task(async function test_form1_fill_username_without_autofill_left() {
+   restoreForm();
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   await shownPromise;
+ 
+   // Set first entry w/o triggering autocomplete
+-  doKey("down"); // first
+-  doKey("left");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // first
++  synthesizeKey("KEY_ArrowLeft", {code: "ArrowLeft"});
+   checkACForm("tempuser1", ""); // empty password
+ });
+ 
+ add_task(async function test_form1_pageup_first() {
+   restoreForm();
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   await shownPromise;
+ 
+   // Check first entry (page up)
+-  doKey("down"); // first
+-  doKey("down"); // second
+-  doKey("page_up"); // first
+-  doKey("return");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // first
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // second
++  synthesizeKey("KEY_PageUp", {code: "PageUp"}); // first
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await promiseFormsProcessed();
+   checkACForm("tempuser1", "temppass1");
+ });
+ 
+ add_task(async function test_form1_pagedown_last() {
+   restoreForm();
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   await shownPromise;
+ 
+   /* test 13 */
+   // Check last entry (page down)
+-  doKey("down"); // first
+-  doKey("page_down"); // last
+-  doKey("return");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // first
++  synthesizeKey("KEY_PageDown", {code: "PageDown"}); // last
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await promiseFormsProcessed();
+   checkACForm("zzzuser4", "zzzpass4");
+ });
+ 
+ add_task(async function test_form1_untrusted_event() {
+   restoreForm();
+   await spinEventLoop();
+ 
+@@ -441,132 +440,132 @@ add_task(async function test_form1_untru
+   sendFakeAutocompleteEvent(uname);
+   await spinEventLoop();
+   checkACForm("zzzuser4", "");
+ });
+ 
+ add_task(async function test_form1_delete() {
+   restoreForm();
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   await shownPromise;
+ 
+   // XXX tried sending character "t" before/during dropdown to test
+   // filtering, but had no luck. Seemed like the character was getting lost.
+   // Setting uname.value didn't seem to work either. This works with a human
+   // driver, so I'm not sure what's up.
+ 
+   // Delete the first entry (of 4), "tempuser1"
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   var numLogins;
+   numLogins = LoginManager.countLogins("http://mochi.test:8888", "http://autocomplete:8888", null);
+   is(numLogins, 5, "Correct number of logins before deleting one");
+ 
+   let countChangedPromise = notifyMenuChanged(3);
+   var deletionPromise = promiseStorageChanged(["removeLogin"]);
+   // On OS X, shift-backspace and shift-delete work, just delete does not.
+   // On Win/Linux, shift-backspace does not work, delete and shift-delete do.
+-  doKey("delete", shiftModifier);
++  synthesizeKey("KEY_Delete", {code: "Delete", shiftKey: true});
+   await deletionPromise;
+ 
+   checkACForm("", "");
+   numLogins = LoginManager.countLogins("http://mochi.test:8888", "http://autocomplete:8888", null);
+   is(numLogins, 4, "Correct number of logins after deleting one");
+   await countChangedPromise;
+-  doKey("return");
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await promiseFormsProcessed();
+   checkACForm("testuser2", "testpass2");
+ });
+ 
+ add_task(async function test_form1_first_after_deletion() {
+   restoreForm();
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   await shownPromise;
+ 
+   // Check the new first entry (of 3)
+-  doKey("down");
+-  doKey("return");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await promiseFormsProcessed();
+   checkACForm("testuser2", "testpass2");
+ });
+ 
+ add_task(async function test_form1_delete_second() {
+   restoreForm();
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   await shownPromise;
+ 
+   // Delete the second entry (of 3), "testuser3"
+-  doKey("down");
+-  doKey("down");
+-  doKey("delete", shiftModifier);
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++  synthesizeKey("KEY_Delete", {code: "Delete", shiftKey: true});
+   checkACForm("", "");
+   numLogins = LoginManager.countLogins("http://mochi.test:8888", "http://autocomplete:8888", null);
+   is(numLogins, 3, "Correct number of logins after deleting one");
+-  doKey("return");
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await promiseFormsProcessed();
+   checkACForm("zzzuser4", "zzzpass4");
+ });
+ 
+ add_task(async function test_form1_first_after_deletion2() {
+   restoreForm();
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   await shownPromise;
+ 
+   // Check the new first entry (of 2)
+-  doKey("down");
+-  doKey("return");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await promiseFormsProcessed();
+   checkACForm("testuser2", "testpass2");
+ });
+ 
+ add_task(async function test_form1_delete_last() {
+   restoreForm();
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   await shownPromise;
+ 
+   /* test 54 */
+   // Delete the last entry (of 2), "zzzuser4"
+-  doKey("down");
+-  doKey("down");
+-  doKey("delete", shiftModifier);
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++  synthesizeKey("KEY_Delete", {code: "Delete", shiftKey: true});
+   checkACForm("", "");
+   numLogins = LoginManager.countLogins("http://mochi.test:8888", "http://autocomplete:8888", null);
+   is(numLogins, 2, "Correct number of logins after deleting one");
+-  doKey("return");
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await promiseFormsProcessed();
+   checkACForm("testuser2", "testpass2");
+ });
+ 
+ add_task(async function test_form1_first_after_3_deletions() {
+   restoreForm();
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   await shownPromise;
+ 
+   // Check the only remaining entry
+-  doKey("down");
+-  doKey("return");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await promiseFormsProcessed();
+   checkACForm("testuser2", "testpass2");
+ });
+ 
+ add_task(async function test_form1_check_only_entry_remaining() {
+   restoreForm();
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   await shownPromise;
+ 
+   /* test 56 */
+   // Delete the only remaining entry, "testuser2"
+-  doKey("down");
+-  doKey("delete", shiftModifier);
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++  synthesizeKey("KEY_Delete", {code: "Delete", shiftKey: true});
+   checkACForm("", "");
+   numLogins = LoginManager.countLogins("http://mochi.test:8888", "http://autocomplete:8888", null);
+   is(numLogins, 1, "Correct number of logins after deleting one");
+ 
+   // remove the login that's not shown in the list.
+   setupScript.sendSyncMessage("removeLogin", "login0");
+ });
+ 
+@@ -574,92 +573,92 @@ add_task(async function test_form1_check
+ add_task(async function test_form2() {
+   // Turn our attention to form2
+   uname = $_(2, "uname");
+   pword = $_(2, "pword");
+   checkACForm("singleuser5", "singlepass5");
+ 
+   restoreForm();
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   await shownPromise;
+ 
+   // Check first entry
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   checkACForm("", ""); // value shouldn't update
+-  doKey("return"); // not "enter"!
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await promiseFormsProcessed();
+   checkACForm("singleuser5", "singlepass5");
+ });
+ 
+ add_task(async function test_form3() {
+   uname = $_(3, "uname");
+   pword = $_(3, "pword");
+   checkACForm("singleuser5", "singlepass5");
+   restoreForm();
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   await shownPromise;
+ 
+   // Check first entry
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   checkACForm("", ""); // value shouldn't update
+-  doKey("return"); // not "enter"!
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await promiseFormsProcessed();
+   checkACForm("singleuser5", "singlepass5");
+ });
+ 
+ add_task(async function test_form4() {
+   uname = $_(4, "uname");
+   pword = $_(4, "pword");
+   checkACForm("singleuser5", "singlepass5");
+   restoreForm();
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   await shownPromise;
+ 
+   // Check first entry
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   checkACForm("", ""); // value shouldn't update
+-  doKey("return"); // not "enter"!
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await promiseFormsProcessed();
+   checkACForm("singleuser5", "singlepass5");
+ });
+ 
+ add_task(async function test_form5() {
+   uname = $_(5, "uname");
+   pword = $_(5, "pword");
+   checkACForm("singleuser5", "singlepass5");
+   restoreForm();
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   await shownPromise;
+ 
+   // Check first entry
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   checkACForm("", ""); // value shouldn't update
+-  doKey("return"); // not "enter"!
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await promiseFormsProcessed();
+   checkACForm("singleuser5", "singlepass5");
+ });
+ 
+ add_task(async function test_form6() {
+   // (this is a control, w/o autocomplete=off, to ensure the login
+   // that was being suppressed would have been filled in otherwise)
+   uname = $_(6, "uname");
+   pword = $_(6, "pword");
+   checkACForm("singleuser5", "singlepass5");
+ });
+ 
+ add_task(async function test_form6_changeUsername() {
+   // Test that the password field remains filled in after changing
+   // the username.
+   uname.focus();
+-  doKey("right");
+-  sendChar("X");
++  synthesizeKey("KEY_ArrowRight", {code: "ArrowRight"});
++  synthesizeKey("X", {code: "KeyX", shiftKey: true});
+   // Trigger the 'blur' event on uname
+   pword.focus();
+   await spinEventLoop();
+   checkACForm("singleuser5X", "singlepass5");
+ 
+   setupScript.sendSyncMessage("removeLogin", "login5");
+ });
+ 
+@@ -680,23 +679,23 @@ add_task(async function test_form7() {
+   // automatically, removing it makes it more likely that we'll catch a
+   // future regression with form filling here.
+   setupScript.sendSyncMessage("removeLogin", "login6B");
+ });
+ 
+ add_task(async function test_form7_2() {
+   restoreForm();
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   await shownPromise;
+ 
+   // Check first entry
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   checkACForm("", ""); // value shouldn't update
+-  doKey("return"); // not "enter"!
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   // The form changes, so we expect the old username field to get the
+   // selected autocomplete value, but neither the new username field nor
+   // the password field should have any values filled in.
+   await spinEventLoop();
+   checkACForm("form7user1", "");
+   is($_(7, "uname2").value, "", "Verifying empty uname2");
+   restoreForm(); // clear field, so reloading test doesn't fail
+ 
+@@ -732,64 +731,64 @@ add_task(async function test_form9_filte
+   pword = $_(9, "pword");
+   uname.focus();
+   let shownPromise = promiseACShown();
+   sendString("form9userAB");
+   await shownPromise;
+ 
+   checkACForm("form9userAB", "");
+   uname.focus();
+-  doKey("left");
++  synthesizeKey("KEY_ArrowLeft", {code: "ArrowLeft"});
+   shownPromise = promiseACShown();
+-  sendChar("A");
++  synthesizeKey("A", {code: "KeyA", shiftKey: true});
+   let results = await shownPromise;
+ 
+   checkACForm("form9userAAB", "");
+   checkArrayValues(results, ["form9userAAB"], "Check dropdown is updated after inserting 'A'");
+-  doKey("down");
+-  doKey("return");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await promiseFormsProcessed();
+   checkACForm("form9userAAB", "form9pass");
+ });
+ 
+ add_task(async function test_form9_autocomplete_cache() {
+   // Note that this addLogin call will only be seen by the autocomplete
+-  // attempt for the sendChar if we do not successfully cache the
++  // attempt for the synthesizeKey if we do not successfully cache the
+   // autocomplete results.
+   setupScript.sendSyncMessage("addLogin", "login8C");
+   uname.focus();
+   let promise0 = notifyMenuChanged(0);
+-  sendChar("z");
++  synthesizeKey("z", {code: "KeyZ"});
+   await promise0;
+   let popupState = await getPopupState();
+   is(popupState.open, false, "Check popup shouldn't open");
+ 
+   // check that empty results are cached - bug 496466
+   promise0 = notifyMenuChanged(0);
+-  sendChar("z");
++  synthesizeKey("z", {code: "KeyZ"});
+   await promise0;
+   popupState = await getPopupState();
+   is(popupState.open, false, "Check popup stays closed due to cached empty result");
+ });
+ 
+ add_task(async function test_form11_formless() {
+   // Test form-less autocomplete
+   uname = $_(11, "uname");
+   pword = $_(11, "pword");
+   restoreForm();
+   checkACForm("", "");
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   await shownPromise;
+ 
+   // Trigger autocomplete
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   checkACForm("", ""); // value shouldn't update
+   let processedPromise = promiseFormsProcessed();
+-  doKey("return"); // not "enter"!
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await processedPromise;
+   checkACForm("testuser", "testpass");
+ });
+ 
+ add_task(async function test_form11_open_on_trusted_focus() {
+   uname = $_(11, "uname");
+   pword = $_(11, "pword");
+   uname.value = "";
+@@ -804,19 +803,19 @@ add_task(async function test_form11_open
+       ok(e.isTrusted, "Ensure event is trusted");
+       resolve();
+     });
+   });
+   const shownPromise = promiseACShown();
+   synthesizeMouseAtCenter(uname, {});
+   await firePrivEventPromise;
+   await shownPromise;
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   const processedPromise = promiseFormsProcessed();
+-  doKey("return"); // not "enter"!
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await processedPromise;
+   checkACForm("testuser", "testpass");
+ });
+ 
+ add_task(async function test_form12_recipes() {
+   await loadRecipes({
+     siteRecipes: [{
+       "hosts": ["mochi.test:8888"],
+@@ -830,31 +829,31 @@ add_task(async function test_form12_reci
+   // First test DOMAutocomplete
+   // Switch the password field to type=password so _fillForm marks the username
+   // field for autocomplete.
+   pword.type = "password";
+   await promiseFormsProcessed();
+   restoreForm();
+   checkACForm("", "");
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   await shownPromise;
+ 
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   checkACForm("", ""); // value shouldn't update
+-  doKey("return"); // not "enter"!
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await promiseFormsProcessed();
+   checkACForm("testuser10", "testpass10");
+ 
+   // Now test recipes with blur on the username field.
+   restoreForm();
+   checkACForm("", "");
+   uname.value = "testuser10";
+   checkACForm("testuser10", "");
+-  doKey("tab");
++  synthesizeKey("KEY_Tab", {code: "Tab"});
+   await promiseFormsProcessed();
+   checkACForm("testuser10", "testpass10");
+   await resetRecipes();
+ });
+ </script>
+ </pre>
+ </body>
+ </html>
+diff --git a/toolkit/components/passwordmgr/test/mochitest/test_case_differences.html b/toolkit/components/passwordmgr/test/mochitest/test_case_differences.html
+--- a/toolkit/components/passwordmgr/test/mochitest/test_case_differences.html
++++ b/toolkit/components/passwordmgr/test/mochitest/test_case_differences.html
+@@ -81,66 +81,66 @@ add_task(async function test_empty_first
+   /* test 1 */
+   // Make sure initial form is empty.
+   checkACForm("", "");
+   // Trigger autocomplete popup
+   restoreForm();
+   let popupState = await getPopupState();
+   is(popupState.open, false, "Check popup is initially closed");
+   let shownPromise = promiseACShown();
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   let results = await shownPromise;
+   popupState = await getPopupState();
+   is(popupState.selectedIndex, -1, "Check no entries are selected");
+   checkArrayValues(results, ["name", "Name", "USER"], "initial");
+ 
+   // Check first entry
+   let index0Promise = notifySelectedIndex(0);
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   await index0Promise;
+   checkACForm("", ""); // value shouldn't update
+-  doKey("return"); // not "enter"!
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await promiseFormsProcessed();
+   checkACForm("name", "pass");
+ });
+ 
+ add_task(async function test_empty_second_entry() {
+   restoreForm();
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   await shownPromise;
+-  doKey("down"); // first
+-  doKey("down"); // second
+-  doKey("return"); // not "enter"!
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // first
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // second
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await promiseFormsProcessed();
+   checkACForm("Name", "Pass");
+ });
+ 
+ add_task(async function test_empty_third_entry() {
+   restoreForm();
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   await shownPromise;
+-  doKey("down"); // first
+-  doKey("down"); // second
+-  doKey("down"); // third
+-  doKey("return");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // first
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // second
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // third
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await promiseFormsProcessed();
+   checkACForm("USER", "PASS");
+ });
+ 
+ add_task(async function test_preserve_matching_username_case() {
+   restoreForm();
+   uname.value = "user";
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   await shownPromise;
+ 
+   // Check that we don't clobber user-entered text when tabbing away
+   // (even with no autocomplete entry selected)
+-  doKey("tab");
++  synthesizeKey("KEY_Tab", {code: "Tab"});
+   await promiseFormsProcessed();
+   checkACForm("user", "PASS");
+ });
+ </script>
+ </pre>
+ </body>
+ </html>
+diff --git a/toolkit/components/passwordmgr/test/mochitest/test_insecure_form_field_autocomplete.html b/toolkit/components/passwordmgr/test/mochitest/test_insecure_form_field_autocomplete.html
+--- a/toolkit/components/passwordmgr/test/mochitest/test_insecure_form_field_autocomplete.html
++++ b/toolkit/components/passwordmgr/test/mochitest/test_insecure_form_field_autocomplete.html
+@@ -177,17 +177,16 @@ var setupScript = runInParent(function s
+ 
+ <pre id="test">
+ <script class="testbody" type="text/javascript">
+ 
+ /** Test for Login Manager: multiple login autocomplete. **/
+ 
+ var uname = $_(1, "uname");
+ var pword = $_(1, "pword");
+-const shiftModifier = SpecialPowers.Ci.nsIDOMEvent.SHIFT_MASK;
+ 
+ // Restore the form to the default state.
+ function restoreForm() {
+   uname.value = "";
+   pword.value = "";
+   uname.focus();
+ }
+ 
+@@ -223,226 +222,226 @@ add_task(async function test_form1_initi
+   is(popupState.open, false, "Check popup is initially closed");
+ });
+ 
+ add_task(async function test_form1_warning_entry() {
+   await SimpleTest.promiseFocus(window);
+   // Trigger autocomplete popup
+   restoreForm();
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   let results = await shownPromise;
+ 
+   let popupState = await getPopupState();
+   is(popupState.selectedIndex, -1, "Check no entries are selected upon opening");
+ 
+   let expectedMenuItems = ["This connection is not secure. Logins entered here could be compromised. Learn More",
+                            "tempuser1",
+                            "testuser2",
+                            "testuser3",
+                            "zzzuser4"];
+   checkArrayValues(results, expectedMenuItems, "Check all menuitems are displayed correctly.");
+ 
+-  doKey("down"); // select insecure warning
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // select insecure warning
+   checkACForm("", ""); // value shouldn't update just by selecting
+-  doKey("return"); // not "enter"!
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await spinEventLoop(); // let focus happen
+   checkACForm("", "");
+ });
+ 
+ add_task(async function test_form1_first_entry() {
+   await SimpleTest.promiseFocus(window);
+   // Trigger autocomplete popup
+   restoreForm();
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   await shownPromise;
+ 
+   let popupState = await getPopupState();
+   is(popupState.selectedIndex, -1, "Check no entries are selected upon opening");
+ 
+-  doKey("down"); // skip insecure warning
+-  doKey("down"); // first
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // skip insecure warning
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // first
+   checkACForm("", ""); // value shouldn't update just by selecting
+-  doKey("return"); // not "enter"!
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await promiseFormsProcessed();
+   checkACForm("tempuser1", "temppass1");
+ });
+ 
+ add_task(async function test_form1_second_entry() {
+   // Trigger autocomplete popup
+   restoreForm();
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   await shownPromise;
+ 
+-  doKey("down"); // skip insecure warning
+-  doKey("down"); // first
+-  doKey("down"); // second
+-  doKey("return"); // not "enter"!
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // skip insecure warning
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // first
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // second
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await promiseFormsProcessed();
+   checkACForm("testuser2", "testpass2");
+ });
+ 
+ add_task(async function test_form1_third_entry() {
+   // Trigger autocomplete popup
+   restoreForm();
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   await shownPromise;
+ 
+-  doKey("down"); // skip insecure warning
+-  doKey("down"); // first
+-  doKey("down"); // second
+-  doKey("down"); // third
+-  doKey("return");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // skip insecure warning
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // first
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // second
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // third
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await promiseFormsProcessed();
+   checkACForm("testuser3", "testpass3");
+ });
+ 
+ add_task(async function test_form1_fourth_entry() {
+   // Trigger autocomplete popup
+   restoreForm();
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   await shownPromise;
+ 
+-  doKey("down"); // skip insecure warning
+-  doKey("down"); // first
+-  doKey("down"); // second
+-  doKey("down"); // third
+-  doKey("down"); // fourth
+-  doKey("return");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // skip insecure warning
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // first
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // second
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // third
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // fourth
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await promiseFormsProcessed();
+   checkACForm("zzzuser4", "zzzpass4");
+ });
+ 
+ add_task(async function test_form1_wraparound_first_entry() {
+   // Trigger autocomplete popup
+   restoreForm();
+   await spinEventLoop(); // let focus happen
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   await shownPromise;
+ 
+-  doKey("down"); // skip insecure warning
+-  doKey("down"); // first
+-  doKey("down"); // second
+-  doKey("down"); // third
+-  doKey("down"); // fourth
+-  doKey("down"); // deselects
+-  doKey("down"); // skip insecure warning
+-  doKey("down"); // first
+-  doKey("return");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // skip insecure warning
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // first
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // second
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // third
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // fourth
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // deselects
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // skip insecure warning
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // first
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await promiseFormsProcessed();
+   checkACForm("tempuser1", "temppass1");
+ });
+ 
+ add_task(async function test_form1_wraparound_up_last_entry() {
+   // Trigger autocomplete popup
+   restoreForm();
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   await shownPromise;
+ 
+-  doKey("up"); // last (fourth)
+-  doKey("return");
++  synthesizeKey("KEY_ArrowUp", {code: "ArrowUp"}); // last (fourth)
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await promiseFormsProcessed();
+   checkACForm("zzzuser4", "zzzpass4");
+ });
+ 
+ add_task(async function test_form1_wraparound_down_up_up() {
+   // Trigger autocomplete popup
+   restoreForm();
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   await shownPromise;
+ 
+-  doKey("down"); // select first entry
+-  doKey("up");   // selects nothing!
+-  doKey("up");   // select last entry
+-  doKey("return");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // select first entry
++  synthesizeKey("KEY_ArrowUp", {code: "ArrowUp"}); // selects nothing!
++  synthesizeKey("KEY_ArrowUp", {code: "ArrowUp"}); // select last entry
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await promiseFormsProcessed();
+   checkACForm("zzzuser4", "zzzpass4");
+ });
+ 
+ add_task(async function test_form1_wraparound_up_last() {
+   restoreForm();
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   await shownPromise;
+ 
+-  doKey("down");
+-  doKey("up"); // deselects
+-  doKey("up"); // last entry
+-  doKey("up");
+-  doKey("up");
+-  doKey("up"); // skip insecure warning
+-  doKey("up"); // first entry
+-  doKey("up"); // deselects
+-  doKey("up"); // last entry
+-  doKey("return");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++  synthesizeKey("KEY_ArrowUp", {code: "ArrowUp"}); // deselects
++  synthesizeKey("KEY_ArrowUp", {code: "ArrowUp"}); // last entry
++  synthesizeKey("KEY_ArrowUp", {code: "ArrowUp"});
++  synthesizeKey("KEY_ArrowUp", {code: "ArrowUp"});
++  synthesizeKey("KEY_ArrowUp", {code: "ArrowUp"}); // skip insecure warning
++  synthesizeKey("KEY_ArrowUp", {code: "ArrowUp"}); // first entry
++  synthesizeKey("KEY_ArrowUp", {code: "ArrowUp"}); // deselects
++  synthesizeKey("KEY_ArrowUp", {code: "ArrowUp"}); // last entry
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await promiseFormsProcessed();
+   checkACForm("zzzuser4", "zzzpass4");
+ });
+ 
+ add_task(async function test_form1_fill_username_without_autofill_right() {
+   restoreForm();
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   await shownPromise;
+ 
+   // Set first entry w/o triggering autocomplete
+-  doKey("down"); // skip insecure warning
+-  doKey("down"); // first
+-  doKey("right");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // skip insecure warning
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // first
++  synthesizeKey("KEY_ArrowRight", {code: "ArrowRight"});
+   await spinEventLoop();
+   checkACForm("tempuser1", ""); // empty password
+ });
+ 
+ add_task(async function test_form1_fill_username_without_autofill_left() {
+   restoreForm();
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   await shownPromise;
+ 
+   // Set first entry w/o triggering autocomplete
+-  doKey("down"); // skip insecure warning
+-  doKey("down"); // first
+-  doKey("left");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // skip insecure warning
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // first
++  synthesizeKey("KEY_ArrowLeft", {code: "ArrowLeft"});
+   checkACForm("tempuser1", ""); // empty password
+ });
+ 
+ add_task(async function test_form1_pageup_first() {
+   restoreForm();
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   await shownPromise;
+ 
+   // Check first entry (page up)
+-  doKey("down"); // first
+-  doKey("down"); // second
+-  doKey("page_up"); // first
+-  doKey("down"); // skip insecure warning
+-  doKey("return");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // first
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // second
++  synthesizeKey("KEY_PageUp", {code: "PageUp"}); // first
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // skip insecure warning
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await promiseFormsProcessed();
+   checkACForm("tempuser1", "temppass1");
+ });
+ 
+ add_task(async function test_form1_pagedown_last() {
+   restoreForm();
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   await shownPromise;
+ 
+   // test 13
+   // Check last entry (page down)
+-  doKey("down"); // first
+-  doKey("page_down"); // last
+-  doKey("return");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // first
++  synthesizeKey("KEY_PageDown", {code: "PageDown"}); // last
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await promiseFormsProcessed();
+   checkACForm("zzzuser4", "zzzpass4");
+ });
+ 
+ add_task(async function test_form1_untrusted_event() {
+   restoreForm();
+   await spinEventLoop();
+ 
+@@ -452,139 +451,139 @@ add_task(async function test_form1_untru
+   sendFakeAutocompleteEvent(uname);
+   await spinEventLoop();
+   checkACForm("zzzuser4", "");
+ });
+ 
+ add_task(async function test_form1_delete() {
+   restoreForm();
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   await shownPromise;
+ 
+   // XXX tried sending character "t" before/during dropdown to test
+   // filtering, but had no luck. Seemed like the character was getting lost.
+   // Setting uname.value didn't seem to work either. This works with a human
+   // driver, so I'm not sure what's up.
+ 
+-  doKey("down"); // skip insecure warning
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // skip insecure warning
+   // Delete the first entry (of 4), "tempuser1"
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   var numLogins;
+   numLogins = LoginManager.countLogins("http://mochi.test:8888", "http://autocomplete:8888", null);
+   is(numLogins, 5, "Correct number of logins before deleting one");
+ 
+   let countChangedPromise = notifyMenuChanged(4);
+   var deletionPromise = promiseStorageChanged(["removeLogin"]);
+   // On OS X, shift-backspace and shift-delete work, just delete does not.
+   // On Win/Linux, shift-backspace does not work, delete and shift-delete do.
+-  doKey("delete", shiftModifier);
++  synthesizeKey("KEY_Delete", {code: "Delete", shiftKey: true});
+   await deletionPromise;
+ 
+   checkACForm("", "");
+   numLogins = LoginManager.countLogins("http://mochi.test:8888", "http://autocomplete:8888", null);
+   is(numLogins, 4, "Correct number of logins after deleting one");
+   await countChangedPromise;
+-  doKey("return");
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await promiseFormsProcessed();
+   checkACForm("testuser2", "testpass2");
+ });
+ 
+ add_task(async function test_form1_first_after_deletion() {
+   restoreForm();
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   await shownPromise;
+ 
+-  doKey("down"); // skip insecure warning
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // skip insecure warning
+   // Check the new first entry (of 3)
+-  doKey("down");
+-  doKey("return");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await promiseFormsProcessed();
+   checkACForm("testuser2", "testpass2");
+ });
+ 
+ add_task(async function test_form1_delete_second() {
+   restoreForm();
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   await shownPromise;
+ 
+-  doKey("down"); // skip insecure warning
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // skip insecure warning
+   // Delete the second entry (of 3), "testuser3"
+-  doKey("down");
+-  doKey("down");
+-  doKey("delete", shiftModifier);
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++  synthesizeKey("KEY_Delete", {code: "Delete", shiftKey: true});
+   checkACForm("", "");
+   numLogins = LoginManager.countLogins("http://mochi.test:8888", "http://autocomplete:8888", null);
+   is(numLogins, 3, "Correct number of logins after deleting one");
+-  doKey("return");
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await promiseFormsProcessed();
+   checkACForm("zzzuser4", "zzzpass4");
+ });
+ 
+ add_task(async function test_form1_first_after_deletion2() {
+   restoreForm();
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   await shownPromise;
+ 
+-  doKey("down"); // skip insecure warning
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // skip insecure warning
+   // Check the new first entry (of 2)
+-  doKey("down");
+-  doKey("return");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await promiseFormsProcessed();
+   checkACForm("testuser2", "testpass2");
+ });
+ 
+ add_task(async function test_form1_delete_last() {
+   restoreForm();
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   await shownPromise;
+ 
+-  doKey("down"); // skip insecure warning
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // skip insecure warning
+   // test 54
+   // Delete the last entry (of 2), "zzzuser4"
+-  doKey("down");
+-  doKey("down");
+-  doKey("delete", shiftModifier);
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++  synthesizeKey("KEY_Delete", {code: "Delete", shiftKey: true});
+   checkACForm("", "");
+   numLogins = LoginManager.countLogins("http://mochi.test:8888", "http://autocomplete:8888", null);
+   is(numLogins, 2, "Correct number of logins after deleting one");
+-  doKey("return");
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await promiseFormsProcessed();
+   checkACForm("testuser2", "testpass2");
+ });
+ 
+ add_task(async function test_form1_first_after_3_deletions() {
+   restoreForm();
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   await shownPromise;
+ 
+-  doKey("down"); // skip insecure warning
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // skip insecure warning
+   // Check the only remaining entry
+-  doKey("down");
+-  doKey("return");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await promiseFormsProcessed();
+   checkACForm("testuser2", "testpass2");
+ });
+ 
+ add_task(async function test_form1_check_only_entry_remaining() {
+   restoreForm();
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   await shownPromise;
+ 
+-  doKey("down"); // skip insecure warning
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // skip insecure warning
+   // test 56
+   // Delete the only remaining entry, "testuser2"
+-  doKey("down");
+-  doKey("delete", shiftModifier);
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++  synthesizeKey("KEY_Delete", {code: "Delete", shiftKey: true});
+   checkACForm("", "");
+   numLogins = LoginManager.countLogins("http://mochi.test:8888", "http://autocomplete:8888", null);
+   is(numLogins, 1, "Correct number of logins after deleting one");
+ 
+   // remove the login that's not shown in the list.
+   setupScript.sendSyncMessage("removeLogin", "login0");
+ });
+ 
+@@ -592,96 +591,96 @@ add_task(async function test_form1_check
+ add_task(async function test_form2() {
+   // Turn our attention to form2
+   uname = $_(2, "uname");
+   pword = $_(2, "pword");
+   checkACForm("singleuser5", "singlepass5");
+ 
+   restoreForm();
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   await shownPromise;
+ 
+-  doKey("down"); // skip insecure warning
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // skip insecure warning
+   // Check first entry
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   checkACForm("", ""); // value shouldn't update
+-  doKey("return"); // not "enter"!
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await promiseFormsProcessed();
+   checkACForm("singleuser5", "singlepass5");
+ });
+ 
+ add_task(async function test_form3() {
+   uname = $_(3, "uname");
+   pword = $_(3, "pword");
+   checkACForm("singleuser5", "singlepass5");
+   restoreForm();
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   await shownPromise;
+ 
+-  doKey("down"); // skip insecure warning
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // skip insecure warning
+   // Check first entry
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   checkACForm("", ""); // value shouldn't update
+-  doKey("return"); // not "enter"!
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await promiseFormsProcessed();
+   checkACForm("singleuser5", "singlepass5");
+ });
+ 
+ add_task(async function test_form4() {
+   uname = $_(4, "uname");
+   pword = $_(4, "pword");
+   checkACForm("singleuser5", "singlepass5");
+   restoreForm();
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   await shownPromise;
+ 
+-  doKey("down"); // skip insecure warning
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // skip insecure warning
+   // Check first entry
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   checkACForm("", ""); // value shouldn't update
+-  doKey("return"); // not "enter"!
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await promiseFormsProcessed();
+   checkACForm("singleuser5", "singlepass5");
+ });
+ 
+ add_task(async function test_form5() {
+   uname = $_(5, "uname");
+   pword = $_(5, "pword");
+   checkACForm("singleuser5", "singlepass5");
+   restoreForm();
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   await shownPromise;
+ 
+-  doKey("down"); // skip insecure warning
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // skip insecure warning
+   // Check first entry
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   checkACForm("", ""); // value shouldn't update
+-  doKey("return"); // not "enter"!
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await promiseFormsProcessed();
+   checkACForm("singleuser5", "singlepass5");
+ });
+ 
+ add_task(async function test_form6() {
+   // (this is a control, w/o autocomplete=off, to ensure the login
+   // that was being suppressed would have been filled in otherwise)
+   uname = $_(6, "uname");
+   pword = $_(6, "pword");
+   checkACForm("singleuser5", "singlepass5");
+ });
+ 
+ add_task(async function test_form6_changeUsername() {
+   // Test that the password field remains filled in after changing
+   // the username.
+   uname.focus();
+-  doKey("right");
+-  sendChar("X");
++  synthesizeKey("KEY_ArrowRight", {code: "ArrowRight"});
++  synthesizeKey("X", {code: "KeyX", shiftKey: true});
+   // Trigger the 'blur' event on uname
+   pword.focus();
+   await spinEventLoop();
+   checkACForm("singleuser5X", "singlepass5");
+ 
+   setupScript.sendSyncMessage("removeLogin", "login5");
+ });
+ 
+@@ -702,24 +701,24 @@ add_task(async function test_form7() {
+   // automatically, removing it makes it more likely that we'll catch a
+   // future regression with form filling here.
+   setupScript.sendSyncMessage("removeLogin", "login6B");
+ });
+ 
+ add_task(async function test_form7_2() {
+   restoreForm();
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   await shownPromise;
+ 
+-  doKey("down"); // skip insecure warning
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // skip insecure warning
+   // Check first entry
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   checkACForm("", ""); // value shouldn't update
+-  doKey("return"); // not "enter"!
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   // The form changes, so we expect the old username field to get the
+   // selected autocomplete value, but neither the new username field nor
+   // the password field should have any values filled in.
+   await spinEventLoop();
+   checkACForm("form7user1", "");
+   is($_(7, "uname2").value, "", "Verifying empty uname2");
+   restoreForm(); // clear field, so reloading test doesn't fail
+ 
+@@ -755,48 +754,48 @@ add_task(async function test_form9_filte
+   pword = $_(9, "pword");
+   uname.focus();
+   let shownPromise = promiseACShown();
+   sendString("form9userAB");
+   await shownPromise;
+ 
+   checkACForm("form9userAB", "");
+   uname.focus();
+-  doKey("left");
++  synthesizeKey("KEY_ArrowLeft", {code: "ArrowLeft"});
+   shownPromise = promiseACShown();
+-  sendChar("A");
++  synthesizeKey("A", {code: "KeyA", shiftKey: true});
+   let results = await shownPromise;
+ 
+   checkACForm("form9userAAB", "");
+   checkArrayValues(results, ["This connection is not secure. Logins entered here could be compromised. Learn More", "form9userAAB"],
+                             "Check dropdown is updated after inserting 'A'");
+-  doKey("down"); // skip insecure warning
+-  doKey("down");
+-  doKey("return");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // skip insecure warning
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await promiseFormsProcessed();
+   checkACForm("form9userAAB", "form9pass");
+ });
+ 
+ add_task(async function test_form9_autocomplete_cache() {
+   // Note that this addLogin call will only be seen by the autocomplete
+-  // attempt for the sendChar if we do not successfully cache the
++  // attempt for the synthesizeKey if we do not successfully cache the
+   // autocomplete results.
+   setupScript.sendSyncMessage("addLogin", "login8C");
+   uname.focus();
+   let promise0 = notifyMenuChanged(1);
+   let shownPromise = promiseACShown();
+-  sendChar("z");
++  synthesizeKey("z", {code: "KeyZ"});
+   await promise0;
+   await shownPromise;
+   let popupState = await getPopupState();
+   is(popupState.open, true, "Check popup should open");
+ 
+   // check that empty results are cached - bug 496466
+   promise0 = notifyMenuChanged(1);
+-  sendChar("z");
++  synthesizeKey("z", {code: "KeyZ"});
+   await promise0;
+   popupState = await getPopupState();
+   is(popupState.open, true, "Check popup stays opened due to cached empty result");
+ });
+ 
+ add_task(async function test_form11_recipes() {
+   await loadRecipes({
+     siteRecipes: [{
+@@ -811,52 +810,52 @@ add_task(async function test_form11_reci
+   // First test DOMAutocomplete
+   // Switch the password field to type=password so _fillForm marks the username
+   // field for autocomplete.
+   pword.type = "password";
+   await promiseFormsProcessed();
+   restoreForm();
+   checkACForm("", "");
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   await shownPromise;
+ 
+-  doKey("down"); // skip insecure warning
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // skip insecure warning
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   checkACForm("", ""); // value shouldn't update
+-  doKey("return"); // not "enter"!
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await promiseFormsProcessed();
+   checkACForm("testuser10", "testpass10");
+ 
+   // Now test recipes with blur on the username field.
+   restoreForm();
+   checkACForm("", "");
+   uname.value = "testuser10";
+   checkACForm("testuser10", "");
+-  doKey("tab");
++  synthesizeKey("KEY_Tab", {code: "Tab"});
+   await promiseFormsProcessed();
+   checkACForm("testuser10", "testpass10");
+   await resetRecipes();
+ });
+ 
+ add_task(async function test_form12_formless() {
+   // Test form-less autocomplete
+   uname = $_(12, "uname");
+   pword = $_(12, "pword");
+   restoreForm();
+   checkACForm("", "");
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   await shownPromise;
+ 
+-  doKey("down"); // skip insecure warning
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // skip insecure warning
+   // Trigger autocomplete
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   checkACForm("", ""); // value shouldn't update
+   let processedPromise = promiseFormsProcessed();
+-  doKey("return"); // not "enter"!
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await processedPromise;
+   checkACForm("testuser", "testpass");
+ });
+ </script>
+ </pre>
+ </body>
+ </html>
+diff --git a/toolkit/components/passwordmgr/test/mochitest/test_insecure_form_field_no_saved_login.html b/toolkit/components/passwordmgr/test/mochitest/test_insecure_form_field_no_saved_login.html
+--- a/toolkit/components/passwordmgr/test/mochitest/test_insecure_form_field_no_saved_login.html
++++ b/toolkit/components/passwordmgr/test/mochitest/test_insecure_form_field_no_saved_login.html
+@@ -40,17 +40,16 @@ SpecialPowers.setBoolPref(
+ 
+ SimpleTest.registerCleanupFunction(() => {
+   SpecialPowers.clearUserPref(
+     "security.insecure_field_warning.contextual.enabled");
+ });
+ 
+ let uname = $_(1, "uname");
+ let pword = $_(1, "pword");
+-const shiftModifier = SpecialPowers.Ci.nsIDOMEvent.SHIFT_MASK;
+ 
+ // Restore the form to the default state.
+ function restoreForm() {
+   uname.value = "";
+   pword.value = "";
+   uname.focus();
+ }
+ 
+@@ -78,26 +77,26 @@ add_task(async function test_form1_initi
+   is(popupState.open, false, "Check popup is initially closed");
+ });
+ 
+ add_task(async function test_form1_warning_entry() {
+   await SimpleTest.promiseFocus(window);
+   // Trigger autocomplete popup
+   restoreForm();
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   await shownPromise;
+ 
+   let popupState = await getPopupState();
+   is(popupState.open, true, "Check popup is opened");
+   is(popupState.selectedIndex, -1, "Check no entries are selected upon opening");
+ 
+-  doKey("down"); // select insecure warning
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // select insecure warning
+   checkACForm("", ""); // value shouldn't update just by selecting
+-  doKey("return"); // not "enter"!
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await spinEventLoop(); // let focus happen
+   checkACForm("", "");
+ });
+ 
+ </script>
+ </pre>
+ </body>
+ </html>
+diff --git a/toolkit/components/passwordmgr/test/mochitest/test_password_field_autocomplete.html b/toolkit/components/passwordmgr/test/mochitest/test_password_field_autocomplete.html
+--- a/toolkit/components/passwordmgr/test/mochitest/test_password_field_autocomplete.html
++++ b/toolkit/components/passwordmgr/test/mochitest/test_password_field_autocomplete.html
+@@ -97,17 +97,16 @@ var setupScript = runInParent(function s
+ 
+ let { Services } =
+   SpecialPowers.Cu.import("resource://gre/modules/Services.jsm", {});
+ 
+ /** Test for Login Manager: multiple login autocomplete. **/
+ 
+ var uname = $_(1, "uname");
+ var pword = $_(1, "pword");
+-const shiftModifier = SpecialPowers.Ci.nsIDOMEvent.SHIFT_MASK;
+ 
+ // Restore the form to the default state.
+ async function reinitializeForm(index) {
+   // Using innerHTML is for creating the autocomplete popup again, so the
+   // preference value will be applied to the constructor of
+   // UserAutoCompleteResult.
+   let form = document.getElementById("form" + index);
+   let temp = form.innerHTML;
+@@ -166,131 +165,131 @@ add_task(async function test_form1_initi
+ add_task(async function test_form2_password_readonly() {
+   await SpecialPowers.pushPrefEnv({"set": [
+                                             ["security.insecure_field_warning.contextual.enabled", true],
+                                             ["signon.autofillForms.http", true]
+                                           ]});
+   await reinitializeForm(2);
+ 
+   // Trigger autocomplete popup
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   let popupState = await getPopupState();
+   is(popupState.open, false, "Check popup is closed for a readonly field.");
+ });
+ 
+ add_task(async function test_form3_password_disabled() {
+   await SpecialPowers.pushPrefEnv({"set": [
+                                             ["security.insecure_field_warning.contextual.enabled", true],
+                                             ["signon.autofillForms.http", true]
+                                           ]});
+   await reinitializeForm(3);
+ 
+   // Trigger autocomplete popup
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   let popupState = await getPopupState();
+   is(popupState.open, false, "Check popup is closed for a disabled field.");
+ });
+ 
+ add_task(async function test_form1_enabledInsecureFieldWarning_enabledInsecureAutoFillForm() {
+   await SpecialPowers.pushPrefEnv({"set": [
+                                             ["security.insecure_field_warning.contextual.enabled", true],
+                                             ["signon.autofillForms.http", true]
+                                           ]});
+   await reinitializeForm(1);
+   // Trigger autocomplete popup
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   let results = await shownPromise;
+ 
+   let popupState = await getPopupState();
+   is(popupState.selectedIndex, -1, "Check no entries are selected upon opening");
+ 
+   let expectedMenuItems = ["This connection is not secure. Logins entered here could be compromised. Learn More",
+                            "No username (" + DATE_NOW_STRING + ")",
+                            "tempuser1",
+                            "testuser2",
+                            "testuser3",
+                            "zzzuser4"];
+   checkArrayValues(results, expectedMenuItems, "Check all menuitems are displayed correctly.");
+ 
+-  doKey("down"); // select insecure warning
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // select insecure warning
+   checkACFormPasswordField(""); // value shouldn't update just by selecting
+-  doKey("return"); // not "enter"!
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await spinEventLoop(); // let focus happen
+   checkACFormPasswordField("");
+ });
+ 
+ add_task(async function test_form1_disabledInsecureFieldWarning_enabledInsecureAutoFillForm() {
+   await SpecialPowers.pushPrefEnv({"set": [
+                                             ["security.insecure_field_warning.contextual.enabled", false],
+                                             ["signon.autofillForms.http", true]
+                                           ]});
+   await reinitializeForm(1);
+ 
+   // Trigger autocomplete popup
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   let results = await shownPromise;
+ 
+   let popupState = await getPopupState();
+   is(popupState.selectedIndex, -1, "Check no entries are selected upon opening");
+ 
+   let expectedMenuItems = ["No username (" + DATE_NOW_STRING + ")",
+                            "tempuser1",
+                            "testuser2",
+                            "testuser3",
+                            "zzzuser4"];
+   checkArrayValues(results, expectedMenuItems, "Check all menuitems are displayed correctly.");
+ 
+-  doKey("down"); // select first item
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // select first item
+   checkACFormPasswordField(""); // value shouldn't update just by selecting
+-  doKey("return"); // not "enter"!
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await spinEventLoop(); // let focus happen
+   checkACFormPasswordField("user0pass");
+ });
+ 
+ add_task(async function test_form1_enabledInsecureFieldWarning_disabledInsecureAutoFillForm() {
+   await SpecialPowers.pushPrefEnv({"set": [
+                                             ["security.insecure_field_warning.contextual.enabled", true],
+                                             ["signon.autofillForms.http", false]
+                                           ]});
+   await reinitializeForm(1);
+ 
+   // Trigger autocomplete popup
+   let shownPromise = promiseACShown();
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   let results = await shownPromise;
+ 
+   let popupState = await getPopupState();
+   is(popupState.selectedIndex, -1, "Check no entries are selected upon opening");
+ 
+   let expectedMenuItems = ["This connection is not secure. Logins entered here could be compromised. Learn More",
+                            "No username (" + DATE_NOW_STRING + ")",
+                            "tempuser1",
+                            "testuser2",
+                            "testuser3",
+                            "zzzuser4"];
+   checkArrayValues(results, expectedMenuItems, "Check all menuitems are displayed correctly.");
+ 
+-  doKey("down"); // select insecure warning
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // select insecure warning
+   checkACFormPasswordField(""); // value shouldn't update just by selecting
+-  doKey("return"); // not "enter"!
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   await spinEventLoop(); // let focus happen
+   checkACFormPasswordField("");
+ });
+ 
+ add_task(async function test_form1_disabledInsecureFieldWarning_disabledInsecureAutoFillForm() {
+   await SpecialPowers.pushPrefEnv({"set": [
+                                             ["security.insecure_field_warning.contextual.enabled", false],
+                                             ["signon.autofillForms.http", false]
+                                           ]});
+   await reinitializeForm(1);
+ 
+   // Trigger autocomplete popup
+-  doKey("down"); // open
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // open
+   let popupState = await getPopupState();
+   is(popupState.open, false, "Check popup is closed with no AutoFillForms.");
+ });
+ 
+ </script>
+ </pre>
+ </body>
+ </html>
+diff --git a/toolkit/components/passwordmgr/test/pwmgr_common.js b/toolkit/components/passwordmgr/test/pwmgr_common.js
+--- a/toolkit/components/passwordmgr/test/pwmgr_common.js
++++ b/toolkit/components/passwordmgr/test/pwmgr_common.js
+@@ -94,39 +94,16 @@ function checkUnmodifiedForm(formNum) {
+       continue;
+ 
+     is(ele.value, ele.defaultValue, "Test to default value of field " +
+        ele.name + " in form " + formNum);
+   }
+ }
+ 
+ /**
+- * Mochitest gives us a sendKey(), but it's targeted to a specific element.
+- * This basically sends an untargeted key event, to whatever's focused.
+- */
+-function doKey(aKey, modifier) {
+-  var keyName = "DOM_VK_" + aKey.toUpperCase();
+-  var key = KeyEvent[keyName];
+-
+-  // undefined --> null
+-  if (!modifier)
+-    modifier = null;
+-
+-  // Window utils for sending fake sey events.
+-  var wutils = SpecialPowers.wrap(window).
+-               QueryInterface(SpecialPowers.Ci.nsIInterfaceRequestor).
+-               getInterface(SpecialPowers.Ci.nsIDOMWindowUtils);
+-
+-  if (wutils.sendKeyEvent("keydown", key, 0, modifier)) {
+-    wutils.sendKeyEvent("keypress", key, 0, modifier);
+-  }
+-  wutils.sendKeyEvent("keyup", key, 0, modifier);
+-}
+-
+-/**
+  * Init with a common login
+  * If selfFilling is true or non-undefined, fires an event at the page so that
+  * the test can start checking filled-in values. Tests that check observer
+  * notifications might be confused by this.
+  */
+ function commonInit(selfFilling) {
+   // eslint-disable-next-line mozilla/use-services
+   var pwmgr = SpecialPowers.Cc["@mozilla.org/login-manager;1"].
+diff --git a/toolkit/components/satchel/test/satchel_common.js b/toolkit/components/satchel/test/satchel_common.js
+--- a/toolkit/components/satchel/test/satchel_common.js
++++ b/toolkit/components/satchel/test/satchel_common.js
+@@ -40,36 +40,16 @@ function $_(formNum, name) {
+   if (element.hasAttribute("name") && element.getAttribute("name") != name) {
+     ok(false, "$_ got confused.");
+     return null;
+   }
+ 
+   return element;
+ }
+ 
+-// Mochitest gives us a sendKey(), but it's targeted to a specific element.
+-// This basically sends an untargeted key event, to whatever's focused.
+-function doKey(aKey, modifier) {
+-  let keyName = "DOM_VK_" + aKey.toUpperCase();
+-  let key = SpecialPowers.Ci.nsIDOMKeyEvent[keyName];
+-
+-  // undefined --> null
+-  if (!modifier) {
+-    modifier = null;
+-  }
+-
+-  // Window utils for sending fake key events.
+-  let wutils = SpecialPowers.getDOMWindowUtils(window);
+-
+-  if (wutils.sendKeyEvent("keydown", key, 0, modifier)) {
+-    wutils.sendKeyEvent("keypress", key, 0, modifier);
+-  }
+-  wutils.sendKeyEvent("keyup", key, 0, modifier);
+-}
+-
+ function registerPopupShownListener(listener) {
+   if (gPopupShownListener) {
+     ok(false, "got too many popupshownlisteners");
+     return;
+   }
+   gPopupShownListener = listener;
+ }
+ 
+diff --git a/toolkit/components/satchel/test/test_bug_511615.html b/toolkit/components/satchel/test/test_bug_511615.html
+--- a/toolkit/components/satchel/test/test_bug_511615.html
++++ b/toolkit/components/satchel/test/test_bug_511615.html
+@@ -159,31 +159,31 @@ add_task(async function test_untrusted_e
+   ]) {
+     // We must wait for the entire timeout for each individual test, because the
+     // next event in the list might prevent the popup from opening.
+     await expectPopupDoesNotOpen(triggerFn);
+   }
+ 
+   // A privileged key press will actually open the popup.
+   let popupShown = waitForNextPopup();
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   await popupShown;
+ 
+   // The selected autocomplete item should not change from untrusted events.
+   for (let triggerFn of [
+     () => doKeyUnprivileged("down"),
+     () => doKeyUnprivileged("page_down"),
+   ]) {
+     triggerFn();
+     await checkSelectedIndexAfterResponseTime(-1);
+   }
+ 
+   // A privileged key press will actually change the selected index.
+   let indexChanged = new Promise(resolve => notifySelectedIndex(0, resolve));
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   await indexChanged;
+ 
+   // The selected autocomplete item should not change and it should not be
+   // possible to use it from untrusted events.
+   for (let triggerFn of [
+     () => doKeyUnprivileged("down"),
+     () => doKeyUnprivileged("page_down"),
+     () => doKeyUnprivileged("right"),
+diff --git a/toolkit/components/satchel/test/test_bug_787624.html b/toolkit/components/satchel/test/test_bug_787624.html
+--- a/toolkit/components/satchel/test/test_bug_787624.html
++++ b/toolkit/components/satchel/test/test_bug_787624.html
+@@ -1,13 +1,14 @@
+ <!DOCTYPE HTML>
+ <html>
+ <head>
+   <title>Test for Layout of Form History Autocomplete: Bug 787624</title>
+   <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
++  <script type="text/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
+   <script type="text/javascript" src="/tests/SimpleTest/SpawnTask.js"></script>
+   <script type="text/javascript" src="satchel_common.js"></script>
+   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+   <style>
+     .container {
+         border: 1px solid #333;
+         width: 80px;
+         height: 26px;
+@@ -68,17 +69,17 @@ add_task(async function test_popup_not_m
+   await new Promise(resolve => updateFormHistory([
+     { op: "remove" },
+     { op: "add", fieldname: "field1", value: "value1" },
+     { op: "add", fieldname: "field1", value: "value2" },
+   ], resolve));
+ 
+   let popupShown = waitForNextPopup();
+   input.focus();
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   await popupShown;
+ 
+   let newRect = input.getBoundingClientRect();
+   is(newRect.left, rect.left,
+      "autocomplete popup does not disturb the input position");
+   is(newRect.top, rect.top,
+      "autocomplete popup does not disturb the input position");
+ });
+diff --git a/toolkit/components/satchel/test/test_datalist_with_caching.html b/toolkit/components/satchel/test/test_datalist_with_caching.html
+--- a/toolkit/components/satchel/test/test_datalist_with_caching.html
++++ b/toolkit/components/satchel/test/test_datalist_with_caching.html
+@@ -98,39 +98,39 @@ function checkMenuEntries(expectedValues
+   for (let i = 0; i < expectedValues.length; i++) {
+     is(actualValues[i], expectedValues[i], testNum + " Checking menu entry #" + i);
+   }
+ }
+ 
+ async function runTests() {
+   testNum++;
+   restoreForm();
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   await expectPopup();
+ 
+   checkMenuEntries(["Sec", "First", "Second", "Secomundo"]);
+-  doKey("down");
+-  doKey("return");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   checkForm("Sec");
+ 
+   testNum++;
+   restoreForm();
+   sendString("Sec");
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+   await expectPopup();
+ 
+   testNum++;
+   checkMenuEntries(["Sec", "Second", "Secomundo"]);
+   sendString("o");
+   await waitForMenuChange(2);
+ 
+   testNum++;
+   checkMenuEntries(["Second", "Secomundo"]);
+-  doKey("down");
+-  doKey("return");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++  synthesizeKey("KEY_Enter", {code: "Enter"});
+   checkForm("Second");
+   SimpleTest.finish();
+ }
+ 
+ function startTest() {
+   setupFormHistory(runTests);
+ }
+ 
+diff --git a/toolkit/components/satchel/test/test_form_autocomplete.html b/toolkit/components/satchel/test/test_form_autocomplete.html
+--- a/toolkit/components/satchel/test/test_form_autocomplete.html
++++ b/toolkit/components/satchel/test/test_form_autocomplete.html
+@@ -140,17 +140,16 @@ Form History test: form field autocomple
+ <pre id="test">
+ <script class="testbody" type="text/javascript">
+ /* import-globals-from ../../../../testing/mochitest/tests/SimpleTest/EventUtils.js */
+ /* import-globals-from satchel_common.js */
+ 
+ /** Test for Form History autocomplete **/
+ 
+ var input = $_(1, "field1");
+-const shiftModifier = Event.SHIFT_MASK;
+ 
+ function setupFormHistory(aCallback) {
+   updateFormHistory([
+     { op: "remove" },
+     { op: "add", fieldname: "field1", value: "value1" },
+     { op: "add", fieldname: "field1", value: "value2" },
+     { op: "add", fieldname: "field1", value: "value3" },
+     { op: "add", fieldname: "field1", value: "value4" },
+@@ -247,203 +246,203 @@ function runTest() { // eslint-disable-l
+ 
+   switch (testNum) {
+     case 1:
+       // Make sure initial form is empty.
+       checkForm("");
+       // Trigger autocomplete popup
+       expectPopup();
+       restoreForm();
+-      doKey("down");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       break;
+ 
+     case 2:
+       checkMenuEntries(["value1", "value2", "value3", "value4"], testNum);
+       // Check first entry
+-      doKey("down");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       checkForm(""); // value shouldn't update
+-      doKey("return"); // not "enter"!
++      synthesizeKey("KEY_Enter", {code: "Enter"});
+       checkForm("value1");
+ 
+       // Trigger autocomplete popup
+       expectPopup();
+       restoreForm();
+-      doKey("down");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       break;
+ 
+     case 3:
+       // Check second entry
+-      doKey("down");
+-      doKey("down");
+-      doKey("return"); // not "enter"!
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_Enter", {code: "Enter"});
+       checkForm("value2");
+ 
+       // Trigger autocomplete popup
+       expectPopup();
+       restoreForm();
+-      doKey("down");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       break;
+ 
+     case 4:
+       // Check third entry
+-      doKey("down");
+-      doKey("down");
+-      doKey("down");
+-      doKey("return");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_Enter", {code: "Enter"});
+       checkForm("value3");
+ 
+       // Trigger autocomplete popup
+       expectPopup();
+       restoreForm();
+-      doKey("down");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       break;
+ 
+     case 5:
+       // Check fourth entry
+-      doKey("down");
+-      doKey("down");
+-      doKey("down");
+-      doKey("down");
+-      doKey("return");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_Enter", {code: "Enter"});
+       checkForm("value4");
+ 
+       // Trigger autocomplete popup
+       expectPopup();
+       restoreForm();
+-      doKey("down");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       break;
+ 
+     case 6:
+       // Check first entry (wraparound)
+-      doKey("down");
+-      doKey("down");
+-      doKey("down");
+-      doKey("down");
+-      doKey("down"); // deselects
+-      doKey("down");
+-      doKey("return");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // deselects
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_Enter", {code: "Enter"});
+       checkForm("value1");
+ 
+       // Trigger autocomplete popup
+       expectPopup();
+       restoreForm();
+-      doKey("down");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       break;
+ 
+     case 7:
+       // Check the last entry via arrow-up
+-      doKey("up");
+-      doKey("return");
++      synthesizeKey("KEY_ArrowUp", {code: "ArrowUp"});
++      synthesizeKey("KEY_Enter", {code: "Enter"});
+       checkForm("value4");
+ 
+       // Trigger autocomplete popup
+       expectPopup();
+       restoreForm();
+-      doKey("down");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       break;
+ 
+     case 8:
+       // Check the last entry via arrow-up
+-      doKey("down"); // select first entry
+-      doKey("up"); // selects nothing!
+-      doKey("up"); // select last entry
+-      doKey("return");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}); // select first entry
++      synthesizeKey("KEY_ArrowUp", {code: "ArrowUp"}); // selects nothing!
++      synthesizeKey("KEY_ArrowUp", {code: "ArrowUp"}); // select last entry
++      synthesizeKey("KEY_Enter", {code: "Enter"});
+       checkForm("value4");
+ 
+       // Trigger autocomplete popup
+       expectPopup();
+       restoreForm();
+-      doKey("down");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       break;
+ 
+     case 9:
+       // Check the last entry via arrow-up (wraparound)
+-      doKey("down");
+-      doKey("up"); // deselects
+-      doKey("up"); // last entry
+-      doKey("up");
+-      doKey("up");
+-      doKey("up"); // first entry
+-      doKey("up"); // deselects
+-      doKey("up"); // last entry
+-      doKey("return");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_ArrowUp", {code: "ArrowUp"}); // deselects
++      synthesizeKey("KEY_ArrowUp", {code: "ArrowUp"}); // last entry
++      synthesizeKey("KEY_ArrowUp", {code: "ArrowUp"});
++      synthesizeKey("KEY_ArrowUp", {code: "ArrowUp"});
++      synthesizeKey("KEY_ArrowUp", {code: "ArrowUp"}); // first entry
++      synthesizeKey("KEY_ArrowUp", {code: "ArrowUp"}); // deselects
++      synthesizeKey("KEY_ArrowUp", {code: "ArrowUp"}); // last entry
++      synthesizeKey("KEY_Enter", {code: "Enter"});
+       checkForm("value4");
+ 
+       // Trigger autocomplete popup
+       expectPopup();
+       restoreForm();
+-      doKey("down");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       break;
+ 
+     case 10:
+       // Set first entry w/o triggering autocomplete
+-      doKey("down");
+-      doKey("right");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_ArrowRight", {code: "ArrowRight"});
+       checkForm("value1");
+ 
+       // Trigger autocomplete popup
+       expectPopup();
+       restoreForm();
+-      doKey("down");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       break;
+ 
+     case 11:
+       // Set first entry w/o triggering autocomplete
+-      doKey("down");
+-      doKey("left");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_ArrowLeft", {code: "ArrowLeft"});
+       checkForm("value1");
+ 
+       // Trigger autocomplete popup
+       expectPopup();
+       restoreForm();
+-      doKey("down");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       break;
+ 
+     case 12:
+       // Check first entry (page up)
+-      doKey("down");
+-      doKey("down");
+-      doKey("page_up");
+-      doKey("return");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_PageUp", {code: "PageUp"});
++      synthesizeKey("KEY_Enter", {code: "Enter"});
+       checkForm("value1");
+ 
+       // Trigger autocomplete popup
+       expectPopup();
+       restoreForm();
+-      doKey("down");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       break;
+ 
+     case 13:
+       // Check last entry (page down)
+-      doKey("down");
+-      doKey("page_down");
+-      doKey("return");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_PageDown", {code: "PageDown"});
++      synthesizeKey("KEY_Enter", {code: "Enter"});
+       checkForm("value4");
+ 
+       // Trigger autocomplete popup
+       testNum = 49;
+       expectPopup();
+       restoreForm();
+-      doKey("down");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       break;
+ 
+     /* Test removing entries from the dropdown */
+ 
+     case 50:
+       checkMenuEntries(["value1", "value2", "value3", "value4"], testNum);
+       // Delete the first entry (of 4)
+       setForm("value");
+-      doKey("down");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+ 
+       // On OS X, shift-backspace and shift-delete work, just delete does not.
+       // On Win/Linux, shift-backspace does not work, delete and shift-delete do.
+       if (SpecialPowers.OS == "Darwin") {
+-        doKey("back_space", shiftModifier);
++        synthesizeKey("KEY_Backspace", {code: "Backspace", shiftKey: true});
+       } else {
+-        doKey("delete", shiftModifier);
++        synthesizeKey("KEY_Delete", {code: "Delete", shiftKey: true});
+       }
+ 
+       // This tests that on OS X shift-backspace didn't delete the last character
+       // in the input (bug 480262).
+       waitForMenuChange(3);
+       break;
+ 
+     case 51:
+@@ -451,122 +450,122 @@ function runTest() { // eslint-disable-l
+       countEntries("field1", "value1",
+                    function(num) {
+                      ok(!num, testNum + " checking that f1/v1 was deleted");
+                      runTest();
+                    });
+       break;
+ 
+     case 52:
+-      doKey("return");
++      synthesizeKey("KEY_Enter", {code: "Enter"});
+       checkForm("value2");
+ 
+       // Trigger autocomplete popup
+       expectPopup();
+       restoreForm();
+-      doKey("down");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       break;
+ 
+     case 53:
+       checkMenuEntries(["value2", "value3", "value4"], testNum);
+       // Check the new first entry (of 3)
+-      doKey("down");
+-      doKey("return");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_Enter", {code: "Enter"});
+       checkForm("value2");
+ 
+       // Trigger autocomplete popup
+       expectPopup();
+       restoreForm();
+-      doKey("down");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       break;
+ 
+     case 54:
+       // Delete the second entry (of 3)
+-      doKey("down");
+-      doKey("down");
+-      doKey("delete", shiftModifier);
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_Delete", {code: "Delete", shiftKey: true});
+       waitForMenuChange(2);
+       break;
+ 
+     case 55:
+       checkForm("");
+       countEntries("field1", "value3",
+                    function(num) {
+                      ok(!num, testNum + " checking that f1/v3 was deleted");
+                      runTest();
+                    });
+       break;
+ 
+     case 56:
+-      doKey("return");
++      synthesizeKey("KEY_Enter", {code: "Enter"});
+       checkForm("value4");
+ 
+       // Trigger autocomplete popup
+       expectPopup();
+       restoreForm();
+-      doKey("down");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       break;
+ 
+     case 57:
+       checkMenuEntries(["value2", "value4"], testNum);
+       // Check the new first entry (of 2)
+-      doKey("down");
+-      doKey("return");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_Enter", {code: "Enter"});
+       checkForm("value2");
+ 
+       // Trigger autocomplete popup
+       expectPopup();
+       restoreForm();
+-      doKey("down");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       break;
+ 
+     case 58:
+       // Delete the last entry (of 2)
+-      doKey("down");
+-      doKey("down");
+-      doKey("delete", shiftModifier);
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_Delete", {code: "Delete", shiftKey: true});
+       checkForm("");
+       waitForMenuChange(1);
+       break;
+ 
+     case 59:
+       countEntries("field1", "value4",
+                    function(num) {
+                      ok(!num, testNum + " checking that f1/v4 was deleted");
+                      runTest();
+                    });
+       break;
+ 
+     case 60:
+-      doKey("return");
++      synthesizeKey("KEY_Enter", {code: "Enter"});
+       checkForm("value2");
+ 
+       // Trigger autocomplete popup
+       expectPopup();
+       restoreForm();
+-      doKey("down");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       break;
+ 
+     case 61:
+       checkMenuEntries(["value2"], testNum);
+       // Check the new first entry (of 1)
+-      doKey("down");
+-      doKey("return");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_Enter", {code: "Enter"});
+       checkForm("value2");
+ 
+       // Trigger autocomplete popup
+       expectPopup();
+       restoreForm();
+-      doKey("down");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       break;
+ 
+     case 62:
+       // Delete the only remaining entry
+-      doKey("down");
+-      doKey("delete", shiftModifier);
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_Delete", {code: "Delete", shiftKey: true});
+       waitForMenuChange(0);
+       break;
+ 
+     case 63:
+       checkForm("");
+       countEntries("field1", "value2",
+                    function(num) {
+                      ok(!num, testNum + " checking that f1/v2 was deleted");
+@@ -575,54 +574,54 @@ function runTest() { // eslint-disable-l
+       break;
+ 
+     case 64:
+       // Look at form 2, trigger autocomplete popup
+       input = $_(2, "field2");
+       testNum = 99;
+       expectPopup();
+       restoreForm();
+-      doKey("down");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       break;
+ 
+     /* Test entries with autocomplete=off */
+ 
+     case 100:
+       // Select first entry
+-      doKey("down");
+-      doKey("return");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_Enter", {code: "Enter"});
+       checkForm("value1");
+ 
+       // Look at form 3, try to trigger autocomplete popup
+       input = $_(3, "field2");
+       restoreForm();
+       // Sometimes, this will fail if scrollTo(0, 0) is called, so that doesn't
+       // happen here. Fortunately, a different input is used from the last test,
+       // so a scroll should still occur.
+-      doKey("down");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       waitForScroll();
+       break;
+ 
+     case 101:
+       // Ensure there's no autocomplete dropdown (autocomplete=off is present)
+-      doKey("down");
+-      doKey("return");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_Enter", {code: "Enter"});
+       checkForm("");
+ 
+       // Look at form 4, try to trigger autocomplete popup
+       input = $_(4, "field2");
+       restoreForm();
+-      doKey("down");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       waitForMenuChange(0);
+       break;
+ 
+     case 102:
+       // Ensure there's no autocomplete dropdown (autocomplete=off is present)
+-      doKey("down");
+-      doKey("return");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_Enter", {code: "Enter"});
+       checkForm("");
+ 
+       // Look at form 5, try to trigger autocomplete popup
+       input = $_(5, "field3");
+       restoreForm();
+       testNum = 199;
+       expectPopup();
+       input.focus();
+@@ -642,51 +641,51 @@ function runTest() { // eslint-disable-l
+       checkMenuEntries(["aa", "aaz", "aa\xe6"], testNum);
+       input.focus();
+       sendChar("\xc6");
+       waitForMenuChange(1);
+       break;
+ 
+     case 202:
+       checkMenuEntries(["aa\xe6"], testNum);
+-      doKey("back_space");
++      synthesizeKey("KEY_Backspace", {code: "Backspace"});
+       waitForMenuChange(3);
+       break;
+ 
+     case 203:
+       checkMenuEntries(["aa", "aaz", "aa\xe6"], testNum);
+-      doKey("back_space");
++      synthesizeKey("KEY_Backspace", {code: "Backspace"});
+       waitForMenuChange(5);
+       break;
+ 
+     case 204:
+       checkMenuEntries(["a", "aa", "aaz", "aa\xe6", "az"], testNum);
+       input.focus();
+       sendChar("z");
+       waitForMenuChange(2);
+       break;
+ 
+     case 205:
+       checkMenuEntries(["az", "aaz"], testNum);
+       input.focus();
+-      doKey("left");
++      synthesizeKey("KEY_ArrowLeft", {code: "ArrowLeft"});
+       expectPopup();
+       // Check case-insensitivity.
+       sendChar("A");
+       break;
+ 
+     case 206:
+       checkMenuEntries(["aaz"], testNum);
+       addEntry("field3", "aazq");
+       break;
+ 
+     case 207:
+       // check that results were cached
+       input.focus();
+-      doKey("right");
++      synthesizeKey("KEY_ArrowRight", {code: "ArrowRight"});
+       sendChar("q");
+       waitForMenuChange(0);
+       break;
+ 
+     case 208:
+       // check that results were cached
+       checkMenuEntries([], testNum);
+       addEntry("field3", "aazqq");
+@@ -697,17 +696,17 @@ function runTest() { // eslint-disable-l
+       window.scrollTo(0, 0);
+       sendChar("q");
+       waitForMenuChange(0);
+       break;
+ 
+     case 210:
+       // check that empty results were cached - bug 496466
+       checkMenuEntries([], testNum);
+-      doKey("escape");
++      synthesizeKey("KEY_Escape", {code: "Escape"});
+ 
+       // Look at form 6, try to trigger autocomplete popup
+       input = $_(6, "field4");
+       restoreForm();
+       testNum = 249;
+       expectPopup();
+       input.focus();
+       sendChar("a");
+@@ -750,17 +749,17 @@ function runTest() { // eslint-disable-l
+       waitForMenuChange(2);
+       break;
+ 
+     case 254:
+       // check multi-word substring matches
+       checkMenuEntries(["bc d\xe6", "aba\xe6"]);
+       input.focus();
+       expectPopup();
+-      doKey("left");
++      synthesizeKey("KEY_ArrowLeft", {code: "ArrowLeft"});
+       sendChar("d");
+       break;
+ 
+     case 255:
+       // check inserting in multi-word searches
+       checkMenuEntries(["bc d\xe6"], testNum);
+       input.focus();
+       sendChar("z");
+@@ -770,142 +769,142 @@ function runTest() { // eslint-disable-l
+     case 256:
+       checkMenuEntries([], testNum);
+ 
+       // Look at form 7, try to trigger autocomplete popup
+       input = $_(7, "field5");
+       testNum = 299;
+       expectPopup();
+       restoreForm();
+-      doKey("down");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       break;
+ 
+     case 300:
+       checkMenuEntries(["1", "12", "123", "1234"], testNum);
+       input.maxLength = 4;
+       expectPopup();
+-      doKey("escape");
+-      doKey("down");
++      synthesizeKey("KEY_Escape", {code: "Escape"});
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       break;
+ 
+     case 301:
+       checkMenuEntries(["1", "12", "123", "1234"], testNum);
+       input.maxLength = 3;
+       expectPopup();
+-      doKey("escape");
+-      doKey("down");
++      synthesizeKey("KEY_Escape", {code: "Escape"});
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       break;
+ 
+     case 302:
+       checkMenuEntries(["1", "12", "123"], testNum);
+       input.maxLength = 2;
+       expectPopup();
+-      doKey("escape");
+-      doKey("down");
++      synthesizeKey("KEY_Escape", {code: "Escape"});
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       break;
+ 
+     case 303:
+       checkMenuEntries(["1", "12"], testNum);
+       input.maxLength = 1;
+       expectPopup();
+-      doKey("escape");
+-      doKey("down");
++      synthesizeKey("KEY_Escape", {code: "Escape"});
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       break;
+ 
+     case 304:
+       checkMenuEntries(["1"], testNum);
+       input.maxLength = 0;
+-      doKey("escape");
+-      doKey("down");
++      synthesizeKey("KEY_Escape", {code: "Escape"});
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       waitForMenuChange(0);
+       break;
+ 
+     case 305:
+       checkMenuEntries([], testNum);
+       input.maxLength = 4;
+ 
+       // now again with a character typed
+       input.focus();
+       sendChar("1");
+       expectPopup();
+-      doKey("escape");
+-      doKey("down");
++      synthesizeKey("KEY_Escape", {code: "Escape"});
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       break;
+ 
+     case 306:
+       checkMenuEntries(["1", "12", "123", "1234"], testNum);
+       input.maxLength = 3;
+       expectPopup();
+-      doKey("escape");
+-      doKey("down");
++      synthesizeKey("KEY_Escape", {code: "Escape"});
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       break;
+ 
+     case 307:
+       checkMenuEntries(["1", "12", "123"], testNum);
+       input.maxLength = 2;
+       expectPopup();
+-      doKey("escape");
+-      doKey("down");
++      synthesizeKey("KEY_Escape", {code: "Escape"});
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       break;
+ 
+     case 308:
+       checkMenuEntries(["1", "12"], testNum);
+       input.maxLength = 1;
+       expectPopup();
+-      doKey("escape");
+-      doKey("down");
++      synthesizeKey("KEY_Escape", {code: "Escape"});
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       break;
+ 
+     case 309:
+       checkMenuEntries(["1"], testNum);
+       input.maxLength = 0;
+-      doKey("escape");
+-      doKey("down");
++      synthesizeKey("KEY_Escape", {code: "Escape"});
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       waitForMenuChange(0);
+       break;
+ 
+     case 310:
+       checkMenuEntries([], testNum);
+ 
+       input = $_(8, "field6");
+       testNum = 399;
+       expectPopup();
+       restoreForm();
+-      doKey("down");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       break;
+ 
+     case 400:
+     case 401:
+     case 402:
+     case 403:
+       checkMenuEntries(["value"], testNum);
+-      doKey("down");
+-      doKey("return");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_Enter", {code: "Enter"});
+       checkForm("value");
+ 
+       if (testNum == 400) {
+         input = $_(9, "field7");
+       } else if (testNum == 401) {
+         input = $_(10, "field8");
+       } else if (testNum == 402) {
+         input = $_(11, "field9");
+       } else if (testNum == 403) {
+         todo(false, "Fix input type=number");
+         input = $_(12, "field10");
+       }
+ 
+       expectPopup();
+       restoreForm();
+-      doKey("down");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       break;
+ 
+     case 404:
+       checkMenuEntries(["42"], testNum);
+-      doKey("down");
+-      doKey("return");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_Enter", {code: "Enter"});
+       checkForm("42");
+ 
+       input = $_(14, "field11");
+       restoreForm();
+       waitForMenuChange(0);
+       break;
+ 
+     case 405:
+@@ -920,108 +919,108 @@ function runTest() { // eslint-disable-l
+ 
+     case 406:
+       checkMenuEntries([]); // type=time with it's own control frame does not
+       // have a drop down menu for now
+       checkForm("");
+ 
+       input = $_(16, "field13");
+       restoreForm();
+-      doKey("down");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       waitForMenuChange(0);
+       break;
+ 
+     case 407:
+       checkMenuEntries([]); // type=range does not have a drop down menu
+-      doKey("down");
+-      doKey("return");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_Enter", {code: "Enter"});
+       checkForm("30"); // default (midway between minimum (0) and maximum (64)) - step
+ 
+       input = $_(17, "field14");
+       restoreForm();
+       waitForMenuChange(0);
+       break;
+ 
+     case 408:
+       checkMenuEntries([]); // type=color does not have a drop down menu
+       checkForm("#000000"); // default color value
+ 
+       input = $_(18, "field15");
+       restoreForm();
+       expectPopup();
+-      doKey("down");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       break;
+ 
+     case 409:
+       checkMenuEntries(["2016-08"]);
+-      doKey("down");
+-      doKey("return");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_Enter", {code: "Enter"});
+       checkForm("2016-08");
+ 
+       input = $_(19, "field16");
+       restoreForm();
+       expectPopup();
+-      doKey("down");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       break;
+ 
+     case 410:
+       checkMenuEntries(["2016-W32"]);
+-      doKey("down");
+-      doKey("return");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_Enter", {code: "Enter"});
+       checkForm("2016-W32");
+ 
+       input = $_(20, "field17");
+       restoreForm();
+       expectPopup();
+-      doKey("down");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       break;
+ 
+     case 411:
+       checkMenuEntries(["2016-10-21T10:10"]);
+-      doKey("down");
+-      doKey("return");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_Enter", {code: "Enter"});
+       checkForm("2016-10-21T10:10");
+ 
+       addEntry("field1", "value1");
+       break;
+ 
+     case 412:
+       input = $_(1, "field1");
+       // Go to test 500.
+       testNum = 499;
+ 
+       expectPopup();
+       restoreForm();
+-      doKey("down");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       break;
+ 
+     // Check that the input event is fired.
+     case 500:
+       input.addEventListener("input", function(event) {
+         ok(true, testNum + " oninput should have been received");
+         ok(event.bubbles, testNum + " input event should bubble");
+         ok(event.cancelable, testNum + " input event should be cancelable");
+       }, {once: true});
+ 
+-      doKey("down");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       checkForm("");
+-      doKey("return");
++      synthesizeKey("KEY_Enter", {code: "Enter"});
+       checkForm("value1");
+       testNum = 599;
+       setTimeout(runTest, 100);
+       break;
+ 
+     case 600:
+       // check we don't show autocomplete for searchbar-history
+       input = $_(13, "searchbar-history");
+ 
+       // Trigger autocomplete popup
+       checkForm("");
+       restoreForm();
+-      doKey("down");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       waitForMenuChange(0);
+       break;
+ 
+     case 601:
+       checkMenuEntries([], testNum);
+       input.blur();
+       SimpleTest.finish();
+       return;
+diff --git a/toolkit/components/satchel/test/test_form_autocomplete_with_list.html b/toolkit/components/satchel/test/test_form_autocomplete_with_list.html
+--- a/toolkit/components/satchel/test/test_form_autocomplete_with_list.html
++++ b/toolkit/components/satchel/test/test_form_autocomplete_with_list.html
+@@ -43,17 +43,16 @@ Form History test: form field autocomple
+ <script class="testbody" type="text/javascript">
+ /* import-globals-from ../../../../testing/mochitest/tests/SimpleTest/EventUtils.js */
+ /* import-globals-from satchel_common.js */
+ /* eslint-disable complexity */
+ 
+ /** Test for Form History autocomplete **/
+ 
+ var input = $_(1, "field1");
+-const shiftModifier = Ci.nsIDOMEvent.SHIFT_MASK;
+ 
+ function setupFormHistory(aCallback) {
+   updateFormHistory([
+     { op: "remove" },
+     { op: "add", fieldname: "field1", value: "historyvalue" },
+     { op: "add", fieldname: "field2", value: "othervalue" },
+   ], aCallback);
+ }
+@@ -112,260 +111,260 @@ function runTest() {
+ 
+   switch (testNum) {
+     case 1:
+       // Make sure initial form is empty.
+       checkForm("");
+       // Trigger autocomplete popup
+       expectPopup();
+       restoreForm();
+-      doKey("down");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       break;
+     case 2:
+       checkMenuEntries(["historyvalue", "PASS1", "PASS2", "final"], testNum);
+       // Check first entry
+-      doKey("down");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       checkForm(""); // value shouldn't update
+-      doKey("return"); // not "enter"!
++      synthesizeKey("KEY_Enter", {code: "Enter"});
+       checkForm("historyvalue");
+ 
+       // Trigger autocomplete popup
+       expectPopup();
+       restoreForm();
+-      doKey("down");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       break;
+ 
+     case 3:
+       // Check second entry
+-      doKey("down");
+-      doKey("down");
+-      doKey("return"); // not "enter"!
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_Enter", {code: "Enter"});
+       checkForm("Google");
+ 
+       // Trigger autocomplete popup
+       expectPopup();
+       restoreForm();
+-      doKey("down");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       break;
+ 
+     case 4:
+       // Check third entry
+-      doKey("down");
+-      doKey("down");
+-      doKey("down");
+-      doKey("return");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_Enter", {code: "Enter"});
+       checkForm("Reddit");
+ 
+       // Trigger autocomplete popup
+       expectPopup();
+       restoreForm();
+-      doKey("down");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       break;
+ 
+     case 5:
+       // Check fourth entry
+-      doKey("down");
+-      doKey("down");
+-      doKey("down");
+-      doKey("down");
+-      doKey("return");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_Enter", {code: "Enter"});
+       checkForm("final");
+       expectPopup();
+       restoreForm();
+-      doKey("down");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       break;
+ 
+     case 6:
+       // Delete the first entry (of 3)
+-      doKey("down");
+-      doKey("delete", shiftModifier);
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_Delete", {code: "Delete", shiftKey: true});
+       waitForMenuChange(3);
+       break;
+ 
+     case 7:
+       checkForm("");
+       countEntries("field1", "historyvalue",
+                    function(num) {
+                      ok(!num, testNum + " checking that form history value was deleted");
+                      runTest();
+                    });
+       break;
+ 
+     case 8:
+-      doKey("return");
++      synthesizeKey("KEY_Enter", {code: "Enter"});
+       checkForm("Google");
+ 
+       // Trigger autocomplete popup
+       expectPopup();
+       restoreForm();
+-      doKey("down");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       break;
+ 
+     case 9:
+       // Test deletion
+       checkMenuEntries(["PASS1", "PASS2", "final"], testNum);
+       // Check the new first entry (of 3)
+-      doKey("down");
+-      doKey("return");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_Enter", {code: "Enter"});
+       checkForm("Google");
+ 
+       expectPopup();
+       restoreForm();
+-      doKey("down");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       break;
+ 
+     case 10:
+       // Test autocompletion of datalists with cached results.
+       sendString("PAS");
+       waitForMenuChange(2);
+       break;
+ 
+     case 11:
+       // Continuation of test 10
+       sendString("S1");
+       waitForMenuChange(1);
+       break;
+ 
+     case 12:
+-      doKey("down");
+-      doKey("return");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_Enter", {code: "Enter"});
+       checkForm("Google");
+ 
+       // Trigger autocomplete popup
+       // Look at form 3, try to trigger autocomplete popup
+       input.value = "";
+       input = $_(3, "field2");
+       testNum = 99;
+       expectPopup();
+       restoreForm();
+-      doKey("down");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       break;
+ 
+     case 100:
+       checkMenuEntries(["PASS1", "PASS2", "final"], testNum);
+       // Check first entry
+-      doKey("down");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       checkForm(""); // value shouldn't update
+-      doKey("return"); // not "enter"!
++      synthesizeKey("KEY_Enter", {code: "Enter"});
+       checkForm("Google");
+ 
+       // Trigger autocomplete popup
+       expectPopup();
+       restoreForm();
+-      doKey("down");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       break;
+ 
+     case 101:
+       // Check second entry
+-      doKey("down");
+-      doKey("down");
+-      doKey("return"); // not "enter"!
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_Enter", {code: "Enter"});
+       checkForm("Reddit");
+ 
+       // Trigger autocomplete popup
+       expectPopup();
+       restoreForm();
+-      doKey("down");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       break;
+ 
+     case 102:
+       // Check third entry
+-      doKey("down");
+-      doKey("down");
+-      doKey("down");
+-      doKey("return");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_Enter", {code: "Enter"});
+       checkForm("final");
+ 
+       // Trigger autocomplete popup
+       expectPopup();
+       restoreForm();
+-      doKey("down");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       break;
+ 
+     case 103:
+       checkMenuEntries(["PASS1", "PASS2", "final"], testNum);
+       // Check first entry
+-      doKey("down");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       checkForm(""); // value shouldn't update
+-      doKey("return"); // not "enter"!
++      synthesizeKey("KEY_Enter", {code: "Enter"});
+       checkForm("Google");
+ 
+       // Trigger autocomplete popup
+       expectPopup();
+       restoreForm();
+-      doKey("down");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       break;
+ 
+     case 104:
+       // Check second entry
+-      doKey("down");
+-      doKey("down");
+-      doKey("return"); // not "enter"!
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_Enter", {code: "Enter"});
+       checkForm("Reddit");
+ 
+       // Trigger autocomplete popup
+       expectPopup();
+       restoreForm();
+-      doKey("down");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       break;
+ 
+     case 105:
+       // Check third entry
+-      doKey("down");
+-      doKey("down");
+-      doKey("down");
+-      doKey("return");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_Enter", {code: "Enter"});
+       checkForm("final");
+ 
+       testNum = 199;
+       expectPopup();
+       restoreForm();
+-      doKey("down");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       break;
+ 
+     // Test dynamic updates.
+     // For some reasons, when there is an update of the list, the selection is
+     // lost so we need to go down like if we were at the beginning of the list
+     // again.
+     case 200:
+       // Removing the second element while on the first then going down and
+       // push enter. Value should be one from the third suggesion.
+-      doKey("down");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       datalist = document.getElementById("suggest");
+       let toRemove = datalist.children[1];
+       datalist.removeChild(toRemove);
+ 
+       SimpleTest.executeSoon(function() {
+-        doKey("down");
+-        doKey("down");
+-        doKey("return");
++        synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++        synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++        synthesizeKey("KEY_Enter", {code: "Enter"});
+         checkForm("final");
+ 
+         // Restore the element.
+         datalist.insertBefore(toRemove, datalist.children[1]);
+         expectPopup();
+         restoreForm();
+-        doKey("down");
++        synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       });
+       break;
+ 
+     case 201:
+       // Adding an attribute after the first one while on the first then going
+       // down and push enter. Value should be the on from the new suggestion.
+-      doKey("down");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       datalist = document.getElementById("suggest");
+       let added = new Option("Foo");
+       datalist.insertBefore(added, datalist.children[1]);
+       waitForMenuChange(4);
+       break;
+ 
+     case 202:
+-      doKey("down");
+-      doKey("down");
+-      doKey("return");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_Enter", {code: "Enter"});
+       checkForm("Foo");
+ 
+       // Remove the element.
+       datalist = document.getElementById("suggest");
+       datalist.removeChild(datalist.children[1]);
+       waitForMenuChange(0);
+       break;
+ 
+@@ -374,18 +373,18 @@ function runTest() {
+       restoreForm();
+       datalist = document.getElementById("suggest");
+       prevValue = datalist.children[0].value;
+       datalist.children[0].value = "foo";
+       expectPopup();
+       break;
+ 
+     case 204:
+-      doKey("down");
+-      doKey("return");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_Enter", {code: "Enter"});
+       checkForm("foo");
+ 
+       datalist = document.getElementById("suggest");
+       datalist.children[0].value = prevValue;
+       waitForMenuChange(0);
+       break;
+ 
+     case 205:
+@@ -394,93 +393,93 @@ function runTest() {
+       datalist = document.getElementById("suggest");
+       prevValue = datalist.children[0].getAttribute("value");
+       datalist.children[0].removeAttribute("value");
+       datalist.children[0].textContent = "foobar";
+       expectPopup();
+       break;
+ 
+     case 206:
+-      doKey("down");
+-      doKey("return");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_Enter", {code: "Enter"});
+       checkForm("foobar");
+ 
+       datalist = document.getElementById("suggest");
+       datalist.children[0].setAttribute("value", prevValue);
+       testNum = 299;
+       waitForMenuChange(0);
+       break;
+ 
+     // Tests for filtering (or not).
+     case 300:
+       // Filters with first letter of the word.
+       restoreForm();
+-      synthesizeKey("f", {});
++      synthesizeKey("f", {code: "KeyF"});
+       expectPopup();
+       break;
+ 
+     case 301:
+-      doKey("down");
+-      doKey("return");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_Enter", {code: "Enter"});
+       checkForm("final");
+       expectPopup();
+       restoreForm();
+-      doKey("down");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       break;
+ 
+     case 302:
+       // Filter with a letter in the middle of the word.
+-      synthesizeKey("i", {});
+-      synthesizeKey("n", {});
++      synthesizeKey("i", {code: "KeyI"});
++      synthesizeKey("n", {code: "KeyN"});
+       waitForMenuChange(1);
+       break;
+ 
+     case 303:
+       // Continuation of test 302.
+-      doKey("down");
+-      doKey("return");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_Enter", {code: "Enter"});
+       checkForm("final");
+       expectPopup();
+       restoreForm();
+-      doKey("down");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       break;
+ 
+     case 304:
+       // Filter is disabled with mozNoFilter.
+       input.setAttribute("mozNoFilter", "true");
+-      synthesizeKey("f", {});
++      synthesizeKey("f", {code: "KeyF"});
+       waitForMenuChange(3); // no change
+       break;
+ 
+     case 305:
+       // Continuation of test 304.
+-      doKey("down");
+-      doKey("return");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++      synthesizeKey("KEY_Enter", {code: "Enter"});
+       checkForm("Google");
+       input.removeAttribute("mozNoFilter");
+       testNum = 399;
+       expectPopup();
+       restoreForm();
+-      doKey("down");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       break;
+ 
+     case 400:
+       // Check that the input event is fired.
+       input.addEventListener("input", function(event) {
+         ok(true, "oninput should have been received");
+         ok(event.bubbles, "input event should bubble");
+         ok(event.cancelable, "input event should be cancelable");
+         checkForm("Google");
+         input.blur();
+         SimpleTest.finish();
+       }, {once: true});
+ 
+-      doKey("down");
++      synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+       checkForm("");
+-      doKey("return");
++      synthesizeKey("KEY_Enter", {code: "Enter"});
+       break;
+ 
+     default:
+       ok(false, "Unexpected invocation of test #" + testNum);
+       SimpleTest.finish();
+   }
+ }
+ 
+diff --git a/toolkit/components/satchel/test/test_password_autocomplete.html b/toolkit/components/satchel/test/test_password_autocomplete.html
+--- a/toolkit/components/satchel/test/test_password_autocomplete.html
++++ b/toolkit/components/satchel/test/test_password_autocomplete.html
+@@ -102,22 +102,22 @@ add_task(async function test_initialize(
+ add_task(async function test_secure_noFormHistoryOrWarning() {
+   let input = $_(1, "field1");
+ 
+   // The autocomplete popup should not open under any circumstances on
+   // type=password with password manager disabled.
+   for (let triggerFn of [
+     () => input.focus(),
+     () => input.click(),
+-    () => doKey("down"),
+-    () => doKey("page_down"),
+-    () => doKey("return"),
+-    () => doKey("v"),
+-    () => doKey(" "),
+-    () => doKey("back_space"),
++    () => synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"}),
++    () => synthesizeKey("KEY_PageDown", {code: "PageDown"}),
++    () => synthesizeKey("KEY_Enter", {code: "Enter"}),
++    () => synthesizeKey("v", {code: "KeyV"}),
++    () => synthesizeKey(" ", {code: "Space"}),
++    () => synthesizeKey("KEY_Backspace", {code: "Backspace"}),
+   ]) {
+     ok(true, "Testing: " + triggerFn.toString());
+     // We must wait for the entire timeout for each individual test, because the
+     // next event in the list might prevent the popup from opening.
+     await expectPopupDoesNotOpen(triggerFn);
+   }
+ 
+   // Close the popup.
+diff --git a/toolkit/components/satchel/test/test_popup_direction.html b/toolkit/components/satchel/test/test_popup_direction.html
+--- a/toolkit/components/satchel/test/test_popup_direction.html
++++ b/toolkit/components/satchel/test/test_popup_direction.html
+@@ -1,13 +1,14 @@
+ <!DOCTYPE HTML>
+ <html>
+ <head>
+   <title>Test for Popup Direction</title>
+   <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
++  <script type="text/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
+   <script type="text/javascript" src="/tests/SimpleTest/SpawnTask.js"></script>
+   <script type="text/javascript" src="satchel_common.js"></script>
+   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+ </head>
+ <body>
+ Test for Popup Direction
+ <p id="display"></p>
+ 
+@@ -40,17 +41,17 @@ add_task(async function test_popup_direc
+     { op: "add", fieldname: "field1", value: "value2" },
+   ], resolve));
+ 
+   for (let direction of ["ltr", "rtl"]) {
+     document.getElementById("content").style.direction = direction;
+ 
+     let popupShown = waitForNextPopup();
+     input.focus();
+-    doKey("down");
++    synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+     await popupShown;
+ 
+     let popupState = await new Promise(resolve => getPopupState(resolve));
+     is(popupState.direction, direction, "Direction should match.");
+ 
+     // Close the popup.
+     input.blur();
+   }
+diff --git a/toolkit/components/satchel/test/test_popup_enter_event.html b/toolkit/components/satchel/test/test_popup_enter_event.html
+--- a/toolkit/components/satchel/test/test_popup_enter_event.html
++++ b/toolkit/components/satchel/test/test_popup_enter_event.html
+@@ -47,19 +47,19 @@ function handleEnter(evt) {
+     is(input.value, expectedValue, "Check input value when enter is pressed the 2nd time");
+     info("form should submit with the default handler");
+   } else {
+     ok(false, "RETURN keypress shouldn't have been received when a popup item is selected");
+   }
+ }
+ 
+ function popupShownListener(evt) {
+-  doKey("down");
+-  doKey("return"); // select the first entry in the popup
+-  doKey("return"); // try to submit the form with the filled value
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
++  synthesizeKey("KEY_Enter", {code: "Enter"}); // select the first entry in the popup
++  synthesizeKey("KEY_Enter", {code: "Enter"}); // try to submit the form with the filled value
+ }
+ 
+ function runTest() {
+   input.addEventListener("keypress", handleEnter, true);
+   form.addEventListener("submit", function submitCallback(evt) {
+     is(input.value, expectedValue, "Check input value in the submit handler");
+     evt.preventDefault();
+ 
+@@ -69,17 +69,17 @@ function runTest() {
+     SimpleTest.finish();
+   });
+ 
+   // Focus the input before adjusting.value so that the caret goes to the end
+   // (since OS X doesn't show the dropdown otherwise).
+   input.focus();
+   input.value = "value";
+   input.focus();
+-  doKey("down");
++  synthesizeKey("KEY_ArrowDown", {code: "ArrowDown"});
+ }
+ 
+ function startTest() {
+   setupFormHistory(function() {
+     runTest();
+   });
+ }
+ 
+diff --git a/widget/headless/tests/test_headless.js b/widget/headless/tests/test_headless.js
+--- a/widget/headless/tests/test_headless.js
++++ b/widget/headless/tests/test_headless.js
+@@ -130,24 +130,27 @@ add_task(function* test_snapshot_widget_
+ });
+ 
+ // Ensure keydown events are triggered on the windowless browser.
+ add_task(async function test_keydown() {
+   let windowlessBrowser = Services.appShell.createWindowlessBrowser(false);
+   let webNavigation = windowlessBrowser.QueryInterface(Ci.nsIWebNavigation);
+   let contentWindow = await loadContentWindow(webNavigation, HEADLESS_URL);
+ 
+-  let utils = contentWindow.QueryInterface(Ci.nsIInterfaceRequestor)
+-                           .getInterface(Ci.nsIDOMWindowUtils);
+   let keydown = new Promise((resolve) => {
+     contentWindow.addEventListener("keydown", () => {
+       resolve();
+     }, { once: true });
+   })
+-  utils.sendKeyEvent("keydown", 65, 65, 0);
++
++  let tip = Cc["@mozilla.org/text-input-processor;1"]
++            .createInstance(Ci.nsITextInputProcessor);
++  let begun = tip.beginInputTransactionForTests(contentWindow);
++  ok(begun, "nsITextInputProcessor.beginInputTransactionForTests() should succeed");
++  tip.keydown(new contentWindow.KeyboardEvent("", {key: "a", code: "KeyA", keyCode: contentWindow.KeyboardEvent.DOM_VK_A}));
+ 
+   await keydown;
+   ok(true, "Send keydown didn't crash");
+ 
+   webNavigation.close();
+ });
+ 
+ // Test dragging the mouse on a button to ensure the creation of the drag

+ 71 - 0
frg/work-js/mozilla-release/patches/1230369-1a-60a1.patch

@@ -0,0 +1,71 @@
+# HG changeset patch
+# User Mark Banner <standard8@mozilla.com>
+# Date 1517995455 0
+# Node ID 76c1582d760e117d1ce2befbc2af998c24760231
+# Parent  eb071d162e580c2164d65253ea1041467c4fc8cb
+Bug 1230369 - Manually fix some remaining instances of Ci/Cc/Cu definitions and switch Components.* to using the shorthand in some places. r=florian
+
+MozReview-Commit-ID: 9SmoR9RlvZE
+
+diff --git a/browser/components/preferences/in-content-new/main.js b/browser/components/preferences/in-content-new/main.js
+--- a/browser/components/preferences/in-content-new/main.js
++++ b/browser/components/preferences/in-content-new/main.js
+@@ -453,17 +453,16 @@ var gMainPane = {
+       let separateProfileModeCheckbox = document.getElementById("separateProfileMode");
+       let button_index = confirmRestartPrompt(separateProfileModeCheckbox.checked,
+                                               0, false, true);
+       switch (button_index) {
+         case CONFIRM_RESTART_PROMPT_CANCEL:
+           revertCheckbox();
+           return;
+         case CONFIRM_RESTART_PROMPT_RESTART_NOW:
+-          const Cc = Components.classes, Ci = Components.interfaces;
+           let cancelQuit = Cc["@mozilla.org/supports-PRBool;1"]
+                              .createInstance(Ci.nsISupportsPRBool);
+           Services.obs.notifyObservers(cancelQuit, "quit-application-requested",
+                                         "restart");
+           if (!cancelQuit.data) {
+             createOrRemoveSpecialDevEditionFile(quitApp);
+             return;
+           }
+@@ -474,17 +473,16 @@ var gMainPane = {
+         case CONFIRM_RESTART_PROMPT_RESTART_LATER:
+           createOrRemoveSpecialDevEditionFile();
+       }
+     }
+   },
+ 
+   onGetStarted(aEvent) {
+     if (AppConstants.MOZ_DEV_EDITION) {
+-      const Cc = Components.classes, Ci = Components.interfaces;
+       let win = Services.wm.getMostRecentWindow("navigator:browser");
+ 
+       fxAccounts.getSignedInUser().then(data => {
+         if (win) {
+           if (data) {
+             // We have a user, open Sync preferences in the same tab
+             win.openUILinkIn("about:preferences#sync", "current");
+             return;
+@@ -610,21 +608,18 @@ var gMainPane = {
+     let prefName = "pref.browser.homepage.disable_button.current_page";
+     if (document.getElementById(prefName).locked)
+       return;
+ 
+     useCurrent.disabled = !tabs.length;
+   },
+ 
+   _getTabsForHomePage() {
+-    var win;
+     var tabs = [];
+-
+-    const Cc = Components.classes, Ci = Components.interfaces;
+-    win = Services.wm.getMostRecentWindow("navigator:browser");
++    var win = Services.wm.getMostRecentWindow("navigator:browser");
+ 
+     if (win && win.document.documentElement
+                   .getAttribute("windowtype") == "navigator:browser") {
+       // We should only include visible & non-pinned tabs
+ 
+       tabs = win.gBrowser.visibleTabs.slice(win.gBrowser._numPinnedTabs);
+       tabs = tabs.filter(this.isNotAboutPreferences);
+     }

+ 475 - 0
frg/work-js/mozilla-release/patches/1230373-3a-58a1.patch

@@ -0,0 +1,475 @@
+# HG changeset patch
+# User Mark Banner <standard8@mozilla.com>
+# Date 1507733031 -3600
+# Node ID c072884b1b905a6e00f756c7d3697df3447e7b63
+# Parent  fe1bf993db306dd55c9d7942e30fa9cd92e750dd
+Bug 1230373 - Enable mozilla/use-services for browser/components/ r=mossop
+
+MozReview-Commit-ID: 9m9iss3jUJJ
+
+diff --git a/browser/components/preferences/in-content-new/main.js b/browser/components/preferences/in-content-new/main.js
+--- a/browser/components/preferences/in-content-new/main.js
++++ b/browser/components/preferences/in-content-new/main.js
+@@ -6,17 +6,16 @@
+ /* import-globals-from ../../../../toolkit/mozapps/preferences/fontbuilder.js */
+ /* import-globals-from ../../../base/content/aboutDialog-appUpdater.js */
+ 
+ ChromeUtils.import("resource://gre/modules/Services.jsm");
+ ChromeUtils.import("resource://gre/modules/Downloads.jsm");
+ ChromeUtils.import("resource://gre/modules/FileUtils.jsm");
+ ChromeUtils.import("resource:///modules/ShellService.jsm");
+ ChromeUtils.import("resource:///modules/TransientPrefs.jsm");
+-ChromeUtils.import("resource://gre/modules/Services.jsm");
+ ChromeUtils.import("resource://gre/modules/AppConstants.jsm");
+ ChromeUtils.import("resource://gre/modules/DownloadUtils.jsm");
+ ChromeUtils.defineModuleGetter(this, "CloudStorage",
+                                "resource://gre/modules/CloudStorage.jsm");
+ 
+ // Constants & Enumeration Values
+ const TYPE_MAYBE_FEED = "application/vnd.mozilla.maybe.feed";
+ const TYPE_MAYBE_VIDEO_FEED = "application/vnd.mozilla.maybe.video.feed";
+@@ -104,31 +103,25 @@ var gMainPane = {
+   // Convenience & Performance Shortcuts
+ 
+   // These get defined by init().
+   _brandShortName: null,
+   _prefsBundle: null,
+   _list: null,
+   _filter: null,
+ 
+-  _prefSvc: Cc["@mozilla.org/preferences-service;1"].
+-            getService(Ci.nsIPrefBranch),
+-
+   _mimeSvc: Cc["@mozilla.org/mime;1"].
+             getService(Ci.nsIMIMEService),
+ 
+   _helperAppSvc: Cc["@mozilla.org/uriloader/external-helper-app-service;1"].
+                  getService(Ci.nsIExternalHelperAppService),
+ 
+   _handlerSvc: Cc["@mozilla.org/uriloader/handler-service;1"].
+                getService(Ci.nsIHandlerService),
+ 
+-  _ioSvc: Cc["@mozilla.org/network/io-service;1"].
+-          getService(Ci.nsIIOService),
+-
+   /**
+    * Initialization of this.
+    */
+   init() {
+     function setEventListener(aId, aEventType, aCallback) {
+       document.getElementById(aId)
+               .addEventListener(aEventType, aCallback.bind(gMainPane));
+     }
+@@ -183,19 +176,17 @@ var gMainPane = {
+     this._updateUseCurrentButton();
+     window.addEventListener("focus", this._updateUseCurrentButton.bind(this));
+ 
+     this.updateBrowserStartupLastSession();
+ 
+     if (AppConstants.platform == "win") {
+       // Functionality for "Show tabs in taskbar" on Windows 7 and up.
+       try {
+-        let sysInfo = Cc["@mozilla.org/system-info;1"].
+-                      getService(Ci.nsIPropertyBag2);
+-        let ver = parseFloat(sysInfo.getProperty("version"));
++        let ver = parseFloat(Services.sysinfo.getProperty("version"));
+         let showTabsInTaskbar = document.getElementById("showTabsInTaskbar");
+         showTabsInTaskbar.hidden = ver < 6.1;
+       } catch (ex) {}
+     }
+ 
+     // The "closing multiple tabs" and "opening multiple tabs might slow down
+     // &brandShortName;" warnings provide options for not showing these
+     // warnings again. When the user disabled them, we provide checkboxes to
+@@ -341,30 +332,30 @@ var gMainPane = {
+     this._brandShortName =
+       document.getElementById("bundleBrand").getString("brandShortName");
+     this._prefsBundle = document.getElementById("bundlePreferences");
+     this._list = document.getElementById("handlersView");
+     this._filter = document.getElementById("filter");
+ 
+     // Observe preferences that influence what we display so we can rebuild
+     // the view when they change.
+-    this._prefSvc.addObserver(PREF_FEED_SELECTED_APP, this);
+-    this._prefSvc.addObserver(PREF_FEED_SELECTED_WEB, this);
+-    this._prefSvc.addObserver(PREF_FEED_SELECTED_ACTION, this);
+-    this._prefSvc.addObserver(PREF_FEED_SELECTED_READER, this);
+-
+-    this._prefSvc.addObserver(PREF_VIDEO_FEED_SELECTED_APP, this);
+-    this._prefSvc.addObserver(PREF_VIDEO_FEED_SELECTED_WEB, this);
+-    this._prefSvc.addObserver(PREF_VIDEO_FEED_SELECTED_ACTION, this);
+-    this._prefSvc.addObserver(PREF_VIDEO_FEED_SELECTED_READER, this);
+-
+-    this._prefSvc.addObserver(PREF_AUDIO_FEED_SELECTED_APP, this);
+-    this._prefSvc.addObserver(PREF_AUDIO_FEED_SELECTED_WEB, this);
+-    this._prefSvc.addObserver(PREF_AUDIO_FEED_SELECTED_ACTION, this);
+-    this._prefSvc.addObserver(PREF_AUDIO_FEED_SELECTED_READER, this);
++    Services.prefs.addObserver(PREF_FEED_SELECTED_APP, this);
++    Services.prefs.addObserver(PREF_FEED_SELECTED_WEB, this);
++    Services.prefs.addObserver(PREF_FEED_SELECTED_ACTION, this);
++    Services.prefs.addObserver(PREF_FEED_SELECTED_READER, this);
++
++    Services.prefs.addObserver(PREF_VIDEO_FEED_SELECTED_APP, this);
++    Services.prefs.addObserver(PREF_VIDEO_FEED_SELECTED_WEB, this);
++    Services.prefs.addObserver(PREF_VIDEO_FEED_SELECTED_ACTION, this);
++    Services.prefs.addObserver(PREF_VIDEO_FEED_SELECTED_READER, this);
++
++    Services.prefs.addObserver(PREF_AUDIO_FEED_SELECTED_APP, this);
++    Services.prefs.addObserver(PREF_AUDIO_FEED_SELECTED_WEB, this);
++    Services.prefs.addObserver(PREF_AUDIO_FEED_SELECTED_ACTION, this);
++    Services.prefs.addObserver(PREF_AUDIO_FEED_SELECTED_READER, this);
+ 
+     setEventListener("focusSearch1", "command", gMainPane.focusFilterBox);
+     setEventListener("focusSearch2", "command", gMainPane.focusFilterBox);
+     setEventListener("filter", "command", gMainPane.filter);
+     setEventListener("handlersView", "select",
+       gMainPane.onSelectionChanged);
+     setEventListener("typeColumn", "click", gMainPane.sort);
+     setEventListener("actionColumn", "click", gMainPane.sort);
+@@ -408,19 +399,17 @@ var gMainPane = {
+     appendSearchKeywords("browserContainersSettings", [
+       browserBundle.getString("userContextPersonal.label"),
+       browserBundle.getString("userContextWork.label"),
+       browserBundle.getString("userContextBanking.label"),
+       browserBundle.getString("userContextShopping.label"),
+     ]);
+ 
+     // Notify observers that the UI is now ready
+-    Cc["@mozilla.org/observer-service;1"]
+-      .getService(Ci.nsIObserverService)
+-      .notifyObservers(window, "main-pane-loaded");
++    Services.obs.notifyObservers(window, "main-pane-loaded");
+   },
+ 
+   /**
+    * Show the Containers UI depending on the privacy.userContext.ui.enabled pref.
+    */
+   initBrowserContainers() {
+     if (!Services.prefs.getBoolPref("privacy.userContext.ui.enabled")) {
+       // The browserContainersGroup element has its own internal padding that
+@@ -486,19 +475,17 @@ var gMainPane = {
+           createOrRemoveSpecialDevEditionFile();
+       }
+     }
+   },
+ 
+   onGetStarted(aEvent) {
+     if (AppConstants.MOZ_DEV_EDITION) {
+       const Cc = Components.classes, Ci = Components.interfaces;
+-      let wm = Cc["@mozilla.org/appshell/window-mediator;1"]
+-                  .getService(Ci.nsIWindowMediator);
+-      let win = wm.getMostRecentWindow("navigator:browser");
++      let win = Services.wm.getMostRecentWindow("navigator:browser");
+ 
+       fxAccounts.getSignedInUser().then(data => {
+         if (win) {
+           if (data) {
+             // We have a user, open Sync preferences in the same tab
+             win.openUILinkIn("about:preferences#sync", "current");
+             return;
+           }
+@@ -627,19 +614,17 @@ var gMainPane = {
+     useCurrent.disabled = !tabs.length;
+   },
+ 
+   _getTabsForHomePage() {
+     var win;
+     var tabs = [];
+ 
+     const Cc = Components.classes, Ci = Components.interfaces;
+-    var wm = Cc["@mozilla.org/appshell/window-mediator;1"]
+-                .getService(Ci.nsIWindowMediator);
+-    win = wm.getMostRecentWindow("navigator:browser");
++    win = Services.wm.getMostRecentWindow("navigator:browser");
+ 
+     if (win && win.document.documentElement
+                   .getAttribute("windowtype") == "navigator:browser") {
+       // We should only include visible & non-pinned tabs
+ 
+       tabs = win.gBrowser.visibleTabs.slice(win.gBrowser._numPinnedTabs);
+       tabs = tabs.filter(this.isNotAboutPreferences);
+     }
+@@ -1186,30 +1171,30 @@ var gMainPane = {
+    * Displays the history of installed updates.
+    */
+   showUpdates() {
+     gSubDialog.open("chrome://mozapps/content/update/history.xul");
+   },
+ 
+   destroy() {
+     window.removeEventListener("unload", this);
+-    this._prefSvc.removeObserver(PREF_FEED_SELECTED_APP, this);
+-    this._prefSvc.removeObserver(PREF_FEED_SELECTED_WEB, this);
+-    this._prefSvc.removeObserver(PREF_FEED_SELECTED_ACTION, this);
+-    this._prefSvc.removeObserver(PREF_FEED_SELECTED_READER, this);
+-
+-    this._prefSvc.removeObserver(PREF_VIDEO_FEED_SELECTED_APP, this);
+-    this._prefSvc.removeObserver(PREF_VIDEO_FEED_SELECTED_WEB, this);
+-    this._prefSvc.removeObserver(PREF_VIDEO_FEED_SELECTED_ACTION, this);
+-    this._prefSvc.removeObserver(PREF_VIDEO_FEED_SELECTED_READER, this);
+-
+-    this._prefSvc.removeObserver(PREF_AUDIO_FEED_SELECTED_APP, this);
+-    this._prefSvc.removeObserver(PREF_AUDIO_FEED_SELECTED_WEB, this);
+-    this._prefSvc.removeObserver(PREF_AUDIO_FEED_SELECTED_ACTION, this);
+-    this._prefSvc.removeObserver(PREF_AUDIO_FEED_SELECTED_READER, this);
++    Services.prefs.removeObserver(PREF_FEED_SELECTED_APP, this);
++    Services.prefs.removeObserver(PREF_FEED_SELECTED_WEB, this);
++    Services.prefs.removeObserver(PREF_FEED_SELECTED_ACTION, this);
++    Services.prefs.removeObserver(PREF_FEED_SELECTED_READER, this);
++
++    Services.prefs.removeObserver(PREF_VIDEO_FEED_SELECTED_APP, this);
++    Services.prefs.removeObserver(PREF_VIDEO_FEED_SELECTED_WEB, this);
++    Services.prefs.removeObserver(PREF_VIDEO_FEED_SELECTED_ACTION, this);
++    Services.prefs.removeObserver(PREF_VIDEO_FEED_SELECTED_READER, this);
++
++    Services.prefs.removeObserver(PREF_AUDIO_FEED_SELECTED_APP, this);
++    Services.prefs.removeObserver(PREF_AUDIO_FEED_SELECTED_WEB, this);
++    Services.prefs.removeObserver(PREF_AUDIO_FEED_SELECTED_ACTION, this);
++    Services.prefs.removeObserver(PREF_AUDIO_FEED_SELECTED_READER, this);
+   },
+ 
+ 
+   // nsISupports
+ 
+   QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver]),
+ 
+   // nsIObserver
+@@ -1984,34 +1969,34 @@ var gMainPane = {
+     if (aHandlerApp instanceof Ci.nsIWebContentHandlerInfo)
+       return this._getIconURLForWebApp(aHandlerApp.uri);
+ 
+     // We know nothing about other kinds of handler apps.
+     return "";
+   },
+ 
+   _getIconURLForFile(aFile) {
+-    var fph = this._ioSvc.getProtocolHandler("file").
++    var fph = Services.io.getProtocolHandler("file").
+               QueryInterface(Ci.nsIFileProtocolHandler);
+     var urlSpec = fph.getURLSpecFromFile(aFile);
+ 
+     return "moz-icon://" + urlSpec + "?size=16";
+   },
+ 
+   _getIconURLForWebApp(aWebAppURITemplate) {
+-    var uri = this._ioSvc.newURI(aWebAppURITemplate);
++    var uri = Services.io.newURI(aWebAppURITemplate);
+ 
+     // Unfortunately we can't use the favicon service to get the favicon,
+     // because the service looks in the annotations table for a record with
+     // the exact URL we give it, and users won't have such records for URLs
+     // they don't visit, and users won't visit the web app's URL template,
+     // they'll only visit URLs derived from that template (i.e. with %s
+     // in the template replaced by the URL of the content being handled).
+ 
+-    if (/^https?$/.test(uri.scheme) && this._prefSvc.getBoolPref("browser.chrome.favicons"))
++    if (/^https?$/.test(uri.scheme) && Services.prefs.getBoolPref("browser.chrome.favicons"))
+       return uri.prePath + "/favicon.ico";
+ 
+     return "";
+   },
+ 
+   _getIconURLForSystemDefault(aHandlerInfo) {
+     // Handler info objects for MIME types on some OSes implement a property bag
+     // interface from which we can get an icon for the default app, so if we're
+@@ -2221,19 +2206,17 @@ var gMainPane = {
+ 
+   async displayDownloadDirPrefTask() {
+     var folderListPref = document.getElementById("browser.download.folderList");
+     var bundlePreferences = document.getElementById("bundlePreferences");
+     var downloadFolder = document.getElementById("downloadFolder");
+     var currentDirPref = document.getElementById("browser.download.dir");
+ 
+     // Used in defining the correct path to the folder icon.
+-    var ios = Cc["@mozilla.org/network/io-service;1"]
+-                .getService(Ci.nsIIOService);
+-    var fph = ios.getProtocolHandler("file")
++    var fph = Services.io.getProtocolHandler("file")
+                  .QueryInterface(Ci.nsIFileProtocolHandler);
+     var iconUrlSpec;
+ 
+     let folderIndex = folderListPref.value;
+     if (folderIndex == 3) {
+       // When user has selected cloud storage, use value in currentDirPref to
+       // compute index to display download folder label and icon to avoid
+       // displaying blank downloadFolder label and icon on load of preferences UI
+@@ -2274,19 +2257,17 @@ var gMainPane = {
+    * the XPCOM directory service via the download manager's attribute
+    * defaultDownloadsDirectory.
+    *
+    * @throws if aFolder is not "Desktop" or "Downloads"
+    */
+   async _getDownloadsFolder(aFolder) {
+     switch (aFolder) {
+       case "Desktop":
+-        var fileLoc = Cc["@mozilla.org/file/directory_service;1"]
+-                                    .getService(Ci.nsIProperties);
+-        return fileLoc.get("Desk", Ci.nsIFile);
++        return Services.dirsvc.get("Desk", Ci.nsIFile);
+       case "Downloads":
+         let downloadsDir = await Downloads.getSystemDownloadsDirectory();
+         return new FileUtils.File(downloadsDir);
+     }
+     throw "ASSERTION FAILED: folder type should be 'Desktop' or 'Downloads'";
+   },
+ 
+   /**
+@@ -2414,19 +2395,16 @@ HandlerInfoWrapper.prototype = {
+   wrappedHandlerInfo: null,
+ 
+ 
+   // Convenience Utils
+ 
+   _handlerSvc: Cc["@mozilla.org/uriloader/handler-service;1"].
+                getService(Ci.nsIHandlerService),
+ 
+-  _prefSvc: Cc["@mozilla.org/preferences-service;1"].
+-            getService(Ci.nsIPrefBranch),
+-
+   _categoryMgr: Cc["@mozilla.org/categorymanager;1"].
+                 getService(Ci.nsICategoryManager),
+ 
+   element(aID) {
+     return document.getElementById(aID);
+   },
+ 
+ 
+diff --git a/browser/components/preferences/in-content-new/preferences.js b/browser/components/preferences/in-content-new/preferences.js
+--- a/browser/components/preferences/in-content-new/preferences.js
++++ b/browser/components/preferences/in-content-new/preferences.js
+@@ -283,17 +283,16 @@ function confirmRestartPrompt(aRestartTo
+                               aWantRestartLaterButton) {
+   let brandName = document.getElementById("bundleBrand").getString("brandShortName");
+   let bundle = document.getElementById("bundlePreferences");
+   let msg = bundle.getFormattedString(aRestartToEnable ?
+                                       "featureEnableRequiresRestart" :
+                                       "featureDisableRequiresRestart",
+                                       [brandName]);
+   let title = bundle.getFormattedString("shouldRestartTitle", [brandName]);
+-  let prompts = Cc["@mozilla.org/embedcomp/prompt-service;1"].getService(Ci.nsIPromptService);
+ 
+   // Set up the first (index 0) button:
+   let button0Text = bundle.getFormattedString("okToRestartButton", [brandName]);
+   let buttonFlags = (Services.prompt.BUTTON_POS_0 *
+                      Services.prompt.BUTTON_TITLE_IS_STRING);
+ 
+ 
+   // Set up the second (index 1) button:
+@@ -324,19 +323,19 @@ function confirmRestartPrompt(aRestartTo
+       break;
+     case 2:
+       buttonFlags += Services.prompt.BUTTON_POS_2_DEFAULT;
+       break;
+     default:
+       break;
+   }
+ 
+-  let buttonIndex = prompts.confirmEx(window, title, msg, buttonFlags,
+-                                      button0Text, button1Text, button2Text,
+-                                      null, {});
++  let buttonIndex = Services.prompt.confirmEx(window, title, msg, buttonFlags,
++                                              button0Text, button1Text, button2Text,
++                                              null, {});
+ 
+   // If we have the second confirmation dialog for restart, see if the user
+   // cancels out at that point.
+   if (buttonIndex == CONFIRM_RESTART_PROMPT_RESTART_NOW) {
+     let cancelQuit = Cc["@mozilla.org/supports-PRBool;1"]
+                        .createInstance(Ci.nsISupportsPRBool);
+     Services.obs.notifyObservers(cancelQuit, "quit-application-requested",
+                                   "restart");
+diff --git a/browser/components/preferences/in-content-new/privacy.js b/browser/components/preferences/in-content-new/privacy.js
+--- a/browser/components/preferences/in-content-new/privacy.js
++++ b/browser/components/preferences/in-content-new/privacy.js
+@@ -273,19 +273,17 @@ var gPrivacyPane = {
+     ]);
+     appendSearchKeywords("siteDataSettings", [
+       bundlePrefs.getString("siteDataSettings2.description"),
+       bundlePrefs.getString("removeAllCookies.label"),
+       bundlePrefs.getString("removeSelectedCookies.label"),
+     ]);
+ 
+     // Notify observers that the UI is now ready
+-    Cc["@mozilla.org/observer-service;1"]
+-      .getService(Ci.nsIObserverService)
+-      .notifyObservers(window, "privacy-pane-loaded");
++    Services.obs.notifyObservers(window, "privacy-pane-loaded");
+   },
+ 
+   // TRACKING PROTECTION MODE
+ 
+   /**
+    * Selects the right item of the Tracking Protection radiogroup.
+    */
+   trackingProtectionReadPrefs() {
+@@ -533,19 +531,17 @@ var gPrivacyPane = {
+         // We're performing a revert. Just let it happen.
+         return;
+       }
+ 
+       let buttonIndex = confirmRestartPrompt(autoStart.checked, 1,
+                                              true, false);
+       if (buttonIndex == CONFIRM_RESTART_PROMPT_RESTART_NOW) {
+         pref.value = autoStart.hasAttribute("checked");
+-        let appStartup = Cc["@mozilla.org/toolkit/app-startup;1"]
+-                           .getService(Ci.nsIAppStartup);
+-        appStartup.quit(Ci.nsIAppStartup.eAttemptQuit | Ci.nsIAppStartup.eRestart);
++        Services.startup.quit(Ci.nsIAppStartup.eAttemptQuit | Ci.nsIAppStartup.eRestart);
+         return;
+       }
+ 
+       this._shouldPromptForRestart = false;
+ 
+       if (this._lastCheckState) {
+         autoStart.checked = "checked";
+       } else {
+@@ -961,22 +957,20 @@ var gPrivacyPane = {
+    * Displays the "remove master password" dialog to allow the user to remove
+    * the current master password.  When the dialog is dismissed, master password
+    * UI is automatically updated.
+    */
+   _removeMasterPassword() {
+     var secmodDB = Cc["@mozilla.org/security/pkcs11moduledb;1"].
+                    getService(Ci.nsIPKCS11ModuleDB);
+     if (secmodDB.isFIPSEnabled) {
+-      var promptService = Cc["@mozilla.org/embedcomp/prompt-service;1"].
+-                          getService(Ci.nsIPromptService);
+       var bundle = document.getElementById("bundlePreferences");
+-      promptService.alert(window,
+-                          bundle.getString("pw_change_failed_title"),
+-                          bundle.getString("pw_change2empty_in_fips_mode"));
++      Services.prompt.alert(window,
++                            bundle.getString("pw_change_failed_title"),
++                            bundle.getString("pw_change2empty_in_fips_mode"));
+       this._initMasterPasswordUI();
+     } else {
+       gSubDialog.open("chrome://mozapps/content/preferences/removemp.xul",
+                       null, null, this._initMasterPasswordUI.bind(this));
+     }
+   },
+ 
+   /**
+diff --git a/browser/components/preferences/in-content-new/sync.js b/browser/components/preferences/in-content-new/sync.js
+--- a/browser/components/preferences/in-content-new/sync.js
++++ b/browser/components/preferences/in-content-new/sync.js
+@@ -144,19 +144,17 @@ var gSyncPane = {
+ 
+     fxAccounts.promiseAccountsManageURI(this._getEntryPoint()).then(accountsManageURI => {
+       document.getElementById("verifiedManage").setAttribute("href", accountsManageURI);
+     });
+ 
+     this.updateWeavePrefs();
+ 
+     // Notify observers that the UI is now ready
+-    Cc["@mozilla.org/observer-service;1"]
+-      .getService(Ci.nsIObserverService)
+-      .notifyObservers(window, "sync-pane-loaded");
++    Services.obs.notifyObservers(window, "sync-pane-loaded");
+   },
+ 
+   _toggleComputerNameControls(editMode) {
+     let textbox = document.getElementById("fxaSyncComputerName");
+     textbox.disabled = !editMode;
+     document.getElementById("fxaChangeDeviceName").hidden = editMode;
+     document.getElementById("fxaCancelChangeDeviceName").hidden = !editMode;
+     document.getElementById("fxaSaveChangeDeviceName").hidden = !editMode;

+ 537 - 0
frg/work-js/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

+ 468 - 0
frg/work-js/mozilla-release/patches/1241131-1-59a1.patch

@@ -0,0 +1,468 @@
+# HG changeset patch
+# User Julian Descottes <jdescottes@mozilla.com>
+# Date 1512065324 -3600
+# Node ID 6a45e2f79b263153a4cea41c7c5bc111bfa09f18
+# Parent  a4ec8437da2fc81f725c83a9790c24c1b82e7476
+Bug 1241131 - Remove DevTools reload addon;r=ochameau
+
+MozReview-Commit-ID: GCS4ZRvwUcs
+
+diff --git a/devtools/bootstrap.js b/devtools/bootstrap.js
+deleted file mode 100644
+--- a/devtools/bootstrap.js
++++ /dev/null
+@@ -1,340 +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/. */
+-
+-/* global content, APP_SHUTDOWN */
+-/* exported startup, shutdown, install, uninstall */
+-
+-"use strict";
+-
+-const {Services} = Cu.import("resource://gre/modules/Services.jsm", {});
+-const {NetUtil} = Cu.import("resource://gre/modules/NetUtil.jsm", {});
+-const {AppConstants} = Cu.import("resource://gre/modules/AppConstants.jsm", {});
+-
+-// MultiWindowKeyListener instance for Ctrl+Alt+R key
+-let listener;
+-// nsIURI to the addon root folder
+-let resourceURI;
+-
+-function actionOccurred(id) {
+-  let {require} = Cu.import("resource://devtools/shared/Loader.jsm", {});
+-  let Telemetry = require("devtools/client/shared/telemetry");
+-  let telemetry = new Telemetry();
+-  telemetry.actionOccurred(id);
+-}
+-
+-// Synchronously fetch the content of a given URL
+-function readURI(uri) {
+-  let stream = NetUtil.newChannel({
+-    uri: NetUtil.newURI(uri, "UTF-8"),
+-    loadUsingSystemPrincipal: true}
+-  ).open2();
+-  let count = stream.available();
+-  let data = NetUtil.readInputStreamToString(stream, count, {
+-    charset: "UTF-8"
+-  });
+-
+-  stream.close();
+-
+-  return data;
+-}
+-
+-/**
+- * Interpret the processing instructions contained in a preferences file, based on a
+- * limited set of supported #if statements. After we ship as an addon, we don't want to
+- * introduce anymore processing instructions, so all unrecognized preprocessing
+- * instructions will be treated as an error.
+- *
+- * This function is mostly copied from devtools/client/inspector/webpack/prefs-loader.js
+- *
+- * @param  {String} content
+- *         The string content of a preferences file.
+- * @return {String} the content stripped of preprocessing instructions.
+- */
+-function interpretPreprocessingInstructions(content) {
+-  const ifMap = {
+-    "#if MOZ_UPDATE_CHANNEL == beta": AppConstants.MOZ_UPDATE_CHANNEL === "beta",
+-    "#if defined(NIGHTLY_BUILD)": AppConstants.NIGHTLY_BUILD,
+-    "#ifdef MOZ_DEV_EDITION": AppConstants.MOZ_DEV_EDITION,
+-    "#ifdef RELEASE_OR_BETA": AppConstants.RELEASE_OR_BETA,
+-  };
+-
+-  let lines = content.split("\n");
+-  let ignoring = false;
+-  let newLines = [];
+-  let continuation = false;
+-  for (let line of lines) {
+-    if (line.startsWith("#if")) {
+-      if (!(line in ifMap)) {
+-        throw new Error("missing line in ifMap: " + line);
+-      }
+-      ignoring = !ifMap[line];
+-    } else if (line.startsWith("#else")) {
+-      ignoring = !ignoring;
+-    } else if (line.startsWith("#endif")) {
+-      ignoring = false;
+-    }
+-
+-    let isPrefLine = /^ *(sticky_)?pref\("([^"]+)"/.test(line);
+-    if (continuation || (!ignoring && isPrefLine)) {
+-      newLines.push(line);
+-
+-      // The call to pref(...); might span more than one line.
+-      continuation = !/\);/.test(line);
+-    }
+-  }
+-  return newLines.join("\n");
+-}
+-
+-// Read a preference file and set all of its defined pref as default values
+-// (This replicates the behavior of preferences files from mozilla-central)
+-function processPrefFile(url) {
+-  let content = readURI(url);
+-  content = interpretPreprocessingInstructions(content);
+-  content.match(/pref\("[^"]+",\s*.+\s*\)/g).forEach(item => {
+-    let m = item.match(/pref\("([^"]+)",\s*(.+)\s*\)/);
+-    let name = m[1];
+-    let val = m[2].trim();
+-
+-    // Prevent overriding prefs that have been changed by the user
+-    if (Services.prefs.prefHasUserValue(name)) {
+-      return;
+-    }
+-    let defaultBranch = Services.prefs.getDefaultBranch("");
+-    if ((val.startsWith("\"") && val.endsWith("\"")) ||
+-        (val.startsWith("'") && val.endsWith("'"))) {
+-      val = val.substr(1, val.length - 2);
+-      val = val.replace(/\\"/g, '"');
+-      defaultBranch.setCharPref(name, val);
+-    } else if (val.match(/[0-9]+/)) {
+-      defaultBranch.setIntPref(name, parseInt(val, 10));
+-    } else if (val == "true" || val == "false") {
+-      defaultBranch.setBoolPref(name, val == "true");
+-    } else {
+-      console.log("Unable to match preference type for value:", val);
+-    }
+-  });
+-}
+-
+-function setPrefs() {
+-  processPrefFile(resourceURI.spec + "./client/preferences/devtools.js");
+-  processPrefFile(resourceURI.spec + "./client/preferences/debugger.js");
+-}
+-
+-// Helper to listen to a key on all windows
+-function MultiWindowKeyListener({ keyCode, ctrlKey, altKey, callback }) {
+-  let keyListener = function (event) {
+-    if (event.ctrlKey == !!ctrlKey &&
+-        event.altKey == !!altKey &&
+-        event.keyCode === keyCode) {
+-      callback(event);
+-
+-      // Call preventDefault to avoid duplicated events when
+-      // doing the key stroke within a tab.
+-      event.preventDefault();
+-    }
+-  };
+-
+-  let observer = function (window, topic, data) {
+-    // Listen on keyup to call keyListener only once per stroke
+-    if (topic === "domwindowopened") {
+-      window.addEventListener("keyup", keyListener);
+-    } else {
+-      window.removeEventListener("keyup", keyListener);
+-    }
+-  };
+-
+-  return {
+-    start: function () {
+-      // Automatically process already opened windows
+-      let e = Services.ww.getWindowEnumerator();
+-      while (e.hasMoreElements()) {
+-        let window = e.getNext();
+-        observer(window, "domwindowopened", null);
+-      }
+-      // And listen for new ones to come
+-      Services.ww.registerNotification(observer);
+-    },
+-
+-    stop: function () {
+-      Services.ww.unregisterNotification(observer);
+-      let e = Services.ww.getWindowEnumerator();
+-      while (e.hasMoreElements()) {
+-        let window = e.getNext();
+-        observer(window, "domwindowclosed", null);
+-      }
+-    }
+-  };
+-}
+-
+-let getTopLevelWindow = function (window) {
+-  return window.QueryInterface(Ci.nsIInterfaceRequestor)
+-               .getInterface(Ci.nsIWebNavigation)
+-               .QueryInterface(Ci.nsIDocShellTreeItem)
+-               .rootTreeItem
+-               .QueryInterface(Ci.nsIInterfaceRequestor)
+-               .getInterface(Ci.nsIDOMWindow);
+-};
+-
+-function unload(reason) {
+-  // This frame script is going to be executed in all processes:
+-  // parent and child
+-  Services.ppmm.loadProcessScript("data:,(" + function (scriptReason) {
+-    /* Flush message manager cached frame scripts as well as chrome locales */
+-    let obs = Cc["@mozilla.org/observer-service;1"]
+-                .getService(Ci.nsIObserverService);
+-    obs.notifyObservers(null, "message-manager-flush-caches");
+-
+-    /* Also purge cached modules in child processes, we do it a few lines after
+-       in the parent process */
+-    if (Services.appinfo.processType == Services.appinfo.PROCESS_TYPE_CONTENT) {
+-      Services.obs.notifyObservers(null, "devtools-unload", scriptReason);
+-    }
+-  } + ")(\"" + reason.replace(/"/g, '\\"') + "\")", false);
+-
+-  // As we can't get a reference to existing Loader.jsm instances, we send them
+-  // an observer service notification to unload them.
+-  Services.obs.notifyObservers(null, "devtools-unload", reason);
+-
+-  // Then spawn a brand new Loader.jsm instance and start the main module
+-  Cu.unload("resource://devtools/shared/Loader.jsm");
+-  // Also unload all resources loaded as jsm, hopefully all of them are going
+-  // to be converted into regular modules
+-  Cu.unload("resource://devtools/client/shared/browser-loader.js");
+-  Cu.unload("resource://devtools/client/framework/ToolboxProcess.jsm");
+-  Cu.unload("resource://devtools/shared/apps/Devices.jsm");
+-  Cu.unload("resource://devtools/client/scratchpad/scratchpad-manager.jsm");
+-  Cu.unload("resource://devtools/shared/Parser.jsm");
+-  Cu.unload("resource://devtools/client/shared/DOMHelpers.jsm");
+-  Cu.unload("resource://devtools/client/shared/widgets/VariablesView.jsm");
+-  Cu.unload("resource://devtools/client/shared/widgets/AbstractTreeItem.jsm");
+-  Cu.unload("resource://devtools/shared/deprecated-sync-thenables.js");
+-}
+-
+-function reload(event) {
+-  // We automatically reload the toolbox if we are on a browser tab
+-  // with a toolbox already opened
+-  let reloadToolbox = false;
+-  if (event) {
+-    let top = getTopLevelWindow(event.view);
+-    let isBrowser = top.location.href.includes("/browser.xul");
+-    if (isBrowser && top.gBrowser) {
+-      // We do not use any devtools code before the call to Loader.jsm reload as
+-      // any attempt to use Loader.jsm to load a module will instanciate a new
+-      // Loader.
+-      let nbox = top.gBrowser.getNotificationBox();
+-      reloadToolbox =
+-        top.document.getAnonymousElementByAttribute(nbox, "class",
+-          "devtools-toolbox-bottom-iframe") ||
+-        top.document.getAnonymousElementByAttribute(nbox, "class",
+-          "devtools-toolbox-side-iframe") ||
+-        Services.wm.getMostRecentWindow("devtools:toolbox");
+-    }
+-  }
+-  let browserConsole = Services.wm.getMostRecentWindow("devtools:webconsole");
+-  let reopenBrowserConsole = false;
+-  if (browserConsole) {
+-    browserConsole.close();
+-    reopenBrowserConsole = true;
+-  }
+-
+-  dump("Reload DevTools.  (reload-toolbox:" + reloadToolbox + ")\n");
+-
+-  // Invalidate xul cache in order to see changes made to chrome:// files
+-  Services.obs.notifyObservers(null, "startupcache-invalidate");
+-
+-  unload("reload");
+-
+-  // Update the preferences before starting new code
+-  setPrefs();
+-
+-  const {devtools} = Cu.import("resource://devtools/shared/Loader.jsm", {});
+-  devtools.require("devtools/client/framework/devtools-browser");
+-
+-  // Go over all top level windows to reload all devtools related things
+-  let windowsEnum = Services.wm.getEnumerator(null);
+-  while (windowsEnum.hasMoreElements()) {
+-    let window = windowsEnum.getNext();
+-    let windowtype = window.document.documentElement.getAttribute("windowtype");
+-    if (windowtype == "navigator:browser" && window.gBrowser) {
+-      // Enumerate tabs on firefox windows
+-      for (let tab of window.gBrowser.tabs) {
+-        let browser = tab.linkedBrowser;
+-        let location = browser.documentURI.spec;
+-        let mm = browser.messageManager;
+-        // To reload JSON-View tabs and any devtools document
+-        if (location.startsWith("about:debugging") ||
+-            location.startsWith("chrome://devtools/")) {
+-          browser.reload();
+-        }
+-        // We have to use a frame script to query "baseURI"
+-        mm.loadFrameScript("data:text/javascript,new " + function () {
+-          let isJSONView =
+-            content.document.baseURI.startsWith("resource://devtools/");
+-          if (isJSONView) {
+-            content.location.reload();
+-          }
+-        }, false);
+-      }
+-    }
+-  }
+-
+-  if (reloadToolbox) {
+-    // Reopen the toolbox automatically if we are reloading from toolbox
+-    // shortcut and are on a browser window.
+-    // Wait for a second before opening the toolbox to avoid races
+-    // between the old and the new one.
+-    let {setTimeout} = Cu.import("resource://gre/modules/Timer.jsm", {});
+-    setTimeout(() => {
+-      let { TargetFactory } = devtools.require("devtools/client/framework/target");
+-      let { gDevTools } = devtools.require("devtools/client/framework/devtools");
+-      let top = getTopLevelWindow(event.view);
+-      let target = TargetFactory.forTab(top.gBrowser.selectedTab);
+-      gDevTools.showToolbox(target);
+-    }, 1000);
+-  }
+-
+-  // Browser console document can't just be reloaded.
+-  // HUDService is going to close it on unload.
+-  // Instead we have to manually toggle it.
+-  if (reopenBrowserConsole) {
+-    let {HUDService} = devtools.require("devtools/client/webconsole/hudservice");
+-    HUDService.toggleBrowserConsole();
+-  }
+-
+-  actionOccurred("reloadAddonReload");
+-}
+-
+-function startup(data) {
+-  dump("DevTools addon started.\n");
+-
+-  resourceURI = data.resourceURI;
+-
+-  listener = new MultiWindowKeyListener({
+-    keyCode: Ci.nsIDOMKeyEvent.DOM_VK_R, ctrlKey: true, altKey: true,
+-    callback: reload
+-  });
+-  listener.start();
+-
+-  reload();
+-}
+-function shutdown(data, reason) {
+-  // On browser shutdown, do not try to cleanup anything
+-  if (reason == APP_SHUTDOWN) {
+-    return;
+-  }
+-
+-  listener.stop();
+-  listener = null;
+-
+-  unload("disable");
+-}
+-function install() {
+-  try {
+-    actionOccurred("reloadAddonInstalled");
+-  } catch (e) {
+-    // When installing on Firefox builds without devtools, telemetry doesn't
+-    // work yet and throws.
+-  }
+-}
+-function uninstall() {}
+diff --git a/devtools/chrome.manifest b/devtools/chrome.manifest
+deleted file mode 100644
+--- a/devtools/chrome.manifest
++++ /dev/null
+@@ -1,6 +0,0 @@
+-content devtools client/
+-skin devtools classic/1.0 client/themes/
+-resource devtools .
+-locale devtools en-US client/locales/en-US/
+-locale devtools-shared en-US shared/locales/en-US/
+-locale devtools-shim en-US shim/locales/en-US/
+diff --git a/devtools/client/framework/gDevTools.jsm b/devtools/client/framework/gDevTools.jsm
+--- a/devtools/client/framework/gDevTools.jsm
++++ b/devtools/client/framework/gDevTools.jsm
+@@ -42,20 +42,16 @@ Object.defineProperty(this, "browser", {
+ 
+ /**
+  * gDevTools is a singleton that controls the Firefox Developer Tools.
+  *
+  * It is an instance of a DevTools class that holds a set of tools. It has the
+  * same lifetime as the browser.
+  */
+ let gDevToolsMethods = [
+-  // Used by the reload addon.
+-  // Force reloading dependencies if the loader happens to have reloaded.
+-  "reload",
+-
+   // Used by: - b2g desktop.js
+   //          - nsContextMenu
+   //          - /devtools code
+   "showToolbox",
+ 
+   // Used by Addon SDK and /devtools
+   "closeToolbox",
+   "getToolbox",
+@@ -128,17 +124,17 @@ let gDevToolsBrowserMethods = [
+   "openConnectScreen",
+ 
+   // Used by browser-sets.inc, command
+   "openContentProcessToolbox",
+ 
+   // Used by browser.js
+   "registerBrowserWindow",
+ 
+-  // Used by reload addon
++  // Used by devtools-browser.js for the Toggle Toolbox status
+   "hasToolboxOpened",
+ 
+   // Used by browser.js
+   "forgetBrowserWindow"
+ ];
+ this.gDevToolsBrowser = {
+   // Used by a test (should be removed)
+   get _trackedBrowserWindows() {
+diff --git a/devtools/client/shared/telemetry.js b/devtools/client/shared/telemetry.js
+--- a/devtools/client/shared/telemetry.js
++++ b/devtools/client/shared/telemetry.js
+@@ -158,22 +158,16 @@ Telemetry.prototype = {
+     aboutdebugging: {
+       histogram: "DEVTOOLS_ABOUTDEBUGGING_OPENED_COUNT",
+       timerHistogram: "DEVTOOLS_ABOUTDEBUGGING_TIME_ACTIVE_SECONDS"
+     },
+     custom: {
+       histogram: "DEVTOOLS_CUSTOM_OPENED_COUNT",
+       timerHistogram: "DEVTOOLS_CUSTOM_TIME_ACTIVE_SECONDS"
+     },
+-    reloadAddonInstalled: {
+-      histogram: "DEVTOOLS_RELOAD_ADDON_INSTALLED_COUNT",
+-    },
+-    reloadAddonReload: {
+-      histogram: "DEVTOOLS_RELOAD_ADDON_RELOAD_COUNT",
+-    },
+     gridInspectorShowGridAreasOverlayChecked: {
+       scalar: "devtools.grid.showGridAreasOverlay.checked",
+     },
+     gridInspectorShowGridLineNumbersChecked: {
+       scalar: "devtools.grid.showGridLineNumbers.checked",
+     },
+     gridInspectorShowInfiniteLinesChecked: {
+       scalar: "devtools.grid.showInfiniteLines.checked",
+diff --git a/devtools/install.rdf b/devtools/install.rdf
+deleted file mode 100644
+--- a/devtools/install.rdf
++++ /dev/null
+@@ -1,29 +0,0 @@
+-<?xml version="1.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/.
+--->
+-
+-<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+-     xmlns:em="http://www.mozilla.org/2004/em-rdf#">
+-  <Description about="urn:mozilla:install-manifest"
+-               em:id="devtools@mozilla.org"
+-               em:name="Developer Tools"
+-               em:description="System-addon for Firefox DevTools"
+-               em:version="44.0a1"
+-               em:type="2"
+-               em:creator="Mozilla">
+-
+-    <em:bootstrap>true</em:bootstrap>
+-    <em:multiprocessCompatible>true</em:multiprocessCompatible>
+-    <!-- Valid for all toolkit applications -->
+-    <em:targetApplication>
+-      <Description>
+-        <em:id>toolkit@mozilla.org</em:id>
+-        <em:minVersion>56</em:minVersion>
+-        <em:maxVersion>*</em:maxVersion>
+-      </Description>
+-    </em:targetApplication>
+-  </Description>
+-</RDF>

+ 67 - 0
frg/work-js/mozilla-release/patches/1241131-2-59a1.patch

@@ -0,0 +1,67 @@
+# HG changeset patch
+# User Julian Descottes <jdescottes@mozilla.com>
+# Date 1512065364 -3600
+# Node ID db9a36643ead8f9d41bc4f8e74a7b56d51c3dcd3
+# Parent  b784458f9027600321458fa82bf67f6610e79ed4
+Bug 1241131 - Remove DevTools reload addon histograms;r=francois
+
+MozReview-Commit-ID: oq7SVGPI2t
+
+diff --git a/toolkit/components/telemetry/Histograms.json b/toolkit/components/telemetry/Histograms.json
+--- a/toolkit/components/telemetry/Histograms.json
++++ b/toolkit/components/telemetry/Histograms.json
+@@ -6730,32 +6730,16 @@
+     "record_in_processes": ["main", "content"],
+     "alert_emails": ["dev-developer-tools@lists.mozilla.org"],
+     "expires_in_version": "never",
+     "kind": "count",
+     "bug_numbers": [1247985],
+     "description": "Number of times a custom developer tool has been opened.",
+     "releaseChannelCollection": "opt-out"
+   },
+-  "DEVTOOLS_RELOAD_ADDON_INSTALLED_COUNT": {
+-    "record_in_processes": ["main", "content"],
+-    "alert_emails": ["dev-developer-tools@lists.mozilla.org"],
+-    "expires_in_version": "55",
+-    "kind": "count",
+-    "description": "Number of times the reload addon has been installed.",
+-    "bug_numbers": [1248435]
+-  },
+-  "DEVTOOLS_RELOAD_ADDON_RELOAD_COUNT": {
+-    "record_in_processes": ["main", "content"],
+-    "alert_emails": ["dev-developer-tools@lists.mozilla.org"],
+-    "expires_in_version": "55",
+-    "kind": "count",
+-    "description": "Number of times the tools have been reloaded by the reload addon.",
+-    "bug_numbers": [1248435]
+-  },
+   "DEVTOOLS_TOOLBOX_TIME_ACTIVE_SECONDS": {
+     "record_in_processes": ["main", "content"],
+     "expires_in_version": "never",
+     "kind": "exponential",
+     "high": 10000000,
+     "n_buckets": 100,
+     "description": "How long has the toolbox been active (seconds)"
+   },
+diff --git a/toolkit/components/telemetry/histogram-whitelists.json b/toolkit/components/telemetry/histogram-whitelists.json
+--- a/toolkit/components/telemetry/histogram-whitelists.json
++++ b/toolkit/components/telemetry/histogram-whitelists.json
+@@ -1244,18 +1244,16 @@
+     "DEVTOOLS_NETMONITOR_OPENED_COUNT",
+     "DEVTOOLS_OPTIONS_OPENED_COUNT",
+     "DEVTOOLS_PAINTFLASHING_OPENED_COUNT",
+     "DEVTOOLS_PERFTOOLS_CONSOLE_RECORDING_COUNT",
+     "DEVTOOLS_PERFTOOLS_RECORDING_COUNT",
+     "DEVTOOLS_PERFTOOLS_RECORDING_EXPORT_FLAG",
+     "DEVTOOLS_PERFTOOLS_RECORDING_IMPORT_FLAG",
+     "DEVTOOLS_PICKER_EYEDROPPER_OPENED_COUNT",
+-    "DEVTOOLS_RELOAD_ADDON_INSTALLED_COUNT",
+-    "DEVTOOLS_RELOAD_ADDON_RELOAD_COUNT",
+     "DEVTOOLS_RESPONSIVE_OPENED_COUNT",
+     "DEVTOOLS_RULEVIEW_OPENED_COUNT",
+     "DEVTOOLS_SCRATCHPAD_OPENED_COUNT",
+     "DEVTOOLS_SCRATCHPAD_WINDOW_OPENED_COUNT",
+     "DEVTOOLS_SHADEREDITOR_OPENED_COUNT",
+     "DEVTOOLS_STORAGE_OPENED_COUNT",
+     "DEVTOOLS_STYLEEDITOR_OPENED_COUNT",
+     "DEVTOOLS_TILT_OPENED_COUNT",

+ 21 - 0
frg/work-js/mozilla-release/patches/1294873-59a1.patch

@@ -0,0 +1,21 @@
+# HG changeset patch
+# User Geoff Brown <gbrown@mozilla.com>
+# Date 1511480241 25200
+# Node ID 488a046d894d8d13d8107f841da5e5de9258e025
+# Parent  6bace6f74b18fdf3f4175598145db79aac357f21
+Bug 1294873 - Skip test_websocket-server.html on osx, to avoid intermittent leaks; r=me, a=test-only
+
+diff --git a/devtools/server/tests/mochitest/chrome.ini b/devtools/server/tests/mochitest/chrome.ini
+--- a/devtools/server/tests/mochitest/chrome.ini
++++ b/devtools/server/tests/mochitest/chrome.ini
+@@ -104,9 +104,9 @@ support-files =
+ [test_styles-svg.html]
+ [test_unsafeDereference.html]
+ [test_webconsole-node-grip.html]
+ [test_webextension-addon-debugging-connect.html]
+ skip-if = !e10s # test is designed to work on e10s only
+ [test_webextension-addon-debugging-reload.html]
+ skip-if = !e10s # test is designed to work on e10s only
+ [test_websocket-server.html]
+-skip-if = false
++skip-if = os == 'mac' # bug 1294873 intermittent leaks

+ 292 - 0
frg/work-js/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
frg/work-js/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
frg/work-js/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
frg/work-js/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
frg/work-js/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
frg/work-js/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
frg/work-js/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
frg/work-js/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

+ 487 - 0
frg/work-js/mozilla-release/patches/1339461-1a-60a1.patch

@@ -0,0 +1,487 @@
+# HG changeset patch
+# User Florian Queze <florian@queze.net>
+# Date 1517514322 -3600
+# Node ID d5a5ad1dbbf2c53a80386e7397ba6b32153b2b8e
+# Parent  c9ef7cf0d10b9e315f4cf031ae16e0a30231795a
+Bug 1339461 - script-generated patch to convert foo.indexOf(...) == -1 to foo.includes(), r=Mossop.
+
+diff --git a/browser/base/content/test/permissions/browser_reservedkey.js b/browser/base/content/test/permissions/browser_reservedkey.js
+--- a/browser/base/content/test/permissions/browser_reservedkey.js
++++ b/browser/base/content/test/permissions/browser_reservedkey.js
+@@ -39,17 +39,17 @@ add_task(async function test_reserved_sh
+   is(document.getElementById("kt_reserveddefault").getAttribute("count"), "1", "default reserved with preference on");
+ 
+   document.documentElement.removeChild(container);
+ 
+   await BrowserTestUtils.removeTab(tab);
+ });
+ 
+ // This test checks that Alt+<key> and F10 cannot be blocked when the preference is set.
+-if (navigator.platform.indexOf("Mac") == -1) {
++if (!navigator.platform.includes("Mac")) {
+   add_task(async function test_accesskeys_menus() {
+     await new Promise(resolve => {
+       SpecialPowers.pushPrefEnv({"set": [["permissions.default.shortcuts", 2]]}, resolve);
+     });
+ 
+     const uri = "data:text/html,<body onkeydown='if (event.key == \"H\" || event.key == \"F10\") event.preventDefault();'>";
+     let tab1 = await BrowserTestUtils.openNewForegroundTab(gBrowser, uri);
+ 
+@@ -71,17 +71,17 @@ if (navigator.platform.indexOf("Mac") ==
+     // pressing Down will open the file menu.
+     let menubar = document.getElementById("main-menubar");
+     let menubarActive = BrowserTestUtils.waitForEvent(menubar, "DOMMenuBarActive");
+     EventUtils.sendKey("F10");
+     await menubarActive;
+ 
+     let filePopup = document.getElementById("menu_FilePopup");
+     popupShown = BrowserTestUtils.waitForEvent(filePopup, "popupshown");
+-    if (navigator.platform.indexOf("Win") >= 0) {
++    if (navigator.platform.includes("Win")) {
+       EventUtils.synthesizeKey("KEY_ArrowDown", { code: "ArrowDown" });
+     }
+     await popupShown;
+ 
+     ok(true, "File menu opened");
+ 
+     popupHidden = BrowserTestUtils.waitForEvent(filePopup, "popuphidden");
+     filePopup.hidePopup();
+diff --git a/browser/base/content/test/permissions/browser_reservedkey.js.1339461-1.later b/browser/base/content/test/permissions/browser_reservedkey.js.1339461-1.later
+deleted file mode 100644
+--- a/browser/base/content/test/permissions/browser_reservedkey.js.1339461-1.later
++++ /dev/null
+@@ -1,40 +0,0 @@
+---- browser_reservedkey.js
+-+++ browser_reservedkey.js
+-@@ -39,17 +39,17 @@ add_task(async function test_reserved_sh
+-   is(document.getElementById("kt_reserveddefault").getAttribute("count"), "1", "default reserved with preference on");
+- 
+-   document.documentElement.removeChild(container);
+- 
+-   await BrowserTestUtils.removeTab(tab);
+- });
+- 
+- // This test checks that Alt+<key> and F10 cannot be blocked when the preference is set.
+--if (navigator.platform.indexOf("Mac") == -1) {
+-+if (!navigator.platform.includes("Mac")) {
+-   add_task(async function test_accesskeys_menus() {
+-     await new Promise(resolve => {
+-       SpecialPowers.pushPrefEnv({"set": [["permissions.default.shortcuts", 2]]}, resolve);
+-     });
+- 
+-     const uri = "data:text/html,<body onkeydown='if (event.key == \"H\" || event.key == \"F10\") event.preventDefault();'>";
+-     let tab1 = await BrowserTestUtils.openNewForegroundTab(gBrowser, uri);
+- 
+-@@ -71,17 +71,17 @@ if (navigator.platform.indexOf("Mac") ==
+-     // pressing Down will open the file menu.
+-     let menubar = document.getElementById("main-menubar");
+-     let menubarActive = BrowserTestUtils.waitForEvent(menubar, "DOMMenuBarActive");
+-     EventUtils.sendKey("F10");
+-     await menubarActive;
+- 
+-     let filePopup = document.getElementById("menu_FilePopup");
+-     popupShown = BrowserTestUtils.waitForEvent(filePopup, "popupshown");
+--    if (navigator.platform.indexOf("Win") >= 0) {
+-+    if (navigator.platform.includes("Win")) {
+-       EventUtils.synthesizeKey("KEY_ArrowDown", { code: "ArrowDown" });
+-     }
+-     await popupShown;
+- 
+-     ok(true, "File menu opened");
+- 
+-     popupHidden = BrowserTestUtils.waitForEvent(filePopup, "popuphidden");
+-     filePopup.hidePopup();
+diff --git a/browser/components/preferences/in-content-new/findInPage.js b/browser/components/preferences/in-content-new/findInPage.js
+--- a/browser/components/preferences/in-content-new/findInPage.js
++++ b/browser/components/preferences/in-content-new/findInPage.js
+@@ -208,17 +208,17 @@ var gSearchResultsPane = {
+    *    to search for filted query in
+    */
+   async searchFunction(event) {
+     let query = event.target.value.trim().toLowerCase();
+     if (this.query == query) {
+       return;
+     }
+ 
+-    let subQuery = this.query && query.indexOf(this.query) !== -1;
++    let subQuery = this.query && query.includes(this.query);
+     this.query = query;
+ 
+     this.getFindSelection(window).removeAllRanges();
+     this.removeAllSearchTooltips();
+     this.removeAllSearchMenuitemIndicators();
+ 
+     // Clear telemetry request if user types very frequently.
+     if (this.telemetryTimer) {
+diff --git a/browser/components/preferences/in-content/findInPage.js.1339461-1.later b/browser/components/preferences/in-content/findInPage.js.1339461-1.later
+deleted file mode 100644
+--- a/browser/components/preferences/in-content/findInPage.js.1339461-1.later
++++ /dev/null
+@@ -1,21 +0,0 @@
+---- findInPage.js
+-+++ findInPage.js
+-@@ -208,17 +208,17 @@ var gSearchResultsPane = {
+-    *    to search for filted query in
+-    */
+-   async searchFunction(event) {
+-     let query = event.target.value.trim().toLowerCase();
+-     if (this.query == query) {
+-       return;
+-     }
+- 
+--    let subQuery = this.query && query.indexOf(this.query) !== -1;
+-+    let subQuery = this.query && query.includes(this.query);
+-     this.query = query;
+- 
+-     this.getFindSelection(window).removeAllRanges();
+-     this.removeAllSearchTooltips();
+-     this.removeAllSearchMenuitemIndicators();
+- 
+-     // Clear telemetry request if user types very frequently.
+-     if (this.telemetryTimer) {
+diff --git a/devtools/client/commandline/test/browser_cmd_inject.js.1339461-1.later b/devtools/client/commandline/test/browser_cmd_inject.js.1339461-1.later
+deleted file mode 100644
+--- a/devtools/client/commandline/test/browser_cmd_inject.js.1339461-1.later
++++ /dev/null
+@@ -1,21 +0,0 @@
+---- browser_cmd_inject.js
+-+++ browser_cmd_inject.js
+-@@ -73,17 +73,17 @@ function test() {
+-           markup: "VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV",
+-           hints:                                                                                            "",
+-           status: "VALID",
+-           args: {
+-             library: {
+-               value: function (library) {
+-                 is(library.type, "url", "inject type name");
+-                 is(library.url.origin, "https://example.com", "inject url hostname");
+--                ok(library.url.pathname.indexOf("_inject.js") != -1, "inject url path");
+-+                ok(library.url.pathname.includes("_inject.js"), "inject url path");
+-               },
+-               status: "VALID"
+-             }
+-           }
+-         },
+-         exec: {
+-           output: [ /https:\/\/example.com\/browser\/devtools\/client\/commandline\/test\/browser_cmd_inject.js loaded/ ]
+-         }
+diff --git a/devtools/client/debugger/new/test/mochitest/examples/wasm-sourcemaps/average.js b/devtools/client/debugger/new/test/mochitest/examples/wasm-sourcemaps/average.js
+--- a/devtools/client/debugger/new/test/mochitest/examples/wasm-sourcemaps/average.js
++++ b/devtools/client/debugger/new/test/mochitest/examples/wasm-sourcemaps/average.js
+@@ -1734,17 +1734,17 @@ function integrateWasmJS(Module) {
+     asm2wasm: asm2wasmImports,
+     parent: Module // Module inside wasm-js.cpp refers to wasm-js.cpp; this allows access to the outside program.
+   };
+ 
+   var exports = null;
+ 
+   function lookupImport(mod, base) {
+     var lookup = info;
+-    if (mod.indexOf(".") < 0) {
++    if (!mod.includes(".")) {
+       lookup = (lookup || {})[mod];
+     } else {
+       var parts = mod.split(".");
+       lookup = (lookup || {})[parts[0]];
+       lookup = (lookup || {})[parts[1]];
+     }
+     if (base) {
+       lookup = (lookup || {})[base];
+@@ -2093,18 +2093,18 @@ integrateWasmJS(Module);
+ var ASM_CONSTS = [];
+ 
+ STATIC_BASE = Runtime.GLOBAL_BASE;
+ 
+ STATICTOP = STATIC_BASE + 3008;
+ /* global initializers */ __ATINIT__.push();
+ 
+ memoryInitializer =
+-  Module["wasmJSMethod"].indexOf("asmjs") >= 0 ||
+-  Module["wasmJSMethod"].indexOf("interpret-asm2wasm") >= 0
++  Module["wasmJSMethod"].includes("asmjs") ||
++  Module["wasmJSMethod"].includes("interpret-asm2wasm")
+     ? "average.js.mem"
+     : null;
+ 
+ var STATIC_BUMP = 3008;
+ Module["STATIC_BASE"] = STATIC_BASE;
+ Module["STATIC_BUMP"] = STATIC_BUMP;
+ 
+ /* no memory initializer */
+diff --git a/devtools/client/debugger/new/test/mochitest/examples/wasm-sourcemaps/average.js.1339461-1.later b/devtools/client/debugger/new/test/mochitest/examples/wasm-sourcemaps/average.js.1339461-1.later
+deleted file mode 100644
+--- a/devtools/client/debugger/new/test/mochitest/examples/wasm-sourcemaps/average.js.1339461-1.later
++++ /dev/null
+@@ -1,42 +0,0 @@
+---- average.js
+-+++ average.js
+-@@ -1734,17 +1734,17 @@ function integrateWasmJS(Module) {
+-     asm2wasm: asm2wasmImports,
+-     parent: Module // Module inside wasm-js.cpp refers to wasm-js.cpp; this allows access to the outside program.
+-   };
+- 
+-   var exports = null;
+- 
+-   function lookupImport(mod, base) {
+-     var lookup = info;
+--    if (mod.indexOf(".") < 0) {
+-+    if (!mod.includes(".")) {
+-       lookup = (lookup || {})[mod];
+-     } else {
+-       var parts = mod.split(".");
+-       lookup = (lookup || {})[parts[0]];
+-       lookup = (lookup || {})[parts[1]];
+-     }
+-     if (base) {
+-       lookup = (lookup || {})[base];
+-@@ -2093,18 +2093,18 @@ integrateWasmJS(Module);
+- var ASM_CONSTS = [];
+- 
+- STATIC_BASE = Runtime.GLOBAL_BASE;
+- 
+- STATICTOP = STATIC_BASE + 3008;
+- /* global initializers */ __ATINIT__.push();
+- 
+- memoryInitializer =
+--  Module["wasmJSMethod"].indexOf("asmjs") >= 0 ||
+--  Module["wasmJSMethod"].indexOf("interpret-asm2wasm") >= 0
+-+  Module["wasmJSMethod"].includes("asmjs") ||
+-+  Module["wasmJSMethod"].includes("interpret-asm2wasm")
+-     ? "average.js.mem"
+-     : null;
+- 
+- var STATIC_BUMP = 3008;
+- Module["STATIC_BASE"] = STATIC_BASE;
+- Module["STATIC_BUMP"] = STATIC_BUMP;
+- 
+- /* no memory initializer */
+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
+@@ -271,17 +271,17 @@ NewConsoleOutputWrapper.prototype = {
+   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.
+     // Note that 'requestPostData' is sent only for POST requests, so we need
+     // to count with that.
+     const NUMBER_OF_NETWORK_UPDATE = 8;
+     let expectedLength = NUMBER_OF_NETWORK_UPDATE;
+-    if (res.networkInfo.updates.indexOf("requestPostData") != -1) {
++    if (res.networkInfo.updates.includes("requestPostData")) {
+       expectedLength++;
+     }
+ 
+     if (res.networkInfo.updates.length === expectedLength) {
+       this.batchedMessageUpdates({ res, message });
+     }
+   },
+ 
+diff --git a/devtools/client/webconsole/new-console-output/new-console-output-wrapper.js.1339461-1.later b/devtools/client/webconsole/new-console-output/new-console-output-wrapper.js.1339461-1.later
+deleted file mode 100644
+--- a/devtools/client/webconsole/new-console-output/new-console-output-wrapper.js.1339461-1.later
++++ /dev/null
+@@ -1,21 +0,0 @@
+---- new-console-output-wrapper.js
+-+++ new-console-output-wrapper.js
+-@@ -271,17 +271,17 @@ NewConsoleOutputWrapper.prototype = {
+-   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.
+-     // Note that 'requestPostData' is sent only for POST requests, so we need
+-     // to count with that.
+-     const NUMBER_OF_NETWORK_UPDATE = 8;
+-     let expectedLength = NUMBER_OF_NETWORK_UPDATE;
+--    if (res.networkInfo.updates.indexOf("requestPostData") != -1) {
+-+    if (res.networkInfo.updates.includes("requestPostData")) {
+-       expectedLength++;
+-     }
+- 
+-     if (res.networkInfo.updates.length === expectedLength) {
+-       this.batchedMessageUpdates({ res, message });
+-     }
+-   },
+- 
+diff --git a/editor/libeditor/tests/test_bug1425997.html b/editor/libeditor/tests/test_bug1425997.html
+--- a/editor/libeditor/tests/test_bug1425997.html
++++ b/editor/libeditor/tests/test_bug1425997.html
+@@ -30,17 +30,17 @@ SimpleTest.waitForFocus(function() {
+   let originalContent = editor.innerHTML;
+   function onCharacterDataModified() {
+     // Until removing all NBSPs which were inserted by the editor,
+     // emulates Backspace key with "delete" command.
+     // When this test is created, the behavior is:
+     //   after 1st delete: "\n<!-- -->&nbsp;&nbsp;\n"
+     //   after 2nd delete: "\n<!-- -->&nbsp;\n"
+     //   after 3rd delete: "\n<!-- -->\n"
+-    while (editor.innerHTML.indexOf("&nbsp;") !== -1) {
++    while (editor.innerHTML.includes("&nbsp;")) {
+       document.execCommand("delete", false);
+     }
+   }
+   editor.addEventListener("DOMCharacterDataModified", onCharacterDataModified, { once: true });
+   editor.focus();
+   selection.selectAllChildren(document.getElementById("inline"));
+   document.execCommand('insertHTML', false, 'text');
+   // This expected result is just same as the result of Chrome.
+diff --git a/editor/libeditor/tests/test_bug1425997.html.1339461-1.later b/editor/libeditor/tests/test_bug1425997.html.1339461-1.later
+deleted file mode 100644
+--- a/editor/libeditor/tests/test_bug1425997.html.1339461-1.later
++++ /dev/null
+@@ -1,21 +0,0 @@
+---- test_bug1425997.html
+-+++ test_bug1425997.html
+-@@ -30,17 +30,17 @@ SimpleTest.waitForFocus(function() {
+-   let originalContent = editor.innerHTML;
+-   function onCharacterDataModified() {
+-     // Until removing all NBSPs which were inserted by the editor,
+-     // emulates Backspace key with "delete" command.
+-     // When this test is created, the behavior is:
+-     //   after 1st delete: "\n<!-- -->&nbsp;&nbsp;\n"
+-     //   after 2nd delete: "\n<!-- -->&nbsp;\n"
+-     //   after 3rd delete: "\n<!-- -->\n"
+--    while (editor.innerHTML.indexOf("&nbsp;") !== -1) {
+-+    while (editor.innerHTML.includes("&nbsp;")) {
+-       document.execCommand("delete", false);
+-     }
+-   }
+-   editor.addEventListener("DOMCharacterDataModified", onCharacterDataModified, { once: true });
+-   editor.focus();
+-   selection.selectAllChildren(document.getElementById("inline"));
+-   document.execCommand('insertHTML', false, 'text');
+-   // This expected result is just same as the result of Chrome.
+diff --git a/layout/base/tests/bug970964_inner2.html b/layout/base/tests/bug970964_inner2.html
+--- a/layout/base/tests/bug970964_inner2.html
++++ b/layout/base/tests/bug970964_inner2.html
+@@ -53,17 +53,17 @@ function touchEvent(aOptions) {
+ }
+ 
+ function sendTouchEvent(windowUtils, aType, aEvent, aModifiers) {
+   var ids = [], xs=[], ys=[], rxs = [], rys = [],
+       rotations = [], forces = [];
+ 
+   for (var touchType of ["touches", "changedTouches", "targetTouches"]) {
+     for (var i = 0; i < aEvent[touchType].length; i++) {
+-      if (ids.indexOf(aEvent[touchType][i].identifier) == -1) {
++      if (!ids.includes(aEvent[touchType][i].identifier)) {
+         ids.push(aEvent[touchType][i].identifier);
+         xs.push(aEvent[touchType][i].page.x);
+         ys.push(aEvent[touchType][i].page.y);
+         rxs.push(aEvent[touchType][i].radius.x);
+         rys.push(aEvent[touchType][i].radius.y);
+         rotations.push(aEvent[touchType][i].rotationAngle);
+         forces.push(aEvent[touchType][i].force);
+       }
+diff --git a/layout/base/tests/bug970964_inner2.html.1339461-1.later b/layout/base/tests/bug970964_inner2.html.1339461-1.later
+deleted file mode 100644
+--- a/layout/base/tests/bug970964_inner2.html.1339461-1.later
++++ /dev/null
+@@ -1,21 +0,0 @@
+---- bug970964_inner2.html
+-+++ bug970964_inner2.html
+-@@ -53,17 +53,17 @@ function touchEvent(aOptions) {
+- }
+- 
+- function sendTouchEvent(windowUtils, aType, aEvent, aModifiers) {
+-   var ids = [], xs=[], ys=[], rxs = [], rys = [],
+-       rotations = [], forces = [];
+- 
+-   for (var touchType of ["touches", "changedTouches", "targetTouches"]) {
+-     for (var i = 0; i < aEvent[touchType].length; i++) {
+--      if (ids.indexOf(aEvent[touchType][i].identifier) == -1) {
+-+      if (!ids.includes(aEvent[touchType][i].identifier)) {
+-         ids.push(aEvent[touchType][i].identifier);
+-         xs.push(aEvent[touchType][i].page.x);
+-         ys.push(aEvent[touchType][i].page.y);
+-         rxs.push(aEvent[touchType][i].radius.x);
+-         rys.push(aEvent[touchType][i].radius.y);
+-         rotations.push(aEvent[touchType][i].rotationAngle);
+-         forces.push(aEvent[touchType][i].force);
+-       }
+diff --git a/layout/style/test/chrome/bug418986-2.js b/layout/style/test/chrome/bug418986-2.js
+--- a/layout/style/test/chrome/bug418986-2.js
++++ b/layout/style/test/chrome/bug418986-2.js
+@@ -109,17 +109,17 @@ var testMatch = function (key, val) {
+ };
+ 
+ // __testToggles(resisting)__.
+ // Test whether we are able to match the "toggle" media queries.
+ var testToggles = function (resisting) {
+   suppressed_toggles.forEach(
+     function (key) {
+       var exists = keyValMatches(key, 0) || keyValMatches(key, 1);
+-      if (resisting || (toggles_enabled_in_content.indexOf(key) === -1 && !is_chrome_window)) {
++      if (resisting || (!toggles_enabled_in_content.includes(key) && !is_chrome_window)) {
+          ok(!exists, key + " should not exist.");
+       } else {
+          ok(exists, key + " should exist.");
+       }
+     });
+ };
+ 
+ // __testWindowsSpecific__.
+@@ -205,17 +205,17 @@ var generateCSSLines = function (resisti
+   let lines = ".spoof { background-color: red;}\n";
+   expected_values.forEach(
+     function ([key, offVal, onVal]) {
+       lines += mediaQueryCSSLine(key, resisting ? onVal : offVal, "green");
+     });
+   lines += ".suppress { background-color: " + (resisting ? "green" : "red") + ";}\n";
+   suppressed_toggles.forEach(
+     function (key) {
+-      if (toggles_enabled_in_content.indexOf(key) === -1 && !resisting && !is_chrome_window) {
++      if (!toggles_enabled_in_content.includes(key) && !resisting && !is_chrome_window) {
+         lines += "#" + key + " { background-color: green; }\n";
+       } else {
+         lines += suppressedMediaQueryCSSLine(key, resisting ? "red" : "green");
+       }
+     });
+   if (OS === "WINNT") {
+     lines += ".windows { background-color: " + (resisting ? "green" : "red") + ";}\n";
+     lines += windows_versions.map(val => "(-moz-os-version: " + val + ")").join(", ") +
+diff --git a/layout/style/test/chrome/bug418986-2.js.1339461-1.later b/layout/style/test/chrome/bug418986-2.js.1339461-1.later
+deleted file mode 100644
+--- a/layout/style/test/chrome/bug418986-2.js.1339461-1.later
++++ /dev/null
+@@ -1,40 +0,0 @@
+---- bug418986-2.js
+-+++ bug418986-2.js
+-@@ -109,17 +109,17 @@ var testMatch = function (key, val) {
+- };
+- 
+- // __testToggles(resisting)__.
+- // Test whether we are able to match the "toggle" media queries.
+- var testToggles = function (resisting) {
+-   suppressed_toggles.forEach(
+-     function (key) {
+-       var exists = keyValMatches(key, 0) || keyValMatches(key, 1);
+--      if (resisting || (toggles_enabled_in_content.indexOf(key) === -1 && !is_chrome_window)) {
+-+      if (resisting || (!toggles_enabled_in_content.includes(key) && !is_chrome_window)) {
+-          ok(!exists, key + " should not exist.");
+-       } else {
+-          ok(exists, key + " should exist.");
+-       }
+-     });
+- };
+- 
+- // __testWindowsSpecific__.
+-@@ -205,17 +205,17 @@ var generateCSSLines = function (resisti
+-   let lines = ".spoof { background-color: red;}\n";
+-   expected_values.forEach(
+-     function ([key, offVal, onVal]) {
+-       lines += mediaQueryCSSLine(key, resisting ? onVal : offVal, "green");
+-     });
+-   lines += ".suppress { background-color: " + (resisting ? "green" : "red") + ";}\n";
+-   suppressed_toggles.forEach(
+-     function (key) {
+--      if (toggles_enabled_in_content.indexOf(key) === -1 && !resisting && !is_chrome_window) {
+-+      if (!toggles_enabled_in_content.includes(key) && !resisting && !is_chrome_window) {
+-         lines += "#" + key + " { background-color: green; }\n";
+-       } else {
+-         lines += suppressedMediaQueryCSSLine(key, resisting ? "red" : "green");
+-       }
+-     });
+-   if (OS === "WINNT") {
+-     lines += ".windows { background-color: " + (resisting ? "green" : "red") + ";}\n";
+-     lines += windows_versions.map(val => "(-moz-os-version: " + val + ")").join(", ") +

+ 105 - 0
frg/work-js/mozilla-release/patches/1349483-1-59a1.patch

@@ -0,0 +1,105 @@
+# HG changeset patch
+# User Julian Descottes <jdescottes@mozilla.com>
+# Date 1515522501 -3600
+# Node ID 252d8b06f90f86e9a9c38f986260009d79586ca6
+# Parent  2b58fcdfc6d8bf23a598b870c9272a498305cd63
+Bug 1349483 - extract tooltip hidden callback from SwatchColorPickerTooltip;r=pbro
+
+This allows subclasses to override the implementation,a nd avoids leaking ColorPicker
+specific implementation details to the base class.
+
+MozReview-Commit-ID: 6KHaFPd5xHt
+
+diff --git a/devtools/client/shared/widgets/tooltip/SwatchBasedEditorTooltip.js b/devtools/client/shared/widgets/tooltip/SwatchBasedEditorTooltip.js
+--- a/devtools/client/shared/widgets/tooltip/SwatchBasedEditorTooltip.js
++++ b/devtools/client/shared/widgets/tooltip/SwatchBasedEditorTooltip.js
+@@ -104,38 +104,42 @@ class SwatchBasedEditorTooltip {
+    */
+   show() {
+     let tooltipAnchor = this.useInline ?
+       this.activeSwatch.closest(`.${INLINE_TOOLTIP_CLASS}`) :
+       this.activeSwatch;
+ 
+     if (tooltipAnchor) {
+       let onShown = this.tooltip.once("shown");
++
+       this.tooltip.show(tooltipAnchor, "topcenter bottomleft");
+-
+-      // When the tooltip is closed by clicking outside the panel we want to
+-      // commit any changes.
+-      this.tooltip.once("hidden", () => {
+-        if (!this._reverted && !this.eyedropperOpen) {
+-          this.commit();
+-        }
+-        this._reverted = false;
+-
+-        // Once the tooltip is hidden we need to clean up any remaining objects.
+-        if (!this.eyedropperOpen) {
+-          this.activeSwatch = null;
+-        }
+-      });
++      this.tooltip.once("hidden", () => this.onTooltipHidden());
+ 
+       return onShown;
+     }
+ 
+     return Promise.resolve();
+   }
+ 
++  /**
++   * Can be overridden by subclasses if implementation specific behavior is needed on
++   * tooltip hidden.
++   */
++  onTooltipHidden() {
++    // When the tooltip is closed by clicking outside the panel we want to commit any
++    // changes.
++    if (!this._reverted) {
++      this.commit();
++    }
++    this._reverted = false;
++
++    // Once the tooltip is hidden we need to clean up any remaining objects.
++    this.activeSwatch = null;
++  }
++
+   hide() {
+     this.tooltip.hide();
+   }
+ 
+   /**
+    * Add a new swatch DOM element to the list of swatch elements this editor
+    * tooltip knows about. That means from now on, clicking on that swatch will
+    * toggle the editor.
+diff --git a/devtools/client/shared/widgets/tooltip/SwatchColorPickerTooltip.js b/devtools/client/shared/widgets/tooltip/SwatchColorPickerTooltip.js
+--- a/devtools/client/shared/widgets/tooltip/SwatchColorPickerTooltip.js
++++ b/devtools/client/shared/widgets/tooltip/SwatchColorPickerTooltip.js
+@@ -152,16 +152,29 @@ class SwatchColorPickerTooltip extends S
+       this.preview(color);
+ 
+       if (this.eyedropperOpen) {
+         this.commit();
+       }
+     }
+   }
+ 
++  /**
++   * Override the implementation from SwatchBasedEditorTooltip.
++   */
++  onTooltipHidden() {
++    // If the tooltip is hidden while the eyedropper is being used, we should not commit
++    // the changes.
++    if (this.eyedropperOpen) {
++      return;
++    }
++
++    super.onTooltipHidden();
++  }
++
+   _openEyeDropper() {
+     let {inspector, toolbox, telemetry} = this.inspector;
+     telemetry.toolOpened("pickereyedropper");
+ 
+     // cancelling picker(if it is already selected) on opening eye-dropper
+     toolbox.highlighterUtils.cancelPicker();
+ 
+     inspector.pickColorFromPage(toolbox, {copyOnSelect: false}).then(() => {

+ 103 - 0
frg/work-js/mozilla-release/patches/1349483-2-59a1.patch

@@ -0,0 +1,103 @@
+# HG changeset patch
+# User Julian Descottes <jdescottes@mozilla.com>
+# Date 1515522611 -3600
+# Node ID 3575689ce19141b040ed28e7b0202259bd0856ae
+# Parent  c79a5dc80a683c7e433c0cf8a92bee8c12be732d
+Bug 1349483 - fix colorpicker eyedropper when devtools are in a window host;r=pbro
+
+MozReview-Commit-ID: CwfZaIsGoBW
+
+diff --git a/devtools/client/inspector/rules/test/browser_rules_eyedropper.js b/devtools/client/inspector/rules/test/browser_rules_eyedropper.js
+--- a/devtools/client/inspector/rules/test/browser_rules_eyedropper.js
++++ b/devtools/client/inspector/rules/test/browser_rules_eyedropper.js
+@@ -29,20 +29,41 @@ const TEST_URI = `
+   <body><div id="div1"></div><div id="div2"></div></body>
+ `;
+ 
+ // #f09
+ const ORIGINAL_COLOR = "rgb(255, 0, 153)";
+ // #ff5
+ const EXPECTED_COLOR = "rgb(255, 255, 85)";
+ 
++registerCleanupFunction(() => {
++  // Restore the default Toolbox host position after the test.
++  Services.prefs.clearUserPref("devtools.toolbox.host");
++});
++
+ add_task(function* () {
+   info("Add the test tab, open the rule-view and select the test node");
+-  yield addTab("data:text/html;charset=utf-8," + encodeURIComponent(TEST_URI));
+-  let {testActor, inspector, view} = yield openRuleView();
++
++  let url = "data:text/html;charset=utf-8," + encodeURIComponent(TEST_URI);
++  yield addTab(url);
++
++  let {testActor, inspector, view, toolbox} = yield openRuleView();
++
++  yield runTest(testActor, inspector, view);
++
++  info("Reload the page to restore the initial state");
++  yield navigateTo(inspector, url);
++
++  info("Change toolbox host to WINDOW");
++  yield toolbox.switchHost("window");
++
++  yield runTest(testActor, inspector, view);
++});
++
++function* runTest(testActor, inspector, view) {
+   yield selectNode("#div2", inspector);
+ 
+   info("Get the background-color property from the rule-view");
+   let property = getRuleViewProperty(view, "#div2", "background-color");
+   let swatch = property.valueSpan.querySelector(".ruleview-colorswatch");
+   ok(swatch, "Color swatch is displayed for the bg-color property");
+ 
+   info("Open the eyedropper from the colorpicker tooltip");
+@@ -61,17 +82,17 @@ add_task(function* () {
+   yield testSelect(view, swatch, inspector, testActor);
+ 
+   let onHidden = tooltip.once("hidden");
+   tooltip.hide();
+   yield onHidden;
+   ok(!tooltip.isVisible(), "color picker tooltip is closed");
+ 
+   yield waitForTick();
+-});
++}
+ 
+ function* testESC(swatch, inspector, testActor) {
+   info("Press escape");
+   let onCanceled = new Promise(resolve => {
+     inspector.inspector.once("color-pick-canceled", resolve);
+   });
+   yield testActor.synthesizeKey({key: "VK_ESCAPE", options: {}});
+   yield onCanceled;
+diff --git a/devtools/client/shared/widgets/tooltip/SwatchColorPickerTooltip.js b/devtools/client/shared/widgets/tooltip/SwatchColorPickerTooltip.js
+--- a/devtools/client/shared/widgets/tooltip/SwatchColorPickerTooltip.js
++++ b/devtools/client/shared/widgets/tooltip/SwatchColorPickerTooltip.js
+@@ -172,19 +172,22 @@ class SwatchColorPickerTooltip extends S
+ 
+   _openEyeDropper() {
+     let {inspector, toolbox, telemetry} = this.inspector;
+     telemetry.toolOpened("pickereyedropper");
+ 
+     // cancelling picker(if it is already selected) on opening eye-dropper
+     toolbox.highlighterUtils.cancelPicker();
+ 
++    // pickColorFromPage will focus the content document. If the devtools are in a
++    // separate window, the colorpicker tooltip will be closed before pickColorFromPage
++    // resolves. Flip the flag early to avoid issues with onTooltipHidden().
++    this.eyedropperOpen = true;
++
+     inspector.pickColorFromPage(toolbox, {copyOnSelect: false}).then(() => {
+-      this.eyedropperOpen = true;
+-
+       // close the colorpicker tooltip so that only the eyedropper is open.
+       this.hide();
+ 
+       this.tooltip.emit("eyedropper-opened");
+     }, console.error);
+ 
+     inspector.once("color-picked", color => {
+       toolbox.win.focus();

+ 144 - 0
frg/work-js/mozilla-release/patches/1371293-3-59a1.patch

@@ -0,0 +1,144 @@
+# HG changeset patch
+# User Mark Banner <standard8@mozilla.com>
+# Date 1509468037 0
+# Node ID b9a2f3e6f1cfd6643f5672d206b119a804b45512
+# Parent  75323831774cd63804c2ed33f5c49691e4625329
+Bug 1371293 - Fix instances of missing 'use strict;' in html files as found after ESLint 4 upgrade. r=mossop
+
+MozReview-Commit-ID: 2q3nqLaXA3E
+
+diff --git a/browser/extensions/formautofill/test/mochitest/test_autofocus_form.html b/browser/extensions/formautofill/test/mochitest/test_autofocus_form.html
+--- a/browser/extensions/formautofill/test/mochitest/test_autofocus_form.html
++++ b/browser/extensions/formautofill/test/mochitest/test_autofocus_form.html
+@@ -50,16 +50,17 @@ add_task(async function check_autocomple
+ <p id="display"></p>
+ 
+ <div id="content">
+ 
+   <form id="form1">
+     <p>This is a basic form.</p>
+     <p><label>organization: <input id="organization" name="organization" autocomplete="organization" type="text"></label></p>
+     <script>
++      "use strict";
+       // Focuses the input before DOMContentLoaded
+       document.getElementById("organization").focus();
+     </script>
+     <p><label>streetAddress: <input id="street-address" name="street-address" autocomplete="street-address" type="text"></label></p>
+     <p><label>tel: <input id="tel" name="tel" autocomplete="tel" type="text"></label></p>
+     <p><label>country: <input id="country" name="country" autocomplete="country" type="text"></label></p>
+   </form>
+ 
+diff --git a/devtools/client/shared/test/doc_toolbar_webconsole_errors_count.html b/devtools/client/shared/test/doc_toolbar_webconsole_errors_count.html
+--- a/devtools/client/shared/test/doc_toolbar_webconsole_errors_count.html
++++ b/devtools/client/shared/test/doc_toolbar_webconsole_errors_count.html
+@@ -9,16 +9,17 @@
+     "use strict";
+     console.log("foobarBug762996consoleLog");
+     window.onload = function () {
+       window.foobarBug762996load();
+     };
+     window.foobarBug762996a();
+   </script>
+   <script type="text/javascript">
++    "use strict";
+     window.foobarBug762996b();
+   </script>
+ </head>
+ <body>
+   <p>Hello world! Test for errors count in the Web Console button (developer
+   toolbar).</p>
+   <p style="color: foobarBug762996css"><button>click me</button></p>
+   <script type="text/javascript">
+diff --git a/security/manager/ssl/tests/mochitest/mixedcontent/test_documentWrite1.html b/security/manager/ssl/tests/mochitest/mixedcontent/test_documentWrite1.html
+--- a/security/manager/ssl/tests/mochitest/mixedcontent/test_documentWrite1.html
++++ b/security/manager/ssl/tests/mochitest/mixedcontent/test_documentWrite1.html
+@@ -26,13 +26,14 @@
+     finish();
+   }
+ 
+   </script>
+ </head>
+ 
+ <body>
+   <script class="testbody" type="text/javascript">
++  "use strict";
+   document.write(
+     "<img src='http://example.com/tests/security/manager/ssl/tests/mochitest/mixedcontent/moonsurface.jpg' />");
+   </script>
+ </body>
+ </html>
+diff --git a/security/manager/ssl/tests/mochitest/mixedcontent/test_documentWrite2.html b/security/manager/ssl/tests/mochitest/mixedcontent/test_documentWrite2.html
+--- a/security/manager/ssl/tests/mochitest/mixedcontent/test_documentWrite2.html
++++ b/security/manager/ssl/tests/mochitest/mixedcontent/test_documentWrite2.html
+@@ -28,13 +28,14 @@
+     finish();
+   }
+ 
+   </script>
+ </head>
+ 
+ <body>
+   <script class="testbody" type="text/javascript">
++  "use strict";
+   document.write(
+     "<iframe src='http://example.com/tests/security/manager/ssl/tests/mochitest/mixedcontent/iframe.html'></iframe>");
+   </script>
+ </body>
+ </html>
+diff --git a/security/manager/ssl/tests/mochitest/stricttransportsecurity/nosts_bootstrap.html b/security/manager/ssl/tests/mochitest/stricttransportsecurity/nosts_bootstrap.html
+--- a/security/manager/ssl/tests/mochitest/stricttransportsecurity/nosts_bootstrap.html
++++ b/security/manager/ssl/tests/mochitest/stricttransportsecurity/nosts_bootstrap.html
+@@ -14,14 +14,15 @@
+                                      "http://mochi.test:8888");
+       });
+     </script>
+   </head>
+   <body>
+     <!-- This frame should be loaded over HTTPS to set the STS header. -->
+     This frame was loaded using 
+     <script>
++      "use strict";
+       // eslint-disable-next-line no-unsanitized/method
+       document.write(document.location.protocol);
+     </script>
+     and set the STS header to force this site and allow subdomain upgrading.
+   </body>
+ </html>
+diff --git a/security/manager/ssl/tests/mochitest/stricttransportsecurity/plain_bootstrap.html b/security/manager/ssl/tests/mochitest/stricttransportsecurity/plain_bootstrap.html
+--- a/security/manager/ssl/tests/mochitest/stricttransportsecurity/plain_bootstrap.html
++++ b/security/manager/ssl/tests/mochitest/stricttransportsecurity/plain_bootstrap.html
+@@ -14,14 +14,15 @@
+                                      "http://mochi.test:8888");
+       });
+     </script>
+   </head>
+   <body>
+     <!-- This frame should be loaded over HTTPS to set the STS header. -->
+     This frame was loaded using 
+     <script>
++      "use strict";
+       // eslint-disable-next-line no-unsanitized/method
+       document.write(document.location.protocol);
+     </script>
+     and set the STS header to force this site and allow subdomain upgrading.
+   </body>
+ </html>
+diff --git a/security/manager/ssl/tests/mochitest/stricttransportsecurity/subdom_bootstrap.html b/security/manager/ssl/tests/mochitest/stricttransportsecurity/subdom_bootstrap.html
+--- a/security/manager/ssl/tests/mochitest/stricttransportsecurity/subdom_bootstrap.html
++++ b/security/manager/ssl/tests/mochitest/stricttransportsecurity/subdom_bootstrap.html
+@@ -14,14 +14,15 @@
+                                      "http://mochi.test:8888");
+       });
+     </script>
+   </head>
+   <body>
+     <!-- This frame should be loaded over HTTPS to set the STS header. -->
+     This frame was loaded using 
+     <script>
++      "use strict";
+       // eslint-disable-next-line no-unsanitized/method
+       document.write(document.location.protocol);
+     </script>
+     and set the STS header to force this site and allow subdomain upgrading.
+   </body>
+ </html>

+ 106 - 0
frg/work-js/mozilla-release/patches/1371293-4-59a1.patch

@@ -0,0 +1,106 @@
+# HG changeset patch
+# User Mark Banner <standard8@mozilla.com>
+# Date 1509975613 0
+# Node ID 27416456db70d7a7d72e3a6f95ea0dc8ae2decb5
+# Parent  5aed13dd8fbf5d97cde7241808e76eaac9355173
+Bug 1371293 - Fix remaining instances of no-multi-spaces after upgrading to ESLint 4. r=mossop
+
+MozReview-Commit-ID: EL6qI2VDyT1
+
+diff --git a/browser/base/content/urlbarBindings.xml.1371293-4.later b/browser/base/content/urlbarBindings.xml.1371293-4.later
+new file mode 100644
+--- /dev/null
++++ b/browser/base/content/urlbarBindings.xml.1371293-4.later
+@@ -0,0 +1,26 @@
++--- urlbarBindings.xml
+++++ urlbarBindings.xml
++@@ -1809,21 +1809,23 @@ file, You can obtain one at http://mozil
++            results to the input field. -->
++       <property name="margins"
++                 onget="return this._margins;">
++         <setter>
++           <![CDATA[
++           this._margins = val;
++ 
++           if (val) {
+++            /* eslint-disable no-multi-spaces */
++             let paddingInCSS =
++                 3   // .autocomplete-richlistbox padding-left/right
++               + 6   // .ac-site-icon margin-inline-start
++               + 16  // .ac-site-icon width
++               + 6;  // .ac-site-icon margin-inline-end
+++            /* eslint-enable no-multi-spaces */
++             let actualVal = Math.round(val.start) - paddingInCSS;
++             let actualValEnd = Math.round(val.end);
++             this.style.setProperty("--item-padding-start", actualVal + "px");
++             this.style.setProperty("--item-padding-end", actualValEnd + "px");
++           } else {
++             this.style.removeProperty("--item-padding-start");
++             this.style.removeProperty("--item-padding-end");
++           }
+diff --git a/toolkit/components/printing/content/printPreviewBindings.xml b/toolkit/components/printing/content/printPreviewBindings.xml
+--- a/toolkit/components/printing/content/printPreviewBindings.xml
++++ b/toolkit/components/printing/content/printPreviewBindings.xml
+@@ -259,17 +259,17 @@
+               this.mPageTextBox.value = this.mPageTextBox.max;
+             }
+             pageNum = 0;
+           } else if (aDirection) {
+             // aDirection is either +1 or -1, and allows us to increment
+             // or decrement our currently viewed page.
+             this.mPageTextBox.valueNumber += aDirection;
+             navType = nsIWebBrowserPrint.PRINTPREVIEW_GOTO_PAGENUM;
+-            pageNum = this.mPageTextBox.value;  // TODO: back to valueNumber?
++            pageNum = this.mPageTextBox.value; // TODO: back to valueNumber?
+           } else {
+             // We're going to a specific page (aPageNum)
+             navType = nsIWebBrowserPrint.PRINTPREVIEW_GOTO_PAGENUM;
+             pageNum = aPageNum;
+           }
+ 
+           this.mMessageManager.sendAsyncMessage("Printing:Preview:Navigate", {
+             navType,
+diff --git a/toolkit/content/widgets/button.xml b/toolkit/content/widgets/button.xml
+--- a/toolkit/content/widgets/button.xml
++++ b/toolkit/content/widgets/button.xml
+@@ -179,17 +179,17 @@
+             event.preventDefault();
+             window.document.commandDispatcher.advanceFocus();
+             return;
+           }
+         }
+ 
+         if (event.keyCode || event.charCode <= 32 || event.altKey ||
+             event.ctrlKey || event.metaKey)
+-          return;  // No printable char pressed, not a potential accesskey
++          return; // No printable char pressed, not a potential accesskey
+ 
+         // Possible accesskey pressed
+         var charPressedLower = String.fromCharCode(event.charCode).toLowerCase();
+ 
+         // If the accesskey of the current button is pressed, just activate it
+         if (this.accessKey.toLowerCase() == charPressedLower) {
+           this.click();
+           return;
+diff --git a/toolkit/content/widgets/dialog.xml b/toolkit/content/widgets/dialog.xml
+--- a/toolkit/content/widgets/dialog.xml
++++ b/toolkit/content/widgets/dialog.xml
+@@ -53,17 +53,17 @@
+                 onget="return this.getAttribute('buttons');"
+                 onset="this._configureButtons(val); return val;"/>
+ 
+       <property name="defaultButton">
+         <getter>
+         <![CDATA[
+           if (this.hasAttribute("defaultButton"))
+             return this.getAttribute("defaultButton");
+-          return "accept";  // default to the accept button
++          return "accept"; // default to the accept button
+         ]]>
+         </getter>
+         <setter>
+         <![CDATA[
+           this._setDefaultButton(val);
+           return val;
+         ]]>
+         </setter>

+ 287 - 0
frg/work-js/mozilla-release/patches/1371293-7-59a1.patch

@@ -0,0 +1,287 @@
+# HG changeset patch
+# User Mark Banner <standard8@mozilla.com>
+# Date 1509976893 0
+# Node ID a60e6fbce675354cdb75015844f412b39e474cd1
+# Parent  30d429f770ca18064f221fe36f8711d0ebcc09f2
+Bug 1371293 - Fix various devtools warnings after upgrading to ESLint 4. r=miker
+
+ESLint 4 will turn on all rules after an eslint-enable with no arguments. Therefore be more specific about which rules are being disabled.
+
+MozReview-Commit-ID: IoPBG72zySm
+
+diff --git a/devtools/server/tests/unit/test_blackboxing-02.js b/devtools/server/tests/unit/test_blackboxing-02.js
+--- a/devtools/server/tests/unit/test_blackboxing-02.js
++++ b/devtools/server/tests/unit/test_blackboxing-02.js
+@@ -1,14 +1,15 @@
+ /* Any copyright is dedicated to the Public Domain.
+    http://creativecommons.org/publicdomain/zero/1.0/ */
+-/* eslint-disable no-shadow */
+ 
+ "use strict";
+ 
++/* eslint-disable no-shadow */
++
+ /**
+  * Test that we don't hit breakpoints in black boxed sources, and that when we
+  * unblack box the source again, the breakpoint hasn't disappeared and we will
+  * hit it again.
+  */
+ 
+ var gDebuggee;
+ var gClient;
+@@ -46,17 +47,17 @@ function test_black_box() {
+         line: 2
+       }, function (response) {
+         Assert.ok(!response.error, "Should be able to set breakpoint.");
+         gThreadClient.resume(test_black_box_breakpoint);
+       });
+     }
+   });
+ 
+-  /* eslint-disable */
++  /* eslint-disable no-multi-spaces */
+   Cu.evalInSandbox(
+     "" + function doStuff(k) { // line 1
+       let arg = 15;            // line 2 - Break here
+       k(arg);                  // line 3
+     },                         // line 4
+     gDebuggee,
+     "1.8",
+     BLACK_BOXED_URL,
+@@ -72,17 +73,17 @@ function test_black_box() {
+       );                      // line 7
+     }                         // line 8
+     + "\n debugger;",         // line 9
+     gDebuggee,
+     "1.8",
+     SOURCE_URL,
+     1
+   );
+-  /* eslint-enable */
++  /* eslint-enable no-multi-spaces */
+ }
+ 
+ function test_black_box_breakpoint() {
+   gThreadClient.getSources(function ({error, sources}) {
+     Assert.ok(!error, "Should not get an error: " + error);
+     let sourceClient = gThreadClient.source(
+       sources.filter(s => s.url == BLACK_BOXED_URL)[0]
+     );
+diff --git a/devtools/server/tests/unit/test_blackboxing-03.js b/devtools/server/tests/unit/test_blackboxing-03.js
+--- a/devtools/server/tests/unit/test_blackboxing-03.js
++++ b/devtools/server/tests/unit/test_blackboxing-03.js
+@@ -37,17 +37,17 @@ function test_black_box() {
+       line: 4
+     }, function ({error}, bpClient) {
+       gBpClient = bpClient;
+       Assert.ok(!error, "Should not get an error: " + error);
+       gThreadClient.resume(test_black_box_dbg_statement);
+     });
+   });
+ 
+-  /* eslint-disable */
++  /* eslint-disable no-multi-spaces */
+   Cu.evalInSandbox(
+     "" + function doStuff(k) { // line 1
+       debugger;                // line 2 - Break here
+       k(100);                  // line 3
+     },                         // line 4
+     gDebuggee,
+     "1.8",
+     BLACK_BOXED_URL,
+@@ -63,17 +63,17 @@ function test_black_box() {
+       );                      // line 6
+     }                         // line 7
+     + "\n debugger;",         // line 8
+     gDebuggee,
+     "1.8",
+     SOURCE_URL,
+     1
+   );
+-  /* eslint-enable */
++  /* eslint-enable no-multi-spaces */
+ }
+ 
+ function test_black_box_dbg_statement() {
+   gThreadClient.getSources(function ({error, sources}) {
+     Assert.ok(!error, "Should not get an error: " + error);
+     let sourceClient = gThreadClient.source(
+       sources.filter(s => s.url == BLACK_BOXED_URL)[0]
+     );
+diff --git a/devtools/server/tests/unit/test_blackboxing-04.js b/devtools/server/tests/unit/test_blackboxing-04.js
+--- a/devtools/server/tests/unit/test_blackboxing-04.js
++++ b/devtools/server/tests/unit/test_blackboxing-04.js
+@@ -44,17 +44,17 @@ function test_black_box() {
+         line: 2
+       }, function (response) {
+         Assert.ok(!response.error, "Should be able to set breakpoint.");
+         test_black_box_paused();
+       });
+     }
+   });
+ 
+-  /* eslint-disable */
++  /* eslint-disable no-multi-spaces */
+   Cu.evalInSandbox(
+     "" + function doStuff(k) { // line 1
+       debugger;                // line 2
+       k(100);                  // line 3
+     },                         // line 4
+     gDebuggee,
+     "1.8",
+     BLACK_BOXED_URL,
+@@ -70,17 +70,17 @@ function test_black_box() {
+       );                      // line 6
+     }                         // line 7
+     + "\n runTest();",        // line 8
+     gDebuggee,
+     "1.8",
+     SOURCE_URL,
+     1
+   );
+-  /* eslint-enable */
++  /* eslint-enable no-multi-spaces */
+ }
+ 
+ function test_black_box_paused() {
+   gThreadClient.getSources(function ({error, sources}) {
+     Assert.ok(!error, "Should not get an error: " + error);
+     let sourceClient = gThreadClient.source(
+       sources.filter(s => s.url == BLACK_BOXED_URL)[0]
+     );
+diff --git a/devtools/server/tests/unit/test_blackboxing-05.js b/devtools/server/tests/unit/test_blackboxing-05.js
+--- a/devtools/server/tests/unit/test_blackboxing-05.js
++++ b/devtools/server/tests/unit/test_blackboxing-05.js
+@@ -33,17 +33,17 @@ function run_test() {
+ }
+ 
+ const BLACK_BOXED_URL = "http://example.com/blackboxme.js";
+ const SOURCE_URL = "http://example.com/source.js";
+ 
+ function test_black_box() {
+   gClient.addOneTimeListener("paused", test_black_box_exception);
+ 
+-  /* eslint-disable */
++  /* eslint-disable no-multi-spaces, no-unreachable */
+   Cu.evalInSandbox(
+     "" + function doStuff(k) {                                   // line 1
+       throw new Error("wu tang clan ain't nuthin' ta fuck wit"); // line 2
+       k(100);                                                    // line 3
+     },                                                           // line 4
+     gDebuggee,
+     "1.8",
+     BLACK_BOXED_URL,
+@@ -60,17 +60,17 @@ function test_black_box() {
+     }                                           // line 7
+     + "\ndebugger;\n"                           // line 8
+     + "try { runTest() } catch (ex) { }",       // line 9
+     gDebuggee,
+     "1.8",
+     SOURCE_URL,
+     1
+   );
+-  /* eslint-enable */
++  /* eslint-enable no-multi-spaces */
+ }
+ 
+ function test_black_box_exception() {
+   gThreadClient.getSources(function ({error, sources}) {
+     Assert.ok(!error, "Should not get an error: " + error);
+     let sourceClient = gThreadClient.source(
+       sources.filter(s => s.url == BLACK_BOXED_URL)[0]
+     );
+diff --git a/devtools/server/tests/unit/test_blackboxing-06.js b/devtools/server/tests/unit/test_blackboxing-06.js
+--- a/devtools/server/tests/unit/test_blackboxing-06.js
++++ b/devtools/server/tests/unit/test_blackboxing-06.js
+@@ -35,17 +35,17 @@ function run_test() {
+             finishClient(gClient);
+           });
+       });
+   });
+   do_test_pending();
+ }
+ 
+ function setup_code() {
+-  /* eslint-disable */
++  /* eslint-disable no-multi-spaces */
+   let { code, map } = (new SourceNode(null, null, null, [
+     new SourceNode(1, 0, "a.js", "" + function a() {
+       return b();
+     }),
+     "\n",
+     new SourceNode(1, 0, "b.js", "" + function b() {
+       debugger; // Don't want to stop here.
+       return c();
+@@ -54,17 +54,17 @@ function setup_code() {
+     new SourceNode(1, 0, "c.js", "" + function c() {
+       debugger; // Want to stop here.
+     }),
+     "\n"
+   ])).toStringWithSourceMap({
+     file: "abc.js",
+     sourceRoot: "http://example.com/"
+   });
+-  /* eslint-enable */
++  /* eslint-enable no-multi-spaces */
+ 
+   code += "//# sourceMappingURL=data:text/json," + map.toString();
+ 
+   Cu.evalInSandbox(code,
+                    gDebuggee,
+                    "1.8",
+                    "http://example.com/abc.js");
+ }
+diff --git a/devtools/server/tests/unit/test_breakpoint-12.js b/devtools/server/tests/unit/test_breakpoint-12.js
+--- a/devtools/server/tests/unit/test_breakpoint-12.js
++++ b/devtools/server/tests/unit/test_breakpoint-12.js
+@@ -50,27 +50,27 @@ function test_child_skip_breakpoint() {
+       Assert.equal(response.actualLocation.line, location.line + 1);
+       gBpActor = response.actor;
+ 
+       // Set more breakpoints at the same location.
+       set_breakpoints(source, location);
+     });
+   });
+ 
+-  /* eslint-disable */
++  /* eslint-disable no-multi-spaces */
+   Cu.evalInSandbox("var line0 = Error().lineNumber;\n" +
+                    "function foo() {\n" + // line0 + 1
+                    "  this.a = 1;\n" +    // line0 + 2
+                    "  // A comment.\n" +  // line0 + 3
+                    "  this.b = 2;\n" +    // line0 + 4
+                    "}\n" +                // line0 + 5
+                    "debugger;\n" +        // line0 + 6
+                    "foo();\n",            // line0 + 7
+                    gDebuggee);
+-  /* eslint-enable */
++  /* eslint-enable no-multi-spaces */
+ }
+ 
+ // Set many breakpoints at the same location.
+ function set_breakpoints(source, location) {
+   Assert.notEqual(gCount, NUM_BREAKPOINTS);
+   source.setBreakpoint(location, function (response, bpClient) {
+     // Check that the breakpoint has properly skipped forward one line.
+     Assert.equal(response.actualLocation.source.actor, source.actor);
+diff --git a/devtools/shared/webconsole/js-property-provider.js b/devtools/shared/webconsole/js-property-provider.js
+--- a/devtools/shared/webconsole/js-property-provider.js
++++ b/devtools/shared/webconsole/js-property-provider.js
+@@ -409,16 +409,17 @@ function getMatchedPropsImpl(obj, match,
+         continue;
+       }
+       if (prop.indexOf("-") > -1) {
+         continue;
+       }
+       // If it is an array index, we can't take it.
+       // This uses a trick: converting a string to a number yields NaN if
+       // the operation failed, and NaN is not equal to itself.
++      // eslint-disable-next-line no-self-compare
+       if (+prop != +prop) {
+         matches.add(prop);
+       }
+ 
+       if (matches.size >= MAX_AUTOCOMPLETIONS) {
+         break;
+       }
+     }

+ 34 - 0
frg/work-js/mozilla-release/patches/1378524-59a1.patch

@@ -0,0 +1,34 @@
+# HG changeset patch
+# User Luca Greco <lgreco@mozilla.com>
+# Date 1510592036 -3600
+# Node ID ed872853ea602f4975db034ff974efae8836ca4d
+# Parent  b0f1966fbc60bd04e88a78e431f68a38809ae89a
+Bug 1378524 - Fix "TypeError: tab is null" exception raised from browser_inspector_extension_sidebar.js when running on beta. r=pbro
+
+MozReview-Commit-ID: DZPA07695VS
+
+diff --git a/devtools/client/inspector/test/head.js b/devtools/client/inspector/test/head.js
+--- a/devtools/client/inspector/test/head.js
++++ b/devtools/client/inspector/test/head.js
+@@ -41,17 +41,20 @@ registerCleanupFunction(() => {
+   Services.prefs.clearUserPref("devtools.inspector.activeSidebar");
+ });
+ 
+ registerCleanupFunction(function* () {
+   // Move the mouse outside inspector. If the test happened fake a mouse event
+   // somewhere over inspector the pointer is considered to be there when the
+   // next test begins. This might cause unexpected events to be emitted when
+   // another test moves the mouse.
+-  EventUtils.synthesizeMouseAtPoint(1, 1, {type: "mousemove"}, window);
++  // Move the mouse at the top-right corner of the browser, to prevent
++  // the mouse from triggering the tab tooltip to be shown while the tab is
++  // being closed because the test is exiting (See Bug 1378524 for rationale).
++  EventUtils.synthesizeMouseAtPoint(window.innerWidth, 1, {type: "mousemove"}, window);
+ });
+ 
+ var navigateTo = Task.async(function* (inspector, url) {
+   let markuploaded = inspector.once("markuploaded");
+   let onNewRoot = inspector.once("new-root");
+   let onUpdated = inspector.once("inspector-updated");
+ 
+   info("Navigating to: " + url);

+ 2464 - 0
frg/work-js/mozilla-release/patches/1382605-60a1.patch

@@ -0,0 +1,2464 @@
+# HG changeset patch
+# User yulia <ystartsev@mozilla.com>
+# Date 1520414223 -3600
+# Node ID 7fc308540c3dc670818d00c16f122039e576b66c
+# Parent  d81ad70ec7d33028c61231f330fdf65a1eb58459
+Bug 1382605 - Fix 6 tests failures on devtools/client/shared due the EventEmitter refactoring r=nchevobbe
+
+MozReview-Commit-ID: EaFYqaY2M79
+
+diff --git a/devtools/client/debugger/debugger-view.js b/devtools/client/debugger/debugger-view.js
+--- a/devtools/client/debugger/debugger-view.js
++++ b/devtools/client/debugger/debugger-view.js
+@@ -213,17 +213,17 @@ var DebuggerView = {
+     VariablesViewController.attach(this.Variables, {
+       getEnvironmentClient: aObject => gThreadClient.environment(aObject),
+       getObjectClient: aObject => {
+         return gThreadClient.pauseGrip(aObject);
+       }
+     });
+ 
+     // Relay events from the VariablesView.
+-    this.Variables.on("fetched", (aEvent, aType) => {
++    this.Variables.on("fetched", aType => {
+       switch (aType) {
+         case "scopes":
+           window.emit(EVENTS.FETCHED_SCOPES);
+           break;
+         case "variables":
+           window.emit(EVENTS.FETCHED_VARIABLES);
+           break;
+         case "properties":
+diff --git a/devtools/client/debugger/views/variable-bubble-view.js b/devtools/client/debugger/views/variable-bubble-view.js
+--- a/devtools/client/debugger/views/variable-bubble-view.js
++++ b/devtools/client/debugger/views/variable-bubble-view.js
+@@ -210,17 +210,17 @@ VariableBubbleView.prototype = {
+         }
+       }, {
+         getEnvironmentClient: aObject => gThreadClient.environment(aObject),
+         getObjectClient: aObject => gThreadClient.pauseGrip(aObject),
+         simpleValueEvalMacro: this._getSimpleValueEvalMacro(evalPrefix),
+         getterOrSetterEvalMacro: this._getGetterOrSetterEvalMacro(evalPrefix),
+         overrideValueEvalMacro: this._getOverrideValueEvalMacro(evalPrefix)
+       }, {
+-        fetched: (aEvent, aType) => {
++        fetched: aType => {
+           if (aType == "properties") {
+             window.emit(EVENTS.FETCHED_BUBBLE_PROPERTIES);
+           }
+         }
+       }, [{
+         label: L10N.getStr("addWatchExpressionButton"),
+         className: "dbg-expression-button",
+         command: () => {
+diff --git a/devtools/client/framework/toolbox.js b/devtools/client/framework/toolbox.js
+--- a/devtools/client/framework/toolbox.js
++++ b/devtools/client/framework/toolbox.js
+@@ -809,17 +809,17 @@ Toolbox.prototype = {
+     button.isVisible = this._commandIsVisible(button);
+ 
+     EventEmitter.decorate(button);
+ 
+     return button;
+   },
+ 
+   _buildOptions: function () {
+-    let selectOptions = (name, event) => {
++    let selectOptions = event => {
+       // Flip back to the last used panel if we are already
+       // on the options panel.
+       if (this.currentToolId === "options" &&
+           gDevTools.getToolDefinition(this.lastUsedToolId)) {
+         this.selectTool(this.lastUsedToolId);
+       } else {
+         this.selectTool("options");
+       }
+@@ -849,59 +849,59 @@ Toolbox.prototype = {
+    *        The electron key shortcut.
+    * @param {Function} handler
+    *        The callback that should be called when the provided key shortcut is pressed.
+    * @param {String} whichTool
+    *        The tool the key belongs to. The corresponding handler will only be triggered
+    *        if this tool is active.
+    */
+   useKeyWithSplitConsole: function (key, handler, whichTool) {
+-    this.shortcuts.on(key, (name, event) => {
++    this.shortcuts.on(key, event => {
+       if (this.currentToolId === whichTool && this.isSplitConsoleFocused()) {
+         handler();
+         event.preventDefault();
+       }
+     });
+   },
+ 
+   _addReloadKeys: function () {
+     [
+       ["reload", false],
+       ["reload2", false],
+       ["forceReload", true],
+       ["forceReload2", true]
+     ].forEach(([id, force]) => {
+       let key = L10N.getStr("toolbox." + id + ".key");
+-      this.shortcuts.on(key, (name, event) => {
++      this.shortcuts.on(key, event => {
+         this.reloadTarget(force);
+ 
+         // Prevent Firefox shortcuts from reloading the page
+         event.preventDefault();
+       });
+     });
+   },
+ 
+   _addHostListeners: function () {
+     this.shortcuts.on(L10N.getStr("toolbox.nextTool.key"),
+-                 (name, event) => {
++                 event => {
+                    this.selectNextTool();
+                    event.preventDefault();
+                  });
+     this.shortcuts.on(L10N.getStr("toolbox.previousTool.key"),
+-                 (name, event) => {
++                 event => {
+                    this.selectPreviousTool();
+                    event.preventDefault();
+                  });
+     this.shortcuts.on(L10N.getStr("toolbox.minimize.key"),
+-                 (name, event) => {
++                 event => {
+                    this._toggleMinimizeMode();
+                    event.preventDefault();
+                  });
+     this.shortcuts.on(L10N.getStr("toolbox.toggleHost.key"),
+-                 (name, event) => {
++                 event => {
+                    this.switchToPreviousHost();
+                    event.preventDefault();
+                  });
+ 
+     this.doc.addEventListener("keypress", this._splitConsoleOnKeypress);
+     this.doc.addEventListener("focus", this._onFocus, true);
+     this.win.addEventListener("unload", this.destroy);
+     this.win.addEventListener("message", this._onBrowserMessage, true);
+@@ -2245,17 +2245,17 @@ Toolbox.prototype = {
+   handleKeyDownOnFramesButton: function (event) {
+     this.shortcuts.on(L10N.getStr("toolbox.showFrames.key"),
+       this.showFramesMenuOnKeyDown);
+   },
+ 
+   /**
+    * Show 'frames' menu on key down
+    */
+-  showFramesMenuOnKeyDown: function (name, event) {
++  showFramesMenuOnKeyDown: function (event) {
+     if (event.target.id == "command-button-frames") {
+       this.showFramesMenu(event);
+     }
+   },
+ 
+   /**
+    * Select a frame by sending 'switchToFrame' packet to the backend.
+    */
+diff --git a/devtools/client/inspector/breadcrumbs.js b/devtools/client/inspector/breadcrumbs.js
+--- a/devtools/client/inspector/breadcrumbs.js
++++ b/devtools/client/inspector/breadcrumbs.js
+@@ -573,29 +573,33 @@ HTMLBreadcrumbs.prototype = {
+   /**
+    * Handle a keyboard shortcut supported by the breadcrumbs widget.
+    *
+    * @param {String} name
+    *        Name of the keyboard shortcut received.
+    * @param {DOMEvent} event
+    *        Original event that triggered the shortcut.
+    */
+-  handleShortcut: function (name, event) {
++  handleShortcut: function (event) {
+     if (!this.selection.isElementNode()) {
+       return;
+     }
+ 
+     event.preventDefault();
+     event.stopPropagation();
+ 
+     this.keyPromise = (this.keyPromise || promise.resolve(null)).then(() => {
+       let currentnode;
+-      if (name === "Left" && this.currentIndex != 0) {
++
++      const isLeft = event.code === "ArrowLeft";
++      const isRight = event.code === "ArrowRight";
++
++      if (isLeft && this.currentIndex != 0) {
+         currentnode = this.nodeHierarchy[this.currentIndex - 1];
+-      } else if (name === "Right" && this.currentIndex < this.nodeHierarchy.length - 1) {
++      } else if (isRight && this.currentIndex < this.nodeHierarchy.length - 1) {
+         currentnode = this.nodeHierarchy[this.currentIndex + 1];
+       } else {
+         return null;
+       }
+ 
+       this.outer.setAttribute("aria-activedescendant", currentnode.button.id);
+       return this.selection.setNodeFront(currentnode.node, "breadcrumbs");
+     });
+diff --git a/devtools/client/inspector/computed/computed.js b/devtools/client/inspector/computed/computed.js
+--- a/devtools/client/inspector/computed/computed.js
++++ b/devtools/client/inspector/computed/computed.js
+@@ -179,18 +179,18 @@ function CssComputedView(inspector, docu
+   this.element = doc.getElementById("computed-property-container");
+   this.boxModelWrapper = doc.getElementById("boxmodel-wrapper");
+   this.searchField = doc.getElementById("computed-searchbox");
+   this.searchClearButton = doc.getElementById("computed-searchinput-clear");
+   this.includeBrowserStylesCheckbox = doc.getElementById("browser-style-checkbox");
+ 
+   this.shortcuts = new KeyShortcuts({ window: this.styleWindow });
+   this._onShortcut = this._onShortcut.bind(this);
+-  this.shortcuts.on("CmdOrCtrl+F", this._onShortcut);
+-  this.shortcuts.on("Escape", this._onShortcut);
++  this.shortcuts.on("CmdOrCtrl+F", event => this._onShortcut("CmdOrCtrl+F", event));
++  this.shortcuts.on("Escape", event => this._onShortcut("Escape", event));
+   this.styleDocument.addEventListener("copy", this._onCopy);
+   this.styleDocument.addEventListener("mousedown", this.focusWindow);
+   this.element.addEventListener("click", this._onClick);
+   this.element.addEventListener("contextmenu", this._onContextMenu);
+   this.searchField.addEventListener("input", this._onFilterStyles);
+   this.searchClearButton.addEventListener("click", this._onClearSearch);
+   this.includeBrowserStylesCheckbox.addEventListener("input",
+     this._onIncludeBrowserStyles);
+@@ -970,24 +970,24 @@ PropertyView.prototype = {
+     this.element.addEventListener("dblclick", this.onMatchedToggle);
+ 
+     // Make it keyboard navigable
+     this.element.setAttribute("tabindex", "0");
+     this.shortcuts = new KeyShortcuts({
+       window: this.tree.styleWindow,
+       target: this.element
+     });
+-    this.shortcuts.on("F1", (name, event) => {
++    this.shortcuts.on("F1", event => {
+       this.mdnLinkClick(event);
+       // Prevent opening the options panel
+       event.preventDefault();
+       event.stopPropagation();
+     });
+-    this.shortcuts.on("Return", (name, event) => this.onMatchedToggle(event));
+-    this.shortcuts.on("Space", (name, event) => this.onMatchedToggle(event));
++    this.shortcuts.on("Return", this.onMatchedToggle);
++    this.shortcuts.on("Space", this.onMatchedToggle);
+ 
+     let nameContainer = doc.createElementNS(HTML_NS, "span");
+     nameContainer.className = "computed-property-name-container";
+     this.element.appendChild(nameContainer);
+ 
+     // Build the twisty expand/collapse
+     this.matchedExpander = doc.createElementNS(HTML_NS, "div");
+     this.matchedExpander.className = "computed-expander theme-twisty";
+diff --git a/devtools/client/inspector/inspector.js b/devtools/client/inspector/inspector.js
+--- a/devtools/client/inspector/inspector.js
++++ b/devtools/client/inspector/inspector.js
+@@ -386,17 +386,17 @@ Inspector.prototype = {
+     this.search = new InspectorSearch(this, this.searchBox, this.searchClearButton);
+     this.search.on("search-cleared", this._updateSearchResultsLabel);
+     this.search.on("search-result", this._updateSearchResultsLabel);
+ 
+     let shortcuts = new KeyShortcuts({
+       window: this.panelDoc.defaultView,
+     });
+     let key = INSPECTOR_L10N.getStr("inspector.searchHTML.key");
+-    shortcuts.on(key, (name, event) => {
++    shortcuts.on(key, event => {
+       // Prevent overriding same shortcut from the computed/rule views
+       if (event.target.closest("#sidebar-panel-ruleview") ||
+           event.target.closest("#sidebar-panel-computedview")) {
+         return;
+       }
+       event.preventDefault();
+       this.searchBox.focus();
+     });
+diff --git a/devtools/client/inspector/markup/markup.js b/devtools/client/inspector/markup/markup.js
+--- a/devtools/client/inspector/markup/markup.js
++++ b/devtools/client/inspector/markup/markup.js
+@@ -685,23 +685,23 @@ MarkupView.prototype = {
+ 
+     this._onShortcut = this._onShortcut.bind(this);
+ 
+     // Process localizable keys
+     ["markupView.hide.key",
+      "markupView.edit.key",
+      "markupView.scrollInto.key"].forEach(name => {
+        let key = INSPECTOR_L10N.getStr(name);
+-       shortcuts.on(key, (_, event) => this._onShortcut(name, event));
++       shortcuts.on(key, event => this._onShortcut(name, event));
+      });
+ 
+     // Process generic keys:
+     ["Delete", "Backspace", "Home", "Left", "Right", "Up", "Down", "PageUp",
+      "PageDown", "Esc", "Enter", "Space"].forEach(key => {
+-       shortcuts.on(key, this._onShortcut);
++       shortcuts.on(key, event => this._onShortcut(key, event));
+      });
+   },
+ 
+   /**
+    * Key shortcut listener.
+    */
+   _onShortcut(name, event) {
+     if (this._isInputOrTextarea(event.target)) {
+diff --git a/devtools/client/inspector/rules/rules.js b/devtools/client/inspector/rules/rules.js
+--- a/devtools/client/inspector/rules/rules.js
++++ b/devtools/client/inspector/rules/rules.js
+@@ -135,36 +135,39 @@ function CssRuleView(inspector, document
+   this.hoverCheckbox = doc.getElementById("pseudo-hover-toggle");
+   this.activeCheckbox = doc.getElementById("pseudo-active-toggle");
+   this.focusCheckbox = doc.getElementById("pseudo-focus-toggle");
+ 
+   this.searchClearButton.hidden = true;
+ 
+   this.shortcuts = new KeyShortcuts({ window: this.styleWindow });
+   this._onShortcut = this._onShortcut.bind(this);
+-  this.shortcuts.on("Escape", this._onShortcut);
+-  this.shortcuts.on("Return", this._onShortcut);
+-  this.shortcuts.on("Space", this._onShortcut);
+-  this.shortcuts.on("CmdOrCtrl+F", this._onShortcut);
++  this.shortcuts.on("Escape", event => this._onShortcut("Escape", event));
++  this.shortcuts.on("Return", event => this._onShortcut("Return", event));
++  this.shortcuts.on("Space", event => this._onShortcut("Space", event));
++  this.shortcuts.on("CmdOrCtrl+F", event => this._onShortcut("CmdOrCtrl+F", event));
+   this.element.addEventListener("copy", this._onCopy);
+   this.element.addEventListener("contextmenu", this._onContextMenu);
+   this.addRuleButton.addEventListener("click", this._onAddRule);
+   this.searchField.addEventListener("input", this._onFilterStyles);
+   this.searchClearButton.addEventListener("click", this._onClearSearch);
+   this.pseudoClassToggle.addEventListener("click", this._onTogglePseudoClassPanel);
+   this.classToggle.addEventListener("click", this._onToggleClassPanel);
+   this.hoverCheckbox.addEventListener("click", this._onTogglePseudoClass);
+   this.activeCheckbox.addEventListener("click", this._onTogglePseudoClass);
+   this.focusCheckbox.addEventListener("click", this._onTogglePseudoClass);
+ 
+   this._handlePrefChange = this._handlePrefChange.bind(this);
++  this._handleUAStylePrefChange = this._handleUAStylePrefChange.bind(this);
++  this._handleDefaultColorUnitPrefChange =
++    this._handleDefaultColorUnitPrefChange.bind(this);
+ 
+   this._prefObserver = new PrefObserver("devtools.");
+-  this._prefObserver.on(PREF_UA_STYLES, this._handlePrefChange);
+-  this._prefObserver.on(PREF_DEFAULT_COLOR_UNIT, this._handlePrefChange);
++  this._prefObserver.on(PREF_UA_STYLES, this._handleUAStylePrefChange);
++  this._prefObserver.on(PREF_DEFAULT_COLOR_UNIT, this._handleDefaultColorUnitPrefChange);
+ 
+   this.showUserAgentStyles = Services.prefs.getBoolPref(PREF_UA_STYLES);
+ 
+   // The popup will be attached to the toolbox document.
+   this.popup = new AutocompletePopup(inspector._toolbox.doc, {
+     autoSelect: true,
+     theme: "auto"
+   });
+@@ -566,21 +569,26 @@ CssRuleView.prototype = {
+    * editor visible.
+    */
+   get isEditing() {
+     return this.tooltips.isEditing ||
+       this.element.querySelectorAll(".styleinspector-propertyeditor")
+         .length > 0;
+   },
+ 
++  _handleUAStylePrefChange: function () {
++    this.showUserAgentStyles = Services.prefs.getBoolPref(PREF_UA_STYLES);
++    this._handlePrefChange(PREF_UA_STYLES);
++  },
++
++  _handleDefaultColorUnitPrefChange: function () {
++    this._handlePrefChange(PREF_DEFAULT_COLOR_UNIT);
++  },
++
+   _handlePrefChange: function (pref) {
+-    if (pref === PREF_UA_STYLES) {
+-      this.showUserAgentStyles = Services.prefs.getBoolPref(pref);
+-    }
+-
+     // Reselect the currently selected element
+     let refreshOnPrefs = [PREF_UA_STYLES, PREF_DEFAULT_COLOR_UNIT];
+     if (refreshOnPrefs.indexOf(pref) > -1) {
+       this.selectElement(this._viewedElement, true);
+     }
+   },
+ 
+   /**
+@@ -688,19 +696,22 @@ CssRuleView.prototype = {
+     return false;
+   },
+ 
+   destroy: function () {
+     this.isDestroyed = true;
+     this.clear();
+ 
+     this._dummyElement = null;
+-
+-    this._prefObserver.off(PREF_UA_STYLES, this._handlePrefChange);
+-    this._prefObserver.off(PREF_DEFAULT_COLOR_UNIT, this._handlePrefChange);
++    // off handlers must have the same reference as their on handlers
++    this._prefObserver.off(PREF_UA_STYLES, this._handleUAStylePrefChange);
++    this._prefObserver.off(
++      PREF_DEFAULT_COLOR_UNIT,
++      this._handleDefaultColorUnitPrefChange
++    );
+     this._prefObserver.destroy();
+ 
+     this._outputParser = null;
+ 
+     // Remove context menu
+     if (this._contextmenu) {
+       this._contextmenu.destroy();
+       this._contextmenu = null;
+diff --git a/devtools/client/inspector/rules/test/browser_rules_colorpicker-release-outside-frame.js b/devtools/client/inspector/rules/test/browser_rules_colorpicker-release-outside-frame.js
+--- a/devtools/client/inspector/rules/test/browser_rules_colorpicker-release-outside-frame.js
++++ b/devtools/client/inspector/rules/test/browser_rules_colorpicker-release-outside-frame.js
+@@ -28,17 +28,17 @@ add_task(function* () {
+   yield onRuleViewChanged;
+ 
+   let value = yield change;
+   info(`Color changed to ${value} on mousedown.`);
+ 
+   // If the mousemove below fails to detect that the button is no longer pressed
+   // the spectrum will update and emit changed event synchronously after calling
+   // synthesizeMouse so this handler is executed before the test ends.
+-  spectrum.once("changed", (event, newValue) => {
++  spectrum.once("changed", newValue => {
+     is(newValue, value, "Value changed on mousemove without a button pressed.");
+   });
+ 
+   // Releasing the button pressed by mousedown above on top of a different frame
+   // does not make sense in this test as EventUtils doesn't preserve the context
+   // i.e. the buttons that were pressed down between events.
+ 
+   info("Moving mouse over color picker without any buttons pressed.");
+diff --git a/devtools/client/netmonitor/src/components/StatisticsPanel.js b/devtools/client/netmonitor/src/components/StatisticsPanel.js
+--- a/devtools/client/netmonitor/src/components/StatisticsPanel.js
++++ b/devtools/client/netmonitor/src/components/StatisticsPanel.js
+@@ -180,17 +180,17 @@ class StatisticsPanel extends Component 
+           let string = getTimeWithDecimals(seconds);
+           return PluralForm.get(seconds,
+             L10N.getStr("charts.totalSecondsNonBlocking")).replace("#1", string);
+         },
+       },
+       sorted: true,
+     });
+ 
+-    chart.on("click", (_, { label }) => {
++    chart.on("click", ({ label }) => {
+       // Reset FilterButtons and enable one filter exclusively
+       this.props.closeStatistics();
+       this.props.enableRequestFilterTypeOnly(label);
+     });
+ 
+     let container = this.refs[id];
+ 
+     // Nuke all existing charts of the specified type.
+diff --git a/devtools/client/performance/test/browser_perf-tree-abstract-01.js b/devtools/client/performance/test/browser_perf-tree-abstract-01.js
+--- a/devtools/client/performance/test/browser_perf-tree-abstract-01.js
++++ b/devtools/client/performance/test/browser_perf-tree-abstract-01.js
+@@ -46,17 +46,17 @@ add_task(function* () {
+     "The root node's container is correct.");
+ 
+   // Expand the root and test the child items...
+ 
+   let receivedExpandEvent = once(treeRoot, "expand", { spreadArgs: true });
+   let receivedFocusEvent = once(treeRoot, "focus");
+   mousedown(treeRoot.target.querySelector(".arrow"));
+ 
+-  let [, eventItem] = yield receivedExpandEvent;
++  let [eventItem] = yield receivedExpandEvent;
+   is(eventItem, treeRoot,
+     "The 'expand' event target is correct (1).");
+ 
+   yield receivedFocusEvent;
+   is(document.commandDispatcher.focusedElement, treeRoot.target,
+     "The root node is now focused.");
+ 
+   let fooItem = treeRoot.getChild(0);
+@@ -97,29 +97,29 @@ add_task(function* () {
+   is(barItem.container, container,
+     "The 'bar' node's container is correct.");
+ 
+   // Test clicking on the `foo` node...
+ 
+   receivedFocusEvent = once(treeRoot, "focus", { spreadArgs: true });
+   mousedown(fooItem.target);
+ 
+-  [, eventItem] = yield receivedFocusEvent;
++  [eventItem] = yield receivedFocusEvent;
+   is(eventItem, fooItem,
+     "The 'focus' event target is correct (2).");
+   is(document.commandDispatcher.focusedElement, fooItem.target,
+     "The 'foo' node is now focused.");
+ 
+   // Test double clicking on the `bar` node...
+ 
+   receivedExpandEvent = once(treeRoot, "expand", { spreadArgs: true });
+   receivedFocusEvent = once(treeRoot, "focus");
+   dblclick(barItem.target);
+ 
+-  [, eventItem] = yield receivedExpandEvent;
++  [eventItem] = yield receivedExpandEvent;
+   is(eventItem, barItem,
+     "The 'expand' event target is correct (3).");
+ 
+   yield receivedFocusEvent;
+   is(document.commandDispatcher.focusedElement, barItem.target,
+     "The 'foo' node is now focused.");
+ 
+   // A child item got expanded, test the descendants...
+diff --git a/devtools/client/performance/test/browser_perf-tree-view-06.js b/devtools/client/performance/test/browser_perf-tree-view-06.js
+--- a/devtools/client/performance/test/browser_perf-tree-view-06.js
++++ b/devtools/client/performance/test/browser_perf-tree-view-06.js
+@@ -23,17 +23,17 @@ add_task(function* () {
+   let container = document.createElement("vbox");
+   treeRoot.attachTo(container);
+ 
+   let A = treeRoot.getChild();
+   let B = A.getChild();
+   let D = B.getChild();
+ 
+   let linkEvent = null;
+-  let handler = (_, e) => {
++  let handler = (e) => {
+     linkEvent = e;
+   };
+ 
+   treeRoot.on("link", handler);
+ 
+   // Fire right click.
+   rightMousedown(D.target.querySelector(".call-tree-url"));
+ 
+diff --git a/devtools/client/performance/views/details-abstract-subview.js b/devtools/client/performance/views/details-abstract-subview.js
+--- a/devtools/client/performance/views/details-abstract-subview.js
++++ b/devtools/client/performance/views/details-abstract-subview.js
+@@ -160,34 +160,34 @@ var DetailsSubview = {
+       this.render(OverviewView.getTimeInterval());
+       this.shouldUpdateWhenShown = false;
+     }
+   },
+ 
+   /**
+    * Fired when a preference in `devtools.performance.ui.` is changed.
+    */
+-  _onPrefChanged: function (_, prefName) {
++  _onPrefChanged: function (_, prefName, prefValue) {
+     if (~this.observedPrefs.indexOf(prefName) && this._onObservedPrefChange) {
+-      this._onObservedPrefChange(_, prefName);
++      this._onObservedPrefChange(prefName);
+     }
+ 
+     // All detail views require a recording to be complete, so do not
+     // attempt to render if recording is in progress or does not exist.
+     let recording = PerformanceController.getCurrentRecording();
+     if (!recording || !recording.isCompleted()) {
+       return;
+     }
+ 
+     if (!~this.rerenderPrefs.indexOf(prefName)) {
+       return;
+     }
+ 
+     if (this._onRerenderPrefChanged) {
+-      this._onRerenderPrefChanged(_, prefName);
++      this._onRerenderPrefChanged(prefName);
+     }
+ 
+     if (DetailsView.isViewSelected(this) || this.canUpdateWhileHidden) {
+       this.render(OverviewView.getTimeInterval());
+     } else {
+       this.shouldUpdateWhenShown = true;
+     }
+   }
+diff --git a/devtools/client/performance/views/details-js-call-tree.js b/devtools/client/performance/views/details-js-call-tree.js
+--- a/devtools/client/performance/views/details-js-call-tree.js
++++ b/devtools/client/performance/views/details-js-call-tree.js
+@@ -76,17 +76,17 @@ var JsCallTreeView = extend(DetailsSubvi
+   showOptimizations: function () {
+     this.optimizationsElement.classList.remove("hidden");
+   },
+ 
+   hideOptimizations: function () {
+     this.optimizationsElement.classList.add("hidden");
+   },
+ 
+-  _onFocus: function (_, treeItem) {
++  _onFocus: function (treeItem) {
+     let showOptimizations = PerformanceController.getOption("show-jit-optimizations");
+     let frameNode = treeItem.frame;
+     let optimizationSites = frameNode && frameNode.hasOptimizations()
+                             ? frameNode.getOptimizations().optimizationSites
+                             : [];
+ 
+     if (!showOptimizations || !frameNode || optimizationSites.length === 0) {
+       this.hideOptimizations();
+diff --git a/devtools/client/performance/views/details-waterfall.js b/devtools/client/performance/views/details-waterfall.js
+--- a/devtools/client/performance/views/details-waterfall.js
++++ b/devtools/client/performance/views/details-waterfall.js
+@@ -129,17 +129,17 @@ var WaterfallView = extend(DetailsSubvie
+     setNamedTimeout("waterfall-resize", WATERFALL_RESIZE_EVENTS_DRAIN, () => {
+       this.render(OverviewView.getTimeInterval());
+     });
+   },
+ 
+   /**
+    * Called whenever an observed pref is changed.
+    */
+-  _onObservedPrefChange: function (_, prefName) {
++  _onObservedPrefChange: function (prefName) {
+     this._hiddenMarkers = PerformanceController.getPref("hidden-markers");
+ 
+     // Clear the cache as we'll need to recompute the collapsed
+     // marker model
+     this._cache = new WeakMap();
+   },
+ 
+   /**
+diff --git a/devtools/client/performance/views/toolbar.js b/devtools/client/performance/views/toolbar.js
+--- a/devtools/client/performance/views/toolbar.js
++++ b/devtools/client/performance/views/toolbar.js
+@@ -139,17 +139,17 @@ var ToolbarView = {
+     let hiddenMarkers = Array.map(checkedMenuItems, e => e.getAttribute("marker-type"));
+     PerformanceController.setPref("hidden-markers", hiddenMarkers);
+   },
+ 
+   /**
+    * Fired when a preference changes in the underlying OptionsView.
+    * Propogated by the PerformanceController.
+    */
+-  _onPrefChanged: function (_, prefName) {
++  _onPrefChanged: function (prefName) {
+     let value = PerformanceController.getOption(prefName);
+ 
+     if (prefName === "experimental") {
+       this._toggleExperimentalUI(value);
+     }
+ 
+     this.emit(EVENTS.UI_PREF_CHANGED, prefName, value);
+   },
+diff --git a/devtools/client/shared/autocomplete-popup.js b/devtools/client/shared/autocomplete-popup.js
+--- a/devtools/client/shared/autocomplete-popup.js
++++ b/devtools/client/shared/autocomplete-popup.js
+@@ -3,17 +3,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 HTML_NS = "http://www.w3.org/1999/xhtml";
+ const Services = require("Services");
+ const {HTMLTooltip} = require("devtools/client/shared/widgets/tooltip/HTMLTooltip");
+-const EventEmitter = require("devtools/shared/old-event-emitter");
++const EventEmitter = require("devtools/shared/event-emitter");
+ const {PrefObserver} = require("devtools/client/shared/prefs");
+ 
+ let itemIdCounter = 0;
+ /**
+  * Autocomplete popup UI implementation.
+  *
+  * @constructor
+  * @param {Document} toolboxDoc
+diff --git a/devtools/client/shared/components/SearchBox.js b/devtools/client/shared/components/SearchBox.js
+--- a/devtools/client/shared/components/SearchBox.js
++++ b/devtools/client/shared/components/SearchBox.js
+@@ -45,17 +45,17 @@ class SearchBox extends Component {
+   componentDidMount() {
+     if (!this.props.keyShortcut) {
+       return;
+     }
+ 
+     this.shortcuts = new KeyShortcuts({
+       window
+     });
+-    this.shortcuts.on(this.props.keyShortcut, (name, event) => {
++    this.shortcuts.on(this.props.keyShortcut, event => {
+       event.preventDefault();
+       this.refs.input.focus();
+     });
+   }
+ 
+   componentWillUnmount() {
+     if (this.shortcuts) {
+       this.shortcuts.destroy();
+diff --git a/devtools/client/shared/developer-toolbar.js b/devtools/client/shared/developer-toolbar.js
+--- a/devtools/client/shared/developer-toolbar.js
++++ b/devtools/client/shared/developer-toolbar.js
+@@ -23,17 +23,17 @@ loader.lazyGetter(this, "prefBranch", fu
+ });
+ 
+ loader.lazyRequireGetter(this, "gcliInit", "devtools/shared/gcli/commands/index");
+ loader.lazyRequireGetter(this, "util", "gcli/util/util");
+ loader.lazyRequireGetter(this, "ConsoleServiceListener", "devtools/server/actors/webconsole/listeners", true);
+ loader.lazyRequireGetter(this, "gDevTools", "devtools/client/framework/devtools", true);
+ loader.lazyRequireGetter(this, "gDevToolsBrowser", "devtools/client/framework/devtools-browser", true);
+ loader.lazyRequireGetter(this, "nodeConstants", "devtools/shared/dom-node-constants");
+-loader.lazyRequireGetter(this, "EventEmitter", "devtools/shared/old-event-emitter");
++loader.lazyRequireGetter(this, "EventEmitter", "devtools/shared/event-emitter");
+ 
+ /**
+  * A collection of utilities to help working with commands
+  */
+ var CommandUtils = {
+   /**
+    * Caches requisitions created when calling executeOnTarget:
+    * Target => Requisition Promise
+diff --git a/devtools/client/shared/inplace-editor.js b/devtools/client/shared/inplace-editor.js
+--- a/devtools/client/shared/inplace-editor.js
++++ b/devtools/client/shared/inplace-editor.js
+@@ -39,17 +39,17 @@ const CONTENT_TYPES = {
+ 
+ // The limit of 500 autocomplete suggestions should not be reached but is kept
+ // for safety.
+ const MAX_POPUP_ENTRIES = 500;
+ 
+ const FOCUS_FORWARD = focusManager.MOVEFOCUS_FORWARD;
+ const FOCUS_BACKWARD = focusManager.MOVEFOCUS_BACKWARD;
+ 
+-const EventEmitter = require("devtools/shared/old-event-emitter");
++const EventEmitter = require("devtools/shared/event-emitter");
+ const { findMostRelevantCssPropertyIndex } = require("./suggestion-picker");
+ 
+ /**
+  * Helper to check if the provided key matches one of the expected keys.
+  * Keys will be prefixed with DOM_VK_ and should match a key in KeyCodes.
+  *
+  * @param {String} key
+  *        the key to check (can be a keyCode).
+diff --git a/devtools/client/shared/key-shortcuts.js b/devtools/client/shared/key-shortcuts.js
+--- a/devtools/client/shared/key-shortcuts.js
++++ b/devtools/client/shared/key-shortcuts.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 Services = require("Services");
+-const EventEmitter = require("devtools/shared/old-event-emitter");
++const EventEmitter = require("devtools/shared/event-emitter");
+ const isOSX = Services.appinfo.OS === "Darwin";
+ const {KeyCodes} = require("devtools/client/shared/keycodes");
+ 
+ // List of electron keys mapped to DOM API (DOM_VK_*) key code
+ const ElectronKeysMapping = {
+   "F1": "DOM_VK_F1",
+   "F2": "DOM_VK_F2",
+   "F3": "DOM_VK_F3",
+diff --git a/devtools/client/shared/options-view.js b/devtools/client/shared/options-view.js
+--- a/devtools/client/shared/options-view.js
++++ b/devtools/client/shared/options-view.js
+@@ -1,11 +1,11 @@
+ "use strict";
+ 
+-const EventEmitter = require("devtools/shared/old-event-emitter");
++const EventEmitter = require("devtools/shared/event-emitter");
+ const Services = require("Services");
+ const { Preferences } = require("resource://gre/modules/Preferences.jsm");
+ const OPTIONS_SHOWN_EVENT = "options-shown";
+ const OPTIONS_HIDDEN_EVENT = "options-hidden";
+ const PREF_CHANGE_EVENT = "pref-changed";
+ 
+ /**
+  * OptionsView constructor. Takes several options, all required:
+@@ -90,17 +90,17 @@ OptionsView.prototype = {
+     return this.prefObserver.get(prefName);
+   },
+ 
+   /**
+    * Called when a preference is changed (either via clicking an option
+    * button or by changing it in about:config). Updates the checked status
+    * of the corresponding button.
+    */
+-  _onPrefChange: function (_, prefName) {
++  _onPrefChange: function (prefName) {
+     let $el = this.$(`menuitem[data-pref="${prefName}"]`, this.menupopup);
+     let value = this.prefObserver.get(prefName);
+ 
+     // If options panel does not contain a menuitem for the
+     // pref, emit an event and do nothing.
+     if (!$el) {
+       this.emit(PREF_CHANGE_EVENT, prefName);
+       return;
+diff --git a/devtools/client/shared/output-parser.js b/devtools/client/shared/output-parser.js
+--- a/devtools/client/shared/output-parser.js
++++ b/devtools/client/shared/output-parser.js
+@@ -3,17 +3,17 @@
+  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+ 
+ "use strict";
+ 
+ const Services = require("Services");
+ const {angleUtils} = require("devtools/client/shared/css-angle");
+ const {colorUtils} = require("devtools/shared/css/color");
+ const {getCSSLexer} = require("devtools/shared/css/lexer");
+-const EventEmitter = require("devtools/shared/old-event-emitter");
++const EventEmitter = require("devtools/shared/event-emitter");
+ const {appendText} = require("devtools/client/inspector/shared/utils");
+ 
+ loader.lazyRequireGetter(this, "ANGLE_TAKING_FUNCTIONS",
+   "devtools/shared/css/properties-db", true);
+ loader.lazyRequireGetter(this, "BASIC_SHAPE_FUNCTIONS",
+   "devtools/shared/css/properties-db", true);
+ loader.lazyRequireGetter(this, "BEZIER_KEYWORDS",
+   "devtools/shared/css/properties-db", true);
+diff --git a/devtools/client/shared/prefs.js b/devtools/client/shared/prefs.js
+--- a/devtools/client/shared/prefs.js
++++ b/devtools/client/shared/prefs.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 Services = require("Services");
+-const EventEmitter = require("devtools/shared/old-event-emitter");
++const EventEmitter = require("devtools/shared/event-emitter");
+ 
+ /**
+  * Shortcuts for lazily accessing and setting various preferences.
+  * Usage:
+  *   let prefs = new Prefs("root.path.to.branch", {
+  *     myIntPref: ["Int", "leaf.path.to.my-int-pref"],
+  *     myCharPref: ["Char", "leaf.path.to.my-char-pref"],
+  *     myJsonPref: ["Json", "leaf.path.to.my-json-pref"],
+@@ -18,17 +18,17 @@ const EventEmitter = require("devtools/s
+  *   });
+  *
+  * Get/set:
+  *   prefs.myCharPref = "foo";
+  *   let aux = prefs.myCharPref;
+  *
+  * Observe:
+  *   prefs.registerObserver();
+- *   prefs.on("pref-changed", (prefName, prefValue) => {
++ *   prefs.on("pref-changed", (prefValue) => {
+  *     ...
+  *   });
+  *
+  * @param string prefsRoot
+  *        The root path to the required preferences branch.
+  * @param object prefsBlueprint
+  *        An object containing { accessorName: [prefType, prefName] } keys.
+  */
+diff --git a/devtools/client/shared/test/browser_key_shortcuts.js b/devtools/client/shared/test/browser_key_shortcuts.js
+--- a/devtools/client/shared/test/browser_key_shortcuts.js
++++ b/devtools/client/shared/test/browser_key_shortcuts.js
+@@ -1,10 +1,10 @@
+ /* Any copyright is dedicated to the Public Domain.
+-   http://creativecommons.org/publicdomain/zero/1.0/ */
++  http://creativecommons.org/publicdomain/zero/1.0/ */
+ 
+ "use strict";
+ 
+ var isOSX = Services.appinfo.OS === "Darwin";
+ 
+ add_task(function* () {
+   let shortcuts = new KeyShortcuts({
+     window
+@@ -29,88 +29,87 @@ add_task(function* () {
+   yield testTarget();
+ });
+ 
+ // Test helper to listen to the next key press for a given key,
+ // returning a promise to help using Tasks.
+ function once(shortcuts, key, listener) {
+   let called = false;
+   return new Promise(done => {
+-    let onShortcut = (key2, event) => {
++    let onShortcut = event => {
+       shortcuts.off(key, onShortcut);
+       ok(!called, "once listener called only once (i.e. off() works)");
+-      is(key, key2, "listener first argument match the key we listen");
+       called = true;
+-      listener(key2, event);
++      listener(event);
+       done();
+     };
+     shortcuts.on(key, onShortcut);
+   });
+ }
+ 
+ function* testSimple(shortcuts) {
+   info("Test simple key shortcuts");
+ 
+-  let onKey = once(shortcuts, "0", (key, event) => {
++  let onKey = once(shortcuts, "0", event => {
+     is(event.key, "0");
+ 
+     // Display another key press to ensure that once() correctly stop listening
+     EventUtils.synthesizeKey("0", {}, window);
+   });
+ 
+   EventUtils.synthesizeKey("0", {}, window);
+   yield onKey;
+ }
+ 
+ function* testNonLetterCharacter(shortcuts) {
+   info("Test non-naive character key shortcuts");
+ 
+-  let onKey = once(shortcuts, "[", (key, event) => {
++  let onKey = once(shortcuts, "[", event => {
+     is(event.key, "[");
+   });
+ 
+   EventUtils.synthesizeKey("[", {}, window);
+   yield onKey;
+ }
+ 
+ function* testFunctionKey(shortcuts) {
+   info("Test function key shortcuts");
+ 
+-  let onKey = once(shortcuts, "F12", (key, event) => {
++  let onKey = once(shortcuts, "F12", event => {
+     is(event.key, "F12");
+   });
+ 
+   EventUtils.synthesizeKey("F12", { keyCode: 123 }, window);
+   yield onKey;
+ }
+ 
+ // Plus is special. It's keycode is the one for "=". That's because it requires
+ // shift to be pressed and is behind "=" key. So it should be considered as a
+ // character key
+ function* testPlusCharacter(shortcuts) {
+   info("Test 'Plus' key shortcuts");
+ 
+-  let onKey = once(shortcuts, "Plus", (key, event) => {
++  let onKey = once(shortcuts, "Plus", event => {
+     is(event.key, "+");
+   });
+ 
+   EventUtils.synthesizeKey("+", { keyCode: 61, shiftKey: true }, window);
+   yield onKey;
+ }
+ 
+ // Test they listeners are not mixed up between shortcuts
+ function* testMixup(shortcuts) {
+   info("Test possible listener mixup");
+ 
+   let hitFirst = false, hitSecond = false;
+-  let onFirstKey = once(shortcuts, "0", (key, event) => {
++  let onFirstKey = once(shortcuts, "0", event => {
+     is(event.key, "0");
+     hitFirst = true;
+   });
+-  let onSecondKey = once(shortcuts, "Alt+A", (key, event) => {
++  let onSecondKey = once(shortcuts, "Alt+A", event => {
+     is(event.key, "a");
+     ok(event.altKey);
+     hitSecond = true;
+   });
+ 
+   // Dispatch the first shortcut and expect only this one to be notified
+   ok(!hitFirst, "First shortcut isn't notified before firing the key event");
+   EventUtils.synthesizeKey("0", {}, window);
+@@ -129,32 +128,32 @@ function* testMixup(shortcuts) {
+   yield onSecondKey;
+   ok(hitSecond, "Got the second shortcut notified once it is actually fired");
+ }
+ 
+ // On azerty keyboard, digits are only available by pressing Shift/Capslock,
+ // but we accept them even if we omit doing that.
+ function* testLooseDigits(shortcuts) {
+   info("Test Loose digits");
+-  let onKey = once(shortcuts, "0", (key, event) => {
++  let onKey = once(shortcuts, "0", event => {
+     is(event.key, "à");
+     ok(!event.altKey);
+     ok(!event.ctrlKey);
+     ok(!event.metaKey);
+     ok(!event.shiftKey);
+   });
+   // Simulate a press on the "0" key, without shift pressed on a french
+   // keyboard
+   EventUtils.synthesizeKey(
+     "à",
+     { keyCode: 48 },
+     window);
+   yield onKey;
+ 
+-  onKey = once(shortcuts, "0", (key, event) => {
++  onKey = once(shortcuts, "0", event => {
+     is(event.key, "0");
+     ok(!event.altKey);
+     ok(!event.ctrlKey);
+     ok(!event.metaKey);
+     ok(event.shiftKey);
+   });
+   // Simulate the same press with shift pressed
+   EventUtils.synthesizeKey(
+@@ -164,17 +163,17 @@ function* testLooseDigits(shortcuts) {
+   yield onKey;
+ }
+ 
+ // Test that shortcuts is notified only when the modifiers match exactly
+ function* testExactModifiers(shortcuts) {
+   info("Test exact modifiers match");
+ 
+   let hit = false;
+-  let onKey = once(shortcuts, "Alt+A", (key, event) => {
++  let onKey = once(shortcuts, "Alt+A", event => {
+     is(event.key, "a");
+     ok(event.altKey);
+     ok(!event.ctrlKey);
+     ok(!event.metaKey);
+     ok(!event.shiftKey);
+     hit = true;
+   });
+ 
+@@ -210,30 +209,30 @@ function* testExactModifiers(shortcuts) 
+ }
+ 
+ // Some keys are only accessible via shift and listener should also be called
+ // even if the key didn't explicitely requested Shift modifier.
+ // For example, `%` on french keyboards is only accessible via Shift.
+ // Same thing for `@` on US keybords.
+ function* testLooseShiftModifier(shortcuts) {
+   info("Test Loose shift modifier");
+-  let onKey = once(shortcuts, "%", (key, event) => {
++  let onKey = once(shortcuts, "%", event => {
+     is(event.key, "%");
+     ok(!event.altKey);
+     ok(!event.ctrlKey);
+     ok(!event.metaKey);
+     ok(event.shiftKey);
+   });
+   EventUtils.synthesizeKey(
+     "%",
+     { accelKey: false, altKey: false, ctrlKey: false, shiftKey: true},
+     window);
+   yield onKey;
+ 
+-  onKey = once(shortcuts, "@", (key, event) => {
++  onKey = once(shortcuts, "@", event => {
+     is(event.key, "@");
+     ok(!event.altKey);
+     ok(!event.ctrlKey);
+     ok(!event.metaKey);
+     ok(event.shiftKey);
+   });
+   EventUtils.synthesizeKey(
+     "@",
+@@ -241,25 +240,25 @@ function* testLooseShiftModifier(shortcu
+     window);
+   yield onKey;
+ }
+ 
+ // But Shift modifier is strict on all letter characters (a to Z)
+ function* testStrictLetterShiftModifier(shortcuts) {
+   info("Test strict shift modifier on letters");
+   let hitFirst = false;
+-  let onKey = once(shortcuts, "a", (key, event) => {
++  let onKey = once(shortcuts, "a", event => {
+     is(event.key, "a");
+     ok(!event.altKey);
+     ok(!event.ctrlKey);
+     ok(!event.metaKey);
+     ok(!event.shiftKey);
+     hitFirst = true;
+   });
+-  let onShiftKey = once(shortcuts, "Shift+a", (key, event) => {
++  let onShiftKey = once(shortcuts, "Shift+a", event => {
+     is(event.key, "a");
+     ok(!event.altKey);
+     ok(!event.ctrlKey);
+     ok(!event.metaKey);
+     ok(event.shiftKey);
+   });
+   EventUtils.synthesizeKey(
+     "a",
+@@ -272,45 +271,45 @@ function* testStrictLetterShiftModifier(
+     "a",
+     { shiftKey: false},
+     window);
+   yield onKey;
+ }
+ 
+ function* testAltModifier(shortcuts) {
+   info("Test Alt modifier");
+-  let onKey = once(shortcuts, "Alt+F1", (key, event) => {
++  let onKey = once(shortcuts, "Alt+F1", event => {
+     is(event.keyCode, window.KeyboardEvent.DOM_VK_F1);
+     ok(event.altKey);
+     ok(!event.ctrlKey);
+     ok(!event.metaKey);
+     ok(!event.shiftKey);
+   });
+   EventUtils.synthesizeKey(
+     "VK_F1",
+     { altKey: true },
+     window);
+   yield onKey;
+ }
+ 
+ function* testCommandOrControlModifier(shortcuts) {
+   info("Test CommandOrControl modifier");
+-  let onKey = once(shortcuts, "CommandOrControl+F1", (key, event) => {
++  let onKey = once(shortcuts, "CommandOrControl+F1", event => {
+     is(event.keyCode, window.KeyboardEvent.DOM_VK_F1);
+     ok(!event.altKey);
+     if (isOSX) {
+       ok(!event.ctrlKey);
+       ok(event.metaKey);
+     } else {
+       ok(event.ctrlKey);
+       ok(!event.metaKey);
+     }
+     ok(!event.shiftKey);
+   });
+-  let onKeyAlias = once(shortcuts, "CmdOrCtrl+F1", (key, event) => {
++  let onKeyAlias = once(shortcuts, "CmdOrCtrl+F1", event => {
+     is(event.keyCode, window.KeyboardEvent.DOM_VK_F1);
+     ok(!event.altKey);
+     if (isOSX) {
+       ok(!event.ctrlKey);
+       ok(event.metaKey);
+     } else {
+       ok(event.ctrlKey);
+       ok(!event.metaKey);
+@@ -329,24 +328,24 @@ function* testCommandOrControlModifier(s
+       window);
+   }
+   yield onKey;
+   yield onKeyAlias;
+ }
+ 
+ function* testCtrlModifier(shortcuts) {
+   info("Test Ctrl modifier");
+-  let onKey = once(shortcuts, "Ctrl+F1", (key, event) => {
++  let onKey = once(shortcuts, "Ctrl+F1", event => {
+     is(event.keyCode, window.KeyboardEvent.DOM_VK_F1);
+     ok(!event.altKey);
+     ok(event.ctrlKey);
+     ok(!event.metaKey);
+     ok(!event.shiftKey);
+   });
+-  let onKeyAlias = once(shortcuts, "Control+F1", (key, event) => {
++  let onKeyAlias = once(shortcuts, "Control+F1", event => {
+     is(event.keyCode, window.KeyboardEvent.DOM_VK_F1);
+     ok(!event.altKey);
+     ok(event.ctrlKey);
+     ok(!event.metaKey);
+     ok(!event.shiftKey);
+   });
+   EventUtils.synthesizeKey(
+     "VK_F1",
+@@ -357,24 +356,24 @@ function* testCtrlModifier(shortcuts) {
+ }
+ 
+ function* testCmdShiftShortcut(shortcuts) {
+   if (!isOSX) {
+     // This test is OSX only (Bug 1300458).
+     return;
+   }
+ 
+-  let onCmdKey = once(shortcuts, "CmdOrCtrl+[", (key, event) => {
++  let onCmdKey = once(shortcuts, "CmdOrCtrl+[", event => {
+     is(event.key, "[");
+     ok(!event.altKey);
+     ok(!event.ctrlKey);
+     ok(event.metaKey);
+     ok(!event.shiftKey);
+   });
+-  let onCmdShiftKey = once(shortcuts, "CmdOrCtrl+Shift+[", (key, event) => {
++  let onCmdShiftKey = once(shortcuts, "CmdOrCtrl+Shift+[", event => {
+     is(event.key, "[");
+     ok(!event.altKey);
+     ok(!event.ctrlKey);
+     ok(event.metaKey);
+     ok(event.shiftKey);
+   });
+ 
+   EventUtils.synthesizeKey(
+@@ -397,17 +396,17 @@ function* testTarget() {
+     "input");
+   document.documentElement.appendChild(target);
+   target.focus();
+ 
+   let shortcuts = new KeyShortcuts({
+     window,
+     target
+   });
+-  let onKey = once(shortcuts, "0", (key, event) => {
++  let onKey = once(shortcuts, "0", event => {
+     is(event.key, "0");
+     is(event.target, target);
+   });
+   EventUtils.synthesizeKey("0", {}, window);
+   yield onKey;
+ 
+   target.remove();
+ 
+diff --git a/devtools/client/shared/test/browser_options-view-01.js b/devtools/client/shared/test/browser_options-view-01.js
+--- a/devtools/client/shared/test/browser_options-view-01.js
++++ b/devtools/client/shared/test/browser_options-view-01.js
+@@ -36,17 +36,17 @@ add_task(function* () {
+ 
+ function* testOptionsView(win) {
+   let events = [];
+   let options = createOptionsView(win);
+   yield options.initialize();
+ 
+   let $ = win.document.querySelector.bind(win.document);
+ 
+-  options.on("pref-changed", (_, pref) => events.push(pref));
++  options.on("pref-changed", pref => events.push(pref));
+ 
+   let ppEl = $("menuitem[data-pref='auto-pretty-print']");
+   let bbEl = $("menuitem[data-pref='auto-black-box']");
+ 
+   // Test default config
+   is(ppEl.getAttribute("checked"), "true", "`true` prefs are checked on start");
+   is(bbEl.getAttribute("checked"), "", "`false` prefs are unchecked on start");
+ 
+diff --git a/devtools/client/shared/test/browser_spectrum.js b/devtools/client/shared/test/browser_spectrum.js
+--- a/devtools/client/shared/test/browser_spectrum.js
++++ b/devtools/client/shared/test/browser_spectrum.js
+@@ -68,17 +68,17 @@ function testSettingAndGettingANewColor(
+   s.destroy();
+ }
+ 
+ function testChangingColorShouldEmitEvents(container) {
+   return new Promise(resolve => {
+     let s = new Spectrum(container, [255, 255, 255, 1]);
+     s.show();
+ 
+-    s.once("changed", (event, rgba, color) => {
++    s.once("changed", (rgba, color) => {
+       ok(true, "Changed event was emitted on color change");
+       is(rgba[0], 128, "New color is correct");
+       is(rgba[1], 64, "New color is correct");
+       is(rgba[2], 64, "New color is correct");
+       is(rgba[3], 1, "New color is correct");
+       is(`rgba(${rgba.join(", ")})`, color, "RGBA and css color correspond");
+ 
+       s.destroy();
+diff --git a/devtools/client/shared/test/browser_theme.js b/devtools/client/shared/test/browser_theme.js
+--- a/devtools/client/shared/test/browser_theme.js
++++ b/devtools/client/shared/test/browser_theme.js
+@@ -32,19 +32,17 @@ function testGetTheme() {
+ 
+ function testSetTheme() {
+   let originalTheme = getTheme();
+   // Put this in a variable rather than hardcoding it because the default
+   // changes between aurora and nightly
+   let otherTheme = originalTheme == "dark" ? "light" : "dark";
+ 
+   let prefObserver = new PrefObserver("devtools.");
+-  prefObserver.once("devtools.theme", pref => {
+-    is(pref, "devtools.theme",
+-      "A preference event triggered by setTheme has correct pref.");
++  prefObserver.once("devtools.theme", () => {
+     let newValue = Services.prefs.getCharPref("devtools.theme");
+     is(newValue, otherTheme,
+       "A preference event triggered by setTheme comes after the value is set.");
+   });
+   setTheme(otherTheme);
+   is(Services.prefs.getCharPref("devtools.theme"), otherTheme,
+      "setTheme() correctly sets another theme.");
+   setTheme(originalTheme);
+diff --git a/devtools/client/shared/test/browser_toolbar_webconsole_errors_count.js b/devtools/client/shared/test/browser_toolbar_webconsole_errors_count.js
+--- a/devtools/client/shared/test/browser_toolbar_webconsole_errors_count.js
++++ b/devtools/client/shared/test/browser_toolbar_webconsole_errors_count.js
+@@ -239,19 +239,19 @@ function test() {
+         // Get out of the toolbar event execution loop.
+         executeSoon(options.callback);
+       }
+       return result;
+     }
+ 
+     if (!check()) {
+       info("wait for: " + options.name);
+-      toolbar.on("errors-counter-updated", function onUpdate(event) {
++      toolbar.on("errors-counter-updated", function onUpdate() {
+         if (check()) {
+-          toolbar.off(event, onUpdate);
++          toolbar.off("errors-counter-updated", onUpdate);
+         }
+       });
+     }
+   }
+ 
+   function openWebConsole(tab, callback) {
+     let target = TargetFactory.forTab(tab);
+     gDevTools.showToolbox(target, "webconsole").then((toolbox) =>
+diff --git a/devtools/client/shared/test/browser_treeWidget_keyboard_interaction.js b/devtools/client/shared/test/browser_treeWidget_keyboard_interaction.js
+--- a/devtools/client/shared/test/browser_treeWidget_keyboard_interaction.js
++++ b/devtools/client/shared/test/browser_treeWidget_keyboard_interaction.js
+@@ -81,17 +81,17 @@ function click(node) {
+ }
+ 
+ /**
+  * Tests if pressing navigation keys on the tree items does the expected behavior
+  */
+ async function testKeyboardInteraction(tree, win) {
+   info("Testing keyboard interaction with the tree");
+   let event;
+-  let pass = (e, d, a) => event.resolve([e, d, a]);
++  let pass = (d, a) => event.resolve([d, a]);
+ 
+   info("clicking on first top level item");
+   let node = tree.root.children.firstChild.firstChild;
+   event = defer();
+   // The select event handler will be called before the click event hasn't
+   // fully finished, so wait for both of them.
+   let clicked = once(node, "click");
+   tree.once("select", pass);
+@@ -101,47 +101,47 @@ async function testKeyboardInteraction(t
+   // node should not have selected class
+   ok(!node.classList.contains("theme-selected"), "Node should not have selected class");
+   ok(!node.hasAttribute("expanded"), "Node is not expanded");
+ 
+   info("Pressing down key to select next item");
+   event = defer();
+   tree.once("select", pass);
+   EventUtils.synthesizeKey("KEY_ArrowDown", {}, win);
+-  let [name, data, attachment] = await event.promise;
+-  is(name, "select", "Select event was fired after pressing down");
+-  is(data[0], "level1", "Correct item was selected after pressing down");
++
++  let [data, attachment] = await event.promise;
++  is(data, "level1", "Correct item was selected after pressing down");
+   ok(!attachment, "null attachment was emitted");
+   ok(node.classList.contains("theme-selected"), "Node has selected class");
+   ok(node.hasAttribute("expanded"), "Node is expanded now");
+ 
+   info("Pressing down key again to select next item");
+   event = defer();
+   tree.once("select", pass);
+   EventUtils.synthesizeKey("KEY_ArrowDown", {}, win);
+-  [name, data, attachment] = await event.promise;
++  [data, attachment] = await event.promise;
+   is(data.length, 2, "Correct level item was selected after second down keypress");
+   is(data[0], "level1", "Correct parent level");
+   is(data[1], "level2", "Correct second level");
+ 
+   info("Pressing down key again to select next item");
+   event = defer();
+   tree.once("select", pass);
+   EventUtils.synthesizeKey("KEY_ArrowDown", {}, win);
+-  [name, data, attachment] = await event.promise;
++  [data, attachment] = await event.promise;
+   is(data.length, 3, "Correct level item was selected after third down keypress");
+   is(data[0], "level1", "Correct parent level");
+   is(data[1], "level2", "Correct second level");
+   is(data[2], "level3", "Correct third level");
+ 
+   info("Pressing down key again to select next item");
+   event = defer();
+   tree.once("select", pass);
+   EventUtils.synthesizeKey("KEY_ArrowDown", {}, win);
+-  [name, data, attachment] = await event.promise;
++  [data, attachment] = await event.promise;
+   is(data.length, 2, "Correct level item was selected after fourth down keypress");
+   is(data[0], "level1", "Correct parent level");
+   is(data[1], "level2-1", "Correct second level");
+ 
+   // pressing left to check expand collapse feature.
+   // This does not emit any event, so listening for keypress
+   tree.root.children.addEventListener("keydown", () => {
+     // executeSoon so that other listeners on the same method are executed first
+@@ -160,30 +160,30 @@ async function testKeyboardInteraction(t
+ 
+   info("Pressing left key on collapsed item to select previous");
+   tree.once("select", pass);
+   event = defer();
+   // parent node should have no effect of this keypress
+   node = tree.root.children.firstChild.nextSibling.firstChild;
+   ok(node.hasAttribute("expanded"), "Parent is expanded");
+   EventUtils.synthesizeKey("KEY_ArrowLeft", {}, win);
+-  [name, data] = await event.promise;
++  [data] = await event.promise;
+   is(data.length, 3, "Correct level item was selected after second left keypress");
+   is(data[0], "level1", "Correct parent level");
+   is(data[1], "level2", "Correct second level");
+   is(data[2], "level3", "Correct third level");
+   ok(node.hasAttribute("expanded"), "Parent is still expanded after left keypress");
+ 
+   // pressing down again
+ 
+   info("Pressing down key to select next item");
+   event = defer();
+   tree.once("select", pass);
+   EventUtils.synthesizeKey("KEY_ArrowDown", {}, win);
+-  [name, data, attachment] = await event.promise;
++  [data, attachment] = await event.promise;
+   is(data.length, 2, "Correct level item was selected after fifth down keypress");
+   is(data[0], "level1", "Correct parent level");
+   is(data[1], "level2-1", "Correct second level");
+ 
+   // collapsing the item to check expand feature.
+ 
+   tree.root.children.addEventListener("keydown", () => {
+     executeSoon(() => event.resolve(null));
+diff --git a/devtools/client/shared/test/browser_treeWidget_mouse_interaction.js b/devtools/client/shared/test/browser_treeWidget_mouse_interaction.js
+--- a/devtools/client/shared/test/browser_treeWidget_mouse_interaction.js
++++ b/devtools/client/shared/test/browser_treeWidget_mouse_interaction.js
+@@ -81,44 +81,44 @@ function click(node) {
+ }
+ 
+ /**
+  * Tests if clicking the tree items does the expected behavior
+  */
+ function* testMouseInteraction(tree) {
+   info("Testing mouse interaction with the tree");
+   let event;
+-  let pass = (e, d, a) => event.resolve([e, d, a]);
++  let pass = (d, a) => event.resolve([d, a]);
+ 
+   ok(!tree.selectedItem, "Nothing should be selected beforehand");
+ 
+   tree.once("select", pass);
+   let node = tree.root.children.firstChild.firstChild;
+   info("clicking on first top level item");
+   event = defer();
+   ok(!node.classList.contains("theme-selected"),
+      "Node should not have selected class before clicking");
+   click(node);
+-  let [, data, attachment] = yield event.promise;
++  let [data, attachment] = yield event.promise;
+   ok(node.classList.contains("theme-selected"),
+      "Node has selected class after click");
+   is(data[0], "level1.2", "Correct tree path is emitted");
+   ok(attachment && attachment.foo, "Correct attachment is emitted");
+   is(attachment.foo, "bar", "Correct attachment value is emitted");
+ 
+   info("clicking second top level item with children to check if it expands");
+   let node2 = tree.root.children.firstChild.nextSibling.firstChild;
+   event = defer();
+   // node should not have selected class
+   ok(!node2.classList.contains("theme-selected"),
+      "New node should not have selected class before clicking");
+   ok(!node2.hasAttribute("expanded"), "New node is not expanded before clicking");
+   tree.once("select", pass);
+   click(node2);
+-  [, data, attachment] = yield event.promise;
++  [data, attachment] = yield event.promise;
+   ok(node2.classList.contains("theme-selected"),
+      "New node has selected class after clicking");
+   is(data[0], "level1", "Correct tree path is emitted for new node");
+   ok(!attachment, "null attachment should be emitted for new node");
+   ok(node2.hasAttribute("expanded"), "New node expanded after click");
+ 
+   ok(!node.classList.contains("theme-selected"),
+      "Old node should not have selected class after the click on new node");
+diff --git a/devtools/client/shared/webpack/README.md b/devtools/client/shared/webpack/README.md
+--- a/devtools/client/shared/webpack/README.md
++++ b/devtools/client/shared/webpack/README.md
+@@ -11,19 +11,19 @@ rewrite existing code, so it's understan
+ 
+ For example:
+ 
+ The following piece of code is using `lazyRequireGetter` that
+ is unknown to Webpack.
+ 
+ ```
+ loader.lazyRequireGetter(this, "EventEmitter",
+-  "devtools/shared/old-event-emitter");
++  "devtools/shared/event-emitter");
+ ```
+ 
+-In order to properly bundle `devtools/shared/old-event-emitter` module
++In order to properly bundle `devtools/shared/event-emitter` module
+ the code needs to be translated into:
+ 
+ ```
+-let EventEmitter = require("devtools/shared/old-event-emitter");
++let EventEmitter = require("devtools/shared/event-emitter");
+ ```
+ 
+ See more in `rewrite-lazy-require`
+diff --git a/devtools/client/shared/widgets/AbstractTreeItem.jsm b/devtools/client/shared/widgets/AbstractTreeItem.jsm
+--- a/devtools/client/shared/widgets/AbstractTreeItem.jsm
++++ b/devtools/client/shared/widgets/AbstractTreeItem.jsm
+@@ -5,17 +5,17 @@
+  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+ "use strict";
+ 
+ const { require, loader } = ChromeUtils.import("resource://devtools/shared/Loader.jsm", {});
+ const { XPCOMUtils } = require("resource://gre/modules/XPCOMUtils.jsm");
+ const { ViewHelpers } = require("devtools/client/shared/widgets/view-helpers");
+ const { KeyCodes } = require("devtools/client/shared/keycodes");
+ 
+-loader.lazyRequireGetter(this, "EventEmitter", "devtools/shared/old-event-emitter");
++loader.lazyRequireGetter(this, "EventEmitter", "devtools/shared/event-emitter");
+ 
+ ChromeUtils.defineModuleGetter(this, "console",
+   "resource://gre/modules/Console.jsm");
+ 
+ this.EXPORTED_SYMBOLS = ["AbstractTreeItem"];
+ 
+ /**
+  * A very generic and low-level tree view implementation. It is not intended
+diff --git a/devtools/client/shared/widgets/BreadcrumbsWidget.jsm b/devtools/client/shared/widgets/BreadcrumbsWidget.jsm
+--- a/devtools/client/shared/widgets/BreadcrumbsWidget.jsm
++++ b/devtools/client/shared/widgets/BreadcrumbsWidget.jsm
+@@ -4,17 +4,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 ENSURE_SELECTION_VISIBLE_DELAY = 50; // ms
+ 
+ const { require } = ChromeUtils.import("resource://devtools/shared/Loader.jsm", {});
+ const { ViewHelpers, setNamedTimeout } = require("devtools/client/shared/widgets/view-helpers");
+-const EventEmitter = require("devtools/shared/old-event-emitter");
++const EventEmitter = require("devtools/shared/event-emitter");
+ 
+ this.EXPORTED_SYMBOLS = ["BreadcrumbsWidget"];
+ 
+ /**
+  * A breadcrumb-like list of items.
+  *
+  * Note: this widget should be used in tandem with the WidgetMethods in
+  * view-helpers.js.
+diff --git a/devtools/client/shared/widgets/Chart.js b/devtools/client/shared/widgets/Chart.js
+--- a/devtools/client/shared/widgets/Chart.js
++++ b/devtools/client/shared/widgets/Chart.js
+@@ -7,17 +7,17 @@ const NET_STRINGS_URI = "devtools/client
+ const SVG_NS = "http://www.w3.org/2000/svg";
+ const PI = Math.PI;
+ const TAU = PI * 2;
+ const EPSILON = 0.0000001;
+ const NAMED_SLICE_MIN_ANGLE = TAU / 8;
+ const NAMED_SLICE_TEXT_DISTANCE_RATIO = 1.9;
+ const HOVERED_SLICE_TRANSLATE_DISTANCE_RATIO = 20;
+ 
+-const EventEmitter = require("devtools/shared/old-event-emitter");
++const EventEmitter = require("devtools/shared/event-emitter");
+ const { LocalizationHelper } = require("devtools/shared/l10n");
+ const L10N = new LocalizationHelper(NET_STRINGS_URI);
+ 
+ /**
+  * A factory for creating charts.
+  * Example usage: let myChart = Chart.Pie(document, { ... });
+  */
+ var Chart = {
+@@ -114,47 +114,47 @@ function createPieTableChart(document,
+ 
+   let container = document.createElement("div");
+   container.className = "pie-table-chart-container";
+   container.appendChild(pie.node);
+   container.appendChild(table.node);
+ 
+   let proxy = new PieTableChart(container, pie, table);
+ 
+-  pie.on("click", (event, item) => {
+-    proxy.emit(event, item);
++  pie.on("click", (item) => {
++    proxy.emit("click", item);
+   });
+ 
+-  table.on("click", (event, item) => {
+-    proxy.emit(event, item);
++  table.on("click", (item) => {
++    proxy.emit("click", item);
+   });
+ 
+-  pie.on("mouseover", (event, item) => {
+-    proxy.emit(event, item);
++  pie.on("mouseover", (item) => {
++    proxy.emit("mouseover", item);
+     if (table.rows.has(item)) {
+       table.rows.get(item).setAttribute("focused", "");
+     }
+   });
+ 
+-  pie.on("mouseout", (event, item) => {
+-    proxy.emit(event, item);
++  pie.on("mouseout", (item) => {
++    proxy.emit("mouseout", item);
+     if (table.rows.has(item)) {
+       table.rows.get(item).removeAttribute("focused");
+     }
+   });
+ 
+-  table.on("mouseover", (event, item) => {
+-    proxy.emit(event, item);
++  table.on("mouseover", (item) => {
++    proxy.emit("mouseover", item);
+     if (pie.slices.has(item)) {
+       pie.slices.get(item).setAttribute("focused", "");
+     }
+   });
+ 
+-  table.on("mouseout", (event, item) => {
+-    proxy.emit(event, item);
++  table.on("mouseout", (item) => {
++    proxy.emit("mouseout", item);
+     if (pie.slices.has(item)) {
+       pie.slices.get(item).removeAttribute("focused");
+     }
+   });
+ 
+   return proxy;
+ }
+ 
+diff --git a/devtools/client/shared/widgets/ColorWidget.js b/devtools/client/shared/widgets/ColorWidget.js
+--- a/devtools/client/shared/widgets/ColorWidget.js
++++ b/devtools/client/shared/widgets/ColorWidget.js
+@@ -5,32 +5,32 @@
+ /**
+  * This file is a new working copy of Spectrum.js for the purposes of refreshing the color
+  * widget. It is hidden behind a pref("devtools.inspector.colorWidget.enabled").
+  */
+ 
+ "use strict";
+ 
+ const {Task} = require("devtools/shared/task");
+-const EventEmitter = require("devtools/shared/old-event-emitter");
++const EventEmitter = require("devtools/shared/event-emitter");
+ const {colorUtils} = require("devtools/shared/css/color");
+ const {LocalizationHelper} = require("devtools/shared/l10n");
+ const L10N = new LocalizationHelper("devtools/client/locales/inspector.properties");
+ 
+ const XHTML_NS = "http://www.w3.org/1999/xhtml";
+ const SAMPLE_TEXT = "Abc";
+ 
+ /**
+  * ColorWidget creates a color picker widget in any container you give it.
+  *
+  * Simple usage example:
+  *
+  * const {ColorWidget} = require("devtools/client/shared/widgets/ColorWidget");
+  * let s = new ColorWidget(containerElement, [255, 126, 255, 1]);
+- * s.on("changed", (event, rgba, color) => {
++ * s.on("changed", (rgba, color) => {
+  *   console.log("rgba(" + rgba[0] + ", " + rgba[1] + ", " + rgba[2] + ", " +
+  *     rgba[3] + ")");
+  * });
+  * s.show();
+  * s.destroy();
+  *
+  * Note that the color picker is hidden by default and you need to call show to
+  * make it appear. This 2 stages initialization helps in cases you are creating
+diff --git a/devtools/client/shared/widgets/CubicBezierWidget.js b/devtools/client/shared/widgets/CubicBezierWidget.js
+--- a/devtools/client/shared/widgets/CubicBezierWidget.js
++++ b/devtools/client/shared/widgets/CubicBezierWidget.js
+@@ -20,17 +20,17 @@
+  * DEALINGS IN THE SOFTWARE.
+  */
+ 
+ // Based on www.cubic-bezier.com by Lea Verou
+ // See https://github.com/LeaVerou/cubic-bezier
+ 
+ "use strict";
+ 
+-const EventEmitter = require("devtools/shared/old-event-emitter");
++const EventEmitter = require("devtools/shared/event-emitter");
+ const {
+   PREDEFINED,
+   PRESETS,
+   DEFAULT_PRESET_CATEGORY
+ } = require("devtools/client/shared/widgets/CubicBezierPresets");
+ const {getCSSLexer} = require("devtools/shared/css/lexer");
+ const XHTML_NS = "http://www.w3.org/1999/xhtml";
+ 
+@@ -385,17 +385,17 @@ CubicBezierWidget.prototype = {
+ 
+     let point = distP1 < distP2 ? this.p1 : this.p2;
+     point.style.left = x + "px";
+     point.style.top = y + "px";
+ 
+     this._updateFromPoints();
+   },
+ 
+-  _onNewCoordinates: function (event, coordinates) {
++  _onNewCoordinates: function (coordinates) {
+     this.coordinates = coordinates;
+   },
+ 
+   /**
+    * Get the current point coordinates and redraw the curve to match
+    */
+   _updateFromPoints: function () {
+     // Get the new coordinates from the point's offsets
+diff --git a/devtools/client/shared/widgets/FastListWidget.js b/devtools/client/shared/widgets/FastListWidget.js
+--- a/devtools/client/shared/widgets/FastListWidget.js
++++ b/devtools/client/shared/widgets/FastListWidget.js
+@@ -1,16 +1,16 @@
+ /* -*- indent-tabs-mode: nil; 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 { ViewHelpers } = require("devtools/client/shared/widgets/view-helpers");
+ 
+ /**
+  * A list menu widget that attempts to be very fast.
+  *
+  * Note: this widget should be used in tandem with the WidgetMethods in
+  * view-helpers.js.
+  *
+diff --git a/devtools/client/shared/widgets/FilterWidget.js b/devtools/client/shared/widgets/FilterWidget.js
+--- a/devtools/client/shared/widgets/FilterWidget.js
++++ b/devtools/client/shared/widgets/FilterWidget.js
+@@ -4,17 +4,17 @@
+ 
+ "use strict";
+ 
+ /**
+   * This is a CSS Filter Editor widget used
+   * for Rule View's filter swatches
+   */
+ 
+-const EventEmitter = require("devtools/shared/old-event-emitter");
++const EventEmitter = require("devtools/shared/event-emitter");
+ const { Cc, Ci } = require("chrome");
+ const XHTML_NS = "http://www.w3.org/1999/xhtml";
+ 
+ const { LocalizationHelper } = require("devtools/shared/l10n");
+ const STRINGS_URI = "devtools/client/locales/filterwidget.properties";
+ const L10N = new LocalizationHelper(STRINGS_URI);
+ 
+ const {cssTokenizer} = require("devtools/shared/css/parsing-utils");
+diff --git a/devtools/client/shared/widgets/FlameGraph.js b/devtools/client/shared/widgets/FlameGraph.js
+--- a/devtools/client/shared/widgets/FlameGraph.js
++++ b/devtools/client/shared/widgets/FlameGraph.js
+@@ -4,17 +4,17 @@
+ "use strict";
+ 
+ const { Task } = require("devtools/shared/task");
+ const { ViewHelpers, setNamedTimeout } = require("devtools/client/shared/widgets/view-helpers");
+ const { ELLIPSIS } = require("devtools/shared/l10n");
+ 
+ loader.lazyRequireGetter(this, "defer", "devtools/shared/defer");
+ loader.lazyRequireGetter(this, "EventEmitter",
+-  "devtools/shared/old-event-emitter");
++  "devtools/shared/event-emitter");
+ 
+ loader.lazyRequireGetter(this, "getColor",
+   "devtools/client/shared/theme", true);
+ 
+ loader.lazyRequireGetter(this, "CATEGORY_MAPPINGS",
+   "devtools/client/performance/modules/categories", true);
+ loader.lazyRequireGetter(this, "FrameUtils",
+   "devtools/client/performance/modules/logic/frame-utils");
+diff --git a/devtools/client/shared/widgets/Graphs.js b/devtools/client/shared/widgets/Graphs.js
+--- a/devtools/client/shared/widgets/Graphs.js
++++ b/devtools/client/shared/widgets/Graphs.js
+@@ -4,17 +4,17 @@
+ "use strict";
+ 
+ const { Task } = require("devtools/shared/task");
+ const { setNamedTimeout } = require("devtools/client/shared/widgets/view-helpers");
+ const { getCurrentZoom } = require("devtools/shared/layout/utils");
+ 
+ loader.lazyRequireGetter(this, "defer", "devtools/shared/defer");
+ loader.lazyRequireGetter(this, "EventEmitter",
+-  "devtools/shared/old-event-emitter");
++  "devtools/shared/event-emitter");
+ 
+ loader.lazyImporter(this, "DevToolsWorker",
+   "resource://devtools/shared/worker/worker.js");
+ 
+ const HTML_NS = "http://www.w3.org/1999/xhtml";
+ const GRAPH_SRC = "chrome://devtools/content/shared/widgets/graphs-frame.xhtml";
+ const WORKER_URL =
+   "resource://devtools/client/shared/widgets/GraphsWorker.js";
+diff --git a/devtools/client/shared/widgets/SideMenuWidget.jsm b/devtools/client/shared/widgets/SideMenuWidget.jsm
+--- a/devtools/client/shared/widgets/SideMenuWidget.jsm
++++ b/devtools/client/shared/widgets/SideMenuWidget.jsm
+@@ -3,17 +3,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 SHARED_STRINGS_URI = "devtools/client/locales/shared.properties";
+ 
+ const { require } = ChromeUtils.import("resource://devtools/shared/Loader.jsm", {});
+-const EventEmitter = require("devtools/shared/old-event-emitter");
++const EventEmitter = require("devtools/shared/event-emitter");
+ const { LocalizationHelper } = require("devtools/shared/l10n");
+ const { ViewHelpers } = require("devtools/client/shared/widgets/view-helpers");
+ 
+ this.EXPORTED_SYMBOLS = ["SideMenuWidget"];
+ 
+ /**
+  * Localization convenience methods.
+  */
+diff --git a/devtools/client/shared/widgets/Spectrum.js b/devtools/client/shared/widgets/Spectrum.js
+--- a/devtools/client/shared/widgets/Spectrum.js
++++ b/devtools/client/shared/widgets/Spectrum.js
+@@ -1,25 +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 EventEmitter = require("devtools/shared/old-event-emitter");
++const EventEmitter = require("devtools/shared/event-emitter");
+ const XHTML_NS = "http://www.w3.org/1999/xhtml";
+ 
+ /**
+  * Spectrum creates a color picker widget in any container you give it.
+  *
+  * Simple usage example:
+  *
+  * const {Spectrum} = require("devtools/client/shared/widgets/Spectrum");
+  * let s = new Spectrum(containerElement, [255, 126, 255, 1]);
+- * s.on("changed", (event, rgba, color) => {
++ * s.on("changed", (rgba, color) => {
+  *   console.log("rgba(" + rgba[0] + ", " + rgba[1] + ", " + rgba[2] + ", " +
+  *     rgba[3] + ")");
+  * });
+  * s.show();
+  * s.destroy();
+  *
+  * Note that the color picker is hidden by default and you need to call show to
+  * make it appear. This 2 stages initialization helps in cases you are creating
+diff --git a/devtools/client/shared/widgets/TableWidget.js b/devtools/client/shared/widgets/TableWidget.js
+--- a/devtools/client/shared/widgets/TableWidget.js
++++ b/devtools/client/shared/widgets/TableWidget.js
+@@ -1,14 +1,14 @@
+ /* 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");
+ loader.lazyRequireGetter(this, "setNamedTimeout",
+   "devtools/client/shared/widgets/view-helpers", true);
+ loader.lazyRequireGetter(this, "clearNamedTimeout",
+   "devtools/client/shared/widgets/view-helpers", true);
+ loader.lazyRequireGetter(this, "naturalSortCaseInsensitive",
+   "devtools/client/shared/natural-sort", true);
+ const {KeyCodes} = require("devtools/client/shared/keycodes");
+ 
+@@ -101,17 +101,17 @@ function TableWidget(node, options = {})
+   }
+ 
+   if (initialColumns) {
+     this.setColumns(initialColumns, uniqueId);
+   } else if (this.emptyText) {
+     this.setPlaceholderText(this.emptyText);
+   }
+ 
+-  this.bindSelectedRow = (event, id) => {
++  this.bindSelectedRow = id => {
+     this.selectedRow = id;
+   };
+   this.on(EVENTS.ROW_SELECTED, this.bindSelectedRow);
+ 
+   this.onChange = this.onChange.bind(this);
+   this.onEditorDestroyed = this.onEditorDestroyed.bind(this);
+   this.onEditorTab = this.onEditorTab.bind(this);
+   this.onKeydown = this.onKeydown.bind(this);
+@@ -245,17 +245,17 @@ TableWidget.prototype = {
+ 
+     let columns = this._parent.querySelectorAll(".table-widget-column");
+     return filter(columns);
+   },
+ 
+   /**
+    * Emit all cell edit events.
+    */
+-  onChange: function (type, data) {
++  onChange: function (data) {
+     let changedField = data.change.field;
+     let colName = changedField.parentNode.id;
+     let column = this.columns.get(colName);
+     let uniqueId = column.table.uniqueId;
+     let itemIndex = column.cellNodes.indexOf(changedField);
+     let items = {};
+ 
+     for (let [name, col] of this.columns) {
+@@ -308,17 +308,17 @@ TableWidget.prototype = {
+     // column it is currently sorted on. In addition to this, the table cell may
+     // have been edited and had to be recreated when the user has pressed tab or
+     // shift+tab. Both of these situations require us to recover our target,
+     // select the appropriate row and move the textbox on to the next cell.
+     if (editor.changePending) {
+       // We need to apply a change, which can mean that the position of cells
+       // within the table can change. Because of this we need to wait for
+       // EVENTS.ROW_EDIT and then move the textbox.
+-      this.once(EVENTS.ROW_EDIT, (e, uniqueId) => {
++      this.once(EVENTS.ROW_EDIT, uniqueId => {
+         let cell;
+         let cells;
+         let columnObj;
+         let cols = this.editableColumns;
+         let rowIndex = this.visibleSelectedIndex;
+         let colIndex = cols.indexOf(column);
+         let newIndex;
+ 
+@@ -447,17 +447,17 @@ TableWidget.prototype = {
+   /**
+    * Reset the editable fields engine if the currently edited row is removed.
+    *
+    * @param  {String} event
+    *         The event name "event-removed."
+    * @param  {Object} row
+    *         The values from the removed row.
+    */
+-  onRowRemoved: function (event, row) {
++  onRowRemoved: function (row) {
+     if (!this._editableFieldsEngine || !this._editableFieldsEngine.isEditing) {
+       return;
+     }
+ 
+     let removedKey = row[this.uniqueId];
+     let column = this.columns.get(this.uniqueId);
+ 
+     if (removedKey in column.items) {
+@@ -1177,29 +1177,29 @@ Column.prototype = {
+   /**
+    * Called when the column is sorted by.
+    *
+    * @param {string} event
+    *        The event name of the event. i.e. EVENTS.COLUMN_SORTED
+    * @param {string} column
+    *        The id of the column being sorted by.
+    */
+-  onColumnSorted: function (event, column) {
++  onColumnSorted: function (column) {
+     if (column != this.id) {
+       this.sorted = 0;
+       return;
+     } else if (this.sorted == 0 || this.sorted == 2) {
+       this.sorted = 1;
+     } else {
+       this.sorted = 2;
+     }
+     this.updateZebra();
+   },
+ 
+-  onTableFiltered: function (event, itemsToHide) {
++  onTableFiltered: function (itemsToHide) {
+     this._updateItems();
+     if (!this.cells) {
+       return;
+     }
+     for (let cell of this.cells) {
+       cell.hidden = false;
+     }
+     for (let id of itemsToHide) {
+@@ -1213,17 +1213,17 @@ Column.prototype = {
+    * for a new row this method will be called once for each column. If a single
+    * cell is changed this method will be called just once.
+    *
+    * @param {string} event
+    *        The event name of the event. i.e. EVENTS.ROW_UPDATED
+    * @param {string} id
+    *        The unique id of the object associated with the row.
+    */
+-  onRowUpdated: function (event, id) {
++  onRowUpdated: function (id) {
+     this._updateItems();
+ 
+     if (this.highlightUpdated && this.items[id] != null) {
+       if (this.table.scrollIntoViewOnUpdate) {
+         let cell = this.cells[this.items[id]];
+ 
+         // When a new row is created this method is called once for each column
+         // as each cell is updated. We can only scroll to cells if they are
+@@ -1372,17 +1372,17 @@ Column.prototype = {
+    *
+    * @param {string} event
+    *        The name of the event. i.e. EVENTS.HEADER_CONTEXT_MENU
+    * @param {string} id
+    *        Id of the column to be toggled
+    * @param {string} checked
+    *        true if the column is visible
+    */
+-  toggleColumn: function (event, id, checked) {
++  toggleColumn: function (id, checked) {
+     if (arguments.length == 0) {
+       // Act like a toggling method when called with no params
+       id = this.id;
+       checked = this.wrapper.hasAttribute("hidden");
+     }
+     if (id != this.id) {
+       return;
+     }
+diff --git a/devtools/client/shared/widgets/TreeWidget.js b/devtools/client/shared/widgets/TreeWidget.js
+--- a/devtools/client/shared/widgets/TreeWidget.js
++++ b/devtools/client/shared/widgets/TreeWidget.js
+@@ -2,17 +2,17 @@
+ /* 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 HTML_NS = "http://www.w3.org/1999/xhtml";
+ 
+-const EventEmitter = require("devtools/shared/old-event-emitter");
++const EventEmitter = require("devtools/shared/event-emitter");
+ const {KeyCodes} = require("devtools/client/shared/keycodes");
+ 
+ /**
+  * A tree widget with keyboard navigation and collapsable structure.
+  *
+  * @param {nsIDOMNode} node
+  *        The container element for the tree widget.
+  * @param {Object} options
+diff --git a/devtools/client/shared/widgets/VariablesView.jsm b/devtools/client/shared/widgets/VariablesView.jsm
+--- a/devtools/client/shared/widgets/VariablesView.jsm
++++ b/devtools/client/shared/widgets/VariablesView.jsm
+@@ -10,17 +10,17 @@ const LAZY_EMPTY_DELAY = 150; // ms
+ const SCROLL_PAGE_SIZE_DEFAULT = 0;
+ const PAGE_SIZE_SCROLL_HEIGHT_RATIO = 100;
+ const PAGE_SIZE_MAX_JUMPS = 30;
+ const SEARCH_ACTION_MAX_DELAY = 300; // ms
+ const ITEM_FLASH_DURATION = 300; // ms
+ 
+ const { require } = ChromeUtils.import("resource://devtools/shared/Loader.jsm", {});
+ const {XPCOMUtils} = require("resource://gre/modules/XPCOMUtils.jsm");
+-const EventEmitter = require("devtools/shared/old-event-emitter");
++const EventEmitter = require("devtools/shared/event-emitter");
+ const DevToolsUtils = require("devtools/shared/DevToolsUtils");
+ const Services = require("Services");
+ const { getSourceNames } = require("devtools/client/shared/source-utils");
+ const promise = require("promise");
+ const defer = require("devtools/shared/defer");
+ const { extend } = require("devtools/shared/extend");
+ const { ViewHelpers, setNamedTimeout } =
+   require("devtools/client/shared/widgets/view-helpers");
+diff --git a/devtools/client/shared/widgets/tooltip/HTMLTooltip.js b/devtools/client/shared/widgets/tooltip/HTMLTooltip.js
+--- a/devtools/client/shared/widgets/tooltip/HTMLTooltip.js
++++ b/devtools/client/shared/widgets/tooltip/HTMLTooltip.js
+@@ -1,17 +1,17 @@
+ /* -*- indent-tabs-mode: nil; 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 {TooltipToggle} = require("devtools/client/shared/widgets/tooltip/TooltipToggle");
+ const {listenOnce} = require("devtools/shared/async-utils");
+ const {Task} = require("devtools/shared/task");
+ 
+ const XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
+ const XHTML_NS = "http://www.w3.org/1999/xhtml";
+ 
+ const POSITION = {
+diff --git a/devtools/client/shared/widgets/tooltip/InlineTooltip.js b/devtools/client/shared/widgets/tooltip/InlineTooltip.js
+--- a/devtools/client/shared/widgets/tooltip/InlineTooltip.js
++++ b/devtools/client/shared/widgets/tooltip/InlineTooltip.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");
+ 
+ /**
+  * The InlineTooltip can display widgets for the CSS Rules view in an
+  * inline container.
+  *
+  * @param {Document} doc
+  *        The toolbox document to attach the InlineTooltip container.
+  */
+diff --git a/devtools/client/shared/widgets/tooltip/SwatchBasedEditorTooltip.js b/devtools/client/shared/widgets/tooltip/SwatchBasedEditorTooltip.js
+--- a/devtools/client/shared/widgets/tooltip/SwatchBasedEditorTooltip.js
++++ b/devtools/client/shared/widgets/tooltip/SwatchBasedEditorTooltip.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");
+ const KeyShortcuts = require("devtools/client/shared/key-shortcuts");
+ const {HTMLTooltip} = require("devtools/client/shared/widgets/tooltip/HTMLTooltip");
+ const InlineTooltip = require("devtools/client/shared/widgets/tooltip/InlineTooltip");
+ 
+ const INLINE_TOOLTIP_CLASS = "inline-tooltip-container";
+ 
+ /**
+  * Base class for all (color, gradient, ...)-swatch based value editors inside
+@@ -43,26 +43,26 @@ class SwatchBasedEditorTooltip {
+       });
+     }
+ 
+     // By default, swatch-based editor tooltips revert value change on <esc> and
+     // commit value change on <enter>
+     this.shortcuts = new KeyShortcuts({
+       window: this.tooltip.topWindow
+     });
+-    this.shortcuts.on("Escape", (name, event) => {
++    this.shortcuts.on("Escape", event => {
+       if (!this.tooltip.isVisible()) {
+         return;
+       }
+       this.revert();
+       this.hide();
+       event.stopPropagation();
+       event.preventDefault();
+     });
+-    this.shortcuts.on("Return", (name, event) => {
++    this.shortcuts.on("Return", event => {
+       if (!this.tooltip.isVisible()) {
+         return;
+       }
+       this.commit();
+       this.hide();
+       event.stopPropagation();
+       event.preventDefault();
+     });
+diff --git a/devtools/client/shared/widgets/tooltip/SwatchColorPickerTooltip.js b/devtools/client/shared/widgets/tooltip/SwatchColorPickerTooltip.js
+--- a/devtools/client/shared/widgets/tooltip/SwatchColorPickerTooltip.js
++++ b/devtools/client/shared/widgets/tooltip/SwatchColorPickerTooltip.js
+@@ -133,17 +133,17 @@ class SwatchColorPickerTooltip extends S
+       eyeButton.addEventListener("click", this._openEyeDropper);
+     } else {
+       eyeButton.disabled = true;
+       eyeButton.title = L10N.getStr("eyedropper.disabled.title");
+     }
+     this.emit("ready");
+   }
+ 
+-  _onSpectrumColorChange(event, rgba, cssColor) {
++  _onSpectrumColorChange(rgba, cssColor) {
+     this._selectColor(cssColor);
+   }
+ 
+   _selectColor(color) {
+     if (this.activeSwatch) {
+       this.activeSwatch.style.backgroundColor = color;
+       this.activeSwatch.parentNode.dataset.color = color;
+ 
+diff --git a/devtools/client/shared/widgets/tooltip/SwatchCubicBezierTooltip.js b/devtools/client/shared/widgets/tooltip/SwatchCubicBezierTooltip.js
+--- a/devtools/client/shared/widgets/tooltip/SwatchCubicBezierTooltip.js
++++ b/devtools/client/shared/widgets/tooltip/SwatchCubicBezierTooltip.js
+@@ -73,17 +73,17 @@ class SwatchCubicBezierTooltip extends S
+         widget.off("updated", this._onUpdate);
+         widget.cssCubicBezierValue = this.currentBezierValue.textContent;
+         widget.on("updated", this._onUpdate);
+         this.emit("ready");
+       });
+     }
+   }
+ 
+-  _onUpdate(event, bezier) {
++  _onUpdate(bezier) {
+     if (!this.activeSwatch) {
+       return;
+     }
+ 
+     this.currentBezierValue.textContent = bezier + "";
+     this.preview(bezier + "");
+   }
+ 
+diff --git a/devtools/client/shared/widgets/tooltip/SwatchFilterTooltip.js b/devtools/client/shared/widgets/tooltip/SwatchFilterTooltip.js
+--- a/devtools/client/shared/widgets/tooltip/SwatchFilterTooltip.js
++++ b/devtools/client/shared/widgets/tooltip/SwatchFilterTooltip.js
+@@ -61,17 +61,17 @@ class SwatchFilterTooltip extends Swatch
+       this.widget.off("updated", this._onUpdate);
+       this.widget.on("updated", this._onUpdate);
+       this.widget.setCssValue(this.currentFilterValue.textContent);
+       this.widget.render();
+       this.emit("ready");
+     }
+   }
+ 
+-  _onUpdate(event, filters) {
++  _onUpdate(filters) {
+     if (!this.activeSwatch) {
+       return;
+     }
+ 
+     // Remove the old children and reparse the property value to
+     // recompute them.
+     while (this.currentFilterValue.firstChild) {
+       this.currentFilterValue.firstChild.remove();
+diff --git a/devtools/client/shared/widgets/tooltip/Tooltip.js b/devtools/client/shared/widgets/tooltip/Tooltip.js
+--- a/devtools/client/shared/widgets/tooltip/Tooltip.js
++++ b/devtools/client/shared/widgets/tooltip/Tooltip.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 defer = require("devtools/shared/defer");
+-const EventEmitter = require("devtools/shared/old-event-emitter");
++const EventEmitter = require("devtools/shared/event-emitter");
+ const {KeyCodes} = require("devtools/client/shared/keycodes");
+ const {TooltipToggle} = require("devtools/client/shared/widgets/tooltip/TooltipToggle");
+ 
+ const XHTML_NS = "http://www.w3.org/1999/xhtml";
+ const ESCAPE_KEYCODE = KeyCodes.DOM_VK_ESCAPE;
+ const POPUP_EVENTS = ["shown", "hidden", "showing", "hiding"];
+ 
+ /**
+diff --git a/devtools/client/shared/widgets/view-helpers.js b/devtools/client/shared/widgets/view-helpers.js
+--- a/devtools/client/shared/widgets/view-helpers.js
++++ b/devtools/client/shared/widgets/view-helpers.js
+@@ -1488,17 +1488,17 @@ const WidgetMethods = exports.WidgetMeth
+     this._itemsByElement.delete(item._target);
+   },
+ 
+   /**
+    * The keyDown event listener for this container.
+    * @param string name
+    * @param KeyboardEvent event
+    */
+-  _onWidgetKeyDown: function (name, event) {
++  _onWidgetKeyDown: function (event) {
+     // Prevent scrolling when pressing navigation keys.
+     ViewHelpers.preventScrolling(event);
+ 
+     switch (event.keyCode) {
+       case KeyCodes.DOM_VK_UP:
+       case KeyCodes.DOM_VK_LEFT:
+         this.focusPrevItem();
+         break;
+@@ -1523,17 +1523,17 @@ const WidgetMethods = exports.WidgetMeth
+     }
+   },
+ 
+   /**
+    * The mousePress event listener for this container.
+    * @param string name
+    * @param MouseEvent event
+    */
+-  _onWidgetMousePress: function (name, event) {
++  _onWidgetMousePress: function (event) {
+     if (event.button != 0 && !this.allowFocusOnRightClick) {
+       // Only allow left-click to trigger this event.
+       return;
+     }
+ 
+     let item = this.getItemForElement(event.target);
+     if (item) {
+       // The container is not empty and we clicked on an actual item.
+diff --git a/devtools/client/shared/zoom-keys.js b/devtools/client/shared/zoom-keys.js
+--- a/devtools/client/shared/zoom-keys.js
++++ b/devtools/client/shared/zoom-keys.js
+@@ -26,27 +26,27 @@ exports.register = function (window) {
+   let shortcuts = new KeyShortcuts({
+     window
+   });
+   let docShell = window.QueryInterface(Ci.nsIInterfaceRequestor)
+     .getInterface(Ci.nsIWebNavigation)
+     .QueryInterface(Ci.nsIDocShell);
+   let contViewer = docShell.contentViewer;
+   let zoomValue = parseFloat(Services.prefs.getCharPref(ZOOM_PREF));
+-  let zoomIn = function (name, event) {
++  let zoomIn = function (event) {
+     setZoom(zoomValue + 0.1);
+     event.preventDefault();
+   };
+ 
+-  let zoomOut = function (name, event) {
++  let zoomOut = function (event) {
+     setZoom(zoomValue - 0.1);
+     event.preventDefault();
+   };
+ 
+-  let zoomReset = function (name, event) {
++  let zoomReset = function (event) {
+     setZoom(1);
+     event.preventDefault();
+   };
+ 
+   let setZoom = function (newValue) {
+     // cap zoom value
+     zoomValue = Math.max(newValue, MIN_ZOOM);
+     zoomValue = Math.min(zoomValue, MAX_ZOOM);
+diff --git a/devtools/client/sourceeditor/editor.js b/devtools/client/sourceeditor/editor.js
+--- a/devtools/client/sourceeditor/editor.js
++++ b/devtools/client/sourceeditor/editor.js
+@@ -1360,17 +1360,17 @@ Editor.prototype = {
+     if (OS === "Darwin") {
+       keys.push("replaceAllMac.key");
+     } else {
+       keys.push("replaceAll.key");
+     }
+     // Process generic keys:
+     keys.forEach(name => {
+       let key = L10N.getStr(name);
+-      shortcuts.on(key, (_, event) => this._onShortcut(name, event));
++      shortcuts.on(key, event => this._onShortcut(name, event));
+     });
+   },
+     /**
+    * Key shortcut listener.
+    */
+   _onShortcut: function (name, event) {
+     if (!this._isInputOrTextarea(event.target)) {
+       return;
+diff --git a/devtools/client/storage/ui.js b/devtools/client/storage/ui.js
+--- a/devtools/client/storage/ui.js
++++ b/devtools/client/storage/ui.js
+@@ -130,17 +130,17 @@ function StorageUI(front, target, panelW
+   this.filterItems = this.filterItems.bind(this);
+   this.onPaneToggleButtonClicked = this.onPaneToggleButtonClicked.bind(this);
+   this.setupToolbar();
+ 
+   let shortcuts = new KeyShortcuts({
+     window: this._panelDoc.defaultView,
+   });
+   let key = L10N.getStr("storage.filter.key");
+-  shortcuts.on(key, (name, event) => {
++  shortcuts.on(key, event => {
+     event.preventDefault();
+     this.searchBox.focus();
+   });
+ 
+   this.front.listStores().then(storageTypes => {
+     this.populateStorageTree(storageTypes);
+   }).catch(e => {
+     if (!this._toolbox || this._toolbox._destroyer) {
+@@ -322,17 +322,17 @@ StorageUI.prototype = {
+   makeFieldsEditable: function* (editableFields) {
+     if (editableFields && editableFields.length > 0) {
+       this.table.makeFieldsEditable(editableFields);
+     } else if (this.table._editableFieldsEngine) {
+       this.table._editableFieldsEngine.destroy();
+     }
+   },
+ 
+-  editItem: function (eventType, data) {
++  editItem: function (data) {
+     let front = this.getCurrentFront();
+ 
+     front.editItem(data);
+   },
+ 
+   /**
+    * Removes the given item from the storage table. Reselects the next item in
+    * the table and repopulates the sidebar with that item's data if the item
+@@ -874,17 +874,17 @@ StorageUI.prototype = {
+    * from the storage details and populates the storage tree.
+    *
+    * @param {string} event
+    *        The name of the event fired
+    * @param {array} item
+    *        An array of ids which represent the location of the selected item in
+    *        the storage tree
+    */
+-  onHostSelect: function (event, item) {
++  onHostSelect: function (item) {
+     this.table.clear();
+     this.hideSidebar();
+     this.searchBox.value = "";
+ 
+     let [type, host] = item;
+     this.table.host = host;
+     this.table.datatype = type;
+ 
+@@ -1174,18 +1174,18 @@ StorageUI.prototype = {
+     if (!showMenu) {
+       event.preventDefault();
+     }
+   },
+ 
+   /**
+    * Handles refreshing the selected storage
+    */
+-  onRefreshTable: function (event) {
+-    this.onHostSelect(event, this.tree.selectedItem);
++  onRefreshTable: function () {
++    this.onHostSelect(this.tree.selectedItem);
+   },
+ 
+   /**
+    * Handles adding an item from the storage
+    */
+   onAddItem: function () {
+     let front = this.getCurrentFront();
+     let [, host] = this.tree.selectedItem;
+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
+@@ -768,17 +768,17 @@ JSTerm.prototype = {
+         this.hud._releaseObject(actor);
+       },
+       simpleValueEvalMacro: simpleValueEvalMacro,
+       overrideValueEvalMacro: overrideValueEvalMacro,
+       getterOrSetterEvalMacro: getterOrSetterEvalMacro,
+     });
+ 
+     // Relay events from the VariablesView.
+-    view.on("fetched", (event, type, variableObject) => {
++    view.on("fetched", (type, variableObject) => {
+       this.emit("variablesview-fetched", variableObject);
+     });
+ 
+     return view;
+   },
+ 
+   /**
+    * Update the variables view.
+diff --git a/devtools/client/webconsole/new-webconsole.js b/devtools/client/webconsole/new-webconsole.js
+--- a/devtools/client/webconsole/new-webconsole.js
++++ b/devtools/client/webconsole/new-webconsole.js
+@@ -229,17 +229,17 @@ NewWebConsoleFrame.prototype = {
+   },
+ 
+   _initShortcuts: function () {
+     let shortcuts = new KeyShortcuts({
+       window: this.window
+     });
+ 
+     shortcuts.on(l10n.getStr("webconsole.find.key"),
+-                 (name, event) => {
++                 event => {
+                    this.filterBox.focus();
+                    event.preventDefault();
+                  });
+ 
+     let clearShortcut;
+     if (system.constants.platform === "macosx") {
+       clearShortcut = l10n.getStr("webconsole.clear.keyOSX");
+     } else {
+@@ -249,17 +249,17 @@ NewWebConsoleFrame.prototype = {
+     shortcuts.on(clearShortcut, () => this.jsterm.clearOutput(true));
+ 
+     if (this.isBrowserConsole) {
+       shortcuts.on(l10n.getStr("webconsole.close.key"),
+                    this.window.top.close.bind(this.window.top));
+ 
+       ZoomKeys.register(this.window);
+     } else if (Services.prefs.getBoolPref(PREF_SIDEBAR_ENABLED)) {
+-      shortcuts.on("Esc", (name, event) => {
++      shortcuts.on("Esc", event => {
+         if (!this.jsterm.autocompletePopup || !this.jsterm.autocompletePopup.isOpen) {
+           this.newConsoleOutput.dispatchSidebarClose();
+         }
+       });
+     }
+   },
+   /**
+    * Handler for page location changes.
+diff --git a/devtools/client/webconsole/webconsole.js b/devtools/client/webconsole/webconsole.js
+--- a/devtools/client/webconsole/webconsole.js
++++ b/devtools/client/webconsole/webconsole.js
+@@ -631,17 +631,17 @@ WebConsoleFrame.prototype = {
+   },
+ 
+   _initShortcuts: function() {
+     var shortcuts = new KeyShortcuts({
+       window: this.window
+     });
+ 
+     shortcuts.on(l10n.getStr("webconsole.find.key"),
+-                 (name, event) => {
++                 event => {
+                    this.filterBox.focus();
+                    event.preventDefault();
+                  });
+ 
+     let clearShortcut;
+     if (system.constants.platform === "macosx") {
+       clearShortcut = l10n.getStr("webconsole.clear.keyOSX");
+     } else {

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

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

+ 893 - 0
frg/work-js/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
frg/work-js/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
frg/work-js/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
frg/work-js/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
frg/work-js/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;

+ 58 - 0
frg/work-js/mozilla-release/patches/1387827-58a1.patch

@@ -0,0 +1,58 @@
+# HG changeset patch
+# User Joel Maher <jmaher@mozilla.com>
+# Date 1508168543 14400
+# Node ID f7bf0e6554570b40e6ce701f1f3f3ef0941fa802
+# Parent  9747bb368b54187196fc58dc8df9b9aa451149e4
+Bug 1387827 - Disable 2 devtools tests on coverage builds for frequent timeouts. r=gbrown, a=test-only
+
+diff --git a/devtools/client/aboutdebugging/test/browser.ini b/devtools/client/aboutdebugging/test/browser.ini
+--- a/devtools/client/aboutdebugging/test/browser.ini
++++ b/devtools/client/aboutdebugging/test/browser.ini
+@@ -17,24 +17,26 @@ support-files =
+   service-workers/empty-sw.js
+   service-workers/fetch-sw.html
+   service-workers/fetch-sw.js
+   service-workers/push-sw.html
+   service-workers/push-sw.js
+   !/devtools/client/shared/test/shared-head.js
+ 
+ [browser_addons_debug_bootstrapped.js]
++skip-if = coverage # Bug 1387827
+ [browser_addons_debug_info.js]
+ [browser_addons_debug_webextension.js]
+ tags = webextensions
+ [browser_addons_debug_webextension_inspector.js]
+ tags = webextensions
+ [browser_addons_debug_webextension_nobg.js]
+ tags = webextensions
+ [browser_addons_debug_webextension_popup.js]
++skip-if = coverage # Bug 1387827
+ tags = webextensions
+ [browser_addons_debugging_initial_state.js]
+ [browser_addons_install.js]
+ [browser_addons_reload.js]
+ [browser_addons_remove.js]
+ [browser_addons_toggle_debug.js]
+ [browser_page_not_found.js]
+ [browser_service_workers.js]
+diff --git a/devtools/client/framework/test/browser.ini b/devtools/client/framework/test/browser.ini
+--- a/devtools/client/framework/test/browser.ini
++++ b/devtools/client/framework/test/browser.ini
+@@ -44,16 +44,17 @@ support-files =
+   sjs_code_bundle_reload_map.sjs
+   test_browser_toolbox_debugger.js
+   !/devtools/client/debugger/new/test/mochitest/head.js
+   !/devtools/client/shared/test/frame-script-utils.js
+   !/devtools/client/shared/test/shared-head.js
+   !/devtools/client/shared/test/shared-redux-head.js
+ 
+ [browser_browser_toolbox.js]
++skip-if = coverage # Bug 1387827
+ [browser_browser_toolbox_debugger.js]
+ skip-if = true # Bug 1282269
+ [browser_devtools_api.js]
+ [browser_devtools_api_destroy.js]
+ [browser_devtools_shim.js]
+ [browser_dynamic_tool_enabling.js]
+ skip-if = (os == 'win' && debug) # Bug 1282269
+ [browser_ignore_toolbox_network_requests.js]

+ 1179 - 0
frg/work-js/mozilla-release/patches/1393464-59a1.patch

@@ -0,0 +1,1179 @@
+# HG changeset patch
+# User Vincent Lequertier <vi.le@autistici.org>
+# Date 1515088492 -3600
+# Node ID 12e30ac0c41c2d4cc26f683360318f9ebfb07e69
+# Parent  b385afa1049df2fa12643bb3d1e1a60a1a58c1ba
+Bug 1393464 - Remove `Heritage` from devtools helper view-helpers.js; r=pbro
+
+Calling "devtools/shared/extend" instead.
+
+MozReview-Commit-ID: HbonI7vq8Be
+
+diff --git a/devtools/client/canvasdebugger/callslist.js b/devtools/client/canvasdebugger/callslist.js
+--- a/devtools/client/canvasdebugger/callslist.js
++++ b/devtools/client/canvasdebugger/callslist.js
+@@ -4,17 +4,17 @@
+ /* import-globals-from canvasdebugger.js */
+ /* globals window, document */
+ "use strict";
+ 
+ /**
+  * Functions handling details about a single recorded animation frame snapshot
+  * (the calls list, rendering preview, thumbnails filmstrip etc.).
+  */
+-var CallsListView = Heritage.extend(WidgetMethods, {
++var CallsListView = extend(WidgetMethods, {
+   /**
+    * Initialization function, called when the tool is started.
+    */
+   initialize: function () {
+     this.widget = new SideMenuWidget($("#calls-list"));
+     this._slider = $("#calls-slider");
+     this._searchbox = $("#calls-searchbox");
+     this._filmstrip = $("#snapshot-filmstrip");
+diff --git a/devtools/client/canvasdebugger/canvasdebugger.js b/devtools/client/canvasdebugger/canvasdebugger.js
+--- a/devtools/client/canvasdebugger/canvasdebugger.js
++++ b/devtools/client/canvasdebugger/canvasdebugger.js
+@@ -7,20 +7,21 @@ const { require } = ChromeUtils.import("
+ const { XPCOMUtils } = require("resource://gre/modules/XPCOMUtils.jsm");
+ const { SideMenuWidget } = require("resource://devtools/client/shared/widgets/SideMenuWidget.jsm");
+ const promise = require("promise");
+ const Services = require("Services");
+ const EventEmitter = require("devtools/shared/old-event-emitter");
+ const { CallWatcherFront } = require("devtools/shared/fronts/call-watcher");
+ const { CanvasFront } = require("devtools/shared/fronts/canvas");
+ const DevToolsUtils = require("devtools/shared/DevToolsUtils");
++const { extend } = require("devtools/shared/extend");
+ const flags = require("devtools/shared/flags");
+ const { LocalizationHelper } = require("devtools/shared/l10n");
+ const { PluralForm } = require("devtools/shared/plural-form");
+-const { Heritage, WidgetMethods, setNamedTimeout, clearNamedTimeout,
++const { WidgetMethods, setNamedTimeout, clearNamedTimeout,
+         setConditionalTimeout } = require("devtools/client/shared/widgets/view-helpers");
+ 
+ // Use privileged promise in panel documents to prevent having them to freeze
+ // during toolbox destruction. See bug 1402779.
+ const Promise = require("Promise");
+ 
+ const CANVAS_ACTOR_RECORDING_ATTEMPT = flags.testing ? 500 : 5000;
+ 
+diff --git a/devtools/client/canvasdebugger/snapshotslist.js b/devtools/client/canvasdebugger/snapshotslist.js
+--- a/devtools/client/canvasdebugger/snapshotslist.js
++++ b/devtools/client/canvasdebugger/snapshotslist.js
+@@ -3,17 +3,17 @@
+  * You can obtain one at http://mozilla.org/MPL/2.0/. */
+ /* import-globals-from canvasdebugger.js */
+ /* globals window, document */
+ "use strict";
+ 
+ /**
+  * Functions handling the recorded animation frame snapshots UI.
+  */
+-var SnapshotsListView = Heritage.extend(WidgetMethods, {
++var SnapshotsListView = extend(WidgetMethods, {
+   /**
+    * Initialization function, called when the tool is started.
+    */
+   initialize: function () {
+     this.widget = new SideMenuWidget($("#snapshots-list"), {
+       showArrows: true
+     });
+ 
+diff --git a/devtools/client/debugger/content/views/event-listeners-view.js b/devtools/client/debugger/content/views/event-listeners-view.js
+--- a/devtools/client/debugger/content/views/event-listeners-view.js
++++ b/devtools/client/debugger/content/views/event-listeners-view.js
+@@ -3,17 +3,18 @@
+  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+ 
+ "use strict";
+ 
+ /* import-globals-from ../../debugger-controller.js */
+ 
+ const actions = require("../actions/event-listeners");
+ const { bindActionCreators } = require("devtools/client/shared/vendor/redux");
+-const { Heritage, WidgetMethods } = require("devtools/client/shared/widgets/view-helpers");
++const { extend } = require("devtools/shared/extend");
++const { WidgetMethods } = require("devtools/client/shared/widgets/view-helpers");
+ const { SideMenuWidget } = require("resource://devtools/client/shared/widgets/SideMenuWidget.jsm");
+ 
+ /**
+  * Functions handling the event listeners UI.
+  */
+ function EventListenersView(controller) {
+   dumpn("EventListenersView was instantiated");
+ 
+@@ -21,17 +22,17 @@ function EventListenersView(controller) 
+   this.getState = () => controller.getState().eventListeners;
+ 
+   this._onCheck = this._onCheck.bind(this);
+   this._onClick = this._onClick.bind(this);
+ 
+   controller.onChange("event-listeners", this.renderListeners.bind(this));
+ }
+ 
+-EventListenersView.prototype = Heritage.extend(WidgetMethods, {
++EventListenersView.prototype = extend(WidgetMethods, {
+   /**
+    * Initialization function, called when the debugger is started.
+    */
+   initialize: function () {
+     dumpn("Initializing the EventListenersView");
+ 
+     this.widget = new SideMenuWidget(document.getElementById("event-listeners"), {
+       showItemCheckboxes: true,
+diff --git a/devtools/client/debugger/content/views/sources-view.js b/devtools/client/debugger/content/views/sources-view.js
+--- a/devtools/client/debugger/content/views/sources-view.js
++++ b/devtools/client/debugger/content/views/sources-view.js
+@@ -15,18 +15,18 @@ const {
+   makeLocationId
+ } = require("../queries");
+ const actions = Object.assign(
+   {},
+   require("../actions/sources"),
+   require("../actions/breakpoints")
+ );
+ const { bindActionCreators } = require("devtools/client/shared/vendor/redux");
++const { extend } = require("devtools/shared/extend");
+ const {
+-  Heritage,
+   WidgetMethods,
+   setNamedTimeout
+ } = require("devtools/client/shared/widgets/view-helpers");
+ const { Task } = require("devtools/shared/task");
+ const { SideMenuWidget } = require("resource://devtools/client/shared/widgets/SideMenuWidget.jsm");
+ const { gDevTools } = require("devtools/client/framework/devtools");
+ const {KeyCodes} = require("devtools/client/shared/keycodes");
+ 
+@@ -75,17 +75,17 @@ function SourcesView(controller, Debugge
+   this._onConditionalPopupHiding = this._onConditionalPopupHiding.bind(this);
+   this._onConditionalTextboxKeyPress = this._onConditionalTextboxKeyPress.bind(this);
+   this._onEditorContextMenuOpen = this._onEditorContextMenuOpen.bind(this);
+   this._onCopyUrlCommand = this._onCopyUrlCommand.bind(this);
+   this._onNewTabCommand = this._onNewTabCommand.bind(this);
+   this._onConditionalPopupHidden = this._onConditionalPopupHidden.bind(this);
+ }
+ 
+-SourcesView.prototype = Heritage.extend(WidgetMethods, {
++SourcesView.prototype = extend(WidgetMethods, {
+   /**
+    * Initialization function, called when the debugger is started.
+    */
+   initialize: function (isWorker) {
+     dumpn("Initializing the SourcesView");
+ 
+     this.widget = new SideMenuWidget(document.getElementById("sources"), {
+       contextMenu: document.getElementById("debuggerSourcesContextMenu"),
+@@ -345,23 +345,23 @@ SourcesView.prototype = Heritage.extend(
+ 
+     // Get the source item to which the breakpoint should be attached.
+     let sourceItem = this.getItemByValue(location.actor);
+     if (!sourceItem) {
+       return;
+     }
+ 
+     // Create the element node and menu popup for the breakpoint item.
+-    let breakpointArgs = Heritage.extend(breakpoint.asMutable(), options);
++    let breakpointArgs = extend(breakpoint.asMutable(), options);
+     let breakpointView = this._createBreakpointView.call(this, breakpointArgs);
+     let contextMenu = this._createContextMenu.call(this, breakpointArgs);
+ 
+     // Append a breakpoint child item to the corresponding source item.
+     sourceItem.append(breakpointView.container, {
+-      attachment: Heritage.extend(breakpointArgs, {
++      attachment: extend(breakpointArgs, {
+         actor: location.actor,
+         line: location.line,
+         view: breakpointView,
+         popup: contextMenu
+       }),
+       attributes: [
+         ["contextmenu", contextMenu.menupopupId]
+       ],
+diff --git a/devtools/client/debugger/debugger-controller.js b/devtools/client/debugger/debugger-controller.js
+--- a/devtools/client/debugger/debugger-controller.js
++++ b/devtools/client/debugger/debugger-controller.js
+@@ -102,18 +102,19 @@ const { require } = BrowserLoader({
+ const { XPCOMUtils } = require("resource://gre/modules/XPCOMUtils.jsm");
+ XPCOMUtils.defineConstant(this, "require", require);
+ const { SimpleListWidget } = require("resource://devtools/client/shared/widgets/SimpleListWidget.jsm");
+ const { BreadcrumbsWidget } = require("resource://devtools/client/shared/widgets/BreadcrumbsWidget.jsm");
+ const { SideMenuWidget } = require("resource://devtools/client/shared/widgets/SideMenuWidget.jsm");
+ const { VariablesView } = require("resource://devtools/client/shared/widgets/VariablesView.jsm");
+ const { VariablesViewController, StackFrameUtils } = require("resource://devtools/client/shared/widgets/VariablesViewController.jsm");
+ const EventEmitter = require("devtools/shared/old-event-emitter");
++const { extend } = require("devtools/shared/extend");
+ const { gDevTools } = require("devtools/client/framework/devtools");
+-const { ViewHelpers, Heritage, WidgetMethods, setNamedTimeout,
++const { ViewHelpers, WidgetMethods, setNamedTimeout,
+         clearNamedTimeout } = require("devtools/client/shared/widgets/view-helpers");
+ 
+ // Use privileged promise in panel documents to prevent having them to freeze
+ // during toolbox destruction. See bug 1402779.
+ const Promise = require("Promise");
+ 
+ // React
+ const React = require("devtools/client/shared/vendor/react");
+diff --git a/devtools/client/debugger/debugger-view.js b/devtools/client/debugger/debugger-view.js
+--- a/devtools/client/debugger/debugger-view.js
++++ b/devtools/client/debugger/debugger-view.js
+@@ -841,17 +841,17 @@ var DebuggerView = {
+ 
+ /**
+  * A custom items container, used for displaying views like the
+  * FilteredSources, FilteredFunctions etc., inheriting the generic WidgetMethods.
+  */
+ function ResultsPanelContainer() {
+ }
+ 
+-ResultsPanelContainer.prototype = Heritage.extend(WidgetMethods, {
++ResultsPanelContainer.prototype = extend(WidgetMethods, {
+   /**
+    * Sets the anchor node for this container panel.
+    * @param nsIDOMNode aNode
+    */
+   set anchor(aNode) {
+     this._anchor = aNode;
+ 
+     // If the anchor node is not null, create a panel to attach to the anchor
+diff --git a/devtools/client/debugger/views/filter-view.js b/devtools/client/debugger/views/filter-view.js
+--- a/devtools/client/debugger/views/filter-view.js
++++ b/devtools/client/debugger/views/filter-view.js
+@@ -546,17 +546,17 @@ function FilteredSourcesView(DebuggerVie
+   dumpn("FilteredSourcesView was instantiated");
+ 
+   this.DebuggerView = DebuggerView;
+ 
+   this._onClick = this._onClick.bind(this);
+   this._onSelect = this._onSelect.bind(this);
+ }
+ 
+-FilteredSourcesView.prototype = Heritage.extend(ResultsPanelContainer.prototype, {
++FilteredSourcesView.prototype = extend(ResultsPanelContainer.prototype, {
+   /**
+    * Initialization function, called when the debugger is started.
+    */
+   initialize: function () {
+     dumpn("Initializing the FilteredSourcesView");
+ 
+     this.anchor = document.getElementById("searchbox");
+     this.widget.addEventListener("select", this._onSelect);
+@@ -709,17 +709,17 @@ function FilteredFunctionsView(SourceScr
+   this.SourceScripts = SourceScripts;
+   this.Parser = Parser;
+   this.DebuggerView = DebuggerView;
+ 
+   this._onClick = this._onClick.bind(this);
+   this._onSelect = this._onSelect.bind(this);
+ }
+ 
+-FilteredFunctionsView.prototype = Heritage.extend(ResultsPanelContainer.prototype, {
++FilteredFunctionsView.prototype = extend(ResultsPanelContainer.prototype, {
+   /**
+    * Initialization function, called when the debugger is started.
+    */
+   initialize: function () {
+     dumpn("Initializing the FilteredFunctionsView");
+ 
+     this.anchor = document.getElementById("searchbox");
+     this.widget.addEventListener("select", this._onSelect);
+diff --git a/devtools/client/debugger/views/global-search-view.js b/devtools/client/debugger/views/global-search-view.js
+--- a/devtools/client/debugger/views/global-search-view.js
++++ b/devtools/client/debugger/views/global-search-view.js
+@@ -18,17 +18,17 @@ function GlobalSearchView(DebuggerContro
+   this.SourceScripts = DebuggerController.SourceScripts;
+   this.DebuggerView = DebuggerView;
+ 
+   this._onHeaderClick = this._onHeaderClick.bind(this);
+   this._onLineClick = this._onLineClick.bind(this);
+   this._onMatchClick = this._onMatchClick.bind(this);
+ }
+ 
+-GlobalSearchView.prototype = Heritage.extend(WidgetMethods, {
++GlobalSearchView.prototype = extend(WidgetMethods, {
+   /**
+    * Initialization function, called when the debugger is started.
+    */
+   initialize: function () {
+     dumpn("Initializing the GlobalSearchView");
+ 
+     this.widget = new SimpleListWidget(document.getElementById("globalsearch"));
+     this._splitter = document.querySelector("#globalsearch + .devtools-horizontal-splitter");
+diff --git a/devtools/client/debugger/views/stack-frames-classic-view.js b/devtools/client/debugger/views/stack-frames-classic-view.js
+--- a/devtools/client/debugger/views/stack-frames-classic-view.js
++++ b/devtools/client/debugger/views/stack-frames-classic-view.js
+@@ -15,17 +15,17 @@
+  */
+ function StackFramesClassicListView(DebuggerController, DebuggerView) {
+   dumpn("StackFramesClassicListView was instantiated");
+ 
+   this.DebuggerView = DebuggerView;
+   this._onSelect = this._onSelect.bind(this);
+ }
+ 
+-StackFramesClassicListView.prototype = Heritage.extend(WidgetMethods, {
++StackFramesClassicListView.prototype = extend(WidgetMethods, {
+   /**
+    * Initialization function, called when the debugger is started.
+    */
+   initialize: function () {
+     dumpn("Initializing the StackFramesClassicListView");
+ 
+     this.widget = new SideMenuWidget(document.getElementById("callstack-list"));
+     this.widget.addEventListener("select", this._onSelect);
+diff --git a/devtools/client/debugger/views/stack-frames-view.js b/devtools/client/debugger/views/stack-frames-view.js
+--- a/devtools/client/debugger/views/stack-frames-view.js
++++ b/devtools/client/debugger/views/stack-frames-view.js
+@@ -20,17 +20,17 @@ function StackFramesView(DebuggerControl
+ 
+   this._onStackframeRemoved = this._onStackframeRemoved.bind(this);
+   this._onSelect = this._onSelect.bind(this);
+   this._onScroll = this._onScroll.bind(this);
+   this._afterScroll = this._afterScroll.bind(this);
+   this._getStackAsString = this._getStackAsString.bind(this);
+ }
+ 
+-StackFramesView.prototype = Heritage.extend(WidgetMethods, {
++StackFramesView.prototype = extend(WidgetMethods, {
+   /**
+    * Initialization function, called when the debugger is started.
+    */
+   initialize: function () {
+     dumpn("Initializing the StackFramesView");
+ 
+     this._popupset = document.getElementById("debuggerPopupset");
+ 
+diff --git a/devtools/client/debugger/views/watch-expressions-view.js b/devtools/client/debugger/views/watch-expressions-view.js
+--- a/devtools/client/debugger/views/watch-expressions-view.js
++++ b/devtools/client/debugger/views/watch-expressions-view.js
+@@ -24,17 +24,17 @@ function WatchExpressionsView(DebuggerCo
+   this.deleteExpression = this.deleteExpression.bind(this);
+   this._createItemView = this._createItemView.bind(this);
+   this._onClick = this._onClick.bind(this);
+   this._onClose = this._onClose.bind(this);
+   this._onBlur = this._onBlur.bind(this);
+   this._onKeyPress = this._onKeyPress.bind(this);
+ }
+ 
+-WatchExpressionsView.prototype = Heritage.extend(WidgetMethods, {
++WatchExpressionsView.prototype = extend(WidgetMethods, {
+   /**
+    * Initialization function, called when the debugger is started.
+    */
+   initialize: function () {
+     dumpn("Initializing the WatchExpressionsView");
+ 
+     this.widget = new SimpleListWidget(document.getElementById("expressions"));
+     this.widget.setAttribute("context", "debuggerWatchExpressionsContextMenu");
+diff --git a/devtools/client/debugger/views/workers-view.js b/devtools/client/debugger/views/workers-view.js
+--- a/devtools/client/debugger/views/workers-view.js
++++ b/devtools/client/debugger/views/workers-view.js
+@@ -8,17 +8,17 @@
+ /* import-globals-from ../utils.js */
+ /* globals document */
+ "use strict";
+ 
+ function WorkersView() {
+   this._onWorkerSelect = this._onWorkerSelect.bind(this);
+ }
+ 
+-WorkersView.prototype = Heritage.extend(WidgetMethods, {
++WorkersView.prototype = extend(WidgetMethods, {
+   initialize: function () {
+     if (!Prefs.workersEnabled) {
+       return;
+     }
+ 
+     document.getElementById("workers-pane").removeAttribute("hidden");
+     document.getElementById("workers-splitter").removeAttribute("hidden");
+ 
+diff --git a/devtools/client/performance/modules/widgets/graphs.js b/devtools/client/performance/modules/widgets/graphs.js
+--- a/devtools/client/performance/modules/widgets/graphs.js
++++ b/devtools/client/performance/modules/widgets/graphs.js
+@@ -3,17 +3,17 @@
+  * You can obtain one at http://mozilla.org/MPL/2.0/. */
+ "use strict";
+ 
+ /**
+  * This file contains the base line graph that all Performance line graphs use.
+  */
+ 
+ const { Task } = require("devtools/shared/task");
+-const { Heritage } = require("devtools/client/shared/widgets/view-helpers");
++const { extend } = require("devtools/shared/extend");
+ const LineGraphWidget = require("devtools/client/shared/widgets/LineGraphWidget");
+ const MountainGraphWidget = require("devtools/client/shared/widgets/MountainGraphWidget");
+ const { CanvasGraphUtils } = require("devtools/client/shared/widgets/Graphs");
+ 
+ const defer = require("devtools/shared/defer");
+ const EventEmitter = require("devtools/shared/old-event-emitter");
+ 
+ const { colorUtils } = require("devtools/shared/css/color");
+@@ -54,17 +54,17 @@ const OPTIMIZATIONS_GRAPH_RESOLUTION = 1
+  * @param string metric
+  *        The unit of measurement for this graph.
+  */
+ function PerformanceGraph(parent, metric) {
+   LineGraphWidget.call(this, parent, { metric });
+   this.setTheme();
+ }
+ 
+-PerformanceGraph.prototype = Heritage.extend(LineGraphWidget.prototype, {
++PerformanceGraph.prototype = extend(LineGraphWidget.prototype, {
+   strokeWidth: STROKE_WIDTH,
+   dampenValuesFactor: DAMPEN_VALUES,
+   fixedHeight: HEIGHT,
+   clipheadLineColor: CLIPHEAD_LINE_COLOR,
+   selectionLineColor: SELECTION_LINE_COLOR,
+   withTooltipArrows: false,
+   withFixedTooltipPositions: true,
+ 
+@@ -103,17 +103,17 @@ PerformanceGraph.prototype = Heritage.ex
+  *
+  * @param nsIDOMNode parent
+  *        The parent node holding the overview.
+  */
+ function FramerateGraph(parent) {
+   PerformanceGraph.call(this, parent, ProfilerGlobal.L10N.getStr("graphs.fps"));
+ }
+ 
+-FramerateGraph.prototype = Heritage.extend(PerformanceGraph.prototype, {
++FramerateGraph.prototype = extend(PerformanceGraph.prototype, {
+   mainColor: FRAMERATE_GRAPH_COLOR_NAME,
+   setPerformanceData: function ({ duration, ticks }, resolution) {
+     this.dataDuration = duration;
+     return this.setDataFromTimestamps(ticks, resolution, duration);
+   }
+ });
+ 
+ /**
+@@ -121,29 +121,29 @@ FramerateGraph.prototype = Heritage.exte
+  *
+  * @param nsIDOMNode parent
+  *        The parent node holding the overview.
+  */
+ function MemoryGraph(parent) {
+   PerformanceGraph.call(this, parent, ProfilerGlobal.L10N.getStr("graphs.memory"));
+ }
+ 
+-MemoryGraph.prototype = Heritage.extend(PerformanceGraph.prototype, {
++MemoryGraph.prototype = extend(PerformanceGraph.prototype, {
+   mainColor: MEMORY_GRAPH_COLOR_NAME,
+   setPerformanceData: function ({ duration, memory }) {
+     this.dataDuration = duration;
+     return this.setData(memory);
+   }
+ });
+ 
+ function TimelineGraph(parent, filter) {
+   MarkersOverview.call(this, parent, filter);
+ }
+ 
+-TimelineGraph.prototype = Heritage.extend(MarkersOverview.prototype, {
++TimelineGraph.prototype = extend(MarkersOverview.prototype, {
+   headerHeight: MARKERS_GRAPH_HEADER_HEIGHT,
+   rowHeight: MARKERS_GRAPH_ROW_HEIGHT,
+   groupPadding: MARKERS_GROUP_VERTICAL_PADDING,
+   setPerformanceData: MarkersOverview.prototype.setData
+ });
+ 
+ /**
+  * Definitions file for GraphsController, indicating the constructor,
+@@ -434,17 +434,17 @@ GraphsController.prototype = {
+  * @param string metric
+  *        The unit of measurement for this graph.
+  */
+ function OptimizationsGraph(parent) {
+   MountainGraphWidget.call(this, parent);
+   this.setTheme();
+ }
+ 
+-OptimizationsGraph.prototype = Heritage.extend(MountainGraphWidget.prototype, {
++OptimizationsGraph.prototype = extend(MountainGraphWidget.prototype, {
+ 
+   render: Task.async(function* (threadNode, frameNode) {
+     // Regardless if we draw or clear the graph, wait
+     // until it's ready.
+     yield this.ready();
+ 
+     if (!threadNode || !frameNode) {
+       this.setData([]);
+diff --git a/devtools/client/performance/modules/widgets/markers-overview.js b/devtools/client/performance/modules/widgets/markers-overview.js
+--- a/devtools/client/performance/modules/widgets/markers-overview.js
++++ b/devtools/client/performance/modules/widgets/markers-overview.js
+@@ -4,17 +4,17 @@
+ "use strict";
+ 
+ /**
+  * This file contains the "markers overview" graph, which is a minimap of all
+  * the timeline data. Regions inside it may be selected, determining which
+  * markers are visible in the "waterfall".
+  */
+ 
+-const { Heritage } = require("devtools/client/shared/widgets/view-helpers");
++const { extend } = require("devtools/shared/extend");
+ const { AbstractCanvasGraph } = require("devtools/client/shared/widgets/Graphs");
+ 
+ const { colorUtils } = require("devtools/shared/css/color");
+ const { getColor } = require("devtools/client/shared/theme");
+ const ProfilerGlobal = require("devtools/client/performance/modules/global");
+ const { MarkerBlueprintUtils } = require("devtools/client/performance/modules/marker-blueprint-utils");
+ const { TickUtils } = require("devtools/client/performance/modules/waterfall-ticks");
+ const { TIMELINE_BLUEPRINT } = require("devtools/client/performance/modules/markers");
+@@ -43,17 +43,17 @@ const OVERVIEW_GROUP_VERTICAL_PADDING = 
+  *        List of names of marker types that should not be shown.
+  */
+ function MarkersOverview(parent, filter = [], ...args) {
+   AbstractCanvasGraph.apply(this, [parent, "markers-overview", ...args]);
+   this.setTheme();
+   this.setFilter(filter);
+ }
+ 
+-MarkersOverview.prototype = Heritage.extend(AbstractCanvasGraph.prototype, {
++MarkersOverview.prototype = extend(AbstractCanvasGraph.prototype, {
+   clipheadLineColor: OVERVIEW_CLIPHEAD_LINE_COLOR,
+   selectionLineColor: OVERVIEW_SELECTION_LINE_COLOR,
+   headerHeight: OVERVIEW_HEADER_HEIGHT,
+   rowHeight: OVERVIEW_ROW_HEIGHT,
+   groupPadding: OVERVIEW_GROUP_VERTICAL_PADDING,
+ 
+   /**
+    * Compute the height of the overview.
+diff --git a/devtools/client/performance/modules/widgets/tree-view.js b/devtools/client/performance/modules/widgets/tree-view.js
+--- a/devtools/client/performance/modules/widgets/tree-view.js
++++ b/devtools/client/performance/modules/widgets/tree-view.js
+@@ -4,17 +4,17 @@
+ "use strict";
+ 
+ /**
+  * This file contains the tree view, displaying all the samples and frames
+  * received from the proviler in a tree-like structure.
+  */
+ 
+ const { L10N } = require("devtools/client/performance/modules/global");
+-const { Heritage } = require("devtools/client/shared/widgets/view-helpers");
++const { extend } = require("devtools/shared/extend");
+ const { AbstractTreeItem } = require("resource://devtools/client/shared/widgets/AbstractTreeItem.jsm");
+ 
+ const URL_LABEL_TOOLTIP = L10N.getStr("table.url.tooltiptext");
+ const VIEW_OPTIMIZATIONS_TOOLTIP = L10N.getStr("table.view-optimizations.tooltiptext2");
+ 
+ const CALL_TREE_INDENTATION = 16; // px
+ 
+ // Used for rendering values in cells
+@@ -169,17 +169,17 @@ function CallView({
+   this.frame = frame;
+   this.hidden = hidden;
+   this.inverted = inverted;
+   this.showOptimizationHint = showOptimizationHint;
+ 
+   this._onUrlClick = this._onUrlClick.bind(this);
+ }
+ 
+-CallView.prototype = Heritage.extend(AbstractTreeItem.prototype, {
++CallView.prototype = extend(AbstractTreeItem.prototype, {
+   /**
+    * Creates the view for this tree node.
+    * @param nsIDOMNode document
+    * @param nsIDOMNode arrowNode
+    * @return nsIDOMNode
+    */
+   _displaySelf: function (document, arrowNode) {
+     let frameInfo = this.getDisplayedData();
+diff --git a/devtools/client/performance/performance-controller.js b/devtools/client/performance/performance-controller.js
+--- a/devtools/client/performance/performance-controller.js
++++ b/devtools/client/performance/performance-controller.js
+@@ -8,20 +8,21 @@
+ /* exported Cc, Ci, Cu, Cr, loader, Promise */
+ var BrowserLoaderModule = {};
+ ChromeUtils.import("resource://devtools/client/shared/browser-loader.js", BrowserLoaderModule);
+ var { loader, require } = BrowserLoaderModule.BrowserLoader({
+   baseURI: "resource://devtools/client/performance/",
+   window
+ });
+ var { Task } = require("devtools/shared/task");
+-/* exported Heritage, ViewHelpers, WidgetMethods, setNamedTimeout, clearNamedTimeout */
+-var { Heritage, ViewHelpers, WidgetMethods, setNamedTimeout, clearNamedTimeout } = require("devtools/client/shared/widgets/view-helpers");
++/* exported ViewHelpers, WidgetMethods, setNamedTimeout, clearNamedTimeout */
++var { ViewHelpers, WidgetMethods, setNamedTimeout, clearNamedTimeout } = require("devtools/client/shared/widgets/view-helpers");
+ var { PrefObserver } = require("devtools/client/shared/prefs");
+-
++/* exported extend */
++const { extend } = require("devtools/shared/extend");
+ // Use privileged promise in panel documents to prevent having them to freeze
+ // during toolbox destruction. See bug 1402779.
+ var Promise = require("Promise");
+ 
+ // Events emitted by various objects in the panel.
+ var EVENTS = require("devtools/client/performance/events");
+ Object.defineProperty(this, "EVENTS", {
+   value: EVENTS,
+diff --git a/devtools/client/performance/test/helpers/synth-utils.js b/devtools/client/performance/test/helpers/synth-utils.js
+--- a/devtools/client/performance/test/helpers/synth-utils.js
++++ b/devtools/client/performance/test/helpers/synth-utils.js
+@@ -49,24 +49,24 @@ exports.synthesizeProfile = () => {
+   });
+ };
+ 
+ /**
+  * Generates a simple implementation for a tree class.
+  */
+ exports.synthesizeCustomTreeClass = () => {
+   const { AbstractTreeItem } = require("resource://devtools/client/shared/widgets/AbstractTreeItem.jsm");
+-  const { Heritage } = require("devtools/client/shared/widgets/view-helpers");
++  const { extend } = require("devtools/shared/extend");
+ 
+   function MyCustomTreeItem(dataSrc, properties) {
+     AbstractTreeItem.call(this, properties);
+     this.itemDataSrc = dataSrc;
+   }
+ 
+-  MyCustomTreeItem.prototype = Heritage.extend(AbstractTreeItem.prototype, {
++  MyCustomTreeItem.prototype = extend(AbstractTreeItem.prototype, {
+     _displaySelf: function (document, arrowNode) {
+       let node = document.createElement("hbox");
+       node.style.marginInlineStart = (this.level * 10) + "px";
+       node.appendChild(arrowNode);
+       node.appendChild(document.createTextNode(this.itemDataSrc.label));
+       return node;
+     },
+ 
+diff --git a/devtools/client/performance/views/details-js-call-tree.js b/devtools/client/performance/views/details-js-call-tree.js
+--- a/devtools/client/performance/views/details-js-call-tree.js
++++ b/devtools/client/performance/views/details-js-call-tree.js
+@@ -4,17 +4,17 @@
+ /* import-globals-from ../performance-controller.js */
+ /* import-globals-from ../performance-view.js */
+ /* globals DetailsSubview */
+ "use strict";
+ 
+ /**
+  * CallTree view containing profiler call tree, controlled by DetailsView.
+  */
+-var JsCallTreeView = Heritage.extend(DetailsSubview, {
++var JsCallTreeView = extend(DetailsSubview, {
+ 
+   rerenderPrefs: [
+     "invert-call-tree",
+     "show-platform-data",
+     "flatten-tree-recursion",
+     "show-jit-optimizations",
+   ],
+ 
+diff --git a/devtools/client/performance/views/details-js-flamegraph.js b/devtools/client/performance/views/details-js-flamegraph.js
+--- a/devtools/client/performance/views/details-js-flamegraph.js
++++ b/devtools/client/performance/views/details-js-flamegraph.js
+@@ -5,17 +5,17 @@
+ /* import-globals-from ../performance-view.js */
+ /* globals DetailsSubview */
+ "use strict";
+ 
+ /**
+  * FlameGraph view containing a pyramid-like visualization of a profile,
+  * controlled by DetailsView.
+  */
+-var JsFlameGraphView = Heritage.extend(DetailsSubview, {
++var JsFlameGraphView = extend(DetailsSubview, {
+ 
+   shouldUpdateWhileMouseIsActive: true,
+ 
+   rerenderPrefs: [
+     "invert-flame-graph",
+     "flatten-tree-recursion",
+     "show-platform-data",
+     "show-idle-blocks"
+diff --git a/devtools/client/performance/views/details-memory-call-tree.js b/devtools/client/performance/views/details-memory-call-tree.js
+--- a/devtools/client/performance/views/details-memory-call-tree.js
++++ b/devtools/client/performance/views/details-memory-call-tree.js
+@@ -4,17 +4,17 @@
+ /* import-globals-from ../performance-controller.js */
+ /* import-globals-from ../performance-view.js */
+ /* globals DetailsSubview */
+ "use strict";
+ 
+ /**
+  * CallTree view containing memory allocation sites, controlled by DetailsView.
+  */
+-var MemoryCallTreeView = Heritage.extend(DetailsSubview, {
++var MemoryCallTreeView = extend(DetailsSubview, {
+ 
+   rerenderPrefs: [
+     "invert-call-tree"
+   ],
+ 
+   // Units are in milliseconds.
+   rangeChangeDebounceTime: 100,
+ 
+diff --git a/devtools/client/performance/views/details-memory-flamegraph.js b/devtools/client/performance/views/details-memory-flamegraph.js
+--- a/devtools/client/performance/views/details-memory-flamegraph.js
++++ b/devtools/client/performance/views/details-memory-flamegraph.js
+@@ -5,17 +5,17 @@
+ /* import-globals-from ../performance-view.js */
+ /* globals DetailsSubview */
+ "use strict";
+ 
+ /**
+  * FlameGraph view containing a pyramid-like visualization of memory allocation
+  * sites, controlled by DetailsView.
+  */
+-var MemoryFlameGraphView = Heritage.extend(DetailsSubview, {
++var MemoryFlameGraphView = extend(DetailsSubview, {
+ 
+   shouldUpdateWhileMouseIsActive: true,
+ 
+   rerenderPrefs: [
+     "invert-flame-graph",
+     "flatten-tree-recursion",
+     "show-idle-blocks"
+   ],
+diff --git a/devtools/client/performance/views/details-waterfall.js b/devtools/client/performance/views/details-waterfall.js
+--- a/devtools/client/performance/views/details-waterfall.js
++++ b/devtools/client/performance/views/details-waterfall.js
+@@ -10,17 +10,17 @@ const MARKER_DETAILS_WIDTH = 200;
+ // Units are in milliseconds.
+ const WATERFALL_RESIZE_EVENTS_DRAIN = 100;
+ 
+ const { TickUtils } = require("devtools/client/performance/modules/waterfall-ticks");
+ 
+ /**
+  * Waterfall view containing the timeline markers, controlled by DetailsView.
+  */
+-var WaterfallView = Heritage.extend(DetailsSubview, {
++var WaterfallView = extend(DetailsSubview, {
+ 
+   // Smallest unit of time between two markers. Larger by 10x^3 than Number.EPSILON.
+   MARKER_EPSILON: 0.000000000001,
+   // px
+   WATERFALL_MARKER_SIDEBAR_WIDTH: 175,
+   // px
+   WATERFALL_MARKER_SIDEBAR_SAFE_BOUNDS: 20,
+ 
+diff --git a/devtools/client/scratchpad/scratchpad.js b/devtools/client/scratchpad/scratchpad.js
+--- a/devtools/client/scratchpad/scratchpad.js
++++ b/devtools/client/scratchpad/scratchpad.js
+@@ -46,17 +46,17 @@ const TargetFactory = require("devtools/
+ const EventEmitter = require("devtools/shared/old-event-emitter");
+ const {DevToolsWorker} = require("devtools/shared/worker/worker");
+ const DevToolsUtils = require("devtools/shared/DevToolsUtils");
+ const flags = require("devtools/shared/flags");
+ const promise = require("promise");
+ const defer = require("devtools/shared/defer");
+ const Services = require("Services");
+ const {gDevTools} = require("devtools/client/framework/devtools");
+-const {Heritage} = require("devtools/client/shared/widgets/view-helpers");
++const { extend } = require("devtools/shared/extend");
+ 
+ const {XPCOMUtils} = require("resource://gre/modules/XPCOMUtils.jsm");
+ const {NetUtil} = require("resource://gre/modules/NetUtil.jsm");
+ const {ScratchpadManager} = require("resource://devtools/client/scratchpad/scratchpad-manager.jsm");
+ const {addDebuggerToGlobal} = require("resource://gre/modules/jsdebugger.jsm");
+ const {OS} = require("resource://gre/modules/osfile.jsm");
+ const {Reflect} = require("resource://gre/modules/reflect.jsm");
+ 
+@@ -2168,17 +2168,17 @@ ScratchpadTab.prototype = {
+ /**
+  * Represents the DebuggerClient connection to a specific window as used by the
+  * Scratchpad.
+  */
+ function ScratchpadWindow() {}
+ 
+ ScratchpadWindow.consoleFor = ScratchpadTab.consoleFor;
+ 
+-ScratchpadWindow.prototype = Heritage.extend(ScratchpadTab.prototype, {
++ScratchpadWindow.prototype = extend(ScratchpadTab.prototype, {
+   /**
+    * Attach to this window.
+    *
+    * @return Promise
+    *         The promise for the target for this window.
+    */
+   _attach: function SW__attach()
+   {
+@@ -2198,17 +2198,17 @@ ScratchpadWindow.prototype = Heritage.ex
+ 
+ function ScratchpadTarget(aTarget)
+ {
+   this._target = aTarget;
+ }
+ 
+ ScratchpadTarget.consoleFor = ScratchpadTab.consoleFor;
+ 
+-ScratchpadTarget.prototype = Heritage.extend(ScratchpadTab.prototype, {
++ScratchpadTarget.prototype = extend(ScratchpadTab.prototype, {
+   _attach: function ST__attach()
+   {
+     if (this._target.isRemote) {
+       return promise.resolve(this._target);
+     }
+     return this._target.makeRemote().then(() => this._target);
+   }
+ });
+diff --git a/devtools/client/shadereditor/shadereditor.js b/devtools/client/shadereditor/shadereditor.js
+--- a/devtools/client/shadereditor/shadereditor.js
++++ b/devtools/client/shadereditor/shadereditor.js
+@@ -8,17 +8,18 @@ const {XPCOMUtils} = require("resource:/
+ const {SideMenuWidget} = require("resource://devtools/client/shared/widgets/SideMenuWidget.jsm");
+ const promise = require("promise");
+ const defer = require("devtools/shared/defer");
+ const Services = require("Services");
+ const EventEmitter = require("devtools/shared/old-event-emitter");
+ const Tooltip = require("devtools/client/shared/widgets/tooltip/Tooltip");
+ const Editor = require("devtools/client/sourceeditor/editor");
+ const {LocalizationHelper} = require("devtools/shared/l10n");
+-const {Heritage, WidgetMethods, setNamedTimeout} =
++const {extend} = require("devtools/shared/extend");
++const {WidgetMethods, setNamedTimeout} =
+   require("devtools/client/shared/widgets/view-helpers");
+ const {Task} = require("devtools/shared/task");
+ 
+ // Use privileged promise in panel documents to prevent having them to freeze
+ // during toolbox destruction. See bug 1402779.
+ const Promise = require("Promise");
+ 
+ // The panel's window global is an EventEmitter firing the following events:
+@@ -191,17 +192,17 @@ var EventsHandler = {
+     $("#content").hidden = false;
+     ShadersListView.addProgram(programActor);
+   }
+ };
+ 
+ /**
+  * Functions handling the sources UI.
+  */
+-var ShadersListView = Heritage.extend(WidgetMethods, {
++var ShadersListView = extend(WidgetMethods, {
+   /**
+    * Initialization function, called when the tool is started.
+    */
+   initialize: function () {
+     this.widget = new SideMenuWidget(this._pane = $("#shaders-pane"), {
+       showArrows: true,
+       showItemCheckboxes: true
+     });
+diff --git a/devtools/client/shared/widgets/AbstractTreeItem.jsm b/devtools/client/shared/widgets/AbstractTreeItem.jsm
+--- a/devtools/client/shared/widgets/AbstractTreeItem.jsm
++++ b/devtools/client/shared/widgets/AbstractTreeItem.jsm
+@@ -34,17 +34,17 @@ this.EXPORTED_SYMBOLS = ["AbstractTreeIt
+  *
+  * For example, you can extend this abstract class like this:
+  *
+  * function MyCustomTreeItem(dataSrc, properties) {
+  *   AbstractTreeItem.call(this, properties);
+  *   this.itemDataSrc = dataSrc;
+  * }
+  *
+- * MyCustomTreeItem.prototype = Heritage.extend(AbstractTreeItem.prototype, {
++ * MyCustomTreeItem.prototype = extend(AbstractTreeItem.prototype, {
+  *   _displaySelf: function(document, arrowNode) {
+  *     let node = document.createElement("hbox");
+  *     ...
+  *     // Append the provided arrow node wherever you want.
+  *     node.appendChild(arrowNode);
+  *     ...
+  *     // Use `this.itemDataSrc` to customize the tree item and
+  *     // `this.level` to calculate the indentation.
+diff --git a/devtools/client/shared/widgets/BarGraphWidget.js b/devtools/client/shared/widgets/BarGraphWidget.js
+--- a/devtools/client/shared/widgets/BarGraphWidget.js
++++ b/devtools/client/shared/widgets/BarGraphWidget.js
+@@ -1,11 +1,12 @@
+ "use strict";
+ 
+-const { Heritage, setNamedTimeout, clearNamedTimeout } = require("devtools/client/shared/widgets/view-helpers");
++const { extend } = require("devtools/shared/extend");
++const { setNamedTimeout, clearNamedTimeout } = require("devtools/client/shared/widgets/view-helpers");
+ const { AbstractCanvasGraph, CanvasGraphUtils } = require("devtools/client/shared/widgets/Graphs");
+ 
+ const HTML_NS = "http://www.w3.org/1999/xhtml";
+ 
+ // Bar graph constants.
+ 
+ const GRAPH_DAMPEN_VALUES_FACTOR = 0.75;
+ 
+@@ -72,17 +73,17 @@ this.BarGraphWidget = function (parent, 
+     this._onLegendMouseOver = this._onLegendMouseOver.bind(this);
+     this._onLegendMouseOut = this._onLegendMouseOut.bind(this);
+     this._onLegendMouseDown = this._onLegendMouseDown.bind(this);
+     this._onLegendMouseUp = this._onLegendMouseUp.bind(this);
+     this._createLegend();
+   });
+ };
+ 
+-BarGraphWidget.prototype = Heritage.extend(AbstractCanvasGraph.prototype, {
++BarGraphWidget.prototype = extend(AbstractCanvasGraph.prototype, {
+   clipheadLineColor: GRAPH_CLIPHEAD_LINE_COLOR,
+   selectionLineColor: GRAPH_SELECTION_LINE_COLOR,
+   selectionBackgroundColor: GRAPH_SELECTION_BACKGROUND_COLOR,
+   selectionStripesColor: GRAPH_SELECTION_STRIPES_COLOR,
+   regionBackgroundColor: GRAPH_REGION_BACKGROUND_COLOR,
+   regionStripesColor: GRAPH_REGION_STRIPES_COLOR,
+ 
+   /**
+diff --git a/devtools/client/shared/widgets/LineGraphWidget.js b/devtools/client/shared/widgets/LineGraphWidget.js
+--- a/devtools/client/shared/widgets/LineGraphWidget.js
++++ b/devtools/client/shared/widgets/LineGraphWidget.js
+@@ -1,12 +1,12 @@
+ "use strict";
+ 
+ const { Task } = require("devtools/shared/task");
+-const { Heritage } = require("devtools/client/shared/widgets/view-helpers");
++const { extend } = require("devtools/shared/extend");
+ const { AbstractCanvasGraph, CanvasGraphUtils } = require("devtools/client/shared/widgets/Graphs");
+ const { LocalizationHelper } = require("devtools/shared/l10n");
+ 
+ const HTML_NS = "http://www.w3.org/1999/xhtml";
+ const L10N = new LocalizationHelper("devtools/client/locales/graphs.properties");
+ 
+ // Line graph constants.
+ 
+@@ -84,17 +84,17 @@ this.LineGraphWidget = function (parent,
+     );
+     this._avgGutterLine = this._createGutterLine("average");
+     this._avgTooltip = this._createTooltip(
+       "average", "end", L10N.getStr("graphs.label.average"), metric
+     );
+   });
+ };
+ 
+-LineGraphWidget.prototype = Heritage.extend(AbstractCanvasGraph.prototype, {
++LineGraphWidget.prototype = extend(AbstractCanvasGraph.prototype, {
+   backgroundColor: GRAPH_BACKGROUND_COLOR,
+   backgroundGradientStart: GRAPH_BACKGROUND_GRADIENT_START,
+   backgroundGradientEnd: GRAPH_BACKGROUND_GRADIENT_END,
+   strokeColor: GRAPH_STROKE_COLOR,
+   strokeWidth: GRAPH_STROKE_WIDTH,
+   maximumLineColor: GRAPH_MAXIMUM_LINE_COLOR,
+   averageLineColor: GRAPH_AVERAGE_LINE_COLOR,
+   minimumLineColor: GRAPH_MINIMUM_LINE_COLOR,
+diff --git a/devtools/client/shared/widgets/MountainGraphWidget.js b/devtools/client/shared/widgets/MountainGraphWidget.js
+--- a/devtools/client/shared/widgets/MountainGraphWidget.js
++++ b/devtools/client/shared/widgets/MountainGraphWidget.js
+@@ -1,11 +1,11 @@
+ "use strict";
+ 
+-const { Heritage } = require("devtools/client/shared/widgets/view-helpers");
++const { extend } = require("devtools/shared/extend");
+ const { AbstractCanvasGraph } = require("devtools/client/shared/widgets/Graphs");
+ 
+ // Bar graph constants.
+ 
+ const GRAPH_DAMPEN_VALUES_FACTOR = 0.9;
+ 
+ const GRAPH_BACKGROUND_COLOR = "#ddd";
+ const GRAPH_STROKE_WIDTH = 1; // px
+@@ -52,17 +52,17 @@ const GRAPH_REGION_STRIPES_COLOR = "rgba
+  *
+  * @param nsIDOMNode parent
+  *        The parent node holding the graph.
+  */
+ this.MountainGraphWidget = function (parent, ...args) {
+   AbstractCanvasGraph.apply(this, [parent, "mountain-graph", ...args]);
+ };
+ 
+-MountainGraphWidget.prototype = Heritage.extend(AbstractCanvasGraph.prototype, {
++MountainGraphWidget.prototype = extend(AbstractCanvasGraph.prototype, {
+   backgroundColor: GRAPH_BACKGROUND_COLOR,
+   strokeColor: GRAPH_STROKE_COLOR,
+   strokeWidth: GRAPH_STROKE_WIDTH,
+   clipheadLineColor: GRAPH_CLIPHEAD_LINE_COLOR,
+   selectionLineColor: GRAPH_SELECTION_LINE_COLOR,
+   selectionBackgroundColor: GRAPH_SELECTION_BACKGROUND_COLOR,
+   selectionStripesColor: GRAPH_SELECTION_STRIPES_COLOR,
+   regionBackgroundColor: GRAPH_REGION_BACKGROUND_COLOR,
+diff --git a/devtools/client/shared/widgets/VariablesView.jsm b/devtools/client/shared/widgets/VariablesView.jsm
+--- a/devtools/client/shared/widgets/VariablesView.jsm
++++ b/devtools/client/shared/widgets/VariablesView.jsm
+@@ -16,17 +16,18 @@ const ITEM_FLASH_DURATION = 300; // ms
+ const { require } = ChromeUtils.import("resource://devtools/shared/Loader.jsm", {});
+ const {XPCOMUtils} = require("resource://gre/modules/XPCOMUtils.jsm");
+ const EventEmitter = require("devtools/shared/old-event-emitter");
+ const DevToolsUtils = require("devtools/shared/DevToolsUtils");
+ const Services = require("Services");
+ const { getSourceNames } = require("devtools/client/shared/source-utils");
+ const promise = require("promise");
+ const defer = require("devtools/shared/defer");
+-const { Heritage, ViewHelpers, setNamedTimeout } =
++const { extend } = require("devtools/shared/extend");
++const { ViewHelpers, setNamedTimeout } =
+   require("devtools/client/shared/widgets/view-helpers");
+ const { Task } = require("devtools/shared/task");
+ const nodeConstants = require("devtools/shared/dom-node-constants");
+ const {KeyCodes} = require("devtools/client/shared/keycodes");
+ const {PluralForm} = require("devtools/shared/plural-form");
+ const {LocalizationHelper, ELLIPSIS} = require("devtools/shared/l10n");
+ const L10N = new LocalizationHelper(DBG_STRINGS_URI);
+ 
+@@ -2171,17 +2172,17 @@ function Variable(aScope, aName, aDescri
+     delete aDescriptor.get;
+     delete aDescriptor.set;
+   }
+ 
+   Scope.call(this, aScope, aName, this._initialDescriptor = aDescriptor);
+   this.setGrip(aDescriptor.value);
+ }
+ 
+-Variable.prototype = Heritage.extend(Scope.prototype, {
++Variable.prototype = extend(Scope.prototype, {
+   /**
+    * Whether this Variable should be prefetched when it is remoted.
+    */
+   get shouldPrefetch() {
+     return this.name == "window" || this.name == "this";
+   },
+ 
+   /**
+@@ -3064,17 +3065,17 @@ Variable.prototype = Heritage.extend(Sco
+  *        The property's descriptor.
+  * @param object aOptions
+  *        Options of the form accepted by Scope.addItem
+  */
+ function Property(aVar, aName, aDescriptor, aOptions) {
+   Variable.call(this, aVar, aName, aDescriptor, aOptions);
+ }
+ 
+-Property.prototype = Heritage.extend(Variable.prototype, {
++Property.prototype = extend(Variable.prototype, {
+   /**
+    * The class name applied to this property's target element.
+    */
+   targetClassName: "variables-view-property variable-or-property",
+ 
+   /**
+    * @see Variable.symbolicName
+    * @return string
+@@ -3152,17 +3153,17 @@ VariablesView.prototype.commitHierarchy 
+   }
+   if (this.oncommit) {
+     this.oncommit(this);
+   }
+ };
+ 
+ // Some variables are likely to contain a very large number of properties.
+ // It would be a bad idea to re-expand them or perform expensive operations.
+-VariablesView.prototype.commitHierarchyIgnoredItems = Heritage.extend(null, {
++VariablesView.prototype.commitHierarchyIgnoredItems = extend(null, {
+   "window": true,
+   "this": true
+ });
+ 
+ /**
+  * Checks if the an item was previously expanded, if it existed in a
+  * previous hierarchy.
+  *
+@@ -4108,17 +4109,17 @@ Editable.prototype = {
+  * An Editable specific to editing the name of a Variable or Property.
+  */
+ function EditableName(aVariable, aOptions) {
+   Editable.call(this, aVariable, aOptions);
+ }
+ 
+ EditableName.create = Editable.create;
+ 
+-EditableName.prototype = Heritage.extend(Editable.prototype, {
++EditableName.prototype = extend(Editable.prototype, {
+   className: "element-name-input",
+ 
+   get label() {
+     return this._variable._name;
+   },
+ 
+   get shouldActivate() {
+     return !!this._variable.ownerView.switch;
+@@ -4130,17 +4131,17 @@ EditableName.prototype = Heritage.extend
+  * An Editable specific to editing the value of a Variable or Property.
+  */
+ function EditableValue(aVariable, aOptions) {
+   Editable.call(this, aVariable, aOptions);
+ }
+ 
+ EditableValue.create = Editable.create;
+ 
+-EditableValue.prototype = Heritage.extend(Editable.prototype, {
++EditableValue.prototype = extend(Editable.prototype, {
+   className: "element-value-input",
+ 
+   get label() {
+     return this._variable._valueLabel;
+   },
+ 
+   get shouldActivate() {
+     return !!this._variable.ownerView.eval;
+@@ -4152,17 +4153,17 @@ EditableValue.prototype = Heritage.exten
+  * An Editable specific to editing the key and value of a new property.
+  */
+ function EditableNameAndValue(aVariable, aOptions) {
+   EditableName.call(this, aVariable, aOptions);
+ }
+ 
+ EditableNameAndValue.create = Editable.create;
+ 
+-EditableNameAndValue.prototype = Heritage.extend(EditableName.prototype, {
++EditableNameAndValue.prototype = extend(EditableName.prototype, {
+   _reset: function (e) {
+     // Hide the Variable or Property if the user presses escape.
+     this._variable.remove();
+     this.deactivate();
+   },
+ 
+   _next: function (e) {
+     // Override _next so as to set both key and value at the same time.
+diff --git a/devtools/client/shared/widgets/view-helpers.js b/devtools/client/shared/widgets/view-helpers.js
+--- a/devtools/client/shared/widgets/view-helpers.js
++++ b/devtools/client/shared/widgets/view-helpers.js
+@@ -9,39 +9,16 @@ const {KeyCodes} = require("devtools/cli
+ 
+ const PANE_APPEARANCE_DELAY = 50;
+ const PAGE_SIZE_ITEM_COUNT_RATIO = 5;
+ const WIDGET_FOCUSABLE_NODES = new Set(["vbox", "hbox"]);
+ 
+ var namedTimeoutsStore = new Map();
+ 
+ /**
+- * Inheritance helpers from the addon SDK's core/heritage.
+- * Remove these when all devtools are loadered.
+- */
+-exports.Heritage = {
+-  /**
+-   * @see extend in sdk/core/heritage.
+-   */
+-  extend: function (prototype, properties = {}) {
+-    return Object.create(prototype, this.getOwnPropertyDescriptors(properties));
+-  },
+-
+-  /**
+-   * @see getOwnPropertyDescriptors in sdk/core/heritage.
+-   */
+-  getOwnPropertyDescriptors: function (object) {
+-    return Object.getOwnPropertyNames(object).reduce((descriptor, name) => {
+-      descriptor[name] = Object.getOwnPropertyDescriptor(object, name);
+-      return descriptor;
+-    }, {});
+-  }
+-};
+-
+-/**
+  * Helper for draining a rapid succession of events and invoking a callback
+  * once everything settles down.
+  *
+  * @param string id
+  *        A string identifier for the named timeout.
+  * @param number wait
+  *        The amount of milliseconds to wait after no more events are fired.
+  * @param function callback
+@@ -485,17 +462,17 @@ Item.prototype = {
+  * Some generic Widget methods handling Item instances.
+  * Iterable via "for (let childItem of wrappedView) { }".
+  *
+  * Usage:
+  *   function MyView() {
+  *     this.widget = new MyWidget(document.querySelector(".my-node"));
+  *   }
+  *
+- *   MyView.prototype = Heritage.extend(WidgetMethods, {
++ *   MyView.prototype = extend(WidgetMethods, {
+  *     myMethod: function() {},
+  *     ...
+  *   });
+  *
+  * See https://gist.github.com/victorporof/5749386 for more details.
+  * The devtools/shared/widgets/SimpleListWidget.jsm is an implementation
+  * example.
+  *

+ 8688 - 0
frg/work-js/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
frg/work-js/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
frg/work-js/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
frg/work-js/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;

+ 210 - 0
frg/work-js/mozilla-release/patches/1397366-59a1.patch

@@ -0,0 +1,210 @@
+# HG changeset patch
+# User Julian Descottes <jdescottes@mozilla.com>
+# Date 1515009178 -3600
+# Node ID b51eda5903d55316bbe4a253c65b91a8433f0701
+# Parent  9c9baa73a11dbbc1502ff2e609cbdb83b20f0c3c
+Bug 1397366 - restore source-editor commands controller for scratchpad & styleeditor menus;r=ochameau
+
+MozReview-Commit-ID: Cfgws8fqgvp
+
+diff --git a/devtools/client/scratchpad/scratchpad.js b/devtools/client/scratchpad/scratchpad.js
+--- a/devtools/client/scratchpad/scratchpad.js
++++ b/devtools/client/scratchpad/scratchpad.js
+@@ -1723,16 +1723,19 @@ var Scratchpad = {
+                                                       document.querySelector("#scratchpad-notificationbox"),
+                                                       msg, okstring);
+       editorElement.addEventListener("paste", this._onPaste, true);
+       editorElement.addEventListener("drop", this._onPaste);
+       this.editor.on("saveRequested", () => this.saveFile());
+       this.editor.focus();
+       this.editor.setCursor({ line: lines.length, ch: lines.pop().length });
+ 
++      // Add the commands controller for the source-editor.
++      this.editor.insertCommandsController();
++
+       if (state)
+         this.dirty = !state.saved;
+ 
+       this.initialized = true;
+       this._triggerObservers("Ready");
+       this.populateRecentFilesMenu();
+       PreferenceObserver.init();
+       CloseObserver.init();
+diff --git a/devtools/client/sourceeditor/editor-commands-controller.js b/devtools/client/sourceeditor/editor-commands-controller.js
+new file mode 100644
+--- /dev/null
++++ b/devtools/client/sourceeditor/editor-commands-controller.js
+@@ -0,0 +1,97 @@
++/* 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";
++
++/**
++ * The source editor exposes XUL commands that can be used when embedded in a XUL
++ * document. This controller drives the availability and behavior of the commands. When
++ * the editor input field is focused, this controller will update the matching menu item
++ * entries found in application menus or context menus.
++ */
++
++/**
++ * Returns a controller object that can be used for editor-specific commands:
++ * - find
++ * - find again
++ * - go to line
++ * - undo
++ * - redo
++ * - delete
++ * - select all
++ */
++function createController(ed) {
++  return {
++    supportsCommand: function (cmd) {
++      switch (cmd) {
++        case "cmd_find":
++        case "cmd_findAgain":
++        case "cmd_gotoLine":
++        case "cmd_undo":
++        case "cmd_redo":
++        case "cmd_delete":
++        case "cmd_selectAll":
++          return true;
++      }
++
++      return false;
++    },
++
++    isCommandEnabled: function (cmd) {
++      let cm = ed.codeMirror;
++
++      switch (cmd) {
++        case "cmd_find":
++        case "cmd_gotoLine":
++        case "cmd_selectAll":
++          return true;
++        case "cmd_findAgain":
++          return cm.state.search != null && cm.state.search.query != null;
++        case "cmd_undo":
++          return ed.canUndo();
++        case "cmd_redo":
++          return ed.canRedo();
++        case "cmd_delete":
++          return ed.somethingSelected();
++      }
++
++      return false;
++    },
++
++    doCommand: function (cmd) {
++      let cm = ed.codeMirror;
++
++      let map = {
++        "cmd_selectAll": "selectAll",
++        "cmd_find": "find",
++        "cmd_undo": "undo",
++        "cmd_redo": "redo",
++        "cmd_delete": "delCharAfter",
++        "cmd_findAgain": "findNext"
++      };
++
++      if (map[cmd]) {
++        cm.execCommand(map[cmd]);
++        return;
++      }
++
++      if (cmd == "cmd_gotoLine") {
++        ed.jumpToLine();
++      }
++    },
++
++    onEvent: function () {}
++  };
++}
++
++/**
++ * Create and insert a commands controller for the provided SourceEditor instance.
++ */
++function insertCommandsController(sourceEditor) {
++  let input = sourceEditor.codeMirror.getInputField();
++  let controller = createController(sourceEditor);
++  input.controllers.insertControllerAt(0, controller);
++}
++
++module.exports = { insertCommandsController };
+diff --git a/devtools/client/sourceeditor/editor.js b/devtools/client/sourceeditor/editor.js
+--- a/devtools/client/sourceeditor/editor.js
++++ b/devtools/client/sourceeditor/editor.js
+@@ -479,16 +479,26 @@ Editor.prototype = {
+     // turn it off and back on again so the proper mode can be used.
+     if (this.config.autocomplete) {
+       this.setOption("autocomplete", false);
+       this.setOption("autocomplete", true);
+     }
+   },
+ 
+   /**
++   * The source editor can expose several commands linked from system and context menus.
++   * Kept for backward compatibility with scratchpad and styleeditor.
++   */
++  insertCommandsController: function () {
++    const { insertCommandsController } =
++      require("devtools/client/sourceeditor/editor-commands-controller");
++    insertCommandsController(this);
++  },
++
++  /**
+    * Returns text from the text area. If line argument is provided
+    * the method returns only that line.
+    */
+   getText: function (line) {
+     let cm = editors.get(this);
+ 
+     if (line == null) {
+       return cm.getValue();
+diff --git a/devtools/client/sourceeditor/moz.build b/devtools/client/sourceeditor/moz.build
+--- a/devtools/client/sourceeditor/moz.build
++++ b/devtools/client/sourceeditor/moz.build
+@@ -7,16 +7,17 @@
+ DIRS += [
+     'tern',
+ ]
+ 
+ DevToolsModules(
+     'autocomplete.js',
+     'css-autocompleter.js',
+     'debugger.js',
++    'editor-commands-controller.js',
+     'editor.js',
+     'wasm.js'
+ )
+ 
+ BROWSER_CHROME_MANIFESTS += ['test/browser.ini']
+ 
+-with Files('**'):
+-    BUG_COMPONENT = ('Firefox', 'Developer Tools: Source Editor')
++with Files('**'):
++    BUG_COMPONENT = ('Firefox', 'Developer Tools: Source Editor')
+diff --git a/devtools/client/styleeditor/StyleSheetEditor.jsm b/devtools/client/styleeditor/StyleSheetEditor.jsm
+--- a/devtools/client/styleeditor/StyleSheetEditor.jsm
++++ b/devtools/client/styleeditor/StyleSheetEditor.jsm
+@@ -460,16 +460,19 @@ StyleSheetEditor.prototype = {
+ 
+       sourceEditor.setSelection(this._state.selection.start,
+                                 this._state.selection.end);
+ 
+       if (this.highlighter && this.walker) {
+         sourceEditor.container.addEventListener("mousemove", this._onMouseMove);
+       }
+ 
++      // Add the commands controller for the source-editor.
++      sourceEditor.insertCommandsController();
++
+       this.emit("source-editor-load");
+     });
+   },
+ 
+   /**
+    * Get the source editor for this editor.
+    *
+    * @return {Promise}

+ 138 - 0
frg/work-js/mozilla-release/patches/1398722-58a1.patch

@@ -0,0 +1,138 @@
+# HG changeset patch
+# User abhinav <abhinav.koppula@gmail.com>
+# Date 1506283939 -19800
+# Node ID 12107922ed6df7dc0a681f0f088817dc58e59e83
+# Parent  474c8d94caca2cad1e449d699dbde9a8eefe75cf
+Bug 1398722 - Fix to prevent 'Edit Position' button from disappearing after modifying offset of element. r=jdescottes
+
+MozReview-Commit-ID: H2n3TtIqagG
+
+diff --git a/devtools/client/inspector/boxmodel/box-model.js b/devtools/client/inspector/boxmodel/box-model.js
+--- a/devtools/client/inspector/boxmodel/box-model.js
++++ b/devtools/client/inspector/boxmodel/box-model.js
+@@ -308,26 +308,17 @@ BoxModel.prototype = {
+         editor.elt.parentNode.classList.remove("boxmodel-editing");
+         if (!commit) {
+           session.revert().then(() => {
+             session.destroy();
+           }, console.error);
+           return;
+         }
+ 
+-        if (!this.inspector) {
+-          return;
+-        }
+-
+-        let node = this.inspector.selection.nodeFront;
+-        this.inspector.pageStyle.getLayout(node, {
+-          autoMargins: true,
+-        }).then(layout => {
+-          this.store.dispatch(updateLayout(layout));
+-        }, console.error);
++        this.updateBoxModel("editable-value-change");
+       },
+       cssProperties: getCssProperties(this.inspector.toolbox)
+     }, event);
+   },
+ 
+   /**
+    * Shows the box-model highlighter on the currently selected element.
+    *
+diff --git a/devtools/client/inspector/boxmodel/test/browser.ini b/devtools/client/inspector/boxmodel/test/browser.ini
+--- a/devtools/client/inspector/boxmodel/test/browser.ini
++++ b/devtools/client/inspector/boxmodel/test/browser.ini
+@@ -9,16 +9,17 @@ support-files =
+   !/devtools/client/inspector/test/head.js
+   !/devtools/client/inspector/test/shared-head.js
+   !/devtools/client/shared/test/shared-head.js
+   !/devtools/client/shared/test/test-actor.js
+   !/devtools/client/shared/test/test-actor-registry.js
+ 
+ [browser_boxmodel.js]
+ [browser_boxmodel_computed-accordion-state.js]
++[browser_boxmodel_edit-position-visible-position-change.js]
+ [browser_boxmodel_editablemodel.js]
+ [browser_boxmodel_editablemodel_allproperties.js]
+ disabled=too many intermittent failures (bug 1009322)
+ [browser_boxmodel_editablemodel_bluronclick.js]
+ [browser_boxmodel_editablemodel_border.js]
+ [browser_boxmodel_editablemodel_pseudo.js]
+ [browser_boxmodel_editablemodel_stylerules.js]
+ [browser_boxmodel_guides.js]
+diff --git a/devtools/client/inspector/boxmodel/test/browser_boxmodel_edit-position-visible-position-change.js b/devtools/client/inspector/boxmodel/test/browser_boxmodel_edit-position-visible-position-change.js
+new file mode 100644
+--- /dev/null
++++ b/devtools/client/inspector/boxmodel/test/browser_boxmodel_edit-position-visible-position-change.js
+@@ -0,0 +1,43 @@
++/* Any copyright is dedicated to the Public Domain.
++ http://creativecommons.org/publicdomain/zero/1.0/ */
++
++"use strict";
++
++// Tests that the 'Edit Position' button is still visible after
++// layout is changed.
++// see bug 1398722
++
++const TEST_URI = `
++  <div id="mydiv" style="background:tomato;
++    position:absolute;
++    top:10px;
++    left:10px;
++    width:100px;
++    height:100px">
++`;
++
++add_task(function* () {
++  yield addTab("data:text/html;charset=utf-8," + encodeURIComponent(TEST_URI));
++  let {inspector, view} = yield openBoxModelView();
++
++  yield selectNode("#mydiv", inspector);
++  let editPositionButton = view.document.querySelector(".layout-geometry-editor");
++
++  ok(isNodeVisible(editPositionButton), "Edit Position button is visible initially");
++
++  let positionLeftTextbox = view.document.querySelector(
++      ".boxmodel-editable[title=position-left]"
++  );
++  ok(isNodeVisible(positionLeftTextbox), "Position-left edit box exists");
++
++  info("Change the value of position-left and submit");
++  let onUpdate = waitForUpdate(inspector);
++  EventUtils.synthesizeMouseAtCenter(positionLeftTextbox, {}, view.document.defaultView);
++  EventUtils.synthesizeKey("8", {}, view.document.defaultView);
++  EventUtils.synthesizeKey("VK_RETURN", {}, view.document.defaultView);
++
++  yield onUpdate;
++  editPositionButton = view.document.querySelector(".layout-geometry-editor");
++  ok(isNodeVisible(editPositionButton),
++    "Edit Position button is still visible after layout change");
++});
+diff --git a/devtools/client/inspector/boxmodel/test/head.js b/devtools/client/inspector/boxmodel/test/head.js
+--- a/devtools/client/inspector/boxmodel/test/head.js
++++ b/devtools/client/inspector/boxmodel/test/head.js
+@@ -32,16 +32,25 @@ function* selectAndHighlightNode(selecto
+ 
+   let nodeFront = yield getNodeFront(selectorOrNodeFront, inspector);
+   let updated = inspector.toolbox.once("highlighter-ready");
+   inspector.selection.setNodeFront(nodeFront, "test-highlight");
+   yield updated;
+ }
+ 
+ /**
++ * Is the given node visible in the page (rendered in the frame tree).
++ * @param {DOMNode}
++ * @return {Boolean}
++ */
++function isNodeVisible(node) {
++  return !!node.getClientRects().length;
++}
++
++/**
+  * Open the toolbox, with the inspector tool visible, and the computed view
+  * sidebar tab selected to display the box model view.
+  *
+  * @return {Promise} a promise that resolves when the inspector is ready and the box model
+  *         view is visible and ready.
+  */
+ function openBoxModelView() {
+   return openInspectorSidebarTab("computedview").then(data => {

+ 31 - 0
frg/work-js/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
frg/work-js/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>

+ 314 - 0
frg/work-js/mozilla-release/patches/1401847-60a1.patch

@@ -0,0 +1,314 @@
+# HG changeset patch
+# User Erica Wright <ewright@mozilla.com>
+# Date 1518795609 18000
+# Node ID 6e462b0ef1692b12f6156be7877de8be0473a4c2
+# Parent  485104aa320872196290140eed9fb722ea9206b6
+Bug 1401847 - Custom layout grid colors should be restored per domain. r=jdescottes
+
+MozReview-Commit-ID: GYrZl3r7040
+
+diff --git a/devtools/client/inspector/grids/grid-inspector.js b/devtools/client/inspector/grids/grid-inspector.js
+--- a/devtools/client/inspector/grids/grid-inspector.js
++++ b/devtools/client/inspector/grids/grid-inspector.js
+@@ -4,16 +4,18 @@
+ 
+ "use strict";
+ 
+ const Services = require("Services");
+ 
+ const SwatchColorPickerTooltip = require("devtools/client/shared/widgets/tooltip/SwatchColorPickerTooltip");
+ const { throttle } = require("devtools/client/inspector/shared/utils");
+ const { compareFragmentsGeometry } = require("devtools/client/inspector/grids/utils/utils");
++const asyncStorage = require("devtools/shared/async-storage");
++const { parseURL } = require("devtools/client/shared/source-utils");
+ 
+ const {
+   updateGridColor,
+   updateGridHighlighted,
+   updateGrids,
+ } = require("./actions/grids");
+ const {
+   updateShowGridAreas,
+@@ -143,26 +145,30 @@ class GridInspector {
+   }
+ 
+   /**
+    * Returns the initial color linked to a grid container. Will attempt to check the
+    * current grid highlighter state and the store.
+    *
+    * @param  {NodeFront} nodeFront
+    *         The NodeFront for which we need the color.
++   * @param  {String} customColor
++   *         The color fetched from the custom palette, if it exists.
+    * @param  {String} fallbackColor
+    *         The color to use if no color could be found for the node front.
+    * @return {String} color
+    *         The color to use.
+    */
+-  getInitialGridColor(nodeFront, fallbackColor) {
++  getInitialGridColor(nodeFront, customColor, fallbackColor) {
+     let highlighted = nodeFront == this.highlighters.gridHighlighterShown;
+ 
+     let color;
+-    if (highlighted && this.highlighters.state.grid.options) {
++    if (customColor) {
++      color = customColor;
++    } else if (highlighted && this.highlighters.state.grid.options) {
+       // If the node front is currently highlighted, use the color from the highlighter
+       // options.
+       color = this.highlighters.state.grid.options.color;
+     } else {
+       // Otherwise use the color defined in the store for this node front.
+       color = this.getGridColorForNodeFront(nodeFront);
+     }
+ 
+@@ -283,32 +289,37 @@ class GridInspector {
+    * Updates the grid panel by dispatching the new grid data. This is called when the
+    * layout view becomes visible or the view needs to be updated with new grid data.
+    */
+   async updateGridPanel() {
+     // Stop refreshing if the inspector or store is already destroyed.
+     if (!this.inspector || !this.store) {
+       return;
+     }
++    let currentUrl = this.inspector.target.url;
++    // Get the hostname, if there is no hostname, fall back on protocol
++    // ex: `data:` uri, and `about:` pages
++    let hostname = parseURL(currentUrl).hostname || parseURL(currentUrl).protocol;
++    let customColors = await asyncStorage.getItem("gridInspectorHostColors") || {};
+ 
+     // Get all the GridFront from the server if no gridFronts were provided.
+     let gridFronts;
+     try {
+       gridFronts = await this.layoutInspector.getGrids(this.walker.rootNode);
+     } catch (e) {
+       // This call might fail if called asynchrously after the toolbox is finished
+       // closing.
+       return;
+     }
+ 
+     // Log how many CSS Grid elements DevTools sees.
+     if (gridFronts.length > 0 &&
+-        this.inspector.target.url != this.inspector.previousURL) {
++        currentUrl != this.inspector.previousURL) {
+       this.telemetry.log(CSS_GRID_COUNT_HISTOGRAM_ID, gridFronts.length);
+-      this.inspector.previousURL = this.inspector.target.url;
++      this.inspector.previousURL = currentUrl;
+     }
+ 
+     let grids = [];
+     for (let i = 0; i < gridFronts.length; i++) {
+       let grid = gridFronts[i];
+ 
+       let nodeFront = grid.containerNodeFront;
+ 
+@@ -320,32 +331,34 @@ class GridInspector {
+           nodeFront = await this.walker.getNodeFromActor(grid.actorID, ["containerEl"]);
+         } catch (e) {
+           // This call might fail if called asynchrously after the toolbox is finished
+           // closing.
+           return;
+         }
+       }
+ 
++      let colorForHost = customColors[hostname] ? customColors[hostname][i] : undefined;
+       let fallbackColor = GRID_COLORS[i % GRID_COLORS.length];
+-      let color = this.getInitialGridColor(nodeFront, fallbackColor);
++      let color = this.getInitialGridColor(nodeFront, colorForHost, fallbackColor);
+ 
+       grids.push({
+         id: i,
+         actorID: grid.actorID,
+         color,
+         direction: grid.direction,
+         gridFragments: grid.gridFragments,
+         highlighted: nodeFront == this.highlighters.gridHighlighterShown,
+         nodeFront,
+         writingMode: grid.writingMode,
+       });
+     }
+ 
+     this.store.dispatch(updateGrids(grids));
++    this.inspector.emit("grid-panel-updated");
+   }
+ 
+   /**
+    * Handler for "grid-highlighter-shown" and "grid-highlighter-hidden" events emitted
+    * from the HighlightersOverlay. Updates the NodeFront's grid highlighted state.
+    *
+    * @param  {Event} event
+    *         Event that was triggered.
+@@ -450,26 +463,40 @@ class GridInspector {
+    * Handler for a change in the grid overlay color picker for a grid container.
+    *
+    * @param  {NodeFront} node
+    *         The NodeFront of the grid container element for which the grid color is
+    *         being updated.
+    * @param  {String} color
+    *         A hex string representing the color to use.
+    */
+-  onSetGridOverlayColor(node, color) {
++  async onSetGridOverlayColor(node, color) {
+     this.store.dispatch(updateGridColor(node, color));
+     let { grids } = this.store.getState();
++    let currentUrl = this.inspector.target.url;
++    // Get the hostname, if there is no hostname, fall back on protocol
++    // ex: `data:` uri, and `about:` pages
++    let hostname = parseURL(currentUrl).hostname || parseURL(currentUrl).protocol;
++    let customGridColors = await asyncStorage.getItem("gridInspectorHostColors") || {};
+ 
+-    // If the grid for which the color was updated currently has a highlighter, update
+-    // the color.
+     for (let grid of grids) {
+-      if (grid.nodeFront === node && grid.highlighted) {
+-        let highlighterSettings = this.getGridHighlighterSettings(node);
+-        this.showGridHighlighter(node, highlighterSettings);
++      if (grid.nodeFront === node) {
++        if (!customGridColors[hostname]) {
++          customGridColors[hostname] = [];
++        }
++        // Update the custom color for the grid in this position.
++        customGridColors[hostname][grid.id] = color;
++        await asyncStorage.setItem("gridInspectorHostColors", customGridColors);
++
++        // If the grid for which the color was updated currently has a highlighter, update
++        // the color.
++        if (grid.highlighted) {
++          let highlighterSettings = this.getGridHighlighterSettings(node);
++          this.showGridHighlighter(node, highlighterSettings);
++        }
+       }
+     }
+   }
+ 
+   /**
+    * Highlights the grid area in the CSS Grid Highlighter for the given grid.
+    *
+    * @param  {NodeFront} node
+diff --git a/devtools/client/inspector/grids/test/browser.ini b/devtools/client/inspector/grids/test/browser.ini
+--- a/devtools/client/inspector/grids/test/browser.ini
++++ b/devtools/client/inspector/grids/test/browser.ini
+@@ -28,9 +28,10 @@ support-files =
+ [browser_grids_grid-list-toggle-single-grid.js]
+ [browser_grids_grid-outline-cannot-show-outline.js]
+ [browser_grids_grid-outline-highlight-area.js]
+ [browser_grids_grid-outline-highlight-cell.js]
+ [browser_grids_grid-outline-selected-grid.js]
+ [browser_grids_grid-outline-updates-on-grid-change.js]
+ [browser_grids_grid-outline-writing-mode.js]
+ [browser_grids_highlighter-setting-rules-grid-toggle.js]
++[browser_grids_persist-color-palette.js]
+ [browser_grids_restored-after-reload.js]
+diff --git a/devtools/client/inspector/grids/test/browser_grids_persist-color-palette.js b/devtools/client/inspector/grids/test/browser_grids_persist-color-palette.js
+new file mode 100644
+--- /dev/null
++++ b/devtools/client/inspector/grids/test/browser_grids_persist-color-palette.js
+@@ -0,0 +1,48 @@
++/* Any copyright is dedicated to the Public Domain.
++ http://creativecommons.org/publicdomain/zero/1.0/ */
++
++"use strict";
++
++// Tests that the when a custom color has been previously set, we initialize
++// the grid with that color.
++
++const TEST_URI = `
++  <style type='text/css'>
++    #grid {
++      display: grid;
++    }
++  </style>
++  <div id="grid">
++    <div class="cell1">cell1</div>
++    <div class="cell2">cell2</div>
++  </div>
++`;
++
++add_task(async function () {
++  await addTab("data:text/html;charset=utf-8," + encodeURIComponent(TEST_URI));
++  let { inspector, gridInspector, toolbox } = await openLayoutView();
++  let { document: doc } = gridInspector;
++  let { store } = inspector;
++  let cPicker = gridInspector.getSwatchColorPickerTooltip();
++  let swatch = doc.querySelector(".grid-color-swatch");
++
++  info("Scrolling into view of the #grid color swatch.");
++  swatch.scrollIntoView();
++
++  info("Opening the color picker by clicking on the #grid color swatch.");
++  let onColorPickerReady = cPicker.once("ready");
++  swatch.click();
++  await onColorPickerReady;
++
++  await simulateColorPickerChange(cPicker, [51, 48, 0, 1]);
++
++  info("Closing the toolbox.");
++  await toolbox.destroy();
++  info("Open the toolbox again.");
++  await openLayoutView();
++
++  info("Check that the previously set custom color is used.");
++  is(swatch.style.backgroundColor, "rgb(51, 48, 0)",
++    "The color swatch's background is correct.");
++  is(store.getState().grids[0].color, "#333000", "The grid color state is correct.");
++});
+diff --git a/devtools/client/inspector/grids/test/head.js b/devtools/client/inspector/grids/test/head.js
+--- a/devtools/client/inspector/grids/test/head.js
++++ b/devtools/client/inspector/grids/test/head.js
+@@ -16,16 +16,17 @@ Services.scriptloader.loadSubScript(
+   "chrome://mochitests/content/browser/devtools/client/shared/test/shared-redux-head.js",
+   this);
+ 
+ Services.prefs.setIntPref("devtools.toolbox.footer.height", 350);
+ registerCleanupFunction(() => {
+   Services.prefs.clearUserPref("devtools.toolbox.footer.height");
+ });
+ 
++const asyncStorage = require("devtools/shared/async-storage");
+ const HIGHLIGHTER_TYPE = "CssGridHighlighter";
+ 
+ /**
+  * Simulate a color change in a given color picker tooltip.
+  *
+  * @param  {Spectrum|ColorWidget} colorPicker
+  *         The color picker widget.
+  * @param  {Array} newRgba
+@@ -35,8 +36,12 @@ var simulateColorPickerChange = Task.asy
+   info("Getting the spectrum colorpicker object");
+   let spectrum = yield colorPicker.spectrum;
+   info("Setting the new color");
+   spectrum.rgb = newRgba;
+   info("Applying the change");
+   spectrum.updateUI();
+   spectrum.onChange();
+ });
++
++registerCleanupFunction(async function () {
++  await asyncStorage.removeItem("gridInspectorHostColors");
++});
+diff --git a/devtools/client/inspector/test/shared-head.js b/devtools/client/inspector/test/shared-head.js
+--- a/devtools/client/inspector/test/shared-head.js
++++ b/devtools/client/inspector/test/shared-head.js
+@@ -49,18 +49,22 @@ var openInspectorSidebarTab = Task.async
+   let {toolbox, inspector, testActor} = yield openInspector();
+ 
+   info("Selecting the " + id + " sidebar");
+ 
+   let onSidebarSelect = inspector.sidebar.once("select");
+   if (id === "computedview" || id === "layoutview") {
+     // The layout and computed views should wait until the box-model widget is ready.
+     let onBoxModelViewReady = inspector.once("boxmodel-view-updated");
++    // The layout view also needs to wait for the grid panel to be fully updated.
++    let onGridPanelReady = id === "layoutview" ?
++      inspector.once("grid-panel-updated") : Promise.resolve();
+     inspector.sidebar.select(id);
+     yield onBoxModelViewReady;
++    yield onGridPanelReady;
+   } else {
+     inspector.sidebar.select(id);
+   }
+   yield onSidebarSelect;
+ 
+   return {
+     toolbox,
+     inspector,

+ 198 - 0
frg/work-js/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
frg/work-js/mozilla-release/patches/1401953-59a1.patch

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

+ 137 - 0
frg/work-js/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();
+-});

+ 39 - 0
frg/work-js/mozilla-release/patches/1402485-59a1.patch

@@ -0,0 +1,39 @@
+# HG changeset patch
+# User SagarB <sagarbharadwaj50@gmail.com>
+# Date 1512912372 -19800
+# Node ID aa7c634fd552e5023a52cab42e81255a5fa0383f
+# Parent  9bfe084a7d2bd6e59302aa9e1e8e78c13f25e08a
+Bug 1402485 - Remove Delete all Session cookies option for non cookie staorage r=miker
+Borrowed code from onTreePopupShowing into onTablePopupShowing
+
+MozReview-Commit-ID: 1IotAfqwlpg
+
+diff --git a/devtools/client/storage/ui.js b/devtools/client/storage/ui.js
+--- a/devtools/client/storage/ui.js
++++ b/devtools/client/storage/ui.js
+@@ -1092,16 +1092,25 @@ StorageUI.prototype = {
+     if (this.actorSupportsAddItem) {
+       this._tablePopupAddItem.hidden = false;
+       this._tablePopupAddItem.setAttribute("label",
+         L10N.getFormatStr("storage.popupMenu.addItemLabel"));
+     } else {
+       this._tablePopupAddItem.hidden = true;
+     }
+ 
++    let showDeleteAllSessionCookies = false;
++    if (this.actorSupportsRemoveAllSessionCookies) {
++      if (type === "cookies" && selectedItem.length === 2) {
++        showDeleteAllSessionCookies = true;
++      }
++    }
++
++    this._tablePopupDeleteAllSessionCookies.hidden = !showDeleteAllSessionCookies;
++
+     if (type === "cookies") {
+       let host = addEllipsis(data.host);
+ 
+       this._tablePopupDeleteAllFrom.hidden = false;
+       this._tablePopupDeleteAllFrom.setAttribute("label",
+         L10N.getFormatStr("storage.popupMenu.deleteAllFromLabel", host));
+     } else {
+       this._tablePopupDeleteAllFrom.hidden = true;

+ 258 - 0
frg/work-js/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
frg/work-js/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
frg/work-js/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");
+-}

+ 141 - 0
frg/work-js/mozilla-release/patches/1403334-1-60a1.patch

@@ -0,0 +1,141 @@
+# HG changeset patch
+# User Liam Hodgins <canada8715@gmail.com>
+# Date 1517457051 18000
+# Node ID 1afdba933156fc334921e7924e5edca02050e295
+# Parent  ecc852b1310b839aabe4a1f42b2e6c1dc4057e2a
+Bug 1403334 - Make sure the property value overflow is indented. r=gl
+
+diff --git a/devtools/client/themes/rules.css b/devtools/client/themes/rules.css
+--- a/devtools/client/themes/rules.css
++++ b/devtools/client/themes/rules.css
+@@ -154,17 +154,17 @@
+ }
+ 
+ .ruleview-expandable-container {
+   display: block;
+ }
+ 
+ .ruleview-namecontainer {
+   cursor: text;
+-  padding-left: 3px;
++  margin-left: -25px;
+ }
+ 
+ .ruleview-propertyvaluecontainer {
+   cursor: text;
+   padding-right: 5px;
+ }
+ 
+ .ruleview-propertyvaluecontainer a {
+@@ -246,30 +246,24 @@
+   color: inherit;
+   border: none;
+   margin: 4px 0;
+   padding: 3px 4px 2px 4px;
+   line-height: inherit;
+   min-height: 0;
+ }
+ 
+-:root[platform="win"] .ruleview-header,
+-:root[platform="linux"] .ruleview-header {
+-  margin-top: 4px;
+-}
+-
+ .ruleview-expandable-header {
+   cursor: pointer;
+ }
+ 
+ .ruleview-expandable-header:hover {
+   background-color: var(--theme-toolbar-background-hover);
+ }
+ 
+-
+ .ruleview-rule-pseudo-element {
+   padding-left:20px;
+   border-left: solid 10px;
+ }
+ 
+ .ruleview-rule {
+   border-bottom: 1px solid var(--theme-splitter-color);
+   padding: 2px 4px;
+@@ -379,16 +373,22 @@
+ }
+ 
+ .ruleview-propertylist {
+   list-style: none;
+   padding: 0;
+   margin: 0;
+ }
+ 
++.ruleview-enableproperty {
++  position: relative;
++  float: left;
++  left: -28px;
++}
++
+ .ruleview-rule:not(:hover) .ruleview-enableproperty {
+   visibility: hidden;
+ }
+ 
+ .ruleview-expander {
+   vertical-align: middle;
+ }
+ 
+@@ -398,37 +398,33 @@
+ 
+ .ruleview-rule .ruleview-expander.theme-twisty:dir(rtl) {
+   /* for preventing .theme-twisty's wrong direction in rtl; Bug 1296648 */
+   transform: none;
+ }
+ 
+ .ruleview-newproperty {
+   /* (enable checkbox width: 12px) + (expander width: 15px) */
+-  margin-inline-start: 27px;
++  margin-inline-start: -10px;
+ }
+ 
+ .ruleview-namecontainer,
+ .ruleview-propertyvaluecontainer,
+ .ruleview-propertyname,
+ .ruleview-propertyvalue {
+   text-decoration: inherit;
+ }
+ 
+ .ruleview-computedlist {
+   list-style: none;
+   padding: 0;
+ }
+ 
+-.ruleview-computed {
+-  margin-inline-start: 26px;
+-}
+-
+ .ruleview-overridden-items {
+-  margin: 0px 0px 0px 2px;
++  margin-inline-start: -25px;
+   list-style: none;
+   line-height: 1.5em;
+ }
+ 
+ .ruleview-overridden-item {
+   position: relative;
+ }
+ 
+@@ -558,16 +554,17 @@
+ .theme-firebug .styleinspector-propertyeditor {
+   border: 1px solid var(--theme-splitter-color);
+   box-shadow: 0 2px 6px rgba(0, 0, 0, 0.5);
+ }
+ 
+ .ruleview-property {
+   border-left: 3px solid transparent;
+   clear: right;
++  padding-left: 28px;
+ }
+ 
+ .ruleview-propertycontainer  > * {
+   vertical-align: middle;
+ }
+ 
+ .ruleview-property[dirty] {
+   border-left-color: var(--theme-highlight-green);

+ 31 - 0
frg/work-js/mozilla-release/patches/1403334-2-60a1.patch

@@ -0,0 +1,31 @@
+# HG changeset patch
+# User Julian Descottes <jdescottes@mozilla.com>
+# Date 1517995190 -3600
+# Node ID 2fde9552e7db52ce8e5008bf03b44af395e2f389
+# Parent  1a6ca5a14dc7324bec17278cfebd8589e760834d
+Bug 1403334 - followup: remove leftover comment from 1afdba933156;r=me
+
+
+MozReview-Commit-ID: 3JRvyATgpAz
+
+diff --git a/devtools/client/themes/rules.css b/devtools/client/themes/rules.css
+--- a/devtools/client/themes/rules.css
++++ b/devtools/client/themes/rules.css
+@@ -397,17 +397,16 @@
+ }
+ 
+ .ruleview-rule .ruleview-expander.theme-twisty:dir(rtl) {
+   /* for preventing .theme-twisty's wrong direction in rtl; Bug 1296648 */
+   transform: none;
+ }
+ 
+ .ruleview-newproperty {
+-  /* (enable checkbox width: 12px) + (expander width: 15px) */
+   margin-inline-start: -10px;
+ }
+ 
+ .ruleview-namecontainer,
+ .ruleview-propertyvaluecontainer,
+ .ruleview-propertyname,
+ .ruleview-propertyvalue {
+   text-decoration: inherit;

+ 67 - 0
frg/work-js/mozilla-release/patches/1403389-58a1.patch

@@ -0,0 +1,67 @@
+# HG changeset patch
+# User abhinav <abhinav.koppula@gmail.com>
+# Date 1506589682 -19800
+# Node ID 41dcdc81b51c2a1f778e166e62ef67885a3ffcc0
+# Parent  63625a378de7886c6e1ea6d53f6f493e87830c20
+Bug 1403389 - Using double arrow splitter instead of single arrow splitter in dev-tools panels. r=jdescottes
+
+MozReview-Commit-ID: 51mACt8sfji
+
+diff --git a/devtools/client/themes/splitters.css b/devtools/client/themes/splitters.css
+--- a/devtools/client/themes/splitters.css
++++ b/devtools/client/themes/splitters.css
+@@ -52,28 +52,28 @@
+     var(--devtools-splitter-bottom-width) + 1px);
+ 
+   border-top-width: var(--devtools-splitter-top-width);
+   border-bottom-width: var(--devtools-splitter-bottom-width);
+ 
+   margin-top: calc(-1 * var(--devtools-splitter-top-width) - 1px);
+   margin-bottom: calc(-1 * var(--devtools-splitter-bottom-width));
+ 
+-  cursor: n-resize;
++  cursor: ns-resize;
+ }
+ 
+ .devtools-side-splitter {
+   min-width: calc(var(--devtools-splitter-inline-start-width) +
+     var(--devtools-splitter-inline-end-width) + 1px);
+ 
+   border-inline-start-width: var(--devtools-splitter-inline-start-width);
+   border-inline-end-width: var(--devtools-splitter-inline-end-width);
+ 
+   margin-inline-start: calc(-1 * var(--devtools-splitter-inline-start-width) - 1px);
+   margin-inline-end: calc(-1 * var(--devtools-splitter-inline-end-width));
+ 
+-  cursor: e-resize;
++  cursor: ew-resize;
+ }
+ 
+ .devtools-horizontal-splitter.disabled,
+ .devtools-side-splitter.disabled {
+   pointer-events: none;
+ }
+diff --git a/devtools/client/themes/widgets.css b/devtools/client/themes/widgets.css
+--- a/devtools/client/themes/widgets.css
++++ b/devtools/client/themes/widgets.css
+@@ -89,18 +89,18 @@
+ 
+     /* Reset the vertical splitter styles */
+     min-width: 0;
+     border-inline-end-width: 0;
+     border-inline-start-width: 0;
+     margin-inline-end: 0;
+     margin-inline-start: 0;
+ 
+-    /* In some edge case the cursor is not changed to n-resize */
+-    cursor: n-resize;
++    /* In some edge case the cursor is not changed to ns-resize */
++    cursor: ns-resize;
+   }
+ 
+   .devtools-responsive-container > .devtools-sidebar-tabs:not(.pane-collapsed) {
+     /* When the panel is collapsed min/max height should not be applied because
+        collapsing relies on negative margins, which implies constant height. */
+     min-height: 35vh;
+     max-height: 75vh;
+   }

+ 101 - 0
frg/work-js/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
frg/work-js/mozilla-release/patches/1403450-60a1.patch

@@ -2,7 +2,7 @@
 # User Nicolas Chevobbe <nchevobbe@mozilla.com>
 # User Nicolas Chevobbe <nchevobbe@mozilla.com>
 # Date 1518505044 -3600
 # Date 1518505044 -3600
 # Node ID 0b6f87dae8adf7fc137763af4196c6217b2fedf5
 # Node ID 0b6f87dae8adf7fc137763af4196c6217b2fedf5
-# Parent  0cac749aa070fbf180dfa6ff9e40edab26327782
+# Parent  6b2f63be296de5dffe05203bd98c902c86bee0d6
 Bug 1403450 - Add test cases from browser_webconsole_repeated_messages_accuracy.js to mocha; r=jdescottes.
 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,
 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
 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
 --- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
 +++ b/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-mutation.html
+   test-network-exceptions.html
    test-network-request.html
    test-network-request.html
    test-network.html
    test-network.html
    test-observe-http-ajax.html
    test-observe-http-ajax.html
    test-own-console.html
    test-own-console.html
    test-property-provider.html
    test-property-provider.html
+   test-reopen-closed-tab.html
 -  test-repeated-messages.html
 -  test-repeated-messages.html
    test-result-format-as-string.html
    test-result-format-as-string.html
    test-sourcemap-error-01.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.html
    test-sourcemap-error-02.js
    test-sourcemap-error-02.js
    test-stacktrace-location-debugger-link.html
    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]
  [browser_webconsole_reopen_closed_tab.js]
- skip-if = true # Bug 1408947
  [browser_webconsole_repeat_different_objects.js]
  [browser_webconsole_repeat_different_objects.js]
 -[browser_webconsole_repeated_messages_accuracy.js]
 -[browser_webconsole_repeated_messages_accuracy.js]
 -skip-if = true #       Bug 1403450
 -skip-if = true #       Bug 1403450
  [browser_webconsole_sandbox_update_after_navigation.js]
  [browser_webconsole_sandbox_update_after_navigation.js]
  [browser_webconsole_script_errordoc_urls.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_scroll.js]
  [browser_webconsole_select_all.js]
  [browser_webconsole_select_all.js]
- skip-if = true #       Bug 1404359
  [browser_webconsole_show_subresource_security_errors.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]
 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
 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
 --- 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
 +++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_repeat_different_objects.js

+ 131 - 0
frg/work-js/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
frg/work-js/mozilla-release/patches/1403458-58a1.patch

@@ -2,7 +2,7 @@
 # User Nicolas Chevobbe <nchevobbe@mozilla.com>
 # User Nicolas Chevobbe <nchevobbe@mozilla.com>
 # Date 1508834729 -7200
 # Date 1508834729 -7200
 # Node ID 1f415318428ed52e300b9f2c5c41064dec1dea68
 # Node ID 1f415318428ed52e300b9f2c5c41064dec1dea68
-# Parent  b959440605b29e5277116834ef0c609be1249abe
+# Parent  8e4352134bcc15f249a5a36a0712e431213d523e
 Bug 1403458 - Convert browser_webconsole_assert.js to a backend test; r=bgrins.
 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,
 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-filters.html
    test-console-group.html
    test-console-group.html
    test-console-output-02.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_no_input_change_and_tab_key_pressed.js]
  [browser_jsterm_popup_close_on_tab_switch.js]
  [browser_jsterm_popup_close_on_tab_switch.js]
  [browser_jsterm_popup.js]
  [browser_jsterm_popup.js]
@@ -43,14 +43,14 @@ diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browse
  tags = mcb
  tags = mcb
 -[browser_webconsole_assert.js]
 -[browser_webconsole_assert.js]
 -skip-if = true #       Bug 1403458
 -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]
  [browser_webconsole_autocomplete_crossdomain_iframe.js]
  skip-if = true # Bug 1408919
  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
 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
 deleted file mode 100644
 --- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_assert.js
 --- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_assert.js

+ 91 - 0
frg/work-js/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")
+ });

+ 31 - 0
frg/work-js/mozilla-release/patches/1404197-58a1.patch

@@ -0,0 +1,31 @@
+# HG changeset patch
+# User J. Ryan Stinnett <jryans@gmail.com>
+# Date 1507093631 25200
+# Node ID a0feee4c1123a2242362e6f2c4b7d5cc82eef886
+# Parent  5509f6093b0e926d539e55151b8b3893102ee642
+Bug 1404197 - Disable RDM telem test on Windows. r=me
+
+MozReview-Commit-ID: JndqAQ9LfoO
+
+diff --git a/devtools/client/shared/test/browser.ini b/devtools/client/shared/test/browser.ini
+--- a/devtools/client/shared/test/browser.ini
++++ b/devtools/client/shared/test/browser.ini
+@@ -168,17 +168,17 @@ skip-if = e10s # Test intermittently fai
+ [browser_theme.js]
+ [browser_tableWidget_basic.js]
+ [browser_tableWidget_keyboard_interaction.js]
+ [browser_tableWidget_mouse_interaction.js]
+ [browser_telemetry_button_eyedropper.js]
+ [browser_telemetry_button_paintflashing.js]
+ skip-if = e10s # Bug 937167 - e10s paintflashing
+ [browser_telemetry_button_responsive.js]
+-skip-if = !e10s # RDM only works for remote tabs
++skip-if = !e10s || os == "win" # RDM only works for remote tabs, Win: bug 1404197
+ [browser_telemetry_button_scratchpad.js]
+ [browser_telemetry_sidebar.js]
+ [browser_telemetry_toolbox.js]
+ [browser_telemetry_toolboxtabs_canvasdebugger.js]
+ [browser_telemetry_toolboxtabs_inspector.js]
+ [browser_telemetry_toolboxtabs_jsdebugger.js]
+ [browser_telemetry_toolboxtabs_jsprofiler.js]
+ [browser_telemetry_toolboxtabs_netmonitor.js]

+ 175 - 0
frg/work-js/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
frg/work-js/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
frg/work-js/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
frg/work-js/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
frg/work-js/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
frg/work-js/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
frg/work-js/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
frg/work-js/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
frg/work-js/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
frg/work-js/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
frg/work-js/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
frg/work-js/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
frg/work-js/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
frg/work-js/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
frg/work-js/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
frg/work-js/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
frg/work-js/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
frg/work-js/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
frg/work-js/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
frg/work-js/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
frg/work-js/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
frg/work-js/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
frg/work-js/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
frg/work-js/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
frg/work-js/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
frg/work-js/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
frg/work-js/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
frg/work-js/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
frg/work-js/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
frg/work-js/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
frg/work-js/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
frg/work-js/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
frg/work-js/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);
+ });

+ 133 - 0
frg/work-js/mozilla-release/patches/1405983-1-58a1.patch

@@ -0,0 +1,133 @@
+# HG changeset patch
+# User Daisuke Akatsuka <dakatsuka@mozilla.com>
+# Date 1507600282 -32400
+# Node ID c2d9bd9f5561914c84f584dab3d23ccf669f8674
+# Parent  5509f6093b0e926d539e55151b8b3893102ee642
+Bug 1405983 - Part 1: Display delay area in summary graph as 0 if fill is none or forwards. r=pbro
+
+MozReview-Commit-ID: 6PRlPThxRw8
+
+diff --git a/devtools/client/animationinspector/graph-helper.js b/devtools/client/animationinspector/graph-helper.js
+--- a/devtools/client/animationinspector/graph-helper.js
++++ b/devtools/client/animationinspector/graph-helper.js
+@@ -351,23 +351,30 @@ SummaryGraphHelper.prototype = {
+    * Also, allows null value. In case of null, this graph helper shapes graph using
+    * computed timing progress.
+    * @param {Object} keyframes - Should have offset and easing, or null.
+    */
+   setKeyframes: function (keyframes) {
+     let frames = null;
+     if (keyframes) {
+       // Create new keyframes for opacity as computed style.
++      // The reason why we use computed value instead of computed timing progress is to
++      // include the easing in keyframes as well. Although the computed timing progress
++      // is not affected by the easing in keyframes at all, computed value reflects that.
+       frames = keyframes.map(keyframe => {
+         return {
+           opacity: keyframe.offset,
+           offset: keyframe.offset,
+           easing: keyframe.easing
+         };
+       });
++
++      // Set the underlying opacity to zero so that if we sample the animation's output
++      // during the delay phase and it is not filling backwards, we get zero.
++      this.targetEl.style.opacity = 0;
+     }
+     this.animation.effect.setKeyframes(frames);
+     this.hasFrames = !!frames;
+   },
+ 
+   /*
+    * Set animation behavior.
+    * In Animation::SetCurrentTime spec, even if current time of animation is over
+diff --git a/devtools/client/animationinspector/test/browser_animation_summarygraph_for_multiple_easings.js b/devtools/client/animationinspector/test/browser_animation_summarygraph_for_multiple_easings.js
+--- a/devtools/client/animationinspector/test/browser_animation_summarygraph_for_multiple_easings.js
++++ b/devtools/client/animationinspector/test/browser_animation_summarygraph_for_multiple_easings.js
+@@ -17,17 +17,16 @@ const TEST_CASES = {
+   "no-easing": {
+     expectedKeyframeEasingGraphs: [
+       [
+         { x: 0, y: 0 },
+         { x: 25000, y: 0.25 },
+         { x: 50000, y: 0.5 },
+         { x: 75000, y: 0.75 },
+         { x: 99000, y: 0.99 },
+-        { x: 100000, y: 1 },
+         { x: 100000, y: 0 },
+       ]
+     ]
+   },
+   "effect-easing": {
+     expectedEffectEasingGraph: [
+       { x: 0, y: 0 },
+       { x: 19999, y: 0.0 },
+@@ -59,17 +58,16 @@ const TEST_CASES = {
+   },
+   "keyframe-easing": {
+     expectedKeyframeEasingGraphs: [
+       [
+         { x: 0, y: 0 },
+         { x: 49999, y: 0.0 },
+         { x: 50000, y: 0.5 },
+         { x: 99999, y: 0.5 },
+-        { x: 100000, y: 1 },
+         { x: 100000, y: 0 },
+       ]
+     ]
+   },
+   "both-easing": {
+     expectedEffectEasingGraph: [
+       { x: 0, y: 0 },
+       { x: 9999, y: 0.0 },
+@@ -102,25 +100,23 @@ const TEST_CASES = {
+         { x: 20000, y: 0.2 },
+         { x: 39999, y: 0.2 },
+         { x: 40000, y: 0.4 },
+         { x: 59999, y: 0.4 },
+         { x: 60000, y: 0.6 },
+         { x: 79999, y: 0.6 },
+         { x: 80000, y: 0.8 },
+         { x: 99999, y: 0.8 },
+-        { x: 100000, y: 1 },
+         { x: 100000, y: 0 },
+       ],
+       [
+         { x: 0, y: 0 },
+         { x: 49999, y: 0.0 },
+         { x: 50000, y: 0.5 },
+         { x: 99999, y: 0.5 },
+-        { x: 100000, y: 1 },
+         { x: 100000, y: 0 },
+       ]
+     ]
+   }
+ };
+ 
+ add_task(function* () {
+   yield addTab(URL_ROOT + "doc_multiple_easings.html");
+diff --git a/devtools/client/animationinspector/test/browser_animation_timeline_short_duration.js b/devtools/client/animationinspector/test/browser_animation_timeline_short_duration.js
+--- a/devtools/client/animationinspector/test/browser_animation_timeline_short_duration.js
++++ b/devtools/client/animationinspector/test/browser_animation_timeline_short_duration.js
+@@ -77,19 +77,18 @@ function checkSummaryGraph(el, state, is
+       // The test animation is not 'forwards' fill-mode.
+       // Therefore, the y of second last path segment will be 0.
+       const secondLastPathSeg =
+         pathSegList.getItem(pathSegList.numberOfItems - 3);
+       is(secondLastPathSeg.x, endX,
+          `The x of second last segment should be ${ endX }`);
+       // We use computed style of 'opacity' to create summary graph.
+       // So, if currentTime is same to the duration, although progress is null
+-      // opacity is 1.
+-      const expectedY =
+-        state.iterationCount && expectedIterationCount === index + 1 ? 1 : 0;
++      // opacity is 0.
++      const expectedY = 0;
+       is(secondLastPathSeg.y, expectedY,
+          `The y of second last segment should be ${ expectedY }`);
+ 
+       const lastPathSeg = pathSegList.getItem(pathSegList.numberOfItems - 2);
+       is(lastPathSeg.x, endX, `The x of last segment should be ${ endX }`);
+       is(lastPathSeg.y, 0, "The y of last segment should be 0");
+ 
+       const closePathSeg = pathSegList.getItem(pathSegList.numberOfItems - 1);

+ 165 - 0
frg/work-js/mozilla-release/patches/1405983-2-58a1.patch

@@ -0,0 +1,165 @@
+# HG changeset patch
+# User Daisuke Akatsuka <dakatsuka@mozilla.com>
+# Date 1507600287 -32400
+# Node ID 34563d832147afe87b369f49f555e0ccc8268aa4
+# Parent  a0ab31fb3b8019e9309481ccff6a210ed0e8a277
+Bug 1405983 - Part 2: Modify tests for delay. r=pbro
+
+MozReview-Commit-ID: 6ByuW2Q33Vf
+
+diff --git a/devtools/client/animationinspector/test/browser_animation_timeline_iterationStart.js b/devtools/client/animationinspector/test/browser_animation_timeline_iterationStart.js
+--- a/devtools/client/animationinspector/test/browser_animation_timeline_iterationStart.js
++++ b/devtools/client/animationinspector/test/browser_animation_timeline_iterationStart.js
+@@ -43,26 +43,46 @@ function checkAnimationTooltip(el, {iter
+   }).replace(".", "\\.");
+   let iterationStartString = iterationStart.toString().replace(".", "\\.");
+ 
+   let regex = new RegExp("Iteration start: " + iterationStartString +
+                          " \\(" + iterationStartTimeString + "s\\)");
+   ok(title.match(regex), "The tooltip shows the expected iteration start");
+ }
+ 
+-function checkProgressAtStartingTime(el, { iterationStart }) {
++function checkProgressAtStartingTime(el, { delay, iterationStart }) {
+   info("Check the progress of starting time");
+   const groupEls = el.querySelectorAll("svg g");
+   groupEls.forEach(groupEl => {
+     const pathEl = groupEl.querySelector(".iteration-path");
+     const pathSegList = pathEl.pathSegList;
+     const pathSeg = pathSegList.getItem(1);
+     const progress = pathSeg.y;
+     is(progress, iterationStart % 1,
+        `The progress at starting point should be ${ iterationStart % 1 }`);
++
++    if (delay) {
++      const delayPathEl = groupEl.querySelector(".delay-path");
++      const delayPathSegList = delayPathEl.pathSegList;
++      const delayStartingPathSeg = delayPathSegList.getItem(1);
++      const delayEndingPathSeg =
++        delayPathSegList.getItem(delayPathSegList.numberOfItems - 2);
++      const startingX = 0;
++      const endingX = delay;
++      is(delayStartingPathSeg.x, startingX,
++         `The x of starting point should be ${ startingX }`);
++      is(delayStartingPathSeg.y, progress,
++         "The y of starting point should be same to starting point of iteration-path "
++         + progress);
++      is(delayEndingPathSeg.x, endingX,
++         `The x of ending point should be ${ endingX }`);
++      is(delayStartingPathSeg.y, progress,
++         "The y of ending point should be same to starting point of iteration-path "
++         + progress);
++    }
+   });
+ }
+ 
+ function checkKeyframeOffset(timeBlockEl, frameEl, {iterationStart}) {
+   info("Check that the first keyframe is offset correctly");
+ 
+   let start = getKeyframeOffset(frameEl);
+   is(start, 0, "The frame offset for iteration start");
+diff --git a/devtools/client/animationinspector/test/browser_animation_timeline_shows_delay.js b/devtools/client/animationinspector/test/browser_animation_timeline_shows_delay.js
+--- a/devtools/client/animationinspector/test/browser_animation_timeline_shows_delay.js
++++ b/devtools/client/animationinspector/test/browser_animation_timeline_shows_delay.js
+@@ -74,26 +74,36 @@ function checkPath(animationEl, state) {
+ 
+     // Check delay path coordinates.
+     const pathSegList = delayPathEl.pathSegList;
+     const startingPathSeg = pathSegList.getItem(0);
+     const endingPathSeg = pathSegList.getItem(pathSegList.numberOfItems - 2);
+     if (state.delay < 0) {
+       ok(delayPathEl.classList.contains("negative"),
+          "The delay path should have 'negative' class");
++      const expectedY = 0;
+       const startingX = state.delay;
+       const endingX = 0;
+       is(startingPathSeg.x, startingX,
+          `The x of starting point should be ${ startingX }`);
++      is(startingPathSeg.y, expectedY,
++         `The y of starting point should be ${ expectedY }`);
+       is(endingPathSeg.x, endingX,
+          `The x of ending point should be ${ endingX }`);
++      is(endingPathSeg.y, expectedY,
++         `The y of ending point should be ${ expectedY }`);
+     } else {
+       ok(!delayPathEl.classList.contains("negative"),
+          "The delay path should not have 'negative' class");
++      const expectedY = 0;
+       const startingX = 0;
+       const endingX = state.delay;
+       is(startingPathSeg.x, startingX,
+          `The x of starting point should be ${ startingX }`);
++      is(startingPathSeg.y, expectedY,
++         `The y of starting point should be ${ expectedY }`);
+       is(endingPathSeg.x, endingX,
+          `The x of ending point should be ${ endingX }`);
++      is(endingPathSeg.y, expectedY,
++         `The y of ending point should be ${ expectedY }`);
+     }
+   });
+ }
+diff --git a/devtools/client/animationinspector/test/doc_script_animation.html b/devtools/client/animationinspector/test/doc_script_animation.html
+--- a/devtools/client/animationinspector/test/doc_script_animation.html
++++ b/devtools/client/animationinspector/test/doc_script_animation.html
+@@ -15,22 +15,29 @@
+     background: green;
+   }
+ 
+   #target3 {
+     width: 50px;
+     height: 50px;
+     background: blue;
+   }
++
++  #target4 {
++    width: 50px;
++    height: 50px;
++    background: pink;
++  }
+   </style>
+ </head>
+ <body>
+   <div id="target1"></div>
+   <div id="target2"></div>
+   <div id="target3"></div>
++  <div id="target4"></div>
+ 
+   <script>
+     /* globals KeyframeEffect, Animation */
+     "use strict";
+ 
+     let animations = [{
+       id: "target1",
+       frames: [{ opacity: 0, offset: 0 }, { opacity: 1, offset: 1 }],
+@@ -53,19 +60,31 @@
+       id: "target3",
+       frames: [{ opacity: 0, offset: 0 }, { opacity: 1, offset: 1 }],
+       timing: {
+         duration: 100,
+         iterations: 1.5,
+         iterationStart: 2.5,
+         fill: "both"
+       }
++    }, {
++      id: "target4",
++      frames: [{ transform: "translate(0px)", offset: 0 },
++               { transform: "translate(100px)", offset: 1 }],
++      timing: {
++        duration: 100,
++        iterations: 2,
++        iterationStart: 0.5,
++        delay: 10,
++        fill: "both"
++      }
+     }];
+ 
+     for (let {id, frames, timing} of animations) {
+       let effect = new KeyframeEffect(document.getElementById(id),
+                                       frames, timing);
+       let animation = new Animation(effect, document.timeline);
+       animation.play();
++      animation.pause();
+     }
+   </script>
+ </body>
+ </html>

+ 69 - 0
frg/work-js/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,
+-    }],
+-  });
+-});

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