Merge inbound to mozilla-central. a=merge default tip
authorTiberius Oros <toros@mozilla.com>
Fri, 17 Aug 2018 00:32:50 +0300
changeset 432023 72442cf86f54
parent 431937 bf74fe0e7f76 (current diff)
parent 432022 9e05198aa74a (diff)
push id34456
push usertoros@mozilla.com
push date2018-08-16 21:33 +0000
treeherdermozilla-central@72442cf86f54 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone63.0a1
first release with
nightly linux32
72442cf86f54 / 63.0a1 / 20180816220128 / files
nightly linux64
72442cf86f54 / 63.0a1 / 20180816220128 / files
nightly mac
72442cf86f54 / 63.0a1 / 20180816220128 / files
nightly win32
72442cf86f54 / 63.0a1 / 20180816220128 / files
nightly win64
72442cf86f54 / 63.0a1 / 20180816220128 / files
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
releases
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge inbound to mozilla-central. a=merge
browser/extensions/formautofill/bootstrap.js
browser/extensions/formautofill/install.rdf.in
browser/extensions/formautofill/skin/shared/autocomplete-item.css
browser/extensions/formautofill/skin/shared/editDialog.css
dom/media/webaudio/test/mochitest.ini
extensions/pref/autoconfig/public/nsIAutoConfig.idl
testing/web-platform/meta/MANIFEST.json
testing/web-platform/meta/html/semantics/document-metadata/the-link-element/link-rel-attribute.html.ini
testing/web-platform/tests/css/compositing/parsing/resources/parsing-testcommon.js
testing/web-platform/tests/css/css-backgrounds/parsing/resources/parsing-testcommon.js
testing/web-platform/tests/css/css-box/parsing/resources/parsing-testcommon.js
testing/web-platform/tests/css/css-cascade/parsing/support/parsing-testcommon.js
testing/web-platform/tests/css/css-color/parsing/resources/parsing-testcommon.js
testing/web-platform/tests/css/css-images/parsing/resources/parsing-testcommon.js
testing/web-platform/tests/css/css-masking/parsing/resources/parsing-testcommon.js
testing/web-platform/tests/css/css-shapes/parsing/resources/parsing-testcommon.js
testing/web-platform/tests/css/css-transforms/parsing/resources/parsing-testcommon.js
testing/web-platform/tests/css/css-ui/parsing/support/parsing-testcommon.js
testing/web-platform/tests/css/css-writing-modes/parsing/resources/parsing-testcommon.js
testing/web-platform/tests/css/filter-effects/parsing/resources/parsing-testcommon.js
testing/web-platform/tests/css/motion/parsing/resources/parsing-testcommon.js
testing/web-platform/tests/navigation-timing/nav2_idlharness.html
testing/web-platform/tests/uievents/interfaces.html
testing/web-platform/tests/vibration/idl.html
testing/web-platform/tests/web-locks/acquire.tentative.https.html
testing/web-platform/tests/web-locks/held.tentative.https.html
testing/web-platform/tests/web-locks/ifAvailable.tentative.https.html
testing/web-platform/tests/web-locks/lock-attributes.tentative.https.html
testing/web-platform/tests/web-locks/mode-exclusive.tentative.https.html
testing/web-platform/tests/web-locks/mode-mixed.tentative.https.html
testing/web-platform/tests/web-locks/mode-shared.tentative.https.html
testing/web-platform/tests/web-locks/non-secure-context.tentative.html
testing/web-platform/tests/web-locks/query-empty.tentative.https.html
testing/web-platform/tests/web-locks/query-order.tentative.https.html
testing/web-platform/tests/web-locks/query.tentative.https.html
testing/web-platform/tests/web-locks/resource-names.tentative.https.html
testing/web-platform/tests/web-locks/secure-context.tentative.https.html
testing/web-platform/tests/web-locks/signal.tentative.https.html
testing/web-platform/tests/web-locks/steal.tentative.https.html
testing/web-platform/tests/webvtt/api/interfaces.html
--- a/browser/base/content/aboutNetError-new.xhtml
+++ b/browser/base/content/aboutNetError-new.xhtml
@@ -85,17 +85,17 @@
         <div id="ed_netOffline">&netOffline.longDesc2;</div>
         <div id="ed_netInterrupt">&netInterrupt.longDesc;</div>
         <div id="ed_deniedPortAccess">&deniedPortAccess.longDesc;</div>
         <div id="ed_proxyResolveFailure">&proxyResolveFailure.longDesc;</div>
         <div id="ed_proxyConnectFailure">&proxyConnectFailure.longDesc;</div>
         <div id="ed_contentEncodingError">&contentEncodingError.longDesc;</div>
         <div id="ed_unsafeContentType">&unsafeContentType.longDesc;</div>
         <div id="ed_nssFailure2">&nssFailure2.longDesc2;</div>
-        <div id="ed_nssBadCert">&certerror.introPara1;</div>
+        <div id="ed_nssBadCert">&certerror.introPara2;</div>
         <div id="ed_cspBlocked">&cspBlocked.longDesc;</div>
         <div id="ed_remoteXUL">&remoteXUL.longDesc;</div>
         <div id="ed_corruptedContentErrorv2">&corruptedContentErrorv2.longDesc;</div>
         <div id="ed_sslv3Used">&sslv3Used.longDesc2;</div>
         <div id="ed_inadequateSecurityError">&inadequateSecurityError.longDesc;</div>
         <div id="ed_blockedByPolicy"></div>
         <div id="ed_clockSkewError">&clockSkewError.longDesc;</div>
       </div>
--- a/browser/base/content/test/general/browser.ini
+++ b/browser/base/content/test/general/browser.ini
@@ -472,16 +472,17 @@ support-files =
   file_about_parent.html
 # DO NOT ADD MORE TESTS HERE. USE A TOPICAL DIRECTORY INSTEAD.
 [browser_e10s_switchbrowser.js]
 # DO NOT ADD MORE TESTS HERE. USE A TOPICAL DIRECTORY INSTEAD.
 [browser_e10s_about_process.js]
 # DO NOT ADD MORE TESTS HERE. USE A TOPICAL DIRECTORY INSTEAD.
 [browser_e10s_chrome_process.js]
 # DO NOT ADD MORE TESTS HERE. USE A TOPICAL DIRECTORY INSTEAD.
+skip-if = (os == 'linux' && debug) || (os == 'osx' && debug) # Bug 1444565
 [browser_e10s_javascript.js]
 # DO NOT ADD MORE TESTS HERE. USE A TOPICAL DIRECTORY INSTEAD.
 [browser_blockHPKP.js]
 skip-if = verify && !debug
 uses-unsafe-cpows = true
 tags = psm
 # DO NOT ADD MORE TESTS HERE. USE A TOPICAL DIRECTORY INSTEAD.
 [browser_windowactivation.js]
--- a/browser/base/content/test/static/browser_all_files_referenced.js
+++ b/browser/base/content/test/static/browser_all_files_referenced.js
@@ -239,23 +239,33 @@ trackResourcePrefix("app");
 
 function getBaseUriForChromeUri(chromeUri) {
   let chromeFile = chromeUri + "gobbledygooknonexistentfile.reallynothere";
   let uri = Services.io.newURI(chromeFile);
   let fileUri = gChromeReg.convertChromeURL(uri);
   return fileUri.resolve(".");
 }
 
+function trackChromeUri(uri) {
+  gChromeMap.set(getBaseUriForChromeUri(uri), uri);
+}
+
+// formautofill registers resource://formautofill/ and
+// chrome://formautofill/content/ dynamically at runtime.
+// Bug 1480276 is about addressing this without this hard-coding.
+trackResourcePrefix("formautofill");
+trackChromeUri("chrome://formautofill/content/");
+
 function parseManifest(manifestUri) {
   return fetchFile(manifestUri.spec).then(data => {
     for (let line of data.split("\n")) {
       let [type, ...argv] = line.split(/\s+/);
       if (type == "content" || type == "skin" || type == "locale") {
         let chromeUri = `chrome://${argv[0]}/${type}/`;
-        gChromeMap.set(getBaseUriForChromeUri(chromeUri), chromeUri);
+        trackChromeUri(chromeUri);
       } else if (type == "override" || type == "overlay") {
         // Overlays aren't really overrides, but behave the same in
         // that the overlay is only referenced if the original xul
         // file is referenced somewhere.
         let os = "os=" + Services.appinfo.OS;
         if (!argv.some(s => s.startsWith("os=") && s != os)) {
           gOverrideMap.set(Services.io.newURI(argv[1]).specIgnoringRef,
                            Services.io.newURI(argv[0]).specIgnoringRef);
@@ -266,16 +276,45 @@ function parseManifest(manifestUri) {
         trackResourcePrefix(argv[0]);
       } else if (type == "component") {
         gComponentsSet.add(argv[1]);
       }
     }
   });
 }
 
+// If the given URI is a webextension manifest, extract the scripts
+// for any embedded APIs.  Returns the passed in URI if the manifest
+// is not a webextension manifest, null otherwise.
+async function parseJsonManifest(uri) {
+  let raw = await fetchFile(uri.spec);
+  let data;
+  try {
+    data = JSON.parse(raw);
+  } catch (ex) {
+    return uri;
+  }
+
+  // Simplistic test for whether this is a webextension manifest:
+  if (data.manifest_version !== 2) {
+    return uri;
+  }
+
+  if (data.experiment_apis) {
+    for (let api of Object.values(data.experiment_apis)) {
+      if (api.parent && api.parent.script) {
+        let script = uri.resolve(api.parent.script);
+        gReferencesFromCode.set(script, null);
+      }
+    }
+  }
+
+  return null;
+}
+
 function addCodeReference(url, fromURI) {
   let from = convertToCodeURI(fromURI.spec);
 
   // Ignore self references.
   if (url == from)
     return;
 
   let ref;
@@ -541,29 +580,42 @@ add_task(async function checkAllTheFiles
   // test infrastructure because it runs against jarfiles there, and
   // our zipreader APIs are all sync)
   let uris = await generateURIsFromDirTree(appDir, [".css", ".manifest", ".jpg", ".png", ".gif", ".svg",  ".dtd", ".properties"].concat(kCodeExtensions));
 
   // Parse and remove all manifests from the list.
   // NOTE that this must be done before filtering out devtools paths
   // so that all chrome paths can be recorded.
   let manifestURIs = [];
+  let jsonManifests = [];
   uris = uris.filter(uri => {
     let path = uri.pathQueryRef;
     if (path.endsWith(".manifest")) {
       manifestURIs.push(uri);
       return false;
+    } else if (path.endsWith("/manifest.json")) {
+      jsonManifests.push(uri);
+      return false;
     }
 
     return true;
   });
 
   // Wait for all manifest to be parsed
   await throttledMapPromises(manifestURIs, parseManifest);
 
+  // manifest.json is a common name, it is used for WebExtension manifests
+  // but also for other things.  To tell them apart, we have to actually
+  // read the contents.  This will populate gExtensionRoots with all
+  // embedded extension APIs, and return any manifest.json files that aren't
+  // webextensions.
+  let nonWebextManifests = (await Promise.all(jsonManifests.map(parseJsonManifest)))
+                                         .filter(uri => !!uri);
+  uris.push(...nonWebextManifests);
+
   addActorModules();
 
   // We build a list of promises that get resolved when their respective
   // files have loaded and produced no errors.
   let allPromises = [];
 
   for (let uri of uris) {
     let path = uri.pathQueryRef;
--- a/browser/base/content/test/static/browser_misused_characters_in_strings.js
+++ b/browser/base/content/test/static/browser_misused_characters_in_strings.js
@@ -9,17 +9,17 @@
  * the end of the test, there is an assertion that all items have been
  * removed from the whitelist, thus ensuring there are no stale entries. */
 let gWhitelist = [{
     file: "netError.dtd",
     key: "certerror.introPara",
     type: "single-quote"
   }, {
     file: "netError.dtd",
-    key: "certerror.introPara1",
+    key: "certerror.introPara2",
     type: "single-quote"
   }, {
     file: "netError.dtd",
     key: "certerror.expiredCert.whatCanYouDoAboutIt2",
     type: "single-quote"
   }, {
     file: "netError.dtd",
     key: "certerror.whatShouldIDo.badStsCertExplanation1",
--- a/browser/components/extensions/test/browser/browser-common.ini
+++ b/browser/components/extensions/test/browser/browser-common.ini
@@ -213,16 +213,17 @@ skip-if = os == 'mac' # Save as PDF not 
 [browser_ext_tabs_sharingState.js]
 [browser_ext_tabs_cookieStoreId.js]
 [browser_ext_tabs_update.js]
 [browser_ext_tabs_zoom.js]
 [browser_ext_tabs_update_url.js]
 [browser_ext_themes_icons.js]
 [browser_ext_themes_validation.js]
 [browser_ext_url_overrides_newtab.js]
+skip-if = (os == 'linux' && debug) || (os == 'win' && debug) # Bug 1465508
 [browser_ext_user_events.js]
 [browser_ext_webRequest.js]
 [browser_ext_webNavigation_frameId0.js]
 [browser_ext_webNavigation_getFrames.js]
 [browser_ext_webNavigation_onCreatedNavigationTarget.js]
 [browser_ext_webNavigation_onCreatedNavigationTarget_contextmenu.js]
 [browser_ext_webNavigation_onCreatedNavigationTarget_named_window.js]
 [browser_ext_webNavigation_onCreatedNavigationTarget_subframe_window_open.js]
--- a/browser/components/extensions/test/browser/browser_ext_addon_debugging_netmonitor.js
+++ b/browser/components/extensions/test/browser/browser_ext_addon_debugging_netmonitor.js
@@ -1,12 +1,16 @@
 /* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set sts=2 sw=2 et tw=80: */
 "use strict";
 
+// There are shutdown issues for which multiple rejections are left uncaught.
+// See bug 1018184 for resolving these issues.
+PromiseTestUtils.whitelistRejectionsGlobally(/File closed/);
+
 ChromeUtils.defineModuleGetter(this, "BrowserToolboxProcess",
                                "resource://devtools/client/framework/ToolboxProcess.jsm");
 
 async function setupToolboxProcessTest(toolboxProcessScript) {
   // Enable addon debugging.
   await SpecialPowers.pushPrefEnv({
     "set": [
       // Force enabling of addons debugging
@@ -106,27 +110,26 @@ add_task(async function test_addon_debug
                       .filter(filterRequest);
 
       return requests.length > 0;
     });
 
     // Call a function defined in the target extension to make assertions
     // on the network requests collected by the netmonitor panel.
     await jsterm.execute(`testNetworkRequestReceived(${JSON.stringify(requests)});`);
+
+    await toolbox.destroy();
     /* eslint-enable no-undef */
   };
 
   await setupToolboxProcessTest(toolboxProcessScript);
   const browserToolboxProcess = new BrowserToolboxProcess({
     addonID: EXTENSION_ID,
   });
 
+  let onToolboxClose = browserToolboxProcess.once("close");
   await extension.awaitFinish("netmonitor_request_logged");
-
-  let onToolboxClose = browserToolboxProcess.once("close");
-  await browserToolboxProcess.close();
-
   await onToolboxClose;
 
   info("Addon Toolbox closed");
 
   await extension.unload();
 });
--- a/browser/extensions/formautofill/FormAutofillStorage.jsm
+++ b/browser/extensions/formautofill/FormAutofillStorage.jsm
@@ -1785,13 +1785,17 @@ FormAutofillStorage.prototype = {
     }
     return data;
   },
 
   // For test only.
   _saveImmediately() {
     return this._store._save();
   },
+
+  _finalize() {
+    return this._store.finalize();
+  },
 };
 
 // The singleton exposed by this module.
 this.formAutofillStorage = new FormAutofillStorage(
   OS.Path.join(OS.Constants.Path.profileDir, PROFILE_JSON_FILE_NAME));
rename from browser/extensions/formautofill/bootstrap.js
rename to browser/extensions/formautofill/api.js
--- a/browser/extensions/formautofill/bootstrap.js
+++ b/browser/extensions/formautofill/api.js
@@ -1,25 +1,22 @@
 /* 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";
 
-/* exported startup, shutdown, install, uninstall */
+/* globals ExtensionAPI */
 
 const STYLESHEET_URI = "chrome://formautofill/content/formautofill.css";
 const CACHED_STYLESHEETS = new WeakMap();
 
 ChromeUtils.import("resource://gre/modules/Services.jsm");
 ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
 
-ChromeUtils.defineModuleGetter(this, "AddonManager", "resource://gre/modules/AddonManager.jsm");
-ChromeUtils.defineModuleGetter(this, "AddonManagerPrivate",
-                               "resource://gre/modules/AddonManager.jsm");
 ChromeUtils.defineModuleGetter(this, "FormAutofill",
                                "resource://formautofill/FormAutofill.jsm");
 ChromeUtils.defineModuleGetter(this, "formAutofillParent",
                                "resource://formautofill/FormAutofillParent.jsm");
 
 XPCOMUtils.defineLazyServiceGetter(this, "resProto",
                                    "@mozilla.org/network/protocol;1?name=resource",
                                    "nsISubstitutingProtocolHandler");
@@ -45,23 +42,16 @@ function onMaybeOpenPopup(evt) {
   if (CACHED_STYLESHEETS.has(domWindow)) {
     // This window already has autofill stylesheets.
     return;
   }
 
   insertStyleSheet(domWindow, STYLESHEET_URI);
 }
 
-function addUpgradeListener(instanceID) {
-  AddonManager.addUpgradeListener(instanceID, upgrade => {
-    // don't install the upgrade by doing nothing here.
-    // The upgrade will be installed upon next restart.
-  });
-}
-
 function isAvailable() {
   let availablePref = Services.prefs.getCharPref("extensions.formautofill.available");
   if (availablePref == "on") {
     return true;
   } else if (availablePref == "detect") {
     let locale = Services.locale.getRequestedLocale();
     let region = Services.prefs.getCharPref("browser.search.region", "");
     let supportedCountries = Services.prefs.getCharPref("extensions.formautofill.supportedCountries")
@@ -70,90 +60,86 @@ function isAvailable() {
         Services.locale.isAppLocaleRTL) {
       return false;
     }
     return locale == "en-US" && supportedCountries.includes(region);
   }
   return false;
 }
 
-function startup(data) {
-  // We have to do this before actually determining if we're enabled, since
-  // there are scripts inside of the core browser code that depend on the
-  // FormAutofill JSMs being registered.
-  resProto.setSubstitution(RESOURCE_HOST,
-                           Services.io.newURI("chrome/res/", null, data.resourceURI));
+this.formautofill = class extends ExtensionAPI {
+  onStartup() {
+    // We have to do this before actually determining if we're enabled, since
+    // there are scripts inside of the core browser code that depend on the
+    // FormAutofill JSMs being registered.
+    let uri = Services.io.newURI("chrome/res/", null, this.extension.rootURI);
+    resProto.setSubstitution(RESOURCE_HOST, uri);
+
+    let aomStartup = Cc["@mozilla.org/addons/addon-manager-startup;1"]
+                                 .getService(Ci.amIAddonManagerStartup);
+    const manifestURI = Services.io.newURI("manifest.json", null, this.extension.rootURI);
+    this.chromeHandle = aomStartup.registerChrome(manifestURI, [
+      ["content", "formautofill", "chrome/content/"],
+      ["locale", "formautofill", "en-US", "en-US/locale/en-US/"],
+    ]);
+
+    if (!isAvailable()) {
+      Services.prefs.clearUserPref("dom.forms.autocomplete.formautofill");
+      // reset the sync related prefs incase the feature was previously available
+      // but isn't now.
+      Services.prefs.clearUserPref("services.sync.engine.addresses.available");
+      Services.prefs.clearUserPref("services.sync.engine.creditcards.available");
+      Services.telemetry.scalarSet("formautofill.availability", false);
+      return;
+    }
 
-  if (!isAvailable()) {
-    Services.prefs.clearUserPref("dom.forms.autocomplete.formautofill");
-    // reset the sync related prefs incase the feature was previously available
-    // but isn't now.
-    Services.prefs.clearUserPref("services.sync.engine.addresses.available");
-    Services.prefs.clearUserPref("services.sync.engine.creditcards.available");
-    Services.telemetry.scalarSet("formautofill.availability", false);
-    return;
-  }
+    // This pref is used for web contents to detect the autocomplete feature.
+    // When it's true, "element.autocomplete" will return tokens we currently
+    // support -- otherwise it'll return an empty string.
+    Services.prefs.setBoolPref("dom.forms.autocomplete.formautofill", true);
+    Services.telemetry.scalarSet("formautofill.availability", true);
 
-  if (data.hasOwnProperty("instanceID") && data.instanceID) {
-    if (AddonManagerPrivate.isDBLoaded()) {
-      addUpgradeListener(data.instanceID);
+    // This pref determines whether the "addresses"/"creditcards" sync engine is
+    // available (ie, whether it is shown in any UI etc) - it *does not* determine
+    // whether the engine is actually enabled or not.
+    Services.prefs.setBoolPref("services.sync.engine.addresses.available", true);
+    if (FormAutofill.isAutofillCreditCardsAvailable) {
+      Services.prefs.setBoolPref("services.sync.engine.creditcards.available", true);
     } else {
-      // Wait for the extension database to be loaded so we don't cause its init.
-      Services.obs.addObserver(function xpiDatabaseLoaded() {
-        Services.obs.removeObserver(xpiDatabaseLoaded, "xpi-database-loaded");
-        addUpgradeListener(data.instanceID);
-      }, "xpi-database-loaded");
+      Services.prefs.clearUserPref("services.sync.engine.creditcards.available");
     }
-  } else {
-    throw Error("no instanceID passed to bootstrap startup");
+
+    // Listen for the autocomplete popup message to lazily append our stylesheet related to the popup.
+    Services.mm.addMessageListener("FormAutoComplete:MaybeOpenPopup", onMaybeOpenPopup);
+
+    formAutofillParent.init().catch(Cu.reportError);
+    /* eslint-disable no-unused-vars */
+    Services.ppmm.loadProcessScript("data:,new " + function() {
+      ChromeUtils.import("resource://formautofill/FormAutofillContent.jsm");
+    }, true);
+    /* eslint-enable no-unused-vars */
+    Services.mm.loadFrameScript("chrome://formautofill/content/FormAutofillFrameScript.js", true, true);
   }
 
-  // This pref is used for web contents to detect the autocomplete feature.
-  // When it's true, "element.autocomplete" will return tokens we currently
-  // support -- otherwise it'll return an empty string.
-  Services.prefs.setBoolPref("dom.forms.autocomplete.formautofill", true);
-  Services.telemetry.scalarSet("formautofill.availability", true);
+  onShutdown() {
+    resProto.setSubstitution(RESOURCE_HOST, null);
 
-  // This pref determines whether the "addresses"/"creditcards" sync engine is
-  // available (ie, whether it is shown in any UI etc) - it *does not* determine
-  // whether the engine is actually enabled or not.
-  Services.prefs.setBoolPref("services.sync.engine.addresses.available", true);
-  if (FormAutofill.isAutofillCreditCardsAvailable) {
-    Services.prefs.setBoolPref("services.sync.engine.creditcards.available", true);
-  } else {
-    Services.prefs.clearUserPref("services.sync.engine.creditcards.available");
-  }
+    this.chromeHandle.destruct();
+    this.chromeHandle = null;
 
-  // Listen for the autocomplete popup message to lazily append our stylesheet related to the popup.
-  Services.mm.addMessageListener("FormAutoComplete:MaybeOpenPopup", onMaybeOpenPopup);
+    Services.mm.removeMessageListener("FormAutoComplete:MaybeOpenPopup", onMaybeOpenPopup);
 
-  formAutofillParent.init().catch(Cu.reportError);
-  /* eslint-disable no-unused-vars */
-  Services.ppmm.loadProcessScript("data:,new " + function() {
-    ChromeUtils.import("resource://formautofill/FormAutofillContent.jsm");
-  }, true);
-  /* eslint-enable no-unused-vars */
-  Services.mm.loadFrameScript("chrome://formautofill/content/FormAutofillFrameScript.js", true, true);
-}
-
-function shutdown() {
-  resProto.setSubstitution(RESOURCE_HOST, null);
+    let enumerator = Services.wm.getEnumerator("navigator:browser");
+    while (enumerator.hasMoreElements()) {
+      let win = enumerator.getNext();
+      let domWindow = win.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindow);
+      let cachedStyleSheets = CACHED_STYLESHEETS.get(domWindow);
 
-  Services.mm.removeMessageListener("FormAutoComplete:MaybeOpenPopup", onMaybeOpenPopup);
+      if (!cachedStyleSheets) {
+        continue;
+      }
 
-  let enumerator = Services.wm.getEnumerator("navigator:browser");
-  while (enumerator.hasMoreElements()) {
-    let win = enumerator.getNext();
-    let domWindow = win.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindow);
-    let cachedStyleSheets = CACHED_STYLESHEETS.get(domWindow);
-
-    if (!cachedStyleSheets) {
-      continue;
-    }
-
-    while (cachedStyleSheets.length !== 0) {
-      cachedStyleSheets.pop().remove();
+      while (cachedStyleSheets.length !== 0) {
+        cachedStyleSheets.pop().remove();
+      }
     }
   }
-}
-
-function install() {}
-function uninstall() {}
+};
new file mode 100644
--- /dev/null
+++ b/browser/extensions/formautofill/background.js
@@ -0,0 +1,8 @@
+/* eslint-env webextensions */
+
+"use strict";
+
+browser.runtime.onUpdateAvailable.addListener(details => {
+  // By listening to but ignoring this event, any updates will
+  // be delayed until the next browser restart.
+});
--- a/browser/extensions/formautofill/content/editAddress.xhtml
+++ b/browser/extensions/formautofill/content/editAddress.xhtml
@@ -4,19 +4,19 @@
    - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
 <!DOCTYPE html [
   <!ENTITY % globalDTD SYSTEM "chrome://global/locale/global.dtd">
   %globalDTD;
 ]>
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
   <title data-localization="addNewAddressTitle"/>
-  <link rel="stylesheet" href="chrome://formautofill-shared/skin/editDialog.css"/>
-  <link rel="stylesheet" href="chrome://formautofill-shared/skin/editAddress.css"/>
-  <link rel="stylesheet" href="chrome://formautofill/skin/editDialog.css"/>
+  <link rel="stylesheet" href="resource://formautofill/editDialog-shared.css"/>
+  <link rel="stylesheet" href="resource://formautofill/editAddress.css"/>
+  <link rel="stylesheet" href="resource://formautofill/editDialog.css"/>
   <script src="chrome://formautofill/content/l10n.js"></script>
   <script src="chrome://formautofill/content/editDialog.js"></script>
   <script src="chrome://formautofill/content/autofillEditForms.js"></script>
 </head>
 <body dir="&locale.dir;">
   <form id="form" autocomplete="off">
     <div>
       <div id="name-container">
--- a/browser/extensions/formautofill/content/editCreditCard.xhtml
+++ b/browser/extensions/formautofill/content/editCreditCard.xhtml
@@ -4,19 +4,19 @@
    - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
 <!DOCTYPE html [
   <!ENTITY % globalDTD SYSTEM "chrome://global/locale/global.dtd">
   %globalDTD;
 ]>
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
   <title data-localization="addNewCreditCardTitle"/>
-  <link rel="stylesheet" href="chrome://formautofill-shared/skin/editDialog.css"/>
-  <link rel="stylesheet" href="chrome://formautofill-shared/skin/editCreditCard.css"/>
-  <link rel="stylesheet" href="chrome://formautofill/skin/editDialog.css"/>
+  <link rel="stylesheet" href="resource://formautofill/editDialog-shared.css"/>
+  <link rel="stylesheet" href="resource://formautofill/editCreditCard.css"/>
+  <link rel="stylesheet" href="resource://formautofill/editDialog.css"/>
   <script src="chrome://formautofill/content/l10n.js"></script>
   <script src="chrome://formautofill/content/editDialog.js"></script>
   <script src="chrome://formautofill/content/autofillEditForms.js"></script>
 </head>
 <body dir="&locale.dir;">
   <form id="form" autocomplete="off">
     <label>
       <span data-localization="cardNumber"/>
--- a/browser/extensions/formautofill/jar.mn
+++ b/browser/extensions/formautofill/jar.mn
@@ -1,18 +1,11 @@
 # 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/.
 
 [features/formautofill@mozilla.org] chrome.jar:
-% resource formautofill %res/
   res/ (*.jsm)
   res/phonenumberutils/ (phonenumberutils/*.jsm)
   res/addressmetadata/ (addressmetadata/*)
-
-% content formautofill %content/
-  content/ (content/*)
+  res/ (skin/shared/*)
 
-% skin formautofill classic/1.0 %skin/linux/ os=LikeUnix
-% skin formautofill classic/1.0 %skin/osx/ os=Darwin
-% skin formautofill classic/1.0 %skin/windows/ os=WINNT
-% skin formautofill-shared classic/1.0 %skin/shared/
-  skin/  (skin/*)
+  content/ (content/*)
rename from browser/extensions/formautofill/install.rdf.in
rename to browser/extensions/formautofill/manifest.json
--- a/browser/extensions/formautofill/install.rdf.in
+++ b/browser/extensions/formautofill/manifest.json
@@ -1,32 +1,26 @@
-<?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/. -->
+{
+  "manifest_version": 2,
+  "name": "Form Autofill",
+  "version": "1.0",
 
-#filter substitution
-
-<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-     xmlns:em="http://www.mozilla.org/2004/em-rdf#">
+  "applications": {
+    "gecko": {
+      "id": "formautofill@mozilla.org"
+    }
+  },
 
-  <Description about="urn:mozilla:install-manifest">
-    <em:id>formautofill@mozilla.org</em:id>
-    <em:version>1.0</em:version>
-    <em:type>2</em:type>
-    <em:bootstrap>true</em:bootstrap>
-    <em:multiprocessCompatible>true</em:multiprocessCompatible>
+  "background": {
+    "scripts": ["background.js"]
+  },
 
-    <!-- Target Application this extension can install into,
-        with minimum and maximum supported versions. -->
-    <em:targetApplication>
-      <Description>
-        <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
-        <em:minVersion>@MOZ_APP_VERSION@</em:minVersion>
-        <em:maxVersion>@MOZ_APP_MAXVERSION@</em:maxVersion>
-      </Description>
-    </em:targetApplication>
-
-    <!-- Front End MetaData -->
-    <em:name>Form Autofill</em:name>
-    <em:description>Autofill forms with saved profiles</em:description>
-  </Description>
-</RDF>
+  "experiment_apis": {
+    "formautofill": {
+      "schema": "schema.json",
+      "parent": {
+        "scopes": ["addon_parent"],
+        "script": "api.js",
+        "events": ["startup"]
+      }
+    }
+  }
+}
--- a/browser/extensions/formautofill/moz.build
+++ b/browser/extensions/formautofill/moz.build
@@ -5,22 +5,37 @@
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 DEFINES['MOZ_APP_VERSION'] = CONFIG['MOZ_APP_VERSION']
 DEFINES['MOZ_APP_MAXVERSION'] = CONFIG['MOZ_APP_MAXVERSION']
 
 DIRS += ['locales']
 
 FINAL_TARGET_FILES.features['formautofill@mozilla.org'] += [
-  'bootstrap.js'
+  'api.js',
+  'background.js',
+  'manifest.json',
+  'schema.json',
 ]
 
-FINAL_TARGET_PP_FILES.features['formautofill@mozilla.org'] += [
-  'install.rdf.in'
-]
+if CONFIG['OS_ARCH'] == 'Linux':
+    FINAL_TARGET_FILES.features['formautofill@mozilla.org'].chrome.res += [
+        'skin/linux/autocomplete-item.css',
+        'skin/linux/editDialog.css',
+    ]
+elif CONFIG['OS_ARCH'] == 'Darwin':
+    FINAL_TARGET_FILES.features['formautofill@mozilla.org'].chrome.res += [
+        'skin/osx/autocomplete-item.css',
+        'skin/osx/editDialog.css',
+    ]
+elif CONFIG['OS_ARCH'] == 'WINNT':
+    FINAL_TARGET_FILES.features['formautofill@mozilla.org'].chrome.res += [
+        'skin/windows/autocomplete-item.css',
+        'skin/windows/editDialog.css',
+    ]
 
 BROWSER_CHROME_MANIFESTS += ['test/browser/browser.ini']
 
 XPCSHELL_TESTS_MANIFESTS += ['test/unit/xpcshell.ini']
 
 MOCHITEST_MANIFESTS += ['test/mochitest/mochitest.ini']
 
 JAR_MANIFESTS += ['jar.mn']
new file mode 100644
--- /dev/null
+++ b/browser/extensions/formautofill/schema.json
@@ -0,0 +1,1 @@
+[]
rename from browser/extensions/formautofill/skin/shared/autocomplete-item.css
rename to browser/extensions/formautofill/skin/shared/autocomplete-item-shared.css
rename from browser/extensions/formautofill/skin/shared/editDialog.css
rename to browser/extensions/formautofill/skin/shared/editDialog-shared.css
--- a/browser/extensions/formautofill/test/unit/head.js
+++ b/browser/extensions/formautofill/test/unit/head.js
@@ -3,72 +3,95 @@
  */
 
 "use strict";
 
 ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
 ChromeUtils.import("resource://gre/modules/Services.jsm");
 ChromeUtils.import("resource://gre/modules/ObjectUtils.jsm");
 ChromeUtils.import("resource://gre/modules/FormLikeFactory.jsm");
+ChromeUtils.import("resource://gre/modules/AddonManager.jsm");
+ChromeUtils.import("resource://testing-common/AddonTestUtils.jsm");
+ChromeUtils.import("resource://testing-common/ExtensionXPCShellUtils.jsm");
 ChromeUtils.import("resource://testing-common/FileTestUtils.jsm");
 ChromeUtils.import("resource://testing-common/MockDocument.jsm");
 ChromeUtils.import("resource://testing-common/TestUtils.jsm");
 
 ChromeUtils.defineModuleGetter(this, "DownloadPaths",
                                "resource://gre/modules/DownloadPaths.jsm");
 ChromeUtils.defineModuleGetter(this, "FileUtils",
                                "resource://gre/modules/FileUtils.jsm");
 
-XPCOMUtils.defineLazyServiceGetter(this, "resProto",
-                                   "@mozilla.org/network/protocol;1?name=resource",
-                                   "nsISubstitutingProtocolHandler");
+ChromeUtils.defineModuleGetter(this, "ExtensionParent",
+                               "resource://gre/modules/ExtensionParent.jsm");
 
 do_get_profile();
 
 // ================================================
 // Load mocking/stubbing library, sinon
 // docs: http://sinonjs.org/releases/v2.3.2/
 ChromeUtils.import("resource://gre/modules/Timer.jsm");
 Services.scriptloader.loadSubScript("resource://testing-common/sinon-2.3.2.js", this);
 /* globals sinon */
 // ================================================
 
-// Load our bootstrap extension manifest so we can access our chrome/resource URIs.
 const EXTENSION_ID = "formautofill@mozilla.org";
-let extensionDir = Services.dirsvc.get("GreD", Ci.nsIFile);
-extensionDir.append("browser");
-extensionDir.append("features");
-extensionDir.append(EXTENSION_ID);
-let bootstrapFile = extensionDir.clone();
-bootstrapFile.append("bootstrap.js");
-let bootstrapURI = Services.io.newFileURI(bootstrapFile).spec;
-// If the unpacked extension doesn't exist, use the packed version.
-if (!extensionDir.exists()) {
-  extensionDir = extensionDir.parent;
-  extensionDir.append(EXTENSION_ID + ".xpi");
-  let jarURI = Services.io.newFileURI(extensionDir);
-  bootstrapURI = "jar:" + jarURI.spec + "!/bootstrap.js";
+
+AddonTestUtils.init(this);
+
+async function loadExtension() {
+  AddonTestUtils.createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2");
+  await AddonTestUtils.promiseStartupManager();
+
+  let extensionPath = Services.dirsvc.get("GreD", Ci.nsIFile);
+  extensionPath.append("browser");
+  extensionPath.append("features");
+  extensionPath.append(EXTENSION_ID);
+
+  if (!extensionPath.exists()) {
+    extensionPath.leafName = `${EXTENSION_ID}.xpi`;
+  }
+
+  let startupPromise = new Promise(resolve => {
+    const {apiManager} = ExtensionParent;
+    function onReady(event, extension) {
+      if (extension.id == EXTENSION_ID) {
+        apiManager.off("ready", onReady);
+        resolve();
+      }
+    }
+
+    apiManager.on("ready", onReady);
+  });
+
+  await AddonManager.installTemporaryAddon(extensionPath);
+  await startupPromise;
 }
-Components.manager.addBootstrappedManifestLocation(extensionDir);
-
-let resURI = Services.io.newURI("chrome/res/", null, Services.io.newURI(bootstrapURI));
-resProto.setSubstitution("formautofill", resURI);
 
 // Returns a reference to a temporary file that is guaranteed not to exist and
 // is cleaned up later. See FileTestUtils.getTempFile for details.
 function getTempFile(leafName) {
   return FileTestUtils.getTempFile(leafName);
 }
 
 async function initProfileStorage(fileName, records, collectionName = "addresses") {
   let {FormAutofillStorage} = ChromeUtils.import("resource://formautofill/FormAutofillStorage.jsm", {});
   let path = getTempFile(fileName).path;
   let profileStorage = new FormAutofillStorage(path);
   await profileStorage.initialize();
 
+  // AddonTestUtils inserts its own directory provider that manages TmpD.
+  // It removes that directory at shutdown, which races with shutdown
+  // handing in JSONFile/DeferredTask (which is used by FormAutofillStorage).
+  // Avoid the race by explicitly finalizing any formautofill JSONFile
+  // instances created manually by individual tests when the test finishes.
+  registerCleanupFunction(function finalizeAutofillStorage() {
+    return profileStorage._finalize();
+  });
+
   if (!records || !Array.isArray(records)) {
     return profileStorage;
   }
 
   let onChanged = TestUtils.topicObserved(
     "formautofill-storage-changed",
     (subject, data) =>
       data == "add" &&
@@ -94,19 +117,21 @@ function verifySectionFieldDetails(secti
       let expectedField = expectedSectionInfo[fieldIndex];
       delete field._reason;
       delete field.elementWeakRef;
       Assert.deepEqual(field, expectedField);
     });
   });
 }
 
-function runHeuristicsTest(patterns, fixturePathPrefix) {
-  ChromeUtils.import("resource://formautofill/FormAutofillHeuristics.jsm");
-  ChromeUtils.import("resource://formautofill/FormAutofillUtils.jsm");
+async function runHeuristicsTest(patterns, fixturePathPrefix) {
+  add_task(async function setup() {
+    ChromeUtils.import("resource://formautofill/FormAutofillHeuristics.jsm");
+    ChromeUtils.import("resource://formautofill/FormAutofillUtils.jsm");
+  });
 
   patterns.forEach(testPattern => {
     add_task(async function() {
       info("Starting test fixture: " + testPattern.fixturePath);
       let file = do_get_file(fixturePathPrefix + testPattern.fixturePath);
       let doc = MockDocument.createTestDocumentFromFile("http://localhost:8080/test/", file);
 
       let forms = [];
@@ -189,9 +214,11 @@ add_task(async function head_initialize(
   // Clean up after every test.
   registerCleanupFunction(function head_cleanup() {
     Services.prefs.clearUserPref("extensions.formautofill.available");
     Services.prefs.clearUserPref("extensions.formautofill.creditCards.available");
     Services.prefs.clearUserPref("extensions.formautofill.heuristics.enabled");
     Services.prefs.clearUserPref("extensions.formautofill.section.enabled");
     Services.prefs.clearUserPref("dom.forms.autocomplete.formautofill");
   });
+
+  await loadExtension();
 });
--- a/browser/extensions/formautofill/test/unit/test_activeStatus.js
+++ b/browser/extensions/formautofill/test/unit/test_activeStatus.js
@@ -1,15 +1,19 @@
 /*
  * Test for status handling in Form Autofill Parent.
  */
 
 "use strict";
 
-let {FormAutofillParent} = ChromeUtils.import("resource://formautofill/FormAutofillParent.jsm", {});
+let FormAutofillParent;
+
+add_task(async function setup() {
+  ({FormAutofillParent} = ChromeUtils.import("resource://formautofill/FormAutofillParent.jsm", {}));
+});
 
 add_task(async function test_activeStatus_init() {
   let formAutofillParent = new FormAutofillParent();
   sinon.spy(formAutofillParent, "_updateStatus");
 
   // Default status is null before initialization
   Assert.equal(formAutofillParent._active, null);
   Assert.equal(Services.ppmm.initialProcessData.autofillEnabled, undefined);
--- a/browser/extensions/formautofill/test/unit/test_addressDataLoader.js
+++ b/browser/extensions/formautofill/test/unit/test_addressDataLoader.js
@@ -1,27 +1,29 @@
 "use strict";
 
-ChromeUtils.import("resource://formautofill/FormAutofillUtils.jsm");
-
 const SUPPORT_COUNTRIES_TESTCASES = [
   {
     country: "US",
     properties: ["languages", "alternative_names", "sub_keys", "sub_names"],
   },
   {
     country: "CA",
     properties: ["languages", "name", "sub_keys", "sub_names"],
   },
   {
     country: "DE",
     properties: ["name"],
   },
 ];
 
+add_task(async function setup() {
+  ChromeUtils.import("resource://formautofill/FormAutofillUtils.jsm");
+});
+
 add_task(async function test_initalState() {
   // addressData should not exist
   Assert.equal(AddressDataLoader._addressData, undefined);
   // Verify _dataLoaded state
   Assert.equal(AddressDataLoader._dataLoaded.country, false);
   Assert.equal(AddressDataLoader._dataLoaded.level1.size, 0);
 });
 
--- a/browser/extensions/formautofill/test/unit/test_autofillFormFields.js
+++ b/browser/extensions/formautofill/test/unit/test_autofillFormFields.js
@@ -1,17 +1,20 @@
 /*
  * Test for form auto fill content helper fill all inputs function.
  */
 /* eslint-disable mozilla/no-arbitrary-setTimeout */
 
 "use strict";
 
-ChromeUtils.import("resource://formautofill/FormAutofillHandler.jsm");
-let {MasterPassword} = ChromeUtils.import("resource://formautofill/MasterPassword.jsm", {});
+let MasterPassword;
+add_task(async function setup() {
+  ChromeUtils.import("resource://formautofill/FormAutofillHandler.jsm");
+  ({MasterPassword} = ChromeUtils.import("resource://formautofill/MasterPassword.jsm", {}));
+});
 
 const TESTCASES = [
   {
     description: "Form without autocomplete property",
     document: `<form><input id="given-name"><input id="family-name">
                <input id="street-addr"><input id="city"><select id="country"></select>
                <input id='email'><input id="tel"></form>`,
     focusedInputId: "given-name",
--- a/browser/extensions/formautofill/test/unit/test_collectFormFields.js
+++ b/browser/extensions/formautofill/test/unit/test_collectFormFields.js
@@ -1,15 +1,17 @@
 /*
  * Test for form auto fill content helper collectFormFields functions.
  */
 
 "use strict";
 
-ChromeUtils.import("resource://formautofill/FormAutofillHandler.jsm");
+add_task(async function setup() {
+  ChromeUtils.import("resource://formautofill/FormAutofillHandler.jsm");
+});
 
 const TESTCASES = [
   {
     description: "Form without autocomplete property",
     document: `<form><input id="given-name"><input id="family-name">
                <input id="street-addr"><input id="city"><select id="country"></select>
                <input id='email'><input id="phone"></form>`,
     sections: [
--- a/browser/extensions/formautofill/test/unit/test_createRecords.js
+++ b/browser/extensions/formautofill/test/unit/test_createRecords.js
@@ -1,15 +1,17 @@
 /*
  * Test for the normalization of records created by FormAutofillHandler.
  */
 
 "use strict";
 
-ChromeUtils.import("resource://formautofill/FormAutofillHandler.jsm");
+add_task(async function seutp() {
+  ChromeUtils.import("resource://formautofill/FormAutofillHandler.jsm");
+});
 
 const TESTCASES = [
   {
     description: "Don't contain a field whose length of value is greater than 200",
     document: `<form>
                 <input id="given-name" autocomplete="given-name">
                 <input id="organization" autocomplete="organization">
                 <input id="address-level1" autocomplete="address-level1">
--- a/browser/extensions/formautofill/test/unit/test_creditCardRecords.js
+++ b/browser/extensions/formautofill/test/unit/test_creditCardRecords.js
@@ -1,19 +1,23 @@
 /**
  * Tests FormAutofillStorage object with creditCards records.
  */
 
 "use strict";
 
-const {FormAutofillStorage} = ChromeUtils.import("resource://formautofill/FormAutofillStorage.jsm", {});
 ChromeUtils.defineModuleGetter(this, "Preferences",
                                "resource://gre/modules/Preferences.jsm");
 ChromeUtils.import("resource://gre/modules/CreditCard.jsm");
 
+let FormAutofillStorage;
+add_task(async function setup() {
+  ({FormAutofillStorage} = ChromeUtils.import("resource://formautofill/FormAutofillStorage.jsm", {}));
+});
+
 const TEST_STORE_FILE_NAME = "test-credit-card.json";
 const COLLECTION_NAME = "creditCards";
 
 const TEST_CREDIT_CARD_1 = {
   "cc-name": "John Doe",
   "cc-number": "4929001587121045",
   "cc-exp-month": 4,
   "cc-exp-year": 2017,
--- a/browser/extensions/formautofill/test/unit/test_extractLabelStrings.js
+++ b/browser/extensions/formautofill/test/unit/test_extractLabelStrings.js
@@ -1,11 +1,13 @@
 "use strict";
 
-ChromeUtils.import("resource://formautofill/FormAutofillHeuristics.jsm");
+add_task(async function() {
+  ChromeUtils.import("resource://formautofill/FormAutofillHeuristics.jsm");
+});
 
 const TESTCASES = [
   {
     description: "A label element contains one input element.",
     document: `<label id="typeA"> label type A
                  <!-- This comment should not be extracted. -->
                  <input type="text">
                  <script>FOO</script>
--- a/browser/extensions/formautofill/test/unit/test_findLabelElements.js
+++ b/browser/extensions/formautofill/test/unit/test_findLabelElements.js
@@ -1,11 +1,13 @@
 "use strict";
 
-ChromeUtils.import("resource://formautofill/FormAutofillHeuristics.jsm");
+add_task(async function() {
+  ChromeUtils.import("resource://formautofill/FormAutofillHeuristics.jsm");
+});
 
 const TESTCASES = [
   {
     description: "Input contains in a label element.",
     document: `<form>
                  <label id="labelA"> label type A
                    <input id="typeA" type="text">
                  </label>
--- a/browser/extensions/formautofill/test/unit/test_getAdaptedProfiles.js
+++ b/browser/extensions/formautofill/test/unit/test_getAdaptedProfiles.js
@@ -1,15 +1,17 @@
 /*
  * Test for form auto fill content helper fill all inputs function.
  */
 
 "use strict";
 
-ChromeUtils.import("resource://formautofill/FormAutofillHandler.jsm");
+add_task(async function() {
+  ChromeUtils.import("resource://formautofill/FormAutofillHandler.jsm");
+});
 
 const DEFAULT_ADDRESS_RECORD = {
   "guid": "123",
   "street-address": "2 Harrison St\nline2\nline3",
   "address-line1": "2 Harrison St",
   "address-line2": "line2",
   "address-line3": "line3",
   "address-level1": "CA",
--- a/browser/extensions/formautofill/test/unit/test_getCategoriesFromFieldNames.js
+++ b/browser/extensions/formautofill/test/unit/test_getCategoriesFromFieldNames.js
@@ -1,12 +1,14 @@
 
 "use strict";
 
-ChromeUtils.import("resource://formautofill/FormAutofillUtils.jsm");
+add_task(async function() {
+  ChromeUtils.import("resource://formautofill/FormAutofillUtils.jsm");
+});
 
 add_task(async function test_isAddressField_isCreditCardField() {
   const TEST_CASES = {
     "given-name": {
       isAddressField: true,
       isCreditCardField: false,
     },
     "organization": {
--- a/browser/extensions/formautofill/test/unit/test_getFormInputDetails.js
+++ b/browser/extensions/formautofill/test/unit/test_getFormInputDetails.js
@@ -1,11 +1,13 @@
 "use strict";
 
-ChromeUtils.import("resource://formautofill/FormAutofillContent.jsm");
+add_task(async function() {
+  ChromeUtils.import("resource://formautofill/FormAutofillContent.jsm");
+});
 
 const TESTCASES = [
   {
     description: "Form containing 5 fields with autocomplete attribute.",
     document: `<form id="form1">
                  <input id="street-addr" autocomplete="street-address">
                  <input id="city" autocomplete="address-level2">
                  <select id="country" autocomplete="country"></select>
--- a/browser/extensions/formautofill/test/unit/test_getInfo.js
+++ b/browser/extensions/formautofill/test/unit/test_getInfo.js
@@ -1,11 +1,13 @@
 "use strict";
 
-ChromeUtils.import("resource://formautofill/FormAutofillHeuristics.jsm");
+add_task(async function() {
+  ChromeUtils.import("resource://formautofill/FormAutofillHeuristics.jsm");
+});
 
 const TESTCASES = [
   {
     description: "Input element in a label element",
     document: `<form>
                  <label> E-Mail
                    <input id="targetElement" type="text">
                  </label>
--- a/browser/extensions/formautofill/test/unit/test_getRecords.js
+++ b/browser/extensions/formautofill/test/unit/test_getRecords.js
@@ -1,18 +1,22 @@
 /*
  * Test for make sure getRecords can retrieve right collection from storage.
  */
 
 "use strict";
 
-let {FormAutofillParent} = ChromeUtils.import("resource://formautofill/FormAutofillParent.jsm", {});
-ChromeUtils.import("resource://formautofill/MasterPassword.jsm");
 ChromeUtils.import("resource://gre/modules/CreditCard.jsm");
 
+let FormAutofillParent;
+add_task(async function setup() {
+  ({FormAutofillParent} = ChromeUtils.import("resource://formautofill/FormAutofillParent.jsm", {}));
+  ChromeUtils.import("resource://formautofill/MasterPassword.jsm");
+});
+
 const TEST_ADDRESS_1 = {
   "given-name": "Timothy",
   "additional-name": "John",
   "family-name": "Berners-Lee",
   organization: "World Wide Web Consortium",
   "street-address": "32 Vassar Street\nMIT Room 32-G524",
   "address-level2": "Cambridge",
   "address-level1": "MA",
--- a/browser/extensions/formautofill/test/unit/test_isAvailable.js
+++ b/browser/extensions/formautofill/test/unit/test_isAvailable.js
@@ -1,32 +1,37 @@
 /**
  * Test enabling the feature in specific locales and regions.
  */
 
 "use strict";
 
-// Load bootstrap.js into a sandbox to be able to test `isAvailable`
-let sandbox = {};
-Services.scriptloader.loadSubScript(bootstrapURI, sandbox, "utf-8");
-info("bootstrapURI: " + bootstrapURI);
+const DOM_ENABLED_PREF = "dom.forms.autocomplete.formautofill";
 
 add_task(async function test_defaultTestEnvironment() {
-  Assert.ok(sandbox.isAvailable());
+  Assert.ok(Services.prefs.getBoolPref(DOM_ENABLED_PREF));
 });
 
 add_task(async function test_unsupportedRegion() {
   Services.prefs.setCharPref("extensions.formautofill.available", "detect");
   Services.prefs.setCharPref("browser.search.region", "ZZ");
   registerCleanupFunction(function cleanupRegion() {
     Services.prefs.clearUserPref("browser.search.region");
   });
-  Assert.ok(!sandbox.isAvailable());
+
+  let addon = await AddonManager.getAddonByID(EXTENSION_ID);
+  await addon.reload();
+
+  Assert.ok(!Services.prefs.getBoolPref(DOM_ENABLED_PREF));
 });
 
 add_task(async function test_supportedRegion() {
   Services.prefs.setCharPref("extensions.formautofill.available", "detect");
   Services.prefs.setCharPref("browser.search.region", "US");
   registerCleanupFunction(function cleanupRegion() {
     Services.prefs.clearUserPref("browser.search.region");
   });
-  Assert.ok(sandbox.isAvailable());
+
+  let addon = await AddonManager.getAddonByID(EXTENSION_ID);
+  await addon.reload();
+
+  Assert.ok(Services.prefs.getBoolPref(DOM_ENABLED_PREF));
 });
--- a/browser/extensions/formautofill/test/unit/test_isCJKName.js
+++ b/browser/extensions/formautofill/test/unit/test_isCJKName.js
@@ -1,15 +1,17 @@
 /**
  * Tests the "isCJKName" function of FormAutofillNameUtils object.
  */
 
 "use strict";
 
-ChromeUtils.import("resource://formautofill/FormAutofillNameUtils.jsm");
+add_task(async function setup() {
+  ChromeUtils.import("resource://formautofill/FormAutofillNameUtils.jsm");
+});
 
 // Test cases is initially copied from
 // https://cs.chromium.org/chromium/src/components/autofill/core/browser/autofill_data_util_unittest.cc
 const TESTCASES = [
   {
     // Non-CJK language with only ASCII characters.
     fullName: "Homer Jay Simpson",
     expectedResult: false,
--- a/browser/extensions/formautofill/test/unit/test_isFieldEligibleForAutofill.js
+++ b/browser/extensions/formautofill/test/unit/test_isFieldEligibleForAutofill.js
@@ -1,11 +1,13 @@
 "use strict";
 
-ChromeUtils.import("resource://formautofill/FormAutofillUtils.jsm");
+add_task(async function seutp() {
+  ChromeUtils.import("resource://formautofill/FormAutofillUtils.jsm");
+});
 
 const TESTCASES = [
   {
     document: `<input id="targetElement" type="text">`,
     fieldId: "targetElement",
     expectedResult: true,
   },
   {
--- a/browser/extensions/formautofill/test/unit/test_markAsAutofillField.js
+++ b/browser/extensions/formautofill/test/unit/test_markAsAutofillField.js
@@ -1,12 +1,10 @@
 "use strict";
 
-ChromeUtils.import("resource://formautofill/FormAutofillContent.jsm");
-
 const TESTCASES = [
   {
     description: "Form containing 8 fields with autocomplete attribute.",
     document: `<form>
                  <input id="given-name" autocomplete="given-name">
                  <input id="additional-name" autocomplete="additional-name">
                  <input id="family-name" autocomplete="family-name">
                  <input id="street-addr" autocomplete="street-address">
@@ -56,19 +54,24 @@ const TESTCASES = [
       "country",
       "email",
       "tel",
     ],
   },
 ];
 
 let markedFieldId = [];
-FormAutofillContent._markAsAutofillField = function(field) {
-  markedFieldId.push(field.id);
-};
+
+add_task(async function setup() {
+  ChromeUtils.import("resource://formautofill/FormAutofillContent.jsm");
+
+  FormAutofillContent._markAsAutofillField = function(field) {
+    markedFieldId.push(field.id);
+  };
+});
 
 TESTCASES.forEach(testcase => {
   add_task(async function() {
     info("Starting testcase: " + testcase.description);
 
     markedFieldId = [];
 
     let doc = MockDocument.createTestDocument(
--- a/browser/extensions/formautofill/test/unit/test_masterPassword.js
+++ b/browser/extensions/formautofill/test/unit/test_masterPassword.js
@@ -1,16 +1,20 @@
 /**
  * Tests of MasterPassword.jsm
  */
 
 "use strict";
 const {MockRegistrar} =
   ChromeUtils.import("resource://testing-common/MockRegistrar.jsm", {});
-let {MasterPassword} = ChromeUtils.import("resource://formautofill/MasterPassword.jsm", {});
+
+let MasterPassword;
+add_task(async function setup() {
+  ({MasterPassword} = ChromeUtils.import("resource://formautofill/MasterPassword.jsm", {}));
+});
 
 const TESTCASES = [{
   description: "With master password set",
   masterPassword: "fakemp",
   mpEnabled: true,
 },
 {
   description: "Without master password set",
@@ -62,20 +66,20 @@ do_get_profile();
 let windowWatcherCID =
   MockRegistrar.register("@mozilla.org/embedcomp/window-watcher;1",
                          gWindowWatcher);
 registerCleanupFunction(() => {
   MockRegistrar.unregister(windowWatcherCID);
 });
 
 TESTCASES.forEach(testcase => {
-  let token = MasterPassword._token;
-
   add_task(async function test_encrypt_decrypt() {
     info("Starting testcase: " + testcase.description);
+
+    let token = MasterPassword._token;
     token.initPassword(testcase.masterPassword);
 
     // Test only: Force the token login without asking for master password
     token.login(/* force */ false);
     Assert.equal(testcase.mpEnabled, token.isLoggedIn(), "Token should now be logged into");
     Assert.equal(MasterPassword.isEnabled, testcase.mpEnabled);
 
     let testText = "test string";
--- a/browser/extensions/formautofill/test/unit/test_migrateRecords.js
+++ b/browser/extensions/formautofill/test/unit/test_migrateRecords.js
@@ -1,15 +1,19 @@
 /**
  * Tests the migration algorithm in profileStorage.
  */
 
 "use strict";
 
-const {FormAutofillStorage} = ChromeUtils.import("resource://formautofill/FormAutofillStorage.jsm", {});
+let FormAutofillStorage;
+
+add_task(async function setup() {
+  ({FormAutofillStorage} = ChromeUtils.import("resource://formautofill/FormAutofillStorage.jsm", {}));
+});
 
 const TEST_STORE_FILE_NAME = "test-profile.json";
 
 const ADDRESS_SCHEMA_VERSION = 1;
 const CREDIT_CARD_SCHEMA_VERSION = 1;
 
 const ADDRESS_TESTCASES = [
   {
--- a/browser/extensions/formautofill/test/unit/test_nameUtils.js
+++ b/browser/extensions/formautofill/test/unit/test_nameUtils.js
@@ -1,15 +1,17 @@
 /**
  * Tests FormAutofillNameUtils object.
  */
 
 "use strict";
 
-ChromeUtils.import("resource://formautofill/FormAutofillNameUtils.jsm");
+add_task(async function() {
+  ChromeUtils.import("resource://formautofill/FormAutofillNameUtils.jsm");
+});
 
 // Test cases initially copied from
 // https://cs.chromium.org/chromium/src/components/autofill/core/browser/autofill_data_util_unittest.cc
 const TESTCASES = [
   {
     description: "Full name including given, middle and family names",
     fullName: "Homer Jay Simpson",
     nameParts: {
--- a/browser/extensions/formautofill/test/unit/test_onFormSubmitted.js
+++ b/browser/extensions/formautofill/test/unit/test_onFormSubmitted.js
@@ -1,11 +1,13 @@
 "use strict";
 
-ChromeUtils.import("resource://formautofill/FormAutofillContent.jsm");
+add_task(async function setup() {
+  ChromeUtils.import("resource://formautofill/FormAutofillContent.jsm");
+});
 
 const MOCK_DOC = MockDocument.createTestDocument("http://localhost:8080/test/",
                    `<form id="form1">
                       <input id="street-addr" autocomplete="street-address">
                       <select id="address-level1" autocomplete="address-level1">
                         <option value=""></option>
                         <option value="AL">Alabama</option>
                         <option value="AK">Alaska</option>
--- a/browser/extensions/formautofill/test/unit/test_parseAddressFormat.js
+++ b/browser/extensions/formautofill/test/unit/test_parseAddressFormat.js
@@ -1,11 +1,13 @@
 "use strict";
 
-ChromeUtils.import("resource://formautofill/FormAutofillUtils.jsm");
+add_task(async function setup() {
+  ChromeUtils.import("resource://formautofill/FormAutofillUtils.jsm");
+});
 
 add_task(async function test_parseAddressFormat() {
   const TEST_CASES = [
     {
       fmt: "%N%n%O%n%A%n%C, %S %Z", // US
       parsed: [
         {fieldId: "name", newLine: true},
         {fieldId: "organization", newLine: true},
--- a/browser/extensions/formautofill/test/unit/test_phoneNumber.js
+++ b/browser/extensions/formautofill/test/unit/test_phoneNumber.js
@@ -1,16 +1,18 @@
 /**
  * Tests PhoneNumber.jsm and PhoneNumberNormalizer.jsm.
  */
 
 "use strict";
 
-ChromeUtils.import("resource://formautofill/phonenumberutils/PhoneNumber.jsm");
-ChromeUtils.import("resource://formautofill/phonenumberutils/PhoneNumberNormalizer.jsm");
+add_task(async function setup() {
+  ChromeUtils.import("resource://formautofill/phonenumberutils/PhoneNumber.jsm");
+  ChromeUtils.import("resource://formautofill/phonenumberutils/PhoneNumberNormalizer.jsm");
+});
 
 function IsPlain(dial, expected) {
   let result = PhoneNumber.IsPlain(dial);
   Assert.equal(result, expected);
 }
 
 function Normalize(dial, expected) {
   let result = PhoneNumberNormalizer.Normalize(dial);
--- a/browser/extensions/formautofill/test/unit/test_profileAutocompleteResult.js
+++ b/browser/extensions/formautofill/test/unit/test_profileAutocompleteResult.js
@@ -1,13 +1,15 @@
 "use strict";
 
 /* global AddressResult, CreditCardResult */
-// eslint-disable-next-line no-unused-vars
-ChromeUtils.import("resource://formautofill/ProfileAutoCompleteResult.jsm");
+add_task(async function setup() {
+  // eslint-disable-next-line no-unused-vars
+  ChromeUtils.import("resource://formautofill/ProfileAutoCompleteResult.jsm");
+});
 
 let matchingProfiles = [{
   guid: "test-guid-1",
   "given-name": "Timothy",
   "family-name": "Berners-Lee",
   name: "Timothy Berners-Lee",
   organization: "Sesame Street",
   "street-address": "123 Sesame Street.",
@@ -336,25 +338,25 @@ let creditCardTestCases = [{
   fieldName: "",
   expected: {
     searchResult: Ci.nsIAutoCompleteResult.RESULT_FAILURE,
     defaultIndex: 0,
     items: [],
   },
 }];
 
-let testSets = [{
-  collectionConstructor: AddressResult,
-  testCases: addressTestCases,
-}, {
-  collectionConstructor: CreditCardResult,
-  testCases: creditCardTestCases,
-}];
+add_task(async function test_all_patterns() {
+  let testSets = [{
+    collectionConstructor: AddressResult,
+    testCases: addressTestCases,
+  }, {
+    collectionConstructor: CreditCardResult,
+    testCases: creditCardTestCases,
+  }];
 
-add_task(async function test_all_patterns() {
   testSets.forEach(({collectionConstructor, testCases}) => {
     testCases.forEach(testCase => {
       info("Starting testcase: " + testCase.description);
       let actual = new collectionConstructor(testCase.searchString,
                                              testCase.fieldName,
                                              testCase.allFieldNames,
                                              testCase.matchingProfiles,
                                              testCase.options);
--- a/browser/extensions/formautofill/test/unit/test_savedFieldNames.js
+++ b/browser/extensions/formautofill/test/unit/test_savedFieldNames.js
@@ -1,15 +1,19 @@
 /*
  * Test for keeping the valid fields information in initialProcessData.
  */
 
 "use strict";
 
-let {FormAutofillParent} = ChromeUtils.import("resource://formautofill/FormAutofillParent.jsm", {});
+let FormAutofillParent;
+
+add_task(async function setup() {
+  ({FormAutofillParent} = ChromeUtils.import("resource://formautofill/FormAutofillParent.jsm", {}));
+});
 
 add_task(async function test_profileSavedFieldNames_init() {
   let formAutofillParent = new FormAutofillParent();
   sinon.stub(formAutofillParent, "_updateSavedFieldNames");
 
   await formAutofillParent.init();
   await formAutofillParent.formAutofillStorage.initialize();
   Assert.equal(formAutofillParent._updateSavedFieldNames.called, true);
--- a/browser/extensions/formautofill/test/unit/test_storage_remove.js
+++ b/browser/extensions/formautofill/test/unit/test_storage_remove.js
@@ -1,15 +1,18 @@
 /**
  * Tests removing all address/creditcard records.
  */
 
 "use strict";
 
-const {FormAutofillStorage} = ChromeUtils.import("resource://formautofill/FormAutofillStorage.jsm", {});
+let FormAutofillStorage;
+add_task(async function setup() {
+  ({FormAutofillStorage} = ChromeUtils.import("resource://formautofill/FormAutofillStorage.jsm", {}));
+});
 
 const TEST_STORE_FILE_NAME = "test-tombstones.json";
 
 const TEST_ADDRESS_1 = {
   "given-name": "Timothy",
   "additional-name": "John",
   "family-name": "Berners-Lee",
   organization: "World Wide Web Consortium",
--- a/browser/extensions/formautofill/test/unit/test_storage_tombstones.js
+++ b/browser/extensions/formautofill/test/unit/test_storage_tombstones.js
@@ -1,15 +1,18 @@
 /**
  * Tests tombstones in address/creditcard records.
  */
 
 "use strict";
 
-const {FormAutofillStorage} = ChromeUtils.import("resource://formautofill/FormAutofillStorage.jsm", {});
+let FormAutofillStorage;
+add_task(async function setup() {
+  ({FormAutofillStorage} = ChromeUtils.import("resource://formautofill/FormAutofillStorage.jsm", {}));
+});
 
 const TEST_STORE_FILE_NAME = "test-tombstones.json";
 
 const TEST_ADDRESS_1 = {
   "given-name": "Timothy",
   "additional-name": "John",
   "family-name": "Berners-Lee",
   organization: "World Wide Web Consortium",
--- a/browser/extensions/formautofill/test/unit/test_sync.js
+++ b/browser/extensions/formautofill/test/unit/test_sync.js
@@ -8,18 +8,21 @@
 /* import-globals-from ../../../../../services/sync/tests/unit/head_http_server.js */
 
 "use strict";
 
 ChromeUtils.import("resource://services-sync/service.js");
 ChromeUtils.import("resource://services-sync/constants.js");
 ChromeUtils.import("resource://testing-common/services/sync/utils.js");
 
-let {sanitizeStorageObject, AutofillRecord, AddressesEngine} =
-  ChromeUtils.import("resource://formautofill/FormAutofillSync.jsm", {});
+let sanitizeStorageObject, AutofillRecord, AddressesEngine;
+add_task(async function() {
+  ({sanitizeStorageObject, AutofillRecord, AddressesEngine} =
+    ChromeUtils.import("resource://formautofill/FormAutofillSync.jsm", {}));
+});
 
 
 Services.prefs.setCharPref("extensions.formautofill.loglevel", "Trace");
 initTestLogging("Trace");
 
 const TEST_STORE_FILE_NAME = "test-profile.json";
 
 const TEST_PROFILE_1 = {
--- a/browser/extensions/formautofill/test/unit/test_toOneLineAddress.js
+++ b/browser/extensions/formautofill/test/unit/test_toOneLineAddress.js
@@ -1,12 +1,14 @@
 
 "use strict";
 
-ChromeUtils.import("resource://formautofill/FormAutofillUtils.jsm");
+add_task(async function setup() {
+  ChromeUtils.import("resource://formautofill/FormAutofillUtils.jsm");
+});
 
 add_task(async function test_getCategoriesFromFieldNames() {
   const TEST_CASES = [
     {
       strings: ["A", "B", "C", "D"],
       expectedValue: "A B C D",
     },
     {
--- a/browser/extensions/formautofill/test/unit/test_transformFields.js
+++ b/browser/extensions/formautofill/test/unit/test_transformFields.js
@@ -1,15 +1,18 @@
 /**
  * Tests the transform algorithm in profileStorage.
  */
 
 "use strict";
 
-const {FormAutofillStorage} = ChromeUtils.import("resource://formautofill/FormAutofillStorage.jsm", {});
+let FormAutofillStorage;
+add_task(async function setup() {
+  ({FormAutofillStorage} = ChromeUtils.import("resource://formautofill/FormAutofillStorage.jsm", {}));
+});
 
 const TEST_STORE_FILE_NAME = "test-profile.json";
 
 const ADDRESS_COMPUTE_TESTCASES = [
   // Name
   {
     description: "Has split names",
     address: {
@@ -896,16 +899,18 @@ add_task(async function test_computeAddr
     info("Verify testcase: " + testcase.description);
 
     let guid = profileStorage.addresses.add(testcase.address);
     let address = profileStorage.addresses.get(guid);
     do_check_record_matches(testcase.expectedResult, address);
 
     profileStorage.addresses.remove(guid);
   });
+
+  await profileStorage._finalize();
 });
 
 add_task(async function test_normalizeAddressFields() {
   let path = getTempFile(TEST_STORE_FILE_NAME).path;
 
   let profileStorage = new FormAutofillStorage(path);
   await profileStorage.initialize();
 
@@ -913,16 +918,18 @@ add_task(async function test_normalizeAd
     info("Verify testcase: " + testcase.description);
 
     let guid = profileStorage.addresses.add(testcase.address);
     let address = profileStorage.addresses.get(guid);
     do_check_record_matches(testcase.expectedResult, address);
 
     profileStorage.addresses.remove(guid);
   });
+
+  await profileStorage._finalize();
 });
 
 add_task(async function test_computeCreditCardFields() {
   let path = getTempFile(TEST_STORE_FILE_NAME).path;
 
   let profileStorage = new FormAutofillStorage(path);
   await profileStorage.initialize();
 
@@ -930,16 +937,18 @@ add_task(async function test_computeCred
     info("Verify testcase: " + testcase.description);
 
     let guid = profileStorage.creditCards.add(testcase.creditCard);
     let creditCard = profileStorage.creditCards.get(guid);
     do_check_record_matches(testcase.expectedResult, creditCard);
 
     profileStorage.creditCards.remove(guid);
   });
+
+  await profileStorage._finalize();
 });
 
 add_task(async function test_normalizeCreditCardFields() {
   let path = getTempFile(TEST_STORE_FILE_NAME).path;
 
   let profileStorage = new FormAutofillStorage(path);
   await profileStorage.initialize();
 
@@ -947,9 +956,11 @@ add_task(async function test_normalizeCr
     info("Verify testcase: " + testcase.description);
 
     let guid = profileStorage.creditCards.add(testcase.creditCard);
     let creditCard = profileStorage.creditCards.get(guid, {rawData: true});
     do_check_record_matches(testcase.expectedResult, creditCard);
 
     profileStorage.creditCards.remove(guid);
   });
+
+  await profileStorage._finalize();
 });
--- a/browser/locales/en-US/chrome/overrides/netError.dtd
+++ b/browser/locales/en-US/chrome/overrides/netError.dtd
@@ -145,21 +145,21 @@
 <ul>
   <li>The page you are trying to view cannot be shown because the authenticity of the received data could not be verified.</li>
   <li>Please contact the website owners to inform them of this problem.</li>
 </ul>
 ">
 
 <!ENTITY certerror.longpagetitle1 "Your connection is not secure">
 <!ENTITY certerror.longpagetitle2 "Warning: Potential Security Risk Ahead">
-<!-- Localization note (certerror.introPara, certerror.introPara1) - The text content of the span tag
+<!-- Localization note (certerror.introPara, certerror.introPara2) - The text content of the span tag
 will be replaced at runtime with the name of the server to which the user
 was trying to connect. -->
 <!ENTITY certerror.introPara "The owner of <span class='hostname'/> has configured their website improperly.  To protect your information from being stolen, &brandShortName; has not connected to this website.">
-<!ENTITY certerror.introPara1 "&brandShortName; detected a potential security threat and did not continue to <span class='hostname'/>. If you visit this site, attackers could try to steal information like your passwords, emails, or credit cards.">
+<!ENTITY certerror.introPara2 "&brandShortName; detected a potential security threat and did not continue to <span class='hostname'/>. If you visit this site, attackers could try to steal information like your passwords, emails, or credit card details.">
 
 <!ENTITY certerror.expiredCert.secondPara "This issue is most likely because your computer clock is set to the wrong time, which would prevent &brandShortName; from connecting securely.">
 
 <!ENTITY certerror.whatCanYouDoAboutItTitle "What can you do about it?">
 
 <!ENTITY certerror.unknownIssuer.whatCanYouDoAboutIt "
 <p>The issue is most likely with the website, and there is nothing you can do to resolve it.</p>
 <p>If you are on a corporate network or using anti-virus software, you can reach out to the support teams for assistance. You can also notify the website’s administrator about the problem.</p>
--- a/devtools/server/actors/network-monitor.js
+++ b/devtools/server/actors/network-monitor.js
@@ -23,94 +23,90 @@ const NetworkMonitorActor = ActorClassWi
    *
    * @param object filters
    *        Contains an `outerWindowID` attribute when this is used across processes.
    *        Or a `window` attribute when instanciated in the same process.
    * @param number parentID (optional)
    *        To be removed, specify the ID of the Web console actor.
    *        This is used to fake emitting an event from it to prevent changing RDP
    *        behavior.
-   * @param nsIMessageManager messageManager (optional)
-   *        Passed only when it is instanciated across processes. This is the manager to
-   *        use to communicate with the other process.
-   * @param object stackTraceCollector (optional)
-   *        When the actor runs in the same process than the requests we are inspecting,
-   *        the web console actor hands over a shared instance to the stack trace
-   *        collector.
+   * @param nsIMessageManager messageManager
+   *        This is the manager to use to communicate with the console actor. When both
+   *        netmonitor and console actor runs in the same process, this is an instance
+   *        of MockMessageManager instead of a real message manager.
    */
-  initialize(conn, filters, parentID, messageManager, stackTraceCollector) {
+  initialize(conn, filters, parentID, messageManager) {
     Actor.prototype.initialize.call(this, conn);
 
     this.parentID = parentID;
     this.messageManager = messageManager;
-    this.stackTraceCollector = stackTraceCollector;
 
     // Immediately start watching for new request according to `filters`.
     // NetworkMonitor will call `onNetworkEvent` method.
     this.netMonitor = new NetworkMonitor(filters, this);
     this.netMonitor.init();
 
-    if (this.messageManager) {
-      this.stackTraces = new Set();
-      this.onStackTraceAvailable = this.onStackTraceAvailable.bind(this);
-      this.messageManager.addMessageListener("debug:request-stack-available",
-        this.onStackTraceAvailable);
-      this.onRequestContent = this.onRequestContent.bind(this);
-      this.messageManager.addMessageListener("debug:request-content",
-        this.onRequestContent);
-      this.onSetPreference = this.onSetPreference.bind(this);
-      this.messageManager.addMessageListener("debug:netmonitor-preference",
-        this.onSetPreference);
-      this.onGetNetworkEventActor = this.onGetNetworkEventActor.bind(this);
-      this.messageManager.addMessageListener("debug:get-network-event-actor",
-        this.onGetNetworkEventActor);
-      this.destroy = this.destroy.bind(this);
-      this.messageManager.addMessageListener("debug:destroy-network-monitor",
-        this.destroy);
+    this.stackTraces = new Set();
+    this.onStackTraceAvailable = this.onStackTraceAvailable.bind(this);
+    this.messageManager.addMessageListener("debug:request-stack-available",
+      this.onStackTraceAvailable);
+    this.onRequestContent = this.onRequestContent.bind(this);
+    this.messageManager.addMessageListener("debug:request-content",
+      this.onRequestContent);
+    this.onSetPreference = this.onSetPreference.bind(this);
+    this.messageManager.addMessageListener("debug:netmonitor-preference",
+      this.onSetPreference);
+    this.onGetNetworkEventActor = this.onGetNetworkEventActor.bind(this);
+    this.messageManager.addMessageListener("debug:get-network-event-actor",
+      this.onGetNetworkEventActor);
+    this.onDestroyMessage = this.onDestroyMessage.bind(this);
+    this.messageManager.addMessageListener("debug:destroy-network-monitor",
+      this.onDestroyMessage);
+  },
+
+  onDestroyMessage({ data }) {
+    if (data.actorID == this.parentID) {
+      this.destroy();
     }
   },
 
   destroy() {
     Actor.prototype.destroy.call(this);
 
     if (this.netMonitor) {
       this.netMonitor.destroy();
       this.netMonitor = null;
     }
 
+    this.stackTraces.clear();
     if (this.messageManager) {
-      this.stackTraces.clear();
       this.messageManager.removeMessageListener("debug:request-stack-available",
         this.onStackTraceAvailable);
       this.messageManager.removeMessageListener("debug:request-content",
         this.onRequestContent);
       this.messageManager.removeMessageListener("debug:netmonitor-preference",
         this.onSetPreference);
       this.messageManager.removeMessageListener("debug:get-network-event-actor",
         this.onGetNetworkEventActor);
       this.messageManager.removeMessageListener("debug:destroy-network-monitor",
-        this.destroy);
+        this.onDestroyMessage);
       this.messageManager = null;
     }
   },
 
   onStackTraceAvailable(msg) {
     const { channelId } = msg.data;
     if (!msg.data.stacktrace) {
       this.stackTraces.delete(channelId);
     } else {
       this.stackTraces.add(channelId);
     }
   },
 
-  getRequestContentForURL(url) {
-    const actor = this._networkEventActorsByURL.get(url);
-    if (!actor) {
-      return null;
-    }
+  getRequestContentForActor(actor) {
     const content = actor._response.content;
     if (actor._discardResponseBody || actor._truncated || !content || !content.size) {
       // Do not return the stylesheet text if there is no meaningful content or if it's
       // still loading. Let the caller handle it by doing its own separate request.
       return null;
     }
 
     if (content.text.type != "longString") {
@@ -128,17 +124,20 @@ const NetworkMonitorActor = ActorClassWi
     return {
       content: longStringActor.str,
       contentType: content.mimeType,
     };
   },
 
   onRequestContent(msg) {
     const { url } = msg.data;
-    const content = this.getRequestContentForURL(url);
+    const actor = this._networkEventActorsByURL.get(url);
+    // Always reply with a message, but with a null `content` if this instance
+    // did not processed this request
+    const content = actor ? this.getRequestContentForActor(actor) : null;
     this.messageManager.sendAsyncMessage("debug:request-content", {
       url,
       content,
     });
   },
 
   onSetPreference({ data }) {
     if ("saveRequestAndResponseBodies" in data) {
@@ -146,17 +145,20 @@ const NetworkMonitorActor = ActorClassWi
     }
     if ("throttleData" in data) {
       this.netMonitor.throttleData = data.throttleData;
     }
   },
 
   onGetNetworkEventActor({ data }) {
     const actor = this.getNetworkEventActor(data.channelId);
-    this.messageManager.sendAsyncMessage("debug:get-network-event-actor", actor.form());
+    this.messageManager.sendAsyncMessage("debug:get-network-event-actor", {
+      channelId: data.channelId,
+      actor: actor.form()
+    });
   },
 
   getNetworkEventActor(channelId) {
     let actor = this._netEvents.get(channelId);
     if (actor) {
       return actor;
     }
 
@@ -170,23 +172,19 @@ const NetworkMonitorActor = ActorClassWi
 
   // This method is called by NetworkMonitor instance when a new request is fired
   onNetworkEvent(event) {
     const { channelId } = event;
 
     const actor = this.getNetworkEventActor(channelId);
     this._netEvents.set(channelId, actor);
 
-    if (this.messageManager) {
-      event.cause.stacktrace = this.stackTraces.has(channelId);
-      if (event.cause.stacktrace) {
-        this.stackTraces.delete(channelId);
-      }
-    } else {
-      event.cause.stacktrace = this.stackTraceCollector.getStackTrace(channelId);
+    event.cause.stacktrace = this.stackTraces.has(channelId);
+    if (event.cause.stacktrace) {
+      this.stackTraces.delete(channelId);
     }
     actor.init(event);
 
     this._networkEventActorsByURL.set(actor._request.url, actor);
 
     const packet = {
       from: this.parentID,
       type: "networkEvent",
--- a/devtools/server/actors/webconsole.js
+++ b/devtools/server/actors/webconsole.js
@@ -25,16 +25,17 @@ loader.lazyRequireGetter(this, "StackTra
 loader.lazyRequireGetter(this, "JSPropertyProvider", "devtools/shared/webconsole/js-property-provider", true);
 loader.lazyRequireGetter(this, "Parser", "resource://devtools/shared/Parser.jsm", true);
 loader.lazyRequireGetter(this, "NetUtil", "resource://gre/modules/NetUtil.jsm", true);
 loader.lazyRequireGetter(this, "WebConsoleCommands", "devtools/server/actors/webconsole/utils", true);
 loader.lazyRequireGetter(this, "addWebConsoleCommands", "devtools/server/actors/webconsole/utils", true);
 loader.lazyRequireGetter(this, "formatCommand", "devtools/server/actors/webconsole/commands", true);
 loader.lazyRequireGetter(this, "isCommand", "devtools/server/actors/webconsole/commands", true);
 loader.lazyRequireGetter(this, "validCommands", "devtools/server/actors/webconsole/commands", true);
+loader.lazyRequireGetter(this, "createMessageManagerMocks", "devtools/server/actors/webconsole/message-manager-mock", true);
 loader.lazyRequireGetter(this, "CONSOLE_WORKER_IDS", "devtools/server/actors/webconsole/utils", true);
 loader.lazyRequireGetter(this, "WebConsoleUtils", "devtools/server/actors/webconsole/utils", true);
 loader.lazyRequireGetter(this, "EnvironmentActor", "devtools/server/actors/environment", true);
 loader.lazyRequireGetter(this, "EventEmitter", "devtools/shared/event-emitter");
 
 // Overwrite implemented listeners for workers so that we don't attempt
 // to load an unsupported module.
 if (isWorker) {
@@ -320,32 +321,23 @@ WebConsoleActor.prototype =
   /**
    * Destroy the current WebConsoleActor instance.
    */
   destroy() {
     if (this.consoleServiceListener) {
       this.consoleServiceListener.destroy();
       this.consoleServiceListener = null;
     }
-    if (this.networkMonitorActor) {
-      this.networkMonitorActor.destroy();
-      this.networkMonitorActor = null;
-    }
-    if (this.networkMonitorActorId) {
-      const messageManager = this.parentActor.messageManager;
-      if (messageManager) {
+    if (this.netmonitors) {
+      for (const { messageManager } of this.netmonitors) {
         messageManager.sendAsyncMessage("debug:destroy-network-monitor", {
-          actorId: this.networkMonitorActorId
+          actorID: this.actorID
         });
       }
-      this.networkMonitorActorId = null;
-    }
-    if (this.networkMonitorChildActor) {
-      this.networkMonitorChildActor.destroy();
-      this.networkMonitorChildActor = null;
+      this.netmonitors = null;
     }
     if (this.consoleAPIListener) {
       this.consoleAPIListener.destroy();
       this.consoleAPIListener = null;
     }
     if (this.stackTraceCollector) {
       this.stackTraceCollector.destroy();
       this.stackTraceCollector = null;
@@ -584,30 +576,16 @@ WebConsoleActor.prototype =
    * @param object request
    *        The JSON request object received from the Web Console client.
    * @return object
    *         The response object which holds the startedListeners array.
    */
   startListeners: async function(request) {
     const startedListeners = [];
     const window = !this.parentActor.isRootActor ? this.window : null;
-    let messageManager = null;
-
-    // Check if the actor is running in a child process (but only if
-    // Services.appinfo exists, to prevent startListeners to fail
-    // when the target is a Worker).
-    const processBoundary = Services.appinfo && (
-      Services.appinfo.processType != Ci.nsIXULRuntime.PROCESS_TYPE_DEFAULT
-    );
-
-    // Retrieve a message manager from the parent actor if this actor is
-    // not currently running in the main process.
-    if (processBoundary) {
-      messageManager = this.parentActor.messageManager;
-    }
 
     while (request.listeners.length > 0) {
       const listener = request.listeners.shift();
       switch (listener) {
         case "PageError":
           // Workers don't support this message type yet
           if (isWorker) {
             break;
@@ -629,48 +607,79 @@ WebConsoleActor.prototype =
           }
           startedListeners.push(listener);
           break;
         case "NetworkActivity":
           // Workers don't support this message type
           if (isWorker) {
             break;
           }
-          if (!this.networkMonitorActorId && !this.networkMonitorActor) {
-            // Create a StackTraceCollector that's going to be shared both by
-            // the NetworkMonitorActor running in the same process for service worker
-            // requests, as well with the NetworkMonitorActor running in the parent
-            // process. It will communicate via message manager for this one.
-            this.stackTraceCollector = new StackTraceCollector({ window },
-              messageManager);
-            this.stackTraceCollector.init();
+          if (!this.netmonitors) {
+            // Instanciate fake message managers used for service worker's netmonitor
+            // when running in the content process, and for netmonitor running in the
+            // same process when running in the parent process.
+            // `createMessageManagerMocks` returns a couple of connected messages
+            // managers that pass messages to each other to simulate the process
+            // boundary. We will use the first one for the webconsole-actor and the
+            // second one will be used by the netmonitor-actor.
+            const [ mmMockParent, mmMockChild ] = createMessageManagerMocks();
 
-            if (messageManager && processBoundary) {
+            // Maintain the list of message manager we should message to/listen from
+            // to support the netmonitor instances, also records actorID of each
+            // NetworkMonitorActor.
+            // Array of `{ messageManager, parentProcess }`.
+            // Where `parentProcess` is true for the netmonitor actor instanciated in the
+            // parent process.
+            this.netmonitors = [];
+
+            // Check if the actor is running in a content process
+            const isInContentProcess =
+              Services.appinfo.processType != Ci.nsIXULRuntime.PROCESS_TYPE_DEFAULT &&
+              this.parentActor.messageManager;
+            if (isInContentProcess) {
               // Start a network monitor in the parent process to listen to
-              // most requests than happen in parent
-              this.networkMonitorActorId = await this.conn.spawnActorInParentProcess(
+              // most requests that happen in parent. This one will communicate through
+              // `messageManager`.
+              await this.conn.spawnActorInParentProcess(
                 this.actorID, {
                   module: "devtools/server/actors/network-monitor",
                   constructor: "NetworkMonitorActor",
                   args: [
                     { outerWindowID: this.parentActor.outerWindowID },
                     this.actorID
                   ],
                 });
+              this.netmonitors.push({
+                messageManager: this.parentActor.messageManager,
+                parentProcess: true
+              });
+            }
 
-              // Spawn also one in the child to listen to service workers
-              this.networkMonitorChildActor = new NetworkMonitorActor(this.conn,
-                { window },
-                this.actorID,
-                null,
-                this.stackTraceCollector);
-            } else {
-              this.networkMonitorActor = new NetworkMonitorActor(this.conn, { window },
-                this.actorID, null, this.stackTraceCollector);
-            }
+            // When the console actor runs in the parent process, Netmonitor can be ran
+            // in the process and communicate through `messageManagerMock`.
+            // And while it runs in the content process, we also spawn one in the content
+            // to listen to requests that happen in the content process (for instance
+            // service workers requests)
+            new NetworkMonitorActor(this.conn,
+              { window },
+              this.actorID,
+              mmMockParent);
+
+            this.netmonitors.push({
+              messageManager: mmMockChild,
+              parentProcess: !isInContentProcess
+            });
+
+            // Create a StackTraceCollector that's going to be shared both by
+            // the NetworkMonitorActor running in the same process for service worker
+            // requests, as well with the NetworkMonitorActor running in the parent
+            // process. It will communicate via message manager for this one.
+            this.stackTraceCollector = new StackTraceCollector({ window },
+              this.netmonitors);
+            this.stackTraceCollector.init();
           }
           startedListeners.push(listener);
           break;
         case "FileActivity":
           // Workers don't support this message type
           if (isWorker) {
             break;
           }
@@ -759,32 +768,23 @@ WebConsoleActor.prototype =
         case "ConsoleAPI":
           if (this.consoleAPIListener) {
             this.consoleAPIListener.destroy();
             this.consoleAPIListener = null;
           }
           stoppedListeners.push(listener);
           break;
         case "NetworkActivity":
-          if (this.networkMonitorActor) {
-            this.networkMonitorActor.destroy();
-            this.networkMonitorActor = null;
-          }
-          if (this.networkMonitorActorId) {
-            const messageManager = this.parentActor.messageManager;
-            if (messageManager) {
+          if (this.netmonitors) {
+            for (const { messageManager } of this.netmonitors) {
               messageManager.sendAsyncMessage("debug:destroy-network-monitor", {
-                actorId: this.networkMonitorActorId
+                actorID: this.actorID
               });
             }
-            this.networkMonitorActorId = null;
-          }
-          if (this.networkMonitorChildActor) {
-            this.networkMonitorChildActor.destroy();
-            this.networkMonitorChildActor = null;
+            this.netmonitors = null;
           }
           if (this.stackTraceCollector) {
             this.stackTraceCollector.destroy();
             this.stackTraceCollector = null;
           }
           stoppedListeners.push(listener);
           break;
         case "FileActivity":
@@ -1247,41 +1247,29 @@ WebConsoleActor.prototype =
    *
    * @param object request
    *        The request message - which preferences need to be updated.
    */
   setPreferences: function(request) {
     for (const key in request.preferences) {
       this._prefs[key] = request.preferences[key];
 
-      if (key == "NetworkMonitor.saveRequestAndResponseBodies") {
-        if (this.networkMonitorActor) {
-          this.networkMonitorActor.netMonitor.saveRequestAndResponseBodies =
-            this._prefs[key];
-        }
-        if (this.networkMonitorChildActor) {
-          this.networkMonitorChildActor.netMonitor.saveRequestAndResponseBodies =
-            this._prefs[key];
-        }
-        if (this.networkMonitorActorId) {
-          const messageManager = this.parentActor.messageManager;
-          messageManager.sendAsyncMessage("debug:netmonitor-preference",
-            { saveRequestAndResponseBodies: this._prefs[key] });
-        }
-      } else if (key == "NetworkMonitor.throttleData") {
-        if (this.networkMonitorActor) {
-          this.networkMonitorActor.netMonitor.throttleData = this._prefs[key];
-        }
-        if (this.networkMonitorChildActor) {
-          this.networkMonitorChildActor.netMonitor.throttleData = this._prefs[key];
-        }
-        if (this.networkMonitorActorId) {
-          const messageManager = this.parentActor.messageManager;
-          messageManager.sendAsyncMessage("debug:netmonitor-preference",
-            { throttleData: this._prefs[key] });
+      if (this.netmonitors) {
+        if (key == "NetworkMonitor.saveRequestAndResponseBodies") {
+          for (const { messageManager } of this.netmonitors) {
+            messageManager.sendAsyncMessage("debug:netmonitor-preference", {
+              saveRequestAndResponseBodies: this._prefs[key]
+            });
+          }
+        } else if (key == "NetworkMonitor.throttleData") {
+          for (const { messageManager } of this.netmonitors) {
+            messageManager.sendAsyncMessage("debug:netmonitor-preference", {
+              throttleData: this._prefs[key]
+            });
+          }
         }
       }
     }
     return { updated: Object.keys(request.preferences) };
   },
 
   // End of request handlers.
 
@@ -1813,36 +1801,40 @@ WebConsoleActor.prototype =
    * Get the NetworkEventActor for a given URL that may have been noticed by the network
    * listener.  Requests are added when they start, so the actor might not yet have all
    * data for the request until it has completed.
    *
    * @param string url
    *        The URL of the request to search for.
    */
   getRequestContentForURL(url) {
-    // When running in Parent Process, call the NetworkMonitorActor directly.
-    if (this.networkMonitorActor) {
-      return this.networkMonitorActor.getRequestContentForURL(url);
-    } else if (this.networkMonitorActorId) {
-      // Otherwise, if the netmonitor is started, but on the parent process,
-      // pipe the data through the message manager
-      const messageManager = this.parentActor.messageManager;
-      return new Promise(resolve => {
-        const onMessage = ({ data }) => {
-          if (data.url == url) {
+    if (!this.netmonitors) {
+      return null;
+    }
+    return new Promise(resolve => {
+      let messagesReceived = 0;
+      const onMessage = ({ data }) => {
+        if (data.url != url) {
+          return;
+        }
+        messagesReceived++;
+        // Either use the first response with a content, or return a null content
+        // if we received the responses from all the message managers.
+        if (data.content || messagesReceived == this.netmonitors.length) {
+          for (const { messageManager } of this.netmonitors) {
             messageManager.removeMessageListener("debug:request-content", onMessage);
-            resolve(data.content);
           }
-        };
+          resolve(data.content);
+        }
+      };
+      for (const { messageManager } of this.netmonitors) {
         messageManager.addMessageListener("debug:request-content", onMessage);
         messageManager.sendAsyncMessage("debug:request-content", { url });
-      });
-    }
-    // Finally, if the netmonitor is not started at all, return null
-    return null;
+      }
+    });
   },
 
   /**
    * Send a new HTTP request from the target's window.
    *
    * @param object message
    *        Object with 'request' - the HTTP request details.
    */
@@ -1878,40 +1870,38 @@ WebConsoleActor.prototype =
       const bodyStream = Cc["@mozilla.org/io/string-input-stream;1"]
         .createInstance(Ci.nsIStringInputStream);
       bodyStream.setData(body, body.length);
       channel.explicitSetUploadStream(bodyStream, null, -1, method, false);
     }
 
     NetUtil.asyncFetch(channel, () => {});
 
-    // When running in Parent Process, call the NetworkMonitorActor directly.
+    if (!this.netmonitors) {
+      return null;
+    }
     const { channelId } = channel;
-    if (this.networkMonitorActor) {
-      const actor = this.networkMonitorActor.getNetworkEventActor(channelId);
-      return {
-        eventActor: actor.form()
-      };
-    } else if (this.networkMonitorActorId) {
-      // Otherwise, if the netmonitor is started, but on the parent process,
-      // pipe the data through the message manager
-      const messageManager = this.parentActor.messageManager;
-      return new Promise(resolve => {
-        const onMessage = ({ data }) => {
+    // Only query the NetworkMonitorActor running in the parent process, where the
+    // request will be done. There always is one listener running in the parent process,
+    // see startListeners.
+    const netmonitor = this.netmonitors.filter(({ parentProcess }) => parentProcess)[0];
+    const { messageManager } = netmonitor;
+    return new Promise(resolve => {
+      const onMessage = ({ data }) => {
+        if (data.channelId == channelId) {
           messageManager.removeMessageListener("debug:get-network-event-actor",
             onMessage);
           resolve({
-            eventActor: data
+            eventActor: data.actor
           });
-        };
-        messageManager.addMessageListener("debug:get-network-event-actor", onMessage);
-        messageManager.sendAsyncMessage("debug:get-network-event-actor", { channelId });
-      });
-    }
-    return null;
+        }
+      };
+      messageManager.addMessageListener("debug:get-network-event-actor", onMessage);
+      messageManager.sendAsyncMessage("debug:get-network-event-actor", { channelId });
+    });
   },
 
   /**
    * Handler for file activity. This method sends the file request information
    * to the remote Web Console client.
    *
    * @see ConsoleProgressListener
    * @param string fileURI
new file mode 100644
--- /dev/null
+++ b/devtools/server/actors/webconsole/message-manager-mock.js
@@ -0,0 +1,68 @@
+/* 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";
+
+/**
+ * Implements a fake MessageManager class that allows to use the message
+ * manager API within the same process. This implementation will forward
+ * messages within the same process.
+ *
+ * It helps having the same codepath for actors being evaluated in the same
+ * process *and* in a remote one.
+ */
+function MessageManagerMock() {
+  this._listeners = new Map();
+}
+MessageManagerMock.prototype = {
+  addMessageListener(name, listener) {
+    let listeners = this._listeners.get(name);
+    if (!listeners) {
+      listeners = [];
+      this._listeners.set(name, listeners);
+    }
+    if (!listeners.includes(listener)) {
+      listeners.push(listener);
+    }
+  },
+  removeMessageListener(name, listener) {
+    const listeners = this._listeners.get(name);
+    const idx = listeners.indexOf(listener);
+    listeners.splice(idx, 1);
+  },
+  sendAsyncMessage(name, data) {
+    this.other.internalSendAsyncMessage(name, data);
+  },
+  internalSendAsyncMessage(name, data) {
+    const listeners = this._listeners.get(name);
+    if (!listeners) {
+      return;
+    }
+    const message = {
+      target: this,
+      data
+    };
+    for (const listener of listeners) {
+      if (typeof listener === "object" &&
+          typeof listener.receiveMessage === "function") {
+        listener.receiveMessage(message);
+      } else if (typeof listener === "function") {
+        listener(message);
+      }
+    }
+  },
+};
+
+/**
+ * Create two MessageManager mocks, connected to each others.
+ * Calling sendAsyncMessage on the first will dispatch messages on the second one,
+ * and the other way around
+ */
+exports.createMessageManagerMocks = function() {
+  const a = new MessageManagerMock();
+  const b = new MessageManagerMock();
+  a.other = b;
+  b.other = a;
+  return [a, b];
+};
--- a/devtools/server/actors/webconsole/moz.build
+++ b/devtools/server/actors/webconsole/moz.build
@@ -3,12 +3,13 @@
 # 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/.
 
 DevToolsModules(
     'commands.js',
     'content-process-forward.js',
     'listeners.js',
+    'message-manager-mock.js',
     'screenshot.js',
     'utils.js',
     'worker-listeners.js',
 )
--- a/devtools/shared/webconsole/network-helper.js
+++ b/devtools/shared/webconsole/network-helper.js
@@ -194,32 +194,16 @@ var NetworkHelper = {
 
         return this.readAndConvertFromStream(descriptor, charset);
       }
     }
     return null;
   },
 
   /**
-   * Gets the web appId that is associated with request.
-   *
-   * @param nsIHttpChannel request
-   * @returns number|null
-   *          The appId for the given request, if available.
-   */
-  getAppIdForRequest: function(request) {
-    try {
-      return this.getRequestLoadContext(request).appId;
-    } catch (ex) {
-      // request loadContent is not always available.
-    }
-    return null;
-  },
-
-  /**
    * Gets the topFrameElement that is associated with request. This
    * works in single-process and multiprocess contexts. It may cross
    * the content/chrome boundary.
    *
    * @param nsIHttpChannel request
    * @returns Element|null
    *          The top frame element for the given request.
    */
--- a/devtools/shared/webconsole/network-monitor.js
+++ b/devtools/shared/webconsole/network-monitor.js
@@ -12,22 +12,25 @@ const Services = require("Services");
 const { XPCOMUtils } = require("resource://gre/modules/XPCOMUtils.jsm");
 
 loader.lazyRequireGetter(this, "NetworkHelper",
                          "devtools/shared/webconsole/network-helper");
 loader.lazyRequireGetter(this, "DevToolsUtils",
                          "devtools/shared/DevToolsUtils");
 loader.lazyRequireGetter(this, "flags",
                          "devtools/shared/flags");
+loader.lazyRequireGetter(this, "NetworkThrottleManager",
+                         "devtools/shared/webconsole/throttle", true);
+loader.lazyRequireGetter(this, "CacheEntry",
+                         "devtools/shared/platform/cache-entry", true);
 loader.lazyImporter(this, "NetUtil", "resource://gre/modules/NetUtil.jsm");
 loader.lazyServiceGetter(this, "gActivityDistributor",
                          "@mozilla.org/network/http-activity-distributor;1",
                          "nsIHttpActivityDistributor");
-const {NetworkThrottleManager} = require("devtools/shared/webconsole/throttle");
-const {CacheEntry} = require("devtools/shared/platform/cache-entry");
+
 // Network logging
 
 // The maximum uint32 value.
 const PR_UINT32_MAX = 4294967295;
 
 // HTTP status codes.
 const HTTP_MOVED_PERMANENTLY = 301;
 const HTTP_FOUND = 302;
@@ -42,17 +45,17 @@ const HTTP_TEMPORARY_REDIRECT = 307;
  *        Request to check.
  * @param filters
  *        NetworkMonitor filters to match against.
  * @return boolean
  *         True if the network request should be logged, false otherwise.
  */
 function matchRequest(channel, filters) {
   // Log everything if no filter is specified
-  if (!filters.outerWindowID && !filters.window && !filters.appId) {
+  if (!filters.outerWindowID && !filters.window) {
     return true;
   }
 
   // Ignore requests from chrome or add-on code when we are monitoring
   // content.
   // TODO: one particular test (browser_styleeditor_fetch-from-cache.js) needs
   // the flags.testing check. We will move to a better way to serve
   // its needs in bug 1167188, where this check should be removed.
@@ -88,23 +91,16 @@ function matchRequest(channel, filters) 
         }
       } catch (e) {
         // outerWindowID getter from browser.xml (non-remote <xul:browser>) may
         // throw when closing a tab while resources are still loading.
       }
     }
   }
 
-  if (filters.appId) {
-    const appId = NetworkHelper.getAppIdForRequest(channel);
-    if (appId && appId == filters.appId) {
-      return true;
-    }
-  }
-
   return false;
 }
 
 /**
  * This is a nsIChannelEventSink implementation that monitors channel redirects and
  * informs the registered StackTraceCollector about the old and new channels.
  */
 const SINK_CLASS_DESCRIPTION = "NetworkMonitor Channel Event Sink";
@@ -172,43 +168,43 @@ ChannelEventSinkFactory.unregister = fun
 
 ChannelEventSinkFactory.getService = function() {
   // Make sure the ChannelEventSink service is registered before accessing it
   ChannelEventSinkFactory.register();
 
   return Cc[SINK_CONTRACT_ID].getService(Ci.nsIChannelEventSink).wrappedJSObject;
 };
 
-function StackTraceCollector(filters, messageManager) {
+function StackTraceCollector(filters, netmonitors) {
   this.filters = filters;
   this.stacktracesById = new Map();
-  this.messageManager = messageManager;
+  this.netmonitors = netmonitors;
 }
 
 StackTraceCollector.prototype = {
   init() {
     Services.obs.addObserver(this, "http-on-opening-request");
     ChannelEventSinkFactory.getService().registerCollector(this);
-    if (this.messageManager) {
-      this.onGetStack = this.onGetStack.bind(this);
-      this.messageManager.addMessageListener("debug:request-stack", this.onGetStack);
+    this.onGetStack = this.onGetStack.bind(this);
+    for (const { messageManager } of this.netmonitors) {
+      messageManager.addMessageListener("debug:request-stack", this.onGetStack);
     }
   },
 
   destroy() {
     Services.obs.removeObserver(this, "http-on-opening-request");
     ChannelEventSinkFactory.getService().unregisterCollector(this);
-    if (this.messageManager) {
-      this.messageManager.removeMessageListener("debug:request-stack", this.onGetStack);
+    for (const { messageManager } of this.netmonitors) {
+      messageManager.removeMessageListener("debug:request-stack", this.onGetStack);
     }
   },
 
   _saveStackTrace(channel, stacktrace) {
-    if (this.messageManager) {
-      this.messageManager.sendAsyncMessage("debug:request-stack-available", {
+    for (const { messageManager } of this.netmonitors) {
+      messageManager.sendAsyncMessage("debug:request-stack-available", {
         channelId: channel.channelId,
         stacktrace: stacktrace && stacktrace.length > 0
       });
     }
     this.stacktracesById.set(channel.channelId, stacktrace);
   },
 
   observe(subject) {
@@ -258,19 +254,20 @@ StackTraceCollector.prototype = {
 
   getStackTrace(channelId) {
     const trace = this.stacktracesById.get(channelId);
     this.stacktracesById.delete(channelId);
     return trace;
   },
 
   onGetStack(msg) {
+    const messageManager = msg.target;
     const channelId = msg.data;
     const stack = this.getStackTrace(channelId);
-    this.messageManager.sendAsyncMessage("debug:request-stack", {
+    messageManager.sendAsyncMessage("debug:request-stack", {
       channelId,
       stack,
     });
   },
 };
 
 exports.StackTraceCollector = StackTraceCollector;
 
@@ -764,17 +761,16 @@ NetworkResponseListener.prototype = {
  * http-on-examine-response notifications. All network request information is
  * routed to the remote Web Console.
  *
  * @constructor
  * @param object filters
  *        Object with the filters to use for network requests:
  *        - window (nsIDOMWindow): filter network requests by the associated
  *          window object.
- *        - appId (number): filter requests by the appId.
  *        - outerWindowID (number): filter requests by their top frame's outerWindowID.
  *        Filters are optional. If any of these filters match the request is
  *        logged (OR is applied). If no filter is provided then all requests are
  *        logged.
  * @param object owner
  *        The network monitor owner. This object needs to hold:
  *        - onNetworkEvent(requestInfo)
  *          This method is invoked once for every new network request and it is
--- a/dom/base/AttrArray.h
+++ b/dom/base/AttrArray.h
@@ -176,16 +176,21 @@ private:
   nsresult DoUpdateMappedAttrRuleMapper(nsMappedAttributeElement& aElement);
 
   struct InternalAttr
   {
     nsAttrName mName;
     nsAttrValue mValue;
   };
 
+#ifdef _MSC_VER
+// Disable MSVC warning 'nonstandard extension used: zero-sized array in struct/union'
+#pragma warning(push)
+#pragma warning(disable:4200)
+#endif
   class Impl
   {
   public:
 
     constexpr static size_t AllocationSizeForAttributes(uint32_t aAttrCount)
     {
       return sizeof(Impl) + aAttrCount * sizeof(InternalAttr);
     }
@@ -208,16 +213,20 @@ private:
     uint32_t mCapacity; // In number of InternalAttrs
 
     // Manually refcounted.
     nsMappedAttributes* mMappedAttrs;
 
     // Allocated in the same buffer as `Impl`.
     InternalAttr mBuffer[0];
   };
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
+
 
   mozilla::Span<InternalAttr> NonMappedAttrs()
   {
     return mImpl ? mImpl->NonMappedAttrs() : mozilla::Span<InternalAttr>();
   }
 
   mozilla::Span<const InternalAttr> NonMappedAttrs() const
   {
--- a/dom/indexedDB/ActorsParent.cpp
+++ b/dom/indexedDB/ActorsParent.cpp
@@ -22637,27 +22637,35 @@ DeleteDatabaseOp::LoadPreviousVersion(ns
   rv = OpenDatabaseAndHandleBusy(ss, aDatabaseFile, getter_AddRefs(connection));
   if (NS_WARN_IF(NS_FAILED(rv))) {
     return;
   }
 
 #ifdef DEBUG
   {
     nsCOMPtr<mozIStorageStatement> stmt;
-    MOZ_ALWAYS_SUCCEEDS(
-      connection->CreateStatement(NS_LITERAL_CSTRING(
-        "SELECT name "
-          "FROM database"
-        ), getter_AddRefs(stmt)));
+    rv = connection->CreateStatement(NS_LITERAL_CSTRING(
+      "SELECT name "
+      "FROM database"
+    ), getter_AddRefs(stmt));
+    if (NS_WARN_IF(NS_FAILED(rv))) {
+      return;
+    }
 
     bool hasResult;
-    MOZ_ALWAYS_SUCCEEDS(stmt->ExecuteStep(&hasResult));
+    rv = stmt->ExecuteStep(&hasResult);
+    if (NS_WARN_IF(NS_FAILED(rv))) {
+      return;
+    }
 
     nsString databaseName;
-    MOZ_ALWAYS_SUCCEEDS(stmt->GetString(0, databaseName));
+    rv = stmt->GetString(0, databaseName);
+    if (NS_WARN_IF(NS_FAILED(rv))) {
+      return;
+    }
 
     MOZ_ASSERT(mCommonParams.metadata().name() == databaseName);
   }
 #endif
 
   nsCOMPtr<mozIStorageStatement> stmt;
   rv = connection->CreateStatement(NS_LITERAL_CSTRING(
     "SELECT version "
--- a/dom/media/webaudio/test/mochitest.ini
+++ b/dom/media/webaudio/test/mochitest.ini
@@ -216,16 +216,21 @@ skip-if = toolkit == 'android' # bug 109
 [test_pannerNodeTail.html]
 [test_pannerNode_maxDistance.html]
 [test_setValueCurveWithNonFiniteElements.html]
 [test_stereoPannerNode.html]
 [test_stereoPannerNodePassThrough.html]
 [test_periodicWave.html]
 [test_periodicWaveDisableNormalization.html]
 [test_periodicWaveBandLimiting.html]
+[test_retrospective-exponentialRampToValueAtTime.html]
+[test_retrospective-linearRampToValueAtTime.html]
+[test_retrospective-setTargetAtTime.html]
+[test_retrospective-setValueAtTime.html]
+[test_retrospective-setValueCurveAtTime.html]
 [test_ScriptProcessorCollected1.html]
 [test_scriptProcessorNode.html]
 [test_scriptProcessorNodeChannelCount.html]
 [test_scriptProcessorNodePassThrough.html]
 [test_scriptProcessorNode_playbackTime1.html]
 [test_scriptProcessorNodeZeroInputOutput.html]
 [test_scriptProcessorNodeNotConnected.html]
 [test_sequentialBufferSourceWithResampling.html]
new file mode 100644
--- /dev/null
+++ b/dom/media/webaudio/test/test_retrospective-exponentialRampToValueAtTime.html
@@ -0,0 +1,51 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>Test exponentialRampToValue with end time in the past</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script>
+function do_test(t, context) {
+  var source = context.createConstantSource();
+  source.start();
+
+  var test = context.createGain();
+  test.gain.exponentialRampToValueAtTime(0.1, 0.5*context.currentTime);
+  test.gain.exponentialRampToValueAtTime(0.9, 2.0);
+
+  var reference = context.createGain();
+  reference.gain.exponentialRampToValueAtTime(0.1, context.currentTime);
+  reference.gain.exponentialRampToValueAtTime(0.9, 2.0);
+
+  source.connect(test);
+  source.connect(reference);
+
+  var merger = context.createChannelMerger();
+  test.connect(merger, 0, 0);
+  reference.connect(merger, 0, 1);
+
+  var processor = context.createScriptProcessor(0, 2, 0);
+  merger.connect(processor);
+  processor.onaudioprocess =
+    t.step_func_done((e) => {
+      source.stop();
+      processor.onaudioprocess = null;
+
+      var testValue = e.inputBuffer.getChannelData(0)[0];
+      var referenceValue = e.inputBuffer.getChannelData(1)[0];
+
+      assert_equals(testValue, referenceValue,
+                        "value matches expected");
+    });
+}
+
+async_test(function(t) {
+  var context = new AudioContext;
+  (function waitForTimeAdvance() {
+    if (context.currentTime == 0) {
+      t.step_timeout(waitForTimeAdvance, 0);
+    } else {
+      do_test(t, context);
+    }
+  })();
+});
+</script>
new file mode 100644
--- /dev/null
+++ b/dom/media/webaudio/test/test_retrospective-linearRampToValueAtTime.html
@@ -0,0 +1,51 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>Test linearRampToValue with end time in the past</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script>
+function do_test(t, context) {
+  var source = context.createConstantSource();
+  source.start();
+
+  var test = context.createGain();
+  test.gain.linearRampToValueAtTime(0.1, 0.5*context.currentTime);
+  test.gain.linearRampToValueAtTime(0.9, 2.0);
+
+  var reference = context.createGain();
+  reference.gain.linearRampToValueAtTime(0.1, context.currentTime);
+  reference.gain.linearRampToValueAtTime(0.9, 2.0);
+
+  source.connect(test);
+  source.connect(reference);
+
+  var merger = context.createChannelMerger();
+  test.connect(merger, 0, 0);
+  reference.connect(merger, 0, 1);
+
+  var processor = context.createScriptProcessor(0, 2, 0);
+  merger.connect(processor);
+  processor.onaudioprocess =
+    t.step_func_done((e) => {
+      source.stop();
+      processor.onaudioprocess = null;
+
+      var testValue = e.inputBuffer.getChannelData(0)[0];
+      var referenceValue = e.inputBuffer.getChannelData(1)[0];
+
+      assert_equals(testValue, referenceValue,
+                        "value matches expected");
+    });
+}
+
+async_test(function(t) {
+  var context = new AudioContext;
+  (function waitForTimeAdvance() {
+    if (context.currentTime == 0) {
+      t.step_timeout(waitForTimeAdvance, 0);
+    } else {
+      do_test(t, context);
+    }
+  })();
+});
+</script>
new file mode 100644
--- /dev/null
+++ b/dom/media/webaudio/test/test_retrospective-setTargetAtTime.html
@@ -0,0 +1,51 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>Test setTargetAtTime with start time in the past</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script>
+function do_test(t, context) {
+  var source = context.createConstantSource();
+  source.start();
+
+  var test = context.createGain();
+  test.gain.setTargetAtTime(0.1, 0.5*context.currentTime, 0.1);
+  test.gain.linearRampToValueAtTime(0.9, 2.0);
+
+  var reference = context.createGain();
+  reference.gain.setTargetAtTime(0.1, context.currentTime, 0.1);
+  reference.gain.linearRampToValueAtTime(0.9, 2.0);
+
+  source.connect(test);
+  source.connect(reference);
+
+  var merger = context.createChannelMerger();
+  test.connect(merger, 0, 0);
+  reference.connect(merger, 0, 1);
+
+  var processor = context.createScriptProcessor(0, 2, 0);
+  merger.connect(processor);
+  processor.onaudioprocess =
+    t.step_func_done((e) => {
+      source.stop();
+      processor.onaudioprocess = null;
+
+      var testValue = e.inputBuffer.getChannelData(0)[0];
+      var referenceValue = e.inputBuffer.getChannelData(1)[0];
+
+      assert_equals(testValue, referenceValue,
+                        "value matches expected");
+    });
+}
+
+async_test(function(t) {
+  var context = new AudioContext;
+  (function waitForTimeAdvance() {
+    if (context.currentTime == 0) {
+      t.step_timeout(waitForTimeAdvance, 0);
+    } else {
+      do_test(t, context);
+    }
+  })();
+});
+</script>
new file mode 100644
--- /dev/null
+++ b/dom/media/webaudio/test/test_retrospective-setValueAtTime.html
@@ -0,0 +1,54 @@
+<!DOCTYPE html>
+<title>Test setValueAtTime with startTime in the past</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+function do_test(t, context) {
+  var source = context.createConstantSource();
+  source.start();
+
+  // Use a ramp of slope 1/sample to measure time.
+  // The end value is the extent of exact precision in single precision float.
+  const rampEnd = Math.pow(2, 24);
+  const rampEndSeconds = rampEnd / context.sampleRate;
+  var test = context.createGain();
+  test.gain.setValueAtTime(0.0, 0.5*context.currentTime);
+  test.gain.linearRampToValueAtTime(rampEnd, rampEndSeconds);
+
+  var reference = context.createGain();
+  reference.gain.setValueAtTime(0.0, context.currentTime);
+  reference.gain.linearRampToValueAtTime(rampEnd, rampEndSeconds);
+
+  source.connect(test);
+  source.connect(reference);
+
+  var merger = context.createChannelMerger();
+  test.connect(merger, 0, 0);
+  reference.connect(merger, 0, 1);
+
+  var processor = context.createScriptProcessor(0, 2, 0);
+  merger.connect(processor);
+  processor.onaudioprocess =
+    t.step_func_done((e) => {
+      source.stop();
+      processor.onaudioprocess = null;
+
+      var testValue = e.inputBuffer.getChannelData(0)[0];
+      var referenceValue = e.inputBuffer.getChannelData(1)[0];
+
+      assert_equals(testValue, referenceValue,
+                        "ramp value matches expected");
+    });
+}
+
+async_test(function(t) {
+  var context = new AudioContext;
+  (function waitForTimeAdvance() {
+    if (context.currentTime == 0) {
+      t.step_timeout(waitForTimeAdvance, 0);
+    } else {
+      do_test(t, context);
+    }
+  })();
+});
+</script>
new file mode 100644
--- /dev/null
+++ b/dom/media/webaudio/test/test_retrospective-setValueCurveAtTime.html
@@ -0,0 +1,49 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>Test SetValueCurve with start time in the past</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script>
+function do_test(t, context) {
+  var source = context.createConstantSource();
+  source.start();
+
+  var test = context.createGain();
+  test.gain.setValueCurveAtTime(new Float32Array([1.0, 0.1]), 0.0, 1.0);
+
+  var reference = context.createGain();
+  reference.gain.setValueCurveAtTime(new Float32Array([1.0, 0.1]), 0.5*context.currentTime, 1.0);
+
+  source.connect(test);
+  source.connect(reference);
+
+  var merger = context.createChannelMerger();
+  test.connect(merger, 0, 0);
+  reference.connect(merger, 0, 1);
+
+  var processor = context.createScriptProcessor(0, 2, 0);
+  merger.connect(processor);
+  processor.onaudioprocess =
+    t.step_func_done((e) => {
+      source.stop();
+      processor.onaudioprocess = null;
+
+      var testValue = e.inputBuffer.getChannelData(0)[0];
+      var referenceValue = e.inputBuffer.getChannelData(1)[0];
+
+      assert_equals(testValue, referenceValue,
+                        "value matches expected");
+    });
+}
+
+async_test(function(t) {
+  var context = new AudioContext;
+  (function waitForTimeAdvance() {
+    if (context.currentTime == 0) {
+      t.step_timeout(waitForTimeAdvance, 0);
+    } else {
+      do_test(t, context);
+    }
+  })();
+});
+</script>
--- a/editor/libeditor/EditorBase.cpp
+++ b/editor/libeditor/EditorBase.cpp
@@ -4532,17 +4532,17 @@ EditorBase::ClearSelection()
   RefPtr<Selection> selection = GetSelection();
   NS_ENSURE_TRUE(selection, NS_ERROR_FAILURE);
   ErrorResult rv;
   selection->RemoveAllRanges(rv);
   return rv.StealNSResult();
 }
 
 already_AddRefed<Element>
-EditorBase::CreateHTMLContent(nsAtom* aTag)
+EditorBase::CreateHTMLContent(const nsAtom* aTag)
 {
   MOZ_ASSERT(aTag);
 
   nsCOMPtr<nsIDocument> doc = GetDocument();
   if (!doc) {
     return nullptr;
   }
 
--- a/editor/libeditor/EditorBase.h
+++ b/editor/libeditor/EditorBase.h
@@ -1041,17 +1041,17 @@ protected: // May be called by friends.
                                             const nsAString& aValue,
                                             bool aSuppressTransaction) = 0;
 
   /**
    * Method to replace certain CreateElementNS() calls.
    *
    * @param aTag        Tag you want.
    */
-  already_AddRefed<Element> CreateHTMLContent(nsAtom* aTag);
+  already_AddRefed<Element> CreateHTMLContent(const nsAtom* aTag);
 
   /**
    * Creates text node which is marked as "maybe modified frequently".
    */
   static already_AddRefed<nsTextNode> CreateTextNode(nsIDocument& aDocument,
                                                      const nsAString& aData);
 
   /**
--- a/editor/libeditor/HTMLEditor.cpp
+++ b/editor/libeditor/HTMLEditor.cpp
@@ -1462,17 +1462,17 @@ HTMLEditor::RebuildDocumentFromSource(co
       // assume there is no head, the entire source is body
       nsresult rv = LoadHTML(body + aSourceString);
       if (NS_WARN_IF(NS_FAILED(rv))) {
         return rv;
       }
     }
 
     RefPtr<Element> divElement =
-      CreateElementWithDefaults(NS_LITERAL_STRING("div"));
+      CreateElementWithDefaults(*nsGkAtoms::div);
     if (NS_WARN_IF(!divElement)) {
       return NS_ERROR_FAILURE;
     }
     CloneAttributesWithTransaction(*rootElement, *divElement);
 
     return MaybeCollapseSelectionAtFirstEditableNode(false);
   }
 
@@ -2800,84 +2800,86 @@ HTMLEditor::GetSelectedElement(Selection
       }
     }
     iter->Next();
   }
   return selectedElement.forget();
 }
 
 already_AddRefed<Element>
-HTMLEditor::CreateElementWithDefaults(const nsAString& aTagName)
+HTMLEditor::CreateElementWithDefaults(const nsAtom& aTagName)
 {
-  MOZ_ASSERT(!aTagName.IsEmpty());
-
-  nsAutoString tagName(aTagName);
-  ToLowerCase(tagName);
-  nsAutoString realTagName;
-
-  if (IsLinkTag(tagName) || IsNamedAnchorTag(tagName)) {
-    realTagName.Assign('a');
-  } else {
-    realTagName = tagName;
-  }
+  // NOTE: Despite of public method, this can be called for internal use.
+
+  const nsAtom* realTagName =
+    IsLinkTag(aTagName) || IsNamedAnchorTag(aTagName) ? nsGkAtoms::a :
+                                                        &aTagName;
+
   // We don't use editor's CreateElement because we don't want to go through
   // the transaction system
 
   // New call to use instead to get proper HTML element, bug 39919
-  RefPtr<nsAtom> realTagAtom = NS_Atomize(realTagName);
-  RefPtr<Element> newElement = CreateHTMLContent(realTagAtom);
+  RefPtr<Element> newElement = CreateHTMLContent(realTagName);
   if (!newElement) {
     return nullptr;
   }
 
   // Mark the new element dirty, so it will be formatted
-  ErrorResult rv;
+  // XXX Don't we need to check the error result of setting _moz_dirty attr?
+  IgnoredErrorResult rv;
   newElement->SetAttribute(NS_LITERAL_STRING("_moz_dirty"), EmptyString(), rv);
 
   // Set default values for new elements
-  if (tagName.EqualsLiteral("table")) {
+  if (realTagName == nsGkAtoms::table) {
     newElement->SetAttribute(NS_LITERAL_STRING("cellpadding"),
                              NS_LITERAL_STRING("2"), rv);
     if (NS_WARN_IF(rv.Failed())) {
-      rv.SuppressException();
       return nullptr;
     }
     newElement->SetAttribute(NS_LITERAL_STRING("cellspacing"),
                              NS_LITERAL_STRING("2"), rv);
     if (NS_WARN_IF(rv.Failed())) {
-      rv.SuppressException();
       return nullptr;
     }
     newElement->SetAttribute(NS_LITERAL_STRING("border"),
                              NS_LITERAL_STRING("1"), rv);
     if (NS_WARN_IF(rv.Failed())) {
-      rv.SuppressException();
       return nullptr;
     }
-  } else if (tagName.EqualsLiteral("td")) {
+  } else if (realTagName == nsGkAtoms::td) {
     nsresult rv =
       SetAttributeOrEquivalent(
         newElement, nsGkAtoms::valign, NS_LITERAL_STRING("top"), true);
-    NS_ENSURE_SUCCESS(rv, nullptr);
+    if (NS_WARN_IF(NS_FAILED(rv))) {
+      return nullptr;
+    }
   }
   // ADD OTHER TAGS HERE
 
   return newElement.forget();
 }
 
 NS_IMETHODIMP
 HTMLEditor::CreateElementWithDefaults(const nsAString& aTagName,
                                       Element** aReturn)
 {
-  NS_ENSURE_TRUE(!aTagName.IsEmpty() && aReturn, NS_ERROR_NULL_POINTER);
+  if (NS_WARN_IF(aTagName.IsEmpty()) || NS_WARN_IF(!aReturn)) {
+    return NS_ERROR_INVALID_ARG;
+  }
+
   *aReturn = nullptr;
 
-  nsCOMPtr<Element> newElement = CreateElementWithDefaults(aTagName);
-  NS_ENSURE_TRUE(newElement, NS_ERROR_FAILURE);
-
+  RefPtr<nsAtom> tagName = GetLowerCaseNameAtom(aTagName);
+  if (NS_WARN_IF(!tagName)) {
+    return NS_ERROR_INVALID_ARG;
+  }
+  RefPtr<Element> newElement = CreateElementWithDefaults(*tagName);
+  if (NS_WARN_IF(!newElement)) {
+    return NS_ERROR_FAILURE;
+  }
   newElement.forget(aReturn);
   return NS_OK;
 }
 
 NS_IMETHODIMP
 HTMLEditor::InsertLinkAroundSelection(Element* aAnchorElement)
 {
   NS_ENSURE_TRUE(aAnchorElement, NS_ERROR_NULL_POINTER);
--- a/editor/libeditor/HTMLEditor.h
+++ b/editor/libeditor/HTMLEditor.h
@@ -176,16 +176,32 @@ public:
 
   /**
    * OnInputLineBreak() is called when user inputs a line break with
    * Shift + Enter or something.
    */
   nsresult OnInputLineBreak();
 
   /**
+   * CreateElementWithDefaults() creates new element whose name is
+   * aTagName with some default attributes are set.  Note that this is a
+   * public utility method.  I.e., just creates element, not insert it
+   * into the DOM tree.
+   * NOTE: This is available for internal use too since this does not change
+   *       the DOM tree nor undo transactions, and does not refer Selection,
+   *       HTMLEditRules, etc.
+   *
+   * @param aTagName            The new element's tag name.  If the name is
+   *                            one of "href", "anchor" or "namedanchor",
+   *                            this creates an <a> element.
+   * @return                    Newly created element.
+   */
+  already_AddRefed<Element> CreateElementWithDefaults(const nsAtom& aTagName);
+
+  /**
    * Indent or outdent content around Selection.
    */
   nsresult IndentAsAction();
   nsresult OutdentAsAction();
 
   /**
    * event callback when a mouse button is pressed
    * @param aX      [IN] horizontal position of the pointer
@@ -1472,20 +1488,17 @@ protected: // Shouldn't be used by frien
                               nsAtom* aAttribute,
                               const nsAString* aValue);
   nsresult SetInlinePropertyOnNodeImpl(nsIContent& aNode,
                                        nsAtom& aProperty,
                                        nsAtom* aAttribute,
                                        const nsAString& aValue);
   typedef enum { eInserted, eAppended } InsertedOrAppended;
   void DoContentInserted(nsIContent* aChild, InsertedOrAppended);
-  // XXX Shouldn't this used by external classes instead of nsIHTMLEditor's
-  //     method?
-  already_AddRefed<Element> CreateElementWithDefaults(
-                              const nsAString& aTagName);
+
   /**
    * Returns an anonymous Element of type aTag,
    * child of aParentContent. If aIsCreatedHidden is true, the class
    * "hidden" is added to the created element. If aAnonClass is not
    * the empty string, it becomes the value of the attribute "_moz_anonclass"
    * @return a Element
    * @param aTag             [IN] desired type of the element to create
    * @param aParentContent   [IN] the parent node of the created anonymous
--- a/editor/libeditor/HTMLEditorCommands.cpp
+++ b/editor/libeditor/HTMLEditorCommands.cpp
@@ -1531,22 +1531,26 @@ InsertTagCommand::DoCommand(const char* 
   if (NS_WARN_IF(!editor)) {
     return NS_ERROR_FAILURE;
   }
   mozilla::HTMLEditor* htmlEditor = editor->AsHTMLEditor();
   if (NS_WARN_IF(!htmlEditor)) {
     return NS_ERROR_FAILURE;
   }
 
-  RefPtr<Element> newElement;
-  nsresult rv = htmlEditor->CreateElementWithDefaults(
-    nsDependentAtomString(mTagName), getter_AddRefs(newElement));
-  NS_ENSURE_SUCCESS(rv, rv);
-
-  return htmlEditor->InsertElementAtSelection(newElement, true);
+  RefPtr<Element> newElement =
+    htmlEditor->CreateElementWithDefaults(*mTagName);
+  if (NS_WARN_IF(!newElement)) {
+    return NS_ERROR_FAILURE;
+  }
+  nsresult rv = htmlEditor->InsertElementAtSelection(newElement, true);
+  if (NS_WARN_IF(NS_FAILED(rv))) {
+    return rv;
+  }
+  return NS_OK;
 }
 
 NS_IMETHODIMP
 InsertTagCommand::DoCommandParams(const char *aCommandName,
                                   nsICommandParams *aParams,
                                   nsISupports *refCon)
 {
   NS_ENSURE_ARG_POINTER(refCon);
@@ -1586,32 +1590,42 @@ InsertTagCommand::DoCommandParams(const 
   if (mTagName == nsGkAtoms::a) {
     attributeType.AssignLiteral("href");
   } else if (mTagName == nsGkAtoms::img) {
     attributeType.AssignLiteral("src");
   } else {
     return NS_ERROR_NOT_IMPLEMENTED;
   }
 
-  RefPtr<Element> elem;
-  rv = htmlEditor->CreateElementWithDefaults(nsDependentAtomString(mTagName),
-                                             getter_AddRefs(elem));
-  NS_ENSURE_SUCCESS(rv, rv);
+  RefPtr<Element> newElement =
+    htmlEditor->CreateElementWithDefaults(*mTagName);
+  if (NS_WARN_IF(!newElement)) {
+    return NS_ERROR_FAILURE;
+  }
 
   ErrorResult err;
-  elem->SetAttribute(attributeType, attribute, err);
+  newElement->SetAttribute(attributeType, attribute, err);
   if (NS_WARN_IF(err.Failed())) {
     return err.StealNSResult();
   }
 
   // do actual insertion
   if (mTagName == nsGkAtoms::a) {
-    return htmlEditor->InsertLinkAroundSelection(elem);
+    rv = htmlEditor->InsertLinkAroundSelection(newElement);
+    if (NS_WARN_IF(NS_FAILED(rv))) {
+      return rv;
+    }
+    return NS_OK;
   }
-  return htmlEditor->InsertElementAtSelection(elem, true);
+
+  rv = htmlEditor->InsertElementAtSelection(newElement, true);
+  if (NS_WARN_IF(NS_FAILED(rv))) {
+    return rv;
+  }
+  return NS_OK;
 }
 
 NS_IMETHODIMP
 InsertTagCommand::GetCommandStateParams(const char *aCommandName,
                                         nsICommandParams *aParams,
                                         nsISupports *refCon)
 {
   NS_ENSURE_ARG_POINTER(aParams);
--- a/editor/libeditor/HTMLTableEditor.cpp
+++ b/editor/libeditor/HTMLTableEditor.cpp
@@ -104,18 +104,17 @@ HTMLEditor::InsertCell(Element* aCell,
 
   // And the parent and offsets needed to do an insert
   EditorDOMPoint pointToInsert(aCell);
   if (NS_WARN_IF(!pointToInsert.IsSet())) {
     return NS_ERROR_INVALID_ARG;
   }
 
   RefPtr<Element> newCell =
-    CreateElementWithDefaults(aIsHeader ? NS_LITERAL_STRING("th") :
-                                          NS_LITERAL_STRING("tb"));
+    CreateElementWithDefaults(aIsHeader ? *nsGkAtoms::th : *nsGkAtoms::td);
   if (NS_WARN_IF(!newCell)) {
     return NS_ERROR_FAILURE;
   }
 
   //Optional: return new cell created
   if (aNewCell) {
     *aNewCell = do_AddRef(newCell).take();
   }
@@ -197,28 +196,28 @@ HTMLEditor::InsertTableCell(int32_t aNum
   //We control selection resetting after the insert...
   AutoSelectionSetterAfterTableEdit setCaret(*this, table, startRowIndex,
                                              newCellIndex, ePreviousColumn,
                                              false);
   //...so suppress Rules System selection munging
   AutoTransactionsConserveSelection dontChangeSelection(*this);
 
   for (int32_t i = 0; i < aNumber; i++) {
-    RefPtr<Element> newCell;
-    rv = CreateElementWithDefaults(NS_LITERAL_STRING("td"),
-                                   getter_AddRefs(newCell));
-    if (NS_SUCCEEDED(rv) && newCell) {
+    RefPtr<Element> newCell = CreateElementWithDefaults(*nsGkAtoms::td);
+    if (newCell) {
       if (aAfter) {
         cellOffset++;
       }
       rv = InsertNodeWithTransaction(*newCell,
                                      EditorRawDOMPoint(cellParent, cellOffset));
       if (NS_FAILED(rv)) {
         break;
       }
+    } else {
+      rv = NS_ERROR_FAILURE;
     }
   }
   // XXX This is perhaps the result of the last call of
   //     InsertNodeWithTransaction() or CreateElementWithDefaults().
   return rv;
 }
 
 NS_IMETHODIMP
@@ -620,23 +619,26 @@ HTMLEditor::InsertTableRow(int32_t aNumb
 
     // Adjust for when adding past the end
     if (aAfter && startRowIndex >= rowCount) {
       newRowOffset++;
     }
 
     for (int32_t row = 0; row < aNumber; row++) {
       // Create a new row
-      nsCOMPtr<Element> newRow = CreateElementWithDefaults(trStr);
-      NS_ENSURE_TRUE(newRow, NS_ERROR_FAILURE);
+      RefPtr<Element> newRow = CreateElementWithDefaults(*nsGkAtoms::tr);
+      if (NS_WARN_IF(!newRow)) {
+        return NS_ERROR_FAILURE;
+      }
 
       for (int32_t i = 0; i < cellsInRow; i++) {
-        nsCOMPtr<Element> newCell =
-          CreateElementWithDefaults(NS_LITERAL_STRING("td"));
-        NS_ENSURE_TRUE(newCell, NS_ERROR_FAILURE);
+        RefPtr<Element> newCell = CreateElementWithDefaults(*nsGkAtoms::td);
+        if (NS_WARN_IF(!newCell)) {
+          return NS_ERROR_FAILURE;
+        }
 
         // Don't use transaction system yet! (not until entire row is
         // inserted)
         ErrorResult result;
         newRow->AppendChild(*newCell, result);
         if (NS_WARN_IF(result.Failed())) {
           return result.StealNSResult();
         }
--- a/extensions/pref/autoconfig/public/moz.build
+++ b/extensions/pref/autoconfig/public/moz.build
@@ -1,13 +1,12 @@
 # -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
 # vim: set filetype=python:
 # 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/.
 
 XPIDL_SOURCES += [
-    'nsIAutoConfig.idl',
     'nsIReadConfig.idl',
 ]
 
 XPIDL_MODULE = 'autoconfig'
 
deleted file mode 100644
--- a/extensions/pref/autoconfig/public/nsIAutoConfig.idl
+++ /dev/null
@@ -1,26 +0,0 @@
-/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* 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/. */
-
-#include "nsISupports.idl"
-
-
-%{C++
-
-#define NS_AUTOCONFIG_CID\
-  { 0xe036c738,\
-    0x1dd1,\
-    0x11b2,\
-    { 0x93, 0x92, 0x9d, 0x94, 0xaa, 0x74, 0xb0, 0xc5 }\
-  }
- 
-#define NS_AUTOCONFIG_CONTRACTID \
-  "@mozilla.org/autoconfiguration;1" 
-
-%}
-
-[uuid (80DB54AE-13F2-11d5-BE44-00108335A220)]
-interface nsIAutoConfig : nsISupports {
-  attribute string configURL;
-};
--- a/extensions/pref/autoconfig/src/nsAutoConfig.cpp
+++ b/extensions/pref/autoconfig/src/nsAutoConfig.cpp
@@ -28,17 +28,17 @@
 #include "mozilla/Logging.h"
 
 using mozilla::LogLevel;
 
 mozilla::LazyLogModule MCD("MCD");
 
 // nsISupports Implementation
 
-NS_IMPL_ISUPPORTS(nsAutoConfig, nsIAutoConfig, nsITimerCallback, nsIStreamListener,
+NS_IMPL_ISUPPORTS(nsAutoConfig, nsITimerCallback, nsIStreamListener,
                   nsIObserver, nsIRequestObserver, nsISupportsWeakReference,
                   nsINamed)
 
 nsAutoConfig::nsAutoConfig()
 {
 }
 
 nsresult nsAutoConfig::Init()
@@ -58,38 +58,20 @@ nsresult nsAutoConfig::Init()
 
     return rv;
 }
 
 nsAutoConfig::~nsAutoConfig()
 {
 }
 
-// attribute string configURL
-NS_IMETHODIMP nsAutoConfig::GetConfigURL(char **aConfigURL)
+void
+nsAutoConfig::SetConfigURL(const char *aConfigURL)
 {
-    if (!aConfigURL)
-        return NS_ERROR_NULL_POINTER;
-
-    if (mConfigURL.IsEmpty()) {
-        *aConfigURL = nullptr;
-        return NS_OK;
-    }
-
-    *aConfigURL = ToNewCString(mConfigURL);
-    if (!*aConfigURL)
-        return NS_ERROR_OUT_OF_MEMORY;
-    return NS_OK;
-}
-NS_IMETHODIMP nsAutoConfig::SetConfigURL(const char *aConfigURL)
-{
-    if (!aConfigURL)
-        return NS_ERROR_NULL_POINTER;
     mConfigURL.Assign(aConfigURL);
-    return NS_OK;
 }
 
 NS_IMETHODIMP
 nsAutoConfig::OnStartRequest(nsIRequest *request, nsISupports *context)
 {
     return NS_OK;
 }
 
--- a/extensions/pref/autoconfig/src/nsAutoConfig.h
+++ b/extensions/pref/autoconfig/src/nsAutoConfig.h
@@ -1,48 +1,47 @@
 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
 /* 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/. */
 
 #ifndef nsAutoConfig_h
 #define nsAutoConfig_h
 
-#include "nsIAutoConfig.h"
 #include "nsITimer.h"
 #include "nsIFile.h"
 #include "nsINamed.h"
 #include "nsIObserver.h"
 #include "nsIStreamListener.h"
 #include "nsIPrefService.h"
 #include "nsIPrefBranch.h"
 #include "nsWeakReference.h"
 #include "nsString.h"
 
-class nsAutoConfig : public nsIAutoConfig,
-                     public nsITimerCallback,
-                     public nsIStreamListener,
-                     public nsIObserver,
-                     public nsSupportsWeakReference,
-                     public nsINamed
+class nsAutoConfig final : public nsITimerCallback,
+                           public nsIStreamListener,
+                           public nsIObserver,
+                           public nsSupportsWeakReference,
+                           public nsINamed
 
 {
     public:
 
         NS_DECL_THREADSAFE_ISUPPORTS
-        NS_DECL_NSIAUTOCONFIG
         NS_DECL_NSIREQUESTOBSERVER
         NS_DECL_NSISTREAMLISTENER
         NS_DECL_NSIOBSERVER
         NS_DECL_NSITIMERCALLBACK
         NS_DECL_NSINAMED
 
         nsAutoConfig();
         nsresult Init();
 
+        void SetConfigURL(const char* aConfigURL);
+
     protected:
 
         virtual ~nsAutoConfig();
         nsresult downloadAutoConfig();
         nsresult readOfflineFile();
         nsresult evaluateLocalFile(nsIFile *file);
         nsresult writeFailoverFile();
         nsresult getEmailAddr(nsACString & emailAddr);
--- a/extensions/pref/autoconfig/src/nsConfigFactory.cpp
+++ b/extensions/pref/autoconfig/src/nsConfigFactory.cpp
@@ -1,32 +1,27 @@
 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 /* 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/. */
 
 #include "mozilla/ModuleUtils.h"
-#include "nsAutoConfig.h"
 #include "nsReadConfig.h"
 #include "nsIAppStartupNotifier.h"
 
-NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsAutoConfig, Init)
 NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsReadConfig, Init)
 
-NS_DEFINE_NAMED_CID(NS_AUTOCONFIG_CID);
 NS_DEFINE_NAMED_CID(NS_READCONFIG_CID);
 
 static const mozilla::Module::CIDEntry kAutoConfigCIDs[] = {
-  { &kNS_AUTOCONFIG_CID, false, nullptr, nsAutoConfigConstructor },
   { &kNS_READCONFIG_CID, false, nullptr, nsReadConfigConstructor },
   { nullptr }
 };
 
 static const mozilla::Module::ContractIDEntry kAutoConfigContracts[] = {
-  { NS_AUTOCONFIG_CONTRACTID, &kNS_AUTOCONFIG_CID },
   { NS_READCONFIG_CONTRACTID, &kNS_READCONFIG_CID },
   { nullptr }
 };
 
 static const mozilla::Module::CategoryEntry kAutoConfigCategories[] = {
   { "pref-config-startup", "ReadConfig Module", NS_READCONFIG_CONTRACTID },
   { nullptr }
 };
--- a/extensions/pref/autoconfig/src/nsReadConfig.cpp
+++ b/extensions/pref/autoconfig/src/nsReadConfig.cpp
@@ -5,17 +5,16 @@
 
 #include "nsReadConfig.h"
 #include "nsJSConfigTriggers.h"
 
 #include "nsAppDirectoryServiceDefs.h"
 #include "nsIAppStartup.h"
 #include "nsContentUtils.h"
 #include "nsDirectoryServiceDefs.h"
-#include "nsIAutoConfig.h"
 #include "nsIComponentManager.h"
 #include "nsIFile.h"
 #include "nsIObserverService.h"
 #include "nsIPrefBranch.h"
 #include "nsIPrefService.h"
 #include "nsIPromptService.h"
 #include "nsIServiceManager.h"
 #include "nsIStringBundle.h"
@@ -228,24 +227,24 @@ nsresult nsReadConfig::readConfigFile()
     }
 
     // get the value of the autoconfig url
     nsAutoCString urlName;
     rv = prefBranch->GetCharPref("autoadmin.global_config_url", urlName);
     if (NS_SUCCEEDED(rv) && !urlName.IsEmpty()) {
 
         // Instantiating nsAutoConfig object if the pref is present
-        mAutoConfig = do_CreateInstance(NS_AUTOCONFIG_CONTRACTID, &rv);
-        if (NS_FAILED(rv))
-            return NS_ERROR_OUT_OF_MEMORY;
+        mAutoConfig = new nsAutoConfig();
 
-        rv = mAutoConfig->SetConfigURL(urlName.get());
-        if (NS_FAILED(rv))
-            return NS_ERROR_FAILURE;
+        rv = mAutoConfig->Init();
+        if (NS_WARN_IF(NS_FAILED(rv))) {
+            return rv;
+        }
 
+        mAutoConfig->SetConfigURL(urlName.get());
     }
 
     return NS_OK;
 } // ReadConfigFile
 
 
 nsresult nsReadConfig::openAndEvaluateJSFile(const char *aFileName, int32_t obscureValue,
                                              bool isEncoded,
--- a/extensions/pref/autoconfig/src/nsReadConfig.h
+++ b/extensions/pref/autoconfig/src/nsReadConfig.h
@@ -1,24 +1,24 @@
 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
 /* 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/. */
 
 #ifndef nsReadConfig_h
 #define nsReadConfig_h
 
-#include "nsCOMPtr.h"
+#include "mozilla/RefPtr.h"
 #include "nsIReadConfig.h"
-#include "nsIAutoConfig.h"
+#include "nsAutoConfig.h"
 #include "nsIObserver.h"
 
 
-class nsReadConfig : public nsIReadConfig,
-                     public nsIObserver
+class nsReadConfig final : public nsIReadConfig,
+                           public nsIObserver
 {
 
     public:
 
         NS_DECL_THREADSAFE_ISUPPORTS
         NS_DECL_NSIREADCONFIG
         NS_DECL_NSIOBSERVER
 
@@ -30,12 +30,12 @@ class nsReadConfig : public nsIReadConfi
 
         virtual ~nsReadConfig();
 
         nsresult readConfigFile();
         nsresult openAndEvaluateJSFile(const char *aFileName, int32_t obscureValue,
                                         bool isEncoded, bool isBinDir);
         bool mRead;
 private:
-        nsCOMPtr<nsIAutoConfig> mAutoConfig;
+        RefPtr<nsAutoConfig> mAutoConfig;
 };
 
 #endif
--- a/js/src/frontend/DoWhileEmitter.cpp
+++ b/js/src/frontend/DoWhileEmitter.cpp
@@ -26,23 +26,22 @@ DoWhileEmitter::emitBody(const Maybe<uin
     MOZ_ASSERT(state_ == State::Start);
 
     // Ensure that the column of the 'do' is set properly.
     if (doPos) {
         if (!bce_->updateSourceCoordNotes(*doPos))
             return false;
     }
 
-    // Emit an annotated nop so IonBuilder can recognize the 'do' loop.
-    if (!bce_->newSrcNote(SRC_WHILE, &noteIndex_))
-        return false;
+    // We need a nop here to make it possible to set a breakpoint on `do`.
     if (!bce_->emit1(JSOP_NOP))
         return false;
 
-    if (!bce_->newSrcNote(SRC_WHILE, &noteIndex2_))
+    // Emit an annotated nop so IonBuilder can recognize the 'do' loop.
+    if (!bce_->newSrcNote3(SRC_DO_WHILE, 0, 0, &noteIndex_))
         return false;
 
     loopInfo_.emplace(bce_, StatementKind::DoLoop);
 
     if (!loopInfo_->emitLoopHead(bce_, bodyPos))
         return false;
 
     if (!loopInfo_->emitLoopEntry(bce_, Nothing()))
@@ -79,28 +78,23 @@ DoWhileEmitter::emitEnd()
     if (!bce_->tryNoteList.append(JSTRY_LOOP, bce_->stackDepth, loopInfo_->headOffset(),
                                   loopInfo_->breakTargetOffset()))
     {
         return false;
     }
 
     // Update the annotations with the update and back edge positions, for
     // IonBuilder.
-    //
-    // Be careful: We must set noteIndex2_ before_ noteIndex in case the
-    // noteIndex_ note gets bigger.  Otherwise noteIndex2_ can point wrong
-    // position.
-    if (!bce_->setSrcNoteOffset(noteIndex2_, SrcNote::DoWhile2::BackJumpOffset,
-                                loopInfo_->loopEndOffsetFromLoopHead()))
+    if (!bce_->setSrcNoteOffset(noteIndex_, SrcNote::DoWhile::CondOffset,
+                                loopInfo_->continueTargetOffsetFromLoopHead()))
     {
         return false;
     }
-    // +1 for NOP in emitBody.
-    if (!bce_->setSrcNoteOffset(noteIndex_, SrcNote::DoWhile1::CondOffset,
-                                loopInfo_->continueTargetOffsetFromLoopHead() + 1))
+    if (!bce_->setSrcNoteOffset(noteIndex_, SrcNote::DoWhile::BackJumpOffset,
+                                loopInfo_->loopEndOffsetFromLoopHead()))
     {
         return false;
     }
 
     if (!loopInfo_->patchBreaksAndContinues(bce_))
         return false;
 
     loopInfo_.reset();
--- a/js/src/frontend/DoWhileEmitter.h
+++ b/js/src/frontend/DoWhileEmitter.h
@@ -30,20 +30,18 @@ struct BytecodeEmitter;
 //     doWhile.emitCond();
 //     emit(cond);
 //     doWhile.emitEnd();
 //
 class MOZ_STACK_CLASS DoWhileEmitter
 {
     BytecodeEmitter* bce_;
 
-    // The source note indices for 2 SRC_WHILE's.
-    // FIXME: Add SRC_DO_WHILE (bug 1477896).
+    // The source note index for SRC_DO_WHILE.
     unsigned noteIndex_ = 0;
-    unsigned noteIndex2_ = 0;
 
     mozilla::Maybe<LoopControl> loopInfo_;
 
 #ifdef DEBUG
     // The state of this emitter.
     //
     // +-------+ emitBody +------+ emitCond +------+ emitEnd  +-----+
     // | Start |--------->| Body |--------->| Cond |--------->| End |
--- a/js/src/frontend/SourceNotes.h
+++ b/js/src/frontend/SourceNotes.h
@@ -59,33 +59,23 @@ class SrcNote {
     class While {
       public:
         enum Fields {
             // The offset of JSOP_IFNE at the end of the loop from JSOP_GOTO.
             BackJumpOffset,
             Count,
         };
     };
-    // SRC_WHILE for do-while: Source note for JSOP_NOP at the top of do-while
-    //                         loop
-    // FIXME: Add SRC_DO_WHILE (bug 1477896).
-    class DoWhile1 {
+    // SRC_DO_WHILE: Source note for JSOP_LOOPHEAD at the top of do-while loop
+    class DoWhile {
       public:
         enum Fields {
-            // The offset of the condition ops from JSOP_NOP.
+            // The offset of the condition ops from JSOP_LOOPHEAD.
             CondOffset,
-            Count,
-        };
-    };
-    // SRC_WHILE for do-while: Source note for JSOP_LOOPHEAD at the top of
-    //                         do-while loop
-    // FIXME: Add SRC_DO_WHILE (bug 1477896).
-    class DoWhile2 {
-      public:
-        enum Fields {
+
             // The offset of JSOP_IFNE at the end of the loop from
             // JSOP_LOOPHEAD.
             BackJumpOffset,
             Count,
         };
     };
     // SRC_FOR_IN: Source note for JSOP_GOTO at the top of for-in loop,
     //             which jumps to JSOP_LOOPENTRY.
@@ -166,29 +156,24 @@ class SrcNote {
         enum Fields {
             // The file-absolute source line number of the current op.
             Line,
             Count
         };
     };
 };
 
-// FIXME: Add SRC_DO_WHILE (bug 1477896).
-static_assert(unsigned(SrcNote::While::Count) == unsigned(SrcNote::DoWhile1::Count),
-              "SRC_WHILE can be shared between while and do-while");
-static_assert(unsigned(SrcNote::While::Count) == unsigned(SrcNote::DoWhile2::Count),
-              "SRC_WHILE can be shared between while and do-while");
-
 #define FOR_EACH_SRC_NOTE_TYPE(M)                                                                  \
     M(SRC_NULL,         "null",        0)  /* Terminates a note vector. */                         \
     M(SRC_IF,           "if",          0)  /* JSOP_IFEQ bytecode is from an if-then. */            \
     M(SRC_IF_ELSE,      "if-else",     0)  /* JSOP_IFEQ bytecode is from an if-then-else. */       \
     M(SRC_COND,         "cond",        0)  /* JSOP_IFEQ is from conditional ?: operator. */        \
     M(SRC_FOR,          "for",         SrcNote::For::Count) \
     M(SRC_WHILE,        "while",       SrcNote::While::Count) \
+    M(SRC_DO_WHILE,     "do-while",    SrcNote::DoWhile::Count) \
     M(SRC_FOR_IN,       "for-in",      SrcNote::ForIn::Count) \
     M(SRC_FOR_OF,       "for-of",      SrcNote::ForOf::Count) \
     M(SRC_CONTINUE,     "continue",    0)  /* JSOP_GOTO is a continue. */                          \
     M(SRC_BREAK,        "break",       0)  /* JSOP_GOTO is a break. */                             \
     M(SRC_BREAK2LABEL,  "break2label", 0)  /* JSOP_GOTO for 'break label'. */                      \
     M(SRC_SWITCHBREAK,  "switchbreak", 0)  /* JSOP_GOTO is a break in a switch. */                 \
     M(SRC_TABLESWITCH,  "tableswitch", SrcNote::TableSwitch::Count) \
     M(SRC_CONDSWITCH,   "condswitch",  SrcNote::CondSwitch::Count) \
@@ -196,17 +181,16 @@ static_assert(unsigned(SrcNote::While::C
     M(SRC_ASSIGNOP,     "assignop",    0)  /* += or another assign-op follows. */                  \
     M(SRC_CLASS_SPAN,   "class",       2)  /* The starting and ending offsets for the class, used  \
                                               for toString correctness for default ctors. */       \
     M(SRC_TRY,          "try",         SrcNote::Try::Count) \
     /* All notes above here are "gettable".  See SN_IS_GETTABLE below. */                          \
     M(SRC_COLSPAN,      "colspan",     SrcNote::ColSpan::Count) \
     M(SRC_NEWLINE,      "newline",     0)  /* Bytecode follows a source newline. */                \
     M(SRC_SETLINE,      "setline",     SrcNote::SetLine::Count) \
-    M(SRC_UNUSED21,     "unused21",    0)  /* Unused. */                                           \
     M(SRC_UNUSED22,     "unused22",    0)  /* Unused. */                                           \
     M(SRC_UNUSED23,     "unused23",    0)  /* Unused. */                                           \
     M(SRC_XDELTA,       "xdelta",      0)  /* 24-31 are for extended delta notes. */
 
 enum SrcNoteType {
 #define DEFINE_SRC_NOTE_TYPE(sym, name, arity) sym,
     FOR_EACH_SRC_NOTE_TYPE(DEFINE_SRC_NOTE_TYPE)
 #undef DEFINE_SRC_NOTE_TYPE
--- a/js/src/jit/IonControlFlow.cpp
+++ b/js/src/jit/IonControlFlow.cpp
@@ -259,27 +259,18 @@ ControlFlowGenerator::traverseBytecode()
 }
 
 ControlFlowGenerator::ControlStatus
 ControlFlowGenerator::snoopControlFlow(JSOp op)
 {
     switch (op) {
       case JSOP_NOP: {
         jssrcnote* sn = GetSrcNote(gsn, script, pc);
-        if (sn) {
-            // do { } while (cond)
-            if (SN_TYPE(sn) == SRC_WHILE)
-                return processDoWhileLoop(sn);
-            // Build a mapping such that given a basic block, whose successor
-            // has a phi
-
-            // for (; ; update?)
-            if (SN_TYPE(sn) == SRC_FOR)
-                return processForLoop(op, sn);
-        }
+        if (sn && SN_TYPE(sn) == SRC_FOR)
+            return processForLoop(op, sn);
         break;
       }
 
       case JSOP_RETURN:
       case JSOP_RETRVAL:
         return processReturn(op);
 
       case JSOP_THROW:
@@ -307,16 +298,23 @@ ControlFlowGenerator::snoopControlFlow(J
 
           default:
             // Hard assert for now - make an error later.
             MOZ_CRASH("unknown goto case");
         }
         break;
       }
 
+      case JSOP_LOOPHEAD: {
+        jssrcnote* sn = GetSrcNote(gsn, script, pc);
+        if (sn && SN_TYPE(sn) == SRC_DO_WHILE)
+            return processDoWhileLoop(sn);
+        break;
+      }
+
       case JSOP_TABLESWITCH: {
         jssrcnote* sn = GetSrcNote(gsn, script, pc);
         return processTableSwitch(op, sn);
       }
 
       case JSOP_CONDSWITCH:
         return processCondSwitch();
 
@@ -1500,34 +1498,32 @@ ControlFlowGenerator::processForLoop(JSO
         return ControlStatus::Error;
     return ControlStatus::Jumped;
 }
 
 ControlFlowGenerator::ControlStatus
 ControlFlowGenerator::processDoWhileLoop(jssrcnote* sn)
 {
     // do { } while() loops have the following structure:
-    //    NOP         ; SRC_WHILE (offset to COND)
-    //    LOOPHEAD    ; SRC_WHILE (offset to IFNE)
+    //    NOP
+    //    LOOPHEAD    ; SRC_DO_WHILE (offsets to COND and IFNE)
     //    LOOPENTRY
     //    ...         ; body
     //    ...
     //    COND        ; start of condition
     //    ...
     //    IFNE ->     ; goes to LOOPHEAD
-    int condition_offset = GetSrcNoteOffset(sn, SrcNote::DoWhile1::CondOffset);
+    int condition_offset = GetSrcNoteOffset(sn, SrcNote::DoWhile::CondOffset);
     jsbytecode* conditionpc = pc + condition_offset;
-
-    jssrcnote* sn2 = GetSrcNote(gsn, script, pc + 1);
-    int offset = GetSrcNoteOffset(sn2, SrcNote::DoWhile2::BackJumpOffset);
-    jsbytecode* ifne = pc + offset + 1;
+    int offset = GetSrcNoteOffset(sn, SrcNote::DoWhile::BackJumpOffset);
+    jsbytecode* ifne = pc + offset;
     MOZ_ASSERT(ifne > pc);
 
     // Verify that the IFNE goes back to a loophead op.
-    jsbytecode* loopHead = GetNextPc(pc);
+    jsbytecode* loopHead = pc;
     MOZ_ASSERT(JSOp(*loopHead) == JSOP_LOOPHEAD);
     MOZ_ASSERT(loopHead == ifne + GetJumpOffset(ifne));
 
     jsbytecode* loopEntry = GetNextPc(loopHead);
 
     CFGBlock* header = CFGBlock::New(alloc(), loopEntry);
 
     CFGLoopEntry* ins = CFGLoopEntry::New(alloc(), header, 0);
--- a/js/src/jit/mips32/Trampoline-mips32.cpp
+++ b/js/src/jit/mips32/Trampoline-mips32.cpp
@@ -662,17 +662,16 @@ JitRuntime::generateBailoutHandler(Macro
 
     GenerateBailoutThunk(masm, NO_FRAME_SIZE_CLASS_ID, bailoutTail);
 }
 
 bool
 JitRuntime::generateVMWrapper(JSContext* cx, MacroAssembler& masm, const VMFunction& f)
 {
     MOZ_ASSERT(functionWrappers_);
-    MOZ_ASSERT(functionWrappers_->initialized());
 
     uint32_t wrapperOffset = startTrampolineCode(masm);
 
     AllocatableGeneralRegisterSet regs(Register::Codes::WrapperMask);
 
     static_assert((Register::Codes::VolatileMask & ~Register::Codes::WrapperMask) == 0,
                   "Wrapper register set should be a superset of Volatile register set.");
 
--- a/js/src/jit/mips64/Trampoline-mips64.cpp
+++ b/js/src/jit/mips64/Trampoline-mips64.cpp
@@ -641,17 +641,16 @@ JitRuntime::generateBailoutHandler(Macro
 
     GenerateBailoutThunk(masm, NO_FRAME_SIZE_CLASS_ID, bailoutTail);
 }
 
 bool
 JitRuntime::generateVMWrapper(JSContext* cx, MacroAssembler& masm, const VMFunction& f)
 {
     MOZ_ASSERT(functionWrappers_);
-    MOZ_ASSERT(functionWrappers_->initialized());
 
     uint32_t wrapperOffset = startTrampolineCode(masm);
 
     AllocatableGeneralRegisterSet regs(Register::Codes::WrapperMask);
 
     static_assert((Register::Codes::VolatileMask & ~Register::Codes::WrapperMask) == 0,
                   "Wrapper register set should be a superset of Volatile register set.");
 
--- a/js/src/shell/js.cpp
+++ b/js/src/shell/js.cpp
@@ -2747,30 +2747,34 @@ SrcNotes(JSContext* cx, HandleScript scr
                               unsigned(GetSrcNoteOffset(sn, SrcNote::For::CondOffset)),
                               unsigned(GetSrcNoteOffset(sn, SrcNote::For::UpdateOffset)),
                               unsigned(GetSrcNoteOffset(sn, SrcNote::For::BackJumpOffset))))
             {
                 return false;
             }
             break;
 
+          case SRC_WHILE:
           case SRC_FOR_IN:
           case SRC_FOR_OF:
-            static_assert(unsigned(SrcNote::ForIn::BackJumpOffset) == unsigned(SrcNote::ForOf::BackJumpOffset),
-                          "SrcNote::{ForIn,ForOf}::BackJumpOffset should be same");
+            static_assert(unsigned(SrcNote::While::BackJumpOffset) == unsigned(SrcNote::ForIn::BackJumpOffset),
+                          "SrcNote::{While,ForIn,ForOf}::BackJumpOffset should be same");
+            static_assert(unsigned(SrcNote::While::BackJumpOffset) == unsigned(SrcNote::ForOf::BackJumpOffset),
+                          "SrcNote::{While,ForIn,ForOf}::BackJumpOffset should be same");
             if (!sp->jsprintf(" backjump %u",
-                              unsigned(GetSrcNoteOffset(sn, SrcNote::ForIn::BackJumpOffset))))
+                              unsigned(GetSrcNoteOffset(sn, SrcNote::While::BackJumpOffset))))
             {
                 return false;
             }
             break;
 
-          case SRC_WHILE:
-            if (!sp->jsprintf(" offset %u",
-                              unsigned(GetSrcNoteOffset(sn, SrcNote::While::BackJumpOffset))))
+          case SRC_DO_WHILE:
+            if (!sp->jsprintf(" cond %u backjump %u",
+                              unsigned(GetSrcNoteOffset(sn, SrcNote::DoWhile::CondOffset)),
+                              unsigned(GetSrcNoteOffset(sn, SrcNote::DoWhile::BackJumpOffset))))
             {
                 return false;
             }
             break;
 
           case SRC_NEXTCASE:
             if (!sp->jsprintf(" next case offset %u",
                               unsigned(GetSrcNoteOffset(sn, SrcNote::NextCase::NextCaseOffset))))
--- a/js/src/vm/Stack-inl.h
+++ b/js/src/vm/Stack-inl.h
@@ -317,17 +317,17 @@ InterpreterStack::pushInlineFrame(JSCont
     return true;
 }
 
 MOZ_ALWAYS_INLINE bool
 InterpreterStack::resumeGeneratorCallFrame(JSContext* cx, InterpreterRegs& regs,
                                            HandleFunction callee, HandleObject envChain)
 {
     MOZ_ASSERT(callee->isGenerator() || callee->isAsync());
-    RootedScript script(cx, JSFunction::getOrCreateScript(cx, callee));
+    RootedScript script(cx, callee->nonLazyScript());
     InterpreterFrame* prev = regs.fp();
     jsbytecode* prevpc = regs.pc;
     Value* prevsp = regs.sp;
     MOZ_ASSERT(prev);
 
     script->ensureNonLazyCanonicalFunction();
 
     LifoAlloc::Mark mark = allocator_.mark();
--- a/mfbt/HashTable.h
+++ b/mfbt/HashTable.h
@@ -284,21 +284,21 @@ public:
   {
     return mImpl.putNew(
       aKey, std::forward<KeyInput>(aKey), std::forward<ValueInput>(aValue));
   }
 
   // Like putNew(), but should be only used when the table is known to be big
   // enough for the insertion, and hashing cannot fail. Typically this is used
   // to populate an empty map with known-unique keys after reserving space with
-  // init(), e.g.
+  // reserve(), e.g.
   //
   //   using HM = HashMap<int,char>;
   //   HM h;
-  //   if (!h.init(3)) {
+  //   if (!h.reserve(3)) {
   //     MOZ_CRASH("OOM");
   //   }
   //   h.putNewInfallible(1, 'a');    // unique key
   //   h.putNewInfallible(2, 'b');    // unique key
   //   h.putNewInfallible(3, 'c');    // unique key
   //
   template<typename KeyInput, typename ValueInput>
   void putNewInfallible(KeyInput&& aKey, ValueInput&& aValue)
@@ -598,21 +598,21 @@ public:
   MOZ_MUST_USE bool putNew(const Lookup& aLookup, U&& aU)
   {
     return mImpl.putNew(aLookup, std::forward<U>(aU));
   }
 
   // Like putNew(), but should be only used when the table is known to be big
   // enough for the insertion, and hashing cannot fail. Typically this is used
   // to populate an empty set with known-unique elements after reserving space
-  // with init(), e.g.
+  // with reserve(), e.g.
   //
   //   using HS = HashMap<int>;
   //   HS h;
-  //   if (!h.init(3)) {
+  //   if (!h.reserve(3)) {
   //     MOZ_CRASH("OOM");
   //   }
   //   h.putNewInfallible(1);     // unique element
   //   h.putNewInfallible(2);     // unique element
   //   h.putNewInfallible(3);     // unique element
   //
   template<typename U>
   void putNewInfallible(const Lookup& aLookup, U&& aU)
@@ -1439,17 +1439,17 @@ public:
 
     void rekey(const Key& k) { rekey(k, k); }
 
     // Potentially rehashes the table.
     ~ModIterator()
     {
       if (mRekeyed) {
         mTable.mGen++;
-        mTable.checkOverRemoved();
+        mTable.infallibleRehashIfOverloaded();
       }
 
       if (mRemoved) {
         mTable.compact();
       }
     }
   };
 
@@ -1631,27 +1631,16 @@ public:
     if (table) {
       for (uint32_t i = 0; i < aCapacity; i++) {
         new (&table[i]) Entry();
       }
     }
     return table;
   }
 
-  static Entry* maybeCreateTable(AllocPolicy& aAllocPolicy, uint32_t aCapacity)
-  {
-    Entry* table = aAllocPolicy.template maybe_pod_malloc<Entry>(aCapacity);
-    if (table) {
-      for (uint32_t i = 0; i < aCapacity; i++) {
-        new (&table[i]) Entry();
-      }
-    }
-    return table;
-  }
-
   static void destroyTable(AllocPolicy& aAllocPolicy,
                            Entry* aOldTable,
                            uint32_t aCapacity)
   {
     Entry* end = aOldTable + aCapacity;
     for (Entry* e = aOldTable; e < end; ++e) {
       e->~Entry();
     }
@@ -1703,39 +1692,16 @@ private:
   }
 
   static HashNumber applyDoubleHash(HashNumber aHash1,
                                     const DoubleHash& aDoubleHash)
   {
     return (aHash1 - aDoubleHash.mHash2) & aDoubleHash.mSizeMask;
   }
 
-  // True if the current load is equal to or exceeds the maximum.
-  bool overloaded()
-  {
-    static_assert(sMaxCapacity <= UINT32_MAX / sMaxAlphaNumerator,
-                  "multiplication below could overflow");
-
-    // Note: if capacity() is zero, this will always succeed, which is
-    // what we want.
-    return mEntryCount + mRemovedCount >=
-           capacity() * sMaxAlphaNumerator / sAlphaDenominator;
-  }
-
-  // Would the table be underloaded if it had the given capacity and entryCount?
-  static bool wouldBeUnderloaded(uint32_t aCapacity, uint32_t aEntryCount)
-  {
-    static_assert(sMaxCapacity <= UINT32_MAX / sMinAlphaNumerator,
-                  "multiplication below could overflow");
-    return aCapacity > sMinCapacity &&
-           aEntryCount <= aCapacity * sMinAlphaNumerator / sAlphaDenominator;
-  }
-
-  bool underloaded() { return wouldBeUnderloaded(capacity(), mEntryCount); }
-
   static MOZ_ALWAYS_INLINE bool match(Entry& aEntry, const Lookup& aLookup)
   {
     return HashPolicy::match(HashPolicy::getKey(aEntry.get()), aLookup);
   }
 
   enum LookupReason
   {
     ForNonAdd,
@@ -1791,18 +1757,18 @@ private:
       if (entry->matchHash(aKeyHash) && match(*entry, aLookup)) {
         return *entry;
       }
     }
   }
 
   // This is a copy of lookup() hardcoded to the assumptions:
   //   1. the lookup is for an add;
-  //   2. the key, whose |keyHash| has been passed is not in the table.
-  Entry& findFreeEntry(HashNumber aKeyHash)
+  //   2. the key, whose |keyHash| has been passed, is not in the table.
+  Entry& findNonLiveEntry(HashNumber aKeyHash)
   {
     MOZ_ASSERT(!(aKeyHash & sCollisionBit));
     MOZ_ASSERT(mTable);
 
     // We assume 'aKeyHash' has already been distributed.
 
     // Compute the primary hash address.
     HashNumber h1 = hash1(aKeyHash);
@@ -1864,56 +1830,56 @@ private:
     mGen++;
     mTable = newTable;
 
     // Copy only live entries, leaving removed ones behind.
     Entry* end = oldTable + oldCapacity;
     for (Entry* src = oldTable; src < end; ++src) {
       if (src->isLive()) {
         HashNumber hn = src->getKeyHash();
-        findFreeEntry(hn).setLive(
+        findNonLiveEntry(hn).setLive(
           hn, std::move(const_cast<typename Entry::NonConstT&>(src->get())));
       }
 
       src->~Entry();
     }
 
     // All entries have been destroyed, no need to destroyTable.
     this->free_(oldTable, oldCapacity);
     return Rehashed;
   }
 
-  bool shouldCompressTable()
+  RebuildStatus rehashIfOverloaded(
+    FailureBehavior aReportFailure = ReportFailure)
   {
+    static_assert(sMaxCapacity <= UINT32_MAX / sMaxAlphaNumerator,
+                  "multiplication below could overflow");
+
+    // Note: if capacity() is zero, this will always succeed, which is
+    // what we want.
+    bool overloaded = mEntryCount + mRemovedCount >=
+                      capacity() * sMaxAlphaNumerator / sAlphaDenominator;
+
+    if (!overloaded) {
+      return NotOverloaded;
+    }
+
     // Succeed if a quarter or more of all entries are removed. Note that this
     // always succeeds if capacity() == 0 (i.e. entry storage has not been
     // allocated), which is what we want, because it means changeTableSize()
     // will allocate the requested capacity rather than doubling it.
-    return mRemovedCount >= (capacity() >> 2);
-  }
-
-  RebuildStatus checkOverloaded(FailureBehavior aReportFailure = ReportFailure)
-  {
-    if (!overloaded()) {
-      return NotOverloaded;
-    }
-
-    uint32_t newCapacity = shouldCompressTable()
-                         ? rawCapacity()
-                         : rawCapacity() * 2;
+    bool manyRemoved = mRemovedCount >= (capacity() >> 2);
+    uint32_t newCapacity = manyRemoved ? rawCapacity() : rawCapacity() * 2;
     return changeTableSize(newCapacity, aReportFailure);
   }
 
-  // Infallibly rehash the table if we are overloaded with removals.
-  void checkOverRemoved()
+  void infallibleRehashIfOverloaded()
   {
-    if (overloaded()) {
-      if (checkOverloaded(DontReportFailure) == RehashFailed) {
-        rehashTableInPlace();
-      }
+    if (rehashIfOverloaded(DontReportFailure) == RehashFailed) {
+      rehashTableInPlace();
     }
   }
 
   void remove(Entry& aEntry)
   {
     MOZ_ASSERT(mTable);
 
     if (aEntry.hasCollision()) {
@@ -1923,19 +1889,25 @@ private:
       aEntry.clearLive();
     }
     mEntryCount--;
 #ifdef DEBUG
     mMutationCount++;
 #endif
   }
 
-  void checkUnderloaded()
+  void shrinkIfUnderloaded()
   {
-    if (underloaded()) {
+    static_assert(sMaxCapacity <= UINT32_MAX / sMinAlphaNumerator,
+                  "multiplication below could overflow");
+    bool underloaded =
+      capacity() > sMinCapacity &&
+      mEntryCount <= capacity() * sMinAlphaNumerator / sAlphaDenominator;
+
+    if (underloaded) {
       (void)changeTableSize(capacity() / 2, DontReportFailure);
     }
   }
 
   // This is identical to changeTableSize(currentSize), but without requiring
   // a second table.  We do this by recycling the collision bits to tell us if
   // the element is already inserted or still waiting to be inserted.  Since
   // already-inserted elements win any conflicts, we get the same table as we
@@ -1984,17 +1956,17 @@ private:
   // Prefer to use putNewInfallible; this function does not check
   // invariants.
   template<typename... Args>
   void putNewInfallibleInternal(const Lookup& aLookup, Args&&... aArgs)
   {
     MOZ_ASSERT(mTable);
 
     HashNumber keyHash = prepareHash(aLookup);
-    Entry* entry = &findFreeEntry(keyHash);
+    Entry* entry = &findNonLiveEntry(keyHash);
     MOZ_ASSERT(entry);
 
     if (entry->isRemoved()) {
       mRemovedCount--;
       keyHash |= sCollisionBit;
     }
 
     entry->setLive(keyHash, std::forward<Args>(aArgs)...);
@@ -2014,17 +1986,17 @@ public:
     mRemovedCount = 0;
     mEntryCount = 0;
 #ifdef DEBUG
     mMutationCount++;
 #endif
   }
 
   // Resize the table down to the smallest capacity that doesn't overload the
-  // table. Since we call checkUnderloaded() on every remove, you only need
+  // table. Since we call shrinkIfUnderloaded() on every remove, you only need
   // to call this after a bulk removal of items done without calling remove().
   void compact()
   {
     if (empty()) {
       // Free the entry storage.
       this->free_(mTable, capacity());
       mGen++;
       mHashShift = hashShift(0);  // gives minimum capacity on regrowth
@@ -2175,25 +2147,25 @@ public:
     if (aPtr.mEntry->isRemoved()) {
       if (!this->checkSimulatedOOM()) {
         return false;
       }
       mRemovedCount--;
       aPtr.mKeyHash |= sCollisionBit;
     } else {
       // Preserve the validity of |aPtr.mEntry|.
-      RebuildStatus status = checkOverloaded();
+      RebuildStatus status = rehashIfOverloaded();
       if (status == RehashFailed) {
         return false;
       }
       if (status == NotOverloaded && !this->checkSimulatedOOM()) {
         return false;
       }
       if (status == Rehashed) {
-        aPtr.mEntry = &findFreeEntry(aPtr.mKeyHash);
+        aPtr.mEntry = &findNonLiveEntry(aPtr.mKeyHash);
       }
     }
 
     aPtr.mEntry->setLive(aPtr.mKeyHash, std::forward<Args>(aArgs)...);
     mEntryCount++;
 #ifdef DEBUG
     mMutationCount++;
     aPtr.mGeneration = generation();
@@ -2218,17 +2190,17 @@ public:
   MOZ_MUST_USE bool putNew(const Lookup& aLookup, Args&&... aArgs)
   {
     if (!this->checkSimulatedOOM()) {
       return false;
     }
     if (!EnsureHash<HashPolicy>(aLookup)) {
       return false;
     }
-    if (checkOverloaded() == RehashFailed) {
+    if (rehashIfOverloaded() == RehashFailed) {
       return false;
     }
     putNewInfallible(aLookup, std::forward<Args>(aArgs)...);
     return true;
   }
 
   // Note: |aLookup| may be a reference to a piece of |u|, so this function
   // must take care not to use |aLookup| after moving |u|.
@@ -2256,17 +2228,17 @@ public:
 
   void remove(Ptr aPtr)
   {
     MOZ_ASSERT(mTable);
     ReentrancyGuard g(*this);
     MOZ_ASSERT(aPtr.found());
     MOZ_ASSERT(aPtr.mGeneration == generation());
     remove(*aPtr.mEntry);
-    checkUnderloaded();
+    shrinkIfUnderloaded();
   }
 
   void rekeyWithoutRehash(Ptr aPtr, const Lookup& aLookup, const Key& aKey)
   {
     MOZ_ASSERT(mTable);
     ReentrancyGuard g(*this);
     MOZ_ASSERT(aPtr.found());
     MOZ_ASSERT(aPtr.mGeneration == generation());
@@ -2274,16 +2246,16 @@ public:
     HashPolicy::setKey(t, const_cast<Key&>(aKey));
     remove(*aPtr.mEntry);
     putNewInfallibleInternal(aLookup, std::move(t));
   }
 
   void rekeyAndMaybeRehash(Ptr aPtr, const Lookup& aLookup, const Key& aKey)
   {
     rekeyWithoutRehash(aPtr, aLookup, aKey);
-    checkOverRemoved();
+    infallibleRehashIfOverloaded();
   }
 };
 
 } // namespace detail
 } // namespace mozilla
 
 #endif /* mozilla_HashTable_h */
--- a/mfbt/MemoryChecking.h
+++ b/mfbt/MemoryChecking.h
@@ -41,22 +41,16 @@
 // In clang-cl based ASAN, we link against the memory poisoning functions
 // statically.
 #define MOZ_ASAN_VISIBILITY
 #else
 #define MOZ_ASAN_VISIBILITY MOZ_EXPORT
 #endif
 
 extern "C" {
-/* workaround for bug 1306642 */
-#if defined(_MSC_VER) && defined(__clang__)
-#pragma clang diagnostic warning "-Wdll-attribute-on-redeclaration"
-#pragma clang diagnostic warning "-Winconsistent-dllimport"
-#endif
-
 /* These definitions are usually provided through the
  * sanitizer/asan_interface.h header installed by ASan.
  */
 void MOZ_ASAN_VISIBILITY
 __asan_poison_memory_region(void const volatile *addr, size_t size);
 void MOZ_ASAN_VISIBILITY
 __asan_unpoison_memory_region(void const volatile *addr, size_t size);
 
--- a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoRuntimeSettings.java
+++ b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoRuntimeSettings.java
@@ -242,16 +242,47 @@ public final class GeckoRuntimeSettings 
          *
          * @param density The display density value to use for overriding the system default.
          * @return The builder instance.
          */
         public @NonNull Builder displayDensityOverride(float density) {
             mSettings.mDisplayDensityOverride = density;
             return this;
         }
+
+        /** Set whether or not known malware sites should be blocked.
+         *
+         * Note: For each blocked site, {@link NavigationDelegate#onLoadError}
+         * with error category {@link NavigationDelegate#ERROR_CATEGORY_SAFEBROWSING}
+         * is called.
+         *
+         * @param enabled A flag determining whether or not to block malware
+         *                sites.
+         * @return The builder instance.
+         */
+        public @NonNull Builder blockMalware(boolean enabled) {
+            mSettings.mSafebrowsingMalware.set(enabled);
+            return this;
+        }
+
+        /**
+         * Set whether or not known phishing sites should be blocked.
+         *
+         * Note: For each blocked site, {@link NavigationDelegate#onLoadError}
+         * with error category {@link NavigationDelegate#ERROR_CATEGORY_SAFEBROWSING}
+         * is called.
+         *
+         * @param enabled A flag determining whether or not to block phishing
+         *                sites.
+         * @return The builder instance.
+         */
+        public @NonNull Builder blockPhishing(boolean enabled) {
+            mSettings.mSafebrowsingPhishing.set(enabled);
+            return this;
+        }
     }
 
     /* package */ GeckoRuntime runtime;
     /* package */ boolean mUseContentProcess;
     /* package */ String[] mArgs;
     /* package */ Bundle mExtras;
     /* package */ int prefCount;
 
@@ -300,26 +331,31 @@ public final class GeckoRuntimeSettings 
         "urlclassifier.trackingTable",
         TrackingProtection.buildPrefValue(
             TrackingProtectionDelegate.CATEGORY_TEST |
             TrackingProtectionDelegate.CATEGORY_ANALYTIC |
             TrackingProtectionDelegate.CATEGORY_SOCIAL |
             TrackingProtectionDelegate.CATEGORY_AD));
     /* package */ Pref<Boolean> mConsoleOutput = new Pref<Boolean>(
         "geckoview.console.enabled", false);
+    /* package */ Pref<Boolean> mSafebrowsingMalware = new Pref<Boolean>(
+        "browser.safebrowsing.malware.enabled", true);
+    /* package */ Pref<Boolean> mSafebrowsingPhishing = new Pref<Boolean>(
+        "browser.safebrowsing.phishing.enabled", true);
 
     /* package */ boolean mNativeCrashReporting;
     /* package */ boolean mJavaCrashReporting;
     /* package */ int mCrashReportingJobId;
     /* package */ boolean mDebugPause;
     /* package */ float mDisplayDensityOverride = -1.0f;
 
     private final Pref<?>[] mPrefs = new Pref<?>[] {
         mCookieBehavior, mCookieLifetime, mConsoleOutput,
-        mJavaScript, mRemoteDebugging, mTrackingProtection, mWebFonts
+        mJavaScript, mRemoteDebugging, mSafebrowsingMalware,
+        mSafebrowsingPhishing, mTrackingProtection, mWebFonts,
     };
 
     /* package */ GeckoRuntimeSettings() {
         this(null);
     }
 
     /* package */ GeckoRuntimeSettings(final @Nullable GeckoRuntimeSettings settings) {
         if (BuildConfig.DEBUG && prefCount != mPrefs.length) {
@@ -618,22 +654,70 @@ public final class GeckoRuntimeSettings 
     public @NonNull GeckoRuntimeSettings setConsoleOutputEnabled(boolean enabled) {
         mConsoleOutput.set(enabled);
         return this;
     }
 
     /**
      * Get whether or not web console messages are sent to logcat.
      *
-     * @return This GeckoRuntimeSettings instance.
+     * @return True if console output is enabled.
      */
     public boolean getConsoleOutputEnabled() {
         return mConsoleOutput.get();
     }
 
+    /**
+     * Set whether or not known malware sites should be blocked.
+     *
+     * Note: For each blocked site, {@link NavigationDelegate#onLoadError}
+     * with error category {@link NavigationDelegate#ERROR_CATEGORY_SAFEBROWSING}
+     * is called.
+     *
+     * @param enabled A flag determining whether or not to block malware sites.
+     * @return The GeckoRuntimeSettings instance.
+     */
+    public @NonNull GeckoRuntimeSettings setBlockMalware(boolean enabled) {
+        mSafebrowsingMalware.set(enabled);
+        return this;
+    }
+
+    /**
+     * Get whether or not known malware sites are blocked.
+     *
+     * @return True if malware site blocking is enabled.
+     */
+    public boolean getBlockMalware() {
+        return mSafebrowsingMalware.get();
+    }
+
+    /**
+     * Set whether or not known phishing sites should be blocked.
+     *
+     * Note: For each blocked site, {@link NavigationDelegate#onLoadError}
+     * with error category {@link NavigationDelegate#ERROR_CATEGORY_SAFEBROWSING}
+     * is called.
+     *
+     * @param enabled A flag determining whether or not to block phishing sites.
+     * @return The GeckoRuntimeSettings instance.
+     */
+    public @NonNull GeckoRuntimeSettings setBlockPhishing(boolean enabled) {
+        mSafebrowsingPhishing.set(enabled);
+        return this;
+    }
+
+    /**
+     * Get whether or not known phishing sites are blocked.
+     *
+     * @return True if phishing site blocking is enabled.
+     */
+    public boolean getBlockPhishing() {
+        return mSafebrowsingPhishing.get();
+    }
+
     @Override // Parcelable
     public int describeContents() {
         return 0;
     }
 
     @Override // Parcelable
     public void writeToParcel(Parcel out, int flags) {
         ParcelableUtils.writeBoolean(out, mUseContentProcess);
--- a/mobile/android/modules/geckoview/GeckoViewSettings.jsm
+++ b/mobile/android/modules/geckoview/GeckoViewSettings.jsm
@@ -2,29 +2,23 @@
  * 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";
 
 var EXPORTED_SYMBOLS = ["GeckoViewSettings"];
 
 ChromeUtils.import("resource://gre/modules/GeckoViewModule.jsm");
-ChromeUtils.import("resource://gre/modules/GeckoViewUtils.jsm");
 ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
 
 XPCOMUtils.defineLazyModuleGetters(this, {
+  SafeBrowsing: "resource://gre/modules/SafeBrowsing.jsm",
   Services: "resource://gre/modules/Services.jsm",
 });
 
-/* global SafeBrowsing:false */
-GeckoViewUtils.addLazyGetter(this, "SafeBrowsing", {
-  module: "resource://gre/modules/SafeBrowsing.jsm",
-  init: sb => sb.init(),
-});
-
 XPCOMUtils.defineLazyGetter(
   this, "DESKTOP_USER_AGENT",
   function() {
     return Cc["@mozilla.org/network/protocol;1?name=http"]
            .getService(Ci.nsIHttpProtocolHandler).userAgent
            .replace(/Android \d.+?; [a-zA-Z]+/, "X11; Linux x86_64")
            .replace(/Gecko\/[0-9\.]+/, "Gecko/20100101");
   });
@@ -37,40 +31,32 @@ class GeckoViewSettings extends GeckoVie
     if (this.settings.useMultiprocess) {
       this.browser.setAttribute("remote", "true");
     }
   }
 
   onInit() {
     this._useTrackingProtection = false;
     this._useDesktopMode = false;
+    // Required for safe browsing and tracking protection.
+    SafeBrowsing.init();
   }
 
   onSettingsUpdate() {
     const settings = this.settings;
     debug `onSettingsUpdate: ${settings}`;
 
     this.displayMode = settings.displayMode;
-    this.useTrackingProtection = !!settings.useTrackingProtection;
     this.useDesktopMode = !!settings.useDesktopMode;
   }
 
   get useMultiprocess() {
     return this.browser.isRemoteBrowser;
   }
 
-  get useTrackingProtection() {
-    return this._useTrackingProtection;
-  }
-
-  set useTrackingProtection(aUse) {
-    aUse && SafeBrowsing;
-    this._useTrackingProtection = aUse;
-  }
-
   onUserAgentRequest(aSubject, aTopic, aData) {
     debug `onUserAgentRequest`;
 
     let channel = aSubject.QueryInterface(Ci.nsIHttpChannel);
 
     if (this.browser.outerWindowID !== channel.topLevelOuterContentWindowId) {
       return;
     }
--- a/modules/libpref/init/all.js
+++ b/modules/libpref/init/all.js
@@ -1369,17 +1369,17 @@ pref("privacy.trackingprotection.lower_n
 #endif
 
 pref("dom.event.contextmenu.enabled",       true);
 pref("dom.event.clipboardevents.enabled",   true);
 pref("dom.event.highrestimestamp.enabled",  true);
 pref("dom.event.coalesce_mouse_move",       true);
 
 #if defined(NIGHTLY_BUILD) && !defined(ANDROID)
-pref("dom.ua_widget.enabled", true);
+pref("dom.ua_widget.enabled", false);
 #else
 pref("dom.ua_widget.enabled", false);
 #endif
 
 #ifdef NIGHTLY_BUILD
 pref("dom.webcomponents.shadowdom.enabled", true);
 pref("dom.webcomponents.customelements.enabled", true);
 #else
--- a/security/sandbox/linux/SandboxOpenedFiles.cpp
+++ b/security/sandbox/linux/SandboxOpenedFiles.cpp
@@ -4,16 +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/. */
 
 #include "SandboxOpenedFiles.h"
 
 #include "mozilla/Move.h"
 #include "SandboxLogging.h"
 
+#include <errno.h>
 #include <fcntl.h>
 #include <unistd.h>
 
 namespace mozilla {
 
 // The default move constructor almost works, but Atomic isn't
 // move-constructable and the fd needs some special handling.
 SandboxOpenedFile::SandboxOpenedFile(SandboxOpenedFile&& aMoved)
--- a/testing/geckodriver/CONTRIBUTING.md
+++ b/testing/geckodriver/CONTRIBUTING.md
@@ -220,9 +220,9 @@ Communication
 The mailing list for geckodriver discussion is
 tools-marionette@lists.mozilla.org ([subscribe], [archive]).
 
 If you prefer real-time chat, there is often someone in the #ateam IRC
 channel on irc.mozilla.org.  Don’t ask if you can ask a question, just
 ask, and please wait for an answer as we might not be in your timezone.
 
 [subscribe]: https://lists.mozilla.org/listinfo/tools-marionette
-[archive]: https://groups.google.com/group/mozilla.tools.marionette
+[archive]: https://lists.mozilla.org/pipermail/tools-marionette/
--- a/testing/geckodriver/README.md
+++ b/testing/geckodriver/README.md
@@ -644,9 +644,9 @@ Contact
 
 The mailing list for geckodriver discussion is
 tools-marionette@lists.mozilla.org ([subscribe], [archive]).
 
 There is also an IRC channel to talk about using and developing
 geckodriver in #ateam on irc.mozilla.org.
 
 [subscribe]: https://lists.mozilla.org/listinfo/tools-marionette
-[archive]: https://groups.google.com/group/mozilla.tools.marionette
+[archive]: https://lists.mozilla.org/pipermail/tools-marionette/
--- a/testing/marionette/doc/index.rst
+++ b/testing/marionette/doc/index.rst
@@ -62,9 +62,9 @@ Communication
 The mailing list for Marionette discussion is
 tools-marionette@lists.mozilla.org (`subscribe`_, `archive`_).
 
 If you prefer real-time chat, there is often someone in the #ateam IRC
 channel on irc.mozilla.org.  Don’t ask if you may ask a question; just go ahead
 and ask, and please wait for an answer as we might not be in your timezone.
 
 .. _subscribe: https://lists.mozilla.org/listinfo/tools-marionette
-.. _archive: https://groups.google.com/group/mozilla.tools.marionette
+.. _archive: https://lists.mozilla.org/pipermail/tools-marionette/
--- a/testing/modules/FileTestUtils.jsm
+++ b/testing/modules/FileTestUtils.jsm
@@ -113,16 +113,21 @@ XPCOMUtils.defineLazyGetter(FileTestUtil
     let dir = FileUtils.getFile("TmpD", ["testdir-" + randomNumber]);
     dir.createUnique(Ci.nsIFile.DIRECTORY_TYPE, FileUtils.PERMS_DIRECTORY);
     AsyncShutdown.profileBeforeChange.addBlocker("Removing test files",
       async () => {
         // Remove the files we know about first.
         for (let path of gPathsToRemove) {
           await this.tolerantRemove(path);
         }
+
+        if (!(await OS.File.exists(dir.path))) {
+          return;
+        }
+
         // Detect any extra files, like the ".part" files of downloads.
         let iterator = new OS.File.DirectoryIterator(dir.path);
         try {
           await iterator.forEach(entry => this.tolerantRemove(entry.path,
                                                               entry.isDir));
         } finally {
           iterator.close();
         }
--- a/testing/web-platform/meta/MANIFEST.json
+++ b/testing/web-platform/meta/MANIFEST.json
@@ -13244,16 +13244,22 @@
     ]
    ],
    "payment-request/PaymentRequestUpdateEvent/updateWith-state-checks-manual.https.html": [
     [
      "/payment-request/PaymentRequestUpdateEvent/updateWith-state-checks-manual.https.html",
      {}
     ]
    ],
+   "payment-request/PaymentValidationErrors/retry-shows-error-member-manual.https.html": [
+    [
+     "/payment-request/PaymentValidationErrors/retry-shows-error-member-manual.https.html",
+     {}
+    ]
+   ],
    "payment-request/PaymentValidationErrors/retry-shows-payer-member-manual.https.html": [
     [
      "/payment-request/PaymentValidationErrors/retry-shows-payer-member-manual.https.html",
      {}
     ]
    ],
    "payment-request/PaymentValidationErrors/retry-shows-shippingAddress-member-manual.https.html": [
     [
@@ -109861,41 +109867,41 @@
      {}
     ]
    ],
    "css/css-contain/contain-size-001.html": [
     [
      "/css/css-contain/contain-size-001.html",
      [
       [
-       "/css/reference/pass_if_pass_below.html",
+       "/css/css-contain/reference/pass_if_pass_below_clipped.html",
        "=="
       ]
      ],
      {}
     ]
    ],
    "css/css-contain/contain-size-002.html": [
     [
      "/css/css-contain/contain-size-002.html",
      [
       [
-       "/css/reference/pass_if_pass_below.html",
+       "/css/css-contain/reference/pass_if_pass_below_clipped.html",
        "=="
       ]
      ],
      {}
     ]
    ],
    "css/css-contain/contain-size-003.html": [
     [
      "/css/css-contain/contain-size-003.html",
      [
       [
-       "/css/reference/pass_if_pass_below.html",
+       "/css/css-contain/reference/pass_if_pass_below_clipped.html",
        "=="
       ]
      ],
      {}
     ]
    ],
    "css/css-contain/contain-size-004.html": [
     [
@@ -109921,65 +109927,65 @@
      {}
     ]
    ],
    "css/css-contain/contain-size-006.html": [
     [
      "/css/css-contain/contain-size-006.html",
      [
       [
-       "/css/reference/pass_if_pass_below.html",
+       "/css/css-contain/reference/pass_if_pass_below_clipped.html",
        "=="
       ]
      ],
      {}
     ]
    ],
    "css/css-contain/contain-size-007.html": [
     [
      "/css/css-contain/contain-size-007.html",
      [
       [
-       "/css/reference/pass_if_pass_below.html",
+       "/css/css-contain/reference/pass_if_pass_below_clipped.html",
        "=="
       ]
      ],
      {}
     ]
    ],
    "css/css-contain/contain-size-008.html": [
     [
      "/css/css-contain/contain-size-008.html",
      [
       [
-       "/css/reference/pass_if_pass_below.html",
+       "/css/css-contain/reference/pass_if_pass_below_clipped.html",
        "=="
       ]
      ],
      {}
     ]
    ],
    "css/css-contain/contain-size-009.html": [
     [
      "/css/css-contain/contain-size-009.html",
      [
       [
-       "/css/reference/pass_if_pass_below.html",
+       "/css/css-contain/reference/pass_if_pass_below_clipped.html",
        "=="
       ]
      ],
      {}
     ]
    ],
    "css/css-contain/contain-size-010.html": [
     [
      "/css/css-contain/contain-size-010.html",
      [
       [
-       "/css/reference/pass_if_pass_below.html",
+       "/css/css-contain/reference/pass_if_pass_below_clipped.html",
        "=="
       ]
      ],
      {}
     ]
    ],
    "css/css-contain/contain-size-011.html": [
     [
@@ -109993,17 +109999,17 @@
      {}
     ]
    ],
    "css/css-contain/contain-size-012.html": [
     [
      "/css/css-contain/contain-size-012.html",
      [
       [
-       "/css/reference/pass_if_pass_below.html",
+       "/css/css-contain/reference/pass_if_pass_below_clipped.html",
        "=="
       ]
      ],
      {}
     ]
    ],
    "css/css-contain/contain-size-013.html": [
     [
@@ -241566,17 +241572,17 @@
      {}
     ]
    ],
    "css/compositing/mix-blend-mode/support/yellow_square.svg": [
     [
      {}
     ]
    ],
-   "css/compositing/parsing/resources/parsing-testcommon.js": [
+   "css/compositing/support/parsing-testcommon.js": [
     [
      {}
     ]
    ],
    "css/compositing/svg/reference/mix-blend-mode-svg-rectangle-ref.html": [
     [
      {}
     ]
@@ -242251,21 +242257,16 @@
      {}
     ]
    ],
    "css/css-backgrounds/justfortest.html": [
     [
      {}
     ]
    ],
-   "css/css-backgrounds/parsing/resources/parsing-testcommon.js": [
-    [
-     {}
-    ]
-   ],
    "css/css-backgrounds/reference/60x60-green-background.html": [
     [
      {}
     ]
    ],
    "css/css-backgrounds/reference/background-334-ref.xht": [
     [
      {}
@@ -242751,16 +242752,21 @@
      {}
     ]
    ],
    "css/css-backgrounds/support/outline-5px-10px-15px-20px-green.png": [
     [
      {}
     ]
    ],
+   "css/css-backgrounds/support/parsing-testcommon.js": [
+    [
+     {}
+    ]
+   ],
    "css/css-backgrounds/support/pattern-grg-rgr-grg.png": [
     [
      {}
     ]
    ],
    "css/css-backgrounds/support/pattern-grg-rrg-rgg.png": [
     [
      {}
@@ -242921,17 +242927,17 @@
      {}
     ]
    ],
    "css/css-box/META.yml": [
     [
      {}
     ]
    ],
-   "css/css-box/parsing/resources/parsing-testcommon.js": [
+   "css/css-box/support/parsing-testcommon.js": [
     [
      {}
     ]
    ],
    "css/css-break/META.yml": [
     [
      {}
     ]
@@ -242951,26 +242957,26 @@
      {}
     ]
    ],
    "css/css-cascade/initial-color-background-001-ref.html": [
     [
      {}
     ]
    ],
-   "css/css-cascade/parsing/support/parsing-testcommon.js": [
-    [
-     {}
-    ]
-   ],
    "css/css-cascade/reference/ref-filled-green-100px-square.xht": [
     [
      {}
     ]
    ],
+   "css/css-cascade/support/parsing-testcommon.js": [
+    [
+     {}
+    ]
+   ],
    "css/css-color/LICENSE": [
     [
      {}
     ]
    ],
    "css/css-color/META.yml": [
     [
      {}
@@ -243021,26 +243027,26 @@
      {}
     ]
    ],
    "css/css-color/lab-007-ref.html": [
     [
      {}
     ]
    ],
-   "css/css-color/parsing/resources/parsing-testcommon.js": [
-    [
-     {}
-    ]
-   ],
    "css/css-color/rebeccapurple-ref.html": [
     [
      {}
     ]
    ],
+   "css/css-color/support/parsing-testcommon.js": [
+    [
+     {}
+    ]
+   ],
    "css/css-color/t31-color-currentColor-b-ref.html": [
     [
      {}
     ]
    ],
    "css/css-color/t31-color-text-a-ref.xht": [
     [
      {}
@@ -243501,16 +243507,21 @@
      {}
     ]
    ],
    "css/css-contain/reference/counter-scoping-003-ref.html": [
     [
      {}
     ]
    ],
+   "css/css-contain/reference/pass_if_pass_below_clipped.html": [
+    [
+     {}
+    ]
+   ],
    "css/css-contain/reference/quote-scoping-001-ref.html": [
     [
      {}
     ]
    ],
    "css/css-contain/reference/quote-scoping-002-ref.html": [
     [
      {}
@@ -243521,16 +243532,21 @@
      {}
     ]
    ],
    "css/css-contain/reference/ref-if-there-is-no-red.xht": [
     [
      {}
     ]
    ],
+   "css/css-contain/support/60x60-red.png": [
+    [
+     {}
+    ]
+   ],
    "css/css-contain/support/blue-100x100.png": [
     [
      {}
     ]
    ],
    "css/css-contain/support/blue50wBy23h.png": [
     [
      {}
@@ -254071,21 +254087,16 @@
      {}
     ]
    ],
    "css/css-images/linear-gradient-ref.html": [
     [
      {}
     ]
    ],
-   "css/css-images/parsing/resources/parsing-testcommon.js": [
-    [
-     {}
-    ]
-   ],
    "css/css-images/support/1x1-green.gif": [
     [
      {}
     ]
    ],
    "css/css-images/support/1x1-green.png": [
     [
      {}
@@ -254171,16 +254182,21 @@
      {}
     ]
    ],
    "css/css-images/support/intrinsic-size.png": [
     [
      {}
     ]
    ],
+   "css/css-images/support/parsing-testcommon.js": [
+    [
+     {}
+    ]
+   ],
    "css/css-images/support/pattern-grg-rgr-grg.png": [
     [
      {}
     ]
    ],
    "css/css-images/support/pattern-grg-rrg-rgg.png": [
     [
      {}
@@ -254756,17 +254772,17 @@
      {}
     ]
    ],
    "css/css-masking/clip/reference/clip-vertical-stripe-ref.html": [
     [
      {}
     ]
    ],
-   "css/css-masking/parsing/resources/parsing-testcommon.js": [
+   "css/css-masking/support/parsing-testcommon.js": [
     [
      {}
     ]
    ],
    "css/css-masking/test-mask-ref.html": [
     [
      {}
     ]
@@ -257341,21 +257357,16 @@
      {}
     ]
    ],
    "css/css-shapes/META.yml": [
     [
      {}
     ]
    ],
-   "css/css-shapes/parsing/resources/parsing-testcommon.js": [
-    [
-     {}
-    ]
-   ],
    "css/css-shapes/shape-outside/formatting-context/reference/shape-outside-formatting-context-ref.html": [
     [
      {}
     ]
    ],
    "css/css-shapes/shape-outside/shape-box/reference/shape-outside-box-001-ref.html": [
     [
      {}
@@ -257731,16 +257742,21 @@
      {}
     ]
    ],
    "css/css-shapes/support/cat.png": [
     [
      {}
     ]
    ],
+   "css/css-shapes/support/parsing-testcommon.js": [
+    [
+     {}
+    ]
+   ],
    "css/css-shapes/support/pattern-grg-rgr-grg.png": [
     [
      {}
     ]
    ],
    "css/css-shapes/support/pattern-grg-rrg-rgg.png": [
     [
      {}
@@ -260671,21 +260687,16 @@
      {}
     ]
    ],
    "css/css-transforms/matrix/reference/svg-matrix-four-color-ref.html": [
     [
      {}
     ]
    ],
-   "css/css-transforms/parsing/resources/parsing-testcommon.js": [
-    [
-     {}
-    ]
-   ],
    "css/css-transforms/patternTransform/reference/svg-patternTransform-combination-ref.html": [
     [
      {}
     ]
    ],
    "css/css-transforms/patternTransform/reference/svg-patternTransform-ex-unit-ref.html": [
     [
      {}
@@ -261046,16 +261057,21 @@
      {}
     ]
    ],
    "css/css-transforms/support/import-red.css": [
     [
      {}
     ]
    ],
+   "css/css-transforms/support/parsing-testcommon.js": [
+    [
+     {}
+    ]
+   ],
    "css/css-transforms/support/pattern-grg-rgr-grg.png": [
     [
      {}
     ]
    ],
    "css/css-transforms/support/pattern-grg-rrg-rgg.png": [
     [
      {}
@@ -262256,21 +262272,16 @@
      {}
     ]
    ],
    "css/css-ui/META.yml": [
     [
      {}
     ]
    ],
-   "css/css-ui/parsing/support/parsing-testcommon.js": [
-    [
-     {}
-    ]
-   ],
    "css/css-ui/reference/box-sizing-001-ref.html": [
     [
      {}
     ]
    ],
    "css/css-ui/reference/box-sizing-007-ref.html": [
     [
      {}
@@ -263541,16 +263552,21 @@
      {}
     ]
    ],
    "css/css-ui/support/orange.svg": [
     [
      {}
     ]
    ],
+   "css/css-ui/support/parsing-testcommon.js": [
+    [
+     {}
+    ]
+   ],
    "css/css-ui/support/r1-1.svg": [
     [
      {}
     ]
    ],
    "css/css-ui/support/red.ico": [
     [
      {}
@@ -264436,21 +264452,16 @@
      {}
     ]
    ],
    "css/css-writing-modes/overconstrained-rel-pos-rtl-top-bottom-vrl-006-ref.xht": [
     [
      {}
     ]
    ],
-   "css/css-writing-modes/parsing/resources/parsing-testcommon.js": [
-    [
-     {}
-    ]
-   ],
    "css/css-writing-modes/reference/available-size-001-ref.html": [
     [
      {}
     ]
    ],
    "css/css-writing-modes/reference/available-size-002-ref.html": [
     [
      {}
@@ -266021,16 +266032,21 @@
      {}
     ]
    ],
    "css/css-writing-modes/support/page-flow-direction-002p4.png": [
     [
      {}
     ]
    ],
+   "css/css-writing-modes/support/parsing-testcommon.js": [
+    [
+     {}
+    ]
+   ],
    "css/css-writing-modes/support/pass-cdts-abs-pos-non-replaced.png": [
     [
      {}
     ]
    ],
    "css/css-writing-modes/support/pass-cdts-bg-pos-vrl-002.png": [
     [
      {}
@@ -267331,21 +267347,16 @@
      {}
     ]
    ],
    "css/filter-effects/filters-sepia-001-ref.html": [
     [
      {}
     ]
    ],
-   "css/filter-effects/parsing/resources/parsing-testcommon.js": [
-    [
-     {}
-    ]
-   ],
    "css/filter-effects/reference/filters-opacity-001-ref.html": [
     [
      {}
     ]
    ],
    "css/filter-effects/reference/filters-opacity-002-ref.html": [
     [
      {}
@@ -267441,16 +267452,21 @@
      {}
     ]
    ],
    "css/filter-effects/support/import-red.css": [
     [
      {}
     ]
    ],
+   "css/filter-effects/support/parsing-testcommon.js": [
+    [
+     {}
+    ]
+   ],
    "css/filter-effects/support/pattern-grg-rgr-grg.png": [
     [
      {}
     ]
    ],
    "css/filter-effects/support/pattern-grg-rrg-rgg.png": [
     [
      {}
@@ -267651,17 +267667,17 @@
      {}
     ]
    ],
    "css/motion/offset-rotate-ref.html": [
     [
      {}
     ]
    ],
-   "css/motion/parsing/resources/parsing-testcommon.js": [
+   "css/motion/support/parsing-testcommon.js": [
     [
      {}
     ]
    ],
    "css/reference/META.yml": [
     [
      {}
     ]
@@ -269651,16 +269667,21 @@
      {}
     ]
    ],
    "css/support/import-red.css": [
     [
      {}
     ]
    ],
+   "css/support/parsing-testcommon.js": [
+    [
+     {}
+    ]
+   ],
    "css/support/pattern-grg-rgr-grg.png": [
     [
      {}
     ]
    ],
    "css/support/pattern-grg-rrg-rgg.png": [
     [
      {}
@@ -298381,16 +298402,21 @@
      {}
     ]
    ],
    "service-workers/cache-storage/resources/test-helpers.js": [
     [
      {}
     ]
    ],
+   "service-workers/cache-storage/resources/vary.py": [
+    [
+     {}
+    ]
+   ],
    "service-workers/cache-storage/script-tests/cache-abort.js": [
     [
      {}
     ]
    ],
    "service-workers/cache-storage/script-tests/cache-add.js": [
     [
      {}
@@ -304701,16 +304727,306 @@
      {}
     ]
    ],
    "tools/third_party/html5lib/utils/entities.py": [
     [
      {}
     ]
    ],
+   "tools/third_party/hyper/hyper/__init__.py": [
+    [
+     {}
+    ]
+   ],
+   "tools/third_party/hyper/hyper/certs.pem": [
+    [
+     {}
+    ]
+   ],
+   "tools/third_party/hyper/hyper/cli.py": [
+    [
+     {}
+    ]
+   ],
+   "tools/third_party/hyper/hyper/common/__init__.py": [
+    [
+     {}
+    ]
+   ],
+   "tools/third_party/hyper/hyper/common/bufsocket.py": [
+    [
+     {}
+    ]
+   ],
+   "tools/third_party/hyper/hyper/common/connection.py": [
+    [
+     {}
+    ]
+   ],
+   "tools/third_party/hyper/hyper/common/decoder.py": [
+    [
+     {}
+    ]
+   ],
+   "tools/third_party/hyper/hyper/common/exceptions.py": [
+    [
+     {}
+    ]
+   ],
+   "tools/third_party/hyper/hyper/common/headers.py": [
+    [
+     {}
+    ]
+   ],
+   "tools/third_party/hyper/hyper/common/util.py": [
+    [
+     {}
+    ]
+   ],
+   "tools/third_party/hyper/hyper/compat.py": [
+    [
+     {}
+    ]
+   ],
+   "tools/third_party/hyper/hyper/contrib.py": [
+    [
+     {}
+    ]
+   ],
+   "tools/third_party/hyper/hyper/h2/__init__.py": [
+    [
+     {}
+    ]
+   ],
+   "tools/third_party/hyper/hyper/h2/config.py": [
+    [
+     {}
+    ]
+   ],
+   "tools/third_party/hyper/hyper/h2/connection.py": [
+    [
+     {}
+    ]
+   ],
+   "tools/third_party/hyper/hyper/h2/errors.py": [
+    [
+     {}
+    ]
+   ],
+   "tools/third_party/hyper/hyper/h2/events.py": [
+    [
+     {}
+    ]
+   ],
+   "tools/third_party/hyper/hyper/h2/exceptions.py": [
+    [
+     {}
+    ]
+   ],
+   "tools/third_party/hyper/hyper/h2/frame_buffer.py": [
+    [
+     {}
+    ]
+   ],
+   "tools/third_party/hyper/hyper/h2/settings.py": [
+    [
+     {}
+    ]
+   ],
+   "tools/third_party/hyper/hyper/h2/stream.py": [
+    [
+     {}
+    ]
+   ],
+   "tools/third_party/hyper/hyper/h2/utilities.py": [
+    [
+     {}
+    ]
+   ],
+   "tools/third_party/hyper/hyper/h2/windows.py": [
+    [
+     {}
+    ]
+   ],
+   "tools/third_party/hyper/hyper/http11/__init__.py": [
+    [
+     {}
+    ]
+   ],
+   "tools/third_party/hyper/hyper/http11/connection.py": [
+    [
+     {}
+    ]
+   ],
+   "tools/third_party/hyper/hyper/http11/parser.py": [
+    [
+     {}
+    ]
+   ],
+   "tools/third_party/hyper/hyper/http11/response.py": [
+    [
+     {}
+    ]
+   ],
+   "tools/third_party/hyper/hyper/http20/__init__.py": [
+    [
+     {}
+    ]
+   ],
+   "tools/third_party/hyper/hyper/http20/connection.py": [
+    [
+     {}
+    ]
+   ],
+   "tools/third_party/hyper/hyper/http20/errors.py": [
+    [
+     {}
+    ]
+   ],
+   "tools/third_party/hyper/hyper/http20/exceptions.py": [
+    [
+     {}
+    ]
+   ],
+   "tools/third_party/hyper/hyper/http20/response.py": [
+    [
+     {}
+    ]
+   ],
+   "tools/third_party/hyper/hyper/http20/stream.py": [
+    [
+     {}
+    ]
+   ],
+   "tools/third_party/hyper/hyper/http20/util.py": [
+    [
+     {}
+    ]
+   ],
+   "tools/third_party/hyper/hyper/http20/window.py": [
+    [
+     {}
+    ]
+   ],
+   "tools/third_party/hyper/hyper/httplib_compat.py": [
+    [
+     {}
+    ]
+   ],
+   "tools/third_party/hyper/hyper/packages/__init__.py": [
+    [
+     {}
+    ]
+   ],
+   "tools/third_party/hyper/hyper/packages/hpack/__init__.py": [
+    [
+     {}
+    ]
+   ],
+   "tools/third_party/hyper/hyper/packages/hpack/compat.py": [
+    [
+     {}
+    ]
+   ],
+   "tools/third_party/hyper/hyper/packages/hpack/exceptions.py": [
+    [
+     {}
+    ]
+   ],
+   "tools/third_party/hyper/hyper/packages/hpack/hpack.py": [
+    [
+     {}
+    ]
+   ],
+   "tools/third_party/hyper/hyper/packages/hpack/hpack_compat.py": [
+    [
+     {}
+    ]
+   ],
+   "tools/third_party/hyper/hyper/packages/hpack/huffman.py": [
+    [
+     {}
+    ]
+   ],
+   "tools/third_party/hyper/hyper/packages/hpack/huffman_constants.py": [
+    [
+     {}
+    ]
+   ],
+   "tools/third_party/hyper/hyper/packages/hyperframe/__init__.py": [
+    [
+     {}
+    ]
+   ],
+   "tools/third_party/hyper/hyper/packages/hyperframe/flags.py": [
+    [
+     {}
+    ]
+   ],
+   "tools/third_party/hyper/hyper/packages/hyperframe/frame.py": [
+    [
+     {}
+    ]
+   ],
+   "tools/third_party/hyper/hyper/packages/rfc3986/LICENSE": [
+    [
+     {}
+    ]
+   ],
+   "tools/third_party/hyper/hyper/packages/rfc3986/__init__.py": [
+    [
+     {}
+    ]
+   ],
+   "tools/third_party/hyper/hyper/packages/rfc3986/api.py": [
+    [
+     {}
+    ]
+   ],
+   "tools/third_party/hyper/hyper/packages/rfc3986/compat.py": [
+    [
+     {}
+    ]
+   ],
+   "tools/third_party/hyper/hyper/packages/rfc3986/exceptions.py": [
+    [
+     {}
+    ]
+   ],
+   "tools/third_party/hyper/hyper/packages/rfc3986/misc.py": [
+    [
+     {}
+    ]
+   ],
+   "tools/third_party/hyper/hyper/packages/rfc3986/normalizers.py": [
+    [
+     {}
+    ]
+   ],
+   "tools/third_party/hyper/hyper/packages/rfc3986/parseresult.py": [
+    [
+     {}
+    ]
+   ],
+   "tools/third_party/hyper/hyper/packages/rfc3986/uri.py": [
+    [
+     {}
+    ]
+   ],
+   "tools/third_party/hyper/hyper/ssl_compat.py": [
+    [
+     {}
+    ]
+   ],
+   "tools/third_party/hyper/hyper/tls.py": [
+    [
+     {}
+    ]
+   ],
    "tools/third_party/hyperframe/CONTRIBUTORS.rst": [
     [
      {}
     ]
    ],
    "tools/third_party/hyperframe/HISTORY.rst": [
     [
      {}
@@ -308451,16 +308767,31 @@
      {}
     ]
    ],
    "tools/wptserve/tests/functional/docroot/test.asis": [
     [
      {}
     ]
    ],
+   "tools/wptserve/tests/functional/docroot/test_h2_data.py": [
+    [
+     {}
+    ]
+   ],
+   "tools/wptserve/tests/functional/docroot/test_h2_headers.py": [
+    [
+     {}
+    ]
+   ],
+   "tools/wptserve/tests/functional/docroot/test_h2_headers_data.py": [
+    [
+     {}
+    ]
+   ],
    "tools/wptserve/tests/functional/docroot/test_string.py": [
     [
      {}
     ]
    ],
    "tools/wptserve/tests/functional/docroot/test_tuple_2.py": [
     [
      {}
@@ -310001,16 +310332,26 @@
      {}
     ]
    ],
    "webdriver/tests/get_title/__init__.py": [
     [
      {}
     ]
    ],
+   "webdriver/tests/get_window_handle/__init__.py": [
+    [
+     {}
+    ]
+   ],
+   "webdriver/tests/get_window_handles/__init__.py": [
+    [
+     {}
+    ]
+   ],
    "webdriver/tests/get_window_rect/__init__.py": [
     [
      {}
     ]
    ],
    "webdriver/tests/is_element_selected/__init__.py": [
     [
      {}
@@ -330750,16 +331091,22 @@
     ]
    ],
    "css/css-logical/animation-003.tentative.html": [
     [
      "/css/css-logical/animation-003.tentative.html",
      {}
     ]
    ],
+   "css/css-logical/animation-004.html": [
+    [
+     "/css/css-logical/animation-004.html",
+     {}
+    ]
+   ],
    "css/css-logical/logical-box-border-color.html": [
     [
      "/css/css-logical/logical-box-border-color.html",
      {}
     ]
    ],
    "css/css-logical/logical-box-border-shorthands.html": [
     [
@@ -338504,16 +338851,22 @@
     ]
    ],
    "css/selectors/missing-right-token.html": [
     [
      "/css/selectors/missing-right-token.html",
      {}
     ]
    ],
+   "css/selectors/scope-selector.html": [
+    [
+     "/css/selectors/scope-selector.html",
+     {}
+    ]
+   ],
    "css/selectors/user-invalid.html": [
     [
      "/css/selectors/user-invalid.html",
      {}
     ]
    ],
    "custom-elements/CustomElementRegistry.html": [
     [
@@ -358274,16 +358627,22 @@
     ]
    ],
    "html/semantics/embedded-content/the-img-element/not-rendered-dimension-getter.html": [
     [
      "/html/semantics/embedded-content/the-img-element/not-rendered-dimension-getter.html",
      {}
     ]
    ],
+   "html/semantics/embedded-content/the-img-element/null-image-source.html": [
+    [
+     "/html/semantics/embedded-content/the-img-element/null-image-source.html",
+     {}
+    ]
+   ],
    "html/semantics/embedded-content/the-img-element/relevant-mutations.html": [
     [
      "/html/semantics/embedded-content/the-img-element/relevant-mutations.html",
      {}
     ]
    ],
    "html/semantics/embedded-content/the-img-element/sizes/parse-a-sizes-attribute-display-none.html": [
     [
@@ -363076,16 +363435,22 @@
     ]
    ],
    "html/syntax/parsing/math-parse03.html": [
     [
      "/html/syntax/parsing/math-parse03.html",
      {}
     ]
    ],
+   "html/syntax/parsing/meta-inhead-insertion-mode.html": [
+    [
+     "/html/syntax/parsing/meta-inhead-insertion-mode.html",
+     {}
+    ]
+   ],
    "html/syntax/parsing/named-character-references.html": [
     [
      "/html/syntax/parsing/named-character-references.html",
      {}
     ]
    ],
    "html/syntax/parsing/template/additions-to-foster-parenting/template-is-a-foster-parent-element.html": [
     [
@@ -367644,22 +368009,16 @@
     ]
    ],
    "navigation-timing/idlharness.window.js": [
     [
      "/navigation-timing/idlharness.window.html",
      {}
     ]
    ],
-   "navigation-timing/nav2_idlharness.html": [
-    [
-     "/navigation-timing/nav2_idlharness.html",
-     {}
-    ]
-   ],
    "navigation-timing/nav2_test_attributes_exist.html": [
     [
      "/navigation-timing/nav2_test_attributes_exist.html",
      {}
     ]
    ],
    "navigation-timing/nav2_test_attributes_values.html": [
     [
@@ -389084,16 +389443,22 @@
     ]
    ],
    "service-workers/service-worker/navigation-preload/get-state.https.html": [
     [
      "/service-workers/service-worker/navigation-preload/get-state.https.html",
      {}
     ]
    ],
+   "service-workers/service-worker/navigation-preload/navigationPreload.https.html": [
+    [
+     "/service-workers/service-worker/navigation-preload/navigationPreload.https.html",
+     {}
+    ]
+   ],
    "service-workers/service-worker/navigation-preload/redirect.https.html": [
     [
      "/service-workers/service-worker/navigation-preload/redirect.https.html",
      {}
     ]
    ],
    "service-workers/service-worker/navigation-preload/request-headers.https.html": [
     [
@@ -392310,30 +392675,28 @@
     ]
    ],
    "uievents/constructors/inputevent-constructor.html": [
     [
      "/uievents/constructors/inputevent-constructor.html",
      {}
     ]
    ],
+   "uievents/idlharness.window.js": [
+    [
+     "/uievents/idlharness.window.html",
+     {}
+    ]
+   ],
    "uievents/interface/click-event.htm": [
     [
      "/uievents/interface/click-event.htm",
      {}
     ]
    ],
-   "uievents/interfaces.html": [
-    [
-     "/uievents/interfaces.html",
-     {
-      "timeout": "long"
-     }
-    ]
-   ],
    "uievents/legacy-domevents-tests/approved/ProcessingInstruction.DOMCharacterDataModified.html": [
     [
      "/uievents/legacy-domevents-tests/approved/ProcessingInstruction.DOMCharacterDataModified.html",
      {}
     ]
    ],
    "uievents/legacy-domevents-tests/approved/dispatchEvent.click.checkbox.html": [
     [
@@ -392836,19 +393199,19 @@
     ]
    ],
    "vibration/api-is-present.html": [
     [
      "/vibration/api-is-present.html",
      {}
     ]
    ],
-   "vibration/idl.html": [
-    [
-     "/vibration/idl.html",
+   "vibration/idlharness.window.js": [
+    [
+     "/vibration/idlharness.window.html",
      {}
     ]
    ],
    "vibration/invalid-values.html": [
     [
      "/vibration/invalid-values.html",
      {}
     ]
@@ -393618,43 +393981,55 @@
     ]
    ],
    "web-animations/timing-model/timelines/update-and-send-events.html": [
     [
      "/web-animations/timing-model/timelines/update-and-send-events.html",
      {}
     ]
    ],
-   "web-locks/acquire.tentative.https.html": [
-    [
-     "/web-locks/acquire.tentative.https.html",
+   "web-locks/acquire.tentative.https.any.js": [
+    [
+     "/web-locks/acquire.tentative.https.any.html",
+     {}
+    ],
+    [
+     "/web-locks/acquire.tentative.https.any.worker.html",
      {}
     ]
    ],
    "web-locks/clientids.tentative.https.html": [
     [
      "/web-locks/clientids.tentative.https.html",
      {}
     ]
    ],
    "web-locks/frames.tentative.https.html": [
     [
      "/web-locks/frames.tentative.https.html",
      {}
     ]
    ],
-   "web-locks/held.tentative.https.html": [
-    [
-     "/web-locks/held.tentative.https.html",
-     {}
-    ]
-   ],
-   "web-locks/ifAvailable.tentative.https.html": [
-    [
-     "/web-locks/ifAvailable.tentative.https.html",
+   "web-locks/held.tentative.https.any.js": [
+    [
+     "/web-locks/held.tentative.https.any.html",
+     {}
+    ],
+    [
+     "/web-locks/held.tentative.https.any.worker.html",
+     {}
+    ]
+   ],
+   "web-locks/ifAvailable.tentative.https.any.js": [
+    [
+     "/web-locks/ifAvailable.tentative.https.any.html",
+     {}
+    ],
+    [
+     "/web-locks/ifAvailable.tentative.https.any.worker.html",
      {}
     ]
    ],
    "web-locks/interfaces-serviceworker.tentative.https.html": [
     [
      "/web-locks/interfaces-serviceworker.tentative.https.html",
      {}
     ]
@@ -393664,91 +394039,139 @@
      "/web-locks/interfaces.tentative.https.any.html",
      {}
     ],
     [
      "/web-locks/interfaces.tentative.https.any.worker.html",
      {}
     ]
    ],
-   "web-locks/lock-attributes.tentative.https.html": [
-    [
-     "/web-locks/lock-attributes.tentative.https.html",
-     {}
-    ]
-   ],
-   "web-locks/mode-exclusive.tentative.https.html": [
-    [
-     "/web-locks/mode-exclusive.tentative.https.html",
-     {}
-    ]
-   ],
-   "web-locks/mode-mixed.tentative.https.html": [
-    [
-     "/web-locks/mode-mixed.tentative.https.html",
-     {}
-    ]
-   ],
-   "web-locks/mode-shared.tentative.https.html": [
-    [
-     "/web-locks/mode-shared.tentative.https.html",
-     {}
-    ]
-   ],
-   "web-locks/non-secure-context.tentative.html": [
-    [
-     "/web-locks/non-secure-context.tentative.html",
+   "web-locks/lock-attributes.tentative.https.any.js": [
+    [
+     "/web-locks/lock-attributes.tentative.https.any.html",
+     {}
+    ],
+    [
+     "/web-locks/lock-attributes.tentative.https.any.worker.html",
+     {}
+    ]
+   ],
+   "web-locks/mode-exclusive.tentative.https.any.js": [
+    [
+     "/web-locks/mode-exclusive.tentative.https.any.html",
+     {}
+    ],
+    [
+     "/web-locks/mode-exclusive.tentative.https.any.worker.html",
+     {}
+    ]
+   ],
+   "web-locks/mode-mixed.tentative.https.any.js": [
+    [
+     "/web-locks/mode-mixed.tentative.https.any.html",
+     {}
+    ],
+    [
+     "/web-locks/mode-mixed.tentative.https.any.worker.html",
+     {}
+    ]
+   ],
+   "web-locks/mode-shared.tentative.https.any.js": [
+    [
+     "/web-locks/mode-shared.tentative.https.any.html",
+     {}
+    ],
+    [
+     "/web-locks/mode-shared.tentative.https.any.worker.html",
+     {}
+    ]
+   ],
+   "web-locks/non-secure-context.tentative.any.js": [
+    [
+     "/web-locks/non-secure-context.tentative.any.html",
+     {}
+    ],
+    [
+     "/web-locks/non-secure-context.tentative.any.worker.html",
      {}
     ]
    ],
    "web-locks/opaque-origin.tentative.https.html": [
     [
      "/web-locks/opaque-origin.tentative.https.html",
      {}
     ]
    ],
-   "web-locks/query-empty.tentative.https.html": [
-    [
-     "/web-locks/query-empty.tentative.https.html",
-     {}
-    ]
-   ],
-   "web-locks/query-order.tentative.https.html": [
-    [
-     "/web-locks/query-order.tentative.https.html",
-     {}
-    ]
-   ],
-   "web-locks/query.tentative.https.html": [
-    [
-     "/web-locks/query.tentative.https.html",
-     {}
-    ]
-   ],
-   "web-locks/resource-names.tentative.https.html": [
-    [
-     "/web-locks/resource-names.tentative.https.html",
-     {}
-    ]
-   ],
-   "web-locks/secure-context.tentative.https.html": [
-    [
-     "/web-locks/secure-context.tentative.https.html",
-     {}
-    ]
-   ],
-   "web-locks/signal.tentative.https.html": [
-    [
-     "/web-locks/signal.tentative.https.html",
-     {}
-    ]
-   ],
-   "web-locks/steal.tentative.https.html": [
-    [
-     "/web-locks/steal.tentative.https.html",
+   "web-locks/query-empty.tentative.https.any.js": [
+    [
+     "/web-locks/query-empty.tentative.https.any.html",
+     {}
+    ],
+    [
+     "/web-locks/query-empty.tentative.https.any.worker.html",
+     {}
+    ]
+   ],
+   "web-locks/query-order.tentative.https.any.js": [
+    [
+     "/web-locks/query-order.tentative.https.any.html",
+     {}
+    ],
+    [
+     "/web-locks/query-order.tentative.https.any.worker.html",
+     {}
+    ]
+   ],
+   "web-locks/query.tentative.https.any.js": [
+    [
+     "/web-locks/query.tentative.https.any.html",
+     {}
+    ],
+    [
+     "/web-locks/query.tentative.https.any.worker.html",
+     {}
+    ]
+   ],
+   "web-locks/resource-names.tentative.https.any.js": [
+    [
+     "/web-locks/resource-names.tentative.https.any.html",
+     {}
+    ],
+    [
+     "/web-locks/resource-names.tentative.https.any.worker.html",
+     {}
+    ]
+   ],
+   "web-locks/secure-context.tentative.https.any.js": [
+    [
+     "/web-locks/secure-context.tentative.https.any.html",
+     {}
+    ],
+    [
+     "/web-locks/secure-context.tentative.https.any.worker.html",
+     {}
+    ]
+   ],
+   "web-locks/signal.tentative.https.any.js": [
+    [
+     "/web-locks/signal.tentative.https.any.html",
+     {}
+    ],
+    [
+     "/web-locks/signal.tentative.https.any.worker.html",
+     {}
+    ]
+   ],
+   "web-locks/steal.tentative.https.any.js": [
+    [
+     "/web-locks/steal.tentative.https.any.html",
+     {}
+    ],
+    [
+     "/web-locks/steal.tentative.https.any.worker.html",
      {}
     ]
    ],
    "web-locks/workers.tentative.https.html": [
     [
      "/web-locks/workers.tentative.https.html",
      {}
     ]
@@ -398830,19 +399253,19 @@
     ]
    ],
    "webvtt/api/historical.html": [
     [
      "/webvtt/api/historical.html",
      {}
     ]
    ],
-   "webvtt/api/interfaces.html": [
-    [
-     "/webvtt/api/interfaces.html",
+   "webvtt/api/idlharness.window.js": [
+    [
+     "/webvtt/api/idlharness.window.html",
      {}
     ]
    ],
    "webvtt/parsing/cue-text-parsing/tests/entities.html": [
     [
      "/webvtt/parsing/cue-text-parsing/tests/entities.html",
      {}
     ]
@@ -421806,16 +422229,44 @@
    "webdriver/tests/get_title/user_prompts.py": [
     [
      "/webdriver/tests/get_title/user_prompts.py",
      {
       "timeout": "long"
      }
     ]
    ],
+   "webdriver/tests/get_window_handle/get.py": [
+    [
+     "/webdriver/tests/get_window_handle/get.py",
+     {}
+    ]
+   ],
+   "webdriver/tests/get_window_handle/user_prompts.py": [
+    [
+     "/webdriver/tests/get_window_handle/user_prompts.py",
+     {
+      "timeout": "long"
+     }
+    ]
+   ],
+   "webdriver/tests/get_window_handles/get.py": [
+    [
+     "/webdriver/tests/get_window_handles/get.py",
+     {}
+    ]
+   ],
+   "webdriver/tests/get_window_handles/user_prompts.py": [
+    [
+     "/webdriver/tests/get_window_handles/user_prompts.py",
+     {
+      "timeout": "long"
+     }
+    ]
+   ],
    "webdriver/tests/get_window_rect/get.py": [
     [
      "/webdriver/tests/get_window_rect/get.py",
      {}
     ]
    ],
    "webdriver/tests/get_window_rect/user_prompts.py": [
     [
@@ -431662,17 +432113,17 @@
    "0b5b1cb5e94d3f27bebbb5a462bf1e823dfc57b4",
    "testharness"
   ],
   "background-fetch/dangling-markup.https.window.js": [
    "764257d7d1a8eecfba6735647637055b21dcb94b",
    "testharness"
   ],
   "background-fetch/fetch.https.window.js": [
-   "cca63289206f75de446852c1b37fb0c0911aadd7",
+   "f146212987a4ebb2e90edc190e9232cbd07210f9",
    "testharness"
   ],
   "background-fetch/get-ids.https.window.js": [
    "28f5bc3132b7209c343ee264fb0699184e7bb47c",
    "testharness"
   ],
   "background-fetch/get.https.window.js": [
    "0b272dbaa4961b73049325f7826713682b590f8c",
@@ -431698,25 +432149,25 @@
    "dbe041941d093e3c91472c410d506d40a466fe45",
    "support"
   ],
   "background-fetch/service_workers/sw-helpers.js": [
    "ff51f22a2b950f25ff5668a20868a5e03cb13b4c",
    "support"
   ],
   "background-fetch/service_workers/sw-update-ui.js": [
-   "ae0ed090b42df76780ae23a9bf250d1e359917c4",
+   "5dec087cd155b486b974f3a26c149fcd113380c3",
    "support"
   ],
   "background-fetch/service_workers/sw.js": [
-   "34ea5d4fb64fb410247d844b89e87f14a9223b11",
+   "10e17f5874f2c76eaff7116107fa5896e31095a0",
    "support"
   ],
   "background-fetch/update-ui.https.window.js": [
-   "d561267d14eca9abe4bedf6c216d5044778aa843",
+   "aed0bb86d26398aabc3688c6fee90c0cfc7d4206",
    "testharness"
   ],
   "battery-status/META.yml": [
    "eded36c5e2f2487376caae21cda9cc36a5090168",
    "support"
   ],
   "battery-status/battery-charging-manual.https.html": [
    "9ff7421638a85e077532eecbeab417d0fe5b0314",
@@ -513698,40 +514149,40 @@
    "a078e6b731b3c08edd6c8ec821a4dc85a8058953",
    "support"
   ],
   "css/compositing/mix-blend-mode/support/yellow_square.svg": [
    "9ab6394e2aa521c87f1553cff441acca4bf9d6a6",
    "support"
   ],
   "css/compositing/parsing/background-blend-mode-invalid.html": [
-   "e62ad2d9688a76d7c32a711fba9ed59bdb037558",
+   "1983adad24de2404efb205a5c79dae3464f509d6",
    "testharness"
   ],
   "css/compositing/parsing/background-blend-mode-valid.html": [
-   "debbafdbd548542ee1d0f1501ccc6e1d1fc1540b",
+   "eebe646bf8a269bae54d03948be2ac2c36052800",
    "testharness"
   ],
   "css/compositing/parsing/isolation-invalid.html": [
-   "759c6c9b70c5c772863aa8022be3041c3b0a2a0c",
+   "bb3a5db31c3dd0c5b44a85fd58dac4bbb33284a4",
    "testharness"
   ],
   "css/compositing/parsing/isolation-valid.html": [
-   "bfc27be65bbc74a1a5e950197abb16e9e7bee4a7",
+   "6fa4cc9bc76bab577203a3474916e3f37d18d348",
    "testharness"
   ],
   "css/compositing/parsing/mix-blend-mode-invalid.html": [
-   "cde6cee4b1593c7414cf7dc537812ca43de0d537",
+   "a7c1232c8a1999935ad40c2cd20ed7ef882ba0bc",
    "testharness"
   ],
   "css/compositing/parsing/mix-blend-mode-valid.html": [
-   "50a333a67424d86b322bc02f29d27c9fabec128a",
-   "testharness"
-  ],
-  "css/compositing/parsing/resources/parsing-testcommon.js": [
+   "2033f404941ea650623bf8dd56f848e911f7aa79",
+   "testharness"
+  ],
+  "css/compositing/support/parsing-testcommon.js": [
    "b075882f89aae49b419220b234534241cde5fd42",
    "support"
   ],
   "css/compositing/svg/mix-blend-mode-in-svg-image.html": [
    "658e0275d70b357b210ae70243a2f58b9752910c",
    "reftest"
   ],
   "css/compositing/svg/mix-blend-mode-svg-rectangle.html": [
@@ -517066,17 +517517,17 @@
    "5ebde5519ca445732fef5f3f28a60ecd102ed676",
    "reftest"
   ],
   "css/css-backgrounds/box-shadow-outset-without-border-radius.html": [
    "9f2135417278f6d0528eb3f66d255508a62571a9",
    "reftest"
   ],
   "css/css-backgrounds/box-shadow-syntax-001.html": [
-   "e7c83b3ec2275d4e28e60ad41f6e3fdac6a2f47e",
+   "4b8f1869f57a16e883f9bb21ae9bbb2ff381fc1c",
    "testharness"
   ],
   "css/css-backgrounds/box-shadow/box-shadow-blur-definition-001.xht": [
    "ab6116c17d5b4c44e3c378ddef04b6f8ed73514d",
    "visual"
   ],
   "css/css-backgrounds/box-shadow/support/box-shadow-blur-definition-001-dark-bound.png": [
    "695f414ad808a7a82d2d6ffd35172551b2c00a11",
@@ -517174,186 +517625,182 @@
    "eeac7b12fb0c827b54052a39608d42d002889bc8",
    "visual"
   ],
   "css/css-backgrounds/order-of-images.htm": [
    "5ed794153083a7e06eb2e98b7ebdb5bec2676d28",
    "visual"
   ],
   "css/css-backgrounds/parsing/background-attachment-invalid.html": [
-   "e4924a244db2987aef78c3d0f7e8dc86cadb789e",
+   "0af7394aa42829d66051a0920e8ba62176c86159",
    "testharness"
   ],
   "css/css-backgrounds/parsing/background-attachment-valid.html": [
-   "4c7243f878d50b6fda800173e047f14015908b55",
+   "9a0f240991087f89fcdf04d35d5bcafe697555d7",
    "testharness"
   ],
   "css/css-backgrounds/parsing/background-clip-invalid.html": [
-   "50647e8904f85f767f8ef45f3cffdf3c24e13189",
+   "50b887e1c61c40a1b8c0d9e7a1a33898b30b433d",
    "testharness"
   ],
   "css/css-backgrounds/parsing/background-clip-valid.html": [
-   "2b6bd491130b4a301e098f7b82c8924d2e02bad3",
+   "2778315260afd65cd7a4af7f000ac4c2fe88e4e7",
    "testharness"
   ],
   "css/css-backgrounds/parsing/background-color-invalid.html": [
-   "cc31e26168c3b20639679a8f508521cf60365b29",
+   "ff90dffb31114a5d610ed3627d45ae6bb28047af",
    "testharness"
   ],
   "css/css-backgrounds/parsing/background-color-valid.html": [
-   "d7a5d967d552a949131633700987cc26c87d72d2",
+   "b84e13fb957ccf06a2bcbae472d01b8430d2223c",
    "testharness"
   ],
   "css/css-backgrounds/parsing/background-image-invalid.html": [
-   "a5f2a905c1e33f7a49c439f46b7753b45f308313",
+   "12103e01dfa2e25afe03c17fcc48b2fd3ed1a080",
    "testharness"
   ],
   "css/css-backgrounds/parsing/background-image-valid.html": [
-   "873800f4beb79c26599751e5b115fa6f74821f9e",
+   "601efb6898a91d7ed322ea3d1f70aff2ca2e17d4",
    "testharness"
   ],
   "css/css-backgrounds/parsing/background-invalid.html": [
-   "adc178bddacf17a8265f1b6c0fc845b7b5cd04f9",
+   "19f5d965b4832386f940caf261863d9fd66ed757",
    "testharness"
   ],
   "css/css-backgrounds/parsing/background-origin-invalid.html": [
-   "54589257bf70fe5fbb8af63c0d7db26cf5fc1027",
+   "1ef2d9faa897e980b944ef9ba80b79dc3b7246cf",
    "testharness"
   ],
   "css/css-backgrounds/parsing/background-origin-valid.html": [
-   "ff5212667d67eda86642b4432bddd3a99525be13",
+   "bbd59d39790a5208543000a77f0898720372a1e6",
    "testharness"
   ],
   "css/css-backgrounds/parsing/background-position-invalid.html": [
-   "5ddf5e0668311f5f650db5856d0034cf0de4fd64",
+   "9a3e9cb0a619f9b6aba37f16a55c49da041018fd",
    "testharness"
   ],
   "css/css-backgrounds/parsing/background-position-valid.html": [
-   "836f3481997a98e25edba3968ec498ae65d13cc5",
+   "371bc7a351281257b8db13df5750afc437517b7c",
    "testharness"
   ],
   "css/css-backgrounds/parsing/background-repeat-invalid.html": [
-   "a32f5086f8c9262f645b5e621e5ba7b897fa11c7",
+   "55229a70cefface8ef53c02978f30fe484fb075a",
    "testharness"
   ],
   "css/css-backgrounds/parsing/background-repeat-valid.html": [
-   "75549090653b35b4118420bdf006d2e77fbbe7b0",
+   "3a00b19c4c50a28c6db972de4bcce6b94e0abd92",
    "testharness"
   ],
   "css/css-backgrounds/parsing/background-size-invalid.html": [
-   "7259cbdf13b2458f8926ad63a38ec9b693cd6f2f",
+   "7497f43df97b789fd3a9974df8043986e81ff145",
    "testharness"
   ],
   "css/css-backgrounds/parsing/background-size-valid.html": [
-   "670316461b1318d08233f33e9245c49069add98c",
+   "71d60698dca7915e3a580ac3c6a9ad966caad389",
    "testharness"
   ],
   "css/css-backgrounds/parsing/background-valid.html": [
-   "29737e2096f66f2e12920eb1b95f18134ac7460d",
+   "39c4672fb35b103b4a96c92bdeab4ced7c550e86",
    "testharness"
   ],
   "css/css-backgrounds/parsing/border-color-invalid.html": [
-   "5c63d8b4da8d5346667fc42fa6452b265efa9642",
+   "67248dd612219633456e2e091aa0fbd7cc72023c",
    "testharness"
   ],
   "css/css-backgrounds/parsing/border-color-valid.html": [
-   "6ee147c770c5e4dffefe246abaa90a574a0bd626",
+   "c69f9622811f8d06758dadbdb313e4ab0be260a7",
    "testharness"
   ],
   "css/css-backgrounds/parsing/border-image-invalid.html": [
-   "762be9a9d53ea42d92f66871316dac6fe3f892cf",
+   "87194a5477d3fa285bdc3e340659e43285107c76",
    "testharness"
   ],
   "css/css-backgrounds/parsing/border-image-outset-invalid.html": [
-   "ffe095911474934e8c7de9f93998dde5a3a4c7e4",
+   "5e76198141c8baef70367e6d8713629e35fe6440",
    "testharness"
   ],
   "css/css-backgrounds/parsing/border-image-outset-valid.html": [
-   "dc189372600a6e82aba3934df4be8889b6e570fd",
+   "5ead2608d2577fe37e0a6b04513e4619ea659515",
    "testharness"
   ],
   "css/css-backgrounds/parsing/border-image-repeat-invalid.html": [
-   "b17b531dd2906dafd01d3e661875c9fa29671aac",
+   "0a70aab2412982045a41905b45dc0d44f6cf64f6",
    "testharness"
   ],
   "css/css-backgrounds/parsing/border-image-repeat-valid.html": [
-   "6e13dc8581478427cc46dbec22d1c1ed3de329df",
+   "e77ae48fd192d4b35374d47376083f80fed48619",
    "testharness"
   ],
   "css/css-backgrounds/parsing/border-image-slice-invalid.html": [
-   "7bdb67f67b454ad597042c8c1b8f86119f44c617",
+   "b2f55f14fbe64cec31a40943b2559ef1cc164159",
    "testharness"
   ],
   "css/css-backgrounds/parsing/border-image-slice-valid.html": [
-   "257f276f739f06da08e11cb3ae490fe9b6fb53c6",
+   "66d747f7cd99f0b14a0ccd8fa9c9190aebcb9753",
    "testharness"
   ],
   "css/css-backgrounds/parsing/border-image-source-invalid.html": [
-   "99a06ce16fab2d57f815372188423e6c98c6be50",
+   "78d042ded419e744ff6b4e28e33501f3439f5e14",
    "testharness"
   ],
   "css/css-backgrounds/parsing/border-image-source-valid.html": [
-   "e12cb92716f45ec57fb00f8cfa4bbb4af1fed84e",
+   "c032dcda878b9606ccbca1971b9bd369f82c859d",
    "testharness"
   ],
   "css/css-backgrounds/parsing/border-image-valid.html": [
-   "79bff459ed8334d9e70e73cda636c882003c3f2e",
+   "880dc87700b66e742f3b07a5683c31aa6510b4cb",
    "testharness"
   ],
   "css/css-backgrounds/parsing/border-image-width-invalid.html": [
-   "f85e947e8c6a4276fdcabf33ea0c71b796509fe1",
+   "c7fba1c2ce32a94c7fe777ffdece604403721128",
    "testharness"
   ],
   "css/css-backgrounds/parsing/border-image-width-valid.html": [
-   "503f23742c303b091ab59d3c21095f22bdbb33aa",
+   "5917c7f6b9d16dbd557a3ac50ce3b5e186265cba",
    "testharness"
   ],
   "css/css-backgrounds/parsing/border-invalid.html": [
-   "f59f2493f779a5efee3e72345e4cad97941e9a51",
+   "baaa66c37da811c5efc5cae2d7e2018561443e04",
    "testharness"
   ],
   "css/css-backgrounds/parsing/border-radius-invalid.html": [
-   "a8afbbe99876688d4dc90e81daab665d414966e1",
+   "28460aa598d019bcfd4057e5ee61e1699ea6943d",
    "testharness"
   ],
   "css/css-backgrounds/parsing/border-radius-valid.html": [
-   "cd6fa491c24c5175b4588c9975c800d668ea3eb0",
+   "96cdf2019da1f3fae94fe37566178f1aa9841942",
    "testharness"
   ],
   "css/css-backgrounds/parsing/border-style-invalid.html": [
-   "47e5422458e66256821632dc99d049939c8cf0a4",
+   "ecc9d6b43a6d3c047a994009baae82b7b8dbc628",
    "testharness"
   ],
   "css/css-backgrounds/parsing/border-style-valid.html": [
-   "077985435b22521a8c08c70e92d85d424485a01c",
+   "dc8311b1243abab6d23401dd606b51902a094239",
    "testharness"
   ],
   "css/css-backgrounds/parsing/border-valid.html": [
-   "5f29f6b872ca030016dde67fc209b2bf6c82e0ae",
+   "e94938a3a487b05ff5c3eb56b5697e850afdea03",
    "testharness"
   ],
   "css/css-backgrounds/parsing/border-width-invalid.html": [
-   "ff908373212c185602cdf9400e1638fb9b92e526",
+   "85a3414d8132c3c5573201250146f857a898ca81",
    "testharness"
   ],
   "css/css-backgrounds/parsing/border-width-valid.html": [
-   "b98a2082e6ec765168c6308a0117c43624e0d789",
+   "00dc1c0fcff86382486e88e0383ae54d6597e93e",
    "testharness"
   ],
   "css/css-backgrounds/parsing/box-shadow-invalid.html": [
-   "fa007373f4452dcf008e16fa30247cbf4365f051",
+   "1bcfc694d4c31056aee1af81bfc049f91dae5d92",
    "testharness"
   ],
   "css/css-backgrounds/parsing/box-shadow-valid.html": [
-   "4ea289b786a78091a1e97f0a70eea90ed9cd24a1",
-   "testharness"
-  ],
-  "css/css-backgrounds/parsing/resources/parsing-testcommon.js": [
-   "b075882f89aae49b419220b234534241cde5fd42",
-   "support"
+   "29bb263bb0dda17f58c11322e353f9975077755d",
+   "testharness"
   ],
   "css/css-backgrounds/reference/60x60-green-background.html": [
    "d19ed4ea2678a45bbe53838d6eebf61ab641bcdd",
    "support"
   ],
   "css/css-backgrounds/reference/background-334-ref.xht": [
    "2b568109db28719bc2973d350874f0685a630185",
    "support"
@@ -517745,16 +518192,20 @@
   "css/css-backgrounds/support/orange_color.png": [
    "329491802f2fccfa565491fc316e0f06e0a849e3",
    "support"
   ],
   "css/css-backgrounds/support/outline-5px-10px-15px-20px-green.png": [
    "2ca46e53f3c3db20d4cd14d7284f9ba1c658bed9",
    "support"
   ],
+  "css/css-backgrounds/support/parsing-testcommon.js": [
+   "b075882f89aae49b419220b234534241cde5fd42",
+   "support"
+  ],
   "css/css-backgrounds/support/pattern-grg-rgr-grg.png": [
    "6fcfeb4883edea810f880fabb861e09df7871695",
    "support"
   ],
   "css/css-backgrounds/support/pattern-grg-rrg-rgg.png": [
    "fcf4f3fd7d95431b8cd1bc5f5129fcb724c5e40f",
    "support"
   ],
@@ -517930,114 +518381,114 @@
    "6950d17f27c50d1b54cefe1bc4342af74108955e",
    "reftest"
   ],
   "css/css-box/META.yml": [
    "dde409360faf79a301c3ae3ea34a995d154d7bb4",
    "support"
   ],
   "css/css-box/parsing/clear-invalid.html": [
-   "6c2980cc23e62061b372ec36ca046f2cbd6d0c74",
+   "a91e61f97e216b409a3e337b0546c40c8a4df9ce",
    "testharness"
   ],
   "css/css-box/parsing/clear-valid.html": [
-   "59b68f1923b2a5af459c1e99ec7c7e8652b11ac6",
+   "db0b5aa094de27aedf2f6d7713125cce01eb2a82",
    "testharness"
   ],
   "css/css-box/parsing/float-invalid.html": [
-   "f20183f0527a719fde7f6d87f10eeaa56b153675",
+   "0ff53be36ac8864603c70479f4e7e50810ad7606",
    "testharness"
   ],
   "css/css-box/parsing/float-valid.html": [
-   "be91602a4a22fc7d8348469c08a6c9d9471ee47c",
+   "aecbd99d2201a0774d6ca407168606eb4f81c5a5",
    "testharness"
   ],
   "css/css-box/parsing/height-invalid.html": [
-   "120cce6fcfa3ca7b1bdc51e415afc67f3ab99039",
+   "acc595f063a23e9eee11262494dacc93ba4bc97d",
    "testharness"
   ],
   "css/css-box/parsing/height-valid.html": [
-   "9b3df67c11dcb8b43f093d7c6d362b52927f8a7a",
+   "38f76ea24abb0bfad60743ba7597020b274a0d7f",
    "testharness"
   ],
   "css/css-box/parsing/margin-invalid.html": [
-   "d28c4823b6ce7e4c003fdb26620737b92a7d5a4b",
+   "9c21749c8cc831140d264b318a1a712df100df0b",
    "testharness"
   ],
   "css/css-box/parsing/margin-valid.html": [
-   "9986222e263fbf3684278a3b8c415fdef8d3c9be",
+   "fc14af256281e5f152fc4c3d5432bef8d7c4881f",
    "testharness"
   ],
   "css/css-box/parsing/max-height-invalid.html": [
-   "9f37619f334b9cf0259b09692a30fe468cb73a6c",
+   "9b8e72dd86957e7e3055f1570de7212125959ea6",
    "testharness"
   ],
   "css/css-box/parsing/max-height-valid.html": [
-   "846eb1da92b671a08df6c4e7c6966bbeb471f554",
+   "35ad18ab2666e3cb057bfc66f4bf41f0ac79625e",
    "testharness"
   ],
   "css/css-box/parsing/max-width-invalid.html": [
-   "32f51ef452962224e04fa3c8c6bf6cf50c7b609b",
+   "487d15e6ec614a84a96db8531e5fbd8eab137e27",
    "testharness"
   ],
   "css/css-box/parsing/max-width-valid.html": [
-   "73e175918f80b49b4f87efb19c2066c2d2c2bc18",
+   "95b2ae9f55432b2a03be9cb2810fb2a4eb1e5b77",
    "testharness"
   ],
   "css/css-box/parsing/min-height-invalid.html": [
-   "846d18883627d53636e2f4a8c233a26c324c8ae9",
+   "a35ac3f8d05342a29a051aa80d3dbf87ed56c4cd",
    "testharness"
   ],
   "css/css-box/parsing/min-height-valid.html": [
-   "728667015e0dc229190d278833e9c564f98c07b9",
+   "1a2b838dcbc7732dc6120a33c5823f3b845566af",
    "testharness"
   ],
   "css/css-box/parsing/min-width-invalid.html": [
-   "e6998b0001ce826050ba9e48433a4d6b59bf0237",
+   "2a290901ed8ac6deb4aed56510a94ba62bc7831e",
    "testharness"
   ],
   "css/css-box/parsing/min-width-valid.html": [
-   "5440b8793d7017a1eb4dbb28ba356c12831300d2",
+   "ebe9ee70e85fe35b7c9a1cd7407057eb5b53b285",
    "testharness"
   ],
   "css/css-box/parsing/overflow-invalid.html": [
-   "dd97b9823f74fb71b5e304bbb7d9ff191c14618c",
+   "da09e64e69ea07963d7f1c9fd1a5cc09c61b50ab",
    "testharness"
   ],
   "css/css-box/parsing/overflow-valid.html": [
-   "d4411c80367066a918a4c8bdd6bbb72178783fef",
+   "898d7607de99527b669e098348f1dd72aea44878",
    "testharness"
   ],
   "css/css-box/parsing/padding-invalid.html": [
-   "54bfc69cfe364ee7d277c42c8bc5f68ce84ab91c",
+   "7a83d75accad2fa4cf0527fd3d5b82b10a0deacf",
    "testharness"
   ],
   "css/css-box/parsing/padding-valid.html": [
-   "f3cda52a4a29913dc0d6c1d4b9f7fba0eb1fcc14",
-   "testharness"
-  ],
-  "css/css-box/parsing/resources/parsing-testcommon.js": [
-   "b075882f89aae49b419220b234534241cde5fd42",
-   "support"
+   "33522ba6dbb98bf63454dcc289958ade1473c8c0",
+   "testharness"
   ],
   "css/css-box/parsing/visibility-invalid.html": [
-   "39050694101fa266ca02c3dc3653aaafa85b04c3",
+   "07fe6ebe18acf36f4a7302cd08c0f1c36cd0b90f",
    "testharness"
   ],
   "css/css-box/parsing/visibility-valid.html": [
-   "fbff1f09812960c456a6ade636c2379160a9e6cf",
+   "de1cb9b0c11e9cbaa7beedd77c1dfc39fb6d0c6a",
    "testharness"
   ],
   "css/css-box/parsing/width-invalid.html": [
-   "f573ba2c5f457f452c6e751f1338770281c8282e",
+   "defd7d27912a0f1e4def24f4607ae6a598669b1d",
    "testharness"
   ],
   "css/css-box/parsing/width-valid.html": [
-   "7ae55ccb2d595e35cdfdeecec3fc5e376c32b123",
-   "testharness"
+   "f4be6b2b132232a3d415515c887636bbbb12465f",
+   "testharness"
+  ],
+  "css/css-box/support/parsing-testcommon.js": [
+   "b075882f89aae49b419220b234534241cde5fd42",
+   "support"
   ],
   "css/css-break/META.yml": [
    "bfd40518b4a6477632fa319f3e53fe22517d326d",
    "support"
   ],
   "css/css-break/break-before-always-001.xht": [
    "e2e7297d1532fba60d2074aa2701600dc7441742",
    "visual"
@@ -518082,35 +518533,35 @@
    "ffac42763f9f7221b78b6d685e49ce7854537b20",
    "support"
   ],
   "css/css-cascade/initial-color-background-001.html": [
    "15a1cf5a4f803d7ec419fcc5910fb4183a6b0c05",
    "reftest"
   ],
   "css/css-cascade/parsing/all-invalid.html": [
-   "8b7c044a0341ad732640b7a827c9f24a9c1d4f5f",
+   "526f9fdf575736609b57a8a56f251223c8310c01",
    "testharness"
   ],
   "css/css-cascade/parsing/all-valid.html": [
-   "668a6c2424125c8d84de85ec6dee694e7cc4799f",
-   "testharness"
-  ],
-  "css/css-cascade/parsing/support/parsing-testcommon.js": [
-   "b075882f89aae49b419220b234534241cde5fd42",
-   "support"
+   "42baa25d016b5b719f32dc759dc0962ddf600624",
+   "testharness"
   ],
   "css/css-cascade/reference/ref-filled-green-100px-square.xht": [
    "05a13794482a94f6c10bd9d4c98704e63ef60331",
    "support"
   ],
   "css/css-cascade/revert-val-001.html": [
    "a346267c7bdb08b6b67ca68c6e821ea71ab1eefa",
    "reftest"
   ],
+  "css/css-cascade/support/parsing-testcommon.js": [
+   "b075882f89aae49b419220b234534241cde5fd42",
+   "support"
+  ],
   "css/css-cascade/unset-val-001.html": [
    "c25b980a3b5734df4782ee5b6feb32d845f19e6d",
    "reftest"
   ],
   "css/css-cascade/unset-val-002.html": [
    "e68417ff041e5a651e9b005938c8d5d804a81d66",
    "reftest"
   ],
@@ -518350,34 +518801,30 @@
    "4646bc9a32433389b7014ce766345354fcbb7c8d",
    "reftest"
   ],
   "css/css-color/named-001.html": [
    "61a98dcb7bb02fab3db18ed337eee5ddb07724fc",
    "reftest"
   ],
   "css/css-color/parsing/color-invalid.html": [
-   "978eb895a2a519d0eb8d43e3e077023ec2ecb999",
+   "ec59e0fb8be770bc013c19c3746a434a83fa103d",
    "testharness"
   ],
   "css/css-color/parsing/color-valid.html": [
-   "e94eb38f6955ab006325dd864ec64cbd0f9b7cde",
+   "ee5948efec207fd2d473097f6223f9c344628b9f",
    "testharness"
   ],
   "css/css-color/parsing/opacity-invalid.html": [
-   "955903ff354c73e0fffa5964132c47934e289125",
+   "7e64036eb7a1de16feb785c2490a4c13f3469689",
    "testharness"
   ],
   "css/css-color/parsing/opacity-valid.html": [
-   "738c3d077061c04212d384ae7ecffd1c62b8965d",
-   "testharness"
-  ],
-  "css/css-color/parsing/resources/parsing-testcommon.js": [
-   "b075882f89aae49b419220b234534241cde5fd42",
-   "support"
+   "bf22b092ca09b1a48eddd47b5c19b92801d2c1e8",
+   "testharness"
   ],
   "css/css-color/rebeccapurple-ref.html": [
    "8c15364f38e53cc1651f2f6c115c7b2fca3f4ba9",
    "support"
   ],
   "css/css-color/rgb-001.html": [
    "30603faa9c5b70956d97139d7bb86cc9cb2fd9e3",
    "reftest"
@@ -518441,16 +518888,20 @@
   "css/css-color/rgba-007.html": [
    "5b316a2a369cf7e2cae0e0eb593473cf7527267e",
    "reftest"
   ],
   "css/css-color/rgba-008.html": [
    "65eab55794c39e47d6afb5b71e5fea4b9b671b37",
    "reftest"
   ],
+  "css/css-color/support/parsing-testcommon.js": [
+   "b075882f89aae49b419220b234534241cde5fd42",
+   "support"
+  ],
   "css/css-color/t31-color-currentColor-b-ref.html": [
    "3013c7050c3c6f057e295923d43c87da6c09751f",
    "support"
   ],
   "css/css-color/t31-color-currentColor-b.xht": [
    "785a6f6dea657a0d637e952359074dffafbc8569",
    "reftest"
   ],
@@ -519338,17 +519789,17 @@
    "e4a0b28457c752232f4314175ffdf1840f7e336a",
    "reftest"
   ],
   "css/css-contain/contain-paint-048.html": [
    "e48fcb64a4acbb8683730c58577ba530487a5ad9",
    "reftest"
   ],
   "css/css-contain/contain-paint-cell-001.html": [
-   "964f33a21969d954ffb44fb85b7eda70ceefc554",
+   "d66a16944ecadca57a585a4514024b198c19478f",
    "reftest"
   ],
   "css/css-contain/contain-paint-cell-002.html": [
    "e486aa2c576a4412ba0ac553dc074f6151ec217b",
    "reftest"
   ],
   "css/css-contain/contain-paint-clip-011.html": [
    "643133a4f42f09dd587639b3b57e0bc8682380a8",
@@ -519394,61 +519845,61 @@
    "5af0d54cec3af30d3377d43e0738f518c9e42d40",
    "reftest"
   ],
   "css/css-contain/contain-paint-size-003.html": [
    "51459a53feb6b626b7e9dc07061024eca722209b",
    "reftest"
   ],
   "css/css-contain/contain-size-001.html": [
-   "85bc4f49de1d1d8c58a3677286acfa9a5242512e",
+   "49dfc41601eb32f80c76a427403beb2f98d3f404",
    "reftest"
   ],
   "css/css-contain/contain-size-002.html": [
-   "bfc6401cfb162929aeff149e3c4476950225dd6d",
+   "b30b02482da592925b6f4aa278ec82d6b30fe36f",
    "reftest"
   ],
   "css/css-contain/contain-size-003.html": [
-   "1bce52c46a92dd0352209531a5cd697e1c7205f7",
+   "95596c96910dcfb5fa2d5b5c4261ab910019929c",
    "reftest"
   ],
   "css/css-contain/contain-size-004.html": [
    "58277ce1bf67aca59385a0087c1c03ae81b5f4ce",
    "reftest"
   ],
   "css/css-contain/contain-size-005.html": [
    "139f8a97bea0aae6ab718764a24b35fa0acca6db",
    "reftest"
   ],
   "css/css-contain/contain-size-006.html": [
-   "f5c17152d98069f75d136cd526bcdd955e70983a",
+   "f5a5faa49d3090ad2c088ac609e325a86d3d906e",
    "reftest"
   ],
   "css/css-contain/contain-size-007.html": [
-   "71e61aff4d13c86c94a8162e18ce9e005351dcee",
+   "4d4bce8e9264f6f4a9d390a7e43d05169dd00192",
    "reftest"
   ],
   "css/css-contain/contain-size-008.html": [
-   "fb7b5258a5ad9f44052e9711c9c030fc46cb451d",
+   "63deea8199fc13fd8c81021a0275b5127ed31e77",
    "reftest"
   ],
   "css/css-contain/contain-size-009.html": [
-   "4b080c4ad5ee168ebe3680d798f3369dfc916274",
+   "a285d5e2b38e5b4e5aa7cf924f859a9f782aed53",
    "reftest"
   ],
   "css/css-contain/contain-size-010.html": [
-   "59fdb8b63fd3dbea5d6e285d0d3445077e815c41",
+   "0061894ce0307c8a66ff39667fb39b7c8836d09b",
    "reftest"
   ],
   "css/css-contain/contain-size-011.html": [
    "f2a146938ecf1e59a82a41470db5a836b08b88e5",
    "reftest"
   ],
   "css/css-contain/contain-size-012.html": [
-   "6823292fdf85f8fa96c22d82ab060d0e97eb37bb",
+   "b80e605a32b50c51e75e6ea0eab386377ca94e37",
    "reftest"
   ],
   "css/css-contain/contain-size-013.html": [
    "4d1cbc403bd48b21f8d657d4adc7a50bffbb618c",
    "reftest"
   ],
   "css/css-contain/contain-size-021.html": [
    "14bd8119a0e4bd0bc98ffacc87628616d0891a4a",
@@ -519554,21 +520005,21 @@
    "30a29d7c25a1fe30df7bcc52691cb2fc2070d20e",
    "reftest"
   ],
   "css/css-contain/contain-style-counters-002.html": [
    "eeaac6ace6940b691af0aadac1be53258b057f3c",
    "reftest"
   ],
   "css/css-contain/contain-style-counters-003.html": [
-   "d99f139c500eaa273b0137d5b3fd9a0a472c414b",
+   "b550f1135aa5f4d1bec8d4636135a529f133edd4",
    "reftest"
   ],
   "css/css-contain/contain-style-counters-004.html": [
-   "1e751d1552040a99bb121fb645d2b4e388891411",
+   "e0e0528918abe7d3d696c8b077a58f310ad1a810",
    "reftest"
   ],
   "css/css-contain/contain-style-counters-ref.html": [
    "feef9209f5c19f51233a2025108b66c63b58f34c",
    "support"
   ],
   "css/css-contain/counter-scoping-001.html": [
    "f7d40dc5a0850919f1b86ca31e9ebd44ec96b72d",
@@ -519578,29 +520029,29 @@
    "0af148cd5e6e2eb38b2816736f3d442967fc24d4",
    "reftest"
   ],
   "css/css-contain/counter-scoping-003.html": [
    "c4a004ff18cad24b0f709fcb6b707d7a79e5572a",
    "reftest"
   ],
   "css/css-contain/quote-scoping-001.html": [
-   "b440fdcd8ddea96089f418ea0f7e3bc64ae3acf0",
+   "8c38e45b1ace138cbb795c77fdece555967e043d",
    "reftest"
   ],
   "css/css-contain/quote-scoping-002.html": [
-   "d79ec2d7f3aeef3d17467c7d4a41879b15119dce",
+   "9477afdfb1cf3073695a521c28cb9643a66bf00d",
    "reftest"
   ],
   "css/css-contain/quote-scoping-003.html": [
-   "ee0420ee1a42ed47ef65eed8378b0aa0b91cd44c",
+   "2a909511c3451c98bcdd059d506279923e6ce709",
    "reftest"
   ],
   "css/css-contain/quote-scoping-004.html": [
-   "b31437003365b461dccbb554805c756c4b305f37",
+   "d86382be08532323baad174808181e338adbc932",
    "reftest"
   ],
   "css/css-contain/reference/contain-layout-breaks-002-ref.html": [
    "c68bee1d0aa4f9201fb6e48cc25199f373128ca8",
    "support"
   ],
   "css/css-contain/reference/contain-layout-cell-001-ref.html": [
    "093dd363392d37b0f67f8409c6acc0c06e00d7cd",
@@ -519666,17 +520117,17 @@
    "9aad8a490b4b740991c968a17f1c74571e758d36",
    "support"
   ],
   "css/css-contain/reference/contain-paint-size-003-ref.html": [
    "27820fae761614e745b58ac16fe0992c516698c8",
    "support"
   ],
   "css/css-contain/reference/contain-size-004-ref.html": [
-   "3048d55f11a058ed951dea5bf2f940d27045ffed",
+   "75ae2bcc2b2d8d019c979c86f2500f9a2ec6ab90",
    "support"
   ],
   "css/css-contain/reference/contain-size-005-ref.html": [
    "001fc900613b81f6ece82548b045a5af79dfadaf",
    "support"
   ],
   "css/css-contain/reference/contain-size-021-ref.html": [
    "de9cea10501b0014169e8260737f11e387270394",
@@ -519741,32 +520192,40 @@
   "css/css-contain/reference/counter-scoping-001-ref.html": [
    "2ebbb9a93c31d0c53b396f9a118951b85c16650c",
    "support"
   ],
   "css/css-contain/reference/counter-scoping-003-ref.html": [
    "49e7b85e878b78af41690bb815bb30a450820598",
    "support"
   ],
+  "css/css-contain/reference/pass_if_pass_below_clipped.html": [
+   "044783d1e5488a612d46dca6397346619b539c7b",
+   "support"
+  ],
   "css/css-contain/reference/quote-scoping-001-ref.html": [
    "0b0e9c467ac9ee3da86d1f9be0eff98c1f937b0b",
    "support"
   ],
   "css/css-contain/reference/quote-scoping-002-ref.html": [
    "8b846e2a999b3d20f3729285084fc762f261e525",
    "support"
   ],
   "css/css-contain/reference/quote-scoping-003-ref.html": [
    "2bc8d6730e756b6f1569d619b0accf5ce15d4e39",
    "support"
   ],
   "css/css-contain/reference/ref-if-there-is-no-red.xht": [
    "a5b4e9f47a8e60ad0bede1ac81e02b3542c80f3b",
    "support"
   ],
+  "css/css-contain/support/60x60-red.png": [
+   "823f125b8e4a60f780f00443c9c9a10b9fa1f447",
+   "support"
+  ],
   "css/css-contain/support/blue-100x100.png": [
    "3b72d5ce53c07b68fe508bb57aa61a933dbda768",
    "support"
   ],
   "css/css-contain/support/blue50wBy23h.png": [
    "d20129cc215de774edbaf5ecebd302131a2dd971",
    "support"
   ],
@@ -535034,66 +535493,62 @@
    "bdfd96ea85592ddf9c8dbb8ef8d11afaef6d9ef7",
    "reftest"
   ],
   "css/css-images/linear-gradient-ref.html": [
    "6643bb918b5f79ce72d3f16ec999d675e04f59d3",
    "support"
   ],
   "css/css-images/parsing/gradient-position-invalid.html": [
-   "7a636481bebdaf23ca9bc058227a76156fae457c",
+   "f224263952666372d59d82a72d31cf8a6dd3450f",
    "testharness"
   ],
   "css/css-images/parsing/gradient-position-valid.html": [
-   "6eae484752c53b580d29575f69712c001baaaa90",
+   "04ca328da01babeaf249ba3dff4e312900af39ac",
    "testharness"
   ],
   "css/css-images/parsing/image-orientation-invalid.html": [
-   "c16c7bd91af151d6675bb7feb97d323c2de5fd11",
+   "a55e335e64f1caa83f97a2eaf5df979147d86586",
    "testharness"
   ],
   "css/css-images/parsing/image-orientation-valid.html": [
-   "d2d24baf608d21e52a10b1bbeb974c2f6cdfd96d",
+   "c1e2015b302d8614fadca491cf4da47d596094e5",
    "testharness"
   ],
   "css/css-images/parsing/image-rendering-invalid.html": [
-   "84b0727572e350d3d01d56ee0f878f2ef2ced579",
+   "1ce1a2327a6febadd1aaabb686174a70e90ab287",
    "testharness"
   ],
   "css/css-images/parsing/image-rendering-valid.html": [
-   "80ea1c446da37caa3320713059827d306378a0f3",
+   "1918a247313e9d39be7fdf5b4112271908fcd8cf",
    "testharness"
   ],
   "css/css-images/parsing/image-resolution-invalid.html": [
-   "332ad1543177a4719fe60ec779b0f909143e2cd6",
+   "d0998cc2b7f78f69649b8a2c1d665464fe979de3",
    "testharness"
   ],
   "css/css-images/parsing/image-resolution-valid.html": [
-   "9317902c82275c6404d0ce8b55a490b4a741ea7e",
+   "6ee676f429f842f4701c70a1296428ce0610a786",
    "testharness"
   ],
   "css/css-images/parsing/object-fit-invalid.html": [
-   "e4a298b91a352afda8dd6f0a5c9928a64608e0a8",
+   "26841d4be7eccaeb658776d8f0d67dddb9751406",
    "testharness"
   ],
   "css/css-images/parsing/object-fit-valid.html": [
-   "0f73cfe256c7d62a64d4c3c2e3ca981a4f5b4fa5",
+   "50ea7254b0bbd2f12f8ce73152ca15d263cb8bf5",
    "testharness"
   ],
   "css/css-images/parsing/object-position-invalid.html": [
-   "87de7b9231abc62323f1c53e3f4a951a95a64e22",
+   "d722f1a1af94818e047713d30d71f19def9eaeae",
    "testharness"
   ],
   "css/css-images/parsing/object-position-valid.html": [
-   "f78f67e6326cc216b800ad9a427f24ba7439597f",
-   "testharness"
-  ],
-  "css/css-images/parsing/resources/parsing-testcommon.js": [
-   "b075882f89aae49b419220b234534241cde5fd42",
-   "support"
+   "7121cc42021a1122a2b96d893469252fb5e4ce1b",
+   "testharness"
   ],
   "css/css-images/support/1x1-green.gif": [
    "e023d92c7ad04264d06196d47a5edd828a7f71db",
    "support"
   ],
   "css/css-images/support/1x1-green.png": [
    "b98ca0ba0a03c580ac339e4a3653539cfa8edc71",
    "support"
@@ -535161,16 +535616,20 @@
   "css/css-images/support/intrinsic-size.jpg": [
    "b634fd18212d650231ee581c7a0aa5816e3fd470",
    "support"
   ],
   "css/css-images/support/intrinsic-size.png": [
    "833e6e36cdf316be9e4f54dc68732712afe11ba2",
    "support"
   ],
+  "css/css-images/support/parsing-testcommon.js": [
+   "b075882f89aae49b419220b234534241cde5fd42",
+   "support"
+  ],
   "css/css-images/support/pattern-grg-rgr-grg.png": [
    "6fcfeb4883edea810f880fabb861e09df7871695",
    "support"
   ],
   "css/css-images/support/pattern-grg-rrg-rgg.png": [
    "fcf4f3fd7d95431b8cd1bc5f5129fcb724c5e40f",
    "support"
   ],
@@ -535861,16 +536320,20 @@
   "css/css-logical/animation-002.html": [
    "d4f199d50e48b3e239e395fd442da9d530652066",
    "testharness"
   ],
   "css/css-logical/animation-003.tentative.html": [
    "bcb4e15d80c4225603ff59b92ccfc56dfc90d877",
    "testharness"
   ],
+  "css/css-logical/animation-004.html": [
+   "48cb58a29e4183d8e80527795b0000fb2f821bf3",
+   "testharness"
+  ],
   "css/css-logical/cascading-001-ref.html": [
    "79a432c4557bbda081a9b1c8d0dd9602c0eb85e5",
    "support"
   ],
   "css/css-logical/cascading-001.html": [
    "653925552f870f740d3c9fc397b4dc2267994103",
    "reftest"
   ],
@@ -536746,40 +537209,40 @@
    "96ccc2c19c428ddf3717c641db07bce710bb6690",
    "support"
   ],
   "css/css-masking/idlharness.html": [
    "c415eaaa67a2bc9a4b621700049eb0c0b60ec0a3",
    "testharness"
   ],
   "css/css-masking/parsing/clip-invalid.html": [
-   "68b67c93131b3717ae2f90e18a52f423f351b94f",
+   "919396375a2947be03001e21af72c4f09fc4ddab",
    "testharness"
   ],
   "css/css-masking/parsing/clip-path-invalid.html": [
-   "3f5940a5f87f2dc3eebc95b6a5b8623c8453affe",
+   "881cbc08a64b6170a6ae7ce00ca3306cb51dada6",
    "testharness"
   ],
   "css/css-masking/parsing/clip-path-valid.html": [
-   "d7b2785907a5e2846098bfca6e10536c956f7aa6",
+   "fef14c97d5c529e2e54b19b263dc13340f44a17d",
    "testharness"
   ],
   "css/css-masking/parsing/clip-rule-invalid.html": [
-   "10f6aeef256c43b8f7de26db049ee6b21a57da75",
+   "50694703ce46efa41305abfcad060970df64334c",
    "testharness"
   ],
   "css/css-masking/parsing/clip-rule-valid.html": [
-   "db22680cb14583128c020045b528cfe38bbeff45",
+   "ca805e1fcecc3b6c4c4f42d3461b36f18c89c3e4",
    "testharness"
   ],
   "css/css-masking/parsing/clip-valid.html": [
-   "34a24ea305d9af405d517a60466d489a7a0e8e29",
-   "testharness"
-  ],
-  "css/css-masking/parsing/resources/parsing-testcommon.js": [
+   "95c31f7de06cf22f3d72f29f280278338d6e7536",
+   "testharness"
+  ],
+  "css/css-masking/support/parsing-testcommon.js": [
    "b075882f89aae49b419220b234534241cde5fd42",
    "support"
   ],
   "css/css-masking/test-mask-ref.html": [
    "938235acbd36309fb969c55f161239bcd5ab969e",
    "support"
   ],
   "css/css-masking/test-mask.html": [
@@ -541869,50 +542332,46 @@
   "css/css-shapes/META.yml": [
    "99136818e66dc50978bc0f7c25a2129556e72f21",
    "support"
   ],
   "css/css-shapes/basic-shape-circle-ellipse-serialization.html": [
    "5e4842d234f6af393a5ee04fa604a63f6db5cae1",
    "testharness"
   ],
-  "css/css-shapes/parsing/resources/parsing-testcommon.js": [
-   "b075882f89aae49b419220b234534241cde5fd42",
-   "support"
-  ],
   "css/css-shapes/parsing/shape-image-threshold-invalid.html": [
-   "e3871d869b4e561b8a98088fc149fbea661a3092",
+   "dcabbe6cce1dc627f28ffe55bef09dce0dfc7525",
    "testharness"
   ],
   "css/css-shapes/parsing/shape-image-threshold-valid.html": [
-   "5b77db8e507b6b3eeab2e71cafbe951c006f66ea",
+   "0a71e75ba0a2abba82efce5880c17d2f44c9f80b",
    "testharness"
   ],
   "css/css-shapes/parsing/shape-margin-invalid.html": [
-   "4f3b4f26fb747ffeb7944ccdfcf5d143abfccf95",
+   "ebb1938d422422142ef3caa9699d7a419dce0b0e",
    "testharness"
   ],
   "css/css-shapes/parsing/shape-margin-valid.html": [
-   "68634b6b97aa35b98e935f8505a44518c0c20a06",
+   "f36a8eb3249210538e1be6d1d30fa7a6d062cd2e",
    "testharness"
   ],
   "css/css-shapes/parsing/shape-outside-invalid-position.html": [
-   "7d2b64b328c3da8db6224f816cb26ebfbbd19f80",
+   "90023aeaf25f3f318b57e691f8ff31462948ebbb",
    "testharness"
   ],
   "css/css-shapes/parsing/shape-outside-invalid.html": [
-   "9f541cf2930b11a5a84c1dc8970cdeb23c49707b",
+   "a2a8923818e7500ee895c27c2ee3deae7c38daff",
    "testharness"
   ],
   "css/css-shapes/parsing/shape-outside-valid-position.html": [
-   "ca01b352b6360f9aadcdce35f41fe9658a5be094",
+   "225b0156ad77af4ea24a509faf26cbcdc9ea854e",
    "testharness"
   ],
   "css/css-shapes/parsing/shape-outside-valid.html": [
-   "ae0e0bfe29e8ef87d959be9d26806e197747a8bf",
+   "28f45353dcb316350c11bb304db93184a349944d",
    "testharness"
   ],
   "css/css-shapes/shape-outside-invalid-001.html": [
    "c6c7400f7d177bde46ad1a35a6bd77f6ff27d71b",
    "testharness"
   ],
   "css/css-shapes/shape-outside-invalid-circle-000.html": [
    "317553bad7acee8624935e122f265828e90bb198",
@@ -543025,16 +543484,20 @@
   "css/css-shapes/support/c-red.css": [
    "d4ba5c64e95406f541e2f8cc19e192e9f521ed6b",
    "support"
   ],
   "css/css-shapes/support/cat.png": [
    "85dd7324815b8f8ef1a1d0496224c1a0661db9d8",
    "support"
   ],
+  "css/css-shapes/support/parsing-testcommon.js": [
+   "b075882f89aae49b419220b234534241cde5fd42",
+   "support"
+  ],
   "css/css-shapes/support/pattern-grg-rgr-grg.png": [
    "9b88fbd81149891234185f54f8b4a0431759f181",
    "support"
   ],
   "css/css-shapes/support/pattern-grg-rrg-rgg.png": [
    "fcf4f3fd7d95431b8cd1bc5f5129fcb724c5e40f",
    "support"
   ],
@@ -549570,73 +550033,69 @@
    "28389c71e6fc24aae1aff6dc1334e0d27ab45046",
    "reftest"
   ],
   "css/css-transforms/matrix/svg-matrix-069.html": [
    "6c368b3c1bd0a5d5afcd57a5da505178b4ba1a66",
    "reftest"
   ],
   "css/css-transforms/parsing/perspective-origin-parsing-invalid.html": [
-   "09f2f477c1660b03af723676373cfd23cd64a355",
+   "75350cc323633cdb4c8e63d2d35b336470764b92",
    "testharness"
   ],
   "css/css-transforms/parsing/perspective-origin-parsing-valid.html": [
-   "8421376002a9f7da547370fd690b6d533c8a1c27",
-   "testharness"
-  ],
-  "css/css-transforms/parsing/resources/parsing-testcommon.js": [
-   "b075882f89aae49b419220b234534241cde5fd42",
-   "support"
+   "b53a34a21d7b7eed791e7bce49c3260446c68e37",
+   "testharness"
   ],
   "css/css-transforms/parsing/rotate-parsing-invalid.html": [
-   "8326db38e68a789c2fa3e801f3386ea71e62cb58",
+   "63a74e24699631ce4e77947075d775640b29c722",
    "testharness"
   ],
   "css/css-transforms/parsing/rotate-parsing-valid.html": [
-   "b2e57495a874a20c59cc4c739199c9169e084c00",
+   "789ea00ac4bbdad73c6f7a17d2b5c75ba2cdd058",
    "testharness"
   ],
   "css/css-transforms/parsing/scale-parsing-invalid.html": [
-   "82b47cca0bcd499539024a324f3e1056451ffdeb",
+   "050171ca18c570b1c2f8c332a87e88ca29144e4d",
    "testharness"
   ],
   "css/css-transforms/parsing/scale-parsing-valid.html": [
-   "e058f06c25987b200da2f72b4e50691061ffac71",
+   "0d8783afc4d2b84749d4ae5eb98957a4e6fc7142",
    "testharness"
   ],
   "css/css-transforms/parsing/transform-box-invalid.html": [
-   "3af91965883df4d655ed099ea317b90a8480b9ab",
+   "23f7ddc463e707499891581d944af28424420e50",
    "testharness"
   ],
   "css/css-transforms/parsing/transform-box-valid.html": [
-   "742750b6677b08bf1101f3861d37f42818c20abd",
+   "a5d8af9537e39581d94ef6da3fc006cb2a2a2f52",
    "testharness"
   ],
   "css/css-transforms/parsing/transform-invalid.html": [
-   "dc81069c9e89a6715ee7d69669376db3cc5b3076",
+   "02c2b9570a7b0e5c927b2e68e7e91de4e2faba25",
    "testharness"
   ],
   "css/css-transforms/parsing/transform-origin-invalid.html": [
-   "dab56a0423192641e9815149d377232288942462",
+   "0adcc1f2803a0dd8c127c5e3ea3ff0535718c465",
    "testharness"
   ],
   "css/css-transforms/parsing/transform-origin-valid.html": [
-   "ab36024ef2bbb5ccc34efa3616c909ffb86c669f",
+   "52aa6ff9322615d1d1d35c824b544aaf7d0c16bf",
    "testharness"
   ],
   "css/css-transforms/parsing/transform-valid.html": [
-   "9a5b9c0696ec4f7daaff06edb058e4cec74c3373",
+   "f9efaa1f71051d497b616194b1cd98d6661503be",
    "testharness"
   ],
   "css/css-transforms/parsing/translate-parsing-invalid.html": [
-   "d8de1f7540379e9c82d6806511dfbee15f055140",
+   "e602d91bb1324fb86c1ef57fafa6a2a2085139e7",
    "testharness"
   ],
   "css/css-transforms/parsing/translate-parsing-valid.html": [
-   "b117d27ce4fe7119cf14117c8778f8f801234173",
+   "ab4f27f1019408c681e3be36b855a16d8acc8eaf",
    "testharness"
   ],
   "css/css-transforms/patternTransform/reference/svg-patternTransform-combination-ref.html": [
    "1b74821500862a790b1aec5b15d135ea2eb7e35b",
    "support"
   ],
   "css/css-transforms/patternTransform/reference/svg-patternTransform-ex-unit-ref.html": [
    "961e508b3b52615bc14ba7ffc4daf7b7cd65fd36",
@@ -550889,16 +551348,20 @@
   "css/css-transforms/support/import-green.css": [
    "537104e663364492c6ef388e4afce190e9c5bc58",
    "support"
   ],
   "css/css-transforms/support/import-red.css": [
    "9945ef47114c2841a746c99a2fb1e93e050aac8b",
    "support"
   ],
+  "css/css-transforms/support/parsing-testcommon.js": [
+   "b075882f89aae49b419220b234534241cde5fd42",
+   "support"
+  ],
   "css/css-transforms/support/pattern-grg-rgr-grg.png": [
    "9b88fbd81149891234185f54f8b4a0431759f181",
    "support"
   ],
   "css/css-transforms/support/pattern-grg-rrg-rgg.png": [
    "fcf4f3fd7d95431b8cd1bc5f5129fcb724c5e40f",
    "support"
   ],
@@ -556866,105 +557329,101 @@
    "ea03a3e543270c933f7f34dc0ee8c0ecfb97243b",
    "reftest"
   ],
   "css/css-ui/outline-style-014.html": [
    "b6ac104c9daaafd94ab057d4f0700f1250bc3f75",
    "reftest"
   ],
   "css/css-ui/parsing/box-sizing-invalid.html": [
-   "4ced38240f29163814f1d57a9923af8962d06c06",
+   "0b6ee8578abd97a69a5129997f16c21d108720e6",
    "testharness"
   ],
   "css/css-ui/parsing/box-sizing-valid.html": [
-   "fb60ac23bb8d2a509d1bdede4069cb09a52ae415",
+   "68010ffe34e1db1047b689a6224109905ba9fe55",
    "testharness"
   ],
   "css/css-ui/parsing/caret-color-invalid.html": [
-   "b4c9cb71e038b81ed2dfa582cb579395ae060aa0",
+   "a980b0e25b5a8863c3363fa912ada8e89d9803fd",
    "testharness"
   ],
   "css/css-ui/parsing/caret-color-valid.html": [
-   "41cc70654dade5dccfab56b0c1b18c8dba50344a",
+   "31e1b6c5ec5b909c25eb44c43080a533438af84a",
    "testharness"
   ],
   "css/css-ui/parsing/cursor-invalid.html": [
-   "dda8031d3090699885bbe896ad77158046b87bcd",
+   "1866b45c0aef1a1e42d476726bed9ae6aff6d547",
    "testharness"
   ],
   "css/css-ui/parsing/cursor-valid.html": [
-   "e33b82e2ddc54455f7da26728e457b1821dec2ea",
+   "b16a6fe2e8726b64dd7fc7d823fdc109c4815a51",
    "testharness"
   ],
   "css/css-ui/parsing/outline-color-invalid.html": [
-   "195f55dc72bd3a943f457f700677484e94fc5ba1",
+   "b554c1ac61196a5ef8a19c68700591db68f4ee28",
    "testharness"
   ],
   "css/css-ui/parsing/outline-color-valid-mandatory.html": [
-   "fbe730bdae37d0148d767d8745589e363f98938d",
+   "92f1b047d7247869a7b1a759fd4bcd1b5e5d969d",
    "testharness"
   ],
   "css/css-ui/parsing/outline-color-valid-optional.html": [
-   "bf12b87f2193bcd11e4a382ffb94073300b47eaf",
+   "9b82aeb5cd94828ad4d6a79d5969c9818565ce8d",
    "testharness"
   ],
   "css/css-ui/parsing/outline-invalid.html": [
-   "c56a579452fb78daf9f48bd45cd996a1f2697b25",
+   "f9aa61b89ec6e1495805a97e625a629ea0a6066c",
    "testharness"
   ],
   "css/css-ui/parsing/outline-offset-invalid.html": [
-   "1ee9477a1118f7f262d7e7b1c29f2978c8b80092",
+   "1106e86d4bfe2b5b6c12add4d7aa009f39d0d7b7",
    "testharness"
   ],
   "css/css-ui/parsing/outline-offset-valid.html": [
-   "c5e023b8e9607dd38bd0bd33cd52244e25a9b0fb",
+   "c0b8891d97bba361417fc10dcf2e85d09b32287a",
    "testharness"
   ],
   "css/css-ui/parsing/outline-style-invalid.html": [
-   "2340c62d90299a636abbaf9973ed08e55c9d9d66",
+   "b93a98407aa3079a552d5fe8576826052fa7322b",
    "testharness"
   ],
   "css/css-ui/parsing/outline-style-valid.html": [
-   "5adcfda7ec75dadb3b87475cd6e0009c8aaa94ff",
+   "93d14a46764bd6f42c3f8fa44105d3c176787e4b",
    "testharness"
   ],
   "css/css-ui/parsing/outline-valid-mandatory.html": [
-   "a296c989bce262b620a8acc028cfa79d513a8acb",
+   "f8322a459347cf139780897fe8ed168c6ba0a9fc",
    "testharness"
   ],
   "css/css-ui/parsing/outline-valid-optional.html": [
-   "e179406cafb53cefc35fdc69b46b0530233dafc2",
+   "44cf823ba4c74e6a96cf253d8d87744c6a07c7e8",
    "testharness"
   ],
   "css/css-ui/parsing/outline-width-invalid.html": [
-   "07012fef225859ae8f4194f19795c24363685108",
+   "40e4961a0025d5a94ba2cba0c15e22df4743549e",
    "testharness"
   ],
   "css/css-ui/parsing/outline-width-valid.html": [
-   "050371246ce4006b922e1ab2d69255d1cf454d5d",
+   "db6c77c8645ba890d4bc059d014c9b3e86a2fb55",
    "testharness"
   ],
   "css/css-ui/parsing/resize-invalid.html": [
-   "a56a1dbc6e24e851e9055513c7ebe86e1c847760",
+   "b166c01395c10aad1dcad6f2697fa226a84903dc",
    "testharness"
   ],
   "css/css-ui/parsing/resize-valid.html": [
-   "025b0e447bb66d8daf828dccf009fcc039fa0b53",
-   "testharness"
-  ],
-  "css/css-ui/parsing/support/parsing-testcommon.js": [
-   "b075882f89aae49b419220b234534241cde5fd42",
-   "support"
+   "3acc9b09e6f18740d013837f47e3fbf9c74a1dc3",
+   "testharness"
   ],
   "css/css-ui/parsing/text-overflow-invalid.html": [
-   "f3945a162ec4c67fdf36753a270b3c2e350726a4",
+   "22affb7cafa0f6c60f04f7805c6e54be83eb7318",
    "testharness"
   ],
   "css/css-ui/parsing/text-overflow-valid.html": [
-   "3f0aaa60938ff98e8d0f10d201d6e05d79d2771d",
+   "bc2a4fd87402d614d3b9b96cab998cb7269d1028",
    "testharness"
   ],
   "css/css-ui/reference/box-sizing-001-ref.html": [
    "0207bc06beb00b241d59773f41ed0a8f1ee4f107",
    "support"
   ],
   "css/css-ui/reference/box-sizing-007-ref.html": [
    "71a3649a1a2536f974ec1deaeed5c689e8debfbe",
@@ -558069,16 +558528,20 @@
   "css/css-ui/support/orange.png": [
    "0a08d3ae5d025acaaaf7ed6e32fc5b1aee0dd627",
    "support"
   ],
   "css/css-ui/support/orange.svg": [
    "56346a8295ba14f002eee4e35cd864e1829ae840",
    "support"
   ],
+  "css/css-ui/support/parsing-testcommon.js": [
+   "b075882f89aae49b419220b234534241cde5fd42",
+   "support"
+  ],
   "css/css-ui/support/r1-1.svg": [
    "84f1b9532b5f55ee48c6502ec00470b7b2d93431",
    "support"
   ],
   "css/css-ui/support/red.ico": [
    "22a7b36fe3ec2c05c348ba7b45c9fb764ef2def5",
    "support"
   ],
@@ -562314,57 +562777,53 @@
    "30d045d1d1568c64cf21efeebc9f40f0b02d8309",
    "manual"
   ],
   "css/css-writing-modes/page-flow-direction-srl-004.xht": [
    "d1d1aa65b570e6160fa27fb935a01d178a7bb363",
    "manual"
   ],
   "css/css-writing-modes/parsing/direction-invalid.html": [
-   "a587b9fb0e0f2de52e2bc8cdc3e0ea8d9709b8c3",
+   "0927ca388b7cc7a0e37149f1c8a23b15d0d44444",
    "testharness"
   ],
   "css/css-writing-modes/parsing/direction-valid.html": [
-   "436226a9187a387cbc3aeb1d7388c8bc2bc72841",
-   "testharness"
-  ],
-  "css/css-writing-modes/parsing/resources/parsing-testcommon.js": [
-   "b075882f89aae49b419220b234534241cde5fd42",
-   "support"
+   "ca4d7bb9df9e48606b92f0bb7a515488ad73a18c",
+   "testharness"
   ],
   "css/css-writing-modes/parsing/text-combine-upright-invalid.html": [
-   "8807997de8bb606f7e744e9834ee42111bb6face",
+   "08cbb967bb81f19bfdf7d2f8e71daaceae364cb1",
    "testharness"
   ],
   "css/css-writing-modes/parsing/text-combine-upright-valid.html": [
-   "f599f12bf170de49aabe221e2638324ef3479c8e",
+   "bd56fb5c4935cf9db038a64b652e3ce81a0d4b01",
    "testharness"
   ],
   "css/css-writing-modes/parsing/text-orientation-invalid.html": [
-   "4461dbeea2fb9652ef0743fb176e8a095b837a2c",
+   "118764d6c5f346600cd416ff08a2971e7009b05c",
    "testharness"
   ],
   "css/css-writing-modes/parsing/text-orientation-valid.html": [
-   "f6304fd4d8af079be5d9a00d15e4d31f002accce",
+   "2f2b6625505a1e2e613297a0fac3d185bf75c94b",
    "testharness"
   ],
   "css/css-writing-modes/parsing/unicode-bidi-invalid.html": [
-   "10907cbe931783a8fcd9ee8b4c293b680944dc42",
+   "de7cb6d20f71086b573a809762735ad35796f5b0",
    "testharness"
   ],
   "css/css-writing-modes/parsing/unicode-bidi-valid.html": [
-   "49c42345a36102baf32345a7f02ddafed70b0121",
+   "97a3d59c9acf77a263627bf2199a77fa517a3026",
    "testharness"
   ],
   "css/css-writing-modes/parsing/writing-mode-invalid.html": [
-   "7b36e47cc56027b23e2449f56cc37ab42c6e2dfc",
+   "6a512a71834a36961bcf3022ed76904cfc6be124",
    "testharness"
   ],
   "css/css-writing-modes/parsing/writing-mode-valid.html": [
-   "4264e3840dbe99b752d7c085ebab5476930eed42",
+   "4fd856ae9dde5128b0a8ea8740a7123697ea41d3",
    "testharness"
   ],
   "css/css-writing-modes/percent-margin-vlr-003.xht": [
    "fdc8661fe69736825906830a8675466c11f4c5e3",
    "reftest"
   ],
   "css/css-writing-modes/percent-margin-vlr-005.xht": [
    "afa40b9de6f3af4878c9b5c3435d4308b88198f2",
@@ -564217,16 +564676,20 @@
   "css/css-writing-modes/support/page-flow-direction-002p3.png": [
    "d7c58d622437186dd21070c74d6de4c73edb3fbf",
    "support"
   ],
   "css/css-writing-modes/support/page-flow-direction-002p4.png": [
    "04dc0fe2e9e838e592f8da044555f1a379ab641f",
    "support"
   ],
+  "css/css-writing-modes/support/parsing-testcommon.js": [
+   "b075882f89aae49b419220b234534241cde5fd42",
+   "support"
+  ],
   "css/css-writing-modes/support/pass-cdts-abs-pos-non-replaced.png": [
    "15fd6065ef670fcab7e0b662285c19bdd881da1d",
    "support"
   ],
   "css/css-writing-modes/support/pass-cdts-bg-pos-vrl-002.png": [
    "a0db6909418d2046f55290052262fe421bad6709",
    "support"
   ],
@@ -566874,42 +567337,38 @@
    "9ecef28aa54d133dfaea55551dbed91305cf9d0e",
    "reftest"
   ],
   "css/filter-effects/interfaces.any.js": [
    "e7de16e8d62904986610a484b046a4caf0f161e3",
    "testharness"
   ],
   "css/filter-effects/parsing/color-interpolation-filters-parsing-invalid.html": [
-   "3aca3734eaad689f0bde34e3ce3004bd2c16a3ca",
+   "d07f195d62631a3896e892e40033d84b30e20a97",
    "testharness"
   ],
   "css/filter-effects/parsing/color-interpolation-filters-parsing-valid.html": [
-   "d2e89a3625853fecdb86618afaad9d3354f34ed2",
+   "68313d8db7f444a611075c0b1188a131fde54cd1",
    "testharness"
   ],
   "css/filter-effects/parsing/filter-parsing-invalid.html": [
-   "30ebf6764f56e156d41047a9ba99d504ed05ff34",
+   "f89f45628ce8a2e5c755204b1a73ff32751588d2",
    "testharness"
   ],
   "css/filter-effects/parsing/filter-parsing-valid.html": [
-   "773b1101138c6764ca39d63c622ec4f2f42d7ded",
+   "3de19c023cf8c75ee87899393819b77b03060d3b",
    "testharness"
   ],
   "css/filter-effects/parsing/lighting-color-parsing-invalid.html": [
-   "b74888ee9f8b19d0420a277066b76e13e9ed5a43",
+   "0711cdd4cf33e4644f73ca352fa0fd9682dd19d7",
    "testharness"
   ],
   "css/filter-effects/parsing/lighting-color-parsing-valid.html": [
-   "1a3202536ce255802e4885a0368e4e327386e5a6",
-   "testharness"
-  ],
-  "css/filter-effects/parsing/resources/parsing-testcommon.js": [
-   "b075882f89aae49b419220b234534241cde5fd42",
-   "support"
+   "495ddc5f8f6e8ff8171fefb6763843e23f60c94e",
+   "testharness"
   ],
   "css/filter-effects/reference/filters-opacity-001-ref.html": [
    "17d891ee707c36b7d404d9836060d7bb9275e841",
    "support"
   ],
   "css/filter-effects/reference/filters-opacity-002-ref.html": [
    "cfd8029223165871c4e2d78bee4a221b54822957",
    "support"
@@ -566985,16 +567444,20 @@
   "css/filter-effects/support/import-green.css": [
    "537104e663364492c6ef388e4afce190e9c5bc58",
    "support"
   ],
   "css/filter-effects/support/import-red.css": [
    "9945ef47114c2841a746c99a2fb1e93e050aac8b",
    "support"
   ],
+  "css/filter-effects/support/parsing-testcommon.js": [
+   "b075882f89aae49b419220b234534241cde5fd42",
+   "support"
+  ],
   "css/filter-effects/support/pattern-grg-rgr-grg.png": [
    "9b88fbd81149891234185f54f8b4a0431759f181",
    "support"
   ],
   "css/filter-effects/support/pattern-grg-rrg-rgg.png": [
    "fcf4f3fd7d95431b8cd1bc5f5129fcb724c5e40f",
    "support"
   ],
@@ -567446,64 +567909,64 @@
    "ec22768e96a1cd1efab206781b985cec8f006686",
    "support"
   ],
   "css/motion/offset-supports-calc.html": [
    "79aa9a9f50acd57848df17908390c770d7b88976",
    "testharness"
   ],
   "css/motion/parsing/offset-anchor-parsing-invalid.html": [
-   "39c3eb1e6b525a953da34b425653174cd8950c8c",
+   "45917c1b818c7760c42dcdd79b25787037b79520",
    "testharness"
   ],
   "css/motion/parsing/offset-anchor-parsing-valid.html": [
-   "5bb10bb836105f7955b9a904dd64c60a49f8af83",
+   "30101061b5ce62569bd3701494434e4f6d1088de",
    "testharness"
   ],
   "css/motion/parsing/offset-distance-parsing-invalid.html": [
-   "5fbbe8ebe04ca6017ec30adf4b2d4bdd66e9a39d",
+   "1cbb27fe536c2ba202fd3b7ed65bde1309460f95",
    "testharness"
   ],
   "css/motion/parsing/offset-distance-parsing-valid.html": [
-   "4fe67558283f6b6baba741b2d66f8aedb2241fe5",
+   "56569c8e0222068860ddda93faadb2580a818a78",
    "testharness"
   ],
   "css/motion/parsing/offset-parsing-invalid.html": [
-   "54298acb8dde726b86b7d32285e09f8d65b65ec6",
+   "343d22e46b4714dde6f484b37ae8d3fd8772460a",
    "testharness"
   ],
   "css/motion/parsing/offset-parsing-valid.html": [
-   "c7a4e645991027e1b3d53acee0e3107941308bf8",
+   "b645199f3a13015941648df08d8583b9a7fc7fed",
    "testharness"
   ],
   "css/motion/parsing/offset-path-parsing-invalid.html": [
-   "95bce0620d4c51ac85c723550e1bb8352eef1ecd",
+   "c0a32486922b4b1b482817f409571e1e6c4219f7",
    "testharness"
   ],
   "css/motion/parsing/offset-path-parsing-valid.html": [
-   "429abb9c60a944b12bc938478ac7b6c75cf12aac",
+   "c1e229e1a05a4c85845384ace9b884125f579415",
    "testharness"
   ],
   "css/motion/parsing/offset-position-parsing-invalid.html": [
-   "c008eff094530e87d75c5c66954d05a12643c5be",
+   "42370d44a38c2618d7f556d6be4b7a206e76b7e7",
    "testharness"
   ],
   "css/motion/parsing/offset-position-parsing-valid.html": [
-   "984e79c87a9059f334e4269a603bd57bc2799dba",
+   "3cf235cc855fc7e1325610ce4170974b746f1182",
    "testharness"
   ],
   "css/motion/parsing/offset-rotate-parsing-invalid.html": [
-   "f69ccfc3ca72a5e58445e80d662435b53e7d6357",
+   "591189acb050b8f5ff48175f461de837b036ae2f",
    "testharness"
   ],
   "css/motion/parsing/offset-rotate-parsing-valid.html": [
-   "18eb8203ec765f33e2567b48c382e6e423f83fb7",
-   "testharness"
-  ],
-  "css/motion/parsing/resources/parsing-testcommon.js": [
+   "f481ec8971d3a680c7c0ceb48502adb9ffbf83b4",
+   "testharness"
+  ],
+  "css/motion/support/parsing-testcommon.js": [
    "b075882f89aae49b419220b234534241cde5fd42",
    "support"
   ],
   "css/reference/META.yml": [
    "0f0f7aa96a3d8d59be0a26eaf5c706ae82faf4e4",
    "support"
   ],
   "css/reference/black_box_ends_when_blue_box_ends_6_boxes_ahem.html": [
@@ -569297,16 +569760,20 @@
   "css/selectors/resources/blue15x15.png": [
    "89de32fdb8a4e48b1320f40f5a75352773077cee",
    "support"
   ],
   "css/selectors/root-siblings.htm": [
    "99c0cb4c26294d1d8b655ed0a35d1f0eeb4a9ccb",
    "reftest"
   ],
+  "css/selectors/scope-selector.html": [
+   "bda0aed602aa691bba4c4089f0a4827a9b836c9e",
+   "testharness"
+  ],
   "css/selectors/scope-without-scoping.html": [
    "2ee7619e8023923c7d484554fd78c8e042d4b6ad",
    "reftest"
   ],
   "css/selectors/selection-image-001-no-selection-noref.html": [
    "ad2104bef671991a802c1750e6a2a6be1a7144a1",
    "visual"
   ],
@@ -569541,16 +570008,20 @@
   "css/support/import-green.css": [
    "537104e663364492c6ef388e4afce190e9c5bc58",
    "support"
   ],
   "css/support/import-red.css": [
    "9945ef47114c2841a746c99a2fb1e93e050aac8b",
    "support"
   ],
+  "css/support/parsing-testcommon.js": [
+   "b075882f89aae49b419220b234534241cde5fd42",
+   "support"
+  ],
   "css/support/pattern-grg-rgr-grg.png": [
    "9b88fbd81149891234185f54f8b4a0431759f181",
    "support"
   ],
   "css/support/pattern-grg-rrg-rgg.png": [
    "fcf4f3fd7d95431b8cd1bc5f5129fcb724c5e40f",
    "support"
   ],
@@ -580462,17 +580933,17 @@
    "aec1cee52ed55b7c9b93d7565a3cae1a5eea7698",
    "testharness"
   ],
   "dom/nodes/append-on-Document.html": [
    "8d9ce2e3ff604ee43807ee0eb1962870439725a9",
    "testharness"
   ],
   "dom/nodes/attributes.html": [
-   "21188933ea43e7e84888c27bc603a5e2bb0bfaa1",
+   "dac191b54cb2cafdaf9a71a297d130e571cd5230",
    "testharness"
   ],
   "dom/nodes/attributes.js": [
    "ef32bf6a67732c5820fc75f31e8eae5ba42c54cd",
    "support"
   ],
   "dom/nodes/case.html": [
    "c3c195141c3d16135f93a264c517eada4159c1f6",
@@ -589854,21 +590325,21 @@
    "aca07de7efbef48ac7ddb4cbc51b6858d2e76f9b",
    "support"
   ],
   "html/dom/elements/global-attributes/dir_auto-contained-script-L.html": [
    "59a2e77751af827ff73ab92a8fadf1ddc8be1f02",
    "reftest"
   ],
   "html/dom/elements/global-attributes/dir_auto-contained-script-R-ref.html": [
-   "921f10a4c6cf568e51962d08f983ad5f6843cc19",
+   "aa27d2f45b3771528de840ec487fde8a75c6c198",
    "support"
   ],
   "html/dom/elements/global-attributes/dir_auto-contained-script-R.html": [
-   "a76515d22fabd61fa59e48c30109dc82dde4b555",
+   "ee002766a0683d0232ad421e7075499aa83f93fe",
    "reftest"
   ],
   "html/dom/elements/global-attributes/dir_auto-contained-style-L-ref.html": [
    "2ec4f02ec2af1030807c6a5dbc3832e740fffeb9",
    "support"
   ],
   "html/dom/elements/global-attributes/dir_auto-contained-style-L.html": [
    "cc74d4c93945ff21fad5baf2f0b60f7f2ab247be",
@@ -590442,17 +590913,17 @@
    "bea30702d1aab7250c29b6bade3e4b696bea7795",
    "support"
   ],
   "html/dom/elements/wai-aria/contains.json": [
    "031cde580b2c3ddb6c2f0c9cb56e9cd57a48a3bb",
    "support"
   ],
   "html/dom/historical.html": [
-   "a36b4b2e92b792b18fb8704d217a089ba07be254",
+   "b79d35f0b8a383d026920d80d7374887f283a31b",
    "testharness"
   ],
   "html/dom/interfaces.https.html": [
    "6b7e37bf1fe25e21919c89e700d2c4078b7c9880",
    "testharness"
   ],
   "html/dom/interfaces.worker.js": [
    "8bf24b51b083a73e3ec79efc43269552f507db4a",
@@ -598977,16 +599448,20 @@
   "html/semantics/embedded-content/the-img-element/nonexistent-image.html": [
    "f58569ede0fab4e483ae58312e1b6b707bba4694",
    "testharness"
   ],
   "html/semantics/embedded-content/the-img-element/not-rendered-dimension-getter.html": [
    "4d929fd8b160205f1f0fd7ab019cbb31411c69ad",
    "testharness"
   ],
+  "html/semantics/embedded-content/the-img-element/null-image-source.html": [
+   "89992765036636c2b9eafbe9b579214fcc55346f",
+   "testharness"
+  ],
   "html/semantics/embedded-content/the-img-element/relevant-mutations.html": [
    "c8e09e8d0b8a7abbec87632b9f55240505d1ccc7",
    "testharness"
   ],
   "html/semantics/embedded-content/the-img-element/resources/cat.jpg": [
    "a4f14f54d60e592f3ca8b44360931898602ba6fe",
    "support"
   ],
@@ -600006,17 +600481,17 @@
    "da43da9d920cd56e2041fc51005f1653b0fbc71d",
    "testharness"
   ],
   "html/semantics/forms/the-select-element/select-remove.html": [
    "cf2128bd1584f3ca523ecdf8620c0c0f1f2329f6",
    "testharness"
   ],
   "html/semantics/forms/the-select-element/select-selectedOptions.html": [
-   "f8e577a8a066e665468e3ebb7420f7c634657d3b",
+   "6a5c75f2b147ece26f45c83581f5684d4746a4ab",
    "testharness"
   ],
   "html/semantics/forms/the-select-element/select-setcustomvalidity.html": [
    "15308c1a8f04c6f9fa3901b9985031e3cf3d79ed",
    "testharness"
   ],
   "html/semantics/forms/the-select-element/select-validity.html": [
    "73f41dfc712f854a039da4bf8cb6577c0219df56",
@@ -603385,16 +603860,20 @@
   "html/syntax/parsing/math-parse01.html": [
    "3aff716d9f7cfa6fb6c26992920b137b63f195e4",
    "testharness"
   ],
   "html/syntax/parsing/math-parse03.html": [
    "a3dbdc4e61aad00648c6b9ac34e22c08cbea12ce",
    "testharness"
   ],
+  "html/syntax/parsing/meta-inhead-insertion-mode.html": [
+   "4317e4eb14a7fdb92e7ca5594f95e13158198417",
+   "testharness"
+  ],
   "html/syntax/parsing/named-character-references-data.js": [
    "48ab30e4738feb1c95b2d4ad0a381c15c61e38d3",
    "support"
   ],
   "html/syntax/parsing/named-character-references.html": [
    "d09915cd974dd3a8b828eb58c004d63c853d1271",
    "testharness"
   ],
@@ -605310,17 +605789,17 @@
    "fc56faf4f93ba59cdbf52d54fb39e5427549120e",
    "support"
   ],
   "interfaces/SRI.idl": [
    "3abb66cd6e7c5b2ac76faf466924d44c1d2cafc8",
    "support"
   ],
   "interfaces/SVG.idl": [
-   "2ab3741d82f727efb1632bfc1a14611db8677cb8",
+   "01d87b862b4167f79c43ed1b91ef772f5a78f5fe",
    "support"
   ],
   "interfaces/WebCryptoAPI.idl": [
    "0b515fc12e701b4b20c616e2ae4ce29f50a205b6",
    "support"
   ],
   "interfaces/WebIDL.idl": [
    "aa8d5bad16a971b09d74914865f7db3115c7d836",
@@ -605342,17 +605821,17 @@
    "a55db2795927e3e3b1b45c589a24b4cd424c6de2",
    "support"
   ],
   "interfaces/audio-output.idl": [
    "c8efd4ea05161b06a3995fb29f19941452ec6b10",
    "support"
   ],
   "interfaces/background-fetch.idl": [
-   "fc3ed8dad3555a93221c6c7aa1cae0fbc7a6b402",
+   "6957604e7df5bed1c6ec0351ebe838d28773e3fe",
    "support"
   ],
   "interfaces/battery-status.idl": [
    "1dcaabb0bad226efb962fae5cdabebf728980afa",
    "support"
   ],
   "interfaces/beacon.idl": [
    "c5e3465c59fcfadba79803f7baf1853c2c48e06b",
@@ -605414,17 +605893,17 @@
    "6067701f4050eec455ca02e7649bd74525fba013",
    "support"
   ],
   "interfaces/css-masking.idl": [
    "80f908d42f3e4e4d0eadb1825dc6a4dbf20b1f2d",
    "support"
   ],
   "interfaces/css-paint-api.idl": [
-   "442bbfac1585768d6df64b48960f35a41b7546be",
+   "c636e2e7d3771fa4d0fb0df06088885552da6e00",
    "support"
   ],
   "interfaces/css-properties-values-api.idl": [
    "4ba38970e30ac2610e35c266e07f381e3a6b4ec5",
    "support"
   ],
   "interfaces/css-pseudo.idl": [
    "e16e66d5a3d34c5d29273a64704cbc8eebcd2e62",
@@ -605734,17 +606213,17 @@
    "ac8b70c157a2b42876b55b8ab67873d4a483c54d",
    "support"
   ],
   "interfaces/wasm-js-api.idl": [
    "04c817dcb11ad906d61c5576e43df1fcdf168860",
    "support"
   ],
   "interfaces/web-animations.idl": [
-   "2e66d6fd5a2211437bf037b7f2b685d84df88821",
+   "7dce1002e666d3efa9b18531e05b087f0f4adc0d",
    "support"
   ],
   "interfaces/web-bluetooth.idl": [
    "d372f0260eb45db1522aa16dc2a983dcb929bd4d",
    "support"
   ],
   "interfaces/web-nfc.idl": [
    "cdb0e75684842a4263e69d207f18de3e90a31eb1",
@@ -605778,17 +606257,17 @@
    "769433b19b31e5c534f19d82810635e2e22d38e9",
    "support"
   ],
   "interfaces/webrtc-stats.idl": [
    "ee5cce403f8d325b73661f45b65bd09f5faae861",
    "support"
   ],
   "interfaces/webrtc.idl": [
-   "2849a7d2b272d411dc0eddb134739e4f00ce05cc",
+   "c06e91e6de7b1f44e5f92e2c8eb1d0fabb792b7d",
    "support"
   ],
   "interfaces/webusb.idl": [
    "fcca851b8b535f4886bd56f30714971cf22c8c40",
    "support"
   ],
   "interfaces/webvtt.idl": [
    "81a23a35be6f857e49253d47cb9c64d24677b56d",
@@ -609021,20 +609500,16 @@
   "navigation-timing/idlharness.window.js": [
    "8cc3546b3c27a9d93ee5621584d83d56a308513c",
    "testharness"
   ],
   "navigation-timing/nav2_data_uri.html": [
    "851691d6c49808393376486e2616ce8d18075b18",
    "support"
   ],
-  "navigation-timing/nav2_idlharness.html": [
-   "6d1a1249b91ab555df5cf7521935ce229b5a66ab",
-   "testharness"
-  ],
   "navigation-timing/nav2_test_attributes_exist.html": [
    "b6048e061ba057cd971b08e032be717f0ad04d0d",
    "testharness"
   ],
   "navigation-timing/nav2_test_attributes_values.html": [
    "79809e41ddd7f68b1d3fa6979ca0d6fb1538a4e4",
    "testharness"
   ],
@@ -616225,16 +616700,20 @@
   "payment-request/PaymentRequestUpdateEvent/updateWith-state-checks-manual.https.html": [
    "4d4ef73949dd1dd271521c5005ca4e93108ab844",
    "manual"
   ],
   "payment-request/PaymentRequestUpdateEvent/updatewith-method.https.html": [
    "adacdf3f06d1c1adb50a65585b64441c5e00de63",
    "testharness"
   ],
+  "payment-request/PaymentValidationErrors/retry-shows-error-member-manual.https.html": [
+   "b3a539ef8f4b8aa9dd9a3ed0cb6b527f184cb04f",
+   "manual"
+  ],
   "payment-request/PaymentValidationErrors/retry-shows-payer-member-manual.https.html": [
    "8dbc760fd07fe990b8bbded56ffca59091492fd8",
    "manual"
   ],
   "payment-request/PaymentValidationErrors/retry-shows-shippingAddress-member-manual.https.html": [
    "cdc8d353a9b458b123dd2598ed34553a30dc4f23",
    "manual"
   ],
@@ -626334,17 +626813,17 @@
    "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
    "support"
   ],
   "resources/testdriver-vendor.js.headers": [
    "5e8f640c6659d176eaca4c71cc1798b7285540b7",
    "support"
   ],
   "resources/testdriver.js": [
-   "c9231d9e3132c6e9b255391a46cd82aa8996e47d",
+   "42ec824d015ab53e1de21aa4e86564b9cd5ed094",
    "support"
   ],
   "resources/testdriver.js.headers": [
    "5e8f640c6659d176eaca4c71cc1798b7285540b7",
    "support"
   ],
   "resources/testharness.css.headers": [
    "e828b629858d07afd989b80894986315bac16cc7",
@@ -628893,22 +629372,26 @@
   "service-workers/cache-storage/resources/simple.txt": [
    "9e3cb91fb9b95d6e51de85b82e6f86e92f59ac6d",
    "support"
   ],
   "service-workers/cache-storage/resources/test-helpers.js": [
    "050ac0b542455ceb53ed36038af5b9b0810977cf",
    "support"
   ],
+  "service-workers/cache-storage/resources/vary.py": [
+   "59e39bc2ae730a4cd3e1376dd003c9ffada4ed4a",
+   "support"
+  ],
   "service-workers/cache-storage/script-tests/cache-abort.js": [
    "ec4130fded29e0070828092c2546dc46456d8fdc",
    "support"
   ],
   "service-workers/cache-storage/script-tests/cache-add.js": [
-   "c03faeb0e83723eab64e648e600ba0612873d404",
+   "a482c42eaeb2a902a36b1d6aecd306e8ed4b4ebf",
    "support"
   ],
   "service-workers/cache-storage/script-tests/cache-delete.js": [
    "3cf9aeb4c23a9f7ad1d5433f2d5f4e46e4e8fdd1",
    "support"
   ],
   "service-workers/cache-storage/script-tests/cache-keys.js": [
    "a94c18f873c8b75c6faaa3a10d54ac58cf7c7c00",
@@ -629186,17 +629669,17 @@
    "ff0990df6ba99be79b069c2cc70ad70c920ba4e0",
    "testharness"
   ],
   "service-workers/service-worker/activation.https.html": [
    "5755758e5716dbc608e7e773bf9b83ab3f2f7e91",
    "testharness"
   ],
   "service-workers/service-worker/active.https.html": [
-   "deee6a50ea009ef541c1154353288242e3c3aeae",
+   "350a34b802f70d6b6c78e6fdba9b2acabe7d143c",
    "testharness"
   ],
   "service-workers/service-worker/appcache-ordering-main.https.html": [
    "609d67e4504c9488780369c15e1b96fc0bd20394",
    "testharness"
   ],
   "service-workers/service-worker/claim-affect-other-registration.https.html": [
    "52555ac271b5bad279ab37352c9d9937c780909a",
@@ -629526,17 +630009,17 @@
    "be9be4968f7b2d0cbc1f18f88b06b7acb6ad096f",
    "testharness"
   ],
   "service-workers/service-worker/install-event-type.https.html": [
    "7e74af85c3aee401f99add7a2a0209ddbe700f86",
    "testharness"
   ],
   "service-workers/service-worker/installing.https.html": [
-   "57d8781119212454c27a2a226c3d6bcb6b067062",
+   "0f257b6aba4f3d65802e7d7f8a7503d6c6aedd42",
    "testharness"
   ],
   "service-workers/service-worker/interfaces-sw.https.html": [
    "50c76d306dc2f43eac0f4d827e9b72464b63220c",
    "testharness"
   ],
   "service-workers/service-worker/interfaces-window.https.html": [
    "d3e85f2c711a627e6517a71a0c801ef344b83489",
@@ -629621,16 +630104,20 @@
   "service-workers/service-worker/navigation-preload/empty-preload-response-body.https.html": [
    "7e8aacdd36a58cdd88d2f1e70fec69c580526f00",
    "testharness"
   ],
   "service-workers/service-worker/navigation-preload/get-state.https.html": [
    "914648bcffbfac5f2d69fb087c87db5901a93e03",
    "testharness"
   ],
+  "service-workers/service-worker/navigation-preload/navigationPreload.https.html": [
+   "392e5c14dc8c7ca7d40df4396a102f379e1d55ad",
+   "testharness"
+  ],
   "service-workers/service-worker/navigation-preload/redirect.https.html": [
    "5970f053e36996f4cad93aec104c55f53055465a",
    "testharness"
   ],
   "service-workers/service-worker/navigation-preload/request-headers.https.html": [
    "09642010218ada72da946f8fdcf1c713f7367936",
    "testharness"
   ],
@@ -630982,17 +631469,17 @@
    "2584485c65ab60e8b429c3db66fc43a8157a8ed5",
    "testharness"
   ],
   "service-workers/service-worker/serviceworker-message-event-historical.https.html": [
    "2f780a604282dc281ebe75a964ed24f832a24e3a",
    "testharness"
   ],
   "service-workers/service-worker/serviceworkerobject-scripturl.https.html": [
-   "58f25f3a442c01387807300b1a278e71e9254d0a",
+   "6004985a34608132825086dab0c0777f3f0fdf1e",
    "testharness"
   ],
   "service-workers/service-worker/shared-worker-controlled.https.html": [
    "33d52e01199c2bdc0e85df7d8106ddd970aae082",
    "testharness"
   ],
   "service-workers/service-worker/skip-waiting-installed.https.html": [
    "21e26be5128454ee05143b10b8039ceb95a48cd5",
@@ -631070,17 +631557,17 @@
    "d8ed94f776650c8a40ba82df9ca5e909b460bb79",
    "testharness"
   ],
   "service-workers/service-worker/update.https.html": [
    "6717d4d7ac289c8a18b1500e21795fd16c5321e7",
    "testharness"
   ],
   "service-workers/service-worker/waiting.https.html": [
-   "2b0dbc9485bf863fcb324f169de2e28ba18d07b0",
+   "499e581eb353a2e433580e413a730bea2a9b7ad9",
    "testharness"
   ],
   "service-workers/service-worker/websocket-in-service-worker.https.html": [
    "cda9d6fe67e233e8b36dbfe12ddec2fa054de425",
    "testharness"
   ],
   "service-workers/service-worker/websocket.https.html": [
    "b9c526d50fb99abbafcb2b8d4f00c2267b25c474",
@@ -633390,17 +633877,17 @@
    "000c107b53b70e4548ee320331c2ab33be967a9c",
    "testharness"
   ],
   "svg/historical.html": [
    "1b73ca8d2236c7afdb9b331c532c84b6083f2968",
    "testharness"
   ],
   "svg/idlharness.window.js": [
-   "e08adf8978731b7c491c1f26e0edcd05c331f2a3",
+   "46e8aaee6afa6b67a2fb515d5155849dea214c00",
    "testharness"
   ],
   "svg/import/animate-dom-01-f-manual.svg": [
    "5c4d8bc8e017e86adfa5c9bc2e7cda91e164894d",
    "manual"
   ],
   "svg/import/animate-dom-02-f-manual.svg": [
    "68c30f084865ebb27a07a4918a5c26d18b57d074",
@@ -635786,17 +636273,17 @@
    "446e8e3fca8ddc48707f8df678eec655e303086c",
    "support"
   ],
   "svg/painting/reftests/paint-context-002.svg": [
    "8a8a378488c818430f2cb21648c33b78655df33a",
    "reftest"
   ],
   "svg/painting/reftests/paint-order-001-ref.svg": [
-   "6e1e016f6f5aa6bff5ca249d75e7b9dce8d11e12",
+   "7822a80b942fee54a87106d7def13429454cc26e",
    "support"
   ],
   "svg/painting/reftests/paint-order-001.svg": [
    "c8d60bd5bf68d0dc5f56fb360acdd2bac5aa1aa2",
    "reftest"
   ],
   "svg/path/bearing/absolute-ref.svg": [
    "85b20271a1179500e145ef48260888978dea484a",
@@ -637142,17 +637629,17 @@
    "1fc0c7a715ccb675ef555e6d899b3a85a93bbf40",
    "support"
   ],
   "tools/lint/tests/test_path_lints.py": [
    "bf8418d52a02e1a22b83fbb15c0b468969546dc6",
    "support"
   ],
   "tools/localpaths.py": [
-   "f6f207cfb66dfca2e5cb0826cfbac57d4f3aa528",
+   "8a064b71468ad5fefa28543cb4476f37cd2cbe1a",
    "support"
   ],
   "tools/manifest/XMLParser.py": [
    "523f544b7c4e834b85d970a352aab28d3c846145",
    "support"
   ],
   "tools/manifest/__init__.py": [
    "8c8f189070eaa3201bf0d8e7a37618cf39a65743",
@@ -637686,17 +638173,17 @@
    "40da7e9fd398b27000e96b8b2a67199025e02611",
    "support"
   ],
   "tools/serve/commands.json": [
    "abcb2970b63f48f2e817d2b5ff8f085e02df7588",
    "support"
   ],
   "tools/serve/serve.py": [
-   "6e977066af701a4c5dfc173187110b0e01a03e7e",
+   "30791eb967b36ac9a3c85070b232b4459723ef2d",
    "support"
   ],
   "tools/serve/test_serve.py": [
    "e939c3a0ccee4ac4f5babbcab3b9d30dbfa80be8",
    "support"
   ],
   "tools/third_party/atomicwrites/.gitignore": [
    "2b2d3128753e9f6f34895e7183595829d1063a5a",
@@ -638742,17 +639229,17 @@
    "4fcaad439f1b36e7ce333704aebbc847f9c8a588",
    "support"
   ],
   "tools/third_party/hpack/hpack/exceptions.py": [
    "571ba98f2cbfcfcb6ae9e19c28501a0a3b2566f1",
    "support"
   ],
   "tools/third_party/hpack/hpack/hpack.py": [
-   "57e8c7f6078bd09ac198b4877a3cebe8c27db50a",
+   "f8e808bec9eb9be9d90b86e5b0866e568309f12d",
    "support"
   ],
   "tools/third_party/hpack/hpack/huffman.py": [
    "159569cf630ec8302e1a9d16e200eee3ca15aef0",
    "support"
   ],
   "tools/third_party/hpack/hpack/huffman_constants.py": [
    "c2b3bb283e8ff686512a65a8364d3ab8e8f53bb6",
@@ -639193,16 +639680,248 @@
   "tools/third_party/html5lib/tox.ini": [
    "e07ef670cef9848a7b1dc4b76b571bf3995ab216",
    "support"
   ],
   "tools/third_party/html5lib/utils/entities.py": [
    "6dccf5f0bfd0025566426c314096e67e568359be",
    "support"
   ],
+  "tools/third_party/hyper/hyper/__init__.py": [
+   "afa88035298f065dde7e5f132932fd5ddd8915e5",
+   "support"
+  ],
+  "tools/third_party/hyper/hyper/certs.pem": [
+   "72a750f94fa85f772eea13b60374c801d05279b7",
+   "support"
+  ],
+  "tools/third_party/hyper/hyper/cli.py": [
+   "1d5384cdd88b463fa5fa83e5f1a4d7c60ca3aab7",
+   "support"
+  ],
+  "tools/third_party/hyper/hyper/common/__init__.py": [
+   "cf84291208bb7532cc146802b464153573274f1c",
+   "support"
+  ],
+  "tools/third_party/hyper/hyper/common/bufsocket.py": [
+   "b35393af2a02d0b24430312bf2e8bbb3d3a259b4",
+   "support"
+  ],
+  "tools/third_party/hyper/hyper/common/connection.py": [
+   "dee18d680e49dc22b616a3e79f41a2eacaddaa57",
+   "support"
+  ],
+  "tools/third_party/hyper/hyper/common/decoder.py": [
+   "e86f1f4e09a4fa4b960e96fc3d5550c5a2534b31",
+   "support"
+  ],
+  "tools/third_party/hyper/hyper/common/exceptions.py": [
+   "268431abcb5c260621accac303e8dd8b81a17660",
+   "support"
+  ],
+  "tools/third_party/hyper/hyper/common/headers.py": [
+   "655a591ac239085967d19cbdfb7c7992f15e21cd",
+   "support"
+  ],
+  "tools/third_party/hyper/hyper/common/util.py": [
+   "6d199a0cdebb4146218cc7fb9762091fccc0ba60",
+   "support"
+  ],
+  "tools/third_party/hyper/hyper/compat.py": [
+   "368b5fedfd9b09d78629ef5011eec20076bc0e88",
+   "support"
+  ],
+  "tools/third_party/hyper/hyper/contrib.py": [
+   "dccec5185502c0df4a7a29f2bc058cae521e0a5d",
+   "support"
+  ],
+  "tools/third_party/hyper/hyper/h2/__init__.py": [
+   "00f22d9623b57b7ba9162d8fd959b7d5357795b3",
+   "support"
+  ],
+  "tools/third_party/hyper/hyper/h2/config.py": [
+   "f3c6df744faa9dd16fdafa5d79f18879b56f590b",
+   "support"
+  ],
+  "tools/third_party/hyper/hyper/h2/connection.py": [
+   "37dc6365470845737f0bf1c2e8f4448fd54463a3",
+   "support"
+  ],
+  "tools/third_party/hyper/hyper/h2/errors.py": [
+   "1198b3b8a84f0f1acc70be56b7e3e9eb88cc7fe6",
+   "support"
+  ],
+  "tools/third_party/hyper/hyper/h2/events.py": [
+   "55f202183541f7732cbece33aa4b7856596d7334",
+   "support"
+  ],
+  "tools/third_party/hyper/hyper/h2/exceptions.py": [
+   "388f9e9a3893d8b1355a03bbbf011001b9d32dc9",
+   "support"
+  ],
+  "tools/third_party/hyper/hyper/h2/frame_buffer.py": [
+   "bc1f7ca4e8faffe9db1f00db240222df85423b40",
+   "support"
+  ],
+  "tools/third_party/hyper/hyper/h2/settings.py": [
+   "fedc5e3c445c711b673f3efdb562a5301577b206",
+   "support"
+  ],
+  "tools/third_party/hyper/hyper/h2/stream.py": [
+   "1b1e0b54232bee65fe9a1fe67b55b853283157c9",
+   "support"
+  ],
+  "tools/third_party/hyper/hyper/h2/utilities.py": [
+   "7a525f086ca58614eaa5edc6c13cb784a2864b9e",
+   "support"
+  ],
+  "tools/third_party/hyper/hyper/h2/windows.py": [
+   "6656975f486ceca3d165c9a4b08c0acb777ad39a",
+   "support"
+  ],
+  "tools/third_party/hyper/hyper/http11/__init__.py": [
+   "2faef667e4580697e52e750f312ea0c45ffde8da",
+   "support"
+  ],
+  "tools/third_party/hyper/hyper/http11/connection.py": [
+   "61361c3580d703a04ea9105b07604c1027ec174b",
+   "support"
+  ],
+  "tools/third_party/hyper/hyper/http11/parser.py": [
+   "ee391210dd11ed1d9d8a84790f0a50b1810ed434",
+   "support"
+  ],
+  "tools/third_party/hyper/hyper/http11/response.py": [
+   "ee23be08c916b9052971b839598fb6bde2541bc9",
+   "support"
+  ],
+  "tools/third_party/hyper/hyper/http20/__init__.py": [
+   "4a756d2c48491fb4aee3599e3babb4ac1e850869",
+   "support"
+  ],
+  "tools/third_party/hyper/hyper/http20/connection.py": [
+   "3c3927671f567d0b3314a8d5c5d56180ab6a2693",
+   "support"
+  ],
+  "tools/third_party/hyper/hyper/http20/errors.py": [
+   "bcad88595962e95e8e2895aa89fde3df6029fbe1",
+   "support"
+  ],
+  "tools/third_party/hyper/hyper/http20/exceptions.py": [
+   "69e25816fdbc40c5dc346730e9f0a637e7fb5434",
+   "support"
+  ],
+  "tools/third_party/hyper/hyper/http20/response.py": [
+   "bb339b2fde399264921a3daed1aa890692b18a3a",
+   "support"
+  ],
+  "tools/third_party/hyper/hyper/http20/stream.py": [
+   "f4d9247ed66b0edc5c8813ecc4c198064d47a7c5",
+   "support"
+  ],
+  "tools/third_party/hyper/hyper/http20/util.py": [
+   "b116d095e7f1e149cbe84d946c874c0e9469202f",
+   "support"
+  ],
+  "tools/third_party/hyper/hyper/http20/window.py": [
+   "a4e13c3c1509fc3077cad18831c6bcf96c6f79aa",
+   "support"
+  ],
+  "tools/third_party/hyper/hyper/httplib_compat.py": [
+   "deb07cf65606f7021368992f1ec1a3b556fe0c2e",
+   "support"
+  ],
+  "tools/third_party/hyper/hyper/packages/__init__.py": [
+   "4cf1e65314978704e8bc24546e44a6782dae0f70",
+   "support"
+  ],
+  "tools/third_party/hyper/hyper/packages/hpack/__init__.py": [
+   "98b2e0f95aece96f88ffe1f029bf187b6c7269e6",
+   "support"
+  ],
+  "tools/third_party/hyper/hyper/packages/hpack/compat.py": [
+   "03a0768e46a785e84bb85f574f0b001d3cece631",
+   "support"
+  ],
+  "tools/third_party/hyper/hyper/packages/hpack/exceptions.py": [
+   "0dbc4d9f1dddedbd7ffb8555ea565096b7e6a536",
+   "support"
+  ],
+  "tools/third_party/hyper/hyper/packages/hpack/hpack.py": [
+   "c3c5663e42ff6a6748329ad722252caf9d1bb420",
+   "support"
+  ],
+  "tools/third_party/hyper/hyper/packages/hpack/hpack_compat.py": [
+   "87918d7b00e0d00873182c096c21ab31c0277b86",
+   "support"
+  ],
+  "tools/third_party/hyper/hyper/packages/hpack/huffman.py": [
+   "c8aa276ef5cfa8f6fb08c386cd75e4e8b5aed501",
+   "support"
+  ],
+  "tools/third_party/hyper/hyper/packages/hpack/huffman_constants.py": [
+   "c2b3bb283e8ff686512a65a8364d3ab8e8f53bb6",
+   "support"
+  ],
+  "tools/third_party/hyper/hyper/packages/hyperframe/__init__.py": [
+   "9b6a84e721d68c84620640a75afbb73c707e1127",
+   "support"
+  ],
+  "tools/third_party/hyper/hyper/packages/hyperframe/flags.py": [
+   "e8f6300566db444cec4eb86ca326a34e8a96e1b8",
+   "support"
+  ],
+  "tools/third_party/hyper/hyper/packages/hyperframe/frame.py": [
+   "22e20031177d0fc9f533fd23ce1507f0ebc00e5c",
+   "support"
+  ],
+  "tools/third_party/hyper/hyper/packages/rfc3986/LICENSE": [
+   "72ce24cf02822ef81cd50905c094b5c7ac958df8",
+   "support"
+  ],
+  "tools/third_party/hyper/hyper/packages/rfc3986/__init__.py": [
+   "a3aea4c4da2c1b1aa7a7ca21cea4c70c9ec53c91",
+   "support"
+  ],
+  "tools/third_party/hyper/hyper/packages/rfc3986/api.py": [
+   "3e9e401aebaf5a75e5e8d497d7460a3b2b645469",
+   "support"
+  ],
+  "tools/third_party/hyper/hyper/packages/rfc3986/compat.py": [
+   "6fc7f6d808d27094b7988a6698dea1dce7c9cab7",
+   "support"
+  ],
+  "tools/third_party/hyper/hyper/packages/rfc3986/exceptions.py": [
+   "f9adbde718aa290949606d53de4417f7cc5acb7c",
+   "support"
+  ],
+  "tools/third_party/hyper/hyper/packages/rfc3986/misc.py": [
+   "c599434cde10cf0f3acd8ab2d70611ee37908c6a",
+   "support"
+  ],
+  "tools/third_party/hyper/hyper/packages/rfc3986/normalizers.py": [
+   "bb0630cb3264fe0b60422acb39662385efefcfe5",
+   "support"
+  ],
+  "tools/third_party/hyper/hyper/packages/rfc3986/parseresult.py": [
+   "2def55b636ffb979142a0935d80a3a2676b98211",
+   "support"
+  ],
+  "tools/third_party/hyper/hyper/packages/rfc3986/uri.py": [
+   "b7f5ccb79ca60bfd20c7c06266f991563d8be51a",
+   "support"
+  ],
+  "tools/third_party/hyper/hyper/ssl_compat.py": [
+   "976b62359310277d3f9d1ba3c6e73cd5cb37ec92",
+   "support"
+  ],
+  "tools/third_party/hyper/hyper/tls.py": [
+   "422b001cda86242d383375be87aa462f33b1c047",
+   "support"
+  ],
   "tools/third_party/hyperframe/CONTRIBUTORS.rst": [
    "aa7ab8b637cab250e1e625373ce93104204771b6",
    "support"
   ],
   "tools/third_party/hyperframe/HISTORY.rst": [
    "22cd87eb3458ddb27042dd488cf365ecdbe90033",
    "support"
   ],
@@ -641750,17 +642469,17 @@
    "bd6553fadcb16db177e522a0e60c82e8c55bca03",
    "support"
   ],
   "tools/wptrunner/wptrunner/executors/executorinternetexplorer.py": [
    "898ff144593877c3be33a33be567816e869dcf3e",
    "support"
   ],
   "tools/wptrunner/wptrunner/executors/executormarionette.py": [
-   "b9891c45cd2f8ac70c3e375cf41dceefca1cd2af",
+   "ad71a8fa31c7cf4626c11214a520a2121db897c4",
    "support"
   ],
   "tools/wptrunner/wptrunner/executors/executoropera.py": [
    "55f1f0d59590807452a9ffc201ad8d0f8f972fcd",
    "support"
   ],
   "tools/wptrunner/wptrunner/executors/executorsafari.py": [
    "ed01f4d8341b5497473b6f535ac4a2c04158cd9e",
@@ -642026,17 +642745,17 @@
    "f63869636da79cdcdc961e137d4f044055d74de4",
    "support"
   ],
   "tools/wptrunner/wptrunner/wptmanifest/tests/test_tokenizer.py": [
    "a64ce0c7bb7d8d089a8cb1365c0477a08652eacc",
    "support"
   ],
   "tools/wptrunner/wptrunner/wptrunner.py": [
-   "1ee4d54c71ebfe8d65fe9a99fe1e3055711a6049",
+   "aab5996afd94e78686a027fd8546ca83e77766f4",
    "support"
   ],
   "tools/wptrunner/wptrunner/wpttest.py": [
    "c29ba974a99786f687f2aead1ba14045c12fb643",
    "support"
   ],
   "tools/wptserve/.gitignore": [
    "8e87d388488bbc21c664209fecd2f3e030411b0e",
@@ -642102,25 +642821,25 @@
    "732f9fdc78af5b65ec8daa707e2be56f99511875",
    "support"
   ],
   "tools/wptserve/docs/stash.rst": [
    "49846f21061b30b4d4a54e7e7cffc9dd122a7a67",
    "support"
   ],
   "tools/wptserve/setup.py": [
-   "194c3372c94a0f38c1616566fa546b4dadf0166f",
+   "c9c364b8bacc72a6ff77f9d0c811b2d7d1810d13",
    "support"
   ],
   "tools/wptserve/tests/functional/__init__.py": [
    "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
    "support"
   ],
   "tools/wptserve/tests/functional/base.py": [
-   "ad8109822a853efb27881b8ce6d363d4de7ed01c",
+   "e49c8287c5985aa5ebbed04ef3070bc785831733",
    "support"
   ],
   "tools/wptserve/tests/functional/docroot/document.txt": [
    "611dccd84487e6429631bd7ae92268a58efdda6b",
    "support"
   ],
   "tools/wptserve/tests/functional/docroot/invalid.py": [
    "017d4d9d697b9e4117c7c03af7b1f8eac2197105",
@@ -642193,16 +642912,28 @@
   "tools/wptserve/tests/functional/docroot/subdir/import_handler.py": [
    "3b42b29be95174007e1ed18fc10eccdedd80b581",
    "support"
   ],
   "tools/wptserve/tests/functional/docroot/test.asis": [
    "b05ba7da80932036cef863a541d9f417ebd0dcf6",
    "support"
   ],
+  "tools/wptserve/tests/functional/docroot/test_h2_data.py": [
+   "ffd6586d393e9f70ac493d9c918950984aeaf469",
+   "support"
+  ],
+  "tools/wptserve/tests/functional/docroot/test_h2_headers.py": [
+   "60e72d949255436db6693041fca12d89a01c2883",
+   "support"
+  ],
+  "tools/wptserve/tests/functional/docroot/test_h2_headers_data.py": [
+   "74a81f81f24a487b0433960d4cbfd21ec7147016",
+   "support"
+  ],
   "tools/wptserve/tests/functional/docroot/test_string.py": [
    "8fa605bb181940cea184774f94015ce43ad939a4",
    "support"
   ],
   "tools/wptserve/tests/functional/docroot/test_tuple_2.py": [
    "fa791fbddd2e1786adc305c2a4ee9ab3e223d4d7",
    "support"
   ],
@@ -642218,33 +642949,33 @@
    "71494fccf10f2b31d9a28d5d51eb523eaa70aba8",
    "support"
   ],
   "tools/wptserve/tests/functional/test_cookies.py": [
    "6bcb842e62561b5fe0f7c95b3faf5eb8a527672b",
    "support"
   ],
   "tools/wptserve/tests/functional/test_handlers.py": [
-   "4c6d37196a168e38b36c74d23e4efc159ea16cc8",
+   "15c7cb7e803d771bb3814de2b0e85ac606f2759f",
    "support"
   ],
   "tools/wptserve/tests/functional/test_input_file.py": [
    "014386e172fbb79de4554284e4c51dcaabaf70b4",
    "support"
   ],
   "tools/wptserve/tests/functional/test_pipes.py": [
    "ebdbc3ee57ddfa50338938aa2e226028d7bb6555",
    "support"
   ],
   "tools/wptserve/tests/functional/test_request.py": [
    "de29638f6c11dae97cbb5d26d60d3fd530403e5b",
    "support"
   ],
   "tools/wptserve/tests/functional/test_response.py": [
-   "0842e024f9e96fe5c6a69ecb9efc592df9f4fd62",
+   "daf8e6ed0028502f0876159cbda37e9ac6b6c99c",
    "support"
   ],
   "tools/wptserve/tests/functional/test_server.py": [
    "511c86f32c54ab704e9dca2ba11452f24161e05f",
    "support"
   ],
   "tools/wptserve/tests/functional/test_stash.py": [
    "309dd9e577a0335b7a56992c82a48b43a259a28d",
@@ -642266,49 +642997,49 @@
    "cb5435fdef4c20c65989f330392b918d171fad1a",
    "support"
   ],
   "tools/wptserve/wptserve/constants.py": [
    "ec150ba5c8f7a3b89a63903b7dc757c96dfff1a9",
    "support"
   ],
   "tools/wptserve/wptserve/handlers.py": [
-   "9e6fe9bbc76e4b9b86e7b29f8ee930427b83a543",
+   "7fbe4234ea0a252aaed07182fd3bed741c147285",
    "support"
   ],
   "tools/wptserve/wptserve/logger.py": [
    "6c91492c7e9a9d752be40c474d51245975f6b1ff",
    "support"
   ],
   "tools/wptserve/wptserve/pipes.py": [
    "ad96f591a3a8c8b7e8d13a4ad95a1aae500f66da",
    "support"
   ],
   "tools/wptserve/wptserve/ranges.py": [
    "976cb1781a0dfe618038d94ea29169e6b86b3f98",
    "support"
   ],
   "tools/wptserve/wptserve/request.py": [
-   "5088946c0f69b1c5fe2a9b61f8008c85671967d7",
+   "cb575ccdba4514a456c0cbf73904bb63c12fd7ff",
    "support"
   ],
   "tools/wptserve/wptserve/response.py": [
-   "dd0acfd690686ec63f8e5de7668168cfb7e78423",
+   "bc21452eeffce73bc6395fa1a15f35f9f55b93c7",
    "support"
   ],
   "tools/wptserve/wptserve/router.py": [
    "5118c03b728313f703f6e9002c4003fc0d6e1d98",
    "support"
   ],
   "tools/wptserve/wptserve/routes.py": [
    "b6e3800018a5b6d3db167457daf6fa90affa44f8",
    "support"
   ],
   "tools/wptserve/wptserve/server.py": [
-   "61a758ab6513ced2a67d8ce7e7af4d1c2894cc68",
+   "353835ee84f2bbe0c36837cddad6794de11b7fa8",
    "support"
   ],
   "tools/wptserve/wptserve/sslutils/__init__.py": [
    "6699edb5964530e7e352497de43ff1e154b52a1d",
    "support"
   ],
   "tools/wptserve/wptserve/sslutils/base.py": [
    "c95b693f37123178c33f93125e7d8df46899db3c",
@@ -642322,17 +643053,17 @@
    "fc487df3add0391c3ef71b69ed9f37734f142891",
    "support"
   ],
   "tools/wptserve/wptserve/stash.py": [
    "ae48a86112333bb5ffcdf76c100d929de2b6fd91",
    "support"
   ],
   "tools/wptserve/wptserve/utils.py": [
-   "14a75af9666deee6986a00735a74033ef855cf95",
+   "d0f87fea60f8e304d54fe74d5f73c72cf6164fb2",
    "support"
   ],
   "tools/wptserve/wptserve/wptserve.py": [
    "816c8a5a6aaec2ae985c3fb3ceebd1259a5a4f23",
    "support"
   ],
   "touch-events/META.yml": [
    "3dcab9a534bc43753827b2d4f7cc6d3cd9974404",
@@ -642521,36 +643252,36 @@
   "uievents/constructors/inputevent-constructor.html": [
    "3876abcd430e3f2dbdc58e57d8f179721a67cc77",
    "testharness"
   ],
   "uievents/hierarchy/README.md": [
    "3bf23b4c230749355607b3af6c1a3bdcc256cf19",
    "support"
   ],
+  "uievents/idlharness.window.js": [
+   "928c8c90f0ff4ed99fdec8183cb129bbbea82f3e",
+   "testharness"
+  ],
   "uievents/interface/README.md": [
    "970fdd4df3517297e344019930d88fbb53b1a002",
    "support"
   ],
   "uievents/interface/click-event-manual.htm": [
    "88db98d59132c08bf5ae455fc0593691c82a32e2",
    "manual"
   ],
   "uievents/interface/click-event.htm": [
    "2f9b483b94c9c2b648cc180c1bb643826913f710",
    "testharness"
   ],
   "uievents/interface/dblclick-event-manual.htm": [
    "7ea0bdbf138d2fbcd319db2967dca81602bfb74a",
    "manual"
   ],
-  "uievents/interfaces.html": [
-   "0d20f1d71010fdf097b652b7a1c32285e4dfa112",
-   "testharness"
-  ],
   "uievents/keyboard/README.md": [
    "38c454dd7c33eefc14022434505321f29dfb4917",
    "support"
   ],
   "uievents/keyboard/key-101en-us-manual.html": [
    "3228c65a839f6ff158083da7494d3a08ae235904",
    "manual"
   ],
@@ -643305,18 +644036,18 @@
   "vibration/cancel-with-empty-array-manual.html": [
    "8e48173e7e924efd52d3179d9d0bd8800c4653c5",
    "manual"
   ],
   "vibration/cancel-with-new-manual.html": [
    "64e6e9b548233809b217c03e2709f7fbf12fdce9",
    "manual"
   ],
-  "vibration/idl.html": [
-   "167090cd67b0169501a6b0b16f8101e8b2b04f84",
+  "vibration/idlharness.window.js": [
+   "fbe14daa6119a8213ca58e2233345af015353a1b",
    "testharness"
   ],
   "vibration/invalid-values.html": [
    "6740a44a8ed98ac76c577636d42010c1c8c27ada",
    "testharness"
   ],
   "vibration/pattern-array-extra-manual.html": [
    "b23323ace2f51e160e8aacd38e619c1f0258661b",
@@ -644913,86 +645644,86 @@
   "web-locks/META.yml": [
    "24e7d28340606d9a6290af9ceac4f4fb9156abf0",
    "support"
   ],
   "web-locks/README.md": [
    "8ff534e1b6f143de950e874d9b97dae951205110",
    "support"
   ],
-  "web-locks/acquire.tentative.https.html": [
-   "65bf0e4e064aa23116637092278e413fdd4409a0",
+  "web-locks/acquire.tentative.https.any.js": [
+   "be0e837a89b47558de809c9463f08223bd0a3b97",
    "testharness"
   ],
   "web-locks/clientids.tentative.https.html": [
    "9ce4c4e9d184e1d925316eaa2b3e2c0a17d3dda1",
    "testharness"
   ],
   "web-locks/frames.tentative.https.html": [
    "7d8383cffc18fdb5d536d10833a38698ec09d385",
    "testharness"
   ],
-  "web-locks/held.tentative.https.html": [
-   "aecbbd3df89c32e0e6a34df59afaa5c7c26dd7ad",
-   "testharness"
-  ],
-  "web-locks/ifAvailable.tentative.https.html": [
-   "2b6e1ff3c8156fc1881e1922f78be6e742ec48ec",
+  "web-locks/held.tentative.https.any.js": [
+   "151e3b35f7daeb636b07d10bb397fc977748640b",
+   "testharness"
+  ],
+  "web-locks/ifAvailable.tentative.https.any.js": [
+   "a63caf6d588be03048c0821a5e742eb63af81edd",
    "testharness"
   ],
   "web-locks/interfaces-serviceworker.tentative.https.html": [
    "ca4d768546a60a57867756f1e3bd866ac522539e",
    "testharness"
   ],
   "web-locks/interfaces.idl": [
    "7c7d7c344df91ef7590bb982a72289dc6442fd8c",
    "support"
   ],
   "web-locks/interfaces.tentative.https.any.js": [
    "26b0bde2baf5e9d5286b008b34c8b0477d9fd10b",
    "testharness"
   ],
-  "web-locks/lock-attributes.tentative.https.html": [
-   "89ffec41ba9f8295d609fc1b79a178b3f60f62e9",
-   "testharness"
-  ],
-  "web-locks/mode-exclusive.tentative.https.html": [
-   "8c6005d04a59d42dcbd240fd6fde68132871cb18",
-   "testharness"
-  ],
-  "web-locks/mode-mixed.tentative.https.html": [
-   "0ce0583645ea43d01fbc543d88583e5f9c309e2e",
-   "testharness"
-  ],
-  "web-locks/mode-shared.tentative.https.html": [
-   "309ee57b5a9185d552fd0f201f2a6d29a5d86251",
-   "testharness"
-  ],
-  "web-locks/non-secure-context.tentative.html": [
-   "568eb30e1ba6bb8c3156f04d0d105152b66b4879",
+  "web-locks/lock-attributes.tentative.https.any.js": [
+   "e94fc95a1d4a2e3619f43d206ef529fc82abfd74",
+   "testharness"
+  ],
+  "web-locks/mode-exclusive.tentative.https.any.js": [
+   "914046221998197543827487b60114b17e912ef4",
+   "testharness"
+  ],
+  "web-locks/mode-mixed.tentative.https.any.js": [
+   "3b304941862c37ced2ef6042889d11011aaa1db1",
+   "testharness"
+  ],
+  "web-locks/mode-shared.tentative.https.any.js": [
+   "7c8a8448befc9c345fd34b2cf2c1f609d7437ae2",
+   "testharness"
+  ],
+  "web-locks/non-secure-context.tentative.any.js": [
+   "e9726e6b4af02d3c72e03c5f6c1e036df843f4ce",
    "testharness"
   ],
   "web-locks/opaque-origin.tentative.https.html": [
    "589c2a7cdd8bbc3216ea0556f7c6ef55944966e3",
    "testharness"
   ],
-  "web-locks/query-empty.tentative.https.html": [
-   "38fed37b9a56e41ad5b3dce4086e863653c3780e",
-   "testharness"
-  ],
-  "web-locks/query-order.tentative.https.html": [
-   "e4fb7c5e2623bfbeabe6db0e14ce54fe8bc318ba",
-   "testharness"
-  ],
-  "web-locks/query.tentative.https.html": [
-   "218e984993ca8ba04f833f6115b7762d99d6d67d",
-   "testharness"
-  ],
-  "web-locks/resource-names.tentative.https.html": [
-   "d4ac7437a9d4e159d3ba233fdd7bd2457f6a9cc7",
+  "web-locks/query-empty.tentative.https.any.js": [
+   "fe7e0bb16ceb724ed2c2533461e16ce26310c9d3",
+   "testharness"
+  ],
+  "web-locks/query-order.tentative.https.any.js": [
+   "1810a969171f03fdaa4a3a37262bed277f01f69f",
+   "testharness"
+  ],
+  "web-locks/query.tentative.https.any.js": [
+   "14fdeca7a426c44ac9027a3a2494e235d0ac1844",
+   "testharness"
+  ],
+  "web-locks/resource-names.tentative.https.any.js": [
+   "dbcd986abd92a8dec71eb2102ad8d263017bbbfe",
    "testharness"
   ],
   "web-locks/resources/helpers.js": [
    "d6a4af45fa7199ea3b9ff8ff863eed6c848a4043",
    "support"
   ],
   "web-locks/resources/iframe.html": [
    "d3799f44f96b3456c2e42a3b791c12dbe4817c5d",
@@ -645009,26 +645740,26 @@
   "web-locks/resources/sw-controlled-iframe.html": [
    "bc5c9bdb838257cb68e2adb0400975fa68bdf30f",
    "support"
   ],
   "web-locks/resources/worker.js": [
    "9bb5d3d6aad18567ed0544eac614125e8364f312",
    "support"
   ],
-  "web-locks/secure-context.tentative.https.html": [
-   "a90b55dfb592e0ae49424a794452b09eed68f747",
-   "testharness"
-  ],
-  "web-locks/signal.tentative.https.html": [
-   "a070bde21b1841a5b3c3a6dc4a389cd2aa14026d",
-   "testharness"
-  ],
-  "web-locks/steal.tentative.https.html": [
-   "169d849b6ac41354a7806de9a6c2e57c185a7a89",
+  "web-locks/secure-context.tentative.https.any.js": [
+   "2e1d391204f3aaceb790812351d0963fc3748b76",
+   "testharness"
+  ],
+  "web-locks/signal.tentative.https.any.js": [
+   "424b219dc52a835cc5b61f9fada525aafdafa62b",
+   "testharness"
+  ],
+  "web-locks/steal.tentative.https.any.js": [
+   "ca99137a969d97452fa06eb54ffe2f2f5c46302c",
    "testharness"
   ],
   "web-locks/workers.tentative.https.html": [
    "04af72c8ad04a940f289678f4bde41ee4cde9654",
    "testharness"
   ],
   "web-nfc/META.yml": [
    "ffc54cf33550e3e57a00da6a1e52d72e5f124772",
@@ -646270,17 +647001,17 @@
    "6f844cd255a075d31caf1c19957af3d6ac833778",
    "support"
   ],
   "webdriver/tests/add_cookie/__init__.py": [
    "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
    "support"
   ],
   "webdriver/tests/add_cookie/add.py": [
-   "49b1d68e7d2baa5086d0b945e9d005c2d86234ea",
+   "48fdf64f2f9523979a7a79ca3f9541603c0e1d60",
    "wdspec"
   ],
   "webdriver/tests/back/__init__.py": [
    "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
    "support"
   ],
   "webdriver/tests/back/back.py": [
    "0f94ab431ae012b0abc8406f6d372a6fafcf8048",
@@ -646426,33 +647157,33 @@
    "3a809aac6939b54b76cc2badec176abb216dcdd8",
    "wdspec"
   ],
   "webdriver/tests/element_send_keys/scroll_into_view.py": [
    "9ff0a9e25788921eb6d01add0e279c50d7de6134",
    "wdspec"
   ],
   "webdriver/tests/element_send_keys/send_keys.py": [
-   "0d281d7f5cb3c2f3386504aedd66afa6269e65d3",
+   "03cc94850c6c9f65e8a70a931b4816d0bbf2d167",
    "wdspec"
   ],
   "webdriver/tests/element_send_keys/user_prompts.py": [
    "621bdffa6642817684f2a919d3c07103793522dd",
    "wdspec"
   ],
   "webdriver/tests/execute_async_script/__init__.py": [
    "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
    "support"
   ],
   "webdriver/tests/execute_async_script/collections.py": [
    "8376fdfe061ca615ed12f632d878221ec5cb0e78",
    "wdspec"
   ],
   "webdriver/tests/execute_async_script/execute_async.py": [
-   "2b6e61543176ea1ba15f4c399028ceb24878e3c9",
+   "7c454eaf4ac4f83d7594e58f99dbdb525ef7d687",
    "wdspec"
   ],
   "webdriver/tests/execute_async_script/user_prompts.py": [
    "5c873935519716a3f4933b710828118218f7220c",
    "wdspec"
   ],
   "webdriver/tests/execute_script/__init__.py": [
    "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
@@ -646462,57 +647193,57 @@
    "edee1e5532b81f07f19be09b40fc99c2df9ef6f8",
    "wdspec"
   ],
   "webdriver/tests/execute_script/cyclic.py": [
    "16bdcdd1dea5f27753cc525a754dffae3b589005",
    "wdspec"
   ],
   "webdriver/tests/execute_script/execute.py": [
-   "386afe0e1db172c310ff3aefa2bfb0078a79a966",
+   "2af16c1e5e8a3bed01c5703db24a1d399a0e2270",
    "wdspec"
   ],
   "webdriver/tests/execute_script/json_serialize_windowproxy.py": [
    "9864227374e328514d54596f611c474c6f0fe3f3",
    "wdspec"
   ],
   "webdriver/tests/execute_script/user_prompts.py": [
    "ec6895b74f8e110120f2e3067e2c35b94d2a532d",
    "wdspec"
   ],
   "webdriver/tests/find_element/__init__.py": [
    "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
    "support"
   ],
   "webdriver/tests/find_element/find.py": [
-   "ad25e78e9e47fa7ef45bbd1546eae9c7da78f436",
+   "20cde541d11eebcce70493863fb55fcb1e81a908",
    "wdspec"
   ],
   "webdriver/tests/find_element_from_element/__init__.py": [
    "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
    "support"
   ],
   "webdriver/tests/find_element_from_element/find.py": [
-   "d44fbb3957bc7b3e0e47e0016ffae3d3bfdf3813",
+   "56e216bb646131bdcc9a0c3c28ea4142c2982897",
    "wdspec"
   ],
   "webdriver/tests/find_elements/__init__.py": [
    "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
    "support"
   ],
   "webdriver/tests/find_elements/find.py": [
-   "f6856e9ed6ed45fd6f40008ba4ee0309aff0d282",
+   "b31370ee0cd1b7c9cb307541728f4e736117181c",
    "wdspec"
   ],
   "webdriver/tests/find_elements_from_element/__init__.py": [
    "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
    "support"
   ],
   "webdriver/tests/find_elements_from_element/find.py": [
-   "bcc18642c8fd86285be4ab2520b6d16aeb516f19",
+   "5a48e9c76ef6add6e69952c58a23edbd5e87698d",
    "wdspec"
   ],
   "webdriver/tests/forward/__init__.py": [
    "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
    "support"
   ],
   "webdriver/tests/forward/conftest.py": [
    "d5fd320a696a507718299c765278edde6205608a",
@@ -646625,16 +647356,40 @@
   "webdriver/tests/get_title/get.py": [
    "ed5b401c564ec7375b3be8ebd9124388f40062a7",
    "wdspec"
   ],
   "webdriver/tests/get_title/user_prompts.py": [
    "76d65c088a0b94e8cefb976e91edf5492a5aae20",
    "wdspec"
   ],
+  "webdriver/tests/get_window_handle/__init__.py": [
+   "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
+   "support"
+  ],
+  "webdriver/tests/get_window_handle/get.py": [
+   "c6a90f93c1b693d59df7d0b0b12f5da821e73c7c",
+   "wdspec"
+  ],
+  "webdriver/tests/get_window_handle/user_prompts.py": [
+   "0bd660cfa1fb31ba4fc93bb0ecb239fc4a6c136c",
+   "wdspec"
+  ],
+  "webdriver/tests/get_window_handles/__init__.py": [
+   "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
+   "support"
+  ],
+  "webdriver/tests/get_window_handles/get.py": [
+   "07ff9d4d26fd3b7cff5620b5295ebe386a226cf2",
+   "wdspec"
+  ],
+  "webdriver/tests/get_window_handles/user_prompts.py": [
+   "217e9849b4417d7124e203f937270a9e4823666a",
+   "wdspec"
+  ],
   "webdriver/tests/get_window_rect/__init__.py": [
    "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
    "support"
   ],
   "webdriver/tests/get_window_rect/get.py": [
    "ee2c9eefd3f4ff81ea1cb8f33be58cc17f332030",
    "wdspec"
   ],
@@ -646682,17 +647437,17 @@
    "1551e3af62668971eeb5681301b6833cf6fb619b",
    "wdspec"
   ],
   "webdriver/tests/navigate_to/__init__.py": [
    "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
    "support"
   ],
   "webdriver/tests/navigate_to/navigate.py": [
-   "9ac1be00b84eeae73aec8a1facb43b329bae6310",
+   "e478e10b76b0953d854416dffdc7a400087aee95",
    "wdspec"
   ],
   "webdriver/tests/new_session/__init__.py": [
    "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
    "support"
   ],
   "webdriver/tests/new_session/conftest.py": [
    "bf974ab1c000a1d733664637faf9b39e7303d556",
@@ -646762,33 +647517,33 @@
    "b8ef418e115fcdafa861dcb8f61b01116e9e81f6",
    "wdspec"
   ],
   "webdriver/tests/send_alert_text/__init__.py": [
    "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
    "support"
   ],
   "webdriver/tests/send_alert_text/send.py": [
-   "9d4532a190c717ad7997a5b9ccb6d8d32a2cb1fc",
+   "edc37d6edb483c232401676f6c11ab7512774605",
    "wdspec"
   ],
   "webdriver/tests/set_timeouts/__init__.py": [
    "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
    "support"
   ],
   "webdriver/tests/set_timeouts/set.py": [
-   "8dd0344dca561d50df6dd04a0d2507a015649e0c",
+   "e603e217ec7d73bf7bc59f1d2e8687a89c818c47",
    "wdspec"
   ],
   "webdriver/tests/set_window_rect/__init__.py": [
    "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
    "support"
   ],
   "webdriver/tests/set_window_rect/set.py": [
-   "17210af4f46a25a6f2484ba76a74cd5c54e31d6a",
+   "928fd622efc22f520f4c6a9f783f60ec270146e2",
    "wdspec"
   ],
   "webdriver/tests/set_window_rect/user_prompts.py": [
    "908a9d920f36d0b8664c6b906bc71b0aefba96e6",
    "wdspec"
   ],
   "webdriver/tests/status/__init__.py": [
    "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
@@ -646802,21 +647557,21 @@
    "e5e43c4e655170d57d3de7a85d4ebb639c31aee0",
    "support"
   ],
   "webdriver/tests/support/asserts.py": [
    "44c76a96b0997100a0201a5ffafd20e9967758ec",
    "support"
   ],
   "webdriver/tests/support/fixtures.py": [
-   "daeccb70e948b2564f7d78106dbee919b9cd7436",
+   "64427b4670f72c9ea069d0f008d93ad63a9781c0",
    "support"
   ],
   "webdriver/tests/support/http_request.py": [
-   "ae28a6486b1333acc472ab2d37ac3f890249f1a2",
+   "5e46d97017e14ba009d4d1ed6d62bb5012f48d15",
    "support"
   ],
   "webdriver/tests/support/inline.py": [
    "2f8fe9b79e3bacf1fb3bd9bcd981c8d8389fcd08",
    "support"
   ],
   "webdriver/tests/support/merge_dictionaries.py": [
    "cf06c9b433cee167c5c98e06d64cc7a2e68faff3",
@@ -646826,33 +647581,33 @@
    "6f439ec61a372bc1202f226a3b4e3f41509d5f60",
    "support"
   ],
   "webdriver/tests/switch_to_frame/__init__.py": [
    "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
    "support"
   ],
   "webdriver/tests/switch_to_frame/switch.py": [
-   "403047958665981f5509e370e38897b8a463e2a7",
+   "10948102239df61f0fd35fc157fe31b1a3e2968a",
    "wdspec"
   ],
   "webdriver/tests/switch_to_parent_frame/__init__.py": [
    "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
    "support"
   ],
   "webdriver/tests/switch_to_parent_frame/switch.py": [
    "6b9c90f0cd83e2c916da989a81ed206618fbaf4a",
    "wdspec"
   ],
   "webdriver/tests/switch_to_window/__init__.py": [
    "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
    "support"
   ],
   "webdriver/tests/switch_to_window/switch.py": [
-   "17f7c4da328822fb342b7e3f510eb6ed007bce3f",
+   "907be66a149e8196c87760544140636d9625bbb9",
    "wdspec"
   ],
   "webgl/META.yml": [
    "8e6b680d91c9b81b85e3ce010c5fb9fe338f37bf",
    "support"
   ],
   "webgl/bufferSubData.html": [
    "a97df9062d6ea964e500059e155b29604edc21b6",
@@ -649301,18 +650056,18 @@
   "webvtt/api/categories.json": [
    "7ce5b13f72e8cc49f45401d87d196d146dd63993",
    "support"
   ],
   "webvtt/api/historical.html": [
    "8f6c09bf526e462f67563601214c3987b31fe098",
    "testharness"
   ],
-  "webvtt/api/interfaces.html": [
-   "5222256d617df55f19a9453c6783d59d183fcef7",
+  "webvtt/api/idlharness.window.js": [
+   "53c1ded67493685fb0a7279fa2994bba598c4fd3",
    "testharness"
   ],
   "webvtt/categories.json": [
    "11af9ad43df56cbedc3b88b8d36f6f4428e8d46c",
    "support"
   ],
   "webvtt/parsing/README.md": [
    "e789c1657b399cbdffb90ed03bff0e9323b5aa27",
--- a/testing/web-platform/meta/background-fetch/idlharness.https.any.js.ini
+++ b/testing/web-platform/meta/background-fetch/idlharness.https.any.js.ini
@@ -135,16 +135,52 @@
     expected: FAIL
 
   [BackgroundFetchRegistration interface: attribute id]
     expected: FAIL
 
   [BackgroundFetchRegistration interface: attribute downloadTotal]
     expected: FAIL
 
+  [BackgroundFetchRecord interface object name]
+    expected: FAIL
+
+  [BackgroundFetchRecord interface: existence and properties of interface object]
+    expected: FAIL
+
+  [BackgroundFetchRecord interface: existence and properties of interface prototype object]
+    expected: FAIL
+
+  [BackgroundFetchRecord interface: existence and properties of interface prototype object's @@unscopables property]
+    expected: FAIL
+
+  [BackgroundFetchRegistration interface: operation match(RequestInfo, CacheQueryOptions)]
+    expected: FAIL
+
+  [BackgroundFetchRecord interface: attribute request]
+    expected: FAIL
+
+  [BackgroundFetchRecord interface: existence and properties of interface prototype object's "constructor" property]
+    expected: FAIL
+
+  [BackgroundFetchRegistration interface: operation matchAll(RequestInfo, CacheQueryOptions)]
+    expected: FAIL
+
+  [BackgroundFetchRegistration interface: attribute failureReason]
+    expected: FAIL
+
+  [BackgroundFetchRecord interface: attribute responseReady]
+    expected: FAIL
+
+  [BackgroundFetchRegistration interface: attribute state]
+    expected: FAIL
+
+  [BackgroundFetchRecord interface object length]
+    expected: FAIL
+
 
 [idlharness.https.any.worker.html]
   [BackgroundFetchRegistration interface: attribute activeFetches]
     expected: FAIL
 
   [BackgroundFetchManager interface: existence and properties of interface object]
     expected: FAIL
 
@@ -278,16 +314,52 @@
     expected: FAIL
 
   [BackgroundFetchRegistration interface: attribute id]
     expected: FAIL
 
   [BackgroundFetchRegistration interface: attribute downloadTotal]
     expected: FAIL
 
+  [BackgroundFetchRecord interface object name]
+    expected: FAIL
+
+  [BackgroundFetchRecord interface: existence and properties of interface object]
+    expected: FAIL
+
+  [BackgroundFetchRecord interface: existence and properties of interface prototype object]
+    expected: FAIL
+
+  [BackgroundFetchRecord interface: existence and properties of interface prototype object's @@unscopables property]
+    expected: FAIL
+
+  [BackgroundFetchRegistration interface: operation match(RequestInfo, CacheQueryOptions)]
+    expected: FAIL
+
+  [BackgroundFetchRecord interface: attribute request]
+    expected: FAIL
+
+  [BackgroundFetchRecord interface: existence and properties of interface prototype object's "constructor" property]
+    expected: FAIL
+
+  [BackgroundFetchRegistration interface: operation matchAll(RequestInfo, CacheQueryOptions)]
+    expected: FAIL
+
+  [BackgroundFetchRegistration interface: attribute failureReason]
+    expected: FAIL
+
+  [BackgroundFetchRecord interface: attribute responseReady]
+    expected: FAIL
+
+  [BackgroundFetchRegistration interface: attribute state]
+    expected: FAIL
+
+  [BackgroundFetchRecord interface object length]
+    expected: FAIL
+
 
 [idlharness.https.any.serviceworker.html]
   [BackgroundFetchRegistration interface: attribute activeFetches]
     expected: FAIL
 
   [BackgroundFetchRegistration interface: attribute uploadTotal]
     expected: FAIL
 
@@ -565,16 +637,79 @@
     expected: FAIL
 
   [BackgroundFetchActiveFetches interface: existence and properties of interface object]
     expected: FAIL
 
   [ServiceWorkerGlobalScope interface: attribute onbackgroundfetchclick]
     expected: FAIL
 
+  [BackgroundFetchRecord interface object name]
+    expected: FAIL
+
+  [ServiceWorkerGlobalScope interface: attribute onbackgroundfetchsuccess]
+    expected: FAIL
+
+  [BackgroundFetchUpdateUIEvent interface: existence and properties of interface object]
+    expected: FAIL
+
+  [BackgroundFetchRecord interface: existence and properties of interface object]
+    expected: FAIL
+
+  [BackgroundFetchRecord interface: existence and properties of interface prototype object]
+    expected: FAIL
+
+  [BackgroundFetchRecord interface: existence and properties of interface prototype object's @@unscopables property]
+    expected: FAIL
+
+  [BackgroundFetchRegistration interface: operation match(RequestInfo, CacheQueryOptions)]
+    expected: FAIL
+
+  [BackgroundFetchRecord interface: attribute request]
+    expected: FAIL
+
+  [BackgroundFetchUpdateUIEvent interface: existence and properties of interface prototype object's "constructor" property]
+    expected: FAIL
+
+  [BackgroundFetchUpdateUIEvent interface: existence and properties of interface prototype object]
+    expected: FAIL
+
+  [BackgroundFetchRecord interface: existence and properties of interface prototype object's "constructor" property]
+    expected: FAIL
+
+  [BackgroundFetchUpdateUIEvent interface object length]
+    expected: FAIL
+
+  [BackgroundFetchUpdateUIEvent interface: operation updateUI(BackgroundFetchUIOptions)]
+    expected: FAIL
+
+  [BackgroundFetchEvent interface: attribute registration]
+    expected: FAIL
+
+  [BackgroundFetchRegistration interface: operation matchAll(RequestInfo, CacheQueryOptions)]
+    expected: FAIL
+
+  [BackgroundFetchRegistration interface: attribute failureReason]
+    expected: FAIL
+
+  [BackgroundFetchUpdateUIEvent interface: existence and properties of interface prototype object's @@unscopables property]
+    expected: FAIL
+
+  [BackgroundFetchRecord interface: attribute responseReady]
+    expected: FAIL
+
+  [BackgroundFetchRegistration interface: attribute state]
+    expected: FAIL
+
+  [BackgroundFetchUpdateUIEvent interface object name]
+    expected: FAIL
+
+  [BackgroundFetchRecord interface object length]
+    expected: FAIL
+
 
 [idlharness.https.any.sharedworker.html]
   [BackgroundFetchRegistration interface: attribute activeFetches]
     expected: FAIL
 
   [BackgroundFetchManager interface: existence and properties of interface object]
     expected: FAIL
 
@@ -708,8 +843,44 @@
     expected: FAIL
 
   [BackgroundFetchRegistration interface: attribute id]
     expected: FAIL
 
   [BackgroundFetchRegistration interface: attribute downloadTotal]
     expected: FAIL
 
+  [BackgroundFetchRecord interface object name]
+    expected: FAIL
+
+  [BackgroundFetchRecord interface: existence and properties of interface object]
+    expected: FAIL
+
+  [BackgroundFetchRecord interface: existence and properties of interface prototype object]
+    expected: FAIL
+
+  [BackgroundFetchRecord interface: existence and properties of interface prototype object's @@unscopables property]
+    expected: FAIL
+
+  [BackgroundFetchRegistration interface: operation match(RequestInfo, CacheQueryOptions)]
+    expected: FAIL
+
+  [BackgroundFetchRecord interface: attribute request]
+    expected: FAIL
+
+  [BackgroundFetchRecord interface: existence and properties of interface prototype object's "constructor" property]
+    expected: FAIL
+
+  [BackgroundFetchRegistration interface: operation matchAll(RequestInfo, CacheQueryOptions)]
+    expected: FAIL
+
+  [BackgroundFetchRegistration interface: attribute failureReason]
+    expected: FAIL
+
+  [BackgroundFetchRecord interface: attribute responseReady]
+    expected: FAIL
+
+  [BackgroundFetchRegistration interface: attribute state]
+    expected: FAIL
+
+  [BackgroundFetchRecord interface object length]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/selectors/scope-selector.html.ini
@@ -0,0 +1,7 @@
+[scope-selector.html]
+  [Selecting descendants of shadow root with :scope should work]
+    expected: FAIL
+
+  [Selecting direct child of shadow root with :scope should work]
+    expected: FAIL
+
--- a/testing/web-platform/meta/css/vendor-imports/mozilla/mozilla-central-reftests/images3/object-position-svg-001e.html.ini
+++ b/testing/web-platform/meta/css/vendor-imports/mozilla/mozilla-central-reftests/images3/object-position-svg-001e.html.ini
@@ -1,4 +1,2 @@
 [object-position-svg-001e.html]
-  expected:
-    if not debug and webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): PASS
-    FAIL
+  expected: FAIL
--- a/testing/web-platform/meta/mozilla-sync
+++ b/testing/web-platform/meta/mozilla-sync
@@ -1,2 +1,2 @@
-local: b85b7effe1963bc62cf78b57ee0edbd070fd2cf2
-upstream: 1250e28d664d6e57e829589c71e872b78d3d6d3e
+local: f24cf42797825e1592e2c9ba62a0b2ecd504fcce
+upstream: 412533bbf031caa727d9b2ab67d04fab8d32b9d7
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/service-workers/service-worker/navigation-preload/navigationPreload.https.html.ini
@@ -0,0 +1,4 @@
+[navigationPreload.https.html]
+  [The navigationPreload attribute must return service worker registration's NavigationPreloadManager object.]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/service-workers/service-worker/navigationpreload.https.html.ini
@@ -0,0 +1,4 @@
+[navigationpreload.https.html]
+  [The navigationPreload attribute must return service worker registration's NavigationPreloadManager object.]
+    expected: FAIL
+
--- a/testing/web-platform/meta/svg/idlharness.window.js.ini
+++ b/testing/web-platform/meta/svg/idlharness.window.js.ini
@@ -462,50 +462,35 @@
     expected: FAIL
 
   [SVGElement interface: objects.script must inherit property "correspondingElement" with the proper type]
     expected: FAIL
 
   [SVGElement interface: objects.script must inherit property "correspondingUseElement" with the proper type]
     expected: FAIL
 
-  [SVGAElement interface: attribute download]
-    expected: FAIL
-
-  [SVGAElement interface: attribute rel]
-    expected: FAIL
-
   [SVGAElement interface: attribute relList]
     expected: FAIL
 
-  [SVGAElement interface: attribute hreflang]
-    expected: FAIL
-
-  [SVGAElement interface: attribute type]
-    expected: FAIL
-
-  [SVGAElement interface: objects.a must inherit property "download" with the proper type]
-    expected: FAIL
-
-  [SVGAElement interface: objects.a must inherit property "rel" with the proper type]
-    expected: FAIL
-
-  [SVGAElement interface: objects.a must inherit property "relList" with the proper type]
-    expected: FAIL
-
-  [SVGAElement interface: objects.a must inherit property "hreflang" with the proper type]
-    expected: FAIL
-
-  [SVGAElement interface: objects.a must inherit property "type" with the proper type]
-    expected: FAIL
-
   [SVGElement interface: objects.a must inherit property "correspondingElement" with the proper type]
     expected: FAIL
 
   [SVGElement interface: objects.a must inherit property "correspondingUseElement" with the proper type]
     expected: FAIL
 
   [SVGElement interface: objects.view must inherit property "correspondingElement" with the proper type]
     expected: FAIL
 
   [SVGElement interface: objects.view must inherit property "correspondingUseElement" with the proper type]
     expected: FAIL
 
+  [SVGElement interface: objects.desc must inherit property "correspondingUseElement" with the proper type]
+    expected: FAIL
+
+  [SVGElement interface: objects.switch must inherit property "correspondingUseElement" with the proper type]
+    expected: FAIL
+
+  [SVGElement interface: objects.desc must inherit property "correspondingElement" with the proper type]
+    expected: FAIL
+
+  [SVGElement interface: objects.switch must inherit property "correspondingElement" with the proper type]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/uievents/idlharness.window.js.ini
@@ -0,0 +1,7 @@
+[idlharness.window.html]
+  [InputEvent interface: attribute data]
+    expected: FAIL
+
+  [InputEvent interface: new InputEvent("event") must inherit property "data" with the proper type]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/web-locks/acquire.tentative.https.any.js.ini
@@ -0,0 +1,63 @@
+[acquire.tentative.https.any.html]
+  [Returned Promise rejects if callback throws synchronously]
+    expected: FAIL
+
+  [The 'steal' option must be used with exclusive locks]
+    expected: FAIL
+
+  [The 'signal' and 'ifAvailable' options are mutually exclusive]
+    expected: FAIL
+
+  [navigator.locks.request's returned promise resolves after lock is released]
+    expected: FAIL
+
+  [mode must be "shared" or "exclusive"]
+    expected: FAIL
+
+  [The 'signal' and 'steal' options are mutually exclusive]
+    expected: FAIL
+
+  [navigator.locks.request requires a name and a callback]
+    expected: FAIL
+
+  [The 'steal' and 'ifAvailable' options are mutually exclusive]
+    expected: FAIL
+
+  [callback must be a function]
+    expected: FAIL
+
+  [Returned Promise rejects if callback throws asynchronously]
+    expected: FAIL
+
+
+[acquire.tentative.https.any.worker.html]
+  [Returned Promise rejects if callback throws synchronously]
+    expected: FAIL
+
+  [The 'steal' option must be used with exclusive locks]
+    expected: FAIL
+
+  [The 'signal' and 'ifAvailable' options are mutually exclusive]
+    expected: FAIL
+
+  [navigator.locks.request's returned promise resolves after lock is released]
+    expected: FAIL
+
+  [mode must be "shared" or "exclusive"]
+    expected: FAIL
+
+  [The 'signal' and 'steal' options are mutually exclusive]
+    expected: FAIL
+
+  [navigator.locks.request requires a name and a callback]
+    expected: FAIL
+
+  [The 'steal' and 'ifAvailable' options are mutually exclusive]
+    expected: FAIL
+
+  [callback must be a function]
+    expected: FAIL
+
+  [Returned Promise rejects if callback throws asynchronously]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/web-locks/held.tentative.https.any.js.ini
@@ -0,0 +1,27 @@
+[held.tentative.https.any.html]
+  [callback's result is promisified if not async]
+    expected: FAIL
+
+  [lock is held until callback's returned promise rejects]
+    expected: FAIL
+
+  [lock is held until callback's returned promise resolves]
+    expected: FAIL
+
+  [held lock prevents the same client from acquiring it]
+    expected: FAIL
+
+
+[held.tentative.https.any.worker.html]
+  [callback's result is promisified if not async]
+    expected: FAIL
+
+  [lock is held until callback's returned promise rejects]
+    expected: FAIL
+
+  [lock is held until callback's returned promise resolves]
+    expected: FAIL
+
+  [held lock prevents the same client from acquiring it]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/web-locks/ifAvailable.tentative.https.any.js.ini
@@ -0,0 +1,63 @@
+[ifAvailable.tentative.https.any.html]
+  [Returned Promise rejects if callback throws synchronously]
+    expected: FAIL
+
+  [Shared lock request with ifAvailable - exclusive lock held]
+    expected: FAIL
+
+  [Locks are available once previous release is processed]
+    expected: FAIL
+
+  [Lock request with ifAvailable - lock not available, callback throws]
+    expected: FAIL
+
+  [Exclusive lock request with ifAvailable - shared lock held]
+    expected: FAIL
+
+  [Returned Promise rejects if async callback yields rejected promise]
+    expected: FAIL
+
+  [Lock request with ifAvailable - lock not available]
+    expected: FAIL
+
+  [Lock request with ifAvailable - unrelated lock held]
+    expected: FAIL
+
+  [Shared lock request with ifAvailable - shared lock held]
+    expected: FAIL
+
+  [Lock request with ifAvailable - lock available]
+    expected: FAIL
+
+
+[ifAvailable.tentative.https.any.worker.html]
+  [Returned Promise rejects if callback throws synchronously]
+    expected: FAIL
+
+  [Shared lock request with ifAvailable - exclusive lock held]
+    expected: FAIL
+
+  [Locks are available once previous release is processed]
+    expected: FAIL
+
+  [Lock request with ifAvailable - lock not available, callback throws]
+    expected: FAIL
+
+  [Exclusive lock request with ifAvailable - shared lock held]
+    expected: FAIL
+
+  [Returned Promise rejects if async callback yields rejected promise]
+    expected: FAIL
+
+  [Lock request with ifAvailable - lock not available]
+    expected: FAIL
+
+  [Lock request with ifAvailable - unrelated lock held]
+    expected: FAIL
+
+  [Shared lock request with ifAvailable - shared lock held]
+    expected: FAIL
+
+  [Lock request with ifAvailable - lock available]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/web-locks/lock-attributes.tentative.https.any.js.ini
@@ -0,0 +1,15 @@
+[lock-attributes.tentative.https.any.html]
+  [Lock attributes reflect requested properties (shared)]
+    expected: FAIL
+
+  [Lock attributes reflect requested properties (exclusive)]
+    expected: FAIL
+
+
+[lock-attributes.tentative.https.any.worker.html]
+  [Lock attributes reflect requested properties (shared)]
+    expected: FAIL
+
+  [Lock attributes reflect requested properties (exclusive)]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/web-locks/mode-exclusive.tentative.https.any.js.ini
@@ -0,0 +1,15 @@
+[mode-exclusive.tentative.https.any.html]
+  [Requests for distinct resources can be granted]
+    expected: FAIL
+
+  [Lock requests are granted in order]
+    expected: FAIL
+
+
+[mode-exclusive.tentative.https.any.worker.html]
+  [Requests for distinct resources can be granted]
+    expected: FAIL
+
+  [Lock requests are granted in order]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/web-locks/mode-mixed.tentative.https.any.js.ini
@@ -0,0 +1,9 @@
+[mode-mixed.tentative.https.any.html]
+  [Lock requests are granted in order]
+    expected: FAIL
+
+
+[mode-mixed.tentative.https.any.worker.html]
+  [Lock requests are granted in order]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/web-locks/mode-shared.tentative.https.any.js.ini
@@ -0,0 +1,15 @@
+[mode-shared.tentative.https.any.html]
+  [Shared locks are not exclusive]
+    expected: FAIL
+
+  [Lock requests are granted in order]
+    expected: FAIL
+
+
+[mode-shared.tentative.https.any.worker.html]
+  [Shared locks are not exclusive]
+    expected: FAIL
+
+  [Lock requests are granted in order]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/web-locks/query-empty.tentative.https.any.js.ini
@@ -0,0 +1,9 @@
+[query-empty.tentative.https.any.html]
+  [query() returns dictionary with empty arrays when no locks are held]
+    expected: FAIL
+
+
+[query-empty.tentative.https.any.worker.html]
+  [query() returns dictionary with empty arrays when no locks are held]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/web-locks/query-order.tentative.https.any.js.ini
@@ -0,0 +1,21 @@
+[query-order.tentative.https.any.worker.html]
+  [Held locks appear in state in order granted, including when stolen]
+    expected: FAIL
+
+  [Held locks appear in state in order granted]
+    expected: FAIL
+
+  [Requests appear in state in order made]
+    expected: FAIL
+
+
+[query-order.tentative.https.any.html]
+  [Held locks appear in state in order granted, including when stolen]
+    expected: FAIL
+
+  [Held locks appear in state in order granted]
+    expected: FAIL
+
+  [Requests appear in state in order made]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/web-locks/query.tentative.https.any.js.ini
@@ -0,0 +1,59 @@
+[query.tentative.https.any.html]
+  expected: ERROR
+  [query() reports the same clientId for held locks from the same context]
+    expected: FAIL
+
+  [query() reports held shared locks with appropriate count]
+    expected: FAIL
+
+  [query() returns dictionaries with expected properties]
+    expected: FAIL
+
+  [query() reports individual held locks]
+    expected: FAIL
+
+  [query() can observe a deadlock]
+    expected: NOTRUN
+
+  [query() reports pending shared locks with appropriate count]
+    expected: FAIL
+
+  [query() reports different ids for held locks from different contexts]
+    expected: TIMEOUT
+
+  [query() reports pending and held locks]
+    expected: FAIL
+
+  [query() reports multiple held locks]
+    expected: FAIL
+
+
+[query.tentative.https.any.worker.html]
+  expected: ERROR
+  [query() reports the same clientId for held locks from the same context]
+    expected: FAIL
+
+  [query() reports held shared locks with appropriate count]
+    expected: FAIL
+
+  [query() returns dictionaries with expected properties]
+    expected: FAIL
+
+  [query() reports individual held locks]
+    expected: FAIL
+
+  [query() can observe a deadlock]
+    expected: NOTRUN
+
+  [query() reports pending shared locks with appropriate count]
+    expected: FAIL
+
+  [query() reports different ids for held locks from different contexts]
+    expected: TIMEOUT
+
+  [query() reports pending and held locks]
+    expected: FAIL
+
+  [query() reports multiple held locks]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/web-locks/resource-names.tentative.https.any.js.ini
@@ -0,0 +1,51 @@
+[resource-names.tentative.https.any.html]
+  [Resource names that are not valid UTF-16 are not mangled]
+    expected: FAIL
+
+  [DOMString: 0xDC00]
+    expected: FAIL
+
+  [DOMString: 0xFFFF]
+    expected: FAIL
+
+  [Names cannot start with "-"]
+    expected: FAIL
+
+  [DOMString: ]
+    expected: FAIL
+
+  [DOMString: 0xD800]
+    expected: FAIL
+
+  [DOMString: 0x61 0x62 0x63 0x0 0x64 0x65 0x66]
+    expected: FAIL
+
+  [DOMString: 0xDC00 0xD800]
+    expected: FAIL
+
+
+[resource-names.tentative.https.any.worker.html]
+  [Resource names that are not valid UTF-16 are not mangled]
+    expected: FAIL
+
+  [DOMString: 0xDC00]
+    expected: FAIL
+
+  [DOMString: 0xFFFF]
+    expected: FAIL
+
+  [Names cannot start with "-"]
+    expected: FAIL
+
+  [DOMString: ]
+    expected: FAIL
+
+  [DOMString: 0xD800]
+    expected: FAIL
+
+  [DOMString: 0x61 0x62 0x63 0x0 0x64 0x65 0x66]
+    expected: FAIL
+
+  [DOMString: 0xDC00 0xD800]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/web-locks/secure-context.tentative.https.any.js.ini
@@ -0,0 +1,9 @@
+[secure-context.tentative.https.any.html]
+  [API presence in secure contexts]
+    expected: FAIL
+
+
+[secure-context.tentative.https.any.worker.html]
+  [API presence in secure contexts]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/web-locks/signal.tentative.https.any.js.ini
@@ -0,0 +1,51 @@
+[signal.tentative.https.any.html]
+  [The signal option must be an AbortSignal]
+    expected: FAIL
+
+  [Abort after a timeout]
+    expected: FAIL
+
+  [Passing an already aborted signal aborts]
+    expected: FAIL
+
+  [Synchronously signaled abort]
+    expected: FAIL
+
+  [Abort signaled after lock released]
+    expected: FAIL
+
+  [Signal that is not aborted]
+    expected: FAIL
+
+  [Abort signaled after lock granted]
+    expected: FAIL
+
+  [An aborted request results in AbortError]
+    expected: FAIL
+
+
+[signal.tentative.https.any.worker.html]
+  [The signal option must be an AbortSignal]
+    expected: FAIL
+
+  [Abort after a timeout]
+    expected: FAIL
+
+  [Passing an already aborted signal aborts]
+    expected: FAIL
+
+  [Synchronously signaled abort]
+    expected: FAIL
+
+  [Abort signaled after lock released]
+    expected: FAIL
+
+  [Signal that is not aborted]
+    expected: FAIL
+
+  [Abort signaled after lock granted]
+    expected: FAIL
+
+  [An aborted request results in AbortError]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/web-locks/steal.tentative.https.any.js.ini
@@ -0,0 +1,33 @@
+[steal.tentative.https.any.worker.html]
+  [Broken lock's release promise rejects]
+    expected: FAIL
+
+  [Lock not available]
+    expected: FAIL
+
+  [Requested lock's release promise is deferred]
+    expected: FAIL
+
+  [Lock available]
+    expected: FAIL
+
+  [Last caller wins]
+    expected: FAIL
+
+
+[steal.tentative.https.any.html]
+  [Broken lock's release promise rejects]
+    expected: FAIL
+
+  [Lock not available]
+    expected: FAIL
+
+  [Requested lock's release promise is deferred]
+    expected: FAIL
+
+  [Lock available]
+    expected: FAIL
+
+  [Last caller wins]
+    expected: FAIL
+
--- a/testing/web-platform/tests/background-fetch/fetch.https.window.js
+++ b/testing/web-platform/tests/background-fetch/fetch.https.window.js
@@ -69,16 +69,16 @@ backgroundFetchTest(async (test, backgro
 
   assert_equals(registration.id, registrationId);
   assert_equals(registration.uploadTotal, 0);
   assert_equals(registration.uploaded, 0);
   assert_equals(registration.downloadTotal, 0);
   // Skip `downloaded`, as the transfer may have started already.
 
   const {type, results} = await getMessageFromServiceWorker();
-  assert_equals('backgroundfetched', type);
+  assert_equals('backgroundfetchsuccess', type);
   assert_equals(results.length, 1);
 
   assert_true(results[0].url.includes('resources/feature-name.txt'));
   assert_equals(results[0].status, 200);
   assert_equals(results[0].text, 'Background Fetch');
 
 }, 'Using Background Fetch to successfully fetch a single resource');
--- a/testing/web-platform/tests/background-fetch/service_workers/sw-update-ui.js
+++ b/testing/web-platform/tests/background-fetch/service_workers/sw-update-ui.js
@@ -1,22 +1,22 @@
 importScripts('sw-helpers.js');
 
 async function updateUI(event) {
   let updateParams = [];
-  switch (event.id) {
+  switch (event.registration.id) {
     case 'update-once':
       updateParams = [{title: 'Title1'}];
       break;
     case 'update-twice':
       updateParams = [{title: 'Title1'}, {title: 'Title2'}];
       break;
   }
 
   return Promise.all(updateParams.map(param => event.updateUI(param)))
            .then(() => 'update success')
            .catch(e => e.message);
 }
 
-self.addEventListener('backgroundfetched', event => {
+self.addEventListener('backgroundfetchsuccess', event => {
   event.waitUntil(updateUI(event)
       .then(update => sendMessageToDocument({ type: event.type, update })))
 });
--- a/testing/web-platform/tests/background-fetch/service_workers/sw.js
+++ b/testing/web-platform/tests/background-fetch/service_workers/sw.js
@@ -1,19 +1,20 @@
+
 importScripts('sw-helpers.js');
 
 async function getFetchResult(settledFetch) {
   if (!settledFetch.response)
     return Promise.resolve(null);
 
   return {
     url: settledFetch.response.url,
     status: settledFetch.response.status,
     text: await settledFetch.response.text(),
   };
 }
 
-self.addEventListener('backgroundfetched', event => {
+self.addEventListener('backgroundfetchsuccess', event => {
   event.waitUntil(
     event.fetches.values()
       .then(fetches => Promise.all(fetches.map(fetch => getFetchResult(fetch))))
       .then(results => sendMessageToDocument({ type: event.type, results })));
 });
--- a/testing/web-platform/tests/background-fetch/update-ui.https.window.js
+++ b/testing/web-platform/tests/background-fetch/update-ui.https.window.js
@@ -1,13 +1,13 @@
 // META: script=/service-workers/service-worker/resources/test-helpers.sub.js
 // META: script=resources/utils.js
 'use strict';
 
-// Covers functionality provided by BackgroundFetchUpdateEvent.updateUI().
+// Covers functionality provided by BackgroundFetchUpdateUIEvent.updateUI().
 //
 // https://wicg.github.io/background-fetch/#backgroundfetchupdateuievent
 
 const swName = 'sw-update-ui.js';
 
 backgroundFetchTest(async (test, backgroundFetch) => {
   const registrationId = 'update-once';
   const registration =
--- a/testing/web-platform/tests/css/compositing/parsing/background-blend-mode-invalid.html
+++ b/testing/web-platform/tests/css/compositing/parsing/background-blend-mode-invalid.html
@@ -3,17 +3,17 @@
 <head>
 <meta charset="utf-8">
 <title>Compositing and Blending Level 1: parsing background-blend-mode with invalid values</title>
 <link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
 <link rel="help" href="https://drafts.fxtf.org/compositing-1/#propdef-background-blend-mode">
 <meta name="assert" content="background-blend-mode supports only the grammar '<blend-mode>#'.">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
-<script src="resources/parsing-testcommon.js"></script>
+<script src="../support/parsing-testcommon.js"></script>
 </head>
 <body>
 <script>
 test_invalid_value("background-blend-mode", "auto");
 test_invalid_value("background-blend-mode", "normal luminosity");
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/compositing/parsing/background-blend-mode-valid.html
+++ b/testing/web-platform/tests/css/compositing/parsing/background-blend-mode-valid.html
@@ -3,17 +3,17 @@
 <head>
 <meta charset="utf-8">
 <title>Compositing and Blending Level 1: parsing background-blend-mode with valid values</title>
 <link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
 <link rel="help" href="https://drafts.fxtf.org/compositing-1/#propdef-background-blend-mode">
 <meta name="assert" content="background-blend-mode supports the full grammar '<blend-mode>#'.">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
-<script src="resources/parsing-testcommon.js"></script>
+<script src="../support/parsing-testcommon.js"></script>
 </head>
 <body>
 <script>
 test_valid_value("background-blend-mode", "normal");
 test_valid_value("background-blend-mode", "multiply");
 test_valid_value("background-blend-mode", "screen");
 test_valid_value("background-blend-mode", "overlay");
 test_valid_value("background-blend-mode", "darken");
--- a/testing/web-platform/tests/css/compositing/parsing/isolation-invalid.html
+++ b/testing/web-platform/tests/css/compositing/parsing/isolation-invalid.html