Merge inbound to mozilla-central a=merge
authorCoroiu Cristina <ccoroiu@mozilla.com>
Tue, 08 Oct 2019 00:52:41 +0300
changeset 496680 4651f71eeb5476a6dc9002a47a45c3a5b17aba6c
parent 496679 2b4c8b7a255c3ffd1ead1e555aa061f3c3f88330 (current diff)
parent 496678 aa50a7580ed4a38b59ff40fdaf541f911110e71c (diff)
child 496681 480000073f4668def97fda2a50fef3e29225308e
push id97366
push userccoroiu@mozilla.com
push dateMon, 07 Oct 2019 22:35:10 +0000
treeherderautoland@4837c8bbf06a [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone71.0a1
first release with
nightly linux32
4651f71eeb54 / 71.0a1 / 20191007215350 / files
nightly linux64
4651f71eeb54 / 71.0a1 / 20191007215350 / files
nightly mac
4651f71eeb54 / 71.0a1 / 20191007215350 / files
nightly win32
4651f71eeb54 / 71.0a1 / 20191007215350 / files
nightly win64
4651f71eeb54 / 71.0a1 / 20191007215350 / files
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
releases
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge inbound to mozilla-central a=merge
testing/web-platform/meta/content-security-policy/font-src/font-self-allowed.html.ini
testing/web-platform/meta/streams/readable-streams/floating-point-total-queue-size.any.js.ini
testing/web-platform/meta/webrtc-stats/idlharness.window.js.ini
testing/web-platform/meta/workers/Worker-replace-self.any.js.ini
testing/web-platform/tests/fonts/CanvasTest.ttf.sub.headers
testing/web-platform/tests/proximity/ProximitySensor_onerror-manual.https.html
testing/web-platform/tests/upgrade-insecure-requests/support/generate.py
--- a/testing/web-platform/meta/animation-worklet/idlharness.any.js.ini
+++ b/testing/web-platform/meta/animation-worklet/idlharness.any.js.ini
@@ -68,8 +68,11 @@
     expected: FAIL
 
   [Partial interface AnimationEffect: valid exposure set]
     expected: FAIL
 
   [WorkletAnimation interface: new WorkletAnimation("name") must not have property "animatorName"]
     expected: FAIL
 
+  [WorkletAnimation interface: new WorkletAnimation("name") must not have property "undefined"]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/compression/decompression-bad-chunks.any.js.ini
@@ -0,0 +1,223 @@
+[decompression-bad-chunks.any.worker.html]
+  [chunk of type array should error the stream for gzip]
+    expected: FAIL
+
+  [chunk of type object, not BufferSource should error the stream for deflate]
+    expected: FAIL
+
+  [chunk of type array should error the stream for deflate]
+    expected: FAIL
+
+  [chunk of type null should error the stream for deflate]
+    expected: FAIL
+
+  [chunk of type SharedArrayBuffer should error the stream for deflate]
+    expected: FAIL
+
+  [chunk of type invalid gzip bytes should error the stream for gzip]
+    expected: FAIL
+
+  [chunk of type numeric should error the stream for gzip]
+    expected: FAIL
+
+  [chunk of type undefined should error the stream for gzip]
+    expected: FAIL
+
+  [chunk of type SharedArrayBuffer should error the stream for gzip]
+    expected: FAIL
+
+  [chunk of type numeric should error the stream for deflate]
+    expected: FAIL
+
+  [chunk of type shared Uint8Array should error the stream for gzip]
+    expected: FAIL
+
+  [chunk of type object, not BufferSource should error the stream for gzip]
+    expected: FAIL
+
+  [chunk of type invalid deflate bytes should error the stream for gzip]
+    expected: FAIL
+
+  [chunk of type invalid gzip bytes should error the stream for deflate]
+    expected: FAIL
+
+  [chunk of type undefined should error the stream for deflate]
+    expected: FAIL
+
+  [chunk of type shared Uint8Array should error the stream for deflate]
+    expected: FAIL
+
+  [chunk of type invalid deflate bytes should error the stream for deflate]
+    expected: FAIL
+
+  [chunk of type null should error the stream for gzip]
+    expected: FAIL
+
+
+[decompression-bad-chunks.any.sharedworker.html]
+  [chunk of type array should error the stream for gzip]
+    expected: FAIL
+
+  [chunk of type object, not BufferSource should error the stream for deflate]
+    expected: FAIL
+
+  [chunk of type array should error the stream for deflate]
+    expected: FAIL
+
+  [chunk of type null should error the stream for deflate]
+    expected: FAIL
+
+  [chunk of type SharedArrayBuffer should error the stream for deflate]
+    expected: FAIL
+
+  [chunk of type invalid gzip bytes should error the stream for gzip]
+    expected: FAIL
+
+  [chunk of type numeric should error the stream for gzip]
+    expected: FAIL
+
+  [chunk of type undefined should error the stream for gzip]
+    expected: FAIL
+
+  [chunk of type SharedArrayBuffer should error the stream for gzip]
+    expected: FAIL
+
+  [chunk of type numeric should error the stream for deflate]
+    expected: FAIL
+
+  [chunk of type shared Uint8Array should error the stream for gzip]
+    expected: FAIL
+
+  [chunk of type object, not BufferSource should error the stream for gzip]
+    expected: FAIL
+
+  [chunk of type invalid deflate bytes should error the stream for gzip]
+    expected: FAIL
+
+  [chunk of type invalid gzip bytes should error the stream for deflate]
+    expected: FAIL
+
+  [chunk of type undefined should error the stream for deflate]
+    expected: FAIL
+
+  [chunk of type shared Uint8Array should error the stream for deflate]
+    expected: FAIL
+
+  [chunk of type invalid deflate bytes should error the stream for deflate]
+    expected: FAIL
+
+  [chunk of type null should error the stream for gzip]
+    expected: FAIL
+
+
+[decompression-bad-chunks.any.serviceworker.html]
+  [chunk of type array should error the stream for gzip]
+    expected: FAIL
+
+  [chunk of type object, not BufferSource should error the stream for deflate]
+    expected: FAIL
+
+  [chunk of type array should error the stream for deflate]
+    expected: FAIL
+
+  [chunk of type null should error the stream for deflate]
+    expected: FAIL
+
+  [chunk of type SharedArrayBuffer should error the stream for deflate]
+    expected: FAIL
+
+  [chunk of type invalid gzip bytes should error the stream for gzip]
+    expected: FAIL
+
+  [chunk of type numeric should error the stream for gzip]
+    expected: FAIL
+
+  [chunk of type undefined should error the stream for gzip]
+    expected: FAIL
+
+  [chunk of type SharedArrayBuffer should error the stream for gzip]
+    expected: FAIL
+
+  [chunk of type numeric should error the stream for deflate]
+    expected: FAIL
+
+  [chunk of type shared Uint8Array should error the stream for gzip]
+    expected: FAIL
+
+  [chunk of type object, not BufferSource should error the stream for gzip]
+    expected: FAIL
+
+  [chunk of type invalid deflate bytes should error the stream for gzip]
+    expected: FAIL
+
+  [chunk of type invalid gzip bytes should error the stream for deflate]
+    expected: FAIL
+
+  [chunk of type undefined should error the stream for deflate]
+    expected: FAIL
+
+  [chunk of type shared Uint8Array should error the stream for deflate]
+    expected: FAIL
+
+  [chunk of type invalid deflate bytes should error the stream for deflate]
+    expected: FAIL
+
+  [chunk of type null should error the stream for gzip]
+    expected: FAIL
+
+
+[decompression-bad-chunks.any.html]
+  [chunk of type array should error the stream for gzip]
+    expected: FAIL
+
+  [chunk of type object, not BufferSource should error the stream for deflate]
+    expected: FAIL
+
+  [chunk of type array should error the stream for deflate]
+    expected: FAIL
+
+  [chunk of type null should error the stream for deflate]
+    expected: FAIL
+
+  [chunk of type SharedArrayBuffer should error the stream for deflate]
+    expected: FAIL
+
+  [chunk of type invalid gzip bytes should error the stream for gzip]
+    expected: FAIL
+
+  [chunk of type numeric should error the stream for gzip]
+    expected: FAIL
+
+  [chunk of type undefined should error the stream for gzip]
+    expected: FAIL
+
+  [chunk of type SharedArrayBuffer should error the stream for gzip]
+    expected: FAIL
+
+  [chunk of type numeric should error the stream for deflate]
+    expected: FAIL
+
+  [chunk of type shared Uint8Array should error the stream for gzip]
+    expected: FAIL
+
+  [chunk of type object, not BufferSource should error the stream for gzip]
+    expected: FAIL
+
+  [chunk of type invalid deflate bytes should error the stream for gzip]
+    expected: FAIL
+
+  [chunk of type invalid gzip bytes should error the stream for deflate]
+    expected: FAIL
+
+  [chunk of type undefined should error the stream for deflate]
+    expected: FAIL
+
+  [chunk of type shared Uint8Array should error the stream for deflate]
+    expected: FAIL
+
+  [chunk of type invalid deflate bytes should error the stream for deflate]
+    expected: FAIL
+
+  [chunk of type null should error the stream for gzip]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/compression/decompression-constructor-error.any.js.ini
@@ -0,0 +1,82 @@
+[decompression-constructor-error.any.worker.html]
+  [construction error by unsupported format]
+    expected: FAIL
+
+  [constructor error by input object that cannot be converted to a string]
+    expected: FAIL
+
+  [constructor error by non-input]
+    expected: FAIL
+
+  [non-string input should cause the constructor to throw]
+    expected: FAIL
+
+  ["a" should cause the constructor to throw]
+    expected: FAIL
+
+  [no input should cause the constructor to throw]
+    expected: FAIL
+
+
+[decompression-constructor-error.any.serviceworker.html]
+  [construction error by unsupported format]
+    expected: FAIL
+
+  [constructor error by input object that cannot be converted to a string]
+    expected: FAIL
+
+  [constructor error by non-input]
+    expected: FAIL
+
+  [non-string input should cause the constructor to throw]
+    expected: FAIL
+
+  ["a" should cause the constructor to throw]
+    expected: FAIL
+
+  [no input should cause the constructor to throw]
+    expected: FAIL
+
+  [decompression-constructor-error]
+    expected: FAIL
+
+
+[decompression-constructor-error.any.html]
+  [construction error by unsupported format]
+    expected: FAIL
+
+  [constructor error by input object that cannot be converted to a string]
+    expected: FAIL
+
+  [constructor error by non-input]
+    expected: FAIL
+
+  [non-string input should cause the constructor to throw]
+    expected: FAIL
+
+  ["a" should cause the constructor to throw]
+    expected: FAIL
+
+  [no input should cause the constructor to throw]
+    expected: FAIL
+
+
+[decompression-constructor-error.any.sharedworker.html]
+  [construction error by unsupported format]
+    expected: FAIL
+
+  [constructor error by input object that cannot be converted to a string]
+    expected: FAIL
+
+  [constructor error by non-input]
+    expected: FAIL
+
+  [non-string input should cause the constructor to throw]
+    expected: FAIL
+
+  ["a" should cause the constructor to throw]
+    expected: FAIL
+
+  [no input should cause the constructor to throw]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/compression/decompression-correct-input.any.js.ini
@@ -0,0 +1,34 @@
+[decompression-correct-input.any.worker.html]
+  [decompressing gzip input should work]
+    expected: FAIL
+
+  [decompressing deflated input should work]
+    expected: FAIL
+
+
+[decompression-correct-input.any.serviceworker.html]
+  [decompressing gzip input should work]
+    expected: FAIL
+
+  [decompressing deflated input should work]
+    expected: FAIL
+
+  [decompression-correct-input]
+    expected: FAIL
+
+
+[decompression-correct-input.any.html]
+  [decompressing gzip input should work]
+    expected: FAIL
+
+  [decompressing deflated input should work]
+    expected: FAIL
+
+
+[decompression-correct-input.any.sharedworker.html]
+  [decompressing gzip input should work]
+    expected: FAIL
+
+  [decompressing deflated input should work]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/compression/decompression-empty-input.any.js.ini
@@ -0,0 +1,31 @@
+[decompression-empty-input.any.sharedworker.html]
+  [decompressing gzip empty input should work]
+    expected: FAIL
+
+  [decompressing deflate empty input should work]
+    expected: FAIL
+
+
+[decompression-empty-input.any.html]
+  [decompressing gzip empty input should work]
+    expected: FAIL
+
+  [decompressing deflate empty input should work]
+    expected: FAIL
+
+
+[decompression-empty-input.any.serviceworker.html]
+  [decompressing gzip empty input should work]
+    expected: FAIL
+
+  [decompressing deflate empty input should work]
+    expected: FAIL
+
+
+[decompression-empty-input.any.worker.html]
+  [decompressing gzip empty input should work]
+    expected: FAIL
+
+  [decompressing deflate empty input should work]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/compression/decompression-split-chunk.any.js.ini
@@ -0,0 +1,367 @@
+[decompression-split-chunk.any.worker.html]
+  [decompressing splitted chunk into pieces of size 1 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 5 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 8 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 9 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 10 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 12 should work in gzip]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 11 should work in gzip]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 5 should work in gzip]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 4 should work in gzip]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 2 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 7 should work in gzip]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 8 should work in gzip]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 12 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 13 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 9 should work in gzip]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 6 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 3 should work in gzip]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 11 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 14 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 13 should work in gzip]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 14 should work in gzip]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 3 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 15 should work in gzip]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 1 should work in gzip]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 2 should work in gzip]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 7 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 6 should work in gzip]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 15 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 4 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 10 should work in gzip]
+    expected: FAIL
+
+
+[decompression-split-chunk.any.sharedworker.html]
+  [decompressing splitted chunk into pieces of size 1 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 5 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 8 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 9 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 10 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 12 should work in gzip]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 11 should work in gzip]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 5 should work in gzip]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 4 should work in gzip]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 2 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 7 should work in gzip]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 8 should work in gzip]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 12 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 13 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 9 should work in gzip]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 6 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 3 should work in gzip]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 11 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 14 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 13 should work in gzip]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 14 should work in gzip]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 3 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 15 should work in gzip]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 1 should work in gzip]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 2 should work in gzip]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 7 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 6 should work in gzip]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 15 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 4 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 10 should work in gzip]
+    expected: FAIL
+
+
+[decompression-split-chunk.any.html]
+  [decompressing splitted chunk into pieces of size 1 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 5 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 8 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 9 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 10 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 12 should work in gzip]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 11 should work in gzip]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 5 should work in gzip]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 4 should work in gzip]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 2 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 7 should work in gzip]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 8 should work in gzip]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 12 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 13 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 9 should work in gzip]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 6 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 3 should work in gzip]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 11 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 14 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 13 should work in gzip]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 14 should work in gzip]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 3 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 15 should work in gzip]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 1 should work in gzip]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 2 should work in gzip]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 7 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 6 should work in gzip]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 15 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 4 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 10 should work in gzip]
+    expected: FAIL
+
+
+[decompression-split-chunk.any.serviceworker.html]
+  [decompressing splitted chunk into pieces of size 1 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 5 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 8 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 9 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 10 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 12 should work in gzip]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 11 should work in gzip]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 5 should work in gzip]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 4 should work in gzip]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 2 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 7 should work in gzip]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 8 should work in gzip]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 12 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 13 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 9 should work in gzip]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 6 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 3 should work in gzip]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 11 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 14 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 13 should work in gzip]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 14 should work in gzip]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 3 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 15 should work in gzip]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 1 should work in gzip]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 2 should work in gzip]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 7 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 6 should work in gzip]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 15 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 4 should work in deflate]
+    expected: FAIL
+
+  [decompressing splitted chunk into pieces of size 10 should work in gzip]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/compression/decompression-uint8array-output.any.js.ini
@@ -0,0 +1,31 @@
+[decompression-uint8array-output.any.html]
+  [decompressing gzip output should give Uint8Array chunks]
+    expected: FAIL
+
+  [decompressing deflated output should give Uint8Array chunks]
+    expected: FAIL
+
+
+[decompression-uint8array-output.any.worker.html]
+  [decompressing gzip output should give Uint8Array chunks]
+    expected: FAIL
+
+  [decompressing deflated output should give Uint8Array chunks]
+    expected: FAIL
+
+
+[decompression-uint8array-output.any.serviceworker.html]
+  [decompressing gzip output should give Uint8Array chunks]
+    expected: FAIL
+
+  [decompressing deflated output should give Uint8Array chunks]
+    expected: FAIL
+
+
+[decompression-uint8array-output.any.sharedworker.html]
+  [decompressing gzip output should give Uint8Array chunks]
+    expected: FAIL
+
+  [decompressing deflated output should give Uint8Array chunks]
+    expected: FAIL
+
deleted file mode 100644
--- a/testing/web-platform/meta/content-security-policy/font-src/font-self-allowed.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[font-self-allowed.html]
-  [Test font loads if it matches font-src.]
-    expected: FAIL
-
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/content-security-policy/frame-ancestors/frame-ancestors-from-serviceworker.https.html.ini
@@ -0,0 +1,5 @@
+[frame-ancestors-from-serviceworker.https.html]
+  expected: TIMEOUT
+  [A 'frame-ancestors' CSP directive set from a serviceworker response with a value 'none' should block rendering.]
+    expected: TIMEOUT
+
--- a/testing/web-platform/meta/content-security-policy/navigate-to/href-location-blocked.sub.html.ini
+++ b/testing/web-platform/meta/content-security-policy/navigate-to/href-location-blocked.sub.html.ini
@@ -1,6 +1,6 @@
 [href-location-blocked.sub.html]
   [Violation report status OK.]
     expected:
+      if (os == "android") and debug: ["FAIL", "PASS"]
       if (os == "android") and not debug: ["PASS", "FAIL"]
-      if (os == "android") and debug: ["PASS", "FAIL"]
 
--- a/testing/web-platform/meta/cookie-store/serviceworker_cookieStore_subscriptions.tentative.https.html.ini
+++ b/testing/web-platform/meta/cookie-store/serviceworker_cookieStore_subscriptions.tentative.https.html.ini
@@ -1,22 +1,22 @@
 [serviceworker_cookieStore_subscriptions.tentative.https.html]
   disabled:
     if os == "linux": https://bugzilla.mozilla.org/show_bug.cgi?id=1573036
     if (os == "win") and (processor == "aarch64"): https://bugzilla.mozilla.org/show_bug.cgi?id=1573036
   expected:
-    if (os == "mac") and not debug: [TIMEOUT, OK]
+    if (os == "mac") and not debug: ["OK", "TIMEOUT"]
     TIMEOUT
   [getChangeSubscriptions returns subscriptions passed to subscribeToChanges]
     expected:
-      if (os == "mac") and not debug: [TIMEOUT, FAIL]
+      if (os == "mac") and not debug: ["FAIL", "TIMEOUT"]
       TIMEOUT
 
   [subscribeToChanges rejects when called outside the install handler]
     expected:
-      if (os == "mac") and not debug: [NOTRUN, FAIL]
+      if (os == "mac") and not debug: ["FAIL", "NOTRUN"]
       NOTRUN
 
   [cookiechange dispatched with cookie change that matches subscription]
     expected:
-      if (os == "mac") and not debug: [NOTRUN, FAIL]
+      if (os == "mac") and not debug: ["FAIL", "NOTRUN"]
       NOTRUN
 
--- a/testing/web-platform/meta/css/CSS2/positioning/relpos-percentage-top-in-scrollable.html.ini
+++ b/testing/web-platform/meta/css/CSS2/positioning/relpos-percentage-top-in-scrollable.html.ini
@@ -1,7 +1,6 @@
 [relpos-percentage-top-in-scrollable.html]
   [Top percentage resolved correctly for overflow contribution]
     expected:
-      if (os == "android") and not debug: [FAIL, PASS]
-      if (os == "android") and debug: [FAIL, PASS]
+      if (os == "android") and debug: ["FAIL", "PASS"]
+      if (os == "android") and not debug: ["FAIL", "PASS"]
 
-
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-animations/parsing/animation-computed.html.ini
@@ -0,0 +1,34 @@
+[animation-computed.html]
+  [Property animation value 'paused' computes to '0s ease 0s 1 normal none paused none']
+    expected: FAIL
+
+  [Property animation value 'anim paused both reverse, 4 1s -3s cubic-bezier(0, -2, 1, 3)' computes to '0s ease 0s 1 reverse both paused anim, 1s cubic-bezier(0, -2, 1, 3) -3s 4 normal none running none']
+    expected: FAIL
+
+  [Property animation value 'cubic-bezier(0, -2, 1, 3)' computes to '0s cubic-bezier(0, -2, 1, 3) 0s 1 normal none running none']
+    expected: FAIL
+
+  [Property animation value 'anim paused both reverse 4 1s -3s cubic-bezier(0, -2, 1, 3)' computes to '1s cubic-bezier(0, -2, 1, 3) -3s 4 reverse both paused anim']
+    expected: FAIL
+
+  [Property animation value 'anim' computes to '0s ease 0s 1 normal none running anim']
+    expected: FAIL
+
+  [Property animation value '1s -3s' computes to '1s ease -3s 1 normal none running none']
+    expected: FAIL
+
+  [Property animation value '4' computes to '0s ease 0s 4 normal none running none']
+    expected: FAIL
+
+  [Property animation value 'reverse' computes to '0s ease 0s 1 reverse none running none']
+    expected: FAIL
+
+  [Property animation value 'none' computes to '0s ease 0s 1 normal none running none']
+    expected: FAIL
+
+  [Property animation value '1s' computes to '1s ease 0s 1 normal none running none']
+    expected: FAIL
+
+  [Property animation value 'both' computes to '0s ease 0s 1 normal both running none']
+    expected: FAIL
+
--- a/testing/web-platform/meta/css/css-fonts/font-display/font-display-feature-policy-02.tentative.html.ini
+++ b/testing/web-platform/meta/css/css-fonts/font-display/font-display-feature-policy-02.tentative.html.ini
@@ -1,4 +1,2 @@
 [font-display-feature-policy-02.tentative.html]
-  expected:
-    if os == "linux": PASS
-    FAIL
+  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-fonts/parsing/font-variant-valid.html.ini
@@ -0,0 +1,10 @@
+[font-variant-valid.html]
+  [e.style['font-variant'\] = "common-ligatures discretionary-ligatures historical-ligatures contextual small-caps stylistic(flowing) lining-nums proportional-nums diagonal-fractions ordinal slashed-zero jis78 full-width ruby sub" should set the property value]
+    expected: FAIL
+
+  [e.style['font-variant'\] = "annotation(flowing) ornaments(flowing) swash(flowing) character-variant(flowing) styleset(flowing) historical-forms stylistic(flowing)" should set the property value]
+    expected: FAIL
+
+  [e.style['font-variant'\] = "super proportional-width jis83 stacked-fractions tabular-nums oldstyle-nums historical-forms all-small-caps no-contextual no-historical-ligatures no-discretionary-ligatures no-common-ligatures" should set the property value]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-transitions/parsing/transition-computed.html.ini
@@ -0,0 +1,22 @@
+[transition-computed.html]
+  [Property transition value '1s -3s, cubic-bezier(0, -2, 1, 3) top' computes to 'all 1s ease -3s, top 0s cubic-bezier(0, -2, 1, 3) 0s']
+    expected: FAIL
+
+  [Property transition value 'cubic-bezier(0, -2, 1, 3)' computes to 'all 0s cubic-bezier(0, -2, 1, 3) 0s']
+    expected: FAIL
+
+  [Property transition value '1s' computes to 'all 1s ease 0s']
+    expected: FAIL
+
+  [Property transition value '1s -3s' computes to 'all 1s ease -3s']
+    expected: FAIL
+
+  [Property transition value 'none' computes to 'none 0s ease 0s']
+    expected: FAIL
+
+  [Property transition value 'top' computes to 'top 0s ease 0s']
+    expected: FAIL
+
+  [Property transition value '1s -3s cubic-bezier(0, -2, 1, 3) top' computes to 'top 1s cubic-bezier(0, -2, 1, 3) -3s']
+    expected: FAIL
+
--- a/testing/web-platform/meta/css/css-ui/appearance-auto-001.html.ini
+++ b/testing/web-platform/meta/css/css-ui/appearance-auto-001.html.ini
@@ -1,8 +1,7 @@
 [appearance-auto-001.html]
   disabled:
     if debug and (os == "win") and (version == "6.1.7601"): https://bugzilla.mozilla.org/show_bug.cgi?id=1560360
   expected:
     if (os == "win") and (processor == "x86"): FAIL
-    if (os == "win") and (processor == "aarch64"): ["PASS", "FAIL"]
+    if (os == "win") and (processor == "aarch64"): ["FAIL", "PASS"]
     if (os == "win") and (processor == "x86_64"): FAIL
-
--- a/testing/web-platform/meta/css/css-ui/appearance-textfield-001.html.ini
+++ b/testing/web-platform/meta/css/css-ui/appearance-textfield-001.html.ini
@@ -1,5 +1,6 @@
 [appearance-textfield-001.html]
   expected:
-    if (os == "win") and (processor == "x86_64"): [FAIL, PASS]
     if (os == "win") and (processor == "x86") and debug: ["PASS", "FAIL"]
-    if (os == "win") and (processor == "x86") and not debug: ["FAIL", "PASS"]
+    if (os == "win") and (processor == "x86") and not debug: ["PASS", "FAIL"]
+    if (os == "win") and (processor == "x86_64"): ["FAIL", "PASS"]
+    if (os == "win") and (processor == "aarch64"): FAIL
--- a/testing/web-platform/meta/css/css-variables/variable-presentation-attribute.html.ini
+++ b/testing/web-platform/meta/css/css-variables/variable-presentation-attribute.html.ini
@@ -1,13 +1,13 @@
 [variable-presentation-attribute.html]
   [Testing 'clip' on '#test4'.]
     expected:
+      if os == "android": FAIL
       if os == "linux": FAIL
-      if os == "android": FAIL
 
   [Testing 'alignment-baseline'.]
     expected: FAIL
 
   [Testing 'baseline-shift'.]
     expected: FAIL
 
   [Testing 'color-interpolation-filters'.]
--- a/testing/web-platform/meta/css/cssom-view/position-sticky-root-scroller-with-scroll-behavior.html.ini
+++ b/testing/web-platform/meta/css/cssom-view/position-sticky-root-scroller-with-scroll-behavior.html.ini
@@ -1,7 +1,8 @@
 [position-sticky-root-scroller-with-scroll-behavior.html]
   [Sticky elements work with the root (document) scroller]
     bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1556685
     expected:
+      if (os == "linux") and webrender and debug: ["PASS", "FAIL"]
       if (os == "linux") and webrender and not debug: ["PASS", "FAIL"]
       if os == "android": FAIL
 
--- a/testing/web-platform/meta/css/cssom-view/scroll-behavior-default-css.html.ini
+++ b/testing/web-platform/meta/css/cssom-view/scroll-behavior-default-css.html.ini
@@ -1,6 +1,7 @@
 [scroll-behavior-default-css.html]
   [Smooth scrolling of an element with default scroll-behavior]
     expected:
-      if webrender and (os == "linux") and not debug: [PASS, FAIL]
+      if (os == "linux") and webrender and not debug: ["PASS", "FAIL"]
+      if (os == "linux") and webrender and debug: ["PASS", "FAIL"]
       if (os == "android") and debug: ["PASS", "FAIL"]
 
--- a/testing/web-platform/meta/css/cssom-view/scroll-behavior-main-frame-root.html.ini
+++ b/testing/web-platform/meta/css/cssom-view/scroll-behavior-main-frame-root.html.ini
@@ -1,135 +1,136 @@
 [scroll-behavior-main-frame-root.html]
   disabled:
     if (os == "android") and not e10s: https://bugzilla.mozilla.org/show_bug.cgi?id=1499003
   [Main frame with smooth scroll-behavior ; scrollBy() with smooth behavior]
     expected:
-      if (os == "android") and e10s: FAIL
+      if os == "android": FAIL
 
   [Main frame with auto scroll-behavior ; scroll() with default behavior]
     expected:
-      if (os == "android") and e10s: FAIL
+      if os == "android": FAIL
 
   [Main frame with smooth scroll-behavior ; scroll() with auto behavior]
     expected:
-      if (os == "android") and e10s: FAIL
+      if os == "android": FAIL
 
   [Main frame with smooth scroll-behavior ; scroll() with default behavior]
     expected:
-      if (os == "android") and e10s: FAIL
+      if os == "android": FAIL
 
   [Main frame with auto scroll-behavior ; scrollTo() with auto behavior]
     expected:
-      if (os == "android") and e10s: FAIL
+      if os == "android": FAIL
 
   [Main frame with auto scroll-behavior ; scrollTo() with smooth behavior]
     expected:
-      if (os == "android") and e10s: FAIL
+      if os == "android": FAIL
 
   [Main frame with auto scroll-behavior ; scrollIntoView() with auto behavior]
     expected:
-      if (os == "android") and e10s: FAIL
+      if os == "android": FAIL
 
   [Main frame with smooth scroll-behavior ; scrollTo() with auto behavior]
     expected:
-      if (os == "android") and e10s: FAIL
+      if os == "android": FAIL
 
   [Main frame with smooth scroll-behavior ; scrollBy() with default behavior]
     expected:
-      if (os == "android") and e10s: FAIL
+      if os == "android": FAIL
 
   [Main frame with smooth scroll-behavior ; scrollIntoView() with auto behavior]
     expected:
-      if (os == "android") and e10s: FAIL
+      if os == "android": FAIL
 
   [Main frame with auto scroll-behavior ; scrollBy() with auto behavior]
     expected:
-      if (os == "android") and e10s: FAIL
+      if os == "android": FAIL
 
   [Aborting an ongoing smooth scrolling on the main frame with another smooth scrolling]
     expected:
-      if (os == "android") and e10s: FAIL
+      if os == "android": FAIL
 
   [Main frame with auto scroll-behavior ; scrollTo() with instant behavior]
     expected:
-      if (os == "android") and e10s: FAIL
+      if os == "android": FAIL
 
   [Main frame with auto scroll-behavior ; scrollTo() with default behavior]
     expected:
-      if (os == "android") and e10s: FAIL
+      if os == "android": FAIL
 
   [Main frame with auto scroll-behavior ; scroll() with instant behavior]
     expected:
-      if (os == "android") and e10s: FAIL
+      if os == "android": FAIL
 
   [Main frame with auto scroll-behavior ; scrollIntoView() with smooth behavior]
     expected:
-      if (os == "android") and e10s: FAIL
+      if os == "android": FAIL
 
   [Main frame with smooth scroll-behavior ; scrollTo() with smooth behavior]
     expected:
-      if (os == "android") and e10s: FAIL
+      if os == "android": FAIL
 
   [Main frame with smooth scroll-behavior ; scrollTo() with instant behavior]
     expected:
-      if (os == "android") and e10s: FAIL
+      if os == "android": FAIL
 
   [Main frame with auto scroll-behavior ; scrollIntoView() with instant behavior]
     expected:
-      if (os == "android") and e10s: FAIL
+      if os == "android": FAIL
 
   [Main frame with auto scroll-behavior ; scrollBy() with smooth behavior]
     expected:
-      if (os == "android") and e10s: FAIL
+      if os == "android": FAIL
 
   [Main frame with auto scroll-behavior ; scroll() with auto behavior]
     expected:
-      if (os == "android") and e10s: FAIL
+      if os == "android": FAIL
 
   [Main frame with smooth scroll-behavior ; scrollBy() with auto behavior]
     expected:
-      if (os == "android") and e10s: FAIL
+      if os == "android": FAIL
 
   [Main frame with auto scroll-behavior ; scrollBy() with instant behavior]
     expected:
-      if (os == "android") and e10s: FAIL
+      if os == "android": FAIL
 
   [Main frame with auto scroll-behavior ; scrollBy() with default behavior]
     expected:
-      if (os == "android") and e10s: FAIL
+      if os == "android": FAIL
 
   [Main frame with smooth scroll-behavior ; scrollBy() with instant behavior]
     expected:
-      if (os == "android") and e10s: FAIL
+      if os == "android": FAIL
 
   [Main frame with smooth scroll-behavior ; scroll() with smooth behavior]
     expected:
-      if (os == "android") and e10s: FAIL
+      if os == "android": FAIL
 
   [Main frame with smooth scroll-behavior ; scrollIntoView() with default behavior]
     expected:
-      if (os == "android") and e10s: FAIL
+      if os == "android": FAIL
 
   [Main frame with smooth scroll-behavior ; scrollTo() with default behavior]
     expected:
-      if (os == "android") and e10s: FAIL
+      if os == "android": FAIL
 
   [Main frame with smooth scroll-behavior ; scroll() with instant behavior]
     expected:
-      if (os == "android") and e10s: FAIL
+      if os == "android": FAIL
 
   [Main frame with smooth scroll-behavior ; scrollIntoView() with smooth behavior]
     expected:
