Merge m-i to m-c, a=merge
authorPhil Ringnalda <philringnalda@gmail.com>
Sat, 04 Feb 2017 17:05:50 -0800
changeset 340831 3e555770a90a41e04bbb4ac41b65fa2f1db6977d
parent 340813 e581572bc9c128df28d3f97698d83f9b3c459da5 (current diff)
parent 340830 f3f57723b3c9f9abdda1f0928d95ef9c48bf5a52 (diff)
child 340832 f0b998eadc35e59608dd82cebbdf891a26f187f2
child 340834 b46165a0e3d6a5b6c988e8b9cc552a491e50b577
child 340838 e9d8a75a0dcceedeaabf2924bcf8459db2da01f5
child 342199 ae8db963d2f4a0a6930945cc53d1d7ef48c85097
push id31312
push userphilringnalda@gmail.com
push dateSun, 05 Feb 2017 01:06:50 +0000
treeherdermozilla-central@3e555770a90a [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone54.0a1
first release with
nightly linux32
3e555770a90a / 54.0a1 / 20170205110539 / files
nightly linux64
3e555770a90a / 54.0a1 / 20170205110539 / files
nightly mac
3e555770a90a / 54.0a1 / 20170205030206 / files
nightly win32
3e555770a90a / 54.0a1 / 20170205030206 / files
nightly win64
3e555770a90a / 54.0a1 / 20170205030206 / 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 m-i to m-c, a=merge
js/src/jit/ExecutableAllocatorPosix.cpp
js/src/jit/ExecutableAllocatorWin.cpp
mobile/android/geckoview/src/main/java/org/mozilla/gecko/GeckoViewContent.java
--- a/accessible/interfaces/gecko/IGeckoCustom.idl
+++ b/accessible/interfaces/gecko/IGeckoCustom.idl
@@ -9,16 +9,17 @@ import "oaidl.idl";
 
 [object, uuid(7510360f-cdae-4de9-88c8-d167eda62afc)]
 interface IGeckoCustom : IUnknown
 {
   [propget] HRESULT ID([out, retval] unsigned __int64* aID);
   [propget] HRESULT anchorCount([out, retval] long* aCount);
   [propget] HRESULT DOMNodeID([out, retval] BSTR* aID);
   [propget] HRESULT minimumIncrement([out, retval] double* aIncrement);
+  [propget] HRESULT mozState([out, retval] unsigned __int64* aState);
 }
 
 
 [
     uuid(55769d85-f830-4d76-9e39-3670914a28f7),
     helpstring("private custom gecko interfaces")
 ]
 library IGeckoCustom
--- a/accessible/ipc/win/ProxyAccessible.cpp
+++ b/accessible/ipc/win/ProxyAccessible.cpp
@@ -188,28 +188,27 @@ ProxyAccessible::Description(nsString& a
     return;
   }
   aDesc = (wchar_t*)resultWrap;
 }
 
 uint64_t
 ProxyAccessible::State() const
 {
-  uint64_t state = 0;
-  RefPtr<IAccessible> acc;
-  if (!GetCOMInterface((void**)getter_AddRefs(acc))) {
-    return state;
+  RefPtr<IGeckoCustom> custom = QueryInterface<IGeckoCustom>(this);
+  if (!custom) {
+    return 0;
   }
 
-  VARIANT varState;
-  HRESULT hr = acc->get_accState(kChildIdSelf, &varState);
+  uint64_t state;
+  HRESULT hr = custom->get_mozState(&state);
   if (FAILED(hr)) {
-    return state;
+    return 0;
   }
-  return uint64_t(varState.lVal);
+  return state;
 }
 
 nsIntRect
 ProxyAccessible::Bounds()
 {
   nsIntRect rect;
 
   RefPtr<IAccessible> acc;
--- a/accessible/windows/msaa/GeckoCustom.cpp
+++ b/accessible/windows/msaa/GeckoCustom.cpp
@@ -45,8 +45,15 @@ GeckoCustom::get_ID(uint64_t* aID)
 }
 
 STDMETHODIMP
 GeckoCustom::get_minimumIncrement(double* aIncrement)
 {
   *aIncrement = mAcc->Step();
   return S_OK;
 }
+
+STDMETHODIMP
+GeckoCustom::get_mozState(uint64_t* aState)
+{
+  *aState = mAcc->State();
+  return S_OK;
+}
--- a/accessible/windows/msaa/GeckoCustom.h
+++ b/accessible/windows/msaa/GeckoCustom.h
@@ -25,16 +25,17 @@ public:
 
   // IUnknown
   DECL_IUNKNOWN
 
   virtual STDMETHODIMP get_anchorCount(long* aCount);
   virtual STDMETHODIMP get_DOMNodeID(BSTR* aID);
   virtual STDMETHODIMP get_ID(uint64_t* aID);
   virtual STDMETHODIMP get_minimumIncrement(double* aIncrement);
+  virtual STDMETHODIMP get_mozState(uint64_t* aState);
 
 private:
   GeckoCustom() = delete;
   GeckoCustom& operator =(const GeckoCustom&) = delete;
   GeckoCustom(const GeckoCustom&) = delete;
   GeckoCustom(GeckoCustom&&) = delete;
   GeckoCustom& operator=(GeckoCustom&&) = delete;
 
--- a/addon-sdk/source/python-lib/cuddlefish/prefs.py
+++ b/addon-sdk/source/python-lib/cuddlefish/prefs.py
@@ -228,15 +228,14 @@ DEFAULT_TEST_PREFS = {
     # download test runs first doesn't show the popup inconsistently.
     'browser.download.panel.shown': True,
     # Assume the about:newtab page's intro panels have been shown to not depend on
     # which test runs first and happens to open about:newtab
     'browser.newtabpage.introShown': True,
     # Disable useragent updates.
     'general.useragent.updates.enabled': False,
     'media.eme.enabled': True,
-    'media.eme.apiVisible': True,
-    # Don't forceably kill content processes after a timeout
+    # Don't forcibly kill content processes after a timeout
     'dom.ipc.tabs.shutdownTimeoutSecs': 0,
     'general.useragent.locale': "en-US",
     'intl.locale.matchOS': "en-US",
     'dom.indexedDB.experimental': True
 }
--- a/addon-sdk/source/test/preferences/test.json
+++ b/addon-sdk/source/test/preferences/test.json
@@ -32,14 +32,13 @@
   "layout.css.grid.enabled": true,
   "layout.spammy_warnings.enabled": false,
   "network.http.bypass-cachelock-threshold": 200000,
   "geo.provider.testing": true,
   "browser.pagethumbnails.capturing_disabled": true,
   "browser.download.panel.shown": true,
   "general.useragent.updates.enabled": false,
   "media.eme.enabled": true,
-  "media.eme.apiVisible": true,
   "dom.ipc.tabs.shutdownTimeoutSecs": 0,
   "general.useragent.locale": "en-US",
   "intl.locale.matchOS": "en-US",
   "dom.indexedDB.experimental": true
 }
--- a/b2g/app/b2g.js
+++ b/b2g/app/b2g.js
@@ -319,17 +319,16 @@ pref("media.cache_readahead_limit", 30);
 
 #ifdef MOZ_FMP4
 // Enable/Disable Gonk Decoder Module
 pref("media.gonk.enabled", true);
 #endif
 
 //Encrypted media extensions.
 pref("media.eme.enabled", true);
-pref("media.eme.apiVisible", true);
 // The default number of decoded video frames that are enqueued in
 // MediaDecoderReader's mVideoQueue.
 pref("media.video-queue.default-size", 3);
 
 // optimize images' memory usage
 pref("image.downscale-during-decode.enabled", true);
 pref("image.mem.allow_locking_in_content_processes", true);
 // Limit the surface cache to 1/8 of main memory or 128MB, whichever is smaller.
--- a/browser/app/profile/firefox.js
+++ b/browser/app/profile/firefox.js
@@ -1371,17 +1371,16 @@ pref("ui.key.menuAccessKeyFocuses", true
 // users on an open source operating systems didn't opt into. The first
 // time a site using EME is encountered, the user will be prompted to
 // enable DRM, whereupon the EME plugin binaries will be downloaded if
 // permission is granted.
 pref("media.eme.enabled", false);
 #else
 pref("media.eme.enabled", true);
 #endif
-pref("media.eme.apiVisible", true);
 
 // Whether we should run a test-pattern through EME GMPs before assuming they'll
 // decode H.264.
 pref("media.gmp.trial-create.enabled", true);
 
 // Note: when media.gmp-*.visible is true, provided we're running on a
 // supported platform/OS version, the corresponding CDM appears in the
 // plugins list, Firefox will download the GMP/CDM if enabled, and our
--- a/browser/components/contextualidentity/test/browser/browser_eme.js
+++ b/browser/components/contextualidentity/test/browser/browser_eme.js
@@ -81,17 +81,16 @@ function generateKeyInfo(aData) {
   return keyInfo;
 }
 
 add_task(function* setup() {
   // Make sure userContext is enabled.
   yield SpecialPowers.pushPrefEnv({"set": [
     [ "privacy.userContext.enabled", true ],
     [ "media.mediasource.enabled", true ],
-    [ "media.eme.apiVisible", true ],
     [ "media.mediasource.webm.enabled", true ],
     [ "media.clearkey.persistent-license.enabled", true ],
   ]});
 });
 
 add_task(function* test() {
   // Open a tab with the default container.
   let defaultContainer = yield openTabInUserContext(TEST_URL + "empty_file.html", USER_ID_DEFAULT);
--- a/browser/components/contextualidentity/test/browser/browser_forgetAPI_EME_forgetThisSite.js
+++ b/browser/components/contextualidentity/test/browser/browser_forgetAPI_EME_forgetThisSite.js
@@ -174,17 +174,16 @@ function* checkEMEKey(browser, emeSessio
 // Test functions.
 //
 
 add_task(function* setup() {
   // Make sure userContext is enabled.
   yield SpecialPowers.pushPrefEnv({"set": [
       [ "privacy.userContext.enabled", true ],
       [ "media.mediasource.enabled", true ],
-      [ "media.eme.apiVisible", true ],
       [ "media.mediasource.webm.enabled", true ],
       [ "media.clearkey.persistent-license.enabled", true ],
   ]});
 });
 
 add_task(function* test_EME_forgetThisSite() {
   let tabs = [];
   let emeSessionIds = [];
--- a/browser/locales/search/list.json
+++ b/browser/locales/search/list.json
@@ -1,31 +1,53 @@
 {
   "default": {
     "visibleDefaultEngines": [
       "google", "yahoo", "amazondotcom", "bing", "ddg", "twitter", "wikipedia"
     ]
   },
+  "regionOverrides": {
+    "US": {
+      "google": "google-nocodes"
+    },
+    "CA": {
+      "google": "google-nocodes"
+    },
+    "KZ": {
+      "google": "google-nocodes"
+    },
+    "BY": {
+      "google": "google-nocodes"
+    },
+    "RU": {
+      "google": "google-nocodes"
+    },
+    "TR": {
+      "google": "google-nocodes"
+    },
+    "UA": {
+      "google": "google-nocodes"
+    },
+    "CN": {
+      "google": "google-nocodes"
+    },
+    "TW": {
+      "google": "google-nocodes"
+    },
+    "HK": {
+      "google": "google-nocodes"
+    }
+  },
   "locales": {
     "en-US": {
       "default": {
         "visibleDefaultEngines": [
           "google", "yahoo", "amazondotcom", "bing", "ddg", "twitter", "wikipedia"
         ]
       },
-      "US": {
-        "visibleDefaultEngines": [
-          "yahoo", "google-nocodes", "bing", "amazondotcom", "ddg", "twitter", "wikipedia"
-        ]
-      },
-      "CA": {
-        "visibleDefaultEngines": [
-          "google-nocodes", "yahoo", "bing", "amazondotcom", "ddg", "twitter", "wikipedia"
-        ]
-      },
       "experimental-hidden": {
         "visibleDefaultEngines": [
           "yahoo-en-CA"
         ]
       }
     },
     "ach": {
       "default": {
@@ -391,41 +413,16 @@
         ]
       }
     },
     "kk": {
       "default": {
         "visibleDefaultEngines": [
           "yandex-kk", "google", "ddg", "flip", "kaz-kk", "twitter", "wikipedia-kk"
         ]
-      },
-      "KZ": {
-        "visibleDefaultEngines": [
-          "yandex-kk", "google-nocodes", "ddg", "flip", "kaz-kk", "twitter", "wikipedia-kk"
-        ]
-      },
-      "BY": {
-        "visibleDefaultEngines": [
-          "yandex-kk", "google-nocodes", "ddg", "flip", "kaz-kk", "twitter", "wikipedia-kk"
-        ]
-      },
-      "RU": {
-        "visibleDefaultEngines": [
-          "yandex-kk", "google-nocodes", "ddg", "flip", "kaz-kk", "twitter", "wikipedia-kk"
-        ]
-      },
-      "TR": {
-        "visibleDefaultEngines": [
-          "yandex-kk", "google-nocodes", "ddg", "flip", "kaz-kk", "twitter", "wikipedia-kk"
-        ]
-      },
-      "UA": {
-        "visibleDefaultEngines": [
-          "yandex-kk", "google-nocodes", "ddg", "flip", "kaz-kk", "twitter", "wikipedia-kk"
-        ]
       }
     },
     "km": {
       "default": {
         "visibleDefaultEngines": [
           "google", "yahoo", "bing", "amazondotcom", "ddg", "twitter", "wikipedia-km"
         ]
       }
@@ -591,41 +588,16 @@
         ]
       }
     },
     "ru": {
       "default": {
         "visibleDefaultEngines": [
           "yandex-ru", "google", "ddg", "ozonru", "priceru", "wikipedia-ru", "mailru"
         ]
-      },
-      "RU": {
-        "visibleDefaultEngines": [
-          "yandex-ru", "google-nocodes", "ddg", "ozonru", "priceru", "wikipedia-ru", "mailru"
-        ]
-      },
-      "BY": {
-        "visibleDefaultEngines": [
-          "yandex-ru", "google-nocodes", "ddg", "ozonru", "priceru", "wikipedia-ru", "mailru"
-        ]
-      },
-      "KZ": {
-        "visibleDefaultEngines": [
-          "yandex-ru", "google-nocodes", "ddg", "ozonru", "priceru", "wikipedia-ru", "mailru"
-        ]
-      },
-      "TR": {
-        "visibleDefaultEngines": [
-          "yandex-ru", "google-nocodes", "ddg", "ozonru", "priceru", "wikipedia-ru", "mailru"
-        ]
-      },
-      "UA": {
-        "visibleDefaultEngines": [
-          "yandex-ru", "google-nocodes", "ddg", "ozonru", "priceru", "wikipedia-ru", "mailru"
-        ]
       }
     },
     "si": {
       "default": {
         "visibleDefaultEngines": [
           "google", "yahoo", "amazondotcom", "ddg", "wikipedia-si"
         ]
       }
@@ -700,73 +672,23 @@
         ]
       }
     },
     "tr": {
       "default": {
         "visibleDefaultEngines": [
           "yandex-tr", "google", "ddg", "twitter", "wikipedia-tr"
         ]
-      },
-      "TR": {
-        "visibleDefaultEngines": [
-          "yandex-tr", "google-nocodes", "ddg", "twitter", "wikipedia-tr"
-        ]
-      },
-      "BY": {
-        "visibleDefaultEngines": [
-          "yandex-tr", "google-nocodes", "ddg", "twitter", "wikipedia-tr"
-        ]
-      },
-      "KZ": {
-        "visibleDefaultEngines": [
-          "yandex-tr", "google-nocodes", "ddg", "twitter", "wikipedia-tr"
-        ]
-      },
-      "RU": {
-        "visibleDefaultEngines": [
-          "yandex-tr", "google-nocodes", "ddg", "twitter", "wikipedia-tr"
-        ]
-      },
-      "UA": {
-        "visibleDefaultEngines": [
-          "yandex-tr", "google-nocodes", "ddg", "twitter", "wikipedia-tr"
-        ]
       }
     },
     "uk": {
       "default": {
         "visibleDefaultEngines": [
           "google", "yandex-uk", "meta-ua", "ddg", "wikipedia-uk", "metamarket"
         ]
-      },
-      "UA": {
-        "visibleDefaultEngines": [
-          "google-nocodes", "yandex-uk", "meta-ua", "ddg", "wikipedia-uk", "metamarket"
-        ]
-      },
-      "TR": {
-        "visibleDefaultEngines": [
-          "google-nocodes", "yandex-uk", "meta-ua", "ddg", "wikipedia-uk", "metamarket"
-        ]
-      },
-      "BY": {
-        "visibleDefaultEngines": [
-          "google-nocodes", "yandex-uk", "meta-ua", "ddg", "wikipedia-uk", "metamarket"
-        ]
-      },
-      "KZ": {
-        "visibleDefaultEngines": [
-          "google-nocodes", "yandex-uk", "meta-ua", "ddg", "wikipedia-uk", "metamarket"
-        ]
-      },
-      "RU": {
-        "visibleDefaultEngines": [
-          "google-nocodes", "yandex-uk", "meta-ua", "ddg", "wikipedia-uk", "metamarket"
-        ]
       }
     },
     "ur": {
       "default": {
         "visibleDefaultEngines": [
           "google", "yahoo-in", "bing", "amazon-in", "ddg", "twitter", "wikipedia-ur"
         ]
       }
@@ -806,22 +728,12 @@
         ]
       }
     },
     "zh-TW": {
       "default": {
         "visibleDefaultEngines": [
           "yahoo-zh-TW", "google", "ddg", "findbook-zh-TW", "wikipedia-zh-TW", "yahoo-zh-TW-HK", "yahoo-bid-zh-TW", "yahoo-answer-zh-TW"
         ]
-      },
-      "TW": {
-        "visibleDefaultEngines": [
-          "yahoo-zh-TW", "google-nocodes", "ddg", "findbook-zh-TW", "wikipedia-zh-TW", "yahoo-zh-TW-HK", "yahoo-bid-zh-TW", "yahoo-answer-zh-TW"
-        ]
-      },
-      "HK": {
-        "visibleDefaultEngines": [
-          "yahoo-zh-TW-HK", "google-nocodes", "ddg", "findbook-zh-TW", "wikipedia-zh-TW", "yahoo-zh-TW", "yahoo-bid-zh-TW", "yahoo-answer-zh-TW"
-        ]
       }
     }
   }
 }
--- a/dom/media/test/eme.js
+++ b/dom/media/test/eme.js
@@ -449,17 +449,16 @@ function SetupEME(test, token, params)
     }
   });
   return v;
 }
 
 function SetupEMEPref(callback) {
   var prefs = [
     [ "media.mediasource.enabled", true ],
-    [ "media.eme.apiVisible", true ],
     [ "media.mediasource.webm.enabled", true ],
   ];
 
   if (SpecialPowers.Services.appinfo.name == "B2G" ||
       !manifestVideo().canPlayType("video/mp4")) {
     // XXX remove once we have mp4 PlatformDecoderModules on all platforms.
     prefs.push([ "media.use-blank-decoder", true ]);
   }
--- a/dom/webidl/HTMLMediaElement.webidl
+++ b/dom/webidl/HTMLMediaElement.webidl
@@ -152,27 +152,24 @@ partial interface HTMLMediaElement {
   attribute EventHandler onmozinterruptbegin;
 
   [Pref="media.useAudioChannelAPI"]
   attribute EventHandler onmozinterruptend;
 };
 
 // Encrypted Media Extensions
 partial interface HTMLMediaElement {
-  [Pref="media.eme.apiVisible"]
   readonly attribute MediaKeys? mediaKeys;
 
   // void, not any: https://www.w3.org/Bugs/Public/show_bug.cgi?id=26457
-  [Pref="media.eme.apiVisible", NewObject]
+  [NewObject]
   Promise<void> setMediaKeys(MediaKeys? mediaKeys);
 
-  [Pref="media.eme.apiVisible"]
   attribute EventHandler onencrypted;
 
-  [Pref="media.eme.apiVisible"]
   attribute EventHandler onwaitingforkey;
 };
 
 // This is just for testing
 partial interface HTMLMediaElement {
   [Pref="media.useAudioChannelService.testing"]
   readonly attribute double computedVolume;
   [Pref="media.useAudioChannelService.testing"]
--- a/dom/webidl/MediaEncryptedEvent.webidl
+++ b/dom/webidl/MediaEncryptedEvent.webidl
@@ -5,17 +5,17 @@
  *
  * The origin of this IDL file is
  * https://dvcs.w3.org/hg/html-media/raw-file/default/encrypted-media/encrypted-media.html
  *
  * Copyright © 2014 W3C® (MIT, ERCIM, Keio, Beihang), All Rights Reserved.
  * W3C liability, trademark and document use rules apply.
  */
 
-[Pref="media.eme.apiVisible", Constructor(DOMString type, optional MediaKeyNeededEventInit eventInitDict)]
+[Constructor(DOMString type, optional MediaKeyNeededEventInit eventInitDict)]
 interface MediaEncryptedEvent : Event {
   readonly attribute DOMString initDataType;
   [Throws]
   readonly attribute ArrayBuffer? initData;
 };
 
 dictionary MediaKeyNeededEventInit : EventInit {
   DOMString initDataType = "";
--- a/dom/webidl/MediaKeyError.webidl
+++ b/dom/webidl/MediaKeyError.webidl
@@ -8,12 +8,11 @@
  *
  * Copyright © 2014 W3C® (MIT, ERCIM, Keio, Beihang), All Rights Reserved.
  * W3C liability, trademark and document use rules apply.
  */
 
 // According to the spec, "The future of error events and MediaKeyError
 // is uncertain."
 // https://www.w3.org/Bugs/Public/show_bug.cgi?id=21798
-[Pref="media.eme.apiVisible"]
 interface MediaKeyError : Event {
   readonly attribute unsigned long systemCode;
 };
--- a/dom/webidl/MediaKeyMessageEvent.webidl
+++ b/dom/webidl/MediaKeyMessageEvent.webidl
@@ -12,17 +12,17 @@
 
 enum MediaKeyMessageType {
   "license-request",
   "license-renewal",
   "license-release",
   "individualization-request"
 };
 
-[Pref="media.eme.apiVisible", Constructor(DOMString type, MediaKeyMessageEventInit eventInitDict)]
+[Constructor(DOMString type, MediaKeyMessageEventInit eventInitDict)]
 interface MediaKeyMessageEvent : Event {
   readonly attribute MediaKeyMessageType messageType;
   [Throws]
   readonly attribute ArrayBuffer message;
 };
 
 dictionary MediaKeyMessageEventInit : EventInit {
   required MediaKeyMessageType messageType;
--- a/dom/webidl/MediaKeySession.webidl
+++ b/dom/webidl/MediaKeySession.webidl
@@ -5,17 +5,16 @@
  *
  * The origin of this IDL file is
  * https://dvcs.w3.org/hg/html-media/raw-file/default/encrypted-media/encrypted-media.html
  *
  * Copyright © 2014 W3C® (MIT, ERCIM, Keio, Beihang), All Rights Reserved.
  * W3C liability, trademark and document use rules apply.
  */
 
-[Pref="media.eme.apiVisible"]
 interface MediaKeySession : EventTarget {
   // error state
   readonly attribute MediaKeyError? error;
 
   // session properties
   readonly attribute DOMString sessionId;
 
   readonly attribute unrestricted double expiration;
--- a/dom/webidl/MediaKeyStatusMap.webidl
+++ b/dom/webidl/MediaKeyStatusMap.webidl
@@ -15,16 +15,15 @@ enum MediaKeyStatus {
   "expired",
   "released",
   "output-restricted",
   "output-downscaled",
   "status-pending",
   "internal-error"
 };
 
-[Pref="media.eme.apiVisible"]
 interface MediaKeyStatusMap {
   iterable<ArrayBuffer,MediaKeyStatus>;
   readonly attribute unsigned long size;
   boolean has (BufferSource keyId);
   [Throws]
   any get (BufferSource keyId);
 };
--- a/dom/webidl/MediaKeySystemAccess.webidl
+++ b/dom/webidl/MediaKeySystemAccess.webidl
@@ -26,16 +26,15 @@ dictionary MediaKeySystemConfiguration {
   sequence<DOMString>                     initDataTypes = [];
   sequence<MediaKeySystemMediaCapability> audioCapabilities = [];
   sequence<MediaKeySystemMediaCapability> videoCapabilities = [];
   MediaKeysRequirement                    distinctiveIdentifier = "optional";
   MediaKeysRequirement                    persistentState = "optional";
   sequence<DOMString>                     sessionTypes;
 };
 
-[Pref="media.eme.apiVisible"]
 interface MediaKeySystemAccess {
   readonly    attribute DOMString keySystem;
   [NewObject]
   MediaKeySystemConfiguration getConfiguration();
   [NewObject]
   Promise<MediaKeys> createMediaKeys();
 };
--- a/dom/webidl/MediaKeys.webidl
+++ b/dom/webidl/MediaKeys.webidl
@@ -13,17 +13,16 @@
 // Note: "persistent-usage-record" session type is unsupported yet, as
 // it's marked as "at risk" in the spec, and Chrome doesn't support it. 
 enum MediaKeySessionType {
   "temporary",
   "persistent-license",
   // persistent-usage-record,
 };
 
-[Pref="media.eme.apiVisible"]
 interface MediaKeys {
   readonly attribute DOMString keySystem;
 
   [NewObject, Throws]
   MediaKeySession createSession(optional MediaKeySessionType sessionType = "temporary");
 
   [NewObject]
   Promise<void> setServerCertificate((ArrayBufferView or ArrayBuffer) serverCertificate);
--- a/dom/webidl/Navigator.webidl
+++ b/dom/webidl/Navigator.webidl
@@ -359,17 +359,17 @@ partial interface Navigator {
 };
 
 partial interface Navigator {
   [NewObject, Func="mozilla::dom::TCPSocket::ShouldTCPSocketExist"]
   readonly attribute LegacyMozTCPSocket mozTCPSocket;
 };
 
 partial interface Navigator {
-  [Pref="media.eme.apiVisible", NewObject]
+  [NewObject]
   Promise<MediaKeySystemAccess>
   requestMediaKeySystemAccess(DOMString keySystem,
                               sequence<MediaKeySystemConfiguration> supportedConfigurations);
 };
 
 #ifdef NIGHTLY_BUILD
 partial interface Navigator {
   [Func="Navigator::IsE10sEnabled"]
--- a/js/src/builtin/Array.js
+++ b/js/src/builtin/Array.js
@@ -48,17 +48,17 @@ function ArrayIndexOf(searchElement/*, f
     }
 
     /* Step 10. */
     return -1;
 }
 
 function ArrayStaticIndexOf(list, searchElement/*, fromIndex*/) {
     if (arguments.length < 1)
-        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'Array.indexOf');
+        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "Array.indexOf");
     var fromIndex = arguments.length > 2 ? arguments[2] : 0;
     return callFunction(ArrayIndexOf, list, searchElement, fromIndex);
 }
 
 /* ES5 15.4.4.15. */
 function ArrayLastIndexOf(searchElement/*, fromIndex*/) {
     /* Step 1. */
     var O = ToObject(this);
@@ -96,17 +96,17 @@ function ArrayLastIndexOf(searchElement/
     }
 
     /* Step 9. */
     return -1;
 }
 
 function ArrayStaticLastIndexOf(list, searchElement/*, fromIndex*/) {
     if (arguments.length < 1)
-        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'Array.lastIndexOf');
+        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "Array.lastIndexOf");
     var fromIndex;
     if (arguments.length > 2) {
         fromIndex = arguments[2];
     } else {
         var O = ToObject(list);
         var len = ToLength(O.length);
         fromIndex = len - 1;
     }
@@ -118,17 +118,17 @@ function ArrayEvery(callbackfn/*, thisAr
     /* Step 1. */
     var O = ToObject(this);
 
     /* Steps 2-3. */
     var len = ToLength(O.length);
 
     /* Step 4. */
     if (arguments.length === 0)
-        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'Array.prototype.every');
+        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "Array.prototype.every");
     if (!IsCallable(callbackfn))
         ThrowTypeError(JSMSG_NOT_FUNCTION, DecompileArg(0, callbackfn));
 
     /* Step 5. */
     var T = arguments.length > 1 ? arguments[1] : void 0;
 
     /* Steps 6-7. */
     /* Steps a (implicit), and d. */
@@ -142,34 +142,34 @@ function ArrayEvery(callbackfn/*, thisAr
     }
 
     /* Step 8. */
     return true;
 }
 
 function ArrayStaticEvery(list, callbackfn/*, thisArg*/) {
     if (arguments.length < 2)
-        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'Array.every');
+        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "Array.every");
     if (!IsCallable(callbackfn))
         ThrowTypeError(JSMSG_NOT_FUNCTION, DecompileArg(1, callbackfn));
     var T = arguments.length > 2 ? arguments[2] : void 0;
     return callFunction(ArrayEvery, list, callbackfn, T);
 }
 
 /* ES5 15.4.4.17. */
 function ArraySome(callbackfn/*, thisArg*/) {
     /* Step 1. */
     var O = ToObject(this);
 
     /* Steps 2-3. */
     var len = ToLength(O.length);
 
     /* Step 4. */
     if (arguments.length === 0)
-        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'Array.prototype.some');
+        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "Array.prototype.some");
     if (!IsCallable(callbackfn))
         ThrowTypeError(JSMSG_NOT_FUNCTION, DecompileArg(0, callbackfn));
 
     /* Step 5. */
     var T = arguments.length > 1 ? arguments[1] : void 0;
 
     /* Steps 6-7. */
     /* Steps a (implicit), and d. */
@@ -183,17 +183,17 @@ function ArraySome(callbackfn/*, thisArg
     }
 
     /* Step 8. */
     return false;
 }
 
 function ArrayStaticSome(list, callbackfn/*, thisArg*/) {
     if (arguments.length < 2)
-        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'Array.some');
+        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "Array.some");
     if (!IsCallable(callbackfn))
         ThrowTypeError(JSMSG_NOT_FUNCTION, DecompileArg(1, callbackfn));
     var T = arguments.length > 2 ? arguments[2] : void 0;
     return callFunction(ArraySome, list, callbackfn, T);
 }
 
 /* ES6 draft 2016-1-15 22.1.3.25 Array.prototype.sort (comparefn) */
 function ArraySort(comparefn) {
@@ -233,17 +233,17 @@ function ArrayForEach(callbackfn/*, this
     /* Step 1. */
     var O = ToObject(this);
 
     /* Steps 2-3. */
     var len = ToLength(O.length);
 
     /* Step 4. */
     if (arguments.length === 0)
-        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'Array.prototype.forEach');
+        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "Array.prototype.forEach");
     if (!IsCallable(callbackfn))
         ThrowTypeError(JSMSG_NOT_FUNCTION, DecompileArg(0, callbackfn));
 
     /* Step 5. */
     var T = arguments.length > 1 ? arguments[1] : void 0;
 
     /* Steps 6-7. */
     /* Steps a (implicit), and d. */
@@ -256,34 +256,34 @@ function ArrayForEach(callbackfn/*, this
     }
 
     /* Step 8. */
     return void 0;
 }
 
 function ArrayStaticForEach(list, callbackfn/*, thisArg*/) {
     if (arguments.length < 2)
-        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'Array.forEach');
+        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "Array.forEach");
     if (!IsCallable(callbackfn))
         ThrowTypeError(JSMSG_NOT_FUNCTION, DecompileArg(1, callbackfn));
     var T = arguments.length > 2 ? arguments[2] : void 0;
     callFunction(ArrayForEach, list, callbackfn, T);
 }
 
 /* ES 2016 draft Mar 25, 2016 22.1.3.15. */
 function ArrayMap(callbackfn/*, thisArg*/) {
     /* Step 1. */
     var O = ToObject(this);
 
     /* Step 2. */
     var len = ToLength(O.length);
 
     /* Step 3. */
     if (arguments.length === 0)
-        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'Array.prototype.map');
+        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "Array.prototype.map");
     if (!IsCallable(callbackfn))
         ThrowTypeError(JSMSG_NOT_FUNCTION, DecompileArg(0, callbackfn));
 
     /* Step 4. */
     var T = arguments.length > 1 ? arguments[1] : void 0;
 
     /* Steps 5. */
     var A = ArraySpeciesCreate(O, len);
@@ -300,34 +300,34 @@ function ArrayMap(callbackfn/*, thisArg*
     }
 
     /* Step 8. */
     return A;
 }
 
 function ArrayStaticMap(list, callbackfn/*, thisArg*/) {
     if (arguments.length < 2)
-        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'Array.map');
+        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "Array.map");
     if (!IsCallable(callbackfn))
         ThrowTypeError(JSMSG_NOT_FUNCTION, DecompileArg(1, callbackfn));
     var T = arguments.length > 2 ? arguments[2] : void 0;
     return callFunction(ArrayMap, list, callbackfn, T);
 }
 
 /* ES 2016 draft Mar 25, 2016 22.1.3.7 Array.prototype.filter. */
 function ArrayFilter(callbackfn/*, thisArg*/) {
     /* Step 1. */
     var O = ToObject(this);
 
     /* Step 2. */
     var len = ToLength(O.length);
 
     /* Step 3. */
     if (arguments.length === 0)
-        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'Array.prototype.filter');
+        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "Array.prototype.filter");
     if (!IsCallable(callbackfn))
         ThrowTypeError(JSMSG_NOT_FUNCTION, DecompileArg(0, callbackfn));
 
     /* Step 4. */
     var T = arguments.length > 1 ? arguments[1] : void 0;
 
     /* Step 5. */
     var A = ArraySpeciesCreate(O, 0);
@@ -348,34 +348,34 @@ function ArrayFilter(callbackfn/*, thisA
     }
 
     /* Step 9. */
     return A;
 }
 
 function ArrayStaticFilter(list, callbackfn/*, thisArg*/) {
     if (arguments.length < 2)
-        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'Array.filter');
+        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "Array.filter");
     if (!IsCallable(callbackfn))
         ThrowTypeError(JSMSG_NOT_FUNCTION, DecompileArg(1, callbackfn));
     var T = arguments.length > 2 ? arguments[2] : void 0;
     return callFunction(ArrayFilter, list, callbackfn, T);
 }
 
 /* ES5 15.4.4.21. */
 function ArrayReduce(callbackfn/*, initialValue*/) {
     /* Step 1. */
     var O = ToObject(this);
 
     /* Steps 2-3. */
     var len = ToLength(O.length);
 
     /* Step 4. */
     if (arguments.length === 0)
-        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'Array.prototype.reduce');
+        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "Array.prototype.reduce");
     if (!IsCallable(callbackfn))
         ThrowTypeError(JSMSG_NOT_FUNCTION, DecompileArg(0, callbackfn));
 
     /* Step 6. */
     var k = 0;
 
     /* Steps 5, 7-8. */
     var accumulator;
@@ -413,17 +413,17 @@ function ArrayReduce(callbackfn/*, initi
     }
 
     /* Step 10. */
     return accumulator;
 }
 
 function ArrayStaticReduce(list, callbackfn) {
     if (arguments.length < 2)
-        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'Array.reduce');
+        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "Array.reduce");
     if (!IsCallable(callbackfn))
         ThrowTypeError(JSMSG_NOT_FUNCTION, DecompileArg(1, callbackfn));
     if (arguments.length > 2)
         return callFunction(ArrayReduce, list, callbackfn, arguments[2]);
     else
         return callFunction(ArrayReduce, list, callbackfn);
 }
 
@@ -432,17 +432,17 @@ function ArrayReduceRight(callbackfn/*, 
     /* Step 1. */
     var O = ToObject(this);
 
     /* Steps 2-3. */
     var len = ToLength(O.length);
 
     /* Step 4. */
     if (arguments.length === 0)
-        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'Array.prototype.reduce');
+        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "Array.prototype.reduce");
     if (!IsCallable(callbackfn))
         ThrowTypeError(JSMSG_NOT_FUNCTION, DecompileArg(0, callbackfn));
 
     /* Step 6. */
     var k = len - 1;
 
     /* Steps 5, 7-8. */
     var accumulator;
@@ -480,17 +480,17 @@ function ArrayReduceRight(callbackfn/*, 
     }
 
     /* Step 10. */
     return accumulator;
 }
 
 function ArrayStaticReduceRight(list, callbackfn) {
     if (arguments.length < 2)
-        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'Array.reduceRight');
+        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "Array.reduceRight");
     if (!IsCallable(callbackfn))
         ThrowTypeError(JSMSG_NOT_FUNCTION, DecompileArg(1, callbackfn));
     if (arguments.length > 2)
         return callFunction(ArrayReduceRight, list, callbackfn, arguments[2]);
     else
         return callFunction(ArrayReduceRight, list, callbackfn);
 }
 
@@ -499,17 +499,17 @@ function ArrayFind(predicate/*, thisArg*
     /* Steps 1-2. */
     var O = ToObject(this);
 
     /* Steps 3-5. */
     var len = ToLength(O.length);
 
     /* Step 6. */
     if (arguments.length === 0)
-        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'Array.prototype.find');
+        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "Array.prototype.find");
     if (!IsCallable(predicate))
         ThrowTypeError(JSMSG_NOT_FUNCTION, DecompileArg(0, predicate));
 
     /* Step 7. */
     var T = arguments.length > 1 ? arguments[1] : undefined;
 
     /* Steps 8-9. */
     /* Steps a (implicit), and g. */
@@ -530,17 +530,17 @@ function ArrayFindIndex(predicate/*, thi
     /* Steps 1-2. */
     var O = ToObject(this);
 
     /* Steps 3-5. */
     var len = ToLength(O.length);
 
     /* Step 6. */
     if (arguments.length === 0)
-        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'Array.prototype.find');
+        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "Array.prototype.find");
     if (!IsCallable(predicate))
         ThrowTypeError(JSMSG_NOT_FUNCTION, DecompileArg(0, predicate));
 
     /* Step 7. */
     var T = arguments.length > 1 ? arguments[1] : undefined;
 
     /* Steps 8-9. */
     /* Steps a (implicit), and g. */
@@ -1083,69 +1083,69 @@ function ArrayConcat(arg1) {
     A.length = n;
 
     // Step 7.
     return A;
 }
 
 function ArrayStaticConcat(arr, arg1) {
     if (arguments.length < 1)
-        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'Array.concat');
+        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "Array.concat");
     var args = callFunction(std_Array_slice, arguments, 1);
     return callFunction(std_Function_apply, ArrayConcat, arr, args);
 }
 
 function ArrayStaticJoin(arr, separator) {
     if (arguments.length < 1)
-        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'Array.join');
+        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "Array.join");
     return callFunction(std_Array_join, arr, separator);
 }
 
 function ArrayStaticReverse(arr) {
     if (arguments.length < 1)
-        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'Array.reverse');
+        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "Array.reverse");
     return callFunction(std_Array_reverse, arr);
 }
 
 function ArrayStaticSort(arr, comparefn) {
     if (arguments.length < 1)
-        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'Array.sort');
+        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "Array.sort");
     return callFunction(std_Array_sort, arr, comparefn);
 }
 
 function ArrayStaticPush(arr, arg1) {
     if (arguments.length < 1)
-        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'Array.push');
+        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "Array.push");
     var args = callFunction(std_Array_slice, arguments, 1);
     return callFunction(std_Function_apply, std_Array_push, arr, args);
 }
 
 function ArrayStaticPop(arr) {
     if (arguments.length < 1)
-        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'Array.pop');
+        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "Array.pop");
     return callFunction(std_Array_pop, arr);
 }
 
 function ArrayStaticShift(arr) {
     if (arguments.length < 1)
-        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'Array.shift');
+        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "Array.shift");
     return callFunction(std_Array_shift, arr);
 }
 
 function ArrayStaticUnshift(arr, arg1) {
     if (arguments.length < 1)
-        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'Array.unshift');
+        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "Array.unshift");
     var args = callFunction(std_Array_slice, arguments, 1);
     return callFunction(std_Function_apply, std_Array_unshift, arr, args);
 }
 
 function ArrayStaticSplice(arr, start, deleteCount) {
     if (arguments.length < 1)
-        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'Array.splice');
+        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "Array.splice");
     var args = callFunction(std_Array_slice, arguments, 1);
     return callFunction(std_Function_apply, std_Array_splice, arr, args);
 }
 
 function ArrayStaticSlice(arr, start, end) {
     if (arguments.length < 1)
-        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'Array.slice');
+        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "Array.slice");
     return callFunction(std_Array_slice, arr, start, end);
 }
--- a/js/src/builtin/Function.js
+++ b/js/src/builtin/Function.js
@@ -3,17 +3,17 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 // ES7 draft (January 21, 2016) 19.2.3.2 Function.prototype.bind
 function FunctionBind(thisArg, ...boundArgs) {
     // Step 1.
     var target = this;
     // Step 2.
     if (!IsCallable(target))
-        ThrowTypeError(JSMSG_INCOMPATIBLE_PROTO, 'Function', 'bind', target);
+        ThrowTypeError(JSMSG_INCOMPATIBLE_PROTO, "Function", "bind", target);
 
     // Step 3 (implicit).
     // Step 4.
     var F;
     var argCount = boundArgs.length;
     switch (argCount) {
       case 0:
         F = bind_bindFunction0(target, thisArg, boundArgs);
--- a/js/src/builtin/Generator.js
+++ b/js/src/builtin/Generator.js
@@ -14,17 +14,17 @@ function StarGeneratorNext(val) {
         if (StarGeneratorObjectIsClosed(this))
             return { value: undefined, done: true };
 
         if (GeneratorIsRunning(this))
             ThrowTypeError(JSMSG_NESTING_GENERATOR);
     }
 
     try {
-        return resumeGenerator(this, val, 'next');
+        return resumeGenerator(this, val, "next");
     } catch (e) {
         if (!StarGeneratorObjectIsClosed(this))
             GeneratorSetClosed(this);
         throw e;
     }
 }
 
 function StarGeneratorThrow(val) {
@@ -35,17 +35,17 @@ function StarGeneratorThrow(val) {
         if (StarGeneratorObjectIsClosed(this))
             throw val;
 
         if (GeneratorIsRunning(this))
             ThrowTypeError(JSMSG_NESTING_GENERATOR);
     }
 
     try {
-        return resumeGenerator(this, val, 'throw');
+        return resumeGenerator(this, val, "throw");
     } catch (e) {
         if (!StarGeneratorObjectIsClosed(this))
             GeneratorSetClosed(this);
         throw e;
     }
 }
 
 function StarGeneratorReturn(val) {
@@ -57,17 +57,17 @@ function StarGeneratorReturn(val) {
             return { value: val, done: true };
 
         if (GeneratorIsRunning(this))
             ThrowTypeError(JSMSG_NESTING_GENERATOR);
     }
 
     try {
         var rval = { value: val, done: true };
-        return resumeGenerator(this, rval, 'close');
+        return resumeGenerator(this, rval, "close");
     } catch (e) {
         if (!StarGeneratorObjectIsClosed(this))
             GeneratorSetClosed(this);
         throw e;
     }
 }
 
 function LegacyGeneratorNext(val) {
@@ -76,17 +76,17 @@ function LegacyGeneratorNext(val) {
 
     if (LegacyGeneratorObjectIsClosed(this))
         ThrowStopIteration();
 
     if (GeneratorIsRunning(this))
         ThrowTypeError(JSMSG_NESTING_GENERATOR);
 
     try {
-        return resumeGenerator(this, val, 'next');
+        return resumeGenerator(this, val, "next");
     } catch(e) {
         if (!LegacyGeneratorObjectIsClosed(this))
             GeneratorSetClosed(this);
         throw e;
     }
 }
 _SetCanonicalName(LegacyGeneratorNext, "next");
 
@@ -96,34 +96,34 @@ function LegacyGeneratorThrow(val) {
 
     if (LegacyGeneratorObjectIsClosed(this))
         throw val;
 
     if (GeneratorIsRunning(this))
         ThrowTypeError(JSMSG_NESTING_GENERATOR);
 
     try {
-        return resumeGenerator(this, val, 'throw');
+        return resumeGenerator(this, val, "throw");
     } catch(e) {
         if (!LegacyGeneratorObjectIsClosed(this))
             GeneratorSetClosed(this);
         throw e;
     }
 }
 
 // Called by js::CloseIterator.
 function LegacyGeneratorCloseInternal() {
     assert(IsObject(this), "Not an object: " + ToString(this));
     assert(IsLegacyGeneratorObject(this), "Not a legacy generator object: " + ToString(this));
     assert(!LegacyGeneratorObjectIsClosed(this), "Already closed: " + ToString(this));
 
     if (GeneratorIsRunning(this))
         ThrowTypeError(JSMSG_NESTING_GENERATOR);
 
-    resumeGenerator(this, undefined, 'close');
+    resumeGenerator(this, undefined, "close");
     if (!LegacyGeneratorObjectIsClosed(this))
         CloseClosingLegacyGeneratorObject(this);
 }
 
 function LegacyGeneratorClose() {
     if (!IsObject(this) || !IsLegacyGeneratorObject(this))
         return callFunction(CallLegacyGeneratorMethodIfWrapped, this, "LegacyGeneratorClose");
 
--- a/js/src/builtin/Intl.js
+++ b/js/src/builtin/Intl.js
@@ -1529,17 +1529,17 @@ function InitializeCollator(collator, lo
 
     // Steps 11-12.
     var matcher = GetOption(options, "localeMatcher", "string", ["lookup", "best fit"], "best fit");
     opt.localeMatcher = matcher;
 
     // Step 13, unrolled.
     var numericValue = GetOption(options, "numeric", "boolean", undefined, undefined);
     if (numericValue !== undefined)
-        numericValue = numericValue ? 'true' : 'false';
+        numericValue = numericValue ? "true" : "false";
     opt.kn = numericValue;
 
     var caseFirstValue = GetOption(options, "caseFirst", "string", ["upper", "lower", "false"], undefined);
     opt.kf = caseFirstValue;
 
     // Compute remaining collation options.
     // Step 20.
     var s = GetOption(options, "sensitivity", "string",
--- a/js/src/builtin/Number.js
+++ b/js/src/builtin/Number.js
@@ -51,17 +51,17 @@ function Number_isNaN(num) {
     if (typeof num !== "number")
         return false;
     return num !== num;
 }
 
 // ES6 draft ES6 20.1.2.5
 function Number_isSafeInteger(number) {
     // Step 1.
-    if (typeof number !== 'number')
+    if (typeof number !== "number")
         return false;
 
     // Step 2.
     if (!Number_isFinite(number))
         return false;
 
     // Step 3.
     var integer = ToInteger(number);
--- a/js/src/builtin/Promise.cpp
+++ b/js/src/builtin/Promise.cpp
@@ -299,38 +299,37 @@ RejectPromiseFunction(JSContext* cx, uns
     // Steps 3-4.
     // If the Promise isn't available anymore, it has been resolved and the
     // reference to it removed to make it eligible for collection.
     if (promiseVal.isUndefined()) {
         args.rval().setUndefined();
         return true;
     }
 
+    // Step 5.
+    // Here, we only remove the Promise reference from the resolution
+    // functions. Actually marking it as fulfilled/rejected happens later.
+    ClearResolutionFunctionSlots(reject);
+
     RootedObject promise(cx, &promiseVal.toObject());
 
     // In some cases the Promise reference on the resolution function won't
     // have been removed during resolution, so we need to check that here,
     // too.
     if (promise->is<PromiseObject>() &&
-        PromiseHasAnyFlag(promise->as<PromiseObject>(), PROMISE_FLAG_RESOLVED))
+        promise->as<PromiseObject>().state() != JS::PromiseState::Pending)
     {
-        args.rval().setUndefined();
         return true;
     }
 
-    // Step 5.
-    // Here, we only remove the Promise reference from the resolution
-    // functions. Actually marking it as fulfilled/rejected happens later.
-    ClearResolutionFunctionSlots(reject);
-
     // Step 6.
-    bool result = RejectMaybeWrappedPromise(cx, promise, reasonVal);
-    if (result)
-        args.rval().setUndefined();
-    return result;
+    if (!RejectMaybeWrappedPromise(cx, promise, reasonVal))
+        return false;
+    args.rval().setUndefined();
+    return true;
 }
 
 static MOZ_MUST_USE bool FulfillMaybeWrappedPromise(JSContext *cx, HandleObject promiseObj,
                                                     HandleValue value_);
 
 static MOZ_MUST_USE bool EnqueuePromiseResolveThenableJob(JSContext* cx,
                                                           HandleValue promiseToResolve,
                                                           HandleValue thenable,
@@ -390,48 +389,47 @@ ResolvePromiseInternal(JSContext* cx, Ha
 static bool
 ResolvePromiseFunction(JSContext* cx, unsigned argc, Value* vp)
 {
     CallArgs args = CallArgsFromVp(argc, vp);
 
     RootedFunction resolve(cx, &args.callee().as<JSFunction>());
     RootedValue resolutionVal(cx, args.get(0));
 
-    // Steps 1-2.
-    RootedValue promiseVal(cx, resolve->getExtendedSlot(ResolveFunctionSlot_Promise));
-
-    // Steps 3-4.
-    // If the Promise isn't available anymore, it has been rejected and the
-    // reference to it removed to make it eligible for collection.
-    if (promiseVal.isUndefined()) {
+    // Steps 3-4 (reordered).
+    // We use the reference to the reject function as a signal for whether
+    // the resolve or reject function was already called, at which point
+    // the references on each of the functions are cleared.
+    if (!resolve->getExtendedSlot(ResolveFunctionSlot_RejectFunction).isObject()) {
         args.rval().setUndefined();
         return true;
     }
 
-    RootedObject promise(cx, &promiseVal.toObject());
+    // Steps 1-2 (reordered).
+    RootedObject promise(cx, &resolve->getExtendedSlot(ResolveFunctionSlot_Promise).toObject());
+
+    // Step 5.
+    // Here, we only remove the Promise reference from the resolution
+    // functions. Actually marking it as fulfilled/rejected happens later.
+    ClearResolutionFunctionSlots(resolve);
 
     // In some cases the Promise reference on the resolution function won't
     // have been removed during resolution, so we need to check that here,
     // too.
     if (promise->is<PromiseObject>() &&
-        PromiseHasAnyFlag(promise->as<PromiseObject>(), PROMISE_FLAG_RESOLVED))
+        promise->as<PromiseObject>().state() != JS::PromiseState::Pending)
     {
-        args.rval().setUndefined();
         return true;
     }
 
-    // Step 5.
-    // Here, we only remove the Promise reference from the resolution
-    // functions. Actually marking it as fulfilled/rejected happens later.
-    ClearResolutionFunctionSlots(resolve);
-
-    bool status = ResolvePromiseInternal(cx, promise, resolutionVal);
-    if (status)
-        args.rval().setUndefined();
-    return status;
+    // Steps 6-13.
+    if (!ResolvePromiseInternal(cx, promise, resolutionVal))
+        return false;
+    args.rval().setUndefined();
+    return true;
 }
 
 static bool PromiseReactionJob(JSContext* cx, unsigned argc, Value* vp);
 
 /**
  * Tells the embedding to enqueue a Promise reaction job, based on
  * three parameters:
  * reactionObj - The reaction record.
@@ -624,17 +622,17 @@ static MOZ_MUST_USE PromiseObject* Creat
                                                                bool informDebugger = true);
 
 enum GetCapabilitiesExecutorSlots {
     GetCapabilitiesExecutorSlots_Resolve,
     GetCapabilitiesExecutorSlots_Reject
 };
 
 static MOZ_MUST_USE PromiseObject*
-CreatePromiseObjectWithDefaultResolution(JSContext* cx)
+CreatePromiseObjectWithoutResolutionFunctions(JSContext* cx)
 {
     Rooted<PromiseObject*> promise(cx, CreatePromiseObjectInternal(cx));
     if (!promise)
         return nullptr;
 
     AddPromiseFlags(*promise, PROMISE_FLAG_DEFAULT_RESOLVE_FUNCTION |
                     PROMISE_FLAG_DEFAULT_REJECT_FUNCTION);
     return promise;
@@ -659,17 +657,17 @@ NewPromiseCapability(JSContext* cx, Hand
     // creating and calling the executor function and instead return a Promise
     // marked as having default resolve/reject functions.
     //
     // This can't be used in Promise.all and Promise.race because we have to
     // pass the reject (and resolve, in the race case) function to thenables
     // in the list passed to all/race, which (potentially) means exposing them
     // to content.
     if (canOmitResolutionFunctions && IsNativeFunction(cVal, PromiseConstructor)) {
-        promise.set(CreatePromiseObjectWithDefaultResolution(cx));
+        promise.set(CreatePromiseObjectWithoutResolutionFunctions(cx));
         if (!promise)
             return false;
         return true;
     }
 
     // Step 3 (omitted).
 
     // Step 4.
@@ -1341,16 +1339,24 @@ PromiseObject::create(JSContext* cx, Han
 
     // Let the Debugger know about this Promise.
     JS::dbg::onNewPromise(cx, promise);
 
     // Step 11.
     return promise;
 }
 
+// ES2016, 25.4.3.1. skipping creation of resolution functions and executor
+// function invocation.
+/* static */ PromiseObject*
+PromiseObject::createSkippingExecutor(JSContext* cx)
+{
+    return CreatePromiseObjectWithoutResolutionFunctions(cx);
+}
+
 static MOZ_MUST_USE bool PerformPromiseAll(JSContext *cx, JS::ForOfIterator& iterator,
                                            HandleObject C, HandleObject promiseObj,
                                            HandleObject resolve, HandleObject reject,
                                            bool* done);
 
 // ES2016, 25.4.4.1.
 static bool
 Promise_static_all(JSContext* cx, unsigned argc, Value* vp)
@@ -2103,17 +2109,17 @@ static MOZ_MUST_USE bool PerformPromiseT
 // Some async/await functions are implemented here instead of
 // js/src/builtin/AsyncFunction.cpp, to call Promise internal functions.
 
 // Async Functions proposal 1.1.8 and 1.2.14 step 1.
 MOZ_MUST_USE PromiseObject*
 js::CreatePromiseObjectForAsync(JSContext* cx, HandleValue generatorVal)
 {
     // Step 1.
-    Rooted<PromiseObject*> promise(cx, CreatePromiseObjectWithDefaultResolution(cx));
+    Rooted<PromiseObject*> promise(cx, CreatePromiseObjectWithoutResolutionFunctions(cx));
     if (!promise)
         return nullptr;
 
     AddPromiseFlags(*promise, PROMISE_FLAG_ASYNC);
     promise->setFixedSlot(PromiseSlot_AwaitGenerator, generatorVal);
     return promise;
 }
 
@@ -2149,17 +2155,17 @@ js::AsyncFunctionReturned(JSContext* cx,
     return true;
 }
 
 // Async Functions proposal 2.3 steps 2-8.
 MOZ_MUST_USE bool
 js::AsyncFunctionAwait(JSContext* cx, Handle<PromiseObject*> resultPromise, HandleValue value)
 {
     // Step 2.
-    Rooted<PromiseObject*> promise(cx, CreatePromiseObjectWithDefaultResolution(cx));
+    Rooted<PromiseObject*> promise(cx, CreatePromiseObjectWithoutResolutionFunctions(cx));
     if (!promise)
         return false;
 
     // Steps 3.
     if (!ResolvePromiseInternal(cx, promise, value))
         return false;
 
     // Steps 4-5.
@@ -2580,16 +2586,19 @@ PromiseObject::dependentPromises(JSConte
 
 /* static */ bool
 PromiseObject::resolve(JSContext* cx, Handle<PromiseObject*> promise, HandleValue resolutionValue)
 {
     MOZ_ASSERT(!PromiseHasAnyFlag(*promise, PROMISE_FLAG_ASYNC));
     if (promise->state() != JS::PromiseState::Pending)
         return true;
 
+    if (PromiseHasAnyFlag(*promise, PROMISE_FLAG_DEFAULT_RESOLVE_FUNCTION))
+        return ResolvePromiseInternal(cx, promise, resolutionValue);
+
     RootedObject resolveFun(cx, GetResolveFunctionFromPromise(promise));
     RootedValue funVal(cx, ObjectValue(*resolveFun));
 
     // For xray'd Promises, the resolve fun may have been created in another
     // compartment. For the call below to work in that case, wrap the
     // function into the current compartment.
     if (!cx->compartment()->wrap(cx, &funVal))
         return false;
@@ -2603,16 +2612,19 @@ PromiseObject::resolve(JSContext* cx, Ha
 
 /* static */ bool
 PromiseObject::reject(JSContext* cx, Handle<PromiseObject*> promise, HandleValue rejectionValue)
 {
     MOZ_ASSERT(!PromiseHasAnyFlag(*promise, PROMISE_FLAG_ASYNC));
     if (promise->state() != JS::PromiseState::Pending)
         return true;
 
+    if (PromiseHasAnyFlag(*promise, PROMISE_FLAG_DEFAULT_REJECT_FUNCTION))
+        return RejectMaybeWrappedPromise(cx, promise, rejectionValue);
+
     RootedValue funVal(cx, promise->getFixedSlot(PromiseSlot_RejectFunction));
     MOZ_ASSERT(IsCallable(funVal));
 
     FixedInvokeArgs<1> args(cx);
     args[0].set(rejectionValue);
 
     RootedValue dummy(cx);
     return Call(cx, funVal, UndefinedHandleValue, args, &dummy);
--- a/js/src/builtin/Promise.h
+++ b/js/src/builtin/Promise.h
@@ -39,16 +39,18 @@ class PromiseObject : public NativeObjec
 {
   public:
     static const unsigned RESERVED_SLOTS = PromiseSlots;
     static const Class class_;
     static const Class protoClass_;
     static PromiseObject* create(JSContext* cx, HandleObject executor,
                                  HandleObject proto = nullptr, bool needsWrapping = false);
 
+    static PromiseObject* createSkippingExecutor(JSContext* cx);
+
     static JSObject* unforgeableResolve(JSContext* cx, HandleValue value);
     static JSObject* unforgeableReject(JSContext* cx, HandleValue value);
 
     JS::PromiseState state() {
         int32_t flags = getFixedSlot(PromiseSlot_Flags).toInt32();
         if (!(flags & PROMISE_FLAG_RESOLVED)) {
             MOZ_ASSERT(!(flags & PROMISE_FLAG_FULFILLED));
             return JS::PromiseState::Pending;
--- a/js/src/builtin/RegExp.js
+++ b/js/src/builtin/RegExp.js
@@ -49,17 +49,17 @@ function RegExpToString()
 
     // Step 3.
     var pattern = ToString(R.source);
 
     // Step 4.
     var flags = ToString(R.flags);
 
     // Steps 5-6.
-    return '/' + pattern + '/' + flags;
+    return "/" + pattern + "/" + flags;
 }
 _SetCanonicalName(RegExpToString, "toString");
 
 // ES 2016 draft Mar 25, 2016 21.2.5.2.3.
 function AdvanceStringIndex(S, index) {
     // Step 1.
     assert(typeof S === "string", "Expected string as 1st argument");
 
--- a/js/src/builtin/String.js
+++ b/js/src/builtin/String.js
@@ -53,19 +53,19 @@ function String_match(regexp) {
     if (IsStringMatchOptimizable())
         return RegExpMatcher(rx, S, 0);
 
     // Step 5.
     return callContentFunction(GetMethod(rx, std_match), rx, S);
 }
 
 function String_generic_match(thisValue, regexp) {
-    WarnDeprecatedStringMethod(STRING_GENERICS_MATCH, 'match');
+    WarnDeprecatedStringMethod(STRING_GENERICS_MATCH, "match");
     if (thisValue === undefined)
-        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'String.match');
+        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "String.match");
     return callFunction(String_match, thisValue, regexp);
 }
 
 /**
  * A helper function implementing the logic for both String.prototype.padStart
  * and String.prototype.padEnd as described in ES7 Draft March 29, 2016
  */
 function String_pad(maxLength, fillString, padEnd=false) {
@@ -188,19 +188,19 @@ function String_replace(searchValue, rep
     if (tailPos < stringLength)
         newString += Substring(string, tailPos, stringLength - tailPos);
 
     // Step 12.
     return newString;
 }
 
 function String_generic_replace(thisValue, searchValue, replaceValue) {
-    WarnDeprecatedStringMethod(STRING_GENERICS_REPLACE, 'replace');
+    WarnDeprecatedStringMethod(STRING_GENERICS_REPLACE, "replace");
     if (thisValue === undefined)
-        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'String.replace');
+        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "String.replace");
     return callFunction(String_replace, thisValue, searchValue, replaceValue);
 }
 
 function StringProtoHasNoSearch() {
     var ObjectProto = GetBuiltinPrototype("Object");
     var StringProto = GetBuiltinPrototype("String");
     if (!ObjectHasPrototype(StringProto, ObjectProto))
         return false;
@@ -244,19 +244,19 @@ function String_search(regexp) {
     // Step 4.
     var rx = RegExpCreate(regexp);
 
     // Step 5.
     return callContentFunction(GetMethod(rx, std_search), rx, string);
 }
 
 function String_generic_search(thisValue, regexp) {
-    WarnDeprecatedStringMethod(STRING_GENERICS_SEARCH, 'search');
+    WarnDeprecatedStringMethod(STRING_GENERICS_SEARCH, "search");
     if (thisValue === undefined)
-        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'String.search');
+        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "String.search");
     return callFunction(String_search, thisValue, regexp);
 }
 
 function StringProtoHasNoSplit() {
     var ObjectProto = GetBuiltinPrototype("Object");
     var StringProto = GetBuiltinPrototype("String");
     if (!ObjectHasPrototype(StringProto, ObjectProto))
         return false;
@@ -326,19 +326,19 @@ function String_split(separator, limit) 
         return [S];
 
     // Optimized path.
     // Steps 4, 8, 12-18.
     return StringSplitString(S, R);
 }
 
 function String_generic_split(thisValue, separator, limit) {
-    WarnDeprecatedStringMethod(STRING_GENERICS_SPLIT, 'split');
+    WarnDeprecatedStringMethod(STRING_GENERICS_SPLIT, "split");
     if (thisValue === undefined)
-        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'String.split');
+        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "String.split");
     return callFunction(String_split, thisValue, separator, limit);
 }
 
 /* ES6 Draft Oct 14, 2014 21.1.3.19 */
 function String_substring(start, end) {
     // Steps 1-3.
     RequireObjectCoercible(this);
     var str = ToString(this);
@@ -371,19 +371,19 @@ function String_substring(start, end) {
     // Step 11.
     // While |from| and |to - from| are bounded to the length of |str| and this
     // and thus definitely in the int32 range, they can still be typed as
     // double. Eagerly truncate since SubstringKernel only accepts int32.
     return SubstringKernel(str, from | 0, (to - from) | 0);
 }
 
 function String_static_substring(string, start, end) {
-    WarnDeprecatedStringMethod(STRING_GENERICS_SUBSTRING, 'substring');
+    WarnDeprecatedStringMethod(STRING_GENERICS_SUBSTRING, "substring");
     if (arguments.length < 1)
-        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'String.substring');
+        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "String.substring");
     return callFunction(String_substring, string, start, end);
 }
 
 /* ES6 Draft Oct 14, 2014 B.2.3.1 */
 function String_substr(start, length) {
     // Steps 1-2.
     RequireObjectCoercible(this);
     var str = ToString(this);
@@ -411,19 +411,19 @@ function String_substr(start, length) {
     // Step 11.
     // While |intStart| and |resultLength| are bounded to the length of |str|
     // and thus definitely in the int32 range, they can still be typed as
     // double. Eagerly truncate since SubstringKernel only accepts int32.
     return SubstringKernel(str, intStart | 0, resultLength | 0);
 }
 
 function String_static_substr(string, start, length) {
-    WarnDeprecatedStringMethod(STRING_GENERICS_SUBSTR, 'substr');
+    WarnDeprecatedStringMethod(STRING_GENERICS_SUBSTR, "substr");
     if (arguments.length < 1)
-        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'String.substr');
+        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "String.substr");
     return callFunction(String_substr, string, start, length);
 }
 
 /* ES6 Draft Oct 14, 2014 21.1.3.16 */
 function String_slice(start, end) {
     // Steps 1-3.
     RequireObjectCoercible(this);
     var str = ToString(this);
@@ -449,19 +449,19 @@ function String_slice(start, end) {
     // Step 10.
     // While |from| and |span| are bounded to the length of |str|
     // and thus definitely in the int32 range, they can still be typed as
     // double. Eagerly truncate since SubstringKernel only accepts int32.
     return SubstringKernel(str, from | 0, span | 0);
 }
 
 function String_static_slice(string, start, end) {
-    WarnDeprecatedStringMethod(STRING_GENERICS_SLICE, 'slice');
+    WarnDeprecatedStringMethod(STRING_GENERICS_SLICE, "slice");
     if (arguments.length < 1)
-        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'String.slice');
+        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "String.slice");
     return callFunction(String_slice, string, start, end);
 }
 
 /* ES6 Draft September 5, 2013 21.1.3.3 */
 function String_codePointAt(pos) {
     // Steps 1-3.
     RequireObjectCoercible(this);
     var S = ToString(this);
@@ -657,17 +657,17 @@ function String_static_raw(callSite, ...
 /**
  * Compare String str1 against String str2, using the locale and collation
  * options provided.
  *
  * Mozilla proprietary.
  * Spec: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String#String_generic_methods
  */
 function String_static_localeCompare(str1, str2) {
-    WarnDeprecatedStringMethod(STRING_GENERICS_LOCALE_COMPARE, 'localeCompare');
+    WarnDeprecatedStringMethod(STRING_GENERICS_LOCALE_COMPARE, "localeCompare");
     if (arguments.length < 1)
         ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "String.localeCompare");
     var locales = arguments.length > 2 ? arguments[2] : undefined;
     var options = arguments.length > 3 ? arguments[3] : undefined;
 #if EXPOSE_INTL_API
     return callFunction(String_localeCompare, str1, str2, locales, options);
 #else
     return callFunction(std_String_localeCompare, str1, str2, locales, options);
@@ -730,17 +730,17 @@ function String_sup() {
 
 function EscapeAttributeValue(v) {
     var inputStr = ToString(v);
     var inputLen = inputStr.length;
     var outputStr = "";
     var chunkStart = 0;
     for (var i = 0; i < inputLen; i++) {
         if (inputStr[i] === '"') {
-            outputStr += callFunction(String_substring, inputStr, chunkStart, i) + '&quot;';
+            outputStr += callFunction(String_substring, inputStr, chunkStart, i) + "&quot;";
             chunkStart = i + 1;
         }
     }
     if (chunkStart === 0)
         return inputStr;
     if (chunkStart < inputLen)
         outputStr += callFunction(String_substring, inputStr, chunkStart);
     return outputStr;
@@ -770,127 +770,127 @@ function String_fontsize(size) {
 // ES6 draft 2014-04-27 B.2.3.10
 function String_link(url) {
     RequireObjectCoercible(this);
     var S = ToString(this);
     return '<a href="' + EscapeAttributeValue(url) + '">' + S + "</a>";
 }
 
 function String_static_toLowerCase(string) {
-    WarnDeprecatedStringMethod(STRING_GENERICS_TO_LOWER_CASE, 'toLowerCase');
+    WarnDeprecatedStringMethod(STRING_GENERICS_TO_LOWER_CASE, "toLowerCase");
     if (arguments.length < 1)
-        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'String.toLowerCase');
+        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "String.toLowerCase");
     return callFunction(std_String_toLowerCase, string);
 }
 
 function String_static_toUpperCase(string) {
-    WarnDeprecatedStringMethod(STRING_GENERICS_TO_UPPER_CASE, 'toUpperCase');
+    WarnDeprecatedStringMethod(STRING_GENERICS_TO_UPPER_CASE, "toUpperCase");
     if (arguments.length < 1)
-        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'String.toUpperCase');
+        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "String.toUpperCase");
     return callFunction(std_String_toUpperCase, string);
 }
 
 function String_static_charAt(string, pos) {
-    WarnDeprecatedStringMethod(STRING_GENERICS_CHAR_AT, 'charAt');
+    WarnDeprecatedStringMethod(STRING_GENERICS_CHAR_AT, "charAt");
     if (arguments.length < 1)
-        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'String.charAt');
+        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "String.charAt");
     return callFunction(std_String_charAt, string, pos);
 }
 
 function String_static_charCodeAt(string, pos) {
-    WarnDeprecatedStringMethod(STRING_GENERICS_CHAR_CODE_AT, 'charCodeAt');
+    WarnDeprecatedStringMethod(STRING_GENERICS_CHAR_CODE_AT, "charCodeAt");
     if (arguments.length < 1)
-        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'String.charCodeAt');
+        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "String.charCodeAt");
     return callFunction(std_String_charCodeAt, string, pos);
 }
 
 function String_static_includes(string, searchString) {
-    WarnDeprecatedStringMethod(STRING_GENERICS_INCLUDES, 'includes');
+    WarnDeprecatedStringMethod(STRING_GENERICS_INCLUDES, "includes");
     if (arguments.length < 1)
-        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'String.includes');
+        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "String.includes");
     var position = arguments.length > 2 ? arguments[2] : undefined;
     return callFunction(std_String_includes, string, searchString, position);
 }
 
 function String_static_indexOf(string, searchString) {
-    WarnDeprecatedStringMethod(STRING_GENERICS_INDEX_OF, 'indexOf');
+    WarnDeprecatedStringMethod(STRING_GENERICS_INDEX_OF, "indexOf");
     if (arguments.length < 1)
-        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'String.indexOf');
+        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "String.indexOf");
     var position = arguments.length > 2 ? arguments[2] : undefined;
     return callFunction(std_String_indexOf, string, searchString, position);
 }
 
 function String_static_lastIndexOf(string, searchString) {
-    WarnDeprecatedStringMethod(STRING_GENERICS_LAST_INDEX_OF, 'lastIndexOf');
+    WarnDeprecatedStringMethod(STRING_GENERICS_LAST_INDEX_OF, "lastIndexOf");
     if (arguments.length < 1)
-        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'String.lastIndexOf');
+        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "String.lastIndexOf");
     var position = arguments.length > 2 ? arguments[2] : undefined;
     return callFunction(std_String_lastIndexOf, string, searchString, position);
 }
 
 function String_static_startsWith(string, searchString) {
-    WarnDeprecatedStringMethod(STRING_GENERICS_STARTS_WITH, 'startsWith');
+    WarnDeprecatedStringMethod(STRING_GENERICS_STARTS_WITH, "startsWith");
     if (arguments.length < 1)
-        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'String.startsWith');
+        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "String.startsWith");
     var position = arguments.length > 2 ? arguments[2] : undefined;
     return callFunction(std_String_startsWith, string, searchString, position);
 }
 
 function String_static_endsWith(string, searchString) {
-    WarnDeprecatedStringMethod(STRING_GENERICS_ENDS_WITH, 'endsWith');
+    WarnDeprecatedStringMethod(STRING_GENERICS_ENDS_WITH, "endsWith");
     if (arguments.length < 1)
-        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'String.endsWith');
+        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "String.endsWith");
     var endPosition = arguments.length > 2 ? arguments[2] : undefined;
     return callFunction(std_String_endsWith, string, searchString, endPosition);
 }
 
 function String_static_trim(string) {
-    WarnDeprecatedStringMethod(STRING_GENERICS_TRIM, 'trim');
+    WarnDeprecatedStringMethod(STRING_GENERICS_TRIM, "trim");
     if (arguments.length < 1)
-        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'String.trim');
+        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "String.trim");
     return callFunction(std_String_trim, string);
 }
 
 function String_static_trimLeft(string) {
-    WarnDeprecatedStringMethod(STRING_GENERICS_TRIM_LEFT, 'trimLeft');
+    WarnDeprecatedStringMethod(STRING_GENERICS_TRIM_LEFT, "trimLeft");
     if (arguments.length < 1)
-        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'String.trimLeft');
+        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "String.trimLeft");
     return callFunction(std_String_trimLeft, string);
 }
 
 function String_static_trimRight(string) {
-    WarnDeprecatedStringMethod(STRING_GENERICS_TRIM_RIGHT, 'trimRight');
+    WarnDeprecatedStringMethod(STRING_GENERICS_TRIM_RIGHT, "trimRight");
     if (arguments.length < 1)
-        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'String.trimRight');
+        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "String.trimRight");
     return callFunction(std_String_trimRight, string);
 }
 
 function String_static_toLocaleLowerCase(string) {
-    WarnDeprecatedStringMethod(STRING_GENERICS_TO_LOCALE_LOWER_CASE, 'toLocaleLowerCase');
+    WarnDeprecatedStringMethod(STRING_GENERICS_TO_LOCALE_LOWER_CASE, "toLocaleLowerCase");
     if (arguments.length < 1)
-        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'String.toLocaleLowerCase');
+        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "String.toLocaleLowerCase");
     return callFunction(std_String_toLocaleLowerCase, string);
 }
 
 function String_static_toLocaleUpperCase(string) {
-    WarnDeprecatedStringMethod(STRING_GENERICS_TO_LOCALE_UPPER_CASE, 'toLocaleUpperCase');
+    WarnDeprecatedStringMethod(STRING_GENERICS_TO_LOCALE_UPPER_CASE, "toLocaleUpperCase");
     if (arguments.length < 1)
-        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'String.toLocaleUpperCase');
+        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "String.toLocaleUpperCase");
     return callFunction(std_String_toLocaleUpperCase, string);
 }
 
 #if EXPOSE_INTL_API
 function String_static_normalize(string) {
     WarnDeprecatedStringMethod(STRING_GENERICS_NORMALIZE, "normalize");
     if (arguments.length < 1)
-        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'String.normalize');
+        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "String.normalize");
     var form = arguments.length > 1 ? arguments[1] : undefined;
     return callFunction(std_String_normalize, string, form);
 }
 #endif
 
 function String_static_concat(string, arg1) {
-    WarnDeprecatedStringMethod(STRING_GENERICS_CONCAT, 'concat');
+    WarnDeprecatedStringMethod(STRING_GENERICS_CONCAT, "concat");
     if (arguments.length < 1)
-        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'String.concat');
+        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "String.concat");
     var args = callFunction(std_Array_slice, arguments, 1);
     return callFunction(std_Function_apply, std_String_concat, string, args);
 }
--- a/js/src/builtin/TypedArray.js
+++ b/js/src/builtin/TypedArray.js
@@ -1,14 +1,12 @@
 /* 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 "TypedObjectConstants.h"
-
 function ViewedArrayBufferIfReified(tarray) {
     assert(IsTypedArray(tarray), "non-typed array asked for its buffer");
 
     var buf = UnsafeGetReservedSlot(tarray, JS_TYPEDARRAYLAYOUT_BUFFER_SLOT);
     assert(buf === null || (IsObject(buf) && (IsArrayBuffer(buf) || IsSharedArrayBuffer(buf))),
            "unexpected value in buffer slot");
     return buf;
 }
@@ -499,17 +497,17 @@ function TypedArrayForEach(callbackfn/*,
     var len;
     if (isTypedArray)
         len = TypedArrayLength(O);
     else
         len = callFunction(CallTypedArrayMethodIfWrapped, O, O, "TypedArrayLength");
 
     // Step 5.
     if (arguments.length === 0)
-        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, 'TypedArray.prototype.forEach');
+        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "TypedArray.prototype.forEach");
     if (!IsCallable(callbackfn))
         ThrowTypeError(JSMSG_NOT_FUNCTION, DecompileArg(0, callbackfn));
 
     // Step 6.
     var T = arguments.length > 1 ? arguments[1] : void 0;
 
     // Step 7-8.
     // Step 7, 8a (implicit) and 8e.
@@ -697,17 +695,17 @@ function TypedArrayMap(callbackfn/*, thi
     var len;
     if (isTypedArray)
         len = TypedArrayLength(O);
     else
         len = callFunction(CallTypedArrayMethodIfWrapped, O, O, "TypedArrayLength");
 
     // Step 4.
     if (arguments.length === 0)
-        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, '%TypedArray%.prototype.map');
+        ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "%TypedArray%.prototype.map");
     if (!IsCallable(callbackfn))
         ThrowTypeError(JSMSG_NOT_FUNCTION, DecompileArg(0, callbackfn));
 
     // Step 5.
     var T = arguments.length > 1 ? arguments[1] : void 0;
 
     // Step 6.
     var A = TypedArraySpeciesCreateWithLength(O, len);
@@ -1645,17 +1643,17 @@ function ArrayBufferSlice(start, end) {
     if (actualLen < newLen)
         ThrowTypeError(JSMSG_SHORT_ARRAY_BUFFER_RETURNED, newLen, actualLen);
 
     // Step 18.
     if (IsDetachedBuffer(O))
         ThrowTypeError(JSMSG_TYPED_ARRAY_DETACHED);
 
     // Steps 19-21.
-    ArrayBufferCopyData(new_, O, first | 0, newLen | 0, isWrapped);
+    ArrayBufferCopyData(new_, 0, O, first | 0, newLen | 0, isWrapped);
 
     // Step 22.
     return new_;
 }
 
 function IsDetachedBufferThis() {
   return IsDetachedBuffer(this);
 }
@@ -1731,13 +1729,13 @@ function SharedArrayBufferSlice(start, e
         ThrowTypeError(JSMSG_SAME_SHARED_ARRAY_BUFFER_RETURNED);
 
     // Step 15.
     var actualLen = PossiblyWrappedSharedArrayBufferByteLength(new_);
     if (actualLen < newLen)
         ThrowTypeError(JSMSG_SHORT_SHARED_ARRAY_BUFFER_RETURNED, newLen, actualLen);
 
     // Steps 16-18.
-    SharedArrayBufferCopyData(new_, O, first | 0, newLen | 0, isWrapped);
+    SharedArrayBufferCopyData(new_, 0, O, first | 0, newLen | 0, isWrapped);
 
     // Step 19.
     return new_;
 }
--- a/js/src/builtin/TypedObject.js
+++ b/js/src/builtin/TypedObject.js
@@ -861,17 +861,17 @@ function SimdFormatString(descr, typedOb
       }
       case JS_SIMDTYPEREPR_BOOL64X2: {
           var x = callFunction(std_SIMD_Bool64x2_extractLane, null, typedObj, 0);
           var y = callFunction(std_SIMD_Bool64x2_extractLane, null, typedObj, 1);
           return `SIMD.${protoString}(${x}, ${y})`;
       }
   }
   assert(false, "unexpected SIMD kind");
-  return '?';
+  return "?";
 }
 
 ///////////////////////////////////////////////////////////////////////////
 // Miscellaneous
 
 function DescrsEquiv(descr1, descr2) {
   assert(IsObject(descr1) && ObjectIsTypeDescr(descr1), "descr1 not descr");
   assert(IsObject(descr2) && ObjectIsTypeDescr(descr2), "descr2 not descr");
--- a/js/src/builtin/Utilities.js
+++ b/js/src/builtin/Utilities.js
@@ -18,16 +18,17 @@
          Dump: false,
          callFunction: false,
          TO_UINT32: false,
          JSMSG_NOT_FUNCTION: false, JSMSG_MISSING_FUN_ARG: false,
          JSMSG_EMPTY_ARRAY_REDUCE: false, JSMSG_CANT_CONVERT_TO: false,
 */
 
 #include "SelfHostingDefines.h"
+#include "TypedObjectConstants.h"
 
 // Assertions and debug printing, defined here instead of in the header above
 // to make `assert` invisible to C++.
 #ifdef DEBUG
 #define assert(b, info) if (!(b)) AssertionFailed(__FILE__ + ":" + __LINE__ + ": " + info)
 #define dbg(msg) DumpMessage(callFunction(std_Array_pop, \
                                           StringSplitString(__FILE__, '/')) \
                              + '#' + __LINE__ + ': ' + msg)
--- a/js/src/gc/GCRuntime.h
+++ b/js/src/gc/GCRuntime.h
@@ -902,17 +902,17 @@ class GCRuntime
     bool shouldRepeatForDeadZone(JS::gcreason::Reason reason);
     void incrementalCollectSlice(SliceBudget& budget, JS::gcreason::Reason reason,
                                  AutoLockForExclusiveAccess& lock);
 
     void pushZealSelectedObjects();
     void purgeRuntime(AutoLockForExclusiveAccess& lock);
     MOZ_MUST_USE bool beginMarkPhase(JS::gcreason::Reason reason, AutoLockForExclusiveAccess& lock);
     bool shouldPreserveJITCode(JSCompartment* comp, int64_t currentTime,
-                               JS::gcreason::Reason reason);
+                               JS::gcreason::Reason reason, bool canAllocateMoreCode);
     void traceRuntimeForMajorGC(JSTracer* trc, AutoLockForExclusiveAccess& lock);
     void traceRuntimeAtoms(JSTracer* trc, AutoLockForExclusiveAccess& lock);
     void traceRuntimeCommon(JSTracer* trc, TraceOrMarkRuntime traceOrMark,
                             AutoLockForExclusiveAccess& lock);
     void bufferGrayRoots();
     void maybeDoCycleCollection();
     void markCompartments();
     IncrementalProgress drainMarkStack(SliceBudget& sliceBudget, gcstats::Phase phase);
--- a/js/src/irregexp/RegExpEngine.cpp
+++ b/js/src/irregexp/RegExpEngine.cpp
@@ -1775,17 +1775,18 @@ irregexp::CompilePattern(JSContext* cx, 
 
     Maybe<jit::JitContext> ctx;
     Maybe<NativeRegExpMacroAssembler> native_assembler;
     Maybe<InterpretedRegExpMacroAssembler> interpreted_assembler;
 
     RegExpMacroAssembler* assembler;
     if (IsNativeRegExpEnabled(cx) &&
         !force_bytecode &&
-        jit::CanLikelyAllocateMoreExecutableMemory())
+        jit::CanLikelyAllocateMoreExecutableMemory() &&
+        shared->getSource()->length() < 32 * 1024)
     {
         NativeRegExpMacroAssembler::Mode mode =
             is_ascii ? NativeRegExpMacroAssembler::ASCII
                      : NativeRegExpMacroAssembler::CHAR16;
 
         ctx.emplace(cx, (jit::TempAllocator*) nullptr);
         native_assembler.emplace(cx, &alloc, shared, mode, (data->capture_count + 1) * 2);
         assembler = native_assembler.ptr();
--- a/js/src/jit/ExecutableAllocator.cpp
+++ b/js/src/jit/ExecutableAllocator.cpp
@@ -22,30 +22,21 @@
  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
 #include "jit/ExecutableAllocator.h"
 
-#include "mozilla/Atomics.h"
-
 #include "jit/JitCompartment.h"
 #include "js/MemoryMetrics.h"
 
-#ifdef __APPLE__
-#include <TargetConditionals.h>
-#endif
-
 using namespace js::jit;
 
-size_t ExecutableAllocator::pageSize = 0;
-size_t ExecutableAllocator::largeAllocSize = 0;
-
 ExecutablePool::~ExecutablePool()
 {
     MOZ_ASSERT(m_ionCodeBytes == 0);
     MOZ_ASSERT(m_baselineCodeBytes == 0);
     MOZ_ASSERT(m_regexpCodeBytes == 0);
     MOZ_ASSERT(m_otherCodeBytes == 0);
 
     MOZ_ASSERT(!isMarked());
@@ -155,21 +146,21 @@ ExecutableAllocator::poolForSize(size_t 
             minPool = pool;
     }
     if (minPool) {
         minPool->addRef();
         return minPool;
     }
 
     // If the request is large, we just provide a unshared allocator
-    if (n > largeAllocSize)
+    if (n > ExecutableCodePageSize)
         return createPool(n);
 
     // Create a new allocator
-    ExecutablePool* pool = createPool(largeAllocSize);
+    ExecutablePool* pool = createPool(ExecutableCodePageSize);
     if (!pool)
         return nullptr;
     // At this point, local |pool| is the owner.
 
     if (m_smallPools.length() < maxSmallPools) {
         // We haven't hit the maximum number of live pools; add the new pool.
         // If append() OOMs, we just return an unshared allocator.
         if (m_smallPools.append(pool))
@@ -215,17 +206,17 @@ ExecutableAllocator::roundUpAllocationSi
     return size;
 }
 
 ExecutablePool*
 ExecutableAllocator::createPool(size_t n)
 {
     MOZ_ASSERT(rt_->jitRuntime()->preventBackedgePatching());
 
-    size_t allocSize = roundUpAllocationSize(n, pageSize);
+    size_t allocSize = roundUpAllocationSize(n, ExecutableCodePageSize);
     if (allocSize == OVERSIZE_ALLOCATION)
         return nullptr;
 
     if (!m_pools.initialized() && !m_pools.init())
         return nullptr;
 
     ExecutablePool::Allocation a = systemAlloc(allocSize);
     if (!a.pages)
@@ -295,38 +286,16 @@ ExecutableAllocator::purge()
     // Don't race with reprotectAll called from the signal handler.
     JitRuntime::AutoPreventBackedgePatching apbp(rt_);
 
     for (size_t i = 0; i < m_smallPools.length(); i++)
         m_smallPools[i]->release();
     m_smallPools.clear();
 }
 
-/* static */ void
-ExecutableAllocator::initStatic()
-{
-    if (!pageSize) {
-        pageSize = determinePageSize();
-        // On Windows, VirtualAlloc effectively allocates in 64K chunks.
-        // (Technically, it allocates in page chunks, but the starting
-        // address is always a multiple of 64K, so each allocation uses up
-        // 64K of address space.)  So a size less than that would be
-        // pointless.  But it turns out that 64KB is a reasonable size for
-        // all platforms.  (This assumes 4KB pages.) On 64-bit windows,
-        // AllocateExecutableMemory prepends an extra page for structured
-        // exception handling data (see comments in function) onto whatever
-        // is passed in, so subtract one page here.
-#if defined(XP_WIN) && (defined(_M_X64) || defined(__x86_64__))
-        largeAllocSize = pageSize * 15;
-#else
-        largeAllocSize = pageSize * 16;
-#endif
-    }
-}
-
 void
 ExecutableAllocator::addSizeOfCode(JS::CodeSizes* sizes) const
 {
     if (m_pools.initialized()) {
         for (ExecPoolHashSet::Range r = m_pools.all(); !r.empty(); r.popFront()) {
             ExecutablePool* pool = r.front();
             sizes->ion      += pool->m_ionCodeBytes;
             sizes->baseline += pool->m_baselineCodeBytes;
@@ -338,37 +307,33 @@ ExecutableAllocator::addSizeOfCode(JS::C
                                                        - pool->m_otherCodeBytes;
         }
     }
 }
 
 void
 ExecutableAllocator::reprotectAll(ProtectionSetting protection)
 {
-#ifdef NON_WRITABLE_JIT_CODE
     if (!m_pools.initialized())
         return;
 
     for (ExecPoolHashSet::Range r = m_pools.all(); !r.empty(); r.popFront())
         reprotectPool(rt_, r.front(), protection);
-#endif
 }
 
 /* static */ void
 ExecutableAllocator::reprotectPool(JSRuntime* rt, ExecutablePool* pool, ProtectionSetting protection)
 {
-#ifdef NON_WRITABLE_JIT_CODE
     // Don't race with reprotectAll called from the signal handler.
     MOZ_ASSERT(rt->jitRuntime()->preventBackedgePatching() ||
                rt->unsafeContextFromAnyThread()->handlingJitInterrupt());
 
     char* start = pool->m_allocation.pages;
-    if (!reprotectRegion(start, pool->m_freePtr - start, protection))
+    if (!ReprotectRegion(start, pool->m_freePtr - start, protection))
         MOZ_CRASH();
-#endif
 }
 
 /* static */ void
 ExecutableAllocator::poisonCode(JSRuntime* rt, JitPoisonRangeVector& ranges)
 {
     MOZ_ASSERT(CurrentThreadCanAccessRuntime(rt));
 
     // Don't race with reprotectAll called from the signal handler.
@@ -388,79 +353,39 @@ ExecutableAllocator::poisonCode(JSRuntim
             continue;
         }
 
         MOZ_ASSERT(pool->m_refCount > 1);
 
         // Use the pool's mark bit to indicate we made the pool writable.
         // This avoids reprotecting a pool multiple times.
         if (!pool->isMarked()) {
-            reprotectPool(rt, pool, Writable);
+            reprotectPool(rt, pool, ProtectionSetting::Writable);
             pool->mark();
         }
 
         memset(ranges[i].start, JS_SWEPT_CODE_PATTERN, ranges[i].size);
     }
 
     // Make the pools executable again and drop references.
     for (size_t i = 0; i < ranges.length(); i++) {
         ExecutablePool* pool = ranges[i].pool;
         if (pool->isMarked()) {
-            reprotectPool(rt, pool, Executable);
+            reprotectPool(rt, pool, ProtectionSetting::Executable);
             pool->unmark();
         }
         pool->release();
     }
 }
 
-// Limit on the number of bytes of executable memory to prevent JIT spraying
-// attacks.
-#if JS_BITS_PER_WORD == 32
-static const size_t MaxCodeBytesPerProcess = 160 * 1024 * 1024;
-#else
-static const size_t MaxCodeBytesPerProcess = 640 * 1024 * 1024;
-#endif
-
-static mozilla::Atomic<size_t> allocatedExecutableBytes(0);
-
-bool
-js::jit::AddAllocatedExecutableBytes(size_t bytes)
+ExecutablePool::Allocation
+ExecutableAllocator::systemAlloc(size_t n)
 {
-    MOZ_ASSERT(allocatedExecutableBytes <= MaxCodeBytesPerProcess);
-
-    // Multiple threads can call this concurrently. We use compareExchange to
-    // ensure allocatedExecutableBytes is always <= MaxCodeBytesPerProcess.
-    while (true) {
-        size_t bytesOld = allocatedExecutableBytes;
-        size_t bytesNew = bytesOld + bytes;
-
-        if (bytesNew > MaxCodeBytesPerProcess)
-            return false;
-
-        if (allocatedExecutableBytes.compareExchange(bytesOld, bytesNew))
-            return true;
-    }
-
-    MOZ_CRASH();
+    void* allocation = AllocateExecutableMemory(n, ProtectionSetting::Executable);
+    ExecutablePool::Allocation alloc = { reinterpret_cast<char*>(allocation), n };
+    return alloc;
 }
 
 void
-js::jit::SubAllocatedExecutableBytes(size_t bytes)
+ExecutableAllocator::systemRelease(const ExecutablePool::Allocation& alloc)
 {
-    MOZ_ASSERT(bytes <= allocatedExecutableBytes);
-    allocatedExecutableBytes -= bytes;
-}
-
-void
-js::jit::AssertAllocatedExecutableBytesIsZero()
-{
-    MOZ_ASSERT(allocatedExecutableBytes == 0);
+    DeallocateExecutableMemory(alloc.pages, alloc.size);
 }
-
-bool
-js::jit::CanLikelyAllocateMoreExecutableMemory()
-{
-    // Use a 16 MB buffer.
-    static const size_t BufferSize = 16 * 1024 * 1024;
-
-    MOZ_ASSERT(allocatedExecutableBytes <= MaxCodeBytesPerProcess);
-    return allocatedExecutableBytes + BufferSize <= MaxCodeBytesPerProcess;
-}
--- a/js/src/jit/ExecutableAllocator.h
+++ b/js/src/jit/ExecutableAllocator.h
@@ -37,16 +37,17 @@
 #include "jsalloc.h"
 
 #include "jit/arm/Simulator-arm.h"
 #if defined(JS_CODEGEN_ARM64)
 #include "jit/arm64/vixl/Cpu-vixl.h"
 #endif
 #include "jit/mips32/Simulator-mips32.h"
 #include "jit/mips64/Simulator-mips64.h"
+#include "jit/ProcessExecutableMemory.h"
 #include "js/GCAPI.h"
 #include "js/HashTable.h"
 #include "js/Vector.h"
 
 #if defined(__sparc__)
 #ifdef __linux__  // bugzilla 502369
 static void sync_instruction_memory(caddr_t v, u_int len)
 {
@@ -155,45 +156,36 @@ struct JitPoisonRange
 
     JitPoisonRange(jit::ExecutablePool* pool, void* start, size_t size)
       : pool(pool), start(start), size(size)
     {}
 };
 
 typedef Vector<JitPoisonRange, 0, SystemAllocPolicy> JitPoisonRangeVector;
 
-#define NON_WRITABLE_JIT_CODE 1
-
 class ExecutableAllocator
 {
     JSRuntime* rt_;
 
   public:
-    enum ProtectionSetting { Writable, Executable };
-
     explicit ExecutableAllocator(JSRuntime* rt);
     ~ExecutableAllocator();
 
     void purge();
 
     // alloc() returns a pointer to some memory, and also (by reference) a
     // pointer to reference-counted pool. The caller owns a reference to the
     // pool; i.e. alloc() increments the count before returning the object.
     void* alloc(size_t n, ExecutablePool** poolp, CodeKind type);
 
     void releasePoolPages(ExecutablePool* pool);
 
     void addSizeOfCode(JS::CodeSizes* sizes) const;
 
-    static void initStatic();
-
   private:
-    static size_t pageSize;
-    static size_t largeAllocSize;
-
     static const size_t OVERSIZE_ALLOCATION = size_t(-1);
 
     static size_t roundUpAllocationSize(size_t request, size_t granularity);
 
     // On OOM, this will return an Allocation where pages is nullptr.
     ExecutablePool::Allocation systemAlloc(size_t n);
     static void systemRelease(const ExecutablePool::Allocation& alloc);
 
@@ -201,42 +193,32 @@ class ExecutableAllocator
     ExecutablePool* poolForSize(size_t n);
 
     static void reprotectPool(JSRuntime* rt, ExecutablePool* pool, ProtectionSetting protection);
 
   public:
     MOZ_MUST_USE
     static bool makeWritable(void* start, size_t size)
     {
-#ifdef NON_WRITABLE_JIT_CODE
-        return reprotectRegion(start, size, Writable);
-#else
-        return true;
-#endif
+        return ReprotectRegion(start, size, ProtectionSetting::Writable);
     }
 
     MOZ_MUST_USE
     static bool makeExecutable(void* start, size_t size)
     {
-#ifdef NON_WRITABLE_JIT_CODE
-        return reprotectRegion(start, size, Executable);
-#else
-        return true;
-#endif
+        return ReprotectRegion(start, size, ProtectionSetting::Executable);
     }
 
     void makeAllWritable() {
-        reprotectAll(Writable);
+        reprotectAll(ProtectionSetting::Writable);
     }
     void makeAllExecutable() {
-        reprotectAll(Executable);
+        reprotectAll(ProtectionSetting::Executable);
     }
 
-    static unsigned initialProtectionFlags(ProtectionSetting protection);
-
     static void poisonCode(JSRuntime* rt, JitPoisonRangeVector& ranges);
 
 #if defined(JS_CODEGEN_X86) || defined(JS_CODEGEN_X64) || defined(JS_SIMULATOR_ARM64)
     static void cacheFlush(void*, size_t)
     {
     }
 #elif defined(JS_SIMULATOR_ARM) || defined(JS_SIMULATOR_MIPS32) || defined(JS_SIMULATOR_MIPS64)
     static void cacheFlush(void* code, size_t size)
@@ -306,63 +288,27 @@ class ExecutableAllocator
         sync_instruction_memory((caddr_t)code, size);
     }
 #endif
 
   private:
     ExecutableAllocator(const ExecutableAllocator&) = delete;
     void operator=(const ExecutableAllocator&) = delete;
 
-#ifdef NON_WRITABLE_JIT_CODE
-    MOZ_MUST_USE
-    static bool reprotectRegion(void*, size_t, ProtectionSetting);
-#endif
-
     void reprotectAll(ProtectionSetting);
 
     // These are strong references;  they keep pools alive.
     static const size_t maxSmallPools = 4;
     typedef js::Vector<ExecutablePool*, maxSmallPools, js::SystemAllocPolicy> SmallExecPoolVector;
     SmallExecPoolVector m_smallPools;
 
     // All live pools are recorded here, just for stats purposes.  These are
     // weak references;  they don't keep pools alive.  When a pool is destroyed
     // its reference is removed from m_pools.
     typedef js::HashSet<ExecutablePool*, js::DefaultHasher<ExecutablePool*>, js::SystemAllocPolicy>
             ExecPoolHashSet;
     ExecPoolHashSet m_pools;    // All pools, just for stats purposes.
-
-    static size_t determinePageSize();
 };
 
-extern void*
-AllocateExecutableMemory(size_t bytes, unsigned permissions, const char* tag,
-                         size_t pageSize);
-
-extern void
-DeallocateExecutableMemory(void* addr, size_t bytes, size_t pageSize);
-
-// These functions are called by the platform-specific definitions of
-// (Allocate|Deallocate)ExecutableMemory and should not otherwise be
-// called directly.
-
-extern MOZ_MUST_USE bool
-AddAllocatedExecutableBytes(size_t bytes);
-
-extern void
-SubAllocatedExecutableBytes(size_t bytes);
-
-extern void
-AssertAllocatedExecutableBytesIsZero();
-
-// Returns true if we can allocate a few more MB of executable code without
-// hitting our code limit. This function can be used to stop compiling things
-// that are optional (like Baseline and Ion code) when we're about to reach the
-// limit, so we are less likely to OOM or crash. Note that the limit is
-// per-process, so other threads can also allocate code after we call this
-// function.
-extern bool
-CanLikelyAllocateMoreExecutableMemory();
-
 } // namespace jit
 } // namespace js
 
 #endif /* jit_ExecutableAllocator_h */
deleted file mode 100644
--- a/js/src/jit/ExecutableAllocatorPosix.cpp
+++ /dev/null
@@ -1,126 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
- * vim: set ts=8 sts=4 et sw=4 tw=99:
- *
- * Copyright (C) 2008 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "mozilla/DebugOnly.h"
-#include "mozilla/ScopeExit.h"
-#include "mozilla/TaggedAnonymousMemory.h"
-
-#include <errno.h>
-#include <sys/mman.h>
-#include <unistd.h>
-
-#include "jit/ExecutableAllocator.h"
-#include "js/Utility.h"
-
-using namespace js::jit;
-
-size_t
-ExecutableAllocator::determinePageSize()
-{
-    return getpagesize();
-}
-
-void*
-js::jit::AllocateExecutableMemory(size_t bytes, unsigned permissions, const char* tag,
-                                  size_t pageSize)
-{
-    MOZ_ASSERT(bytes % pageSize == 0);
-
-    if (!AddAllocatedExecutableBytes(bytes))
-        return nullptr;
-
-    auto autoSubtract = mozilla::MakeScopeExit([&] { SubAllocatedExecutableBytes(bytes); });
-
-    void* p = MozTaggedAnonymousMmap(nullptr, bytes, permissions, MAP_PRIVATE | MAP_ANON, -1, 0,
-                                     tag);
-    if (p == MAP_FAILED)
-        return nullptr;
-
-    autoSubtract.release();
-    return p;
-}
-
-void
-js::jit::DeallocateExecutableMemory(void* addr, size_t bytes, size_t pageSize)
-{
-    MOZ_ASSERT(bytes % pageSize == 0);
-    mozilla::DebugOnly<int> result = munmap(addr, bytes);
-    MOZ_ASSERT(!result || errno == ENOMEM);
-
-    SubAllocatedExecutableBytes(bytes);
-}
-
-ExecutablePool::Allocation
-ExecutableAllocator::systemAlloc(size_t n)
-{
-    void* allocation = AllocateExecutableMemory(n, initialProtectionFlags(Executable),
-                                                "js-jit-code", pageSize);
-    ExecutablePool::Allocation alloc = { reinterpret_cast<char*>(allocation), n };
-    return alloc;
-}
-
-void
-ExecutableAllocator::systemRelease(const ExecutablePool::Allocation& alloc)
-{
-    DeallocateExecutableMemory(alloc.pages, alloc.size, pageSize);
-}
-
-static const unsigned FLAGS_RW = PROT_READ | PROT_WRITE;
-static const unsigned FLAGS_RX = PROT_READ | PROT_EXEC;
-
-#if defined(NON_WRITABLE_JIT_CODE)
-
-bool
-ExecutableAllocator::reprotectRegion(void* start, size_t size, ProtectionSetting setting)
-{
-    MOZ_ASSERT(pageSize);
-
-    // Calculate the start of the page containing this region,
-    // and account for this extra memory within size.
-    intptr_t startPtr = reinterpret_cast<intptr_t>(start);
-    intptr_t pageStartPtr = startPtr & ~(pageSize - 1);
-    void* pageStart = reinterpret_cast<void*>(pageStartPtr);
-    size += (startPtr - pageStartPtr);
-
-    // Round size up
-    size += (pageSize - 1);
-    size &= ~(pageSize - 1);
-
-    return !mprotect(pageStart, size, (setting == Writable) ? FLAGS_RW : FLAGS_RX);
-}
-
-#endif // defined(NON_WRITABLE_JIT_CODE)
-
-/* static */ unsigned
-ExecutableAllocator::initialProtectionFlags(ProtectionSetting protection)
-{
-#ifdef NON_WRITABLE_JIT_CODE
-    return (protection == Writable) ? FLAGS_RW : FLAGS_RX;
-#else
-    return FLAGS_RW | FLAGS_RX;
-#endif
-}
deleted file mode 100644
--- a/js/src/jit/ExecutableAllocatorWin.cpp
+++ /dev/null
@@ -1,305 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
- * vim: set ts=8 sts=4 et sw=4 tw=99:
- *
- * Copyright (C) 2008 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "mozilla/ScopeExit.h"
-#include "mozilla/StackWalk_windows.h"
-#include "mozilla/WindowsVersion.h"
-
-#include "jsfriendapi.h"
-#include "jsmath.h"
-#include "jswin.h"
-
-#include "jit/ExecutableAllocator.h"
-
-using namespace js::jit;
-
-size_t
-ExecutableAllocator::determinePageSize()
-{
-    SYSTEM_INFO system_info;
-    GetSystemInfo(&system_info);
-    return system_info.dwPageSize;
-}
-
-static void*
-ComputeRandomAllocationAddress()
-{
-    /*
-     * Inspiration is V8's OS::Allocate in platform-win32.cc.
-     *
-     * VirtualAlloc takes 64K chunks out of the virtual address space, so we
-     * keep 16b alignment.
-     *
-     * x86: V8 comments say that keeping addresses in the [64MiB, 1GiB) range
-     * tries to avoid system default DLL mapping space. In the end, we get 13
-     * bits of randomness in our selection.
-     * x64: [2GiB, 4TiB), with 25 bits of randomness.
-     */
-#ifdef HAVE_64BIT_BUILD
-    static const uintptr_t base = 0x0000000080000000;
-    static const uintptr_t mask = 0x000003ffffff0000;
-#elif defined(_M_IX86) || defined(__i386__)
-    static const uintptr_t base = 0x04000000;
-    static const uintptr_t mask = 0x3fff0000;
-#else
-# error "Unsupported architecture"
-#endif
-
-    uint64_t rand = js::GenerateRandomSeed();
-    return (void*) (base | (rand & mask));
-}
-
-#ifdef HAVE_64BIT_BUILD
-static js::JitExceptionHandler sJitExceptionHandler;
-
-JS_FRIEND_API(void)
-js::SetJitExceptionHandler(JitExceptionHandler handler)
-{
-    MOZ_ASSERT(!sJitExceptionHandler);
-    sJitExceptionHandler = handler;
-}
-
-// From documentation for UNWIND_INFO on
-// http://msdn.microsoft.com/en-us/library/ddssxxy8.aspx
-struct UnwindInfo
-{
-    uint8_t version : 3;
-    uint8_t flags : 5;
-    uint8_t sizeOfPrologue;
-    uint8_t countOfUnwindCodes;
-    uint8_t frameRegister : 4;
-    uint8_t frameOffset : 4;
-    ULONG exceptionHandler;
-};
-
-static const unsigned ThunkLength = 12;
-
-struct ExceptionHandlerRecord
-{
-    RUNTIME_FUNCTION runtimeFunction;
-    UnwindInfo unwindInfo;
-    uint8_t thunk[ThunkLength];
-};
-
-// This function must match the function pointer type PEXCEPTION_HANDLER
-// mentioned in:
-//   http://msdn.microsoft.com/en-us/library/ssa62fwe.aspx.
-// This type is rather elusive in documentation; Wine is the best I've found:
-//   http://source.winehq.org/source/include/winnt.h
-static DWORD
-ExceptionHandler(PEXCEPTION_RECORD exceptionRecord, _EXCEPTION_REGISTRATION_RECORD*,
-                 PCONTEXT context, _EXCEPTION_REGISTRATION_RECORD**)
-{
-    return sJitExceptionHandler(exceptionRecord, context);
-}
-
-// For an explanation of the problem being solved here, see
-// SetJitExceptionFilter in jsfriendapi.h.
-static bool
-RegisterExecutableMemory(void* p, size_t bytes, size_t pageSize)
-{
-    DWORD oldProtect;
-    if (!VirtualProtect(p, pageSize, PAGE_READWRITE, &oldProtect))
-        return false;
-
-    ExceptionHandlerRecord* r = reinterpret_cast<ExceptionHandlerRecord*>(p);
-
-    // All these fields are specified to be offsets from the base of the
-    // executable code (which is 'p'), even if they have 'Address' in their
-    // names. In particular, exceptionHandler is a ULONG offset which is a
-    // 32-bit integer. Since 'p' can be farther than INT32_MAX away from
-    // sJitExceptionHandler, we must generate a little thunk inside the
-    // record. The record is put on its own page so that we can take away write
-    // access to protect against accidental clobbering.
-
-    r->runtimeFunction.BeginAddress = pageSize;
-    r->runtimeFunction.EndAddress = (DWORD)bytes;
-    r->runtimeFunction.UnwindData = offsetof(ExceptionHandlerRecord, unwindInfo);
-
-    r->unwindInfo.version = 1;
-    r->unwindInfo.flags = UNW_FLAG_EHANDLER;
-    r->unwindInfo.sizeOfPrologue = 0;
-    r->unwindInfo.countOfUnwindCodes = 0;
-    r->unwindInfo.frameRegister = 0;
-    r->unwindInfo.frameOffset = 0;
-    r->unwindInfo.exceptionHandler = offsetof(ExceptionHandlerRecord, thunk);
-
-    // mov imm64, rax
-    r->thunk[0]  = 0x48;
-    r->thunk[1]  = 0xb8;
-    void* handler = JS_FUNC_TO_DATA_PTR(void*, ExceptionHandler);
-    memcpy(&r->thunk[2], &handler, 8);
-
-    // jmp rax
-    r->thunk[10] = 0xff;
-    r->thunk[11] = 0xe0;
-
-    if (!VirtualProtect(p, pageSize, PAGE_EXECUTE_READ, &oldProtect))
-        return false;
-
-    // XXX NB: The profiler believes this function is only called from the main
-    // thread. If that ever becomes untrue, the profiler must be updated
-    // immediately.
-    AcquireStackWalkWorkaroundLock();
-
-    bool success = RtlAddFunctionTable(&r->runtimeFunction, 1, reinterpret_cast<DWORD64>(p));
-
-    ReleaseStackWalkWorkaroundLock();
-
-    return success;
-}
-
-static void
-UnregisterExecutableMemory(void* p, size_t bytes, size_t pageSize)
-{
-    ExceptionHandlerRecord* r = reinterpret_cast<ExceptionHandlerRecord*>(p);
-
-    // XXX NB: The profiler believes this function is only called from the main
-    // thread. If that ever becomes untrue, the profiler must be updated
-    // immediately.
-    AcquireStackWalkWorkaroundLock();
-
-    RtlDeleteFunctionTable(&r->runtimeFunction);
-
-    ReleaseStackWalkWorkaroundLock();
-}
-#endif
-
-static const size_t VirtualAllocGranularity = 64 * 1024;
-
-void*
-js::jit::AllocateExecutableMemory(size_t bytes, unsigned permissions, const char* tag,
-                                  size_t pageSize)
-{
-    MOZ_ASSERT(bytes % pageSize == 0);
-
-    // VirtualAlloc returns 64 KB chunks, so we round the value we pass to
-    // AddAllocatedExecutableBytes up to 64 KB to account for this. See
-    // bug 1325200.
-    size_t bytesRounded = JS_ROUNDUP(bytes, VirtualAllocGranularity);
-    if (!AddAllocatedExecutableBytes(bytesRounded))
-        return nullptr;
-
-    auto autoSubtract = mozilla::MakeScopeExit([&] { SubAllocatedExecutableBytes(bytesRounded); });
-
-#ifdef HAVE_64BIT_BUILD
-    if (sJitExceptionHandler)
-        bytes += pageSize;
-#endif
-
-    void* randomAddr = ComputeRandomAllocationAddress();
-
-    void* p = VirtualAlloc(randomAddr, bytes, MEM_COMMIT | MEM_RESERVE, permissions);
-    if (!p) {
-        // Try again without randomAddr.
-        p = VirtualAlloc(nullptr, bytes, MEM_COMMIT | MEM_RESERVE, permissions);
-        if (!p)
-            return nullptr;
-    }
-
-#ifdef HAVE_64BIT_BUILD
-    if (sJitExceptionHandler) {
-        if (!RegisterExecutableMemory(p, bytes, pageSize)) {
-            VirtualFree(p, 0, MEM_RELEASE);
-            return nullptr;
-        }
-
-        p = (uint8_t*)p + pageSize;
-    }
-#endif
-
-    autoSubtract.release();
-    return p;
-}
-
-void
-js::jit::DeallocateExecutableMemory(void* addr, size_t bytes, size_t pageSize)
-{
-    MOZ_ASSERT(bytes % pageSize == 0);
-
-#ifdef HAVE_64BIT_BUILD
-    if (sJitExceptionHandler) {
-        addr = (uint8_t*)addr - pageSize;
-        UnregisterExecutableMemory(addr, bytes, pageSize);
-    }
-#endif
-
-    VirtualFree(addr, 0, MEM_RELEASE);
-
-    SubAllocatedExecutableBytes(JS_ROUNDUP(bytes, VirtualAllocGranularity));
-}
-
-ExecutablePool::Allocation
-ExecutableAllocator::systemAlloc(size_t n)
-{
-    unsigned flags = initialProtectionFlags(Executable);
-    void* allocation = AllocateExecutableMemory(n, flags, "js-jit-code", pageSize);
-
-    ExecutablePool::Allocation alloc = { reinterpret_cast<char*>(allocation), n };
-    return alloc;
-}
-
-void
-ExecutableAllocator::systemRelease(const ExecutablePool::Allocation& alloc)
-{
-    DeallocateExecutableMemory(alloc.pages, alloc.size, pageSize);
-}
-
-#if defined(NON_WRITABLE_JIT_CODE)
-
-bool
-ExecutableAllocator::reprotectRegion(void* start, size_t size, ProtectionSetting setting)
-{
-    MOZ_ASSERT(pageSize);
-
-    // Calculate the start of the page containing this region,
-    // and account for this extra memory within size.
-    intptr_t startPtr = reinterpret_cast<intptr_t>(start);
-    intptr_t pageStartPtr = startPtr & ~(pageSize - 1);
-    void* pageStart = reinterpret_cast<void*>(pageStartPtr);
-    size += (startPtr - pageStartPtr);
-
-    // Round size up
-    size += (pageSize - 1);
-    size &= ~(pageSize - 1);
-
-    DWORD oldProtect;
-    int flags = (setting == Writable) ? PAGE_READWRITE : PAGE_EXECUTE_READ;
-    return VirtualProtect(pageStart, size, flags, &oldProtect);
-}
-
-#endif // defined(NON_WRITABLE_JIT_CODE)
-
-/* static */ unsigned
-ExecutableAllocator::initialProtectionFlags(ProtectionSetting protection)
-{
-#ifdef NON_WRITABLE_JIT_CODE
-    return (protection == Writable) ? PAGE_READWRITE : PAGE_EXECUTE_READ;
-#else
-    return PAGE_EXECUTE_READWRITE;
-#endif
-}
copy from js/src/jit/JSONSpewer.cpp
copy to js/src/jit/JSONPrinter.cpp
--- a/js/src/jit/JSONSpewer.cpp
+++ b/js/src/jit/JSONPrinter.cpp
@@ -1,410 +1,141 @@
 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
  * vim: set ts=8 sts=4 et sw=4 tw=99:
  * 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/. */
 
 #ifdef JS_JITSPEW
 
-#include "jit/JSONSpewer.h"
+#include "jit/JSONPrinter.h"
 
+#include "mozilla/Assertions.h"
 #include "mozilla/SizePrintfMacros.h"
 
 #include <stdarg.h>
 
-#include "jit/BacktrackingAllocator.h"
-#include "jit/LIR.h"
-#include "jit/MIR.h"
-#include "jit/MIRGraph.h"
-#include "jit/RangeAnalysis.h"
-
 using namespace js;
 using namespace js::jit;
 
 void
-JSONSpewer::indent()
+JSONPrinter::indent()
 {
     MOZ_ASSERT(indentLevel_ >= 0);
     out_.printf("\n");
     for (int i = 0; i < indentLevel_; i++)
         out_.printf("  ");
 }
 
 void
-JSONSpewer::property(const char* name)
+JSONPrinter::property(const char* name)
 {
     if (!first_)
         out_.printf(",");
     indent();
     out_.printf("\"%s\":", name);
     first_ = false;
 }
 
 void
-JSONSpewer::beginObject()
+JSONPrinter::beginObject()
 {
     if (!first_) {
         out_.printf(",");
         indent();
     }
     out_.printf("{");
     indentLevel_++;
     first_ = true;
 }
 
 void
-JSONSpewer::beginObjectProperty(const char* name)
+JSONPrinter::beginObjectProperty(const char* name)
 {
     property(name);
     out_.printf("{");
     indentLevel_++;
     first_ = true;
 }
 
 void
-JSONSpewer::beginListProperty(const char* name)
+JSONPrinter::beginListProperty(const char* name)
 {
     property(name);
     out_.printf("[");
     first_ = true;
 }
 
 void
-JSONSpewer::beginStringProperty(const char* name)
+JSONPrinter::beginStringProperty(const char* name)
 {
     property(name);
     out_.printf("\"");
 }
 
 void
-JSONSpewer::endStringProperty()
+JSONPrinter::endStringProperty()
 {
     out_.printf("\"");
 }
 
 void
-JSONSpewer::stringProperty(const char* name, const char* format, ...)
+JSONPrinter::stringProperty(const char* name, const char* format, ...)
 {
     va_list ap;
     va_start(ap, format);
 
     beginStringProperty(name);
     out_.vprintf(format, ap);
     endStringProperty();
 
     va_end(ap);
 }
 
 void
-JSONSpewer::stringValue(const char* format, ...)
+JSONPrinter::stringValue(const char* format, ...)
 {
     va_list ap;
     va_start(ap, format);
 
     if (!first_)
         out_.printf(",");
     out_.printf("\"");
     out_.vprintf(format, ap);
     out_.printf("\"");
 
     va_end(ap);
     first_ = false;
 }
 
 void
-JSONSpewer::integerProperty(const char* name, int value)
+JSONPrinter::integerProperty(const char* name, int value)
 {
     property(name);
     out_.printf("%d", value);
 }
 
 void
-JSONSpewer::integerValue(int value)
+JSONPrinter::integerValue(int value)
 {
     if (!first_)
         out_.printf(",");
     out_.printf("%d", value);
     first_ = false;
 }
 
 void
-JSONSpewer::endObject()
+JSONPrinter::endObject()
 {
     indentLevel_--;
     indent();
     out_.printf("}");
     first_ = false;
 }
 
 void
-JSONSpewer::endList()
+JSONPrinter::endList()
 {
     out_.printf("]");
     first_ = false;
 }
 
-void
-JSONSpewer::beginFunction(JSScript* script)
-{
-    beginObject();
-    if (script)
-        stringProperty("name", "%s:%" PRIuSIZE, script->filename(), script->lineno());
-    else
-        stringProperty("name", "wasm compilation");
-    beginListProperty("passes");
-}
-
-void
-JSONSpewer::beginPass(const char* pass)
-{
-    beginObject();
-    stringProperty("name", "%s", pass);
-}
-
-void
-JSONSpewer::spewMResumePoint(MResumePoint* rp)
-{
-    if (!rp)
-        return;
-
-    beginObjectProperty("resumePoint");
-
-    if (rp->caller())
-        integerProperty("caller", rp->caller()->block()->id());
-
-    property("mode");
-    switch (rp->mode()) {
-      case MResumePoint::ResumeAt:
-        out_.printf("\"At\"");
-        break;
-      case MResumePoint::ResumeAfter:
-        out_.printf("\"After\"");
-        break;
-      case MResumePoint::Outer:
-        out_.printf("\"Outer\"");
-        break;
-    }
-
-    beginListProperty("operands");
-    for (MResumePoint* iter = rp; iter; iter = iter->caller()) {
-        for (int i = iter->numOperands() - 1; i >= 0; i--)
-            integerValue(iter->getOperand(i)->id());
-        if (iter->caller())
-            stringValue("|");
-    }
-    endList();
-
-    endObject();
-}
-
-void
-JSONSpewer::spewMDef(MDefinition* def)
-{
-    beginObject();
-
-    integerProperty("id", def->id());
-
-    property("opcode");
-    out_.printf("\"");
-    def->printOpcode(out_);
-    out_.printf("\"");
-
-    beginListProperty("attributes");
-#define OUTPUT_ATTRIBUTE(X) do{ if(def->is##X()) stringValue(#X); } while(0);
-    MIR_FLAG_LIST(OUTPUT_ATTRIBUTE);
-#undef OUTPUT_ATTRIBUTE
-    endList();
-
-    beginListProperty("inputs");
-    for (size_t i = 0, e = def->numOperands(); i < e; i++)
-        integerValue(def->getOperand(i)->id());
-    endList();
-
-    beginListProperty("uses");
-    for (MUseDefIterator use(def); use; use++)
-        integerValue(use.def()->id());
-    endList();
-
-    if (!def->isLowered()) {
-        beginListProperty("memInputs");
-        if (def->dependency())
-            integerValue(def->dependency()->id());
-        endList();
-    }
-
-    bool isTruncated = false;
-    if (def->isAdd() || def->isSub() || def->isMod() || def->isMul() || def->isDiv())
-        isTruncated = static_cast<MBinaryArithInstruction*>(def)->isTruncated();
-
-    if (def->type() != MIRType::None && def->range()) {
-        beginStringProperty("type");
-        def->range()->dump(out_);
-        out_.printf(" : %s%s", StringFromMIRType(def->type()), (isTruncated ? " (t)" : ""));
-        endStringProperty();
-    } else {
-        stringProperty("type", "%s%s", StringFromMIRType(def->type()), (isTruncated ? " (t)" : ""));
-    }
-
-    if (def->isInstruction()) {
-        if (MResumePoint* rp = def->toInstruction()->resumePoint())
-            spewMResumePoint(rp);
-    }
-
-    endObject();
-}
-
-void
-JSONSpewer::spewMIR(MIRGraph* mir)
-{
-    beginObjectProperty("mir");
-    beginListProperty("blocks");
-
-    for (MBasicBlockIterator block(mir->begin()); block != mir->end(); block++) {
-        beginObject();
-
-        integerProperty("number", block->id());
-        if (block->getHitState() == MBasicBlock::HitState::Count)
-            integerProperty("count", block->getHitCount());
-
-        beginListProperty("attributes");
-        if (block->isLoopBackedge())
-            stringValue("backedge");
-        if (block->isLoopHeader())
-            stringValue("loopheader");
-        if (block->isSplitEdge())
-            stringValue("splitedge");
-        endList();
-
-        beginListProperty("predecessors");
-        for (size_t i = 0; i < block->numPredecessors(); i++)
-            integerValue(block->getPredecessor(i)->id());
-        endList();
-
-        beginListProperty("successors");
-        for (size_t i = 0; i < block->numSuccessors(); i++)
-            integerValue(block->getSuccessor(i)->id());
-        endList();
-
-        beginListProperty("instructions");
-        for (MPhiIterator phi(block->phisBegin()); phi != block->phisEnd(); phi++)
-            spewMDef(*phi);
-        for (MInstructionIterator i(block->begin()); i != block->end(); i++)
-            spewMDef(*i);
-        endList();
-
-        spewMResumePoint(block->entryResumePoint());
-
-        endObject();
-    }
-
-    endList();
-    endObject();
-}
-
-void
-JSONSpewer::spewLIns(LNode* ins)
-{
-    beginObject();
-
-    integerProperty("id", ins->id());
-
-    property("opcode");
-    out_.printf("\"");
-    ins->dump(out_);
-    out_.printf("\"");
-
-    beginListProperty("defs");
-    for (size_t i = 0; i < ins->numDefs(); i++)
-        integerValue(ins->getDef(i)->virtualRegister());
-    endList();
-
-    endObject();
-}
-
-void
-JSONSpewer::spewLIR(MIRGraph* mir)
-{
-    beginObjectProperty("lir");
-    beginListProperty("blocks");
-
-    for (MBasicBlockIterator i(mir->begin()); i != mir->end(); i++) {
-        LBlock* block = i->lir();
-        if (!block)
-            continue;
-
-        beginObject();
-        integerProperty("number", i->id());
-
-        beginListProperty("instructions");
-        for (size_t p = 0; p < block->numPhis(); p++)
-            spewLIns(block->getPhi(p));
-        for (LInstructionIterator ins(block->begin()); ins != block->end(); ins++)
-            spewLIns(*ins);
-        endList();
-
-        endObject();
-    }
-
-    endList();
-    endObject();
-}
-
-void
-JSONSpewer::spewRanges(BacktrackingAllocator* regalloc)
-{
-    beginObjectProperty("ranges");
-    beginListProperty("blocks");
-
-    for (size_t bno = 0; bno < regalloc->graph.numBlocks(); bno++) {
-        beginObject();
-        integerProperty("number", bno);
-        beginListProperty("vregs");
-
-        LBlock* lir = regalloc->graph.getBlock(bno);
-        for (LInstructionIterator ins = lir->begin(); ins != lir->end(); ins++) {
-            for (size_t k = 0; k < ins->numDefs(); k++) {
-                uint32_t id = ins->getDef(k)->virtualRegister();
-                VirtualRegister* vreg = &regalloc->vregs[id];
-
-                beginObject();
-                integerProperty("vreg", id);
-                beginListProperty("ranges");
-
-                for (LiveRange::RegisterLinkIterator iter = vreg->rangesBegin(); iter; iter++) {
-                    LiveRange* range = LiveRange::get(*iter);
-
-                    beginObject();
-                    property("allocation");
-                    out_.printf("\"%s\"", range->bundle()->allocation().toString().get());
-                    integerProperty("start", range->from().bits());
-                    integerProperty("end", range->to().bits());
-                    endObject();
-                }
-
-                endList();
-                endObject();
-            }
-        }
-
-        endList();
-        endObject();
-    }
-
-    endList();
-    endObject();
-}
-
-void
-JSONSpewer::endPass()
-{
-    endObject();
-}
-
-void
-JSONSpewer::endFunction()
-{
-    endList();
-    endObject();
-}
-
 #endif /* JS_JITSPEW */
copy from js/src/jit/JSONSpewer.h
copy to js/src/jit/JSONPrinter.h
--- a/js/src/jit/JSONSpewer.h
+++ b/js/src/jit/JSONPrinter.h
@@ -1,36 +1,30 @@
 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
  * vim: set ts=8 sts=4 et sw=4 tw=99:
  * 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 jit_JSONSpewer_h
-#define jit_JSONSpewer_h
+#ifndef jit_JSONPrinter_h
+#define jit_JSONPrinter_h
 
 #ifdef JS_JITSPEW
 
 #include <stdio.h>
 
 #include "js/TypeDecls.h"
 #include "vm/Printer.h"
 
 namespace js {
 namespace jit {
 
-class BacktrackingAllocator;
-class MDefinition;
-class MIRGraph;
-class MResumePoint;
-class LNode;
-
-class JSONSpewer
+class JSONPrinter
 {
-  private:
+  protected:
     int indentLevel_;
     bool first_;
     GenericPrinter& out_;
 
     void indent();
 
     void property(const char* name);
     void beginObject();
@@ -41,32 +35,21 @@ class JSONSpewer
     void beginStringProperty(const char* name);
     void endStringProperty();
     void integerValue(int value);
     void integerProperty(const char* name, int value);
     void endObject();
     void endList();
 
   public:
-    explicit JSONSpewer(GenericPrinter& out)
+    explicit JSONPrinter(GenericPrinter& out)
       : indentLevel_(0),
         first_(true),
         out_(out)
     { }
-
-    void beginFunction(JSScript* script);
-    void beginPass(const char * pass);
-    void spewMDef(MDefinition* def);
-    void spewMResumePoint(MResumePoint* rp);
-    void spewMIR(MIRGraph* mir);
-    void spewLIns(LNode* ins);
-    void spewLIR(MIRGraph* mir);
-    void spewRanges(BacktrackingAllocator* regalloc);
-    void endPass();
-    void endFunction();
 };
 
 } // namespace jit
 } // namespace js
 
 #endif /* JS_JITSPEW */
 
-#endif /* jit_JSONSpewer_h */
+#endif /* jit_JSONPrinter_h */
--- a/js/src/jit/JSONSpewer.cpp
+++ b/js/src/jit/JSONSpewer.cpp
@@ -17,138 +17,16 @@
 #include "jit/MIR.h"
 #include "jit/MIRGraph.h"
 #include "jit/RangeAnalysis.h"
 
 using namespace js;
 using namespace js::jit;
 
 void
-JSONSpewer::indent()
-{
-    MOZ_ASSERT(indentLevel_ >= 0);
-    out_.printf("\n");
-    for (int i = 0; i < indentLevel_; i++)
-        out_.printf("  ");
-}
-
-void
-JSONSpewer::property(const char* name)
-{
-    if (!first_)
-        out_.printf(",");
-    indent();
-    out_.printf("\"%s\":", name);
-    first_ = false;
-}
-
-void
-JSONSpewer::beginObject()
-{
-    if (!first_) {
-        out_.printf(",");
-        indent();
-    }
-    out_.printf("{");
-    indentLevel_++;
-    first_ = true;
-}
-
-void
-JSONSpewer::beginObjectProperty(const char* name)
-{
-    property(name);
-    out_.printf("{");
-    indentLevel_++;
-    first_ = true;
-}
-
-void
-JSONSpewer::beginListProperty(const char* name)
-{
-    property(name);
-    out_.printf("[");
-    first_ = true;
-}
-
-void
-JSONSpewer::beginStringProperty(const char* name)
-{
-    property(name);
-    out_.printf("\"");
-}
-
-void
-JSONSpewer::endStringProperty()
-{
-    out_.printf("\"");
-}
-
-void
-JSONSpewer::stringProperty(const char* name, const char* format, ...)
-{
-    va_list ap;
-    va_start(ap, format);
-
-    beginStringProperty(name);
-    out_.vprintf(format, ap);
-    endStringProperty();
-
-    va_end(ap);
-}
-
-void
-JSONSpewer::stringValue(const char* format, ...)
-{
-    va_list ap;
-    va_start(ap, format);
-
-    if (!first_)
-        out_.printf(",");
-    out_.printf("\"");
-    out_.vprintf(format, ap);
-    out_.printf("\"");
-
-    va_end(ap);
-    first_ = false;
-}
-
-void
-JSONSpewer::integerProperty(const char* name, int value)
-{
-    property(name);
-    out_.printf("%d", value);
-}
-
-void
-JSONSpewer::integerValue(int value)
-{
-    if (!first_)
-        out_.printf(",");
-    out_.printf("%d", value);
-    first_ = false;
-}
-
-void
-JSONSpewer::endObject()
-{
-    indentLevel_--;
-    indent();
-    out_.printf("}");
-    first_ = false;
-}
-
-void
-JSONSpewer::endList()
-{
-    out_.printf("]");
-    first_ = false;
-}
-
-void
 JSONSpewer::beginFunction(JSScript* script)
 {
     beginObject();
     if (script)
         stringProperty("name", "%s:%" PRIuSIZE, script->filename(), script->lineno());
     else
         stringProperty("name", "wasm compilation");
     beginListProperty("passes");
@@ -167,26 +45,25 @@ JSONSpewer::spewMResumePoint(MResumePoin
     if (!rp)
         return;
 
     beginObjectProperty("resumePoint");
 
     if (rp->caller())
         integerProperty("caller", rp->caller()->block()->id());
 
-    property("mode");
     switch (rp->mode()) {
       case MResumePoint::ResumeAt:
-        out_.printf("\"At\"");
+        stringProperty("mode", "%s", "At");
         break;
       case MResumePoint::ResumeAfter:
-        out_.printf("\"After\"");
+        stringProperty("mode", "%s", "After");
         break;
       case MResumePoint::Outer:
-        out_.printf("\"Outer\"");
+        stringProperty("mode", "%s", "Outer");
         break;
     }
 
     beginListProperty("operands");
     for (MResumePoint* iter = rp; iter; iter = iter->caller()) {
         for (int i = iter->numOperands() - 1; i >= 0; i--)
             integerValue(iter->getOperand(i)->id());
         if (iter->caller())
@@ -369,18 +246,17 @@ JSONSpewer::spewRanges(BacktrackingAlloc
                 beginObject();
                 integerProperty("vreg", id);
                 beginListProperty("ranges");
 
                 for (LiveRange::RegisterLinkIterator iter = vreg->rangesBegin(); iter; iter++) {
                     LiveRange* range = LiveRange::get(*iter);
 
                     beginObject();
-                    property("allocation");
-                    out_.printf("\"%s\"", range->bundle()->allocation().toString().get());
+                    stringProperty("allocation", "%s", range->bundle()->allocation().toString().get());
                     integerProperty("start", range->from().bits());
                     integerProperty("end", range->to().bits());
                     endObject();
                 }
 
                 endList();
                 endObject();
             }
--- a/js/src/jit/JSONSpewer.h
+++ b/js/src/jit/JSONSpewer.h
@@ -6,55 +6,33 @@
 
 #ifndef jit_JSONSpewer_h
 #define jit_JSONSpewer_h
 
 #ifdef JS_JITSPEW
 
 #include <stdio.h>
 
+#include "jit/JSONPrinter.h"
 #include "js/TypeDecls.h"
-#include "vm/Printer.h"
 
 namespace js {
 namespace jit {
 
 class BacktrackingAllocator;
 class MDefinition;
 class MIRGraph;
 class MResumePoint;
 class LNode;
 
-class JSONSpewer
+class JSONSpewer : JSONPrinter
 {
-  private:
-    int indentLevel_;
-    bool first_;
-    GenericPrinter& out_;
-
-    void indent();
-
-    void property(const char* name);
-    void beginObject();
-    void beginObjectProperty(const char* name);
-    void beginListProperty(const char* name);
-    void stringValue(const char* format, ...) MOZ_FORMAT_PRINTF(2, 3);
-    void stringProperty(const char* name, const char* format, ...) MOZ_FORMAT_PRINTF(3, 4);
-    void beginStringProperty(const char* name);
-    void endStringProperty();
-    void integerValue(int value);
-    void integerProperty(const char* name, int value);
-    void endObject();
-    void endList();
-
   public:
     explicit JSONSpewer(GenericPrinter& out)
-      : indentLevel_(0),
-        first_(true),
-        out_(out)
+      : JSONPrinter(out)
     { }
 
     void beginFunction(JSScript* script);
     void beginPass(const char * pass);
     void spewMDef(MDefinition* def);
     void spewMResumePoint(MResumePoint* rp);
     void spewMIR(MIRGraph* mir);
     void spewLIns(LNode* ins);
new file mode 100644
--- /dev/null
+++ b/js/src/jit/ProcessExecutableMemory.cpp
@@ -0,0 +1,606 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+ * vim: set ts=8 sts=4 et sw=4 tw=99:
+ * 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 "jit/ProcessExecutableMemory.h"
+
+#include "mozilla/Array.h"
+#include "mozilla/Atomics.h"
+#include "mozilla/DebugOnly.h"
+#include "mozilla/TaggedAnonymousMemory.h"
+
+#include "jsfriendapi.h"
+#include "jsmath.h"
+#include "jsutil.h"
+#include "jswin.h"
+
+#include <errno.h>
+
+#include "gc/Memory.h"
+#include "threading/LockGuard.h"
+#include "threading/Mutex.h"
+#include "vm/MutexIDs.h"
+
+#ifdef XP_WIN
+# include "mozilla/StackWalk_windows.h"
+# include "mozilla/WindowsVersion.h"
+#else
+# include <sys/mman.h>
+# include <unistd.h>
+#endif
+
+using namespace js;
+using namespace js::jit;
+
+#ifdef XP_WIN
+static void*
+ComputeRandomAllocationAddress()
+{
+    /*
+     * Inspiration is V8's OS::Allocate in platform-win32.cc.
+     *
+     * VirtualAlloc takes 64K chunks out of the virtual address space, so we
+     * keep 16b alignment.
+     *
+     * x86: V8 comments say that keeping addresses in the [64MiB, 1GiB) range
+     * tries to avoid system default DLL mapping space. In the end, we get 13
+     * bits of randomness in our selection.
+     * x64: [2GiB, 4TiB), with 25 bits of randomness.
+     */
+# ifdef HAVE_64BIT_BUILD
+    static const uintptr_t base = 0x0000000080000000;
+    static const uintptr_t mask = 0x000003ffffff0000;
+# elif defined(_M_IX86) || defined(__i386__)
+    static const uintptr_t base = 0x04000000;
+    static const uintptr_t mask = 0x3fff0000;
+# else
+#  error "Unsupported architecture"
+# endif
+
+    uint64_t rand = js::GenerateRandomSeed();
+    return (void*) (base | (rand & mask));
+}
+
+# ifdef HAVE_64BIT_BUILD
+static js::JitExceptionHandler sJitExceptionHandler;
+
+JS_FRIEND_API(void)
+js::SetJitExceptionHandler(JitExceptionHandler handler)
+{
+    MOZ_ASSERT(!sJitExceptionHandler);
+    sJitExceptionHandler = handler;
+}
+
+// From documentation for UNWIND_INFO on
+// http://msdn.microsoft.com/en-us/library/ddssxxy8.aspx
+struct UnwindInfo
+{
+    uint8_t version : 3;
+    uint8_t flags : 5;
+    uint8_t sizeOfPrologue;
+    uint8_t countOfUnwindCodes;
+    uint8_t frameRegister : 4;
+    uint8_t frameOffset : 4;
+    ULONG exceptionHandler;
+};
+
+static const unsigned ThunkLength = 12;
+
+struct ExceptionHandlerRecord
+{
+    RUNTIME_FUNCTION runtimeFunction;
+    UnwindInfo unwindInfo;
+    uint8_t thunk[ThunkLength];
+};
+
+// This function must match the function pointer type PEXCEPTION_HANDLER
+// mentioned in:
+//   http://msdn.microsoft.com/en-us/library/ssa62fwe.aspx.
+// This type is rather elusive in documentation; Wine is the best I've found:
+//   http://source.winehq.org/source/include/winnt.h
+static DWORD
+ExceptionHandler(PEXCEPTION_RECORD exceptionRecord, _EXCEPTION_REGISTRATION_RECORD*,
+                 PCONTEXT context, _EXCEPTION_REGISTRATION_RECORD**)
+{
+    return sJitExceptionHandler(exceptionRecord, context);
+}
+
+// For an explanation of the problem being solved here, see
+// SetJitExceptionFilter in jsfriendapi.h.
+static bool
+RegisterExecutableMemory(void* p, size_t bytes, size_t pageSize)
+{
+    if (!VirtualAlloc(p, pageSize, MEM_COMMIT, PAGE_READWRITE))
+        MOZ_CRASH();
+
+    ExceptionHandlerRecord* r = reinterpret_cast<ExceptionHandlerRecord*>(p);
+
+    // All these fields are specified to be offsets from the base of the
+    // executable code (which is 'p'), even if they have 'Address' in their
+    // names. In particular, exceptionHandler is a ULONG offset which is a
+    // 32-bit integer. Since 'p' can be farther than INT32_MAX away from
+    // sJitExceptionHandler, we must generate a little thunk inside the
+    // record. The record is put on its own page so that we can take away write
+    // access to protect against accidental clobbering.
+
+    r->runtimeFunction.BeginAddress = pageSize;
+    r->runtimeFunction.EndAddress = (DWORD)bytes;
+    r->runtimeFunction.UnwindData = offsetof(ExceptionHandlerRecord, unwindInfo);
+
+    r->unwindInfo.version = 1;
+    r->unwindInfo.flags = UNW_FLAG_EHANDLER;
+    r->unwindInfo.sizeOfPrologue = 0;
+    r->unwindInfo.countOfUnwindCodes = 0;
+    r->unwindInfo.frameRegister = 0;
+    r->unwindInfo.frameOffset = 0;
+    r->unwindInfo.exceptionHandler = offsetof(ExceptionHandlerRecord, thunk);
+
+    // mov imm64, rax
+    r->thunk[0]  = 0x48;
+    r->thunk[1]  = 0xb8;
+    void* handler = JS_FUNC_TO_DATA_PTR(void*, ExceptionHandler);
+    memcpy(&r->thunk[2], &handler, 8);
+
+    // jmp rax
+    r->thunk[10] = 0xff;
+    r->thunk[11] = 0xe0;
+
+    DWORD oldProtect;
+    if (!VirtualProtect(p, pageSize, PAGE_EXECUTE_READ, &oldProtect))
+        MOZ_CRASH();
+
+    // XXX NB: The profiler believes this function is only called from the main
+    // thread. If that ever becomes untrue, the profiler must be updated
+    // immediately.
+    AcquireStackWalkWorkaroundLock();
+
+    bool success = RtlAddFunctionTable(&r->runtimeFunction, 1, reinterpret_cast<DWORD64>(p));
+
+    ReleaseStackWalkWorkaroundLock();
+
+    return success;
+}
+
+static void
+UnregisterExecutableMemory(void* p, size_t bytes, size_t pageSize)
+{
+    ExceptionHandlerRecord* r = reinterpret_cast<ExceptionHandlerRecord*>(p);
+
+    // XXX NB: The profiler believes this function is only called from the main
+    // thread. If that ever becomes untrue, the profiler must be updated
+    // immediately.
+    AcquireStackWalkWorkaroundLock();
+
+    RtlDeleteFunctionTable(&r->runtimeFunction);
+
+    ReleaseStackWalkWorkaroundLock();
+}
+# endif
+
+static void*
+ReserveProcessExecutableMemory(size_t bytes)
+{
+# ifdef HAVE_64BIT_BUILD
+    size_t pageSize = gc::SystemPageSize();
+    if (sJitExceptionHandler)
+        bytes += pageSize;
+# endif
+
+    void* p = nullptr;
+    for (size_t i = 0; i < 10; i++) {
+        void* randomAddr = ComputeRandomAllocationAddress();
+        p = VirtualAlloc(randomAddr, bytes, MEM_RESERVE, PAGE_NOACCESS);
+        if (p)
+            break;
+    }
+
+    if (!p) {
+        // Try again without randomization.
+        p = VirtualAlloc(nullptr, bytes, MEM_RESERVE, PAGE_NOACCESS);
+        if (!p)
+            return nullptr;
+    }
+
+# ifdef HAVE_64BIT_BUILD
+    if (sJitExceptionHandler) {
+        if (!RegisterExecutableMemory(p, bytes, pageSize)) {
+            VirtualFree(p, 0, MEM_RELEASE);
+            return nullptr;
+        }
+
+        p = (uint8_t*)p + pageSize;
+    }
+# endif
+
+    return p;
+}
+
+static void
+DeallocateProcessExecutableMemory(void* addr, size_t bytes)
+{
+# ifdef HAVE_64BIT_BUILD
+    if (sJitExceptionHandler) {
+        size_t pageSize = gc::SystemPageSize();
+        addr = (uint8_t*)addr - pageSize;
+        UnregisterExecutableMemory(addr, bytes, pageSize);
+    }
+# endif
+
+    VirtualFree(addr, 0, MEM_RELEASE);
+}
+
+static DWORD
+ProtectionSettingToFlags(ProtectionSetting protection)
+{
+    switch (protection) {
+      case ProtectionSetting::Protected:  return PAGE_NOACCESS;
+      case ProtectionSetting::Writable:   return PAGE_READWRITE;
+      case ProtectionSetting::Executable: return PAGE_EXECUTE_READ;
+    }
+    MOZ_CRASH();
+}
+
+static void
+CommitPages(void* addr, size_t bytes, ProtectionSetting protection)
+{
+    if (!VirtualAlloc(addr, bytes, MEM_COMMIT, ProtectionSettingToFlags(protection)))
+        MOZ_CRASH("CommitPages failed");
+}
+
+static void
+DecommitPages(void* addr, size_t bytes)
+{
+    if (!VirtualFree(addr, bytes, MEM_DECOMMIT))
+        MOZ_CRASH("DecommitPages failed");
+}
+#else // !XP_WIN
+static void*
+ReserveProcessExecutableMemory(size_t bytes)
+{
+    void* p = MozTaggedAnonymousMmap(nullptr, bytes, PROT_NONE, MAP_PRIVATE | MAP_ANON, -1, 0,
+                                     "js-executable-memory");
+    if (p == MAP_FAILED)
+        return nullptr;
+    return p;
+}
+
+static void
+DeallocateProcessExecutableMemory(void* addr, size_t bytes)
+{
+    mozilla::DebugOnly<int> result = munmap(addr, bytes);
+    MOZ_ASSERT(!result || errno == ENOMEM);
+}
+
+static unsigned
+ProtectionSettingToFlags(ProtectionSetting protection)
+{
+    switch (protection) {
+      case ProtectionSetting::Protected:  return PROT_NONE;
+      case ProtectionSetting::Writable:   return PROT_READ | PROT_WRITE;
+      case ProtectionSetting::Executable: return PROT_READ | PROT_EXEC;
+    }
+    MOZ_CRASH();
+}
+
+static void
+CommitPages(void* addr, size_t bytes, ProtectionSetting protection)
+{
+    void* p = MozTaggedAnonymousMmap(addr, bytes, ProtectionSettingToFlags(protection),
+                                     MAP_FIXED | MAP_PRIVATE | MAP_ANON,
+                                     -1, 0, "js-executable-memory");
+    MOZ_RELEASE_ASSERT(addr == p);
+}
+
+static void
+DecommitPages(void* addr, size_t bytes)
+{
+    // Use mmap with MAP_FIXED and PROT_NONE. Inspired by jemalloc's
+    // pages_decommit.
+    void* p = MozTaggedAnonymousMmap(addr, bytes, PROT_NONE,
+                                     MAP_FIXED | MAP_PRIVATE | MAP_ANON,
+                                     -1, 0, "js-executable-memory");
+    MOZ_RELEASE_ASSERT(addr == p);
+}
+#endif
+
+template <size_t NumBits>
+class PageBitSet
+{
+    using WordType = uint32_t;
+    static const size_t BitsPerWord = sizeof(WordType) * 8;
+
+    static_assert((NumBits % BitsPerWord) == 0,
+                  "NumBits must be a multiple of BitsPerWord");
+    static const size_t NumWords = NumBits / BitsPerWord;
+
+    mozilla::Array<WordType, NumWords> words_;
+
+    uint32_t indexToWord(uint32_t index) const {
+        MOZ_ASSERT(index < NumBits);
+        return index / BitsPerWord;
+    }
+    WordType indexToBit(uint32_t index) const {
+        MOZ_ASSERT(index < NumBits);
+        return WordType(1) << (index % BitsPerWord);
+    }
+
+  public:
+    void init() {
+        mozilla::PodArrayZero(words_);
+    }
+    bool contains(size_t index) const {
+        uint32_t word = indexToWord(index);
+        return words_[word] & indexToBit(index);
+    }
+    void insert(size_t index) {
+        MOZ_ASSERT(!contains(index));
+        uint32_t word = indexToWord(index);
+        words_[word] |= indexToBit(index);
+    }
+    void remove(size_t index) {
+        MOZ_ASSERT(contains(index));
+        uint32_t word = indexToWord(index);
+        words_[word] &= ~indexToBit(index);
+    }
+
+#ifdef DEBUG
+    bool empty() const {
+        for (size_t i = 0; i < NumWords; i++) {
+            if (words_[i] != 0)
+                return false;
+        }
+        return true;
+    }
+#endif
+};
+
+// Limit on the number of bytes of executable memory to prevent JIT spraying
+// attacks.
+#if JS_BITS_PER_WORD == 32
+static const size_t MaxCodeBytesPerProcess = 128 * 1024 * 1024;
+#else
+static const size_t MaxCodeBytesPerProcess = 640 * 1024 * 1024;
+#endif
+
+// Per-process executable memory allocator. It reserves a block of memory of
+// MaxCodeBytesPerProcess bytes, then allocates/deallocates pages from that.
+//
+// This has a number of benefits compared to raw mmap/VirtualAlloc:
+//
+// * More resillient against certain attacks.
+//
+// * Behaves more consistently across platforms: it avoids the 64K granularity
+//   issues on Windows, for instance.
+//
+// * On x64, near jumps can be used for jumps to other JIT pages.
+//
+// * On Win64, we have to register the exception handler only once (at process
+//   startup). This saves some memory and avoids RtlAddFunctionTable profiler
+//   deadlocks.
+class ProcessExecutableMemory
+{
+    static_assert((MaxCodeBytesPerProcess % ExecutableCodePageSize) == 0,
+                  "MaxCodeBytesPerProcess must be a multiple of ExecutableCodePageSize");
+    static const size_t MaxCodePages = MaxCodeBytesPerProcess / ExecutableCodePageSize;
+
+    // Start of the MaxCodeBytesPerProcess memory block or nullptr if
+    // uninitialized. Note that this is NOT guaranteed to be aligned to
+    // ExecutableCodePageSize.
+    uint8_t* base_;
+
+    // These fields should only be accessed while we hold the lock.
+    // pagesAllocated_ is an Atomic so that bytesAllocated does not have to
+    // take this lock.
+    Mutex lock_;
+    mozilla::Atomic<size_t, mozilla::ReleaseAcquire> pagesAllocated_;
+    PageBitSet<MaxCodePages> pages_;
+
+  public:
+    ProcessExecutableMemory()
+      : base_(nullptr),
+        lock_(mutexid::ProcessExecutableRegion),
+        pagesAllocated_(0),
+        pages_()
+    {}
+
+    MOZ_MUST_USE bool init() {
+        pages_.init();
+
+        MOZ_RELEASE_ASSERT(!initialized());
+        MOZ_RELEASE_ASSERT(gc::SystemPageSize() <= ExecutableCodePageSize);
+
+        void* p = ReserveProcessExecutableMemory(MaxCodeBytesPerProcess);
+        if (!p)
+            return false;
+
+        base_ = static_cast<uint8_t*>(p);
+        return true;
+    }
+
+    bool initialized() const {
+        return base_ != nullptr;
+    }
+
+    size_t bytesAllocated() const {
+        MOZ_ASSERT(pagesAllocated_ <= MaxCodePages);
+        return pagesAllocated_ * ExecutableCodePageSize;
+    }
+
+    void release() {
+        MOZ_ASSERT(initialized());
+        MOZ_ASSERT(pages_.empty());
+        MOZ_ASSERT(pagesAllocated_ == 0);
+        DeallocateProcessExecutableMemory(base_, MaxCodeBytesPerProcess);
+        base_ = nullptr;
+        MOZ_ASSERT(!initialized());
+    }
+
+    void assertValidAddress(void* p, size_t bytes) const {
+        MOZ_RELEASE_ASSERT(p >= base_ &&
+                           uintptr_t(p) + bytes <= uintptr_t(base_) + MaxCodeBytesPerProcess);
+    }
+
+    void* allocate(size_t bytes, ProtectionSetting protection);
+    void deallocate(void* addr, size_t bytes);
+};
+
+void*
+ProcessExecutableMemory::allocate(size_t bytes, ProtectionSetting protection)
+{
+    MOZ_ASSERT(initialized());
+    MOZ_ASSERT(bytes > 0);
+    MOZ_ASSERT((bytes % ExecutableCodePageSize) == 0);
+    MOZ_ASSERT(bytes <= MaxCodeBytesPerProcess);
+
+    size_t numPages = bytes / ExecutableCodePageSize;
+
+    // Generate the seed before taking the lock.
+    uint64_t seed = js::GenerateRandomSeed();
+
+    // Take the lock and try to allocate.
+    void* p = nullptr;
+    {
+        LockGuard<Mutex> guard(lock_);
+        MOZ_ASSERT(pagesAllocated_ <= MaxCodePages);
+
+        // Check if we have enough pages available.
+        if (pagesAllocated_ + numPages >= MaxCodePages)
+            return nullptr;
+
+        // Start at a random location, for less predictable addresses. It also
+        // makes it more likely we will land on a free page.
+        size_t page = seed % MaxCodePages;
+
+        for (size_t i = 0; i < MaxCodePages; i++) {
+            // Make sure page + numPages - 1 is a valid index.
+            if (page + numPages > MaxCodePages)
+                page = 0;
+
+            bool available = true;
+            for (size_t j = 0; j < numPages; j++) {
+                if (pages_.contains(page + j)) {
+                    available = false;
+                    break;
+                }
+            }
+            if (!available) {
+                page++;
+                continue;
+            }
+
+            // Mark the pages as unavailable.
+            for (size_t j = 0; j < numPages; j++)
+                pages_.insert(page + j);
+
+            pagesAllocated_ += numPages;
+            MOZ_ASSERT(pagesAllocated_ <= MaxCodePages);
+
+            p = base_ + page * ExecutableCodePageSize;
+            break;
+        }
+        if (!p)
+            return nullptr;
+    }
+
+    // Commit the pages after releasing the lock.
+    CommitPages(p, bytes, protection);
+    return p;
+}
+
+void
+ProcessExecutableMemory::deallocate(void* addr, size_t bytes)
+{
+    MOZ_ASSERT(initialized());
+    MOZ_ASSERT(addr);
+    MOZ_ASSERT((uintptr_t(addr) % gc::SystemPageSize()) == 0);
+    MOZ_ASSERT(bytes > 0);
+    MOZ_ASSERT((bytes % ExecutableCodePageSize) == 0);
+
+    assertValidAddress(addr, bytes);
+
+    size_t firstPage = (static_cast<uint8_t*>(addr) - base_) / ExecutableCodePageSize;
+    size_t numPages = bytes / ExecutableCodePageSize;
+
+    // Decommit before taking the lock.
+    DecommitPages(addr, bytes);
+
+    LockGuard<Mutex> guard(lock_);
+    MOZ_ASSERT(numPages <= pagesAllocated_);
+    pagesAllocated_ -= numPages;
+
+    for (size_t i = 0; i < numPages; i++)
+        pages_.remove(firstPage + i);
+}
+
+static ProcessExecutableMemory execMemory;
+
+void*
+js::jit::AllocateExecutableMemory(size_t bytes, ProtectionSetting protection)
+{
+    return execMemory.allocate(bytes, protection);
+}
+
+void
+js::jit::DeallocateExecutableMemory(void* addr, size_t bytes)
+{
+    execMemory.deallocate(addr, bytes);
+}
+
+bool
+js::jit::InitProcessExecutableMemory()
+{
+    return execMemory.init();
+}
+
+void
+js::jit::ReleaseProcessExecutableMemory()
+{
+    execMemory.release();
+}
+
+bool
+js::jit::CanLikelyAllocateMoreExecutableMemory()
+{
+    // Use a 16 MB buffer.
+    static const size_t BufferSize = 16 * 1024 * 1024;
+
+    MOZ_ASSERT(execMemory.bytesAllocated() <= MaxCodeBytesPerProcess);
+
+    return execMemory.bytesAllocated() + BufferSize <= MaxCodeBytesPerProcess;
+}
+
+bool
+js::jit::ReprotectRegion(void* start, size_t size, ProtectionSetting protection)
+{
+    // Calculate the start of the page containing this region,
+    // and account for this extra memory within size.
+    size_t pageSize = gc::SystemPageSize();
+    intptr_t startPtr = reinterpret_cast<intptr_t>(start);
+    intptr_t pageStartPtr = startPtr & ~(pageSize - 1);
+    void* pageStart = reinterpret_cast<void*>(pageStartPtr);
+    size += (startPtr - pageStartPtr);
+
+    // Round size up
+    size += (pageSize - 1);
+    size &= ~(pageSize - 1);
+
+    MOZ_ASSERT((uintptr_t(pageStart) % pageSize) == 0);
+
+    execMemory.assertValidAddress(pageStart, size);
+
+#ifdef XP_WIN
+    DWORD oldProtect;
+    DWORD flags = ProtectionSettingToFlags(protection);
+    if (!VirtualProtect(pageStart, size, flags, &oldProtect))
+        return false;
+#else
+    unsigned flags = ProtectionSettingToFlags(protection);
+    if (mprotect(pageStart, size, flags))
+        return false;
+#endif
+
+    execMemory.assertValidAddress(pageStart, size);
+    return true;
+}
new file mode 100644
--- /dev/null
+++ b/js/src/jit/ProcessExecutableMemory.h
@@ -0,0 +1,48 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef jit_ProcessExecutableMemory_h
+#define jit_ProcessExecutableMemory_h
+
+#include "mozilla/Attributes.h"
+
+namespace js {
+namespace jit {
+
+// Executable code is allocated in 64K chunks. ExecutableAllocator uses pools
+// that are at least this big. Code we allocate does not necessarily have 64K
+// alignment though.
+static const size_t ExecutableCodePageSize = 64 * 1024;
+
+enum class ProtectionSetting {
+    Protected, // Not readable, writable, or executable.
+    Writable,
+    Executable,
+};
+
+extern MOZ_MUST_USE bool ReprotectRegion(void* start, size_t size, ProtectionSetting protection);
+
+// Functions called at process start-up/shutdown to initialize/release the
+// executable memory region.
+extern MOZ_MUST_USE bool InitProcessExecutableMemory();
+extern void ReleaseProcessExecutableMemory();
+
+// Allocate/deallocate executable pages.
+extern void* AllocateExecutableMemory(size_t bytes, ProtectionSetting protection);
+extern void DeallocateExecutableMemory(void* addr, size_t bytes);
+
+// Returns true if we can allocate a few more MB of executable code without
+// hitting our code limit. This function can be used to stop compiling things
+// that are optional (like Baseline and Ion code) when we're about to reach the
+// limit, so we are less likely to OOM or crash. Note that the limit is
+// per-process, so other threads can also allocate code after we call this
+// function.
+extern bool CanLikelyAllocateMoreExecutableMemory();
+
+} // namespace jit
+} // namespace js
+
+#endif // jit_ProcessExecutableMemory_h
--- a/js/src/jsgc.cpp
+++ b/js/src/jsgc.cpp
@@ -3596,20 +3596,22 @@ GCRuntime::purgeRuntime(AutoLockForExclu
     if (auto cache = rt->maybeThisRuntimeSharedImmutableStrings())
         cache->purge();
 
     rt->promiseTasksToDestroy.lock()->clear();
 }
 
 bool
 GCRuntime::shouldPreserveJITCode(JSCompartment* comp, int64_t currentTime,
-                                 JS::gcreason::Reason reason)
+                                 JS::gcreason::Reason reason, bool canAllocateMoreCode)
 {
     if (cleanUpEverything)
         return false;
+    if (!canAllocateMoreCode)
+        return false;
 
     if (alwaysPreserveCode)
         return true;
     if (comp->preserveJitCode())
         return true;
     if (comp->lastAnimationTime + PRMJ_USEC_PER_SEC >= currentTime)
         return true;
     if (reason == JS::gcreason::DEBUG_GC)
@@ -3776,25 +3778,29 @@ GCRuntime::beginMarkPhase(JS::gcreason::
             }
         } else {
             isFull = false;
         }
 
         zone->setPreservingCode(false);
     }
 
+    // Discard JIT code more aggressively if the process is approaching its
+    // executable code limit.
+    bool canAllocateMoreCode = jit::CanLikelyAllocateMoreExecutableMemory();
+
     for (CompartmentsIter c(rt, WithAtoms); !c.done(); c.next()) {
         c->marked = false;
         c->scheduledForDestruction = false;
         c->maybeAlive = c->hasBeenEntered() || !c->zone()->isGCScheduled();
-        if (shouldPreserveJITCode(c, currentTime, reason))
+        if (shouldPreserveJITCode(c, currentTime, reason, canAllocateMoreCode))
             c->zone()->setPreservingCode(true);
     }
 
-    if (!rt->gc.cleanUpEverything) {
+    if (!rt->gc.cleanUpEverything && canAllocateMoreCode) {
         if (JSCompartment* comp = jit::TopmostIonActivationCompartment(rt))
             comp->zone()->setPreservingCode(true);
     }
 
     /*
      * If keepAtoms() is true then either an instance of AutoKeepAtoms is
      * currently on the stack or parsing is currently happening on another
      * thread. In either case we don't have information about which atoms are
--- a/js/src/moz.build
+++ b/js/src/moz.build
@@ -243,29 +243,31 @@ UNIFIED_SOURCES += [
     'jit/IonCaches.cpp',
     'jit/IonControlFlow.cpp',
     'jit/IonIC.cpp',
     'jit/IonOptimizationLevels.cpp',
     'jit/JitcodeMap.cpp',
     'jit/JitFrames.cpp',
     'jit/JitOptions.cpp',
     'jit/JitSpewer.cpp',
+    'jit/JSONPrinter.cpp',
     'jit/JSONSpewer.cpp',
     'jit/LICM.cpp',
     'jit/Linker.cpp',
     'jit/LIR.cpp',
     'jit/LoopUnroller.cpp',
     'jit/Lowering.cpp',
     'jit/MacroAssembler.cpp',
     'jit/MCallOptimize.cpp',
     'jit/MIR.cpp',
     'jit/MIRGraph.cpp',
     'jit/MoveResolver.cpp',
     'jit/OptimizationTracking.cpp',
     'jit/PerfSpewer.cpp',
+    'jit/ProcessExecutableMemory.cpp',
     'jit/RangeAnalysis.cpp',
     'jit/Recover.cpp',
     'jit/RegisterAllocator.cpp',
     'jit/RematerializedFrame.cpp',
     'jit/Safepoints.cpp',
     'jit/ScalarReplacement.cpp',
     'jit/shared/BaselineCompiler-shared.cpp',
     'jit/shared/CodeGenerator-shared.cpp',
@@ -584,27 +586,25 @@ elif CONFIG['JS_CODEGEN_MIPS32'] or CONF
         ]
         if CONFIG['JS_SIMULATOR_MIPS64']:
             UNIFIED_SOURCES += [
                 'jit/mips64/Simulator-mips64.cpp'
             ]
 
 if CONFIG['OS_ARCH'] == 'WINNT':
     SOURCES += [
-        'jit/ExecutableAllocatorWin.cpp',
         'threading/windows/ConditionVariable.cpp',
         'threading/windows/CpuCount.cpp',
         'threading/windows/MutexImpl.cpp',
         'threading/windows/Thread.cpp',
     ]
     # _CRT_RAND_S must be #defined before #including stdlib.h to get rand_s()
     DEFINES['_CRT_RAND_S'] = True
 else:
     SOURCES += [
-        'jit/ExecutableAllocatorPosix.cpp',
         'threading/posix/ConditionVariable.cpp',
         'threading/posix/CpuCount.cpp',
         'threading/posix/MutexImpl.cpp',
         'threading/posix/Thread.cpp',
     ]
 
 if CONFIG['JS_HAS_CTYPES']:
     SOURCES += [
--- a/js/src/vm/ArrayBufferObject.cpp
+++ b/js/src/vm/ArrayBufferObject.cpp
@@ -1220,25 +1220,26 @@ ArrayBufferObject::finalize(FreeOp* fop,
 {
     ArrayBufferObject& buffer = obj->as<ArrayBufferObject>();
 
     if (buffer.ownsData())
         buffer.releaseData(fop);
 }
 
 /* static */ void
-ArrayBufferObject::copyData(Handle<ArrayBufferObject*> toBuffer,
-                            Handle<ArrayBufferObject*> fromBuffer,
-                            uint32_t fromIndex, uint32_t count)
+ArrayBufferObject::copyData(Handle<ArrayBufferObject*> toBuffer, uint32_t toIndex,
+                            Handle<ArrayBufferObject*> fromBuffer, uint32_t fromIndex,
+                            uint32_t count)
 {
     MOZ_ASSERT(toBuffer->byteLength() >= count);
+    MOZ_ASSERT(toBuffer->byteLength() >= toIndex + count);
     MOZ_ASSERT(fromBuffer->byteLength() >= fromIndex);
     MOZ_ASSERT(fromBuffer->byteLength() >= fromIndex + count);
 
-    memcpy(toBuffer->dataPointer(), fromBuffer->dataPointer() + fromIndex, count);
+    memcpy(toBuffer->dataPointer() + toIndex, fromBuffer->dataPointer() + fromIndex, count);
 }
 
 /* static */ void
 ArrayBufferObject::trace(JSTracer* trc, JSObject* obj)
 {
     // If this buffer is associated with an inline typed object,
     // fix up the data pointer if the typed object was moved.
     ArrayBufferObject& buf = obj->as<ArrayBufferObject>();
--- a/js/src/vm/ArrayBufferObject.h
+++ b/js/src/vm/ArrayBufferObject.h
@@ -254,19 +254,19 @@ class ArrayBufferObject : public ArrayBu
     // initialize()d to become a real, content-visible ArrayBufferObject.
     static ArrayBufferObject* createEmpty(JSContext* cx);
 
     template<typename T>
     static bool createTypedArrayFromBufferImpl(JSContext* cx, const CallArgs& args);
     template<typename T>
     static bool createTypedArrayFromBuffer(JSContext* cx, unsigned argc, Value* vp);
 
-    static void copyData(Handle<ArrayBufferObject*> toBuffer,
-                         Handle<ArrayBufferObject*> fromBuffer,
-                         uint32_t fromIndex, uint32_t count);
+    static void copyData(Handle<ArrayBufferObject*> toBuffer, uint32_t toIndex,
+                         Handle<ArrayBufferObject*> fromBuffer, uint32_t fromIndex,
+                         uint32_t count);
 
     static void trace(JSTracer* trc, JSObject* obj);
     static void objectMoved(JSObject* obj, const JSObject* old);
 
     static BufferContents externalizeContents(JSContext* cx,
                                               Handle<ArrayBufferObject*> buffer,
                                               bool hasStealableContents);
     static BufferContents stealContents(JSContext* cx,
--- a/js/src/vm/Initialization.cpp
+++ b/js/src/vm/Initialization.cpp
@@ -98,17 +98,18 @@ JS::detail::InitWithFailureDiagnostic(bo
     RETURN_IF_FAIL(js::oom::InitThreadType());
     js::oom::SetThreadType(js::oom::THREAD_TYPE_MAIN);
 #endif
 
     RETURN_IF_FAIL(js::Mutex::Init());
 
     RETURN_IF_FAIL(js::wasm::InitInstanceStaticData());
 
-    js::jit::ExecutableAllocator::initStatic();
+    js::gc::InitMemorySubsystem(); // Ensure gc::SystemPageSize() works.
+    RETURN_IF_FAIL(js::jit::InitProcessExecutableMemory());
 
     MOZ_ALWAYS_TRUE(js::MemoryProtectionExceptionHandler::install());
 
     RETURN_IF_FAIL(js::jit::InitializeIon());
 
     RETURN_IF_FAIL(js::InitDateTimeState());
 
 #if EXPOSE_INTL_API
@@ -171,17 +172,17 @@ JS_ShutDown(void)
 
 #if EXPOSE_INTL_API
     u_cleanup();
 #endif // EXPOSE_INTL_API
 
     js::FinishDateTimeState();
 
     if (!JSRuntime::hasLiveRuntimes())
-        js::jit::AssertAllocatedExecutableBytesIsZero();
+        js::jit::ReleaseProcessExecutableMemory();
 
     libraryInitState = InitState::ShutDown;
 }
 
 JS_PUBLIC_API(bool)
 JS_SetICUMemoryFunctions(JS_ICUAllocFn allocFn, JS_ICUReallocFn reallocFn, JS_ICUFreeFn freeFn)
 {
     MOZ_ASSERT(libraryInitState == InitState::Uninitialized,
--- a/js/src/vm/MutexIDs.h
+++ b/js/src/vm/MutexIDs.h
@@ -34,16 +34,17 @@
   _(ShellOffThreadState,         500) \
   _(SimulatorCacheLock,          500) \
   _(Arm64SimulatorLock,          500) \
   _(IonSpewer,                   500) \
   _(PerfSpewer,                  500) \
   _(TraceLoggerThreadState,      500) \
   _(DateTimeInfoMutex,           500) \
   _(IcuTimeZoneStateMutex,       500) \
+  _(ProcessExecutableRegion,     500) \
                                       \
   _(TraceLoggerGraphState,       600)
 
 namespace js {
 namespace mutexid {
 
 #define DEFINE_MUTEX_ID(name, order)  \
 static const MutexId name { #name, order };
--- a/js/src/vm/SelfHosting.cpp
+++ b/js/src/vm/SelfHosting.cpp
@@ -22,16 +22,17 @@
 #include "jsweakmap.h"
 #include "jswrapper.h"
 #include "selfhosted.out.h"
 
 #include "builtin/Intl.h"
 #include "builtin/MapObject.h"
 #include "builtin/ModuleObject.h"
 #include "builtin/Object.h"
+#include "builtin/Promise.h"
 #include "builtin/Reflect.h"
 #include "builtin/SelfHostingDefines.h"
 #include "builtin/SIMD.h"
 #include "builtin/TypedObject.h"
 #include "builtin/WeakSetObject.h"
 #include "gc/Marking.h"
 #include "gc/Policy.h"
 #include "jit/AtomicOperations.h"
@@ -1005,37 +1006,38 @@ intrinsic_PossiblyWrappedArrayBufferByte
     return true;
 }
 
 template<typename T>
 static bool
 intrinsic_ArrayBufferCopyData(JSContext* cx, unsigned argc, Value* vp)
 {
     CallArgs args = CallArgsFromVp(argc, vp);
-    MOZ_ASSERT(args.length() == 5);
-
-    bool isWrapped = args[4].toBoolean();
+    MOZ_ASSERT(args.length() == 6);
+
+    bool isWrapped = args[5].toBoolean();
     Rooted<T*> toBuffer(cx);
     if (!isWrapped) {
         toBuffer = &args[0].toObject().as<T>();
     } else {
         JSObject* wrapped = &args[0].toObject();
         MOZ_ASSERT(wrapped->is<WrapperObject>());
         RootedObject toBufferObj(cx, CheckedUnwrap(wrapped));
         if (!toBufferObj) {
             ReportAccessDenied(cx);
             return false;
         }
         toBuffer = toBufferObj.as<T>();
     }
-    Rooted<T*> fromBuffer(cx, &args[1].toObject().as<T>());
-    uint32_t fromIndex = uint32_t(args[2].toInt32());
-    uint32_t count = uint32_t(args[3].toInt32());
-
-    T::copyData(toBuffer, fromBuffer, fromIndex, count);
+    uint32_t toIndex = uint32_t(args[1].toInt32());
+    Rooted<T*> fromBuffer(cx, &args[2].toObject().as<T>());
+    uint32_t fromIndex = uint32_t(args[3].toInt32());
+    uint32_t count = uint32_t(args[4].toInt32());
+
+    T::copyData(toBuffer, toIndex, fromBuffer, fromIndex, count);
 
     args.rval().setUndefined();
     return true;
 }
 
 // Arguments must both be SharedArrayBuffer or wrapped SharedArrayBuffer.
 static bool
 intrinsic_SharedArrayBuffersMemorySame(JSContext* cx, unsigned argc, Value* vp)
@@ -2172,16 +2174,115 @@ intrinsic_ModuleNamespaceExports(JSConte
 {
     CallArgs args = CallArgsFromVp(argc, vp);
     MOZ_ASSERT(args.length() == 1);
     RootedModuleNamespaceObject namespace_(cx, &args[0].toObject().as<ModuleNamespaceObject>());
     args.rval().setObject(namespace_->exports());
     return true;
 }
 
+static bool
+intrinsic_CreatePendingPromise(JSContext* cx, unsigned argc, Value* vp)
+{
+    CallArgs args = CallArgsFromVp(argc, vp);
+    MOZ_ASSERT(args.length() == 0);
+    RootedObject promise(cx, PromiseObject::createSkippingExecutor(cx));
+    if (!promise)
+        return false;
+    args.rval().setObject(*promise);
+    return true;
+}
+
+static bool
+intrinsic_CreatePromiseResolvedWith(JSContext* cx, unsigned argc, Value* vp)
+{
+    CallArgs args = CallArgsFromVp(argc, vp);
+    MOZ_ASSERT(args.length() == 1);
+    RootedObject promise(cx, PromiseObject::unforgeableResolve(cx, args[0]));
+    if (!promise)
+        return false;
+    args.rval().setObject(*promise);
+    return true;
+}
+
+static bool
+intrinsic_CreatePromiseRejectedWith(JSContext* cx, unsigned argc, Value* vp)
+{
+    CallArgs args = CallArgsFromVp(argc, vp);
+    MOZ_ASSERT(args.length() == 1);
+    RootedObject promise(cx, PromiseObject::unforgeableReject(cx, args[0]));
+    if (!promise)
+        return false;
+    args.rval().setObject(*promise);
+    return true;
+}
+
+static bool
+intrinsic_ResolvePromise(JSContext* cx, unsigned argc, Value* vp)
+{
+    CallArgs args = CallArgsFromVp(argc, vp);
+    MOZ_ASSERT(args.length() == 2);
+    Rooted<PromiseObject*> promise(cx, &args[0].toObject().as<PromiseObject>());
+    if (!PromiseObject::resolve(cx, promise, args[1]))
+        return false;
+    args.rval().setUndefined();
+    return true;
+}
+
+static bool
+intrinsic_RejectPromise(JSContext* cx, unsigned argc, Value* vp)
+{
+    CallArgs args = CallArgsFromVp(argc, vp);
+    MOZ_ASSERT(args.length() == 2);
+    Rooted<PromiseObject*> promise(cx, &args[0].toObject().as<PromiseObject>());
+    if (!PromiseObject::reject(cx, promise, args[1]))
+        return false;
+    args.rval().setUndefined();
+    return true;
+}
+
+static bool
+intrinsic_CallOriginalPromiseThen(JSContext* cx, unsigned argc, Value* vp)
+{
+    CallArgs args = CallArgsFromVp(argc, vp);
+    MOZ_ASSERT(args.length() >= 2);
+
+    RootedObject promise(cx, &args[0].toObject());
+    Value val = args[1];
+    RootedObject onResolvedObj(cx, val.isUndefined() ? nullptr : val.toObjectOrNull());
+    val = args.get(2);
+    RootedObject onRejectedObj(cx, val.isUndefined() ? nullptr : val.toObjectOrNull());
+
+    RootedObject resultPromise(cx, JS::CallOriginalPromiseThen(cx, promise, onResolvedObj,
+                                                               onRejectedObj));
+    if (!resultPromise)
+        return false;
+    args.rval().setObject(*resultPromise);
+    return true;
+}
+
+static bool
+intrinsic_AddPromiseReactions(JSContext* cx, unsigned argc, Value* vp)
+{
+    CallArgs args = CallArgsFromVp(argc, vp);
+    MOZ_ASSERT(args.length() >= 2);
+
+    RootedObject promise(cx, &args[0].toObject());
+    Value val = args[1];
+    RootedObject onResolvedObj(cx, val.isUndefined() ? nullptr : val.toObjectOrNull());
+    val = args.get(2);
+    RootedObject onRejectedObj(cx, val.isUndefined() ? nullptr : val.toObjectOrNull());
+
+    bool result = JS::AddPromiseReactions(cx, promise, onResolvedObj, onRejectedObj);
+    if (!result)
+        return false;
+    args.rval().setUndefined();
+    return true;
+}
+
 // The self-hosting global isn't initialized with the normal set of builtins.
 // Instead, individual C++-implemented functions that're required by
 // self-hosted code are defined as global functions. Accessing these
 // functions via a content compartment's builtins would be unsafe, because
 // content script might have changed the builtins' prototypes' members.
 // Installing the whole set of builtins in the self-hosting compartment, OTOH,
 // would be wasteful: it increases memory usage and initialization time for
 // self-hosting compartment.
@@ -2394,24 +2495,24 @@ static const JSFunctionSpec intrinsic_fu
 
     JS_INLINABLE_FN("ArrayBufferByteLength",
                     intrinsic_ArrayBufferByteLength<ArrayBufferObject>, 1,0,
                     IntrinsicArrayBufferByteLength),
     JS_INLINABLE_FN("PossiblyWrappedArrayBufferByteLength",
                     intrinsic_PossiblyWrappedArrayBufferByteLength<ArrayBufferObject>, 1,0,
                     IntrinsicPossiblyWrappedArrayBufferByteLength),
     JS_FN("ArrayBufferCopyData",
-          intrinsic_ArrayBufferCopyData<ArrayBufferObject>,             5,0),
+          intrinsic_ArrayBufferCopyData<ArrayBufferObject>,             6,0),
 
     JS_FN("SharedArrayBufferByteLength",
           intrinsic_ArrayBufferByteLength<SharedArrayBufferObject>,     1,0),
     JS_FN("PossiblyWrappedSharedArrayBufferByteLength",
           intrinsic_PossiblyWrappedArrayBufferByteLength<SharedArrayBufferObject>, 1,0),
     JS_FN("SharedArrayBufferCopyData",
-          intrinsic_ArrayBufferCopyData<SharedArrayBufferObject>,       5,0),
+          intrinsic_ArrayBufferCopyData<SharedArrayBufferObject>,       6,0),
     JS_FN("SharedArrayBuffersMemorySame",
           intrinsic_SharedArrayBuffersMemorySame,                       2,0),
 
     JS_FN("IsUint8TypedArray",        intrinsic_IsUint8TypedArray,      1,0),
     JS_FN("IsInt8TypedArray",         intrinsic_IsInt8TypedArray,       1,0),
     JS_FN("IsUint16TypedArray",       intrinsic_IsUint16TypedArray,     1,0),
     JS_FN("IsInt16TypedArray",        intrinsic_IsInt16TypedArray,      1,0),
     JS_FN("IsUint32TypedArray",       intrinsic_IsUint32TypedArray,     1,0),
@@ -2591,16 +2692,24 @@ static const JSFunctionSpec intrinsic_fu
     JS_FN("InstantiateModuleFunctionDeclarations",
           intrinsic_InstantiateModuleFunctionDeclarations, 1, 0),
     JS_FN("SetModuleState", intrinsic_SetModuleState, 1, 0),
     JS_FN("EvaluateModule", intrinsic_EvaluateModule, 1, 0),
     JS_FN("NewModuleNamespace", intrinsic_NewModuleNamespace, 2, 0),
     JS_FN("AddModuleNamespaceBinding", intrinsic_AddModuleNamespaceBinding, 4, 0),
     JS_FN("ModuleNamespaceExports", intrinsic_ModuleNamespaceExports, 1, 0),
 
+    JS_FN("CreatePendingPromise", intrinsic_CreatePendingPromise, 0, 0),
+    JS_FN("CreatePromiseResolvedWith", intrinsic_CreatePromiseResolvedWith, 1, 0),
+    JS_FN("CreatePromiseRejectedWith", intrinsic_CreatePromiseRejectedWith, 1, 0),
+    JS_FN("ResolvePromise", intrinsic_ResolvePromise, 2, 0),
+    JS_FN("RejectPromise", intrinsic_RejectPromise, 2, 0),
+    JS_FN("AddPromiseReactions", intrinsic_AddPromiseReactions, 3, 0),
+    JS_FN("CallOriginalPromiseThen", intrinsic_CallOriginalPromiseThen, 3, 0),
+
     JS_FS_END
 };
 
 void
 js::FillSelfHostingCompileOptions(CompileOptions& options)
 {
     /*
      * In self-hosting mode, scripts use JSOP_GETINTRINSIC instead of
--- a/js/src/vm/SharedArrayObject.cpp
+++ b/js/src/vm/SharedArrayObject.cpp
@@ -323,25 +323,26 @@ SharedArrayBufferObject::addSizeOfExclud
     // the refcount goes down). But that's unlikely and hard to avoid, so we
     // just live with the risk.
     const SharedArrayBufferObject& buf = obj->as<SharedArrayBufferObject>();
     info->objectsNonHeapElementsShared +=
         buf.byteLength() / buf.rawBufferObject()->refcount();
 }
 
 /* static */ void
-SharedArrayBufferObject::copyData(Handle<SharedArrayBufferObject*> toBuffer,
-                                  Handle<SharedArrayBufferObject*> fromBuffer,
-                                  uint32_t fromIndex, uint32_t count)
+SharedArrayBufferObject::copyData(Handle<SharedArrayBufferObject*> toBuffer, uint32_t toIndex,
+                                  Handle<SharedArrayBufferObject*> fromBuffer, uint32_t fromIndex,
+                                  uint32_t count)
 {
     MOZ_ASSERT(toBuffer->byteLength() >= count);
+    MOZ_ASSERT(toBuffer->byteLength() >= toIndex + count);
     MOZ_ASSERT(fromBuffer->byteLength() >= fromIndex);
     MOZ_ASSERT(fromBuffer->byteLength() >= fromIndex + count);
 
-    jit::AtomicOperations::memcpySafeWhenRacy(toBuffer->dataPointerShared(),
+    jit::AtomicOperations::memcpySafeWhenRacy(toBuffer->dataPointerShared() + toIndex,
                                               fromBuffer->dataPointerShared() + fromIndex,
                                               count);
 }
 
 static JSObject*
 CreateSharedArrayBufferPrototype(JSContext* cx, JSProtoKey key)
 {
     return GlobalObject::createBlankPrototype(cx, cx->global(),
--- a/js/src/vm/SharedArrayObject.h
+++ b/js/src/vm/SharedArrayObject.h
@@ -143,19 +143,19 @@ class SharedArrayBufferObject : public A
                                         SharedArrayRawBuffer* buffer,
                                         HandleObject proto = nullptr);
 
     static void Finalize(FreeOp* fop, JSObject* obj);
 
     static void addSizeOfExcludingThis(JSObject* obj, mozilla::MallocSizeOf mallocSizeOf,
                                        JS::ClassInfo* info);
 
-    static void copyData(Handle<SharedArrayBufferObject*> toBuffer,
-                         Handle<SharedArrayBufferObject*> fromBuffer,
-                         uint32_t fromIndex, uint32_t count);
+    static void copyData(Handle<SharedArrayBufferObject*> toBuffer, uint32_t toIndex,
+                         Handle<SharedArrayBufferObject*> fromBuffer, uint32_t fromIndex,
+                         uint32_t count);
 
     SharedArrayRawBuffer* rawBufferObject() const;
 
     // Invariant: This method does not cause GC and can be called
     // without anchoring the object it is called on.
     uintptr_t globalID() const {
         // The buffer address is good enough as an ID provided the memory is not shared
         // between processes or, if it is, it is mapped to the same address in every
--- a/js/src/wasm/WasmCode.cpp
+++ b/js/src/wasm/WasmCode.cpp
@@ -63,22 +63,21 @@ static Atomic<uint32_t> wasmCodeAllocati
 static const uint32_t MaxWasmCodeAllocations = 16384;
 
 static uint8_t*
 AllocateCodeSegment(JSContext* cx, uint32_t codeLength)
 {
     if (wasmCodeAllocations >= MaxWasmCodeAllocations)
         return nullptr;
 
-    // Allocate RW memory. DynamicallyLinkModule will reprotect the code as RX.
-    unsigned permissions =
-        ExecutableAllocator::initialProtectionFlags(ExecutableAllocator::Writable);
+    // codeLength is a multiple of the system's page size, but not necessarily
+    // a multiple of ExecutableCodePageSize.
+    codeLength = JS_ROUNDUP(codeLength, ExecutableCodePageSize);
 
-    void* p = AllocateExecutableMemory(codeLength, permissions, "wasm-code-segment",
-                                       gc::SystemPageSize());
+    void* p = AllocateExecutableMemory(codeLength, ProtectionSetting::Writable);
     if (!p) {
         ReportOutOfMemory(cx);
         return nullptr;
     }
 
     wasmCodeAllocations++;
     return (uint8_t*)p;
 }
@@ -240,17 +239,19 @@ CodeSegment::create(JSContext* cx,
         AutoFlushICache::setRange(uintptr_t(codeBase), cs->length());
 
         memcpy(codeBase, bytecode.begin(), bytecode.length());
         StaticallyLink(*cs, linkData, cx);
         if (memory)
             SpecializeToMemory(nullptr, *cs, metadata, memory->buffer());
     }
 
-    if (!ExecutableAllocator::makeExecutable(codeBase, cs->length())) {
+    // Reprotect the whole region to avoid having separate RW and RX mappings.
+    uint32_t size = JS_ROUNDUP(cs->length(), ExecutableCodePageSize);
+    if (!ExecutableAllocator::makeExecutable(codeBase, size)) {
         ReportOutOfMemory(cx);
         return nullptr;
     }
 
     SendCodeRangesToProfiler(*cs, bytecode, metadata);
 
     return cs;
 }
@@ -259,17 +260,20 @@ CodeSegment::~CodeSegment()
 {
     if (!bytes_)
         return;
 
     MOZ_ASSERT(wasmCodeAllocations > 0);
     wasmCodeAllocations--;
 
     MOZ_ASSERT(length() > 0);
-    DeallocateExecutableMemory(bytes_, length(), gc::SystemPageSize());
+
+    // Match AllocateCodeSegment.
+    uint32_t size = JS_ROUNDUP(length(), ExecutableCodePageSize);
+    DeallocateExecutableMemory(bytes_, size);
 }
 
 void
 CodeSegment::onMovingGrow(uint8_t* prevMemoryBase, const Metadata& metadata, ArrayBufferObject& buffer)
 {
     AutoWritableJitCode awjc(base(), length());
     AutoFlushICache afc("CodeSegment::onMovingGrow");
     AutoFlushICache::setRange(uintptr_t(base()), length());
--- a/layout/base/ServoRestyleManager.cpp
+++ b/layout/base/ServoRestyleManager.cpp
@@ -138,47 +138,60 @@ ServoRestyleManager::ClearDirtyDescendan
 void
 ServoRestyleManager::RecreateStyleContexts(Element* aElement,
                                            nsStyleContext* aParentContext,
                                            ServoStyleSet* aStyleSet,
                                            nsStyleChangeList& aChangeListToProcess)
 {
   nsIFrame* primaryFrame = aElement->GetPrimaryFrame();
 
-  // FIXME(bholley): Once we transfer ownership of the styles to the frame, we
-  // can fast-reject without the FFI call by checking mServoData for null.
   nsChangeHint changeHint = Servo_TakeChangeHint(aElement);
-  if (changeHint & ~nsChangeHint_NeutralChange) {
-    aChangeListToProcess.AppendChange(
-      primaryFrame, aElement, changeHint & ~nsChangeHint_NeutralChange);
+  if (changeHint) {
+    aChangeListToProcess.AppendChange(primaryFrame, aElement, changeHint);
   }
 
   // If our change hint is reconstruct, we delegate to the frame constructor,
   // which consumes the new style and expects the old style to be on the frame.
   //
   // XXXbholley: We should teach the frame constructor how to clear the dirty
   // descendants bit to avoid the traversal here.
   if (changeHint & nsChangeHint_ReconstructFrame) {
     ClearDirtyDescendantsFromSubtree(aElement);
     return;
   }
 
-  // If we have a frame and a non-zero + non-reconstruct change hint, we need to
-  // attach a new style context.
-  bool recreateContext = primaryFrame && changeHint;
-  if (recreateContext) {
-    RefPtr<ServoComputedValues> computedValues = aStyleSet->ResolveServoStyle(aElement);
+  // TODO(emilio): We could avoid some refcount traffic here, specially in the
+  // ServoComputedValues case, which uses atomic refcounting.
+  //
+  // Hold the old style context alive, because it could become a dangling
+  // pointer during the replacement. In practice it's not a huge deal (on
+  // GetNextContinuationWithSameStyle the pointer is not dereferenced, only
+  // compared), but better not playing with dangling pointers if not needed.
+  RefPtr<nsStyleContext> oldStyleContext =
+    primaryFrame ? primaryFrame->StyleContext() : nullptr;
+
+  RefPtr<ServoComputedValues> computedValues =
+    aStyleSet->ResolveServoStyle(aElement);
 
-    // Hold the old style context alive, because it could become a dangling
-    // pointer during the replacement. In practice it's not a huge deal (on
-    // GetNextContinuationWithSameStyle the pointer is not dereferenced, only
-    // compared), but better not playing with dangling pointers if not needed.
-    RefPtr<nsStyleContext> oldStyleContext = primaryFrame->StyleContext();
-    MOZ_ASSERT(oldStyleContext);
+  // Note that we rely in the fact that we don't cascade pseudo-element styles
+  // separately right now (that is, if a pseudo style changes, the normal style
+  // changes too).
+  //
+  // Otherwise we should probably encode that information somehow to avoid
+  // expensive checks in the common case.
+  //
+  // Also, we're going to need to check for pseudos of display: contents
+  // elements, though that is buggy right now even in non-stylo mode, see
+  // bug 1251799.
+  const bool recreateContext = oldStyleContext &&
+    oldStyleContext->StyleSource().AsServoComputedValues() != computedValues;
 
+  MOZ_ASSERT_IF(changeHint, recreateContext);
+
+  if (recreateContext) {
     RefPtr<nsStyleContext> newContext =
       aStyleSet->GetContext(computedValues.forget(), aParentContext, nullptr,
                             CSSPseudoElementType::NotPseudo, aElement);
 
     // XXX This could not always work as expected: there are kinds of content
     // with the first split and the last sharing style, but others not. We
     // should handle those properly.
     for (nsIFrame* f = primaryFrame; f;
--- a/layout/style/PreloadedStyleSheet.h
+++ b/layout/style/PreloadedStyleSheet.h
@@ -7,24 +7,24 @@
 /* a CSS style sheet returned from nsIStyleSheetService.preloadSheet */
 
 #ifndef mozilla_PreloadedStyleSheet_h
 #define mozilla_PreloadedStyleSheet_h
 
 #include "mozilla/css/SheetParsingMode.h"
 #include "mozilla/Result.h"
 #include "mozilla/StyleBackendType.h"
-#include "mozilla/StyleSheet.h"
 #include "nsCOMPtr.h"
 #include "nsCycleCollectionParticipant.h"
 #include "nsIPreloadedStyleSheet.h"
 
 class nsIURI;
 
 namespace mozilla {
+class StyleSheet;
 
 class PreloadedStyleSheet : public nsIPreloadedStyleSheet
 {
 public:
   // *aResult is addrefed.
   static nsresult Create(nsIURI* aURI, css::SheetParsingMode aParsingMode,
                          PreloadedStyleSheet** aResult);
 
--- a/layout/style/nsStyleContext.cpp
+++ b/layout/style/nsStyleContext.cpp
@@ -954,31 +954,25 @@ nsStyleContext::ApplyStyleFixups(bool aS
     }
   }
 
   // Compute User Interface style, to trigger loads of cursors
   StyleUserInterface();
 #undef GET_UNIQUE_STYLE_DATA
 }
 
-template<class StyleContextLike,
-         nsStyleContext::NeutralChangeHandling aNeutralChangeHandling>
+template<class StyleContextLike>
 nsChangeHint
 nsStyleContext::CalcStyleDifferenceInternal(StyleContextLike* aNewContext,
                                             nsChangeHint aParentHintsNotHandledForDescendants,
                                             uint32_t* aEqualStructs,
                                             uint32_t* aSamePointerStructs)
 {
   PROFILER_LABEL("nsStyleContext", "CalcStyleDifference",
     js::ProfileEntry::Category::CSS);
-
-  // See the comment in CalcStyleDifference(ServoComputedValues*, ...) to
-  // understand why we need to manually handle the neutral change in Servo.
-  MOZ_ASSERT_IF(mSource.IsServoComputedValues(),
-                aNeutralChangeHandling == NeutralChangeHandling::Retain);
   MOZ_ASSERT(NS_IsHintSubset(aParentHintsNotHandledForDescendants,
                              nsChangeHint_Hints_NotHandledForDescendants),
              "caller is passing inherited hints, but shouldn't be");
 
   static_assert(nsStyleStructID_Length <= 32,
                 "aEqualStructs is not big enough");
 
   *aEqualStructs = 0;
@@ -1214,30 +1208,29 @@ nsStyleContext::CalcStyleDifferenceInter
       // While some styles that cause the frame to be a containing block
       // has changed, the overall result hasn't.
       hint &= ~nsChangeHint_UpdateContainingBlock;
     }
   }
 
   MOZ_ASSERT(NS_IsHintSubset(hint, nsChangeHint_AllHints),
              "Added a new hint without bumping AllHints?");
-  return aNeutralChangeHandling == NeutralChangeHandling::Strip
-           ? (hint & ~nsChangeHint_NeutralChange)
-           : hint;
+  return hint & ~nsChangeHint_NeutralChange;
 }
 
 nsChangeHint
 nsStyleContext::CalcStyleDifference(nsStyleContext* aNewContext,
                                     nsChangeHint aParentHintsNotHandledForDescendants,
                                     uint32_t* aEqualStructs,
                                     uint32_t* aSamePointerStructs)
 {
-  return CalcStyleDifferenceInternal<nsStyleContext, NeutralChangeHandling::Strip>
-    (aNewContext, aParentHintsNotHandledForDescendants, aEqualStructs,
-     aSamePointerStructs);
+  return CalcStyleDifferenceInternal(aNewContext,
+                                     aParentHintsNotHandledForDescendants,
+                                     aEqualStructs,
+                                     aSamePointerStructs);
 }
 
 class MOZ_STACK_CLASS FakeStyleContext
 {
 public:
   explicit FakeStyleContext(const ServoComputedValues* aComputedValues)
     : mComputedValues(aComputedValues) {}
 
@@ -1263,25 +1256,21 @@ private:
 };
 
 nsChangeHint
 nsStyleContext::CalcStyleDifference(const ServoComputedValues* aNewComputedValues,
                                     nsChangeHint aParentHintsNotHandledForDescendants,
                                     uint32_t* aEqualStructs,
                                     uint32_t* aSamePointerStructs)
 {
-  // NB: Servo uses the presence of a change hint to determine whether it should
-  // generate a new nsStyleContext.
-  //
-  // Given that, we can't strip the neutral change hint here, since it may
-  // provoke errors like bug 1330874.
   FakeStyleContext newContext(aNewComputedValues);
-  return CalcStyleDifferenceInternal<FakeStyleContext, NeutralChangeHandling::Retain>(
-      &newContext, aParentHintsNotHandledForDescendants, aEqualStructs,
-      aSamePointerStructs);
+  return CalcStyleDifferenceInternal(&newContext,
+                                     aParentHintsNotHandledForDescendants,
+                                     aEqualStructs,
+                                     aSamePointerStructs);
 }
 
 #ifdef DEBUG
 void nsStyleContext::List(FILE* out, int32_t aIndent, bool aListDescendants)
 {
   nsAutoCString str;
   // Indent
   int32_t ix;
--- a/layout/style/nsStyleContext.h
+++ b/layout/style/nsStyleContext.h
@@ -394,22 +394,17 @@ public:
    * a full-fledged style context.
    */
   nsChangeHint CalcStyleDifference(const ServoComputedValues* aNewComputedValues,
                                    nsChangeHint aParentHintsNotHandledForDescendants,
                                    uint32_t* aEqualStructs,
                                    uint32_t* aSamePointerStructs);
 
 private:
-  enum class NeutralChangeHandling {
-    Retain,
-    Strip,
-  };
-
-  template<class StyleContextLike, NeutralChangeHandling aNeutralChangeHandling>
+  template<class StyleContextLike>
   nsChangeHint CalcStyleDifferenceInternal(StyleContextLike* aNewContext,
                                            nsChangeHint aParentHintsNotHandledForDescendants,
                                            uint32_t* aEqualStructs,
                                            uint32_t* aSamePointerStructs);
 
 public:
   /**
    * Get a color that depends on link-visitedness using this and
--- a/mobile/android/app/mobile.js
+++ b/mobile/android/app/mobile.js
@@ -622,19 +622,18 @@ pref("media.android-media-codec.preferre
 // Run decoder in seperate process.
 pref("media.android-remote-codec.enabled", true);
 
 // Enable MSE
 pref("media.mediasource.enabled", true);
 
 pref("media.mediadrm-widevinecdm.visible", true);
 
-// Enable EME(Encrypted media extensions)
+// Enable EME (Encrypted Media Extensions)
 pref("media.eme.enabled", true);
-pref("media.eme.apiVisible", true);
 
 // optimize images memory usage
 pref("image.downscale-during-decode.enabled", true);
 
 pref("browser.safebrowsing.downloads.enabled", false);
 
 pref("browser.safebrowsing.id", @MOZ_APP_UA_NAME@);
 
--- a/mobile/android/base/moz.build
+++ b/mobile/android/base/moz.build
@@ -253,17 +253,16 @@ gvjar.sources += [geckoview_source_dir +
     'GeckoNetworkManager.java',
     'GeckoProfile.java',
     'GeckoProfileDirectories.java',
     'GeckoScreenOrientation.java',
     'GeckoSharedPrefs.java',
     'GeckoThread.java',
     'GeckoView.java',
     'GeckoViewChrome.java',
-    'GeckoViewContent.java',
     'GeckoViewFragment.java',
     'gfx/BitmapUtils.java',
     'gfx/BufferedImage.java',
     'gfx/BufferedImageGLInfo.java',
     'gfx/DynamicToolbarAnimator.java',
     'gfx/FloatSize.java',
     'gfx/FullScreenState.java',
     'gfx/GeckoLayerClient.java',
new file mode 100644
--- /dev/null
+++ b/mobile/android/chrome/content/GeckoViewContent.js
@@ -0,0 +1,41 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 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/. */
+
+var { classes: Cc, interfaces: Ci, utils: Cu } = Components;
+
+var dump = Cu.import("resource://gre/modules/AndroidLog.jsm", {}).AndroidLog.d.bind(null, "ViewContent");
+
+var DEBUG = false;
+
+// This is copied from desktop's tab-content.js. See bug 1153485 about sharing this code somehow.
+var DOMTitleChangedListener = {
+  init: function() {
+    addEventListener("DOMTitleChanged", this, false);
+  },
+
+  receiveMessage: function(message) {
+    if (DEBUG) {
+      dump("receiveMessage " + message.name);
+    }
+  },
+
+  handleEvent: function(aEvent) {
+    if (aEvent.originalTarget.defaultView != content) {
+      return;
+    }
+
+    if (DEBUG) {
+      dump("handleEvent " + aEvent.type);
+    }
+
+    switch (aEvent.type) {
+      case "DOMTitleChanged":
+        sendAsyncMessage("GeckoView:DOMTitleChanged", { title: content.document.title });
+        break;
+    }
+  },
+};
+
+DOMTitleChangedListener.init();
--- a/mobile/android/chrome/content/geckoview.js
+++ b/mobile/android/chrome/content/geckoview.js
@@ -1,26 +1,34 @@
 /* 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";
 
-var Cc = Components.classes;
-var Ci = Components.interfaces;
-var Cu = Components.utils;
-var Cr = Components.results;
+const { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components;
 
 Cu.import("resource://gre/modules/AppConstants.jsm");
 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
 
-XPCOMUtils.defineLazyModuleGetter(this, "Log",
- "resource://gre/modules/AndroidLog.jsm", "AndroidLog");
-
 XPCOMUtils.defineLazyModuleGetter(this, "Services",
  "resource://gre/modules/Services.jsm", "Services");
 
-function dump(msg) {
-  Log.d("View", msg);
-}
+XPCOMUtils.defineLazyModuleGetter(this, "EventDispatcher",
+  "resource://gre/modules/Messaging.jsm");
+XPCOMUtils.defineLazyGetter(this, "GlobalEventDispatcher",
+  () => EventDispatcher.instance);
+XPCOMUtils.defineLazyGetter(this, "WindowEventDispatcher",
+  () => EventDispatcher.for(window));
+
+var dump = Cu.import("resource://gre/modules/AndroidLog.jsm", {})
+           .AndroidLog.d.bind(null, "View");
+
+// GeckoView module imports.
+XPCOMUtils.defineLazyModuleGetter(this, "GeckoViewContent",
+  "resource://gre/modules/GeckoViewContent.jsm");
+
+var content;
 
 function startup() {
-    dump("zerdatime " + Date.now() + " - geckoview chrome startup finished.");
+  dump("zerdatime " + Date.now() + " - geckoview chrome startup finished.");
+
+  content = new GeckoViewContent(window, document.getElementById("content"), WindowEventDispatcher);
 }
--- a/mobile/android/chrome/jar.mn
+++ b/mobile/android/chrome/jar.mn
@@ -24,16 +24,17 @@ chrome.jar:
   content/aboutRights.xhtml            (content/aboutRights.xhtml)
   content/blockedSite.xhtml            (content/blockedSite.xhtml)
   content/languages.properties         (content/languages.properties)
   content/browser.xul                  (content/browser.xul)
   content/browser.css                  (content/browser.css)
   content/browser.js                   (content/browser.js)
   content/geckoview.xul                (content/geckoview.xul)
   content/geckoview.js                 (content/geckoview.js)
+  content/GeckoViewContent.js          (content/GeckoViewContent.js)
   content/PresentationView.xul         (content/PresentationView.xul)
   content/PresentationView.js          (content/PresentationView.js)
   content/bindings/checkbox.xml        (content/bindings/checkbox.xml)
   content/bindings/settings.xml        (content/bindings/settings.xml)
   content/netError.xhtml               (content/netError.xhtml)
   content/SelectHelper.js              (content/SelectHelper.js)
   content/ActionBarHandler.js          (content/ActionBarHandler.js)
   content/EmbedRT.js                   (content/EmbedRT.js)
--- a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/GeckoView.java
+++ b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/GeckoView.java
@@ -9,17 +9,19 @@ package org.mozilla.gecko;
 import java.util.Set;
 
 import org.json.JSONException;
 import org.json.JSONObject;
 import org.mozilla.gecko.annotation.ReflectionTarget;
 import org.mozilla.gecko.annotation.WrapForJNI;
 import org.mozilla.gecko.gfx.LayerView;
 import org.mozilla.gecko.mozglue.JNIObject;
+import org.mozilla.gecko.util.BundleEventListener;
 import org.mozilla.gecko.util.EventCallback;
+import org.mozilla.gecko.util.GeckoBundle;
 
 import android.app.Activity;
 import android.content.Context;
 import android.content.SharedPreferences;
 import android.os.Binder;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.IBinder;
@@ -34,20 +36,22 @@ import android.view.inputmethod.EditorIn
 import android.view.inputmethod.InputConnection;
 
 public class GeckoView extends LayerView
     implements ContextGetter {
 
     private static final String DEFAULT_SHARED_PREFERENCES_FILE = "GeckoView";
     private static final String LOGTAG = "GeckoView";
 
+    private static final boolean DEBUG = false;
+
     private final EventDispatcher eventDispatcher = new EventDispatcher();
 
     private ChromeDelegate mChromeDelegate;
-    private ContentDelegate mContentDelegate;
+    /* package */ ContentListener mContentListener;
 
     private InputConnectionListener mInputConnectionListener;
 
     protected boolean onAttachedToWindowCalled;
     protected String chromeURI;
     protected int screenId = 0; // default to the primary screen
 
     @WrapForJNI(dispatchTo = "proxy")
@@ -103,18 +107,41 @@ public class GeckoView extends LayerView
 
                 @Override
                 public StateBinder[] newArray(int size) {
                     return new StateBinder[size];
                 }
             };
     }
 
+    private class Listener implements BundleEventListener {
+        /* package */ void registerListeners() {
+            getEventDispatcher().registerUiThreadListener(this,
+                "GeckoView:DOMTitleChanged",
+                null);
+        }
+
+        @Override
+        public void handleMessage(final String event, final GeckoBundle message,
+                                  final EventCallback callback) {
+            if (DEBUG) {
+                Log.d(LOGTAG, "handleMessage: event = " + event);
+            }
+
+            if ("GeckoView:DOMTitleChanged".equals(event)) {
+                if (mContentListener != null) {
+                    mContentListener.onTitleChanged(GeckoView.this, message.getString("title"));
+                }
+            }
+        }
+    }
+
     protected Window window;
     private boolean stateSaved;
+    private final Listener listener = new Listener();
 
     public GeckoView(Context context) {
         super(context);
         init(context);
     }
 
     public GeckoView(Context context, AttributeSet attrs) {
         super(context, attrs);
@@ -132,16 +159,17 @@ public class GeckoView extends LayerView
             setGeckoInterface(new BaseGeckoInterface(context));
             GeckoAppShell.setContextGetter(this);
         }
 
         // Perform common initialization for Fennec/GeckoView.
         GeckoAppShell.setLayerView(this);
 
         initializeView();
+        listener.registerListeners();
     }
 
     @Override
     protected Parcelable onSaveInstanceState()
     {
         final Parcelable superState = super.onSaveInstanceState();
         stateSaved = true;
         return new StateBinder(superState, this.window);
@@ -337,20 +365,28 @@ public class GeckoView extends LayerView
     */
     public void setChromeDelegate(ChromeDelegate chrome) {
         mChromeDelegate = chrome;
     }
 
     /**
     * Set the content callback handler.
     * This will replace the current handler.
-    * @param content An implementation of ContentDelegate.
+    * @param content An implementation of ContentListener.
     */
-    public void setContentDelegate(ContentDelegate content) {
-        mContentDelegate = content;
+    public void setContentListener(ContentListener content) {
+        mContentListener = content;
+    }
+
+    /**
+    * Get the content callback handler.
+    * @return The current content callback handler.
+    */
+    public ContentListener getContentListener() {
+        return mContentListener;
     }
 
     public static void setGeckoInterface(final BaseGeckoInterface geckoInterface) {
         GeckoAppShell.setGeckoInterface(geckoInterface);
     }
 
     public static GeckoAppShell.GeckoInterface getGeckoInterface() {
         return GeckoAppShell.getGeckoInterface();
@@ -430,48 +466,18 @@ public class GeckoView extends LayerView
         * Tell the host application to display a remote debugging request dialog.
         * @param view The GeckoView that initiated the callback.
         * @param result A PromptResult used to send back the result without blocking.
         * Defaults to cancel requests.
         */
         public void onDebugRequest(GeckoView view, GeckoView.PromptResult result);
     }
 
-    public interface ContentDelegate {
-        /**
-        * A View has started loading content from the network.
-        * @param view The GeckoView that initiated the callback.
-        * @param url The resource being loaded.
-        */
-        public void onPageStart(GeckoView view, String url);
-
-        /**
-        * A View has finished loading content from the network.
-        * @param view The GeckoView that initiated the callback.
-        * @param success Whether the page loaded successfully or an error occurred.
-        */
-        public void onPageStop(GeckoView view, boolean success);
-
-        /**
-        * A View is displaying content. This page could have been loaded via
-        * network or from the session history.
-        * @param view The GeckoView that initiated the callback.
-        */
-        public void onPageShow(GeckoView view);
-
+    public interface ContentListener {
         /**
         * A page title was discovered in the content or updated after the content
         * loaded.
         * @param view The GeckoView that initiated the callback.
         * @param title The title sent from the content.
         */
-        public void onReceivedTitle(GeckoView view, String title);
-
-        /**
-        * A link element was discovered in the content or updated after the content
-        * loaded that specifies a favicon.
-        * @param view The GeckoView that initiated the callback.
-        * @param url The href of the link element specifying the favicon.
-        * @param size The maximum size specified for the favicon, or -1 for any size.
-        */
-        public void onReceivedFavicon(GeckoView view, String url, int size);
+        public void onTitleChanged(GeckoView view, String title);
     }
 }
deleted file mode 100644
--- a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/GeckoViewContent.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*-
- * 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/. */
-
-package org.mozilla.gecko;
-
-public class GeckoViewContent implements GeckoView.ContentDelegate {
-    /**
-    * A View has started loading content from the network.
-    * @param view The GeckoView that initiated the callback.
-    * @param url The resource being loaded.
-    */
-    @Override
-    public void onPageStart(GeckoView view, String url) {}
-
-    /**
-    * A View has finished loading content from the network.
-    * @param view The GeckoView that initiated the callback.
-    * @param success Whether the page loaded successfully or an error occurred.
-    */
-    @Override
-    public void onPageStop(GeckoView view, boolean success) {}
-
-    /**
-    * A View is displaying content. This page could have been loaded via
-    * network or from the session history.
-    * @param view The GeckoView that initiated the callback.
-    */
-    @Override
-    public void onPageShow(GeckoView view) {}
-
-    /**
-    * A page title was discovered in the content or updated after the content
-    * loaded.
-    * @param view The GeckoView that initiated the callback.
-    * @param title The title sent from the content.
-    */
-    @Override
-    public void onReceivedTitle(GeckoView view, String title) {}
-
-    /**
-    * A link element was discovered in the content or updated after the content
-    * loaded that specifies a favicon.
-    * @param view The GeckoView that initiated the callback.
-    * @param url The href of the link element specifying the favicon.
-    * @param size The maximum size specified for the favicon, or -1 for any size.
-    */
-    @Override
-    public void onReceivedFavicon(GeckoView view, String url, int size) {}
-}
--- a/mobile/android/geckoview_example/src/main/java/org/mozilla/geckoview_example/GeckoViewActivity.java
+++ b/mobile/android/geckoview_example/src/main/java/org/mozilla/geckoview_example/GeckoViewActivity.java
@@ -29,17 +29,17 @@ public class GeckoViewActivity extends A
         super.onCreate(savedInstanceState);
 
         setGeckoInterface(new BaseGeckoInterface(this));
 
         setContentView(R.layout.geckoview_activity);
 
         mGeckoView = (GeckoView) findViewById(R.id.gecko_view);
         mGeckoView.setChromeDelegate(new MyGeckoViewChrome());
-        mGeckoView.setContentDelegate(new MyGeckoViewContent());
+        mGeckoView.setContentListener(new MyGeckoViewContent());
     }
 
     @Override
     protected void onStart() {
         super.onStart();
 
         final GeckoProfile profile = GeckoProfile.get(getApplicationContext());
 
@@ -84,35 +84,15 @@ public class GeckoViewActivity extends A
 
         @Override
         public void onDebugRequest(GeckoView view, GeckoView.PromptResult result) {
             Log.i(LOGTAG, "Remote Debug!");
             result.confirm();
         }
     }
 
-    private class MyGeckoViewContent implements GeckoView.ContentDelegate {
-        @Override
-        public void onPageStart(GeckoView view, String url) {
-
-        }
-
-        @Override
-        public void onPageStop(GeckoView view, boolean success) {
-
-        }
-
+    private class MyGeckoViewContent implements GeckoView.ContentListener {
         @Override
-        public void onPageShow(GeckoView view) {
-
-        }
-
-        @Override
-        public void onReceivedTitle(GeckoView view, String title) {
-            Log.i(LOGTAG, "Received a title: " + title);
-        }
-
-        @Override
-        public void onReceivedFavicon(GeckoView view, String url, int size) {
-            Log.i(LOGTAG, "Received a favicon URL: " + url);
+        public void onTitleChanged(GeckoView view, String title) {
+            Log.i(LOGTAG, "Content title changed to " + title);
         }
     }
 }
new file mode 100644
--- /dev/null
+++ b/mobile/android/modules/GeckoViewContent.jsm
@@ -0,0 +1,50 @@
+/* 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";
+
+this.EXPORTED_SYMBOLS = ["GeckoViewContent"];
+
+const { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components;
+
+var dump = Cu.import("resource://gre/modules/AndroidLog.jsm", {})
+           .AndroidLog.d.bind(null, "ViewContent");
+
+var DEBUG = false;
+
+class GeckoViewContent {
+  constructor(_window, _browser, _windowEventDispatcher) {
+    this.window = _window;
+    this.browser = _browser;
+    this.windowEventDispatcher = _windowEventDispatcher;
+
+    this.window.QueryInterface(Ci.nsIDOMChromeWindow).browserDOMWindow = this;
+
+    this.messageManager.loadFrameScript("chrome://browser/content/GeckoViewContent.js", true);
+    this.messageManager.addMessageListener("GeckoView:DOMTitleChanged", this);
+  }
+
+  get messageManager() {
+    return this.browser.messageManager;
+  }
+
+  handleEvent(event) {
+    if (DEBUG) {
+      dump("handleEvent: event.type=" + event.type);
+    }
+  }
+
+  // Message manager event handler.
+  receiveMessage(msg) {
+    if (DEBUG) {
+      dump("receiveMessage " + msg.name);
+    }
+
+    switch (msg.name) {
+      case "GeckoView:DOMTitleChanged":
+        this.windowEventDispatcher.sendRequest({ type: "GeckoView:DOMTitleChanged", title: msg.data.title });
+        break;
+    }
+  }
+}
--- a/mobile/android/modules/moz.build
+++ b/mobile/android/modules/moz.build
@@ -25,8 +25,13 @@ EXTRA_JS_MODULES += [
     'Prompt.jsm',
     'RuntimePermissions.jsm',
     'Sanitizer.jsm',
     'SharedPreferences.jsm',
     'Snackbars.jsm',
     'SSLExceptions.jsm',
     'WebsiteMetadata.jsm'
 ]
+
+# GeckoView-sepcific modules added separately.
+EXTRA_JS_MODULES += [
+    'GeckoViewContent.jsm'
+]
--- a/python/mozbuild/mozbuild/action/generate_searchjson.py
+++ b/python/mozbuild/mozbuild/action/generate_searchjson.py
@@ -1,23 +1,43 @@
 # 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/.
 
 import sys
 import json
+import copy
 
 engines = []
 
 locale = sys.argv[2]
 output_file = sys.argv[3]
 
 output = open(output_file, 'w')
 
 with open(sys.argv[1]) as f:
   searchinfo = json.load(f)
 
 if locale in searchinfo["locales"]:
-  output.write(json.dumps(searchinfo["locales"][locale]))
+  localeSearchInfo = searchinfo["locales"][locale]
 else:
-  output.write(json.dumps(searchinfo["default"]))
+  localeSearchInfo = {}
+  localeSearchInfo["default"] = searchinfo["default"]
+
+# If we have region overrides, enumerate through them
+# and add the additional regions to the locale information.
+if "regionOverrides" in searchinfo:
+  regionOverrides = searchinfo["regionOverrides"]
+
+  for region in regionOverrides:
+    if not region in localeSearchInfo:
+      # Only add the region if it has engines that need to be overridden
+      if set(localeSearchInfo["default"]["visibleDefaultEngines"]) & set(regionOverrides[region].keys()):
+        localeSearchInfo[region] = copy.deepcopy(localeSearchInfo["default"])
+      else:
+        continue
+    for i, engine in enumerate(localeSearchInfo[region]["visibleDefaultEngines"]):
+      if engine in regionOverrides[region]:
+        localeSearchInfo[region]["visibleDefaultEngines"][i] = regionOverrides[region][engine]
+
+output.write(json.dumps(localeSearchInfo))
 
 output.close();
--- a/python/mozbuild/mozbuild/action/output_searchplugins_list.py
+++ b/python/mozbuild/mozbuild/action/output_searchplugins_list.py
@@ -7,15 +7,25 @@ import json
 
 engines = []
 
 locale = sys.argv[2]
 
 with open(sys.argv[1]) as f:
   searchinfo = json.load(f)
 
+# Get a list of the engines from the locale or the default
+engines = set()
 if locale in searchinfo["locales"]:
-  for region in searchinfo["locales"][locale]:
-    engines = list(set(engines)|set(searchinfo["locales"][locale][region]["visibleDefaultEngines"]))
+  for region, table in searchinfo["locales"][locale].iteritems():
+    engines.update(table["visibleDefaultEngines"])
 else:
-  engines = searchinfo["default"]["visibleDefaultEngines"]
+  engines.update(searchinfo["default"]["visibleDefaultEngines"])
 
+# Get additional engines from regionOverrides
+for region, overrides in searchinfo["regionOverrides"].iteritems():
+  for originalengine, replacement in overrides.iteritems():
+    if originalengine in engines:
+      # We add the engine because we still need the original
+      engines.add(replacement)
+
+# join() will take an iterable, not just a list.
 print '\n'.join(engines)
--- a/testing/web-platform/meta/FileAPI/idlharness.worker.js.ini
+++ b/testing/web-platform/meta/FileAPI/idlharness.worker.js.ini
@@ -60,8 +60,9 @@
   [Blob interface: new Blob(["TEST"\]) must inherit property "close" with the proper type (4)]
     expected: FAIL
 
   [Blob interface: new File(["myFileBits"\], "myFileName") must inherit property "isClosed" with the proper type (2)]
     expected: FAIL
 
   [Blob interface: new File(["myFileBits"\], "myFileName") must inherit property "close" with the proper type (4)]
     expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/IndexedDB/error-attributes.html.ini
@@ -0,0 +1,5 @@
+[error-attributes.html]
+  type: testharness
+  [IDBRequest and IDBTransaction error properties should be DOMExceptions]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/IndexedDB/idbcursor-continuePrimaryKey.htm.ini
@@ -0,0 +1,5 @@
+[idbcursor-continuePrimaryKey.htm]
+  type: testharness
+  [IndexedDB: IDBCursor method continuePrimaryKey()]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/IndexedDB/idbdatabase-createObjectStore-exception-order.htm.ini
@@ -0,0 +1,24 @@
+[idbdatabase-createObjectStore-exception-order.htm]
+  type: testharness
+  disabled: https://bugzilla.mozilla.org/show_bug.cgi?id=1336639
+  expected:
+    if not debug and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): ERROR
+    if debug and not e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): ERROR
+    if not debug and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): ERROR
+    if debug and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): ERROR
+    if not debug and not e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): ERROR
+    if not debug and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): ERROR
+    if debug and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): ERROR
+    if debug and not e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): ERROR
+    if not debug and not e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): ERROR
+    if not debug and not e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): ERROR
+    if debug and e10s and (os == "win") and (version == "6.2.9200") and (processor == "x86_64") and (bits == 64): ERROR
+    if debug and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): ERROR
+    if not debug and e10s and (os == "win") and (version == "6.2.9200") and (processor == "x86_64") and (bits == 64): ERROR
+    if not debug and not e10s and (os == "win") and (version == "6.2.9200") and (processor == "x86_64") and (bits == 64): ERROR
+    if debug and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): ERROR
+    if debug and not e10s and (os == "win") and (version == "6.2.9200") and (processor == "x86_64") and (bits == 64): ERROR
+    if debug and not e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): ERROR
+  [IDBDatabase.createObjectStore exception order: InvalidStateError vs. TransactionInactiveError]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/IndexedDB/idbdatabase-deleteObjectStore-exception-order.htm.ini
@@ -0,0 +1,7 @@
+[idbdatabase-deleteObjectStore-exception-order.htm]
+  type: testharness
+  disabled: https://bugzilla.mozilla.org/show_bug.cgi?id=1336639
+  expected: ERROR
+  [IDBDatabase.deleteObjectStore exception order: InvalidStateError vs. TransactionInactiveError]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/IndexedDB/open-request-queue.html.ini
@@ -0,0 +1,5 @@
+[open-request-queue.html]
+  type: testharness
+  [Opens and deletes are processed in order]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/IndexedDB/upgrade-transaction-lifecycle-backend-aborted.html.ini
@@ -0,0 +1,9 @@
+[upgrade-transaction-lifecycle-backend-aborted.html]
+  type: testharness
+  expected: ERROR
+  [in the abort event handler for a transaction aborted due to an unhandled request error]
+    expected: FAIL
+
+  [in a setTimeout(0) callback after the abort event is fired for a transaction aborted due to an unhandled request failure]
+    expected: NOTRUN
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/IndexedDB/upgrade-transaction-lifecycle-user-aborted.html.ini
@@ -0,0 +1,5 @@
+[upgrade-transaction-lifecycle-user-aborted.html]
+  type: testharness
+  [synchronously after abort() is called]
+    expected: FAIL
+
--- a/testing/web-platform/meta/MANIFEST.json
+++ b/testing/web-platform/meta/MANIFEST.json
@@ -266,16 +266,22 @@
     ]
    ],
    "battery-status/battery-unplugging-manual.html": [
     [
      "/battery-status/battery-unplugging-manual.html",
      {}
     ]
    ],
+   "dpub-aria/inuse-manual.html": [
+    [
+     "/dpub-aria/inuse-manual.html",
+     {}
+    ]
+   ],
    "fullscreen/api/document-exit-fullscreen-manual.html": [
     [
      "/fullscreen/api/document-exit-fullscreen-manual.html",
      {}
     ]
    ],
    "fullscreen/api/document-exit-fullscreen-timing-manual.html": [
     [
@@ -1472,16 +1478,58 @@
     ]
    ],
    "html/semantics/forms/constraints/tooLong-textarea-delete-manual.html": [
     [
      "/html/semantics/forms/constraints/tooLong-textarea-delete-manual.html",
      {}
     ]
    ],
+   "html/semantics/forms/constraints/tooShort-input-email-add-manual.html": [
+    [
+     "/html/semantics/forms/constraints/tooShort-input-email-add-manual.html",
+     {}
+    ]
+   ],
+   "html/semantics/forms/constraints/tooShort-input-password-add-manual.html": [
+    [
+     "/html/semantics/forms/constraints/tooShort-input-password-add-manual.html",
+     {}
+    ]
+   ],
+   "html/semantics/forms/constraints/tooShort-input-search-add-manual.html": [
+    [
+     "/html/semantics/forms/constraints/tooShort-input-search-add-manual.html",
+     {}
+    ]
+   ],
+   "html/semantics/forms/constraints/tooShort-input-tel-add-manual.html": [
+    [
+     "/html/semantics/forms/constraints/tooShort-input-tel-add-manual.html",
+     {}
+    ]
+   ],
+   "html/semantics/forms/constraints/tooShort-input-text-add-manual.html": [
+    [
+     "/html/semantics/forms/constraints/tooShort-input-text-add-manual.html",
+     {}
+    ]
+   ],
+   "html/semantics/forms/constraints/tooShort-input-url-add-manual.html": [
+    [
+     "/html/semantics/forms/constraints/tooShort-input-url-add-manual.html",
+     {}
+    ]
+   ],
+   "html/semantics/forms/constraints/tooShort-textarea-add-manual.html": [
+    [
+     "/html/semantics/forms/constraints/tooShort-textarea-add-manual.html",
+     {}
+    ]
+   ],
    "html/semantics/forms/the-input-element/file-manual.html": [
     [
      "/html/semantics/forms/the-input-element/file-manual.html",
      {}
     ]
    ],
    "html/semantics/forms/the-input-element/maxlength-manual.html": [
     [
@@ -1604,16 +1652,22 @@
     ]
    ],
    "notifications/requestPermission-granted-manual.html": [
     [
      "/notifications/requestPermission-granted-manual.html",
      {}
     ]
    ],
+   "notifications/shownotification-resolve-manual.html": [
+    [
+     "/notifications/shownotification-resolve-manual.html",
+     {}
+    ]
+   ],
    "notifications/tag-different-manual.html": [
     [
      "/notifications/tag-different-manual.html",
      {}
     ]
    ],
    "notifications/tag-same-manual.html": [
     [
@@ -1886,16 +1940,22 @@
     ]
    ],
    "page-visibility/test_tab_state_change-manual.html": [
     [
      "/page-visibility/test_tab_state_change-manual.html",
      {}
     ]
    ],
+   "pointerevents/compat/pointerevent_touch-action_two-finger_interaction-manual.html": [
+    [
+     "/pointerevents/compat/pointerevent_touch-action_two-finger_interaction-manual.html",
+     {}
+    ]
+   ],
    "pointerevents/pointerevent_attributes_hoverable_pointers-manual.html": [
     [
      "/pointerevents/pointerevent_attributes_hoverable_pointers-manual.html",
      {}
     ]
    ],
    "pointerevents/pointerevent_attributes_nohover_pointers-manual.html": [
     [
@@ -12656,16 +12716,21 @@
      {}
     ]
    ],
    "./check_stability.py": [
     [
      {}
     ]
    ],
+   "./ci_built_diff.sh": [
+    [
+     {}
+    ]
+   ],
    "./ci_lint.sh": [
     [
      {}
     ]
    ],
    "./ci_stability.sh": [
     [
      {}
@@ -12711,16 +12776,21 @@
      {}
     ]
    ],
    "./test_keys_wdspec.html": [
     [
      {}
     ]
    ],
+   "./update-built-tests.sh": [
+    [
+     {}
+    ]
+   ],
    "2dcontext/2x2.png": [
     [
      {}
     ]
    ],
    "2dcontext/best-practices/.gitkeep": [
     [
      {}
@@ -13821,16 +13891,21 @@
      {}
     ]
    ],
    "2dcontext/tools/LICENSE.txt": [
     [
      {}
     ]
    ],
+   "2dcontext/tools/build.sh": [
+    [
+     {}
+    ]
+   ],
    "2dcontext/tools/current-work-canvas.xhtml": [
     [
      {}
     ]
    ],
    "2dcontext/tools/gentest.py": [
     [
      {}
@@ -17571,16 +17646,21 @@
      {}
     ]
    ],
    "clear-site-data/support/test_utils.js": [
     [
      {}
     ]
    ],
+   "clipboard/OWNERS": [
+    [
+     {}
+    ]
+   ],
    "common/OWNERS": [
     [
      {}
     ]
    ],
    "common/blank.html": [
     [
      {}
@@ -33881,16 +33961,21 @@
      {}
     ]
    ],
    "conformance-checkers/html/elements/keygen/id-redundant-novalid.html": [
     [
      {}
     ]
    ],
+   "conformance-checkers/html/elements/keygen/keygen-novalid.html": [
+    [
+     {}
+    ]
+   ],
    "conformance-checkers/html/elements/keygen/keytype-bad-value-novalid.html": [
     [
      {}
     ]
    ],
    "conformance-checkers/html/elements/keygen/keytype-empty-novalid.html": [
     [
      {}
@@ -36856,16 +36941,36 @@
      {}
     ]
    ],
    "conformance-checkers/html/elements/sup/model-novalid.html": [
     [
      {}
     ]
    ],
+   "conformance-checkers/html/elements/table/integrity/Alexis_of_Russia-novalid.html": [
+    [
+     {}
+    ]
+   ],
+   "conformance-checkers/html/elements/table/integrity/Feodor_I_of_Russia-novalid.html": [
+    [
+     {}
+    ]
+   ],
+   "conformance-checkers/html/elements/table/integrity/Naser_al-Din_Shah_Qajar-novalid.html": [
+    [
+     {}
+    ]
+   ],
+   "conformance-checkers/html/elements/table/integrity/vertical-novalid.html": [
+    [
+     {}
+    ]
+   ],
    "conformance-checkers/html/elements/table/model-input-child-hidden-novalid.html": [
     [
      {}
     ]
    ],
    "conformance-checkers/html/elements/table/model-input-child-novalid.html": [
     [
      {}
@@ -39456,16 +39561,21 @@
      {}
     ]
    ],
    "conformance-checkers/xhtml/elements/keygen/361-novalid.xhtml": [
     [
      {}
     ]
    ],
+   "conformance-checkers/xhtml/elements/keygen/keygen-novalid.xhtml": [
+    [
+     {}
+    ]
+   ],
    "conformance-checkers/xhtml/elements/link/001-novalid.xhtml": [
     [
      {}
     ]
    ],
    "conformance-checkers/xhtml/elements/map/048-isvalid.xhtml": [
     [
      {}
@@ -41851,16 +41961,21 @@
      {}
     ]
    ],
    "dpub-aam/README.md": [
     [
      {}
     ]
    ],
+   "dpub-aria/.editorconfig": [
+    [
+     {}
+    ]
+   ],
    "dpub-aria/OWNERS": [
     [
      {}
     ]
    ],
    "dpub-aria/README.md": [
     [
      {}
@@ -50396,16 +50511,21 @@
      {}
     ]
    ],
    "html/infrastructure/common-dom-interfaces/collections/contains.json": [
     [
      {}
     ]
    ],
+   "html/infrastructure/common-dom-interfaces/collections/domstringlist.idl": [
+    [
+     {}
+    ]
+   ],
    "html/infrastructure/common-dom-interfaces/domstringmap/.gitkeep": [
     [
      {}
     ]
    ],
    "html/infrastructure/common-dom-interfaces/garbage-collection/.gitkeep": [
     [
      {}
@@ -51546,16 +51666,21 @@
      {}
     ]
    ],
    "html/semantics/embedded-content/image-maps/contains.json": [
     [
      {}
     ]
    ],
+   "html/semantics/embedded-content/image-maps/image-map-processing-model/hash-name-reference-test-data.html": [
+    [
+     {}
+    ]
+   ],
    "html/semantics/embedded-content/mathml/.gitkeep": [
     [
      {}
     ]
    ],
    "html/semantics/embedded-content/media-elements/.gitkeep": [
     [
      {}
@@ -52141,16 +52266,21 @@
      {}
     ]
    ],
    "html/semantics/forms/resetting-a-form/.gitkeep": [
     [
      {}
     ]
    ],
+   "html/semantics/forms/resetting-a-form/reset-form-event-realm-support.html": [
+    [
+     {}
+    ]
+   ],
    "html/semantics/forms/textfieldselection/.gitkeep": [
     [
      {}
     ]
    ],
    "html/semantics/forms/textfieldselection/original-id.json": [
     [
      {}
@@ -52606,21 +52736,36 @@
      {}
     ]
    ],
    "html/semantics/scripting-1/the-script-element/log.py": [
     [
      {}
     ]
    ],
+   "html/semantics/scripting-1/the-script-element/resources/cocoa-module.js": [
+    [
+     {}
+    ]
+   ],
    "html/semantics/scripting-1/the-script-element/resources/cross-origin.py": [
     [
      {}
     ]
    ],
+   "html/semantics/scripting-1/the-script-element/resources/exports-cocoa.js": [
+    [
+     {}
+    ]
+   ],
+   "html/semantics/scripting-1/the-script-element/resources/set-script-executed.js": [
+    [
+     {}
+    ]
+   ],
    "html/semantics/scripting-1/the-script-element/script-not-executed-after-shutdown-child.html": [
     [
      {}
     ]
    ],
    "html/semantics/scripting-1/the-script-element/script-not-executed-after-shutdown.js": [
     [
      {}
@@ -53456,16 +53601,21 @@
      {}
     ]
    ],
    "html/the-xhtml-syntax/writing-xhtml-documents/.gitkeep": [
     [
      {}
     ]
    ],
+   "html/tools/build.sh": [
+    [
+     {}
+    ]
+   ],
    "html/tools/html5lib_test.xml": [
     [
      {}
     ]
    ],
    "html/tools/html5lib_test_fragment.xml": [
     [
      {}
@@ -55276,16 +55426,31 @@
      {}
     ]
    ],
    "notifications/common.js": [
     [
      {}
     ]
    ],
+   "notifications/resources/icon.png": [
+    [
+     {}
+    ]
+   ],
+   "notifications/resources/shownotification-sw.js": [
+    [
+     {}
+    ]
+   ],
+   "offscreen-canvas/tools/build.sh": [
+    [
+     {}
+    ]
+   ],
    "offscreen-canvas/tools/gentest.py": [
     [
      {}
     ]
    ],
    "offscreen-canvas/tools/name2dir.yaml": [
     [
      {}
@@ -56466,16 +56631,26 @@
      {}
     ]
    ],
    "payment-request/OWNERS": [
     [
      {}
     ]
    ],
+   "payment-request/allowpaymentrequest/common.sub.js": [
+    [
+     {}
+    ]
+   ],
+   "payment-request/allowpaymentrequest/echo-PaymentRequest.html": [
+    [
+     {}
+    ]
+   ],
    "performance-timeline/OWNERS": [
     [
      {}
     ]
    ],
    "performance-timeline/performanceobservers.js": [
     [
      {}
@@ -56541,16 +56716,26 @@
      {}
     ]
    ],
    "preload/resources/dummy.xml": [
     [
      {}
     ]
    ],
+   "preload/resources/empty.html": [
+    [
+     {}
+    ]
+   ],
+   "preload/resources/fetch-destination-worker.js": [
+    [
+     {}
+    ]
+   ],
    "preload/resources/square.png": [
     [
      {}
     ]
    ],
    "presentation-api/OWNERS": [
     [
      {}
@@ -59356,21 +59541,36 @@
      {}
     ]
    ],
    "selection/OWNERS": [
     [
      {}
     ]
    ],
+   "selection/addRange.js": [
+    [
+     {}
+    ]
+   ],
+   "selection/collapse.js": [
+    [
+     {}
+    ]
+   ],
    "selection/common.js": [
     [
      {}
     ]
    ],
+   "selection/extend.js": [
+    [
+     {}
+    ]
+   ],
    "selection/test-iframe.html": [
     [
      {}
     ]
    ],
    "selectors-api/tests/submissions/Opera/ParentNode-query-queryAll.js": [
     [
      {}
@@ -60281,26 +60481,86 @@
      {}
     ]
    ],
    "streams/OWNERS": [
     [
      {}
     ]
    ],
+   "streams/README.md": [
+    [
+     {}
+    ]
+   ],
    "streams/byte-length-queuing-strategy.js": [
     [
      {}
     ]
    ],
    "streams/count-queuing-strategy.js": [
     [
      {}
     ]
    ],
+   "streams/generate-test-wrappers.js": [
+    [
+     {}
+    ]
+   ],
+   "streams/piping/close-propagation-backward.js": [
+    [
+     {}
+    ]
+   ],
+   "streams/piping/close-propagation-forward.js": [
+    [
+     {}
+    ]
+   ],
+   "streams/piping/error-propagation-backward.js": [
+    [
+     {}
+    ]
+   ],
+   "streams/piping/error-propagation-forward.js": [
+    [
+     {}
+    ]
+   ],
+   "streams/piping/flow-control.js": [
+    [
+     {}
+    ]
+   ],
+   "streams/piping/general.js": [
+    [
+     {}
+    ]
+   ],
+   "streams/piping/multiple-propagation.js": [
+    [
+     {}
+    ]
+   ],
+   "streams/piping/pipe-through.js": [
+    [
+     {}
+    ]
+   ],
+   "streams/piping/transform-streams.js": [
+    [
+     {}
+    ]
+   ],
+   "streams/readable-byte-streams/general.js": [
+    [
+     {}
+    ]
+   ],
    "streams/readable-streams/bad-strategies.js": [
     [
      {}
     ]
    ],
    "streams/readable-streams/bad-underlying-sources.js": [
     [
      {}
@@ -60346,16 +60606,21 @@
      {}
     ]
    ],
    "streams/readable-streams/templated.js": [
     [
      {}
     ]
    ],
+   "streams/resources/recording-streams.js": [
+    [
+     {}
+    ]
+   ],
    "streams/resources/rs-test-templates.js": [
     [
      {}
     ]
    ],
    "streams/resources/rs-utils.js": [
     [
      {}
@@ -60366,16 +60631,71 @@
      {}
     ]
    ],
    "streams/resources/test-utils.js": [
     [
      {}
     ]
    ],
+   "streams/writable-streams/aborting.js": [
+    [
+     {}
+    ]
+   ],
+   "streams/writable-streams/bad-strategies.js": [
+    [
+     {}
+    ]
+   ],
+   "streams/writable-streams/bad-underlying-sinks.js": [
+    [
+     {}
+    ]
+   ],
+   "streams/writable-streams/brand-checks.js": [
+    [
+     {}
+    ]
+   ],
+   "streams/writable-streams/byte-length-queuing-strategy.js": [
+    [
+     {}
+    ]
+   ],
+   "streams/writable-streams/close.js": [
+    [
+     {}
+    ]
+   ],
+   "streams/writable-streams/constructor.js": [
+    [
+     {}
+    ]
+   ],
+   "streams/writable-streams/count-queuing-strategy.js": [
+    [
+     {}
+    ]
+   ],
+   "streams/writable-streams/general.js": [
+    [
+     {}
+    ]
+   ],
+   "streams/writable-streams/start.js": [
+    [
+     {}
+    ]
+   ],
+   "streams/writable-streams/write.js": [
+    [
+     {}
+    ]
+   ],
    "subresource-integrity/OWNERS": [
     [
      {}
     ]
    ],
    "subresource-integrity/alternate.css": [
     [
      {}
@@ -60451,16 +60771,26 @@
      {}
     ]
    ],
    "subresource-integrity/tools/list_hashes.py": [
     [
      {}
     ]
    ],
+   "svg-aam/OWNERS": [
+    [
+     {}
+    ]
+   ],
+   "svg-aam/README.md": [
+    [
+     {}
+    ]
+   ],
    "svg/OWNERS": [
     [
      {}
     ]
    ],
    "svg/README.md": [
     [
      {}
@@ -70011,16 +70341,21 @@
      {}
     ]
    ],
    "webstorage/resources/storage_session_window_open_second.html": [
     [
      {}
     ]
    ],
+   "webvr/OWNERS": [
+    [
+     {}
+    ]
+   ],
    "webvtt/OWNERS": [
     [
      {}
     ]
    ],
    "webvtt/rendering/cues-with-video/processing-model/2_cues_overlapping_completely_move_up-ref.html": [
     [
      {}
@@ -76928,16 +77263,22 @@
     ]
    ],
    "IndexedDB/cursor-overloads.htm": [
     [
      "/IndexedDB/cursor-overloads.htm",
      {}
     ]
    ],
+   "IndexedDB/error-attributes.html": [
+    [
+     "/IndexedDB/error-attributes.html",
+     {}
+    ]
+   ],
    "IndexedDB/historical.html": [
     [
      "/IndexedDB/historical.html",
      {}
     ]
    ],
    "IndexedDB/idb_binary_key_conversion.htm": [
     [
@@ -76952,42 +77293,72 @@
     ]
    ],
    "IndexedDB/idbcursor-advance-continue-async.htm": [
     [
      "/IndexedDB/idbcursor-advance-continue-async.htm",
      {}
     ]
    ],
+   "IndexedDB/idbcursor-advance-exception-order.html": [
+    [
+     "/IndexedDB/idbcursor-advance-exception-order.html",
+     {}
+    ]
+   ],
    "IndexedDB/idbcursor-advance-invalid.htm": [
     [
      "/IndexedDB/idbcursor-advance-invalid.htm",
      {}
     ]
    ],
    "IndexedDB/idbcursor-advance.htm": [
     [
      "/IndexedDB/idbcursor-advance.htm",
      {}
     ]
    ],
+   "IndexedDB/idbcursor-continue-exception-order.htm": [
+    [
+     "/IndexedDB/idbcursor-continue-exception-order.htm",
+     {}
+    ]
+   ],
    "IndexedDB/idbcursor-continue.htm": [
     [
      "/IndexedDB/idbcursor-continue.htm",
      {}
     ]
    ],
    "IndexedDB/idbcursor-continuePrimaryKey-exception-order.htm": [
     [
      "/IndexedDB/idbcursor-continuePrimaryKey-exception-order.htm",
      {
       "timeout": "long"
      }
     ]
    ],
+   "IndexedDB/idbcursor-continuePrimaryKey-exceptions.htm": [
+    [
+     "/IndexedDB/idbcursor-continuePrimaryKey-exceptions.htm",
+     {}
+    ]
+   ],
+   "IndexedDB/idbcursor-continuePrimaryKey.htm": [
+    [
+     "/IndexedDB/idbcursor-continuePrimaryKey.htm",
+     {}
+    ]
+   ],
+   "IndexedDB/idbcursor-delete-exception-order.htm": [
+    [
+     "/IndexedDB/idbcursor-delete-exception-order.htm",
+     {}
+    ]
+   ],
    "IndexedDB/idbcursor-direction-index-keyrange.htm": [
     [
      "/IndexedDB/idbcursor-direction-index-keyrange.htm",
      {}
     ]
    ],
    "IndexedDB/idbcursor-direction-index.htm": [
     [
@@ -77032,16 +77403,22 @@
     ]
    ],
    "IndexedDB/idbcursor-source.htm": [
     [
      "/IndexedDB/idbcursor-source.htm",
      {}
     ]
    ],
+   "IndexedDB/idbcursor-update-exception-order.htm": [
+    [
+     "/IndexedDB/idbcursor-update-exception-order.htm",
+     {}
+    ]
+   ],
    "IndexedDB/idbcursor_advance_index.htm": [
     [
      "/IndexedDB/idbcursor_advance_index.htm",
      {}
     ]
    ],
    "IndexedDB/idbcursor_advance_index2.htm": [
     [
@@ -77392,16 +77769,34 @@
     ]
    ],
    "IndexedDB/idbcursor_update_objectstore9.htm": [
     [
      "/IndexedDB/idbcursor_update_objectstore9.htm",
      {}
     ]
    ],
+   "IndexedDB/idbdatabase-createObjectStore-exception-order.htm": [
+    [
+     "/IndexedDB/idbdatabase-createObjectStore-exception-order.htm",
+     {}
+    ]
+   ],
+   "IndexedDB/idbdatabase-deleteObjectStore-exception-order.htm": [
+    [
+     "/IndexedDB/idbdatabase-deleteObjectStore-exception-order.htm",
+     {}
+    ]
+   ],
+   "IndexedDB/idbdatabase-transaction-exception-order.html": [
+    [
+     "/IndexedDB/idbdatabase-transaction-exception-order.html",
+     {}
+    ]
+   ],
    "IndexedDB/idbdatabase_close.htm": [
     [
      "/IndexedDB/idbdatabase_close.htm",
      {}
     ]
    ],
    "IndexedDB/idbdatabase_close2.htm": [
     [
@@ -77660,16 +78055,28 @@
     ]
    ],
    "IndexedDB/idbfactory_open9.htm": [
     [
      "/IndexedDB/idbfactory_open9.htm",
      {}
     ]
    ],
+   "IndexedDB/idbindex-getAll-enforcerange.html": [
+    [
+     "/IndexedDB/idbindex-getAll-enforcerange.html",
+     {}
+    ]
+   ],
+   "IndexedDB/idbindex-getAllKeys-enforcerange.html": [
+    [
+     "/IndexedDB/idbindex-getAllKeys-enforcerange.html",
+     {}
+    ]
+   ],
    "IndexedDB/idbindex-multientry-arraykeypath.htm": [
     [
      "/IndexedDB/idbindex-multientry-arraykeypath.htm",
      {}
     ]
    ],
    "IndexedDB/idbindex-multientry-big.htm": [
     [
@@ -77678,16 +78085,22 @@
     ]
    ],
    "IndexedDB/idbindex-multientry.htm": [
     [
      "/IndexedDB/idbindex-multientry.htm",
      {}
     ]
    ],
+   "IndexedDB/idbindex-query-exception-order.html": [
+    [
+     "/IndexedDB/idbindex-query-exception-order.html",
+     {}
+    ]
+   ],
    "IndexedDB/idbindex-rename-abort.html": [
     [
      "/IndexedDB/idbindex-rename-abort.html",
      {}
     ]
    ],
    "IndexedDB/idbindex-rename-errors.html": [
     [
@@ -77896,16 +78309,58 @@
     ]
    ],
    "IndexedDB/idbkeyrange_incorrect.htm": [
     [
      "/IndexedDB/idbkeyrange_incorrect.htm",
      {}
     ]
    ],
+   "IndexedDB/idbobjectstore-add-put-exception-order.html": [
+    [
+     "/IndexedDB/idbobjectstore-add-put-exception-order.html",
+     {}
+    ]
+   ],
+   "IndexedDB/idbobjectstore-clear-exception-order.html": [
+    [
+     "/IndexedDB/idbobjectstore-clear-exception-order.html",
+     {}
+    ]
+   ],
+   "IndexedDB/idbobjectstore-delete-exception-order.html": [
+    [
+     "/IndexedDB/idbobjectstore-delete-exception-order.html",
+     {}
+    ]
+   ],
+   "IndexedDB/idbobjectstore-deleteIndex-exception-order.html": [
+    [
+     "/IndexedDB/idbobjectstore-deleteIndex-exception-order.html",
+     {}
+    ]
+   ],
+   "IndexedDB/idbobjectstore-getAll-enforcerange.html": [
+    [
+     "/IndexedDB/idbobjectstore-getAll-enforcerange.html",
+     {}
+    ]
+   ],
+   "IndexedDB/idbobjectstore-getAllKeys-enforcerange.html": [
+    [
+     "/IndexedDB/idbobjectstore-getAllKeys-enforcerange.html",
+     {}
+    ]
+   ],
+   "IndexedDB/idbobjectstore-query-exception-order.html": [
+    [
+     "/IndexedDB/idbobjectstore-query-exception-order.html",
+     {}
+    ]
+   ],
    "IndexedDB/idbobjectstore-rename-abort.html": [
     [
      "/IndexedDB/idbobjectstore-rename-abort.html",
      {}
     ]
    ],
    "IndexedDB/idbobjectstore-rename-errors.html": [
     [
@@ -78388,16 +78843,22 @@
     ]
    ],
    "IndexedDB/idbrequest_result.html": [
     [
      "/IndexedDB/idbrequest_result.html",
      {}
     ]
    ],
+   "IndexedDB/idbtransaction-objectStore-exception-order.html": [
+    [
+     "/IndexedDB/idbtransaction-objectStore-exception-order.html",
+     {}
+    ]
+   ],
    "IndexedDB/idbtransaction-oncomplete.htm": [
     [
      "/IndexedDB/idbtransaction-oncomplete.htm",
      {}
     ]
    ],
    "IndexedDB/idbtransaction.htm": [
     [
@@ -78512,16 +78973,22 @@
     ]
    ],
    "IndexedDB/objectstore_keyorder.htm": [
     [
      "/IndexedDB/objectstore_keyorder.htm",
      {}
     ]
    ],
+   "IndexedDB/open-request-queue.html": [
+    [
+     "/IndexedDB/open-request-queue.html",
+     {}
+    ]
+   ],
    "IndexedDB/request_bubble-and-capture.htm": [
     [
      "/IndexedDB/request_bubble-and-capture.htm",
      {}
     ]
    ],
    "IndexedDB/string-list-ordering.htm": [
     [
@@ -78584,16 +79051,34 @@
     ]
    ],
    "IndexedDB/transaction_bubble-and-capture.htm": [
     [
      "/IndexedDB/transaction_bubble-and-capture.htm",
      {}
     ]
    ],
+   "IndexedDB/upgrade-transaction-lifecycle-backend-aborted.html": [
+    [
+     "/IndexedDB/upgrade-transaction-lifecycle-backend-aborted.html",
+     {}
+    ]
+   ],
+   "IndexedDB/upgrade-transaction-lifecycle-committed.html": [
+    [
+     "/IndexedDB/upgrade-transaction-lifecycle-committed.html",
+     {}
+    ]
+   ],
+   "IndexedDB/upgrade-transaction-lifecycle-user-aborted.html": [
+    [
+     "/IndexedDB/upgrade-transaction-lifecycle-user-aborted.html",
+     {}
+    ]
+   ],
    "IndexedDB/value.htm": [
     [
      "/IndexedDB/value.htm",
      {}
     ]
    ],
    "IndexedDB/value_recursive.htm": [
     [
@@ -79574,16 +80059,22 @@
     ]
    ],
    "XMLHttpRequest/headers-normalize-response.htm": [
     [
      "/XMLHttpRequest/headers-normalize-response.htm",
      {}
     ]
    ],
+   "XMLHttpRequest/historical.html": [
+    [
+     "/XMLHttpRequest/historical.html",
+     {}
+    ]
+   ],
    "XMLHttpRequest/interfaces.html": [
     [
      "/XMLHttpRequest/interfaces.html",
      {}
     ]
    ],
    "XMLHttpRequest/open-after-abort.htm": [
     [
@@ -86200,16 +86691,32 @@
     ]
    ],
    "fetch/api/credentials/cookies.html": [
     [
      "/fetch/api/credentials/cookies.html",
      {}
     ]
    ],
+   "fetch/api/headers/header-values-normalize.html": [
+    [
+     "/fetch/api/headers/header-values-normalize.html",
+     {
+      "timeout": "long"
+     }
+    ]
+   ],
+   "fetch/api/headers/header-values.html": [
+    [
+     "/fetch/api/headers/header-values.html",
+     {
+      "timeout": "long"
+     }
+    ]
+   ],
    "fetch/api/headers/headers-basic.html": [
     [
      "/fetch/api/headers/headers-basic.html",
      {}
     ]
    ],
    "fetch/api/headers/headers-casing.html": [
     [
@@ -87618,16 +88125,40 @@
     ]
    ],
    "html/browsers/history/the-location-interface/document_location.html": [
     [
      "/html/browsers/history/the-location-interface/document_location.html",
      {}
     ]
    ],
+   "html/browsers/history/the-location-interface/location-pathname-setter-question-mark.html": [
+    [
+     "/html/browsers/history/the-location-interface/location-pathname-setter-question-mark.html",
+     {}
+    ]
+   ],
+   "html/browsers/history/the-location-interface/location-protocol-setter-non-broken-weird.html": [
+    [
+     "/html/browsers/history/the-location-interface/location-protocol-setter-non-broken-weird.html",
+     {}
+    ]
+   ],
+   "html/browsers/history/the-location-interface/location-protocol-setter-non-broken.html": [
+    [
+     "/html/browsers/history/the-location-interface/location-protocol-setter-non-broken.html",
+     {}
+    ]
+   ],
+   "html/browsers/history/the-location-interface/location-protocol-setter.html": [
+    [
+     "/html/browsers/history/the-location-interface/location-protocol-setter.html",
+     {}
+    ]
+   ],
    "html/browsers/history/the-location-interface/location-prototype-setting.html": [
     [
      "/html/browsers/history/the-location-interface/location-prototype-setting.html",
      {}
     ]
    ],
    "html/browsers/history/the-location-interface/location-stringifier.html": [
     [
@@ -89362,16 +89893,34 @@
     ]
    ],
    "html/editing/focus/sequential-focus-navigation-and-the-tabindex-attribute/focus-tabindex-default-value.html": [
     [
      "/html/editing/focus/sequential-focus-navigation-and-the-tabindex-attribute/focus-tabindex-default-value.html",
      {}
     ]
    ],
+   "html/infrastructure/common-dom-interfaces/collections/domstringlist-interface.html": [
+    [
+     "/html/infrastructure/common-dom-interfaces/collections/domstringlist-interface.html",
+     {}
+    ]
+   ],
+   "html/infrastructure/common-dom-interfaces/collections/domstringlist-interface.worker.js": [
+    [
+     "/html/infrastructure/common-dom-interfaces/collections/domstringlist-interface.worker.html",
+     {}
+    ]
+   ],
+   "html/infrastructure/common-dom-interfaces/collections/domstringlist.html": [
+    [
+     "/html/infrastructure/common-dom-interfaces/collections/domstringlist.html",
+     {}
+    ]
+   ],
    "html/infrastructure/common-dom-interfaces/collections/historical.html": [
     [
      "/html/infrastructure/common-dom-interfaces/collections/historical.html",
      {}
     ]
    ],
    "html/infrastructure/common-dom-interfaces/collections/htmlallcollection.html": [
     [
@@ -89534,16 +90083,28 @@
     ]
    ],
    "html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-scrolldelay.html": [
     [
      "/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-scrolldelay.html",
      {}
     ]
    ],
+   "html/rendering/non-replaced-elements/tables/table-vspace-hspace-s.html": [
+    [
+     "/html/rendering/non-replaced-elements/tables/table-vspace-hspace-s.html",
+     {}
+    ]
+   ],
+   "html/rendering/non-replaced-elements/tables/table-vspace-hspace.html": [
+    [
+     "/html/rendering/non-replaced-elements/tables/table-vspace-hspace.html",
+     {}
+    ]
+   ],
    "html/rendering/replaced-elements/svg-embedded-sizing/svg-in-iframe-auto.html": [
     [
      "/html/rendering/replaced-elements/svg-embedded-sizing/svg-in-iframe-auto.html",
      {
       "timeout": "long"
      }
     ]
    ],
@@ -89798,16 +90359,22 @@
     ]
    ],
    "html/semantics/edits/the-ins-element/ins_effect.html": [
     [
      "/html/semantics/edits/the-ins-element/ins_effect.html",
      {}
     ]
    ],
+   "html/semantics/embedded-content/image-maps/image-map-processing-model/hash-name-reference.html": [
+    [
+     "/html/semantics/embedded-content/image-maps/image-map-processing-model/hash-name-reference.html",
+     {}
+    ]
+   ],
    "html/semantics/embedded-content/media-elements/audio_loop_base.html": [
     [
      "/html/semantics/embedded-content/media-elements/audio_loop_base.html",
      {
       "timeout": "long"
      }
     ]
    ],
@@ -92038,16 +92605,22 @@
     ]
    ],
    "html/semantics/forms/resetting-a-form/reset-event.html": [
     [
      "/html/semantics/forms/resetting-a-form/reset-event.html",
      {}
     ]
    ],
+   "html/semantics/forms/resetting-a-form/reset-form-event-realm.html": [
+    [
+     "/html/semantics/forms/resetting-a-form/reset-form-event-realm.html",
+     {}
+    ]
+   ],
    "html/semantics/forms/resetting-a-form/reset-form.html": [
     [
      "/html/semantics/forms/resetting-a-form/reset-form.html",
      {}
     ]
    ],
    "html/semantics/forms/textfieldselection/select-event.html": [
     [
@@ -92670,16 +93243,22 @@
     ]
    ],
    "html/semantics/interactive-elements/the-dialog-element/dialog-showModal.html": [
     [
      "/html/semantics/interactive-elements/the-dialog-element/dialog-showModal.html",
      {}
     ]
    ],
+   "html/semantics/interactive-elements/the-summary-element/activation-behavior.html": [
+    [
+     "/html/semantics/interactive-elements/the-summary-element/activation-behavior.html",
+     {}
+    ]
+   ],
    "html/semantics/interfaces.html": [
     [
      "/html/semantics/interfaces.html",
      {}
     ]
    ],
    "html/semantics/links/links-created-by-a-and-area-elements/htmlanchorelement_attribute-getter-setter.html": [
     [
@@ -92802,16 +93381,52 @@
     ]
    ],
    "html/semantics/scripting-1/the-script-element/load-event.html": [
     [
      "/html/semantics/scripting-1/the-script-element/load-event.html",
      {}
     ]
    ],
+   "html/semantics/scripting-1/the-script-element/nomodule-reflect.html": [
+    [
+     "/html/semantics/scripting-1/the-script-element/nomodule-reflect.html",
+     {}
+    ]
+   ],
+   "html/semantics/scripting-1/the-script-element/nomodule-set-on-async-classic-script.html": [
+    [
+     "/html/semantics/scripting-1/the-script-element/nomodule-set-on-async-classic-script.html",
+     {}
+    ]
+   ],
+   "html/semantics/scripting-1/the-script-element/nomodule-set-on-external-module-script.html": [
+    [
+     "/html/semantics/scripting-1/the-script-element/nomodule-set-on-external-module-script.html",
+     {}
+    ]
+   ],
+   "html/semantics/scripting-1/the-script-element/nomodule-set-on-inline-classic-scripts.html": [
+    [
+     "/html/semantics/scripting-1/the-script-element/nomodule-set-on-inline-classic-scripts.html",
+     {}
+    ]
+   ],
+   "html/semantics/scripting-1/the-script-element/nomodule-set-on-inline-module-script.html": [
+    [
+     "/html/semantics/scripting-1/the-script-element/nomodule-set-on-inline-module-script.html",
+     {}
+    ]
+   ],
+   "html/semantics/scripting-1/the-script-element/nomodule-set-on-synchronously-loaded-classic-scripts.html": [
+    [
+     "/html/semantics/scripting-1/the-script-element/nomodule-set-on-synchronously-loaded-classic-scripts.html",
+     {}
+    ]
+   ],
    "html/semantics/scripting-1/the-script-element/script-charset-01.html": [
     [
      "/html/semantics/scripting-1/the-script-element/script-charset-01.html",
      {}
     ]
    ],
    "html/semantics/scripting-1/the-script-element/script-charset-02.html": [
     [
@@ -93594,16 +94209,40 @@
     ],
     [
      "/html/syntax/parsing/html5lib_inbody01.html?run_type=write_single",
      {
       "timeout": "long"
      }
     ]
    ],
+   "html/syntax/parsing/html5lib_innerHTML_adoption01.html": [
+    [
+     "/html/syntax/parsing/html5lib_innerHTML_adoption01.html",
+     {
+      "timeout": "long"
+     }
+    ]
+   ],
+   "html/syntax/parsing/html5lib_innerHTML_foreign-fragment.html": [
+    [
+     "/html/syntax/parsing/html5lib_innerHTML_foreign-fragment.html",
+     {
+      "timeout": "long"
+     }
+    ]
+   ],
+   "html/syntax/parsing/html5lib_innerHTML_math.html": [
+    [
+     "/html/syntax/parsing/html5lib_innerHTML_math.html",
+     {
+      "timeout": "long"
+     }
+    ]
+   ],
    "html/syntax/parsing/html5lib_innerHTML_tests4.html": [
     [
      "/html/syntax/parsing/html5lib_innerHTML_tests4.html",
      {
       "timeout": "long"
      }
     ]
    ],
@@ -93626,16 +94265,24 @@
    "html/syntax/parsing/html5lib_innerHTML_tests_innerHTML_1.html": [
     [
      "/html/syntax/parsing/html5lib_innerHTML_tests_innerHTML_1.html",
      {
       "timeout": "long"
      }
     ]
    ],
+   "html/syntax/parsing/html5lib_innerHTML_webkit02.html": [
+    [
+     "/html/syntax/parsing/html5lib_innerHTML_webkit02.html",
+     {
+      "timeout": "long"
+     }
+    ]
+   ],
    "html/syntax/parsing/html5lib_isindex.html": [
     [
      "/html/syntax/parsing/html5lib_isindex.html?run_type=uri",
      {
       "timeout": "long"
      }
     ],
     [
@@ -93666,16 +94313,56 @@
     ],
     [
      "/html/syntax/parsing/html5lib_main-element.html?run_type=write_single",
      {
       "timeout": "long"
      }
     ]
    ],
+   "html/syntax/parsing/html5lib_menuitem-element.html": [
+    [
+     "/html/syntax/parsing/html5lib_menuitem-element.html?run_type=uri",
+     {
+      "timeout": "long"
+     }
+    ],
+    [
+     "/html/syntax/parsing/html5lib_menuitem-element.html?run_type=write",
+     {
+      "timeout": "long"
+     }
+    ],
+    [
+     "/html/syntax/parsing/html5lib_menuitem-element.html?run_type=write_single",
+     {
+      "timeout": "long"
+     }
+    ]
+   ],
+   "html/syntax/parsing/html5lib_namespace-sensitivity.html": [
+    [
+     "/html/syntax/parsing/html5lib_namespace-sensitivity.html?run_type=uri",
+     {
+      "timeout": "long"
+     }
+    ],
+    [
+     "/html/syntax/parsing/html5lib_namespace-sensitivity.html?run_type=write",
+     {
+      "timeout": "long"
+     }
+    ],
+    [
+     "/html/syntax/parsing/html5lib_namespace-sensitivity.html?run_type=write_single",
+     {
+      "timeout": "long"
+     }
+    ]
+   ],
    "html/syntax/parsing/html5lib_pending-spec-changes-plain-text-unsafe.html": [
     [
      "/html/syntax/parsing/html5lib_pending-spec-changes-plain-text-unsafe.html?run_type=uri",
      {
       "timeout": "long"
      }
     ],
     [
@@ -93726,16 +94413,36 @@
     ],
     [
      "/html/syntax/parsing/html5lib_plain-text-unsafe.html?run_type=write_single",
      {
       "timeout": "long"
      }
     ]
    ],
+   "html/syntax/parsing/html5lib_ruby.html": [
+    [
+     "/html/syntax/parsing/html5lib_ruby.html?run_type=uri",
+     {
+      "timeout": "long"
+     }
+    ],
+    [
+     "/html/syntax/parsing/html5lib_ruby.html?run_type=write",
+     {
+      "timeout": "long"
+     }
+    ],
+    [
+     "/html/syntax/parsing/html5lib_ruby.html?run_type=write_single",
+     {
+      "timeout": "long"
+     }
+    ]
+   ],
    "html/syntax/parsing/html5lib_scriptdata01.html": [
     [
      "/html/syntax/parsing/html5lib_scriptdata01.html?run_type=uri",
      {
       "timeout": "long"
      }
     ],
     [
@@ -107804,16 +108511,34 @@
     ]
    ],
    "old-tests/submission/Opera/script_scheduling/149.html": [
     [
      "/old-tests/submission/Opera/script_scheduling/149.html",
      {}
     ]
    ],
+   "orientation-event/devicemotionevent-init.html": [
+    [
+     "/orientation-event/devicemotionevent-init.html",
+     {}
+    ]
+   ],
+   "orientation-event/deviceorientationabsoluteevent.html": [
+    [
+     "/orientation-event/deviceorientationabsoluteevent.html",
+     {}
+    ]
+   ],
+   "orientation-event/deviceorientationevent-init.html": [
+    [
+     "/orientation-event/deviceorientationevent-init.html",
+     {}
+    ]
+   ],
    "orientation-event/idlharness.html": [
     [
      "/orientation-event/idlharness.html",
      {}
     ]
    ],
    "page-visibility/idlharness.html": [
     [
@@ -107858,22 +108583,64 @@
     ]
    ],
    "payment-request/allowpaymentrequest/active-document-same-origin.https.html": [
     [
      "/payment-request/allowpaymentrequest/active-document-same-origin.https.html",
      {}
     ]
    ],
+   "payment-request/allowpaymentrequest/allowpaymentrequest-attribute-cross-origin-bc-containers.https.html": [
+    [
+     "/payment-request/allowpaymentrequest/allowpaymentrequest-attribute-cross-origin-bc-containers.https.html",
+     {}
+    ]
+   ],
+   "payment-request/allowpaymentrequest/allowpaymentrequest-attribute-same-origin-bc-containers.https.html": [
+    [
+     "/payment-request/allowpaymentrequest/allowpaymentrequest-attribute-same-origin-bc-containers.https.html",
+     {}
+    ]
+   ],
    "payment-request/allowpaymentrequest/basic.https.html": [
     [
      "/payment-request/allowpaymentrequest/basic.https.html",
      {}
     ]
    ],
+   "payment-request/allowpaymentrequest/no-attribute-cross-origin-bc-containers.https.html": [
+    [
+     "/payment-request/allowpaymentrequest/no-attribute-cross-origin-bc-containers.https.html",
+     {}
+    ]
+   ],
+   "payment-request/allowpaymentrequest/no-attribute-same-origin-bc-containers.https.html": [
+    [
+     "/payment-request/allowpaymentrequest/no-attribute-same-origin-bc-containers.https.html",
+     {}
+    ]
+   ],
+   "payment-request/allowpaymentrequest/removing-allowpaymentrequest.https.sub.html": [
+    [
+     "/payment-request/allowpaymentrequest/removing-allowpaymentrequest.https.sub.html",
+     {}
+    ]
+   ],
+   "payment-request/allowpaymentrequest/setting-allowpaymentrequest-timing.https.sub.html": [
+    [
+     "/payment-request/allowpaymentrequest/setting-allowpaymentrequest-timing.https.sub.html",
+     {}
+    ]
+   ],
+   "payment-request/allowpaymentrequest/setting-allowpaymentrequest.https.sub.html": [
+    [
+     "/payment-request/allowpaymentrequest/setting-allowpaymentrequest.https.sub.html",
+     {}
+    ]
+   ],
    "payment-request/interfaces.https.html": [
     [
      "/payment-request/interfaces.https.html",
      {}
     ]
    ],
    "payment-request/payment-request-in-iframe.html": [
     [
@@ -107990,16 +108757,22 @@
     ]
    ],
    "preload/dynamic_adding_preload.html": [
     [
      "/preload/dynamic_adding_preload.html",
      {}
     ]
    ],
+   "preload/fetch_destination.https.html": [
+    [
+     "/preload/fetch_destination.https.html",
+     {}
+    ]
+   ],
    "preload/link_header_preload.html": [
     [
      "/preload/link_header_preload.html",
      {}
     ]
    ],
    "preload/link_header_preload_delay_onload.html": [
     [
@@ -108050,16 +108823,28 @@
     ]
    ],
    "presentation-api/controlling-ua/PresentationRequest_error.html": [
     [
      "/presentation-api/controlling-ua/PresentationRequest_error.html",
      {}
     ]
    ],
+   "presentation-api/controlling-ua/PresentationRequest_mixedcontent.https.html": [
+    [
+     "/presentation-api/controlling-ua/PresentationRequest_mixedcontent.https.html",
+     {}
+    ]
+   ],
+   "presentation-api/controlling-ua/PresentationRequest_mixedcontent_multiple.https.html": [
+    [
+     "/presentation-api/controlling-ua/PresentationRequest_mixedcontent_multiple.https.html",
+     {}
+    ]
+   ],
    "presentation-api/controlling-ua/PresentationRequest_success.html": [
     [
      "/presentation-api/controlling-ua/PresentationRequest_success.html",
      {}
     ]
    ],
    "presentation-api/controlling-ua/getAvailability.html": [
     [
@@ -116326,24 +117111,160 @@
     ]
    ],
    "selection/Document-open.html": [
     [
      "/selection/Document-open.html",
      {}
     ]
    ],
+   "selection/addRange-00.html": [
+    [
+     "/selection/addRange-00.html",
+     {
+      "timeout": "long"
+     }
+    ]
+   ],
+   "selection/addRange-04.html": [
+    [
+     "/selection/addRange-04.html",
+     {
+      "timeout": "long"
+     }
+    ]
+   ],
+   "selection/addRange-08.html": [
+    [
+     "/selection/addRange-08.html",
+     {
+      "timeout": "long"
+     }
+    ]
+   ],
+   "selection/addRange-12.html": [
+    [
+     "/selection/addRange-12.html",
+     {
+      "timeout": "long"
+     }
+    ]
+   ],
+   "selection/addRange-16.html": [
+    [
+     "/selection/addRange-16.html",
+     {
+      "timeout": "long"
+     }
+    ]
+   ],
+   "selection/addRange-20.html": [
+    [
+     "/selection/addRange-20.html",
+     {
+      "timeout": "long"
+     }
+    ]
+   ],
+   "selection/addRange-24.html": [
+    [
+     "/selection/addRange-24.html",
+     {
+      "timeout": "long"
+     }
+    ]
+   ],
+   "selection/addRange-28.html": [
+    [
+     "/selection/addRange-28.html",
+     {
+      "timeout": "long"
+     }
+    ]
+   ],
+   "selection/addRange-32.html": [
+    [
+     "/selection/addRange-32.html",
+     {
+      "timeout": "long"
+     }
+    ]
+   ],
+   "selection/addRange-36.html": [
+    [
+     "/selection/addRange-36.html",
+     {
+      "timeout": "long"
+     }
+    ]
+   ],
+   "selection/addRange-40.html": [
+    [
+     "/selection/addRange-40.html",
+     {
+      "timeout": "long"
+     }
+    ]
+   ],
+   "selection/addRange-44.html": [
+    [
+     "/selection/addRange-44.html",
+     {
+      "timeout": "long"
+     }
+    ]
+   ],
+   "selection/addRange-48.html": [
+    [
+     "/selection/addRange-48.html",
+     {
+      "timeout": "long"
+     }
+    ]
+   ],
+   "selection/addRange-52.html": [
+    [
+     "/selection/addRange-52.html",
+     {
+      "timeout": "long"
+     }
+    ]
+   ],
+   "selection/addRange-56.html": [
+    [
+     "/selection/addRange-56.html",
+     {
+      "timeout": "long"
+     }
+    ]
+   ],
    "selection/addRange.html": [
     [
      "/selection/addRange.html",
      {
       "timeout": "long"
      }
     ]
    ],
+   "selection/collapse-00.html": [
+    [
+     "/selection/collapse-00.html",
+     {
+      "timeout": "long"
+     }
+    ]
+   ],
+   "selection/collapse-30.html": [
+    [
+     "/selection/collapse-30.html",
+     {
+      "timeout": "long"
+     }
+    ]
+   ],
    "selection/collapse.html": [
     [
      "/selection/collapse.html",
      {
       "timeout": "long"
      }
     ]
    ],
@@ -116354,16 +117275,40 @@
     ]
    ],
    "selection/deleteFromDocument.html": [
     [
      "/selection/deleteFromDocument.html",
      {}
     ]
    ],
+   "selection/extend-00.html": [
+    [
+     "/selection/extend-00.html",
+     {
+      "timeout": "long"
+     }
+    ]
+   ],
+   "selection/extend-20.html": [
+    [
+     "/selection/extend-20.html",
+     {
+      "timeout": "long"
+     }
+    ]
+   ],
+   "selection/extend-40.html": [
+    [
+     "/selection/extend-40.html",
+     {
+      "timeout": "long"
+     }
+    ]
+   ],
    "selection/extend.html": [
     [
      "/selection/extend.html",
      {
       "timeout": "long"
      }
     ]
    ],
@@ -117760,94 +118705,910 @@
     ]
    ],
    "shadow-dom/untriaged/user-interaction/ranges-and-selections/test-002.html": [
     [
      "/shadow-dom/untriaged/user-interaction/ranges-and-selections/test-002.html",
      {}
     ]
    ],
+   "streams/byte-length-queuing-strategy.dedicatedworker.html": [
+    [
+     "/streams/byte-length-queuing-strategy.dedicatedworker.html",
+     {}
+    ]
+   ],
+   "streams/byte-length-queuing-strategy.html": [
+    [
+     "/streams/byte-length-queuing-strategy.html",
+     {}
+    ]
+   ],
    "streams/byte-length-queuing-strategy.https.html": [
     [
      "/streams/byte-length-queuing-strategy.https.html",
      {}
     ]
    ],
+   "streams/byte-length-queuing-strategy.serviceworker.https.html": [
+    [
+     "/streams/byte-length-queuing-strategy.serviceworker.https.html",
+     {}
+    ]
+   ],
+   "streams/byte-length-queuing-strategy.sharedworker.html": [
+    [
+     "/streams/byte-length-queuing-strategy.sharedworker.html",
+     {}
+    ]
+   ],
+   "streams/count-queuing-strategy.dedicatedworker.html": [
+    [
+     "/streams/count-queuing-strategy.dedicatedworker.html",
+     {}
+    ]
+   ],
+   "streams/count-queuing-strategy.html": [
+    [
+     "/streams/count-queuing-strategy.html",
+     {}
+    ]
+   ],
    "streams/count-queuing-strategy.https.html": [
     [
      "/streams/count-queuing-strategy.https.html",
      {}
     ]
    ],
+   "streams/count-queuing-strategy.serviceworker.https.html": [
+    [
+     "/streams/count-queuing-strategy.serviceworker.https.html",
+     {}
+    ]
+   ],
+   "streams/count-queuing-strategy.sharedworker.html": [
+    [
+     "/streams/count-queuing-strategy.sharedworker.html",
+     {}
+    ]
+   ],
+   "streams/piping/close-propagation-backward.dedicatedworker.html": [
+    [
+     "/streams/piping/close-propagation-backward.dedicatedworker.html",
+     {}
+    ]
+   ],
+   "streams/piping/close-propagation-backward.html": [
+    [
+     "/streams/piping/close-propagation-backward.html",
+     {}
+    ]
+   ],
+   "streams/piping/close-propagation-backward.serviceworker.https.html": [
+    [
+     "/streams/piping/close-propagation-backward.serviceworker.https.html",
+     {}
+    ]
+   ],
+   "streams/piping/close-propagation-backward.sharedworker.html": [
+    [
+     "/streams/piping/close-propagation-backward.sharedworker.html",
+     {}
+    ]
+   ],
+   "streams/piping/close-propagation-forward.dedicatedworker.html": [
+    [
+     "/streams/piping/close-propagation-forward.dedicatedworker.html",
+     {}
+    ]
+   ],
+   "streams/piping/close-propagation-forward.html": [
+    [
+     "/streams/piping/close-propagation-forward.html",
+     {}
+    ]
+   ],
+   "streams/piping/close-propagation-forward.serviceworker.https.html": [
+    [
+     "/streams/piping/close-propagation-forward.serviceworker.https.html",
+     {}
+    ]
+   ],
+   "streams/piping/close-propagation-forward.sharedworker.html": [
+    [
+     "/streams/piping/close-propagation-forward.sharedworker.html",
+     {}
+    ]
+   ],
+   "streams/piping/error-propagation-backward.dedicatedworker.html": [
+    [
+     "/streams/piping/error-propagation-backward.dedicatedworker.html",
+     {}
+    ]
+   ],
+   "streams/piping/error-propagation-backward.html": [
+    [
+     "/streams/piping/error-propagation-backward.html",
+     {}
+    ]
+   ],
+   "streams/piping/error-propagation-backward.serviceworker.https.html": [
+    [
+     "/streams/piping/error-propagation-backward.serviceworker.https.html",
+     {}
+    ]
+   ],
+   "streams/piping/error-propagation-backward.sharedworker.html": [
+    [
+     "/streams/piping/error-propagation-backward.sharedworker.html",
+     {}
+    ]
+   ],
+   "streams/piping/error-propagation-forward.dedicatedworker.html": [
+    [
+     "/streams/piping/error-propagation-forward.dedicatedworker.html",
+     {}
+    ]
+   ],
+   "streams/piping/error-propagation-forward.html": [
+    [
+     "/streams/piping/error-propagation-forward.html",
+     {}
+    ]
+   ],
+   "streams/piping/error-propagation-forward.serviceworker.https.html": [
+    [
+     "/streams/piping/error-propagation-forward.serviceworker.https.html",
+     {}
+    ]
+   ],
+   "streams/piping/error-propagation-forward.sharedworker.html": [
+    [
+     "/streams/piping/error-propagation-forward.sharedworker.html",
+     {}
+    ]
+   ],
+   "streams/piping/flow-control.dedicatedworker.html": [
+    [
+     "/streams/piping/flow-control.dedicatedworker.html",
+     {}
+    ]
+   ],
+   "streams/piping/flow-control.html": [
+    [
+     "/streams/piping/flow-control.html",
+     {}
+    ]
+   ],
+   "streams/piping/flow-control.serviceworker.https.html": [
+    [
+     "/streams/piping/flow-control.serviceworker.https.html",
+     {}
+    ]
+   ],
+   "streams/piping/flow-control.sharedworker.html": [
+    [
+     "/streams/piping/flow-control.sharedworker.html",
+     {}
+    ]
+   ],
+   "streams/piping/general.dedicatedworker.html": [
+    [
+     "/streams/piping/general.dedicatedworker.html",
+     {}
+    ]
+   ],
+   "streams/piping/general.html": [
+    [
+     "/streams/piping/general.html",
+     {}
+    ]
+   ],
+   "streams/piping/general.serviceworker.https.html": [
+    [
+     "/streams/piping/general.serviceworker.https.html",
+     {}
+    ]
+   ],
+   "streams/piping/general.sharedworker.html": [
+    [
+     "/streams/piping/general.sharedworker.html",
+     {}
+    ]
+   ],
+   "streams/piping/multiple-propagation.dedicatedworker.html": [
+    [
+     "/streams/piping/multiple-propagation.dedicatedworker.html",
+     {}
+    ]
+   ],
+   "streams/piping/multiple-propagation.html": [
+    [
+     "/streams/piping/multiple-propagation.html",
+     {}
+    ]
+   ],
+   "streams/piping/multiple-propagation.serviceworker.https.html": [
+    [
+     "/streams/piping/multiple-propagation.serviceworker.https.html",
+     {}
+    ]
+   ],
+   "streams/piping/multiple-propagation.sharedworker.html": [
+    [
+     "/streams/piping/multiple-propagation.sharedworker.html",
+     {}
+    ]
+   ],
+   "streams/piping/pipe-through.dedicatedworker.html": [
+    [
+     "/streams/piping/pipe-through.dedicatedworker.html",
+     {}
+    ]
+   ],
+   "streams/piping/pipe-through.html": [
+    [
+     "/streams/piping/pipe-through.html",
+     {}
+    ]
+   ],
+   "streams/piping/pipe-through.serviceworker.https.html": [
+    [
+     "/streams/piping/pipe-through.serviceworker.https.html",
+     {}
+    ]
+   ],
+   "streams/piping/pipe-through.sharedworker.html": [
+    [
+     "/streams/piping/pipe-through.sharedworker.html",
+     {}
+    ]
+   ],
+   "streams/piping/transform-streams.dedicatedworker.html": [
+    [
+     "/streams/piping/transform-streams.dedicatedworker.html",
+     {}
+    ]
+   ],
+   "streams/piping/transform-streams.html": [
+    [
+     "/streams/piping/transform-streams.html",
+     {}
+    ]
+   ],
+   "streams/piping/transform-streams.serviceworker.https.html": [
+    [
+     "/streams/piping/transform-streams.serviceworker.https.html",
+     {}
+    ]
+   ],
+   "streams/piping/transform-streams.sharedworker.html": [
+    [
+     "/streams/piping/transform-streams.sharedworker.html",
+     {}
+    ]
+   ],
+   "streams/readable-byte-streams/general.dedicatedworker.html": [
+    [
+     "/streams/readable-byte-streams/general.dedicatedworker.html",
+     {}
+    ]
+   ],
+   "streams/readable-byte-streams/general.html": [
+    [
+     "/streams/readable-byte-streams/general.html",
+     {}
+    ]
+   ],
+   "streams/readable-byte-streams/general.serviceworker.https.html": [
+    [
+     "/streams/readable-byte-streams/general.serviceworker.https.html",
+     {}
+    ]
+   ],
+   "streams/readable-byte-streams/general.sharedworker.html": [
+    [
+     "/streams/readable-byte-streams/general.sharedworker.html",
+     {}
+    ]
+   ],
+   "streams/readable-streams/bad-strategies.dedicatedworker.html": [
+    [
+     "/streams/readable-streams/bad-strategies.dedicatedworker.html",
+     {}
+    ]
+   ],
+   "streams/readable-streams/bad-strategies.html": [
+    [
+     "/streams/readable-streams/bad-strategies.html",
+     {}
+    ]
+   ],
    "streams/readable-streams/bad-strategies.https.html": [
     [
      "/streams/readable-streams/bad-strategies.https.html",
      {}
     ]
    ],
+   "streams/readable-streams/bad-strategies.serviceworker.https.html": [
+    [
+     "/streams/readable-streams/bad-strategies.serviceworker.https.html",
+     {}
+    ]
+   ],
+   "streams/readable-streams/bad-strategies.sharedworker.html": [
+    [
+     "/streams/readable-streams/bad-strategies.sharedworker.html",
+     {}
+    ]
+   ],
+   "streams/readable-streams/bad-underlying-sources.dedicatedworker.html": [
+    [
+     "/streams/readable-streams/bad-underlying-sources.dedicatedworker.html",
+     {}
+    ]
+   ],
+   "streams/readable-streams/bad-underlying-sources.html": [
+    [
+     "/streams/readable-streams/bad-underlying-sources.html",
+     {}
+    ]
+   ],
    "streams/readable-streams/bad-underlying-sources.https.html": [
     [
      "/streams/readable-streams/bad-underlying-sources.https.html",
      {}
     ]
    ],
+   "streams/readable-streams/bad-underlying-sources.serviceworker.https.html": [
+    [
+     "/streams/readable-streams/bad-underlying-sources.serviceworker.https.html",
+     {}
+    ]
+   ],
+   "streams/readable-streams/bad-underlying-sources.sharedworker.html": [
+    [
+     "/streams/readable-streams/bad-underlying-sources.sharedworker.html",
+     {}
+    ]
+   ],
+   "streams/readable-streams/brand-checks.dedicatedworker.html": [
+    [
+     "/streams/readable-streams/brand-checks.dedicatedworker.html",
+     {}
+    ]
+   ],
+   "streams/readable-streams/brand-checks.html": [
+    [
+     "/streams/readable-streams/brand-checks.html",
+     {}
+    ]
+   ],
    "streams/readable-streams/brand-checks.https.html": [
     [
      "/streams/readable-streams/brand-checks.https.html",
      {}
     ]
    ],
+   "streams/readable-streams/brand-checks.serviceworker.https.html": [
+    [
+     "/streams/readable-streams/brand-checks.serviceworker.https.html",
+     {}
+    ]
+   ],
+   "streams/readable-streams/brand-checks.sharedworker.html": [
+    [
+     "/streams/readable-streams/brand-checks.sharedworker.html",
+     {}
+    ]
+   ],
+   "streams/readable-streams/cancel.dedicatedworker.html": [
+    [
+     "/streams/readable-streams/cancel.dedicatedworker.html",
+     {}
+    ]
+   ],
+   "streams/readable-streams/cancel.html": [
+    [
+     "/streams/readable-streams/cancel.html",
+     {}
+    ]
+   ],
    "streams/readable-streams/cancel.https.html": [
     [
      "/streams/readable-streams/cancel.https.html",
      {}
     ]
    ],
+   "streams/readable-streams/cancel.serviceworker.https.html": [
+    [
+     "/streams/readable-streams/cancel.serviceworker.https.html",
+     {}
+    ]
+   ],
+   "streams/readable-streams/cancel.sharedworker.html": [
+    [
+     "/streams/readable-streams/cancel.sharedworker.html",
+     {}
+    ]
+   ],
+   "streams/readable-streams/count-queuing-strategy-integration.dedicatedworker.html": [
+    [
+     "/streams/readable-streams/count-queuing-strategy-integration.dedicatedworker.html",
+     {}
+    ]
+   ],
+   "streams/readable-streams/count-queuing-strategy-integration.html": [
+    [
+     "/streams/readable-streams/count-queuing-strategy-integration.html",
+     {}
+    ]
+   ],
    "streams/readable-streams/count-queuing-strategy-integration.https.html": [
     [
      "/streams/readable-streams/count-queuing-strategy-integration.https.html",
      {}
     ]
    ],
+   "streams/readable-streams/count-queuing-strategy-integration.serviceworker.https.html": [
+    [
+     "/streams/readable-streams/count-queuing-strategy-integration.serviceworker.https.html",
+     {}
+    ]
+   ],
+   "streams/readable-streams/count-queuing-strategy-integration.sharedworker.html": [
+    [
+     "/streams/readable-streams/count-queuing-strategy-integration.sharedworker.html",
+     {}
+    ]
+   ],
+   "streams/readable-streams/garbage-collection.dedicatedworker.html": [
+    [
+     "/streams/readable-streams/garbage-collection.dedicatedworker.html",
+     {}
+    ]
+   ],
+   "streams/readable-streams/garbage-collection.html": [
+    [
+     "/streams/readable-streams/garbage-collection.html",
+     {}
+    ]
+   ],
    "streams/readable-streams/garbage-collection.https.html": [
     [
      "/streams/readable-streams/garbage-collection.https.html",
      {}
     ]
    ],
+   "streams/readable-streams/garbage-collection.serviceworker.https.html": [
+    [
+     "/streams/readable-streams/garbage-collection.serviceworker.https.html",
+     {}
+    ]
+   ],
+   "streams/readable-streams/garbage-collection.sharedworker.html": [
+    [
+     "/streams/readable-streams/garbage-collection.sharedworker.html",
+     {}
+    ]
+   ],
+   "streams/readable-streams/general.dedicatedworker.html": [
+    [
+     "/streams/readable-streams/general.dedicatedworker.html",
+     {}
+    ]
+   ],
+   "streams/readable-streams/general.html": [
+    [
+     "/streams/readable-streams/general.html",
+     {}
+    ]
+   ],
    "streams/readable-streams/general.https.html": [
     [
      "/streams/readable-streams/general.https.html",
      {}
     ]
    ],
+   "streams/readable-streams/general.serviceworker.https.html": [
+    [
+     "/streams/readable-streams/general.serviceworker.https.html",
+     {}
+    ]
+   ],
+   "streams/readable-streams/general.sharedworker.html": [
+    [
+     "/streams/readable-streams/general.sharedworker.html",
+     {}
+    ]
+   ],
+   "streams/readable-streams/pipe-through.dedicatedworker.html": [
+    [
+     "/streams/readable-streams/pipe-through.dedicatedworker.html",
+     {}
+    ]
+   ],
+   "streams/readable-streams/pipe-through.html": [
+    [
+     "/streams/readable-streams/pipe-through.html",
+     {}
+    ]
+   ],
    "streams/readable-streams/pipe-through.https.html": [
     [
      "/streams/readable-streams/pipe-through.https.html",
      {}
     ]
    ],
+   "streams/readable-streams/pipe-through.serviceworker.https.html": [
+    [
+     "/streams/readable-streams/pipe-through.serviceworker.https.html",
+     {}
+    ]
+   ],
+   "streams/readable-streams/pipe-through.sharedworker.html": [
+    [
+     "/streams/readable-streams/pipe-through.sharedworker.html",
+     {}
+    ]
+   ],
+   "streams/readable-streams/readable-stream-reader.dedicatedworker.html": [
+    [
+     "/streams/readable-streams/readable-stream-reader.dedicatedworker.html",
+     {}
+    ]
+   ],
+   "streams/readable-streams/readable-stream-reader.html": [
+    [
+     "/streams/readable-streams/readable-stream-reader.html",
+     {}
+    ]
+   ],
    "streams/readable-streams/readable-stream-reader.https.html": [
     [
      "/streams/readable-streams/readable-stream-reader.https.html",
      {}
     ]
    ],
+   "streams/readable-streams/readable-stream-reader.serviceworker.https.html": [
+    [
+     "/streams/readable-streams/readable-stream-reader.serviceworker.https.html",
+     {}
+    ]
+   ],
+   "streams/readable-streams/readable-stream-reader.sharedworker.html": [
+    [
+     "/streams/readable-streams/readable-stream-reader.sharedworker.html",
+     {}
+    ]
+   ],
+   "streams/readable-streams/tee.dedicatedworker.html": [
+    [
+     "/streams/readable-streams/tee.dedicatedworker.html",
+     {}
+    ]
+   ],
+   "streams/readable-streams/tee.html": [
+    [
+     "/streams/readable-streams/tee.html",
+     {}
+    ]
+   ],
    "streams/readable-streams/tee.https.html": [
     [
      "/streams/readable-streams/tee.https.html",
      {}
     ]
    ],
+   "streams/readable-streams/tee.serviceworker.https.html": [
+    [
+     "/streams/readable-streams/tee.serviceworker.https.html",
+     {}
+    ]
+   ],
+   "streams/readable-streams/tee.sharedworker.html": [
+    [
+     "/streams/readable-streams/tee.sharedworker.html",
+     {}
+    ]
+   ],
+   "streams/readable-streams/templated.dedicatedworker.html": [
+    [
+     "/streams/readable-streams/templated.dedicatedworker.html",
+     {}
+    ]
+   ],
+   "streams/readable-streams/templated.html": [
+    [
+     "/streams/readable-streams/templated.html",
+     {}
+    ]
+   ],
    "streams/readable-streams/templated.https.html": [
     [
      "/streams/readable-streams/templated.https.html",
      {}
     ]
    ],
+   "streams/readable-streams/templated.serviceworker.https.html": [
+    [
+     "/streams/readable-streams/templated.serviceworker.https.html",
+     {}
+    ]
+   ],
+   "streams/readable-streams/templated.sharedworker.html": [
+    [
+     "/streams/readable-streams/templated.sharedworker.html",
+     {}
+    ]
+   ],
+   "streams/writable-streams/aborting.dedicatedworker.html": [
+    [
+     "/streams/writable-streams/aborting.dedicatedworker.html",
+     {}
+    ]
+   ],
+   "streams/writable-streams/aborting.html": [
+    [
+     "/streams/writable-streams/aborting.html",
+     {}
+    ]
+   ],
+   "streams/writable-streams/aborting.serviceworker.https.html": [
+    [
+     "/streams/writable-streams/aborting.serviceworker.https.html",
+     {}
+    ]
+   ],
+   "streams/writable-streams/aborting.sharedworker.html": [
+    [
+     "/streams/writable-streams/aborting.sharedworker.html",
+     {}
+    ]
+   ],
+   "streams/writable-streams/bad-strategies.dedicatedworker.html": [
+    [
+     "/streams/writable-streams/bad-strategies.dedicatedworker.html",
+     {}
+    ]
+   ],
+   "streams/writable-streams/bad-strategies.html": [
+    [
+     "/streams/writable-streams/bad-strategies.html",
+     {}
+    ]
+   ],
+   "streams/writable-streams/bad-strategies.serviceworker.https.html": [
+    [
+     "/streams/writable-streams/bad-strategies.serviceworker.https.html",
+     {}
+    ]
+   ],
+   "streams/writable-streams/bad-strategies.sharedworker.html": [
+    [
+     "/streams/writable-streams/bad-strategies.sharedworker.html",
+     {}
+    ]
+   ],
+   "streams/writable-streams/bad-underlying-sinks.dedicatedworker.html": [
+    [
+     "/streams/writable-streams/bad-underlying-sinks.dedicatedworker.html",
+     {}
+    ]
+   ],
+   "streams/writable-streams/bad-underlying-sinks.html": [
+    [
+     "/streams/writable-streams/bad-underlying-sinks.html",
+     {}
+    ]
+   ],
+   "streams/writable-streams/bad-underlying-sinks.serviceworker.https.html": [
+    [
+     "/streams/writable-streams/bad-underlying-sinks.serviceworker.https.html",
+     {}
+    ]
+   ],
+   "streams/writable-streams/bad-underlying-sinks.sharedworker.html": [
+    [
+     "/streams/writable-streams/bad-underlying-sinks.sharedworker.html",
+     {}
+    ]
+   ],
+   "streams/writable-streams/brand-checks.dedicatedworker.html": [
+    [
+     "/streams/writable-streams/brand-checks.dedicatedworker.html",
+     {}
+    ]
+   ],
+   "streams/writable-streams/brand-checks.html": [
+    [
+     "/streams/writable-streams/brand-checks.html",
+     {}
+    ]
+   ],
+   "streams/writable-streams/brand-checks.serviceworker.https.html": [
+    [
+     "/streams/writable-streams/brand-checks.serviceworker.https.html",
+     {}
+    ]
+   ],
+   "streams/writable-streams/brand-checks.sharedworker.html": [
+    [
+     "/streams/writable-streams/brand-checks.sharedworker.html",
+     {}
+    ]
+   ],
+   "streams/writable-streams/byte-length-queuing-strategy.dedicatedworker.html": [
+    [
+     "/streams/writable-streams/byte-length-queuing-strategy.dedicatedworker.html",
+     {}
+    ]
+   ],
+   "streams/writable-streams/byte-length-queuing-strategy.html": [
+    [
+     "/streams/writable-streams/byte-length-queuing-strategy.html",
+     {}
+    ]
+   ],
+   "streams/writable-streams/byte-length-queuing-strategy.serviceworker.https.html": [
+    [
+     "/streams/writable-streams/byte-length-queuing-strategy.serviceworker.https.html",
+     {}
+    ]
+   ],
+   "streams/writable-streams/byte-length-queuing-strategy.sharedworker.html": [
+    [
+     "/streams/writable-streams/byte-length-queuing-strategy.sharedworker.html",
+     {}
+    ]
+   ],
+   "streams/writable-streams/close.dedicatedworker.html": [
+    [
+     "/streams/writable-streams/close.dedicatedworker.html",
+     {}
+    ]
+   ],
+   "streams/writable-streams/close.html": [
+    [
+     "/streams/writable-streams/close.html",
+     {}
+    ]
+   ],
+   "streams/writable-streams/close.serviceworker.https.html": [
+    [
+     "/streams/writable-streams/close.serviceworker.https.html",
+     {}
+    ]
+   ],
+   "streams/writable-streams/close.sharedworker.html": [
+    [
+     "/streams/writable-streams/close.sharedworker.html",
+     {}
+    ]
+   ],
+   "streams/writable-streams/constructor.dedicatedworker.html": [
+    [
+     "/streams/writable-streams/constructor.dedicatedworker.html",
+     {}
+    ]
+   ],
+   "streams/writable-streams/constructor.html": [
+    [
+     "/streams/writable-streams/constructor.html",
+     {}
+    ]
+   ],
+   "streams/writable-streams/constructor.serviceworker.https.html": [
+    [
+     "/streams/writable-streams/constructor.serviceworker.https.html",
+     {}
+    ]
+   ],
+   "streams/writable-streams/constructor.sharedworker.html": [
+    [
+     "/streams/writable-streams/constructor.sharedworker.html",
+     {}
+    ]
+   ],
+   "streams/writable-streams/count-queuing-strategy.dedicatedworker.html": [
+    [
+     "/streams/writable-streams/count-queuing-strategy.dedicatedworker.html",
+     {}
+    ]
+   ],
+   "streams/writable-streams/count-queuing-strategy.html": [
+    [
+     "/streams/writable-streams/count-queuing-strategy.html",
+     {}
+    ]
+   ],
+   "streams/writable-streams/count-queuing-strategy.serviceworker.https.html": [
+    [
+     "/streams/writable-streams/count-queuing-strategy.serviceworker.https.html",
+     {}
+    ]
+   ],
+   "streams/writable-streams/count-queuing-strategy.sharedworker.html": [
+    [
+     "/streams/writable-streams/count-queuing-strategy.sharedworker.html",
+     {}
+    ]
+   ],
+   "streams/writable-streams/general.dedicatedworker.html": [
+    [
+     "/streams/writable-streams/general.dedicatedworker.html",
+     {}
+    ]
+   ],
+   "streams/writable-streams/general.html": [
+    [
+     "/streams/writable-streams/general.html",
+     {}
+    ]
+   ],
+   "streams/writable-streams/general.serviceworker.https.html": [
+    [
+     "/streams/writable-streams/general.serviceworker.https.html",
+     {}
+    ]
+   ],
+   "streams/writable-streams/general.sharedworker.html": [
+    [
+     "/streams/writable-streams/general.sharedworker.html",
+     {}
+    ]
+   ],
+   "streams/writable-streams/start.dedicatedworker.html": [
+    [
+     "/streams/writable-streams/start.dedicatedworker.html",
+     {}
+    ]
+   ],
+   "streams/writable-streams/start.html": [
+    [
+     "/streams/writable-streams/start.html",
+     {}
+    ]
+   ],
+   "streams/writable-streams/start.serviceworker.https.html": [
+    [
+     "/streams/writable-streams/start.serviceworker.https.html",
+     {}
+    ]
+   ],
+   "streams/writable-streams/start.sharedworker.html": [
+    [
+     "/streams/writable-streams/start.sharedworker.html",
+     {}
+    ]
+   ],
+   "streams/writable-streams/write.dedicatedworker.html": [
+    [
+     "/streams/writable-streams/write.dedicatedworker.html",
+     {}
+    ]
+   ],
+   "streams/writable-streams/write.html": [
+    [
+     "/streams/writable-streams/write.html",
+     {}
+    ]
+   ],
+   "streams/writable-streams/write.serviceworker.https.html": [
+    [
+     "/streams/writable-streams/write.serviceworker.https.html",
+     {}
+    ]
+   ],
+   "streams/writable-streams/write.sharedworker.html": [
+    [
+     "/streams/writable-streams/write.sharedworker.html",
+     {}
+    ]
+   ],
    "subresource-integrity/subresource-integrity.sub.html": [
     [
      "/subresource-integrity/subresource-integrity.sub.html",
      {}
     ]
    ],
    "svg/historical.html": [
     [
@@ -118090,16 +119851,22 @@
     ]
    ],
    "url/url-setters.html": [
     [
      "/url/url-setters.html",
      {}
     ]
    ],
+   "url/urlencoded-parser.html": [
+    [
+     "/url/urlencoded-parser.html",
+     {}
+    ]
+   ],
    "url/urlsearchparams-append.html": [
     [
      "/url/urlsearchparams-append.html",
      {}
     ]
    ],
    "url/urlsearchparams-constructor.html": [
     [
@@ -118138,16 +119905,22 @@
     ]
    ],
    "url/urlsearchparams-set.html": [
     [
      "/url/urlsearchparams-set.html",
      {}
     ]
    ],
+   "url/urlsearchparams-sort.html": [
+    [
+     "/url/urlsearchparams-sort.html",
+     {}
+    ]
+   ],
    "url/urlsearchparams-stringifier.html": [
     [
      "/url/urlsearchparams-stringifier.html",
      {}
     ]
    ],
    "user-timing/idlharness.html": [
     [
@@ -125484,16 +127257,22 @@
     ]
    ],
    "webstorage/storage_supported_property_names.html": [
     [
      "/webstorage/storage_supported_property_names.html",
      {}
     ]
    ],
+   "webvr/idlharness.html": [
+    [
+     "/webvr/idlharness.html",
+     {}
+    ]
+   ],
    "webvtt/interfaces.html": [
     [
      "/webvtt/interfaces.html",
      {}
     ]
    ],
    "webvtt/webvtt-api-for-browsers/vttcue-interface/align.html": [
     [
@@ -126649,16 +128428,20 @@
   "./README.md": [
    "930f9755157d0a3da03b6a6f67c3ba12c05b22c4",
    "support"
   ],
   "./check_stability.py": [
    "123a9ec2d29e8ed4acc18a04e07c1514ca490e91",
    "support"
   ],
+  "./ci_built_diff.sh": [
+   "1488986c7b100ff2b65b0abb3555806084f0a2bb",
+   "support"
+  ],
   "./ci_lint.sh": [
    "ba3b37d8d18ea579f99157bec6c8d865d68f4a3b",
    "support"
   ],
   "./ci_stability.sh": [
    "e54dcedb8311ca70296a7ff034aa8ac7ab7df8d2",
    "support"
   ],
@@ -126693,16 +128476,20 @@
   "./server-side.md": [
    "c51b17fbac2a2e3121dc74f7badbd2873ce92f61",
    "support"
   ],
   "./test_keys_wdspec.html": [
    "4f7487e013de733271eba9f783de863155552c29",
    "support"
   ],
+  "./update-built-tests.sh": [
+   "75ea35a5ce9d8e3e32e8d0c336dc12e04691d16a",
+   "support"
+  ],
   "2dcontext/2x2.png": [
    "c67d3f646e86413722833d2308a9bfc793a916bf",
    "support"
   ],
   "2dcontext/best-practices/.gitkeep": [
    "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "support"
   ],
@@ -130761,16 +132548,20 @@
   "2dcontext/the-canvas-state/canvas_state_restore_001.htm": [
    "8d427c1edbd200cdc77a28945eba7a6a766b2104",
    "reftest"
   ],
   "2dcontext/tools/LICENSE.txt": [
    "f0866a8c60bf7016987deeb329da99d619eee4f1",
    "support"
   ],
+  "2dcontext/tools/build.sh": [
+   "e4f65db6a439972ed7a83f4cc2c9bae792ec2d27",
+   "support"
+  ],
   "2dcontext/tools/current-work-canvas.xhtml": [
    "891246c4dfe34f9b43b5e642b058072c4d664817",
    "support"
   ],
   "2dcontext/tools/gentest.py": [
    "49951605ab640deeb16f2b0aebf2396237fc727e",
    "support"
   ],
@@ -131149,48 +132940,72 @@
   "IndexedDB/close-in-upgradeneeded.html": [
    "949f5e8a429a7524c9a68ef0d19baf04dadbd84a",
    "testharness"
   ],
   "IndexedDB/cursor-overloads.htm": [
    "c12f2d91554335699409b338fa266bae845ab7d8",
    "testharness"
   ],
+  "IndexedDB/error-attributes.html": [
+   "3e69684b6dc5e23508ced8c7a033a389f6e135b6",
+   "testharness"
+  ],
   "IndexedDB/historical.html": [
    "0c4584e1b021a286445a2a9d3388ff011a1b933e",
    "testharness"
   ],
   "IndexedDB/idb_binary_key_conversion.htm": [
    "7af8d37d63bbef60a973082f7b9fde99d5dcfca6",
    "testharness"
   ],
   "IndexedDB/idb_webworkers.htm": [
    "e57fd8321a437f3b6082c5d75025ad63bd007450",
    "testharness"
   ],
   "IndexedDB/idbcursor-advance-continue-async.htm": [
    "6dbb08d166c7c8c2cd5c918b83bb1b15fad50dce",
    "testharness"
   ],
+  "IndexedDB/idbcursor-advance-exception-order.html": [
+   "365472cd405c8fae1383540675f0b078c0bd4df9",
+   "testharness"
+  ],
   "IndexedDB/idbcursor-advance-invalid.htm": [
    "ddb2a1394f4846396f965e60a618f2bde1f57cf9",
    "testharness"
   ],
   "IndexedDB/idbcursor-advance.htm": [
    "7becf54b03320a3b905c4ebfa476476f22409307",
    "testharness"
   ],
+  "IndexedDB/idbcursor-continue-exception-order.htm": [
+   "5c6bd64850880ceb20639325cf3d61127e2b13c8",
+   "testharness"
+  ],
   "IndexedDB/idbcursor-continue.htm": [
    "953ae4b03fcfe2be3652df09577df2e3829dd53a",
    "testharness"
   ],
   "IndexedDB/idbcursor-continuePrimaryKey-exception-order.htm": [
    "85dba064e12f6ee4c7f7a9ab288a8ecb11063298",
    "testharness"
   ],
+  "IndexedDB/idbcursor-continuePrimaryKey-exceptions.htm": [
+   "7c2ddb95ce4b7c588ddb2907367a365902eba349",
+   "testharness"
+  ],
+  "IndexedDB/idbcursor-continuePrimaryKey.htm": [
+   "e1c89f1ce01d8ec027337aef844dad4c2990b6c2",
+   "testharness"
+  ],
+  "IndexedDB/idbcursor-delete-exception-order.htm": [
+   "6bb279530dbdedba84a2d45d58e5d0a81a4d95e5",
+   "testharness"
+  ],
   "IndexedDB/idbcursor-direction-index-keyrange.htm": [
    "d87cc37174c74e57880f8883e75a9c033c021e74",
    "testharness"
   ],
   "IndexedDB/idbcursor-direction-index.htm": [
    "91dde42de3c1511b0cb5f45d9702368c814879bb",
    "testharness"
   ],
@@ -131217,16 +133032,20 @@
   "IndexedDB/idbcursor-reused.htm": [
    "2462c58f442407b1168751cc447076dc39e3c1ee",
    "testharness"
   ],
   "IndexedDB/idbcursor-source.htm": [
    "0677de106509b9b3f4d1e38780f479d9aaace626",
    "testharness"
   ],
+  "IndexedDB/idbcursor-update-exception-order.htm": [
+   "748c1764883cc62e58c1ce7929e91e6ee2941fda",
+   "testharness"
+  ],
   "IndexedDB/idbcursor_advance_index.htm": [
    "b6cb5fd53000be9c8d198b08d259a1062a8f9946",
    "testharness"
   ],
   "IndexedDB/idbcursor_advance_index2.htm": [
    "70eab2c196ef117fe4dd36f9f10c2757ce08a79d",
    "testharness"
   ],
@@ -131457,16 +133276,28 @@
   "IndexedDB/idbcursor_update_objectstore8.htm": [
    "ae07743372cc70a0b4aa6d9f71c996234fe0c838",
    "testharness"
   ],
   "IndexedDB/idbcursor_update_objectstore9.htm": [
    "7534a0868a5861cfd9f2fef0f3eddf452c0d9366",
    "testharness"
   ],
+  "IndexedDB/idbdatabase-createObjectStore-exception-order.htm": [
+   "24d86e0a278a52c759f1a220041838bedd59959e",
+   "testharness"
+  ],
+  "IndexedDB/idbdatabase-deleteObjectStore-exception-order.htm": [
+   "0e0ae655c2767b3755490104a28ae26e0d4cd500",
+   "testharness"
+  ],
+  "IndexedDB/idbdatabase-transaction-exception-order.html": [
+   "8033f0b03f01eb4363291dbc4ef16ae4b66c5bc5",
+   "testharness"
+  ],
   "IndexedDB/idbdatabase_close.htm": [
    "6b0a32c465f735544b89da588bb043bbfbb66230",
    "testharness"
   ],
   "IndexedDB/idbdatabase_close2.htm": [
    "20bf8d35b4fd79579b66a02afff8f301d3c3b78d",
    "testharness"
   ],
@@ -131633,28 +133464,40 @@
   "IndexedDB/idbfactory_open8.htm": [
    "84bfc226434194d505d30112d5eea75b2a938ce8",
    "testharness"
   ],
   "IndexedDB/idbfactory_open9.htm": [
    "25ff4fea8efa519a4aef0a2f157b55dacc63f9c4",
    "testharness"
   ],
+  "IndexedDB/idbindex-getAll-enforcerange.html": [
+   "b6e8d22ea40aec5a96a8fe748129016fcbe31b54",
+   "testharness"
+  ],
+  "IndexedDB/idbindex-getAllKeys-enforcerange.html": [
+   "b65396d5a29c5480e17ec3de9cf9710ab2d4160d",
+   "testharness"
+  ],
   "IndexedDB/idbindex-multientry-arraykeypath.htm": [
    "963cfc67685270be71b03ad978268c540a99b526",
    "testharness"
   ],
   "IndexedDB/idbindex-multientry-big.htm": [
    "d61e4daaad94721a559c9c39f63284c8916ec00f",
    "testharness"
   ],
   "IndexedDB/idbindex-multientry.htm": [
    "7d6028c0810f8cab7572c448a04c3e246bf1ec5a",
    "testharness"
   ],
+  "IndexedDB/idbindex-query-exception-order.html": [
+   "08dee6a9b0edf24801c3841c720a57f7f3de510e",
+   "testharness"
+  ],
   "IndexedDB/idbindex-rename-abort.html": [
    "b737557faba60b13b5dcd3e874d301645e5a4fa1",
    "testharness"
   ],
   "IndexedDB/idbindex-rename-errors.html": [
    "6bd67155d5f1ea95c54b8fba1ce91e2ef6c36ce0",
    "testharness"
   ],
@@ -131789,16 +133632,44 @@
   "IndexedDB/idbkeyrange.htm": [
    "fa0e70c7033ae97b7484f19183f1bfff569e951e",
    "testharness"
   ],
   "IndexedDB/idbkeyrange_incorrect.htm": [
    "ecdfe47233f46edb270f7e57fe2ddf2c56377254",
    "testharness"
   ],
+  "IndexedDB/idbobjectstore-add-put-exception-order.html": [
+   "1a55a0194ff0a48c3689a8095fd2eb25c4cdc7a0",
+   "testharness"
+  ],
+  "IndexedDB/idbobjectstore-clear-exception-order.html": [
+   "246b46c340d37a3232289a53bb8ca32048d2b3ba",
+   "testharness"
+  ],
+  "IndexedDB/idbobjectstore-delete-exception-order.html": [
+   "170b46b8a0792002e3d3491cb95e4c768bccd758",
+   "testharness"
+  ],
+  "IndexedDB/idbobjectstore-deleteIndex-exception-order.html": [
+   "2fbff038323ca4ec3d85bcece55dd59441a3e5fb",
+   "testharness"
+  ],
+  "IndexedDB/idbobjectstore-getAll-enforcerange.html": [
+   "64de20d7ada146b69df90377faef6e4837b5a5e9",
+   "testharness"
+  ],
+  "IndexedDB/idbobjectstore-getAllKeys-enforcerange.html": [
+   "6c2fe5ac83765f679fd2572d4ad0d7d30466480d",
+   "testharness"
+  ],
+  "IndexedDB/idbobjectstore-query-exception-order.html": [
+   "91e12b5c824638c4f46892364ca3572bf5f28cea",
+   "testharness"
+  ],
   "IndexedDB/idbobjectstore-rename-abort.html": [
    "4e250473bf7a32a7046a60759d8028d43c1003a5",
    "testharness"
   ],
   "IndexedDB/idbobjectstore-rename-errors.html": [
    "e4ef62dd83d336dee9d3296434bea0f4d7aead28",
    "testharness"
   ],
@@ -132113,16 +133984,20 @@
   "IndexedDB/idbrequest_error.html": [
    "8867b70eb4471fc35de29d9acfedd362a83a0646",
    "testharness"
   ],
   "IndexedDB/idbrequest_result.html": [
    "3b6d79f577fa4869e801bbc493225beb5f70dbec",
    "testharness"
   ],
+  "IndexedDB/idbtransaction-objectStore-exception-order.html": [
+   "9c3e4f3e4ec46d222a611a812ef1d670741a9b6b",
+   "testharness"
+  ],
   "IndexedDB/idbtransaction-oncomplete.htm": [
    "c1204c119431395ef705ea01dfd67724db21955a",
    "testharness"
   ],
   "IndexedDB/idbtransaction.htm": [
    "2d058dd87d864ad538d975e7c10e235fca82f74c",
    "testharness"
   ],
@@ -132201,16 +134076,20 @@
   "IndexedDB/name-scopes.html": [
    "c65da9b47474814b6ce73b1c56999fcd857328cf",
    "testharness"
   ],
   "IndexedDB/objectstore_keyorder.htm": [
    "dda6c0ad4832b2a48980efdcb0efdae995c43fdd",
    "testharness"
   ],
+  "IndexedDB/open-request-queue.html": [
+   "cc9a2dbc7a7e8fcbbf2cb42d3049b561997eb353",
+   "testharness"
+  ],
   "IndexedDB/request_bubble-and-capture.htm": [
    "9c486babd57c2d14bb251d5bba202b3dbd6c802d",
    "testharness"
   ],
   "IndexedDB/string-list-ordering.htm": [
    "20306634fccb6192cdfb6cf62cc97d94c64a5faa",
    "testharness"
   ],
@@ -132257,16 +134136,28 @@
   "IndexedDB/transaction-requestqueue.htm": [
    "38209ae2d92fff9c1b8de04031573d2e08c27838",
    "testharness"
   ],
   "IndexedDB/transaction_bubble-and-capture.htm": [
    "4a75702a58021e337f884590508c1a0b84063edc",
    "testharness"
   ],
+  "IndexedDB/upgrade-transaction-lifecycle-backend-aborted.html": [
+   "c816400517298785753b39639b3cec925d57029e",
+   "testharness"
+  ],
+  "IndexedDB/upgrade-transaction-lifecycle-committed.html": [
+   "6ccbc2eaf0d8db8bbc787bb68dc7a843b6fa0af2",
+   "testharness"
+  ],
+  "IndexedDB/upgrade-transaction-lifecycle-user-aborted.html": [
+   "7a05b801be5b6ca7c651195abda0788c130a540f",
+   "testharness"
+  ],
   "IndexedDB/value.htm": [
    "bf8b42aba531bfbe5d4898c7e93eb5b00274d4b0",
    "testharness"
   ],
   "IndexedDB/value_recursive.htm": [
    "e4943f76bf23a3913d5698e5ab6f9dffb20a4543",
    "testharness"
   ],
@@ -133409,16 +135300,20 @@
   "XMLHttpRequest/getresponseheader-unsent-opened-state.htm": [
    "9a27f71e6e5738d2625ed30f91f3d514fc3646e8",
    "testharness"
   ],
   "XMLHttpRequest/headers-normalize-response.htm": [
    "eb7c4df4a878181161f356cfaed84e37ccd6f772",
    "testharness"
   ],
+  "XMLHttpRequest/historical.html": [
+   "1cb82348a9d6f3be34da762267cce7389f715f7c",
+   "testharness"
+  ],
   "XMLHttpRequest/interfaces.html": [
    "b65e817345a4410c2062242bef57031d4ff448b7",
    "testharness"
   ],
   "XMLHttpRequest/open-after-abort.htm": [
    "082fa646606cf8f278d61960f02fafa264e57e9f",
    "testharness"
   ],
@@ -136485,16 +138380,20 @@
   "clear-site-data/support/echo-clear-site-data.py": [
    "d8768caed378b9a3eadeb7a566bcd099f6c2e9de",
    "support"
   ],
   "clear-site-data/support/test_utils.js": [
    "6980ed5592440f13bccbd83afdf6c6aa0b55e2f2",
    "support"
   ],
+  "clipboard/OWNERS": [
+   "7c5c92bcb47be9151914d709e2b792a122f07a6e",
+   "support"
+  ],
   "common/OWNERS": [
    "2b7563c023ca23579b7d9a2077b3bdb5ed135bcb",
    "support"
   ],
   "common/blank.html": [
    "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "support"
   ],
@@ -149573,16 +151472,20 @@
   "conformance-checkers/html/elements/keygen/id-missing-novalid.html": [
    "33e407f76527803f555ff9612b0ef1c1cfb07056",
    "support"
   ],
   "conformance-checkers/html/elements/keygen/id-redundant-novalid.html": [
    "836ed57dcc0cd46d259cb13277def5306b3dc6c6",
    "support"
   ],
+  "conformance-checkers/html/elements/keygen/keygen-novalid.html": [
+   "7c324a7ce70eaed8be72895a2006091c9135d90e",
+   "support"
+  ],
   "conformance-checkers/html/elements/keygen/keytype-bad-value-novalid.html": [
    "cf3f47979b1a7c7b3249e1aa302bd3431aaddb39",
    "support"
   ],
   "conformance-checkers/html/elements/keygen/keytype-empty-novalid.html": [
    "3f3c6b98b94db943f1e7cf49f3d0a7f0af2591ee",
    "support"
   ],
@@ -151953,16 +153856,32 @@
   "conformance-checkers/html/elements/sup/model-isvalid.html": [
    "b7304586f75acdef172a8dfc5b67e98c863ec850",
    "support"
   ],
   "conformance-checkers/html/elements/sup/model-novalid.html": [
    "707d79437785ffa31add0dc64fde682b7d237ed3",
    "support"
   ],
+  "conformance-checkers/html/elements/table/integrity/Alexis_of_Russia-novalid.html": [
+   "228934f0b2f5939823906efbcde5923a029f0686",
+   "support"
+  ],
+  "conformance-checkers/html/elements/table/integrity/Feodor_I_of_Russia-novalid.html": [
+   "2af68a7a3e4f73c857c64866e0168c5bee0b6f4b",
+   "support"
+  ],
+  "conformance-checkers/html/elements/table/integrity/Naser_al-Din_Shah_Qajar-novalid.html": [
+   "c7ae7b98e19de43cc818c1be0fe9ae063e15122b",
+   "support"
+  ],
+  "conformance-checkers/html/elements/table/integrity/vertical-novalid.html": [
+   "4e60edd0a31884179c733d55e0f3aa596a6889ec",
+   "support"
+  ],
   "conformance-checkers/html/elements/table/model-input-child-hidden-novalid.html": [
    "8fd2351093b6cc523cce03088112077e6d64d010",
    "support"
   ],
   "conformance-checkers/html/elements/table/model-input-child-novalid.html": [
    "2d997427d0bdde26bf89c42c2b0889cbdf25e807",
    "support"
   ],
@@ -154033,16 +155952,20 @@
   "conformance-checkers/xhtml/elements/keygen/360-novalid.xhtml": [
    "44f028c8ecfc3e9ac519d29ff96418d0d8d0233f",
    "support"
   ],
   "conformance-checkers/xhtml/elements/keygen/361-novalid.xhtml": [
    "5f3a9d8e23e561a84a0ae0d23a29f2296a19d18a",
    "support"
   ],
+  "conformance-checkers/xhtml/elements/keygen/keygen-novalid.xhtml": [
+   "a00a1dc2709dc5ff7b0b18e181d0f5aafec093c3",
+   "support"
+  ],
   "conformance-checkers/xhtml/elements/link/001-novalid.xhtml": [
    "931480c095d2f49fefb03a16b3be1dbffd045d23",
    "support"
   ],
   "conformance-checkers/xhtml/elements/map/048-isvalid.xhtml": [
    "96a000f47ad48f7a51f463de18fb4bbb4f139a4c",
    "support"
   ],
@@ -158429,24 +160352,32 @@
   "dpub-aam/OWNERS": [
    "16577d2283b826f0541dbc795177c7aac7e1b228",
    "support"
   ],
   "dpub-aam/README.md": [
    "4b90a271f1ae6bfe28684797085ed59b2471b0f3",
    "support"
   ],
+  "dpub-aria/.editorconfig": [
+   "18e9e31b4beb20bcfa5ad281584d816204a3f531",
+   "support"
+  ],
   "dpub-aria/OWNERS": [
    "16577d2283b826f0541dbc795177c7aac7e1b228",
    "support"
   ],
   "dpub-aria/README.md": [
    "010c781603b0ebae64b8b3be7015f45e3c5fa002",
    "support"
   ],
+  "dpub-aria/inuse-manual.html": [
+   "2342ccf97a30c1ac671ce34d354f85673449b69d",
+   "manual"
+  ],
   "editing/OWNERS": [
    "abd95839027a88741c4d351ff374d81b773c80fa",
    "support"
   ],
   "editing/README": [
    "faf2706da35ec626faa833c0498ef1e356584d27",
    "support"
   ],
@@ -160433,16 +162364,24 @@
   "fetch/api/credentials/cookies.html": [
    "65aa7d1fe4f04eecdeecf1adff55e84153dcc9b9",
    "testharness"
   ],
   "fetch/api/credentials/cookies.js": [
    "a80f3b2ca8e1a47bec13b006df9731ae7cd7324a",
    "support"
   ],
+  "fetch/api/headers/header-values-normalize.html": [
+   "889c328c2677763c352ec9aa0264218e01a523d4",
+   "testharness"
+  ],
+  "fetch/api/headers/header-values.html": [
+   "c360fd3d220fc13b35e5858dd9c7ddb49256ae72",
+   "testharness"
+  ],
   "fetch/api/headers/headers-basic.html": [
    "9bdcfe06301e94db7e3fea83b9474336e1a166c2",
    "testharness"
   ],
   "fetch/api/headers/headers-casing.html": [
    "c83fdd0119c17b30051ab437e66934dc22c8c420",
    "testharness"
   ],
@@ -162913,16 +164852,32 @@
   "html/browsers/history/the-location-interface/cross_origin_joined_frame.sub.html": [
    "f1cf4fdba6a54a4aed7fb5d72ea7e1fec511e857",
    "support"
   ],
   "html/browsers/history/the-location-interface/document_location.html": [
    "ce4fbca059263f6731e2e7bd99c1df7293c07291",
    "testharness"
   ],
+  "html/browsers/history/the-location-interface/location-pathname-setter-question-mark.html": [
+   "011522f6b56184f49dd6555b507d6d895b53f11e",
+   "testharness"
+  ],
+  "html/browsers/history/the-location-interface/location-protocol-setter-non-broken-weird.html": [
+   "13a360b3010a85c1661d9357355894453137c9df",
+   "testharness"
+  ],
+  "html/browsers/history/the-location-interface/location-protocol-setter-non-broken.html": [
+   "bc622cdff29f6d8369d7bd07036bb220ea5774de",
+   "testharness"
+  ],
+  "html/browsers/history/the-location-interface/location-protocol-setter.html": [
+   "70f3c81ddfe58e8751543513fbd8ea44a6b122a1",
+   "testharness"
+  ],
   "html/browsers/history/the-location-interface/location-prototype-setting.html": [
    "47a284185d6abb33d601a3b066a72bf480b515e7",
    "testharness"
   ],
   "html/browsers/history/the-location-interface/location-stringifier.html": [
    "d7cea275e734051c77e820488ae04742dc073c26",
    "testharness"
   ],
@@ -169509,16 +171464,32 @@
   "html/infrastructure/common-dom-interfaces/collections/.gitkeep": [
    "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "support"
   ],
   "html/infrastructure/common-dom-interfaces/collections/contains.json": [
    "de0ed7f283f4e17155cd3fc07dd5cb688d6fd8be",
    "support"
   ],
+  "html/infrastructure/common-dom-interfaces/collections/domstringlist-interface.html": [
+   "ca8af91733f0b0704409e26f17d4a14977ce14f7",
+   "testharness"
+  ],
+  "html/infrastructure/common-dom-interfaces/collections/domstringlist-interface.worker.js": [
+   "2e35f55a86d31d98e69ad1013c18ab1ff9d9be02",
+   "testharness"
+  ],
+  "html/infrastructure/common-dom-interfaces/collections/domstringlist.html": [
+   "b51c104271ba1cc404de0d68fd004b4e4ecb0d8c",
+   "testharness"
+  ],
+  "html/infrastructure/common-dom-interfaces/collections/domstringlist.idl": [
+   "3b23d2861e3e3037ef3364781394d1b3e8371bae",
+   "support"
+  ],
   "html/infrastructure/common-dom-interfaces/collections/historical.html": [
    "bbfb3cfbf6a9f5cf7f48eb048f0f6a2047386e41",
    "testharness"
   ],
   "html/infrastructure/common-dom-interfaces/collections/htmlallcollection.html": [
    "eeb932d95184b11190af6a2e8be2adccc5a84601",
    "testharness"
   ],
@@ -170381,16 +172352,24 @@
   "html/rendering/non-replaced-elements/tables/table-layout-ref.html": [
    "d5fdae37ca0ac9def696205d613983c2d7e2e5ae",
    "support"
   ],
   "html/rendering/non-replaced-elements/tables/table-layout.html": [
    "ec05c435cfd09291184360db7e8b0c5af9c7ba31",
    "reftest"
   ],
+  "html/rendering/non-replaced-elements/tables/table-vspace-hspace-s.html": [
+   "a93cbe26a0c5b9a7aeda1faf9db618f79aae8715",
+   "testharness"
+  ],
+  "html/rendering/non-replaced-elements/tables/table-vspace-hspace.html": [
+   "76be2c71dea58327c4d4b1ba424993ff73c5f847",
+   "testharness"
+  ],
   "html/rendering/non-replaced-elements/tables/table-width-150percent-ref.html": [
    "a25b7aad09676bed5d05714aeae6b5a6b4dbb4b5",
    "support"
   ],
   "html/rendering/non-replaced-elements/tables/table-width-150percent.html": [
    "bc78dfc6c24812c9910a5289f64d18a80d5b9c05",
    "reftest"
   ],
@@ -170981,16 +172960,24 @@
   "html/semantics/embedded-content/image-maps/.gitkeep": [
    "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "support"
   ],
   "html/semantics/embedded-content/image-maps/contains.json": [
    "84a50fbc155fe2844d837ce365a45e7d4bf646f2",
    "support"
   ],
+  "html/semantics/embedded-content/image-maps/image-map-processing-model/hash-name-reference-test-data.html": [
+   "28ef3ec0d689c3a10deee2f9c500ea6a10dfecf1",
+   "support"
+  ],
+  "html/semantics/embedded-content/image-maps/image-map-processing-model/hash-name-reference.html": [
+   "81e9d89988e89b3ee4c6913a346a8ac3f2a78ab3",
+   "testharness"
+  ],
   "html/semantics/embedded-content/mathml/.gitkeep": [
    "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "support"
   ],
   "html/semantics/embedded-content/media-elements/.gitkeep": [
    "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "support"
   ],
@@ -173033,16 +175020,44 @@
   "html/semantics/forms/constraints/tooLong-input-url-delete-manual.html": [
    "3297f3d35787a64612dd0cae9e56c07661c9e025",
    "manual"
   ],
   "html/semantics/forms/constraints/tooLong-textarea-delete-manual.html": [
    "a6fca2caa57752871000e1a3fe3cf174d67ed42b",
    "manual"
   ],
+  "html/semantics/forms/constraints/tooShort-input-email-add-manual.html": [
+   "ca3a437ee83407ce291cd5054651c923c4908aba",
+   "manual"
+  ],
+  "html/semantics/forms/constraints/tooShort-input-password-add-manual.html": [
+   "7837631fa6659c685bd5886359dceff95111df12",
+   "manual"
+  ],
+  "html/semantics/forms/constraints/tooShort-input-search-add-manual.html": [
+   "3cea0d02e317b1c06c3c18e047428ca1ff098251",
+   "manual"
+  ],
+  "html/semantics/forms/constraints/tooShort-input-tel-add-manual.html": [
+   "2e02c31d31358a9d94c2e127defb28bcf3dcaf84",
+   "manual"
+  ],
+  "html/semantics/forms/constraints/tooShort-input-text-add-manual.html": [
+   "a99e5fafe04cc35741efd88bc4a62abb0ff15ecc",
+   "manual"
+  ],
+  "html/semantics/forms/constraints/tooShort-input-url-add-manual.html": [
+   "c5982c35ea31dad5f6276020d3a4f2c30c3d21eb",
+   "manual"
+  ],
+  "html/semantics/forms/constraints/tooShort-textarea-add-manual.html": [
+   "bd04127c8077b016bf5496216b9d7c39133ffe37",
+   "manual"
+  ],
   "html/semantics/forms/form-control-infrastructure/.gitkeep": [
    "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "support"
   ],
   "html/semantics/forms/form-control-infrastructure/contains.json": [
    "465d87952b71ff3ac6c3fe7b13c880028c53b3de",
    "support"
   ],
@@ -173085,16 +175100,24 @@
   "html/semantics/forms/resetting-a-form/.gitkeep": [
    "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "support"
   ],
   "html/semantics/forms/resetting-a-form/reset-event.html": [
    "2b9329c270fb73a2ab60f5e9549afdfa91a13522",
    "testharness"
   ],
+  "html/semantics/forms/resetting-a-form/reset-form-event-realm-support.html": [
+   "2530f8b46c8ec015b165deec1c99e0a495325073",
+   "support"
+  ],
+  "html/semantics/forms/resetting-a-form/reset-form-event-realm.html": [
+   "4c3d5d366e123fcf8f2ddcfc2211f0e45902fbe5",
+   "testharness"
+  ],
   "html/semantics/forms/resetting-a-form/reset-form.html": [
    "8f3bf4f89c3605f5cbeb65242caf4ffb10ece9d6",
    "testharness"
   ],
   "html/semantics/forms/textfieldselection/.gitkeep": [
    "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "support"
   ],
@@ -173925,16 +175948,20 @@
   "html/semantics/interactive-elements/the-menu-element/contains.json": [
    "a79ad27e8f1e2eee47c89fa4530f7babfbb07dd5",
    "support"
   ],
   "html/semantics/interactive-elements/the-summary-element/.gitkeep": [
    "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "support"
   ],
+  "html/semantics/interactive-elements/the-summary-element/activation-behavior.html": [
+   "2bc98d888e9b0d41c1b6a142abf0a1df8e712d70",
+   "testharness"
+  ],
   "html/semantics/interfaces.html": [
    "05ed04de581fe998148c8651c34b4ad38a8b231f",
    "testharness"
   ],
   "html/semantics/interfaces.js": [
    "d50a20fbc3305953f9a5f48c299ff019371ac290",
    "support"
   ],
@@ -174121,20 +176148,56 @@
   "html/semantics/scripting-1/the-script-element/load-event.html": [
    "e702aa5d09183d147850f61503d2e18f78a0a660",
    "testharness"
   ],
   "html/semantics/scripting-1/the-script-element/log.py": [
    "12842b6e600ac2fc737718d8a9ba3385ed8b678b",
    "support"
   ],
+  "html/semantics/scripting-1/the-script-element/nomodule-reflect.html": [
+   "ac2b3c16e9e9263cd4c14de205b63709c14ec2e3",
+   "testharness"
+  ],
+  "html/semantics/scripting-1/the-script-element/nomodule-set-on-async-classic-script.html": [
+   "5b4a532b21caa6235bed10a28878c65523a816aa",
+   "testharness"
+  ],
+  "html/semantics/scripting-1/the-script-element/nomodule-set-on-external-module-script.html": [
+   "f43755d9dffe2983a377f2c00b855f106776b617",
+   "testharness"
+  ],
+  "html/semantics/scripting-1/the-script-element/nomodule-set-on-inline-classic-scripts.html": [
+   "2b6654342c5a2e2d85df2bc8ec805b5fa7ed1550",
+   "testharness"
+  ],
+  "html/semantics/scripting-1/the-script-element/nomodule-set-on-inline-module-script.html": [
+   "071d6550f88d5f04de77fd28a314dbc7121b758f",
+   "testharness"
+  ],
+  "html/semantics/scripting-1/the-script-element/nomodule-set-on-synchronously-loaded-classic-scripts.html": [
+   "a5600b1fcb40e3dbdf223fbeee40c0a3f096eed1",
+   "testharness"
+  ],
+  "html/semantics/scripting-1/the-script-element/resources/cocoa-module.js": [
+   "43291b3e6eff8267c88100990aae5d4b2a09f3bd",
+   "support"
+  ],
   "html/semantics/scripting-1/the-script-element/resources/cross-origin.py": [
    "33c88a19aa061be518067c54019190ec979d4c82",
    "support"
   ],
+  "html/semantics/scripting-1/the-script-element/resources/exports-cocoa.js": [
+   "5797045ac8591d2662a6714367ae5fb257881793",
+   "support"
+  ],
+  "html/semantics/scripting-1/the-script-element/resources/set-script-executed.js": [
+   "87f80eee703965c88f2bf7015bfa76233d459d06",
+   "support"
+  ],
   "html/semantics/scripting-1/the-script-element/script-charset-01.html": [
    "4d8f27447b5c76174a2e353f160066fbe156a005",
    "testharness"
   ],
   "html/semantics/scripting-1/the-script-element/script-charset-02.html": [
    "fd855537451d81818fda97de8a6eff2f8ebd7a5e",
    "testharness"
   ],
@@ -175281,52 +177344,80 @@
   "html/syntax/parsing/html5lib_html5test-com.html": [
    "915eb4c14ae7249e6d8619bc3a7e717be829e333",
    "testharness"
   ],
   "html/syntax/parsing/html5lib_inbody01.html": [
    "1e8001486b51c6c37c6d9ae5ccb2540f8ff7676f",
    "testharness"
   ],
+  "html/syntax/parsing/html5lib_innerHTML_adoption01.html": [
+   "988287d4d91febf0cfd26ef6d924b7897ee4b466",
+   "testharness"
+  ],
+  "html/syntax/parsing/html5lib_innerHTML_foreign-fragment.html": [
+   "56a56f17ebaf055fe4bc4406cbffe93752788f5a",
+   "testharness"
+  ],
+  "html/syntax/parsing/html5lib_innerHTML_math.html": [
+   "f1f6817f5e567dfb8ffb8d26280b033a4deb9b89",
+   "testharness"
+  ],
   "html/syntax/parsing/html5lib_innerHTML_tests4.html": [
    "e728e54d4f0729bf7e9befbb534630095a1ee312",
    "testharness"
   ],
   "html/syntax/parsing/html5lib_innerHTML_tests6.html": [
    "48f9fe905e025bb591e6d36bcb0451c7a8f1b13f",
    "testharness"
   ],
   "html/syntax/parsing/html5lib_innerHTML_tests7.html": [
    "b2d45fb99544c4d9961b9db1a666a4cd85943092",
    "testharness"
   ],
   "html/syntax/parsing/html5lib_innerHTML_tests_innerHTML_1.html": [
    "8d3285ea7c424a5d566fbcd91c778ee819f0298d",
    "testharness"
   ],
+  "html/syntax/parsing/html5lib_innerHTML_webkit02.html": [
+   "b40d5aae2dbb2b14a3bb5a2a2a59d8c85ad1757b",
+   "testharness"
+  ],
   "html/syntax/parsing/html5lib_isindex.html": [
    "9e301a8ad8df0ada5325ed900e1c35288cac06cc",
    "testharness"
   ],
   "html/syntax/parsing/html5lib_main-element.html": [
    "96d926e59cee796cdafea1d715260373eb9bbee8",
    "testharness"
   ],
+  "html/syntax/parsing/html5lib_menuitem-element.html": [
+   "57cdb7dd7f3f7876b045661b8187beb14de67ea9",
+   "testharness"
+  ],
+  "html/syntax/parsing/html5lib_namespace-sensitivity.html": [
+   "527963e681efad54c64cddfceac31448079d1517",
+   "testharness"
+  ],
   "html/syntax/parsing/html5lib_pending-spec-changes-plain-text-unsafe.html": [
    "4f2f17147e3cf3adc5ca6dc686e0da44cab78e36",
    "testharness"
   ],
   "html/syntax/parsing/html5lib_pending-spec-changes.html": [
    "30f58d42e55a1b4466268a22723b7e1ddc659d4b",
    "testharness"
   ],
   "html/syntax/parsing/html5lib_plain-text-unsafe.html": [
    "cbbfcf2714c84d1c3ea64ba84c7875717554d5a6",
    "testharness"
   ],
+  "html/syntax/parsing/html5lib_ruby.html": [
+   "104d95cd1bbed6cb3615df6295bc6e265c6e1e6a",
+   "testharness"
+  ],
   "html/syntax/parsing/html5lib_scriptdata01.html": [
    "b0d9fb1083f59363a31a1c712d83ba8c4e2d2918",
    "testharness"
   ],
   "html/syntax/parsing/html5lib_scripted_adoption01.html": [
    "3509f6decd3f81b4bd45c39f3f9d5b6d02124e91",
    "testharness"
   ],
@@ -175633,16 +177724,20 @@
   "html/the-xhtml-syntax/serializing-xhtml-fragments/.gitkeep": [
    "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "support"
   ],
   "html/the-xhtml-syntax/writing-xhtml-documents/.gitkeep": [
    "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "support"
   ],
+  "html/tools/build.sh": [
+   "a1c84e96bdd1719cc57f72343eff80783e7eca73",
+   "support"
+  ],
   "html/tools/html5lib_test.xml": [
    "f352daa7435850cd4cd48b84afc3c03f40882cb5",
    "support"
   ],
   "html/tools/html5lib_test_fragment.xml": [
    "99484d23f37fe2e9bd7fa57efffd4d22373aaeaa",
    "support"
   ],
@@ -175710,17 +177805,17 @@
    "6375309c43a1e7c9fafdc95f01fcccb4c92f8afc",
    "testharness"
   ],
   "html/webappapis/idle-callbacks/callback-timeout-with-raf.html": [
    "febb81c38f530c81d9e9837df2c6d603225ecfd1",
    "testharness"
   ],
   "html/webappapis/idle-callbacks/callback-timeout.html": [
-   "65cd8599001086b880e8ad412074f874008a3523",
+   "ba76964575cdf9b433f26c8a5d7a8183ab5c16e9",
    "testharness"
   ],
   "html/webappapis/idle-callbacks/cancel-invoked.html": [
    "d0128b4d4b805a58926ad895f35b341321cf56ec",
    "testharness"
   ],
   "html/webappapis/idle-callbacks/idlharness.html": [
    "520ee58982b43875f3caa08d7f46b9c6311be0b6",
@@ -179425,16 +181520,28 @@
   "notifications/requestPermission-denied-manual.html": [
    "97caf7417b9339e356745d3076a3df810c3bafa7",
    "manual"
   ],
   "notifications/requestPermission-granted-manual.html": [
    "bb5365816a7ce25679ee89853fdd1596430840be",
    "manual"
   ],
+  "notifications/resources/icon.png": [
+   "d115819d85c1836a20651e00bafd1951b2a143d9",
+   "support"
+  ],
+  "notifications/resources/shownotification-sw.js": [
+   "e9e77b2e03c6f9ff4856836143800a8baa26d451",
+   "support"
+  ],
+  "notifications/shownotification-resolve-manual.html": [
+   "e80633359e22cb1236fc78671b29899079f2f868",
+   "manual"
+  ],
   "notifications/tag-different-manual.html": [
    "17b9a1a612b9f479786ce55119e5cc4c0ce5c7a8",
    "manual"
   ],
   "notifications/tag-same-manual.html": [
    "f31d50ead567908aab1d1dad577eb06c912c97f3",
    "manual"
   ],
@@ -185105,16 +187212,20 @@
   "offscreen-canvas/the-offscreen-canvas/size.large.html": [
    "da8daf1ad91463d07da8257d20e0076b71aa3ad5",
    "testharness"
   ],
   "offscreen-canvas/the-offscreen-canvas/size.large.worker.js": [
    "bf2ff60a9730540a913b8008cb1d8d3a30e1998c",
    "testharness"
   ],
+  "offscreen-canvas/tools/build.sh": [
+   "e4f65db6a439972ed7a83f4cc2c9bae792ec2d27",
+   "support"
+  ],
   "offscreen-canvas/tools/gentest.py": [
    "a00789037db0edb16dac99f4bbfeaaebb5edfdc5",
    "support"
   ],
   "offscreen-canvas/tools/name2dir.yaml": [
    "ed640afbc6614fa9b53e6061192544b0fdc4f51e",
    "support"
   ],
@@ -187161,16 +189272,28 @@
   "old-tests/webdriver/windows/tabbing.py": [
    "71f0ac0301c017c5a1ce1f955cf4fe8c2acc7fe5",
    "support"
   ],
   "old-tests/webdriver/windows/window_manipulation.py": [
    "6ef74bad7135896f41b8df26535eca4e0e0b64c5",
    "support"
   ],
+  "orientation-event/devicemotionevent-init.html": [
+   "fab191bbebab21f696fefc0ad9e8110b99855eee",
+   "testharness"
+  ],
+  "orientation-event/deviceorientationabsoluteevent.html": [
+   "39b8076ee3dc20b085f06d52441766389155f04b",
+   "testharness"
+  ],
+  "orientation-event/deviceorientationevent-init.html": [
+   "ccd2db5f8266737e2eaf4aa8462b1a51201c42ab",
+   "testharness"
+  ],
   "orientation-event/free-fall-manual.html": [
    "e291465a89d97156f518e12e1bf65e6ab8091ce7",
    "manual"
   ],
   "orientation-event/horizontal-surface-manual.html": [
    "ef54a144013c5eb07a1c5742d8239e741a2a18dc",
    "manual"
   ],
@@ -187289,20 +189412,56 @@
   "payment-request/allowpaymentrequest/active-document-cross-origin.https.sub.html": [
    "7cb0cd48493781fe9a4f059365752fdc8d1ada6c",
    "testharness"
   ],
   "payment-request/allowpaymentrequest/active-document-same-origin.https.html": [
    "0bcf7a59e03f70b56cc448910acab4188e225c86",
    "testharness"
   ],
+  "payment-request/allowpaymentrequest/allowpaymentrequest-attribute-cross-origin-bc-containers.https.html": [
+   "844e26e36380dbc9971d21c690a293d62edaa10c",
+   "testharness"
+  ],
+  "payment-request/allowpaymentrequest/allowpaymentrequest-attribute-same-origin-bc-containers.https.html": [
+   "ea6bac2631d7564850853013d8c16a419dc12d7b",
+   "testharness"
+  ],
   "payment-request/allowpaymentrequest/basic.https.html": [
    "fa308475bf7e81d897f39c5df4d0cd2795df7da7",
    "testharness"
   ],
+  "payment-request/allowpaymentrequest/common.sub.js": [
+   "04b6b6d15a9fe240f7cb6ad3afdbd035f36d3ac2",
+   "support"
+  ],
+  "payment-request/allowpaymentrequest/echo-PaymentRequest.html": [
+   "f330e448c1ac380bcaa23bc5bc15c3253aba18c4",
+   "support"
+  ],
+  "payment-request/allowpaymentrequest/no-attribute-cross-origin-bc-containers.https.html": [
+   "fb9049dbf7d5449fc057b5372bedae83d937676a",
+   "testharness"
+  ],
+  "payment-request/allowpaymentrequest/no-attribute-same-origin-bc-containers.https.html": [
+   "2e42808a20c5ebe11720f01cdfab78dd2bf8221a",
+   "testharness"
+  ],
+  "payment-request/allowpaymentrequest/removing-allowpaymentrequest.https.sub.html": [
+   "9452392f0dc2b4feb4ee87f09952819998b9e39c",
+   "testharness"
+  ],
+  "payment-request/allowpaymentrequest/setting-allowpaymentrequest-timing.https.sub.html": [
+   "b8c0121e830a6b2c8897d98ee8cbd381802d4735",
+   "testharness"
+  ],
+  "payment-request/allowpaymentrequest/setting-allowpaymentrequest.https.sub.html": [
+   "6e4028440fff617d6a0e9abb06625891eb53b28a",
+   "testharness"
+  ],
   "payment-request/interfaces.https.html": [
    "f1cb8a39fcc4b249a90709b46e5197205e6bc276",
    "testharness"
   ],
   "payment-request/payment-request-in-iframe.html": [
    "26f2715d33e6d00e5ce03d7b07f35db2ac027acf",
    "testharness"
   ],
@@ -187353,16 +189512,20 @@
   "pointerevents/OWNERS": [
    "e76cae8532b1259fa8665b515468d0b25b0a9bb3",
    "support"
   ],
   "pointerevents/README.md": [
    "91a8bd86357b0d96ba3ab8f08f88c28436de484c",
    "support"
   ],
+  "pointerevents/compat/pointerevent_touch-action_two-finger_interaction-manual.html": [
+   "cba44e2dd2a3c54106bfecc6cdd407643e2ba995",
+   "manual"
+  ],
   "pointerevents/idlharness.html": [
    "6ca74eb661910c27ed6cb8bbbb819b749007a75f",
    "testharness"
   ],
   "pointerevents/pointerevent_attributes_hoverable_pointers-manual.html": [
    "9a71336042a931e45c7aef0e031669c26ac5c36c",
    "manual"
   ],
@@ -187701,16 +189864,20 @@
   "preload/download_resources.html": [
    "4a997cc5a9e9e9aa507c27c0e05eba4de063811d",
    "testharness"
   ],
   "preload/dynamic_adding_preload.html": [
    "aa0f8f3623826fc6daeab5fd90ba01c4b192b3dd",
    "testharness"
   ],
+  "preload/fetch_destination.https.html": [
+   "d14c2c6ba05f42797fa08b2d0fd37165cee18779",
+   "testharness"
+  ],
   "preload/link_header_preload.html": [
    "f1950e0ac49ab61690d25c0f7f6209ceddf6a57c",
    "testharness"
   ],
   "preload/link_header_preload.html.headers": [
    "d30ac6e50fb6d6b996814f9e98d88262d715c16e",
    "support"
   ],
@@ -187749,16 +189916,24 @@
   "preload/resources/dummy.js": [
    "bcd2891de63b59f9d6941009ec42f2020396617e",
    "support"
   ],
   "preload/resources/dummy.xml": [
    "2cd5f1a5408f112904afbc7a1e97d75d3ed93ce7",
    "support"
   ],
+  "preload/resources/empty.html": [
+   "da39a3ee5e6b4b0d3255bfef95601890afd80709",
+   "support"
+  ],
+  "preload/resources/fetch-destination-worker.js": [
+   "04e1fd5f1b1829ab9df389f9497681c585b42b78",
+   "support"
+  ],
   "preload/resources/square.png": [
    "fa547a180b73a5422d52c1702c9d1e43b1083f9c",
    "support"
   ],
   "preload/single_download_late_used_preload.html": [
    "8b2bbbad3e8bbd19d7647f45a12887b60d3c2448",
    "testharness"
   ],
@@ -187789,16 +189964,24 @@
   "presentation-api/controlling-ua/PresentationConnection_onterminated-manual.html": [
    "856d3f3ad3af5f9c68d5b0d325a3b289cf1c6668",
    "manual"
   ],
   "presentation-api/controlling-ua/PresentationRequest_error.html": [
    "8d8a2a77b5735cfe4dc6d0eeb3c5bdf7f13c4148",
    "testharness"
   ],
+  "presentation-api/controlling-ua/PresentationRequest_mixedcontent.https.html": [
+   "327d33780cc6954003fcb2f899611f0949117a71",
+   "testharness"
+  ],
+  "presentation-api/controlling-ua/PresentationRequest_mixedcontent_multiple.https.html": [
+   "62bdc7cf0de441659295c59b5562dc9a5795b331",
+   "testharness"
+  ],
   "presentation-api/controlling-ua/PresentationRequest_onconnectionavailable-manual.html": [
    "b27212245248b24c250c824396acadf071e60095",
    "manual"
   ],
   "presentation-api/controlling-ua/PresentationRequest_success.html": [
    "b8c26ec718a198562154e75cb32eedfd1778cb01",
    "testharness"
   ],
@@ -195601,44 +197784,136 @@
   "selection/Document-open.html": [
    "31a5ee7a3619c62dbd35eafb66725bf4192639a0",
    "testharness"
   ],
   "selection/OWNERS": [
    "abd95839027a88741c4d351ff374d81b773c80fa",
    "support"
   ],
+  "selection/addRange-00.html": [
+   "e99b95a6bdcba9f4945fb9b03de34ff54469012a",
+   "testharness"
+  ],
+  "selection/addRange-04.html": [
+   "c241e1c3a82f09c14bbf217350b2ee0b58c17178",
+   "testharness"
+  ],
+  "selection/addRange-08.html": [
+   "6d51d9f4042e5590483fae60d19351602d6b0aa2",
+   "testharness"
+  ],
+  "selection/addRange-12.html": [
+   "add2e904651f3564741742dc5e1dcb7e3debc50c",
+   "testharness"
+  ],
+  "selection/addRange-16.html": [
+   "b8357b81e8cff46960b158f2eff40950aba04158",
+   "testharness"
+  ],
+  "selection/addRange-20.html": [
+   "88fb182b058eae495b92c10a1ddc2bd7768e96cd",
+   "testharness"
+  ],
+  "selection/addRange-24.html": [
+   "d6c0ce809239b2bafda14dab540bda45e3e89752",
+   "testharness"
+  ],
+  "selection/addRange-28.html": [
+   "a2583e4f46561f8b09183186aed7ca137fab26dd",
+   "testharness"
+  ],
+  "selection/addRange-32.html": [
+   "431ec670ebbcd0d0032fc416bd0910507fa76680",
+   "testharness"
+  ],
+  "selection/addRange-36.html": [
+   "9572f7b20ee6891157025e576cf837e496a61669",
+   "testharness"
+  ],
+  "selection/addRange-40.html": [
+   "a58732345d1fdc0b833bf0b9062e44247e0a9592",
+   "testharness"
+  ],
+  "selection/addRange-44.html": [
+   "7119f750a423fcfed1ddd1b92a48ae28cdaa0f02",
+   "testharness"
+  ],
+  "selection/addRange-48.html": [
+   "c9fdeebfd75735480d07500faf217aae98ec12f1",
+   "testharness"
+  ],
+  "selection/addRange-52.html": [
+   "682150b475f15c8cef9e80a0a48e4a80a3a15a48",
+   "testharness"
+  ],
+  "selection/addRange-56.html": [
+   "adcc65d54d59715ee740b2436486058ec578b63a",
+   "testharness"
+  ],
   "selection/addRange.html": [
    "1b527f5ee8299cbfe410e90be994d33711e34cb3",
    "testharness"
   ],
+  "selection/addRange.js": [
+   "df6dcd50618466c323d4343a8a2a55b2443e4498",
+   "support"
+  ],
+  "selection/collapse-00.html": [
+   "6c06617a84c3d4e5f121e4ccf8f7761ba1be1ceb",
+   "testharness"
+  ],
+  "selection/collapse-30.html": [
+   "943e7d8960212bc5d5eadb45ff641b9d9525a44a",
+   "testharness"
+  ],
   "selection/collapse.html": [
    "64b603586d045e7fda724e0e0d453e4ae942b665",
    "testharness"
   ],
+  "selection/collapse.js": [
+   "41ae670c54b9141b065659a751f8495ded80ac1b",
+   "support"
+  ],
   "selection/collapseToStartEnd.html": [
    "630885adfd3996c7dc7da4088fc8c8449a8da452",
    "testharness"
   ],
   "selection/common.js": [
    "1519c063f8a536c6c71261a5c23f633667c467e0",
    "support"
   ],
   "selection/deleteFromDocument.html": [
    "8a20f9940fd3bb79abe7ce09829796952af1716f",
    "testharness"
   ],
   "selection/dir-manual.html": [
    "d20aba9b9ef8654b553f1adb1eb4f16e642fe649",
    "manual"
   ],
+  "selection/extend-00.html": [
+   "189e4939230b1a0540e326640f6390e64708efed",
+   "testharness"
+  ],
+  "selection/extend-20.html": [
+   "23664c8f1957d8491526ba9f53e03242f3f3042f",
+   "testharness"
+  ],
+  "selection/extend-40.html": [
+   "5e3ce84e8a060b0de0a5468faeec433b67c5aea7",
+   "testharness"
+  ],
   "selection/extend.html": [
    "19caca46a6b93d0a0fe8fb962e81f65e216d62d6",
    "testharness"
   ],
+  "selection/extend.js": [
+   "e5982a39ff7d36cd893bbe0bba19a7078a4096dd",
+   "support"
+  ],
   "selection/getRangeAt.html": [
    "9cc10269ce5c49d9c93565909b5a2c6255170178",
    "testharness"
   ],
   "selection/getSelection.html": [
    "4b5b638ae5cdaab02fbe9cca255a119134238a7d",
    "testharness"
   ],
@@ -196294,17 +198569,17 @@
    "b15855240cf7dbc5df4ee30a544d7ff94935d146",
    "support"
   ],
   "service-workers/service-worker/resources/dummy.txt": [
    "33ab5639bfd8e7b95eb1d8d0b87781d4ffea4d5d",
    "support"
   ],
   "service-workers/service-worker/resources/empty-but-slow-worker.js": [
-   "45db58024c3207922c5c03ff92636eb829ef382e",
+   "36ecac2f5ab2d3738ca72a7a7d1c605dbec97ff1",
    "support"
   ],
   "service-workers/service-worker/resources/empty-worker.js": [
    "84b3339c3419e318803e51f46d7252d9e8ac183b",
    "support"
   ],
   "service-workers/service-worker/resources/empty.js": [
    "da39a3ee5e6b4b0d3255bfef95601890afd80709",
@@ -197477,136 +199752,776 @@
   "shadow-dom/untriaged/user-interaction/ranges-and-selections/test-002.html": [
    "bc28599cea839c13daf4739168f8c1ea42526050",
    "testharness"
   ],
   "streams/OWNERS": [
    "26a3b5825f7c01a7a4b8b0c3a7fb212b98b15e93",
    "support"
   ],
+  "streams/README.md": [
+   "301e457a14a26ed154a55d2811e32d5ceb4b004c",
+   "support"
+  ],
+  "streams/byte-length-queuing-strategy.dedicatedworker.html": [
+   "bdbd5627125bd25f84f0431b1bc752ceeb5015ba",
+   "testharness"
+  ],
+  "streams/byte-length-queuing-strategy.html": [
+   "61532943318bcf1a978018ba04579dffb0f7290b",
+   "testharness"
+  ],
   "streams/byte-length-queuing-strategy.https.html": [
    "87ac40149e27ca5329c05d13eb3f6c5739f0e412",
    "testharness"
   ],
   "streams/byte-length-queuing-strategy.js": [
    "e4b248c7de8b85df9ed01d707cf2dfcfd9a5bcb0",
    "support"
   ],
+  "streams/byte-length-queuing-strategy.serviceworker.https.html": [
+   "83c7631272f9c04011e179a1d5f2c6744ab09e2d",
+   "testharness"
+  ],
+  "streams/byte-length-queuing-strategy.sharedworker.html": [
+   "3c576d902e34976313357126d3688a4639a4e5a7",
+   "testharness"
+  ],
+  "streams/count-queuing-strategy.dedicatedworker.html": [
+   "8406ee4393da4130128cd402824d344716119460",
+   "testharness"
+  ],
+  "streams/count-queuing-strategy.html": [
+   "660a512e4227f96651216629f32faf1139a31187",
+   "testharness"
+  ],
   "streams/count-queuing-strategy.https.html": [
    "a61603f3a935857c1eda65e1aac79affeb6ecdd2",
    "testharness"
   ],
   "streams/count-queuing-strategy.js": [
    "33f8db7addcc8e01d798b9199b6d78ad35d8a243",
    "support"
   ],
+  "streams/count-queuing-strategy.serviceworker.https.html": [
+   "7f59d0e37562a6adfb2972b61928375047266ac7",
+   "testharness"
+  ],
+  "streams/count-queuing-strategy.sharedworker.html": [
+   "875e0dffe7710c21bfcb8f554c2216626c2eb013",
+   "testharness"
+  ],
+  "streams/generate-test-wrappers.js": [
+   "729d86f589af914bf59f046f40e3d98b5f37efc7",
+   "support"
+  ],
+  "streams/piping/close-propagation-backward.dedicatedworker.html": [
+   "17e143af0bd875f6097c2314ea9861e4b19ff91a",
+   "testharness"
+  ],
+  "streams/piping/close-propagation-backward.html": [
+   "12e087aed62dfde8130ad241c261e6863147e3d1",
+   "testharness"
+  ],
+  "streams/piping/close-propagation-backward.js": [
+   "e51b3ceee3c58aa83bcbea276270fa40b98d16fa",
+   "support"
+  ],
+  "streams/piping/close-propagation-backward.serviceworker.https.html": [
+   "29ce859faa5a374d86c4f10e2c638061ce378a01",
+   "testharness"
+  ],
+  "streams/piping/close-propagation-backward.sharedworker.html": [
+   "7ef2ba0b429b2032e099f62cf2bc17d606ad1c64",
+   "testharness"
+  ],
+  "streams/piping/close-propagation-forward.dedicatedworker.html": [
+   "d227631adae0611f7920d33343d148f19c13f833",
+   "testharness"
+  ],
+  "streams/piping/close-propagation-forward.html": [
+   "705a73f3cb1cf7334456070a00b7525defb26840",
+   "testharness"
+  ],
+  "streams/piping/close-propagation-forward.js": [
+   "0846ba92abb8ace6c5438d918b2db23badc090b2",
+   "support"
+  ],
+  "streams/piping/close-propagation-forward.serviceworker.https.html": [
+   "759ca4e212311a001d0abae2b2f21d1dca42736b",
+   "testharness"
+  ],
+  "streams/piping/close-propagation-forward.sharedworker.html": [
+   "277a94372fc8359b631b46ea79778ce2ec0e928c",
+   "testharness"
+  ],
+  "streams/piping/error-propagation-backward.dedicatedworker.html": [
+   "2f7ad2bf616e612f8cae9c61264d1ea012be2561",
+   "testharness"
+  ],
+  "streams/piping/error-propagation-backward.html": [
+   "3fa70d5f0b864846b699ffd94b10a19a331fa65c",
+   "testharness"
+  ],
+  "streams/piping/error-propagation-backward.js": [
+   "e7f1bdd524056017264ba1f0d2f569c5a5bbece5",
+   "support"
+  ],
+  "streams/piping/error-propagation-backward.serviceworker.https.html": [
+   "3502f6514992dab5662a5088c518d3a775863770",
+   "testharness"
+  ],
+  "streams/piping/error-propagation-backward.sharedworker.html": [
+   "464dbfc87804e207057de70b2dcbb0aacf03b92e",
+   "testharness"
+  ],
+  "streams/piping/error-propagation-forward.dedicatedworker.html": [
+   "a2520ea68491b9e0987a63c9d5653a19ffff440d",
+   "testharness"
+  ],
+  "streams/piping/error-propagation-forward.html": [
+   "ed2d748eaec992b2c930a923d3288883e8d3e9dc",
+   "testharness"
+  ],
+  "streams/piping/error-propagation-forward.js": [
+   "a6c993b47a0aa820a3c763eb64ab902551bbcd91",
+   "support"
+  ],
+  "streams/piping/error-propagation-forward.serviceworker.https.html": [
+   "44db4461afd113439e349a05a08410ff58655850",
+   "testharness"
+  ],
+  "streams/piping/error-propagation-forward.sharedworker.html": [
+   "c19cba806d0c806452464b7ede268458c65556a9",
+   "testharness"
+  ],
+  "streams/piping/flow-control.dedicatedworker.html": [
+   "3936fceee569de910a7e3e4d5e3af9e7c4d1e942",
+   "testharness"
+  ],
+  "streams/piping/flow-control.html": [
+   "0b60c58f59b5a58f366bb29e05e0a36fc3ab2da7",
+   "testharness"
+  ],
+  "streams/piping/flow-control.js": [
+   "7d0c16676332ce06b1466f30f4cd89aeffb54610",
+   "support"
+  ],
+  "streams/piping/flow-control.serviceworker.https.html": [
+   "c6962c1f0358867289e1e9b36dac492059f4f9fe",
+   "testharness"
+  ],
+  "streams/piping/flow-control.sharedworker.html": [
+   "74e67f2ad62720eb3314a1cdec5b4c28ca3ea5f6",
+   "testharness"
+  ],
+  "streams/piping/general.dedicatedworker.html": [
+   "8583d80450b090c16ed0795170340d040449bbc1",
+   "testharness"
+  ],
+  "streams/piping/general.html": [
+   "d7f2a0e97922ba446f7c3cfd245706dc5a6beb65",
+   "testharness"
+  ],
+  "streams/piping/general.js": [
+   "cb4f7956b3973e318f6227122ab0df3c017414d5",
+   "support"
+  ],
+  "streams/piping/general.serviceworker.https.html": [
+   "1792d6c45a5687777291a4dab031a954aa053752",
+   "testharness"
+  ],
+  "streams/piping/general.sharedworker.html": [
+   "44f9ceaa3bfc9d8b92885997d322486bd0f237a6",
+   "testharness"
+  ],
+  "streams/piping/multiple-propagation.dedicatedworker.html": [
+   "ef3d8a0ab031c3e25c6fcd083e7361a449ed671d",
+   "testharness"
+  ],
+  "streams/piping/multiple-propagation.html": [
+   "a0c329fc93126deca9a1fa354ae536fdbe20d5a7",
+   "testharness"
+  ],
+  "streams/piping/multiple-propagation.js": [
+   "c2a5c855e9abbacfe500a9339ff586a16bb8ae7a",
+   "support"
+  ],
+  "streams/piping/multiple-propagation.serviceworker.https.html": [
+   "b1ec8a36de6b683fcfc9b3af35f7544d4806bdb6",
+   "testharness"
+  ],
+  "streams/piping/multiple-propagation.sharedworker.html": [
+   "a2aaf43f0d2eb831bd9f8e379fbf0076eee76633",
+   "testharness"
+  ],
+  "streams/piping/pipe-through.dedicatedworker.html": [
+   "ed05dd7416cc07e178e481375c2372ce1094905e",
+   "testharness"
+  ],
+  "streams/piping/pipe-through.html": [
+   "ef036e94d09d47d1dc160a38ee6be2499431bf5f",
+   "testharness"
+  ],
+  "streams/piping/pipe-through.js": [
+   "7506ed68f5b64d7339af19cacd5d1d1201e1e5f7",
+   "support"
+  ],
+  "streams/piping/pipe-through.serviceworker.https.html": [
+   "e6604dc4e7f4404ee9dea5ab237fb4636bf9e85a",
+   "testharness"
+  ],
+  "streams/piping/pipe-through.sharedworker.html": [
+   "8ecb019e754fd4239cb35c27787897efc2dacccb",
+   "testharness"
+  ],
+  "streams/piping/transform-streams.dedicatedworker.html": [
+   "bd73374617b11acfcaecbf478ad050ab8621754a",
+   "testharness"
+  ],
+  "streams/piping/transform-streams.html": [
+   "b440ca628c12437ab81141960a0ce45c348d4a54",
+   "testharness"
+  ],
+  "streams/piping/transform-streams.js": [
+   "959fba02af575535546fe94c685902dcf39f36bf",
+   "support"
+  ],
+  "streams/piping/transform-streams.serviceworker.https.html": [
+   "2aa56e69ebdceb784921a6486bffce43e43a99a9",
+   "testharness"
+  ],
+  "streams/piping/transform-streams.sharedworker.html": [
+   "005490d4fc62797e432b03c33c349d9136815625",
+   "testharness"
+  ],
+  "streams/readable-byte-streams/general.dedicatedworker.html": [
+   "8583d80450b090c16ed0795170340d040449bbc1",
+   "testharness"
+  ],
+  "streams/readable-byte-streams/general.html": [
+   "9e349695974543b322e5c1447352e0ab4dc490e6",
+   "testharness"
+  ],
+  "streams/readable-byte-streams/general.js": [
+   "6c213279d772e7087f35f8a19157f092bd77f90c",
+   "support"
+  ],
+  "streams/readable-byte-streams/general.serviceworker.https.html": [
+   "1792d6c45a5687777291a4dab031a954aa053752",
+   "testharness"
+  ],
+  "streams/readable-byte-streams/general.sharedworker.html": [
+   "44f9ceaa3bfc9d8b92885997d322486bd0f237a6",
+   "testharness"
+  ],
+  "streams/readable-streams/bad-strategies.dedicatedworker.html": [
+   "269e32606201603b326048f42573c8535c060a18",
+   "testharness"
+  ],
+  "streams/readable-streams/bad-strategies.html": [
+   "ce222675f5d45cf56f3f283cfab416472cb770b9",
+   "testharness"
+  ],
   "streams/readable-streams/bad-strategies.https.html": [
    "592e56033d6a69352d389d829c783a75c6cd2ba8",
    "testharness"
   ],
   "streams/readable-streams/bad-strategies.js": [
    "9db83c2d08b8439042472c9760691531df14281d",
    "support"
   ],
+  "streams/readable-streams/bad-strategies.serviceworker.https.html": [
+   "1cc76d2d9135082afcaba8e45de4a4cbdf0c35e0",
+   "testharness"
+  ],
+  "streams/readable-streams/bad-strategies.sharedworker.html": [
+   "a4692c839ca53134bc5036b2f813e2311db3f2d0",
+   "testharness"
+  ],
+  "streams/readable-streams/bad-underlying-sources.dedicatedworker.html": [
+   "4f1aac6cadab470ec4474741712bdd65d2670918",
+   "testharness"
+  ],
+  "streams/readable-streams/bad-underlying-sources.html": [
+   "620b444181a2d25199445b94faa4560829a4a713",
+   "testharness"
+  ],
   "streams/readable-streams/bad-underlying-sources.https.html": [
    "683898199a5e08c3b8971aff838e2137fa1a3979",
    "testharness"
   ],
   "streams/readable-streams/bad-underlying-sources.js": [
    "514eba2a237991d057014da7defc613714d5273e",
    "support"
   ],
+  "streams/readable-streams/bad-underlying-sources.serviceworker.https.html": [
+   "2e8501ec4c83340149486ea1f19d35a3c90d85e9",
+   "testharness"
+  ],
+  "streams/readable-streams/bad-underlying-sources.sharedworker.html": [
+   "e2631bf8eb2ecc8f54e45594a6f5176ceaa8ed62",
+   "testharness"
+  ],
+  "streams/readable-streams/brand-checks.dedicatedworker.html": [
+   "b0f32b03a352ef7ac1940eda90414a5f65980194",
+   "testharness"
+  ],
+  "streams/readable-streams/brand-checks.html": [
+   "317e5c5cc2eedcc6902e8cc44567ea59e7f173ac",
+   "testharness"
+  ],
   "streams/readable-streams/brand-checks.https.html": [
    "da8acc4c15e256526f1b9fb92a27dfe22e850d96",
    "testharness"
   ],
   "streams/readable-streams/brand-checks.js": [
    "b3d64fa1a34d38a56451722efdc1d66b2227503d",
    "support"
   ],
+  "streams/readable-streams/brand-checks.serviceworker.https.html": [
+   "c8279e28f5cd80d454d884154ae883a8c965705f",
+   "testharness"
+  ],
+  "streams/readable-streams/brand-checks.sharedworker.html": [
+   "6f3911baf77e26af2d7e7d7472caae4df6d5a27e",
+   "testharness"
+  ],
+  "streams/readable-streams/cancel.dedicatedworker.html": [
+   "6116c2563dd3d642a91eb7996cf60babe1796976",
+   "testharness"
+  ],
+  "streams/readable-streams/cancel.html": [
+   "7132ea4a7785ec4b0caed2cfe860c99852c391a2",
+   "testharness"
+  ],
   "streams/readable-streams/cancel.https.html": [
    "2f4d08cdb2b49349b26459aad2e396dacbe00846",
    "testharness"
   ],
   "streams/readable-streams/cancel.js": [
    "de3fc5a6a025a8ae42cb4870200af196d844e818",
    "support"
   ],
+  "streams/readable-streams/cancel.serviceworker.https.html": [
+   "815c9b14a88bb84526e3ea0b93ba8d74bb57838a",
+   "testharness"
+  ],
+  "streams/readable-streams/cancel.sharedworker.html": [
+   "52f22079742ab1a783b9a03dbf255a2f481c6d45",
+   "testharness"
+  ],
+  "streams/readable-streams/count-queuing-strategy-integration.dedicatedworker.html": [
+   "8e023ec682231d47d43549e26636758652c8f702",
+   "testharness"
+  ],
+  "streams/readable-streams/count-queuing-strategy-integration.html": [
+   "be512c75571757d8d64d110d1028abd20ce1a9ae",
+   "testharness"
+  ],
   "streams/readable-streams/count-queuing-strategy-integration.https.html": [
    "19b635d380bbfd5a7c49cd83aa85f2065ea392c4",
    "testharness"
   ],
   "streams/readable-streams/count-queuing-strategy-integration.js": [
    "3d86d9fa09d8f8615d1e6af182e9649675bc6e12",
    "support"
   ],
+  "streams/readable-streams/count-queuing-strategy-integration.serviceworker.https.html": [
+   "846fb89188f3df93de85bdbb6c5b39fddd82ed9c",
+   "testharness"
+  ],
+  "streams/readable-streams/count-queuing-strategy-integration.sharedworker.html": [
+   "42cf0e2dd45eae0311c210cced7d9c9c83620501",
+   "testharness"
+  ],
+  "streams/readable-streams/garbage-collection.dedicatedworker.html": [
+   "0c774ff797fda7a5b5a828a4600a39dae72cac0c",
+   "testharness"
+  ],
+  "streams/readable-streams/garbage-collection.html": [
+   "b338e65673939e598b0f8e5a28591bfb040755fb",
+   "testharness"
+  ],
   "streams/readable-streams/garbage-collection.https.html": [
    "7fa637cabc814dc1b855a67139089d5630143baa",
    "testharness"
   ],
   "streams/readable-streams/garbage-collection.js": [
    "1f6fdea9689eb6a21d3fd6a0be362aaed642fda9",
    "support"
   ],
+  "streams/readable-streams/garbage-collection.serviceworker.https.html": [
+   "c35eb996cbf796eadbb52f4a3288c8452765b952",
+   "testharness"
+  ],
+  "streams/readable-streams/garbage-collection.sharedworker.html": [
+   "d22e9b8bc231b3c00be2de557c0f91dbb76dcd81",
+   "testharness"
+  ],
+  "streams/readable-streams/general.dedicatedworker.html": [
+   "8583d80450b090c16ed0795170340d040449bbc1",
+   "testharness"
+  ],
+  "streams/readable-streams/general.html": [
+   "adc5be693f0e3218419c447767678c4a3274767a",
+   "testharness"
+  ],
   "streams/readable-streams/general.https.html": [
    "2072dc285c2a67bc406be99d147db0c397c748e0",
    "testharness"
   ],
   "streams/readable-streams/general.js": [
    "21bc74e707c6faa045ffee6211065e3f8d32b211",
    "support"
   ],
+  "streams/readable-streams/general.serviceworker.https.html": [
+   "1792d6c45a5687777291a4dab031a954aa053752",
+   "testharness"
+  ],
+  "streams/readable-streams/general.sharedworker.html": [
+   "44f9ceaa3bfc9d8b92885997d322486bd0f237a6",
+   "testharness"
+  ],
+  "streams/readable-streams/pipe-through.dedicatedworker.html": [
+   "ed05dd7416cc07e178e481375c2372ce1094905e",
+   "testharness"
+  ],
+  "streams/readable-streams/pipe-through.html": [
+   "fddee6be61036c7fcd88a2e4661fbf5b5f796a18",
+   "testharness"
+  ],
   "streams/readable-streams/pipe-through.https.html": [
    "1c05def133022072ebaf13225ae0522a199dddc7",
    "testharness"
   ],
   "streams/readable-streams/pipe-through.js": [
    "1fdceec0fdec41293e411e7263fec1bf8f397853",
    "support"
   ],
+  "streams/readable-streams/pipe-through.serviceworker.https.html": [
+   "e6604dc4e7f4404ee9dea5ab237fb4636bf9e85a",
+   "testharness"
+  ],
+  "streams/readable-streams/pipe-through.sharedworker.html": [
+   "8ecb019e754fd4239cb35c27787897efc2dacccb",
+   "testharness"
+  ],
+  "streams/readable-streams/readable-stream-reader.dedicatedworker.html": [
+   "1e6d8e7a09378353b62385ca3bb88961ac4b329c",
+   "testharness"
+  ],
+  "streams/readable-streams/readable-stream-reader.html": [
+   "952983c614a48e3e3cb80e9c498a1dbff4b666ad",
+   "testharness"
+  ],
   "streams/readable-streams/readable-stream-reader.https.html": [
    "946e9777165e938443e21464cffa20d447956297",
    "testharness"
   ],
   "streams/readable-streams/readable-stream-reader.js": [
    "76fbfc44284d6197edbcb3b54d1dba93fa142858",
    "support"
   ],
+  "streams/readable-streams/readable-stream-reader.serviceworker.https.html": [
+   "e320ca7c96cfd77589d783f4e6a088935b277b82",
+   "testharness"
+  ],
+  "streams/readable-streams/readable-stream-reader.sharedworker.html": [
+   "dd2388b7f28a215f5032fc27231528e3b58abec2",
+   "testharness"
+  ],
+  "streams/readable-streams/tee.dedicatedworker.html": [
+   "028f2d402a74140b40a9a3eace6aad1cc862bb64",
+   "testharness"
+  ],
+  "streams/readable-streams/tee.html": [
+   "2cebca15a9977e98c8f2f85648d6a72b5341464e",
+   "testharness"
+  ],
   "streams/readable-streams/tee.https.html": [
    "634f88dfe38884bbd9e594c6979ea41b4183b2c3",
    "testharness"
   ],
   "streams/readable-streams/tee.js": [
    "2753f823f65c3c536c203fe60a8cd2319b54f427",
    "support"
   ],
+  "streams/readable-streams/tee.serviceworker.https.html": [
+   "d99b0e2bf22cbf2ed0ba27f51e3d944c34ca6ae5",
+   "testharness"
+  ],
+  "streams/readable-streams/tee.sharedworker.html": [
+   "d766db1743ba40112c561f69072c096036c34179",
+   "testharness"
+  ],
+  "streams/readable-streams/templated.dedicatedworker.html": [
+   "261d2d62a136be25be0c60c85ac301f2ec0c910e",
+   "testharness"
+  ],
+  "streams/readable-streams/templated.html": [
+   "7af7ba9e9cb785cb068742e2a14e7868bc70610e",
+   "testharness"
+  ],
   "streams/readable-streams/templated.https.html": [
    "828049a3e5d19ad57872a7bf6a464642ffcfe6d5",
    "testharness"
   ],
   "streams/readable-streams/templated.js": [
    "23a2d98735c9630f56ba0f12dbec6f145c655b6a",
    "support"
   ],
+  "streams/readable-streams/templated.serviceworker.https.html": [
+   "82dcb18ef90fb8a957cd2a991cafc598e918e35b",
+   "testharness"
+  ],
+  "streams/readable-streams/templated.sharedworker.html": [
+   "e21d57a0dd02a13b9b93ace6ab2f292f29bd4f93",
+   "testharness"
+  ],
+  "streams/resources/recording-streams.js": [
+   "64f85212b966489f92c7379e270dd0ed5a9ddb8d",
+   "support"
+  ],
   "streams/resources/rs-test-templates.js": [
    "efb7f2bae5a869e450fc6cf1b98e1a6de14f18f3",
    "support"
   ],
   "streams/resources/rs-utils.js": [
    "22b7fac9d9d44945dcd2a8e30744a2059a435316",
    "support"
   ],
   "streams/resources/test-initializer.js": [
    "3bb0aa76d622c433260287bd51e4b2e7551afd30",
    "support"
   ],
   "streams/resources/test-utils.js": [
    "8be92021ce905b186b96a2dfe3a1c8d397551ed9",
    "support"
   ],
+  "streams/writable-streams/aborting.dedicatedworker.html": [
+   "89cfc3ba5cfbb426b6ac60c32aa5cfe9dd0ad8b4",
+   "testharness"
+  ],
+  "streams/writable-streams/aborting.html": [
+   "9cacb1967fee9eab8619b949101e28ffde922ed9",
+   "testharness"
+  ],
+  "streams/writable-streams/aborting.js": [
+   "744d55d9887783d92cdf81685358dab5a2016f84",
+   "support"
+  ],
+  "streams/writable-streams/aborting.serviceworker.https.html": [
+   "b69530ebf51ccaf781ff78172be2f4607ee22c86",
+   "testharness"
+  ],
+  "streams/writable-streams/aborting.sharedworker.html": [
+   "9e792fad19cd10a96440478cb7e0486f41b70bf4",
+   "testharness"
+  ],
+  "streams/writable-streams/bad-strategies.dedicatedworker.html": [
+   "269e32606201603b326048f42573c8535c060a18",
+   "testharness"
+  ],
+  "streams/writable-streams/bad-strategies.html": [
+   "ce222675f5d45cf56f3f283cfab416472cb770b9",
+   "testharness"
+  ],
+  "streams/writable-streams/bad-strategies.js": [
+   "58cf46e9e07c61e2a7d170cb93837b9e16aa66e3",
+   "support"
+  ],
+  "streams/writable-streams/bad-strategies.serviceworker.https.html": [
+   "1cc76d2d9135082afcaba8e45de4a4cbdf0c35e0",
+   "testharness"
+  ],
+  "streams/writable-streams/bad-strategies.sharedworker.html": [
+   "a4692c839ca53134bc5036b2f813e2311db3f2d0",
+   "testharness"
+  ],
+  "streams/writable-streams/bad-underlying-sinks.dedicatedworker.html": [
+   "1b17838179df4a18b4a2d06a1d977cbb26d3b4b9",
+   "testharness"
+  ],
+  "streams/writable-streams/bad-underlying-sinks.html": [
+   "416a7768757c202cae70acf4ac22073f9d066336",
+   "testharness"
+  ],
+  "streams/writable-streams/bad-underlying-sinks.js": [
+   "d031fddb5a84f15c60e09416cd8d45609828691e",
+   "support"
+  ],
+  "streams/writable-streams/bad-underlying-sinks.serviceworker.https.html": [
+   "fbddba953d4b50ed43b1e03cab6eb8931db71ffe",
+   "testharness"
+  ],
+  "streams/writable-streams/bad-underlying-sinks.sharedworker.html": [
+   "b20a95798586eb4c1d9ba9d2413038fa37316c5e",
+   "testharness"
+  ],
+  "streams/writable-streams/brand-checks.dedicatedworker.html": [
+   "b0f32b03a352ef7ac1940eda90414a5f65980194",
+   "testharness"
+  ],
+  "streams/writable-streams/brand-checks.html": [
+   "884307be73730033fe07625cdecd6487468c4f96",
+   "testharness"
+  ],
+  "streams/writable-streams/brand-checks.js": [
+   "a9889b29e8265b8d236e54182df9c9052d9ae38d",
+   "support"
+  ],
+  "streams/writable-streams/brand-checks.serviceworker.https.html": [
+   "c8279e28f5cd80d454d884154ae883a8c965705f",
+   "testharness"
+  ],
+  "streams/writable-streams/brand-checks.sharedworker.html": [
+   "6f3911baf77e26af2d7e7d7472caae4df6d5a27e",
+   "testharness"
+  ],
+  "streams/writable-streams/byte-length-queuing-strategy.dedicatedworker.html": [
+   "bdbd5627125bd25f84f0431b1bc752ceeb5015ba",
+   "testharness"
+  ],
+  "streams/writable-streams/byte-length-queuing-strategy.html": [
+   "61532943318bcf1a978018ba04579dffb0f7290b",
+   "testharness"
+  ],
+  "streams/writable-streams/byte-length-queuing-strategy.js": [
+   "403911220a6f8a0b7f1427f3f1603df55913824d",
+   "support"
+  ],
+  "streams/writable-streams/byte-length-queuing-strategy.serviceworker.https.html": [
+   "83c7631272f9c04011e179a1d5f2c6744ab09e2d",
+   "testharness"
+  ],
+  "streams/writable-streams/byte-length-queuing-strategy.sharedworker.html": [
+   "3c576d902e34976313357126d3688a4639a4e5a7",
+   "testharness"
+  ],
+  "streams/writable-streams/close.dedicatedworker.html": [
+   "cccf37e3bcc4be858fb41be465c38e7785db4508",
+   "testharness"
+  ],
+  "streams/writable-streams/close.html": [
+   "70e009ba3ef83ab35b0f64ded234ecbe0409a1fe",
+   "testharness"
+  ],
+  "streams/writable-streams/close.js": [
+   "ac7f1df6753c0d171d61a274a8ae7c6f5107857c",
+   "support"
+  ],
+  "streams/writable-streams/close.serviceworker.https.html": [
+   "5461a766e8047c6d50b7943d99f8ebb4c140a547",
+   "testharness"
+  ],
+  "streams/writable-streams/close.sharedworker.html": [
+   "b2aeb127d5ae7087b42e3fc08faaa113c84e6fd8",
+   "testharness"
+  ],
+  "streams/writable-streams/constructor.dedicatedworker.html": [
+   "6c954f0d265d21fe1dae9d85afbcc79e8d875797",
+   "testharness"
+  ],
+  "streams/writable-streams/constructor.html": [
+   "cedc1d744e01b63e27503f59791cd45834db039e",
+   "testharness"
+  ],
+  "streams/writable-streams/constructor.js": [
+   "cc69b69308c1c51832488909cf962e580ff1dc3c",
+   "support"
+  ],
+  "streams/writable-streams/constructor.serviceworker.https.html": [
+   "025f934a714ce8c52df953ba570a527cbcb88399",
+   "testharness"
+  ],
+  "streams/writable-streams/constructor.sharedworker.html": [
+   "f6ce1491f86ee048da0f6135440b7aa5359caa22",
+   "testharness"
+  ],
+  "streams/writable-streams/count-queuing-strategy.dedicatedworker.html": [
+   "8406ee4393da4130128cd402824d344716119460",
+   "testharness"
+  ],
+  "streams/writable-streams/count-queuing-strategy.html": [
+   "660a512e4227f96651216629f32faf1139a31187",
+   "testharness"
+  ],
+  "streams/writable-streams/count-queuing-strategy.js": [
+   "8b7e7be4fa446e212d4f17180b5bdf3a05c8333c",
+   "support"
+  ],
+  "streams/writable-streams/count-queuing-strategy.serviceworker.https.html": [
+   "7f59d0e37562a6adfb2972b61928375047266ac7",