Merge mozilla-inbound to mozilla-central. a=merge
authorAndreea Pavel <apavel@mozilla.com>
Thu, 07 Mar 2019 11:49:04 +0200
changeset 462822 c89f024c023fa816d700b151e8e0cbb9a1907cb8
parent 462821 ecbfad744a66ee47428dff7992aa6604391844e6 (diff)
parent 462770 f84b1b428d4298326511fbdb527c0029e5cdf638 (current diff)
child 462823 1d4dcfddc3f8483e60105dd19f03481f28518664
child 462896 44d8a4dbe146fb84464b66634e94c6c00a8d066d
push id112329
push userapavel@mozilla.com
push dateThu, 07 Mar 2019 10:01:39 +0000
treeherdermozilla-inbound@1d4dcfddc3f8 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone67.0a1
first release with
nightly linux32
c89f024c023f / 67.0a1 / 20190307094951 / files
nightly linux64
c89f024c023f / 67.0a1 / 20190307094951 / files
nightly mac
c89f024c023f / 67.0a1 / 20190307094951 / files
nightly win32
c89f024c023f / 67.0a1 / 20190307094951 / files
nightly win64
c89f024c023f / 67.0a1 / 20190307094951 / 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 mozilla-inbound to mozilla-central. a=merge
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -85,53 +85,56 @@ dependencies = [
 ]
 
 [[package]]
 name = "audioipc"
 version = "0.2.4"
 dependencies = [
  "bincode 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "bytes 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)",
- "cubeb 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cc 1.0.23 (git+https://github.com/glandium/cc-rs?branch=1.0.23-clang-cl-aarch64)",
+ "cubeb 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)",
  "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "memmap 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "mio-named-pipes 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "scoped-tls 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde_derive 1.0.80 (git+https://github.com/servo/serde?branch=deserialize_from_enums9)",
  "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)",
  "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
  "tokio-uds 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi 0.3.6 (git+https://github.com/froydnj/winapi-rs?branch=aarch64)",
 ]
 
 [[package]]
 name = "audioipc-client"
 version = "0.4.0"
 dependencies = [
  "audioipc 0.2.4",
- "cubeb-backend 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cubeb-backend 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "foreign-types 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)",
  "futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)",
  "tokio-uds 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "audioipc-server"
 version = "0.2.3"
 dependencies = [
  "audioipc 0.2.4",
  "bytes 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)",
- "cubeb-core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cubeb-core 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)",
  "lazycell 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "slab 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)",
  "tokio-uds 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -666,56 +669,55 @@ version = "0.1.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "procedural-masquerade 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "syn 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "cubeb"
-version = "0.5.2"
+version = "0.5.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "cubeb-core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cubeb-core 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "cubeb-backend"
-version = "0.5.1"
+version = "0.5.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "cubeb-core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cubeb-core 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "cubeb-core"
-version = "0.5.1"
+version = "0.5.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "cubeb-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cubeb-sys 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "cubeb-pulse"
 version = "0.2.0"
 dependencies = [
- "cubeb-backend 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cubeb-backend 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "pulse 0.2.0",
  "pulse-ffi 0.1.0",
  "semver 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "cubeb-sys"
-version = "0.5.1"
+version = "0.5.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "cmake 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)",
- "gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)",
  "pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "darling"
 version = "0.8.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
@@ -1113,17 +1115,17 @@ dependencies = [
 name = "gkrust-shared"
 version = "0.1.0"
 dependencies = [
  "arrayvec 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "audioipc-client 0.4.0",
  "audioipc-server 0.2.3",
  "cose-c 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "cubeb-pulse 0.2.0",
- "cubeb-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cubeb-sys 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "encoding_c 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "encoding_glue 0.1.0",
  "env_logger 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "geckoservo 0.0.1",
  "gkrust_utils 0.1.0",
  "jsrust_shared 0.1.0",
  "kvstore 0.1.0",
  "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1622,16 +1624,28 @@ dependencies = [
  "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "net2 0.2.32 (registry+https://github.com/rust-lang/crates.io-index)",
  "slab 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
+name = "mio-named-pipes"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
+ "mio 0.6.15 (registry+https://github.com/rust-lang/crates.io-index)",
+ "miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
 name = "mio-uds"
 version = "0.6.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
  "mio 0.6.15 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
@@ -3349,20 +3363,20 @@ dependencies = [
 "checksum crossbeam-epoch 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2af0e75710d6181e234c8ecc79f14a97907850a541b13b0be1dd10992f2e4620"
 "checksum crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2760899e32a1d58d5abb31129f8fae5de75220bc2176e77ff7c627ae45c918d9"
 "checksum crossbeam-utils 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d636a8b3bcc1b409d7ffd3facef8f21dcb4009626adbd0c5e6c4305c07253c7b"
 "checksum crossbeam-utils 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "41ee4864f4797060e52044376f7d107429ce1fb43460021b126424b7180ee21a"
 "checksum cssparser 0.25.0 (registry+https://github.com/rust-lang/crates.io-index)" = "730363a45c4e248d4f21d3e5c1156d1a9cdec0855056c0d9539e814bc59865c3"
 "checksum cssparser-macros 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "f3a5383ae18dbfdeb569ed62019f5bddb2a95cd2d3833313c475a0d014777805"
 "checksum cstr 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b6557bdb1dc9647eae1cf7f5601b14cd45fc3c7ccf2df618387416fe542da6ea"
 "checksum cstr-macros 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0472c17c83d3ec1af32fb6ee2b3ad56ae0b6e69355d63d1d30602055c34324a8"
-"checksum cubeb 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8a3502aafa1bf95c524f65d2ba46d8741700c6a8a9543ea52c6da3d8b69a2896"
-"checksum cubeb-backend 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0432a0d08c3f9a778a2b0b6214c87ec2eb17e8639eb68baf0686bdafc4fd11f1"
-"checksum cubeb-core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "37f7b20f757a4e4b6aa28863236551bff77682dc6db192eba15af615492b5445"
-"checksum cubeb-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "653b9e245d35dbe2a2da7c4586275cee75ff656ddeb02d4a73b4afdfa6d67502"
+"checksum cubeb 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "db3f0df2ad5cb453126364a77921466ba6c1034e8bd9247f326cdb31430dbc2a"
+"checksum cubeb-backend 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "442cd5cfb980ff62730525278ce320d9b2ff635b725857ad3176832664262fec"
+"checksum cubeb-core 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "0161f9327864922ba7a172c90bd86bc9094938433eca415e2c75629954045022"
+"checksum cubeb-sys 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3ba7540c17b90159cf7d7854da370998ff0560d9b90e2c9290bb588afa0edf95"
 "checksum darling 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f593353cad5af2df6d54810de2b61aa8acba5b5fbc70b0d75e7cc5bdd80aca73"
 "checksum darling_core 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "168c246e87e727d58575d9b4595491010627f0cdc910e3e6ea3b36db2b9a9d9a"
 "checksum darling_macro 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "99c4eff4bcbeaf6a22578012ff79c95910338668278d1901e528bd34a22f575d"
 "checksum derive_more 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3f57d78cf3bd45270dad4e70c21ec77a960b36c7a841ff9db76aaa775a8fb871"
 "checksum devd-rs 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e7c9ac481c38baf400d3b732e4a06850dfaa491d1b6379a249d9d40d14c2434c"
 "checksum diff 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "3c2b69f912779fbb121ceb775d74d51e915af17aaebc38d28a592843a2dd0a3a"
 "checksum digest 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)" = "03b072242a8cbaf9c145665af9d250c59af3b958f83ed6824e13533cf76d5b90"
 "checksum digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "05f47366984d3ad862010e22c7ce81a7dbcaebbdfb37241a620f8b6596ee135c"
@@ -3434,16 +3448,17 @@ dependencies = [
 "checksum memchr 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "148fab2e51b4f1cfc66da2a7c32981d1d3c083a803978268bb11fe4b86925e7a"
 "checksum memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "796fba70e76612589ed2ce7f45282f5af869e0fdd7cc6199fa1aa1f1d591ba9d"
 "checksum memmap 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "46f3c7359028b31999287dae4e5047ddfe90a23b7dca2282ce759b491080c99b"
 "checksum memmap 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e2ffa2c986de11a9df78620c01eeaaf27d94d3ff02bf81bfcca953102dd0c6ff"
 "checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3"
 "checksum miniz_oxide 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "aaa2d3ad070f428fffbd7d3ca2ea20bb0d8cffe9024405c44e1840bc1418b398"
 "checksum miniz_oxide_c_api 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "92d98fdbd6145645828069b37ea92ca3de225e000d80702da25c20d3584b38a5"
 "checksum mio 0.6.15 (registry+https://github.com/rust-lang/crates.io-index)" = "4fcfcb32d63961fb6f367bfd5d21e4600b92cd310f71f9dca25acae196eb1560"
+"checksum mio-named-pipes 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "82f43a815b57d2d652550f3d20cec88a495bb2d0956aa873dc43040278455677"
 "checksum mio-uds 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "1731a873077147b626d89cc6c2a0db6288d607496c5d10c0cfcf3adc697ec673"
 "checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919"
 "checksum moz_cbor 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20c82a57087fd5990d7122dbff1607c3b20c3d2958e9d9ad9765aab415e2c91c"
 "checksum mp4parse_fallible 0.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6626c2aef76eb8f984eef02e475883d3fe9112e114720446c5810fc5f045cd30"
 "checksum msdos_time 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "aad9dfe950c057b1bfe9c1f2aa51583a8468ef2a5baba2ebbe06d775efeb7729"
 "checksum net2 0.2.32 (registry+https://github.com/rust-lang/crates.io-index)" = "9044faf1413a1057267be51b5afba8eb1090bd2231c693664aa1db716fe1eae0"
 "checksum new_debug_unreachable 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0cdc457076c78ab54d5e0d6fa7c47981757f1e34dc39ff92787f217dede586c4"
 "checksum nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "9a2228dca57108069a5262f2ed8bd2e82496d2e074a06d1ccc7ce1687b6ae0a2"
--- a/browser/base/content/test/performance/browser.ini
+++ b/browser/base/content/test/performance/browser.ini
@@ -12,17 +12,17 @@ prefs =
   browser.startup.record=true
   gfx.canvas.willReadFrequently.enable=true
   # The form autofill framescript is only used in certain locales if this
   # pref is set to 'detect', which is the default value on non-Nightly.
   extensions.formautofill.available='on'
 support-files =
   head.js
 [browser_appmenu.js]
-skip-if = asan || debug || (os == 'win' && bits == 32) # Bug 1382809, bug 1369959, Win32 because of intermittent OOM failures
+skip-if = asan || debug || (os == 'win' && bits == 32) || (os == 'win' && processor == 'aarch64') # Bug 1382809, bug 1369959, Win32 because of intermittent OOM failures, bug 1533141 for aarch64
 [browser_preferences_usage.js]
 skip-if = !debug
 [browser_startup.js]
 [browser_startup_content.js]
 skip-if = !e10s
 [browser_startup_flicker.js]
 run-if = debug || devedition || nightly_build # Requires startupRecorder.js, which isn't shipped everywhere by default
 [browser_startup_hiddenwindow.js]
--- a/browser/base/content/test/plugins/browser.ini
+++ b/browser/base/content/test/plugins/browser.ini
@@ -82,16 +82,17 @@ tags = blocklist
 [browser_pluginnotification.js]
 tags = blocklist
 [browser_plugin_reloading.js]
 tags = blocklist
 [browser_blocklist_content.js]
 skip-if = !e10s
 tags = blocklist
 [browser_enable_DRM_prompt.js]
+skip-if = (os == 'win' && processor == 'aarch64') # bug 1533164
 [browser_private_browsing_eme_persistent_state.js]
 [browser_globalplugin_crashinfobar.js]
 skip-if = !crashreporter
 [browser_pluginCrashCommentAndURL.js]
 skip-if = !crashreporter
 [browser_pluginCrashReportNonDeterminism.js]
 skip-if = !crashreporter
 [browser_private_clicktoplay.js]
--- a/build/moz.configure/bindgen.configure
+++ b/build/moz.configure/bindgen.configure
@@ -9,17 +9,17 @@ cbindgen = check_prog('CBINDGEN', ['cbin
                       when=depends(build_project)
                       (lambda build_project: build_project != 'js'))
 
 
 @depends_if(cbindgen)
 @checking('cbindgen version')
 @imports(_from='textwrap', _import='dedent')
 def cbindgen_version(cbindgen):
-    cbindgen_min_version = Version('0.7.1')
+    cbindgen_min_version = Version('0.8.2')
 
     # cbindgen x.y.z
     version = Version(check_cmd_output(cbindgen, '--version').strip().split(" ")[1])
 
     if version < cbindgen_min_version:
         die(dedent('''\
         cbindgen version {} is too old. At least version {} is required.
 
new file mode 100644
--- /dev/null
+++ b/devtools/client/aboutdebugging-new/documentation/GECKOVIEW_EXAMPLE_BUILD.md
@@ -0,0 +1,66 @@
+# Build GeckoView Example
+
+## When do you need to build GeckoView Example
+
+If a remote debugging change impacts the server (file located in `devtools/server` or in `devtools/shared`), you will not be able to test it without building your GeckoView Example. For the purpose of remote debugging, your local build of Firefox Desktop where you will test about:debugging runs the content of `devtools/client` (including `devtools/client/aboutdebugging-new`). And `devtools/server` runs on the device. So as soon as you are developing or testing a patch that needs to update the server and is about USB debugging, you need to build GeckoView Example and deploy it on a test device.
+
+## Setup your environment
+
+This will be a short documentation focused on the typical patches you may write for about:debugging. For a more complete documentation, you can refer to https://mozilla.github.io/geckoview/ and https://developer.mozilla.org/en-US/docs/Mozilla/Developer_guide/Build_Instructions/Simple_Firefox_for_Android_build.
+
+The whole setup needs to download several gigabytes of dependencies so try to have a fast internet connection to follow those steps.
+
+### Clone mozilla-central
+
+It is recommended to create a new clone of mozilla-central for your GeckoView Example builds.
+
+```
+  hg clone https://hg.mozilla.org/mozilla-central mozilla-central-gecko-view
+  cd mozilla-central-gecko-view
+```
+
+### Run bootstrap
+
+Next simply run `mach bootstrap` and select the third option `3. GeckoView/Firefox for Android Artifact Mode`
+
+```
+  > ./mach bootstrap
+  Please choose the version of Firefox you want to build:
+  1. Firefox for Desktop Artifact Mode
+  2. Firefox for Desktop
+  3. GeckoView/Firefox for Android Artifact Mode
+  4. GeckoView/Firefox for Android
+  > 3
+```
+
+Follow the instructions, it will take some time as it needs to download a lot of dependencies. At the end it will provide you with a template you should use to create a `.mozconfig` file. You can use the proposed content without changing anything.
+
+### Enable USB debugging on your phone
+
+If you already used your device for USB debugging, this should already be enabled, but we will repeat the steps here.
+
+In the Settings menu, choose "About" and scroll down to the Build Number option. There's a hidden option there to activate "developer mode": tap the Build Number option seven times. You’ll see a countdown, and then a "Developer Options" menu will appear in your Settings. Don’t worry — you can turn this off whenever you like. The last step is to enable USB Debugging in the Developer Options menu.
+
+## Build and deploy to your phone
+
+Connect your phone to your computer with a USB cable. Then run:
+
+```
+  ./mach build
+  ./mach package
+  ./mach android install-geckoview_example
+```
+
+At this step if you go to the list of applications on your phone, you should be able to spot a "GeckoView Example" application.
+
+## Reflect changes
+
+If you change server files that impact GeckoView, you need to build and install again. Reflect the changes by:
+
+```
+  ./mach build faster
+  ./mach package
+  ./mach android install-geckoview_example
+```
+
+Once you built all, the changes under `devtools/server` and `devtools/shared` can be built with `faster` option. This should be faster.
new file mode 100644
--- /dev/null
+++ b/devtools/client/aboutdebugging-new/documentation/GECKOVIEW_REFERENCE_BROWSER_BUILD.md
@@ -0,0 +1,152 @@
+# Build GeckoView Reference Browser
+
+## When do you need to build GeckoView Reference Browser
+
+If a remote debugging change impacts the server (file located in `devtools/server` or in `devtools/shared`), you will not be able to test it without building your GeckoView Reference Browser. For the purpose of remote debugging, your local build of Firefox Desktop where you will test about:debugging runs the content of `devtools/client` (including `devtools/client/aboutdebugging-new`). And `devtools/server` runs on the device. So as soon as you are developing or testing a patch that needs to update the server and is about USB debugging, you need to build GeckoView Reference Browser and deploy it on a test device. To build custom Reference Browser, need two modules of GeckoView and Reference Browser.
+
+## Setup your environment and build
+
+This will be a short documentation focused on the typical patches you may write for about:debugging. For a more complete documentation, you can refer to https://mozilla.github.io/geckoview/ and https://developer.mozilla.org/en-US/docs/Mozilla/Developer_guide/Build_Instructions/Simple_Firefox_for_Android_build.
+
+The whole setup needs to download several gigabytes of dependencies so try to have a fast internet connection to follow those steps.
+
+### Make empty directory
+
+It is recommended to create a new directory to build your GeckoView and Reference Browser.
+
+```
+  mkdir geckoview-reference-browser
+  cd geckoview-reference-browser
+```
+
+### Build GeckoView
+
+#### Clone mozilla-central
+
+It is recommended to create a new clone of mozilla-central for your GeckoView builds.
+
+```
+  hg clone https://hg.mozilla.org/mozilla-central mozilla-central-gecko-view
+  cd mozilla-central-gecko-view
+```
+
+#### Run bootstrap
+
+Next simply run `mach bootstrap` and select the third option `3. GeckoView/Firefox for Android Artifact Mode`
+
+```
+  > ./mach bootstrap
+  Please choose the version of Firefox you want to build:
+  1. Firefox for Desktop Artifact Mode
+  2. Firefox for Desktop
+  3. GeckoView/Firefox for Android Artifact Mode
+  4. GeckoView/Firefox for Android
+  > 3
+```
+
+Follow the instructions, it will take some time as it needs to download a lot of dependencies. At the end it will provide you with a template you should use to create a `.mozconfig` file. You can use the proposed content without changing anything.
+
+### Build
+
+Execute command below to build.
+
+```
+  ./mach build
+  ./mach package
+  ./mach android archive-geckoview
+```
+
+If the build has finished successfully, the GeckoView AAR file will be created in your build output directory. You can find this file with following command:
+
+```
+  > ls mozilla-central-gecko-view/<your-output-directory>/gradle/build/mobile/android/geckoview/outputs/aar
+  geckoview-withGeckoBinaries-debug.aar
+```
+
+
+### Build Reference Browser
+
+#### Clone reference-browser
+
+It is recommended to create a new clone of reference-browser for your Reference Browser builds.
+
+```
+  cd ../
+  git clone https://github.com/mozilla-mobile/reference-browser
+  cd reference-browser
+```
+
+#### Create `local.properties` file
+
+`local.properties` file is necessary to specify the location of the Android SDK. Please write the absolute path of Android SDK with `sdk.dir` key. If you did `./mach bootstrap` once, Android SDK should already installed. You can find the directory whose name is like `android-sdk-<os-name>` under `~/.mozconfig/`. Thus, in mac osx case, the content of `local.properties` should be like below:
+
+```
+sdk.dir=/Users/xxxxxx/.mozbuild/android-sdk-osx
+```
+
+#### Edit `app/build.gradle` to build Reference Browser with above GeckoView
+
+You need to edit two places in `app/build.gradle`.
+
+1. Add `repositories` block with following content to bottom of file. <absolute path to AAR> is the directory which was created by `./mach android archive-geckoview` to build GeckoView. This should be like `/User/xxxxxx/mozilla-central-gecko-view/<your-output-directory>/gradle/build/mobile/android/geckoview/outputs/aar`.
+
+```
+repositories {
+    flatDir(
+        name: "localBuild",
+        dirs: "<absolute path to AAR>"
+    )
+}
+```
+
+2. Edit `geckoNightlyArmImplementation`
+
+```
+dependencies {
+    // ...
+
+    //geckoNightlyArmImplementation Gecko.geckoview_nightly_arm
+    geckoNightlyArmImplementation(
+        name: 'geckoview-withGeckoBinaries-debug',
+        ext: 'aar'
+    )
+
+    // ...
+}
+```
+
+#### Build and deploy to your phone
+
+Connect your phone to your computer with a USB cable. Then run:
+
+```
+  ./gradlew build
+  ./gradlew installGeckoNightlyArmDebug
+```
+
+At this step if you go to the list of applications on your phone, you should be able to spot a "Reference Browser" application.
+
+### Enable USB debugging on your phone
+
+If you already used your device for USB debugging, this should already be enabled, but we will repeat the steps here.
+
+In the Settings menu, choose "About" and scroll down to the Build Number option. There's a hidden option there to activate "developer mode": tap the Build Number option seven times. You’ll see a countdown, and then a "Developer Options" menu will appear in your Settings. Don’t worry — you can turn this off whenever you like. The last step is to enable USB Debugging in the Developer Options menu on Reference Browser on your device.
+
+And, you can test with Reference Browser with custom GeckoView!
+
+## Reflect changes
+
+If you change codes in GeckoView, need to build and install again. Reflect the changes by:
+
+```
+  cd mozilla-central-gecko-view
+  ./mach build faster
+  ./mach package
+  ./mach android archive-geckoview
+  cd ../
+  cd reference-browser
+  ./gradlew build
+  ./gradlew installGeckoNightlyArmDebug
+```
+
+Once you built all, the changes under `devtools/server` and `devtools/shared` can build with `faster` option. This should be faster.
--- a/devtools/client/scratchpad/scratchpad.js
+++ b/devtools/client/scratchpad/scratchpad.js
@@ -1084,26 +1084,38 @@ var Scratchpad = {
     });
   },
 
   /**
    * Open a file to edit in the Scratchpad.
    *
    * @param integer aIndex
    *        Optional integer: clicked menuitem in the 'Open Recent'-menu.
+   *        If omitted, prompt the user to pick a file to open.
+   *
+   * @return Promise
+   *        A Promise that resolves to undefined when the file is opened (or
+   *        can't be opened), or when the user cancels the file picker dialog.
+   *        This method effectively catches all errors and reports them to the
+   *        notificationBox, so the promise never becomes rejected.
    */
-  openFile: function SP_openFile(aIndex) {
-    const promptCallback = aFile => {
-      this.promptSave((aCloseFile, aSaved, aStatus) => {
-        let shouldOpen = aCloseFile;
-        if (aSaved && !Components.isSuccessCode(aStatus)) {
-          shouldOpen = false;
-        }
+  openFile(aIndex) {
+    return new Promise(resolve => {
+      const promptCallback = aFile => {
+        this.promptSave((aCloseFile, aSaved, aStatus) => {
+          let shouldOpen = aCloseFile;
+          if (aSaved && !Components.isSuccessCode(aStatus)) {
+            shouldOpen = false;
+          }
 
-        if (shouldOpen) {
+          if (!shouldOpen) {
+            resolve();
+            return;
+          }
+
           let file;
           if (aFile) {
             file = aFile;
           } else {
             file = Cc["@mozilla.org/file/local;1"]
                    .createInstance(Ci.nsIFile);
             const filePath = this.getRecentFiles()[aIndex];
             file.initWithPath(filePath);
@@ -1113,39 +1125,42 @@ var Scratchpad = {
             this.notificationBox.appendNotification(
               this.strings.GetStringFromName("fileNoLongerExists.notification"),
               "file-no-longer-exists",
               null,
               this.notificationBox.PRIORITY_WARNING_HIGH,
               null);
 
             this.clearFiles(aIndex, 1);
+            resolve();
             return;
           }
 
-          this.importFromFile(file, false);
-        }
-      });
-    };
+          this.importFromFile(file, false).finally(_ => resolve());
+        });
+      };
 
-    if (aIndex > -1) {
-      promptCallback();
-    } else {
-      const fp = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker);
-      fp.init(window, this.strings.GetStringFromName("openFile.title"),
-              Ci.nsIFilePicker.modeOpen);
-      fp.defaultString = "";
-      fp.appendFilter("JavaScript Files", "*.js; *.jsm; *.json");
-      fp.appendFilter("All Files", "*.*");
-      fp.open(aResult => {
-        if (aResult != Ci.nsIFilePicker.returnCancel) {
-          promptCallback(fp.file);
-        }
-      });
-    }
+      if (aIndex > -1) {
+        promptCallback();
+      } else {
+        const fp = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker);
+        fp.init(window, this.strings.GetStringFromName("openFile.title"),
+                Ci.nsIFilePicker.modeOpen);
+        fp.defaultString = "";
+        fp.appendFilter("JavaScript Files", "*.js; *.jsm; *.json");
+        fp.appendFilter("All Files", "*.*");
+        fp.open(aResult => {
+          if (aResult == Ci.nsIFilePicker.returnCancel) {
+            resolve();
+          } else {
+            promptCallback(fp.file);
+          }
+        });
+      }
+    });
   },
 
   /**
    * Get recent files.
    *
    * @return Array
    *         File paths.
    */
--- a/devtools/client/scratchpad/test/browser_scratchpad_recent_files.js
+++ b/devtools/client/scratchpad/test/browser_scratchpad_recent_files.js
@@ -27,81 +27,90 @@ var gFileName03 = "file03_ForBug651942.t
 var gFileName04 = "file04_ForBug651942.tmp";
 
 // Content for the temporary files.
 var gFileContent01 = "hello.world.01('bug651942');";
 var gFileContent02 = "hello.world.02('bug651942');";
 var gFileContent03 = "hello.world.03('bug651942');";
 var gFileContent04 = "hello.world.04('bug651942');";
 
-async function startTest() {
+// Return a promise that will be resolved after one event loop turn.
+function snooze() {
+  return new Promise(resolve => setTimeout(resolve, 0));
+}
+
+async function testAddedToRecent() {
   gScratchpad = gScratchpadWindow.Scratchpad;
 
   gFile01 = await createAndLoadTemporaryFile(gFileName01, gFileContent01);
   gFile02 = await createAndLoadTemporaryFile(gFileName02, gFileContent02);
   gFile03 = await createAndLoadTemporaryFile(gFileName03, gFileContent03);
-}
 
-// Test to see if the three files we created in the 'startTest()'-method have
-// been added to the list of recent files.
-async function testAddedToRecent() {
+  // Test to see if the files we just created have been added to the list of
+  // recent files.
   lists.recentFiles01 = gScratchpad.getRecentFiles();
 
   is(lists.recentFiles01.length, 3,
      "Temporary files created successfully and added to list of recent files.");
 
   // Create a 4th file, this should clear the oldest file.
   gFile04 = await createAndLoadTemporaryFile(gFileName04, gFileContent04);
-}
 
-// We have opened a 4th file. Test to see if the oldest recent file was removed,
-// and that the other files were reordered successfully.
-function testOverwriteRecent() {
+  // Test to see if the oldest recent file was removed,
+  // and that the other files were reordered successfully.
   lists.recentFiles02 = gScratchpad.getRecentFiles();
 
   is(lists.recentFiles02[0], lists.recentFiles01[1],
      "File02 was reordered successfully in the 'recent files'-list.");
   is(lists.recentFiles02[1], lists.recentFiles01[2],
      "File03 was reordered successfully in the 'recent files'-list.");
   isnot(lists.recentFiles02[2], lists.recentFiles01[2],
         "File04: was added successfully.");
 
   // Open the oldest recent file.
-  gScratchpad.openFile(0);
-}
+  await gScratchpad.openFile(0);
 
-// We have opened the "oldest"-recent file. Test to see if it is now the most
-// recent file, and that the other files were reordered successfully.
-function testOpenOldestRecent() {
+  // Test to see if it is now the most recent file, and that the other files
+  // were reordered successfully.
   lists.recentFiles03 = gScratchpad.getRecentFiles();
 
   is(lists.recentFiles02[0], lists.recentFiles03[2],
      "File04 was reordered successfully in the 'recent files'-list.");
   is(lists.recentFiles02[1], lists.recentFiles03[0],
      "File03 was reordered successfully in the 'recent files'-list.");
   is(lists.recentFiles02[2], lists.recentFiles03[1],
      "File02 was reordered successfully in the 'recent files'-list.");
-
-  Services.prefs.setIntPref("devtools.scratchpad.recentFilesMax", 0);
 }
 
-// The "devtools.scratchpad.recentFilesMax"-preference was set to zero (0).
-// This should disable the "Open Recent"-menu by hiding it (this should not
-// remove any files from the list). Test to see if it's been hidden.
-function testHideMenu() {
+async function testHideMenu() {
+  Services.prefs.setIntPref("devtools.scratchpad.recentFilesMax", 0);
+
+  // Give the Scratchpad UI time to react to the pref change, via its observer.
+  // This is a race condition; to fix it, Scratchpad would need to give us some
+  // indication that it was finished responding to a pref update - perhaps by
+  // emitting an event.
+  await snooze();
+
+  // The "devtools.scratchpad.recentFilesMax"-preference was set to zero (0).
+  // This should disable the "Open Recent"-menu by hiding it (this should not
+  // remove any files from the list). Test to see if it's been hidden.
   const menu = gScratchpadWindow.document.getElementById("sp-open_recent-menu");
   ok(menu.hasAttribute("hidden"), "The menu was hidden successfully.");
-
-  Services.prefs.setIntPref("devtools.scratchpad.recentFilesMax", 2);
 }
 
-// We have set the recentFilesMax-pref to one (1), this enables the feature,
-// removes the two oldest files, rebuilds the menu and removes the
-// "hidden"-attribute from it. Test to see if this works.
-function testChangedMaxRecent() {
+async function testEnableMenu() {
+  Services.prefs.setIntPref("devtools.scratchpad.recentFilesMax", 2);
+
+  // Give the Scratchpad UI time to react to the pref change. This is a race
+  // condition; see the comment in testHideMenu.
+  await snooze();
+
+  // We have set the recentFilesMax pref to a nonzero value. This enables the
+  // feature, removes the oldest files, rebuilds the menu and removes the
+  // "hidden"-attribute from it. Test to see if this works.
   const menu = gScratchpadWindow.document.getElementById("sp-open_recent-menu");
   ok(!menu.hasAttribute("hidden"), "The menu is visible. \\o/");
 
   lists.recentFiles04 = gScratchpad.getRecentFiles();
 
   is(lists.recentFiles04.length, 2,
      "Two recent files were successfully removed from the 'recent files'-list");
 
@@ -112,72 +121,70 @@ function testChangedMaxRecent() {
   let correctMenuItem = false;
   if (menuitemLabel === lists.recentFiles03[2] &&
       menuitemLabel === lists.recentFiles04[1]) {
     correctMenuItem = true;
   }
 
   is(correctMenuItem, true,
      "Two recent files were successfully removed from the 'Open Recent'-menu");
+}
 
+async function testOpenDeletedFile() {
   // We now remove one file from the harddrive and use the recent-menuitem for
   // it to make sure the user is notified that the file no longer exists.
   // This is tested in testOpenDeletedFile().
   gFile04.remove(false);
 
-  // Make sure the file has been deleted before continuing to avoid
-  // intermittent oranges.
-  waitForFileDeletion();
-}
+  // Make sure the file has been deleted before continuing.
+  while (gFile04.exists()) {
+    await snooze();
+  }
+  gFile04 = null;
 
-function waitForFileDeletion() {
-  if (gFile04.exists()) {
-    executeSoon(waitForFileDeletion);
-    return;
-  }
+  // By now we should have two recent files stored in the list but one of the
+  // files should be missing on the harddrive.
+  await gScratchpad.openFile(0);
 
-  gFile04 = null;
-  gScratchpad.openFile(0);
-}
-
-// By now we should have two recent files stored in the list but one of the
-// files should be missing on the harddrive.
-function testOpenDeletedFile() {
   const doc = gScratchpadWindow.document;
   const popup = doc.getElementById("sp-menu-open_recentPopup");
 
   is(gScratchpad.getRecentFiles().length, 1,
      "The missing file was successfully removed from the list.");
   // The number of recent files stored, plus the separator and the
   // clearRecentMenuItems-item.
   is(popup.children.length, 3,
      "The missing file was successfully removed from the menu.");
   ok(gScratchpad.notificationBox.currentNotification,
      "The notification was successfully displayed.");
   is(gScratchpad.notificationBox.currentNotification.messageText.textContent,
      gScratchpad.strings.GetStringFromName("fileNoLongerExists.notification"),
      "The notification label is correct.");
-
-  gScratchpad.clearRecentFiles();
 }
 
-// We have cleared the last file. Test to see if the last file was removed,
-// the menu is empty and was disabled successfully.
-function testClearedAll() {
+async function testClearAll() {
+  gScratchpad.clearRecentFiles();
+
+  // Give the UI time to react to the recent files being cleared out. This is a
+  // race condition. The clearRecentFiles method works asynchronously, but
+  // there is no way to wait for it to finish. A single event loop turn should
+  // be good enough.
+  await snooze();
+
+  // We have cleared the last file. Test to see if the last file was removed,
+  // the menu is empty and was disabled successfully.
   const doc = gScratchpadWindow.document;
   const menu = doc.getElementById("sp-open_recent-menu");
   const popup = doc.getElementById("sp-menu-open_recentPopup");
 
   is(gScratchpad.getRecentFiles().length, 0,
      "All recent files removed successfully.");
   is(popup.children.length, 0, "All menuitems removed successfully.");
   ok(menu.hasAttribute("disabled"),
      "No files in the menu, it was disabled successfully.");
-
-  finishTest();
 }
 
 async function createAndLoadTemporaryFile(aFileName, aFileContent) {
   info(`Create file: ${aFileName}`);
 
   // Create a temporary file.
   const aFile = FileUtils.getFile("TmpD", [aFileName]);
   aFile.createUnique(Ci.nsIFile.NORMAL_FILE_TYPE, 0o666);
@@ -207,129 +214,38 @@ function checkIfMenuIsPopulated() {
   const recentFilesPlusExtra = gScratchpad.getRecentFiles().length + 2;
 
   if (expectedMenuitemCount > 2) {
     is(expectedMenuitemCount, recentFilesPlusExtra,
        "the recent files menu was populated successfully.");
   }
 }
 
-/**
- * The PreferenceObserver listens for preference changes while Scratchpad is
- * running.
- */
-var PreferenceObserver = {
-  _initialized: false,
-
-  _timesFired: 0,
-  set timesFired(aNewValue) {
-    this._timesFired = aNewValue;
-  },
-  get timesFired() {
-    return this._timesFired;
-  },
-
-  init: function PO_init() {
-    if (this._initialized) {
-      return;
-    }
-
-    this.branch = Services.prefs.getBranch("devtools.scratchpad.");
-    this.branch.addObserver("", this);
-    this._initialized = true;
-  },
-
-  async observe(message, topic, data) {
-    if (topic != "nsPref:changed") {
-      return;
-    }
-
-    if (this._inProgress) {
-      await this._inProgress;
-    }
-
-    this._inProgress = new Promise(async resolve => {
-      info(`Times fired: ${this.timesFired}`);
-      switch (this.timesFired) {
-        case 0:
-          this.timesFired = 1;
-          break;
-        case 1:
-          this.timesFired = 2;
-          break;
-        case 2:
-          this.timesFired = 3;
-          await testAddedToRecent();
-          break;
-        case 3:
-          this.timesFired = 4;
-          testOverwriteRecent();
-          break;
-        case 4:
-          this.timesFired = 5;
-          testOpenOldestRecent();
-          break;
-        case 5:
-          this.timesFired = 6;
-          testHideMenu();
-          break;
-        case 6:
-          this.timesFired = 7;
-          testChangedMaxRecent();
-          break;
-        case 7:
-          this.timesFired = 8;
-          testOpenDeletedFile();
-          break;
-        case 8:
-          this.timesFired = 9;
-          testClearedAll();
-          break;
-      }
-
-      this._inProgress = null;
-      resolve();
-    });
-  },
-
-  uninit: function PO_uninit() {
-    this.branch.removeObserver("", this);
-  },
-};
-
-function test() {
+async function test() {
   waitForExplicitFinish();
 
   registerCleanupFunction(function() {
     gFile01.remove(false);
-    gFile01 = null;
     gFile02.remove(false);
-    gFile02 = null;
     gFile03.remove(false);
-    gFile03 = null;
-    // gFile04 was removed earlier.
-    lists.recentFiles01 = null;
-    lists.recentFiles02 = null;
-    lists.recentFiles03 = null;
-    lists.recentFiles04 = null;
-    gScratchpad = null;
-
-    PreferenceObserver.uninit();
+    // If all tests passed, gFile04 was already removed, but just in case:
+    if (gFile04) {
+      gFile04.remove(false);
+    }
     Services.prefs.clearUserPref("devtools.scratchpad.recentFilesMax");
   });
 
   Services.prefs.setIntPref("devtools.scratchpad.recentFilesMax", 3);
 
-  // Initiate the preference observer after we have set the temporary recent
-  // files max for this test.
-  PreferenceObserver.init();
+  gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser);
+  const loaded = BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser);
+  BrowserTestUtils.loadURI(gBrowser, "data:text/html,<p>test recent files in Scratchpad");
+  await loaded;
+  await new Promise(openScratchpad);
 
-  gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser);
-  BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser).then(function() {
-    openScratchpad(startTest);
-  });
+  await testAddedToRecent();
+  await testHideMenu();
+  await testEnableMenu();
+  await testOpenDeletedFile();
+  await testClearAll();
 
-  BrowserTestUtils.loadURI(gBrowser, "data:text/html,<p>test recent files in Scratchpad");
-}
-
-function finishTest() {
   finish();
 }
--- a/devtools/server/actors/thread.js
+++ b/devtools/server/actors/thread.js
@@ -1729,25 +1729,16 @@ const ThreadActor = ActorClassWithSpec(t
     }
 
     // Preloaded WebExtension content scripts may be cached internally by
     // ExtensionContent.jsm and ThreadActor would ignore them on a page reload
     // because it finds them in the _debuggerSourcesSeen WeakSet,
     // and so we also need to be sure that there is still a source actor for the source.
     let sourceActor;
     if (this._debuggerSourcesSeen.has(source) && this.sources.hasSourceActor(source)) {
-      // When replaying, fall through and try to setup breakpoints, even for
-      // sources we have seen before. When replaying, we can have actors for
-      // sources that have not been created yet, and trying to set breakpoints
-      // in them will not produce any scripts. When execution proceeds to the
-      // point where the source is created (and we readd the source), we will
-      // be able to get its scripts.
-      if (!this.dbg.replaying) {
-        return false;
-      }
       sourceActor = this.sources.getSourceActor(source);
     } else {
       sourceActor = this.sources.createSourceActor(source);
     }
 
     if (this._onLoadBreakpointURLs.has(source.url)) {
       this.setBreakpoint({ sourceUrl: source.url, line: 1 }, {});
     }
new file mode 100644
--- /dev/null
+++ b/devtools/server/tests/unit/test_source-04.js
@@ -0,0 +1,80 @@
+/* -*- js-indent-level: 2; indent-tabs-mode: nil -*- */
+/* Any copyright is dedicated to the Public Domain.
+   http://creativecommons.org/publicdomain/zero/1.0/ */
+/* eslint-disable no-shadow, max-nested-callbacks */
+
+"use strict";
+
+const SOURCE_URL = getFileUrl("source-03.js");
+
+add_task(threadClientTest(async ({ threadClient, server }) => {
+  const promise = waitForNewSource(threadClient, SOURCE_URL);
+
+  // Create two globals in the default junk sandbox compartment so that
+  // both globals are part of the same compartment.
+  server.allowNewThreadGlobals();
+  const debuggee1 = Cu.Sandbox(systemPrincipal);
+  debuggee1.__name = "debuggee2.js";
+  const debuggee2 = Cu.Sandbox(systemPrincipal);
+  debuggee2.__name = "debuggee2.js";
+  server.disallowNewThreadGlobals();
+
+  // Load first copy of the source file. The first call to "loadSubScript" will
+  // create a ScriptSourceObject and a JSScript which references it.
+  loadSubScript(SOURCE_URL, debuggee1);
+
+  await promise;
+
+  // We want to set a breakpoint and make sure that the breakpoint is properly
+  // set on _both_ files backed
+  await setBreakpoint(threadClient, {
+    sourceUrl: SOURCE_URL,
+    line: 4,
+  });
+
+  const { sources } = await getSources(threadClient);
+  Assert.equal(sources.length, 1);
+
+  // Ensure that the breakpoint was properly applied to the JSScipt loaded
+  // in the first global.
+  let pausedOne = false;
+  threadClient.addOneTimeListener("paused", function(event, packet) {
+    pausedOne = true;
+    resume(threadClient);
+  });
+  Cu.evalInSandbox(
+    "init()",
+    debuggee1,
+    "1.8",
+    "test.js",
+    1
+  );
+  Assert.equal(pausedOne, true);
+
+  // Load second copy of the source file. The second call will attempt to
+  // re-use JSScript objects because that is what loadSubScript does for
+  // instances of the same file that are loaded in the system principal in
+  // the same compartment.
+  //
+  // We explicitly want this because it is an edge case of the server. Most
+  // of the time a Debugger.Source will only have a single Debugger.Script
+  // associated with a given function, but in the context of explicitly
+  // cloned JSScripts, this is not the case, and we need to handle that.
+  loadSubScript(SOURCE_URL, debuggee2);
+
+  // Ensure that the breakpoint was properly applied to the JSScipt loaded
+  // in the second global.
+  let pausedTwo = false;
+  threadClient.addOneTimeListener("paused", function(event, packet) {
+    pausedTwo = true;
+    resume(threadClient);
+  });
+  Cu.evalInSandbox(
+    "init()",
+    debuggee2,
+    "1.8",
+    "test.js",
+    1
+  );
+  Assert.equal(pausedTwo, true);
+}, { doNotRunWorker: true }));
--- a/devtools/server/tests/unit/xpcshell.ini
+++ b/devtools/server/tests/unit/xpcshell.ini
@@ -204,16 +204,17 @@ skip-if = true # breakpoint sliding is n
 [test_pause_exceptions-02.js]
 [test_pause_exceptions-03.js]
 [test_longstringactor.js]
 [test_longstringgrips-01.js]
 [test_longstringgrips-02.js]
 [test_source-01.js]
 [test_source-02.js]
 [test_source-03.js]
+[test_source-04.js]
 [test_wasm_source-01.js]
 [test_breakpoint-actor-map.js]
 skip-if = true # tests for breakpoint actors are obsolete bug 1524374
 [test_unsafeDereference.js]
 [test_add_actors.js]
 [test_ignore_caught_exceptions.js]
 [test_ignore_no_interface_exceptions.js]
 [test_requestTypes.js]
--- a/dom/base/nsFrameLoader.cpp
+++ b/dom/base/nsFrameLoader.cpp
@@ -175,17 +175,16 @@ nsFrameLoader::nsFrameLoader(Element* aO
       mNeedsAsyncDestroy(false),
       mInSwap(false),
       mInShow(false),
       mHideCalled(false),
       mNetworkCreated(aNetworkCreated),
       mLoadingOriginalSrc(false),
       mRemoteBrowserShown(false),
       mRemoteFrame(false),
-      mClampScrollPosition(true),
       mObservingOwnerContent(false) {
   mRemoteFrame = ShouldUseRemoteProcess();
   MOZ_ASSERT(!mRemoteFrame || !aOpener,
              "Cannot pass aOpener for a remote frame!");
 }
 
 nsFrameLoader::~nsFrameLoader() {
   if (mMessageManager) {
@@ -2364,38 +2363,16 @@ uint32_t nsFrameLoader::LazyHeight() con
   nsIFrame* frame = GetPrimaryFrameOfOwningContent();
   if (frame) {
     lazyHeight = frame->PresContext()->DevPixelsToIntCSSPixels(lazyHeight);
   }
 
   return lazyHeight;
 }
 
-void nsFrameLoader::SetClampScrollPosition(bool aClamp) {
-  mClampScrollPosition = aClamp;
-
-  // When turning clamping on, make sure the current position is clamped.
-  if (aClamp) {
-    nsIFrame* frame = GetPrimaryFrameOfOwningContent();
-    nsSubDocumentFrame* subdocFrame = do_QueryFrame(frame);
-    if (subdocFrame) {
-      nsIFrame* subdocRootFrame = subdocFrame->GetSubdocumentRootFrame();
-      if (subdocRootFrame) {
-        nsIScrollableFrame* subdocRootScrollFrame =
-            subdocRootFrame->PresShell()->GetRootScrollFrameAsScrollable();
-        if (subdocRootScrollFrame) {
-          subdocRootScrollFrame->ScrollTo(
-              subdocRootScrollFrame->GetScrollPosition(),
-              nsIScrollableFrame::INSTANT);
-        }
-      }
-    }
-  }
-}
-
 static Tuple<ContentParent*, TabParent*> GetContentParent(Element* aBrowser) {
   using ReturnTuple = Tuple<ContentParent*, TabParent*>;
 
   nsCOMPtr<nsIBrowser> browser = aBrowser ? aBrowser->AsBrowser() : nullptr;
   if (!browser) {
     return ReturnTuple(nullptr, nullptr);
   }
 
--- a/dom/base/nsFrameLoader.h
+++ b/dom/base/nsFrameLoader.h
@@ -188,19 +188,16 @@ class nsFrameLoader final : public nsStu
   already_AddRefed<Element> GetOwnerElement();
 
   uint32_t LazyWidth() const;
 
   uint32_t LazyHeight() const;
 
   uint64_t ChildID() const { return mChildID; }
 
-  bool ClampScrollPosition() const { return mClampScrollPosition; }
-  void SetClampScrollPosition(bool aClamp);
-
   bool DepthTooGreat() const { return mDepthTooGreat; }
 
   bool IsDead() const { return mDestroyCalled; }
 
   /**
    * Is this a frame loader for a bona fide <iframe mozbrowser>?
    * <xul:browser> is not a mozbrowser, so this is false for that case.
    */
@@ -299,18 +296,16 @@ class nsFrameLoader final : public nsStu
   mozilla::layers::LayersId GetLayersId() const;
 
   mozilla::dom::ChromeMessageSender* GetFrameMessageManager() {
     return mMessageManager;
   }
 
   mozilla::dom::Element* GetOwnerContent() { return mOwnerContent; }
 
-  bool ShouldClampScrollPosition() { return mClampScrollPosition; }
-
   mozilla::dom::ParentSHistory* GetParentSHistory() { return mParentSHistory; }
 
   /**
    * Tell this FrameLoader to use a particular remote browser.
    *
    * This will assert if mRemoteBrowser is non-null.  In practice,
    * this means you can't have successfully run TryRemoteBrowser() on
    * this object, which means you can't have called ShowRemoteFrame()
@@ -480,17 +475,16 @@ class nsFrameLoader final : public nsStu
   bool mNetworkCreated : 1;
 
   // True if a pending load corresponds to the original src (or srcdoc)
   // attribute of the frame element.
   bool mLoadingOriginalSrc : 1;
 
   bool mRemoteBrowserShown : 1;
   bool mRemoteFrame : 1;
-  bool mClampScrollPosition : 1;
   bool mObservingOwnerContent : 1;
 };
 
 NS_DEFINE_STATIC_IID_ACCESSOR(nsFrameLoader, NS_FRAMELOADER_IID)
 
 inline nsISupports* ToSupports(nsFrameLoader* aFrameLoader) {
   return aFrameLoader;
 }
--- a/dom/base/test/mochitest.ini
+++ b/dom/base/test/mochitest.ini
@@ -761,17 +761,16 @@ tags = audiochannel
 skip-if = toolkit == 'android' # Plugins don't work on Android
 [test_postMessage_solidus.html]
 [test_postMessages.html]
 support-files = worker_postMessages.js
 [test_postMessage_originAttributes.html]
 support-files = file_receiveMessage.html
 [test_processing_instruction_update_stylesheet.xhtml]
 [test_progress_events_for_gzip_data.html]
-skip-if = toolkit == 'android'
 [test_range_bounds.html]
 skip-if = toolkit == 'android'
 [test_reentrant_flush.html]
 skip-if = toolkit == 'android'
 [test_referrer_redirect.html]
 skip-if = (verify && debug)
 [test_root_iframe.html]
 [test_screen_orientation.html]
--- a/dom/media/CubebUtils.cpp
+++ b/dom/media/CubebUtils.cpp
@@ -49,17 +49,17 @@
 #define PREF_CUBEB_FORCE_NULL_CONTEXT "media.cubeb.force_null_context"
 // Hidden pref to disable BMO 1427011 experiment; can be removed once proven.
 #define PREF_CUBEB_DISABLE_DEVICE_SWITCHING \
   "media.cubeb.disable_device_switching"
 #define PREF_CUBEB_SANDBOX "media.cubeb.sandbox"
 #define PREF_AUDIOIPC_POOL_SIZE "media.audioipc.pool_size"
 #define PREF_AUDIOIPC_STACK_SIZE "media.audioipc.stack_size"
 
-#if (defined(XP_LINUX) && !defined(MOZ_WIDGET_ANDROID)) || defined(XP_MACOSX)
+#if (defined(XP_LINUX) && !defined(MOZ_WIDGET_ANDROID)) || defined(XP_MACOSX) || (defined(XP_WIN) && !defined(_ARM64_))
 #  define MOZ_CUBEB_REMOTING
 #endif
 
 extern "C" {
 
 // This must match AudioIpcInitParams in media/audioipc/client/src/lib.rs.
 // TODO: Generate this from the Rust definition rather than duplicating it.
 struct AudioIpcInitParams {
--- a/editor/libeditor/EditorBase.h
+++ b/editor/libeditor/EditorBase.h
@@ -94,74 +94,16 @@ class Element;
 class EventTarget;
 class Text;
 }  // namespace dom
 
 namespace widget {
 struct IMEState;
 }  // namespace widget
 
-/**
- * CachedWeakPtr stores a pointer to a class which inherits nsIWeakReference.
- * If the instance of the class has already been destroyed, this returns
- * nullptr.  Otherwise, returns cached pointer.
- * If class T inherits nsISupports a lot, specify Base explicitly for avoiding
- * ambiguous conversion to nsISupports.
- */
-template <class T, class Base = nsISupports>
-class CachedWeakPtr final {
- public:
-  CachedWeakPtr<T, Base>() : mCache(nullptr) {}
-  explicit CachedWeakPtr<T, Base>(T* aObject) {
-    mWeakPtr = do_GetWeakReference(static_cast<Base*>(aObject));
-    mCache = aObject;
-  }
-  explicit CachedWeakPtr<T, Base>(const nsCOMPtr<T>& aOther) {
-    mWeakPtr = do_GetWeakReference(static_cast<Base*>(aOther.get()));
-    mCache = aOther;
-  }
-  explicit CachedWeakPtr<T, Base>(already_AddRefed<T>& aOther) {
-    RefPtr<T> other = aOther;
-    mWeakPtr = do_GetWeakReference(static_cast<Base*>(other.get()));
-    mCache = other;
-  }
-
-  CachedWeakPtr<T, Base>& operator=(T* aObject) {
-    mWeakPtr = do_GetWeakReference(static_cast<Base*>(aObject));
-    mCache = aObject;
-    return *this;
-  }
-  CachedWeakPtr<T, Base>& operator=(const nsCOMPtr<T>& aOther) {
-    mWeakPtr = do_GetWeakReference(static_cast<Base*>(aOther.get()));
-    mCache = aOther;
-    return *this;
-  }
-  CachedWeakPtr<T, Base>& operator=(already_AddRefed<T>& aOther) {
-    RefPtr<T> other = aOther;
-    mWeakPtr = do_GetWeakReference(static_cast<Base*>(other.get()));
-    mCache = other;
-    return *this;
-  }
-
-  bool IsAlive() const { return mWeakPtr && mWeakPtr->IsAlive(); }
-
-  explicit operator bool() const { return mWeakPtr; }
-  operator T*() const { return get(); }
-  T* get() const {
-    if (mCache && !mWeakPtr->IsAlive()) {
-      const_cast<CachedWeakPtr<T, Base>*>(this)->mCache = nullptr;
-    }
-    return mCache;
-  }
-
- private:
-  nsWeakPtr mWeakPtr;
-  T* MOZ_NON_OWNING_REF mCache;
-};
-
 #define kMOZEditorBogusNodeAttrAtom nsGkAtoms::mozeditorbogusnode
 #define kMOZEditorBogusNodeValue NS_LITERAL_STRING("TRUE")
 
 /**
  * SplitAtEdges is for EditorBase::SplitNodeDeepWithTransaction(),
  * HTMLEditor::InsertNodeAtPoint()
  */
 enum class SplitAtEdges {
--- a/gfx/2d/ScaledFontDWrite.cpp
+++ b/gfx/2d/ScaledFontDWrite.cpp
@@ -399,20 +399,20 @@ bool UnscaledFontDWrite::GetWRFontDescri
 ScaledFontDWrite::InstanceData::InstanceData(
     const wr::FontInstanceOptions* aOptions,
     const wr::FontInstancePlatformOptions* aPlatformOptions)
     : mUseEmbeddedBitmap(false),
       mForceGDIMode(false),
       mGamma(2.2f),
       mContrast(1.0f) {
   if (aOptions) {
-    if (aOptions->flags & wr::FontInstanceFlags::EMBEDDED_BITMAPS) {
+    if (aOptions->flags & wr::FontInstanceFlags_EMBEDDED_BITMAPS) {
       mUseEmbeddedBitmap = true;
     }
-    if (aOptions->flags & wr::FontInstanceFlags::FORCE_GDI) {
+    if (aOptions->flags & wr::FontInstanceFlags_FORCE_GDI) {
       mForceGDIMode = true;
     }
   }
   if (aPlatformOptions) {
     mGamma = aPlatformOptions->gamma / 100.0f;
     mContrast = aPlatformOptions->contrast / 100.0f;
   }
 }
@@ -471,27 +471,27 @@ bool ScaledFontDWrite::GetFontInstanceDa
 }
 
 bool ScaledFontDWrite::GetWRFontInstanceOptions(
     Maybe<wr::FontInstanceOptions>* aOutOptions,
     Maybe<wr::FontInstancePlatformOptions>* aOutPlatformOptions,
     std::vector<FontVariation>* aOutVariations) {
   wr::FontInstanceOptions options;
   options.render_mode = wr::ToFontRenderMode(GetDefaultAAMode());
-  options.flags = 0;
+  options.flags = wr::FontInstanceFlags{0};
   if (mFontFace->GetSimulations() & DWRITE_FONT_SIMULATIONS_BOLD) {
-    options.flags |= wr::FontInstanceFlags::SYNTHETIC_BOLD;
+    options.flags |= wr::FontInstanceFlags_SYNTHETIC_BOLD;
   }
   if (UseEmbeddedBitmaps()) {
-    options.flags |= wr::FontInstanceFlags::EMBEDDED_BITMAPS;
+    options.flags |= wr::FontInstanceFlags_EMBEDDED_BITMAPS;
   }
   if (ForceGDIMode()) {
-    options.flags |= wr::FontInstanceFlags::FORCE_GDI;
+    options.flags |= wr::FontInstanceFlags_FORCE_GDI;
   } else {
-    options.flags |= wr::FontInstanceFlags::SUBPIXEL_POSITION;
+    options.flags |= wr::FontInstanceFlags_SUBPIXEL_POSITION;
   }
   options.bg_color = wr::ToColorU(Color());
   options.synthetic_italics =
       wr::DegreesToSyntheticItalics(GetSyntheticObliqueAngle());
 
   wr::FontInstancePlatformOptions platformOptions;
   platformOptions.gamma = uint16_t(std::round(mGamma * 100.0f));
   platformOptions.contrast =
--- a/gfx/2d/ScaledFontFontconfig.cpp
+++ b/gfx/2d/ScaledFontFontconfig.cpp
@@ -115,37 +115,37 @@ ScaledFontFontconfig::InstanceData::Inst
 ScaledFontFontconfig::InstanceData::InstanceData(
     const wr::FontInstanceOptions* aOptions,
     const wr::FontInstancePlatformOptions* aPlatformOptions)
     : mFlags(HINT_METRICS),
       mHintStyle(FC_HINT_FULL),
       mSubpixelOrder(FC_RGBA_UNKNOWN),
       mLcdFilter(FC_LCD_LEGACY) {
   if (aOptions) {
-    if (aOptions->flags & wr::FontInstanceFlags::FORCE_AUTOHINT) {
+    if (aOptions->flags & wr::FontInstanceFlags_FORCE_AUTOHINT) {
       mFlags |= AUTOHINT;
     }
-    if (aOptions->flags & wr::FontInstanceFlags::EMBEDDED_BITMAPS) {
+    if (aOptions->flags & wr::FontInstanceFlags_EMBEDDED_BITMAPS) {
       mFlags |= EMBEDDED_BITMAP;
     }
-    if (aOptions->flags & wr::FontInstanceFlags::SYNTHETIC_BOLD) {
+    if (aOptions->flags & wr::FontInstanceFlags_SYNTHETIC_BOLD) {
       mFlags |= EMBOLDEN;
     }
-    if (aOptions->flags & wr::FontInstanceFlags::VERTICAL_LAYOUT) {
+    if (aOptions->flags & wr::FontInstanceFlags_VERTICAL_LAYOUT) {
       mFlags |= VERTICAL_LAYOUT;
     }
     if (aOptions->render_mode != wr::FontRenderMode::Mono) {
       mFlags |= ANTIALIAS;
       if (aOptions->render_mode == wr::FontRenderMode::Subpixel) {
-        if (aOptions->flags & wr::FontInstanceFlags::SUBPIXEL_BGR) {
-          mSubpixelOrder = aOptions->flags & wr::FontInstanceFlags::LCD_VERTICAL
+        if (aOptions->flags & wr::FontInstanceFlags_SUBPIXEL_BGR) {
+          mSubpixelOrder = aOptions->flags & wr::FontInstanceFlags_LCD_VERTICAL
                                ? FC_RGBA_VBGR
                                : FC_RGBA_BGR;
         } else {
-          mSubpixelOrder = aOptions->flags & wr::FontInstanceFlags::LCD_VERTICAL
+          mSubpixelOrder = aOptions->flags & wr::FontInstanceFlags_LCD_VERTICAL
                                ? FC_RGBA_VRGB
                                : FC_RGBA_RGB;
         }
       }
     }
   }
   if (aPlatformOptions) {
     switch (aPlatformOptions->hinting) {
@@ -297,61 +297,61 @@ bool ScaledFontFontconfig::GetFontInstan
 
 bool ScaledFontFontconfig::GetWRFontInstanceOptions(
     Maybe<wr::FontInstanceOptions>* aOutOptions,
     Maybe<wr::FontInstancePlatformOptions>* aOutPlatformOptions,
     std::vector<FontVariation>* aOutVariations) {
   wr::FontInstanceOptions options;
   options.render_mode = wr::FontRenderMode::Alpha;
   // FIXME: Cairo-FT metrics are not compatible with subpixel positioning.
-  // options.flags = wr::FontInstanceFlags::SUBPIXEL_POSITION;
-  options.flags = 0;
+  // options.flags = wr::FontInstanceFlags_SUBPIXEL_POSITION;
+  options.flags = wr::FontInstanceFlags{0};
   options.bg_color = wr::ToColorU(Color());
   options.synthetic_italics =
       wr::DegreesToSyntheticItalics(GetSyntheticObliqueAngle());
 
   wr::FontInstancePlatformOptions platformOptions;
   platformOptions.lcd_filter = wr::FontLCDFilter::Legacy;
   platformOptions.hinting = wr::FontHinting::Normal;
 
   FcBool autohint;
   if (FcPatternGetBool(mPattern, FC_AUTOHINT, 0, &autohint) == FcResultMatch &&
       autohint) {
-    options.flags |= wr::FontInstanceFlags::FORCE_AUTOHINT;
+    options.flags |= wr::FontInstanceFlags_FORCE_AUTOHINT;
   }
   FcBool embolden;
   if (FcPatternGetBool(mPattern, FC_EMBOLDEN, 0, &embolden) == FcResultMatch &&
       embolden) {
-    options.flags |= wr::FontInstanceFlags::SYNTHETIC_BOLD;
+    options.flags |= wr::FontInstanceFlags_SYNTHETIC_BOLD;
   }
   FcBool vertical;
   if (FcPatternGetBool(mPattern, FC_VERTICAL_LAYOUT, 0, &vertical) ==
           FcResultMatch &&
       vertical) {
-    options.flags |= wr::FontInstanceFlags::VERTICAL_LAYOUT;
+    options.flags |= wr::FontInstanceFlags_VERTICAL_LAYOUT;
   }
 
   FcBool antialias;
   if (FcPatternGetBool(mPattern, FC_ANTIALIAS, 0, &antialias) !=
           FcResultMatch ||
       antialias) {
     int rgba;
     if (FcPatternGetInteger(mPattern, FC_RGBA, 0, &rgba) == FcResultMatch) {
       switch (rgba) {
         case FC_RGBA_RGB:
         case FC_RGBA_BGR:
         case FC_RGBA_VRGB:
         case FC_RGBA_VBGR:
           options.render_mode = wr::FontRenderMode::Subpixel;
           if (rgba == FC_RGBA_VRGB || rgba == FC_RGBA_VBGR) {
-            options.flags |= wr::FontInstanceFlags::LCD_VERTICAL;
+            options.flags |= wr::FontInstanceFlags_LCD_VERTICAL;
           }
           platformOptions.hinting = wr::FontHinting::LCD;
           if (rgba == FC_RGBA_BGR || rgba == FC_RGBA_VBGR) {
-            options.flags |= wr::FontInstanceFlags::SUBPIXEL_BGR;
+            options.flags |= wr::FontInstanceFlags_SUBPIXEL_BGR;
           }
           break;
         case FC_RGBA_NONE:
         case FC_RGBA_UNKNOWN:
         default:
           break;
       }
     }
@@ -379,22 +379,22 @@ bool ScaledFontFontconfig::GetWRFontInst
 
     // Match cairo-ft's handling of embeddedbitmap:
     // If AA is explicitly disabled, leave bitmaps enabled.
     // Otherwise, disable embedded bitmaps unless explicitly enabled.
     FcBool bitmap;
     if (FcPatternGetBool(mPattern, FC_EMBEDDED_BITMAP, 0, &bitmap) ==
             FcResultMatch &&
         bitmap) {
-      options.flags |= wr::FontInstanceFlags::EMBEDDED_BITMAPS;
+      options.flags |= wr::FontInstanceFlags_EMBEDDED_BITMAPS;
     }
   } else {
     options.render_mode = wr::FontRenderMode::Mono;
     platformOptions.hinting = wr::FontHinting::Mono;
-    options.flags |= wr::FontInstanceFlags::EMBEDDED_BITMAPS;
+    options.flags |= wr::FontInstanceFlags_EMBEDDED_BITMAPS;
   }
 
   FcBool hinting;
   int hintstyle;
   if (FcPatternGetBool(mPattern, FC_HINTING, 0, &hinting) != FcResultMatch ||
       hinting) {
     if (FcPatternGetInteger(mPattern, FC_HINT_STYLE, 0, &hintstyle) !=
         FcResultMatch) {
--- a/gfx/2d/ScaledFontFreeType.cpp
+++ b/gfx/2d/ScaledFontFreeType.cpp
@@ -50,18 +50,18 @@ bool ScaledFontFreeType::GetFontInstance
 
 bool ScaledFontFreeType::GetWRFontInstanceOptions(
     Maybe<wr::FontInstanceOptions>* aOutOptions,
     Maybe<wr::FontInstancePlatformOptions>* aOutPlatformOptions,
     std::vector<FontVariation>* aOutVariations) {
   wr::FontInstanceOptions options;
   options.render_mode = wr::FontRenderMode::Alpha;
   // FIXME: Cairo-FT metrics are not compatible with subpixel positioning.
-  // options.flags = wr::FontInstanceFlags::SUBPIXEL_POSITION;
-  options.flags = 0;
+  // options.flags = wr::FontInstanceFlags_SUBPIXEL_POSITION;
+  options.flags = wr::FontInstanceFlags{0};
   options.bg_color = wr::ToColorU(Color());
   options.synthetic_italics =
       wr::DegreesToSyntheticItalics(GetSyntheticObliqueAngle());
 
   wr::FontInstancePlatformOptions platformOptions;
   platformOptions.lcd_filter = wr::FontLCDFilter::None;
   platformOptions.hinting = wr::FontHinting::None;
 
--- a/gfx/2d/ScaledFontMac.cpp
+++ b/gfx/2d/ScaledFontMac.cpp
@@ -415,22 +415,22 @@ bool ScaledFontMac::GetFontInstanceData(
 bool ScaledFontMac::GetWRFontInstanceOptions(
     Maybe<wr::FontInstanceOptions>* aOutOptions,
     Maybe<wr::FontInstancePlatformOptions>* aOutPlatformOptions,
     std::vector<FontVariation>* aOutVariations) {
   GetVariationsForCTFont(mCTFont, aOutVariations);
 
   wr::FontInstanceOptions options;
   options.render_mode = wr::FontRenderMode::Subpixel;
-  options.flags = wr::FontInstanceFlags::SUBPIXEL_POSITION;
+  options.flags = wr::FontInstanceFlags_SUBPIXEL_POSITION;
   if (mUseFontSmoothing) {
-    options.flags |= wr::FontInstanceFlags::FONT_SMOOTHING;
+    options.flags |= wr::FontInstanceFlags_FONT_SMOOTHING;
   }
   if (mApplySyntheticBold) {
-    options.flags |= wr::FontInstanceFlags::SYNTHETIC_BOLD;
+    options.flags |= wr::FontInstanceFlags_SYNTHETIC_BOLD;
   }
   options.bg_color = wr::ToColorU(mFontSmoothingBackgroundColor);
   options.synthetic_italics =
       wr::DegreesToSyntheticItalics(GetSyntheticObliqueAngle());
   *aOutOptions = Some(options);
   return true;
 }
 
--- a/gfx/thebes/gfxFont.cpp
+++ b/gfx/thebes/gfxFont.cpp
@@ -1953,22 +1953,22 @@ bool gfxFont::DrawMissingGlyph(const Tex
   float advance = aDetails->mAdvance;
   if (aRunParams.drawMode != DrawMode::GLYPH_PATH && advance > 0) {
     auto* textDrawer = aRunParams.context->GetTextDrawer();
     const Matrix* matPtr = nullptr;
     Matrix mat;
     if (textDrawer) {
       // Generate an orientation matrix for the current writing mode
       wr::FontInstanceFlags flags = textDrawer->GetWRGlyphFlags();
-      if (flags.bits & wr::FontInstanceFlags::TRANSPOSE) {
+      if (flags & wr::FontInstanceFlags_TRANSPOSE) {
         std::swap(mat._11, mat._12);
         std::swap(mat._21, mat._22);
       }
-      mat.PostScale(flags.bits & wr::FontInstanceFlags::FLIP_X ? -1.0f : 1.0f,
-                    flags.bits & wr::FontInstanceFlags::FLIP_Y ? -1.0f : 1.0f);
+      mat.PostScale(flags & wr::FontInstanceFlags_FLIP_X ? -1.0f : 1.0f,
+                    flags & wr::FontInstanceFlags_FLIP_Y ? -1.0f : 1.0f);
       matPtr = &mat;
     }
 
     Point pt(Float(ToDeviceUnits(aPt.x, aRunParams.devPerApp)),
              Float(ToDeviceUnits(aPt.y, aRunParams.devPerApp)));
     Float advanceDevUnits = Float(ToDeviceUnits(advance, aRunParams.devPerApp));
     Float height = GetMetrics(eHorizontal).maxAscent;
     // Horizontally center if drawing vertically upright with no sideways
@@ -2133,21 +2133,21 @@ void gfxFont::Draw(const gfxTextRun* aTe
       // advance direction for sideways transforms.
       baselineDir *= -sidewaysDir;
 
       glyphFlagsRestore.Save(textDrawer);
       // Set the transform flags accordingly. Both sideways rotations transpose
       // X and Y, while left rotation flips the resulting Y axis, and right
       // rotation flips the resulting X axis.
       textDrawer->SetWRGlyphFlags(
-          textDrawer->GetWRGlyphFlags() | wr::FontInstanceFlags::TRANSPOSE |
+          textDrawer->GetWRGlyphFlags() | wr::FontInstanceFlags_TRANSPOSE |
           (aOrientation ==
                    gfx::ShapedTextFlags::TEXT_ORIENT_VERTICAL_SIDEWAYS_LEFT
-               ? wr::FontInstanceFlags::FLIP_Y
-               : wr::FontInstanceFlags::FLIP_X));
+               ? wr::FontInstanceFlags_FLIP_Y
+               : wr::FontInstanceFlags_FLIP_X));
     } else {
       // For non-WebRender targets, just push a rotation transform.
       matrixRestore.SetContext(aRunParams.context);
       gfxPoint p(aPt->x * aRunParams.devPerApp, aPt->y * aRunParams.devPerApp);
       // Get a matrix we can use to draw the (horizontally-shaped) textrun
       // with 90-degree CW rotation.
       const gfxFloat rotation = sidewaysDir * M_PI / 2.0f;
       gfxMatrix mat = aRunParams.context->CurrentMatrixDouble()
--- a/gfx/thebes/gfxPlatform.cpp
+++ b/gfx/thebes/gfxPlatform.cpp
@@ -536,47 +536,52 @@ void RecordingPrefChanged(const char* aP
   } else {
     Factory::SetGlobalEventRecorder(nullptr);
   }
 }
 
 #define WR_DEBUG_PREF "gfx.webrender.debug"
 
 static void WebRenderDebugPrefChangeCallback(const char* aPrefName, void*) {
-  int32_t flags = 0;
+  wr::DebugFlags flags{0};
 #define GFX_WEBRENDER_DEBUG(suffix, bit)                   \
   if (Preferences::GetBool(WR_DEBUG_PREF suffix, false)) { \
     flags |= (bit);                                        \
   }
 
-  // TODO: It would be nice to get the bit patterns directly from the rust code.
-  GFX_WEBRENDER_DEBUG(".profiler", 1 << 0)
-  GFX_WEBRENDER_DEBUG(".render-targets", 1 << 1)
-  GFX_WEBRENDER_DEBUG(".texture-cache", 1 << 2)
-  GFX_WEBRENDER_DEBUG(".gpu-time-queries", 1 << 3)
-  GFX_WEBRENDER_DEBUG(".gpu-sample-queries", 1 << 4)
-  GFX_WEBRENDER_DEBUG(".disable-batching", 1 << 5)
-  GFX_WEBRENDER_DEBUG(".epochs", 1 << 6)
-  GFX_WEBRENDER_DEBUG(".compact-profiler", 1 << 7)
-  GFX_WEBRENDER_DEBUG(".echo-driver-messages", 1 << 8)
-  GFX_WEBRENDER_DEBUG(".new-frame-indicator", 1 << 9)
-  GFX_WEBRENDER_DEBUG(".new-scene-indicator", 1 << 10)
-  GFX_WEBRENDER_DEBUG(".show-overdraw", 1 << 11)
-  GFX_WEBRENDER_DEBUG(".gpu-cache", 1 << 12)
-  GFX_WEBRENDER_DEBUG(".slow-frame-indicator", 1 << 13)
-  GFX_WEBRENDER_DEBUG(".texture-cache.clear-evicted", 1 << 14)
-  GFX_WEBRENDER_DEBUG(".picture-caching", 1 << 15)
-  GFX_WEBRENDER_DEBUG(".texture-cache.disable-shrink", 1 << 16)
-  GFX_WEBRENDER_DEBUG(".primitives", 1 << 17)
+  GFX_WEBRENDER_DEBUG(".profiler", wr::DebugFlags_PROFILER_DBG)
+  GFX_WEBRENDER_DEBUG(".render-targets", wr::DebugFlags_RENDER_TARGET_DBG)
+  GFX_WEBRENDER_DEBUG(".texture-cache", wr::DebugFlags_TEXTURE_CACHE_DBG)
+  GFX_WEBRENDER_DEBUG(".gpu-time-queries", wr::DebugFlags_GPU_TIME_QUERIES)
+  GFX_WEBRENDER_DEBUG(".gpu-sample-queries", wr::DebugFlags_GPU_SAMPLE_QUERIES)
+  GFX_WEBRENDER_DEBUG(".disable-batching", wr::DebugFlags_DISABLE_BATCHING)
+  GFX_WEBRENDER_DEBUG(".epochs", wr::DebugFlags_EPOCHS)
+  GFX_WEBRENDER_DEBUG(".compact-profiler", wr::DebugFlags_COMPACT_PROFILER)
+  GFX_WEBRENDER_DEBUG(".echo-driver-messages",
+                      wr::DebugFlags_ECHO_DRIVER_MESSAGES)
+  GFX_WEBRENDER_DEBUG(".new-frame-indicator",
+                      wr::DebugFlags_NEW_FRAME_INDICATOR)
+  GFX_WEBRENDER_DEBUG(".new-scene-indicator",
+                      wr::DebugFlags_NEW_SCENE_INDICATOR)
+  GFX_WEBRENDER_DEBUG(".show-overdraw", wr::DebugFlags_SHOW_OVERDRAW)
+  GFX_WEBRENDER_DEBUG(".gpu-cache", wr::DebugFlags_GPU_CACHE_DBG)
+  GFX_WEBRENDER_DEBUG(".slow-frame-indicator",
+                      wr::DebugFlags_SLOW_FRAME_INDICATOR)
+  GFX_WEBRENDER_DEBUG(".texture-cache.clear-evicted",
+                      wr::DebugFlags_TEXTURE_CACHE_DBG_CLEAR_EVICTED)
+  GFX_WEBRENDER_DEBUG(".picture-caching", wr::DebugFlags_PICTURE_CACHING_DBG)
+  GFX_WEBRENDER_DEBUG(".texture-cache.disable-shrink",
+                      wr::DebugFlags_TEXTURE_CACHE_DBG_DISABLE_SHRINK)
+  GFX_WEBRENDER_DEBUG(".primitives", wr::DebugFlags_PRIMITIVE_DBG)
   // Bit 18 is for the zoom display, which requires the mouse position and thus
   // currently only works in wrench.
-  GFX_WEBRENDER_DEBUG(".small-screen", 1 << 19)
+  GFX_WEBRENDER_DEBUG(".small-screen", wr::DebugFlags_SMALL_SCREEN)
 #undef GFX_WEBRENDER_DEBUG
 
-  gfx::gfxVars::SetWebRenderDebugFlags(flags);
+  gfx::gfxVars::SetWebRenderDebugFlags(flags.bits);
 }
 
 #if defined(USE_SKIA)
 static uint32_t GetSkiaGlyphCacheSize() {
   // Only increase font cache size on non-android to save memory.
 #  if !defined(MOZ_WIDGET_ANDROID)
   // 10mb as the default pref cache size on desktop due to talos perf tweaking.
   // Chromium uses 20mb and skia default uses 2mb.
@@ -874,17 +879,17 @@ void gfxPlatform::Init() {
     forcedPrefs.AppendPrintf(
         "-W%d%d%d%d%d%d%d%d", gfxPrefs::WebGLANGLEForceD3D11(),
         gfxPrefs::WebGLANGLEForceWARP(), gfxPrefs::WebGLDisabled(),
         gfxPrefs::WebGLDisableANGLE(), gfxPrefs::WebGLDXGLEnabled(),
         gfxPrefs::WebGLForceEnabled(), gfxPrefs::WebGLForceLayersReadback(),
         gfxPrefs::WebGLForceMSAA());
     // Prefs that don't fit into any of the other sections
     forcedPrefs.AppendPrintf("-T%d%d%d) ", gfxPrefs::AndroidRGB16Force(),
-                             0, // SkiaGL canvas no longer supported
+                             0,  // SkiaGL canvas no longer supported
                              gfxPrefs::ForceShmemTiles());
     ScopedGfxFeatureReporter::AppNote(forcedPrefs);
   }
 
   InitMoz2DLogging();
 
   gGfxPlatformPrefsLock = new Mutex("gfxPlatform::gGfxPlatformPrefsLock");
 
--- a/gfx/webrender_bindings/WebRenderAPI.cpp
+++ b/gfx/webrender_bindings/WebRenderAPI.cpp
@@ -322,18 +322,18 @@ WebRenderAPI::~WebRenderAPI() {
 
     wr_api_shut_down(mDocHandle);
   }
 
   wr_api_delete(mDocHandle);
 }
 
 void WebRenderAPI::UpdateDebugFlags(uint32_t aFlags) {
-  if (mDebugFlags.mBits != aFlags) {
-    mDebugFlags.mBits = aFlags;
+  if (mDebugFlags.bits != aFlags) {
+    mDebugFlags.bits = aFlags;
     wr_api_set_debug_flags(mDocHandle, mDebugFlags);
   }
 }
 
 void WebRenderAPI::SendTransaction(TransactionBuilder& aTxn) {
   UpdateDebugFlags(gfx::gfxVars::WebRenderDebugFlags());
   wr_api_send_transaction(mDocHandle, aTxn.Raw(), aTxn.UseSceneBuilderThread());
 }
--- a/gfx/webrender_bindings/WebRenderTypes.h
+++ b/gfx/webrender_bindings/WebRenderTypes.h
@@ -36,17 +36,16 @@ typedef uintptr_t usize;
 
 typedef wr::WrWindowId WindowId;
 typedef wr::WrPipelineId PipelineId;
 typedef wr::WrImageKey ImageKey;
 typedef wr::WrFontKey FontKey;
 typedef wr::WrFontInstanceKey FontInstanceKey;
 typedef wr::WrEpoch Epoch;
 typedef wr::WrExternalImageId ExternalImageId;
-typedef wr::WrDebugFlags DebugFlags;
 
 typedef mozilla::Maybe<mozilla::wr::IdNamespace> MaybeIdNamespace;
 typedef mozilla::Maybe<mozilla::wr::ImageMask> MaybeImageMask;
 typedef Maybe<ExternalImageId> MaybeExternalImageId;
 
 typedef Maybe<FontInstanceOptions> MaybeFontInstanceOptions;
 typedef Maybe<FontInstancePlatformOptions> MaybeFontInstancePlatformOptions;
 
@@ -54,19 +53,17 @@ struct ExternalImageKeyPair {
   ImageKey key;
   ExternalImageId id;
 };
 
 /* Generate a brand new window id and return it. */
 WindowId NewWindowId();
 
 inline DebugFlags NewDebugFlags(uint32_t aFlags) {
-  DebugFlags flags;
-  flags.mBits = aFlags;
-  return flags;
+  return {aFlags};
 }
 
 inline Maybe<wr::ImageFormat> SurfaceFormatToImageFormat(
     gfx::SurfaceFormat aFormat) {
   switch (aFormat) {
     case gfx::SurfaceFormat::R8G8B8X8:
       // WebRender not support RGBX8. Assert here.
       MOZ_ASSERT(false);
--- a/gfx/webrender_bindings/cbindgen.toml
+++ b/gfx/webrender_bindings/cbindgen.toml
@@ -10,18 +10,17 @@ autogen_warning = """/* DO NOT MODIFY TH
 include_version = true
 braces = "SameLine"
 line_length = 100
 tab_width = 2
 language = "C++"
 namespaces = ["mozilla", "wr"]
 
 [export]
-# Skip constants because we don't have any
-item_types = ["globals", "enums", "structs", "unions", "typedefs", "opaque", "functions"]
+item_types = ["globals", "enums", "structs", "unions", "typedefs", "opaque", "functions", "constants"]
 
 [parse]
 parse_deps = true
 include = ["log", "euclid", "webrender", "webrender_api"]
 
 [fn]
 prefix = "WR_INLINE"
 postfix = "WR_FUNC"
@@ -30,12 +29,15 @@ rename_args = "GeckoCase"
 
 [struct]
 derive_eq = true
 
 [enum]
 add_sentinel = true
 derive_helper_methods = true
 
+[macro_expansion]
+bitflags = true
+
 [defines]
 "target_os = windows" = "XP_WIN"
 "target_os = macos" = "XP_MACOSX"
 "target_os = android" = "ANDROID"
--- a/gfx/webrender_bindings/src/bindings.rs
+++ b/gfx/webrender_bindings/src/bindings.rs
@@ -772,17 +772,17 @@ impl ProfilerHooks for GeckoProfilerHook
 
     fn end_marker(&self, label: &CStr) {
         unsafe {
             gecko_profiler_end_marker(label.as_ptr());
         }
     }
 }
 
-const PROFILER_HOOKS: GeckoProfilerHooks = GeckoProfilerHooks {};
+static PROFILER_HOOKS: GeckoProfilerHooks = GeckoProfilerHooks {};
 
 #[allow(improper_ctypes)] // this is needed so that rustc doesn't complain about passing the &mut Transaction to an extern function
 extern "C" {
     // These callbacks are invoked from the scene builder thread (aka the APZ
     // updater thread)
     fn apz_register_updater(window_id: WrWindowId);
     fn apz_pre_scene_swap(window_id: WrWindowId);
     // This function takes ownership of the pipeline_info and is responsible for
@@ -1198,27 +1198,19 @@ pub unsafe extern "C" fn wr_api_shut_dow
     dh.api.shut_down();
 }
 
 #[no_mangle]
 pub unsafe extern "C" fn wr_api_notify_memory_pressure(dh: &mut DocumentHandle) {
     dh.api.notify_memory_pressure();
 }
 
-/// cbindgen:field-names=[mBits]
-#[repr(C)]
-pub struct WrDebugFlags {
-    bits: u32,
-}
-
 #[no_mangle]
-pub extern "C" fn wr_api_set_debug_flags(dh: &mut DocumentHandle, flags: WrDebugFlags) {
-    if let Some(dbg_flags) = DebugFlags::from_bits(flags.bits) {
-        dh.api.set_debug_flags(dbg_flags);
-    }
+pub extern "C" fn wr_api_set_debug_flags(dh: &mut DocumentHandle, flags: DebugFlags) {
+    dh.api.set_debug_flags(flags);
 }
 
 #[no_mangle]
 pub unsafe extern "C" fn wr_api_accumulate_memory_report(
     dh: &mut DocumentHandle,
     report: &mut MemoryReport
 ) {
     *report += dh.api.report_memory();
--- a/gfx/webrender_bindings/webrender_ffi.h
+++ b/gfx/webrender_bindings/webrender_ffi.h
@@ -59,70 +59,16 @@ namespace wr {
 // it. Work around that by re-declaring it here.
 #define DECLARE_MEMBER(id) uintptr_t id;
 struct InternerSubReport {
   WEBRENDER_FOR_EACH_INTERNER(DECLARE_MEMBER)
 };
 
 #undef DECLARE_MEMBER
 
-struct FontInstanceFlags {
-  uint32_t bits;
-
-  bool operator==(const FontInstanceFlags& aOther) const {
-    return bits == aOther.bits;
-  }
-
-  FontInstanceFlags& operator=(uint32_t aBits) {
-    bits = aBits;
-    return *this;
-  }
-
-  FontInstanceFlags& operator|=(uint32_t aBits) {
-    bits |= aBits;
-    return *this;
-  }
-
-  FontInstanceFlags operator|(uint32_t aBits) const {
-    FontInstanceFlags flags = {bits | aBits};
-    return flags;
-  }
-
-  FontInstanceFlags& operator&=(uint32_t aBits) {
-    bits &= aBits;
-    return *this;
-  }
-
-  FontInstanceFlags operator&(uint32_t aBits) const {
-    FontInstanceFlags flags = {bits & aBits};
-    return flags;
-  }
-
-  MOZ_IMPLICIT operator bool() const { return bits != 0; }
-
-  enum : uint32_t {
-    SYNTHETIC_BOLD = 1 << 1,
-    EMBEDDED_BITMAPS = 1 << 2,
-    SUBPIXEL_BGR = 1 << 3,
-    TRANSPOSE = 1 << 4,
-    FLIP_X = 1 << 5,
-    FLIP_Y = 1 << 6,
-    SUBPIXEL_POSITION = 1 << 7,
-
-    FORCE_GDI = 1 << 16,
-
-    FONT_SMOOTHING = 1 << 16,
-
-    FORCE_AUTOHINT = 1 << 16,
-    NO_AUTOHINT = 1 << 17,
-    VERTICAL_LAYOUT = 1 << 18,
-    LCD_VERTICAL = 1 << 19
-  };
-};
-
 struct Transaction;
 struct WrWindowId;
 struct WrPipelineInfo;
 
 const uint64_t ROOT_CLIP_CHAIN = ~0;
 
 }  // namespace wr
 }  // namespace mozilla
--- a/gfx/wr/webrender_api/src/api.rs
+++ b/gfx/wr/webrender_api/src/api.rs
@@ -1003,16 +1003,17 @@ impl RenderApiSender {
             payload_sender: self.payload_sender.clone(),
             namespace_id,
             next_id: Cell::new(ResourceId(0)),
         }
     }
 }
 
 bitflags! {
+    #[repr(C)]
     #[derive(Default, Deserialize, MallocSizeOf, Serialize)]
     pub struct DebugFlags: u32 {
         /// Display the frame profiler on screen.
         const PROFILER_DBG          = 1 << 0;
         /// Display intermediate render targets on screen.
         const RENDER_TARGET_DBG     = 1 << 1;
         /// Display all texture cache pages on screen.
         const TEXTURE_CACHE_DBG     = 1 << 2;
--- a/gfx/wr/webrender_api/src/color.rs
+++ b/gfx/wr/webrender_api/src/color.rs
@@ -18,19 +18,19 @@ pub struct PremultipliedColorF {
     pub r: f32,
     pub g: f32,
     pub b: f32,
     pub a: f32,
 }
 
 #[allow(missing_docs)]
 impl PremultipliedColorF {
-    pub const BLACK: Self = PremultipliedColorF { r: 0.0, g: 0.0, b: 0.0, a: 1.0 };
-    pub const TRANSPARENT: Self = PremultipliedColorF { r: 0.0, g: 0.0, b: 0.0, a: 0.0 };
-    pub const WHITE: Self = PremultipliedColorF { r: 1.0, g: 1.0, b: 1.0, a: 1.0 };
+    pub const BLACK: PremultipliedColorF = PremultipliedColorF { r: 0.0, g: 0.0, b: 0.0, a: 1.0 };
+    pub const TRANSPARENT: PremultipliedColorF = PremultipliedColorF { r: 0.0, g: 0.0, b: 0.0, a: 0.0 };
+    pub const WHITE: PremultipliedColorF = PremultipliedColorF { r: 1.0, g: 1.0, b: 1.0, a: 1.0 };
 
     pub fn to_array(&self) -> [f32; 4] {
         [self.r, self.g, self.b, self.a]
     }
 }
 
 /// Represents RGBA screen colors with floating point numbers.
 ///
@@ -42,19 +42,19 @@ pub struct ColorF {
     pub r: f32,
     pub g: f32,
     pub b: f32,
     pub a: f32,
 }
 
 #[allow(missing_docs)]
 impl ColorF {
-    pub const BLACK: Self = ColorF { r: 0.0, g: 0.0, b: 0.0, a: 1.0 };
-    pub const TRANSPARENT: Self = ColorF { r: 0.0, g: 0.0, b: 0.0, a: 0.0 };
-    pub const WHITE: Self = ColorF { r: 1.0, g: 1.0, b: 1.0, a: 1.0 };
+    pub const BLACK: ColorF = ColorF { r: 0.0, g: 0.0, b: 0.0, a: 1.0 };
+    pub const TRANSPARENT: ColorF = ColorF { r: 0.0, g: 0.0, b: 0.0, a: 0.0 };
+    pub const WHITE: ColorF = ColorF { r: 1.0, g: 1.0, b: 1.0, a: 1.0 };
 
     /// Constructs a new `ColorF` from its components.
     pub fn new(r: f32, g: f32, b: f32, a: f32) -> Self {
         ColorF { r, g, b, a }
     }
 
     /// Multiply the RGB channels (but not alpha) with a given factor.
     pub fn scale_rgb(&self, scale: f32) -> Self {
--- a/js/public/ContextOptions.h
+++ b/js/public/ContextOptions.h
@@ -14,25 +14,19 @@
 struct JSContext;
 
 namespace JS {
 
 class JS_PUBLIC_API ContextOptions {
  public:
   ContextOptions()
       : baseline_(true),
-#ifdef JS_CODEGEN_ARM64
-        ion_(false),
-        asmJS_(false),
-        wasm_(false),
-#else
         ion_(true),
         asmJS_(true),
         wasm_(true),
-#endif
         wasmVerbose_(false),
         wasmBaseline_(true),
         wasmIon_(true),
 #ifdef ENABLE_WASM_CRANELIFT
         wasmCranelift_(false),
 #endif
 #ifdef ENABLE_WASM_REFTYPES
         wasmGc_(false),
--- a/js/src/builtin/RegExp.cpp
+++ b/js/src/builtin/RegExp.cpp
@@ -778,19 +778,17 @@ const JSPropertySpec js::regexp_properti
 
 const JSFunctionSpec js::regexp_methods[] = {
     JS_SELF_HOSTED_FN(js_toSource_str, "RegExpToString", 0, 0),
     JS_SELF_HOSTED_FN(js_toString_str, "RegExpToString", 0, 0),
     JS_FN("compile", regexp_compile, 2, 0),
     JS_SELF_HOSTED_FN("exec", "RegExp_prototype_Exec", 1, 0),
     JS_SELF_HOSTED_FN("test", "RegExpTest", 1, 0),
     JS_SELF_HOSTED_SYM_FN(match, "RegExpMatch", 1, 0),
-#ifdef NIGHTLY_BUILD
     JS_SELF_HOSTED_SYM_FN(matchAll, "RegExpMatchAll", 1, 0),
-#endif
     JS_SELF_HOSTED_SYM_FN(replace, "RegExpReplace", 2, 0),
     JS_SELF_HOSTED_SYM_FN(search, "RegExpSearch", 1, 0),
     JS_SELF_HOSTED_SYM_FN(split, "RegExpSplit", 2, 0),
     JS_FS_END};
 
 #define STATIC_PAREN_GETTER_CODE(parenNum)                        \
   if (!res->createParen(cx, parenNum, args.rval())) return false; \
   if (args.rval().isUndefined())                                  \
--- a/js/src/builtin/String.cpp
+++ b/js/src/builtin/String.cpp
@@ -3372,19 +3372,17 @@ static const JSFunctionSpec string_metho
 #endif
     JS_SELF_HOSTED_FN("repeat", "String_repeat", 1, 0),
 #if EXPOSE_INTL_API
     JS_FN("normalize", str_normalize, 0, 0),
 #endif
 
     /* Perl-ish methods (search is actually Python-esque). */
     JS_SELF_HOSTED_FN("match", "String_match", 1, 0),
-#ifdef NIGHTLY_BUILD
     JS_SELF_HOSTED_FN("matchAll", "String_matchAll", 1, 0),
-#endif
     JS_SELF_HOSTED_FN("search", "String_search", 1, 0),
     JS_SELF_HOSTED_FN("replace", "String_replace", 2, 0),
     JS_SELF_HOSTED_FN("split", "String_split", 2, 0),
     JS_SELF_HOSTED_FN("substr", "String_substr", 2, 0),
 
     /* Python-esque sequence methods. */
     JS_FN("concat", str_concat, 1, 0),
     JS_SELF_HOSTED_FN("slice", "String_slice", 2, 0),
--- a/js/src/builtin/Symbol.cpp
+++ b/js/src/builtin/Symbol.cpp
@@ -60,21 +60,16 @@ JSObject* SymbolObject::initClass(JSCont
 
   if (defineMembers) {
     // Define the well-known symbol properties, such as Symbol.iterator.
     ImmutablePropertyNamePtr* names = cx->names().wellKnownSymbolNames();
     RootedValue value(cx);
     unsigned attrs = JSPROP_READONLY | JSPROP_PERMANENT;
     WellKnownSymbols* wks = cx->runtime()->wellKnownSymbols;
     for (size_t i = 0; i < JS::WellKnownSymbolLimit; i++) {
-#ifndef NIGHTLY_BUILD
-      if (i == static_cast<size_t>(SymbolCode::matchAll)) {
-        continue;
-      }
-#endif
       value.setSymbol(wks->get(i));
       if (!NativeDefineDataProperty(cx, ctor, names[i], value, attrs)) {
         return nullptr;
       }
     }
   }
 
   if (!LinkConstructorAndPrototype(cx, ctor, proto)) {
--- a/js/src/builtin/TestingFunctions.cpp
+++ b/js/src/builtin/TestingFunctions.cpp
@@ -1652,27 +1652,26 @@ static bool NewRope(JSContext* cx, unsig
     if (!JS_GetProperty(cx, options, "nursery", &v)) {
       return false;
     }
     if (!v.isUndefined() && !ToBoolean(v)) {
       heap = js::gc::TenuredHeap;
     }
   }
 
-  JSString* left = args[0].toString();
-  JSString* right = args[1].toString();
+  RootedString left(cx, args[0].toString());
+  RootedString right(cx, args[1].toString());
   size_t length = JS_GetStringLength(left) + JS_GetStringLength(right);
   if (length > JSString::MAX_LENGTH) {
     JS_ReportErrorASCII(cx, "rope length exceeds maximum string length");
     return false;
   }
 
-  Rooted<JSRope*> str(cx, JSRope::new_<NoGC>(cx, left, right, length, heap));
+  Rooted<JSRope*> str(cx, JSRope::new_<CanGC>(cx, left, right, length, heap));
   if (!str) {
-    JS_ReportOutOfMemory(cx);
     return false;
   }
 
   args.rval().setString(str);
   return true;
 }
 
 static bool IsRope(JSContext* cx, unsigned argc, Value* vp) {
--- a/js/src/shell/js.cpp
+++ b/js/src/shell/js.cpp
@@ -9835,35 +9835,24 @@ static MOZ_MUST_USE bool ProcessArgs(JSC
     }
   }
 
   return true;
 }
 
 static bool SetContextOptions(JSContext* cx, const OptionParser& op) {
   enableBaseline = !op.getBoolOption("no-baseline");
-#ifdef JS_CODEGEN_ARM64
-  // TODO: Enable Ion by default.
-  enableIon = false;
-  enableAsmJS = false;
-#else
   enableIon = !op.getBoolOption("no-ion");
   enableAsmJS = !op.getBoolOption("no-asmjs");
-#endif
   enableNativeRegExp = !op.getBoolOption("no-native-regexp");
 
   // Default values for wasm.
   enableWasm = true;
   enableWasmBaseline = true;
-#ifdef JS_CODEGEN_ARM64
-  // TODO: Enable WasmIon by default.
-  enableWasmIon = false;
-#else
   enableWasmIon = true;
-#endif
   if (const char* str = op.getStringOption("wasm-compiler")) {
     if (strcmp(str, "none") == 0) {
       enableWasm = false;
     } else if (strcmp(str, "baseline") == 0) {
       // Baseline is enabled by default.
       enableWasmIon = false;
     } else if (strcmp(str, "ion") == 0) {
       // Ion is enabled by default.
--- a/js/src/tests/test262-update.py
+++ b/js/src/tests/test262-update.py
@@ -38,18 +38,16 @@ UNSUPPORTED_FEATURES = set([
     "Intl.Segmenter",
     "Intl.NumberFormat-unified",
 ])
 FEATURE_CHECK_NEEDED = {
     "Atomics": "!this.hasOwnProperty('Atomics')",
     "BigInt": "!this.hasOwnProperty('BigInt')",
     "SharedArrayBuffer": "!this.hasOwnProperty('SharedArrayBuffer')",
     "dynamic-import": "!xulRuntime.shell",
-    "String.prototype.matchAll": "!String.prototype.hasOwnProperty('matchAll')",
-    "Symbol.matchAll": "!Symbol.hasOwnProperty('matchAll')",
 }
 RELEASE_OR_BETA = set()
 
 
 @contextlib.contextmanager
 def TemporaryDirectory():
     tmpDir = tempfile.mkdtemp()
     try:
@@ -293,16 +291,21 @@ def convertTestFile(test262parser, testS
 
             featureCheckNeeded = [f for f in testRec["features"] if f in FEATURE_CHECK_NEEDED]
             if featureCheckNeeded:
                 refTestSkipIf.append(("||".join([FEATURE_CHECK_NEEDED[f]
                                                  for f in featureCheckNeeded]),
                                       "%s is not enabled unconditionally" % ",".join(
                                           featureCheckNeeded)))
 
+            if "Atomics" in testRec["features"] and "SharedArrayBuffer" in testRec["features"]:
+                refTestSkipIf.append(("(this.hasOwnProperty('getBuildConfiguration')"
+                                      "&&getBuildConfiguration()['arm64-simulator'])",
+                                     "ARM64 Simulator cannot emulate atomics"))
+
     # Includes for every test file in a directory is collected in a single
     # shell.js file per directory level. This is done to avoid adding all
     # test harness files to the top level shell.js file.
     if "includes" in testRec:
         assert not raw, "Raw test with includes: %s" % testName
         includeSet.update(testRec["includes"])
 
     # Add reportCompare() after all positive, synchronous tests.
--- a/js/src/tests/test262/built-ins/Atomics/add/bad-range.js
+++ b/js/src/tests/test262/built-ins/Atomics/add/bad-range.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.add
 description: >
   Test range checking of Atomics.add on arrays that allow atomic operations
 includes: [testAtomics.js, testTypedArray.js]
--- a/js/src/tests/test262/built-ins/Atomics/add/bigint/bad-range.js
+++ b/js/src/tests/test262/built-ins/Atomics/add/bigint/bad-range.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Rick Waldron. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: sec-atomics.add
 description: >
   Test range checking of Atomics.add on arrays that allow atomic operations
 includes: [testAtomics.js, testBigIntTypedArray.js]
 features: [ArrayBuffer, Atomics, BigInt, DataView, SharedArrayBuffer, Symbol, TypedArray]
--- a/js/src/tests/test262/built-ins/Atomics/add/bigint/good-views.js
+++ b/js/src/tests/test262/built-ins/Atomics/add/bigint/good-views.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Rick Waldron. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: sec-atomics.add
 description: Test Atomics.add on arrays that allow atomic operations.
 includes: [testAtomics.js, testBigIntTypedArray.js]
 features: [ArrayBuffer, Atomics, BigInt, DataView, SharedArrayBuffer, Symbol, TypedArray]
 ---*/
--- a/js/src/tests/test262/built-ins/Atomics/add/expected-return-value.js
+++ b/js/src/tests/test262/built-ins/Atomics/add/expected-return-value.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Rick Waldron.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.add
 description: >
   Atomics.add returns the value that existed at the
   index prior to the operation.
--- a/js/src/tests/test262/built-ins/Atomics/add/good-views.js
+++ b/js/src/tests/test262/built-ins/Atomics/add/good-views.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.add
 description: Test Atomics.add on arrays that allow atomic operations.
 includes: [testAtomics.js, testTypedArray.js]
 features: [ArrayBuffer, Atomics, DataView, SharedArrayBuffer, Symbol, TypedArray]
--- a/js/src/tests/test262/built-ins/Atomics/add/non-views.js
+++ b/js/src/tests/test262/built-ins/Atomics/add/non-views.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.add
 description: >
   Test Atomics.add on view values other than TypedArrays
 includes: [testAtomics.js]
--- a/js/src/tests/test262/built-ins/Atomics/add/shared-nonint-views.js
+++ b/js/src/tests/test262/built-ins/Atomics/add/shared-nonint-views.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.add
 description: >
   Test Atomics.add on shared non-integer TypedArrays
 includes: [testTypedArray.js]
--- a/js/src/tests/test262/built-ins/Atomics/and/bad-range.js
+++ b/js/src/tests/test262/built-ins/Atomics/and/bad-range.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.and
 description: >
   Test range checking of Atomics.and on arrays that allow atomic operations
 includes: [testAtomics.js, testTypedArray.js]
--- a/js/src/tests/test262/built-ins/Atomics/and/bigint/bad-range.js
+++ b/js/src/tests/test262/built-ins/Atomics/and/bigint/bad-range.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Rick Waldron. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: sec-atomics.and
 description: >
   Test range checking of Atomics.and on arrays that allow atomic operations
 includes: [testAtomics.js, testBigIntTypedArray.js]
 features: [ArrayBuffer, Atomics, BigInt, DataView, SharedArrayBuffer, Symbol, TypedArray]
--- a/js/src/tests/test262/built-ins/Atomics/and/bigint/good-views.js
+++ b/js/src/tests/test262/built-ins/Atomics/and/bigint/good-views.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Rick Waldron. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: sec-atomics.and
 description: Test Atomics.and on arrays that allow atomic operations
 includes: [testAtomics.js, testBigIntTypedArray.js]
 features: [ArrayBuffer, Atomics, BigInt, DataView, SharedArrayBuffer, Symbol, TypedArray]
 ---*/
--- a/js/src/tests/test262/built-ins/Atomics/and/expected-return-value.js
+++ b/js/src/tests/test262/built-ins/Atomics/and/expected-return-value.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Rick Waldron.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.and
 description: >
   Atomics.and returns the value that existed at the
   index prior to the operation.
--- a/js/src/tests/test262/built-ins/Atomics/and/good-views.js
+++ b/js/src/tests/test262/built-ins/Atomics/and/good-views.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.and
 description: Test Atomics.and on arrays that allow atomic operations
 includes: [testAtomics.js, testTypedArray.js]
 features: [ArrayBuffer, Atomics, DataView, SharedArrayBuffer, Symbol, TypedArray]
--- a/js/src/tests/test262/built-ins/Atomics/and/non-views.js
+++ b/js/src/tests/test262/built-ins/Atomics/and/non-views.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.and
 description: >
   Test Atomics.and on view values other than TypedArrays
 includes: [testAtomics.js]
--- a/js/src/tests/test262/built-ins/Atomics/and/shared-nonint-views.js
+++ b/js/src/tests/test262/built-ins/Atomics/and/shared-nonint-views.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.and
 description: >
   Test Atomics.and on shared non-integer TypedArrays
 includes: [testTypedArray.js]
--- a/js/src/tests/test262/built-ins/Atomics/compareExchange/bad-range.js
+++ b/js/src/tests/test262/built-ins/Atomics/compareExchange/bad-range.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.compareexchange
 description: >
   Test range checking of Atomics.compareExchange on arrays that allow atomic operations
 includes: [testAtomics.js, testTypedArray.js]
--- a/js/src/tests/test262/built-ins/Atomics/compareExchange/bigint/bad-range.js
+++ b/js/src/tests/test262/built-ins/Atomics/compareExchange/bigint/bad-range.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Rick Waldron. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: sec-atomics.compareexchange
 description: >
   Test range checking of Atomics.compareExchange on arrays that allow atomic operations
 includes: [testAtomics.js, testBigIntTypedArray.js]
 features: [ArrayBuffer, Atomics, BigInt, DataView, SharedArrayBuffer, Symbol, TypedArray]
--- a/js/src/tests/test262/built-ins/Atomics/compareExchange/bigint/good-views.js
+++ b/js/src/tests/test262/built-ins/Atomics/compareExchange/bigint/good-views.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Rick Waldron. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: sec-atomics.compareexchange
 description: Test Atomics.compareExchange on arrays that allow atomic operations.
 includes: [testAtomics.js, testBigIntTypedArray.js]
 features: [ArrayBuffer, Atomics, BigInt, DataView, SharedArrayBuffer, Symbol, TypedArray]
 ---*/
--- a/js/src/tests/test262/built-ins/Atomics/compareExchange/expected-return-value.js
+++ b/js/src/tests/test262/built-ins/Atomics/compareExchange/expected-return-value.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Rick Waldron.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.compareExchange
 description: >
   Atomics.compareExchange returns the value that existed at the
   index prior to the operation.
--- a/js/src/tests/test262/built-ins/Atomics/compareExchange/good-views.js
+++ b/js/src/tests/test262/built-ins/Atomics/compareExchange/good-views.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.compareexchange
 description: Test Atomics.compareExchange on arrays that allow atomic operations.
 includes: [testAtomics.js, testTypedArray.js]
 features: [ArrayBuffer, Atomics, DataView, SharedArrayBuffer, Symbol, TypedArray]
--- a/js/src/tests/test262/built-ins/Atomics/compareExchange/non-views.js
+++ b/js/src/tests/test262/built-ins/Atomics/compareExchange/non-views.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.compareexchange
 description: >
   Test Atomics.compareExchange on view values other than TypedArrays
 includes: [testAtomics.js]
--- a/js/src/tests/test262/built-ins/Atomics/compareExchange/shared-nonint-views.js
+++ b/js/src/tests/test262/built-ins/Atomics/compareExchange/shared-nonint-views.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.compareexchange
 description: >
   Test Atomics.compareExchange on shared non-integer TypedArrays
 includes: [testTypedArray.js]
--- a/js/src/tests/test262/built-ins/Atomics/exchange/bad-range.js
+++ b/js/src/tests/test262/built-ins/Atomics/exchange/bad-range.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.exchange
 description: >
   Test range checking of Atomics.exchange on arrays that allow atomic operations
 includes: [testAtomics.js, testTypedArray.js]
--- a/js/src/tests/test262/built-ins/Atomics/exchange/bigint/bad-range.js
+++ b/js/src/tests/test262/built-ins/Atomics/exchange/bigint/bad-range.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Rick Waldron. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: sec-atomics.exchange
 description: >
   Test range checking of Atomics.exchange on arrays that allow atomic operations
 includes: [testAtomics.js, testBigIntTypedArray.js]
 features: [ArrayBuffer, Atomics, BigInt, DataView, SharedArrayBuffer, Symbol, TypedArray]
--- a/js/src/tests/test262/built-ins/Atomics/exchange/bigint/good-views.js
+++ b/js/src/tests/test262/built-ins/Atomics/exchange/bigint/good-views.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Rick Waldron. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: sec-atomics.exchange
 description: Test Atomics.exchange on arrays that allow atomic operations.
 includes: [testAtomics.js, testBigIntTypedArray.js]
 features: [ArrayBuffer, Atomics, BigInt, DataView, SharedArrayBuffer, Symbol, TypedArray]
 ---*/
--- a/js/src/tests/test262/built-ins/Atomics/exchange/expected-return-value.js
+++ b/js/src/tests/test262/built-ins/Atomics/exchange/expected-return-value.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Rick Waldron.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.exchange
 description: >
   Atomics.and returns the value that existed at the
   index prior to the operation.
--- a/js/src/tests/test262/built-ins/Atomics/exchange/good-views.js
+++ b/js/src/tests/test262/built-ins/Atomics/exchange/good-views.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.exchange
 description: Test Atomics.exchange on arrays that allow atomic operations.
 includes: [testAtomics.js, testTypedArray.js]
 features: [ArrayBuffer, Atomics, DataView, SharedArrayBuffer, Symbol, TypedArray]
--- a/js/src/tests/test262/built-ins/Atomics/exchange/non-views.js
+++ b/js/src/tests/test262/built-ins/Atomics/exchange/non-views.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.exchange
 description: >
   Test Atomics.exchange on view values other than TypedArrays
 includes: [testAtomics.js]
--- a/js/src/tests/test262/built-ins/Atomics/exchange/shared-nonint-views.js
+++ b/js/src/tests/test262/built-ins/Atomics/exchange/shared-nonint-views.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.exchange
 description: >
   Test Atomics.exchange on shared non-integer TypedArrays
 includes: [testTypedArray.js]
--- a/js/src/tests/test262/built-ins/Atomics/isLockFree/bigint/expected-return-value.js
+++ b/js/src/tests/test262/built-ins/Atomics/isLockFree/bigint/expected-return-value.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Rick Waldron.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.isLockFree
 description: >
   Atomics.isLockFree returns a boolean that indicates whether
   operations on datum of size will be performed without the agent
--- a/js/src/tests/test262/built-ins/Atomics/load/bad-range.js
+++ b/js/src/tests/test262/built-ins/Atomics/load/bad-range.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.load
 description: >
   Test range checking of Atomics.load on arrays that allow atomic operations
 includes: [testAtomics.js, testTypedArray.js]
--- a/js/src/tests/test262/built-ins/Atomics/load/bigint/bad-range.js
+++ b/js/src/tests/test262/built-ins/Atomics/load/bigint/bad-range.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Rick Waldron. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.load
 description: >
   Test range checking of Atomics.load on arrays that allow atomic operations
 includes: [testAtomics.js, testBigIntTypedArray.js]
--- a/js/src/tests/test262/built-ins/Atomics/load/bigint/good-views.js
+++ b/js/src/tests/test262/built-ins/Atomics/load/bigint/good-views.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Rick Waldron. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: sec-atomics.load
 description: Test Atomics.load on arrays that allow atomic operations.
 includes: [testAtomics.js, testBigIntTypedArray.js]
 features: [ArrayBuffer, Atomics, BigInt, DataView, SharedArrayBuffer, Symbol, TypedArray]
 ---*/
--- a/js/src/tests/test262/built-ins/Atomics/load/expected-return-value.js
+++ b/js/src/tests/test262/built-ins/Atomics/load/expected-return-value.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Rick Waldron.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.load
 description: >
   Atomics.load returns the value that existed at the
   index prior to the operation.
--- a/js/src/tests/test262/built-ins/Atomics/load/good-views.js
+++ b/js/src/tests/test262/built-ins/Atomics/load/good-views.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.load
 description: Test Atomics.load on arrays that allow atomic operations.
 includes: [testAtomics.js, testTypedArray.js]
 features: [ArrayBuffer, Atomics, DataView, SharedArrayBuffer, Symbol, TypedArray]
--- a/js/src/tests/test262/built-ins/Atomics/load/non-views.js
+++ b/js/src/tests/test262/built-ins/Atomics/load/non-views.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.load
 description: >
   Test Atomics.load on view values other than TypedArrays
 includes: [testAtomics.js]
--- a/js/src/tests/test262/built-ins/Atomics/load/shared-nonint-views.js
+++ b/js/src/tests/test262/built-ins/Atomics/load/shared-nonint-views.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.load
 description: >
   Test Atomics.load on shared non-integer TypedArrays
 includes: [testTypedArray.js]
--- a/js/src/tests/test262/built-ins/Atomics/notify/bad-range.js
+++ b/js/src/tests/test262/built-ins/Atomics/notify/bad-range.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.notify
 description: >
   Test range checking of Atomics.notify on arrays that allow atomic operations
 info: |
--- a/js/src/tests/test262/built-ins/Atomics/notify/bigint/bad-range.js
+++ b/js/src/tests/test262/built-ins/Atomics/notify/bigint/bad-range.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Rick Waldron. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.notify
 description: >
   Test range checking of Atomics.notify on arrays that allow atomic operations
 info: |
--- a/js/src/tests/test262/built-ins/Atomics/notify/bigint/notify-all-on-loc.js
+++ b/js/src/tests/test262/built-ins/Atomics/notify/bigint/notify-all-on-loc.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.notify
 description: >
   Test that Atomics.notify notifies all waiters on a location, but does not
   notify waiters on other locations.
--- a/js/src/tests/test262/built-ins/Atomics/notify/count-boundary-cases.js
+++ b/js/src/tests/test262/built-ins/Atomics/notify/count-boundary-cases.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.notify
 description: >
   Allowed boundary cases for 'count' argument to Atomics.notify
 info: |
--- a/js/src/tests/test262/built-ins/Atomics/notify/count-defaults-to-infinity-missing.js
+++ b/js/src/tests/test262/built-ins/Atomics/notify/count-defaults-to-infinity-missing.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Amal Hussein.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.notify
 description: >
   Default to +Infinity when missing 'count' argument to Atomics.notify
 info: |
--- a/js/src/tests/test262/built-ins/Atomics/notify/count-defaults-to-infinity-undefined.js
+++ b/js/src/tests/test262/built-ins/Atomics/notify/count-defaults-to-infinity-undefined.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Amal Hussein.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.notify
 description: >
   Undefined count arg should result in an infinite count
 info: |
--- a/js/src/tests/test262/built-ins/Atomics/notify/count-from-nans.js
+++ b/js/src/tests/test262/built-ins/Atomics/notify/count-from-nans.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Rick Waldron.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.notify
 description: >
   NaNs are converted to 0 for 'count' argument to Atomics.notify
 info: |
--- a/js/src/tests/test262/built-ins/Atomics/notify/count-symbol-throws.js
+++ b/js/src/tests/test262/built-ins/Atomics/notify/count-symbol-throws.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Rick Waldron.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.notify
 description: >
   Return abrupt when symbol passed for 'count' argument to Atomics.notify
 info: |
--- a/js/src/tests/test262/built-ins/Atomics/notify/count-tointeger-throws-then-wake-throws.js
+++ b/js/src/tests/test262/built-ins/Atomics/notify/count-tointeger-throws-then-wake-throws.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Rick Waldron.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.notify
 description: >
   Return abrupt when ToInteger throws an exception on 'count' argument to Atomics.notify
 info: |
--- a/js/src/tests/test262/built-ins/Atomics/notify/negative-count.js
+++ b/js/src/tests/test262/built-ins/Atomics/notify/negative-count.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.notify
 description: >
   Test that Atomics.notify notifies zero waiters if the count is negative
 includes: [atomicsHelper.js]
--- a/js/src/tests/test262/built-ins/Atomics/notify/negative-index-throws.js
+++ b/js/src/tests/test262/built-ins/Atomics/notify/negative-index-throws.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Amal Hussein. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.notify
 description: >
   Throws a RangeError is index < 0
 info: |
--- a/js/src/tests/test262/built-ins/Atomics/notify/non-shared-int-views.js
+++ b/js/src/tests/test262/built-ins/Atomics/notify/non-shared-int-views.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.notify
 description: >
   Test Atomics.notify on non-shared integer TypedArrays
 includes: [testTypedArray.js]
--- a/js/src/tests/test262/built-ins/Atomics/notify/non-views.js
+++ b/js/src/tests/test262/built-ins/Atomics/notify/non-views.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.notify
 description: >
   Test Atomics.notify on view values other than TypedArrays
 includes: [testAtomics.js]
--- a/js/src/tests/test262/built-ins/Atomics/notify/notify-all-on-loc.js
+++ b/js/src/tests/test262/built-ins/Atomics/notify/notify-all-on-loc.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.notify
 description: >
   Test that Atomics.notify notifies all waiters on a location, but does not
   notify waiters on other locations.
--- a/js/src/tests/test262/built-ins/Atomics/notify/notify-all.js
+++ b/js/src/tests/test262/built-ins/Atomics/notify/notify-all.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.notify
 description: >
   Test that Atomics.notify notifies all waiters if that's what the count is.
 includes: [atomicsHelper.js]
--- a/js/src/tests/test262/built-ins/Atomics/notify/notify-in-order-one-time.js
+++ b/js/src/tests/test262/built-ins/Atomics/notify/notify-in-order-one-time.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.notify
 description: >
   Test that Atomics.notify notifies agents in the order they are waiting.
 includes: [atomicsHelper.js]
--- a/js/src/tests/test262/built-ins/Atomics/notify/notify-in-order.js
+++ b/js/src/tests/test262/built-ins/Atomics/notify/notify-in-order.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.notify
 description: >
   Test that Atomics.notify notifies agents in the order they are waiting.
 includes: [atomicsHelper.js]
--- a/js/src/tests/test262/built-ins/Atomics/notify/notify-nan.js
+++ b/js/src/tests/test262/built-ins/Atomics/notify/notify-nan.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.notify
 description: >
   Test that Atomics.nofity nofities zero waiters if the count is NaN
 includes: [atomicsHelper.js]
--- a/js/src/tests/test262/built-ins/Atomics/notify/notify-one.js
+++ b/js/src/tests/test262/built-ins/Atomics/notify/notify-one.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.notify
 description: >
   Test that Atomics.notify notifies one waiter if that's what the count is.
 includes: [atomicsHelper.js]
--- a/js/src/tests/test262/built-ins/Atomics/notify/notify-renotify-noop.js
+++ b/js/src/tests/test262/built-ins/Atomics/notify/notify-renotify-noop.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Rick Waldron.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.notify
 description: >
   Test that Atomics.notify on awoken waiter is a noop.
 includes: [atomicsHelper.js]
--- a/js/src/tests/test262/built-ins/Atomics/notify/notify-two.js
+++ b/js/src/tests/test262/built-ins/Atomics/notify/notify-two.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.notify
 description: >
   Test that Atomics.notify notifies two waiters if that's what the count is.
 includes: [atomicsHelper.js]
--- a/js/src/tests/test262/built-ins/Atomics/notify/notify-with-no-agents-waiting.js
+++ b/js/src/tests/test262/built-ins/Atomics/notify/notify-with-no-agents-waiting.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Rick Waldron.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.notify
 description: >
   Test that Atomics.notify notifies zero waiters if there are no agents waiting.
 includes: [atomicsHelper.js]
--- a/js/src/tests/test262/built-ins/Atomics/notify/notify-with-no-matching-agents-waiting.js
+++ b/js/src/tests/test262/built-ins/Atomics/notify/notify-with-no-matching-agents-waiting.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Rick Waldron.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.notify
 description: >
   Test that Atomics.notify notifies zero waiters if there are no waiters
   at the index specified.
--- a/js/src/tests/test262/built-ins/Atomics/notify/notify-zero.js
+++ b/js/src/tests/test262/built-ins/Atomics/notify/notify-zero.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.notify
 description: >
   Test that Atomics.notify notifies zero waiters if that's what the count is.
 includes: [atomicsHelper.js]
--- a/js/src/tests/test262/built-ins/Atomics/notify/out-of-range-index-throws.js
+++ b/js/src/tests/test262/built-ins/Atomics/notify/out-of-range-index-throws.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Amal Hussein. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.notify
 description: >
   Throws a RangeError if value of index arg is out of range
   info: |
--- a/js/src/tests/test262/built-ins/Atomics/notify/shared-nonint-views.js
+++ b/js/src/tests/test262/built-ins/Atomics/notify/shared-nonint-views.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.notify
 description: >
   Test Atomics.notify on shared non-integer TypedArrays
 includes: [testTypedArray.js]
--- a/js/src/tests/test262/built-ins/Atomics/notify/symbol-for-index-throws.js
+++ b/js/src/tests/test262/built-ins/Atomics/notify/symbol-for-index-throws.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Amal Hussein. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.notify
 description: >
   Return abrupt when ToInteger throws for 'index' argument to Atomics.notify
 info: |
--- a/js/src/tests/test262/built-ins/Atomics/notify/undefined-index-defaults-to-zero.js
+++ b/js/src/tests/test262/built-ins/Atomics/notify/undefined-index-defaults-to-zero.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Amal Hussein. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.notify
 description: >
   An undefined index arg should translate to 0
 info: |
--- a/js/src/tests/test262/built-ins/Atomics/or/bad-range.js
+++ b/js/src/tests/test262/built-ins/Atomics/or/bad-range.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.or
 description: >
   Test range checking of Atomics.or on arrays that allow atomic operations
 includes: [testAtomics.js, testTypedArray.js]
--- a/js/src/tests/test262/built-ins/Atomics/or/bigint/bad-range.js
+++ b/js/src/tests/test262/built-ins/Atomics/or/bigint/bad-range.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Rick Waldron. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: sec-atomics.or
 description: >
   Test range checking of Atomics.or on arrays that allow atomic operations
 includes: [testAtomics.js, testBigIntTypedArray.js]
 features: [ArrayBuffer, Atomics, BigInt, DataView, SharedArrayBuffer, Symbol, TypedArray]
--- a/js/src/tests/test262/built-ins/Atomics/or/bigint/good-views.js
+++ b/js/src/tests/test262/built-ins/Atomics/or/bigint/good-views.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Rick Waldron. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: sec-atomics.or
 description: Test Atomics.or on arrays that allow atomic operations
 includes: [testAtomics.js, testBigIntTypedArray.js]
 features: [ArrayBuffer, Atomics, BigInt, DataView, SharedArrayBuffer, Symbol, TypedArray]
 ---*/
--- a/js/src/tests/test262/built-ins/Atomics/or/expected-return-value.js
+++ b/js/src/tests/test262/built-ins/Atomics/or/expected-return-value.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Rick Waldron.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.or
 description: >
   Atomics.and returns the value that existed at the
   index prior to the operation.
--- a/js/src/tests/test262/built-ins/Atomics/or/good-views.js
+++ b/js/src/tests/test262/built-ins/Atomics/or/good-views.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.or
 description: Test Atomics.or on arrays that allow atomic operations
 includes: [testAtomics.js, testTypedArray.js]
 features: [ArrayBuffer, Atomics, DataView, SharedArrayBuffer, Symbol, TypedArray]
--- a/js/src/tests/test262/built-ins/Atomics/or/non-views.js
+++ b/js/src/tests/test262/built-ins/Atomics/or/non-views.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.or
 description: >
   Test Atomics.or on view values other than TypedArrays
 includes: [testAtomics.js]
--- a/js/src/tests/test262/built-ins/Atomics/or/shared-nonint-views.js
+++ b/js/src/tests/test262/built-ins/Atomics/or/shared-nonint-views.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.or
 description: >
   Test Atomics.or on shared non-integer TypedArrays
 includes: [testTypedArray.js]
--- a/js/src/tests/test262/built-ins/Atomics/store/bad-range.js
+++ b/js/src/tests/test262/built-ins/Atomics/store/bad-range.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.store
 description: >
   Test range checking of Atomics.store on arrays that allow atomic operations
 includes: [testAtomics.js, testTypedArray.js]
--- a/js/src/tests/test262/built-ins/Atomics/store/bigint/bad-range.js
+++ b/js/src/tests/test262/built-ins/Atomics/store/bigint/bad-range.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Rick Waldron. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: sec-atomics.store
 description: >
   Test range checking of Atomics.store on arrays that allow atomic operations
 includes: [testAtomics.js, testBigIntTypedArray.js]
 features: [ArrayBuffer, Atomics, BigInt, DataView, SharedArrayBuffer, Symbol, TypedArray]
--- a/js/src/tests/test262/built-ins/Atomics/store/bigint/good-views.js
+++ b/js/src/tests/test262/built-ins/Atomics/store/bigint/good-views.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Rick Waldron. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: sec-atomics.store
 description: Test Atomics.store on arrays that allow atomic operations.
 includes: [testAtomics.js, testBigIntTypedArray.js]
 features: [ArrayBuffer, Atomics, BigInt, DataView, SharedArrayBuffer, Symbol, TypedArray]
 ---*/
--- a/js/src/tests/test262/built-ins/Atomics/store/expected-return-value.js
+++ b/js/src/tests/test262/built-ins/Atomics/store/expected-return-value.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Rick Waldron.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.store
 description: >
   Atomics.store returns the newly stored value
 info: |
--- a/js/src/tests/test262/built-ins/Atomics/store/good-views.js
+++ b/js/src/tests/test262/built-ins/Atomics/store/good-views.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.store
 description: Test Atomics.store on arrays that allow atomic operations.
 includes: [testAtomics.js, testTypedArray.js]
 features: [ArrayBuffer, Atomics, DataView, SharedArrayBuffer, Symbol, TypedArray]
--- a/js/src/tests/test262/built-ins/Atomics/store/non-views.js
+++ b/js/src/tests/test262/built-ins/Atomics/store/non-views.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.store
 description: >
   Test Atomics.store on view values other than TypedArrays
 includes: [testAtomics.js]
--- a/js/src/tests/test262/built-ins/Atomics/store/shared-nonint-views.js
+++ b/js/src/tests/test262/built-ins/Atomics/store/shared-nonint-views.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.store
 description: >
   Test Atomics.store on shared non-integer TypedArrays
 includes: [testTypedArray.js]
--- a/js/src/tests/test262/built-ins/Atomics/sub/bad-range.js
+++ b/js/src/tests/test262/built-ins/Atomics/sub/bad-range.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.sub
 description: >
   Test range checking of Atomics.sub on arrays that allow atomic operations
 includes: [testAtomics.js, testTypedArray.js]
--- a/js/src/tests/test262/built-ins/Atomics/sub/bigint/bad-range.js
+++ b/js/src/tests/test262/built-ins/Atomics/sub/bigint/bad-range.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Rick Waldron. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: sec-atomics.sub
 description: >
   Test range checking of Atomics.sub on arrays that allow atomic operations
 includes: [testAtomics.js, testBigIntTypedArray.js]
 features: [ArrayBuffer, Atomics, BigInt, DataView, SharedArrayBuffer, Symbol, TypedArray]
--- a/js/src/tests/test262/built-ins/Atomics/sub/bigint/good-views.js
+++ b/js/src/tests/test262/built-ins/Atomics/sub/bigint/good-views.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Rick Waldron. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: sec-atomics.sub
 description: Test Atomics.sub on arrays that allow atomic operations
 includes: [testAtomics.js, testBigIntTypedArray.js]
 features: [ArrayBuffer, Atomics, BigInt, DataView, SharedArrayBuffer, Symbol, TypedArray]
 ---*/
--- a/js/src/tests/test262/built-ins/Atomics/sub/expected-return-value.js
+++ b/js/src/tests/test262/built-ins/Atomics/sub/expected-return-value.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Rick Waldron.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.sub
 description: >
   Atomics.and returns the value that existed at the
   index prior to the operation.
--- a/js/src/tests/test262/built-ins/Atomics/sub/good-views.js
+++ b/js/src/tests/test262/built-ins/Atomics/sub/good-views.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.sub
 description: Test Atomics.sub on arrays that allow atomic operations
 includes: [testAtomics.js, testTypedArray.js]
 features: [ArrayBuffer, Atomics, DataView, SharedArrayBuffer, Symbol, TypedArray]
--- a/js/src/tests/test262/built-ins/Atomics/sub/non-views.js
+++ b/js/src/tests/test262/built-ins/Atomics/sub/non-views.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.sub
 description: >
   Test Atomics.sub on view values other than TypedArrays
 includes: [testAtomics.js]
--- a/js/src/tests/test262/built-ins/Atomics/sub/shared-nonint-views.js
+++ b/js/src/tests/test262/built-ins/Atomics/sub/shared-nonint-views.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.sub
 description: >
   Test Atomics.sub on shared non-integer TypedArrays
 includes: [testTypedArray.js]
--- a/js/src/tests/test262/built-ins/Atomics/wait/bad-range.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/bad-range.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.wait
 description: >
   Test range checking of Atomics.wait on arrays that allow atomic operations
 info: |
--- a/js/src/tests/test262/built-ins/Atomics/wait/bigint/bad-range.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/bigint/bad-range.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Rick Waldron. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.wait
 description: >
   Test range checking of Atomics.wait on arrays that allow atomic operations
 info: |
--- a/js/src/tests/test262/built-ins/Atomics/wait/bigint/cannot-suspend-throws.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/bigint/cannot-suspend-throws.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(xulRuntime.shell||!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')) -- shell can block main thread, Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(xulRuntime.shell||!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- shell can block main thread, Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Amal Hussein. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: sec-atomics.wait
 description: >
   Atomics.wait throws if agent cannot be suspended, CanBlock is false
 info: |
   Assuming [[CanBlock]] is false for the main host.
--- a/js/src/tests/test262/built-ins/Atomics/wait/bigint/false-for-timeout-agent.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/bigint/false-for-timeout-agent.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Amal Hussein.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.wait
 description: >
   False timeout arg should result in an +0 timeout
 info: |
--- a/js/src/tests/test262/built-ins/Atomics/wait/bigint/false-for-timeout.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/bigint/false-for-timeout.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!xulRuntime.shell||!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')) -- browser cannot block main thread, Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!xulRuntime.shell||!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- browser cannot block main thread, Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Amal Hussein. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.wait
 description: >
   False timeout arg should result in an +0 timeout
 info: |
--- a/js/src/tests/test262/built-ins/Atomics/wait/bigint/nan-for-timeout.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/bigint/nan-for-timeout.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Amal Hussein.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.wait
 description: >
   NaN timeout arg should result in an infinite timeout
 info: |
--- a/js/src/tests/test262/built-ins/Atomics/wait/bigint/negative-index-throws.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/bigint/negative-index-throws.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Amal Hussein. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.wait
 description: >
   Throws a RangeError is index < 0
 info: |
--- a/js/src/tests/test262/built-ins/Atomics/wait/bigint/negative-timeout-agent.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/bigint/negative-timeout-agent.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Rick Waldron. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.wait
 description: >
   Test that Atomics.wait times out with a negative timeout
 includes: [atomicsHelper.js]
--- a/js/src/tests/test262/built-ins/Atomics/wait/bigint/negative-timeout.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/bigint/negative-timeout.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!xulRuntime.shell||!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')) -- browser cannot block main thread, Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!xulRuntime.shell||!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- browser cannot block main thread, Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Rick Waldron. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.wait
 description: >
   Test that Atomics.wait times out with a negative timeout
 features: [Atomics, BigInt, SharedArrayBuffer, TypedArray]
--- a/js/src/tests/test262/built-ins/Atomics/wait/bigint/no-spurious-wakeup-no-operation.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/bigint/no-spurious-wakeup-no-operation.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.wait
 description: >
   Test that Atomics.wait returns the right result when it timed out and that
   the time to time out is reasonable.
--- a/js/src/tests/test262/built-ins/Atomics/wait/bigint/no-spurious-wakeup-on-add.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/bigint/no-spurious-wakeup-on-add.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Rick Waldron. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.wait
 description: >
   Waiter does not spuriously notify on index which is subject to Add operation
 includes: [atomicsHelper.js]
--- a/js/src/tests/test262/built-ins/Atomics/wait/bigint/no-spurious-wakeup-on-and.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/bigint/no-spurious-wakeup-on-and.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Rick Waldron. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.wait
 description: >
   Waiter does not spuriously nofity on index which is subject to And operation
 includes: [atomicsHelper.js]
--- a/js/src/tests/test262/built-ins/Atomics/wait/bigint/no-spurious-wakeup-on-compareExchange.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/bigint/no-spurious-wakeup-on-compareExchange.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Rick Waldron. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.wait
 description: >
   Waiter does not spuriously notify on index which is subject to compareExchange operation
 includes: [atomicsHelper.js]
--- a/js/src/tests/test262/built-ins/Atomics/wait/bigint/no-spurious-wakeup-on-exchange.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/bigint/no-spurious-wakeup-on-exchange.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Rick Waldron. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.wait
 description: >
   Waiter does not spuriously notify on index which is subject to exchange operation
 includes: [atomicsHelper.js]
--- a/js/src/tests/test262/built-ins/Atomics/wait/bigint/no-spurious-wakeup-on-or.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/bigint/no-spurious-wakeup-on-or.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Rick Waldron. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.wait
 description: >
   Waiter does not spuriously notify on index which is subject to Or operation
 includes: [atomicsHelper.js]
--- a/js/src/tests/test262/built-ins/Atomics/wait/bigint/no-spurious-wakeup-on-store.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/bigint/no-spurious-wakeup-on-store.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Rick Waldron. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.wait
 description: >
   Demonstrates that Atomics.store(...) is causing a waiting
 includes: [atomicsHelper.js]
--- a/js/src/tests/test262/built-ins/Atomics/wait/bigint/no-spurious-wakeup-on-sub.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/bigint/no-spurious-wakeup-on-sub.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Rick Waldron. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.wait
 description: >
   Waiter does not spuriously notify on index which is subject to Sub operation
 includes: [atomicsHelper.js]
--- a/js/src/tests/test262/built-ins/Atomics/wait/bigint/no-spurious-wakeup-on-xor.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/bigint/no-spurious-wakeup-on-xor.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Rick Waldron. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.wait
 description: >
   Waiter does not spuriously notify on index which is subject to xor operation
 includes: [atomicsHelper.js]
--- a/js/src/tests/test262/built-ins/Atomics/wait/bigint/non-bigint64-typedarray-throws.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/bigint/non-bigint64-typedarray-throws.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Amal Hussein. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-validatesharedintegertypedarray
 description: >
   Throws a TypeError if typedArray arg is not a BigInt64Array
 info: |
--- a/js/src/tests/test262/built-ins/Atomics/wait/bigint/out-of-range-index-throws.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/bigint/out-of-range-index-throws.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Amal Hussein. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.wait
 description: >
   Throws a RangeError if value of index arg is out of range
 info: |
--- a/js/src/tests/test262/built-ins/Atomics/wait/bigint/value-not-equal.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/bigint/value-not-equal.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Amal Hussein.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.wait
 description: >
   Returns "not-equal" when value arg does not match an index in the typedArray
 info: |
--- a/js/src/tests/test262/built-ins/Atomics/wait/bigint/waiterlist-block-indexedposition-wake.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/bigint/waiterlist-block-indexedposition-wake.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Rick Waldron. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.wait
 description: >
   Get the correct WaiterList
 info: |
--- a/js/src/tests/test262/built-ins/Atomics/wait/bigint/waiterlist-order-of-operations-is-fifo.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/bigint/waiterlist-order-of-operations-is-fifo.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Amal Hussein.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.wait
 description: >
   New waiters should be applied to the end of the list and woken by order they entered the list (FIFO)
 info: |
--- a/js/src/tests/test262/built-ins/Atomics/wait/bigint/was-woken-before-timeout.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/bigint/was-woken-before-timeout.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Amal Hussein. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: sec-atomics.wait
 description: >
   Test that Atomics.wait returns the right result when it was awoken before
   a timeout
 info: |
--- a/js/src/tests/test262/built-ins/Atomics/wait/cannot-suspend-throws.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/cannot-suspend-throws.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(xulRuntime.shell||!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- shell can block main thread, Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(xulRuntime.shell||!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- shell can block main thread, Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Amal Hussein. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.wait
 description: >
   Atomics.wait throws if agent cannot be suspended, CanBlock is false
 info: |
--- a/js/src/tests/test262/built-ins/Atomics/wait/false-for-timeout-agent.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/false-for-timeout-agent.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Amal Hussein.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.wait
 description: >
   False timeout arg should result in an +0 timeout
 info: |
--- a/js/src/tests/test262/built-ins/Atomics/wait/false-for-timeout.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/false-for-timeout.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!xulRuntime.shell||!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- browser cannot block main thread, Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!xulRuntime.shell||!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- browser cannot block main thread, Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Amal Hussein. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.wait
 description: >
   False timeout arg should result in an +0 timeout
 info: |
--- a/js/src/tests/test262/built-ins/Atomics/wait/nan-for-timeout.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/nan-for-timeout.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Amal Hussein.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.wait
 description: >
   NaN timeout arg should result in an infinite timeout
 info: |
--- a/js/src/tests/test262/built-ins/Atomics/wait/negative-index-throws.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/negative-index-throws.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Amal Hussein. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.wait
 description: >
   Throws a RangeError is index < 0
 info: |
--- a/js/src/tests/test262/built-ins/Atomics/wait/negative-timeout-agent.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/negative-timeout-agent.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.wait
 description: >
   Test that Atomics.wait times out with a negative timeout
 includes: [atomicsHelper.js]
--- a/js/src/tests/test262/built-ins/Atomics/wait/negative-timeout.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/negative-timeout.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!xulRuntime.shell||!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- browser cannot block main thread, Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!xulRuntime.shell||!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- browser cannot block main thread, Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.wait
 description: >
   Test that Atomics.wait times out with a negative timeout
 features: [Atomics, SharedArrayBuffer, TypedArray]
--- a/js/src/tests/test262/built-ins/Atomics/wait/no-spurious-wakeup-no-operation.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/no-spurious-wakeup-no-operation.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.wait
 description: >
   Test that Atomics.wait returns the right result when it timed out and that
   the time to time out is reasonable.
--- a/js/src/tests/test262/built-ins/Atomics/wait/no-spurious-wakeup-on-add.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/no-spurious-wakeup-on-add.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Rick Waldron. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.wait
 description: >
   Waiter does not spuriously notify on index which is subject to Add operation
 includes: [atomicsHelper.js]
--- a/js/src/tests/test262/built-ins/Atomics/wait/no-spurious-wakeup-on-and.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/no-spurious-wakeup-on-and.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Rick Waldron. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.wait
 description: >
   Waiter does not spuriously notify on index which is subject to And operation
 includes: [atomicsHelper.js]
--- a/js/src/tests/test262/built-ins/Atomics/wait/no-spurious-wakeup-on-compareExchange.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/no-spurious-wakeup-on-compareExchange.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Rick Waldron. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.wait
 description: >
   Waiter does not spuriously notify on index which is subject to compareExchange operation
 includes: [atomicsHelper.js]
--- a/js/src/tests/test262/built-ins/Atomics/wait/no-spurious-wakeup-on-exchange.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/no-spurious-wakeup-on-exchange.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Rick Waldron. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.wait
 description: >
   Waiter does not spuriously notify on index which is subject to exchange operation
 includes: [atomicsHelper.js]
--- a/js/src/tests/test262/built-ins/Atomics/wait/no-spurious-wakeup-on-or.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/no-spurious-wakeup-on-or.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Rick Waldron. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.wait
 description: >
   Waiter does not spuriously notify on index which is subject to Or operation
 includes: [atomicsHelper.js]
--- a/js/src/tests/test262/built-ins/Atomics/wait/no-spurious-wakeup-on-store.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/no-spurious-wakeup-on-store.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Rick Waldron. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.wait
 description: >
   Waiter does not spuriously notify on index which is subject to Store operation
 includes: [atomicsHelper.js]
--- a/js/src/tests/test262/built-ins/Atomics/wait/no-spurious-wakeup-on-sub.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/no-spurious-wakeup-on-sub.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Rick Waldron. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.wait
 description: >
   Waiter does not spuriously notify on index which is subject to Sub operation
 includes: [atomicsHelper.js]
--- a/js/src/tests/test262/built-ins/Atomics/wait/no-spurious-wakeup-on-xor.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/no-spurious-wakeup-on-xor.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Rick Waldron. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.wait
 description: >
   Waiter does not spuriously notify on index which is subject to xor operation
 includes: [atomicsHelper.js]
--- a/js/src/tests/test262/built-ins/Atomics/wait/null-for-timeout-agent.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/null-for-timeout-agent.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Amal Hussein.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.wait
 description: >
   False timeout arg should result in an +0 timeout
 info: |
--- a/js/src/tests/test262/built-ins/Atomics/wait/null-for-timeout.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/null-for-timeout.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!xulRuntime.shell||!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- browser cannot block main thread, Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!xulRuntime.shell||!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- browser cannot block main thread, Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Amal Hussein. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.wait
 description: >
   Throws a TypeError if index arg can not be converted to an Integer
 info: |
--- a/js/src/tests/test262/built-ins/Atomics/wait/object-for-timeout-agent.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/object-for-timeout-agent.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Amal Hussein.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.wait
 description: >
   False timeout arg should result in an +0 timeout
 info: |
--- a/js/src/tests/test262/built-ins/Atomics/wait/object-for-timeout.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/object-for-timeout.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!xulRuntime.shell||!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- browser cannot block main thread, Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!xulRuntime.shell||!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- browser cannot block main thread, Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Amal Hussein. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.wait
 description: >
   Throws a TypeError if index arg can not be converted to an Integer
 info: |
--- a/js/src/tests/test262/built-ins/Atomics/wait/out-of-range-index-throws.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/out-of-range-index-throws.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Amal Hussein. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.wait
 description: >
   Throws a RangeError if value of index arg is out of range
 info: |
--- a/js/src/tests/test262/built-ins/Atomics/wait/poisoned-object-for-timeout-throws-agent.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/poisoned-object-for-timeout-throws-agent.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Amal Hussein.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.wait
 description: >
   False timeout arg should result in an +0 timeout
 info: |
--- a/js/src/tests/test262/built-ins/Atomics/wait/poisoned-object-for-timeout-throws.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/poisoned-object-for-timeout-throws.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Amal Hussein. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.wait
 description: >
   Throws a TypeError if index arg can not be converted to an Integer
 info: |
--- a/js/src/tests/test262/built-ins/Atomics/wait/symbol-for-index-throws-agent.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/symbol-for-index-throws-agent.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Amal Hussein. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.wait
 description: >
   Throws a TypeError if index arg can not be converted to an Integer
 info: |
--- a/js/src/tests/test262/built-ins/Atomics/wait/symbol-for-index-throws.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/symbol-for-index-throws.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Amal Hussein. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.wait
 description: >
   Throws a TypeError if index arg can not be converted to an Integer
 info: |
--- a/js/src/tests/test262/built-ins/Atomics/wait/symbol-for-timeout-throws-agent.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/symbol-for-timeout-throws-agent.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Amal Hussein. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.wait
 description: >
   Throws a TypeError if index arg can not be converted to an Integer
 info: |
--- a/js/src/tests/test262/built-ins/Atomics/wait/symbol-for-timeout-throws.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/symbol-for-timeout-throws.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Amal Hussein. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.wait
 description: >
   Throws a TypeError if index arg can not be converted to an Integer
 info: |
--- a/js/src/tests/test262/built-ins/Atomics/wait/symbol-for-value-throws-agent.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/symbol-for-value-throws-agent.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Amal Hussein.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.wait
 description: >
   Throws a TypeError if value arg is a Symbol
 info: |
--- a/js/src/tests/test262/built-ins/Atomics/wait/symbol-for-value-throws.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/symbol-for-value-throws.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Amal Hussein.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.wait
 description: >
   Throws a TypeError if value arg is a Symbol
 info: |
--- a/js/src/tests/test262/built-ins/Atomics/wait/true-for-timeout-agent.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/true-for-timeout-agent.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Amal Hussein.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.wait
 description: >
   True timeout arg should result in an +0 timeout
 info: |
--- a/js/src/tests/test262/built-ins/Atomics/wait/true-for-timeout.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/true-for-timeout.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!xulRuntime.shell||!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- browser cannot block main thread, Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!xulRuntime.shell||!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- browser cannot block main thread, Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Amal Hussein. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.wait
 description: >
   Throws a TypeError if index arg can not be converted to an Integer
 info: |
--- a/js/src/tests/test262/built-ins/Atomics/wait/undefined-for-timeout.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/undefined-for-timeout.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Amal Hussein.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.wait
 description: >
   Undefined timeout arg should result in an infinite timeout
 info: |
--- a/js/src/tests/test262/built-ins/Atomics/wait/undefined-index-defaults-to-zero.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/undefined-index-defaults-to-zero.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Amal Hussein. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: sec-atomics.wait
 description: >
   An undefined index arg should translate to 0
 info: |
   Atomics.wait( typedArray, index, value, timeout )
--- a/js/src/tests/test262/built-ins/Atomics/wait/value-not-equal.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/value-not-equal.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Amal Hussein.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.wait
 description: >
   Returns "not-equal" when value arg does not match an index in the typedArray
 info: |
--- a/js/src/tests/test262/built-ins/Atomics/wait/wait-index-value-not-equal.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/wait-index-value-not-equal.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Amal Hussein.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.wait
 description: >
   Returns "not-equal" when value of index is not equal
 info: |
--- a/js/src/tests/test262/built-ins/Atomics/wait/waiterlist-block-indexedposition-wake.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/waiterlist-block-indexedposition-wake.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Rick Waldron. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.wait
 description: >
   Get the correct WaiterList
 info: |
--- a/js/src/tests/test262/built-ins/Atomics/wait/waiterlist-order-of-operations-is-fifo.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/waiterlist-order-of-operations-is-fifo.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Amal Hussein.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.wait
 description: >
   New waiters should be applied to the end of the list and woken by order they entered the list (FIFO)
 info: |
--- a/js/src/tests/test262/built-ins/Atomics/wait/was-woken-before-timeout.js
+++ b/js/src/tests/test262/built-ins/Atomics/wait/was-woken-before-timeout.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Amal Hussein. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: sec-atomics.wait
 description: >
   Test that Atomics.wait returns the right result when it was awoken before
   a timeout
 info: |
--- a/js/src/tests/test262/built-ins/Atomics/xor/bad-range.js
+++ b/js/src/tests/test262/built-ins/Atomics/xor/bad-range.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.xor
 description: >
   Test range checking of Atomics.xor on arrays that allow atomic operations
 includes: [testAtomics.js, testTypedArray.js]
--- a/js/src/tests/test262/built-ins/Atomics/xor/bigint/bad-range.js
+++ b/js/src/tests/test262/built-ins/Atomics/xor/bigint/bad-range.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Rick Waldron. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.xor
 description: >
   Test range checking of Atomics.xor on arrays that allow atomic operations
 includes: [testAtomics.js, testBigIntTypedArray.js]
--- a/js/src/tests/test262/built-ins/Atomics/xor/bigint/good-views.js
+++ b/js/src/tests/test262/built-ins/Atomics/xor/bigint/good-views.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('BigInt')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,BigInt,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Rick Waldron. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: sec-atomics.xor
 description: Test Atomics.xor on arrays that allow atomic operations
 includes: [testAtomics.js, testBigIntTypedArray.js]
 features: [ArrayBuffer, Atomics, BigInt, DataView, SharedArrayBuffer, Symbol, TypedArray]
 ---*/
--- a/js/src/tests/test262/built-ins/Atomics/xor/expected-return-value.js
+++ b/js/src/tests/test262/built-ins/Atomics/xor/expected-return-value.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2018 Rick Waldron.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.xor
 description: >
   Atomics.xor returns the value that existed at the
   index prior to the operation.
--- a/js/src/tests/test262/built-ins/Atomics/xor/good-views.js
+++ b/js/src/tests/test262/built-ins/Atomics/xor/good-views.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.xor
 description: Test Atomics.xor on arrays that allow atomic operations
 includes: [testAtomics.js, testTypedArray.js]
 features: [ArrayBuffer, Atomics, DataView, SharedArrayBuffer, Symbol, TypedArray]
--- a/js/src/tests/test262/built-ins/Atomics/xor/non-views.js
+++ b/js/src/tests/test262/built-ins/Atomics/xor/non-views.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.xor
 description: >
   Test Atomics.xor on view values other than TypedArrays
 includes: [testAtomics.js]
--- a/js/src/tests/test262/built-ins/Atomics/xor/shared-nonint-views.js
+++ b/js/src/tests/test262/built-ins/Atomics/xor/shared-nonint-views.js
@@ -1,9 +1,9 @@
-// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')) -- Atomics,SharedArrayBuffer is not enabled unconditionally
+// |reftest| skip-if(!this.hasOwnProperty('Atomics')||!this.hasOwnProperty('SharedArrayBuffer')||(this.hasOwnProperty('getBuildConfiguration')&&getBuildConfiguration()['arm64-simulator'])) -- Atomics,SharedArrayBuffer is not enabled unconditionally, ARM64 Simulator cannot emulate atomics
 // Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: sec-atomics.xor
 description: >
   Test Atomics.xor on shared non-integer TypedArrays
 includes: [testTypedArray.js]
--- a/js/src/tests/test262/built-ins/RegExp/prototype/Symbol.matchAll/isregexp-called-once.js
+++ b/js/src/tests/test262/built-ins/RegExp/prototype/Symbol.matchAll/isregexp-called-once.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!Symbol.hasOwnProperty('matchAll')) -- Symbol.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Peter Wong. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: IsRegExp should only be called once
 info: |
   RegExp.prototype [ @@matchAll ] ( string )
     1. Let R be the this value.
--- a/js/src/tests/test262/built-ins/RegExp/prototype/Symbol.matchAll/isregexp-this-throws.js
+++ b/js/src/tests/test262/built-ins/RegExp/prototype/Symbol.matchAll/isregexp-this-throws.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!Symbol.hasOwnProperty('matchAll')) -- Symbol.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Peter Wong. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: Re-throws errors thrown while accessing RegExp's @@match property
 info: |
   RegExp.prototype [ @@matchAll ] ( string )
     [...]
--- a/js/src/tests/test262/built-ins/RegExp/prototype/Symbol.matchAll/length.js
+++ b/js/src/tests/test262/built-ins/RegExp/prototype/Symbol.matchAll/length.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!Symbol.hasOwnProperty('matchAll')) -- Symbol.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Jordan Harband. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: RegExp.prototype[Symbol.matchAll] `length` property
 info: |
   17 ECMAScript Standard Built-in Objects:
 
--- a/js/src/tests/test262/built-ins/RegExp/prototype/Symbol.matchAll/name.js
+++ b/js/src/tests/test262/built-ins/RegExp/prototype/Symbol.matchAll/name.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!Symbol.hasOwnProperty('matchAll')) -- Symbol.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Jordan Harband. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: RegExp.prototype[Symbol.matchAll] `name` property
 info: |
   17 ECMAScript Standard Built-in Objects:
 
--- a/js/src/tests/test262/built-ins/RegExp/prototype/Symbol.matchAll/prop-desc.js
+++ b/js/src/tests/test262/built-ins/RegExp/prototype/Symbol.matchAll/prop-desc.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!Symbol.hasOwnProperty('matchAll')) -- Symbol.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Jordan Harband. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: RegExp.prototype[Symbol.matchAll] property descriptor
 info: |
   17 ECMAScript Standard Built-in Objects:
 
--- a/js/src/tests/test262/built-ins/RegExp/prototype/Symbol.matchAll/regexpcreate-this-throws.js
+++ b/js/src/tests/test262/built-ins/RegExp/prototype/Symbol.matchAll/regexpcreate-this-throws.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!Symbol.hasOwnProperty('matchAll')) -- Symbol.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Peter Wong. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: Re-throws errors while creating an internal RegExp
 info: |
   RegExp.prototype [ @@matchAll ] ( string )
     [...]
--- a/js/src/tests/test262/built-ins/RegExp/prototype/Symbol.matchAll/species-constructor-get-constructor-throws.js
+++ b/js/src/tests/test262/built-ins/RegExp/prototype/Symbol.matchAll/species-constructor-get-constructor-throws.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!Symbol.hasOwnProperty('matchAll')) -- Symbol.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Peter Wong. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: |
   Re-throws errors thrown while accessing RegExp's constructor property
 info: |
   RegExp.prototype [ @@matchAll ] ( string )
--- a/js/src/tests/test262/built-ins/RegExp/prototype/Symbol.matchAll/species-constructor-get-species-throws.js
+++ b/js/src/tests/test262/built-ins/RegExp/prototype/Symbol.matchAll/species-constructor-get-species-throws.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!Symbol.hasOwnProperty('matchAll')) -- Symbol.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Peter Wong. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: Re-throws errors thrown while accessing of @@species property
 info: |
   RegExp.prototype [ @@matchAll ] ( string )
     [...]
--- a/js/src/tests/test262/built-ins/RegExp/prototype/Symbol.matchAll/species-constructor-is-not-object-throws.js
+++ b/js/src/tests/test262/built-ins/RegExp/prototype/Symbol.matchAll/species-constructor-is-not-object-throws.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!Symbol.hasOwnProperty('matchAll')) -- Symbol.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Peter Wong. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: Throws TypeError if `constructor` property is not an object
 info: |
   RegExp.prototype [ @@matchAll ] ( string )
     [...]
--- a/js/src/tests/test262/built-ins/RegExp/prototype/Symbol.matchAll/species-constructor-is-undefined.js
+++ b/js/src/tests/test262/built-ins/RegExp/prototype/Symbol.matchAll/species-constructor-is-undefined.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!Symbol.hasOwnProperty('matchAll')) -- Symbol.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Peter Wong. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: Throws TypeError if `constructor` property is not an object
 info: |
   RegExp.prototype [ @@matchAll ] ( string )
     [...]
--- a/js/src/tests/test262/built-ins/RegExp/prototype/Symbol.matchAll/species-constructor-species-is-not-constructor.js
+++ b/js/src/tests/test262/built-ins/RegExp/prototype/Symbol.matchAll/species-constructor-species-is-not-constructor.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!Symbol.hasOwnProperty('matchAll')) -- Symbol.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Peter Wong. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: TypeError is thrown when species constructor is not a constructor
 info: |
   RegExp.prototype [ @@matchAll ] ( string )
     [...]
--- a/js/src/tests/test262/built-ins/RegExp/prototype/Symbol.matchAll/species-constructor-species-is-null-or-undefined.js
+++ b/js/src/tests/test262/built-ins/RegExp/prototype/Symbol.matchAll/species-constructor-species-is-null-or-undefined.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!Symbol.hasOwnProperty('matchAll')) -- Symbol.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Peter Wong. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: |
   Default constructor is used when species constructor is null or undefined
 info: |
   RegExp.prototype [ @@matchAll ] ( string )
--- a/js/src/tests/test262/built-ins/RegExp/prototype/Symbol.matchAll/species-constructor-species-throws.js
+++ b/js/src/tests/test262/built-ins/RegExp/prototype/Symbol.matchAll/species-constructor-species-throws.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!Symbol.hasOwnProperty('matchAll')) -- Symbol.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Peter Wong. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: Re-throws errors when calling constructor's @@species
 info: |
   RegExp.prototype [ @@matchAll ] ( string )
     [...]
--- a/js/src/tests/test262/built-ins/RegExp/prototype/Symbol.matchAll/species-constructor.js
+++ b/js/src/tests/test262/built-ins/RegExp/prototype/Symbol.matchAll/species-constructor.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!Symbol.hasOwnProperty('matchAll')) -- Symbol.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Peter Wong. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: Custom species constructor is called when creating internal RegExp
 info: |
   RegExp.prototype [ @@matchAll ] ( string )
     [...]
--- a/js/src/tests/test262/built-ins/RegExp/prototype/Symbol.matchAll/species-regexp-get-global-throws.js
+++ b/js/src/tests/test262/built-ins/RegExp/prototype/Symbol.matchAll/species-regexp-get-global-throws.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!Symbol.hasOwnProperty('matchAll')) -- Symbol.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Peter Wong. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: |
   Doesn't access the "global" property of the constructed RegExp
 info: |
   RegExp.prototype [ @@matchAll ] ( string )
--- a/js/src/tests/test262/built-ins/RegExp/prototype/Symbol.matchAll/species-regexp-get-unicode-throws.js
+++ b/js/src/tests/test262/built-ins/RegExp/prototype/Symbol.matchAll/species-regexp-get-unicode-throws.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!Symbol.hasOwnProperty('matchAll')) -- Symbol.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Peter Wong. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: |
   Doesn't access the "unicode" property of the constructed RegExp
 info: |
   RegExp.prototype [ @@matchAll ] ( string )
--- a/js/src/tests/test262/built-ins/RegExp/prototype/Symbol.matchAll/string-tostring-throws.js
+++ b/js/src/tests/test262/built-ins/RegExp/prototype/Symbol.matchAll/string-tostring-throws.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!Symbol.hasOwnProperty('matchAll')) -- Symbol.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Jordan Harband. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: String coercion of string parameter
 info: |
   RegExp.prototype [ @@matchAll ] ( string )
     [...]
--- a/js/src/tests/test262/built-ins/RegExp/prototype/Symbol.matchAll/string-tostring.js
+++ b/js/src/tests/test262/built-ins/RegExp/prototype/Symbol.matchAll/string-tostring.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!Symbol.hasOwnProperty('matchAll')) -- Symbol.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Peter Wong. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: String coercion of `string` argument
 info: |
   RegExp.prototype [ @@matchAll ] ( string )
     [...]
--- a/js/src/tests/test262/built-ins/RegExp/prototype/Symbol.matchAll/this-get-flags-throws.js
+++ b/js/src/tests/test262/built-ins/RegExp/prototype/Symbol.matchAll/this-get-flags-throws.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!Symbol.hasOwnProperty('matchAll')) -- Symbol.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Peter Wong. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: Re-throws errors thrown while accessing RegExp's flags property
 info: |
   RegExp.prototype [ @@matchAll ] ( string )
     [...]
--- a/js/src/tests/test262/built-ins/RegExp/prototype/Symbol.matchAll/this-get-flags.js
+++ b/js/src/tests/test262/built-ins/RegExp/prototype/Symbol.matchAll/this-get-flags.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!Symbol.hasOwnProperty('matchAll')) -- Symbol.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Peter Wong. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: Regexp's flags
 info: |
   RegExp.prototype [ @@matchAll ] ( string )
     [...]
--- a/js/src/tests/test262/built-ins/RegExp/prototype/Symbol.matchAll/this-lastindex-cached.js
+++ b/js/src/tests/test262/built-ins/RegExp/prototype/Symbol.matchAll/this-lastindex-cached.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!Symbol.hasOwnProperty('matchAll')) -- Symbol.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Peter Wong. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: Verify regexp's lastIndex is cached
 info: |
   RegExp.prototype [ @@matchAll ] ( string )
     [...]
--- a/js/src/tests/test262/built-ins/RegExp/prototype/Symbol.matchAll/this-not-object-throws.js
+++ b/js/src/tests/test262/built-ins/RegExp/prototype/Symbol.matchAll/this-not-object-throws.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!Symbol.hasOwnProperty('matchAll')) -- Symbol.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Jordan Harband. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: Throws TypeError when `this` is not an Object
 info: |
   RegExp.prototype [ @@matchAll ] ( string )
     1. Let R be the this value.
--- a/js/src/tests/test262/built-ins/RegExp/prototype/Symbol.matchAll/this-tolength-lastindex-throws.js
+++ b/js/src/tests/test262/built-ins/RegExp/prototype/Symbol.matchAll/this-tolength-lastindex-throws.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!Symbol.hasOwnProperty('matchAll')) -- Symbol.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Peter Wong. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: Re-throws errors while coercing RegExp's lastIndex
 info: |
   RegExp.prototype [ @@matchAll ] ( string )
     [...]
--- a/js/src/tests/test262/built-ins/RegExp/prototype/Symbol.matchAll/this-tostring-flags-throws.js
+++ b/js/src/tests/test262/built-ins/RegExp/prototype/Symbol.matchAll/this-tostring-flags-throws.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!Symbol.hasOwnProperty('matchAll')) -- Symbol.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Peter Wong. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: Re-throws errors while coercing RegExp's flags to a string
 info: |
   RegExp.prototype [ @@matchAll ] ( string )
     [...]
--- a/js/src/tests/test262/built-ins/RegExp/prototype/Symbol.matchAll/this-tostring-flags.js
+++ b/js/src/tests/test262/built-ins/RegExp/prototype/Symbol.matchAll/this-tostring-flags.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!Symbol.hasOwnProperty('matchAll')) -- Symbol.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Peter Wong. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: Corercing regexp's flags
 info: |
   RegExp.prototype [ @@matchAll ] ( string )
     [...]
--- a/js/src/tests/test262/built-ins/RegExpStringIteratorPrototype/Symbol.toStringTag.js
+++ b/js/src/tests/test262/built-ins/RegExpStringIteratorPrototype/Symbol.toStringTag.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!Symbol.hasOwnProperty('matchAll')) -- Symbol.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Peter Wong. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: |
     `Symbol.toStringTag` property descriptor
 info: |
     The initial value of the @@toStringTag property is the string value "String
--- a/js/src/tests/test262/built-ins/RegExpStringIteratorPrototype/ancestry.js
+++ b/js/src/tests/test262/built-ins/RegExpStringIteratorPrototype/ancestry.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!Symbol.hasOwnProperty('matchAll')) -- Symbol.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Peter Wong. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: |
     The [[Prototype]] internal slot ofthe %RegExpStringIteratorPrototype% is the
     %IteratorPrototype% intrinsic object (25.1.2).
 features: [Symbol.iterator, Symbol.matchAll]
--- a/js/src/tests/test262/built-ins/RegExpStringIteratorPrototype/next/custom-regexpexec-call-throws.js
+++ b/js/src/tests/test262/built-ins/RegExpStringIteratorPrototype/next/custom-regexpexec-call-throws.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!Symbol.hasOwnProperty('matchAll')) -- Symbol.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Peter Wong. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: Re-throws errors when calling exec
 info: |
   %RegExpStringIteratorPrototype%.next ( )
     [...]
--- a/js/src/tests/test262/built-ins/RegExpStringIteratorPrototype/next/custom-regexpexec-get-throws.js
+++ b/js/src/tests/test262/built-ins/RegExpStringIteratorPrototype/next/custom-regexpexec-get-throws.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!Symbol.hasOwnProperty('matchAll')) -- Symbol.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Peter Wong. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: Re-throws errors thrown while accessing RegExp's exec property
 info: |
   %RegExpStringIteratorPrototype%.next ( )
     [...]
--- a/js/src/tests/test262/built-ins/RegExpStringIteratorPrototype/next/custom-regexpexec-match-get-0-throws.js
+++ b/js/src/tests/test262/built-ins/RegExpStringIteratorPrototype/next/custom-regexpexec-match-get-0-throws.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!Symbol.hasOwnProperty('matchAll')) -- Symbol.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Peter Wong. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: Re-throws errors thrown while accessing the first match
 info: |
   %RegExpStringIteratorPrototype%.next ( )
     [...]
--- a/js/src/tests/test262/built-ins/RegExpStringIteratorPrototype/next/custom-regexpexec-match-get-0-tostring-throws.js
+++ b/js/src/tests/test262/built-ins/RegExpStringIteratorPrototype/next/custom-regexpexec-match-get-0-tostring-throws.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!Symbol.hasOwnProperty('matchAll')) -- Symbol.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Peter Wong. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: Re-throws errors thrown from coercing first match to a string
 info: |
   %RegExpStringIteratorPrototype%.next ( )
     [...]
--- a/js/src/tests/test262/built-ins/RegExpStringIteratorPrototype/next/custom-regexpexec-match-get-0-tostring.js
+++ b/js/src/tests/test262/built-ins/RegExpStringIteratorPrototype/next/custom-regexpexec-match-get-0-tostring.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!Symbol.hasOwnProperty('matchAll')) -- Symbol.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Peter Wong. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: Behavior when first match is coerced to a empty string
 info: |
   %RegExpStringIteratorPrototype%.next ( )
     [...]
--- a/js/src/tests/test262/built-ins/RegExpStringIteratorPrototype/next/custom-regexpexec-not-callable.js
+++ b/js/src/tests/test262/built-ins/RegExpStringIteratorPrototype/next/custom-regexpexec-not-callable.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!Symbol.hasOwnProperty('matchAll')) -- Symbol.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Peter Wong. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: Behavior with a custom RegExp exec
 info: |
   %RegExpStringIteratorPrototype%.next ( )
     [...]
--- a/js/src/tests/test262/built-ins/RegExpStringIteratorPrototype/next/custom-regexpexec.js
+++ b/js/src/tests/test262/built-ins/RegExpStringIteratorPrototype/next/custom-regexpexec.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!Symbol.hasOwnProperty('matchAll')) -- Symbol.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Peter Wong. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: Behavior with a custom RegExp exec
 info: |
   %RegExpStringIteratorPrototype%.next ( )
     [...]
--- a/js/src/tests/test262/built-ins/RegExpStringIteratorPrototype/next/length.js
+++ b/js/src/tests/test262/built-ins/RegExpStringIteratorPrototype/next/length.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!Symbol.hasOwnProperty('matchAll')) -- Symbol.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Peter Wong. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: |
   %RegExpStringIteratorPrototype%.next `length` property
 info: |
   17 ECMAScript Standard Built-in Objects:
--- a/js/src/tests/test262/built-ins/RegExpStringIteratorPrototype/next/name.js
+++ b/js/src/tests/test262/built-ins/RegExpStringIteratorPrototype/next/name.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!Symbol.hasOwnProperty('matchAll')) -- Symbol.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Peter Wong. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: |
   %RegExpStringIteratorPrototype%.next `name` property
 info: |
   17 ECMAScript Standard Built-in Objects:
--- a/js/src/tests/test262/built-ins/RegExpStringIteratorPrototype/next/next-iteration-global.js
+++ b/js/src/tests/test262/built-ins/RegExpStringIteratorPrototype/next/next-iteration-global.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!Symbol.hasOwnProperty('matchAll')) -- Symbol.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Peter Wong. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: Iterates over each match
 info: |
   %RegExpStringIteratorPrototype%.next ( )
     [...]
--- a/js/src/tests/test262/built-ins/RegExpStringIteratorPrototype/next/next-iteration.js
+++ b/js/src/tests/test262/built-ins/RegExpStringIteratorPrototype/next/next-iteration.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!Symbol.hasOwnProperty('matchAll')) -- Symbol.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Peter Wong. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: Iterates over the first match
 info: |
   %RegExpStringIteratorPrototype%.next ( )
     [...]
--- a/js/src/tests/test262/built-ins/RegExpStringIteratorPrototype/next/next-missing-internal-slots.js
+++ b/js/src/tests/test262/built-ins/RegExpStringIteratorPrototype/next/next-missing-internal-slots.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!Symbol.hasOwnProperty('matchAll')) -- Symbol.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Peter Wong. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: Throws TypeError when `this` does not have all internal slots
 info: |
   %RegExpStringIteratorPrototype%.next ( )
     1. Let O be the this value.
--- a/js/src/tests/test262/built-ins/RegExpStringIteratorPrototype/next/prop-desc.js
+++ b/js/src/tests/test262/built-ins/RegExpStringIteratorPrototype/next/prop-desc.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!Symbol.hasOwnProperty('matchAll')) -- Symbol.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Peter Wong. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: |
   %RegExpStringIteratorPrototype%.next property descriptor
 info: |
   17 ECMAScript Standard Built-in Objects:
--- a/js/src/tests/test262/built-ins/RegExpStringIteratorPrototype/next/regexp-tolength-lastindex-throws.js
+++ b/js/src/tests/test262/built-ins/RegExpStringIteratorPrototype/next/regexp-tolength-lastindex-throws.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!Symbol.hasOwnProperty('matchAll')) -- Symbol.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Peter Wong. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: Re-throws errors thrown coercing RegExp's lastIndex to a length
 info: |
   %RegExpStringIteratorPrototype%.next ( )
     [...]
--- a/js/src/tests/test262/built-ins/RegExpStringIteratorPrototype/next/this-is-not-object-throws.js
+++ b/js/src/tests/test262/built-ins/RegExpStringIteratorPrototype/next/this-is-not-object-throws.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!Symbol.hasOwnProperty('matchAll')) -- Symbol.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Peter Wong. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: Throws TypeError when `this` is not an Object
 info: |
   %RegExpStringIteratorPrototype%.next ( )
     1. Let O be the this value.
--- a/js/src/tests/test262/built-ins/String/prototype/matchAll/length.js
+++ b/js/src/tests/test262/built-ins/String/prototype/matchAll/length.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!String.prototype.hasOwnProperty('matchAll')) -- String.prototype.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Jordan Harband. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: String.prototype.matchAll `length` property
 info: |
   17 ECMAScript Standard Built-in Objects:
 
--- a/js/src/tests/test262/built-ins/String/prototype/matchAll/name.js
+++ b/js/src/tests/test262/built-ins/String/prototype/matchAll/name.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!String.prototype.hasOwnProperty('matchAll')) -- String.prototype.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Jordan Harband. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: String.prototype.matchAll `name` property
 info: |
   17 ECMAScript Standard Built-in Objects:
 
--- a/js/src/tests/test262/built-ins/String/prototype/matchAll/prop-desc.js
+++ b/js/src/tests/test262/built-ins/String/prototype/matchAll/prop-desc.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!String.prototype.hasOwnProperty('matchAll')) -- String.prototype.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Jordan Harband. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: String.prototype.matchAll property descriptor
 info: |
   17 ECMAScript Standard Built-in Objects:
 
--- a/js/src/tests/test262/built-ins/String/prototype/matchAll/regexp-get-matchAll-throws.js
+++ b/js/src/tests/test262/built-ins/String/prototype/matchAll/regexp-get-matchAll-throws.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!Symbol.hasOwnProperty('matchAll')||!String.prototype.hasOwnProperty('matchAll')) -- Symbol.matchAll,String.prototype.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Peter Wong. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: Re-throws errors when calling @@matchAll
 info: |
   String.prototype.matchAll ( regexp )
     [...]
--- a/js/src/tests/test262/built-ins/String/prototype/matchAll/regexp-is-null.js
+++ b/js/src/tests/test262/built-ins/String/prototype/matchAll/regexp-is-null.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!String.prototype.hasOwnProperty('matchAll')) -- String.prototype.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Peter Wong. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: Behavior when regexp is null
 info: |
   String.prototype.matchAll ( regexp )
     1. Let O be ? RequireObjectCoercible(this value).
--- a/js/src/tests/test262/built-ins/String/prototype/matchAll/regexp-is-undefined-or-null-invokes-matchAll.js
+++ b/js/src/tests/test262/built-ins/String/prototype/matchAll/regexp-is-undefined-or-null-invokes-matchAll.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!String.prototype.hasOwnProperty('matchAll')) -- String.prototype.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Peter Wong. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: Behavior when regexp is null or undefined
 info: |
   String.prototype.matchAll ( regexp )
     1. Let O be ? RequireObjectCoercible(this value).
--- a/js/src/tests/test262/built-ins/String/prototype/matchAll/regexp-is-undefined.js
+++ b/js/src/tests/test262/built-ins/String/prototype/matchAll/regexp-is-undefined.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!String.prototype.hasOwnProperty('matchAll')) -- String.prototype.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Peter Wong. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: Behavior when regexp is null
 info: |
   String.prototype.matchAll ( regexp )
     1. Let O be ? RequireObjectCoercible(this value).
--- a/js/src/tests/test262/built-ins/String/prototype/matchAll/regexp-matchAll-invocation.js
+++ b/js/src/tests/test262/built-ins/String/prototype/matchAll/regexp-matchAll-invocation.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!Symbol.hasOwnProperty('matchAll')||!String.prototype.hasOwnProperty('matchAll')) -- Symbol.matchAll,String.prototype.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Jordan Harband. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: Invocation of @@matchAll property of user-supplied RegExp objects
 info: |
   String.prototype.matchAll ( regexp )
     [...]
--- a/js/src/tests/test262/built-ins/String/prototype/matchAll/regexp-matchAll-is-undefined-or-null.js
+++ b/js/src/tests/test262/built-ins/String/prototype/matchAll/regexp-matchAll-is-undefined-or-null.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!Symbol.hasOwnProperty('matchAll')||!String.prototype.hasOwnProperty('matchAll')) -- Symbol.matchAll,String.prototype.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Peter Wong. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: Behavior when regexp[@@matchAll] is undefined or null
 info: |
   String.prototype.matchAll ( regexp )
     1. Let O be ? RequireObjectCoercible(this value).
--- a/js/src/tests/test262/built-ins/String/prototype/matchAll/regexp-matchAll-not-callable.js
+++ b/js/src/tests/test262/built-ins/String/prototype/matchAll/regexp-matchAll-not-callable.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!Symbol.hasOwnProperty('matchAll')||!String.prototype.hasOwnProperty('matchAll')) -- Symbol.matchAll,String.prototype.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Peter Wong. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: Behavior when regexp[@@matchAll] is not callable
 info: |
   String.prototype.matchAll ( regexp )
     [...]
--- a/js/src/tests/test262/built-ins/String/prototype/matchAll/regexp-matchAll-throws.js
+++ b/js/src/tests/test262/built-ins/String/prototype/matchAll/regexp-matchAll-throws.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!Symbol.hasOwnProperty('matchAll')||!String.prototype.hasOwnProperty('matchAll')) -- Symbol.matchAll,String.prototype.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Peter Wong. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: Re-throws errors when calling @@matchAll
 info: |
   String.prototype.matchAll ( regexp )
     [...]
--- a/js/src/tests/test262/built-ins/String/prototype/matchAll/regexp-prototype-get-matchAll-throws.js
+++ b/js/src/tests/test262/built-ins/String/prototype/matchAll/regexp-prototype-get-matchAll-throws.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!Symbol.hasOwnProperty('matchAll')) -- Symbol.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Peter Wong. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: Re-throws errors thrown while accessing RegExp's @@matchAll property
 info: |
   String.prototype.matchAll ( regexp )
     [...]
--- a/js/src/tests/test262/built-ins/String/prototype/matchAll/regexp-prototype-has-no-matchAll.js
+++ b/js/src/tests/test262/built-ins/String/prototype/matchAll/regexp-prototype-has-no-matchAll.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!Symbol.hasOwnProperty('matchAll')||!String.prototype.hasOwnProperty('matchAll')) -- Symbol.matchAll,String.prototype.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Peter Wong. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: Behavior when @@matchAll is removed from RegExp's prototype
 info: |
   String.prototype.matchAll ( regexp )
     1. Let O be ? RequireObjectCoercible(this value).
--- a/js/src/tests/test262/built-ins/String/prototype/matchAll/regexp-prototype-matchAll-invocation.js
+++ b/js/src/tests/test262/built-ins/String/prototype/matchAll/regexp-prototype-matchAll-invocation.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!Symbol.hasOwnProperty('matchAll')) -- Symbol.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Jordan Harband. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: Behavior when invoking of @@matchAll
 info: |
   String.prototype.matchAll ( regexp )
     [...]
--- a/js/src/tests/test262/built-ins/String/prototype/matchAll/regexp-prototype-matchAll-throws.js
+++ b/js/src/tests/test262/built-ins/String/prototype/matchAll/regexp-prototype-matchAll-throws.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!Symbol.hasOwnProperty('matchAll')) -- Symbol.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Peter Wong. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: Re-throws errors when calling @@matchAll
 info: |
   String.prototype.matchAll ( regexp )
     [...]
--- a/js/src/tests/test262/built-ins/String/prototype/matchAll/this-val-non-obj-coercible.js
+++ b/js/src/tests/test262/built-ins/String/prototype/matchAll/this-val-non-obj-coercible.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!String.prototype.hasOwnProperty('matchAll')) -- String.prototype.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Jordan Harband. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: The `this` value cannot be coerced into an object
 info: |
   String.prototype.matchAll ( regexp )
     1. Let O be RequireObjectCoercible(this value).
--- a/js/src/tests/test262/built-ins/String/prototype/matchAll/toString-this-val.js
+++ b/js/src/tests/test262/built-ins/String/prototype/matchAll/toString-this-val.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!Symbol.hasOwnProperty('matchAll')||!String.prototype.hasOwnProperty('matchAll')) -- Symbol.matchAll,String.prototype.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Peter Wong. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: |
   Verify ToString is called when regexp[@@matchAll] is undefined or null
 info: |
   String.prototype.matchAll ( regexp )
--- a/js/src/tests/test262/built-ins/Symbol/matchAll/cross-realm.js
+++ b/js/src/tests/test262/built-ins/Symbol/matchAll/cross-realm.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!Symbol.hasOwnProperty('matchAll')) -- Symbol.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Peter Wong. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: Value shared by all realms
 info: |
   Unless otherwise specified, well-known symbols values are shared by all
   realms.
--- a/js/src/tests/test262/built-ins/Symbol/matchAll/prop-desc.js
+++ b/js/src/tests/test262/built-ins/Symbol/matchAll/prop-desc.js
@@ -1,9 +1,8 @@
-// |reftest| skip-if(!Symbol.hasOwnProperty('matchAll')) -- Symbol.matchAll is not enabled unconditionally
 // Copyright (C) 2018 Peter Wong. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: pending
 description: |
     `Symbol.matchAll` property descriptor
 info: |
     This property has the attributes { [[Writable]]: false, [[Enumerable]]:
--- a/layout/base/PresShell.cpp
+++ b/layout/base/PresShell.cpp
@@ -7962,72 +7962,78 @@ nsresult PresShell::EventHandler::Handle
                 handlerStartTime);
           }
           break;
         default:
           break;
       }
     }
   }
-
-  if (Telemetry::CanRecordBase() && !aEvent->mTimeStamp.IsNull() &&
-      aEvent->mTimeStamp > mPresShell->mLastOSWake && aEvent->AsInputEvent()) {
-    TimeStamp now = TimeStamp::Now();
-    double millis = (now - aEvent->mTimeStamp).ToMilliseconds();
-    Telemetry::Accumulate(Telemetry::INPUT_EVENT_RESPONSE_MS, millis);
-    if (GetDocument() &&
-        GetDocument()->GetReadyStateEnum() != Document::READYSTATE_COMPLETE) {
-      Telemetry::Accumulate(Telemetry::LOAD_INPUT_EVENT_RESPONSE_MS, millis);
-    }
-
-    if (!sLastInputProcessed || sLastInputProcessed < aEvent->mTimeStamp) {
-      if (sLastInputProcessed) {
-        // This input event was created after we handled the last one.
-        // Accumulate the previous events' coalesced duration.
-        double lastMillis =
-            (sLastInputProcessed - sLastInputCreated).ToMilliseconds();
-        Telemetry::Accumulate(Telemetry::INPUT_EVENT_RESPONSE_COALESCED_MS,
-                              lastMillis);
-
-        if (MOZ_UNLIKELY(!PresShell::sProcessInteractable)) {
-          // For content process, we use the ready state of
-          // top-level-content-document to know if the process has finished the
-          // start-up.
-          // For parent process, see the topic
-          // 'sessionstore-one-or-no-tab-restored' in PresShell::Observe.
-          if (XRE_IsContentProcess() && GetDocument() &&
-              GetDocument()->IsTopLevelContentDocument()) {
-            switch (GetDocument()->GetReadyStateEnum()) {
-              case Document::READYSTATE_INTERACTIVE:
-              case Document::READYSTATE_COMPLETE:
-                PresShell::sProcessInteractable = true;
-                break;
-              default:
-                break;
-            }
+  RecordEventHandlingResponsePerformance(aEvent);
+  return rv;
+}
+
+void PresShell::EventHandler::RecordEventHandlingResponsePerformance(
+    const WidgetEvent* aEvent) {
+  if (!Telemetry::CanRecordBase() || aEvent->mTimeStamp.IsNull() ||
+      aEvent->mTimeStamp <= mPresShell->mLastOSWake ||
+      !aEvent->AsInputEvent()) {
+    return;
+  }
+
+  TimeStamp now = TimeStamp::Now();
+  double millis = (now - aEvent->mTimeStamp).ToMilliseconds();
+  Telemetry::Accumulate(Telemetry::INPUT_EVENT_RESPONSE_MS, millis);
+  if (GetDocument() &&
+      GetDocument()->GetReadyStateEnum() != Document::READYSTATE_COMPLETE) {
+    Telemetry::Accumulate(Telemetry::LOAD_INPUT_EVENT_RESPONSE_MS, millis);
+  }
+
+  if (!sLastInputProcessed || sLastInputProcessed < aEvent->mTimeStamp) {
+    if (sLastInputProcessed) {
+      // This input event was created after we handled the last one.
+      // Accumulate the previous events' coalesced duration.
+      double lastMillis =
+          (sLastInputProcessed - sLastInputCreated).ToMilliseconds();
+      Telemetry::Accumulate(Telemetry::INPUT_EVENT_RESPONSE_COALESCED_MS,
+                            lastMillis);
+
+      if (MOZ_UNLIKELY(!PresShell::sProcessInteractable)) {
+        // For content process, we use the ready state of
+        // top-level-content-document to know if the process has finished the
+        // start-up.
+        // For parent process, see the topic
+        // 'sessionstore-one-or-no-tab-restored' in PresShell::Observe.
+        if (XRE_IsContentProcess() && GetDocument() &&
+            GetDocument()->IsTopLevelContentDocument()) {
+          switch (GetDocument()->GetReadyStateEnum()) {
+            case Document::READYSTATE_INTERACTIVE:
+            case Document::READYSTATE_COMPLETE:
+              PresShell::sProcessInteractable = true;
+              break;
+            default:
+              break;
           }
         }
-        if (MOZ_LIKELY(PresShell::sProcessInteractable)) {
-          Telemetry::Accumulate(Telemetry::INPUT_EVENT_RESPONSE_POST_STARTUP_MS,
-                                lastMillis);
-        } else {
-          Telemetry::Accumulate(Telemetry::INPUT_EVENT_RESPONSE_STARTUP_MS,
-                                lastMillis);
-        }
-      }
-      sLastInputCreated = aEvent->mTimeStamp;
-    } else if (aEvent->mTimeStamp < sLastInputCreated) {
-      // This event was created before the last input. May be processing out
-      // of order, so coalesce backwards, too.
-      sLastInputCreated = aEvent->mTimeStamp;
-    }
-    sLastInputProcessed = now;
-  }
-
-  return rv;
+      }
+      if (MOZ_LIKELY(PresShell::sProcessInteractable)) {
+        Telemetry::Accumulate(Telemetry::INPUT_EVENT_RESPONSE_POST_STARTUP_MS,
+                              lastMillis);
+      } else {
+        Telemetry::Accumulate(Telemetry::INPUT_EVENT_RESPONSE_STARTUP_MS,
+                              lastMillis);
+      }
+    }
+    sLastInputCreated = aEvent->mTimeStamp;
+  } else if (aEvent->mTimeStamp < sLastInputCreated) {
+    // This event was created before the last input. May be processing out
+    // of order, so coalesce backwards, too.
+    sLastInputCreated = aEvent->mTimeStamp;
+  }
+  sLastInputProcessed = now;
 }
 
 // static
 already_AddRefed<nsIURI>
 PresShell::EventHandler::GetDocumentURIToCompareWithBlacklist(
     PresShell& aPresShell) {
   nsPresContext* presContext = aPresShell.GetPresContext();
   if (NS_WARN_IF(!presContext)) {
--- a/layout/base/PresShell.h
+++ b/layout/base/PresShell.h
@@ -1046,16 +1046,24 @@ class PresShell final : public nsIPresSh
      */
     MOZ_CAN_RUN_SCRIPT
     nsresult HandleEventInternal(WidgetEvent* aEvent,
                                  nsEventStatus* aEventStatus,
                                  bool aIsHandlingNativeEvent,
                                  nsIContent* aOverrideClickTarget);
 
     /**
+     * RecordEventHandlingResponsePerformance() records event handling response
+     * performance with telemetry.
+     *
+     * @param aEvent            The handled event.
+     */
+    void RecordEventHandlingResponsePerformance(const WidgetEvent* aEvent);
+
+    /**
      * This and the next two helper methods are used to target and position the
      * context menu when the keyboard shortcut is used to open it.
      *
      * If another menu is open, the context menu is opened relative to the
      * active menuitem within the menu, or the menu itself if no item is active.
      * Otherwise, if the caret is visible, the menu is opened near the caret.
      * Otherwise, if a selectable list such as a listbox is focused, the
      * current item within the menu is opened relative to this item.
--- a/layout/generic/ViewportFrame.cpp
+++ b/layout/generic/ViewportFrame.cpp
@@ -55,28 +55,16 @@ void ViewportFrame::BuildDisplayList(nsD
                       GRAPHICS_DisplayListBuilding);
 
   if (nsIFrame* kid = mFrames.FirstChild()) {
     // make the kid's BorderBackground our own. This ensures that the canvas
     // frame's background becomes our own background and therefore appears
     // below negative z-index elements.
     BuildDisplayListForChild(aBuilder, kid, aLists);
   }
-
-  nsDisplayList topLayerList;
-  BuildDisplayListForTopLayer(aBuilder, &topLayerList);
-  if (!topLayerList.IsEmpty()) {
-    // Wrap the whole top layer in a single item with maximum z-index,
-    // and append it at the very end, so that it stays at the topmost.
-    nsDisplayWrapList* wrapList =
-        MakeDisplayItem<nsDisplayWrapList>(aBuilder, this, &topLayerList);
-    wrapList->SetOverrideZIndex(
-        std::numeric_limits<decltype(wrapList->ZIndex())>::max());
-    aLists.PositionedDescendants()->AppendToTop(wrapList);
-  }
 }
 
 #ifdef DEBUG
 /**
  * Returns whether we are going to put an element in the top layer for
  * fullscreen. This function should matches the CSS rule in ua.css.
  */
 static bool ShouldInTopLayerForFullscreen(Element* aElement) {
--- a/layout/generic/nsFlexContainerFrame.cpp
+++ b/layout/generic/nsFlexContainerFrame.cpp
@@ -1913,16 +1913,17 @@ FlexItem::FlexItem(ReflowInput& aFlexIte
     // (1) Use prefixed "box-align" instead of "align-items" to determine the
     //     container's cross-axis alignment behavior.
     // (2) Suppress the ability for flex items to override that with their own
     //     cross-axis alignment. (The legacy box model doesn't support this.)
     // So, each FlexItem simply copies the container's converted "align-items"
     // value and disregards their own "align-self" property.
     const nsStyleXUL* containerStyleXUL = containerRS->mFrame->StyleXUL();
     mAlignSelf = ConvertLegacyStyleToAlignItems(containerStyleXUL);
+    mAlignSelfFlags = 0;
   } else {
     mAlignSelf = aFlexItemReflowInput.mStylePosition->UsedAlignSelf(
         containerRS->mFrame->Style());
     if (MOZ_LIKELY(mAlignSelf == NS_STYLE_ALIGN_NORMAL)) {
       mAlignSelf = NS_STYLE_ALIGN_STRETCH;
     }
 
     // Store and strip off the <overflow-position> bits
@@ -1995,17 +1996,18 @@ FlexItem::FlexItem(nsIFrame* aChildFrame
       mHadMinViolation(false),
       mHadMaxViolation(false),
       mHadMeasuringReflow(false),
       mIsStretched(false),
       mIsStrut(true),  // (this is the constructor for making struts, after all)
       mIsInlineAxisMainAxis(true),  // (doesn't matter, we're not doing layout)
       mNeedsMinSizeAutoResolution(false),
       mHasAnyAutoMargin(false),
-      mAlignSelf(NS_STYLE_ALIGN_FLEX_START) {
+      mAlignSelf(NS_STYLE_ALIGN_FLEX_START),
+      mAlignSelfFlags(0) {
   MOZ_ASSERT(mFrame, "expecting a non-null child frame");
   MOZ_ASSERT(
       NS_STYLE_VISIBILITY_COLLAPSE == mFrame->StyleVisibility()->mVisible,
       "Should only make struts for children with 'visibility:collapse'");
   MOZ_ASSERT(!mFrame->IsPlaceholderFrame(),
              "placeholder frames should not be treated as flex items");
   MOZ_ASSERT(!(mFrame->GetStateBits() & NS_FRAME_OUT_OF_FLOW),
              "out-of-flow frames should not be treated as flex items");
--- a/layout/generic/nsFrame.cpp
+++ b/layout/generic/nsFrame.cpp
@@ -1314,17 +1314,17 @@ void nsIFrame::SyncFrameViewProperties(n
   int32_t zIndex = 0;
   bool autoZIndex = false;
 
   if (IsAbsPosContainingBlock()) {
     // Make sure z-index is correct
     ComputedStyle* sc = Style();
     const nsStylePosition* position = sc->StylePosition();
     if (position->mZIndex.IsInteger()) {
-      zIndex = position->mZIndex.integer._0;
+      zIndex = position->mZIndex.AsInteger();
     } else {
       MOZ_ASSERT(position->mZIndex.IsAuto());
       autoZIndex = true;
     }
   } else {
     autoZIndex = true;
   }
 
--- a/layout/generic/nsGfxScrollFrame.cpp
+++ b/layout/generic/nsGfxScrollFrame.cpp
@@ -63,16 +63,17 @@
 #include "gfxPrefs.h"
 #include "ScrollAnimationPhysics.h"
 #include "ScrollAnimationBezierPhysics.h"
 #include "ScrollAnimationMSDPhysics.h"
 #include "ScrollSnap.h"
 #include "UnitTransforms.h"
 #include "nsPluginFrame.h"
 #include "nsSliderFrame.h"
+#include "ViewportFrame.h"
 #include "mozilla/layers/APZCCallbackHelper.h"
 #include "mozilla/layers/AxisPhysicsModel.h"
 #include "mozilla/layers/AxisPhysicsMSDModel.h"
 #include "mozilla/layers/LayerTransactionChild.h"
 #include "mozilla/layers/ScrollLinkedEffectDetector.h"
 #include "mozilla/Unused.h"
 #include "VisualViewport.h"
 #include "LayersLogging.h"  // for Stringify
@@ -2405,24 +2406,16 @@ void ScrollFrameHelper::MarkScrollbarsDi
                                 NS_FRAME_IS_DIRTY);
   }
   if (mHScrollbarBox) {
     presShell->FrameNeedsReflow(mHScrollbarBox, nsIPresShell::eResize,
                                 NS_FRAME_IS_DIRTY);
   }
 }
 
-bool ScrollFrameHelper::ShouldClampScrollPosition() const {
-  if (!mIsRoot) return true;
-  nsSubDocumentFrame* subdocFrame =
-      static_cast<nsSubDocumentFrame*>(nsLayoutUtils::GetCrossDocParentFrame(
-          mOuter->PresShell()->GetRootFrame()));
-  return !subdocFrame || subdocFrame->ShouldClampScrollPosition();
-}
-
 bool ScrollFrameHelper::IsAlwaysActive() const {
   if (nsDisplayItem::ForceActiveLayers()) {
     return true;
   }
 
   // Unless this is the root scrollframe for a non-chrome document
   // which is the direct child of a chrome document, we default to not
   // being "active".
@@ -3373,16 +3366,18 @@ void ScrollFrameHelper::BuildDisplayList
           aBuilder, mOuter, visibleRect, dirtyRect);
 
       // Don't clip the scrolled child, and don't paint scrollbars/scrollcorner.
       // The scrolled frame shouldn't have its own background/border, so we
       // can just pass aLists directly.
       mOuter->BuildDisplayListForChild(aBuilder, mScrolledFrame, aLists);
     }
 
+    MaybeAddTopLayerItems(aBuilder, aLists);
+
     if (addScrollBars) {
       // Add overlay scrollbars.
       AppendScrollPartsTo(aBuilder, aLists, createLayersForScrollbars, true);
     }
 
     return;
   }
 
@@ -3657,16 +3652,18 @@ void ScrollFrameHelper::BuildDisplayList
         if (mWillBuildScrollableLayer) {
           asrSetter.InsertScrollFrame(sf);
           aBuilder->SetDisablePartialUpdates(true);
         }
       }
     }
   }
 
+  MaybeAddTopLayerItems(aBuilder, set);
+
   if (willBuildAsyncZoomContainer) {
     MOZ_ASSERT(mClipAllDescendants);
 
     // Wrap all our scrolled contents in an nsDisplayAsyncZoom. This will be
     // the layer that gets scaled for APZ zooming. It does not have the
     // scrolled ASR, but it does have the composition bounds clip applied to
     // it. The children have the layout viewport clip applied to them (above).
     // Effectively we are double clipping to the viewport, at potentially
@@ -3730,16 +3727,35 @@ void ScrollFrameHelper::BuildDisplayList
 
   // Now display overlay scrollbars and the resizer, if we have one.
   AppendScrollPartsTo(aBuilder, scrolledContent, createLayersForScrollbars,
                       true);
 
   scrolledContent.MoveTo(aLists);
 }
 
+void ScrollFrameHelper::MaybeAddTopLayerItems(nsDisplayListBuilder* aBuilder,
+                                              const nsDisplayListSet& aLists) {
+  if (mIsRoot) {
+    if (ViewportFrame* viewportFrame = do_QueryFrame(mOuter->GetParent())) {
+      nsDisplayList topLayerList;
+      viewportFrame->BuildDisplayListForTopLayer(aBuilder, &topLayerList);
+      if (!topLayerList.IsEmpty()) {
+        // Wrap the whole top layer in a single item with maximum z-index,
+        // and append it at the very end, so that it stays at the topmost.
+        nsDisplayWrapList* wrapList = MakeDisplayItem<nsDisplayWrapList>(
+            aBuilder, viewportFrame, &topLayerList);
+        wrapList->SetOverrideZIndex(
+            std::numeric_limits<decltype(wrapList->ZIndex())>::max());
+        aLists.PositionedDescendants()->AppendToTop(wrapList);
+      }
+    }
+  }
+}
+
 bool ScrollFrameHelper::DecideScrollableLayer(
     nsDisplayListBuilder* aBuilder, nsRect* aVisibleRect, nsRect* aDirtyRect,
     bool aSetBase, bool* aDirtyRectHasBeenOverriden) {
   // Save and check if this changes so we can recompute the current agr.
   bool oldWillBuildScrollableLayer = mWillBuildScrollableLayer;
 
   nsIContent* content = mOuter->GetContent();
   bool usingDisplayPort = nsLayoutUtils::HasDisplayPort(content);
@@ -4030,20 +4046,16 @@ nsRect ScrollFrameHelper::GetScrollRange
                                          nscoord aHeight) const {
   nsRect range = GetScrolledRect();
   range.width = std::max(range.width - aWidth, 0);
   range.height = std::max(range.height - aHeight, 0);
   return range;
 }
 
 nsRect ScrollFrameHelper::GetScrollRangeForClamping() const {
-  if (!ShouldClampScrollPosition()) {
-    return nsRect(nscoord_MIN / 2, nscoord_MIN / 2,
-                  nscoord_MAX - nscoord_MIN / 2, nscoord_MAX - nscoord_MIN / 2);
-  }
   nsSize visualViewportSize = GetVisualViewportSize();
   return GetScrollRange(visualViewportSize.width, visualViewportSize.height);
 }
 
 nsSize ScrollFrameHelper::GetVisualViewportSize() const {
   nsIPresShell* presShell = mOuter->PresShell();
   if (mIsRoot && presShell->IsVisualViewportSizeSet()) {
     return presShell->GetVisualViewportSize();
--- a/layout/generic/nsGfxScrollFrame.h
+++ b/layout/generic/nsGfxScrollFrame.h
@@ -77,16 +77,28 @@ class ScrollFrameHelper : public nsIRefl
   void FireScrollEndEvent();
   void PostOverflowEvent();
   using PostDestroyData = nsIFrame::PostDestroyData;
   void Destroy(PostDestroyData& aPostDestroyData);
 
   void BuildDisplayList(nsDisplayListBuilder* aBuilder,
                         const nsDisplayListSet& aLists);
 
+  // Add display items for the top-layer (which includes things like
+  // the fullscreen element, its backdrop, and text selection carets)
+  // to |aLists|.
+  // This is a no-op for scroll frames other than the viewport's
+  // root scroll frame.
+  // This should be called with an nsDisplayListSet that will be
+  // wrapped in the async zoom container, if we're building one.
+  // It should not be called with an ASR setter on the stack, as the
+  // top-layer items handle setting up their own ASRs.
+  void MaybeAddTopLayerItems(nsDisplayListBuilder* aBuilder,
+                             const nsDisplayListSet& aLists);
+
   void AppendScrollPartsTo(nsDisplayListBuilder* aBuilder,
                            const nsDisplayListSet& aLists, bool aCreateLayer,
                            bool aPositioned);
 
   bool GetBorderRadii(const nsSize& aFrameSize, const nsSize& aBorderArea,
                       Sides aSkipSides, nscoord aRadii[8]) const;
 
   // nsIReflowCallback
@@ -430,18 +442,16 @@ class ScrollFrameHelper : public nsIRefl
       bool aHasResizer, mozilla::layers::ScrollDirection aDirection);
   // returns true if a resizer should be visible
   bool HasResizer() { return mResizerBox && !mCollapsedResizer; }
   void LayoutScrollbars(nsBoxLayoutState& aState, const nsRect& aContentArea,
                         const nsRect& aOldScrollArea);
 
   void MarkScrollbarsDirtyForReflow() const;
 
-  bool ShouldClampScrollPosition() const;
-
   bool IsAlwaysActive() const;
   void MarkEverScrolled();
   void MarkRecentlyScrolled();
   void MarkNotRecentlyScrolled();
   nsExpirationState* GetExpirationState() { return &mActivityExpirationState; }
 
   void SetTransformingByAPZ(bool aTransforming) {
     if (mTransformingByAPZ && !aTransforming) {
--- a/layout/generic/nsSubDocumentFrame.h
+++ b/layout/generic/nsSubDocumentFrame.h
@@ -96,21 +96,16 @@ class nsSubDocumentFrame final : public 
   enum { IGNORE_PAINT_SUPPRESSION = 0x1 };
   nsIPresShell* GetSubdocumentPresShellForPainting(uint32_t aFlags);
   mozilla::ScreenIntSize GetSubdocumentSize();
 
   // nsIReflowCallback
   bool ReflowFinished() override;
   void ReflowCallbackCanceled() override;
 
-  bool ShouldClampScrollPosition() {
-    nsFrameLoader* frameLoader = FrameLoader();
-    return !frameLoader || frameLoader->ShouldClampScrollPosition();
-  }
-
   /**
    * Return true if pointer event hit-testing should be allowed to target
    * content in the subdocument.
    */
   bool PassPointerEventsToChildren();
 
   void MaybeShowViewer() {
     if (!mDidCreateDoc && !mCallingShow) {
--- a/layout/painting/nsCSSRendering.cpp
+++ b/layout/painting/nsCSSRendering.cpp
@@ -1024,18 +1024,17 @@ Maybe<nsCSSBorderRenderer> nsCSSRenderin
     }
     if (width == 0) {
       return Nothing();  // empty outline
     }
     // http://dev.w3.org/csswg/css-ui/#outline
     // "User agents may treat 'auto' as 'solid'."
     outlineStyle = StyleBorderStyle::Solid;
   } else {
-    MOZ_ASSERT(ourOutline->mOutlineStyle.IsBorderStyle());
-    outlineStyle = ourOutline->mOutlineStyle.border_style._0;
+    outlineStyle = ourOutline->mOutlineStyle.AsBorderStyle();
   }
 
   StyleBorderStyle outlineStyles[4] = {outlineStyle, outlineStyle, outlineStyle,
                                        outlineStyle};
 
   // This handles treating the initial color as 'currentColor'; if we
   // ever want 'invert' back we'll need to do a bit of work here too.
   nscolor outlineColor =
--- a/layout/painting/nsCSSRenderingBorders.cpp
+++ b/layout/painting/nsCSSRenderingBorders.cpp
@@ -3736,20 +3736,20 @@ nsCSSBorderImageRenderer::nsCSSBorderIma
   nsMargin border;
   NS_FOR_CSS_SIDES(s) {
     const auto& slice = aStyleBorder.mBorderImageSlice.offsets.Get(s);
     int32_t imgDimension =
         SideIsVertical(s) ? mImageSize.width : mImageSize.height;
     nscoord borderDimension = SideIsVertical(s) ? mArea.width : mArea.height;
     double value;
     if (slice.IsNumber()) {
-      value = nsPresContext::CSSPixelsToAppUnits(NS_lround(slice.number._0));
+      value = nsPresContext::CSSPixelsToAppUnits(NS_lround(slice.AsNumber()));
     } else {
       MOZ_ASSERT(slice.IsPercentage());
-      value = slice.percentage._0._0 * imgDimension;
+      value = slice.AsPercentage()._0 * imgDimension;
     }
     if (value < 0) value = 0;
     if (value > imgDimension) value = imgDimension;
     mSlice.Side(s) = value;
 
     nsStyleCoord coord = aStyleBorder.mBorderImageWidth.Get(s);
     switch (coord.GetUnit()) {
       case eStyleUnit_Coord:  // absolute dimension
--- a/layout/painting/nsDisplayList.cpp
+++ b/layout/painting/nsDisplayList.cpp
@@ -3148,17 +3148,17 @@ bool nsDisplayItem::ForceActiveLayers() 
 }
 
 static int32_t ZIndexForFrame(nsIFrame* aFrame) {
   if (!aFrame->IsAbsPosContainingBlock() && !aFrame->IsFlexOrGridItem())
     return 0;
 
   const nsStylePosition* position = aFrame->StylePosition();
   if (position->mZIndex.IsInteger())
-    return position->mZIndex.integer._0;
+    return position->mZIndex.AsInteger();
   MOZ_ASSERT(position->mZIndex.IsAuto());
   // sort the auto and 0 elements together
   return 0;
 }
 
 int32_t nsDisplayItem::ZIndex() const { return ZIndexForFrame(mFrame); }
 
 bool nsDisplayItem::ComputeVisibility(nsDisplayListBuilder* aBuilder,
--- a/layout/style/FontFaceSet.cpp
+++ b/layout/style/FontFaceSet.cpp
@@ -223,20 +223,20 @@ void FontFaceSet::ParseFontShorthandForM
   switch (style.tag) {
     case StyleComputedFontStyleDescriptor::Tag::Normal:
       aStyle = FontSlantStyle::Normal();
       break;
     case StyleComputedFontStyleDescriptor::Tag::Italic:
       aStyle = FontSlantStyle::Italic();
       break;
     case StyleComputedFontStyleDescriptor::Tag::Oblique:
-      MOZ_ASSERT(style.oblique._0 == style.oblique._1,
+      MOZ_ASSERT(style.AsOblique()._0 == style.AsOblique()._1,
                  "We use ComputedFontStyleDescriptor just for convenience, "
                  "the two values should always match");
-      aStyle = FontSlantStyle::Oblique(style.oblique._0);
+      aStyle = FontSlantStyle::Oblique(style.AsOblique()._0);
       break;
   }
 
   aWeight = FontWeight(weight);
   aStretch = FontStretch::FromStyle(stretch);
 }
 
 static bool HasAnyCharacterInUnicodeRange(gfxUserFontEntry* aEntry,
@@ -956,18 +956,18 @@ static SlantStyleRange GetStyleRangeForD
   }
   auto& val = *aVal;
   switch (val.tag) {
     case StyleComputedFontStyleDescriptor::Tag::Normal:
       return SlantStyleRange(FontSlantStyle::Normal());
     case StyleComputedFontStyleDescriptor::Tag::Italic:
       return SlantStyleRange(FontSlantStyle::Italic());
     case StyleComputedFontStyleDescriptor::Tag::Oblique:
-      return SlantStyleRange(FontSlantStyle::Oblique(val.oblique._0),
-                             FontSlantStyle::Oblique(val.oblique._1));
+      return SlantStyleRange(FontSlantStyle::Oblique(val.AsOblique()._0),
+                             FontSlantStyle::Oblique(val.AsOblique()._1));
   }
   MOZ_ASSERT_UNREACHABLE("How?");
   return SlantStyleRange(FontSlantStyle::Normal());
 }
 
 static StretchRange GetStretchRangeForDescriptor(
     const Maybe<StyleComputedFontStretchRange>& aVal,
     gfxFontEntry::RangeFlags& aRangeFlags) {
@@ -1041,27 +1041,27 @@ FontFaceSet::FindOrCreateUserFontEntryFr
     AutoTArray<StyleFontFaceSourceListComponent, 8> sourceListComponents;
     aFontFace->GetSources(sourceListComponents);
     size_t len = sourceListComponents.Length();
     for (size_t i = 0; i < len; ++i) {
       gfxFontFaceSrc* face = srcArray.AppendElement();
       const auto& component = sourceListComponents[i];
       switch (component.tag) {
         case StyleFontFaceSourceListComponent::Tag::Local: {
-          nsAtom* atom = component.local._0;
+          nsAtom* atom = component.AsLocal();
           face->mLocalName.Append(nsAtomCString(atom));
           face->mSourceType = gfxFontFaceSrc::eSourceType_Local;
           face->mURI = nullptr;
           face->mFormatFlags = 0;
           face->mReferrerPolicy = mozilla::net::RP_Unset;
           break;
         }
         case StyleFontFaceSourceListComponent::Tag::Url: {
           face->mSourceType = gfxFontFaceSrc::eSourceType_URL;
-          const URLValue* url = component.url._0;
+          const URLValue* url = component.AsUrl();
           nsIURI* uri = url->GetURI();
           face->mURI = uri ? new gfxFontSrcURI(uri) : nullptr;
           URLExtraData* extraData = url->ExtraData();
           face->mReferrer = extraData->GetReferrer();
           face->mReferrerPolicy = extraData->GetReferrerPolicy();
           face->mOriginPrincipal =
               new gfxFontSrcPrincipal(extraData->Principal());
 
--- a/layout/style/nsComputedDOMStyle.cpp
+++ b/layout/style/nsComputedDOMStyle.cpp
@@ -1090,17 +1090,17 @@ already_AddRefed<CSSValue> nsComputedDOM
 
   /* Now, get the values. */
   const auto& origin = StyleDisplay()->mTransformOrigin;
 
   RefPtr<nsROCSSPrimitiveValue> width = new nsROCSSPrimitiveValue;
   auto position = MaybeResolvePositionForTransform(
       origin.horizontal, origin.vertical, mInnerFrame);
   SetValueToPosition(position, valueList);
-  if (origin.depth._0 != 0.0f) {
+  if (!origin.depth.IsZero()) {
     RefPtr<nsROCSSPrimitiveValue> depth = new nsROCSSPrimitiveValue;
     depth->SetAppUnits(origin.depth.ToAppUnits());
     valueList->AppendCSSValue(depth.forget());
   }
   return valueList.forget();
 }
 
 /* Convert the stored representation into a list of two values and then hand
@@ -1959,19 +1959,19 @@ already_AddRefed<CSSValue> nsComputedDOM
     if (GetLineHeightCoord(lineHeight)) {
       val->SetAppUnits(lineHeight);
       return val.forget();
     }
   }
 
   auto& lh = StyleText()->mLineHeight;
   if (lh.IsLength()) {
-    val->SetAppUnits(lh.length._0.ToAppUnits());
+    val->SetAppUnits(lh.AsLength().ToAppUnits());
   } else if (lh.IsNumber()) {
-    val->SetNumber(lh.number._0);
+    val->SetNumber(lh.AsNumber());
   } else if (lh.IsMozBlockHeight()) {
     val->SetIdent(eCSSKeyword__moz_block_height);
   } else {
     MOZ_ASSERT(lh.IsNormal());
     val->SetIdent(eCSSKeyword_normal);
   }
   return val.forget();
 }
--- a/layout/style/nsDOMCSSDeclaration.cpp
+++ b/layout/style/nsDOMCSSDeclaration.cpp
@@ -189,17 +189,17 @@ nsDOMCSSDeclaration::SetProperty(const n
   nsCSSPropertyID propID = nsCSSProps::LookupProperty(aPropertyName);
   if (propID == eCSSProperty_UNKNOWN) {
     return NS_OK;
   }
 
   bool important;
   if (aPriority.IsEmpty()) {
     important = false;
-  } else if (aPriority.EqualsLiteral("important")) {
+  } else if (aPriority.LowerCaseEqualsASCII("important")) {
     important = true;
   } else {
     // XXX silent failure?
     return NS_OK;
   }
 
   if (propID == eCSSPropertyExtra_variable) {
     return ParseCustomPropertyValue(aPropertyName, aValue, important,
--- a/layout/style/nsStyleCoord.h
+++ b/layout/style/nsStyleCoord.h
@@ -158,21 +158,16 @@ nscoord LengthPercentage::Resolve(T aPer
 template <typename T>
 nscoord LengthPercentage::Resolve(nscoord aPercentageBasis,
                                   T aPercentageRounder) const {
   return Resolve([=] { return aPercentageBasis; }, aPercentageRounder);
 }
 
 #define IMPL_LENGTHPERCENTAGE_FORWARDS(ty_)                                 \
   template <>                                                               \
-  inline const LengthPercentage& ty_::AsLengthPercentage() const {          \
-    MOZ_ASSERT(IsLengthPercentage());                                       \
-    return length_percentage._0;                                            \
-  }                                                                         \
-  template <>                                                               \
   inline bool ty_::HasPercent() const {                                     \
     return IsLengthPercentage() && AsLengthPercentage().HasPercent();       \
   }                                                                         \
   template <>                                                               \
   inline bool ty_::ConvertsToLength() const {                               \
     return IsLengthPercentage() && AsLengthPercentage().ConvertsToLength(); \
   }                                                                         \
   template <>                                                               \
@@ -196,49 +191,31 @@ nscoord LengthPercentage::Resolve(nscoor
     return AsLengthPercentage().ToPercentage();                             \
   }
 
 IMPL_LENGTHPERCENTAGE_FORWARDS(LengthPercentageOrAuto)
 IMPL_LENGTHPERCENTAGE_FORWARDS(StyleSize)
 IMPL_LENGTHPERCENTAGE_FORWARDS(StyleMaxSize)
 
 template <>
-inline const StyleSize& StyleFlexBasis::AsSize() const {
-  MOZ_ASSERT(IsSize());
-  return size._0;
-}
-
-template <>
 inline bool StyleFlexBasis::IsAuto() const {
   return IsSize() && AsSize().IsAuto();
 }
 
 template <>
-inline StyleExtremumLength StyleSize::AsExtremumLength() const {
-  MOZ_ASSERT(IsExtremumLength());
-  return extremum_length._0;
-}
-
-template <>
 inline bool StyleSize::BehavesLikeInitialValueOnBlockAxis() const {
   return IsAuto() || IsExtremumLength();
 }
 
 template <>
 inline bool StyleMaxSize::BehavesLikeInitialValueOnBlockAxis() const {
   return IsNone() || IsExtremumLength();
 }
 
 template <>
-inline StyleExtremumLength StyleMaxSize::AsExtremumLength() const {
-  MOZ_ASSERT(IsExtremumLength());
-  return extremum_length._0;
-}
-
-template <>
 inline bool StyleBackgroundSize::IsInitialValue() const {
   return IsExplicitSize() && explicit_size.width.IsAuto() &&
          explicit_size.height.IsAuto();
 }
 
 template <typename T>
 const T& StyleRect<T>::Get(mozilla::Side aSide) const {
   static_assert(sizeof(StyleRect<T>) == sizeof(T) * 4, "");
--- a/layout/style/nsStyleStruct.cpp
+++ b/layout/style/nsStyleStruct.cpp
@@ -310,20 +310,20 @@ nsMargin nsStyleBorder::GetImageOutset()
   // We don't check whether there is a border-image (which is OK since
   // the initial values yields 0 outset) so that we don't have to
   // reflow to update overflow areas when an image loads.
   nsMargin outset;
   NS_FOR_CSS_SIDES(s) {
     const auto& coord = mBorderImageOutset.Get(s);
     nscoord value;
     if (coord.IsLength()) {
-      value = coord.length._0.ToAppUnits();
+      value = coord.AsLength().ToAppUnits();
     } else {
       MOZ_ASSERT(coord.IsNumber());
-      value = coord.number._0 * mComputedBorder.Side(s);
+      value = coord.AsNumber() * mComputedBorder.Side(s);
     }
     outset.Side(s) = value;
   }
   return outset;
 }
 
 nsChangeHint nsStyleBorder::CalcDifference(
     const nsStyleBorder& aNewData) const {
--- a/layout/style/nsStyleStruct.h
+++ b/layout/style/nsStyleStruct.h
@@ -1062,17 +1062,17 @@ struct MOZ_NEEDS_MEMMOVABLE_MEMBERS nsSt
   nscoord GetOutlineWidth() const { return mActualOutlineWidth; }
 
   bool ShouldPaintOutline() const {
     if (mOutlineStyle.IsAuto()) {
       return true;
     }
     if (GetOutlineWidth() > 0) {
       MOZ_ASSERT(
-          mOutlineStyle.border_style._0 != mozilla::StyleBorderStyle::None,
+          mOutlineStyle.AsBorderStyle() != mozilla::StyleBorderStyle::None,
           "outline-style: none implies outline-width of zero");
       return true;
     }
     return false;
   }
 
  protected:
   // The actual value of outline-width is the computed value (an absolute
--- a/layout/style/nsTimingFunction.h
+++ b/layout/style/nsTimingFunction.h
@@ -17,17 +17,17 @@ struct nsTimingFunction {
       : mTiming(mozilla::StyleComputedTimingFunction::Keyword(aKeyword)) {}
 
   nsTimingFunction(float x1, float y1, float x2, float y2)
       : mTiming(mozilla::StyleComputedTimingFunction::CubicBezier(x1, y1, x2,
                                                                   y2)) {}
 
   bool IsLinear() const {
     return mTiming.IsKeyword() &&
-           mTiming.keyword._0 == mozilla::StyleTimingKeyword::Linear;
+           mTiming.AsKeyword() == mozilla::StyleTimingKeyword::Linear;
   }
 
   bool operator==(const nsTimingFunction& aOther) const {
     return mTiming == aOther.mTiming;
   }
 
   bool operator!=(const nsTimingFunction& aOther) const {
     return !(*this == aOther);
--- a/media/audioipc/README_MOZILLA
+++ b/media/audioipc/README_MOZILLA
@@ -1,8 +1,8 @@
 The source from this directory was copied from the audioipc-2
 git repository using the update.sh script.  The only changes
 made were those applied by update.sh and the addition of
 Makefile.in build files for the Mozilla build system.
 
 The audioipc-2 git repository is: https://github.com/djg/audioipc-2.git
 
-The git commit ID used was c2148b95128f5e54ef1d18e5e457a2fa45e7ac43 (2019-02-05 15:18:22 +1300)
+The git commit ID used was 137eb45d702f628cae622d374975903c23a7a814 (2019-03-07 10:31:45 +1300)
--- a/media/audioipc/audioipc/Cargo.toml
+++ b/media/audioipc/audioipc/Cargo.toml
@@ -3,26 +3,31 @@ name = "audioipc"
 version = "0.2.4"
 authors = [
         "Matthew Gregan <kinetik@flim.org>",
         "Dan Glastonbury <dan.glastonbury@gmail.com>"
         ]
 description = "Remote Cubeb IPC"
 
 [dependencies]
-cubeb = "0.5.2"
+cubeb = "0.5.4"
 bincode = "1.0"
 bytes = "0.4"
 futures = "0.1.18"
 iovec = "0.1"
 libc = "0.2"
 log = "0.4"
 memmap = "0.5.2"
 scoped-tls = "0.1"
 serde = "1.*.*"
 serde_derive = "1.*.*"
 tokio-core = "0.1"
 tokio-io = "0.1"
 tokio-uds = "0.1.7"
+winapi = "0.3.6"
+mio-named-pipes = "=0.1.5"
 
 [dependencies.error-chain]
 version = "0.11.0"
 default-features = false
+
+[build-dependencies]
+cc = "1.0"
--- a/media/audioipc/audioipc/src/async.rs
+++ b/media/audioipc/audioipc/src/async.rs
@@ -1,22 +1,25 @@
 // Copyright © 2017 Mozilla Foundation
 //
 // This program is made available under an ISC-style license.  See the
 // accompanying file LICENSE for details
 
 //! Various async helpers modelled after futures-rs and tokio-io.
 
 use bytes::{Buf, BufMut};
-use futures::{Async, Poll};
+#[cfg(unix)]
+use futures::Async;
+use futures::Poll;
+#[cfg(unix)]
 use iovec::IoVec;
+#[cfg(unix)]
 use msg::{RecvMsg, SendMsg};
 use std::io;
 use tokio_io::{AsyncRead, AsyncWrite};
-use tokio_uds::UnixStream;
 
 pub trait AsyncRecvMsg: AsyncRead {
     /// Pull some bytes from this source into the specified `Buf`, returning
     /// how many bytes were read.
     ///
     /// The `buf` provided will have bytes read into it and the internal cursor
     /// will be advanced if any bytes were read. Note that this method typically
     /// will not reallocate the buffer provided.
@@ -49,22 +52,23 @@ pub trait AsyncSendMsg: AsyncWrite {
     where
         Self: Sized,
         B: Buf,
         C: Buf;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 
-impl AsyncRecvMsg for UnixStream {
+#[cfg(unix)]
+impl AsyncRecvMsg for super::AsyncMessageStream {
     fn recv_msg_buf<B>(&mut self, buf: &mut B, cmsg: &mut B) -> Poll<(usize, i32), io::Error>
     where
         B: BufMut,
     {
-        if let Async::NotReady = <UnixStream>::poll_read(self) {
+        if let Async::NotReady = <super::AsyncMessageStream>::poll_read(self) {
             return Ok(Async::NotReady);
         }
         let r = unsafe {
             // The `IoVec` type can't have a 0-length size, so we create a bunch
             // of dummy versions on the stack with 1 length which we'll quickly
             // overwrite.
             let b1: &mut [u8] = &mut [0];
             let b2: &mut [u8] = &mut [0];
@@ -118,23 +122,24 @@ impl AsyncRecvMsg for UnixStream {
                 self.need_read();
                 Ok(Async::NotReady)
             }
             Err(e) => Err(e),
         }
     }
 }
 
-impl AsyncSendMsg for UnixStream {
+#[cfg(unix)]
+impl AsyncSendMsg for super::AsyncMessageStream {
     fn send_msg_buf<B, C>(&mut self, buf: &mut B, cmsg: &C) -> Poll<usize, io::Error>
     where
         B: Buf,
         C: Buf,
     {
-        if let Async::NotReady = <UnixStream>::poll_write(self) {
+        if let Async::NotReady = <super::AsyncMessageStream>::poll_write(self) {
             return Ok(Async::NotReady);
         }
         let r = {
             // The `IoVec` type can't have a zero-length size, so create a dummy
             // version from a 1-length slice which we'll overwrite with the
             // `bytes_vec` method.
             static DUMMY: &[u8] = &[0];
             let nom = <&IoVec>::from(DUMMY);
--- a/media/audioipc/audioipc/src/fd_passing.rs
+++ b/media/audioipc/audioipc/src/fd_passing.rs
@@ -3,18 +3,17 @@
 // This program is made available under an ISC-style license.  See the
 // accompanying file LICENSE for details
 
 use async::{AsyncRecvMsg, AsyncSendMsg};
 use bytes::{Bytes, BytesMut, IntoBuf};
 use cmsg;
 use codec::Codec;
 use futures::{AsyncSink, Poll, Sink, StartSend, Stream};
-use libc;
-use messages::AssocRawFd;
+use messages::AssocRawPlatformHandle;
 use std::collections::VecDeque;
 use std::os::unix::io::RawFd;
 use std::{fmt, io, mem};
 
 const INITIAL_CAPACITY: usize = 1024;
 const BACKPRESSURE_THRESHOLD: usize = 4 * INITIAL_CAPACITY;
 const FDS_CAPACITY: usize = 16;
 
@@ -61,31 +60,31 @@ impl IncomingFds {
 #[derive(Debug)]
 struct Frame {
     msgs: Bytes,
     fds: Option<Bytes>,
 }
 
 /// A unified `Stream` and `Sink` interface over an I/O object, using
 /// the `Codec` trait to encode and decode the payload.
-pub struct FramedWithFds<A, C> {
+pub struct FramedWithPlatformHandles<A, C> {
     io: A,
     codec: C,
     // Stream
     read_buf: BytesMut,
     incoming_fds: IncomingFds,
     is_readable: bool,
     eof: bool,
     // Sink
     frames: VecDeque<Frame>,
     write_buf: BytesMut,
     outgoing_fds: BytesMut,
 }
 
-impl<A, C> FramedWithFds<A, C>
+impl<A, C> FramedWithPlatformHandles<A, C>
 where
     A: AsyncSendMsg,
 {
     // If there is a buffered frame, try to write it to `A`
     fn do_write(&mut self) -> Poll<(), io::Error> {
         trace!("do_write...");
         // Create a frame from any pending message in `write_buf`.
         if !self.write_buf.is_empty() {
@@ -157,78 +156,74 @@ where
 
         let msgs = self.write_buf.take().freeze();
         trace!("set_frame: msgs={:?} fds={:?}", msgs, fds);
 
         self.frames.push_back(Frame { msgs, fds });
     }
 }
 
-impl<A, C> Stream for FramedWithFds<A, C>
+impl<A, C> Stream for FramedWithPlatformHandles<A, C>
 where
     A: AsyncRecvMsg,
     C: Codec,
-    C::Out: AssocRawFd,
+    C::Out: AssocRawPlatformHandle,
 {
     type Item = C::Out;
     type Error = io::Error;
 
     fn poll(&mut self) -> Poll<Option<Self::Item>, Self::Error> {
         loop {
             // Repeatedly call `decode` or `decode_eof` as long as it is
             // "readable". Readable is defined as not having returned `None`. If
             // the upstream has returned EOF, and the decoder is no longer
             // readable, it can be assumed that the decoder will never become
             // readable again, at which point the stream is terminated.
             if self.is_readable {
                 if self.eof {
                     let mut item = try!(self.codec.decode_eof(&mut self.read_buf));
-                    item.take_fd(|| self.incoming_fds.take_fds());
+                    item.take_platform_handles(|| self.incoming_fds.take_fds());
                     return Ok(Some(item).into());
                 }
 
                 trace!("attempting to decode a frame");
 
                 if let Some(mut item) = try!(self.codec.decode(&mut self.read_buf)) {
                     trace!("frame decoded from buffer");
-                    item.take_fd(|| self.incoming_fds.take_fds());
+                    item.take_platform_handles(|| self.incoming_fds.take_fds());
                     return Ok(Some(item).into());
                 }
 
                 self.is_readable = false;
             }
 
             assert!(!self.eof);
 
             // Otherwise, try to read more data and try again. Make sure we've
             // got room for at least one byte to read to ensure that we don't
             // get a spurious 0 that looks like EOF
             let (n, _) = try_ready!(
                 self.io
                     .recv_msg_buf(&mut self.read_buf, self.incoming_fds.cmsg())
             );
 
-            // if flags != 0 {
-            //     error!("recv_msg_buf: flags = {:x}", flags)
-            // }
-
             if n == 0 {
                 self.eof = true;
             }
 
             self.is_readable = true;
         }
     }
 }
 
-impl<A, C> Sink for FramedWithFds<A, C>
+impl<A, C> Sink for FramedWithPlatformHandles<A, C>
 where
     A: AsyncSendMsg,
     C: Codec,
-    C::In: AssocRawFd + fmt::Debug,
+    C::In: AssocRawPlatformHandle + fmt::Debug,
 {
     type SinkItem = C::In;
     type SinkError = io::Error;
 
     fn start_send(&mut self, item: Self::SinkItem) -> StartSend<Self::SinkItem, Self::SinkError> {
         trace!("start_send: item={:?}", item);
 
         // If the buffer is already over BACKPRESSURE_THRESHOLD,
@@ -236,21 +231,21 @@ where
         // over BACKPRESSURE_THRESHOLD, then reject the send.
         if self.write_buf.len() > BACKPRESSURE_THRESHOLD {
             try!(self.poll_complete());
             if self.write_buf.len() > BACKPRESSURE_THRESHOLD {
                 return Ok(AsyncSink::NotReady(item));
             }
         }
 
-        let fds = item.fd();
+        let fds = item.platform_handles();
         try!(self.codec.encode(item, &mut self.write_buf));
         let fds = fds.and_then(|fds| {
             cmsg::builder(&mut self.outgoing_fds)
-                .rights(&fds[..])
+                .rights(&fds.0[..])
                 .finish()
                 .ok()
         });
 
         trace!("item fds: {:?}", fds);
 
         if fds.is_some() {
             // Enforce splitting sends on messages that contain file
@@ -273,18 +268,18 @@ where
     }
 
     fn close(&mut self) -> Poll<(), Self::SinkError> {
         try_ready!(self.poll_complete());
         self.io.shutdown()
     }
 }
 
-pub fn framed_with_fds<A, C>(io: A, codec: C) -> FramedWithFds<A, C> {
-    FramedWithFds {
+pub fn framed_with_platformhandles<A, C>(io: A, codec: C) -> FramedWithPlatformHandles<A, C> {
+    FramedWithPlatformHandles {
         io: io,
         codec: codec,
         read_buf: BytesMut::with_capacity(INITIAL_CAPACITY),
         incoming_fds: IncomingFds::new(FDS_CAPACITY),
         is_readable: false,
         eof: false,
         frames: VecDeque::new(),
         write_buf: BytesMut::with_capacity(INITIAL_CAPACITY),
@@ -302,53 +297,65 @@ where
     let mut a = Default::default();
     <A as AsMut<[T]>>::as_mut(&mut a).clone_from_slice(slice);
     a
 }
 
 fn close_fds(fds: &[RawFd]) {
     for fd in fds {
         unsafe {
-            libc::close(*fd);
+            super::close_platformhandle(*fd);
         }
     }
 }
 
 #[cfg(test)]
 mod tests {
     use bytes::BufMut;
+    use libc;
+    use std;
 
-    const CMSG_BYTES: &[u8] =
-        b"\x1c\0\0\0\0\0\0\0\x01\0\0\0\x01\0\0\02\0\0\0[\0\0\0\\\0\0\0\xe5\xe5\xe5\xe5";
+    extern {
+        fn cmsghdr_bytes(size: *mut libc::size_t) -> *const libc::uint8_t;
+    }
+
+    fn cmsg_bytes() -> &'static [u8] {
+        let mut size = 0;
+        unsafe {
+            let ptr = cmsghdr_bytes(&mut size);
+            std::slice::from_raw_parts(ptr, size)
+        }
+    }
 
     #[test]
     fn single_cmsg() {
         let mut incoming = super::IncomingFds::new(16);
 
-        incoming.cmsg().put_slice(CMSG_BYTES);
+        incoming.cmsg().put_slice(cmsg_bytes());
         assert!(incoming.take_fds().is_some());
         assert!(incoming.take_fds().is_none());
     }
 
     #[test]
     fn multiple_cmsg_1() {
         let mut incoming = super::IncomingFds::new(16);
 
-        incoming.cmsg().put_slice(CMSG_BYTES);
+        incoming.cmsg().put_slice(cmsg_bytes());
         assert!(incoming.take_fds().is_some());
-        incoming.cmsg().put_slice(CMSG_BYTES);
+        incoming.cmsg().put_slice(cmsg_bytes());
         assert!(incoming.take_fds().is_some());
         assert!(incoming.take_fds().is_none());
     }
 
     #[test]
     fn multiple_cmsg_2() {
         let mut incoming = super::IncomingFds::new(16);
+        println!("cmsg_bytes() {}", cmsg_bytes().len());
 
-        incoming.cmsg().put_slice(CMSG_BYTES);
-        incoming.cmsg().put_slice(CMSG_BYTES);
+        incoming.cmsg().put_slice(cmsg_bytes());
+        incoming.cmsg().put_slice(cmsg_bytes());
         assert!(incoming.take_fds().is_some());
-        incoming.cmsg().put_slice(CMSG_BYTES);
+        incoming.cmsg().put_slice(cmsg_bytes());
         assert!(incoming.take_fds().is_some());
         assert!(incoming.take_fds().is_some());
         assert!(incoming.take_fds().is_none());
     }
 }
new file mode 100644
--- /dev/null
+++ b/media/audioipc/audioipc/src/handle_passing.rs
@@ -0,0 +1,256 @@
+// Copyright © 2017 Mozilla Foundation
+//
+// This program is made available under an ISC-style license.  See the
+// accompanying file LICENSE for details
+
+use tokio_io::{AsyncRead, AsyncWrite};
+use bytes::{Bytes, BytesMut, IntoBuf};
+use codec::Codec;
+use futures::{AsyncSink, Poll, Sink, StartSend, Stream};
+use messages::AssocRawPlatformHandle;
+use std::collections::VecDeque;
+use std::{fmt, io};
+
+const INITIAL_CAPACITY: usize = 1024;
+const BACKPRESSURE_THRESHOLD: usize = 4 * INITIAL_CAPACITY;
+
+#[derive(Debug)]
+struct Frame {
+    msgs: Bytes,
+}
+
+/// A unified `Stream` and `Sink` interface over an I/O object, using
+/// the `Codec` trait to encode and decode the payload.
+pub struct FramedWithPlatformHandles<A, C> {
+    io: A,
+    codec: C,
+    // Stream
+    read_buf: BytesMut,
+    is_readable: bool,
+    eof: bool,
+    // Sink
+    frames: VecDeque<Frame>,
+    write_buf: BytesMut,
+}
+
+impl<A, C> FramedWithPlatformHandles<A, C>
+where
+    A: AsyncWrite,
+{
+    // If there is a buffered frame, try to write it to `A`
+    fn do_write(&mut self) -> Poll<(), io::Error> {
+        trace!("do_write...");
+        // Create a frame from any pending message in `write_buf`.
+        if !self.write_buf.is_empty() {
+            self.set_frame();
+        }
+
+        trace!("pending frames: {:?}", self.frames);
+
+        let mut processed = 0;
+
+        loop {
+            let n = match self.frames.front() {
+                Some(frame) => {
+                    trace!("sending msg {:?}", frame.msgs);
+                    let mut msgs = frame.msgs.clone().into_buf();
+                    try_ready!(self.io.write_buf(&mut msgs))
+                }
+                _ => {
+                    // No pending frames.
+                    return Ok(().into());
+                }
+            };
+
+            match self.frames.pop_front() {
+                Some(mut frame) => {
+                    processed += 1;
+
+                    if n != frame.msgs.len() {
+                        // If only part of the message was sent then
+                        // re-queue the remaining message at the head
+                        // of the queue. (Don't need to resend the
+                        // handles since they've been sent with the
+                        // first part.)
+                        drop(frame.msgs.split_to(n));
+                        self.frames.push_front(frame);
+                        break;
+                    }
+                }
+                _ => panic!(),
+            }
+        }
+        trace!("process {} frames", processed);
+        trace!("pending frames: {:?}", self.frames);
+
+        Ok(().into())
+    }
+
+    fn set_frame(&mut self) {
+        if self.write_buf.is_empty() {
+            trace!("set_frame: No pending messages...");
+            return;
+        }
+
+        let msgs = self.write_buf.take().freeze();
+        trace!("set_frame: msgs={:?}", msgs);
+
+        self.frames.push_back(Frame { msgs });
+    }
+}
+
+impl<A, C> Stream for FramedWithPlatformHandles<A, C>
+where
+    A: AsyncRead,
+    C: Codec,
+    C::Out: AssocRawPlatformHandle,
+{
+    type Item = C::Out;
+    type Error = io::Error;
+
+    fn poll(&mut self) -> Poll<Option<Self::Item>, Self::Error> {
+        loop {
+            // Repeatedly call `decode` or `decode_eof` as long as it is
+            // "readable". Readable is defined as not having returned `None`. If
+            // the upstream has returned EOF, and the decoder is no longer
+            // readable, it can be assumed that the decoder will never become
+            // readable again, at which point the stream is terminated.
+            if self.is_readable {
+                if self.eof {
+                    let item = try!(self.codec.decode_eof(&mut self.read_buf));
+                    return Ok(Some(item).into());
+                }
+
+                trace!("attempting to decode a frame");
+
+                if let Some(item) = try!(self.codec.decode(&mut self.read_buf)) {
+                    trace!("frame decoded from buffer");
+                    return Ok(Some(item).into());
+                }
+
+                self.is_readable = false;
+            }
+
+            assert!(!self.eof);
+
+            // Otherwise, try to read more data and try again. Make sure we've
+            // got room for at least one byte to read to ensure that we don't
+            // get a spurious 0 that looks like EOF
+            let n = try_ready!(
+                self.io
+                    .read_buf(&mut self.read_buf)
+            );
+
+            if n == 0 {
+                self.eof = true;
+            }
+
+            self.is_readable = true;
+        }
+    }
+}
+
+impl<A, C> Sink for FramedWithPlatformHandles<A, C>
+where
+    A: AsyncWrite,
+    C: Codec,
+    C::In: AssocRawPlatformHandle + fmt::Debug,
+{
+    type SinkItem = C::In;
+    type SinkError = io::Error;
+
+    fn start_send(&mut self, mut item: Self::SinkItem) -> StartSend<Self::SinkItem, Self::SinkError> {
+        trace!("start_send: item={:?}", item);
+
+        // If the buffer is already over BACKPRESSURE_THRESHOLD,
+        // then attempt to flush it. If after flush it's *still*
+        // over BACKPRESSURE_THRESHOLD, then reject the send.
+        if self.write_buf.len() > BACKPRESSURE_THRESHOLD {
+            try!(self.poll_complete());
+            if self.write_buf.len() > BACKPRESSURE_THRESHOLD {
+                return Ok(AsyncSink::NotReady(item));
+            }
+        }
+
+        let mut got_handles = false;
+        if let Some((handles, target_pid)) = item.platform_handles() {
+            got_handles = true;
+            let remote_handles = unsafe {
+                [duplicate_platformhandle(handles[0], target_pid)?,
+                 duplicate_platformhandle(handles[1], target_pid)?,
+                 duplicate_platformhandle(handles[2], target_pid)?]
+            };
+            trace!("item handles: {:?} remote_handles: {:?}", handles, remote_handles);
+            item.take_platform_handles(|| Some(remote_handles));
+        }
+
+        try!(self.codec.encode(item, &mut self.write_buf));
+
+        if got_handles {
+            // Enforce splitting sends on messages that contain file
+            // descriptors.
+            self.set_frame();
+        }
+
+        Ok(AsyncSink::Ready)
+    }
+
+    fn poll_complete(&mut self) -> Poll<(), Self::SinkError> {
+        trace!("flushing framed transport");
+
+        try_ready!(self.do_write());
+
+        try_nb!(self.io.flush());
+
+        trace!("framed transport flushed");
+        Ok(().into())
+    }
+
+    fn close(&mut self) -> Poll<(), Self::SinkError> {
+        try_ready!(self.poll_complete());
+        self.io.shutdown()
+    }
+}
+
+pub fn framed_with_platformhandles<A, C>(io: A, codec: C) -> FramedWithPlatformHandles<A, C> {
+    FramedWithPlatformHandles {
+        io: io,
+        codec: codec,
+        read_buf: BytesMut::with_capacity(INITIAL_CAPACITY),
+        is_readable: false,
+        eof: false,
+        frames: VecDeque::new(),
+        write_buf: BytesMut::with_capacity(INITIAL_CAPACITY),
+    }
+}
+
+use winapi::um::{processthreadsapi, winnt, handleapi};
+use winapi::shared::minwindef::{DWORD, FALSE};
+use super::PlatformHandleType;
+
+// source_handle is effectively taken ownership of (consumed) and
+// closed when duplicate_platformhandle is called.
+// TODO: Make this transfer more explicit via the type system.
+unsafe fn duplicate_platformhandle(source_handle: PlatformHandleType,
+                                   target_pid: DWORD) -> Result<PlatformHandleType, std::io::Error> {
+    let source = processthreadsapi::GetCurrentProcess();
+    let target = processthreadsapi::OpenProcess(winnt::PROCESS_DUP_HANDLE,
+                                                FALSE,
+                                                target_pid);
+    if !super::valid_handle(target) {
+        return Err(std::io::Error::new(std::io::ErrorKind::Other, "invalid target process"));
+    }
+
+    let mut target_handle = std::ptr::null_mut();
+    let ok = handleapi::DuplicateHandle(source,
+                                        source_handle,
+                                        target,
+                                        &mut target_handle,
+                                        0,
+                                        FALSE,
+                                        winnt::DUPLICATE_CLOSE_SOURCE | winnt::DUPLICATE_SAME_ACCESS);
+    if ok == FALSE {
+        return Err(std::io::Error::new(std::io::ErrorKind::Other, "DuplicateHandle failed"));
+    }
+    Ok(target_handle)
+}
--- a/media/audioipc/audioipc/src/lib.rs
+++ b/media/audioipc/audioipc/src/lib.rs
@@ -23,39 +23,175 @@ extern crate libc;
 extern crate memmap;
 #[macro_use]
 extern crate scoped_tls;
 extern crate serde;
 extern crate tokio_core;
 #[macro_use]
 extern crate tokio_io;
 extern crate tokio_uds;
+#[cfg(windows)]
+extern crate winapi;
 
 mod async;
+#[cfg(unix)]
 mod cmsg;
 pub mod codec;
 pub mod core;
 #[allow(deprecated)]
 pub mod errors;
+#[cfg(unix)]
 pub mod fd_passing;
+#[cfg(unix)]
+pub use fd_passing as platformhandle_passing;
+#[cfg(windows)]
+pub mod handle_passing;
+#[cfg(windows)]
+pub use handle_passing as platformhandle_passing;
 pub mod frame;
 pub mod messages;
+#[cfg(unix)]
 mod msg;
 pub mod rpc;
 pub mod shm;
 
 pub use messages::{ClientMessage, ServerMessage};
 use std::env::temp_dir;
 use std::path::PathBuf;
 
+#[cfg(windows)]
+use std::os::windows::io::{FromRawHandle, IntoRawHandle};
+#[cfg(unix)]
+use std::os::unix::io::{FromRawFd, IntoRawFd};
+
 // This must match the definition of
 // ipc::FileDescriptor::PlatformHandleType in Gecko.
-#[cfg(target_os = "windows")]
-pub type PlatformHandleType = *mut std::os::raw::c_void;
-#[cfg(not(target_os = "windows"))]
+#[cfg(windows)]
+pub type PlatformHandleType = std::os::windows::raw::HANDLE;
+#[cfg(unix)]
 pub type PlatformHandleType = libc::c_int;
 
+// This stands in for RawFd/RawHandle.
+#[derive(Copy, Clone, Debug)]
+pub struct PlatformHandle(PlatformHandleType);
+
+unsafe impl Send for PlatformHandle {}
+
+// Custom serialization to treat HANDLEs as i64.  This is not valid in
+// general, but after sending the HANDLE value to a remote process we
+// use it to create a valid HANDLE via DuplicateHandle.
+// To avoid duplicating the serialization code, we're lazy and treat
+// file descriptors as i64 rather than i32.
+impl serde::Serialize for PlatformHandle {
+    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
+    where
+        S: serde::Serializer,
+    {
+        serializer.serialize_i64(self.0 as i64)
+    }
+}
+
+struct PlatformHandleVisitor;
+impl<'de> serde::de::Visitor<'de> for PlatformHandleVisitor {
+    type Value = PlatformHandle;
+
+    fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
+        formatter.write_str("an integer between -2^63 and 2^63")
+    }
+
+    fn visit_i64<E>(self, value: i64) -> Result<Self::Value, E>
+    where
+        E: serde::de::Error,
+    {
+        Ok(PlatformHandle::new(value as PlatformHandleType))
+    }
+}
+
+impl<'de> serde::Deserialize<'de> for PlatformHandle {
+    fn deserialize<D>(deserializer: D) -> Result<PlatformHandle, D::Error>
+    where
+        D: serde::Deserializer<'de>,
+    {
+        deserializer.deserialize_i64(PlatformHandleVisitor)
+    }
+}
+
+#[cfg(unix)]
+fn valid_handle(handle: PlatformHandleType) -> bool {
+    handle >= 0
+}
+
+#[cfg(windows)]
+fn valid_handle(handle: PlatformHandleType) -> bool {
+    const INVALID_HANDLE_VALUE: PlatformHandleType = -1isize as PlatformHandleType;
+    const NULL_HANDLE_VALUE: PlatformHandleType = 0isize as PlatformHandleType;
+    handle != INVALID_HANDLE_VALUE && handle != NULL_HANDLE_VALUE
+}
+
+impl PlatformHandle {
+    pub fn new(raw: PlatformHandleType) -> PlatformHandle {
+        PlatformHandle(raw)
+    }
+
+    pub fn try_new(raw: PlatformHandleType) -> Option<PlatformHandle> {
+        if !valid_handle(raw) {
+            return None;
+        }
+        Some(PlatformHandle::new(raw))
+    }
+
+    #[cfg(windows)]
+    pub fn from<T: IntoRawHandle>(from: T) -> PlatformHandle {
+        PlatformHandle::new(from.into_raw_handle())
+    }
+
+    #[cfg(unix)]
+    pub fn from<T: IntoRawFd>(from: T) -> PlatformHandle {
+        PlatformHandle::new(from.into_raw_fd())
+    }
+
+    #[cfg(windows)]
+    pub unsafe fn into_file(self) -> std::fs::File {
+        std::fs::File::from_raw_handle(self.0)
+    }
+
+    #[cfg(unix)]
+    pub unsafe fn into_file(self) -> std::fs::File {
+        std::fs::File::from_raw_fd(self.0)
+    }
+
+    pub fn as_raw(&self) -> PlatformHandleType {
+        self.0
+    }
+
+    pub unsafe fn close(self) {
+        close_platformhandle(self.0);
+    }
+}
+
+#[cfg(unix)]
+unsafe fn close_platformhandle(handle: PlatformHandleType) {
+    libc::close(handle);
+}
+
+#[cfg(windows)]
+unsafe fn close_platformhandle(handle: PlatformHandleType) {
+    winapi::um::handleapi::CloseHandle(handle);
+}
+
 pub fn get_shm_path(dir: &str) -> PathBuf {
-    let pid = unsafe { libc::getpid() };
+    let pid = std::process::id();
     let mut temp = temp_dir();
     temp.push(&format!("cubeb-shm-{}-{}", pid, dir));
     temp
 }
+
+#[cfg(unix)]
+pub mod messagestream_unix;
+#[cfg(unix)]
+pub use messagestream_unix::*;
+
+#[cfg(windows)]
+pub mod messagestream_win;
+#[cfg(windows)]
+pub use messagestream_win::*;
+#[cfg(windows)]
+mod tokio_named_pipes;
--- a/media/audioipc/audioipc/src/messages.rs
+++ b/media/audioipc/audioipc/src/messages.rs
@@ -1,17 +1,18 @@
 // Copyright © 2017 Mozilla Foundation
 //
 // This program is made available under an ISC-style license.  See the
 // accompanying file LICENSE for details
 
+use PlatformHandle;
+use PlatformHandleType;
 use cubeb::{self, ffi};
 use std::ffi::{CStr, CString};
 use std::os::raw::{c_char, c_int, c_uint};
-use std::os::unix::io::RawFd;
 use std::ptr;
 
 #[derive(Debug, Serialize, Deserialize)]
 pub struct Device {
     pub output_name: Option<Vec<u8>>,
     pub input_name: Option<Vec<u8>>,
 }
 
@@ -164,25 +165,26 @@ fn opt_str(v: Option<Vec<u8>>) -> *mut c
         },
         None => ptr::null_mut(),
     }
 }
 
 #[derive(Debug, Serialize, Deserialize)]
 pub struct StreamCreate {
     pub token: usize,
-    pub fds: [RawFd; 3],
+    pub platform_handles: [PlatformHandle; 3],
+    pub target_pid: u32,
 }
 
 // Client -> Server messages.
 // TODO: Callbacks should be different messages types so
 // ServerConn::process_msg doesn't have a catch-all case.
 #[derive(Debug, Serialize, Deserialize)]
 pub enum ServerMessage {
-    ClientConnect,
+    ClientConnect(u32),
     ClientDisconnect,
 
     ContextGetBackendId,
     ContextGetMaxChannelCount,
     ContextGetMinLatency(StreamParams),
     ContextGetPreferredSampleRate,
     ContextGetDeviceEnumeration(ffi::cubeb_device_type),
 
@@ -236,42 +238,50 @@ pub enum CallbackReq {
 }
 
 #[derive(Debug, Deserialize, Serialize)]
 pub enum CallbackResp {
     Data(isize),
     State,
 }
 
-pub trait AssocRawFd {
-    fn fd(&self) -> Option<[RawFd; 3]> {
+pub trait AssocRawPlatformHandle {
+    fn platform_handles(&self) -> Option<([PlatformHandleType; 3], u32)> {
         None
     }
-    fn take_fd<F>(&mut self, _: F)
+
+    fn take_platform_handles<F>(&mut self, f: F)
     where
-        F: FnOnce() -> Option<[RawFd; 3]>,
-    {
+        F: FnOnce() -> Option<[PlatformHandleType; 3]> {
+        assert!(f().is_none());
     }
 }
 
-impl AssocRawFd for ServerMessage {}
-impl AssocRawFd for ClientMessage {
-    fn fd(&self) -> Option<[RawFd; 3]> {
+impl AssocRawPlatformHandle for ServerMessage {}
+
+impl AssocRawPlatformHandle for ClientMessage {
+    fn platform_handles(&self) -> Option<([PlatformHandleType; 3], u32)> {
         match *self {
-            ClientMessage::StreamCreated(ref data) => Some(data.fds),
+            ClientMessage::StreamCreated(ref data) => Some(([data.platform_handles[0].as_raw(),
+                                                             data.platform_handles[1].as_raw(),
+                                                             data.platform_handles[2].as_raw()],
+                                                            data.target_pid)),
             _ => None,
         }
     }
 
-    fn take_fd<F>(&mut self, f: F)
+    fn take_platform_handles<F>(&mut self, f: F)
     where
-        F: FnOnce() -> Option<[RawFd; 3]>,
+        F: FnOnce() -> Option<[PlatformHandleType; 3]>,
     {
         if let ClientMessage::StreamCreated(ref mut data) = *self {
-            data.fds = f().unwrap();
+            let handles = f().expect("platform_handles must be available when processing StreamCreated");
+            data.platform_handles = [PlatformHandle::new(handles[0]),
+                                     PlatformHandle::new(handles[1]),
+                                     PlatformHandle::new(handles[2])]
         }
     }
 }
 
 #[cfg(test)]
 mod test {
     use super::StreamParams;
     use cubeb::ffi;
new file mode 100644
--- /dev/null
+++ b/media/audioipc/audioipc/src/messagestream_unix.rs
@@ -0,0 +1,96 @@
+// Copyright © 2017 Mozilla Foundation
+//
+// This program is made available under an ISC-style license.  See the
+// accompanying file LICENSE for details
+
+use std::os::unix::io::{IntoRawFd, FromRawFd, AsRawFd, RawFd};
+use std::os::unix::net;
+use tokio_io::{AsyncRead, AsyncWrite};
+
+#[derive(Debug)]
+pub struct MessageStream(net::UnixStream);
+pub struct AsyncMessageStream(tokio_uds::UnixStream);
+
+impl MessageStream {
+    fn new(stream: net::UnixStream) -> MessageStream {
+        MessageStream(stream)
+    }
+
+    pub fn anonymous_ipc_pair() -> std::result::Result<(MessageStream, MessageStream), std::io::Error> {
+        let pair = net::UnixStream::pair()?;
+        Ok((MessageStream::new(pair.0), MessageStream::new(pair.1)))
+    }
+
+    pub unsafe fn from_raw_fd(raw: super::PlatformHandleType) -> MessageStream {
+        MessageStream::new(net::UnixStream::from_raw_fd(raw))
+    }
+
+    pub fn into_tokio_ipc(self, handle: &tokio_core::reactor::Handle) -> std::result::Result<AsyncMessageStream, std::io::Error> {
+        Ok(AsyncMessageStream::new(tokio_uds::UnixStream::from_stream(self.0, handle)?))
+    }
+}
+
+impl AsyncMessageStream {
+    fn new(stream: tokio_uds::UnixStream) -> AsyncMessageStream {
+        AsyncMessageStream(stream)
+    }
+
+    pub fn poll_read(&self) -> futures::Async<()> {
+        self.0.poll_read()
+    }
+
+    pub fn poll_write(&self) -> futures::Async<()> {
+        self.0.poll_write()
+    }
+
+    pub fn need_read(&self) {
+        self.0.need_read()
+    }
+
+    pub fn need_write(&self) {
+        self.0.need_write()
+    }
+}
+
+impl std::io::Read for AsyncMessageStream {
+    fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
+        self.0.read(buf)
+    }
+}
+
+impl std::io::Write for AsyncMessageStream {
+    fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
+        self.0.write(buf)
+    }
+    fn flush(&mut self) -> std::io::Result<()> {
+        self.0.flush()
+    }
+}
+
+impl AsyncRead for AsyncMessageStream {
+    fn read_buf<B: bytes::BufMut>(&mut self, buf: &mut B) -> futures::Poll<usize, std::io::Error> {
+        <&tokio_uds::UnixStream>::read_buf(&mut &self.0, buf)
+    }
+}
+
+impl AsyncWrite for AsyncMessageStream {
+    fn shutdown(&mut self) -> futures::Poll<(), std::io::Error> {
+        <&tokio_uds::UnixStream>::shutdown(&mut &self.0)
+    }
+
+    fn write_buf<B: bytes::Buf>(&mut self, buf: &mut B) -> futures::Poll<usize, std::io::Error> {
+        <&tokio_uds::UnixStream>::write_buf(&mut &self.0, buf)
+    }
+}
+
+impl AsRawFd for AsyncMessageStream {
+    fn as_raw_fd(&self) -> RawFd {
+        self.0.as_raw_fd()
+    }
+}
+
+impl IntoRawFd for MessageStream {
+    fn into_raw_fd(self) -> RawFd {
+        self.0.into_raw_fd()
+    }
+}
new file mode 100644
--- /dev/null
+++ b/media/audioipc/audioipc/src/messagestream_win.rs
@@ -0,0 +1,109 @@
+// Copyright © 2017 Mozilla Foundation
+//
+// This program is made available under an ISC-style license.  See the
+// accompanying file LICENSE for details
+
+extern crate mio_named_pipes;
+use std::os::windows::io::{IntoRawHandle, FromRawHandle, AsRawHandle, RawHandle};
+use std::sync::atomic::{AtomicUsize, Ordering, ATOMIC_USIZE_INIT};
+use tokio_io::{AsyncRead, AsyncWrite};
+use tokio_named_pipes;
+
+#[derive(Debug)]
+pub struct MessageStream(mio_named_pipes::NamedPipe);
+pub struct AsyncMessageStream(tokio_named_pipes::NamedPipe);
+
+impl MessageStream {
+    fn new(stream: mio_named_pipes::NamedPipe) -> MessageStream {
+        MessageStream(stream)
+    }
+
+
+    pub fn anonymous_ipc_pair() -> std::result::Result<(MessageStream, MessageStream), std::io::Error> {
+        let pipe1 = mio_named_pipes::NamedPipe::new(get_pipe_name())?;
+        let pipe2 = unsafe { mio_named_pipes::NamedPipe::from_raw_handle(pipe1.as_raw_handle()) };
+        Ok((MessageStream::new(pipe1), MessageStream::new(pipe2)))
+    }
+
+    pub unsafe fn from_raw_fd(raw: super::PlatformHandleType) -> MessageStream {
+        MessageStream::new(mio_named_pipes::NamedPipe::from_raw_handle(raw))
+    }
+
+    pub fn into_tokio_ipc(self, handle: &tokio_core::reactor::Handle) -> std::result::Result<AsyncMessageStream, std::io::Error> {
+        Ok(AsyncMessageStream::new(tokio_named_pipes::NamedPipe::from_pipe(self.0, handle)?))
+    }
+}
+
+impl AsyncMessageStream {
+    fn new(stream: tokio_named_pipes::NamedPipe) -> AsyncMessageStream {
+        AsyncMessageStream(stream)
+    }
+
+    pub fn poll_read(&self) -> futures::Async<()> {
+        self.0.poll_read()
+    }
+
+    pub fn poll_write(&self) -> futures::Async<()> {
+        self.0.poll_write()
+    }
+
+    pub fn need_read(&self) {
+        self.0.need_read()
+    }
+
+    pub fn need_write(&self) {
+        self.0.need_write()
+    }
+}
+
+impl std::io::Read for AsyncMessageStream {
+    fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
+        self.0.read(buf)
+    }
+}
+
+impl std::io::Write for AsyncMessageStream {
+    fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
+        self.0.write(buf)
+    }
+    fn flush(&mut self) -> std::io::Result<()> {
+        self.0.flush()
+    }
+}
+
+impl AsyncRead for AsyncMessageStream {
+    fn read_buf<B: bytes::BufMut>(&mut self, buf: &mut B) -> futures::Poll<usize, std::io::Error> {
+        <tokio_named_pipes::NamedPipe>::read_buf(&mut self.0, buf)
+    }
+}
+
+impl AsyncWrite for AsyncMessageStream {
+    fn shutdown(&mut self) -> futures::Poll<(), std::io::Error> {
+        <tokio_named_pipes::NamedPipe>::shutdown(&mut self.0)
+    }
+
+    fn write_buf<B: bytes::Buf>(&mut self, buf: &mut B) -> futures::Poll<usize, std::io::Error> {
+        <tokio_named_pipes::NamedPipe>::write_buf(&mut self.0, buf)
+    }
+}
+
+impl AsRawHandle for AsyncMessageStream {
+    fn as_raw_handle(&self) -> RawHandle {
+        self.0.as_raw_handle()
+    }
+}
+
+impl IntoRawHandle for MessageStream {
+    fn into_raw_handle(self) -> RawHandle {
+        // XXX: Ideally this would call into_raw_handle.
+        self.0.as_raw_handle()
+    }
+}
+
+static PIPE_ID: AtomicUsize = ATOMIC_USIZE_INIT;
+
+fn get_pipe_name() -> String {
+    let pid = std::process::id();
+    let pipe_id = PIPE_ID.fetch_add(1, Ordering::SeqCst);
+    format!("\\\\.\\pipe\\cubeb-pipe-{}-{}", pid, pipe_id)
+}
new file mode 100644
--- /dev/null
+++ b/media/audioipc/audioipc/src/tokio_named_pipes.rs
@@ -0,0 +1,175 @@
+// From https://github.com/alexcrichton/tokio-named-pipes/commit/3a22f8fc9a441b548aec25bd5df3b1e0ab99fabe
+// License MIT/Apache-2.0
+// Sloppily updated to be compatible with tokio_io
+// To be replaced with tokio_named_pipes crate after tokio 0.1 update.
+#![cfg(windows)]
+
+extern crate bytes;
+extern crate tokio_core;
+extern crate mio_named_pipes;
+extern crate futures;
+
+use std::ffi::OsStr;
+use std::fmt;
+use std::io::{self, Read, Write};
+use std::os::windows::io::*;
+
+use futures::{Async, Poll};
+use bytes::{BufMut, Buf};
+#[allow(deprecated)]
+use tokio_core::io::Io;
+use tokio_io::{AsyncRead, AsyncWrite};
+use tokio_core::reactor::{PollEvented, Handle};
+
+pub struct NamedPipe {
+    io: PollEvented<mio_named_pipes::NamedPipe>,
+}
+
+impl NamedPipe {
+    pub fn new<P: AsRef<OsStr>>(p: P, handle: &Handle) -> io::Result<NamedPipe> {
+        NamedPipe::_new(p.as_ref(), handle)
+    }
+
+    fn _new(p: &OsStr, handle: &Handle) -> io::Result<NamedPipe> {
+        let inner = try!(mio_named_pipes::NamedPipe::new(p));
+        NamedPipe::from_pipe(inner, handle)
+    }
+
+    pub fn from_pipe(pipe: mio_named_pipes::NamedPipe,
+                     handle: &Handle)
+                     -> io::Result<NamedPipe> {
+        Ok(NamedPipe {
+            io: try!(PollEvented::new(pipe, handle)),
+        })
+    }
+
+    pub fn connect(&self) -> io::Result<()> {
+        self.io.get_ref().connect()
+    }
+
+    pub fn disconnect(&self) -> io::Result<()> {
+        self.io.get_ref().disconnect()
+    }
+
+    pub fn need_read(&self) {
+        self.io.need_read()
+    }
+
+    pub fn need_write(&self) {
+        self.io.need_write()
+    }
+
+    pub fn poll_read(&self) -> Async<()> {
+        self.io.poll_read()
+    }
+
+    pub fn poll_write(&self) -> Async<()> {
+        self.io.poll_write()
+    }
+}
+
+impl Read for NamedPipe {
+    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
+        self.io.read(buf)
+    }
+}
+
+impl Write for NamedPipe {
+    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
+        self.io.write(buf)
+    }
+    fn flush(&mut self) -> io::Result<()> {
+        self.io.flush()
+    }
+}
+
+#[allow(deprecated)]
+impl Io for NamedPipe {
+    fn poll_read(&mut self) -> Async<()> {
+        <NamedPipe>::poll_read(self)
+    }
+
+    fn poll_write(&mut self) -> Async<()> {
+        <NamedPipe>::poll_write(self)
+    }
+}
+
+impl AsyncRead for NamedPipe {
+    unsafe fn prepare_uninitialized_buffer(&self, _: &mut [u8]) -> bool {
+        false
+    }
+
+    fn read_buf<B: BufMut>(&mut self, buf: &mut B) -> Poll<usize, io::Error> {
+        if NamedPipe::poll_read(self).is_not_ready() {
+            return Ok(Async::NotReady)
+        }
+
+        let mut stack_buf = [0u8; 1024];
+        let bytes_read = self.io.read(&mut stack_buf);
+        match bytes_read {
+            Err(ref e) if e.kind() == std::io::ErrorKind::WouldBlock => {
+                self.io.need_read();
+                return Ok(Async::NotReady);
+            },
+            Err(e) => Err(e),
+            Ok(bytes_read) => {
+                buf.put_slice(&stack_buf[0..bytes_read]);
+                Ok(Async::Ready(bytes_read))
+            }
+        }
+    }
+}
+
+impl AsyncWrite for NamedPipe {
+    fn shutdown(&mut self) -> Poll<(), io::Error> {
+        Ok(().into())
+    }
+
+    fn write_buf<B: Buf>(&mut self, buf: &mut B) -> Poll<usize, io::Error> {
+        if NamedPipe::poll_write(self).is_not_ready() {
+            return Ok(Async::NotReady)
+        }
+
+        let bytes_wrt = self.io.write(buf.bytes());
+        match bytes_wrt {
+            Err(ref e) if e.kind() == std::io::ErrorKind::WouldBlock => {
+                self.io.need_write();
+                return Ok(Async::NotReady);
+            },
+            Err(e) => Err(e),
+            Ok(bytes_wrt) => {
+                buf.advance(bytes_wrt);
+                Ok(Async::Ready(bytes_wrt))
+            }
+        }
+    }
+
+}
+
+impl<'a> Read for &'a NamedPipe {
+    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
+        (&self.io).read(buf)
+    }
+}
+
+impl<'a> Write for &'a NamedPipe {
+    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
+        (&self.io).write(buf)
+    }
+
+    fn flush(&mut self) -> io::Result<()> {
+        (&self.io).flush()
+    }
+}
+
+impl fmt::Debug for NamedPipe {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        self.io.get_ref().fmt(f)
+    }
+}
+
+impl AsRawHandle for NamedPipe {
+    fn as_raw_handle(&self) -> RawHandle {
+        self.io.get_ref().as_raw_handle()
+    }
+}
--- a/media/audioipc/client/Cargo.toml
+++ b/media/audioipc/client/Cargo.toml
@@ -4,16 +4,16 @@ version = "0.4.0"
 authors = [
         "Matthew Gregan <kinetik@flim.org>",
         "Dan Glastonbury <dan.glastonbury@gmail.com>"
         ]
 description = "Cubeb Backend for talking to remote cubeb server."
 
 [dependencies]
 audioipc = { path="../audioipc" }
-cubeb-backend = "0.5"
+cubeb-backend = "0.5.4"
 foreign-types = "0.3"
 futures = { version="0.1.18", default-features=false, features=["use_std"] }
 futures-cpupool = { version="0.1.8", default-features=false }
 libc = "0.2"
 log = "0.4"
 tokio-core = "0.1"
 tokio-uds = "0.1.7"
--- a/media/audioipc/client/src/context.rs
+++ b/media/audioipc/client/src/context.rs
@@ -1,43 +1,39 @@
 // Copyright © 2017 Mozilla Foundation
 //
 // This program is made available under an ISC-style license.  See the
 // accompanying file LICENSE for details
 
 use assert_not_in_callback;
 use audioipc::codec::LengthDelimitedCodec;
-use audioipc::fd_passing::{framed_with_fds, FramedWithFds};
+use audioipc::platformhandle_passing::{framed_with_platformhandles, FramedWithPlatformHandles};
 use audioipc::{core, rpc};
 use audioipc::{messages, ClientMessage, ServerMessage};
 use cubeb_backend::{
     ffi, Context, ContextOps, DeviceCollectionRef, DeviceId, DeviceType, Error, Ops, Result,
     Stream, StreamParams, StreamParamsRef,
 };
 use futures::Future;
 use futures_cpupool::{self, CpuPool};
-use libc;
 use std::ffi::{CStr, CString};
 use std::os::raw::c_void;
-use std::os::unix::io::FromRawFd;
-use std::os::unix::net;
 use std::sync::mpsc;
 use std::thread;
 use std::{fmt, io, mem, ptr};
 use stream;
 use tokio_core::reactor::{Handle, Remote};
-use tokio_uds::UnixStream;
 use {ClientStream, CPUPOOL_INIT_PARAMS, G_SERVER_FD};
 
 struct CubebClient;
 
 impl rpc::Client for CubebClient {
     type Request = ServerMessage;
     type Response = ClientMessage;
-    type Transport = FramedWithFds<UnixStream, LengthDelimitedCodec<Self::Request, Self::Response>>;
+    type Transport = FramedWithPlatformHandles<audioipc::AsyncMessageStream, LengthDelimitedCodec<Self::Request, Self::Response>>;
 }
 
 macro_rules! t(
     ($e:expr) => (
         match $e {
             Ok(e) => e,
             Err(_) => return Err(Error::default())
         }
@@ -68,34 +64,34 @@ impl ClientContext {
 
     #[doc(hidden)]
     pub fn cpu_pool(&self) -> CpuPool {
         self.cpu_pool.clone()
     }
 }
 
 // TODO: encapsulate connect, etc inside audioipc.
-fn open_server_stream() -> Result<net::UnixStream> {
+fn open_server_stream() -> Result<audioipc::MessageStream> {
     unsafe {
         if let Some(fd) = G_SERVER_FD {
-            return Ok(net::UnixStream::from_raw_fd(fd));
+            return Ok(audioipc::MessageStream::from_raw_fd(fd.as_raw()));
         }
 
         Err(Error::default())
     }
 }
 
 impl ContextOps for ClientContext {
     fn init(_context_name: Option<&CStr>) -> Result<Context> {
         fn bind_and_send_client(
-            stream: UnixStream,
+            stream: audioipc::AsyncMessageStream,
             handle: &Handle,
             tx_rpc: &mpsc::Sender<rpc::ClientProxy<ServerMessage, ClientMessage>>,
         ) -> Option<()> {
-            let transport = framed_with_fds(stream, Default::default());
+            let transport = framed_with_platformhandles(stream, Default::default());
             let rpc = rpc::bind_client::<CubebClient>(transport, handle);
             // If send fails then the rx end has closed
             // which is unlikely here.
             let _ = tx_rpc.send(rpc);
             Some(())
         }
 
         assert_not_in_callback();
@@ -116,17 +112,17 @@ impl ContextOps for ClientContext {
 
         let core = t!(core::spawn_thread("AudioIPC Client RPC", move || {
             let handle = core::handle();
 
             register_thread();
 
             open_server_stream()
                 .ok()
-                .and_then(|stream| UnixStream::from_stream(stream, &handle).ok())
+                .and_then(|stream| stream.into_tokio_ipc(&handle).ok())
                 .and_then(|stream| bind_and_send_client(stream, &handle, &tx_rpc))
                 .ok_or_else(|| {
                     io::Error::new(
                         io::ErrorKind::Other,
                         "Failed to open stream and create rpc.",
                     )
                 })
         }));
@@ -135,16 +131,18 @@ impl ContextOps for ClientContext {
 
         let cpupool = futures_cpupool::Builder::new()
             .name_prefix("AudioIPC")
             .after_start(register_thread)
             .pool_size(params.pool_size)
             .stack_size(params.stack_size)
             .create();
 
+        send_recv!(rpc, ClientConnect(std::process::id()) => ClientConnected)?;
+
         let ctx = Box::new(ClientContext {
             _ops: &CLIENT_OPS as *const _,
             rpc: rpc,
             core: core,
             cpu_pool: cpupool,
         });
         Ok(unsafe { Context::from_ptr(Box::into_raw(ctx) as *mut _) })
     }
@@ -275,17 +273,17 @@ impl ContextOps for ClientContext {
 }
 
 impl Drop for ClientContext {
     fn drop(&mut self) {
         debug!("ClientContext dropped...");
         let _ = send_recv!(self.rpc(), ClientDisconnect => ClientDisconnected);
         unsafe {
             if G_SERVER_FD.is_some() {
-                libc::close(super::G_SERVER_FD.take().unwrap());
+                G_SERVER_FD.take().unwrap().close();
             }
         }
     }
 }
 
 impl fmt::Debug for ClientContext {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         f.debug_struct("ClientContext")
--- a/media/audioipc/client/src/lib.rs
+++ b/media/audioipc/client/src/lib.rs
@@ -15,21 +15,20 @@ extern crate log;
 extern crate tokio_core;
 extern crate tokio_uds;
 
 #[macro_use]
 mod send_recv;
 mod context;
 mod stream;
 
-use audioipc::PlatformHandleType;
+use audioipc::{PlatformHandleType, PlatformHandle};
 use context::ClientContext;
 use cubeb_backend::{capi, ffi};
 use std::os::raw::{c_char, c_int};
-use std::os::unix::io::RawFd;
 use stream::ClientStream;
 
 type InitParamsTls = std::cell::RefCell<Option<CpuPoolInitParams>>;
 
 thread_local!(static IN_CALLBACK: std::cell::RefCell<bool> = std::cell::RefCell::new(false));
 thread_local!(static CPUPOOL_INIT_PARAMS: InitParamsTls = std::cell::RefCell::new(None));
 
 // This must match the definition of AudioIpcInitParams in
@@ -78,36 +77,36 @@ fn set_cpupool_init_params<P>(params: P)
 where
     P: Into<Option<CpuPoolInitParams>>,
 {
     CPUPOOL_INIT_PARAMS.with(|p| {
         *p.borrow_mut() = params.into();
     });
 }
 
-static mut G_SERVER_FD: Option<RawFd> = None;
+static mut G_SERVER_FD: Option<PlatformHandle> = None;
 
 #[no_mangle]
 /// Entry point from C code.
 pub unsafe extern "C" fn audioipc_client_init(
     c: *mut *mut ffi::cubeb,
     context_name: *const c_char,
     init_params: *const AudioIpcInitParams,
 ) -> c_int {
     if init_params.is_null() {
         return cubeb_backend::ffi::CUBEB_ERROR;
     }
 
     let init_params = &*init_params;
 
-    // TODO: Windows portability (for fd).
     // TODO: Better way to pass extra parameters to Context impl.
     if G_SERVER_FD.is_some() {
-        panic!("audioipc client's server connection already initialized.");
+        return cubeb_backend::ffi::CUBEB_ERROR;
     }
-    if init_params.server_connection >= 0 {
-        G_SERVER_FD = Some(init_params.server_connection);
+    G_SERVER_FD = PlatformHandle::try_new(init_params.server_connection);
+    if G_SERVER_FD.is_none() {
+        return cubeb_backend::ffi::CUBEB_ERROR;
     }
 
     let cpupool_init_params = CpuPoolInitParams::init_with(&init_params);
     set_cpupool_init_params(cpupool_init_params);
     capi::capi_init::<ClientContext>(c, context_name)
 }
--- a/media/audioipc/client/src/stream.rs
+++ b/media/audioipc/client/src/stream.rs
@@ -7,23 +7,19 @@ use audioipc::codec::LengthDelimitedCode
 use audioipc::frame::{framed, Framed};
 use audioipc::messages::{self, CallbackReq, CallbackResp, ClientMessage, ServerMessage};
 use audioipc::rpc;
 use audioipc::shm::{SharedMemMutSlice, SharedMemSlice};
 use cubeb_backend::{ffi, DeviceRef, Error, Result, Stream, StreamOps};
 use futures::Future;
 use futures_cpupool::{CpuFuture, CpuPool};
 use std::ffi::CString;
-use std::fs::File;
 use std::os::raw::c_void;
-use std::os::unix::io::FromRawFd;
-use std::os::unix::net;
 use std::ptr;
 use std::sync::mpsc;
-use tokio_uds::UnixStream;
 use ClientContext;
 use {assert_not_in_callback, set_in_callback};
 
 // TODO: Remove and let caller allocate based on cubeb backend requirements.
 const SHM_AREA_SIZE: usize = 2 * 1024 * 1024;
 
 pub struct Device(ffi::cubeb_device);
 
@@ -60,17 +56,17 @@ struct CallbackServer {
     user_ptr: usize,
     cpu_pool: CpuPool,
 }
 
 impl rpc::Server for CallbackServer {
     type Request = CallbackReq;
     type Response = CallbackResp;
     type Future = CpuFuture<Self::Response, ()>;
-    type Transport = Framed<UnixStream, LengthDelimitedCodec<Self::Response, Self::Request>>;
+    type Transport = Framed<audioipc::AsyncMessageStream, LengthDelimitedCodec<Self::Response, Self::Request>>;
 
     fn process(&mut self, req: Self::Request) -> Self::Future {
         match req {
             CallbackReq::Data { nframes, input_frame_size, output_frame_size } => {
                 trace!(
                     "stream_thread: Data Callback: nframes={} input_fs={} output_fs={}",
                     nframes,
                     input_frame_size,
@@ -150,31 +146,31 @@ impl<'ctx> ClientStream<'ctx> {
         assert_not_in_callback();
 
         let has_input = init_params.input_stream_params.is_some();
         let has_output = init_params.output_stream_params.is_some();
 
         let rpc = ctx.rpc();
         let data = try!(send_recv!(rpc, StreamInit(init_params) => StreamCreated()));
 
-        debug!("token = {}, fds = {:?}", data.token, data.fds);
+        debug!("token = {}, handles = {:?}", data.token, data.platform_handles);
 
-        let stm = data.fds[0];
-        let stream = unsafe { net::UnixStream::from_raw_fd(stm) };
+        let stm = data.platform_handles[0];
+        let stream = unsafe { audioipc::MessageStream::from_raw_fd(stm.as_raw()) };
 
-        let input = data.fds[1];
-        let input_file = unsafe { File::from_raw_fd(input) };
+        let input = data.platform_handles[1];
+        let input_file = unsafe { input.into_file() };
         let input_shm = if has_input {
             Some(SharedMemSlice::from(&input_file, SHM_AREA_SIZE).unwrap())
         } else {
             None
         };
 
-        let output = data.fds[2];
-        let output_file = unsafe { File::from_raw_fd(output) };
+        let output = data.platform_handles[2];
+        let output_file = unsafe { output.into_file() };
         let output_shm = if has_output {
             Some(SharedMemMutSlice::from(&output_file, SHM_AREA_SIZE).unwrap())
         } else {
             None
         };
 
         let user_data = user_ptr as usize;
 
@@ -186,17 +182,17 @@ impl<'ctx> ClientStream<'ctx> {
             data_cb: data_callback,
             state_cb: state_callback,
             user_ptr: user_data,
             cpu_pool: cpu_pool,
         };
 
         let (wait_tx, wait_rx) = mpsc::channel();
         ctx.remote().spawn(move |handle| {
-            let stream = UnixStream::from_stream(stream, handle).unwrap();
+            let stream = stream.into_tokio_ipc(handle).unwrap();
             let transport = framed(stream, Default::default());
             rpc::bind_server(transport, server, handle);
             wait_tx.send(()).unwrap();
             Ok(())
         });
         wait_rx.recv().unwrap();
 
         let stream = Box::into_raw(Box::new(ClientStream {
deleted file mode 100644
--- a/media/audioipc/register-collection-not-supported.patch
+++ /dev/null
@@ -1,22 +0,0 @@
-diff --git a/media/audioipc/client/src/context.rs b/media/audioipc/client/src/context.rs
---- a/media/audioipc/client/src/context.rs
-+++ b/media/audioipc/client/src/context.rs
-@@ -265,17 +265,17 @@ impl ContextOps for ClientContext {
- 
-     fn register_device_collection_changed(
-         &mut self,
-         _dev_type: DeviceType,
-         _collection_changed_callback: ffi::cubeb_device_collection_changed_callback,
-         _user_ptr: *mut c_void,
-     ) -> Result<()> {
-         assert_not_in_callback();
--        Ok(())
-+        Err(Error::not_supported())
-     }
- }
- 
- impl Drop for ClientContext {
-     fn drop(&mut self) {
-         debug!("ClientContext dropped...");
-         let _ = send_recv!(self.rpc(), ClientDisconnect => ClientDisconnected);
-         unsafe {
--- a/media/audioipc/server/Cargo.toml
+++ b/media/audioipc/server/Cargo.toml
@@ -4,17 +4,17 @@ version = "0.2.3"
 authors = [
         "Matthew Gregan <kinetik@flim.org>",
         "Dan Glastonbury <dan.glastonbury@gmail.com>"
         ]
 description = "Remote cubeb server"
 
 [dependencies]
 audioipc = { path = "../audioipc" }
-cubeb-core = "0.5.1"
+cubeb-core = "0.5.4"
 bytes = "0.4"
 lazycell = "^0.4"
 libc = "0.2"
 log = "0.4"
 slab = "0.3.0"
 futures = "0.1.18"
 tokio-core = "0.1"
 tokio-uds = "0.1.7"
--- a/media/audioipc/server/src/lib.rs
+++ b/media/audioipc/server/src/lib.rs
@@ -15,27 +15,24 @@ extern crate cubeb_core as cubeb;
 extern crate futures;
 extern crate lazycell;
 extern crate libc;
 extern crate slab;
 extern crate tokio_core;
 extern crate tokio_uds;
 
 use audioipc::core;
-use audioipc::fd_passing::framed_with_fds;
+use audioipc::platformhandle_passing::framed_with_platformhandles;
 use audioipc::rpc;
-use audioipc::PlatformHandleType;
+use audioipc::{MessageStream, PlatformHandle, PlatformHandleType};
 use futures::sync::oneshot;
 use futures::Future;
 use std::error::Error;
 use std::os::raw::c_void;
-use std::os::unix::io::IntoRawFd;
-use std::os::unix::net;
 use std::ptr;
-use tokio_uds::UnixStream;
 
 mod server;
 
 #[allow(deprecated)]
 pub mod errors {
     error_chain! {
         links {
             AudioIPC(::audioipc::errors::Error, ::audioipc::errors::ErrorKind);
@@ -97,38 +94,38 @@ pub extern "C" fn audioipc_server_start(
 
 #[no_mangle]
 pub extern "C" fn audioipc_server_new_client(p: *mut c_void) -> PlatformHandleType {
     let (wait_tx, wait_rx) = oneshot::channel();
     let wrapper: &ServerWrapper = unsafe { &*(p as *mut _) };
 
     let cb_remote = wrapper.callback_thread.remote();
 
-    // We create a pair of connected unix domain sockets. One socket is
-    // registered with the reactor core, the other is returned to the
-    // caller.
-    net::UnixStream::pair()
+    // We create a connected pair of anonymous IPC endpoints. One side
+    // is registered with the reactor core, the other side is returned
+    // to the caller.
+    MessageStream::anonymous_ipc_pair()
         .and_then(|(sock1, sock2)| {
             // Spawn closure to run on same thread as reactor::Core
             // via remote handle.
             wrapper.core_thread.remote().spawn(|handle| {
                 trace!("Incoming connection");
-                UnixStream::from_stream(sock2, handle)
+                sock2.into_tokio_ipc(handle)
                     .and_then(|sock| {
-                        let transport = framed_with_fds(sock, Default::default());
+                        let transport = framed_with_platformhandles(sock, Default::default());
                         rpc::bind_server(transport, server::CubebServer::new(cb_remote), handle);
                         Ok(())
                     }).map_err(|_| ())
                     // Notify waiting thread that sock2 has been registered.
                     .and_then(|_| wait_tx.send(()))
             });
             // Wait for notification that sock2 has been registered
             // with reactor::Core.
             let _ = wait_rx.wait();
-            Ok(sock1.into_raw_fd())
-        }).unwrap_or(-1)
+            Ok(PlatformHandle::from(sock1).as_raw())
+        }).unwrap_or(-1isize as PlatformHandleType)
 }
 
 #[no_mangle]
 pub extern "C" fn audioipc_server_stop(p: *mut c_void) {
     let wrapper = unsafe { Box::<ServerWrapper>::from_raw(p as *mut _) };
     drop(wrapper);
 }
--- a/media/audioipc/server/src/server.rs
+++ b/media/audioipc/server/src/server.rs
@@ -1,17 +1,18 @@
 // Copyright © 2017 Mozilla Foundation
 //
 // This program is made available under an ISC-style license.  See the
 // accompanying file LICENSE for details
 
 use audioipc;
+use audioipc::{MessageStream, PlatformHandle};
 use audioipc::codec::LengthDelimitedCodec;
 use audioipc::core;
-use audioipc::fd_passing::FramedWithFds;
+use audioipc::platformhandle_passing::FramedWithPlatformHandles;
 use audioipc::frame::{framed, Framed};
 use audioipc::messages::{
     CallbackReq, CallbackResp, ClientMessage, Device, DeviceInfo, ServerMessage, StreamCreate,
     StreamInitParams, StreamParams,
 };
 use audioipc::rpc;
 use audioipc::shm::{SharedMemReader, SharedMemWriter};
 use cubeb;
@@ -20,21 +21,18 @@ use futures::future::{self, FutureResult
 use futures::sync::oneshot;
 use futures::Future;
 use slab;
 use std::cell::RefCell;
 use std::convert::From;
 use std::ffi::{CStr, CString};
 use std::mem::{size_of, ManuallyDrop};
 use std::os::raw::{c_long, c_void};
-use std::os::unix::io::IntoRawFd;
-use std::os::unix::net;
 use std::{panic, slice};
 use tokio_core::reactor::Remote;
-use tokio_uds::UnixStream;
 
 use errors::*;
 
 fn error(error: cubeb::Error) -> ClientMessage {
     ClientMessage::Error(error.raw_code())
 }
 
 type ContextKey = RefCell<Option<cubeb::Result<cubeb::Context>>>;
@@ -60,17 +58,17 @@ const SHM_AREA_SIZE: usize = 2 * 1024 * 
 // The size in which the stream slab is grown.
 const STREAM_CONN_CHUNK_SIZE: usize = 64;
 
 struct CallbackClient;
 
 impl rpc::Client for CallbackClient {
     type Request = CallbackReq;
     type Response = CallbackResp;
-    type Transport = Framed<UnixStream, LengthDelimitedCodec<Self::Request, Self::Response>>;
+    type Transport = Framed<audioipc::AsyncMessageStream, LengthDelimitedCodec<Self::Request, Self::Response>>;
 }
 
 struct ServerStreamCallbacks {
     /// Size of input frame in bytes
     input_frame_size: u16,
     /// Size of output frame in bytes
     output_frame_size: u16,
     /// Shared memory buffer for sending input data to client
@@ -137,45 +135,50 @@ impl Drop for ServerStream {
     }
 }
 
 type StreamSlab = slab::Slab<ServerStream, usize>;
 
 pub struct CubebServer {
     cb_remote: Remote,
     streams: StreamSlab,
+    remote_pid: Option<u32>,
 }
 
 impl rpc::Server for CubebServer {
     type Request = ServerMessage;
     type Response = ClientMessage;
     type Future = FutureResult<Self::Response, ()>;
-    type Transport = FramedWithFds<UnixStream, LengthDelimitedCodec<Self::Response, Self::Request>>;
+    type Transport = FramedWithPlatformHandles<audioipc::AsyncMessageStream, LengthDelimitedCodec<Self::Response, Self::Request>>;
 
     fn process(&mut self, req: Self::Request) -> Self::Future {
         let resp = with_local_context(|context| match *context {
             Err(_) => error(cubeb::Error::error()),
             Ok(ref context) => self.process_msg(context, &req),
         });
         future::ok(resp)
     }
 }
 
 impl CubebServer {
     pub fn new(cb_remote: Remote) -> Self {
         CubebServer {
             cb_remote: cb_remote,
             streams: StreamSlab::with_capacity(STREAM_CONN_CHUNK_SIZE),
+            remote_pid: None,
         }
     }
 
     // Process a request coming from the client.
     fn process_msg(&mut self, context: &cubeb::Context, msg: &ServerMessage) -> ClientMessage {
         let resp: ClientMessage = match *msg {
-            ServerMessage::ClientConnect => panic!("already connected"),
+            ServerMessage::ClientConnect(pid) => {
+                self.remote_pid = Some(pid);
+                ClientMessage::ClientConnected
+            }
 
             ServerMessage::ClientDisconnect => {
                 // TODO:
                 //self.connection.client_disconnect();
                 ClientMessage::ClientDisconnected
             }
 
             ServerMessage::ContextGetBackendId => ClientMessage::ContextBackendId(),
@@ -299,17 +302,17 @@ impl CubebServer {
                     sample_size * channel_count
                 }).unwrap_or(0u16)
         }
 
         // Create the callback handling struct which is attached the cubeb stream.
         let input_frame_size = frame_size_in_bytes(params.input_stream_params.as_ref());
         let output_frame_size = frame_size_in_bytes(params.output_stream_params.as_ref());
 
-        let (stm1, stm2) = net::UnixStream::pair()?;
+        let (stm1, stm2) = MessageStream::anonymous_ipc_pair()?;
         debug!("Created callback pair: {:?}-{:?}", stm1, stm2);
         let (input_shm, input_file) =
             SharedMemWriter::new(&audioipc::get_shm_path("input"), SHM_AREA_SIZE)?;
         let (output_shm, output_file) =
             SharedMemReader::new(&audioipc::get_shm_path("output"), SHM_AREA_SIZE)?;
 
         // This code is currently running on the Client/Server RPC
         // handling thread.  We need to move the registration of the
@@ -318,17 +321,17 @@ impl CubebServer {
 
         let id = core::handle().id();
 
         let (tx, rx) = oneshot::channel();
         self.cb_remote.spawn(move |handle| {
             // Ensure we're running on a loop different to the one
             // invoking spawn_fn.
             assert_ne!(id, handle.id());
-            let stream = UnixStream::from_stream(stm2, handle).unwrap();
+            let stream = stm2.into_tokio_ipc(handle).unwrap();
             let transport = framed(stream, Default::default());
             let rpc = rpc::bind_client::<CallbackClient>(transport, handle);
             drop(tx.send(rpc));
             Ok(())
         });
 
         let rpc: rpc::ClientProxy<CallbackReq, CallbackResp> = match rx.wait() {
             Ok(rpc) => rpc,
@@ -397,21 +400,22 @@ impl CubebServer {
                         None => {
                             // TODO: Turn into error
                             panic!("Failed to insert stream into slab. No entries")
                         }
                     };
 
                     Ok(ClientMessage::StreamCreated(StreamCreate {
                         token: stm_tok,
-                        fds: [
-                            stm1.into_raw_fd(),
-                            input_file.into_raw_fd(),
-                            output_file.into_raw_fd(),
+                        platform_handles: [
+                            PlatformHandle::from(stm1),
+                            PlatformHandle::from(input_file),
+                            PlatformHandle::from(output_file),
                         ],
+                        target_pid: self.remote_pid.unwrap()
                     }))
                 }).map_err(|e| e.into())
         }
     }
 }
 
 // C callable callbacks
 unsafe extern "C" fn data_cb_c(
--- a/media/audioipc/update.sh
+++ b/media/audioipc/update.sh
@@ -6,16 +6,18 @@ cp -p $1/Cargo.toml .
 
 for crate in audioipc client server; do
     test -d $crate/src || mkdir -p $crate/src
     rm -fr $crate/*
     cp -pr $1/$crate/Cargo.toml $crate/
     cp -pr $1/$crate/src/ $crate/src/
 done
 
+rm audioipc/src/cmsghdr.c
+
 if [ -d $1/.git ]; then
   rev=$(cd $1 && git rev-parse --verify HEAD)
   date=$(cd $1 && git show -s --format=%ci HEAD)
   dirty=$(cd $1 && git diff-index --name-only HEAD)
 fi
 
 if [ -n "$rev" ]; then
   version=$rev
@@ -27,10 +29,8 @@ if [ -n "$rev" ]; then
   rm README_MOZILLA.bak
 else
   echo "Remember to update README_MOZILLA with the version details."
 fi
 
 echo "Applying gecko.patch on top of $rev"
 patch -p3 < gecko.patch
 
-echo "Applying register-collection-not-supported.patch on top of $rev"
-patch -p3 < register-collection-not-supported.patch
--- a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/InputMethods.java
+++ b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/InputMethods.java
@@ -12,17 +12,17 @@ import android.os.Build;
 import android.provider.Settings.Secure;
 import android.view.View;
 import android.view.inputmethod.InputMethodInfo;
 import android.view.inputmethod.InputMethodManager;
 
 final public class InputMethods {
     public static final String METHOD_ANDROID_LATINIME = "com.android.inputmethod.latin/.LatinIME";
     // ATOK has a lot of package names since they release custom versions.
-    public static final String METHOD_ATOK_PREFIX = "com.justsystems.atokmobile.";
+    public static final String METHOD_ATOK_PREFIX = "com.justsystems.atokmobile";
     public static final String METHOD_ATOK_OEM_PREFIX = "com.atok.mobile.";
     public static final String METHOD_GOOGLE_JAPANESE_INPUT = "com.google.android.inputmethod.japanese/.MozcService";
     public static final String METHOD_ATOK_OEM_SOFTBANK = "com.mobiroo.n.justsystems.atok/.AtokInputMethodService";
     public static final String METHOD_GOOGLE_LATINIME = "com.google.android.inputmethod.latin/com.android.inputmethod.latin.LatinIME";
     public static final String METHOD_HTC_TOUCH_INPUT = "com.htc.android.htcime/.HTCIMEService";
     public static final String METHOD_IWNN = "jp.co.omronsoft.iwnnime.ml/.standardcommon.IWnnLanguageSwitcher";
     public static final String METHOD_OPENWNN_PLUS = "com.owplus.ime.openwnnplus/.OpenWnnJAJP";
     public static final String METHOD_SAMSUNG = "com.sec.android.inputmethod/.SamsungKeypad";
--- a/servo/components/style/cbindgen.toml
+++ b/servo/components/style/cbindgen.toml
@@ -35,18 +35,23 @@ namespaces = ["mozilla"]
 [parse]
 parse_deps = true
 include = ["cssparser", "style_traits"]
 
 [struct]
 derive_eq = true
 derive_neq = true
 
+[macro_expansion]
+bitflags = true
+
 [enum]
 derive_helper_methods = true
+derive_const_casts = true
+cast_assert_name = "MOZ_ASSERT"
 
 [export]
 prefix = "Style"
 include = [
   "Appearance",
   "BreakBetween",
   "BreakWithin",
   "BorderStyle",
@@ -128,45 +133,39 @@ item_types = ["enums", "structs", "typed
   inline nscoord Resolve(T aPercentageGetter, U aPercentRoundingFunction) const;
   template<typename T>
   inline nscoord Resolve(nscoord aPercentageBasis, T aPercentRoundingFunction) const;
   template<typename T> inline nscoord Resolve(T aPercentageGetter) const;
   inline nscoord Resolve(nscoord aPercentageBasis) const;
 """
 
 "GenericLengthPercentageOrAuto" = """
-  inline const StyleLengthPercentage& AsLengthPercentage() const;
   inline bool ConvertsToLength() const;
   inline nscoord ToLength() const;
   inline bool ConvertsToPercentage() const;
   inline float ToPercentage() const;
   inline bool HasPercent() const;
   inline bool HasLengthAndPercentage() const;
 """
 
 "GenericSize" = """
-  inline const StyleLengthPercentage& AsLengthPercentage() const;
-  inline StyleExtremumLength AsExtremumLength() const;
   inline bool ConvertsToLength() const;
   inline nscoord ToLength() const;
   inline bool ConvertsToPercentage() const;
   inline float ToPercentage() const;
   inline bool HasPercent() const;
   inline bool HasLengthAndPercentage() const;
   inline bool BehavesLikeInitialValueOnBlockAxis() const;
 """
 
 "GenericFlexBasis" = """
   inline bool IsAuto() const;
-  inline const StyleSize& AsSize() const;
 """
 
 "GenericMaxSize" = """
-  inline const StyleLengthPercentage& AsLengthPercentage() const;
-  inline StyleExtremumLength AsExtremumLength() const;
   inline bool ConvertsToLength() const;
   inline nscoord ToLength() const;
   inline bool ConvertsToPercentage() const;
   inline float ToPercentage() const;
   inline bool HasPercent() const;
   inline bool HasLengthAndPercentage() const;
   inline bool BehavesLikeInitialValueOnBlockAxis() const;
 """
--- a/servo/components/style/traversal.rs
+++ b/servo/components/style/traversal.rs
@@ -681,17 +681,17 @@ where
 
                 resolver.cascade_styles_with_default_parents(cascade_inputs)
             };
 
             // Insert into the cache, but only if this style isn't reused from a
             // sibling or cousin. Otherwise, recascading a bunch of identical
             // elements would unnecessarily flood the cache with identical entries.
             //
-            // This is analagous to the obvious "don't insert an element that just
+            // This is analogous to the obvious "don't insert an element that just
             // got a hit in the style sharing cache" behavior in the MatchAndCascade
             // handling above.
             //
             // Note that, for the MatchAndCascade path, we still insert elements that
             // shared styles via the rule node, because we know that there's something
             // different about them that caused them to miss the sharing cache before
             // selector matching. If we didn't, we would still end up with the same
             // number of eventual styles, but would potentially miss out on various
--- a/servo/components/style/values/specified/length.rs
+++ b/servo/components/style/values/specified/length.rs
@@ -987,16 +987,20 @@ impl NonNegativeLengthPercentage {
         LengthPercentage::parse_non_negative_quirky(context, input, allow_quirks).map(NonNegative)
     }
 }
 
 /// Either a `<length>` or the `normal` keyword.
 pub type LengthOrNormal = Either<Length, Normal>;
 
 /// Either a `<length>` or the `auto` keyword.
+///
+/// Note that we use LengthPercentage just for convenience, since it pretty much
+/// is everything we care about, but we could just add a similar LengthOrAuto
+/// instead if we think getting rid of this weirdness is worth it.
 pub type LengthOrAuto = generics::LengthPercentageOrAuto<Length>;
 
 impl LengthOrAuto {
     /// Parses a length, allowing the unitless length quirk.
     /// <https://quirks.spec.whatwg.org/#the-unitless-length-quirk>
     #[inline]
     pub fn parse_quirky<'i, 't>(
         context: &ParserContext,
--- a/taskcluster/ci/config.yml
+++ b/taskcluster/ci/config.yml
@@ -241,8 +241,19 @@ partner-urls:
             default: null
             firefox:
                 by-release-type:
                     default: null
                     beta|release.*:
                         by-release-level:
                             production: 'git@github.com:mozilla-partners/mozilla-EME-free-manifest.git'
                             staging: 'git@github.com:moz-releng-automation-stage/mozilla-EME-free-manifest.git'
+
+
+task-priority:
+    by-project:
+        'mozilla-release': 'highest'
+        'mozilla-esr60': 'very-high'
+        'mozilla-beta': 'high'
+        'mozilla-central': 'medium'
+        'autoland': 'low'
+        'mozilla-inbound': 'low'
+        'default': 'very-low'
--- a/taskcluster/scripts/misc/build-cbindgen.sh
+++ b/taskcluster/scripts/misc/build-cbindgen.sh
@@ -1,14 +1,14 @@
 #!/bin/bash
 set -x -e -v
 
 # If you update this, make sure to update the minimum version in
 # build/moz.configure/bindgen.configure as well.
-CBINDGEN_REVISION=fbe9eff351c15c6ef348c33016fb72ad3520f32b # v0.7.1
+CBINDGEN_REVISION=60d8234bf3a287da75699936aa00ed9ec9762cc8 # v0.8.2
 TARGET="$1"
 
 case "$(uname -s)" in
 Linux)
     WORKSPACE=$HOME/workspace
     UPLOAD_DIR=$HOME/artifacts
     COMPRESS_EXT=xz
     ;;
--- a/taskcluster/taskgraph/config.py
+++ b/taskcluster/taskgraph/config.py
@@ -53,28 +53,37 @@ graph_config_schema = Schema({
         }},
     },
     Required('scriptworker'): {
         # Prefix to add to scopes controlling scriptworkers
         Required('scope-prefix'): basestring,
         # Mapping of scriptworker types to scopes they accept
         Required('worker-types'): {basestring: [basestring]}
     },
+    Required('task-priority'): optionally_keyed_by('project', Any(
+        'highest',
+        'very-high',
+        'high',
+        'medium',
+        'low',
+        'very-low',
+        'lowest',
+    )),
     Required('partner-urls'): {
         Required('release-partner-repack'):
             optionally_keyed_by('release-product', 'release-level', 'release-type',
                                 Any(basestring, None)),
         Required('release-eme-free-repack'):
             optionally_keyed_by('release-product', 'release-level', 'release-type',
                                 Any(basestring, None)),
     },
 })
 
 
-@attr.s(frozen=True)
+@attr.s(frozen=True, cmp=False)
 class GraphConfig(object):
     _config = attr.ib()
     root_dir = attr.ib()
 
     def __getitem__(self, name):
         return self._config[name]
 
     @property
--- a/taskcluster/taskgraph/transforms/task.py
+++ b/taskcluster/taskgraph/transforms/task.py
@@ -17,16 +17,17 @@ import time
 from copy import deepcopy
 
 from mozbuild.util import memoize
 from taskgraph.util.attributes import TRUNK_PROJECTS
 from taskgraph.util.hash import hash_path
 from taskgraph.util.treeherder import split_symbol
 from taskgraph.transforms.base import TransformSequence
 from taskgraph.util.taskcluster import get_root_url
+from taskgraph.util.keyed_by import evaluate_keyed_by
 from taskgraph.util.schema import (
     validate_schema,
     Schema,
     optionally_keyed_by,
     resolve_keyed_by,
     OptimizationSchema,
     taskref_or_string,
 )
@@ -279,47 +280,25 @@ def get_branch_repo(config):
     return config.params['{}head_repository'.format(
         config.graph_config['project-repo-param-prefix'],
     )]
 
 
 COALESCE_KEY = '{project}.{job-identifier}'
 SUPERSEDER_URL = 'https://coalesce.mozilla-releng.net/v1/list/{age}/{size}/{key}'
 
-DEFAULT_BRANCH_PRIORITY = 'low'
-BRANCH_PRIORITIES = {
-    'mozilla-release': 'highest',
-    'comm-esr60': 'highest',
-    'mozilla-esr60': 'very-high',
-    'mozilla-beta': 'high',
-    'comm-beta': 'high',
-    'mozilla-central': 'medium',
-    'comm-central': 'medium',
-    'comm-aurora': 'medium',
-    'autoland': 'low',
-    'mozilla-inbound': 'low',
-    'try': 'very-low',
-    'try-comm-central': 'very-low',
-    'alder': 'very-low',
-    'ash': 'very-low',
-    'birch': 'very-low',
-    'cedar': 'very-low',
-    'cypress': 'very-low',
-    'elm': 'very-low',
-    'fig': 'very-low',
-    'gum': 'very-low',
-    'holly': 'very-low',
-    'jamun': 'very-low',
-    'larch': 'very-low',
-    'maple': 'very-low',
-    'oak': 'very-low',
-    'pine': 'very-low',
-    'graphics': 'very-low',
-    'ux': 'very-low',
-}
+
+@memoize
+def get_default_priority(graph_config, project):
+    return evaluate_keyed_by(
+        graph_config['task-priority'],
+        "Graph Config",
+        {'project': project}
+    )
+
 
 # define a collection of payload builders, depending on the worker implementation
 payload_builders = {}
 
 
 def payload_builder(name, schema):
     schema = Schema({Required('implementation'): name}).extend(schema)
 
@@ -1684,19 +1663,17 @@ def build_task(config, tasks):
         if 'deadline-after' not in task:
             task['deadline-after'] = '1 day'
 
         if 'coalesce' in task:
             key = coalesce_key(config, task)
             routes.append('coalesce.v1.' + key)
 
         if 'priority' not in task:
-            task['priority'] = BRANCH_PRIORITIES.get(
-                config.params['project'],
-                DEFAULT_BRANCH_PRIORITY)
+            task['priority'] = get_default_priority(config.graph_config, config.params['project'])
 
         tags = task.get('tags', {})
         tags.update({
             'createdForUser': config.params['owner'],
             'kind': config.kind,
             'label': task['label'],
         })
 
new file mode 100644
--- /dev/null
+++ b/taskcluster/taskgraph/util/keyed_by.py
@@ -0,0 +1,74 @@
+# 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/.
+
+from __future__ import absolute_import, print_function, unicode_literals
+
+from .attributes import keymatch
+
+
+def evaluate_keyed_by(value, item_name, attributes):
+    """
+    For values which can either accept a literal value, or be keyed by some
+    attributes, perform that lookup and return the result.
+
+    For example, given item::
+
+        by-test-platform:
+            macosx-10.11/debug: 13
+            win.*: 6
+            default: 12
+
+    a call to `evaluate_keyed_by(item, 'thing-name', {'test-platform': 'linux96')`
+    would return `12`.
+
+    The `item_name` parameter is used to generate useful error messages.
+    Items can be nested as deeply as desired::
+
+        by-test-platform:
+            win.*:
+                by-project:
+                    ash: ..
+                    cedar: ..
+            linux: 13
+            default: 12
+    """
+    while True:
+        if not isinstance(value, dict) or len(value) != 1 or not value.keys()[0].startswith('by-'):
+            return value
+
+        keyed_by = value.keys()[0][3:]  # strip off 'by-' prefix
+        key = attributes.get(keyed_by)
+        alternatives = value.values()[0]
+
+        if len(alternatives) == 1 and 'default' in alternatives:
+            # Error out when only 'default' is specified as only alternatives,
+            # because we don't need to by-{keyed_by} there.
+            raise Exception(
+                "Keyed-by '{}' unnecessary with only value 'default' "
+                "found, when determining item {}".format(
+                    keyed_by, item_name))
+
+        if key is None:
+            if 'default' in alternatives:
+                value = alternatives['default']
+                continue
+            else:
+                raise Exception(
+                    "No attribute {} and no value for 'default' found "
+                    "while determining item {}".format(
+                        keyed_by, item_name))
+
+        matches = keymatch(alternatives, key)
+        if len(matches) > 1:
+            raise Exception(
+                "Multiple matching values for {} {!r} found while "
+                "determining item {}".format(
+                    keyed_by, key, item_name))
+        elif matches:
+            value = matches[0]
+            continue
+
+        raise Exception(
+            "No {} matching {!r} nor 'default' found while determining item {}".format(
+                keyed_by, key, item_name))
--- a/taskcluster/taskgraph/util/schema.py
+++ b/taskcluster/taskgraph/util/schema.py
@@ -7,17 +7,18 @@ from __future__ import absolute_import, 
 import re
 import pprint
 import collections
 import voluptuous
 
 import taskgraph
 
 from mozbuild import schedules
-from .attributes import keymatch
+
+from .keyed_by import evaluate_keyed_by
 
 
 def validate_schema(schema, obj, msg_prefix):
     """
     Validate that object satisfies schema.  If not, generate a useful exception
     beginning with msg_prefix.
     """
     if taskgraph.fast:
@@ -74,16 +75,17 @@ def resolve_keyed_by(item, field, item_n
                     macosx-10.11/debug: 13
                     win.*: 6
                     default: 12
 
     a call to `resolve_keyed_by(item, 'job.chunks', item['thing-name'])`
     would mutate item in-place to::
 
         job:
+            test-platform: linux128
             chunks: 12
 
     The `item_name` parameter is used to generate useful error messages.
 
     If extra_values are supplied, they represent additional values available
     for reference from by-<field>.
 
     Items can be nested as deeply as the schema will allow::
@@ -104,56 +106,24 @@ def resolve_keyed_by(item, field, item_n
         if f not in container:
             return item
         container = container[f]
         if not isinstance(container, dict):
             return item
 
     if subfield not in container:
         return item
-    value = container[subfield]
-    while True:
-        if not isinstance(value, dict) or len(value) != 1 or not value.keys()[0].startswith('by-'):
-            return item
-
-        keyed_by = value.keys()[0][3:]  # strip off 'by-' prefix
-        key = extra_values[keyed_by] if keyed_by in extra_values else item.get(keyed_by)
-        alternatives = value.values()[0]
-
-        if len(alternatives) == 1 and 'default' in alternatives:
-            # Error out when only 'default' is specified as only alternatives,
-            # because we don't need to by-{keyed_by} there.
-            raise Exception(
-                "Keyed-by '{}' unnecessary with only value 'default' "
-                "found, when determining item '{}' in '{}'".format(
-                    keyed_by, field, item_name))
 
-        if key is None:
-            if 'default' in alternatives:
-                value = container[subfield] = alternatives['default']
-                continue
-            else:
-                raise Exception(
-                    "No attribute {} and no value for 'default' found "
-                    "while determining item {} in {}".format(
-                        keyed_by, field, item_name))
+    container[subfield] = evaluate_keyed_by(
+        value=container[subfield],
+        item_name="`{}` in `{}`".format(field, item_name),
+        attributes=dict(item, **extra_values),
+    )
 
-        matches = keymatch(alternatives, key)
-        if len(matches) > 1:
-            raise Exception(
-                "Multiple matching values for {} {!r} found while "
-                "determining item {} in {}".format(
-                    keyed_by, key, field, item_name))
-        elif matches:
-            value = container[subfield] = matches[0]
-            continue
-
-        raise Exception(
-            "No {} matching {!r} nor 'default' found while determining item {} in {}".format(
-                keyed_by, key, field, item_name))
+    return item
 
 
 # Schemas for YAML files should use dashed identifiers by default.  If there are
 # components of the schema for which there is a good reason to use another format,
 # they can be whitelisted here.
 WHITELISTED_SCHEMA_IDENTIFIERS = [
     # upstream-artifacts are handed directly to scriptWorker, which expects interCaps
     lambda path: "[u'upstream-artifacts']" in path,
--- a/testing/web-platform/tests/css/cssom/css-style-declaration-modifications.html
+++ b/testing/web-platform/tests/css/cssom/css-style-declaration-modifications.html
@@ -43,21 +43,29 @@
 
     test(function() {
         while (declaration.length > 0) {
             declaration.removeProperty(declaration.item(0));
         }
         declaration.setProperty("margin-left", "15px");
         declaration.setProperty("padding-left", "15px");
 
+
         assert_equals(declaration.length, 2);
         assert_equals(declaration.item(0), "margin-left");
         assert_equals(declaration.item(1), "padding-left");
         assert_equals(declaration.getPropertyValue("margin-left"), "15px");
         assert_equals(declaration.getPropertyValue("padding-left"), "15px");
 
         var computedStyle = window.getComputedStyle(document.getElementById("test"));
         assert_equals(computedStyle.getPropertyValue("margin-left"), "15px");
         assert_equals(computedStyle.getPropertyValue("padding-left"), "15px");
+
     }, "Calling CSSStyleDeclaration#setProperty");
+
+    test(function() {
+        declaration.setProperty("background-color", "red", "ImPoRtAnt");
+        assert_equals(declaration.getPropertyPriority("background-color"), "important");
+    }, "setProperty priority should be case-insensitive");
+
  </script>
  </body>
 </html>
--- a/third_party/rust/cubeb-backend/.cargo-checksum.json
+++ b/third_party/rust/cubeb-backend/.cargo-checksum.json
@@ -1,1 +1,1 @@
-{"files":{"Cargo.toml":"5009330f8a03fc0cf4b10540514496db0281bb92541f9850217c5de7d12dc8b7","LICENSE":"8c044baa5d883274736eeece0b955249076c2697b826e576fce59496235b2cf5","src/capi.rs":"300e76bd3901de540b21a2cfc8d15dbcd1b2940d5fbb517fc5fe568af2ec2775","src/lib.rs":"94b80747ae1037423a2281f2572fc6d15cd7702417974ae3730adccd71c7a300","src/log.rs":"704faeb31934dad6bc6d02e01caa85118754209bd559d30d03fcfa5cb8c1603c","src/ops.rs":"55cbf9bdccdd854834eba72e8bde3e59a9a4193e65209769a1a6e0d8a320b8f6","src/traits.rs":"1a6e3401bb25088d355041704bd89099d62b51eda94da177e7e860646c52b955","tests/test_capi.rs":"9d949cbdb1c19e229ce4f652999a058c283cf7d5a882a669dbca08b71ac2fb62"},"package":"0432a0d08c3f9a778a2b0b6214c87ec2eb17e8639eb68baf0686bdafc4fd11f1"}
\ No newline at end of file
+{"files":{"Cargo.toml":"1933f3fab97c50556ade6cc02e82b911aa7d7787be13501e9ea8dc09b85b2739","LICENSE":"8c044baa5d883274736eeece0b955249076c2697b826e576fce59496235b2cf5","src/capi.rs":"300e76bd3901de540b21a2cfc8d15dbcd1b2940d5fbb517fc5fe568af2ec2775","src/lib.rs":"94b80747ae1037423a2281f2572fc6d15cd7702417974ae3730adccd71c7a300","src/log.rs":"704faeb31934dad6bc6d02e01caa85118754209bd559d30d03fcfa5cb8c1603c","src/ops.rs":"55cbf9bdccdd854834eba72e8bde3e59a9a4193e65209769a1a6e0d8a320b8f6","src/traits.rs":"1a6e3401bb25088d355041704bd89099d62b51eda94da177e7e860646c52b955","tests/test_capi.rs":"9d949cbdb1c19e229ce4f652999a058c283cf7d5a882a669dbca08b71ac2fb62"},"package":"442cd5cfb980ff62730525278ce320d9b2ff635b725857ad3176832664262fec"}
\ No newline at end of file
--- a/third_party/rust/cubeb-backend/Cargo.toml
+++ b/third_party/rust/cubeb-backend/Cargo.toml
@@ -7,23 +7,23 @@
 #
 # If you believe there's an error in this file please file an
 # issue against the rust-lang/cargo repository. If you're
 # editing this file be aware that the upstream Cargo.toml
 # will likely look very different (and much more reasonable)
 
 [package]
 name = "cubeb-backend"
-version = "0.5.1"
+version = "0.5.4"
 authors = ["Dan Glastonbury <dglastonbury@mozilla.com>"]
 description = "Bindings to libcubeb internals to facilitate implementing cubeb backends in rust.\n"
 homepage = "https://github.com/djg/cubeb-rs"
 keywords = ["cubeb"]
 categories = ["api-bindings"]
 license = "ISC"
 repository = "https://github.com/djg/cubeb-rs"
 [dependencies.cubeb-core]
-version = "0.5.0"
+version = "0.5.4"
 
 [features]
 gecko-in-tree = ["cubeb-core/gecko-in-tree"]
 [badges.circle-ci]
 repository = "djg/cubeb-rs"
--- a/third_party/rust/cubeb-core/.cargo-checksum.json
+++ b/third_party/rust/cubeb-core/.cargo-checksum.json
@@ -1,1 +1,1 @@
-{"files":{"Cargo.toml":"c379f4deb07a056d5d1679f4641c3a29dec6c74a82b2304cbf5ec65488e5a9bc","LICENSE":"8c044baa5d883274736eeece0b955249076c2697b826e576fce59496235b2cf5","src/builders.rs":"ca97e3a3d1f3fc451c17851c8538964ec67f3964dfe29e902d904ee7445becca","src/channel.rs":"c8d5a76ef3ecdd96cd4de516e3d4d139bbb83c4690d1c3f5fd07fffc47be51f1","src/context.rs":"09625b75070ec88d566a907ab2e574e2d85df4c6df295f798b3372df2cdc8f7a","src/device.rs":"490d2e94ecae1e149476c2e8d9aa03c4163987c3efccc962b2d3123e4c09dedf","src/device_collection.rs":"f6d0c1628cc34b524f86b84a1e1c79971c3f64ebc4ac64eeb10a1330bbe8c238","src/error.rs":"855ff3d3597753f832ecea00e403c71129afd80db3d39456cf3e23cb9aeb91e7","src/ffi_types.rs":"d815d7a80895b5e86907e708dc0219fca4ac4668cde114afee434e7d702a145d","src/format.rs":"5513c537a72af1c222ee7c30b26d4de9d368a69772688b95d88b1a99f6892d5c","src/lib.rs":"6010a5e20b836b8e5c9fba382fde819e6f3c18c0ec2016e6e7e118eabedbcd51","src/log.rs":"c46bae3472043fd076df3229c3421d948a87fae8495c1524b41ab2d8608f612a","src/stream.rs":"775b9af0e3d8c1a7a38f96b8365a632a9d52a43541d96ede9a4ed9688c2dc914","src/try_call.rs":"231bfa3f3448f7531427bb228beb2bcd4fd711f0b13d2d8f412af013470f40c7","src/util.rs":"308cfbaacd615ff600e74415c52daeef007fff34a4a0648a73c0042f6067f84f"},"package":"37f7b20f757a4e4b6aa28863236551bff77682dc6db192eba15af615492b5445"}
\ No newline at end of file
+{"files":{"Cargo.toml":"5606a2dfca9a44892ebfbc7caa0a96a50e8bb96676f7a9aaf584b3d459843d86","LICENSE":"8c044baa5d883274736eeece0b955249076c2697b826e576fce59496235b2cf5","src/builders.rs":"ca97e3a3d1f3fc451c17851c8538964ec67f3964dfe29e902d904ee7445becca","src/channel.rs":"c8d5a76ef3ecdd96cd4de516e3d4d139bbb83c4690d1c3f5fd07fffc47be51f1","src/context.rs":"09625b75070ec88d566a907ab2e574e2d85df4c6df295f798b3372df2cdc8f7a","src/device.rs":"490d2e94ecae1e149476c2e8d9aa03c4163987c3efccc962b2d3123e4c09dedf","src/device_collection.rs":"f6d0c1628cc34b524f86b84a1e1c79971c3f64ebc4ac64eeb10a1330bbe8c238","src/error.rs":"855ff3d3597753f832ecea00e403c71129afd80db3d39456cf3e23cb9aeb91e7","src/ffi_types.rs":"d815d7a80895b5e86907e708dc0219fca4ac4668cde114afee434e7d702a145d","src/format.rs":"5513c537a72af1c222ee7c30b26d4de9d368a69772688b95d88b1a99f6892d5c","src/lib.rs":"6010a5e20b836b8e5c9fba382fde819e6f3c18c0ec2016e6e7e118eabedbcd51","src/log.rs":"c46bae3472043fd076df3229c3421d948a87fae8495c1524b41ab2d8608f612a","src/stream.rs":"775b9af0e3d8c1a7a38f96b8365a632a9d52a43541d96ede9a4ed9688c2dc914","src/try_call.rs":"231bfa3f3448f7531427bb228beb2bcd4fd711f0b13d2d8f412af013470f40c7","src/util.rs":"308cfbaacd615ff600e74415c52daeef007fff34a4a0648a73c0042f6067f84f"},"package":"0161f9327864922ba7a172c90bd86bc9094938433eca415e2c75629954045022"}
\ No newline at end of file
--- a/third_party/rust/cubeb-core/Cargo.toml
+++ b/third_party/rust/cubeb-core/Cargo.toml
@@ -7,26 +7,26 @@
 #
 # If you believe there's an error in this file please file an
 # issue against the rust-lang/cargo repository. If you're
 # editing this file be aware that the upstream Cargo.toml
 # will likely look very different (and much more reasonable)
 
 [package]
 name = "cubeb-core"
-version = "0.5.1"
+version = "0.5.4"
 authors = ["Dan Glastonbury <dglastonbury@mozilla.com>"]
 description = "Common types and definitions for cubeb rust and C bindings. Not intended for direct use.\n"
 homepage = "https://github.com/djg/cubeb-rs"
 keywords = ["cubeb"]
 categories = ["api-bindings"]
 license = "ISC"
 repository = "https://github.com/djg/cubeb-rs"
 [dependencies.bitflags]
 version = "1.0"
 
 [dependencies.cubeb-sys]
-version = "0.5.0"
+version = "0.5.4"
 
 [features]
 gecko-in-tree = ["cubeb-sys/gecko-in-tree"]
 [badges.circle-ci]
 repository = "djg/cubeb-rs"
--- a/third_party/rust/cubeb-sys/.cargo-checksum.json
+++ b/third_party/rust/cubeb-sys/.cargo-checksum.json
@@ -1,1 +1,1 @@
-{"files":{"Cargo.toml":"b43b0c932a03f5d8372da2147b0d505f051a3f39eaa3b0f0de876256fa842ed7","LICENSE":"8c044baa5d883274736eeece0b955249076c2697b826e576fce59496235b2cf5","build.rs":"49985a30631de0015517fc260321aa03a003eaf26d80650bebd928d55edc9444","libcubeb/AUTHORS":"829e45d138c7c8827799f302806fa4be8cd8bd4bad70a2fe26c3a27a5cf36948","libcubeb/CMakeLists.txt":"381886472be5fc0f925aa42268fd2df9f17f5613ee7db489849af474189f0358","libcubeb/Config.cmake.in":"88019286c96ef3d5d3a673b183c8655dfc97ceede07d3eb6c18f0c51bb896388","libcubeb/INSTALL.md":"7a84cdfbe86e7d3180e2203603b88571df61b369421fa97ee86740ffd4d4db8e","libcubeb/LICENSE":"44c6b5ae5ec3fe2fbc608b00e6f4896f4d2d5c7e525fcbaa3eaa3cf2f3d5a983","libcubeb/README.md":"aa417156dc65069264901b75fc3c792c73021ec61c909de04e109bd4184c07ab","libcubeb/TODO":"6f8065136e005d2becee810e3d8697a94f2c755f8c79687adfac7136ad165e80","libcubeb/appveyor.yml":"9a87fdc18b76fca1167289ecb2ec3a210b76984c1d7e92268b2cd36f1e00f541","libcubeb/cmake/sanitizers-cmake/CMakeLists.txt":"89b282c19b3897ff666f7847d5e679ae928ca7e76ffd0d23f7c58c9464048b61","libcubeb/cmake/sanitizers-cmake/LICENSE":"4b67e7ae8c91e68e1a929eb1cbaa4c773c6d19aa91aaa12c390cf9560d1c9799","libcubeb/cmake/sanitizers-cmake/README.md":"30ab1524618ac828b75f9b83c665a0bd50b839b42ce61519a8048d73f401da6e","libcubeb/cmake/sanitizers-cmake/cmake/FindASan.cmake":"cba07ffe438c57bef0840ed6a2d2890676530b66509da3c616438c53018baa4f","libcubeb/cmake/sanitizers-cmake/cmake/FindMSan.cmake":"1303aac5028fe9f64d42be0afd47f1291e679d74f8280b3dc5271f20ebf4d7a4","libcubeb/cmake/sanitizers-cmake/cmake/FindSanitizers.cmake":"ce1971b943bbef08fb9aba958cf28e3cbdff075406c85a3cfed22e00c9f8d9a8","libcubeb/cmake/sanitizers-cmake/cmake/FindTSan.cmake":"edca39b287312e9a8fc718f6ec791d2520515900b37426091310fe1bd52dc6a1","libcubeb/cmake/sanitizers-cmake/cmake/FindUBSan.cmake":"5b9d3621f629c807a1345a7cb053677a8bf25782a079e345dda53d04aecdc4b7","libcubeb/cmake/sanitizers-cmake/cmake/asan-wrapper":"4e543936e6374e24b80a0f92135c07c2e2101c0d110e51bddaf0e70ae8ec391e","libcubeb/cmake/sanitizers-cmake/cmake/sanitize-helpers.cmake":"282620734c2a8062f1280d0dde3121b8b01af26e5ecaa7d4308e145f80ecd115","libcubeb/cmake/sanitizers-cmake/tests/CMakeLists.txt":"fb983bab7040be002847db59c2493abfd249f67ad06e3a9270fbceb9fabda11c","libcubeb/cmake/sanitizers-cmake/tests/asan_test.cpp":"8b351c7c8668b4a2438286df426f0ad322cade6d1c6199a74668ccbd1c5204a4","libcubeb/cmake/toolchain-cross-android.cmake":"59d2355845a71647b353fb8b18fca630db8ffee7bb8500143e2d6fbc409cec97","libcubeb/cmake/toolchain-cross-mingw.cmake":"b09dc261981c0d4a0f8430f05aae9c8fc545651cd9cbfacd09754277b776b532","libcubeb/cubeb.supp":"19f33e59f8dc91a327c923e44c2c3f9af0a043ce1d6a8cac275ba094b4bfe0da","libcubeb/docs/Doxyfile.in":"0815f19789cedd310652a133bab260c27b57e95f7a65458df2dfca38ea4f1041","libcubeb/googletest/CHANGES":"72c8a289bfe4dd9160074a3a2238c8067a5bc7ca49fd87f70a134c3f373932a4","libcubeb/googletest/CMakeLists.txt":"cdf938ce79ea066866dc614de3925bfaa48d9e19e04049db2ec8c5443abaaa9b","libcubeb/googletest/CONTRIBUTORS":"4d911cd5e6d71f3f4bbcb2788b2f916df4b0ce1e088752a159457a1d936ae0ce","libcubeb/googletest/COPYING":"9702de7e4117a8e2b20dafab11ffda58c198aede066406496bef670d40a22138","libcubeb/googletest/Makefile.am":"a795e5a18e82ba06fd97509d92d773b7fafd0dd7086db8a1211fbd151b503bac","libcubeb/googletest/README":"484b19654362942fac9734c8fab0ed3d99249b81c69027bdb7de46054abada6b","libcubeb/googletest/cmake/internal_utils.cmake":"6f4670a5825cf8ae0415be9dd43d82a7f30316d75cab20a4c60afb6d9db2a01d","libcubeb/googletest/codegear/gtest.cbproj":"9fa07a66b8c01773256e508187775407c465ed9055651e93d390426d1888721a","libcubeb/googletest/codegear/gtest.groupproj":"76c001cb2ee0070e26d1570fb6db5250f2585179c707496c5ef6d12e582cf205","libcubeb/googletest/codegear/gtest_all.cc":"c8750dc2b7b3612edb60e8d23fc2f60ae264451916c4b15f81cbf60ea30eb75d","libcubeb/googletest/codegear/gtest_link.cc":"e5e47c086f932471e0ca748a62b3b1597e5e731f4d34fb8cb8b2ca2db7ba3ed0","libcubeb/googletest/codegear/gtest_main.cbproj":"056448ba7f41fae3f704b1001922d9f6e419cf8cbcf3a55bf0ecc59ece1fa9a1","libcubeb/googletest/codegear/gtest_unittest.cbproj":"2c48be90b0dbc3224a8bd6c4dc21f78dd1b08c81685e6bd4952bb6df6ee38701","libcubeb/googletest/configure.ac":"fadebffdaeaccebb60fbe4a501c1138c296e01348a5da45fabf5e4233248baa8","libcubeb/googletest/include/gtest/gtest-death-test.h":"fdd087f700cd04a3ce4bdd36f35769de52a44bfc0c5bae2dc9681d4cbcd3c44a","libcubeb/googletest/include/gtest/gtest-message.h":"eaf44df1284d94333507c47091c84eaaf43814e6a02a1b1c0061ca7b363e74d6","libcubeb/googletest/include/gtest/gtest-param-test.h":"f226f0a24c04cddbceaaa45d8a5e575ce18c3392349f9b8ba73317e37e62368d","libcubeb/googletest/include/gtest/gtest-param-test.h.pump":"17c65fd5cc5218279044a61f3873c9c952b0924a7ba5147d4999d400b122207f","libcubeb/googletest/include/gtest/gtest-printers.h":"7046f611398d63ee0f1c37bdb4fd08d9931979b2fedf13b781e6d85d4b3b5d60","libcubeb/googletest/include/gtest/gtest-spi.h":"560407dd45e8e57fa6927504c9e4a4cfdecf30f8cada975c1ffddce765e6a88a","libcubeb/googletest/include/gtest/gtest-test-part.h":"c4d6d840284728740c284646075e8ffc85b63b9f74f3ed488b18ef3c2c2b9005","libcubeb/googletest/include/gtest/gtest-typed-test.h":"1ec858bbb9ed8a8bb553232df016437c080b2670f00453b4de297c286eb78c21","libcubeb/googletest/include/gtest/gtest.h":"47433ca72a43bda7a380c34fe6d4ff451797c687e9bbd74d1f366bcdfa0cb013","libcubeb/googletest/include/gtest/gtest_pred_impl.h":"f03a3f77e3c231889c0ace6f63b2c4e410e4a9330287ea09443b23b9a3cf9092","libcubeb/googletest/include/gtest/gtest_prod.h":"4a99a3d986a45b4d6d9b3af54809f015c54aa98274793a4ae173f5010d0ad33c","libcubeb/googletest/include/gtest/internal/gtest-death-test-internal.h":"0b3abead866363f3e6b4201acc8d2763072e033826b22ae5ebffd790e1415235","libcubeb/googletest/include/gtest/internal/gtest-filepath.h":"638d2bb6c06a894513b03311a8e931ac835fc00afc4bd21fab3afc05732c23a0","libcubeb/googletest/include/gtest/internal/gtest-internal.h":"12c2c83df0a9dc5b46697ccd8271dfa34ee5f3d1972dcb56585bc1459d9583c9","libcubeb/googletest/include/gtest/internal/gtest-linked_ptr.h":"9bd319548dd073630dfd349c06a440c6a582feec47d4ff14f348ec32f8b4c1f3","libcubeb/googletest/include/gtest/internal/gtest-param-util-generated.h":"10db93fa7e98820192bae6f560664469dd33b265036fca64253c89b6801f96cb","libcubeb/googletest/include/gtest/internal/gtest-param-util-generated.h.pump":"abb72365d94d2811b34c195dc520fbf41c7dcb42aae5a1cfa0502cf619b21e70","libcubeb/googletest/include/gtest/internal/gtest-param-util.h":"7f9311f033ef6916217d87cef53b1db6c4e8733be930e4b48fe7e11d21b33da0","libcubeb/googletest/include/gtest/internal/gtest-port.h":"612932c2930a7cf2c3514d89a8d6b51a2c0030d251309b71765ed1c9954e20c5","libcubeb/googletest/include/gtest/internal/gtest-string.h":"a46aa36165c400d1e926f942be03fe04cd7ccb1e59f7a2a03b919c4eea05b997","libcubeb/googletest/include/gtest/internal/gtest-tuple.h":"43e7e3c92f8e4258cf3927a9204b214d4d03e6c796f88f3ad4e66b1ac20aa938","libcubeb/googletest/include/gtest/internal/gtest-tuple.h.pump":"16fa027ed3c5940699e0ac906815e66620993bcf75b0acaf826d4f09348d4b83","libcubeb/googletest/include/gtest/internal/gtest-type-util.h":"6d177af46a9b1e14b969972a8b886667f95e69037aba411433a44fb9b92e7037","libcubeb/googletest/include/gtest/internal/gtest-type-util.h.pump":"22092f44127af91651f57ce222e20914d5d32ae02f1c0964f6d5d7bc019af339","libcubeb/googletest/m4/acx_pthread.m4":"3326e3746b6b351d1671fe31f798269cda8de92c365b8a8305404ec0fa6c6b32","libcubeb/googletest/m4/gtest.m4":"d3c37ebd1aa792c967d4357755cc670bc6deb30091d9e6db498871d90a30ea4c","libcubeb/googletest/make/Makefile":"9b86e2a112dd55c6bf6a2b39e6f4078faf60cfecb8282ebf9b025167ed233420","libcubeb/googletest/msvc/gtest-md.sln":"0beab679b42cf0c431eaf4fe143bbf3b01fc064e20c74d9e33e7e437a70487d4","libcubeb/googletest/msvc/gtest-md.vcproj":"52e873e964daf9d5409b4e9bb471ddf2827be04985cd96c40620f9275d17a256","libcubeb/googletest/msvc/gtest.sln":"be21c2340650ec2259a2fbaeb8608ae6d3e982a0626a0f91128a771dc88e6bea","libcubeb/googletest/msvc/gtest.vcproj":"0064616c7d88a284c1b7c05baab038f239134ea9c6c563628f286f9600b3f921","libcubeb/googletest/msvc/gtest_main-md.vcproj":"f83a294a92b616bf34ccae6743ff916297bdba61d6125a9637a813d467a30372","libcubeb/googletest/msvc/gtest_main.vcproj":"9f03270a00896eab0c7015c6fb1a73818d024e462d3944ba1d3ceb313a051649","libcubeb/googletest/msvc/gtest_prod_test-md.vcproj":"7caa108733e2d5f140da004d2133e04a9a105811909c0e2d4ec06e2971983592","libcubeb/googletest/msvc/gtest_prod_test.vcproj":"cf5bfb7f3de9a59a0eba5535067845d12c33c3fd8fecc3d03aa702665db29578","libcubeb/googletest/msvc/gtest_unittest-md.vcproj":"e7949b21cf0418f2a7afe8aa94616e2c40e3ba0801c2f0826f3a3a3d2e6f48b0","libcubeb/googletest/msvc/gtest_unittest.vcproj":"5b097d596fbbc1c4090fd518008a0961b29661194e1c02d8a2d3daaa557e626f","libcubeb/googletest/samples/prime_tables.h":"2903df1d1e6643a5f624fe3ea3f931c3410eb1858ac347c5df278273c6c91ca4","libcubeb/googletest/samples/sample1.cc":"dc106c5940d87bb4bbef3d77815eab642ee173a3340b2b9c532b5c711c4c2d0e","libcubeb/googletest/samples/sample1.h":"7a7bf9a0fbd2401e8b2cb554bfcb9bd0ed228212f3b970675c1b1d38d4e188bb","libcubeb/googletest/samples/sample10_unittest.cc":"ccebb6393a5a8468399f7e511219b667a2233f82312ce59834a4bb0997d8700e","libcubeb/googletest/samples/sample1_unittest.cc":"904be0d4a095e74393515195392bd10e1e916bb2ca61f3f94b1bd6aebea29cb6","libcubeb/googletest/samples/sample2.cc":"f14b8a1e69d52eef1a70053fb256818c7eca64e8eda08de43cf46e896e57fcc2","libcubeb/googletest/samples/sample2.h":"df956ba520dafca068dbc1e28f36567db3cba36293e06762318af8cda6a12bd4","libcubeb/googletest/samples/sample2_unittest.cc":"abe7e0b253d328cb82ae67623fbe3c89eb94699102510c64a0b568eaca101e05","libcubeb/googletest/samples/sample3-inl.h":"3fe482bbd4f725f5820f5d6beab4d0d4a524be8addf4b344a9a470ec5aabc451","libcubeb/googletest/samples/sample3_unittest.cc":"252c06b4531dc35213ebdd7311700b9b4057bc1bdeeba0cd767b2bc86c456639","libcubeb/googletest/samples/sample4.cc":"b4260f5fa35d78ac114a9abb59fce12403faf0273df41f57e83c341ae7979222","libcubeb/googletest/samples/sample4.h":"604905cae7e5587805c3b884a36eda7a2bebdfedb53b24b0fd9a220eec0ef1a9","libcubeb/googletest/samples/sample4_unittest.cc":"6cfb4821d8cb1c77fbb5af4f8aec569948762d8ea314827e3ead967b5b6a223e","libcubeb/googletest/samples/sample5_unittest.cc":"73646d9038873a68bb2e56b12495d7f7b65b5c23901109701da446af454ba2ec","libcubeb/googletest/samples/sample6_unittest.cc":"833fee399954f908cf0f3b789832e505329787f4cf73607a7b31ca0f62f368d7","libcubeb/googletest/samples/sample7_unittest.cc":"8013ee68d61c181e4e936cdae3a9a635646274f8512033ef11bff7214e03e4a6","libcubeb/googletest/samples/sample8_unittest.cc":"7b7510fadf4955d2f934d23d652dbd35add832e50bdfcc98421fb9be4588d808","libcubeb/googletest/samples/sample9_unittest.cc":"8b827040dea37b460cbcaea0b255b98974a9840f6ef7bd82aaa7d4ad2c724335","libcubeb/googletest/scripts/fuse_gtest_files.py":"adecf64c6bab65b31740c321e568cf174f753d5617745aa5762d842339d68b53","libcubeb/googletest/scripts/gen_gtest_pred_impl.py":"78fb7e20a014c251d723186eb58040e4eb32405b73c9288d787ea0a0e4ff5183","libcubeb/googletest/scripts/gtest-config.in":"9a43978eeee88e188845d737c17f4d024d4e74feae09da7997e8fbe4ea6cc176","libcubeb/googletest/scripts/pump.py":"3856a3d7be37f78e0f214ee7d4f29d05f1ca14218b67539d67c9a16e992f670c","libcubeb/googletest/scripts/test/Makefile":"3576b257594a2d8e843b9e4de8c83353d837833bb86431fb1b4198022b1bcddc","libcubeb/googletest/scripts/upload.py":"f75d0712e3b13bebd8daa0a15e4eb32c9e3034a933f4fcccf65b1e999a7ae066","libcubeb/googletest/scripts/upload_gtest.py":"6e76fc0a7a3831c01cfffd18c220d44438073a66338d91ca61fc84b924021e61","libcubeb/googletest/src/gtest-all.cc":"568ac119f5e6418f1fbcfbdf185d724657d7f3539b47822da229ac5d015626b2","libcubeb/googletest/src/gtest-death-test.cc":"eec1b3c8252670c76acbbaf63483946897ce625139b53a566406b6313f023896","libcubeb/googletest/src/gtest-filepath.cc":"31b7fcda5d11346f8a487597c6a70ff057f1192e0cb11f27eb7841a9f3aa8b86","libcubeb/googletest/src/gtest-internal-inl.h":"c9d428a6b5990ace091e40c4ce8b7bf6c50c186a8314b1c4a4cdc988ca0ac1a4","libcubeb/googletest/src/gtest-port.cc":"95bcf473622d1b901c734e5c2aeb8efb058555ec924212a61bb04f049bb5a069","libcubeb/googletest/src/gtest-printers.cc":"6f191a7fc7f5a0a967fd11964057f2e2d2eaf2f37ccece16bd816531f52b3154","libcubeb/googletest/src/gtest-test-part.cc":"e489868b4cdc66f4fc33bc2326ac86bc1acc5808ab58bbb288c9dcfc330faddc","libcubeb/googletest/src/gtest-typed-test.cc":"ca9e819df728c25a6a1fc072806c22f3494e1dffe4bd0d48284f38dbdd3a0dd5","libcubeb/googletest/src/gtest.cc":"5cf9a3e897892c9f0e5c887f91d3c8c8c5665bd7348560441fc0b946c254873c","libcubeb/googletest/src/gtest_main.cc":"22fa1f77542b882d1798d7f696045c5895942a626e26200a175fa4382e1fa5b5","libcubeb/googletest/test/gtest-death-test_ex_test.cc":"613ccf50a3ff8f84c975a13e86ea01ea4e36933072388a3738b4acf9ed3ed7cf","libcubeb/googletest/test/gtest-death-test_test.cc":"df8384a847bdf889233c3d45d171f784991def7a9b6a08442138569fbae32b9d","libcubeb/googletest/test/gtest-filepath_test.cc":"49760f91723845b113bb60bb9b1a1426ed1da1f4ebfef2462128980ea5692cc9","libcubeb/googletest/test/gtest-linked_ptr_test.cc":"1b9cb4ff67475900db9de34ae9749b94193048a1f7a741091ba5a2dd7fc7a79b","libcubeb/googletest/test/gtest-listener_test.cc":"acf78f2c9a730525ea5adc93e9196a42de8fbfe488db1dfd02656bdbd477b2c0","libcubeb/googletest/test/gtest-message_test.cc":"b1fc68f8b75ce25fbd79b3f7d3c9c793381ef07b3203e1a2d9b610cb597542be","libcubeb/googletest/test/gtest-options_test.cc":"74e3ae0c310edb3139b0032266219d3ce7f386ded6feafa57fef03f4493ed7fa","libcubeb/googletest/test/gtest-param-test2_test.cc":"a0f1efbcab3f7e49df639383157626931f64756f7e738be081760f93f7308332","libcubeb/googletest/test/gtest-param-test_test.cc":"ef8bd344e959053f562b0c9e0d15e2fb6c1e534772a67aaf3f90bd6bad0bf99f","libcubeb/googletest/test/gtest-param-test_test.h":"9d7f47b79d54df7cc050aa6038b0464aa684dfca669a847bf70ea16e4a000628","libcubeb/googletest/test/gtest-port_test.cc":"1600f78ef0860a0f5b5525e5e5041ff32a216cc6ae948b1ea61fe04ec603f67d","libcubeb/googletest/test/gtest-printers_test.cc":"7898e4b4163ee0821fed248e1c75d9f4a0a511a2b4bbfad1ef2f4a11a099f6e7","libcubeb/googletest/test/gtest-test-part_test.cc":"62c8906bb0d12ea84d60217b3773cd8e1768db4aab934880db2316df7026cab8","libcubeb/googletest/test/gtest-tuple_test.cc":"2850dc1f73a3f8020d8a4d80688a28d9b736eae6d677222c3f871d8d33b25501","libcubeb/googletest/test/gtest-typed-test2_test.cc":"c52b65e7181610d6e577631cd50177399884913ff28d08aedfedc92f05185044","libcubeb/googletest/test/gtest-typed-test_test.cc":"c7daff5211028da79b3ca0473dca18ada9197f38e710f72d0493ad3332ce3ec9","libcubeb/googletest/test/gtest-typed-test_test.h":"3145698534d8869beb624c9c8ed114f75bead046b2eeb92ada5a724993ee7786","libcubeb/googletest/test/gtest-unittest-api_test.cc":"e3f54c28ef2849e8b12af666ed46aace50c3e047845072ee6f974ce4528bd297","libcubeb/googletest/test/gtest_all_test.cc":"db0c3c42b385570b1d517e3ee927671b8fad4e206247fca738ec477222ac3d97","libcubeb/googletest/test/gtest_break_on_failure_unittest.py":"11c91bc1c68cfdb913e2affb01261b55fb3b0c18773a45875e9c25cb330a4dcd","libcubeb/googletest/test/gtest_break_on_failure_unittest_.cc":"1da12e4bdda2a0bc7b59d4638fe34b2d3798134224fd9237eeebdd09c3326011","libcubeb/googletest/test/gtest_catch_exceptions_test.py":"305cef45c6dc034bdf72fd91aba1e89e1c6b5d222c3d6baffff5acdfd9b3873e","libcubeb/googletest/test/gtest_catch_exceptions_test_.cc":"b297a4f4d5bc0285ea9eb8869741631658305e49d4513bca904842aacb82128b","libcubeb/googletest/test/gtest_color_test.py":"c4cb006682a40f2d88759a4bcabf0d4be623720b135c71447f1788d17ea23d0f","libcubeb/googletest/test/gtest_color_test_.cc":"f263ba349afe58a558bf0fee98a98bb9207a648e7cd4f908a87799bd13d001ea","libcubeb/googletest/test/gtest_env_var_test.py":"79819598cd1e366eaa8f2a4fee2d638b6ef0686e490402fae792ccce58d876c0","libcubeb/googletest/test/gtest_env_var_test_.cc":"0eee5dfbb2a2598f4e76626346b921928ec1e052e38f254cc97c60d05611ab46","libcubeb/googletest/test/gtest_environment_test.cc":"a52a21ea29c2203b03fa93922733546d171f98d3b2fcd42972269e98fd124715","libcubeb/googletest/test/gtest_filter_unittest.py":"edc7d278803bba41626eacd050d91d7247f1c5999f9dceb99a8877e238bc73d6","libcubeb/googletest/test/gtest_filter_unittest_.cc":"996ac528ad75c293d8201ce28cf6acccee266286bd369b4cf43f05b8d67a4559","libcubeb/googletest/test/gtest_help_test.py":"b43ab690c08e4bffd84a47b361167496298697f9511bdf4a745bf305b5cfbdfc","libcubeb/googletest/test/gtest_help_test_.cc":"ff4b121098f0fe7cb4abf11fdd31f2fe7a477286ec9175482138bc038d61c807","libcubeb/googletest/test/gtest_list_tests_unittest.py":"7caebc175b44b3c727fc50420ada1a6a9500f3e4ce9e2839f69205437aa85e7a","libcubeb/googletest/test/gtest_list_tests_unittest_.cc":"d82d8b72914897232c2ff9fd091a7b0add68b7cf75f3f210d3a487ebeea84cfe","libcubeb/googletest/test/gtest_main_unittest.cc":"0f66f318809c88f0fbe034a340a75331720c4e33be5378022baffaf588ef1202","libcubeb/googletest/test/gtest_no_test_unittest.cc":"7cf487e07c3d27376c2cb8af33d02239b7966623875d37b7aa0259e927a9c2f6","libcubeb/googletest/test/gtest_output_test.py":"cf0dc1979572d94450a5e611b44f3fdb88d9cd980d669a723f0ed63057b5e2c4","libcubeb/googletest/test/gtest_output_test_.cc":"f69569374c2b3d06aa04a38ebc4f92ddc303e6af503f8b533cd8e6bf9f104899","libcubeb/googletest/test/gtest_output_test_golden_lin.txt":"4f3e49c10a524a99437cdcb5294e3335a7f3c07ea8462e65730f703a5fe4fec3","libcubeb/googletest/test/gtest_pred_impl_unittest.cc":"e406eccf75b6b58746a95d1c7ea7bc8e80ff974e438ef7c83074a46d4e62db9a","libcubeb/googletest/test/gtest_prod_test.cc":"b42ca1a6d0a1e43bc576b4ff7776c6d2c37234f6dc2a76f2735f261b4a47a526","libcubeb/googletest/test/gtest_repeat_test.cc":"e10abbb71595920aa3bb415029eed74106335fc9ea3d58c417ccfc7cba6a4cdb","libcubeb/googletest/test/gtest_shuffle_test.py":"12dd94eb5f30260ba37059fa74658bda57dffa821f3ba6a2a8b52ff14b1ad029","libcubeb/googletest/test/gtest_shuffle_test_.cc":"af1b2b01ae275f1a9fee7e7940c0f88f39ded063008994d585aad87e3ffadb39","libcubeb/googletest/test/gtest_sole_header_test.cc":"538414c27a593ab8dc34c37b5c877eb3a022d75d1b481ef14ceca00914929754","libcubeb/googletest/test/gtest_stress_test.cc":"0b02fc12f87944226915a999bdcc8a3eaafb34a1ea5bb0df128774abf8667f09","libcubeb/googletest/test/gtest_test_utils.py":"d4a76930aee6658ad8734981ca0c4ea14f34dbe8fdd31d5afe41f6d98f9779ee","libcubeb/googletest/test/gtest_throw_on_failure_ex_test.cc":"11ae790028da20bc7b7af1572eff3cfe8499be43ab64c110e18e1892612a183f","libcubeb/googletest/test/gtest_throw_on_failure_test.py":"ebe18ca0b07f90c53b9b3f9a54ed02df94facf8995cfa90dd41c6f5474537c13","libcubeb/googletest/test/gtest_throw_on_failure_test_.cc":"f8cbf75d8bf9e9ae068a17ff968434c3aec7b7f1137c994d8f14af1a84361aa9","libcubeb/googletest/test/gtest_uninitialized_test.py":"da8e6ce34930753e36fc1dfa2c3e20e48d02bda2a27d3d03a07364312c5f3bd9","libcubeb/googletest/test/gtest_uninitialized_test_.cc":"0b6a9d4983480f87352ca4da946089264b401f7a4a3b1282253fd6cc861bf483","libcubeb/googletest/test/gtest_unittest.cc":"c0c7d1f691ce1e10c3d1647ed5f7a66510725808ad58bb6da4bc03a7a08fb2fc","libcubeb/googletest/test/gtest_xml_outfile1_test_.cc":"29341d777a9c9d25f360d13ed966b30f0cbef1fc88aefe2f01bb88b82cf1ed93","libcubeb/googletest/test/gtest_xml_outfile2_test_.cc":"da7ab3cf0e9b2a293eceed7c5691233d6b61afb557e3c1176dfb75390f85be46","libcubeb/googletest/test/gtest_xml_outfiles_test.py":"b07927b43f44afbfd61761c2cc69f1b68c4fbdeddb992db03ff0c73052518cd4","libcubeb/googletest/test/gtest_xml_output_unittest.py":"b5ff0c0207238d01cada961b8f4656f2ec30a3e1e5bf9d22efdf1745af423031","libcubeb/googletest/test/gtest_xml_output_unittest_.cc":"ad0b9ebe63a146e386df3c5c51916869f6d4647b9832ceacc912fb1272d15f82","libcubeb/googletest/test/gtest_xml_test_utils.py":"ad89a39a6cd5b08e87082341f3e7800dbf1150ea0f1386e0b8cd374aa6832f00","libcubeb/googletest/test/production.cc":"56fef77c3a8e62073ec11653d740a8e534008a0d57925ab0877b843f4fdd6be8","libcubeb/googletest/test/production.h":"a36d10545d12ead5e93a3b0fdca6ff73405f29091cfe38164415e9038888ba8d","libcubeb/googletest/xcode/Config/DebugProject.xcconfig":"fb42302df29bd8e8b5237194c0c04941f0e578527037930d88469baeb7a7f62b","libcubeb/googletest/xcode/Config/FrameworkTarget.xcconfig":"9935ddabe221f074d2f3b969a137d12b0dc0f845a460f58b63232987cb0f37ff","libcubeb/googletest/xcode/Config/General.xcconfig":"0fb768924daba1048f8db28b3a1fbf915b6f788d49d9d37e85979aa4ee92e02d","libcubeb/googletest/xcode/Config/ReleaseProject.xcconfig":"a4878ddd1ed78fb411906623cb51bc0ab4aea1cc3feb5379d2ae2862d8bf3bf5","libcubeb/googletest/xcode/Config/StaticLibraryTarget.xcconfig":"5886291788b3e9d5aadcb979ff055fd26a2413be81016e7afffb813b627d177c","libcubeb/googletest/xcode/Config/TestTarget.xcconfig":"f074e6c2516a6063b253ec6b842d74f5c2abefc7bcf8d8da54097a7bfe016480","libcubeb/googletest/xcode/Resources/Info.plist":"5b7f78a6d5810ce5490649793175c8982d41e6b49af06bc0705bc061567cc9aa","libcubeb/googletest/xcode/Samples/FrameworkSample/Info.plist":"1c13d83e5eed45689d7fe4bf4681030366474bc40608e39e1623c1350513a0cd","libcubeb/googletest/xcode/Samples/FrameworkSample/WidgetFramework.xcodeproj/project.pbxproj":"1cf0e1b1abf84414372faf9c8bf634e01fe5750bb3ca769b1eb25fc530b21358","libcubeb/googletest/xcode/Samples/FrameworkSample/runtests.sh":"a587e5b00a8353dee0aca5a4c59b28301ccf7648dee8c79b62a9223f9fc3c8cf","libcubeb/googletest/xcode/Samples/FrameworkSample/widget.cc":"562a2bb615e93186012823c9b41761769638a11e38b54498ad5f699038c8fd32","libcubeb/googletest/xcode/Samples/FrameworkSample/widget.h":"0c7915e45cf7cb8d67db24e49cd0b277f23f967578f917f8e859a6adc4b156f9","libcubeb/googletest/xcode/Samples/FrameworkSample/widget_test.cc":"6a1a49d64912d9829ef3d991faf5a3f0e1e081126a1d8d387cdfa84fab70dc77","libcubeb/googletest/xcode/Scripts/runtests.sh":"1a0672a4151b16f3c797478ba26c534e82b2faa603f90b9aa14e785805f7683a","libcubeb/googletest/xcode/Scripts/versiongenerate.py":"4b9d5c0f4e1b556084109311d156bee6d781968dc5b1dfdc8702364508f1dd43","libcubeb/googletest/xcode/gtest.xcodeproj/project.pbxproj":"a1224decff058bfed01b8eefaee13cab0129492615548c6d0d878003a154f7ff","libcubeb/include/cubeb/cubeb.h":"a73748e7fafc73122a81f0639e9148179ca29b6582f225000a60283bf68417ab","libcubeb/scan-build-install.sh":"1ecf22aca367a4d02f810c4cb78db8636e08a12787e94e30c441ce439cf4a265","libcubeb/src/android/audiotrack_definitions.h":"0d5ec772f9ebf61333bc16e61a081a7e3b4cc02342ec4f8f417e220d032fbbc6","libcubeb/src/android/cubeb-output-latency.h":"000fb7bec38105f54b9d40fc436440c637d63390b219775d335216d29d767226","libcubeb/src/android/cubeb_media_library.h":"f67965fb2ea38f0023eb4c76024341ba9563ac1a135507b6f12a9aabd85e30a9","libcubeb/src/android/sles_definitions.h":"24e400ca2330ec16d3a37b69b74144697b51dce17f9ead763b1a6ffedc5633ac","libcubeb/src/cubeb-internal.h":"ef7e7e19c40f743c814a39b8a47b9f03df054894018ad88b49129ffad2564bfa","libcubeb/src/cubeb-jni-instances.h":"8195554372bf60dea569873c9e5fb1106a2cf5dedc66a13d2bc967da0ff48a12","libcubeb/src/cubeb-jni.cpp":"81f001720c41c69b5927e32bd19b9e8e7176d7c33d63c2a58bd0d695dace4fd2","libcubeb/src/cubeb-jni.h":"73f810a32087a6062fd49ba89542655a7e19cecac6f40f8411e1d77ce42a45d1","libcubeb/src/cubeb-sles.h":"dc84a01ba4de9db1ff108609930b36ba442020ccc3e3d6f16528f429426c430c","libcubeb/src/cubeb-speex-resampler.h":"dbf543eee4cc6e40ba3531a39d327e2cec884c19e26c570aa7eae0647e5f7420","libcubeb/src/cubeb.c":"2de6d02fefd308dcc755dc9009cdb42d2d60f900237b4eda305ddcaa180f13db","libcubeb/src/cubeb_alsa.c":"6c833e379eea5d64a65a209f8e60c2aa2d6e038ea855554cd3f2664c463abbcd","libcubeb/src/cubeb_array_queue.h":"5264ae02799c540ff73e8eb8efa55986772b22562a025ae227c2603b6b8d1036","libcubeb/src/cubeb_assert.h":"ab8ed4fe7070a3aed9419c5f9695fce2318c4dafd91213ae61cac476e64adaa7","libcubeb/src/cubeb_audiotrack.c":"fe66d36dfecbfaad164ee8c871b39fd6e708a2f8f1f8524a5c0148ab86bab467","libcubeb/src/cubeb_audiounit.cpp":"8c127f884bb773e3856cc7c1f74b85210d1c589b199b61a6d6322a9c0bc1fbd0","libcubeb/src/cubeb_jack.cpp":"129c011feb01e8c6d573862218c31a8bf90522539a28a5ece8bcf87867be9daf","libcubeb/src/cubeb_kai.c":"a71e1de94211ff0e5667a218d71588f1e74102ccf0140b80925c277949871095","libcubeb/src/cubeb_log.cpp":"74bdc0d92a31d6b4ce3c376c6d310db583b869d673e40e6bd0ea795a1e2f937a","libcubeb/src/cubeb_log.h":"ee05fd22ed9820bed79247b8603cdc64f67bcb145be47e78bf0a0e99fb6c0806","libcubeb/src/cubeb_mixer.cpp":"4fd0b0ba6bcf13ae9cede517e427eae38fd7bd6c373deac0d5856a8de65f6a92","libcubeb/src/cubeb_mixer.h":"e94205c1b98859e41eeab2cad53f635f34f57a2ae95aa23a36461a2619abf81b","libcubeb/src/cubeb_opensl.c":"d10d2d35667a48c8fc31f0ecdd47a8c62d7988bc83fb53d4186d0f37c0fc2ad3","libcubeb/src/cubeb_osx_run_loop.cpp":"13c029f7ea04808597b8841b13f248c4476fb7425762f01a59bc6c944cab3a78","libcubeb/src/cubeb_osx_run_loop.h":"ffe80df60b8ea3d0341715b72cc60aae2e0df45141887c01117df543260a0ef8","libcubeb/src/cubeb_panner.cpp":"405a115ff0eb5f00dbab6bc8f2999b02ee4ea4792a87bad7ebd7218ee7980438","libcubeb/src/cubeb_panner.h":"5679df1b9d138c91f6ea642d51e6230cdf3163bdd65db156ad45906916cb74b0","libcubeb/src/cubeb_pulse.c":"7ff5378b793f16fe3a238cff655ad464c94c7a7fc86258bc6588fc3f429e281f","libcubeb/src/cubeb_resampler.cpp":"2d5f5f4ff242d61897b62b4aeaeee85633be54c1eb155c9e35a2c67d8d5b7043","libcubeb/src/cubeb_resampler.h":"ad9800a40c0272fb2a451c02367cc5a516a3067d4acf963d35eb31be367f9224","libcubeb/src/cubeb_resampler_internal.h":"4b4eb6aee343b9c1f73cf17b201329d3714ba44b06ecb1cebf950fdf93a9dfe6","libcubeb/src/cubeb_ring_array.h":"db8dec7a6d778a424045e5ac61c2bc3a3cec8c4fe8e4780f383db4b6f1b2438c","libcubeb/src/cubeb_ringbuffer.h":"2296255ca7835a3ace2fe1852054f43428b677f432b4174bd832ad0224a409eb","libcubeb/src/cubeb_sndio.c":"d64d6ed34987d89a3041988274834a8346c3af6f08e3dd641a0cef2c71eab6c3","libcubeb/src/cubeb_strings.c":"60f2b8c03a5a01925f9777eec0ab84b0e704b40c03e0d6b9c0e7a16246c81fde","libcubeb/src/cubeb_strings.h":"00e5dc97cf16e28cfb53aaae50ac0e3c0ae8a82aad0720ab6842ce5d9785c39f","libcubeb/src/cubeb_utils.cpp":"5bd7de8bbf7bbdc3a275525edd92bad590fb90fb4d35e77017fdd5d25a5769e6","libcubeb/src/cubeb_utils.h":"27baa42747771bf9232741382b83722f5c731e5dcd4dc2e9b595aca91c5647a5","libcubeb/src/cubeb_utils_unix.h":"2a48bd2aefa1b4e4e4968121512bcaaa6be3bca6597ea390b8203c338f5c49b5","libcubeb/src/cubeb_utils_win.h":"74658b6266a8a223c681b0fd06fcc9c891c7b0b95377635c6f1763b240c2ab27","libcubeb/src/cubeb_wasapi.cpp":"1d476782be50c0944ed0ef4b24f8c64b17e315e1051941aed21b79d7bd06aeb0","libcubeb/src/cubeb_winmm.c":"3f59675847c8ff899d34898616d813b12bd3b6c925cb32fb43f6f9357d0cced5","libcubeb/src/speex/arch.h":"2300bce68c588270cdc684dc7f01377e5e251529f4545d93771e111c56d51b0f","libcubeb/src/speex/fixed_generic.h":"306ee7453677fa6067f16c79d358c6c90a9d3d008850b493cdaa59c07e6375c1","libcubeb/src/speex/resample.c":"9c3a1c64ecf3750af82c980d01ea73d3682f73c332a580465d1e787e5c54cd00","libcubeb/src/speex/resample_neon.h":"7d3fd7af9a1ddde22518b9c7b4419073b72b2dfa5be4c3bc8796992bc87b3da0","libcubeb/src/speex/resample_sse.h":"5a196d8e2d8ab5c956f5252f09f5ddc55aee1f99b1341af3fa54a1f4c2157924","libcubeb/src/speex/speex_config_types.h":"24e3ffbf29e5519611a48e5acb959645b01d166dcb4369380d5f776c3f53d4cd","libcubeb/src/speex/speex_resampler.h":"7e439ec0dd30c32216b3ced17135f8992e5aaf53389d3f5996a7d900c453e65f","libcubeb/src/speex/stack_alloc.h":"e8a2fc0874942d2c7177475fcc141fdd0c0156200b8a4e7656d4a20313e2e569","libcubeb/test/README.md":"1c11b038f87daf10ea78abc17bdbdd157940c241df548c24d5872d142a98c1af","libcubeb/test/common.h":"45eccf0f0c506f2f424149bc434180e296f85ed682b3ffca78cd53f91487d210","libcubeb/test/test_audio.cpp":"c10a9f438d8667153cde2ca13e4b2eebda22d0db93a045299fdbd8c924c44c6c","libcubeb/test/test_callback_ret.cpp":"fdcd25f6da30f2e1dba147d2a790994737d61afbaa30e0e0e9bf41dd5fa41953","libcubeb/test/test_deadlock.cpp":"c311519f30c05300715e91b529685a0c61b8e6b67161fa1f4aeb7030587d86f9","libcubeb/test/test_devices.cpp":"eec312a08667d053216a4266ef9e2b04dcdfa487cc4d34a811bb64cb33ed2937","libcubeb/test/test_duplex.cpp":"add22390fe2dbba09def4cece9a0a6a8e69b24a97f874312b931ece43b1ec4c3","libcubeb/test/test_latency.cpp":"0ace31644f499d69adcfa0aa3bad8c859ad51e97b622e2fa6d26374b8af12894","libcubeb/test/test_loopback.cpp":"e5dfcd868b25468a43dd4d8482702b9494e807db05c041b6fdcb295c59f1f01c","libcubeb/test/test_overload_callback.cpp":"8a05771e5bedfabf9f8a2e5a9266df90f5e964ead3b07782e2e435d7b69b0beb","libcubeb/test/test_record.cpp":"76d5b4f738ca7c30836ef6cc5851f3e04e396b21cf26511e0eeb7a616049fa04","libcubeb/test/test_resampler.cpp":"ca4bc0493ce0c3a5f02f389ac6e37bc2cdb9a752faad2b6fbc5af0a2223ef645","libcubeb/test/test_ring_array.cpp":"27836d716616abf8b020a710659c10ac5e1d4b64149d22cb89bd7a7a5a5669d1","libcubeb/test/test_ring_buffer.cpp":"f6e5a9f552f15808eb8ac3405559bf0ea61e7da4219cd14ac49fff3bfbf49ca7","libcubeb/test/test_sanity.cpp":"f978de12e7046518fbf848fcb5dbb2b5033c7624d5f4b59c0f3e02e7155c3884","libcubeb/test/test_tone.cpp":"3938250700c708c9c742ec8d0c9c2984f3e11860ff8dcacdf0ce785d4668f789","libcubeb/test/test_utils.cpp":"e8d7a02a9096dbc0fd15d71f9849415d52958d2ed82cbc7b8507d3228e08d382","src/callbacks.rs":"b4b4eb3f370475488d7c77b338b0bceee94ef59ede8ff41fa797a3d35ea98b5d","src/channel.rs":"1ae3c22ccc848d6d7b5d312e5a6e64b41871d5bb611d34192651356b57c253c2","src/context.rs":"96bf3442b1dd40262d3088dbb6c473f5451fd91320cef93c522b40f284599803","src/device.rs":"5b65e1c1fdd53fa5208f20bfb809475cbb3c434e02db7d0e4771d13c86f8e369","src/error.rs":"406e3b843ed2d263fe677c4b34fb96a6d780a68bcb56a6f85f041d20d70227bd","src/format.rs":"d4d27790c20eab0b16592f60d5e487425a45a268cf4c74cf843c10ac91bbff4c","src/internal.rs":"c3af5f53dc7957860bf3bc0cd9737d094fb8ac000e7b40c569304cfa76a43145","src/lib.rs":"cb49a3dd8782369172a2f8a61d5c74b4615bfb5fba3677af7d5c149e47d71815","src/log.rs":"6694178177775f2ce5449435d00609e9361c836e23119c07d04892000587dc55","src/macros.rs":"caef13f5d23f7a3ec1a54ec3ca2390ac4ad89d521893f1d0864daf70d57a20aa","src/mixer.rs":"e72e92855614da187da6419ed0a115062a05670cb73443b2ea4313d8f5108a68","src/panner.rs":"341af4b5a5331a3c1a4ab5396125a3600945e588ea33350431dfe6f1a9a0bd80","src/resampler.rs":"762070f8afde2256715b8764380cdfa1204a1a39d98a9da0b2efe88699792f2c","src/stream.rs":"ea3080b6225949938098e3ac38c42939c49a91b322b327ea66e959fe41f51763"},"package":"653b9e245d35dbe2a2da7c4586275cee75ff656ddeb02d4a73b4afdfa6d67502"}
\ No newline at end of file
+{"files":{"Cargo.toml":"f3facab1f968b8c6bd6b3e2ebf88064bb3d6661a50080e753152b262fc96c4dc","LICENSE":"8c044baa5d883274736eeece0b955249076c2697b826e576fce59496235b2cf5","build.rs":"84f01f6c5f4559b87e348f6bc04d840a405889549dddf5e74cb486ad8b71bef2","libcubeb/AUTHORS":"829e45d138c7c8827799f302806fa4be8cd8bd4bad70a2fe26c3a27a5cf36948","libcubeb/CMakeLists.txt":"381886472be5fc0f925aa42268fd2df9f17f5613ee7db489849af474189f0358","libcubeb/Config.cmake.in":"88019286c96ef3d5d3a673b183c8655dfc97ceede07d3eb6c18f0c51bb896388","libcubeb/INSTALL.md":"7a84cdfbe86e7d3180e2203603b88571df61b369421fa97ee86740ffd4d4db8e","libcubeb/LICENSE":"44c6b5ae5ec3fe2fbc608b00e6f4896f4d2d5c7e525fcbaa3eaa3cf2f3d5a983","libcubeb/README.md":"aa417156dc65069264901b75fc3c792c73021ec61c909de04e109bd4184c07ab","libcubeb/TODO":"6f8065136e005d2becee810e3d8697a94f2c755f8c79687adfac7136ad165e80","libcubeb/appveyor.yml":"9a87fdc18b76fca1167289ecb2ec3a210b76984c1d7e92268b2cd36f1e00f541","libcubeb/cmake/sanitizers-cmake/CMakeLists.txt":"89b282c19b3897ff666f7847d5e679ae928ca7e76ffd0d23f7c58c9464048b61","libcubeb/cmake/sanitizers-cmake/LICENSE":"4b67e7ae8c91e68e1a929eb1cbaa4c773c6d19aa91aaa12c390cf9560d1c9799","libcubeb/cmake/sanitizers-cmake/README.md":"30ab1524618ac828b75f9b83c665a0bd50b839b42ce61519a8048d73f401da6e","libcubeb/cmake/sanitizers-cmake/cmake/FindASan.cmake":"cba07ffe438c57bef0840ed6a2d2890676530b66509da3c616438c53018baa4f","libcubeb/cmake/sanitizers-cmake/cmake/FindMSan.cmake":"1303aac5028fe9f64d42be0afd47f1291e679d74f8280b3dc5271f20ebf4d7a4","libcubeb/cmake/sanitizers-cmake/cmake/FindSanitizers.cmake":"ce1971b943bbef08fb9aba958cf28e3cbdff075406c85a3cfed22e00c9f8d9a8","libcubeb/cmake/sanitizers-cmake/cmake/FindTSan.cmake":"edca39b287312e9a8fc718f6ec791d2520515900b37426091310fe1bd52dc6a1","libcubeb/cmake/sanitizers-cmake/cmake/FindUBSan.cmake":"5b9d3621f629c807a1345a7cb053677a8bf25782a079e345dda53d04aecdc4b7","libcubeb/cmake/sanitizers-cmake/cmake/asan-wrapper":"4e543936e6374e24b80a0f92135c07c2e2101c0d110e51bddaf0e70ae8ec391e","libcubeb/cmake/sanitizers-cmake/cmake/sanitize-helpers.cmake":"282620734c2a8062f1280d0dde3121b8b01af26e5ecaa7d4308e145f80ecd115","libcubeb/cmake/sanitizers-cmake/tests/CMakeLists.txt":"fb983bab7040be002847db59c2493abfd249f67ad06e3a9270fbceb9fabda11c","libcubeb/cmake/sanitizers-cmake/tests/asan_test.cpp":"8b351c7c8668b4a2438286df426f0ad322cade6d1c6199a74668ccbd1c5204a4","libcubeb/cmake/toolchain-cross-android.cmake":"59d2355845a71647b353fb8b18fca630db8ffee7bb8500143e2d6fbc409cec97","libcubeb/cmake/toolchain-cross-mingw.cmake":"b09dc261981c0d4a0f8430f05aae9c8fc545651cd9cbfacd09754277b776b532","libcubeb/cubeb.supp":"19f33e59f8dc91a327c923e44c2c3f9af0a043ce1d6a8cac275ba094b4bfe0da","libcubeb/docs/Doxyfile.in":"0815f19789cedd310652a133bab260c27b57e95f7a65458df2dfca38ea4f1041","libcubeb/googletest/CHANGES":"72c8a289bfe4dd9160074a3a2238c8067a5bc7ca49fd87f70a134c3f373932a4","libcubeb/googletest/CMakeLists.txt":"cdf938ce79ea066866dc614de3925bfaa48d9e19e04049db2ec8c5443abaaa9b","libcubeb/googletest/CONTRIBUTORS":"4d911cd5e6d71f3f4bbcb2788b2f916df4b0ce1e088752a159457a1d936ae0ce","libcubeb/googletest/COPYING":"9702de7e4117a8e2b20dafab11ffda58c198aede066406496bef670d40a22138","libcubeb/googletest/Makefile.am":"a795e5a18e82ba06fd97509d92d773b7fafd0dd7086db8a1211fbd151b503bac","libcubeb/googletest/README":"484b19654362942fac9734c8fab0ed3d99249b81c69027bdb7de46054abada6b","libcubeb/googletest/cmake/internal_utils.cmake":"6f4670a5825cf8ae0415be9dd43d82a7f30316d75cab20a4c60afb6d9db2a01d","libcubeb/googletest/codegear/gtest.cbproj":"9fa07a66b8c01773256e508187775407c465ed9055651e93d390426d1888721a","libcubeb/googletest/codegear/gtest.groupproj":"76c001cb2ee0070e26d1570fb6db5250f2585179c707496c5ef6d12e582cf205","libcubeb/googletest/codegear/gtest_all.cc":"c8750dc2b7b3612edb60e8d23fc2f60ae264451916c4b15f81cbf60ea30eb75d","libcubeb/googletest/codegear/gtest_link.cc":"e5e47c086f932471e0ca748a62b3b1597e5e731f4d34fb8cb8b2ca2db7ba3ed0","libcubeb/googletest/codegear/gtest_main.cbproj":"056448ba7f41fae3f704b1001922d9f6e419cf8cbcf3a55bf0ecc59ece1fa9a1","libcubeb/googletest/codegear/gtest_unittest.cbproj":"2c48be90b0dbc3224a8bd6c4dc21f78dd1b08c81685e6bd4952bb6df6ee38701","libcubeb/googletest/configure.ac":"fadebffdaeaccebb60fbe4a501c1138c296e01348a5da45fabf5e4233248baa8","libcubeb/googletest/include/gtest/gtest-death-test.h":"fdd087f700cd04a3ce4bdd36f35769de52a44bfc0c5bae2dc9681d4cbcd3c44a","libcubeb/googletest/include/gtest/gtest-message.h":"eaf44df1284d94333507c47091c84eaaf43814e6a02a1b1c0061ca7b363e74d6","libcubeb/googletest/include/gtest/gtest-param-test.h":"f226f0a24c04cddbceaaa45d8a5e575ce18c3392349f9b8ba73317e37e62368d","libcubeb/googletest/include/gtest/gtest-param-test.h.pump":"17c65fd5cc5218279044a61f3873c9c952b0924a7ba5147d4999d400b122207f","libcubeb/googletest/include/gtest/gtest-printers.h":"7046f611398d63ee0f1c37bdb4fd08d9931979b2fedf13b781e6d85d4b3b5d60","libcubeb/googletest/include/gtest/gtest-spi.h":"560407dd45e8e57fa6927504c9e4a4cfdecf30f8cada975c1ffddce765e6a88a","libcubeb/googletest/include/gtest/gtest-test-part.h":"c4d6d840284728740c284646075e8ffc85b63b9f74f3ed488b18ef3c2c2b9005","libcubeb/googletest/include/gtest/gtest-typed-test.h":"1ec858bbb9ed8a8bb553232df016437c080b2670f00453b4de297c286eb78c21","libcubeb/googletest/include/gtest/gtest.h":"47433ca72a43bda7a380c34fe6d4ff451797c687e9bbd74d1f366bcdfa0cb013","libcubeb/googletest/include/gtest/gtest_pred_impl.h":"f03a3f77e3c231889c0ace6f63b2c4e410e4a9330287ea09443b23b9a3cf9092","libcubeb/googletest/include/gtest/gtest_prod.h":"4a99a3d986a45b4d6d9b3af54809f015c54aa98274793a4ae173f5010d0ad33c","libcubeb/googletest/include/gtest/internal/gtest-death-test-internal.h":"0b3abead866363f3e6b4201acc8d2763072e033826b22ae5ebffd790e1415235","libcubeb/googletest/include/gtest/internal/gtest-filepath.h":"638d2bb6c06a894513b03311a8e931ac835fc00afc4bd21fab3afc05732c23a0","libcubeb/googletest/include/gtest/internal/gtest-internal.h":"12c2c83df0a9dc5b46697ccd8271dfa34ee5f3d1972dcb56585bc1459d9583c9","libcubeb/googletest/include/gtest/internal/gtest-linked_ptr.h":"9bd319548dd073630dfd349c06a440c6a582feec47d4ff14f348ec32f8b4c1f3","libcubeb/googletest/include/gtest/internal/gtest-param-util-generated.h":"10db93fa7e98820192bae6f560664469dd33b265036fca64253c89b6801f96cb","libcubeb/googletest/include/gtest/internal/gtest-param-util-generated.h.pump":"abb72365d94d2811b34c195dc520fbf41c7dcb42aae5a1cfa0502cf619b21e70","libcubeb/googletest/include/gtest/internal/gtest-param-util.h":"7f9311f033ef6916217d87cef53b1db6c4e8733be930e4b48fe7e11d21b33da0","libcubeb/googletest/include/gtest/internal/gtest-port.h":"612932c2930a7cf2c3514d89a8d6b51a2c0030d251309b71765ed1c9954e20c5","libcubeb/googletest/include/gtest/internal/gtest-string.h":"a46aa36165c400d1e926f942be03fe04cd7ccb1e59f7a2a03b919c4eea05b997","libcubeb/googletest/include/gtest/internal/gtest-tuple.h":"43e7e3c92f8e4258cf3927a9204b214d4d03e6c796f88f3ad4e66b1ac20aa938","libcubeb/googletest/include/gtest/internal/gtest-tuple.h.pump":"16fa027ed3c5940699e0ac906815e66620993bcf75b0acaf826d4f09348d4b83","libcubeb/googletest/include/gtest/internal/gtest-type-util.h":"6d177af46a9b1e14b969972a8b886667f95e69037aba411433a44fb9b92e7037","libcubeb/googletest/include/gtest/internal/gtest-type-util.h.pump":"22092f44127af91651f57ce222e20914d5d32ae02f1c0964f6d5d7bc019af339","libcubeb/googletest/m4/acx_pthread.m4":"3326e3746b6b351d1671fe31f798269cda8de92c365b8a8305404ec0fa6c6b32","libcubeb/googletest/m4/gtest.m4":"d3c37ebd1aa792c967d4357755cc670bc6deb30091d9e6db498871d90a30ea4c","libcubeb/googletest/make/Makefile":"9b86e2a112dd55c6bf6a2b39e6f4078faf60cfecb8282ebf9b025167ed233420","libcubeb/googletest/msvc/gtest-md.sln":"0beab679b42cf0c431eaf4fe143bbf3b01fc064e20c74d9e33e7e437a70487d4","libcubeb/googletest/msvc/gtest-md.vcproj":"52e873e964daf9d5409b4e9bb471ddf2827be04985cd96c40620f9275d17a256","libcubeb/googletest/msvc/gtest.sln":"be21c2340650ec2259a2fbaeb8608ae6d3e982a0626a0f91128a771dc88e6bea","libcubeb/googletest/msvc/gtest.vcproj":"0064616c7d88a284c1b7c05baab038f239134ea9c6c563628f286f9600b3f921","libcubeb/googletest/msvc/gtest_main-md.vcproj":"f83a294a92b616bf34ccae6743ff916297bdba61d6125a9637a813d467a30372","libcubeb/googletest/msvc/gtest_main.vcproj":"9f03270a00896eab0c7015c6fb1a73818d024e462d3944ba1d3ceb313a051649","libcubeb/googletest/msvc/gtest_prod_test-md.vcproj":"7caa108733e2d5f140da004d2133e04a9a105811909c0e2d4ec06e2971983592","libcubeb/googletest/msvc/gtest_prod_test.vcproj":"cf5bfb7f3de9a59a0eba5535067845d12c33c3fd8fecc3d03aa702665db29578","libcubeb/googletest/msvc/gtest_unittest-md.vcproj":"e7949b21cf0418f2a7afe8aa94616e2c40e3ba0801c2f0826f3a3a3d2e6f48b0","libcubeb/googletest/msvc/gtest_unittest.vcproj":"5b097d596fbbc1c4090fd518008a0961b29661194e1c02d8a2d3daaa557e626f","libcubeb/googletest/samples/prime_tables.h":"2903df1d1e6643a5f624fe3ea3f931c3410eb1858ac347c5df278273c6c91ca4","libcubeb/googletest/samples/sample1.cc":"dc106c5940d87bb4bbef3d77815eab642ee173a3340b2b9c532b5c711c4c2d0e","libcubeb/googletest/samples/sample1.h":"7a7bf9a0fbd2401e8b2cb554bfcb9bd0ed228212f3b970675c1b1d38d4e188bb","libcubeb/googletest/samples/sample10_unittest.cc":"ccebb6393a5a8468399f7e511219b667a2233f82312ce59834a4bb0997d8700e","libcubeb/googletest/samples/sample1_unittest.cc":"904be0d4a095e74393515195392bd10e1e916bb2ca61f3f94b1bd6aebea29cb6","libcubeb/googletest/samples/sample2.cc":"f14b8a1e69d52eef1a70053fb256818c7eca64e8eda08de43cf46e896e57fcc2","libcubeb/googletest/samples/sample2.h":"df956ba520dafca068dbc1e28f36567db3cba36293e06762318af8cda6a12bd4","libcubeb/googletest/samples/sample2_unittest.cc":"abe7e0b253d328cb82ae67623fbe3c89eb94699102510c64a0b568eaca101e05","libcubeb/googletest/samples/sample3-inl.h":"3fe482bbd4f725f5820f5d6beab4d0d4a524be8addf4b344a9a470ec5aabc451","libcubeb/googletest/samples/sample3_unittest.cc":"252c06b4531dc35213ebdd7311700b9b4057bc1bdeeba0cd767b2bc86c456639","libcubeb/googletest/samples/sample4.cc":"b4260f5fa35d78ac114a9abb59fce12403faf0273df41f57e83c341ae7979222","libcubeb/googletest/samples/sample4.h":"604905cae7e5587805c3b884a36eda7a2bebdfedb53b24b0fd9a220eec0ef1a9","libcubeb/googletest/samples/sample4_unittest.cc":"6cfb4821d8cb1c77fbb5af4f8aec569948762d8ea314827e3ead967b5b6a223e","libcubeb/googletest/samples/sample5_unittest.cc":"73646d9038873a68bb2e56b12495d7f7b65b5c23901109701da446af454ba2ec","libcubeb/googletest/samples/sample6_unittest.cc":"833fee399954f908cf0f3b789832e505329787f4cf73607a7b31ca0f62f368d7","libcubeb/googletest/samples/sample7_unittest.cc":"8013ee68d61c181e4e936cdae3a9a635646274f8512033ef11bff7214e03e4a6","libcubeb/googletest/samples/sample8_unittest.cc":"7b7510fadf4955d2f934d23d652dbd35add832e50bdfcc98421fb9be4588d808","libcubeb/googletest/samples/sample9_unittest.cc":"8b827040dea37b460cbcaea0b255b98974a9840f6ef7bd82aaa7d4ad2c724335","libcubeb/googletest/scripts/fuse_gtest_files.py":"adecf64c6bab65b31740c321e568cf174f753d5617745aa5762d842339d68b53","libcubeb/googletest/scripts/gen_gtest_pred_impl.py":"78fb7e20a014c251d723186eb58040e4eb32405b73c9288d787ea0a0e4ff5183","libcubeb/googletest/scripts/gtest-config.in":"9a43978eeee88e188845d737c17f4d024d4e74feae09da7997e8fbe4ea6cc176","libcubeb/googletest/scripts/pump.py":"3856a3d7be37f78e0f214ee7d4f29d05f1ca14218b67539d67c9a16e992f670c","libcubeb/googletest/scripts/test/Makefile":"3576b257594a2d8e843b9e4de8c83353d837833bb86431fb1b4198022b1bcddc","libcubeb/googletest/scripts/upload.py":"f75d0712e3b13bebd8daa0a15e4eb32c9e3034a933f4fcccf65b1e999a7ae066","libcubeb/googletest/scripts/upload_gtest.py":"6e76fc0a7a3831c01cfffd18c220d44438073a66338d91ca61fc84b924021e61","libcubeb/googletest/src/gtest-all.cc":"568ac119f5e6418f1fbcfbdf185d724657d7f3539b47822da229ac5d015626b2","libcubeb/googletest/src/gtest-death-test.cc":"eec1b3c8252670c76acbbaf63483946897ce625139b53a566406b6313f023896","libcubeb/googletest/src/gtest-filepath.cc":"31b7fcda5d11346f8a487597c6a70ff057f1192e0cb11f27eb7841a9f3aa8b86","libcubeb/googletest/src/gtest-internal-inl.h":"c9d428a6b5990ace091e40c4ce8b7bf6c50c186a8314b1c4a4cdc988ca0ac1a4","libcubeb/googletest/src/gtest-port.cc":"95bcf473622d1b901c734e5c2aeb8efb058555ec924212a61bb04f049bb5a069","libcubeb/googletest/src/gtest-printers.cc":"6f191a7fc7f5a0a967fd11964057f2e2d2eaf2f37ccece16bd816531f52b3154","libcubeb/googletest/src/gtest-test-part.cc":"e489868b4cdc66f4fc33bc2326ac86bc1acc5808ab58bbb288c9dcfc330faddc","libcubeb/googletest/src/gtest-typed-test.cc":"ca9e819df728c25a6a1fc072806c22f3494e1dffe4bd0d48284f38dbdd3a0dd5","libcubeb/googletest/src/gtest.cc":"5cf9a3e897892c9f0e5c887f91d3c8c8c5665bd7348560441fc0b946c254873c","libcubeb/googletest/src/gtest_main.cc":"22fa1f77542b882d1798d7f696045c5895942a626e26200a175fa4382e1fa5b5","libcubeb/googletest/test/gtest-death-test_ex_test.cc":"613ccf50a3ff8f84c975a13e86ea01ea4e36933072388a3738b4acf9ed3ed7cf","libcubeb/googletest/test/gtest-death-test_test.cc":"df8384a847bdf889233c3d45d171f784991def7a9b6a08442138569fbae32b9d","libcubeb/googletest/test/gtest-filepath_test.cc":"49760f91723845b113bb60bb9b1a1426ed1da1f4ebfef2462128980ea5692cc9","libcubeb/googletest/test/gtest-linked_ptr_test.cc":"1b9cb4ff67475900db9de34ae9749b94193048a1f7a741091ba5a2dd7fc7a79b","libcubeb/googletest/test/gtest-listener_test.cc":"acf78f2c9a730525ea5adc93e9196a42de8fbfe488db1dfd02656bdbd477b2c0","libcubeb/googletest/test/gtest-message_test.cc":"b1fc68f8b75ce25fbd79b3f7d3c9c793381ef07b3203e1a2d9b610cb597542be","libcubeb/googletest/test/gtest-options_test.cc":"74e3ae0c310edb3139b0032266219d3ce7f386ded6feafa57fef03f4493ed7fa","libcubeb/googletest/test/gtest-param-test2_test.cc":"a0f1efbcab3f7e49df639383157626931f64756f7e738be081760f93f7308332","libcubeb/googletest/test/gtest-param-test_test.cc":"ef8bd344e959053f562b0c9e0d15e2fb6c1e534772a67aaf3f90bd6bad0bf99f","libcubeb/googletest/test/gtest-param-test_test.h":"9d7f47b79d54df7cc050aa6038b0464aa684dfca669a847bf70ea16e4a000628","libcubeb/googletest/test/gtest-port_test.cc":"1600f78ef0860a0f5b5525e5e5041ff32a216cc6ae948b1ea61fe04ec603f67d","libcubeb/googletest/test/gtest-printers_test.cc":"7898e4b4163ee0821fed248e1c75d9f4a0a511a2b4bbfad1ef2f4a11a099f6e7","libcubeb/googletest/test/gtest-test-part_test.cc":"62c8906bb0d12ea84d60217b3773cd8e1768db4aab934880db2316df7026cab8","libcubeb/googletest/test/gtest-tuple_test.cc":"2850dc1f73a3f8020d8a4d80688a28d9b736eae6d677222c3f871d8d33b25501","libcubeb/googletest/test/gtest-typed-test2_test.cc":"c52b65e7181610d6e577631cd50177399884913ff28d08aedfedc92f05185044","libcubeb/googletest/test/gtest-typed-test_test.cc":"c7daff5211028da79b3ca0473dca18ada9197f38e710f72d0493ad3332ce3ec9","libcubeb/googletest/test/gtest-typed-test_test.h":"3145698534d8869beb624c9c8ed114f75bead046b2eeb92ada5a724993ee7786","libcubeb/googletest/test/gtest-unittest-api_test.cc":"e3f54c28ef2849e8b12af666ed46aace50c3e047845072ee6f974ce4528bd297","libcubeb/googletest/test/gtest_all_test.cc":"db0c3c42b385570b1d517e3ee927671b8fad4e206247fca738ec477222ac3d97","libcubeb/googletest/test/gtest_break_on_failure_unittest.py":"11c91bc1c68cfdb913e2affb01261b55fb3b0c18773a45875e9c25cb330a4dcd","libcubeb/googletest/test/gtest_break_on_failure_unittest_.cc":"1da12e4bdda2a0bc7b59d4638fe34b2d3798134224fd9237eeebdd09c3326011","libcubeb/googletest/test/gtest_catch_exceptions_test.py":"305cef45c6dc034bdf72fd91aba1e89e1c6b5d222c3d6baffff5acdfd9b3873e","libcubeb/googletest/test/gtest_catch_exceptions_test_.cc":"b297a4f4d5bc0285ea9eb8869741631658305e49d4513bca904842aacb82128b","libcubeb/googletest/test/gtest_color_test.py":"c4cb006682a40f2d88759a4bcabf0d4be623720b135c71447f1788d17ea23d0f","libcubeb/googletest/test/gtest_color_test_.cc":"f263ba349afe58a558bf0fee98a98bb9207a648e7cd4f908a87799bd13d001ea","libcubeb/googletest/test/gtest_env_var_test.py":"79819598cd1e366eaa8f2a4fee2d638b6ef0686e490402fae792ccce58d876c0","libcubeb/googletest/test/gtest_env_var_test_.cc":"0eee5dfbb2a2598f4e76626346b921928ec1e052e38f254cc97c60d05611ab46","libcubeb/googletest/test/gtest_environment_test.cc":"a52a21ea29c2203b03fa93922733546d171f98d3b2fcd42972269e98fd124715","libcubeb/googletest/test/gtest_filter_unittest.py":"edc7d278803bba41626eacd050d91d7247f1c5999f9dceb99a8877e238bc73d6","libcubeb/googletest/test/gtest_filter_unittest_.cc":"996ac528ad75c293d8201ce28cf6acccee266286bd369b4cf43f05b8d67a4559","libcubeb/googletest/test/gtest_help_test.py":"b43ab690c08e4bffd84a47b361167496298697f9511bdf4a745bf305b5cfbdfc","libcubeb/googletest/test/gtest_help_test_.cc":"ff4b121098f0fe7cb4abf11fdd31f2fe7a477286ec9175482138bc038d61c807","libcubeb/googletest/test/gtest_list_tests_unittest.py":"7caebc175b44b3c727fc50420ada1a6a9500f3e4ce9e2839f69205437aa85e7a","libcubeb/googletest/test/gtest_list_tests_unittest_.cc":"d82d8b72914897232c2ff9fd091a7b0add68b7cf75f3f210d3a487ebeea84cfe","libcubeb/googletest/test/gtest_main_unittest.cc":"0f66f318809c88f0fbe034a340a75331720c4e33be5378022baffaf588ef1202","libcubeb/googletest/test/gtest_no_test_unittest.cc":"7cf487e07c3d27376c2cb8af33d02239b7966623875d37b7aa0259e927a9c2f6","libcubeb/googletest/test/gtest_output_test.py":"cf0dc1979572d94450a5e611b44f3fdb88d9cd980d669a723f0ed63057b5e2c4","libcubeb/googletest/test/gtest_output_test_.cc":"f69569374c2b3d06aa04a38ebc4f92ddc303e6af503f8b533cd8e6bf9f104899","libcubeb/googletest/test/gtest_output_test_golden_lin.txt":"4f3e49c10a524a99437cdcb5294e3335a7f3c07ea8462e65730f703a5fe4fec3","libcubeb/googletest/test/gtest_pred_impl_unittest.cc":"e406eccf75b6b58746a95d1c7ea7bc8e80ff974e438ef7c83074a46d4e62db9a","libcubeb/googletest/test/gtest_prod_test.cc":"b42ca1a6d0a1e43bc576b4ff7776c6d2c37234f6dc2a76f2735f261b4a47a526","libcubeb/googletest/test/gtest_repeat_test.cc":"e10abbb71595920aa3bb415029eed74106335fc9ea3d58c417ccfc7cba6a4cdb","libcubeb/googletest/test/gtest_shuffle_test.py":"12dd94eb5f30260ba37059fa74658bda57dffa821f3ba6a2a8b52ff14b1ad029","libcubeb/googletest/test/gtest_shuffle_test_.cc":"af1b2b01ae275f1a9fee7e7940c0f88f39ded063008994d585aad87e3ffadb39","libcubeb/googletest/test/gtest_sole_header_test.cc":"538414c27a593ab8dc34c37b5c877eb3a022d75d1b481ef14ceca00914929754","libcubeb/googletest/test/gtest_stress_test.cc":"0b02fc12f87944226915a999bdcc8a3eaafb34a1ea5bb0df128774abf8667f09","libcubeb/googletest/test/gtest_test_utils.py":"d4a76930aee6658ad8734981ca0c4ea14f34dbe8fdd31d5afe41f6d98f9779ee","libcubeb/googletest/test/gtest_throw_on_failure_ex_test.cc":"11ae790028da20bc7b7af1572eff3cfe8499be43ab64c110e18e1892612a183f","libcubeb/googletest/test/gtest_throw_on_failure_test.py":"ebe18ca0b07f90c53b9b3f9a54ed02df94facf8995cfa90dd41c6f5474537c13","libcubeb/googletest/test/gtest_throw_on_failure_test_.cc":"f8cbf75d8bf9e9ae068a17ff968434c3aec7b7f1137c994d8f14af1a84361aa9","libcubeb/googletest/test/gtest_uninitialized_test.py":"da8e6ce34930753e36fc1dfa2c3e20e48d02bda2a27d3d03a07364312c5f3bd9","libcubeb/googletest/test/gtest_uninitialized_test_.cc":"0b6a9d4983480f87352ca4da946089264b401f7a4a3b1282253fd6cc861bf483","libcubeb/googletest/test/gtest_unittest.cc":"c0c7d1f691ce1e10c3d1647ed5f7a66510725808ad58bb6da4bc03a7a08fb2fc","libcubeb/googletest/test/gtest_xml_outfile1_test_.cc":"29341d777a9c9d25f360d13ed966b30f0cbef1fc88aefe2f01bb88b82cf1ed93","libcubeb/googletest/test/gtest_xml_outfile2_test_.cc":"da7ab3cf0e9b2a293eceed7c5691233d6b61afb557e3c1176dfb75390f85be46","libcubeb/googletest/test/gtest_xml_outfiles_test.py":"b07927b43f44afbfd61761c2cc69f1b68c4fbdeddb992db03ff0c73052518cd4","libcubeb/googletest/test/gtest_xml_output_unittest.py":"b5ff0c0207238d01cada961b8f4656f2ec30a3e1e5bf9d22efdf1745af423031","libcubeb/googletest/test/gtest_xml_output_unittest_.cc":"ad0b9ebe63a146e386df3c5c51916869f6d4647b9832ceacc912fb1272d15f82","libcubeb/googletest/test/gtest_xml_test_utils.py":"ad89a39a6cd5b08e87082341f3e7800dbf1150ea0f1386e0b8cd374aa6832f00","libcubeb/googletest/test/production.cc":"56fef77c3a8e62073ec11653d740a8e534008a0d57925ab0877b843f4fdd6be8","libcubeb/googletest/test/production.h":"a36d10545d12ead5e93a3b0fdca6ff73405f29091cfe38164415e9038888ba8d","libcubeb/googletest/xcode/Config/DebugProject.xcconfig":"fb42302df29bd8e8b5237194c0c04941f0e578527037930d88469baeb7a7f62b","libcubeb/googletest/xcode/Config/FrameworkTarget.xcconfig":"9935ddabe221f074d2f3b969a137d12b0dc0f845a460f58b63232987cb0f37ff","libcubeb/googletest/xcode/Config/General.xcconfig":"0fb768924daba1048f8db28b3a1fbf915b6f788d49d9d37e85979aa4ee92e02d","libcubeb/googletest/xcode/Config/ReleaseProject.xcconfig":"a4878ddd1ed78fb411906623cb51bc0ab4aea1cc3feb5379d2ae2862d8bf3bf5","libcubeb/googletest/xcode/Config/StaticLibraryTarget.xcconfig":"5886291788b3e9d5aadcb979ff055fd26a2413be81016e7afffb813b627d177c","libcubeb/googletest/xcode/Config/TestTarget.xcconfig":"f074e6c2516a6063b253ec6b842d74f5c2abefc7bcf8d8da54097a7bfe016480","libcubeb/googletest/xcode/Resources/Info.plist":"5b7f78a6d5810ce5490649793175c8982d41e6b49af06bc0705bc061567cc9aa","libcubeb/googletest/xcode/Samples/FrameworkSample/Info.plist":"1c13d83e5eed45689d7fe4bf4681030366474bc40608e39e1623c1350513a0cd","libcubeb/googletest/xcode/Samples/FrameworkSample/WidgetFramework.xcodeproj/project.pbxproj":"1cf0e1b1abf84414372faf9c8bf634e01fe5750bb3ca769b1eb25fc530b21358","libcubeb/googletest/xcode/Samples/FrameworkSample/runtests.sh":"a587e5b00a8353dee0aca5a4c59b28301ccf7648dee8c79b62a9223f9fc3c8cf","libcubeb/googletest/xcode/Samples/FrameworkSample/widget.cc":"562a2bb615e93186012823c9b41761769638a11e38b54498ad5f699038c8fd32","libcubeb/googletest/xcode/Samples/FrameworkSample/widget.h":"0c7915e45cf7cb8d67db24e49cd0b277f23f967578f917f8e859a6adc4b156f9","libcubeb/googletest/xcode/Samples/FrameworkSample/widget_test.cc":"6a1a49d64912d9829ef3d991faf5a3f0e1e081126a1d8d387cdfa84fab70dc77","libcubeb/googletest/xcode/Scripts/runtests.sh":"1a0672a4151b16f3c797478ba26c534e82b2faa603f90b9aa14e785805f7683a","libcubeb/googletest/xcode/Scripts/versiongenerate.py":"4b9d5c0f4e1b556084109311d156bee6d781968dc5b1dfdc8702364508f1dd43","libcubeb/googletest/xcode/gtest.xcodeproj/project.pbxproj":"a1224decff058bfed01b8eefaee13cab0129492615548c6d0d878003a154f7ff","libcubeb/include/cubeb/cubeb.h":"a73748e7fafc73122a81f0639e9148179ca29b6582f225000a60283bf68417ab","libcubeb/scan-build-install.sh":"1ecf22aca367a4d02f810c4cb78db8636e08a12787e94e30c441ce439cf4a265","libcubeb/src/android/audiotrack_definitions.h":"0d5ec772f9ebf61333bc16e61a081a7e3b4cc02342ec4f8f417e220d032fbbc6","libcubeb/src/android/cubeb-output-latency.h":"000fb7bec38105f54b9d40fc436440c637d63390b219775d335216d29d767226","libcubeb/src/android/cubeb_media_library.h":"f67965fb2ea38f0023eb4c76024341ba9563ac1a135507b6f12a9aabd85e30a9","libcubeb/src/android/sles_definitions.h":"24e400ca2330ec16d3a37b69b74144697b51dce17f9ead763b1a6ffedc5633ac","libcubeb/src/cubeb-internal.h":"ef7e7e19c40f743c814a39b8a47b9f03df054894018ad88b49129ffad2564bfa","libcubeb/src/cubeb-jni-instances.h":"8195554372bf60dea569873c9e5fb1106a2cf5dedc66a13d2bc967da0ff48a12","libcubeb/src/cubeb-jni.cpp":"81f001720c41c69b5927e32bd19b9e8e7176d7c33d63c2a58bd0d695dace4fd2","libcubeb/src/cubeb-jni.h":"73f810a32087a6062fd49ba89542655a7e19cecac6f40f8411e1d77ce42a45d1","libcubeb/src/cubeb-sles.h":"dc84a01ba4de9db1ff108609930b36ba442020ccc3e3d6f16528f429426c430c","libcubeb/src/cubeb-speex-resampler.h":"dbf543eee4cc6e40ba3531a39d327e2cec884c19e26c570aa7eae0647e5f7420","libcubeb/src/cubeb.c":"2de6d02fefd308dcc755dc9009cdb42d2d60f900237b4eda305ddcaa180f13db","libcubeb/src/cubeb_alsa.c":"6c833e379eea5d64a65a209f8e60c2aa2d6e038ea855554cd3f2664c463abbcd","libcubeb/src/cubeb_array_queue.h":"5264ae02799c540ff73e8eb8efa55986772b22562a025ae227c2603b6b8d1036","libcubeb/src/cubeb_assert.h":"ab8ed4fe7070a3aed9419c5f9695fce2318c4dafd91213ae61cac476e64adaa7","libcubeb/src/cubeb_audiotrack.c":"fe66d36dfecbfaad164ee8c871b39fd6e708a2f8f1f8524a5c0148ab86bab467","libcubeb/src/cubeb_audiounit.cpp":"8c127f884bb773e3856cc7c1f74b85210d1c589b199b61a6d6322a9c0bc1fbd0","libcubeb/src/cubeb_jack.cpp":"129c011feb01e8c6d573862218c31a8bf90522539a28a5ece8bcf87867be9daf","libcubeb/src/cubeb_kai.c":"a71e1de94211ff0e5667a218d71588f1e74102ccf0140b80925c277949871095","libcubeb/src/cubeb_log.cpp":"74bdc0d92a31d6b4ce3c376c6d310db583b869d673e40e6bd0ea795a1e2f937a","libcubeb/src/cubeb_log.h":"ee05fd22ed9820bed79247b8603cdc64f67bcb145be47e78bf0a0e99fb6c0806","libcubeb/src/cubeb_mixer.cpp":"4fd0b0ba6bcf13ae9cede517e427eae38fd7bd6c373deac0d5856a8de65f6a92","libcubeb/src/cubeb_mixer.h":"e94205c1b98859e41eeab2cad53f635f34f57a2ae95aa23a36461a2619abf81b","libcubeb/src/cubeb_opensl.c":"d10d2d35667a48c8fc31f0ecdd47a8c62d7988bc83fb53d4186d0f37c0fc2ad3","libcubeb/src/cubeb_osx_run_loop.cpp":"13c029f7ea04808597b8841b13f248c4476fb7425762f01a59bc6c944cab3a78","libcubeb/src/cubeb_osx_run_loop.h":"ffe80df60b8ea3d0341715b72cc60aae2e0df45141887c01117df543260a0ef8","libcubeb/src/cubeb_panner.cpp":"405a115ff0eb5f00dbab6bc8f2999b02ee4ea4792a87bad7ebd7218ee7980438","libcubeb/src/cubeb_panner.h":"5679df1b9d138c91f6ea642d51e6230cdf3163bdd65db156ad45906916cb74b0","libcubeb/src/cubeb_pulse.c":"7ff5378b793f16fe3a238cff655ad464c94c7a7fc86258bc6588fc3f429e281f","libcubeb/src/cubeb_resampler.cpp":"2d5f5f4ff242d61897b62b4aeaeee85633be54c1eb155c9e35a2c67d8d5b7043","libcubeb/src/cubeb_resampler.h":"ad9800a40c0272fb2a451c02367cc5a516a3067d4acf963d35eb31be367f9224","libcubeb/src/cubeb_resampler_internal.h":"4b4eb6aee343b9c1f73cf17b201329d3714ba44b06ecb1cebf950fdf93a9dfe6","libcubeb/src/cubeb_ring_array.h":"db8dec7a6d778a424045e5ac61c2bc3a3cec8c4fe8e4780f383db4b6f1b2438c","libcubeb/src/cubeb_ringbuffer.h":"2296255ca7835a3ace2fe1852054f43428b677f432b4174bd832ad0224a409eb","libcubeb/src/cubeb_sndio.c":"d64d6ed34987d89a3041988274834a8346c3af6f08e3dd641a0cef2c71eab6c3","libcubeb/src/cubeb_strings.c":"60f2b8c03a5a01925f9777eec0ab84b0e704b40c03e0d6b9c0e7a16246c81fde","libcubeb/src/cubeb_strings.h":"00e5dc97cf16e28cfb53aaae50ac0e3c0ae8a82aad0720ab6842ce5d9785c39f","libcubeb/src/cubeb_utils.cpp":"5bd7de8bbf7bbdc3a275525edd92bad590fb90fb4d35e77017fdd5d25a5769e6","libcubeb/src/cubeb_utils.h":"27baa42747771bf9232741382b83722f5c731e5dcd4dc2e9b595aca91c5647a5","libcubeb/src/cubeb_utils_unix.h":"2a48bd2aefa1b4e4e4968121512bcaaa6be3bca6597ea390b8203c338f5c49b5","libcubeb/src/cubeb_utils_win.h":"74658b6266a8a223c681b0fd06fcc9c891c7b0b95377635c6f1763b240c2ab27","libcubeb/src/cubeb_wasapi.cpp":"4a734b57d344b7cd6e430fe4e4fe42a673a7a4815fa569296d2f9faf5a833e15","libcubeb/src/cubeb_winmm.c":"3f59675847c8ff899d34898616d813b12bd3b6c925cb32fb43f6f9357d0cced5","libcubeb/src/speex/arch.h":"2300bce68c588270cdc684dc7f01377e5e251529f4545d93771e111c56d51b0f","libcubeb/src/speex/fixed_generic.h":"306ee7453677fa6067f16c79d358c6c90a9d3d008850b493cdaa59c07e6375c1","libcubeb/src/speex/resample.c":"9c3a1c64ecf3750af82c980d01ea73d3682f73c332a580465d1e787e5c54cd00","libcubeb/src/speex/resample_neon.h":"7d3fd7af9a1ddde22518b9c7b4419073b72b2dfa5be4c3bc8796992bc87b3da0","libcubeb/src/speex/resample_sse.h":"5a196d8e2d8ab5c956f5252f09f5ddc55aee1f99b1341af3fa54a1f4c2157924","libcubeb/src/speex/speex_config_types.h":"24e3ffbf29e5519611a48e5acb959645b01d166dcb4369380d5f776c3f53d4cd","libcubeb/src/speex/speex_resampler.h":"7e439ec0dd30c32216b3ced17135f8992e5aaf53389d3f5996a7d900c453e65f","libcubeb/src/speex/stack_alloc.h":"e8a2fc0874942d2c7177475fcc141fdd0c0156200b8a4e7656d4a20313e2e569","libcubeb/test/README.md":"1c11b038f87daf10ea78abc17bdbdd157940c241df548c24d5872d142a98c1af","libcubeb/test/common.h":"45eccf0f0c506f2f424149bc434180e296f85ed682b3ffca78cd53f91487d210","libcubeb/test/test_audio.cpp":"c10a9f438d8667153cde2ca13e4b2eebda22d0db93a045299fdbd8c924c44c6c","libcubeb/test/test_callback_ret.cpp":"fdcd25f6da30f2e1dba147d2a790994737d61afbaa30e0e0e9bf41dd5fa41953","libcubeb/test/test_deadlock.cpp":"c311519f30c05300715e91b529685a0c61b8e6b67161fa1f4aeb7030587d86f9","libcubeb/test/test_devices.cpp":"eec312a08667d053216a4266ef9e2b04dcdfa487cc4d34a811bb64cb33ed2937","libcubeb/test/test_duplex.cpp":"add22390fe2dbba09def4cece9a0a6a8e69b24a97f874312b931ece43b1ec4c3","libcubeb/test/test_latency.cpp":"0ace31644f499d69adcfa0aa3bad8c859ad51e97b622e2fa6d26374b8af12894","libcubeb/test/test_loopback.cpp":"e5dfcd868b25468a43dd4d8482702b9494e807db05c041b6fdcb295c59f1f01c","libcubeb/test/test_overload_callback.cpp":"8a05771e5bedfabf9f8a2e5a9266df90f5e964ead3b07782e2e435d7b69b0beb","libcubeb/test/test_record.cpp":"76d5b4f738ca7c30836ef6cc5851f3e04e396b21cf26511e0eeb7a616049fa04","libcubeb/test/test_resampler.cpp":"ca4bc0493ce0c3a5f02f389ac6e37bc2cdb9a752faad2b6fbc5af0a2223ef645","libcubeb/test/test_ring_array.cpp":"27836d716616abf8b020a710659c10ac5e1d4b64149d22cb89bd7a7a5a5669d1","libcubeb/test/test_ring_buffer.cpp":"f6e5a9f552f15808eb8ac3405559bf0ea61e7da4219cd14ac49fff3bfbf49ca7","libcubeb/test/test_sanity.cpp":"f978de12e7046518fbf848fcb5dbb2b5033c7624d5f4b59c0f3e02e7155c3884","libcubeb/test/test_tone.cpp":"3938250700c708c9c742ec8d0c9c2984f3e11860ff8dcacdf0ce785d4668f789","libcubeb/test/test_utils.cpp":"e8d7a02a9096dbc0fd15d71f9849415d52958d2ed82cbc7b8507d3228e08d382","src/callbacks.rs":"b4b4eb3f370475488d7c77b338b0bceee94ef59ede8ff41fa797a3d35ea98b5d","src/channel.rs":"555bc8d5257496cf6e5b4c786df84755327d88a9dc07202746e35f3b7b7e4e0b","src/context.rs":"96bf3442b1dd40262d3088dbb6c473f5451fd91320cef93c522b40f284599803","src/device.rs":"5b65e1c1fdd53fa5208f20bfb809475cbb3c434e02db7d0e4771d13c86f8e369","src/error.rs":"406e3b843ed2d263fe677c4b34fb96a6d780a68bcb56a6f85f041d20d70227bd","src/format.rs":"d4d27790c20eab0b16592f60d5e487425a45a268cf4c74cf843c10ac91bbff4c","src/internal.rs":"c3af5f53dc7957860bf3bc0cd9737d094fb8ac000e7b40c569304cfa76a43145","src/lib.rs":"cb49a3dd8782369172a2f8a61d5c74b4615bfb5fba3677af7d5c149e47d71815","src/log.rs":"6694178177775f2ce5449435d00609e9361c836e23119c07d04892000587dc55","src/macros.rs":"caef13f5d23f7a3ec1a54ec3ca2390ac4ad89d521893f1d0864daf70d57a20aa","src/mixer.rs":"e72e92855614da187da6419ed0a115062a05670cb73443b2ea4313d8f5108a68","src/panner.rs":"341af4b5a5331a3c1a4ab5396125a3600945e588ea33350431dfe6f1a9a0bd80","src/resampler.rs":"762070f8afde2256715b8764380cdfa1204a1a39d98a9da0b2efe88699792f2c","src/stream.rs":"ea3080b6225949938098e3ac38c42939c49a91b322b327ea66e959fe41f51763"},"package":"3ba7540c17b90159cf7d7854da370998ff0560d9b90e2c9290bb588afa0edf95"}
\ No newline at end of file
--- a/third_party/rust/cubeb-sys/Cargo.toml
+++ b/third_party/rust/cubeb-sys/Cargo.toml
@@ -7,28 +7,25 @@
 #
 # If you believe there's an error in this file please file an
 # issue against the rust-lang/cargo repository. If you're
 # editing this file be aware that the upstream Cargo.toml
 # will likely look very different (and much more reasonable)
 
 [package]
 name = "cubeb-sys"
-version = "0.5.1"
+version = "0.5.4"
 authors = ["Dan Glastonbury <dglastonbury@mozilla.com>"]
 build = "build.rs"
 links = "cubeb"
 description = "Native bindings to the cubeb library"
 license = "ISC"
 repository = "https://github.com/djg/cubeb-rs"
 [build-dependencies.cmake]
 version = "0.1.2"
 
-[build-dependencies.gcc]
-version = "0.3"
-
 [build-dependencies.pkg-config]
 version = "0.3"
 
 [features]
 gecko-in-tree = []
 [badges.circle-ci]
 repository = "djg/cubeb-rs"
--- a/third_party/rust/cubeb-sys/build.rs
+++ b/third_party/rust/cubeb-sys/build.rs
@@ -1,15 +1,14 @@
 // Copyright © 2018 Mozilla Foundation
 //
 // This program is made available under an ISC-style license.  See the
 // accompanying file LICENSE for details.
 
 extern crate cmake;
-extern crate gcc;
 extern crate pkg_config;
 
 use std::env;
 use std::fs;
 use std::path::Path;
 use std::process::Command;
 
 macro_rules! t {
--- a/third_party/rust/cubeb-sys/libcubeb/src/cubeb_wasapi.cpp
+++ b/third_party/rust/cubeb-sys/libcubeb/src/cubeb_wasapi.cpp
@@ -1,14 +1,15 @@
 /*
  * Copyright © 2013 Mozilla Foundation
  *
  * This program is made available under an ISC-style license.  See the
  * accompanying file LICENSE for details.
  */
+#define MINGW_HAS_SECURE_API 1
 #define _WIN32_WINNT 0x0600
 #define NOMINMAX
 
 #include <initguid.h>
 #include <windows.h>
 #include <mmdeviceapi.h>
 #include <windef.h>
 #include <audioclient.h>
--- a/third_party/rust/cubeb-sys/src/channel.rs
+++ b/third_party/rust/cubeb-sys/src/channel.rs
@@ -1,17 +1,20 @@
 // Copyright © 2017-2018 Mozilla Foundation
 //
 // This program is made available under an ISC-style license.  See the
 // accompanying file LICENSE for details.
 
-use std::os::raw::c_uint;
+#[cfg(all(windows, not(target_env = "gnu")))]
+use std::os::raw::c_int as c_enum;
+#[cfg(any(not(windows), all(windows, target_env = "gnu")))]
+use std::os::raw::c_uint as c_enum;
 
 cubeb_enum! {
-    pub enum cubeb_channel : c_uint {
+    pub enum cubeb_channel : c_enum {
         CHANNEL_UNKNOWN = 0,
         CHANNEL_FRONT_LEFT = 1 << 0,
         CHANNEL_FRONT_RIGHT = 1 << 1,
         CHANNEL_FRONT_CENTER = 1 << 2,
         CHANNEL_LOW_FREQUENCY = 1 << 3,
         CHANNEL_BACK_LEFT = 1 << 4,
         CHANNEL_BACK_RIGHT = 1 << 5,
         CHANNEL_FRONT_LEFT_OF_CENTER = 1 << 6,
--- a/third_party/rust/cubeb/.cargo-checksum.json
+++ b/third_party/rust/cubeb/.cargo-checksum.json
@@ -1,1 +1,1 @@
-{"files":{"Cargo.toml":"7c56fd36743a0c83f3977d8b24e67abff5ecd34e4e6043742ff331746165c60a","LICENSE":"8c044baa5d883274736eeece0b955249076c2697b826e576fce59496235b2cf5","README.md":"408c573ec240927cf5b9c036098e94e374ec41f71991415422586f450586b214","examples/common/mod.rs":"a5e1b79fc2b4addff1e442879ba3dbcb1cf5973e76b9a62d97dd0042597480db","examples/devices.rs":"89e13542853995d1ae4a49d6829156efb29dd25c6caffdf22496c28c8263ffeb","examples/tone.rs":"8f5f9851b6d99f6f16c597fcb9312e3ef81769cbfb89341d2ea2522ca2e2214e","src/context.rs":"03511fa960a411728163e700edc2fd6cfbfcf09766ffe62ee82a2cbd08fdf243","src/frame.rs":"ed1e8f4576022d0c23106bb115125e5a2967b0375a10d0c54bbe99f04a70cc3f","src/lib.rs":"98e9280890551ac9305f2f808e315b6aa6bcd5781b8e96a078787ded0ef91e2a","src/log.rs":"704faeb31934dad6bc6d02e01caa85118754209bd559d30d03fcfa5cb8c1603c","src/sample.rs":"e23be3b691052001916f920ce9c1a0051bd097e39c9d34cbcb80ab8120265f45","src/stream.rs":"3ee0432f655cd42959cd5d8e75cb4fe2322e1f88fa5d9cc83e615ae229cdeb8a"},"package":"8a3502aafa1bf95c524f65d2ba46d8741700c6a8a9543ea52c6da3d8b69a2896"}
\ No newline at end of file
+{"files":{"Cargo.toml":"fbfad79bbb62cf1ff067b5c73d239d7d9acf84be48492af1af55b55acc52904a","LICENSE":"8c044baa5d883274736eeece0b955249076c2697b826e576fce59496235b2cf5","README.md":"408c573ec240927cf5b9c036098e94e374ec41f71991415422586f450586b214","examples/common/mod.rs":"a5e1b79fc2b4addff1e442879ba3dbcb1cf5973e76b9a62d97dd0042597480db","examples/devices.rs":"89e13542853995d1ae4a49d6829156efb29dd25c6caffdf22496c28c8263ffeb","examples/tone.rs":"8f5f9851b6d99f6f16c597fcb9312e3ef81769cbfb89341d2ea2522ca2e2214e","src/context.rs":"03511fa960a411728163e700edc2fd6cfbfcf09766ffe62ee82a2cbd08fdf243","src/frame.rs":"ed1e8f4576022d0c23106bb115125e5a2967b0375a10d0c54bbe99f04a70cc3f","src/lib.rs":"98e9280890551ac9305f2f808e315b6aa6bcd5781b8e96a078787ded0ef91e2a","src/log.rs":"704faeb31934dad6bc6d02e01caa85118754209bd559d30d03fcfa5cb8c1603c","src/sample.rs":"e23be3b691052001916f920ce9c1a0051bd097e39c9d34cbcb80ab8120265f45","src/stream.rs":"3ee0432f655cd42959cd5d8e75cb4fe2322e1f88fa5d9cc83e615ae229cdeb8a"},"package":"db3f0df2ad5cb453126364a77921466ba6c1034e8bd9247f326cdb31430dbc2a"}
\ No newline at end of file
--- a/third_party/rust/cubeb/Cargo.toml
+++ b/third_party/rust/cubeb/Cargo.toml
@@ -7,24 +7,24 @@
 #
 # If you believe there's an error in this file please file an
 # issue against the rust-lang/cargo repository. If you're
 # editing this file be aware that the upstream Cargo.toml
 # will likely look very different (and much more reasonable)
 
 [package]
 name = "cubeb"
-version = "0.5.2"
+version = "0.5.4"
 authors = ["Dan Glastonbury <dglastonbury@mozilla.com>"]
 description = "Bindings to libcubeb for interacting with system audio from rust.\n"
 homepage = "https://github.com/djg/cubeb-rs"
 readme = "README.md"
 keywords = ["cubeb"]
 categories = ["api-bindings"]
 license = "ISC"
 repository = "https://github.com/djg/cubeb-rs"
 [dependencies.cubeb-core]
-version = "0.5.1"
+version = "0.5.4"
 
 [features]
 gecko-in-tree = ["cubeb-core/gecko-in-tree"]
 [badges.circle-ci]
 repository = "djg/cubeb-rs"
new file mode 100644
--- /dev/null
+++ b/third_party/rust/mio-named-pipes/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{"Cargo.toml":"d0a5c57e548259b2ef7d6e443f72a91775cfd20b926ccd88d7505ce24400faa1","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"76068a8cb49c12b1f45599fe8ed1ed53554485afe1cc5302360cc73687458a1a","appveyor.yml":"0bd9b8e5a94a36972b37227cc59984fc6ec01b4ee4b617ef20d0e3acd19f44b1","src/from_raw_arc.rs":"c2cee14a0355256beb55a1feb54ccdcc50c8ab2d9abb3b7f114be00ed8a5583f","src/lib.rs":"1eaafb6635a525abfea3eefdeba831e3bae2f80dda847f8a7102f26f32cbddad","tests/smoke.rs":"b1bd2ecbaae2a6458fdc2c50b8b1607277108196b607c12f47f4c5c78b9a250e"},"package":"82f43a815b57d2d652550f3d20cec88a495bb2d0956aa873dc43040278455677"}
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/third_party/rust/mio-named-pipes/Cargo.toml
@@ -0,0 +1,23 @@
+[package]
+name = "mio-named-pipes"
+version = "0.1.5"
+authors = ["Alex Crichton <alex@alexcrichton.com>"]
+license = "MIT/Apache-2.0"
+readme = "README.md"
+repository = "https://github.com/alexcrichton/mio-named-pipes"
+homepage = "https://github.com/alexcrichton/mio-named-pipes"
+documentation = "https://docs.rs/mio-named-pipes/0.1/x86_64-pc-windows-msvc/mio_named_pipes/"
+description = """
+Windows named pipe bindings for mio.
+"""
+
+[target.'cfg(windows)'.dependencies]
+kernel32-sys = "0.2"
+log = "0.3"
+mio = "0.6.5"
+miow = "0.2"
+winapi = "0.2"
+
+[dev-dependencies]
+env_logger = { version = "0.3", default-features = false }
+rand = "0.3"
new file mode 100644
--- /dev/null
+++ b/third_party/rust/mio-named-pipes/LICENSE-APACHE
@@ -0,0 +1,201 @@
+                              Apache License
+                        Version 2.0, January 2004
+                     http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+   "License" shall mean the terms and conditions for use, reproduction,
+   and distribution as defined by Sections 1 through 9 of this document.
+
+   "Licensor" shall mean the copyright owner or entity authorized by
+   the copyright owner that is granting the License.
+
+   "Legal Entity" shall mean the union of the acting entity and all
+   other entities that control, are controlled by, or are under common
+   control with that entity. For the purposes of this definition,
+   "control" means (i) the power, direct or indirect, to cause the
+   direction or management of such entity, whether by contract or
+   otherwise, or (ii) ownership of fifty percent (50%) or more of the
+   outstanding shares, or (iii) beneficial ownership of such entity.
+
+   "You" (or "Your") shall mean an individual or Legal Entity
+   exercising permissions granted by this License.
+
+   "Source" form shall mean the preferred form for making modifications,
+   including but not limited to software source code, documentation
+   source, and configuration files.
+
+   "Object" form shall mean any form resulting from mechanical
+   transformation or translation of a Source form, including but
+   not limited to compiled object code, generated documentation,
+   and conversions to other media types.
+
+   "Work" shall mean the work of authorship, whether in Source or
+   Object form, made available under the License, as indicated by a
+   copyright notice that is included in or attached to the work
+   (an example is provided in the Appendix below).
+
+   "Derivative Works" shall mean any work, whether in Source or Object
+   form, that is based on (or derived from) the Work and for which the
+   editorial revisions, annotations, elaborations, or other modifications
+   represent, as a whole, an original work of authorship. For the purposes
+   of this License, Derivative Works shall not include works that remain
+   separable from, or merely link (or bind by name) to the interfaces of,
+   the Work and Derivative Works thereof.
+
+   "Contribution" shall mean any work of authorship, including
+   the original version of the Work and any modifications or additions
+   to that Work or Derivative Works thereof, that is intentionally
+   submitted to Licensor for inclusion in the Work by the copyright owner
+   or by an individual or Legal Entity authorized to submit on behalf of
+   the copyright owner. For the purposes of this definition, "submitted"
+   means any form of electronic, verbal, or written communication sent
+   to the Licensor or its representatives, including but not limited to
+   communication on electronic mailing lists, source code control systems,
+   and issue tracking systems that are managed by, or on behalf of, the
+   Licensor for the purpose of discussing and improving the Work, but
+   excluding communication that is conspicuously marked or otherwise
+   designated in writing by the copyright owner as "Not a Contribution."
+
+   "Contributor" shall mean Licensor and any individual or Legal Entity
+   on behalf of whom a Contribution has been received by Licensor and
+   subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   copyright license to reproduce, prepare Derivative Works of,
+   publicly display, publicly perform, sublicense, and distribute the
+   Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   (except as stated in this section) patent license to make, have made,
+   use, offer to sell, sell, import, and otherwise transfer the Work,
+   where such license applies only to those patent claims licensable
+   by such Contributor that are necessarily infringed by their
+   Contribution(s) alone or by combination of their Contribution(s)
+   with the Work to which such Contribution(s) was submitted. If You
+   institute patent litigation against any entity (including a
+   cross-claim or counterclaim in a lawsuit) alleging that the Work
+   or a Contribution incorporated within the Work constitutes direct
+   or contributory patent infringement, then any patent licenses
+   granted to You under this License for that Work shall terminate
+   as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+   Work or Derivative Works thereof in any medium, with or without
+   modifications, and in Source or Object form, provided that You
+   meet the following conditions:
+
+   (a) You must give any other recipients of the Work or
+       Derivative Works a copy of this License; and
+
+   (b) You must cause any modified files to carry prominent notices
+       stating that You changed the files; and
+
+   (c) You must retain, in the Source form of any Derivative Works
+       that You distribute, all copyright, patent, trademark, and
+       attribution notices from the Source form of the Work,
+       excluding those notices that do not pertain to any part of
+       the Derivative Works; and
+
+   (d) If the Work includes a "NOTICE" text file as part of its
+       distribution, then any Derivative Works that You distribute must
+       include a readable copy of the attribution notices contained
+       within such NOTICE file, excluding those notices that do not
+       pertain to any part of the Derivative Works, in at least one
+       of the following places: within a NOTICE text file distributed
+       as part of the Derivative Works; within the Source form or
+       documentation, if provided along with the Derivative Works; or,
+       within a display generated by the Derivative Works, if and
+       wherever such third-party notices normally appear. The contents
+       of the NOTICE file are for informational purposes only and
+       do not modify the License. You may add Your own attribution
+       notices within Derivative Works that You distribute, alongside
+       or as an addendum to the NOTICE text from the Work, provided
+       that such additional attribution notices cannot be construed
+       as modifying the License.
+
+   You may add Your own copyright statement to Your modifications and
+   may provide additional or different license terms and conditions
+   for use, reproduction, or distribution of Your modifications, or
+   for any such Derivative Works as a whole, provided Your use,
+   reproduction, and distribution of the Work otherwise complies with
+   the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+   any Contribution intentionally submitted for inclusion in the Work
+   by You to the Licensor shall be under the terms and conditions of
+   this License, without any additional terms or conditions.
+   Notwithstanding the above, nothing herein shall supersede or modify
+   the terms of any separate license agreement you may have executed
+   with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+   names, trademarks, service marks, or product names of the Licensor,
+   except as required for reasonable and customary use in describing the
+   origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+   agreed to in writing, Licensor provides the Work (and each
+   Contributor provides its Contributions) on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+   implied, including, without limitation, any warranties or conditions
+   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+   PARTICULAR PURPOSE. You are solely responsible for determining the
+   appropriateness of using or redistributing the Work and assume any
+   risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+   whether in tort (including negligence), contract, or otherwise,
+   unless required by applicable law (such as deliberate and grossly
+   negligent acts) or agreed to in writing, shall any Contributor be
+   liable to You for damages, including any direct, indirect, special,
+   incidental, or consequential damages of any character arising as a
+   result of this License or out of the use or inability to use the
+   Work (including but not limited to damages for loss of goodwill,
+   work stoppage, computer failure or malfunction, or any and all
+   other commercial damages or losses), even if such Contributor
+   has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+   the Work or Derivative Works thereof, You may choose to offer,
+   and charge a fee for, acceptance of support, warranty, indemnity,
+   or other liability obligations and/or rights consistent with this
+   License. However, in accepting such obligations, You may act only
+   on Your own behalf and on Your sole responsibility, not on behalf
+   of any other Contributor, and only if You agree to indemnify,
+   defend, and hold each Contributor harmless for any liability
+   incurred by, or claims asserted against, such Contributor by reason
+   of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+   To apply the Apache License to your work, attach the following
+   boilerplate notice, with the fields enclosed by brackets "[]"
+   replaced with your own identifying information. (Don't include
+   the brackets!)  The text should be enclosed in the appropriate
+   comment syntax for the file format. We also recommend that a
+   file or class name and description of purpose be included on the
+   same "printed page" as the copyright notice for easier
+   identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+	http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/mio-named-pipes/LICENSE-MIT
@@ -0,0 +1,25 @@
+Copyright (c) 2014 Alex Crichton
+
+Permission is hereby granted, free of charge, to any
+person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without
+limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/mio-named-pipes/README.md
@@ -0,0 +1,42 @@
+# mio-named-pipes
+
+[![Build status](https://ci.appveyor.com/api/projects/status/y0ct01srewnhhesn?svg=true)](https://ci.appveyor.com/project/alexcrichton/mio-named-pipes)
+
+[Documentation](https://docs.rs/mio-named-pipes/0.1/x86_64-pc-windows-msvc/mio_named_pipes/)
+
+A library for integrating Windows [Named Pipes] with [mio].
+
+[Named Pipes]: https://msdn.microsoft.com/en-us/library/windows/desktop/aa365590(v=vs.85).aspx
+[mio]: https://github.com/carllerche/mio
+
+```toml
+# Cargo.toml
+[dependencies]
+mio-named-pipes = "0.6"
+mio = "0.6"
+```
+
+## Usage
+
+The primary type, `NamedPipe`, can be constructed with `NamedPipe::new` or
+through the `IntoRawHandle` type. All operations on `NamedPipe` are nonblocking
+and will return an I/O error if they'd block (with the error indicating so).
+
+Typically you can use a `NamedPipe` in the same way you would a TCP socket on
+Windows with mio.
+
+> **Note**: Named pipes on Windows do not have a zero-cost abstraction when
+> working with the mio interface (readiness, not completion). As a result, this
+> library internally has some buffer management that hasn't been optimized yet.
+> It's recommended you benchmark this library for your application, and feel
+> free to contact me if anything looks awry.
+
+# License