-      if (os == "android") and e10s: FAIL
+      if os == "android": FAIL
 
   [Main frame with auto scroll-behavior ; scrollIntoView() with default behavior]
     expected:
-      if (os == "android") and e10s: FAIL
+      if os == "android": FAIL
 
   [Main frame with smooth scroll-behavior ; scrollIntoView() with instant behavior]
     expected:
-      if (os == "android") and e10s: FAIL
+      if os == "android": FAIL
 
   [Main frame with auto scroll-behavior ; scroll() with smooth behavior]
     expected:
-      if (os == "android") and e10s: FAIL
+      if (os == "linux") and webrender and debug: ["PASS", "FAIL"]
+      if os == "android": FAIL
 
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/cssom-view/scroll-behavior-main-frame-window.html.ini
@@ -0,0 +1,9 @@
+[scroll-behavior-main-frame-window.html]
+  [Main frame with smooth scroll-behavior ; scroll() with default behavior]
+    expected:
+      if webrender and (os == "linux") and debug: ["PASS", "FAIL"]
+
+  [Main frame with auto scroll-behavior ; scroll() with smooth behavior]
+    expected:
+      if webrender and (os == "linux") and debug: ["PASS", "FAIL"]
+
--- a/testing/web-platform/meta/encrypted-media/clearkey-mp4-playback-temporary-multikey.https.html.ini
+++ b/testing/web-platform/meta/encrypted-media/clearkey-mp4-playback-temporary-multikey.https.html.ini
@@ -1,6 +1,9 @@
 [clearkey-mp4-playback-temporary-multikey.https.html]
+  expected:
+    if (os == "win") and (processor == "x86_64") and not webrender and not debug: ["OK", "TIMEOUT"]
   [org.w3.clearkey, temporary, mp4, playback, multikey audio/video]
     expected:
+      if (os == "win") and (processor == "x86_64") and not webrender and not debug: ["PASS", "TIMEOUT"]
       if (os == "win") and (processor == "aarch64"): FAIL
       if os == "android": FAIL
 
--- a/testing/web-platform/meta/fetch/sec-metadata/redirect/redirect-http-upgrade.tentative.sub.html.ini
+++ b/testing/web-platform/meta/fetch/sec-metadata/redirect/redirect-http-upgrade.tentative.sub.html.ini
@@ -32,17 +32,17 @@
       if (os == "win") and debug: [wpt-sync Bug 1565002, https://bugzilla.mozilla.org/show_bug.cgi?id=1568816]
       if (os == "linux") and (processor == "x86_64") and not debug and webrender: wpt-sync Bug 1565002
       if (os == "linux") and (processor == "x86_64") and not debug and not webrender: wpt-sync Bug 1565002
       if (os == "linux") and (processor == "x86_64") and debug and webrender: wpt-sync Bug 1565002
       if (os == "linux") and (processor == "x86_64") and debug and not webrender and not sw-e10s: wpt-sync Bug 1565002
       if (os == "linux") and (processor == "x86_64") and debug and not webrender and sw-e10s: wpt-sync Bug 1565002
       if (os == "mac") and debug: https://bugzilla.mozilla.org/show_bug.cgi?id=1568816
     expected:
-      if os == "linux": ["FAIL", "TIMEOUT"]
+      if os == "linux": ["TIMEOUT", "FAIL"]
       FAIL
 
   [Http upgrade fetch() api => No headers]
     expected: FAIL
 
   [redirect-http-upgrade]
     expected: FAIL
 
--- a/testing/web-platform/meta/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-default-style.html.ini
+++ b/testing/web-platform/meta/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-default-style.html.ini
@@ -1,28 +1,28 @@
 [fieldset-default-style.html]
   [fieldset default style]
     expected: FAIL
 
   [border-left-color]
     expected:
+      if os == "linux": PASS
       if os == "android": PASS
-      if os == "linux": PASS
       FAIL
 
   [border-top-color]
     expected:
+      if os == "linux": PASS
       if os == "android": PASS
-      if os == "linux": PASS
       FAIL
 
   [border-bottom-color]
     expected:
+      if os == "linux": PASS
       if os == "android": PASS
-      if os == "linux": PASS
       FAIL
 
   [border-right-color]
     expected:
       if os == "android": PASS
       if os == "linux": PASS
       FAIL
 
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/html/semantics/embedded-content/media-elements/track/track-element/track-mode-not-changed-by-new-track.html.ini
@@ -0,0 +1,5 @@
+[track-mode-not-changed-by-new-track.html]
+  [A track appended after the initial track configuration does not change other tracks]
+    expected:
+      if (os == "android") and debug: ["PASS", "FAIL"]
+
--- a/testing/web-platform/meta/html/semantics/forms/autofocus/update-the-rendering.html.ini
+++ b/testing/web-platform/meta/html/semantics/forms/autofocus/update-the-rendering.html.ini
@@ -1,4 +1,10 @@
 [update-the-rendering.html]
   ["Flush autofocus candidates" should be happen after the first animation frame callbacks, and before a resize event in the next iteration of window event loop.]
-    expected: [FAIL, PASS]
+    expected:
+      if (os == "linux") and not sw-e10s and (processor == "x86_64") and debug and webrender: ["FAIL", "PASS"]
+      if (os == "linux") and not sw-e10s and (processor == "x86_64") and debug and not webrender: ["PASS", "FAIL"]
+      if (os == "linux") and not sw-e10s and (processor == "x86_64") and not debug: ["FAIL", "PASS"]
+      if (os == "linux") and sw-e10s: ["PASS", "FAIL"]
+      if (os == "win") and debug: ["FAIL", "PASS"]
+      FAIL
 
--- a/testing/web-platform/meta/mathml/relations/html5-tree/integration-point-3.html.ini
+++ b/testing/web-platform/meta/mathml/relations/html5-tree/integration-point-3.html.ini
@@ -1,3 +1,3 @@
 [integration-point-3.html]
   expected:
-    if (processor == "x86") and not debug: [FAIL, PASS]
+    if (processor == "x86") and not debug: ["PASS", "FAIL"]
--- a/testing/web-platform/meta/mozilla-sync
+++ b/testing/web-platform/meta/mozilla-sync
@@ -1,2 +1,2 @@
-local: a7c230cd7c1f0c84cc2b0e49119bbc1785569627
-upstream: 22372be821a57fc1c98e1b2250410368dd3be77b
+local: 383a1471e251243a31f913d97d7e090a48ff1b28
+upstream: e2381a6676f1ae4a491cfbac5805d25d491798a2
--- a/testing/web-platform/meta/pointerevents/pointerlock/pointerevent_movementxy.html.ini
+++ b/testing/web-platform/meta/pointerevents/pointerlock/pointerevent_movementxy.html.ini
@@ -1,8 +1,7 @@
 [pointerevent_movementxy.html]
   expected:
-    if (os == "mac") and debug: [OK, ERROR]
-    if (os == "mac") and not debug: ["OK", "ERROR"]
+    if (os == "mac") and debug: ["OK", "ERROR"]
     [ERROR, OK]
   [mouse pointerevent attributes]
     expected: FAIL
 
--- a/testing/web-platform/meta/pointerevents/pointerlock/pointerevent_movementxy_with_pointerlock.html.ini
+++ b/testing/web-platform/meta/pointerevents/pointerlock/pointerevent_movementxy_with_pointerlock.html.ini
@@ -1,10 +1,9 @@
 [pointerevent_movementxy_with_pointerlock.html]
   [mouse pointerevent movementX/Y with pointerlock test]
     expected:
-      if (os == "win") and (processor == "x86_64") and not webrender and debug: [PASS, FAIL]
-      if (os == "win") and (processor == "x86_64") and webrender: [FAIL, PASS]
-      if (os == "mac") and not debug: [FAIL, PASS]
-      if (os == "win") and (processor == "x86_64") and not debug: ["FAIL", "PASS"]
-      if (os == "mac") and debug: ["FAIL", "PASS"]
+      if (processor == "x86_64") and (os == "linux") and webrender and debug: ["FAIL", "PASS"]
+      if (processor == "x86_64") and (os == "win") and not webrender: ["FAIL", "PASS"]
+      if (processor == "x86_64") and (os == "mac"): ["FAIL", "PASS"]
+      if processor == "aarch64": ["FAIL", "PASS"]
       [PASS, FAIL]
 
--- a/testing/web-platform/meta/pointerevents/pointerlock/pointerevent_pointermove_on_chorded_mouse_button_when_locked.html.ini
+++ b/testing/web-platform/meta/pointerevents/pointerlock/pointerevent_pointermove_on_chorded_mouse_button_when_locked.html.ini
@@ -1,10 +1,8 @@
 [pointerevent_pointermove_on_chorded_mouse_button_when_locked.html]
   [pointer locked pointermove events received for button state changes]
     expected:
       if ccov and (os == "win"): [PASS, FAIL]
-      if (os == "linux") and not sw-e10s and debug and webrender: [FAIL, PASS]
-      if (os == "linux") and not sw-e10s and debug and not webrender: [PASS, FAIL]
-      if (os == "linux") and sw-e10s: [PASS, FAIL]
-      if (os == "linux") and not debug and (processor == "x86_64"): ["PASS", "FAIL"]
-      if (os == "linux") and not debug and (processor == "x86"): ["PASS", "FAIL"]
+      if (os == "linux") and webrender and debug: ["PASS", "FAIL"]
+      if (os == "linux") and webrender and not debug: ["PASS", "FAIL"]
+      if (os == "linux") and not webrender: ["PASS", "FAIL"]
 
--- a/testing/web-platform/meta/proximity/ProximitySensor.https.html.ini
+++ b/testing/web-platform/meta/proximity/ProximitySensor.https.html.ini
@@ -33,8 +33,65 @@
     expected: FAIL
 
   [ProximitySensor: sensor receives suspend / resume notifications when  cross-origin subframe is focused]
     expected: FAIL
 
   [ProximitySensor: throw 'TypeError' if frequency is invalid]
     expected: FAIL
 
+  [ProximitySensor: Test that 'onreading' is called and sensor reading is valid.]
+    expected: FAIL
+
+  [ProximitySensor: no exception is thrown when calling start() on already started sensor.]
+    expected: FAIL
+
+  [ProximitySensor: Test that frequency is capped to allowed maximum.]
+    expected: FAIL
+
+  [ProximitySensor: Test that onerror is sent when permissions are not granted.]
+    expected: FAIL
+
+  [ProximitySensor: throw 'TypeError' if frequency is invalid.]
+    expected: FAIL
+
+  [ProximitySensor: Test that frequency is limited to the minimum supported frequency.]
+    expected: FAIL
+
+  [ProximitySensor: sensor timestamp is updated when time passes.]
+    expected: FAIL
+
+  [ProximitySensor: Test that onerror is sent when sensor is not supported.]
+    expected: FAIL
+
+  [ProximitySensor: Test that sensor can be constructed within an iframe allowed to use feature policy.]
+    expected: FAIL
+
+  [ProximitySensor: Test that fresh reading is fetched on start().]
+    expected: FAIL
+
+  [ProximitySensor: sensor.start() returns undefined.]
+    expected: FAIL
+
+  [ProximitySensor: sensor reading is correct.]
+    expected: FAIL
+
+  [ProximitySensor: Test that frequency is capped to the maximum supported frequency.]
+    expected: FAIL
+
+  [ProximitySensor: sensor.stop() returns undefined.]
+    expected: FAIL
+
+  [ProximitySensor: Test that sensor cannot be constructed within iframe disallowed to use feature policy.]
+    expected: FAIL
+
+  [ProximitySensor: sensor receives suspend / resume notifications when cross-origin subframe is focused.]
+    expected: FAIL
+
+  [ProximitySensor: Test that onerror is send when start() call has failed.]
+    expected: FAIL
+
+  [ProximitySensor: no exception is thrown when calling stop() on already stopped sensor.]
+    expected: FAIL
+
+  [ProximitySensor: frequency hint works.]
+    expected: FAIL
+
--- a/testing/web-platform/meta/resize-observer/observe.html.ini
+++ b/testing/web-platform/meta/resize-observer/observe.html.ini
@@ -1,14 +1,14 @@
 [observe.html]
   expected:
     if webrender and (os == "linux") and debug: ["OK", "TIMEOUT"]
     if webrender and (os == "linux") and not debug: ["OK", "TIMEOUT"]
   [guard]
     expected:
+      if webrender and (os == "linux") and debug: ["PASS", "NOTRUN"]
       if webrender and (os == "linux") and not debug: ["PASS", "NOTRUN"]
-      if webrender and (os == "linux") and debug: ["PASS", "NOTRUN"]
 
   [test6: iframe notifications]
     expected:
       if webrender and (os == "linux") and not debug: ["PASS", "FAIL"]
       if webrender and (os == "linux") and debug: ["PASS", "FAIL"]
 
--- a/testing/web-platform/meta/resource-timing/resource-reload-TAO.sub.html.ini
+++ b/testing/web-platform/meta/resource-timing/resource-reload-TAO.sub.html.ini
@@ -1,11 +1,11 @@
 [resource-reload-TAO.sub.html]
   expected:
-    if (os == "win") and not debug and not webrender and (processor == "x86"): [TIMEOUT, OK]
-    if (os == "win") and not debug and webrender: [TIMEOUT, OK]
+    if (processor == "x86_64") and webrender and (os == "win") and not debug: ["TIMEOUT", "OK"]
+    if (processor == "x86") and (os == "win") and not debug: ["TIMEOUT", "OK"]
     TIMEOUT
   [Test that TAO headers are reused on reloads.]
     expected:
-      if (os == "win") and not debug and not webrender and (processor == "x86"): [TIMEOUT, PASS]
-      if (os == "win") and not debug and webrender: [TIMEOUT, PASS]
+      if (processor == "x86_64") and webrender and (os == "win") and not debug: ["TIMEOUT", "PASS"]
+      if (processor == "x86") and (os == "win") and not debug: ["TIMEOUT", "PASS"]
       TIMEOUT
 
--- a/testing/web-platform/meta/service-workers/service-worker/client-navigate.https.html.ini
+++ b/testing/web-platform/meta/service-workers/service-worker/client-navigate.https.html.ini
@@ -1,31 +1,35 @@
 [client-navigate.https.html]
   disabled:
     if (os == "android") and not e10s: https://bugzilla.mozilla.org/show_bug.cgi?id=1499972
     if (os == "android") and e10s: bug 1550895 (frequently fails on geckoview)
   expected:
     if (os == "linux") and webrender and not debug: ["OK", "TIMEOUT"]
-    if os == "mac": ["OK", "TIMEOUT"]
+    if (os == "mac") and debug: ["OK", "TIMEOUT"]
+    if (os == "mac") and not debug: ["TIMEOUT", "OK"]
   [Frame location should not update on failed mixed-content navigation]
     expected:
-      if (os == "linux") and webrender and not debug: ["PASS", "NOTRUN", "TIMEOUT"]
+      if (os == "linux") and webrender and not debug: ["PASS", "TIMEOUT", "NOTRUN"]
       if (os == "mac") and debug: ["PASS", "TIMEOUT", "NOTRUN"]
-      if (os == "mac") and not debug: ["PASS", "NOTRUN"]
+      if (os == "mac") and not debug: ["NOTRUN", "PASS"]
 
   [Frame location should update on successful navigation]
     expected:
-      if os == "mac": ["PASS", "TIMEOUT"]
+      if (os == "mac") and debug: ["PASS", "TIMEOUT"]
+      if (os == "mac") and not debug: ["TIMEOUT", "PASS"]
 
   [Frame location should not be accessible after cross-origin navigation]
     expected:
-      if os == "mac": ["PASS", "NOTRUN"]
+      if (os == "mac") and debug: ["PASS", "NOTRUN"]
+      if (os == "mac") and not debug: ["NOTRUN", "PASS"]
 
   [Frame location should not be accessible after redirect]
     expected:
-      if os == "mac": ["PASS", "NOTRUN"]
+      if (os == "mac") and not debug: ["NOTRUN", "PASS"]
+      if (os == "mac") and debug: ["PASS", "NOTRUN"]
 
   [Frame location should not update on failed about:blank navigation]
     expected:
       if (os == "linux") and webrender and not debug: ["PASS", "TIMEOUT"]
       if (os == "mac") and debug: ["PASS", "TIMEOUT", "NOTRUN"]
-      if (os == "mac") and not debug: ["PASS", "NOTRUN"]
+      if (os == "mac") and not debug: ["NOTRUN", "PASS"]
 
--- a/testing/web-platform/meta/service-workers/service-worker/fetch-event-respond-with-readable-stream.https.html.ini
+++ b/testing/web-platform/meta/service-workers/service-worker/fetch-event-respond-with-readable-stream.https.html.ini
@@ -1,4 +1,3 @@
 [fetch-event-respond-with-readable-stream.https.html]
   disabled:
-    if os == "android" and not e10s: https://bugzilla.mozilla.org/show_bug.cgi?id=1499972
-
+    if (os == "android") and not e10s: https://bugzilla.mozilla.org/show_bug.cgi?id=1499972
--- a/testing/web-platform/meta/service-workers/service-worker/registration-updateviacache.https.html.ini
+++ b/testing/web-platform/meta/service-workers/service-worker/registration-updateviacache.https.html.ini
@@ -23,10 +23,10 @@
   [register-via-link-header-updateViaCache-none]
     expected: FAIL
 
   [updateViaCache is not updated if register() rejects]
     expected: FAIL
 
   [register-with-updateViaCache-imports-then-imports]
     expected:
-      if (os == "win") and debug and (processor == "x86_64"): ["PASS", "FAIL"]
+      if debug and (os == "win") and (processor == "x86_64"): ["PASS", "FAIL"]
 
--- a/testing/web-platform/meta/service-workers/service-worker/skip-waiting-using-registration.https.html.ini
+++ b/testing/web-platform/meta/service-workers/service-worker/skip-waiting-using-registration.https.html.ini
@@ -1,13 +1,13 @@
 [skip-waiting-using-registration.https.html]
   disabled:
     if (os == "win") and (version == "6.1.7601"): https://bugzilla.mozilla.org/show_bug.cgi?id=1425175
     if os == "linux": https://bugzilla.mozilla.org/show_bug.cgi?id=1425175
   expected:
-    if os == "mac": [OK, FAIL]
-    if os == "android": [OK, FAIL]
+    if os == "mac": ["OK", "FAIL"]
+    if os == "android": ["OK", "FAIL"]
   [Test skipWaiting while a client is using the registration]
     expected:
-      if (os == "mac") and debug: [FAIL, PASS]
-      if (os == "mac") and not debug: [PASS, FAIL]
-      if os == "android": [PASS, FAIL]
+      if (os == "mac") and not debug: ["PASS", "FAIL"]
+      if (os == "mac") and debug: ["PASS", "FAIL"]
+      if os == "android": ["PASS", "FAIL"]
 
--- a/testing/web-platform/meta/service-workers/service-worker/waiting.https.html.ini
+++ b/testing/web-platform/meta/service-workers/service-worker/waiting.https.html.ini
@@ -1,7 +1,6 @@
 [waiting.https.html]
   [waiting is set after installation]
     expected:
-      if webrender and (os == "win") and debug: PASS
       if webrender and (os == "linux"): ["FAIL", "PASS"]
       FAIL
 
--- a/testing/web-platform/meta/signed-exchange/reporting/sxg-reporting-prefetch-cert_parse_error-downgraded.tentative.html.ini
+++ b/testing/web-platform/meta/signed-exchange/reporting/sxg-reporting-prefetch-cert_parse_error-downgraded.tentative.html.ini
@@ -1,21 +1,23 @@
 [sxg-reporting-prefetch-cert_parse_error-downgraded.tentative.html]
   expected:
     if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.14") and (processor == "x86_64") and (bits == 64): TIMEOUT
-    if not debug and (os == "linux") and not webrender and (processor == "x86_64"): [OK, TIMEOUT]
+    if not debug and (os == "linux") and not webrender and (processor == "x86_64"): ["TIMEOUT", "OK"]
     if not debug and (os == "linux") and not webrender and (processor == "x86"): TIMEOUT
+    if not debug and (os == "win") and (processor == "x86"): TIMEOUT
+    if not debug and (os == "win") and (processor == "x86_64"): TIMEOUT
     if not debug and (os == "linux") and webrender: TIMEOUT
     if not debug and (os == "mac"): TIMEOUT
-    if not debug and (os == "win"): TIMEOUT
   [SXG reporting test of sxg.failed downgraded from sxg.cert_parse_error for prefetch.]
     expected:
       if debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): FAIL
       if debug and not webrender and not e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): FAIL
       if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.14") and (processor == "x86_64") and (bits == 64): FAIL
       if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.14") and (processor == "x86_64") and (bits == 64): TIMEOUT
+      if not debug and (os == "linux") and not webrender and (processor == "x86_64"): ["TIMEOUT", "FAIL"]
       if not debug and (os == "linux") and not webrender and (processor == "x86"): TIMEOUT
-      if not debug and (os == "linux") and not webrender and (processor == "x86_64"): [FAIL, TIMEOUT]
+      if not debug and (os == "win") and (processor == "x86_64"): TIMEOUT
+      if not debug and (os == "win") and (processor == "x86"): TIMEOUT
       if not debug and (os == "linux") and webrender: TIMEOUT
       if not debug and (os == "mac"): TIMEOUT
-      if not debug and (os == "win"): TIMEOUT
       FAIL
 
--- a/testing/web-platform/meta/signed-exchange/reporting/sxg-reporting-prefetch-invalid_integrity_header.tentative.html.ini
+++ b/testing/web-platform/meta/signed-exchange/reporting/sxg-reporting-prefetch-invalid_integrity_header.tentative.html.ini
@@ -1,21 +1,23 @@
 [sxg-reporting-prefetch-invalid_integrity_header.tentative.html]
   expected:
     if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.14") and (processor == "x86_64") and (bits == 64): TIMEOUT
     if not debug and (os == "linux") and not webrender and (processor == "x86"): TIMEOUT
-    if not debug and (os == "linux") and not webrender and (processor == "x86_64"): [OK, TIMEOUT]
+    if not debug and (os == "linux") and not webrender and (processor == "x86_64"): ["TIMEOUT", "OK"]
+    if not debug and (os == "win") and (processor == "x86"): TIMEOUT
+    if not debug and (os == "win") and (processor == "x86_64"): TIMEOUT
     if not debug and (os == "linux") and webrender: TIMEOUT
-    if not debug and (os == "win"): TIMEOUT
     if not debug and (os == "mac"): TIMEOUT
   [SXG reporting test of sxg.invalid_integrity_header for prefetch.]
     expected:
       if debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): FAIL
       if debug and not webrender and not e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): FAIL
       if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.14") and (processor == "x86_64") and (bits == 64): FAIL
       if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.14") and (processor == "x86_64") and (bits == 64): TIMEOUT
+      if not debug and (os == "linux") and not webrender and (processor == "x86_64"): ["TIMEOUT", "FAIL"]
       if not debug and (os == "linux") and not webrender and (processor == "x86"): TIMEOUT
-      if not debug and (os == "linux") and not webrender and (processor == "x86_64"): [FAIL, TIMEOUT]
       if not debug and (os == "linux") and webrender: TIMEOUT
-      if not debug and (os == "win"): TIMEOUT
+      if not debug and (os == "win") and (processor == "x86"): TIMEOUT
+      if not debug and (os == "win") and (processor == "x86_64"): TIMEOUT
       if not debug and (os == "mac"): TIMEOUT
       FAIL
 
deleted file mode 100644
--- a/testing/web-platform/meta/streams/readable-streams/floating-point-total-queue-size.any.js.ini
+++ /dev/null
@@ -1,10 +0,0 @@
-[floating-point-total-queue-size.any.worker.html]
-
-[floating-point-total-queue-size.any.sharedworker.html]
-
-[floating-point-total-queue-size.any.serviceworker.html]
-  [floating-point-total-queue-size]
-    expected: FAIL
-
-
-[floating-point-total-queue-size.any.html]
--- a/testing/web-platform/meta/svg/animations/correct-events-for-short-animations-with-syncbases.html.ini
+++ b/testing/web-platform/meta/svg/animations/correct-events-for-short-animations-with-syncbases.html.ini
@@ -1,6 +1,6 @@
 [correct-events-for-short-animations-with-syncbases.html]
   [Correct events for short animations with syncbases]
     expected:
-      if (processor == "x86") and (os == "linux"): PASS
+      if (os == "linux") and (processor == "x86"): PASS
       [PASS, FAIL]
 
--- a/testing/web-platform/meta/svg/animations/slider-switch.html.ini
+++ b/testing/web-platform/meta/svg/animations/slider-switch.html.ini
@@ -1,7 +1,7 @@
 [slider-switch.html]
   [Check correct event bases for onclick]
     expected:
-      if (os == "android") and debug: [PASS, FAIL]
-      if (os == "android") and not debug: [FAIL, PASS]
+      if (processor == "x86_64") and (os == "android") and not debug: ["FAIL", "PASS"]
+      if processor == "aarch64": ["FAIL", "PASS"]
       [PASS, FAIL]
 
--- a/testing/web-platform/meta/svg/shapes/rect-03.svg.ini
+++ b/testing/web-platform/meta/svg/shapes/rect-03.svg.ini
@@ -1,9 +1,3 @@
 [rect-03.svg]
   expected:
-    if (os == "linux") and not webrender: PASS
-    if os == "mac": PASS
-    if (os == "win") and (version == "6.1.7601"): PASS
-    if not webrender and (os == "win") and (version == "10.0.17134"): PASS
-    if (os == "android") and not e10s: PASS
-    if (os == "android") and e10s: PASS
-    FAIL
+    if webrender: FAIL
--- a/testing/web-platform/meta/user-timing/measure.html.ini
+++ b/testing/web-platform/meta/user-timing/measure.html.ini
@@ -1,15 +1,13 @@
 [measure.html]
   [window.performance.getEntriesByName("measure_start_end")[0\].startTime is correct]
     expected:
-      if not debug and (processor == "x86_64") and (os == "linux") and not webrender: [FAIL, PASS]
-      if not debug and (processor == "x86_64") and (os == "win") and not webrender: [PASS, FAIL]
-      if not debug and (os == "linux") and (processor == "x86"): [PASS, FAIL]
-      if not debug and (os == "win"): [PASS, FAIL]
+      if not debug and (os == "linux") and not webrender and (processor == "x86"): ["PASS", "FAIL"]
+      if not debug and (os == "linux") and not webrender and (processor == "x86_64"): ["PASS", "FAIL"]
+      if not debug and (os == "win"): ["PASS", "FAIL"]
 
   [window.performance.getEntriesByName("measure_start_no_end")[0\].startTime is correct]
     expected:
-      if not debug and (processor == "x86_64") and (os == "linux") and not webrender: [FAIL, PASS]
-      if not debug and (processor == "x86_64") and (os == "win") and not webrender: [PASS, FAIL]
-      if not debug and (os == "linux") and (processor == "x86"): [PASS, FAIL]
-      if not debug and (os == "win"): [PASS, FAIL]
+      if not debug and (os == "linux") and not webrender and (processor == "x86"): ["PASS", "FAIL"]
+      if not debug and (os == "linux") and not webrender and (processor == "x86_64"): ["PASS", "FAIL"]
+      if not debug and (os == "win"): ["PASS", "FAIL"]
 
--- a/testing/web-platform/meta/web-locks/query-empty.tentative.https.any.js.ini
+++ b/testing/web-platform/meta/web-locks/query-empty.tentative.https.any.js.ini
@@ -10,16 +10,15 @@
 
 [query-empty.tentative.https.any.sharedworker.html]
   [query() returns dictionary with empty arrays when no locks are held]
     expected: FAIL
 
 
 [query-empty.tentative.https.any.serviceworker.html]
   expected:
-    if (os == "linux") and debug and webrender: [OK, TIMEOUT]
-    if (os == "linux") and debug and not webrender: [OK, TIMEOUT]
+    if (os == "linux") and debug: ["OK", "TIMEOUT"]
   [query() returns dictionary with empty arrays when no locks are held]
     expected: FAIL
 
   [Web Locks API: navigator.locks.query method - no locks held]
     expected: FAIL
 
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/webdriver/tests/take_element_screenshot/user_prompts.py.ini
@@ -0,0 +1,55 @@
+[user_prompts.py]
+  [test_accept_and_notify[capabilities0-prompt-\]]
+    expected: FAIL
+
+  [test_dismiss[capabilities0-alert-None\]]
+    expected: FAIL
+
+  [test_dismiss_and_notify[capabilities0-prompt-None\]]
+    expected: FAIL
+
+  [test_dismiss_and_notify[capabilities0-alert-None\]]
+    expected: FAIL
+
+  [test_dismiss_and_notify[capabilities0-confirm-False\]]
+    expected: FAIL
+
+  [test_default[alert-None\]]
+    expected: FAIL
+
+  [test_accept[capabilities0-confirm-True\]]
+    expected: FAIL
+
+  [test_accept_and_notify[capabilities0-confirm-True\]]
+    expected: FAIL
+
+  [test_accept[capabilities0-alert-None\]]
+    expected: FAIL
+
+  [test_ignore[capabilities0-prompt\]]
+    expected: FAIL
+
+  [test_default[confirm-False\]]
+    expected: FAIL
+
+  [test_ignore[capabilities0-alert\]]
+    expected: FAIL
+
+  [test_ignore[capabilities0-confirm\]]
+    expected: FAIL
+
+  [test_accept_and_notify[capabilities0-alert-None\]]
+    expected: FAIL
+
+  [test_dismiss[capabilities0-prompt-None\]]
+    expected: FAIL
+
+  [test_accept[capabilities0-prompt-\]]
+    expected: FAIL
+
+  [test_default[prompt-None\]]
+    expected: FAIL
+
+  [test_dismiss[capabilities0-confirm-False\]]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/webdriver/tests/take_screenshot/user_prompts.py.ini
@@ -0,0 +1,55 @@
+[user_prompts.py]
+  [test_accept_and_notify[capabilities0-prompt-\]]
+    expected: FAIL
+
+  [test_dismiss[capabilities0-alert-None\]]
+    expected: FAIL
+
+  [test_dismiss_and_notify[capabilities0-prompt-None\]]
+    expected: FAIL
+
+  [test_dismiss_and_notify[capabilities0-alert-None\]]
+    expected: FAIL
+
+  [test_dismiss_and_notify[capabilities0-confirm-False\]]
+    expected: FAIL
+
+  [test_default[alert-None\]]
+    expected: FAIL
+
+  [test_accept[capabilities0-confirm-True\]]
+    expected: FAIL
+
+  [test_accept_and_notify[capabilities0-confirm-True\]]
+    expected: FAIL
+
+  [test_accept[capabilities0-alert-None\]]
+    expected: FAIL
+
+  [test_ignore[capabilities0-prompt\]]
+    expected: FAIL
+
+  [test_default[confirm-False\]]
+    expected: FAIL
+
+  [test_ignore[capabilities0-alert\]]
+    expected: FAIL
+
+  [test_ignore[capabilities0-confirm\]]
+    expected: FAIL
+
+  [test_accept_and_notify[capabilities0-alert-None\]]
+    expected: FAIL
+
+  [test_dismiss[capabilities0-prompt-None\]]
+    expected: FAIL
+
+  [test_accept[capabilities0-prompt-\]]
+    expected: FAIL
+
+  [test_default[prompt-None\]]
+    expected: FAIL
+
+  [test_dismiss[capabilities0-confirm-False\]]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/webrtc-identity/idlharness.https.window.js.ini
@@ -0,0 +1,55 @@
+[idlharness.https.window.html]
+  [MediaStreamTrack interface: track must inherit property "isolated" with the proper type]
+    expected: FAIL
+
+  [RTCIdentityAssertion interface object name]
+    expected: FAIL
+
+  [RTCIdentityAssertion interface: new RTCIdentityAssertion('idp', 'name') must inherit property "idp" with the proper type]
+    expected: FAIL
+
+  [RTCIdentityAssertion must be primary interface of new RTCIdentityAssertion('idp', 'name')]
+    expected: FAIL
+
+  [RTCIdentityAssertion interface: attribute name]
+    expected: FAIL
+
+  [RTCIdentityAssertion interface: existence and properties of interface prototype object's @@unscopables property]
+    expected: FAIL
+
+  [MediaStreamTrack interface: attribute isolated]
+    expected: FAIL
+
+  [MediaStreamTrack interface: track must inherit property "onisolationchange" with the proper type]
+    expected: FAIL
+
+  [RTCIdentityAssertion interface: existence and properties of interface object]
+    expected: FAIL
+
+  [RTCIdentityAssertion interface object length]
+    expected: FAIL
+
+  [RTCIdentityAssertion interface: existence and properties of interface prototype object's "constructor" property]
+    expected: FAIL
+
+  [RTCIdentityAssertion interface: existence and properties of interface prototype object]
+    expected: FAIL
+
+  [RTCPeerConnection interface: attribute idpErrorInfo]
+    expected: FAIL
+
+  [RTCIdentityAssertion interface: new RTCIdentityAssertion('idp', 'name') must inherit property "name" with the proper type]
+    expected: FAIL
+
+  [RTCPeerConnection interface: new RTCPeerConnection() must inherit property "idpErrorInfo" with the proper type]
+    expected: FAIL
+
+  [MediaStreamTrack interface: attribute onisolationchange]
+    expected: FAIL
+
+  [Stringification of new RTCIdentityAssertion('idp', 'name')]
+    expected: FAIL
+
+  [RTCIdentityAssertion interface: attribute idp]
+    expected: FAIL
+
deleted file mode 100644
--- a/testing/web-platform/meta/webrtc-stats/idlharness.window.js.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[idlharness.window.html]
-  [idl_test validation]
-    expected: FAIL
-
--- a/testing/web-platform/meta/webrtc/idlharness.https.window.js.ini
+++ b/testing/web-platform/meta/webrtc/idlharness.https.window.js.ini
@@ -588,11 +588,8 @@
     expected: FAIL
 
   [RTCPeerConnection interface: operation setLocalDescription(RTCSessionDescriptionInit)]
     expected: FAIL
 
   [RTCPeerConnection interface: operation setLocalDescription(RTCSessionDescriptionInit, VoidFunction, RTCPeerConnectionErrorCallback)]
     expected: FAIL
 
-  [idl_test validation]
-    expected: FAIL
-
--- a/testing/web-platform/meta/websockets/stream-tentative/close.any.js.ini
+++ b/testing/web-platform/meta/websockets/stream-tentative/close.any.js.ini
@@ -250,16 +250,19 @@
     expected: FAIL
 
   [aborting the writable should result in a clean close]
     expected: FAIL
 
   [unspecified close code should send empty Close frame]
     expected: FAIL
 
+  [close]
+    expected: FAIL
+
 
 [close.any.sharedworker.html]
   [unspecified close code with non-empty reason should set code to 1000]
     expected: FAIL
 
   [canceling the readable with an invalid code should be ignored]
     expected: FAIL
 
--- a/testing/web-platform/meta/webusb/idlharness.https.any.js.ini
+++ b/testing/web-platform/meta/webusb/idlharness.https.any.js.ini
@@ -1502,16 +1502,37 @@
     expected: FAIL
 
   [USBIsochronousOutTransferResult interface: existence and properties of interface prototype object's "constructor" property]
     expected: FAIL
 
   [USBConfiguration interface object name]
     expected: FAIL
 
+  [USBPermissionResult interface: existence and properties of interface prototype object's "constructor" property]
+    expected: FAIL
+
+  [USBPermissionResult interface: attribute devices]
+    expected: FAIL
+
+  [USBPermissionResult interface object length]
+    expected: FAIL
+
+  [USBPermissionResult interface: existence and properties of interface prototype object's @@unscopables property]
+    expected: FAIL
+
+  [USBPermissionResult interface object name]
+    expected: FAIL
+
+  [USBPermissionResult interface: existence and properties of interface object]
+    expected: FAIL
+
+  [USBPermissionResult interface: existence and properties of interface prototype object]
+    expected: FAIL
+
 
 [idlharness.https.any.sharedworker.html]
   [WebUSB IDL test]
     expected: FAIL
 
   [idlharness]
     expected: FAIL
 
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/webxr/xrDevice_isSessionSupported_immersive.https.html.ini
@@ -0,0 +1,4 @@
+[xrDevice_isSessionSupported_immersive.https.html]
+  [isSessionSupported resolves to true when immersive options supported]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/webxr/xrDevice_isSessionSupported_immersive_unsupported.https.html.ini
@@ -0,0 +1,4 @@
+[xrDevice_isSessionSupported_immersive_unsupported.https.html]
+  [isSessionSupported resolves to false when options not supported]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/webxr/xrDevice_isSessionSupported_inline.https.html.ini
@@ -0,0 +1,4 @@
+[xrDevice_isSessionSupported_inline.https.html]
+  [isSessionSupported resolves to true when inline options supported]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/webxr/xrReferenceSpace_originOffset_viewer.https.html.ini
@@ -0,0 +1,5 @@
+[xrReferenceSpace_originOffset_viewer.https.html]
+  expected: ERROR
+  [Creating XRReferenceSpace origin offset off of `viewer` space works.]
+    expected: FAIL
+
deleted file mode 100644
--- a/testing/web-platform/meta/workers/Worker-replace-self.any.js.ini
+++ /dev/null
@@ -1,8 +0,0 @@
-[Worker-replace-self.any.sharedworker.html]
-
-[Worker-replace-self.any.worker.html]
-
-[Worker-replace-self.any.serviceworker.html]
-  [Worker-replace-self]
-    expected: FAIL
-
--- a/testing/web-platform/tests/.taskcluster.yml
+++ b/testing/web-platform/tests/.taskcluster.yml
@@ -277,17 +277,16 @@ tasks:
             pull-request
         - name: resources/ tests
           description: >-
             Tests for testharness.js and other files in resources/
           script: >-
             export TOXENV=py27;
             ./tools/ci/run_tc.py \
               --browser=firefox \
-              --channel=experimental \
               --xvfb \
               resources_unittest \
               tools/ci/ci_resources_unittest.sh
           conditions:
             pull-request
         - name: infrastructure/ tests
           description: >-
             Smoketests for wptrunner
--- a/testing/web-platform/tests/common/security-features/tools/format_spec_src_json.py
+++ b/testing/web-platform/tests/common/security-features/tools/format_spec_src_json.py
@@ -1,17 +1,19 @@
 import collections
 import json
 import os
 
 
 def main():
     '''Formats spec.src.json.'''
     script_directory = os.path.dirname(os.path.abspath(__file__))
-    for dir in ['mixed-content', 'referrer-policy']:
+    for dir in [
+            'mixed-content', 'referrer-policy', 'upgrade-insecure-requests'
+    ]:
         filename = os.path.join(script_directory, '..', '..', '..', dir,
                                 'spec.src.json')
         spec = json.load(
             open(filename, 'r'), object_pairs_hook=collections.OrderedDict)
         with open(filename, 'w') as f:
             f.write(json.dumps(spec, indent=2, separators=(',', ': ')))
             f.write('\n')
 
--- a/testing/web-platform/tests/common/security-features/tools/generate.py
+++ b/testing/web-platform/tests/common/security-features/tools/generate.py
@@ -105,16 +105,28 @@ def handle_deliveries(policy_deliveries)
             if delivery.delivery_type == 'meta':
                 meta += '<meta http-equiv="Content-Security-Policy" ' + \
                        'content="block-all-mixed-content">'
             elif delivery.delivery_type == 'http-rp':
                 headers['Content-Security-Policy'] = 'block-all-mixed-content'
             else:
                 raise Exception(
                     'Invalid delivery_type: %s' % delivery.delivery_type)
+        elif delivery.key == 'upgradeInsecureRequests':
+            # https://w3c.github.io/webappsec-upgrade-insecure-requests/#delivery
+            assert (delivery.value == 'upgrade')
+            if delivery.delivery_type == 'meta':
+                meta += '<meta http-equiv="Content-Security-Policy" ' + \
+                       'content="upgrade-insecure-requests">'
+            elif delivery.delivery_type == 'http-rp':
+                headers[
+                    'Content-Security-Policy'] = 'upgrade-insecure-requests'
+            else:
+                raise Exception(
+                    'Invalid delivery_type: %s' % delivery.delivery_type)
         else:
             raise Exception('Invalid delivery_key: %s' % delivery.key)
     return {"meta": meta, "headers": headers}
 
 
 def generate_selection(spec_json, config, selection, spec,
                        test_html_template_basename):
     test_filename = get_test_filename(config, selection)
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/compression/decompression-bad-chunks.any.js
@@ -0,0 +1,70 @@
+// META: global=worker
+
+'use strict';
+
+const badChunks = [
+  {
+    name: 'undefined',
+    value: undefined
+  },
+  {
+    name: 'null',
+    value: null
+  },
+  {
+    name: 'numeric',
+    value: 3.14
+  },
+  {
+    name: 'object, not BufferSource',
+    value: {}
+  },
+  {
+    name: 'array',
+    value: [65]
+  },
+  {
+    name: 'SharedArrayBuffer',
+    // Use a getter to postpone construction so that all tests don't fail where
+    // SharedArrayBuffer is not yet implemented.
+    get value() {
+      return new SharedArrayBuffer();
+    }
+  },
+  {
+    name: 'shared Uint8Array',
+    get value() {
+      return new Uint8Array(new SharedArrayBuffer())
+    }
+  },
+  {
+    name: 'invalid deflate bytes',
+    value: new Uint8Array([0, 156, 75, 173, 40, 72, 77, 46, 73, 77, 81, 200, 47, 45, 41, 40, 45, 1, 0, 48, 173, 6, 36])
+  },
+  {
+    name: 'invalid gzip bytes',
+    value: new Uint8Array([0, 139, 8, 0, 0, 0, 0, 0, 0, 3, 75, 173, 40, 72, 77, 46, 73, 77, 81, 200, 47, 45, 41, 40, 45, 1, 0, 176, 1, 57, 179, 15, 0, 0, 0])
+  },
+];
+
+for (const chunk of badChunks) {
+  promise_test(async t => {
+    const ds = new DecompressionStream('gzip');
+    const reader = ds.readable.getReader();
+    const writer = ds.writable.getWriter();
+    const writePromise = writer.write(chunk.value);
+    const readPromise = reader.read();
+    await promise_rejects(t, new TypeError(), writePromise, 'write should reject');
+    await promise_rejects(t, new TypeError(), readPromise, 'read should reject');
+  }, `chunk of type ${chunk.name} should error the stream for gzip`);
+
+  promise_test(async t => {
+    const ds = new DecompressionStream('deflate');
+    const reader = ds.readable.getReader();
+    const writer = ds.writable.getWriter();
+    const writePromise = writer.write(chunk.value);
+    const readPromise = reader.read();
+    await promise_rejects(t, new TypeError(), writePromise, 'write should reject');
+    await promise_rejects(t, new TypeError(), readPromise, 'read should reject');
+  }, `chunk of type ${chunk.name} should error the stream for deflate`);
+}
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/compression/decompression-constructor-error.any.js
@@ -0,0 +1,15 @@
+// META: global=worker
+
+'use strict';
+
+test(t => {
+  assert_throws(new TypeError(), () => new DecompressionStream('a'), 'constructor should throw');
+}, '"a" should cause the constructor to throw');
+
+test(t => {
+  assert_throws(new TypeError(), () => new DecompressionStream(), 'constructor should throw');
+}, 'no input should cause the constructor to throw');
+
+test(t => {
+  assert_throws(new Error(), () => new DecompressionStream({ toString() { throw Error(); } }), 'constructor should throw');
+}, 'non-string input should cause the constructor to throw');
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/compression/decompression-correct-input.any.js
@@ -0,0 +1,26 @@
+// META: global=worker
+
+'use strict';
+
+const deflateChunkValue = new Uint8Array([120, 156, 75, 173, 40, 72, 77, 46, 73, 77, 81, 200, 47, 45, 41, 40, 45, 1, 0, 48, 173, 6, 36]);
+const gzipChunkValue = new Uint8Array([31, 139, 8, 0, 0, 0, 0, 0, 0, 3, 75, 173, 40, 72, 77, 46, 73, 77, 81, 200, 47, 45, 41, 40, 45, 1, 0, 176, 1, 57, 179, 15, 0, 0, 0]);
+const trueChunkValue = new TextEncoder().encode('expected output');
+
+promise_test(async t => {
+    const ds = new DecompressionStream('deflate');
+    const reader = ds.readable.getReader();
+    const writer = ds.writable.getWriter();
+    const writePromise = writer.write(deflateChunkValue);
+    const { done, value } = await reader.read();
+    assert_array_equals(Array.from(value), trueChunkValue, "value should match");
+}, 'decompressing deflated input should work');
+
+
+promise_test(async t => {
+    const ds = new DecompressionStream('gzip');
+    const reader = ds.readable.getReader();
+    const writer = ds.writable.getWriter();
+    const writePromise = writer.write(gzipChunkValue);
+    const { done, value } = await reader.read();
+    assert_array_equals(Array.from(value), trueChunkValue, "value should match");
+}, 'decompressing gzip input should work');
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/compression/decompression-empty-input.any.js
@@ -0,0 +1,30 @@
+// META: global=worker
+
+'use strict';
+
+const gzipEmptyValue = new Uint8Array([31, 139, 8, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0]);
+const deflateEmptyValue = new Uint8Array([120, 156, 3, 0, 0, 0, 0, 1]);
+
+promise_test(async t => {
+  const ds = new DecompressionStream('gzip');
+  const reader = ds.readable.getReader();
+  const writer = ds.writable.getWriter();
+  const writePromise = writer.write(gzipEmptyValue);
+  writer.close();
+  const { value, done } = await reader.read();
+  assert_true(done, "read() should set done");
+  assert_equals(value, undefined, "value should be undefined");
+  await writePromise;
+}, 'decompressing gzip empty input should work');
+
+promise_test(async t => {
+  const ds = new DecompressionStream('deflate');
+  const reader = ds.readable.getReader();
+  const writer = ds.writable.getWriter();
+  const writePromise = writer.write(deflateEmptyValue);
+  writer.close();
+  const { value, done } = await reader.read();
+  assert_true(done, "read() should set done");
+  assert_equals(value, undefined, "value should be undefined");
+  await writePromise;
+}, 'decompressing deflate empty input should work');
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/compression/decompression-split-chunk.any.js
@@ -0,0 +1,44 @@
+// META: global=worker
+
+'use strict';
+
+const compressedBytesWithDeflate = new Uint8Array([120, 156, 75, 173, 40, 72, 77, 46, 73, 77, 81, 200, 47, 45, 41, 40, 45, 1, 0, 48, 173, 6, 36]);
+const compressedBytesWithGzip = new Uint8Array([31, 139, 8, 0, 0, 0, 0, 0, 0, 3, 75, 173, 40, 72, 77, 46, 73, 77, 81, 200, 47, 45, 41, 40, 45, 1, 0, 176, 1, 57, 179, 15, 0, 0, 0]);
+const expectedChunkValue = new TextEncoder().encode('expected output');
+
+async function decompressArrayBuffer(input, format, chunkSize) {
+  const ds = new DecompressionStream(format);
+  const reader = ds.readable.getReader();
+  const writer = ds.writable.getWriter();
+  for (let beginning = 0; beginning < input.length; beginning += chunkSize) {
+    writer.write(input.slice(beginning, beginning + chunkSize));
+  }
+  writer.close();
+  const out = [];
+  let totalSize = 0;
+  while (true) {
+    const { value, done } = await reader.read();
+    if (done) break;
+    out.push(value);
+    totalSize += value.byteLength;
+  }
+  const concatenated = new Uint8Array(totalSize);
+  let offset = 0;
+  for (const array of out) {
+    concatenated.set(array, offset);
+    offset += array.byteLength;
+  }
+  return concatenated;
+}
+
+for (let chunkSize = 1; chunkSize < 16; ++chunkSize) {
+  promise_test(async t => {
+    const decompressedData = await decompressArrayBuffer(compressedBytesWithDeflate, 'deflate', chunkSize);
+    assert_array_equals(decompressedData, expectedChunkValue, "value should match");
+  }, `decompressing splitted chunk into pieces of size ${chunkSize} should work in deflate`);
+
+  promise_test(async t => {
+    const decompressedData = await decompressArrayBuffer(compressedBytesWithGzip, 'gzip', chunkSize);
+    assert_array_equals(decompressedData, expectedChunkValue, "value should match");
+  }, `decompressing splitted chunk into pieces of size ${chunkSize} should work in gzip`);
+}
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/compression/decompression-uint8array-output.any.js
@@ -0,0 +1,26 @@
+// META: global=worker
+
+'use strict';
+
+const deflateChunkValue = new Uint8Array([120, 156, 75, 173, 40, 72, 77, 46, 73, 77, 81, 200, 47, 45, 41, 40, 45, 1, 0, 48, 173, 6, 36]);
+const gzipChunkValue = new Uint8Array([31, 139, 8, 0, 0, 0, 0, 0, 0, 3, 75, 173, 40, 72, 77, 46, 73, 77, 81, 200, 47, 45, 41, 40, 45, 1, 0, 176, 1, 57, 179, 15, 0, 0, 0]);
+
+promise_test(async t => {
+  const ds = new DecompressionStream('deflate');
+  const reader = ds.readable.getReader();
+  const writer = ds.writable.getWriter();
+  const writePromise = writer.write(deflateChunkValue);
+  const { value } = await reader.read();
+  assert_equals(value.constructor, Uint8Array, "type should match");
+  await writePromise;
+}, 'decompressing deflated output should give Uint8Array chunks');
+
+promise_test(async t => {
+  const ds = new DecompressionStream('gzip');
+  const reader = ds.readable.getReader();
+  const writer = ds.writable.getWriter();
+  const writePromise = writer.write(gzipChunkValue);
+  const { value } = await reader.read();
+  assert_equals(value.constructor, Uint8Array, "type should match");
+  await writePromise;
+}, 'decompressing gzip output should give Uint8Array chunks');
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/content-security-policy/frame-ancestors/frame-ancestors-from-serviceworker.https.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <script src="/resources/testharness.js"></script>
+  <script src="/resources/testharnessreport.js"></script>
+  <script src="/service-workers/service-worker/resources/test-helpers.sub.js"></script>
+</head>
+<body>
+  <script>
+    var t = async_test("A 'frame-ancestors' CSP directive set from a serviceworker response with a value 'none' should block rendering.");
+
+    // Register service worker.
+    var worker = 'support/service-worker.js';
+    var scope = 'support/service-worker/';
+    service_worker_unregister_and_register(t, worker, scope)
+      .then(registration => wait_for_state(t, registration.installing, 'activated'))
+      .then(() => {
+        // Load iframe.
+        var iframe = document.createElement("iframe");
+        function iframeLoaded(ev) {
+          var failed = false;
+          try {
+            ev.target.contentWindow.location.href;
+            failed = true;
+          } catch (ex) {}
+          t.step_func_done(() => assert_false(failed, "The IFrame should have been blocked. It wasn't."))();
+        };
+        iframe.addEventListener("load", iframeLoaded);
+        iframe.addEventListener("error", iframeLoaded);
+        iframe.src = "/content-security-policy/frame-ancestors/support/service-worker/frame-ancestors-none.html";
+        document.body.appendChild(iframe);
+      });
+  </script>
+</body>
+</html>
+
--- a/testing/web-platform/tests/content-security-policy/frame-ancestors/report-blocked-frame.sub.html
+++ b/testing/web-platform/tests/content-security-policy/frame-ancestors/report-blocked-frame.sub.html
@@ -1,10 +1,11 @@
 <!DOCTYPE html>
 <html>
+<meta name="timeout" content="long">
 <head>
   <script src="/resources/testharness.js"></script>
   <script src="/resources/testharnessreport.js"></script>
   <title>Blocked frames are reported correctly</title>
 </head>
 <body>
   <iframe src="support/content-security-policy.sub.html?policy=report-uri%20../../support/report.py%3Fop=put%26reportID={{$id:uuid()}}%3B%20frame-ancestors%20'none'"></iframe>
   <script async defer src="../support/checkReport.sub.js?reportField=violated-directive&reportValue=frame-ancestors%20'none'&reportID={{$id}}"></script>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/content-security-policy/frame-ancestors/support/service-worker.js
@@ -0,0 +1,10 @@
+self.onfetch = e => {
+  e.respondWith(function() {
+    return new Promise((resolve) => {
+      var headers = new Headers;
+      headers.append("Content-Security-Policy", "frame-ancestors 'none'");
+      var response = new Response("", { "headers" : headers, "status": 200, "statusText" : "OK" });
+      resolve(response);
+    });
+  }());
+};
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/cookies/samesite/about-blank-subresource.https.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<head>
+  <script src="/resources/testharness.js"></script>
+  <script src="/resources/testharnessreport.js"></script>
+  <script src="/cookies/resources/cookie-helper.sub.js"></script>
+</head>
+<body onload="doTests()">
+  <script>
+  function doTests() {
+    promise_test(async function(t) {
+      var child = window.open("");
+      child.onmessage = (ev) => {
+        child.opener.postMessage(ev.data, '*');
+      };
+      var grandKid = child.document.createElement("iframe");
+      child.document.body.appendChild(grandKid);
+      var value = "" + Math.random();
+      await resetSameSiteCookies(SECURE_ORIGIN, value);
+
+      // Load at what cookies a subresource below an about:blank iframe
+      // inheritting this origin gets.
+      grandKid.src = SECURE_ORIGIN + "/cookies/samesite/resources/iframe-subresource-report.html"
+      var e = await wait_for_message("COOKIES", SECURE_ORIGIN);
+      assert_cookie(SECURE_ORIGIN, e.data, "samesite_unspecified", value, true);
+      assert_cookie(SECURE_ORIGIN, e.data, "samesite_lax", value, true);
+      assert_cookie(SECURE_ORIGIN, e.data, "samesite_strict", value, true);
+      assert_cookie(SECURE_ORIGIN, e.data, "samesite_none", value, true);
+    }, "SameSite cookies on subresource of top-level about:blank window");
+  }
+  </script>
+</body>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/cookies/samesite/about-blank-toplevel.https.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<head>
+  <script src="/resources/testharness.js"></script>
+  <script src="/resources/testharnessreport.js"></script>
+  <script src="/cookies/resources/cookie-helper.sub.js"></script>
+</head>
+<body onload="doTests()">
+  <script>
+  function doTests() {
+    promise_test(async function(t) {
+      var child = window.open("");
+      child.onmessage = (ev) => {
+        child.opener.postMessage(ev.data, '*');
+      };
+      var grandKid = child.document.createElement("iframe");
+      child.document.body.appendChild(grandKid);
+      var value = "" + Math.random();
+      await resetSameSiteCookies(SECURE_ORIGIN, value);
+
+      // Using postToParent.py here to see cookies used when navigating the page.
+      grandKid.src = SECURE_ORIGIN + "/cookies/resources/postToParent.py"
+      var e = await wait_for_message("COOKIES", SECURE_ORIGIN);
+      assert_cookie(SECURE_ORIGIN, e.data, "samesite_unspecified", value, true);
+      assert_cookie(SECURE_ORIGIN, e.data, "samesite_lax", value, true);
+      assert_cookie(SECURE_ORIGIN, e.data, "samesite_strict", value, true);
+      assert_cookie(SECURE_ORIGIN, e.data, "samesite_none", value, true);
+    }, "SameSite cookies with top-level about:blank window");
+  }
+  </script>
+</body>
--- a/testing/web-platform/tests/cookies/samesite/resources/iframe-subresource-report.html
+++ b/testing/web-platform/tests/cookies/samesite/resources/iframe-subresource-report.html
@@ -1,13 +1,14 @@
 <!DOCTYPE html>
 <head>
 <script src="/cookies/resources/cookie-helper.sub.js"></script>
 <script>
 function reportSubresourceCookies() {
   credFetch(SECURE_ORIGIN + "/cookies/resources/list.py")
     .then(r => r.json())
     .then(cookies => { cookies.type = "COOKIES";
-                       window.parent.postMessage(cookies, "*");});
+                       target = window.opener ? window.opener : window.parent;
+                       target.postMessage(cookies, "*");});
 }
 </script>
 </head>
 <body onload="reportSubresourceCookies()">
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-animations/parsing/animation-computed.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Animations: getComputedStyle().animation</title>
+<link rel="help" href="https://drafts.csswg.org/css-animations/#propdef-animation">
+<meta name="assert" content="animation computed value is as specified.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/computed-testcommon.js"></script>
+</head>
+<body>
+<div id="target"></div>
+<script>
+// <single-animation> = <time> || <easing-function> || <time> ||
+// <single-animation-iteration-count> || <single-animation-direction> ||
+// <single-animation-fill-mode> || <single-animation-play-state> ||
+// [ none | <keyframes-name> ]
+test_computed_value("animation", "1s", "1s ease 0s 1 normal none running none");
+test_computed_value("animation", "cubic-bezier(0, -2, 1, 3)", "0s cubic-bezier(0, -2, 1, 3) 0s 1 normal none running none");
+test_computed_value("animation", "1s -3s", "1s ease -3s 1 normal none running none");
+test_computed_value("animation", "4", "0s ease 0s 4 normal none running none");
+test_computed_value("animation", "reverse", "0s ease 0s 1 reverse none running none");
+test_computed_value("animation", "both", "0s ease 0s 1 normal both running none");
+test_computed_value("animation", "paused", "0s ease 0s 1 normal none paused none");
+test_computed_value("animation", "none", "0s ease 0s 1 normal none running none");
+test_computed_value("animation", "anim", "0s ease 0s 1 normal none running anim");
+
+test_computed_value("animation", "anim paused both reverse 4 1s -3s cubic-bezier(0, -2, 1, 3)",
+  "1s cubic-bezier(0, -2, 1, 3) -3s 4 reverse both paused anim");
+
+test_computed_value("animation", "anim paused both reverse, 4 1s -3s cubic-bezier(0, -2, 1, 3)",
+  "0s ease 0s 1 reverse both paused anim, 1s cubic-bezier(0, -2, 1, 3) -3s 4 normal none running none");
+
+// TODO: Add test with a single timing-function keyword.
+</script>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-box/animation/margin-interpolation.html
@@ -0,0 +1,118 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>margin interpolation</title>
+<link rel="help" href="https://www.w3.org/TR/CSS2/box.html#margin-properties">
+<meta name="assert" content="margin supports animation">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<style>
+.parent {
+  margin: 10px;
+  border: solid;
+  display: inline-block;
+}
+
+.target {
+  width: 40px;
+  height: 40px;
+  background-color: black;
+  display: inline-block;
+  margin: 30px;
+  opacity: 0.5;
+}
+
+.expected {
+  background-color: green;
+}
+</style>
+
+<body>
+<template id="target-template">
+  <div>
+    <div class="target"></div>
+  </div>
+</template>
+
+<script>
+test_interpolation({
+  property: 'margin',
+  from: neutralKeyframe,
+  to: '20px',
+}, [
+  {at: -0.3, expect: '33px'},
+  {at: 0, expect: '30px'},
+  {at: 0.3, expect: '27px'},
+  {at: 0.6, expect: '24px'},
+  {at: 1, expect: '20px'},
+  {at: 1.5, expect: '15px'},
+]);
+
+test_interpolation({
+  property: 'margin',
+  from: 'initial',
+  to: '20px',
+}, [
+  {at: -0.3, expect: '-6px'},
+  {at: 0, expect: '0px'},
+  {at: 0.3, expect: '6px'},
+  {at: 0.6, expect: '12px'},
+  {at: 1, expect: '20px'},
+  {at: 1.5, expect: '30px'},
+]);
+
+test_interpolation({
+  property: 'margin',
+  from: 'inherit',
+  to: '20px',
+}, [
+  {at: -0.3, expect: '7px'},
+  {at: 0, expect: '10px'},
+  {at: 0.3, expect: '13px'},
+  {at: 0.6, expect: '16px'},
+  {at: 1, expect: '20px'},
+  {at: 1.5, expect: '25px'},
+]);
+
+test_interpolation({
+  property: 'margin',
+  from: 'unset',
+  to: '20px',
+}, [
+  {at: -0.3, expect: '-6px'},
+  {at: 0, expect: '0px'},
+  {at: 0.3, expect: '6px'},
+  {at: 0.6, expect: '12px'},
+  {at: 1, expect: '20px'},
+  {at: 1.5, expect: '30px'},
+]);
+
+test_interpolation({
+  property: 'margin',
+  from: '0px',
+  to: '10px'
+}, [
+  {at: -0.3, expect: '-3px'},
+  {at: 0, expect: '0px'},
+  {at: 0.3, expect: '3px'},
+  {at: 0.6, expect: '6px'},
+  {at: 1, expect: '10px'},
+  {at: 1.5, expect: '15px'}
+]);
+
+test_interpolation({
+  property: 'margin',
+  from: '20px 40px 60px 80px',
+  to: '30px 50px 70px 90px'
+}, [
+  {at: -0.3, expect: '17px 37px 57px 77px'},
+  {at: 0, expect: '20px 40px 60px 80px'},
+  {at: 0.3, expect: '23px 43px 63px 83px'},
+  {at: 0.6, expect: '26px 46px 66px 86px'},
+  {at: 1, expect: '30px 50px 70px 90px'},
+  {at: 1.5, expect: '35px 55px 75px 95px'}
+]);
+</script>
+</body>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-color/animation/opacity-interpolation.html
@@ -0,0 +1,96 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>opacity interpolation</title>
+<link rel="help" href="https://drafts.csswg.org/css-color-3/#opacity">
+<meta name="assert" content="opacity supports animation">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<style>
+.parent {
+  opacity: 0.8;
+}
+
+.target {
+  width: 100px;
+  height: 100px;
+  background-color: black;
+  display: inline-block;
+  opacity: 0.1;
+}
+
+.expected {
+  background-color: green;
+}
+</style>
+
+<body>
+<script>
+test_interpolation({
+  property: 'opacity',
+  from: neutralKeyframe,
+  to: '0.2',
+}, [
+  {at: -0.3, expect: '0.07'},
+  {at: 0, expect: '0.1'},
+  {at: 0.3, expect: '0.13'},
+  {at: 0.6, expect: '0.16'},
+  {at: 1, expect: '0.2'},
+  {at: 1.5, expect: '0.25'},
+]);
+
+test_interpolation({
+  property: 'opacity',
+  from: 'initial',
+  to: '0.2',
+}, [
+  {at: -0.3, expect: '1'},
+  {at: 0, expect: '1'},
+  {at: 0.3, expect: '0.76'},
+  {at: 0.6, expect: '0.52'},
+  {at: 1, expect: '0.2'},
+  {at: 1.5, expect: '0'},
+]);
+
+test_interpolation({
+  property: 'opacity',
+  from: 'inherit',
+  to: '0.2',
+}, [
+  {at: -0.3, expect: '0.98'},
+  {at: 0, expect: '0.8'},
+  {at: 0.3, expect: '0.62'},
+  {at: 0.6, expect: '0.44'},
+  {at: 1, expect: '0.2'},
+  {at: 1.5, expect: '0'},
+]);
+
+test_interpolation({
+  property: 'opacity',
+  from: 'unset',
+  to: '0.2',
+}, [
+  {at: -0.3, expect: '1'},
+  {at: 0, expect: '1'},
+  {at: 0.3, expect: '0.76'},
+  {at: 0.6, expect: '0.52'},
+  {at: 1, expect: '0.2'},
+  {at: 1.5, expect: '0'},
+]);
+
+test_interpolation({
+  property: 'opacity',
+  from: '0',
+  to: '1'
+}, [
+  {at: -0.3, expect: '0'}, // CSS opacity is [0-1].
+  {at: 0, expect: '0'},
+  {at: 0.3, expect: '0.3'},
+  {at: 0.6, expect: '0.6'},
+  {at: 1, expect: '1'},
+  {at: 1.5, expect: '1'}
+]);
+</script>
+</body>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-flexbox/animation/order-interpolation.html
@@ -0,0 +1,105 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>order interpolation</title>
+<link rel="help" href="https://drafts.csswg.org/css-flexbox-1/#order-property">
+<meta name="assert" content="order supports animation">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<style>
+.parent {
+  order: 30;
+}
+
+.target {
+  order: 10;
+}
+</style>
+<body>
+<script>
+test_interpolation({
+  property: 'order',
+  from: neutralKeyframe,
+  to: '20',
+}, [
+  {at: -3, expect: '-20'},
+  {at: -0.5, expect: '5'},
+  {at: 0, expect: '10'},
+  {at: 0.3, expect: '13'},
+  {at: 0.6, expect: '16'},
+  {at: 1, expect: '20'},
+  {at: 1.5, expect: '25'},
+]);
+
+test_interpolation({
+  property: 'order',
+  from: 'initial',
+  to: '20',
+}, [
+  {at: -3, expect: '-60'},
+  {at: -0.5, expect: '-10'},
+  {at: 0, expect: '0'},
+  {at: 0.3, expect: '6'},
+  {at: 0.6, expect: '12'},
+  {at: 1, expect: '20'},
+  {at: 1.5, expect: '30'},
+]);
+
+test_interpolation({
+  property: 'order',
+  from: 'inherit',
+  to: '20',
+}, [
+  {at: -3, expect: '60'},
+  {at: -0.5, expect: '35'},
+  {at: 0, expect: '30'},
+  {at: 0.3, expect: '27'},
+  {at: 0.6, expect: '24'},
+  {at: 1, expect: '20'},
+  {at: 1.5, expect: '15'},
+]);
+
+test_interpolation({
+  property: 'order',
+  from: 'unset',
+  to: '20',
+}, [
+  {at: -3, expect: '-60'},
+  {at: -0.5, expect: '-10'},
+  {at: 0, expect: '0'},
+  {at: 0.3, expect: '6'},
+  {at: 0.6, expect: '12'},
+  {at: 1, expect: '20'},
+  {at: 1.5, expect: '30'},
+]);
+
+test_interpolation({
+  property: 'order',
+  from: '10',
+  to: '20'
+}, [
+  {at: -3.0, expect: '-20'},
+  {at: -0.5, expect: '5'},
+  {at: 0, expect: '10'},
+  {at: 0.3, expect: '13'},
+  {at: 0.6, expect: '16'},
+  {at: 1, expect: '20'},
+  {at: 1.5, expect: '25'}
+]);
+
+test_interpolation({
+  property: 'order',
+  from: '2',
+  to: '4'
+}, [
+  {at: -3.0, expect: '-4'},
+  {at: -0.5, expect: '1'},
+  {at: 0, expect: '2'},
+  {at: 0.3, expect: '3'},
+  {at: 0.6, expect: '3'},
+  {at: 1, expect: '4'},
+  {at: 1.5, expect: '5'}
+]);
+</script>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-fonts/parsing/font-variant-invalid.html
@@ -0,0 +1,62 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Fonts Module Level 4: parsing font-variant with invalid values</title>
+<link rel="help" href="https://drafts.csswg.org/css-fonts-4/#propdef-font-variant">
+<meta name="assert" content="font-variant supports only the grammar 'normal | none | [ <common-lig-values> || <discretionary-lig-values> || <historical-lig-values> || <contextual-alt-values> || [ small-caps | all-small-caps | petite-caps | all-petite-caps | unicase | titling-caps ] || [ stylistic(<feature-value-name>) || historical-forms || styleset(<feature-value-name>#) || character-variant(<feature-value-name>#) || swash(<feature-value-name>) || ornaments(<feature-value-name>) || annotation(<feature-value-name>) ] || <numeric-figure-values> || <numeric-spacing-values> || <numeric-fraction-values> || ordinal || slashed-zero || <east-asian-variant-values> || <east-asian-width-values> || ruby || [ sub | super ] ]'.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/parsing-testcommon.js"></script>
+</head>
+<body>
+<script>
+test_invalid_value('font-variant', 'normal none');
+
+// <common-lig-values>
+test_invalid_value('font-variant', 'common-ligatures no-common-ligatures');
+
+// <discretionary-lig-values>
+test_invalid_value('font-variant', 'discretionary-ligatures no-discretionary-ligatures');
+
+// <historical-lig-values>
+test_invalid_value('font-variant', 'historical-ligatures no-historical-ligatures');
+
+// <contextual-alt-values>
+test_invalid_value('font-variant', 'contextual no-contextual');
+
+// [ small-caps | all-small-caps | petite-caps | all-petite-caps | unicase | titling-caps ]
+test_invalid_value('font-variant', 'small-caps all-small-caps');
+
+// [ stylistic(<feature-value-name>) || historical-forms || styleset(<feature-value-name>#) || character-variant(<feature-value-name>#) || swash(<feature-value-name>) || ornaments(<feature-value-name>) || annotation(<feature-value-name>) ]
+test_invalid_value('font-variant', 'stylistic(flowing) stylistic(flowing)');
+
+// <numeric-figure-values>
+test_invalid_value('font-variant', 'lining-nums oldstyle-nums');
+
+// <numeric-spacing-values>
+test_invalid_value('font-variant', 'proportional-nums tabular-nums');
+
+// <numeric-fraction-values>
+test_invalid_value('font-variant', 'diagonal-fractions stacked-fractions');
+
+// ordinal
+test_invalid_value('font-variant', 'ordinal slashed-zero ordinal');
+
+// slashed-zero
+test_invalid_value('font-variant', 'slashed-zero jis78 slashed-zero');
+
+// <east-asian-variant-values>
+test_invalid_value('font-variant', 'jis78 jis83');
+
+// <east-asian-width-values>
+test_invalid_value('font-variant', 'full-width proportional-width');
+
+// ruby
+test_invalid_value('font-variant', 'ruby sub ruby');
+
+// [ sub | super ]
+test_invalid_value('font-variant', 'sub super');
+</script>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-fonts/parsing/font-variant-valid.html
@@ -0,0 +1,106 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Fonts Module Level 4: parsing font-variant with valid values</title>
+<link rel="help" href="https://drafts.csswg.org/css-fonts-4/#propdef-font-variant">
+<meta name="assert" content="font-variant supports the full grammar 'normal | none | [ <common-lig-values> || <discretionary-lig-values> || <historical-lig-values> || <contextual-alt-values> || [ small-caps | all-small-caps | petite-caps | all-petite-caps | unicase | titling-caps ] || [ stylistic(<feature-value-name>) || historical-forms || styleset(<feature-value-name>#) || character-variant(<feature-value-name>#) || swash(<feature-value-name>) || ornaments(<feature-value-name>) || annotation(<feature-value-name>) ] || <numeric-figure-values> || <numeric-spacing-values> || <numeric-fraction-values> || ordinal || slashed-zero || <east-asian-variant-values> || <east-asian-width-values> || ruby || [ sub | super ] ]'.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/parsing-testcommon.js"></script>
+</head>
+<body>
+<script>
+test_valid_value('font-variant', 'normal');
+test_valid_value('font-variant', 'none');
+
+// <common-lig-values>
+test_valid_value('font-variant', 'common-ligatures');
+test_valid_value('font-variant', 'no-common-ligatures');
+
+// <discretionary-lig-values>
+test_valid_value('font-variant', 'discretionary-ligatures');
+test_valid_value('font-variant', 'no-discretionary-ligatures');
+
+// <historical-lig-values>
+test_valid_value('font-variant', 'historical-ligatures');
+test_valid_value('font-variant', 'no-historical-ligatures');
+
+// <contextual-alt-values>
+test_valid_value('font-variant', 'contextual');
+test_valid_value('font-variant', 'no-contextual');
+
+// [ small-caps | all-small-caps | petite-caps | all-petite-caps | unicase | titling-caps ]
+test_valid_value('font-variant', 'small-caps');
+test_valid_value('font-variant', 'all-small-caps');
+test_valid_value('font-variant', 'petite-caps');
+test_valid_value('font-variant', 'all-petite-caps');
+test_valid_value('font-variant', 'unicase');
+test_valid_value('font-variant', 'titling-caps');
+
+// [ stylistic(<feature-value-name>) || historical-forms || styleset(<feature-value-name>#) || character-variant(<feature-value-name>#) || swash(<feature-value-name>) || ornaments(<feature-value-name>) || annotation(<feature-value-name>) ]
+test_valid_value('font-variant', 'stylistic(flowing)');
+test_valid_value('font-variant', 'historical-forms');
+test_valid_value('font-variant', 'styleset(flowing)');
+test_valid_value('font-variant', 'character-variant(flowing)');
+test_valid_value('font-variant', 'swash(flowing)');
+test_valid_value('font-variant', 'ornaments(flowing)');
+test_valid_value('font-variant', 'annotation(flowing)');
+
+test_valid_value('font-variant', 'stylistic(flowing) historical-forms styleset(flowing) character-variant(flowing) swash(flowing) ornaments(flowing) annotation(flowing)');
+
+test_valid_value('font-variant', 'annotation(flowing) ornaments(flowing) swash(flowing) character-variant(flowing) styleset(flowing) historical-forms stylistic(flowing)', 'stylistic(flowing) historical-forms styleset(flowing) character-variant(flowing) swash(flowing) ornaments(flowing) annotation(flowing)');
+
+// <numeric-figure-values>
+test_valid_value('font-variant', 'lining-nums');
+test_valid_value('font-variant', 'oldstyle-nums');
+
+// <numeric-spacing-values>
+test_valid_value('font-variant', 'proportional-nums');
+test_valid_value('font-variant', 'tabular-nums');
+
+// <numeric-fraction-values>
+test_valid_value('font-variant', 'diagonal-fractions');
+test_valid_value('font-variant', 'stacked-fractions');
+
+// ordinal
+test_valid_value('font-variant', 'ordinal');
+
+// slashed-zero
+test_valid_value('font-variant', 'slashed-zero');
+
+// <east-asian-variant-values>
+test_valid_value('font-variant', 'jis78');
+test_valid_value('font-variant', 'jis83');
+test_valid_value('font-variant', 'jis90');
+test_valid_value('font-variant', 'jis04');
+test_valid_value('font-variant', 'simplified');
+test_valid_value('font-variant', 'traditional');
+
+// <east-asian-width-values>
+test_valid_value('font-variant', 'full-width');
+test_valid_value('font-variant', 'proportional-width');
+
+// ruby
+test_valid_value('font-variant', 'ruby');
+
+// [ sub | super ]
+test_valid_value('font-variant', 'sub');
+test_valid_value('font-variant', 'super');
+
+
+test_valid_value('font-variant',
+                 'common-ligatures discretionary-ligatures historical-ligatures contextual' +
+                 ' small-caps stylistic(flowing) lining-nums proportional-nums diagonal-fractions' +
+                 ' ordinal slashed-zero jis78 full-width ruby sub');
+
+test_valid_value('font-variant',
+                 'super proportional-width jis83 stacked-fractions' +
+                 ' tabular-nums oldstyle-nums historical-forms all-small-caps no-contextual' +
+                 ' no-historical-ligatures no-discretionary-ligatures no-common-ligatures',
+                 'no-common-ligatures no-discretionary-ligatures no-historical-ligatures' +
+                 ' no-contextual all-small-caps historical-forms oldstyle-nums tabular-nums' +
+                 ' stacked-fractions jis83 proportional-width super');
+</script>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-masking/animations/clip-path-interpolation.html
@@ -0,0 +1,141 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>clip-path interpolation</title>
+<link rel="help" href="https://drafts.fxtf.org/css-masking-1/#the-clip-path">
+<meta name="assert" content="clip-path supports animation">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<style>
+.parent {
+  clip-path: circle(80% at 30% 10%);
+}
+
+.target {
+  clip-path: circle(60% at 10% 30%);
+}
+</style>
+<body>
+<script>
+test_interpolation({
+  property: 'clip-path',
+  from: neutralKeyframe,
+  to: 'circle(40% at 20% 20%)',
+}, [
+  {at: -0.3, expect: 'circle(66% at 7% 33%)'},
+  {at: 0, expect: 'circle(60% at 10% 30%)'},
+  {at: 0.3, expect: 'circle(54% at 13% 27%)'},
+  {at: 0.6, expect: 'circle(48% at 16% 24%)'},
+  {at: 1, expect: 'circle(40% at 20% 20%)'},
+  {at: 1.5, expect: 'circle(30% at 25% 15%)'},
+]);
+
+test_no_interpolation({
+  property: 'clip-path',
+  from: 'initial',
+  to: 'circle(40% at 20% 20%)',
+});
+
+test_interpolation({
+  property: 'clip-path',
+  from: 'inherit',
+  to: 'circle(40% at 20% 20%)',
+}, [
+  {at: -0.3, expect: 'circle(92% at 33% 7%)'},
+  {at: 0, expect: 'circle(80% at 30% 10%)'},
+  {at: 0.3, expect: 'circle(68% at 27% 13%)'},
+  {at: 0.6, expect: 'circle(56% at 24% 16%)'},
+  {at: 1, expect: 'circle(40% at 20% 20%)'},
+  {at: 1.5, expect: 'circle(20% at 15% 25%)'},
+]);
+
+test_no_interpolation({
+  property: 'clip-path',
+  from: 'unset',
+  to: 'circle(40% at 20% 20%)',
+});
+
+test_interpolation({
+  property: 'clip-path',
+  from: 'circle(100% at 0% 0%)',
+  to: 'circle(50% at 25% 25%)',
+}, [
+  {at: -0.3, expect: 'circle(115% at -7.5% -7.5%)'},
+  {at: 0, expect: 'circle(100% at 0% 0%)'},
+  {at: 0.3, expect: 'circle(85% at 7.5% 7.5%)'},
+  {at: 0.6, expect: 'circle(70% at 15% 15%)'},
+  {at: 1, expect: 'circle(50% at 25% 25%)'},
+  {at: 1.5, expect: 'circle(25% at 37.5% 37.5%)'}
+]);
+
+test_interpolation({
+  property: 'clip-path',
+  from: 'ellipse(100% 100% at 0% 0%)',
+  to: 'ellipse(50% 50% at 25% 25%)',
+}, [
+  {at: -0.3, expect: 'ellipse(115% 115% at -7.5% -7.5%)'},
+  {at: 0, expect: 'ellipse(100% 100% at 0% 0%)'},
+  {at: 0.3, expect: 'ellipse(85% 85% at 7.5% 7.5%)'},
+  {at: 0.6, expect: 'ellipse(70% 70% at 15% 15%)'},
+  {at: 1, expect: 'ellipse(50% 50% at 25% 25%)'},
+  {at: 1.5, expect: 'ellipse(25% 25% at 37.5% 37.5%)'}
+]);
+
+test_interpolation({
+  property: 'clip-path',
+  from: 'polygon(nonzero, 0px 0px, 25px 25px, 50px 50px)',
+  to: 'polygon(nonzero, 25px 25px, 50px 50px, 75px 75px)',
+}, [
+  {at: -0.3, expect: 'polygon(nonzero, -7.5px -7.5px, 17.5px 17.5px, 42.5px 42.5px)'},
+  {at: 0, expect: 'polygon(nonzero, 0px 0px, 25px 25px, 50px 50px)'},
+  {at: 0.3, expect: 'polygon(nonzero, 7.5px 7.5px, 32.5px 32.5px, 57.5px 57.5px)'},
+  {at: 0.6, expect: 'polygon(nonzero, 15px 15px, 40px 40px, 65px 65px)'},
+  {at: 1, expect: 'polygon(nonzero, 25px 25px, 50px 50px, 75px 75px)'},
+  {at: 1.5, expect: 'polygon(nonzero, 37.5px 37.5px, 62.5px 62.5px, 87.5px 87.5px)'}
+]);
+
+test_no_interpolation({
+  property: 'clip-path',
+  from: 'polygon(evenodd, 0px 0px, 25px 25px, 50px 50px)',
+  to: 'polygon(nonzero, 25px 25px, 50px 50px, 75px 75px)',
+});
+
+test_interpolation({
+  property: 'clip-path',
+  from: 'inset(100%)',
+  to: 'inset(120%)',
+}, [
+  {at: -0.3, expect: 'inset(94%)'},
+  {at: 0, expect: 'inset(100%)'},
+  {at: 0.3, expect: 'inset(106%)'},
+  {at: 0.6, expect: 'inset(112%)'},
+  {at: 1, expect: 'inset(120%)'},
+  {at: 1.5, expect: 'inset(130%)'},
+]);
+
+test_no_interpolation({
+  property: 'clip-path',
+  from: 'none',
+  to: 'ellipse(100% 100% at 0% 0%)',
+});
+
+test_interpolation({
+  property: 'clip-path',
+  from: 'circle(25% at right 5% bottom 15px)',
+  to: 'circle(45% at right 25% bottom 35px)',
+}, [
+  {at: 0.25, expect: 'circle(30% at 90% calc(-20px + 100%))'},
+  {at: 0.5, expect: 'circle(35% at 85% calc(-25px + 100%))'},
+  {at: 0.75, expect: 'circle(40% at 80% calc(-30px + 100%))'},
+]);
+
+test_no_interpolation({
+  property: 'clip-path',
+  from: 'url("/clip-source")',
+  to: 'ellipse(100% 100% at 0% 0%)',
+});
+
+</script>
+</body>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-overflow/overflow-codependent-scrollbars.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<link rel="author" href="mailto:atotic@google.com">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<link rel="help" href="https://www.w3.org/TR/css-overflow-3/#scrollable">
+<meta name="assert" content="What happens when appearance of one scrollbar triggers the other one?">
+<style>
+.container {
+  width: 100px;
+  height: 100px;
+  overflow: auto;
+  background: #DDD;
+  --too-big: 120px;
+  --slightly-smaller: 95px;
+}
+.target {
+  width: 120px;
+  height: 95px;
+  background: rgba(0,255,0,0.3);
+}
+</style>
+<!--  -->
+<div class="container">
+  <div class="target" style="width:var(--too-big);height:var(--slightly-smaller)" ></div>
+</div>
+<div class="container">
+  <div class="target" style="height:var(--too-big);width:var(--slightly-smaller)" ></div>
+</div>
+
+<script>
+test(() => {
+  Array.from(document.querySelectorAll(".container")).forEach( el => {
+    let verticalScrollbar = el.offsetWidth - el.clientWidth;
+    let horizontalScrollbar = el.offsetHeight - el.clientHeight;
+    assert_equals(verticalScrollbar, horizontalScrollbar, "both scrollbars are visible.");
+  });
+}, 'appearance of one scrollbar caused the other scrollbar to appear.');
+</script>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-tables/animations/border-spacing-interpolation.html
@@ -0,0 +1,116 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>boder-spacing interpolation</title>
+<link rel="help" href="https://www.w3.org/TR/CSS2/tables.html#separated-borders">
+<meta name="assert" content="border-spacing supports animation">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<style>
+.parent {
+  border-spacing: 30px;
+}
+
+.target {
+  width: 50px;
+  height: 50px;
+  background-color: black;
+  display: inline-block;
+  margin: 18px;
+  border-collapse: separate;
+  border-spacing: 10px;
+}
+
+.target td {
+  background-color: white;
+  border: 1px solid orange;
+  width: 10px;
+  height: 10px;
+}
+
+.expected {
+  background-color: green;
+}
+</style>
+
+<body>
+<template id="target-template">
+  <table>
+    <tbody>
+      <tr>
+        <td></td>
+        <td></td>
+      </tr>
+    </tbody>
+  </table>
+</template>
+
+<script>
+test_interpolation({
+  property: 'border-spacing',
+  from: neutralKeyframe,
+  to: '20px',
+}, [
+  {at: -0.3, expect: '7px 7px'},
+  {at: 0, expect: '10px 10px'},
+  {at: 0.3, expect: '13px 13px'},
+  {at: 0.6, expect: '16px 16px'},
+  {at: 1, expect: '20px 20px'},
+  {at: 1.5, expect: '25px 25px'},
+]);
+
+test_interpolation({
+  property: 'border-spacing',
+  from: 'initial',
+  to: '20px',
+}, [
+  {at: -0.3, expect: '0px 0px'},
+  {at: 0, expect: '0px 0px'},
+  {at: 0.3, expect: '6px 6px'},
+  {at: 0.6, expect: '12px 12px'},
+  {at: 1, expect: '20px 20px'},
+  {at: 1.5, expect: '30px 30px'},
+]);
+
+test_interpolation({
+  property: 'border-spacing',
+  from: 'inherit',
+  to: '20px',
+}, [
+  {at: -0.3, expect: '33px 33px'},
+  {at: 0, expect: '30px 30px'},
+  {at: 0.3, expect: '27px 27px'},
+  {at: 0.6, expect: '24px 24px'},
+  {at: 1, expect: '20px 20px'},
+  {at: 1.5, expect: '15px 15px'},
+]);
+
+test_interpolation({
+  property: 'border-spacing',
+  from: 'unset',
+  to: '20px',
+}, [
+  {at: -0.3, expect: '33px 33px'},
+  {at: 0, expect: '30px 30px'},
+  {at: 0.3, expect: '27px 27px'},
+  {at: 0.6, expect: '24px 24px'},
+  {at: 1, expect: '20px 20px'},
+  {at: 1.5, expect: '15px 15px'},
+]);
+
+test_interpolation({
+  property: 'border-spacing',
+  from: '0px',
+  to: '10px'
+}, [
+  {at: -0.3, expect: '0px 0px'}, // Can't be negative.
+  {at: 0, expect: '0px 0px'},
+  {at: 0.3, expect: '3px 3px'},
+  {at: 0.6, expect: '6px 6px'},
+  {at: 1, expect: '10px 10px'},
+  {at: 1.5, expect: '15px 15px'}
+]);
+</script>
+</body>
--- a/testing/web-platform/tests/css/css-transforms/animation/rotate-interpolation.html
+++ b/testing/web-platform/tests/css/css-transforms/animation/rotate-interpolation.html
@@ -1,14 +1,13 @@
 <!DOCTYPE html>
 <html>
   <head>
     <meta charset="utf-8">
     <title>rotate interpolation</title>
-    <link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
     <link rel="help" href="https://drafts.csswg.org/css-transforms-2/#propdef-rotate">
     <meta name="assert" content="rotate supports animation.">
     <script src="/resources/testharness.js"></script>
     <script src="/resources/testharnessreport.js"></script>
     <script src="/css/support/interpolation-testcommon.js"></script>
   </head>
   <body>
     <script>
--- a/testing/web-platform/tests/css/css-transforms/animation/scale-interpolation.html
+++ b/testing/web-platform/tests/css/css-transforms/animation/scale-interpolation.html
@@ -1,14 +1,13 @@
 <!DOCTYPE html>
 <html>
   <head>
     <meta charset="utf-8">
     <title>scale interpolation</title>
-    <link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
     <link rel="help" href="https://drafts.csswg.org/css-transforms-2/#propdef-scale">
     <meta name="assert" content="scale supports animation.">
     <script src="/resources/testharness.js"></script>
     <script src="/resources/testharnessreport.js"></script>
     <script src="/css/support/interpolation-testcommon.js"></script>
     <style>
     .parent {
       scale: 0.5 1 2
--- a/testing/web-platform/tests/css/css-transforms/animation/translate-interpolation.html
+++ b/testing/web-platform/tests/css/css-transforms/animation/translate-interpolation.html
@@ -1,14 +1,13 @@
 <!DOCTYPE html>
 <html>
   <head>
     <meta charset="utf-8">
     <title>translate interpolation</title>
-    <link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
     <link rel="help" href="https://drafts.csswg.org/css-transforms-2/#propdef-translate">
     <meta name="assert" content="translate supports <length> and <percentage> animation.">
     <script src="/resources/testharness.js"></script>
     <script src="/resources/testharnessreport.js"></script>
     <script src="/css/support/interpolation-testcommon.js"></script>
     <style>
       body {
         width: 500px;
--- a/testing/web-platform/tests/css/css-transforms/parsing/perspective-origin-invalid.html
+++ b/testing/web-platform/tests/css/css-transforms/parsing/perspective-origin-invalid.html
@@ -1,14 +1,13 @@
 <!DOCTYPE html>
 <html>
 <head>
 <meta charset="utf-8">
 <title>CSS Transform Module Level 2: parsing perspective-origin with invalid values</title>
-<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
 <link rel="help" href="https://drafts.csswg.org/css-transforms-2/#perspective-origin-property">
 <meta name="assert" content="perspective-origin supports only the '<position>' grammar.">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="/css/support/parsing-testcommon.js"></script>
 </head>
 <body>
 <script>
--- a/testing/web-platform/tests/css/css-transforms/parsing/perspective-origin-valid.html
+++ b/testing/web-platform/tests/css/css-transforms/parsing/perspective-origin-valid.html
@@ -1,14 +1,13 @@
 <!DOCTYPE html>
 <html>
 <head>
 <meta charset="utf-8">
 <title>CSS Transform Module Level 2: parsing perspective-origin with valid values</title>
-<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
 <link rel="help" href="https://drafts.csswg.org/css-transforms-2/#perspective-origin-property">
 <meta name="assert" content="perspective-origin supports the full '<position>' grammar.">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="/css/support/parsing-testcommon.js"></script>
 </head>
 <body>
 <script>
--- a/testing/web-platform/tests/css/css-transforms/parsing/rotate-parsing-invalid.html
+++ b/testing/web-platform/tests/css/css-transforms/parsing/rotate-parsing-invalid.html
@@ -1,14 +1,13 @@
 <!DOCTYPE html>
 <html>
 <head>
 <meta charset="utf-8">
 <title>CSS Transform Module Level 2: parsing rotate with invalid values</title>
-<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
 <link rel="help" href="https://drafts.csswg.org/css-transforms-2/#propdef-rotate">
 <meta name="assert" content="rotate supports only the grammar 'none | <number>{3}? <angle>'.">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="/css/support/parsing-testcommon.js"></script>
 </head>
 <body>
 <script>
--- a/testing/web-platform/tests/css/css-transforms/parsing/rotate-parsing-valid.html
+++ b/testing/web-platform/tests/css/css-transforms/parsing/rotate-parsing-valid.html
@@ -1,14 +1,13 @@
 <!DOCTYPE html>
 <html>
 <head>
 <meta charset="utf-8">
 <title>CSS Transform Module Level 2: parsing rotate with valid values</title>
-<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
 <link rel="help" href="https://drafts.csswg.org/css-transforms-2/#propdef-rotate">
 <meta name="assert" content="rotate supports the full grammar 'none | <number>{3}? <angle>'.">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="/css/support/parsing-testcommon.js"></script>
 </head>
 <body>
 <script>
--- a/testing/web-platform/tests/css/css-transforms/parsing/scale-parsing-invalid.html
+++ b/testing/web-platform/tests/css/css-transforms/parsing/scale-parsing-invalid.html
@@ -1,14 +1,13 @@
 <!DOCTYPE html>
 <html>
 <head>
 <meta charset="utf-8">
 <title>CSS Transform Module Level 2: parsing scale with invalid values</title>
-<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
 <link rel="help" href="https://drafts.csswg.org/css-transforms-2/#propdef-scale">
 <meta name="assert" content="scale supports only the grammar 'none | <number>{1,3}'.">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="/css/support/parsing-testcommon.js"></script>
 </head>
 <body>
 <script>
--- a/testing/web-platform/tests/css/css-transforms/parsing/scale-parsing-valid.html
+++ b/testing/web-platform/tests/css/css-transforms/parsing/scale-parsing-valid.html
@@ -1,14 +1,13 @@
 <!DOCTYPE html>
 <html>
 <head>
 <meta charset="utf-8">
 <title>CSS Transform Module Level 2: parsing scale with valid values</title>
-<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
 <link rel="help" href="https://drafts.csswg.org/css-transforms-2/#propdef-scale">
 <meta name="assert" content="scale supports the full grammar 'none | <number>{1,3}'.">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="/css/support/parsing-testcommon.js"></script>
 </head>
 <body>
 <script>
--- a/testing/web-platform/tests/css/css-transforms/parsing/transform-box-invalid.html
+++ b/testing/web-platform/tests/css/css-transforms/parsing/transform-box-invalid.html
@@ -1,14 +1,13 @@
 <!DOCTYPE html>
 <html>
 <head>
 <meta charset="utf-8">
 <title>CSS Transform Module Level 1: parsing transform-box with invalid values</title>
-<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
 <link rel="help" href="https://drafts.csswg.org/css-transforms/#transform-box-property">
 <meta name="assert" content="transform-box supports only the grammar 'content-box | border-box | fill-box | stroke-box | view-box'.">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="/css/support/parsing-testcommon.js"></script>
 </head>
 <body>
 <script>
--- a/testing/web-platform/tests/css/css-transforms/parsing/transform-box-valid.html
+++ b/testing/web-platform/tests/css/css-transforms/parsing/transform-box-valid.html
@@ -1,14 +1,13 @@
 <!DOCTYPE html>
 <html>
 <head>
 <meta charset="utf-8">
 <title>CSS Transform Module Level 1: parsing transform-box with valid values</title>
-<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
 <link rel="help" href="https://drafts.csswg.org/css-transforms/#transform-box-property">
 <meta name="assert" content="transform-box supports the full grammar 'content-box | border-box | fill-box | stroke-box | view-box'.">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="/css/support/parsing-testcommon.js"></script>
 </head>
 <body>
 <script>
--- a/testing/web-platform/tests/css/css-transforms/parsing/transform-invalid.html
+++ b/testing/web-platform/tests/css/css-transforms/parsing/transform-invalid.html
@@ -1,14 +1,13 @@
 <!DOCTYPE html>
 <html>
 <head>
 <meta charset="utf-8">
 <title>CSS Transform Module Level 2: parsing transform with invalid values</title>
-<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
 <link rel="help" href="https://drafts.csswg.org/css-transforms-2/#transform-property">
 <meta name="assert" content="transform supports only the grammar 'none | <transform-list>'.">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="/css/support/parsing-testcommon.js"></script>
 </head>
 <body>
 <script>
--- a/testing/web-platform/tests/css/css-transforms/parsing/transform-origin-computed.html
+++ b/testing/web-platform/tests/css/css-transforms/parsing/transform-origin-computed.html
@@ -1,14 +1,14 @@
 <!DOCTYPE html>
 <html>
 <head>
 <meta charset="utf-8">
 <title>CSS Transform Module Level 2: getComputedStyle().transformOrigin</title>
-<link rel="help" href="https://drafts.csswg.org/css-transforms-2/#transform-origin-property">
+<link rel="help" href="https://drafts.csswg.org/css-transforms/#transform-origin-property">
 <meta name="assert" content="transform-origin computed value is two or three absolute lengths">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="/css/support/computed-testcommon.js"></script>
 <style>
   #target {
     width: 200px;
     height: 300px;
--- a/testing/web-platform/tests/css/css-transforms/parsing/transform-origin-invalid.html
+++ b/testing/web-platform/tests/css/css-transforms/parsing/transform-origin-invalid.html
@@ -1,14 +1,13 @@
 <!DOCTYPE html>
 <html>
 <head>
 <meta charset="utf-8">
 <title>CSS Transform Module Level 1: parsing transform-origin with invalid values</title>
-<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
 <link rel="help" href="https://drafts.csswg.org/css-transforms/#transform-origin-property">
 <meta name="assert" content="transform-origin supports only the grammar from spec.">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="/css/support/parsing-testcommon.js"></script>
 </head>
 <body>
 <script>
--- a/testing/web-platform/tests/css/css-transforms/parsing/transform-origin-valid.html
+++ b/testing/web-platform/tests/css/css-transforms/parsing/transform-origin-valid.html
@@ -1,14 +1,13 @@
 <!DOCTYPE html>
 <html>
 <head>
 <meta charset="utf-8">
 <title>CSS Transform Module Level 1: parsing transform-origin with valid values</title>
-<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
 <link rel="help" href="https://drafts.csswg.org/css-transforms/#transform-origin-property">
 <meta name="assert" content="transform-origin supports the full grammar from spec.">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="/css/support/parsing-testcommon.js"></script>
 </head>
 <body>
 <script>
--- a/testing/web-platform/tests/css/css-transforms/parsing/transform-valid.html
+++ b/testing/web-platform/tests/css/css-transforms/parsing/transform-valid.html
@@ -1,14 +1,13 @@
 <!DOCTYPE html>
 <html>
 <head>
 <meta charset="utf-8">
 <title>CSS Transform Module Level 2: parsing transform with valid values</title>
-<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
 <link rel="help" href="https://drafts.csswg.org/css-transforms-2/#transform-property">
 <meta name="assert" content="transform supports the full grammar 'none | <transform-list>'.">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="/css/support/parsing-testcommon.js"></script>
 </head>
 <body>
 <script>
--- a/testing/web-platform/tests/css/css-transforms/parsing/translate-parsing-invalid.html
+++ b/testing/web-platform/tests/css/css-transforms/parsing/translate-parsing-invalid.html
@@ -1,14 +1,13 @@
 <!DOCTYPE html>
 <html>
 <head>
 <meta charset="utf-8">
 <title>CSS Transform Module Level 2: parsing translate with invalid values</title>
-<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
 <link rel="help" href="https://drafts.csswg.org/css-transforms-2/#propdef-translate">
 <meta name="assert" content="translate supports only the grammar 'none | <length-percentage> [ <length-percentage> <length>? ]?'.">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="/css/support/parsing-testcommon.js"></script>
 </head>
 <body>
 <script>
--- a/testing/web-platform/tests/css/css-transforms/parsing/translate-parsing-valid.html
+++ b/testing/web-platform/tests/css/css-transforms/parsing/translate-parsing-valid.html
@@ -1,14 +1,13 @@
 <!DOCTYPE html>
 <html>
 <head>
 <meta charset="utf-8">
 <title>CSS Transform Module Level 2: parsing translate with valid values</title>
-<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
 <link rel="help" href="https://drafts.csswg.org/css-transforms-2/#propdef-translate">
 <meta name="assert" content="translate supports the full grammar 'none | <length-percentage> [ <length-percentage> <length>? ]?'.">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="/css/support/parsing-testcommon.js"></script>
 </head>
 <body>
 <script>
--- a/testing/web-platform/tests/css/css-transforms/transforms-support-calc.html
+++ b/testing/web-platform/tests/css/css-transforms/transforms-support-calc.html
@@ -1,14 +1,13 @@
 <!DOCTYPE html>
 <html>
 <head>
 <meta charset="utf-8">
 <title>CSS Transform Module Level 2: calc values</title>
-<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
 <link rel="help" href="https://drafts.csswg.org/css-transforms-2/">
 <link rel="help" href="https://drafts.csswg.org/css-values-3/#calc-notation">
 <meta name="assert" content="calc values are supported in css-transforms properties.">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <style>
   #container {
     width: 600px;
--- a/testing/web-platform/tests/css/css-transforms/translate-getComputedStyle.html
+++ b/testing/web-platform/tests/css/css-transforms/translate-getComputedStyle.html
@@ -1,14 +1,13 @@
 <!DOCTYPE html>
 <html>
 <head>
   <meta charset="utf-8">
   <title>CSS Transform Module Level 2: translate getComputedStyle</title>
-  <link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
   <link rel="help" href="https://drafts.csswg.org/css-transforms-2/#propdef-translate">
   <meta name="assert" content="translate computed style does not resolve percentages.">
   <style type="text/css">
     #container {
       transform-style: preserve-3d;;
     }
     #first {
       font-size: 10px;
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-transitions/parsing/transition-computed.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Transitions: getComputedStyle().transition</title>
+<link rel="help" href="https://drafts.csswg.org/css-transitions/#transition-shorthand-property">
+<meta name="assert" content="transition computed value is as specified.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/computed-testcommon.js"></script>
+</head>
+<body>
+<div id="target"></div>
+<script>
+// <single-transition> = [ none | <single-transition-property> ] ||
+// <time> || <easing-function> || <time>
+test_computed_value("transition", "1s", "all 1s ease 0s");
+test_computed_value("transition", "cubic-bezier(0, -2, 1, 3)", "all 0s cubic-bezier(0, -2, 1, 3) 0s");
+test_computed_value("transition", "1s -3s", "all 1s ease -3s");
+test_computed_value("transition", "none", "none 0s ease 0s");
+test_computed_value("transition", "top", "top 0s ease 0s");
+
+test_computed_value("transition", "1s -3s cubic-bezier(0, -2, 1, 3) top", "top 1s cubic-bezier(0, -2, 1, 3) -3s");
+test_computed_value("transition", "1s -3s, cubic-bezier(0, -2, 1, 3) top", "all 1s ease -3s, top 0s cubic-bezier(0, -2, 1, 3) 0s");
+
+// TODO: Add test with a single timing-function keyword.
+</script>
+</body>
+</html>
--- a/testing/web-platform/tests/fetch/api/resources/preflight.py
+++ b/testing/web-platform/tests/fetch/api/resources/preflight.py
@@ -21,17 +21,16 @@ def main(request, response):
     if "credentials" in request.GET:
         headers.append(("Access-Control-Allow-Credentials", "true"))
 
     if request.method == "OPTIONS":
         if not "Access-Control-Request-Method" in request.headers:
             response.set_error(400, "No Access-Control-Request-Method header")
             return "ERROR: No access-control-request-method in preflight!"
 
-        # https://github.com/whatwg/fetch/issues/922
         if request.headers.get("Accept", "") != "*/*":
             response.set_error(400, "Request does not have 'Accept: */*' header")
             return "ERROR: Invalid access in preflight!"
 
         if "control_request_headers" in request.GET:
             stashed_data['control_request_headers'] = request.headers.get("Access-Control-Request-Headers", None)
 
         if "max_age" in request.GET:
--- a/testing/web-platform/tests/fonts/Ahem.ttf.headers
+++ b/testing/web-platform/tests/fonts/Ahem.ttf.headers
@@ -1,1 +1,2 @@
 Access-Control-Allow-Origin: *
+Cache-Control: max-age=3600
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/fonts/CanvasTest.ttf.headers
@@ -0,0 +1,1 @@
+Cache-Control: max-age=3600
deleted file mode 100644
--- a/testing/web-platform/tests/fonts/CanvasTest.ttf.sub.headers
+++ /dev/null
@@ -1,1 +0,0 @@
-Cache-Control: max-age=1000
--- a/testing/web-platform/tests/fonts/ahem.css
+++ b/testing/web-platform/tests/fonts/ahem.css
@@ -1,5 +1,6 @@
 @font-face {
     font-family: 'Ahem';
-    src: url('/fonts/Ahem.ttf');
+    src: local('Ahem'),
+         url('/fonts/Ahem.ttf');
 }
 
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/fonts/ahem.css.headers
@@ -0,0 +1,2 @@
+Content-Type: text/css;charset=utf-8
+Cache-Control: max-age=3600
--- a/testing/web-platform/tests/generic-sensor/resources/generic-sensor-helpers.js
+++ b/testing/web-platform/tests/generic-sensor/resources/generic-sensor-helpers.js
@@ -56,18 +56,21 @@ function sensor_test(func, name, propert
       await func(t, sensorTest.getSensorProvider());
     } finally {
       await sensorTest.reset();
     };
   }, name, properties);
 }
 
 function verifySensorReading(pattern, values, timestamp, isNull) {
+  // If |val| cannot be converted to a float, we return the original value.
+  // This can happen when a value in |pattern| is not a number.
   function round(val) {
-    return Number.parseFloat(val).toPrecision(6);
+    const res = Number.parseFloat(val).toPrecision(6);
+    return res === "NaN" ? val : res;
   }
 
   if (isNull) {
     return (values === null || values.every(r => r === null)) &&
            timestamp === null;
   }
 
   return values.every((r, i) => round(r) === round(pattern[i])) &&
@@ -87,16 +90,20 @@ function verifyAlsSensorReading(pattern,
 }
 
 function verifyGeoSensorReading(pattern, {latitude, longitude, altitude,
   accuracy, altitudeAccuracy, heading, speed, timestamp}, isNull) {
   return verifySensorReading(pattern, [latitude, longitude, altitude,
     accuracy, altitudeAccuracy, heading, speed], timestamp, isNull);
 }
 
+function verifyProximitySensorReading(pattern, {distance, max, near, timestamp}, isNull) {
+  return verifySensorReading(pattern, [distance, max, near], timestamp, isNull);
+}
+
 // A "sliding window" that iterates over |data| and returns one item at a
 // time, advancing and wrapping around as needed. |data| must be an array of
 // arrays.
 class RingBuffer {
   constructor(data) {
     this.bufferPosition_ = 0;
     // Validate |data|'s format and deep-copy every element.
     this.data_ = Array.from(data, element => {
--- a/testing/web-platform/tests/interfaces/accelerometer.idl
+++ b/testing/web-platform/tests/interfaces/accelerometer.idl
@@ -1,35 +1,35 @@
 // GENERATED CONTENT - DO NOT EDIT
 // Content was automatically extracted by Reffy into reffy-reports
 // (https://github.com/tidoust/reffy-reports)
 // Source: Accelerometer (https://w3c.github.io/accelerometer/)
 
-[Constructor(optional AccelerometerSensorOptions options = {}), SecureContext,
-  Exposed=Window]
+[SecureContext, Exposed=Window]
 interface Accelerometer : Sensor {
+  constructor(optional AccelerometerSensorOptions options = {});
   readonly attribute double? x;
   readonly attribute double? y;
   readonly attribute double? z;
 };
 
 enum AccelerometerLocalCoordinateSystem { "device", "screen" };
 
 dictionary AccelerometerSensorOptions : SensorOptions {
   AccelerometerLocalCoordinateSystem referenceFrame = "device";
 };
 
-[Constructor(optional AccelerometerSensorOptions options = {}), SecureContext,
-  Exposed=Window]
+[SecureContext, Exposed=Window]
 interface LinearAccelerationSensor : Accelerometer {
+  constructor(optional AccelerometerSensorOptions options = {});
 };
 
-[Constructor(optional AccelerometerSensorOptions options = {}), SecureContext,
-  Exposed=Window]
+[SecureContext, Exposed=Window]
 interface GravitySensor : Accelerometer {
+  constructor(optional AccelerometerSensorOptions options = {});
 };
 
 dictionary AccelerometerReadingValues {
   required double? x;
   required double? y;
   required double? z;
 };
 
--- a/testing/web-platform/tests/interfaces/css-animation-worklet.idl
+++ b/testing/web-platform/tests/interfaces/css-animation-worklet.idl
@@ -17,21 +17,21 @@ callback AnimatorInstanceConstructor = a
 
 [ Exposed=AnimationWorklet ]
 interface WorkletAnimationEffect {
     EffectTiming         getTiming();
     ComputedEffectTiming getComputedTiming();
     attribute double? localTime;
 };
 
-[Exposed=Window,
- Constructor (DOMString animatorName,
+[Exposed=Window]
+interface WorkletAnimation : Animation {
+        constructor(DOMString animatorName,
               optional (AnimationEffect or sequence<AnimationEffect>)? effects = null,
               optional AnimationTimeline? timeline,
-              optional any options)]
-interface WorkletAnimation : Animation {
+              optional any options);
         readonly attribute DOMString animatorName;
 };
 
 [Exposed=AnimationWorklet]
 interface WorkletGroupEffect {
   sequence<WorkletAnimationEffect> getChildren();
 };
--- a/testing/web-platform/tests/interfaces/encoding.idl
+++ b/testing/web-platform/tests/interfaces/encoding.idl
@@ -13,50 +13,52 @@ dictionary TextDecoderOptions {
   boolean fatal = false;
   boolean ignoreBOM = false;
 };
 
 dictionary TextDecodeOptions {
   boolean stream = false;
 };
 
-[Constructor(optional DOMString label = "utf-8", optional TextDecoderOptions options = {}),
- Exposed=(Window,Worker)]
+[Exposed=(Window,Worker)]
 interface TextDecoder {
+  constructor(optional DOMString label = "utf-8", optional TextDecoderOptions options = {});
+
   USVString decode(optional BufferSource input, optional TextDecodeOptions options = {});
 };
 TextDecoder includes TextDecoderCommon;
 
 interface mixin TextEncoderCommon {
   readonly attribute DOMString encoding;
 };
 
 dictionary TextEncoderEncodeIntoResult {
   unsigned long long read;
   unsigned long long written;
 };
 
-[Constructor,
- Exposed=(Window,Worker)]
+[Exposed=(Window,Worker)]
 interface TextEncoder {
+  constructor();
+
   [NewObject] Uint8Array encode(optional USVString input = "");
   TextEncoderEncodeIntoResult encodeInto(USVString source, Uint8Array destination);
 };
 TextEncoder includes TextEncoderCommon;
 
 interface mixin GenericTransformStream {
   readonly attribute ReadableStream readable;
   readonly attribute WritableStream writable;
 };
 
-[Constructor(optional DOMString label = "utf-8", optional TextDecoderOptions options),
- Exposed=(Window,Worker)]
+[Exposed=(Window,Worker)]
 interface TextDecoderStream {
+  constructor(optional DOMString label = "utf-8", optional TextDecoderOptions options = {});
 };
 TextDecoderStream includes TextDecoderCommon;
 TextDecoderStream includes GenericTransformStream;
 
-[Constructor,
- Exposed=(Window,Worker)]
+[Exposed=(Window,Worker)]
 interface TextEncoderStream {
+  constructor();
 };
 TextEncoderStream includes TextEncoderCommon;
 TextEncoderStream includes GenericTransformStream;
--- a/testing/web-platform/tests/interfaces/entries-api.idl
+++ b/testing/web-platform/tests/interfaces/entries-api.idl
@@ -13,27 +13,29 @@ partial interface HTMLInputElement {
 };
 
 partial interface DataTransferItem {
     FileSystemEntry? webkitGetAsEntry();
 };
 
 callback ErrorCallback = void (DOMException err);
 
+[Exposed=Window]
 interface FileSystemEntry {
     readonly attribute boolean isFile;
     readonly attribute boolean isDirectory;
     readonly attribute USVString name;
     readonly attribute USVString fullPath;
     readonly attribute FileSystem filesystem;
 
     void getParent(optional FileSystemEntryCallback successCallback,
                    optional ErrorCallback errorCallback);
 };
 
+[Exposed=Window]
 interface FileSystemDirectoryEntry : FileSystemEntry {
     FileSystemDirectoryReader createReader();
     void getFile(optional USVString? path,
                  optional FileSystemFlags options = {},
                  optional FileSystemEntryCallback successCallback,
                  optional ErrorCallback errorCallback);
     void getDirectory(optional USVString? path,
                       optional FileSystemFlags options = {},
@@ -43,24 +45,27 @@ interface FileSystemDirectoryEntry : Fil
 
 dictionary FileSystemFlags {
     boolean create = false;
     boolean exclusive = false;
 };
 
 callback FileSystemEntryCallback = void (FileSystemEntry entry);
 
+[Exposed=Window]
 interface FileSystemDirectoryReader {
     void readEntries(FileSystemEntriesCallback successCallback,
                      optional ErrorCallback errorCallback);
 };
 callback FileSystemEntriesCallback = void (sequence<FileSystemEntry> entries);
 
+[Exposed=Window]
 interface FileSystemFileEntry : FileSystemEntry {
     void file(FileCallback successCallback,
               optional ErrorCallback errorCallback);
 };
 callback FileCallback = void (File file);
 
+[Exposed=Window]
 interface FileSystem {
     readonly attribute USVString name;
     readonly attribute FileSystemDirectoryEntry root;
 };
--- a/testing/web-platform/tests/interfaces/gyroscope.idl
+++ b/testing/web-platform/tests/interfaces/gyroscope.idl
@@ -1,15 +1,16 @@
 // GENERATED CONTENT - DO NOT EDIT
 // Content was automatically extracted by Reffy into reffy-reports
 // (https://github.com/tidoust/reffy-reports)
 // Source: Gyroscope (https://w3c.github.io/gyroscope/)
 
-[Constructor(optional GyroscopeSensorOptions sensorOptions), SecureContext, Exposed=Window]
+[SecureContext, Exposed=Window]
 interface Gyroscope : Sensor {
+  constructor(optional GyroscopeSensorOptions sensorOptions = {});
   readonly attribute double? x;
   readonly attribute double? y;
   readonly attribute double? z;
 };
 
 enum GyroscopeLocalCoordinateSystem { "device", "screen" };
 
 dictionary GyroscopeSensorOptions : SensorOptions {
--- a/testing/web-platform/tests/interfaces/mediasession.idl
+++ b/testing/web-platform/tests/interfaces/mediasession.idl
@@ -72,10 +72,10 @@ dictionary MediaSessionActionDetails {
 };
 
 dictionary MediaSessionSeekActionDetails : MediaSessionActionDetails {
   double? seekOffset;
 };
 
 dictionary MediaSessionSeekToActionDetails : MediaSessionActionDetails {
   required double seekTime;
-  bool? fastSeek;
+  boolean? fastSeek;
 };
--- a/testing/web-platform/tests/interfaces/presentation-api.idl
+++ b/testing/web-platform/tests/interfaces/presentation-api.idl
@@ -43,17 +43,16 @@ interface PresentationConnectionAvailabl
   [SameObject] readonly attribute PresentationConnection connection;
 };
 
 dictionary PresentationConnectionAvailableEventInit : EventInit {
   required PresentationConnection connection;
 };
 
 enum PresentationConnectionState { "connecting", "connected", "closed", "terminated" };
-enum BinaryType { "blob", "arraybuffer" };
 
 [SecureContext, Exposed=Window]
 interface PresentationConnection : EventTarget {
   readonly attribute USVString id;
   readonly attribute USVString url;
   readonly attribute PresentationConnectionState state;
   void close();
   void terminate();
--- a/testing/web-platform/tests/interfaces/shape-detection-api.idl
+++ b/testing/web-platform/tests/interfaces/shape-detection-api.idl
@@ -1,17 +1,17 @@
 // GENERATED CONTENT - DO NOT EDIT
 // Content was automatically extracted by Reffy into reffy-reports
 // (https://github.com/tidoust/reffy-reports)
 // Source: Accelerated Shape Detection in Images (https://wicg.github.io/shape-detection-api/)
 
 [Exposed=(Window,Worker),
- SecureContext,
- Constructor(optional FaceDetectorOptions faceDetectorOptions = {})]
+ SecureContext]
 interface FaceDetector {
+  constructor(optional FaceDetectorOptions faceDetectorOptions = {});
   Promise<sequence<DetectedFace>> detect(ImageBitmapSource image);
 };
 
 dictionary FaceDetectorOptions {
   unsigned short maxDetectedFaces;
   boolean fastMode;
 };
 
@@ -30,19 +30,19 @@ dictionary Landmark {
 
 enum LandmarkType {
   "mouth",
   "eye",
   "nose"
 };
 
 [Exposed=(Window,Worker),
- SecureContext,
- Constructor(optional BarcodeDetectorOptions barcodeDetectorOptions = {})]
+ SecureContext]
 interface BarcodeDetector {
+  constructor(optional BarcodeDetectorOptions barcodeDetectorOptions = {});
   static Promise<sequence<BarcodeFormat>> getSupportedFormats();
 
   Promise<sequence<DetectedBarcode>> detect(ImageBitmapSource image);
 };
 
 dictionary BarcodeDetectorOptions {
   sequence<BarcodeFormat> formats;
 };
--- a/testing/web-platform/tests/interfaces/user-timing.idl
+++ b/testing/web-platform/tests/interfaces/user-timing.idl
@@ -17,18 +17,18 @@ dictionary PerformanceMeasureOptions {
 
 partial interface Performance {
     PerformanceMark mark(DOMString markName, optional PerformanceMarkOptions markOptions = {});
     void clearMarks(optional DOMString markName);
     PerformanceMeasure measure(DOMString measureName, optional (DOMString or PerformanceMeasureOptions) startOrMeasureOptions = {}, optional DOMString endMark);
     void clearMeasures(optional DOMString measureName);
 };
 
-[Exposed=(Window,Worker),
- Constructor(DOMString markName, optional PerformanceMarkOptions markOptions = {})]
+[Exposed=(Window,Worker)]
 interface PerformanceMark : PerformanceEntry {
+  constructor(DOMString markName, optional PerformanceMarkOptions markOptions = {});
   readonly attribute any detail;
 };
 
 [Exposed=(Window,Worker)]
 interface PerformanceMeasure : PerformanceEntry {
   readonly attribute any detail;
 };
--- a/testing/web-platform/tests/interfaces/web-bluetooth.idl
+++ b/testing/web-platform/tests/interfaces/web-bluetooth.idl
@@ -55,20 +55,20 @@ dictionary BluetoothPermissionData {
 
 [Exposed=Window]
 interface BluetoothPermissionResult : PermissionStatus {
   attribute FrozenArray<BluetoothDevice> devices;
 };
 
 [
   Exposed=Window,
-  Constructor(DOMString type, optional ValueEventInit initDict = {}),
   SecureContext
 ]
 interface ValueEvent : Event {
+  constructor(DOMString type, optional ValueEventInit initDict = {});
   readonly attribute any value;
 };
 
 dictionary ValueEventInit : EventInit {
   any value = null;
 };
 
 [Exposed=Window, SecureContext]
@@ -90,20 +90,20 @@ interface BluetoothManufacturerDataMap {
   readonly maplike<unsigned short, DataView>;
 };
 [Exposed=Window, SecureContext]
 interface BluetoothServiceDataMap {
   readonly maplike<UUID, DataView>;
 };
 [
   Exposed=Window,
-  Constructor(DOMString type, BluetoothAdvertisingEventInit init),
   SecureContext
 ]
 interface BluetoothAdvertisingEvent : Event {
+  constructor(DOMString type, BluetoothAdvertisingEventInit init);
   [SameObject]
   readonly attribute BluetoothDevice device;
   readonly attribute FrozenArray<UUID> uuids;
   readonly attribute DOMString? name;
   readonly attribute unsigned short? appearance;
   readonly attribute byte? txPower;
   readonly attribute byte? rssi;
   [SameObject]
--- a/testing/web-platform/tests/interfaces/webaudio.idl
+++ b/testing/web-platform/tests/interfaces/webaudio.idl
@@ -33,17 +33,17 @@ interface BaseAudioContext : EventTarget
   ConstantSourceNode createConstantSource ();
   ConvolverNode createConvolver ();
   DelayNode createDelay (optional double maxDelayTime = 1.0);
   DynamicsCompressorNode createDynamicsCompressor ();
   GainNode createGain ();
   IIRFilterNode createIIRFilter (sequence<double> feedforward, sequence<double> feedback);
   OscillatorNode createOscillator ();
   PannerNode createPanner ();
-  PeriodicWave createPeriodicWave (sequence<float> real, sequence<float> imag, optional PeriodicWaveConstraints constraints);
+  PeriodicWave createPeriodicWave (sequence<float> real, sequence<float> imag, optional PeriodicWaveConstraints constraints = {});
   ScriptProcessorNode createScriptProcessor(optional unsigned long bufferSize = 0,
                                             optional unsigned long numberOfInputChannels = 2,
                                             optional unsigned long numberOfOutputChannels = 2);
   StereoPannerNode createStereoPanner ();
   WaveShaperNode createWaveShaper ();
 
   Promise<AudioBuffer> decodeAudioData (ArrayBuffer audioData,
                                         optional DecodeSuccessCallback? successCallback,
@@ -51,71 +51,71 @@ interface BaseAudioContext : EventTarget
 };
 
 enum AudioContextLatencyCategory {
     "balanced",
     "interactive",
     "playback"
 };
 
-[Exposed=Window,
- Constructor (optional AudioContextOptions contextOptions)]
+[Exposed=Window]
 interface AudioContext : BaseAudioContext {
-    readonly attribute double baseLatency;
-    readonly attribute double outputLatency;
-    AudioTimestamp getOutputTimestamp ();
-    Promise<void> resume ();
-    Promise<void> suspend ();
-    Promise<void> close ();
-    MediaElementAudioSourceNode createMediaElementSource (HTMLMediaElement mediaElement);
-    MediaStreamAudioSourceNode createMediaStreamSource (MediaStream mediaStream);
-    MediaStreamTrackAudioSourceNode createMediaStreamTrackSource (MediaStreamTrack mediaStreamTrack);
-    MediaStreamAudioDestinationNode createMediaStreamDestination ();
+  constructor (optional AudioContextOptions contextOptions = {});
+  readonly attribute double baseLatency;
+  readonly attribute double outputLatency;
+  AudioTimestamp getOutputTimestamp ();
+  Promise<void> resume ();
+  Promise<void> suspend ();
+  Promise<void> close ();
+  MediaElementAudioSourceNode createMediaElementSource (HTMLMediaElement mediaElement);
+  MediaStreamAudioSourceNode createMediaStreamSource (MediaStream mediaStream);
+  MediaStreamTrackAudioSourceNode createMediaStreamTrackSource (MediaStreamTrack mediaStreamTrack);
+  MediaStreamAudioDestinationNode createMediaStreamDestination ();
 };
 
 dictionary AudioContextOptions {
   (AudioContextLatencyCategory or double) latencyHint = "interactive";
   float sampleRate;
 };
 
 dictionary AudioTimestamp {
   double contextTime;
   DOMHighResTimeStamp performanceTime;
 };
 
-[Exposed=Window,
- Constructor (OfflineAudioContextOptions contextOptions),
- Constructor (unsigned long numberOfChannels, unsigned long length, float sampleRate)]
+[Exposed=Window]
 interface OfflineAudioContext : BaseAudioContext {
+  constructor(OfflineAudioContextOptions contextOptions);
+  constructor(unsigned long numberOfChannels, unsigned long length, float sampleRate);
   Promise<AudioBuffer> startRendering();
   Promise<void> resume();
   Promise<void> suspend(double suspendTime);
   readonly attribute unsigned long length;
   attribute EventHandler oncomplete;
 };
 
 dictionary OfflineAudioContextOptions {
   unsigned long numberOfChannels = 1;
   required unsigned long length;
   required float sampleRate;
 };
 
-[Exposed=Window,
- Constructor (DOMString type, OfflineAudioCompletionEventInit eventInitDict)]
+[Exposed=Window]
 interface OfflineAudioCompletionEvent : Event {
+  constructor (DOMString type, OfflineAudioCompletionEventInit eventInitDict);
   readonly attribute AudioBuffer renderedBuffer;
 };
 
 dictionary OfflineAudioCompletionEventInit : EventInit {
   required AudioBuffer renderedBuffer;
 };
 
-[Exposed=Window,
- Constructor (AudioBufferOptions options)]
+[Exposed=Window]
 interface AudioBuffer {
+  constructor (AudioBufferOptions options);
   readonly attribute float sampleRate;
   readonly attribute unsigned long length;
   readonly attribute double duration;
   readonly attribute unsigned long numberOfChannels;
   Float32Array getChannelData (unsigned long channel);
   void copyFromChannel (Float32Array destination, unsigned long channelNumber, optional unsigned long bufferOffset = 0);
   void copyToChannel (Float32Array source, unsigned long channelNumber, optional unsigned long bufferOffset = 0);
 };
@@ -187,19 +187,19 @@ interface AudioParam {
 
 [Exposed=Window]
 interface AudioScheduledSourceNode : AudioNode {
   attribute EventHandler onended;
   void start(optional double when = 0);
   void stop(optional double when = 0);
 };
 
-[Exposed=Window,
- Constructor (BaseAudioContext context, optional AnalyserOptions options = {})]
+[Exposed=Window]
 interface AnalyserNode : AudioNode {
+  constructor (BaseAudioContext context, optional AnalyserOptions options = {});
   void getFloatFrequencyData (Float32Array array);
   void getByteFrequencyData (Uint8Array array);
   void getFloatTimeDomainData (Float32Array array);
   void getByteTimeDomainData (Uint8Array array);
   attribute unsigned long fftSize;
   readonly attribute unsigned long frequencyBinCount;
   attribute double minDecibels;
   attribute double maxDecibels;
@@ -208,19 +208,19 @@ interface AnalyserNode : AudioNode {
 
 dictionary AnalyserOptions : AudioNodeOptions {
   unsigned long fftSize = 2048;
   double maxDecibels = -30;
   double minDecibels = -100;
   double smoothingTimeConstant = 0.8;
 };
 
-[Exposed=Window,
- Constructor (BaseAudioContext context, optional AudioBufferSourceOptions options = {})]
+[Exposed=Window]
 interface AudioBufferSourceNode : AudioScheduledSourceNode {
+  constructor (BaseAudioContext context, optional AudioBufferSourceOptions options = {});
   attribute AudioBuffer? buffer;
   readonly attribute AudioParam playbackRate;
   readonly attribute AudioParam detune;
   attribute boolean loop;
   attribute double loopStart;
   attribute double loopEnd;
   void start (optional double when = 0,
               optional double offset,
@@ -251,19 +251,19 @@ interface AudioListener {
   readonly attribute AudioParam forwardZ;
   readonly attribute AudioParam upX;
   readonly attribute AudioParam upY;
   readonly attribute AudioParam upZ;
   void setPosition (float x, float y, float z);
   void setOrientation (float x, float y, float z, float xUp, float yUp, float zUp);
 };
 
-[Exposed=Window,
- Constructor (DOMString type, AudioProcessingEventInit eventInitDict)]
+[Exposed=Window]
 interface AudioProcessingEvent : Event {
+  constructor (DOMString type, AudioProcessingEventInit eventInitDict);
   readonly attribute double playbackTime;
   readonly attribute AudioBuffer inputBuffer;
   readonly attribute AudioBuffer outputBuffer;
 };
 
 dictionary AudioProcessingEventInit : EventInit {
   required double playbackTime;
   required AudioBuffer inputBuffer;
@@ -276,172 +276,172 @@ enum BiquadFilterType {
   "bandpass",
   "lowshelf",
   "highshelf",
   "peaking",
   "notch",
   "allpass"
 };
 
-[Exposed=Window,
- Constructor (BaseAudioContext context, optional BiquadFilterOptions options = {})]
+[Exposed=Window]
 interface BiquadFilterNode : AudioNode {
+  constructor (BaseAudioContext context, optional BiquadFilterOptions options = {});
   attribute BiquadFilterType type;
   readonly attribute AudioParam frequency;
   readonly attribute AudioParam detune;
   readonly attribute AudioParam Q;
   readonly attribute AudioParam gain;
   void getFrequencyResponse (Float32Array frequencyHz, Float32Array magResponse, Float32Array phaseResponse);
 };
 
 dictionary BiquadFilterOptions : AudioNodeOptions {
   BiquadFilterType type = "lowpass";
   float Q = 1;
   float detune = 0;
   float frequency = 350;
   float gain = 0;
 };
 
-[Exposed=Window,
- Constructor (BaseAudioContext context, optional ChannelMergerOptions options = {})]
+[Exposed=Window]
 interface ChannelMergerNode : AudioNode {
+  constructor (BaseAudioContext context, optional ChannelMergerOptions options = {});
 };
 
 dictionary ChannelMergerOptions : AudioNodeOptions {
   unsigned long numberOfInputs = 6;
 };
 
-[Exposed=Window,
- Constructor (BaseAudioContext context, optional ChannelSplitterOptions options = {})]
+[Exposed=Window]
 interface ChannelSplitterNode : AudioNode {
+  constructor (BaseAudioContext context, optional ChannelSplitterOptions options = {});
 };
 
 dictionary ChannelSplitterOptions : AudioNodeOptions {
   unsigned long numberOfOutputs = 6;
 };
 
-[Exposed=Window,
- Constructor (BaseAudioContext context, optional ConstantSourceOptions options = {})]
+[Exposed=Window]
 interface ConstantSourceNode : AudioScheduledSourceNode {
+  constructor (BaseAudioContext context, optional ConstantSourceOptions options = {});
   readonly attribute AudioParam offset;
 };
 
 dictionary ConstantSourceOptions {
   float offset = 1;
 };
 
-[Exposed=Window,
- Constructor (BaseAudioContext context, optional ConvolverOptions options = {})]
+[Exposed=Window]
 interface ConvolverNode : AudioNode {
+  constructor (BaseAudioContext context, optional ConvolverOptions options = {});
   attribute AudioBuffer? buffer;
   attribute boolean normalize;
 };
 
 dictionary ConvolverOptions : AudioNodeOptions {
   AudioBuffer? buffer;
   boolean disableNormalization = false;
 };
 
-[Exposed=Window,
- Constructor (BaseAudioContext context, optional DelayOptions options = {})]
+[Exposed=Window]
 interface DelayNode : AudioNode {
+  constructor (BaseAudioContext context, optional DelayOptions options = {});
   readonly attribute AudioParam delayTime;
 };
 
 dictionary DelayOptions : AudioNodeOptions {
   double maxDelayTime = 1;
   double delayTime = 0;
 };
 
-[Exposed=Window,
- Constructor (BaseAudioContext context, optional DynamicsCompressorOptions options = {})]
+[Exposed=Window]
 interface DynamicsCompressorNode : AudioNode {
+  constructor (BaseAudioContext context, optional DynamicsCompressorOptions options = {});
   readonly attribute AudioParam threshold;
   readonly attribute AudioParam knee;
   readonly attribute AudioParam ratio;
   readonly attribute float reduction;
   readonly attribute AudioParam attack;
   readonly attribute AudioParam release;
 };
 
 dictionary DynamicsCompressorOptions : AudioNodeOptions {
   float attack = 0.003;
   float knee = 30;
   float ratio = 12;
   float release = 0.25;
   float threshold = -24;
 };
 
-[Exposed=Window,
- Constructor (BaseAudioContext context, optional GainOptions options = {})]
+[Exposed=Window]
 interface GainNode : AudioNode {
+  constructor (BaseAudioContext context, optional GainOptions options = {});
   readonly attribute AudioParam gain;
 };
 
 dictionary GainOptions : AudioNodeOptions {
   float gain = 1.0;
 };
 
-[Exposed=Window,
- Constructor (BaseAudioContext context, IIRFilterOptions options)]
+[Exposed=Window]
 interface IIRFilterNode : AudioNode {
+  constructor (BaseAudioContext context, IIRFilterOptions options);
   void getFrequencyResponse (Float32Array frequencyHz, Float32Array magResponse, Float32Array phaseResponse);
 };
 
 dictionary IIRFilterOptions : AudioNodeOptions {
   required sequence<double> feedforward;
   required sequence<double> feedback;
 };
 
-[Exposed=Window,
- Constructor (AudioContext context, MediaElementAudioSourceOptions options)]
+[Exposed=Window]
 interface MediaElementAudioSourceNode : AudioNode {
+  constructor (AudioContext context, MediaElementAudioSourceOptions options);
   [SameObject] readonly attribute HTMLMediaElement mediaElement;
 };
 
 dictionary MediaElementAudioSourceOptions {
   required HTMLMediaElement mediaElement;
 };
 
-[Exposed=Window,
- Constructor (AudioContext context, optional AudioNodeOptions options = {})]
+[Exposed=Window]
 interface MediaStreamAudioDestinationNode : AudioNode {
+  constructor (AudioContext context, optional AudioNodeOptions options = {});
   readonly attribute MediaStream stream;
 };
 
-[Exposed=Window,
- Constructor (AudioContext context, MediaStreamAudioSourceOptions options)]
+[Exposed=Window]
 interface MediaStreamAudioSourceNode : AudioNode {
+  constructor (AudioContext context, MediaStreamAudioSourceOptions options);
   [SameObject] readonly attribute MediaStream mediaStream;
 };
 
 dictionary MediaStreamAudioSourceOptions {
   required MediaStream mediaStream;
 };
 
-[Exposed=Window,
- Constructor (AudioContext context, MediaStreamTrackAudioSourceOptions options)]
+[Exposed=Window]
 interface MediaStreamTrackAudioSourceNode : AudioNode {
+  constructor (AudioContext context, MediaStreamTrackAudioSourceOptions options);
 };
 
 dictionary MediaStreamTrackAudioSourceOptions {
   required MediaStreamTrack mediaStreamTrack;
 };
 
 enum OscillatorType {
   "sine",
   "square",
   "sawtooth",
   "triangle",
   "custom"
 };
 
-[Exposed=Window,
- Constructor (BaseAudioContext context, optional OscillatorOptions options = {})]
+[Exposed=Window]
 interface OscillatorNode : AudioScheduledSourceNode {
+  constructor (BaseAudioContext context, optional OscillatorOptions options = {});
   attribute OscillatorType type;
   readonly attribute AudioParam frequency;
   readonly attribute AudioParam detune;
   void setPeriodicWave (PeriodicWave periodicWave);
 };
 
 dictionary OscillatorOptions : AudioNodeOptions {
   OscillatorType type = "sine";
@@ -456,19 +456,19 @@ enum PanningModelType {
 };
 
 enum DistanceModelType {
   "linear",
   "inverse",
   "exponential"
 };
 
-[Exposed=Window,
- Constructor (BaseAudioContext context, optional PannerOptions options = {})]
+[Exposed=Window]
 interface PannerNode : AudioNode {
+  constructor (BaseAudioContext context, optional PannerOptions options = {});
   attribute PanningModelType panningModel;
   readonly attribute AudioParam positionX;
   readonly attribute AudioParam positionY;
   readonly attribute AudioParam positionZ;
   readonly attribute AudioParam orientationX;
   readonly attribute AudioParam orientationY;
   readonly attribute AudioParam orientationZ;
   attribute DistanceModelType distanceModel;
@@ -494,19 +494,19 @@ dictionary PannerOptions : AudioNodeOpti
   double refDistance = 1;
   double maxDistance = 10000;
   double rolloffFactor = 1;
   double coneInnerAngle = 360;
   double coneOuterAngle = 360;
   double coneOuterGain = 0;
 };
 
-[Exposed=Window,
- Constructor (BaseAudioContext context, optional PeriodicWaveOptions options = {})]
+[Exposed=Window]
 interface PeriodicWave {
+  constructor (BaseAudioContext context, optional PeriodicWaveOptions options = {});
 };
 
 dictionary PeriodicWaveConstraints {
   boolean disableNormalization = false;
 };
 
 dictionary PeriodicWaveOptions : PeriodicWaveConstraints {
   sequence<float> real;
@@ -514,35 +514,35 @@ dictionary PeriodicWaveOptions : Periodi
 };
 
 [Exposed=Window]
 interface ScriptProcessorNode : AudioNode {
   attribute EventHandler onaudioprocess;
   readonly attribute long bufferSize;
 };
 
-[Exposed=Window,
- Constructor (BaseAudioContext context, optional StereoPannerOptions options = {})]
+[Exposed=Window]
 interface StereoPannerNode : AudioNode {
+  constructor (BaseAudioContext context, optional StereoPannerOptions options = {});
   readonly attribute AudioParam pan;
 };
 
 dictionary StereoPannerOptions : AudioNodeOptions {
   float pan = 0;
 };
 
 enum OverSampleType {
   "none",
   "2x",
   "4x"
 };
 
-[Exposed=Window,
- Constructor (BaseAudioContext context, optional WaveShaperOptions options = {})]
+[Exposed=Window]
 interface WaveShaperNode : AudioNode {
+  constructor (BaseAudioContext context, optional WaveShaperOptions options = {});
   attribute Float32Array? curve;
   attribute OverSampleType oversample;
 };
 
 dictionary WaveShaperOptions : AudioNodeOptions {
   sequence<float> curve;
   OverSampleType oversample = "none";
 };
@@ -561,37 +561,36 @@ interface AudioWorkletGlobalScope : Work
   readonly attribute float sampleRate;
 };
 
 [Exposed=Window]
 interface AudioParamMap {
   readonly maplike<DOMString, AudioParam>;
 };
 
-[Exposed=Window,
- SecureContext,
- Constructor (BaseAudioContext context, DOMString name,
-              optional AudioWorkletNodeOptions options = {})]
+[Exposed=Window, SecureContext]
 interface AudioWorkletNode : AudioNode {
+  constructor (BaseAudioContext context, DOMString name,
+               optional AudioWorkletNodeOptions options = {});
   readonly attribute AudioParamMap parameters;
   readonly attribute MessagePort port;
   attribute EventHandler onprocessorerror;
 };
 
 dictionary AudioWorkletNodeOptions : AudioNodeOptions {
   unsigned long numberOfInputs = 1;
   unsigned long numberOfOutputs = 1;
   sequence<unsigned long> outputChannelCount;
   record<DOMString, double> parameterData;
   object processorOptions;
 };
 
-[Exposed=AudioWorklet,
-Constructor (optional AudioWorkletNodeOptions options = {})]
+[Exposed=AudioWorklet]
 interface AudioWorkletProcessor {
+  constructor (optional AudioWorkletNodeOptions options = {});
   readonly attribute MessagePort port;
 };
 
 dictionary AudioParamDescriptor {
   required DOMString name;
   float defaultValue = 0;
   float minValue = -3.4028235e38;
   float maxValue = 3.4028235e38;
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/interfaces/webrtc-identity.idl
@@ -0,0 +1,67 @@
+// GENERATED CONTENT - DO NOT EDIT
+// Content was automatically extracted by Reffy into reffy-reports
+// (https://github.com/tidoust/reffy-reports)
+// Source: Identity for WebRTC 1.0 (https://w3c.github.io/webrtc-identity/identity.html)
+
+[Global, Exposed=RTCIdentityProviderGlobalScope]
+interface RTCIdentityProviderGlobalScope : WorkerGlobalScope {
+    readonly        attribute RTCIdentityProviderRegistrar rtcIdentityProvider;
+};
+
+[Exposed=RTCIdentityProviderGlobalScope]
+interface RTCIdentityProviderRegistrar {
+    void register(RTCIdentityProvider idp);
+};
+
+dictionary RTCIdentityProvider {
+    required GenerateAssertionCallback generateAssertion;
+    required ValidateAssertionCallback validateAssertion;
+};
+
+callback GenerateAssertionCallback = Promise<RTCIdentityAssertionResult> (DOMString contents, DOMString origin, RTCIdentityProviderOptions options);
+
+callback ValidateAssertionCallback = Promise<RTCIdentityValidationResult> (DOMString assertion, DOMString origin);
+
+dictionary RTCIdentityAssertionResult {
+    required RTCIdentityProviderDetails idp;
+    required DOMString assertion;
+};
+
+dictionary RTCIdentityProviderDetails {
+    required DOMString domain;
+             DOMString protocol = "default";
+};
+
+dictionary RTCIdentityValidationResult {
+    required DOMString identity;
+    required DOMString contents;
+};
+
+partial interface RTCPeerConnection {
+    void setIdentityProvider(DOMString provider, optional RTCIdentityProviderOptions options);
+    Promise<DOMString> getIdentityAssertion();
+    readonly        attribute Promise<RTCIdentityAssertion> peerIdentity;
+    readonly        attribute DOMString? idpLoginUrl;
+    readonly        attribute DOMString? idpErrorInfo;
+};
+
+dictionary RTCIdentityProviderOptions {
+    DOMString protocol = "default";
+    DOMString usernameHint;
+    DOMString peerIdentity;
+};
+
+[Constructor(DOMString idp, DOMString name), Exposed=Window]
+interface RTCIdentityAssertion {
+    attribute DOMString idp;
+    attribute DOMString name;
+};
+
+partial dictionary MediaStreamConstraints {
+             DOMString peerIdentity;
+};
+
+partial interface MediaStreamTrack {
+    readonly        attribute boolean isolated;
+                    attribute EventHandler onisolationchange;
+};
--- a/testing/web-platform/tests/interfaces/webrtc.idl
+++ b/testing/web-platform/tests/interfaces/webrtc.idl
@@ -86,29 +86,30 @@ enum RTCIceConnectionState {
   "failed",
   "disconnected",
   "new",
   "checking",
   "completed",
   "connected"
 };
 
-[Exposed=Window, Constructor(optional RTCConfiguration configuration)]
-interface RTCPeerConnection : EventTarget {
-  Promise<RTCSessionDescriptionInit> createOffer(optional RTCOfferOptions options);
-  Promise<RTCSessionDescriptionInit> createAnswer(optional RTCAnswerOptions options);
-  Promise<void> setLocalDescription(optional RTCSessionDescriptionInit description);
+[Exposed=Window]
+interface RTCPeerConnection : EventTarget  {
+  constructor(optional RTCConfiguration configuration = {});
+  Promise<RTCSessionDescriptionInit> createOffer(optional RTCOfferOptions options = {});
+  Promise<RTCSessionDescriptionInit> createAnswer(optional RTCAnswerOptions options = {});
+  Promise<void> setLocalDescription(optional RTCSessionDescriptionInit description = {});
   readonly attribute RTCSessionDescription? localDescription;
   readonly attribute RTCSessionDescription? currentLocalDescription;
   readonly attribute RTCSessionDescription? pendingLocalDescription;
-  Promise<void> setRemoteDescription(optional RTCSessionDescriptionInit description);
+  Promise<void> setRemoteDescription(optional RTCSessionDescriptionInit description = {});
   readonly attribute RTCSessionDescription? remoteDescription;
   readonly attribute RTCSessionDescription? currentRemoteDescription;
   readonly attribute RTCSessionDescription? pendingRemoteDescription;
-  Promise<void> addIceCandidate(optional RTCIceCandidateInit candidate);
+  Promise<void> addIceCandidate(optional RTCIceCandidateInit candidate = {});
   readonly attribute RTCSignalingState signalingState;
   readonly attribute RTCIceGatheringState iceGatheringState;
   readonly attribute RTCIceConnectionState iceConnectionState;
   readonly attribute RTCPeerConnectionState connectionState;
   readonly attribute boolean? canTrickleIceCandidates;
   void restartIce();
   static sequence<RTCIceServer> getDefaultIceServers();
   RTCConfiguration getConfiguration();
@@ -116,28 +117,31 @@ interface RTCPeerConnection : EventTarge
   void close();
   attribute EventHandler onnegotiationneeded;
   attribute EventHandler onicecandidate;
   attribute EventHandler onicecandidateerror;
   attribute EventHandler onsignalingstatechange;
   attribute EventHandler oniceconnectionstatechange;
   attribute EventHandler onicegatheringstatechange;
   attribute EventHandler onconnectionstatechange;
-};
 
-partial interface RTCPeerConnection {
+  // Legacy Interface Extensions
+  // Supporting the methods in this section is optional.
+  // If these methods are supported
+  // they must be implemented as defined
+  // in section "Legacy Interface Extensions"
   Promise<void> createOffer(RTCSessionDescriptionCallback successCallback,
                             RTCPeerConnectionErrorCallback failureCallback,
-                            optional RTCOfferOptions options);
-  Promise<void> setLocalDescription(optional RTCSessionDescriptionInit description,
+                            optional RTCOfferOptions options = {});
+  Promise<void> setLocalDescription(optional RTCSessionDescriptionInit description = {},
                                     VoidFunction successCallback,
                                     RTCPeerConnectionErrorCallback failureCallback);
   Promise<void> createAnswer(RTCSessionDescriptionCallback successCallback,
                              RTCPeerConnectionErrorCallback failureCallback);
-  Promise<void> setRemoteDescription(optional RTCSessionDescriptionInit description,
+  Promise<void> setRemoteDescription(optional RTCSessionDescriptionInit description = {},
                                      VoidFunction successCallback,
                                      RTCPeerConnectionErrorCallback failureCallback);
   Promise<void> addIceCandidate(RTCIceCandidateInit candidate,
                                 VoidFunction successCallback,
                                 RTCPeerConnectionErrorCallback failureCallback);
 };
 
 callback RTCPeerConnectionErrorCallback = void (DOMException error);
@@ -151,30 +155,32 @@ partial dictionary RTCOfferOptions {
 
 enum RTCSdpType {
   "offer",
   "pranswer",
   "answer",
   "rollback"
 };
 
-[Exposed=Window, Constructor(optional RTCSessionDescriptionInit descriptionInitDict)]
+[Exposed=Window]
 interface RTCSessionDescription {
+  constructor(optional RTCSessionDescriptionInit descriptionInitDict = {});
   readonly attribute RTCSdpType type;
   readonly attribute DOMString sdp;
   [Default] object toJSON();
 };
 
 dictionary RTCSessionDescriptionInit {
   RTCSdpType type;
   DOMString sdp = "";
 };
 
-[Exposed=Window, Constructor(optional RTCIceCandidateInit candidateInitDict)]
+[Exposed=Window]
 interface RTCIceCandidate {
+  constructor(optional RTCIceCandidateInit candidateInitDict = {});
   readonly attribute DOMString candidate;
   readonly attribute DOMString? sdpMid;
   readonly attribute unsigned short? sdpMLineIndex;
   readonly attribute DOMString? foundation;
   readonly attribute RTCIceComponent? component;
   readonly attribute unsigned long? priority;
   readonly attribute DOMString? address;
   readonly attribute RTCIceProtocol? protocol;
@@ -207,31 +213,31 @@ enum RTCIceTcpCandidateType {
 
 enum RTCIceCandidateType {
   "host",
   "srflx",
   "prflx",
   "relay"
 };
 
-[Exposed=Window,
- Constructor(DOMString type, optional RTCPeerConnectionIceEventInit eventInitDict)]
+[Exposed=Window]
 interface RTCPeerConnectionIceEvent : Event {
+  constructor(DOMString type, optional RTCPeerConnectionIceEventInit eventInitDict = {});
   readonly attribute RTCIceCandidate? candidate;
   readonly attribute DOMString? url;
 };
 
 dictionary RTCPeerConnectionIceEventInit : EventInit {
   RTCIceCandidate? candidate;
   DOMString? url;
 };
 
-[Exposed=Window,
- Constructor(DOMString type, RTCPeerConnectionIceErrorEventInit eventInitDict)]
+[Exposed=Window]
 interface RTCPeerConnectionIceErrorEvent : Event {
+  constructor(DOMString type, RTCPeerConnectionIceErrorEventInit eventInitDict);
   readonly attribute DOMString hostCandidate;
   readonly attribute DOMString url;
   readonly attribute unsigned short errorCode;
   readonly attribute USVString errorText;
 };
 
 dictionary RTCPeerConnectionIceErrorEventInit : EventInit {
   DOMString hostCandidate;
@@ -243,17 +249,18 @@ dictionary RTCPeerConnectionIceErrorEven
 enum RTCPriorityType {
   "very-low",
   "low",
   "medium",
   "high"
 };
 
 partial interface RTCPeerConnection {
-  static Promise<RTCCertificate> generateCertificate(AlgorithmIdentifier keygenAlgorithm);
+  static Promise<RTCCertificate>
+      generateCertificate(AlgorithmIdentifier keygenAlgorithm);
 };
 
 dictionary RTCCertificateExpiration {
   [EnforceRange] DOMTimeStamp expires;
 };
 
 [Exposed=Window, Serializable]
 interface RTCCertificate {
@@ -264,17 +271,17 @@ interface RTCCertificate {
 
 partial interface RTCPeerConnection {
   sequence<RTCRtpSender> getSenders();
   sequence<RTCRtpReceiver> getReceivers();
   sequence<RTCRtpTransceiver> getTransceivers();
   RTCRtpSender addTrack(MediaStreamTrack track, MediaStream... streams);
   void removeTrack(RTCRtpSender sender);
   RTCRtpTransceiver addTransceiver((MediaStreamTrack or DOMString) trackOrKind,
-                                   optional RTCRtpTransceiverInit init);
+                                   optional RTCRtpTransceiverInit init = {});
   attribute EventHandler ontrack;
 };
 
 dictionary RTCRtpTransceiverInit {
   RTCRtpTransceiverDirection direction = "sendrecv";
   sequence<MediaStream> streams = [];
   sequence<RTCRtpEncodingParameters> sendEncodings = [];
 };
@@ -483,35 +490,36 @@ enum RTCIceRole {
   "controlled"
 };
 
 enum RTCIceComponent {
   "rtp",
   "rtcp"
 };
 
-[Exposed=Window, Constructor(DOMString type, RTCTrackEventInit eventInitDict)]
+[Exposed=Window]
 interface RTCTrackEvent : Event {
+  constructor(DOMString type, RTCTrackEventInit eventInitDict);
   readonly attribute RTCRtpReceiver receiver;
   readonly attribute MediaStreamTrack track;
   [SameObject] readonly attribute FrozenArray<MediaStream> streams;
   readonly attribute RTCRtpTransceiver transceiver;
 };
 
 dictionary RTCTrackEventInit : EventInit {
   required RTCRtpReceiver receiver;
   required MediaStreamTrack track;
   sequence<MediaStream> streams = [];
   required RTCRtpTransceiver transceiver;
 };
 
 partial interface RTCPeerConnection {
   readonly attribute RTCSctpTransport? sctp;
   RTCDataChannel createDataChannel(USVString label,
-                                   optional RTCDataChannelInit dataChannelDict);
+                                   optional RTCDataChannelInit dataChannelDict = {});
   attribute EventHandler ondatachannel;
 };
 
 [Exposed=Window]
 interface RTCSctpTransport : EventTarget {
   readonly attribute RTCDtlsTransport transport;
   readonly attribute RTCSctpTransportState state;
   readonly attribute unrestricted double maxMessageSize;
@@ -564,18 +572,19 @@ dictionary RTCDataChannelInit {
 
 enum RTCDataChannelState {
   "connecting",
   "open",
   "closing",
   "closed"
 };
 
-[Exposed=Window, Constructor(DOMString type, RTCDataChannelEventInit eventInitDict)]
+[Exposed=Window]
 interface RTCDataChannelEvent : Event {
+  constructor(DOMString type, RTCDataChannelEventInit eventInitDict);
   readonly attribute RTCDataChannel channel;
 };
 
 dictionary RTCDataChannelEventInit : EventInit {
   required RTCDataChannel channel;
 };
 
 partial interface RTCRtpSender {
@@ -585,19 +594,19 @@ partial interface RTCRtpSender {
 [Exposed=Window]
 interface RTCDTMFSender : EventTarget {
   void insertDTMF(DOMString tones, optional unsigned long duration = 100, optional unsigned long interToneGap = 70);
   attribute EventHandler ontonechange;
   readonly attribute boolean canInsertDTMF;
   readonly attribute DOMString toneBuffer;
 };
 
-[Exposed=Window,
- Constructor(DOMString type, RTCDTMFToneChangeEventInit eventInitDict)]
+[Exposed=Window]
 interface RTCDTMFToneChangeEvent : Event {
+  constructor(DOMString type, RTCDTMFToneChangeEventInit eventInitDict);
   readonly attribute DOMString tone;
 };
 
 dictionary RTCDTMFToneChangeEventInit : EventInit {
   required DOMString tone;
 };
 
 partial interface RTCPeerConnection {
@@ -611,28 +620,29 @@ interface RTCStatsReport {
 };
 
 dictionary RTCStats {
   required DOMHighResTimeStamp timestamp;
   required RTCStatsType type;
   required DOMString id;
 };
 
-[Exposed=Window,
- Constructor(DOMString type, RTCStatsEventInit eventInitDict)]
+[Exposed=Window]
 interface RTCStatsEvent : Event {
+  constructor(DOMString type, RTCStatsEventInit eventInitDict);
   readonly attribute RTCStatsReport report;
 };
 
 dictionary RTCStatsEventInit : EventInit {
   required RTCStatsReport report;
 };
 
-[Exposed=Window, Constructor(RTCErrorInit init, optional DOMString message = "")]
+[Exposed=Window]
 interface RTCError : DOMException {
+  constructor(RTCErrorInit init, optional DOMString message = "");
   readonly attribute RTCErrorDetailType errorDetail;
   readonly attribute long? sdpLineNumber;
   readonly attribute long? httpRequestStatusCode;
   readonly attribute long? sctpCauseCode;
   readonly attribute unsigned long? receivedAlert;
   readonly attribute unsigned long? sentAlert;
 };
 
@@ -658,17 +668,17 @@ enum RTCErrorDetailType {
   "idp-token-expired",
   "idp-token-invalid",
   "sctp-failure",
   "sdp-syntax-error",
   "hardware-encoder-not-available",
   "hardware-encoder-error"
 };
 
-[Exposed=Window,
- Constructor(DOMString type, RTCErrorEventInit eventInitDict)]
+[Exposed=Window]
 interface RTCErrorEvent : Event {
+  constructor(DOMString type, RTCErrorEventInit eventInitDict);
   [SameObject] readonly attribute RTCError error;
 };
 
 dictionary RTCErrorEventInit : EventInit {
   required RTCError error;
 };
--- a/testing/web-platform/tests/interfaces/webusb.idl
+++ b/testing/web-platform/tests/interfaces/webusb.idl
@@ -34,21 +34,21 @@ partial interface WorkerNavigator {
   [SameObject] readonly attribute USB usb;
 };
 
 dictionary USBConnectionEventInit : EventInit {
     required USBDevice device;
 };
 
 [
-  Constructor(DOMString type, USBConnectionEventInit eventInitDict),
   Exposed=(DedicatedWorker,SharedWorker,Window),
   SecureContext
 ]
 interface USBConnectionEvent : Event {
+  constructor(DOMString type, USBConnectionEventInit eventInitDict);
   [SameObject] readonly attribute USBDevice device;
 };
 
 [Exposed=(DedicatedWorker,SharedWorker,Window), SecureContext]
 interface USBDevice {
   readonly attribute octet usbVersionMajor;
   readonly attribute octet usbVersionMinor;
   readonly attribute octet usbVersionSubminor;
@@ -105,103 +105,103 @@ dictionary USBControlTransferParameters 
   required USBRequestType requestType;
   required USBRecipient recipient;
   required octet request;
   required unsigned short value;
   required unsigned short index;
 };
 
 [
-  Constructor(USBTransferStatus status, optional DataView? data),
   Exposed=(DedicatedWorker,SharedWorker,Window),
   SecureContext
 ]
 interface USBInTransferResult {
+  constructor(USBTransferStatus status, optional DataView? data);
   readonly attribute DataView? data;
   readonly attribute USBTransferStatus status;
 };
 
 [
-  Constructor(USBTransferStatus status, optional unsigned long bytesWritten = 0),
   Exposed=(DedicatedWorker,SharedWorker,Window),
   SecureContext
 ]
 interface USBOutTransferResult {
+  constructor(USBTransferStatus status, optional unsigned long bytesWritten = 0);
   readonly attribute unsigned long bytesWritten;
   readonly attribute USBTransferStatus status;
 };
 
 [
-  Constructor(USBTransferStatus status, optional DataView? data),
   Exposed=(DedicatedWorker,SharedWorker,Window),
   SecureContext
 ]
 interface USBIsochronousInTransferPacket {
+  constructor(USBTransferStatus status, optional DataView? data);
   readonly attribute DataView? data;
   readonly attribute USBTransferStatus status;
 };
 
 [
-  Constructor(sequence<USBIsochronousInTransferPacket> packets, optional DataView? data),
   Exposed=(DedicatedWorker,SharedWorker,Window),
   SecureContext
 ]
 interface USBIsochronousInTransferResult {
+  constructor(sequence<USBIsochronousInTransferPacket> packets, optional DataView? data);
   readonly attribute DataView? data;
   readonly attribute FrozenArray<USBIsochronousInTransferPacket> packets;
 };
 
 [
-  Constructor(USBTransferStatus status, optional unsigned long bytesWritten = 0),
   Exposed=(DedicatedWorker,SharedWorker,Window),
   SecureContext
 ]
 interface USBIsochronousOutTransferPacket {
+  constructor(USBTransferStatus status, optional unsigned long bytesWritten = 0);
   readonly attribute unsigned long bytesWritten;
   readonly attribute USBTransferStatus status;
 };
 
 [
-  Constructor(sequence<USBIsochronousOutTransferPacket> packets),
   Exposed=(DedicatedWorker,SharedWorker,Window),
   SecureContext
 ]
 interface USBIsochronousOutTransferResult {
+  constructor(sequence<USBIsochronousOutTransferPacket> packets);
   readonly attribute FrozenArray<USBIsochronousOutTransferPacket> packets;
 };
 
 [
-  Constructor(USBDevice device, octet configurationValue),
   Exposed=(DedicatedWorker,SharedWorker,Window),
   SecureContext
 ]
 interface USBConfiguration {
+  constructor(USBDevice device, octet configurationValue);
   readonly attribute octet configurationValue;
   readonly attribute DOMString? configurationName;
   readonly attribute FrozenArray<USBInterface> interfaces;
 };
 
 [
-  Constructor(USBConfiguration configuration, octet interfaceNumber),
   Exposed=(DedicatedWorker,SharedWorker,Window),
   SecureContext
 ]
 interface USBInterface {
+  constructor(USBConfiguration configuration, octet interfaceNumber);
   readonly attribute octet interfaceNumber;
   readonly attribute USBAlternateInterface alternate;
   readonly attribute FrozenArray<USBAlternateInterface> alternates;
   readonly attribute boolean claimed;
 };
 
 [
-  Constructor(USBInterface deviceInterface, octet alternateSetting),
   Exposed=(DedicatedWorker,SharedWorker,Window),
   SecureContext
 ]
 interface USBAlternateInterface {
+  constructor(USBInterface deviceInterface, octet alternateSetting);
   readonly attribute octet alternateSetting;
   readonly attribute octet interfaceClass;
   readonly attribute octet interfaceSubclass;
   readonly attribute octet interfaceProtocol;
   readonly attribute DOMString? interfaceName;
   readonly attribute FrozenArray<USBEndpoint> endpoints;
 };
 
@@ -212,21 +212,21 @@ enum USBDirection {
 
 enum USBEndpointType {
   "bulk",
   "interrupt",
   "isochronous"
 };
 
 [
-  Constructor(USBAlternateInterface alternate, octet endpointNumber, USBDirection direction),
   Exposed=(DedicatedWorker,SharedWorker,Window),
   SecureContext
 ]
 interface USBEndpoint {
+  constructor(USBAlternateInterface alternate, octet endpointNumber, USBDirection direction);
   readonly attribute octet endpointNumber;
   readonly attribute USBDirection direction;
   readonly attribute USBEndpointType type;
   readonly attribute unsigned long packetSize;
 };
 
 dictionary USBPermissionDescriptor : PermissionDescriptor {
   sequence<USBDeviceFilter> filters;
@@ -237,11 +237,12 @@ dictionary AllowedUSBDevice {
   required octet productId;
   DOMString serialNumber;
 };
 
 dictionary USBPermissionStorage {
   sequence<AllowedUSBDevice> allowedDevices = [];
 };
 
+[Exposed=(DedicatedWorker,SharedWorker,Window)]
 interface USBPermissionResult : PermissionStatus {
   attribute FrozenArray<USBDevice> devices;
 };
--- a/testing/web-platform/tests/layout-instability/observe-layout-shift.html
+++ b/testing/web-platform/tests/layout-instability/observe-layout-shift.html
@@ -1,14 +1,19 @@
 <!DOCTYPE HTML>
 <meta charset=utf-8>
 <title>Layout Instability: observe layout shift value via PerformanceObserver</title>
 <body>
 <style>
 #myDiv { position: relative; width: 300px; height: 100px; }
+
+/* Disable the button's focus ring, which otherwise expands its visual rect by
+ * 1px on all sides, triggering a layout shift event.
+ */
+#button { outline: none; }
 </style>
 <div id='myDiv'></div>
 <button id='button'>Generate a 'click' event</button>
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src=/resources/testdriver.js></script>
 <script src=/resources/testdriver-vendor.js></script><script>
   let timeAfterClick;
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/payment-handler/app-change-shipping-address.js
@@ -0,0 +1,44 @@
+self.addEventListener('canmakepayment', (event) => {
+  event.respondWith(true);
+});
+
+async function responder(event) {
+  const methodName = event.methodData[0].supportedMethods;
+  const shippingOption = event.shippingOptions[0].id;
+  const shippingAddress = {
+    addressLine: [
+      '1875 Explorer St #1000',
+    ],
+    city: 'Reston',
+    country: 'US',
+    dependentLocality: '',
+    organization: 'Google',
+    phone: '+15555555555',
+    postalCode: '20190',
+    recipient: 'John Smith',
+    region: 'VA',
+    sortingCode: '',
+  };
+  if (!event.changeShippingAddress) {
+    return {
+      methodName,
+      details: {
+        changeShippingAddressReturned:
+          'The changeShippingAddress() method is not implemented.',
+      },
+    };
+  }
+  let changeShippingAddressReturned;
+  try {
+    const response = await event.changeShippingAddress(shippingAddress);
+    changeShippingAddressReturned = response;
+  } catch (err) {
+    changeShippingAddressReturned = err.message;
+  }
+  return {methodName, details: {changeShippingAddressReturned}, shippingAddress,
+      shippingOption};
+}
+
+self.addEventListener('paymentrequest', (event) => {
+  event.respondWith(responder(event));
+});
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/payment-handler/app-change-shipping-option.js
@@ -0,0 +1,44 @@
+self.addEventListener('canmakepayment', (event) => {
+  event.respondWith(true);
+});
+
+async function responder(event) {
+  const methodName = event.methodData[0].supportedMethods;
+  const shippingOption = event.shippingOptions[0].id;
+  const shippingAddress = {
+    addressLine: [
+      '1875 Explorer St #1000',
+    ],
+    city: 'Reston',
+    country: 'US',
+    dependentLocality: '',
+    organization: 'Google',
+    phone: '+15555555555',
+    postalCode: '20190',
+    recipient: 'John Smith',
+    region: 'VA',
+    sortingCode: '',
+  };
+  if (!event.changeShippingOption) {
+    return {
+      methodName,
+      details: {
+        changeShippingOptionReturned:
+          'The changeShippingOption() method is not implemented.',
+      },
+    };
+  }
+  let changeShippingOptionReturned;
+  try {
+    const response = await event.changeShippingOption(shippingOption);
+    changeShippingOptionReturned = response;
+  } catch (err) {
+    changeShippingOptionReturned = err.message;
+  }
+  return {methodName, details: {changeShippingOptionReturned}, shippingAddress,
+      shippingOption};
+}
+
+self.addEventListener('paymentrequest', (event) => {
+  event.respondWith(responder(event));
+});
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/payment-handler/change-shipping-address-manual.https.html
@@ -0,0 +1,161 @@
+<!DOCTYPE html>
+<meta charset="utf-8" />
+<title>Tests for PaymentRequestEvent.changeShippingAddress()</title>
+
+<link rel="manifest" href="/payment-handler/basic-card.json" />
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="register-and-activate-service-worker.js"></script>
+<p>If the payment sheet is shown, please authorize the mock payment.</p>
+<script>
+  const methodName = window.location.origin + '/payment-handler/payment-app/';
+  function createRequest() {
+    return new PaymentRequest([{supportedMethods: methodName}], {
+        total: {label: 'Total', amount: {currency: 'USD', value: '0.01'}},
+        shippingOptions: [{
+          id: 'freeShippingOption',
+          label: 'Free global shipping',
+          amount: {
+            currency: 'USD',
+            value: '0',
+          },
+          selected: false,
+        }],
+      }, {requestShipping: true});
+  }
+
+  async function completeAppSetUp(registration) {
+    await registration.paymentManager.instruments.clear();
+    await registration.paymentManager.instruments.set('instrument-key', {
+      name: 'Instrument Name',
+      method: methodName,
+    });
+    await navigator.serviceWorker.ready;
+    await registration.paymentManager.enableDelegations(['shippingAddress']);
+  }
+
+  async function runTests(registration) {
+    await completeAppSetUp(registration);
+    promise_test(async (t) => {
+      const request = createRequest();
+      // Intentionally do not respond to the 'shippingaddresschange' event.
+      const response = await test_driver.bless('showing a payment sheet', () =>
+        request.show()
+      );
+      const complete_promise = response.complete('success');
+
+      assert_equals(response.details.changeShippingAddressReturned, null);
+
+      return complete_promise;
+    }, 'If updateWith(details) is not run, changeShippingAddress() returns null.');
+
+    promise_test(async (t) => {
+      const request = createRequest();
+      request.addEventListener('shippingaddresschange', (event) => {
+        assert_equals(request.shippingAddress.organization, '', 'organization should be redacted');
+        assert_equals(request.shippingAddress.phone, '', 'phone should be redacted');
+        assert_equals(request.shippingAddress.recipient, '', 'recipient should be redacted');
+        assert_equals(request.shippingAddress.addressLine.length, 0, 'addressLine should be redacted');
+        assert_equals(request.shippingAddress.city, 'Reston');
+        assert_equals(request.shippingAddress.country, 'US');
+        assert_equals(request.shippingAddress.postalCode, '20190');
+        assert_equals(request.shippingAddress.region, 'VA');
+        event.updateWith({
+          total: {label: 'Total', amount: {currency: 'GBP', value: '0.02'}},
+          error: 'Error for test',
+          modifiers: [
+            {
+              supportedMethods: methodName,
+              data: {soup: 'potato'},
+              total: {
+                label: 'Modified total',
+                amount: {currency: 'EUR', value: '0.03'},
+              },
+              additionalDisplayItems: [
+                {
+                  label: 'Modified display item',
+                  amount: {currency: 'INR', value: '0.06'},
+                },
+              ],
+            },
+            {
+              supportedMethods: methodName + '2',
+              data: {soup: 'tomato'},
+              total: {
+                label: 'Modified total #2',
+                amount: {currency: 'CHF', value: '0.07'},
+              },
+              additionalDisplayItems: [
+                {
+                  label: 'Modified display item #2',
+                  amount: {currency: 'CAD', value: '0.08'},
+                },
+              ],
+            },
+          ],
+          displayItems: [
+            {
+              label: 'Display item',
+              amount: {currency: 'CNY', value: '0.04'},
+            },
+          ],
+          shippingOptions: [
+            {
+              id: 'freeShippingOption',
+              label: 'express global shipping',
+              amount: {
+                currency: 'USD',
+                value: '0',
+              },
+              selected: true,
+            }
+          ],
+           shippingAddressErrors: {
+            country: 'US only shipping',
+          }
+        });
+      });
+      const response = await test_driver.bless('showing a payment sheet', () =>
+        request.show()
+      );
+      const complete_promise = response.complete('success');
+      const changeShippingAddressReturned =
+        response.details.changeShippingAddressReturned;
+
+      assert_equals(changeShippingAddressReturned.total.currency, 'GBP');
+      assert_equals(changeShippingAddressReturned.total.value, '0.02');
+      assert_equals(changeShippingAddressReturned.total.label, undefined);
+      assert_equals(changeShippingAddressReturned.error, 'Error for test');
+      assert_equals(changeShippingAddressReturned.modifiers.length, 1);
+      assert_equals(changeShippingAddressReturned.displayItems, undefined);
+      assert_equals(changeShippingAddressReturned.shippingOptions.length, 1);
+      assert_equals(changeShippingAddressReturned.paymentMethodErrors, undefined);
+      assert_equals(changeShippingAddressReturned.shippingAddressErrors.country, 'US only shipping');
+
+      const shipping_option = changeShippingAddressReturned.shippingOptions[0];
+      assert_equals(shipping_option.id, 'freeShippingOption' );
+      assert_equals(shipping_option.label, 'express global shipping');
+      assert_equals(shipping_option.amount.currency, 'USD');
+      assert_equals(shipping_option.amount.value, '0');
+      assert_true(shipping_option.selected);
+
+      const modifier = changeShippingAddressReturned.modifiers[0];
+      assert_equals(modifier.supportedMethods, methodName);
+      assert_equals(modifier.data.soup, 'potato');
+      assert_equals(modifier.total.label, '');
+      assert_equals(modifier.total.amount.currency, 'EUR');
+      assert_equals(modifier.total.amount.value, '0.03');
+      assert_equals(modifier.additionalDisplayItems, undefined);
+
+      return complete_promise;
+    }, 'The changeShippingAddress() returns some details from the "shippingaddresschange" event\'s updateWith(details) call.');
+  }
+
+  registerAndActiveServiceWorker(
+    'app-change-shipping-address.js',
+    'payment-app/',
+    runTests
+  );
+</script>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/payment-handler/change-shipping-option-manual.https.html
@@ -0,0 +1,160 @@
+<!DOCTYPE html>
+<meta charset="utf-8" />
+<title>Tests for PaymentRequestEvent.changeShippingOption()</title>
+
+<link rel="manifest" href="/payment-handler/basic-card.json" />
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="register-and-activate-service-worker.js"></script>
+<p>If the payment sheet is shown, please authorize the mock payment.</p>
+<script>
+  const methodName = window.location.origin + '/payment-handler/payment-app/';
+  function createRequest() {
+    return new PaymentRequest([{supportedMethods: methodName}], {
+        total: {label: 'Total', amount: {currency: 'USD', value: '0.01'}},
+        shippingOptions: [{
+          id: 'freeShippingOption',
+          label: 'Free global shipping',
+          amount: {
+            currency: 'USD',
+            value: '0',
+          },
+          selected: false,
+        },
+        {
+          id: 'expressShippingOption',
+          label: 'express global shipping',
+          amount: {
+            currency: 'USD',
+            value: '0',
+          },
+          selected: true,
+        }],
+      }, {requestShipping: true});
+  }
+
+  async function completeAppSetUp(registration) {
+    await registration.paymentManager.instruments.clear();
+    await registration.paymentManager.instruments.set('instrument-key', {
+      name: 'Instrument Name',
+      method: methodName,
+    });
+    await navigator.serviceWorker.ready;
+    await registration.paymentManager.enableDelegations(['shippingAddress']);
+  }
+
+  async function runTests(registration) {
+    await completeAppSetUp(registration);
+    promise_test(async (t) => {
+      const request = createRequest();
+      // Intentionally do not respond to the 'shippingoptionchange' event.
+      const response = await test_driver.bless('showing a payment sheet', () =>
+        request.show()
+      );
+      const complete_promise = response.complete('success');
+
+      assert_equals(response.details.changeShippingOptionReturned, null);
+
+      return complete_promise;
+    }, 'If updateWith(details) is not run, changeShippingOption() returns null.');
+
+    promise_test(async (t) => {
+      const request = createRequest();
+      request.addEventListener('shippingoptionchange', (event) => {
+        assert_equals(request.shippingOption, 'freeShippingOption');
+        event.updateWith({
+          total: {label: 'Total', amount: {currency: 'GBP', value: '0.02'}},
+          error: 'Error for test',
+          modifiers: [
+            {
+              supportedMethods: methodName,
+              data: {soup: 'potato'},
+              total: {
+                label: 'Modified total',
+                amount: {currency: 'EUR', value: '0.03'},
+              },
+              additionalDisplayItems: [
+                {
+                  label: 'Modified display item',
+                  amount: {currency: 'INR', value: '0.06'},
+                },
+              ],
+            },
+            {
+              supportedMethods: methodName + '2',
+              data: {soup: 'tomato'},
+              total: {
+                label: 'Modified total #2',
+                amount: {currency: 'CHF', value: '0.07'},
+              },
+              additionalDisplayItems: [
+                {
+                  label: 'Modified display item #2',
+                  amount: {currency: 'CAD', value: '0.08'},
+                },
+              ],
+            },
+          ],
+          displayItems: [
+            {
+              label: 'Display item',
+              amount: {currency: 'CNY', value: '0.04'},
+            },
+          ],
+          shippingOptions: [
+            {
+              id: 'freeShippingOption',
+              label: 'express global shipping',
+              amount: {
+                currency: 'USD',
+                value: '0',
+              },
+              selected: true,
+            }
+          ],
+        });
+      });
+      const response = await test_driver.bless('showing a payment sheet', () =>
+        request.show()
+      );
+      const complete_promise = response.complete('success');
+      const changeShippingOptionReturned =
+        response.details.changeShippingOptionReturned;
+
+      assert_equals(changeShippingOptionReturned.total.currency, 'GBP');
+      assert_equals(changeShippingOptionReturned.total.value, '0.02');
+      assert_equals(changeShippingOptionReturned.total.label, undefined);
+      assert_equals(changeShippingOptionReturned.error, 'Error for test');
+      assert_equals(changeShippingOptionReturned.modifiers.length, 1);
+      assert_equals(changeShippingOptionReturned.displayItems, undefined);
+      assert_equals(changeShippingOptionReturned.shippingOptions.length, 1);
+      assert_equals(changeShippingOptionReturned.paymentMethodErrors, undefined);
+      assert_equals(changeShippingOptionReturned.shippingAddressErrors, undefined);
+
+      const shipping_option = changeShippingOptionReturned.shippingOptions[0];
+      assert_equals(shipping_option.id, 'freeShippingOption' );
+      assert_equals(shipping_option.label, 'express global shipping');
+      assert_equals(shipping_option.amount.currency, 'USD');
+      assert_equals(shipping_option.amount.value, '0');
+      assert_true(shipping_option.selected);
+
+      const modifier = changeShippingOptionReturned.modifiers[0];
+      assert_equals(modifier.supportedMethods, methodName);
+      assert_equals(modifier.data.soup, 'potato');
+      assert_equals(modifier.total.label, '');
+      assert_equals(modifier.total.amount.currency, 'EUR');
+      assert_equals(modifier.total.amount.value, '0.03');
+      assert_equals(modifier.additionalDisplayItems, undefined);
+
+      return complete_promise;
+    }, 'The changeShippingOption() returns some details from the "shippingoptionchange" event\'s updateWith(details) call.');
+  }
+
+  registerAndActiveServiceWorker(
+    'app-change-shipping-option.js',
+    'payment-app/',
+    runTests
+  );
+</script>
--- a/testing/web-platform/tests/proximity/ProximitySensor-iframe-access.https.html
+++ b/testing/web-platform/tests/proximity/ProximitySensor-iframe-access.https.html
@@ -1,14 +1,14 @@
 <!DOCTYPE html>
 <meta charset="utf-8">
 <title>ProximitySensor iframe test</title>
 <link rel="author" title="Intel" href="http://www.intel.com">
 <link rel="help" href="https://w3c.github.io/proximity/">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
-<script src="/generic-sensor/generic-sensor-tests.js"></script>
+<script src="/generic-sensor/resources/generic-sensor-helpers.js"></script>
 <script src="/generic-sensor/generic-sensor-iframe-tests.sub.js"></script>
 <script src="/generic-sensor/generic-sensor-feature-policy-test.sub.js"></script>
 <div id="log"></div>
 <script>
 run_generic_sensor_iframe_tests('ProximitySensor');
 </script>
--- a/testing/web-platform/tests/proximity/ProximitySensor.https.html
+++ b/testing/web-platform/tests/proximity/ProximitySensor.https.html
@@ -1,14 +1,32 @@
 <!DOCTYPE html>
 <meta charset="utf-8">
 <title>ProximitySensor Test</title>
 <link rel="author" title="Intel" href="http://www.intel.com">
 <link rel="help" href="https://w3c.github.io/proximity/">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
+<script src="/generic-sensor/resources/generic-sensor-helpers.js"></script>
 <script src="/generic-sensor/generic-sensor-tests.js"></script>
-<div id="log"></div>
+
 <script>
 
-runGenericSensorTests('ProximitySensor');
+'use strict';
+
+// near: 0 stands for false, 1 stands for true, which will be convert to boolean
+// in mock sensor
+const kReadings = {
+    readings: [
+        [1.12345, 2.12345, 1]
+    ],
+    expectedReadings: [
+        [1.12345, 2.12345, true]
+    ]
+};
+
+runGenericSensorTests(
+    'ProximitySensor',
+    kReadings,
+    verifyProximitySensorReading,
+    ['proximity']);
 
 </script>
deleted file mode 100644
--- a/testing/web-platform/tests/proximity/ProximitySensor_onerror-manual.https.html
+++ /dev/null
@@ -1,20 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>ProximitySensor Test: onerror</title>
-<link rel="author" title="Intel" href="http://www.intel.com">
-<link rel="help" href="https://w3c.github.io/proximity/">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/generic-sensor/generic-sensor-tests.js"></script>
-<div id="log"></div>
-<h2>Precondition</h2>
-<ol>
-  <li>
-    Disable the Proximity Sensor or run test on a device without Proximity Sensor.
-  </li>
-</ol>
-<script>
-
-runGenericSensorOnerror('ProximitySensor');
-
-</script>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/resource-timing/resource_hash.htm
@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8" />
+<title>Resource Timing: image with a hash</title>
+<link rel="help" href="http://www.w3.org/TR/resource-timing/#dom-performanceresourcetiming-initiatortype"/>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/webperftestharness.js"></script>
+<script src="resources/webperftestharnessextension.js"></script>
+<script>
+setup({explicit_done: true});
+
+// explicitly test the namespace before we start testing
+test_namespace("getEntriesByType");
+
+function onload_test() {
+  if (window.performance.getEntriesByType === undefined) {
+    done();
+    return;
+  }
+
+  const url = "resources/fake_responses.py?tag=" + Math.random() + '#hash=1';
+  const image = new Image();
+  image.onload = image.onerror = () => {
+    const entries = window.performance.getEntriesByType('resource').filter(r => r.initiatorType === 'img');
+    test_equals(entries.length, 1, "There should be one entry");
+    if (entries.length === 1) {
+        test_true(entries[0].name.indexOf('#hash=1') > -1, "There should be a hash in the resource name");
+    }
+    done();
+
+  }
+  image.src = url;
+}
+window.onload = onload_test;
+</script>
+</head>
+<body>
+<h1>Description</h1>
+<p>This test validates that a hash in an image URL is preserved in resource timing API results.</p>
+<div id="log"></div>
+</body>
+</html>
--- a/testing/web-platform/tests/resources/chromium/generic_sensor_mocks.js
+++ b/testing/web-platform/tests/resources/chromium/generic_sensor_mocks.js
@@ -145,17 +145,18 @@ var GenericSensorTest = (() => {
         ['Magnetometer', device.mojom.SensorType.MAGNETOMETER],
         ['AbsoluteOrientationSensor',
             device.mojom.SensorType.ABSOLUTE_ORIENTATION_QUATERNION],
         ['AbsoluteOrientationEulerAngles',
             device.mojom.SensorType.ABSOLUTE_ORIENTATION_EULER_ANGLES],
         ['RelativeOrientationSensor',
             device.mojom.SensorType.RELATIVE_ORIENTATION_QUATERNION],
         ['RelativeOrientationEulerAngles',
-            device.mojom.SensorType.RELATIVE_ORIENTATION_EULER_ANGLES]
+            device.mojom.SensorType.RELATIVE_ORIENTATION_EULER_ANGLES],
+        ['ProximitySensor', device.mojom.SensorType.PROXIMITY]
       ]);
       this.binding_ = new mojo.Binding(device.mojom.SensorProvider, this);
 
       this.interceptor_ = new MojoInterfaceInterceptor(
           device.mojom.SensorProvider.name, "context", true);
       this.interceptor_.oninterfacerequest = e => {
         this.bindToPipe(e.handle);
       };
--- a/testing/web-platform/tests/resources/chromium/mock-barcodedetection.js
+++ b/testing/web-platform/tests/resources/chromium/mock-barcodedetection.js
@@ -4,17 +4,17 @@ var BarcodeDetectionTest = (() => {
   // Class that mocks BarcodeDetectionProvider interface defined in
   // https://cs.chromium.org/chromium/src/services/shape_detection/public/mojom/barcodedetection_provider.mojom
   class MockBarcodeDetectionProvider {
     constructor() {
       this.bindingSet_ = new mojo.BindingSet(
           shapeDetection.mojom.BarcodeDetectionProvider);
 
       this.interceptor_ = new MojoInterfaceInterceptor(
-          shapeDetection.mojom.BarcodeDetectionProvider.name);
+          shapeDetection.mojom.BarcodeDetectionProvider.name, "context", true);
       this.interceptor_.oninterfacerequest =
          e => this.bindingSet_.addBinding(this, e.handle);
       this.interceptor_.start();
     }
 
     createBarcodeDetection(request, options) {
       this.mockService_ = new MockBarcodeDetection(request, options);
     }
--- a/testing/web-platform/tests/resources/chromium/mock-facedetection.js
+++ b/testing/web-platform/tests/resources/chromium/mock-facedetection.js
@@ -4,17 +4,17 @@ var FaceDetectionTest = (() => {
   // Class that mocks FaceDetectionProvider interface defined in
   // https://cs.chromium.org/chromium/src/services/shape_detection/public/mojom/facedetection_provider.mojom
   class MockFaceDetectionProvider {
     constructor() {
       this.bindingSet_ = new mojo.BindingSet(
         shapeDetection.mojom.FaceDetectionProvider);
 
       this.interceptor_ = new MojoInterfaceInterceptor(
-          shapeDetection.mojom.FaceDetectionProvider.name);
+          shapeDetection.mojom.FaceDetectionProvider.name, "context", true);
       this.interceptor_.oninterfacerequest =
          e => this.bindingSet_.addBinding(this, e.handle);
       this.interceptor_.start();
     }
 
     createFaceDetection(request, options) {
       this.mockService_ = new MockFaceDetection(request, options);
     }
--- a/testing/web-platform/tests/tools/wpt/tests/test_wpt.py
+++ b/testing/web-platform/tests/tools/wpt/tests/test_wpt.py
@@ -341,17 +341,17 @@ def test_tests_affected(capsys, manifest
 @pytest.mark.skipif(sys.platform == "win32",
                     reason="https://github.com/web-platform-tests/wpt/issues/12934")
 def test_tests_affected_idlharness(capsys, manifest_dir):
     commit = "47cea8c38b88c0ddd3854e4edec0c5b6f2697e62"
     with pytest.raises(SystemExit) as excinfo:
         wpt.main(argv=["tests-affected", "--metadata", manifest_dir, "%s~..%s" % (commit, commit)])
     assert excinfo.value.code == 0
     out, err = capsys.readouterr()
-    assert "webrtc-stats/idlharness.window.js\nwebrtc/idlharness.https.window.js\n" == out
+    assert "webrtc-identity/idlharness.https.window.js\nwebrtc-stats/idlharness.window.js\nwebrtc/idlharness.https.window.js\n" == out
 
 
 @pytest.mark.slow  # this updates the manifest
 @pytest.mark.xfail(sys.platform == "win32",
                    reason="Tests currently don't work on Windows for path reasons")
 @pytest.mark.skipif(sys.platform == "win32",
                     reason="https://github.com/web-platform-tests/wpt/issues/12934")
 def test_tests_affected_null(capsys, manifest_dir):
--- a/testing/web-platform/tests/tools/wptrunner/wptrunner/browsers/chrome.py
+++ b/testing/web-platform/tests/tools/wptrunner/wptrunner/browsers/chrome.py
@@ -34,16 +34,17 @@ def executor_kwargs(test_type, server_co
                     **kwargs):
     executor_kwargs = base_executor_kwargs(test_type, server_config,
                                            cache_manager, run_info_data,
                                            **kwargs)
     executor_kwargs["close_after_done"] = True
     executor_kwargs["supports_eager_pageload"] = False
 
     capabilities = {
+        "acceptInsecureCerts": True,
         "goog:chromeOptions": {
             "prefs": {
                 "profile": {
                     "default_content_setting_values": {
                         "popups": 1
                     }
                 }
             },
--- a/testing/web-platform/tests/tools/wptrunner/wptrunner/metadata.py
+++ b/testing/web-platform/tests/tools/wptrunner/wptrunner/metadata.py
@@ -697,18 +697,17 @@ class TestFileData(object):
                             subtest_id = subtest_id.decode("utf8")
                         item_expected = test_expected.get_subtest(subtest_id)
 
                     if prop == "status":
                         status, known_intermittent = unpack_result(value)
                         value = Result(status,
                                        known_intermittent,
                                        default_expected_by_type[self.item_type,
-                                                                subtest_id is not None],
-                        )
+                                                                subtest_id is not None])
                         item_expected.set_result(run_info, value)
                     elif prop == "asserts":
                         item_expected.set_asserts(run_info, value)
 
         expected.update(full_update=full_update,
                         disable_intermittent=disable_intermittent)
         for test in expected.iterchildren():
             for subtest in test.iterchildren():
--- a/testing/web-platform/tests/trusted-types/trusted-types-reporting.tentative.https.html
+++ b/testing/web-platform/tests/trusted-types/trusted-types-reporting.tentative.https.html
@@ -63,17 +63,17 @@
   function expect_sample(s) { return e => {
     assert_true(e.sample.includes(s),
                 `expected "${e.sample}" to include "${s}".`);
     return e;
   } }
 
   function expect_blocked_uri(s) { return e => {
     assert_true(e.blockedURI === s,
-                `expected "${e.blockedUri}" to be "${s}".`);
+                `expected "${e.blockedURI}" to be "${s}".`);
     return e;
   } }
 
   // A sample policy we use to test TrustedTypes.createPolicy behaviour.
   const id = x => x;
   const a_policy = {
     createHTML: id,
     createScriptURL: id,
@@ -149,55 +149,60 @@
     document.getElementById("div").innerHTML = policy_one.createHTML("abc");
     flush();
     return p;
   }, "Trusted Type violation report: assign trusted HTML to html; no report");
 
   promise_test(t => {
     let p = Promise.resolve()
         .then(promise_violation("trusted-types two"))
+        .then(expect_blocked_uri("trusted-types-sink"))
         .then(expect_sample("Element.innerHTML"))
         .then(expect_sample("abc"));
     expect_throws(_ => { document.getElementById("div").innerHTML = "abc" });
     return p;
   }, "Trusted Type violation report: sample for .innerHTML assignment");
 
   promise_test(t => {
     let p = Promise.resolve()
         .then(promise_violation("trusted-types two"))
+        .then(expect_blocked_uri("trusted-types-sink"))
         .then(expect_sample("HTMLAnchorElement.href"));
       expect_throws(_ => { document.getElementById("anchor").href = "" });
     return p;
   }, "Trusted Type violation report: sample for .href assignment");
 
   promise_test(t => {
     let p = Promise.resolve()
         .then(promise_violation("trusted-types two"))
+        .then(expect_blocked_uri("trusted-types-sink"))
         .then(expect_sample("HTMLElement.innerText"))
         .then(expect_sample("2+2;"));
     expect_throws(_ => document.getElementById("script").innerText = "2+2;");
     return p;
   }, "Trusted Type violation report: sample for script innerText assignment");
 
   promise_test(t => {
     let p = Promise.resolve()
         .then(promise_violation("trusted-types one"))
+        .then(expect_blocked_uri("trusted-types-sink"))
         .then(expect_sample("eval"))
         .then(expect_sample("2+2"))
         .then(promise_flush());
     expect_throws(_ => eval("2+2"));
     flush();
     return p;
   }, "Trusted Type violation report: sample for eval");
 
   promise_test(t => {
     // We expect the sample string to always contain the name, and at least the
     // start of the value, but it should not be excessively long.
     let p = Promise.resolve()
         .then(promise_violation("trusted-types two"))
+        .then(expect_blocked_uri("trusted-types-sink"))
         .then(expect_sample("HTMLElement.innerText"))
         .then(expect_sample("abbb"))
         .then(e => assert_less_than(e.sample.length, 150));
     const value = "a" + "b".repeat(50000);
     expect_throws(_ => document.getElementById("script").innerText = value);
     return p;
   }, "Trusted Type violation report: large values should be handled sanely.");
 
@@ -206,16 +211,17 @@
   // "mask" the underlying DOM mechanism (for reporting).
   if (customElements) {
     class CustomLink extends HTMLAnchorElement {};
     customElements.define("custom-link", CustomLink, { extends: "a" });
 
     promise_test(t => {
       let p = Promise.resolve()
           .then(promise_violation("trusted-types one"))
+          .then(expect_blocked_uri("trusted-types-sink"))
           .then(expect_sample("HTMLAnchorElement.href"))
           .then(expect_sample("abc"));
       expect_throws(_ => document.getElementById("customlink").href = "abc");
       return p;
     }, "Trusted Type violation report: sample for custom element assignment");
   }
   </script>
 
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/upgrade-insecure-requests/generic/test-case.sub.js
@@ -0,0 +1,37 @@
+// TODO(hiroshige): Document the type of `scenario`.
+function TestCase(scenario, description) {
+  const urls = getRequestURLs(scenario.subresource,
+                              scenario.origin,
+                              scenario.redirection);
+  const checkResult = _ => {
+    // Send request to check if the key has been torn down.
+    return xhrRequest(urls.assertUrl)
+      .then(assertResult => {
+          // Now check if the value has been torn down. If it's still there,
+          // we have blocked the request to mixed-content.
+          assert_equals(assertResult.status, scenario.expectation,
+            "The resource request should be '" + scenario.expectation + "'.");
+        });
+  };
+
+  function runTest() {
+    /** @type {Subresource} */
+    const subresource = {
+      subresourceType: scenario.subresource,
+      url: urls.testUrl,
+      policyDeliveries: scenario.subresource_policy_deliveries,
+    };
+
+    promise_test(() => {
+      return xhrRequest(urls.announceUrl)
+        // Send out the real resource request.
+        // This should tear down the key if it's not blocked.
+        .then(_ => invokeRequest(subresource, scenario.source_context_list))
+        // We check the key state, regardless of whether the main request
+        // succeeded or failed.
+        .then(checkResult, checkResult);
+      }, description);
+  }  // runTest
+
+  return {start: runTest};
+}
new file mode 100755
--- /dev/null
+++ b/testing/web-platform/tests/upgrade-insecure-requests/generic/tools/generate.py
@@ -0,0 +1,42 @@
+#!/usr/bin/env python
+
+import os
+import sys
+
+sys.path.insert(
+    0,
+    os.path.join(
+        os.path.dirname(os.path.abspath(__file__)), '..', '..', '..', 'common',
+        'security-features', 'tools'))
+import generate
+
+
+class UpgradeInsecureRequestsConfig(object):
+    def __init__(self):
+        self.selection_pattern = \
+              '%(source_context_list)s.%(delivery_type)s/' + \
+              '%(delivery_value)s/' + \
+              '%(subresource)s/' + \
+              '%(origin)s.%(redirection)s.%(source_scheme)s'
+
+        self.test_file_path_pattern = 'gen/' + self.selection_pattern + '.html'
+
+        self.test_description_template = 'Upgrade-Insecure-Requests: Expects %(expectation)s for %(subresource)s to %(origin)s origin and %(redirection)s redirection from %(source_scheme)s context.'
+
+        self.test_page_title_template = 'Upgrade-Insecure-Requests: %s'
+
+        self.helper_js = '/upgrade-insecure-requests/generic/test-case.sub.js'
+
+        # For debug target only.
+        self.sanity_checker_js = '/upgrade-insecure-requests/generic/sanity-checker.js'
+        self.spec_json_js = '/upgrade-insecure-requests/spec_json.js'
+
+        self.test_case_name = 'TestCase'
+
+        script_directory = os.path.dirname(os.path.abspath(__file__))
+        self.spec_directory = os.path.abspath(
+            os.path.join(script_directory, '..', '..'))
+
+
+if __name__ == '__main__':
+    generate.main(UpgradeInsecureRequestsConfig())
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/upgrade-insecure-requests/spec.src.json
@@ -0,0 +1,376 @@
+{
+  "specification": [
+    {
+      "name": "No upgrade-insecure-request",
+      "title": "No upgrade-insecure-request",
+      "description": "No upgrade-insecure-request",
+      "specification_url": "https://w3c.github.io/webappsec-upgrade-insecure-requests/",
+      "test_expansion": [
+        {
+          "name": "Without upgrade-insecure-request, all requests are blocked ...",
+          "expansion": "default",
+          "source_scheme": "https",
+          "source_context_list": "*",
+          "delivery_type": "meta",
+          "delivery_value": null,
+          "redirection": "*",
+          "subresource": "*",
+          "origin": "*",
+          "expectation": "blocked"
+        },
+        {
+          "name": "... except for the secure requests listed here",
+          "expansion": "override",
+          "source_scheme": "https",
+          "source_context_list": "*",
+          "delivery_type": "meta",
+          "delivery_value": null,
+          "redirection": "no-redirect",
+          "subresource": "*",
+          "origin": [
+            "same-https",
+            "cross-https",
+            "same-wss",
+            "cross-wss"
+          ],
+          "expectation": "allowed"
+        }
+      ]
+    },
+    {
+      "name": "With upgrade-insecure-request",
+      "title": "With upgrade-insecure-request",
+      "description": "With upgrade-insecure-request",
+      "specification_url": "https://w3c.github.io/webappsec-upgrade-insecure-requests/",
+      "test_expansion": [
+        {
+          "name": "With upgrade-insecure-request, all insecure requests are upgraded and allowed.",
+          "expansion": "default",
+          "source_scheme": "https",
+          "source_context_list": "*",
+          "delivery_type": "*",
+          "delivery_value": "upgrade",
+          "redirection": "*",
+          "subresource": "*",
+          "origin": "*",
+          "expectation": "allowed"
+        }
+      ]
+    }
+  ],
+  "delivery_key": "upgradeInsecureRequests",
+  "excluded_tests": [
+    {
+      "name": "Omit secure requests",
+      "expansion": "*",
+      "source_scheme": "*",
+      "source_context_list": "*",
+      "delivery_type": "*",
+      "delivery_value": "*",
+      "redirection": "no-redirect",
+      "subresource": "*",
+      "origin": [
+        "same-https",
+        "cross-https",
+        "same-wss",
+        "cross-wss"
+      ],
+      "expectation": "allowed"
+    },
+    {
+      "name": "For inheriting tests skip http-rp because we already have <meta> tests",
+      "expansion": "*",
+      "source_scheme": "*",
+      "source_context_list": [
+        "srcdoc-inherit",
+        "iframe-blank-inherit",
+        "worker-classic-data"
+      ],
+      "delivery_type": "http-rp",
+      "delivery_value": "*",
+      "redirection": "*",
+      "subresource": "*",
+      "origin": "*",
+      "expectation": "*"
+    },
+    {
+      "name": "Workers are same-origin only",
+      "expansion": "*",
+      "source_scheme": "*",
+      "source_context_list": "*",
+      "delivery_type": "*",
+      "delivery_value": "*",
+      "redirection": "*",
+      "subresource": [
+        "worker-classic",
+        "worker-module",
+        "sharedworker-classic"
+      ],
+      "origin": [
+        "cross-https",
+        "cross-http-downgrade",
+        "cross-wss",
+        "cross-ws-downgrade"
+      ],
+      "expectation": "*"
+    },
+    {
+      "name": "Websockets are ws/wss-only",
+      "expansion": "*",
+      "source_scheme": "*",
+      "source_context_list": "*",
+      "delivery_type": "*",
+      "delivery_value": "*",
+      "redirection": "*",
+      "subresource": "websocket",
+      "origin": [
+        "same-https",
+        "same-http-downgrade",
+        "cross-https",
+        "cross-http-downgrade"
+      ],
+      "expectation": "*"
+    },
+    {
+      "name": "Websockets is no-redirect only",
+      "expansion": "*",
+      "source_scheme": "*",
+      "source_context_list": "*",
+      "delivery_type": "*",
+      "delivery_value": "*",
+      "redirection": [
+        "downgrade"
+      ],
+      "subresource": "websocket",
+      "origin": "*",
+      "expectation": "*"
+    },
+    {
+      "name": "ws/wss are websocket-only",
+      "expansion": "*",
+      "source_scheme": "*",
+      "source_context_list": "*",
+      "delivery_type": "*",
+      "delivery_value": "*",
+      "redirection": "*",
+      "subresource": [
+        "iframe-tag",
+        "img-tag",
+        "xhr",
+        "fetch",
+        "worker-classic",
+        "worker-module",
+        "worker-import-data",
+        "sharedworker-classic",
+        "worklet-animation",
+        "worklet-audio",
+        "worklet-layout",
+        "worklet-paint",
+        "worklet-animation-import-data",
+        "worklet-audio-import-data",
+        "worklet-layout-import-data",
+        "worklet-paint-import-data"
+      ],
+      "origin": [
+        "same-wss",
+        "same-ws-downgrade",
+        "cross-wss",
+        "cross-ws-downgrade"
+      ],
+      "expectation": "*"
+    }
+  ],
+  "source_context_schema": {
+    "supported_delivery_type": {
+      "top": [
+        "http-rp",
+        "meta"
+      ],
+      "iframe": [
+        "http-rp",
+        "meta"
+      ],
+      "iframe-blank": [
+        "meta"
+      ],
+      "srcdoc": [
+        "meta"
+      ],
+      "worker-classic": [
+        "http-rp"
+      ],
+      "worker-module": [
+        "http-rp"
+      ],
+      "worker-classic-data": [],
+      "worker-module-data": []
+    },
+    "supported_subresource": {
+      "top": "*",
+      "iframe": "*",
+      "iframe-blank": "*",
+      "srcdoc": "*",
+      "worker-classic": [
+        "xhr",
+        "fetch",
+        "websocket"
+      ],
+      "worker-module": [
+        "xhr",
+        "fetch",
+        "websocket"
+      ],
+      "worker-classic-data": [
+        "xhr",
+        "fetch",
+        "websocket"
+      ],
+      "worker-module-data": [
+        "xhr",
+        "fetch",
+        "websocket"
+      ]
+    }
+  },
+  "subresource_schema": {
+    "supported_delivery_type": {
+      "xhr": [],
+      "worker-classic": [],
+      "worker-module": [],
+      "worker-import-data": [],
+      "sharedworker-classic": [],
+      "worklet-animation": [],
+      "worklet-audio": [],
+      "worklet-layout": [],
+      "worklet-paint": [],
+      "worklet-animation-import-data": [],
+      "worklet-audio-import-data": [],
+      "worklet-layout-import-data": [],
+      "worklet-paint-import-data": [],
+      "fetch": [],
+      "websocket": [],
+      "img-tag": [],
+      "iframe-tag": []
+    }
+  },
+  "source_context_list_schema": {
+    "top": {
+      "description": "CSP set by the top-level Document",
+      "sourceContextList": [
+        {
+          "sourceContextType": "top",
+          "policyDeliveries": [
+            "policy"
+          ]
+        }
+      ],
+      "subresourcePolicyDeliveries": []
+    },
+    "srcdoc-inherit": {
+      "description": "srcdoc iframe should inherit parent Document's policy",
+      "sourceContextList": [
+        {
+          "sourceContextType": "top",
+          "policyDeliveries": [
+            "policy"
+          ]
+        },
+        {
+          "sourceContextType": "srcdoc"
+        }
+      ],
+      "subresourcePolicyDeliveries": []
+    },
+    "iframe-blank-inherit": {
+      "description": "blank iframe should inherit parent Document's policy",
+      "sourceContextList": [
+        {
+          "sourceContextType": "top",
+          "policyDeliveries": [
+            "policy"
+          ]
+        },
+        {
+          "sourceContextType": "iframe-blank"
+        }
+      ],
+      "subresourcePolicyDeliveries": []
+    },
+    "worker-classic-data": {
+      "description": "CSP set by the top-level Document is inherited to dedicated workers",
+      "sourceContextList": [
+        {
+          "sourceContextType": "top",
+          "policyDeliveries": [
+            "policy"
+          ]
+        },
+        {
+          "sourceContextType": "worker-classic-data",
+          "policyDeliveries": []
+        }
+      ],
+      "subresourcePolicyDeliveries": []
+    }
+  },
+  "test_expansion_schema": {
+    "expansion": [
+      "default",
+      "override"
+    ],
+    "source_scheme": [
+      "https"
+    ],
+    "delivery_type": [
+      "http-rp",
+      "meta"
+    ],
+    "delivery_value": [
+      null,
+      "upgrade"
+    ],
+    "source_context_list": [
+      "top",
+      "srcdoc-inherit",
+      "iframe-blank-inherit",
+      "worker-classic-data"
+    ],
+    "redirection": [
+      "no-redirect",
+      "downgrade"
+    ],
+    "origin": [
+      "same-https",
+      "same-http-downgrade",
+      "cross-https",
+      "cross-http-downgrade",
+      "same-wss",
+      "same-ws-downgrade",
+      "cross-wss",
+      "cross-ws-downgrade"
+    ],
+    "subresource": [
+      "iframe-tag",
+      "img-tag",
+      "xhr",
+      "fetch",
+      "websocket",
+      "worker-classic",
+      "worker-module",
+      "worker-import-data",
+      "sharedworker-classic",
+      "worklet-animation",
+      "worklet-audio",
+      "worklet-layout",
+      "worklet-paint",
+      "worklet-animation-import-data",
+      "worklet-audio-import-data",
+      "worklet-layout-import-data",
+      "worklet-paint-import-data"
+    ],
+    "expectation": [
+      "allowed",
+      "blocked"
+    ]
+  }
+}
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/upgrade-insecure-requests/spec_json.js
@@ -0,0 +1,1 @@
+var SPEC_JSON = {"subresource_schema": {"supported_delivery_type": {"worklet-layout": [], "worklet-paint": [], "worker-module": [], "sharedworker-classic": [], "worklet-paint-import-data": [], "worklet-animation-import-data": [], "fetch": [], "xhr": [], "worker-classic": [], "worklet-layout-import-data": [], "worklet-audio-import-data": [], "worklet-animation": [], "worker-import-data": [], "websocket": [], "worklet-audio": [], "iframe-tag": [], "img-tag": []}}, "excluded_tests": [{"delivery_value": "*", "origin": ["same-https", "cross-https", "same-wss", "cross-wss"], "delivery_type": "*", "name": "Omit secure requests", "expectation": "allowed", "expansion": "*", "redirection": "no-redirect", "source_context_list": "*", "source_scheme": "*", "subresource": "*"}, {"delivery_value": "*", "origin": "*", "delivery_type": "http-rp", "name": "For inheriting tests skip http-rp because we already have <meta> tests", "expectation": "*", "expansion": "*", "redirection": "*", "source_context_list": ["srcdoc-inherit", "iframe-blank-inherit", "worker-classic-data"], "source_scheme": "*", "subresource": "*"}, {"delivery_value": "*", "origin": ["cross-https", "cross-http-downgrade", "cross-wss", "cross-ws-downgrade"], "delivery_type": "*", "name": "Workers are same-origin only", "expectation": "*", "expansion": "*", "redirection": "*", "source_context_list": "*", "source_scheme": "*", "subresource": ["worker-classic", "worker-module", "sharedworker-classic"]}, {"delivery_value": "*", "origin": ["same-https", "same-http-downgrade", "cross-https", "cross-http-downgrade"], "delivery_type": "*", "name": "Websockets are ws/wss-only", "expectation": "*", "expansion": "*", "redirection": "*", "source_context_list": "*", "source_scheme": "*", "subresource": "websocket"}, {"delivery_value": "*", "origin": "*", "delivery_type": "*", "name": "Websockets is no-redirect only", "expectation": "*", "expansion": "*", "redirection": ["downgrade"], "source_context_list": "*", "source_scheme": "*", "subresource": "websocket"}, {"delivery_value": "*", "origin": ["same-wss", "same-ws-downgrade", "cross-wss", "cross-ws-downgrade"], "delivery_type": "*", "name": "ws/wss are websocket-only", "expectation": "*", "expansion": "*", "redirection": "*", "source_context_list": "*", "source_scheme": "*", "subresource": ["iframe-tag", "img-tag", "xhr", "fetch", "worker-classic", "worker-module", "worker-import-data", "sharedworker-classic", "worklet-animation", "worklet-audio", "worklet-layout", "worklet-paint", "worklet-animation-import-data", "worklet-audio-import-data", "worklet-layout-import-data", "worklet-paint-import-data"]}], "specification": [{"test_expansion": [{"delivery_value": null, "origin": "*", "delivery_type": "meta", "name": "Without upgrade-insecure-request, all requests are blocked ...", "expectation": "blocked", "expansion": "default", "redirection": "*", "source_context_list": "*", "source_scheme": "https", "subresource": "*"}, {"delivery_value": null, "origin": ["same-https", "cross-https", "same-wss", "cross-wss"], "delivery_type": "meta", "name": "... except for the secure requests listed here", "expectation": "allowed", "expansion": "override", "redirection": "no-redirect", "source_context_list": "*", "source_scheme": "https", "subresource": "*"}], "description": "No upgrade-insecure-request", "specification_url": "https://w3c.github.io/webappsec-upgrade-insecure-requests/", "name": "No upgrade-insecure-request", "title": "No upgrade-insecure-request"}, {"test_expansion": [{"delivery_value": "upgrade", "origin": "*", "delivery_type": "*", "name": "With upgrade-insecure-request, all insecure requests are upgraded and allowed.", "expectation": "allowed", "expansion": "default", "redirection": "*", "source_context_list": "*", "source_scheme": "https", "subresource": "*"}], "description": "With upgrade-insecure-request", "specification_url": "https://w3c.github.io/webappsec-upgrade-insecure-requests/", "name": "With upgrade-insecure-request", "title": "With upgrade-insecure-request"}], "test_expansion_schema": {"delivery_value": [null, "upgrade"], "origin": ["same-https", "same-http-downgrade", "cross-https", "cross-http-downgrade", "same-wss", "same-ws-downgrade", "cross-wss", "cross-ws-downgrade"], "delivery_type": ["http-rp", "meta"], "subresource": ["iframe-tag", "img-tag", "xhr", "fetch", "websocket", "worker-classic", "worker-module", "worker-import-data", "sharedworker-classic", "worklet-animation", "worklet-audio", "worklet-layout", "worklet-paint", "worklet-animation-import-data", "worklet-audio-import-data", "worklet-layout-import-data", "worklet-paint-import-data"], "expectation": ["allowed", "blocked"], "expansion": ["default", "override"], "redirection": ["no-redirect", "downgrade"], "source_context_list": ["top", "srcdoc-inherit", "iframe-blank-inherit", "worker-classic-data"], "source_scheme": ["https"]}, "source_context_list_schema": {"worker-classic-data": {"subresourcePolicyDeliveries": [], "description": "CSP set by the top-level Document is inherited to dedicated workers", "sourceContextList": [{"sourceContextType": "top", "policyDeliveries": ["policy"]}, {"sourceContextType": "worker-classic-data", "policyDeliveries": []}]}, "top": {"subresourcePolicyDeliveries": [], "description": "CSP set by the top-level Document", "sourceContextList": [{"sourceContextType": "top", "policyDeliveries": ["policy"]}]}, "srcdoc-inherit": {"subresourcePolicyDeliveries": [], "description": "srcdoc iframe should inherit parent Document's policy", "sourceContextList": [{"sourceContextType": "top", "policyDeliveries": ["policy"]}, {"sourceContextType": "srcdoc"}]}, "iframe-blank-inherit": {"subresourcePolicyDeliveries": [], "description": "blank iframe should inherit parent Document's policy", "sourceContextList": [{"sourceContextType": "top", "policyDeliveries": ["policy"]}, {"sourceContextType": "iframe-blank"}]}}, "delivery_key": "upgradeInsecureRequests", "source_context_schema": {"supported_delivery_type": {"iframe": ["http-rp", "meta"], "worker-module-data": [], "worker-classic-data": [], "top": ["http-rp", "meta"], "worker-classic": ["http-rp"], "iframe-blank": ["meta"], "worker-module": ["http-rp"], "srcdoc": ["meta"]}, "supported_subresource": {"iframe": "*", "worker-module-data": ["xhr", "fetch", "websocket"], "worker-classic-data": ["xhr", "fetch", "websocket"], "top": "*", "worker-classic": ["xhr", "fetch", "websocket"], "iframe-blank": "*", "worker-module": ["xhr", "fetch", "websocket"], "srcdoc": "*"}}};
deleted file mode 100644
--- a/testing/web-platform/tests/upgrade-insecure-requests/support/generate.py
+++ /dev/null
@@ -1,64 +0,0 @@
-# Usage: execute
-# $ python support/generate.py
-# at wpt/upgrade-insecure-requests/.
-#
-# Note: Some tests (link-upgrade.sub.https.html and
-# websocket-upgrade.https.html) are not covered by this generator script.
-
-template = '''<!DOCTYPE html>
-<html>
-<head>
-<!-- Generated by wpt/upgrade-insecure-requests/support/generate.py -->%(additionalMeta)s
-<title>Upgrade Insecure Requests: %(name)s.</title>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="./support/testharness-helper.sub.js"></script>
-<script src="/common/security-features/resources/common.sub.js"></script>
-
-<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">
-</head>
-<body>
-<script>
-const tests = %(generatorName)s(ResourceType.%(resourceType)s, %(sameOriginOnly)s);
-tests.forEach(test => testMap['%(name)s'](test));
-</script>
-</body>
-</html>
-'''
-
-def getLong(file):
-  testsThatNeedMoreTime = [ "worker-subresource-fetch-redirect-upgrade.https.html" ]
-  if any(file in item for item in testsThatNeedMoreTime ):
-    return '\n<meta name="timeout" content="long">'
-  return ""
-
-# resourceType is |ResourceType| in testharness-helper.sub.js.
-for name, resourceType in [
-  ('image', 'IMAGE'), ('iframe', 'FRAME'),
-  ('animation-worklet', 'WORKLET'), ('audio-worklet', 'WORKLET'),
-  ('layout-worklet', 'WORKLET'), ('paint-worklet', 'WORKLET'),
-  ('worker', 'WORKER'),
-  ('module-worker', 'WORKER'),
-  ('worker-subresource-xhr', 'FETCH'),
-  ('worker-subresource-fetch', 'FETCH'),
-  ('shared-worker', 'SHARED_WORKER')]:
-  # TODO(https://crbug.com/989399): Add tests for subresource requests on shared
-  # workers, and main/subresource requests on service workers.
-
-  sameOriginOnly = 'false'
-  if resourceType == 'WORKER' or resourceType == 'SHARED_WORKER':
-    sameOriginOnly = 'true'
-
-  types = [('', 'generateTests'), ('-redirect', 'generateRedirectTests')]
-  if name == 'module-worker' or resourceType == 'WORKLET':
-    types.append(('-import', 'generateModuleImportTests'))
-
-  for typeName, generatorName in types:
-    filename = '%s%s-upgrade.https.html' % (name, typeName)
-    with open(filename, 'w') as html_file:
-      html_file.write(template % {
-          'name': name,
-          'additionalMeta': getLong(filename),
-          'resourceType': resourceType,
-          'generatorName': generatorName,
-          'sameOriginOnly': sameOriginOnly})
--- a/testing/web-platform/tests/webdriver/tests/take_element_screenshot/user_prompts.py
+++ b/testing/web-platform/tests/webdriver/tests/take_element_screenshot/user_prompts.py
@@ -1,70 +1,122 @@
 # META: timeout=long
 
 import pytest
 
-from tests.support.asserts import assert_png, assert_success
+from tests.support.asserts import assert_dialog_handled, assert_error, assert_png, assert_success
 from tests.support.inline import inline
 
 
 def take_element_screenshot(session, element_id):
     return session.transport.send(
         "GET",
         "session/{session_id}/element/{element_id}/screenshot".format(
             session_id=session.session_id,
             element_id=element_id,
         )
     )
 
 
 @pytest.fixture
-def check_user_prompt_not_closed_without_exception(session, create_dialog):
-    def check_user_prompt_not_closed_without_exception(dialog_type):
+def check_user_prompt_closed_without_exception(session, create_dialog):
+    def check_user_prompt_closed_without_exception(dialog_type, retval):
         session.url = inline("<input/>")
         element = session.find.css("input", all=False)
 
         create_dialog(dialog_type, text=dialog_type)
 
         response = take_element_screenshot(session, element.id)
         value = assert_success(response)
 
+        assert_dialog_handled(session, expected_text=dialog_type, expected_retval=retval)
+
         assert_png(value)
 
+    return check_user_prompt_closed_without_exception
+
+
+@pytest.fixture
+def check_user_prompt_closed_with_exception(session, create_dialog):
+    def check_user_prompt_closed_with_exception(dialog_type, retval):
+        session.url = inline("<input/>")
+        element = session.find.css("input", all=False)
+
+        create_dialog(dialog_type, text=dialog_type)
+
+        response = take_element_screenshot(session, element.id)
+        assert_error(response, "unexpected alert open")
+
+        assert_dialog_handled(session, expected_text=dialog_type, expected_retval=retval)
+
+    return check_user_prompt_closed_with_exception
+
+
+@pytest.fixture
+def check_user_prompt_not_closed_but_exception(session, create_dialog):
+    def check_user_prompt_not_closed_but_exception(dialog_type):
+        session.url = inline("<input/>")
+        element = session.find.css("input", all=False)
+
+        create_dialog(dialog_type, text=dialog_type)
+
+        response = take_element_screenshot(session, element.id)
+        assert_error(response, "unexpected alert open")
+
         assert session.alert.text == dialog_type
         session.alert.dismiss()
 
-    return check_user_prompt_not_closed_without_exception
+    return check_user_prompt_not_closed_but_exception
 
 
 @pytest.mark.capabilities({"unhandledPromptBehavior": "accept"})
-@pytest.mark.parametrize("dialog_type", ["alert", "confirm", "prompt"])
-def test_accept(check_user_prompt_not_closed_without_exception, dialog_type):
-    check_user_prompt_not_closed_without_exception(dialog_type)
+@pytest.mark.parametrize("dialog_type, retval", [
+    ("alert", None),
+    ("confirm", True),
+    ("prompt", ""),
+])
+def test_accept(check_user_prompt_closed_without_exception, dialog_type, retval):
+    check_user_prompt_closed_without_exception(dialog_type, retval)
 
 
 @pytest.mark.capabilities({"unhandledPromptBehavior": "accept and notify"})
-@pytest.mark.parametrize("dialog_type", ["alert", "confirm", "prompt"])
-def test_accept_and_notify(check_user_prompt_not_closed_without_exception, dialog_type):
-    check_user_prompt_not_closed_without_exception(dialog_type)
+@pytest.mark.parametrize("dialog_type, retval", [
+    ("alert", None),
+    ("confirm", True),
+    ("prompt", ""),
+])
+def test_accept_and_notify(check_user_prompt_closed_with_exception, dialog_type, retval):
+    check_user_prompt_closed_with_exception(dialog_type, retval)
 
 
 @pytest.mark.capabilities({"unhandledPromptBehavior": "dismiss"})
-@pytest.mark.parametrize("dialog_type", ["alert", "confirm", "prompt"])
-def test_dismiss(check_user_prompt_not_closed_without_exception, dialog_type):
-    check_user_prompt_not_closed_without_exception(dialog_type)
+@pytest.mark.parametrize("dialog_type, retval", [
+    ("alert", None),
+    ("confirm", False),
+    ("prompt", None),
+])
+def test_dismiss(check_user_prompt_closed_without_exception, dialog_type, retval):
+    check_user_prompt_closed_without_exception(dialog_type, retval)
 
 
 @pytest.mark.capabilities({"unhandledPromptBehavior": "dismiss and notify"})
-@pytest.mark.parametrize("dialog_type", ["alert", "confirm", "prompt"])
-def test_dismiss_and_notify(check_user_prompt_not_closed_without_exception, dialog_type):
-    check_user_prompt_not_closed_without_exception(dialog_type)
+@pytest.mark.parametrize("dialog_type, retval", [
+    ("alert", None),
+    ("confirm", False),
+    ("prompt", None),
+])
+def test_dismiss_and_notify(check_user_prompt_closed_with_exception, dialog_type, retval):
+    check_user_prompt_closed_with_exception(dialog_type, retval)
 
 
 @pytest.mark.capabilities({"unhandledPromptBehavior": "ignore"})
 @pytest.mark.parametrize("dialog_type", ["alert", "confirm", "prompt"])
-def test_ignore(check_user_prompt_not_closed_without_exception, dialog_type):
-    check_user_prompt_not_closed_without_exception(dialog_type)
+def test_ignore(check_user_prompt_not_closed_but_exception, dialog_type):
+    check_user_prompt_not_closed_but_exception(dialog_type)
 
 
-@pytest.mark.parametrize("dialog_type", ["alert", "confirm", "prompt"])
-def test_default(check_user_prompt_not_closed_without_exception, dialog_type):
-    check_user_prompt_not_closed_without_exception(dialog_type)
+@pytest.mark.parametrize("dialog_type, retval", [
+    ("alert", None),
+    ("confirm", False),
+    ("prompt", None),
+])
+def test_default(check_user_prompt_closed_with_exception, dialog_type, retval):
+    check_user_prompt_closed_with_exception(dialog_type, retval)
--- a/testing/web-platform/tests/webdriver/tests/take_screenshot/user_prompts.py
+++ b/testing/web-platform/tests/webdriver/tests/take_screenshot/user_prompts.py
@@ -1,64 +1,114 @@
 # META: timeout=long
 
 import pytest
 
-from tests.support.asserts import assert_png, assert_success
+from tests.support.asserts import assert_dialog_handled, assert_error, assert_png, assert_success
 from tests.support.inline import inline
 
 
 def take_screenshot(session):
     return session.transport.send(
         "GET", "session/{session_id}/screenshot".format(**vars(session)))
 
 
 @pytest.fixture
-def check_user_prompt_not_closed_without_exception(session, create_dialog):
-    def check_user_prompt_not_closed_without_exception(dialog_type):
+def check_user_prompt_closed_without_exception(session, create_dialog):
+    def check_user_prompt_closed_without_exception(dialog_type, retval):
         session.url = inline("<input/>")
 
         create_dialog(dialog_type, text=dialog_type)
 
         response = take_screenshot(session)
         value = assert_success(response)
 
+        assert_dialog_handled(session, expected_text=dialog_type, expected_retval=retval)
+
         assert_png(value)
 
+    return check_user_prompt_closed_without_exception
+
+
+@pytest.fixture
+def check_user_prompt_closed_with_exception(session, create_dialog):
+    def check_user_prompt_closed_with_exception(dialog_type, retval):
+        session.url = inline("<input/>")
+
+        create_dialog(dialog_type, text=dialog_type)
+
+        response = take_screenshot(session)
+        assert_error(response, "unexpected alert open")
+
+        assert_dialog_handled(session, expected_text=dialog_type, expected_retval=retval)
+
+    return check_user_prompt_closed_with_exception
+
+
+@pytest.fixture
+def check_user_prompt_not_closed_but_exception(session, create_dialog):
+    def check_user_prompt_not_closed_but_exception(dialog_type):
+        session.url = inline("<input/>")
+
+        create_dialog(dialog_type, text=dialog_type)
+
+        response = take_screenshot(session)
+        assert_error(response, "unexpected alert open")
+
         assert session.alert.text == dialog_type
         session.alert.dismiss()
 
-    return check_user_prompt_not_closed_without_exception
+    return check_user_prompt_not_closed_but_exception
 
 
 @pytest.mark.capabilities({"unhandledPromptBehavior": "accept"})
-@pytest.mark.parametrize("dialog_type", ["alert", "confirm", "prompt"])
-def test_accept(check_user_prompt_not_closed_without_exception, dialog_type):
-    check_user_prompt_not_closed_without_exception(dialog_type)
+@pytest.mark.parametrize("dialog_type, retval", [
+    ("alert", None),
+    ("confirm", True),
+    ("prompt", ""),
+])
+def test_accept(check_user_prompt_closed_without_exception, dialog_type, retval):
+    check_user_prompt_closed_without_exception(dialog_type, retval)
 
 
 @pytest.mark.capabilities({"unhandledPromptBehavior": "accept and notify"})
-@pytest.mark.parametrize("dialog_type", ["alert", "confirm", "prompt"])
-def test_accept_and_notify(check_user_prompt_not_closed_without_exception, dialog_type):
-    check_user_prompt_not_closed_without_exception(dialog_type)
+@pytest.mark.parametrize("dialog_type, retval", [
+    ("alert", None),
+    ("confirm", True),
+    ("prompt", ""),
+])
+def test_accept_and_notify(check_user_prompt_closed_with_exception, dialog_type, retval):
+    check_user_prompt_closed_with_exception(dialog_type, retval)
 
 
 @pytest.mark.capabilities({"unhandledPromptBehavior": "dismiss"})
-@pytest.mark.parametrize("dialog_type", ["alert", "confirm", "prompt"])
-def test_dismiss(check_user_prompt_not_closed_without_exception, dialog_type):
-    check_user_prompt_not_closed_without_exception(dialog_type)
+@pytest.mark.parametrize("dialog_type, retval", [
+    ("alert", None),
+    ("confirm", False),
+    ("prompt", None),
+])
+def test_dismiss(check_user_prompt_closed_without_exception, dialog_type, retval):
+    check_user_prompt_closed_without_exception(dialog_type, retval)
 
 
 @pytest.mark.capabilities({"unhandledPromptBehavior": "dismiss and notify"})
-@pytest.mark.parametrize("dialog_type", ["alert", "confirm", "prompt"])
-def test_dismiss_and_notify(check_user_prompt_not_closed_without_exception, dialog_type):
-    check_user_prompt_not_closed_without_exception(dialog_type)
+@pytest.mark.parametrize("dialog_type, retval", [
+    ("alert", None),
+    ("confirm", False),
+    ("prompt", None),
+])
+def test_dismiss_and_notify(check_user_prompt_closed_with_exception, dialog_type, retval):
+    check_user_prompt_closed_with_exception(dialog_type, retval)
 
 
 @pytest.mark.capabilities({"unhandledPromptBehavior": "ignore"})
 @pytest.mark.parametrize("dialog_type", ["alert", "confirm", "prompt"])
-def test_ignore(check_user_prompt_not_closed_without_exception, dialog_type):
-    check_user_prompt_not_closed_without_exception(dialog_type)
+def test_ignore(check_user_prompt_not_closed_but_exception, dialog_type):
+    check_user_prompt_not_closed_but_exception(dialog_type)
 
 
-@pytest.mark.parametrize("dialog_type", ["alert", "confirm", "prompt"])
-def test_default(check_user_prompt_not_closed_without_exception, dialog_type):
-    check_user_prompt_not_closed_without_exception(dialog_type)
+@pytest.mark.parametrize("dialog_type, retval", [
+    ("alert", None),
+    ("confirm", False),
+    ("prompt", None),
+])
+def test_default(check_user_prompt_closed_with_exception, dialog_type, retval):
+    check_user_prompt_closed_with_exception(dialog_type, retval)
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/webrtc-identity/idlharness.https.window.js
@@ -0,0 +1,24 @@
+// META: script=/resources/WebIDLParser.js
+// META: script=/resources/idlharness.js
+
+'use strict';
+
+idl_test(
+  ['webrtc-identity'],
+  ['webrtc', 'mediacapture-streams', 'html', 'dom'],
+  async idlArray => {
+    idlArray.add_objects({
+      RTCPeerConnection: [`new RTCPeerConnection()`],
+      RTCIdentityAssertion: [`new RTCIdentityAssertion('idp', 'name')`],
+      MediaStreamTrack: ['track'],
+      // TODO: RTCIdentityProviderGlobalScope
+      // TODO: RTCIdentityProviderRegistrar
+    });
+
+    try {
+      self.track = await navigator.mediaDevices
+          .getUserMedia({audio: true})
+          .then(m => m.getTracks()[0]);
+    } catch (e) {}
+  }
+);
--- a/testing/web-platform/tests/webxr/resources/webxr_test_asserts.js
+++ b/testing/web-platform/tests/webxr/resources/webxr_test_asserts.js
@@ -25,16 +25,41 @@ let assert_point_approx_equals = functio
     let error_message = prefix + ' Point comparison failed.\n';
     error_message += ` p1: {x: ${p1.x}, y: ${p1.y}, z: ${p1.z}, w: ${p1.w}}\n`;
     error_message += ` p2: {x: ${p2.x}, y: ${p2.y}, z: ${p2.z}, w: ${p2.w}}\n`;
     error_message += ` Difference in component ${mismatched_component} exceeded the given epsilon.\n`;
     assert_approx_equals(p2[mismatched_component], p1[mismatched_component], epsilon, error_message);
   }
 };
 
+// |p1|, |p2| - objects with x, y, z, w components that are floating point numbers
+// |epsilon| - float specifying precision
+// |prefix| - string used as a prefix for logging
+let assert_point_significantly_not_equals = function(p1, p2, epsilon = FLOAT_EPSILON, prefix = "") {
+
+  assert_not_equals(p1, null, prefix + "p1 must be non-null");
+  assert_not_equals(p2, null, prefix + "p2 must be non-null");
+
+  let mismatched_component = null;
+  for (const v of ['x', 'y', 'z', 'w']) {
+    if (Math.abs(p1[v] - p2[v]) > epsilon) {
+      mismatched_component = v;
+      break;
+    }
+  }
+
+  if (mismatched_component === null) {
+    let error_message = prefix + ' Point comparison failed.\n';
+    error_message += ` p1: {x: ${p1.x}, y: ${p1.y}, z: ${p1.z}, w: ${p1.w}}\n`;
+    error_message += ` p2: {x: ${p2.x}, y: ${p2.y}, z: ${p2.z}, w: ${p2.w}}\n`;
+    error_message += ` Difference in components did not exceeded the given epsilon.\n`;
+    assert_unreached(error_message);
+  }
+};
+
 // |m1|, |m2| - arrays of floating point numbers
 // |epsilon| - float specifying precision
 // |prefix| - string used as a prefix for logging
 let assert_matrix_approx_equals = function(m1, m2, epsilon = FLOAT_EPSILON, prefix = "") {
   if (m1 == null && m2 == null) {
     return;
   }
 
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/webxr/xrDevice_isSessionSupported_immersive.https.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<body>
+  <script src=/resources/testharness.js></script>
+  <script src=/resources/testharnessreport.js></script>
+  <script src="resources/webxr_util.js"></script>
+  <script src="resources/webxr_test_constants.js"></script>
+  <script>
+    xr_promise_test(
+      "isSessionSupported resolves to true when immersive options supported",
+      (t) => {
+        return navigator.xr.test.simulateDeviceConnection(TRACKED_IMMERSIVE_DEVICE)
+          .then( (controller) => {
+            return navigator.xr.isSessionSupported('immersive-vr').then((supported) => {
+              t.step(() => {
+                assert_true(supported);
+              });
+            });
+          });
+      });
+  </script>
+</body>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/webxr/xrDevice_isSessionSupported_immersive_unsupported.https.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<body>
+  <script src=/resources/testharness.js></script>
+  <script src=/resources/testharnessreport.js></script>
+  <script src="resources/webxr_util.js"></script>
+  <script src="resources/webxr_test_constants.js"></script>
+  <script>
+    xr_promise_test(
+      "isSessionSupported resolves to false when options not supported",
+      (t) => {
+      return navigator.xr.test.simulateDeviceConnection(VALID_NON_IMMERSIVE_DEVICE)
+        .then( (controller) => {
+          return navigator.xr.isSessionSupported('immersive-vr').then((supported) => {
+            t.step(() => {
+              assert_false(supported);
+            });
+          });
+        });
+    });
+  </script>
+</body>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/webxr/xrDevice_isSessionSupported_inline.https.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<body>
+  <script src=/resources/testharness.js></script>
+  <script src=/resources/testharnessreport.js></script>
+  <script src="resources/webxr_util.js"></script>
+  <script src="resources/webxr_test_constants.js"></script>
+  <script>
+    xr_promise_test(
+      "isSessionSupported resolves to true when inline options supported",
+      (t) => {
+      return navigator.xr.test.simulateDeviceConnection(TRACKED_IMMERSIVE_DEVICE)
+        .then( (controller) => {
+          // Inline sessions should be supported.
+          return navigator.xr.isSessionSupported('inline').then((supported) => {
+            t.step(() => {
+              assert_true(supported);
+            });
+          });
+        });
+    });
+  </script>
+</body>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/webxr/xrReferenceSpace_originOffset_viewer.https.html
@@ -0,0 +1,54 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/webxr_util.js"></script>
+<script src="resources/webxr_test_constants.js"></script>
+<script src="resources/webxr_test_asserts.js"></script>
+<canvas id="webgl-canvas"></canvas>
+
+<script>
+let testName = "Creating XRReferenceSpace origin offset off of `viewer` space works.";
+
+let fakeDeviceInitParams = {
+  supportsImmersive: true,
+  viewerOrigin: VALID_POSE_TRANSFORM,
+  views: VALID_VIEWS,
+  supportedFeatures: ALL_FEATURES
+};
+
+let originOffsetPosition = new DOMPointReadOnly(0, 0, 1);
+
+let testFunction =
+  (session, fakeDeviceController, t) => new Promise((resolve) => {
+
+    session.requestReferenceSpace('local').then( (localSpace) => {
+      session.requestReferenceSpace('viewer').then( (viewerSpace) => {
+
+        let offsetSpace = viewerSpace.getOffsetReferenceSpace(
+          new XRRigidTransform(originOffsetPosition));
+
+        function OnFrame(time, frame) {
+          let viewerPose = frame.getPose(viewerSpace, localSpace);
+          let offsetPose = frame.getPose(offsetSpace, localSpace);
+
+          let viewerPose2 = frame.getPose(localSpace ,viewerSpace);
+          let offsetPose2 = frame.getPose(localSpace, offsetSpace);
+
+          t.step(() => {
+            assert_point_significantly_not_equals(viewerPose.transform.position, offsetPose.transform.position);
+            assert_point_significantly_not_equals(viewerPose2.transform.position, offsetPose2.transform.position);
+          });
+
+          resolve();
+        }
+
+        // Can only request input poses in an xr frame.
+        session.requestAnimationFrame(OnFrame);
+      });
+    });
+  });
+
+xr_session_promise_test(
+  testName, testFunction, fakeDeviceInitParams, 'immersive-vr');
+
+</script>