Merge mozilla-inbound to mozilla-central. a=merge
authorCosmin Sabou <csabou@mozilla.com>
Wed, 25 Sep 2019 12:50:13 +0300
changeset 494896 c31591e0b66f277398bee74da03c49e8f8a0ede0
parent 494877 24946cc70b2e7ad999533709c46b8bbc24214d31 (current diff)
parent 494788 7abf7888f8960c95dcf390f8215975adc08618aa (diff)
child 494897 7835197b7a5e34707d1e96131e87f37020737687
child 494988 ab34396aa1bb68e298535daab97dcca6b5a8acca
push id114131
push userdluca@mozilla.com
push dateThu, 26 Sep 2019 09:47:34 +0000
treeherdermozilla-inbound@1dc1a755079a [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone71.0a1
first release with
nightly linux32
c31591e0b66f / 71.0a1 / 20190925095053 / files
nightly linux64
c31591e0b66f / 71.0a1 / 20190925095053 / files
nightly mac
c31591e0b66f / 71.0a1 / 20190925095053 / files
nightly win32
c31591e0b66f / 71.0a1 / 20190925095053 / files
nightly win64
c31591e0b66f / 71.0a1 / 20190925095053 / files
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
releases
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge mozilla-inbound to mozilla-central. a=merge
browser/components/urlbar/tests/browser/browser_tip_keyboard_selection.js
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-cascade/all-prop-initial-visited.html.ini
@@ -0,0 +1,2 @@
+[all-prop-initial-visited.html]
+  expected: FAIL
deleted file mode 100644
--- a/testing/web-platform/meta/css/css-fonts/animations/font-size-interpolation-002.html.ini
+++ /dev/null
@@ -1,19 +0,0 @@
-[font-size-interpolation-002.html]
-  [Animation between "unset" and "20px" at progress -2]
-    expected: FAIL
-
-  [Animation between "unset" and "20px" at progress 1.5]
-    expected: FAIL
-
-  [Animation between "unset" and "20px" at progress 0.3]
-    expected: FAIL
-
-  [Animation between "unset" and "20px" at progress 0]
-    expected: FAIL
-
-  [Animation between "unset" and "20px" at progress 0.6]
-    expected: FAIL
-
-  [Animation between "unset" and "20px" at progress -0.3]
-    expected: FAIL
-
--- a/testing/web-platform/meta/css/css-fonts/animations/font-variation-settings-interpolation.html.ini
+++ b/testing/web-platform/meta/css/css-fonts/animations/font-variation-settings-interpolation.html.ini
@@ -1799,8 +1799,9 @@
   [CSS Transitions: property <font-variation-settings> from ['test' 20\] to ['test' 30\] at (0) should be [\]]
     expected: FAIL
 
   [CSS Animations: property <font-variation-settings> from ['aaaa' 0, 'bbbb' 10\] to ['aaaa' 10, 'bbbb' 20, 'cccc' 30\] at (0.3) should be [\]]
     expected: FAIL
 
   [CSS Transitions with transition: all: property <font-variation-settings> from [initial\] to ['test' 50\] at (-0.3) should be [\]]
     expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-text-decor/parsing/text-decoration-shorthand.html.ini
@@ -0,0 +1,4 @@
+[text-decoration-shorthand.html]
+  [e.style['text-decoration'\] = "overline dotted green" should not set unrelated longhands]
+    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,7 +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 == "x86_64"): FAIL
-    if (os == "win") and (processor == "aarch64"): ["FAIL", "PASS"]
-    if (os == "win") and (processor == "x86"): FAIL
+    if (os == "win") and (processor == "aarch64"): ["PASS", "FAIL"]
--- a/testing/web-platform/meta/css/css-ui/appearance-button-bevel-001.html.ini
+++ b/testing/web-platform/meta/css/css-ui/appearance-button-bevel-001.html.ini
@@ -1,7 +1,7 @@
 [appearance-button-bevel-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"): ["FAIL", "PASS"]
+    if (os == "win") and (processor == "aarch64"): ["PASS", "FAIL"]
     if (os == "win") and (processor == "x86_64"): FAIL
--- a/testing/web-platform/meta/css/css-ui/appearance-checkbox-001.html.ini
+++ b/testing/web-platform/meta/css/css-ui/appearance-checkbox-001.html.ini
@@ -1,7 +1,7 @@
 [appearance-checkbox-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"): ["FAIL", "PASS"]
     if (os == "win") and (processor == "x86_64"): FAIL
+    if (os == "win") and (processor == "aarch64"): ["PASS", "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 debug and (processor == "x86_64"): ["FAIL", "PASS"]
-    if (os == "win") and debug and (processor == "x86"): ["PASS", "FAIL"]
-    if (os == "win") and not debug: ["FAIL", "PASS"]
+    if (os == "win") and (processor == "x86") and not debug: ["PASS", "FAIL"]
+    if (os == "win") and (processor == "x86") and debug: ["PASS", "FAIL"]
+    if (os == "win") and (processor == "x86_64"): ["FAIL", "PASS"]
+    if (os == "win") and (processor == "aarch64"): ["FAIL", "PASS"]
--- 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,5 +1,7 @@
 [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 == "android") and e10s: FAIL
-    bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1556685
+      if (os == "linux") and webrender and not debug: ["PASS", "FAIL"]
+      if os == "android": FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/cssom-view/scroll-behavior-default-css.html.ini
@@ -0,0 +1,5 @@
+[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"]
+
--- 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,11 +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:
-      if (os == "linux") and debug and not webrender and sw-e10s: ["FAIL", "PASS"]
-      if (os == "linux") and debug and not webrender and not sw-e10s: ["PASS", "FAIL"]
-      if (os == "linux") and not debug and (processor == "x86_64") and webrender: ["PASS", "FAIL"]
+      if (os == "linux") and not debug and (processor == "x86_64") and webrender: ["FAIL", "PASS"]
       if (os == "linux") and not debug and (processor == "x86_64") and not webrender: ["FAIL", "PASS"]
-      if (os == "linux") and debug and webrender: ["FAIL", "PASS"]
+      if (os == "linux") and debug and sw-e10s: ["FAIL", "PASS"]
+      if (os == "linux") and debug and not sw-e10s: ["PASS", "FAIL"]
       if (os == "win") and debug: ["FAIL", "PASS"]
       FAIL
 
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/infrastructure/expected-fail/unhandled-rejection.html.ini
@@ -0,0 +1,4 @@
+[unhandled-rejection.html]
+  [Unhandled rejection]
+    expected: FAIL
+
--- a/testing/web-platform/meta/mathml/relations/html5-tree/clipboard-event-handlers.tentative.html.ini
+++ b/testing/web-platform/meta/mathml/relations/html5-tree/clipboard-event-handlers.tentative.html.ini
@@ -1,10 +1,9 @@
 [clipboard-event-handlers.tentative.html]
-  expected: TIMEOUT
   [oncut: the content attribute must be compiled into a function as the corresponding property]
     expected: FAIL
 
   [oncopy: the content attribute must be compiled into a function as the corresponding property]
     expected: FAIL
 
   [onpaste: the content attribute must be compiled into a function as the corresponding property]
     expected: FAIL
@@ -14,16 +13,16 @@
 
   [oncut: dynamic changes on the attribute]
     expected: FAIL
 
   [onpaste: dynamic changes on the attribute]
     expected: FAIL
 
   [copy: dispatching an Event at a <math> element must trigger element.oncopy]
-    expected: TIMEOUT
+    expected: FAIL
 
   [cut: dispatching an Event at a <math> element must trigger element.oncut]
-    expected: TIMEOUT
+    expected: FAIL
 
   [paste: dispatching an Event at a <math> element must trigger element.onpaste]
-    expected: TIMEOUT
+    expected: FAIL
 
--- a/testing/web-platform/meta/mathml/relations/html5-tree/math-global-event-handlers.tentative.html.ini
+++ b/testing/web-platform/meta/mathml/relations/html5-tree/math-global-event-handlers.tentative.html.ini
@@ -1,10 +1,9 @@
 [math-global-event-handlers.tentative.html]
-  expected: TIMEOUT
   [onkeyup: the default value must be null]
     expected: FAIL
 
   [oncuechange: the default value must be null]
     expected: FAIL
 
   [oncuechange: must be on the appropriate locations for GlobalEventHandlers]
     expected: FAIL
@@ -740,190 +739,190 @@
 
   [ondragleave: dynamic changes on the attribute]
     expected: FAIL
 
   [ondragenter: dynamic changes on the attribute]
     expected: FAIL
 
   [ondrag: dispatching an Event at a <math> element must trigger element.ondrag]
-    expected: TIMEOUT
+    expected: FAIL
 
   [onload: dispatching an Event at a <math> element must trigger element.onload]
-    expected: TIMEOUT
+    expected: FAIL
 
   [onmouseleave: dispatching an Event at a <math> element must trigger element.onmouseleave]
-    expected: TIMEOUT
+    expected: FAIL
 
   [onloadedmetadata: dispatching an Event at a <math> element must trigger element.onloadedmetadata]
-    expected: TIMEOUT
+    expected: FAIL
 
   [onkeypress: dispatching an Event at a <math> element must trigger element.onkeypress]
-    expected: TIMEOUT
+    expected: FAIL
 
   [onsecuritypolicyviolation: dispatching an Event at a <math> element must trigger element.onsecuritypolicyviolation]
-    expected: TIMEOUT
+    expected: FAIL
 
   [onsuspend: dispatching an Event at a <math> element must trigger element.onsuspend]
-    expected: TIMEOUT
+    expected: FAIL
 
   [onseeked: dispatching an Event at a <math> element must trigger element.onseeked]
-    expected: TIMEOUT
+    expected: FAIL
 
   [oncancel: dispatching an Event at a <math> element must trigger element.oncancel]
-    expected: TIMEOUT
+    expected: FAIL
 
   [onscroll: dispatching an Event at a <math> element must trigger element.onscroll]
-    expected: TIMEOUT
+    expected: FAIL
 
   [onwheel: dispatching an Event at a <math> element must trigger element.onwheel]
-    expected: TIMEOUT
+    expected: FAIL
 
   [onblur: dispatching an Event at a <math> element must trigger element.onblur]
-    expected: TIMEOUT
+    expected: FAIL
 
   [onended: dispatching an Event at a <math> element must trigger element.onended]
-    expected: TIMEOUT
+    expected: FAIL
 
   [onselect: dispatching an Event at a <math> element must trigger element.onselect]
-    expected: TIMEOUT
+    expected: FAIL
 
   [onmouseup: dispatching an Event at a <math> element must trigger element.onmouseup]
-    expected: TIMEOUT
+    expected: FAIL
 
   [onfocus: dispatching an Event at a <math> element must trigger element.onfocus]
-    expected: TIMEOUT
+    expected: FAIL
 
   [onabort: dispatching an Event at a <math> element must trigger element.onabort]
-    expected: TIMEOUT
+    expected: FAIL
 
   [onformdata: dispatching an Event at a <math> element must trigger element.onformdata]
-    expected: TIMEOUT
+    expected: FAIL
 
   [onresize: dispatching an Event at a <math> element must trigger element.onresize]
-    expected: TIMEOUT
+    expected: FAIL
 
   [onplaying: dispatching an Event at a <math> element must trigger element.onplaying]
-    expected: TIMEOUT
+    expected: FAIL
 
   [onclick: dispatching an Event at a <math> element must trigger element.onclick]
-    expected: TIMEOUT
+    expected: FAIL
 
   [onwaiting: dispatching an Event at a <math> element must trigger element.onwaiting]
-    expected: TIMEOUT
+    expected: FAIL
 
   [onseeking: dispatching an Event at a <math> element must trigger element.onseeking]
-    expected: TIMEOUT
+    expected: FAIL
 
   [onplay: dispatching an Event at a <math> element must trigger element.onplay]
-    expected: TIMEOUT
+    expected: FAIL
 
   [onreset: dispatching an Event at a <math> element must trigger element.onreset]
-    expected: TIMEOUT
+    expected: FAIL
 
   [onprogress: dispatching an Event at a <math> element must trigger element.onprogress]
-    expected: TIMEOUT
+    expected: FAIL
 
   [oncanplay: dispatching an Event at a <math> element must trigger element.oncanplay]
-    expected: TIMEOUT
+    expected: FAIL
 
   [onkeydown: dispatching an Event at a <math> element must trigger element.onkeydown]
-    expected: TIMEOUT
+    expected: FAIL
 
   [onloadeddata: dispatching an Event at a <math> element must trigger element.onloadeddata]
-    expected: TIMEOUT
+    expected: FAIL
 
   [onsubmit: dispatching an Event at a <math> element must trigger element.onsubmit]
-    expected: TIMEOUT
+    expected: FAIL
 
   [oninvalid: dispatching an Event at a <math> element must trigger element.oninvalid]
-    expected: TIMEOUT
+    expected: FAIL
 
   [ondblclick: dispatching an Event at a <math> element must trigger element.ondblclick]
-    expected: TIMEOUT
+    expected: FAIL
 
   [onratechange: dispatching an Event at a <math> element must trigger element.onratechange]
-    expected: TIMEOUT
+    expected: FAIL
 
   [ontimeupdate: dispatching an Event at a <math> element must trigger element.ontimeupdate]
-    expected: TIMEOUT
+    expected: FAIL
 
   [ondrop: dispatching an Event at a <math> element must trigger element.ondrop]
-    expected: TIMEOUT
+    expected: FAIL
 
   [onauxclick: dispatching an Event at a <math> element must trigger element.onauxclick]
-    expected: TIMEOUT
+    expected: FAIL
 
   [onmousemove: dispatching an Event at a <math> element must trigger element.onmousemove]
-    expected: TIMEOUT
+    expected: FAIL
 
   [ondragover: dispatching an Event at a <math> element must trigger element.ondragover]
-    expected: TIMEOUT
+    expected: FAIL
 
   [onemptied: dispatching an Event at a <math> element must trigger element.onemptied]
-    expected: TIMEOUT
+    expected: FAIL
 
   [ondragexit: dispatching an Event at a <math> element must trigger element.ondragexit]
-    expected: TIMEOUT
+    expected: FAIL
 
   [onclose: dispatching an Event at a <math> element must trigger element.onclose]
-    expected: TIMEOUT
+    expected: FAIL
 
   [onmouseover: dispatching an Event at a <math> element must trigger element.onmouseover]
-    expected: TIMEOUT
+    expected: FAIL
 
   [onloadstart: dispatching an Event at a <math> element must trigger element.onloadstart]
-    expected: TIMEOUT
+    expected: FAIL
 
   [onchange: dispatching an Event at a <math> element must trigger element.onchange]
-    expected: TIMEOUT
+    expected: FAIL
 
   [oncanplaythrough: dispatching an Event at a <math> element must trigger element.oncanplaythrough]
-    expected: TIMEOUT
+    expected: FAIL
 
   [onstalled: dispatching an Event at a <math> element must trigger element.onstalled]
-    expected: TIMEOUT
+    expected: FAIL
 
   [onpause: dispatching an Event at a <math> element must trigger element.onpause]
-    expected: TIMEOUT
+    expected: FAIL
 
   [ondragleave: dispatching an Event at a <math> element must trigger element.ondragleave]
-    expected: TIMEOUT
+    expected: FAIL
 
   [onvolumechange: dispatching an Event at a <math> element must trigger element.onvolumechange]
-    expected: TIMEOUT
+    expected: FAIL
 
   [oninput: dispatching an Event at a <math> element must trigger element.oninput]
-    expected: TIMEOUT
+    expected: FAIL
 
   [oncuechange: dispatching an Event at a <math> element must trigger element.oncuechange]
-    expected: TIMEOUT
+    expected: FAIL
 
   [onmouseout: dispatching an Event at a <math> element must trigger element.onmouseout]
-    expected: TIMEOUT
+    expected: FAIL
 
   [ondragenter: dispatching an Event at a <math> element must trigger element.ondragenter]
-    expected: TIMEOUT
+    expected: FAIL
 
   [ondurationchange: dispatching an Event at a <math> element must trigger element.ondurationchange]
-    expected: TIMEOUT
+    expected: FAIL
 
   [oncontextmenu: dispatching an Event at a <math> element must trigger element.oncontextmenu]
-    expected: TIMEOUT
+    expected: FAIL
 
   [onmousedown: dispatching an Event at a <math> element must trigger element.onmousedown]
-    expected: TIMEOUT
+    expected: FAIL
 
   [ondragend: dispatching an Event at a <math> element must trigger element.ondragend]
-    expected: TIMEOUT
+    expected: FAIL
 
   [ontoggle: dispatching an Event at a <math> element must trigger element.ontoggle]
-    expected: TIMEOUT
+    expected: FAIL
 
   [ondragstart: dispatching an Event at a <math> element must trigger element.ondragstart]
-    expected: TIMEOUT
+    expected: FAIL
 
   [onmouseenter: dispatching an Event at a <math> element must trigger element.onmouseenter]
-    expected: TIMEOUT
+    expected: FAIL
 
   [onkeyup: dispatching an Event at a <math> element must trigger element.onkeyup]
-    expected: TIMEOUT
+    expected: FAIL
 
--- a/testing/web-platform/meta/mozilla-sync
+++ b/testing/web-platform/meta/mozilla-sync
@@ -1,2 +1,2 @@
-local: 3d4dffa643fe969ce250e882aab5064ee3765e9c
-upstream: 6d3088b17a01314dde58a11a7ba0a99e33375e1a
+local: a9b0375fc5d6e30137c82d92d1900f7616bc1b19
+upstream: 42b82765b84378e746063997f51f9fd75a1d902c
--- 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,10 @@
 [pointerevent_movementxy.html]
   expected:
-    if debug and not webrender and (os == "mac"): ["OK", "ERROR"]
-    if debug and webrender: ["OK", "ERROR"]
+    if debug and (os == "linux") and not webrender and sw-e10s: ["OK", "ERROR"]
+    if debug and (os == "linux") and webrender: ["OK", "ERROR"]
+    if debug and (os == "win") and webrender: ["OK", "ERROR"]
+    if debug and (os == "mac"): ["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 not debug: ["FAIL", "PASS"]
-      if (os == "linux") and not sw-e10s and webrender and debug: ["FAIL", "PASS"]
-      if (os == "win") and (processor == "aarch64"): ["FAIL", "PASS"]
-      if (os == "linux") and sw-e10s: ["FAIL", "PASS"]
-      if (os == "mac") and not debug: ["FAIL", "PASS"]
-      [PASS, FAIL]
+      if (os == "win") and (processor == "x86_64") and not webrender and not debug: ["PASS", "FAIL"]
+      if (os == "linux") and not debug and (processor == "x86_64"): ["PASS", "FAIL"]
+      if (os == "win") and (processor == "x86") and not debug: ["PASS", "FAIL"]
+      if os == "android": ["PASS", "FAIL"]
+      [FAIL, PASS]
 
--- 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,8 +1,9 @@
 [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 webrender and not debug: ["PASS", "FAIL"]
-      if (os == "linux") and webrender and debug: ["PASS", "FAIL"]
-      if (os == "linux") and not webrender: ["PASS", "FAIL"]
+      if (os == "linux") and debug and not webrender and not sw-e10s: ["PASS", "FAIL"]
+      if (os == "linux") and debug and not webrender and sw-e10s: ["PASS", "FAIL"]
+      if (os == "linux") and debug and webrender: ["PASS", "FAIL"]
+      if (os == "linux") and not debug: ["PASS", "FAIL"]
 
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/portals/portals-repeated-activate.html.ini
@@ -0,0 +1,5 @@
+[portals-repeated-activate.html]
+  expected: ERROR
+  [test activation in page that has been reactivated]
+    expected: TIMEOUT
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/resource-timing/crossorigin-sandwich-partial-TAO.sub.html.ini
@@ -0,0 +1,10 @@
+[crossorigin-sandwich-partial-TAO.sub.html]
+  [startTime == fetchStart in cross-origin redirect with Timing-Allow-Origin in some of the chain but not all of it.]
+    expected: FAIL
+
+  [redirectEnd == 0 in cross-origin redirect with Timing-Allow-Origin in some of the chain but not all of it.]
+    expected: FAIL
+
+  [redirectStart == 0 in cross-origin redirect with Timing-Allow-Origin in some of the chain but not all of it.]
+    expected: FAIL
+
--- a/testing/web-platform/meta/resource-timing/status-codes-create-entry.html.ini
+++ b/testing/web-platform/meta/resource-timing/status-codes-create-entry.html.ini
@@ -1,10 +1,9 @@
 [status-codes-create-entry.html]
   [Make sure all status codes are reported]
     expected:
-      if debug and (os == "linux") and not webrender and not sw-e10s: ["FAIL", "PASS"]
-      if not debug and (os == "win") and (processor == "x86_64") and not webrender: PASS
-      if debug and (os == "linux") and webrender: PASS
-      if not debug and (os == "linux") and (processor == "x86"): PASS
-      if not debug and (os == "android"): PASS
+      if (os == "linux") and (processor == "x86_64") and debug and webrender: PASS
+      if (os == "win") and (processor == "x86_64") and not webrender and not debug: PASS
+      if (os == "linux") and (processor == "x86"): PASS
+      if (os == "android") and not debug: PASS
       [PASS, FAIL]
 
--- 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
@@ -2,17 +2,17 @@
   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"]
   [Frame location should not update on failed mixed-content navigation]
     expected:
-      if (os == "linux") and webrender and not debug: ["PASS", "NOTRUN"]
+      if (os == "linux") and webrender and not debug: ["PASS", "NOTRUN", "TIMEOUT"]
       if (os == "mac") and debug: ["PASS", "TIMEOUT", "NOTRUN"]
       if (os == "mac") and not debug: ["PASS", "NOTRUN"]
 
   [Frame location should update on successful navigation]
     expected:
       if os == "mac": ["PASS", "TIMEOUT"]
 
   [Frame location should not be accessible after cross-origin navigation]
--- a/testing/web-platform/meta/service-workers/service-worker/detached-context.https.html.ini
+++ b/testing/web-platform/meta/service-workers/service-worker/detached-context.https.html.ini
@@ -1,7 +1,21 @@
 [detached-context.https.html]
+  expected:
+    if webrender and (os == "linux") and debug: ["OK", "TIMEOUT"]
   [accessing navigator on a removed frame]
     expected: FAIL
 
   [accessing navigator.serviceWorker on a removed about:blank frame]
     expected: FAIL
 
+  [accessing a ServiceWorker object from a removed iframe]
+    expected:
+      if webrender and (os == "linux") and debug: ["PASS", "NOTRUN"]
+
+  [accessing navigator.serviceWorker on a detached iframe]
+    expected:
+      if webrender and (os == "linux") and debug: ["PASS", "NOTRUN"]
+
+  [accessing a ServiceWorkerRegistration from a removed iframe]
+    expected:
+      if webrender and (os == "linux") and debug: ["PASS", "TIMEOUT"]
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/service-workers/service-worker/embed-and-object-are-not-intercepted.https.html.ini
@@ -0,0 +1,23 @@
+[embed-and-object-are-not-intercepted.https.html]
+  expected:
+    if webrender and (os == "linux") and debug: ["OK", "TIMEOUT"]
+  [requests for EMBED elements of embedded HTML content should not be intercepted by service workers]
+    expected:
+      if webrender and (os == "linux") and debug: ["PASS", "NOTRUN"]
+
+  [requests for EMBED elements of an image should not be intercepted by service workers]
+    expected:
+      if webrender and (os == "linux") and debug: ["PASS", "NOTRUN"]
+
+  [requests for OBJECT elements of embedded HTML content should not be intercepted by service workers]
+    expected:
+      if webrender and (os == "linux") and debug: ["PASS", "NOTRUN"]
+
+  [requests for OBJECT elements of an image should not be intercepted by service workers]
+    expected:
+      if webrender and (os == "linux") and debug: ["PASS", "NOTRUN"]
+
+  [initialize global state]
+    expected:
+      if webrender and (os == "linux") and debug: ["PASS", "TIMEOUT"]
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/service-workers/service-worker/getregistration.https.html.ini
@@ -0,0 +1,19 @@
+[getregistration.https.html]
+  expected:
+    if webrender and (os == "linux") and debug: ["OK", "TIMEOUT"]
+  [Register then Unregister then getRegistration]
+    expected:
+      if webrender and (os == "linux") and debug: ["PASS", "TIMEOUT"]
+
+  [Register then getRegistration]
+    expected:
+      if webrender and (os == "linux") and debug: ["PASS", "TIMEOUT"]
+
+  [Register then Unregister then getRegistration in controlled iframe]
+    expected:
+      if webrender and (os == "linux") and debug: ["PASS", "NOTRUN"]
+
+  [Register then getRegistration with a URL having a fragment]
+    expected:
+      if webrender and (os == "linux") and debug: ["PASS", "NOTRUN"]
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/service-workers/service-worker/postmessage-blob-url.https.html.ini
@@ -0,0 +1,7 @@
+[postmessage-blob-url.https.html]
+  expected:
+    if webrender and (os == "linux") and debug: ["OK", "TIMEOUT"]
+  [postMessage Blob URL to a ServiceWorker]
+    expected:
+      if webrender and (os == "linux") and debug: ["PASS", "TIMEOUT"]
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/service-workers/service-worker/update-recovery.https.html.ini
@@ -0,0 +1,7 @@
+[update-recovery.https.html]
+  expected:
+    if webrender and (os == "linux") and debug: ["OK", "TIMEOUT"]
+  [Recover from a bad service worker by updating after a failed navigation.]
+    expected:
+      if webrender and (os == "linux") and debug: ["PASS", "TIMEOUT"]
+
--- 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,6 +1,7 @@
 [waiting.https.html]
   [waiting is set after installation]
     expected:
       if webrender and (os == "linux") and not debug: ["FAIL", "PASS"]
+      if webrender and (os == "linux") and debug: ["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,24 +1,24 @@
 [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"): 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 == "win") and (processor == "aarch64"): ["OK", "CRASH"]
-    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
   [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"): TIMEOUT
       if not debug and (os == "linux") and not webrender and (processor == "x86_64"): ["TIMEOUT", "FAIL"]
+      if not debug and (os == "linux") and webrender: 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
       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,24 +1,24 @@
 [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"): ["TIMEOUT", "OK"]
-    if not debug and (os == "linux") and webrender: TIMEOUT
+    if not debug and (os == "win") and (processor == "x86"): TIMEOUT
+    if not debug and (os == "win") and (processor == "aarch64"): ["OK", "CRASH"]
     if not debug and (os == "win") and (processor == "x86_64"): TIMEOUT
-    if not debug and (os == "win") and (processor == "aarch64"): ["OK", "CRASH"]
-    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
   [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"): 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 webrender: 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
 
--- 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,7 +1,8 @@
 [correct-events-for-short-animations-with-syncbases.html]
   [Correct events for short animations with syncbases]
     expected:
-      if (os == "linux") and (processor == "x86_64") and webrender and debug: ["FAIL", "PASS"]
       if (os == "linux") and (processor == "x86"): PASS
+      if (os == "android") and not debug: ["FAIL", "PASS"]
+      if (os == "win") and (processor == "aarch64"): ["FAIL", "PASS"]
       [PASS, FAIL]
 
--- a/testing/web-platform/meta/svg/animations/scripted/onhover-syncbases.html.ini
+++ b/testing/web-platform/meta/svg/animations/scripted/onhover-syncbases.html.ini
@@ -1,13 +1,18 @@
 [onhover-syncbases.html]
   expected:
     if webrender and debug and (os == "linux"): ["OK", "ERROR"]
-    if webrender and not debug and (os == "linux"): ["OK", "ERROR"]
-    if webrender and not debug and (os == "win"): ["OK", "ERROR"]
+    if webrender and not debug: ["OK", "ERROR"]
   [Check if onhover events reset correctly when triggred multiple times]
     disabled: true
     expected:
       if webrender and (os == "linux") and not debug: [FAIL, TIMEOUT]
       if webrender and (os == "linux") and debug: [FAIL, PASS, TIMEOUT]
       if webrender and (os == "win") and debug: [PASS, TIMEOUT]
       if webrender and (os == "win") and not debug: [PASS, FAIL, TIMEOUT]
 
+  [Check if onhover events reset correctly when triggered multiple times]
+    expected:
+      if webrender and (os == "linux") and debug: ["FAIL", "PASS"]
+      if webrender and (os == "linux") and not debug: FAIL
+      if webrender and (os == "win") and not debug: ["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,8 @@
 [slider-switch.html]
   [Check correct event bases for onclick]
     expected:
       if (os == "android") and not debug: ["FAIL", "PASS"]
+      if (os == "mac") and debug: ["FAIL", "PASS"]
       if (os == "win") and (processor == "aarch64"): ["FAIL", "PASS"]
       [PASS, FAIL]
 
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/svg/geometry/reftests/circle-002.svg.ini
@@ -0,0 +1,3 @@
+[circle-002.svg]
+  expected:
+    if webrender: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/svg/geometry/reftests/ellipse-002.svg.ini
@@ -0,0 +1,3 @@
+[ellipse-002.svg]
+  expected:
+    if webrender: 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,12 +10,13 @@
 
 [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: ["OK", "TIMEOUT"]
+    if (os == "linux") and debug and webrender: ["OK", "TIMEOUT"]
+    if (os == "linux") and debug and not webrender: ["OK", "TIMEOUT"]
   [query() returns dictionary with empty arrays when no locks are held]
     expected: FAIL
 
--- a/testing/web-platform/meta/web-locks/resource-names.tentative.https.any.js.ini
+++ b/testing/web-platform/meta/web-locks/resource-names.tentative.https.any.js.ini
@@ -46,16 +46,18 @@
   [DOMString: 0x61 0x62 0x63 0x0 0x64 0x65 0x66]
     expected: FAIL
 
   [DOMString: 0xDC00 0xD800]
     expected: FAIL
 
 
 [resource-names.tentative.https.any.serviceworker.html]
+  expected:
+    if webrender and (os == "linux") and debug: ["OK", "TIMEOUT"]
   [Resource names that are not valid UTF-16 are not mangled]
     expected: FAIL
 
   [DOMString: 0xDC00]
     expected: FAIL
 
   [DOMString: 0xFFFF]
     expected: FAIL
deleted file mode 100644
--- a/testing/web-platform/meta/web-nfc/NFCReader.https.html.ini
+++ /dev/null
@@ -1,58 +0,0 @@
-[NFCReader.https.html]
-  [Test that NFCReader.start fails if NFCReaderOptions.url has wrong protocol.]
-    expected: FAIL
-
-  [Test that NFCReader.start fails if NFCReaderOptions.url is invalid.]
-    expected: FAIL
-
-  [Test that NFCReader.start fails if NFCReaderOptions.url is missing components.]
-    expected: FAIL
-
-  [Test that NFCReader.start succeeds if NFCReaderOptions.url is valid URL with '*' wildcard character in the beginning of path component followed by subpath.]
-    expected: FAIL
-
-  [Test that nfc watch success if NFC HW is enabled.]
-    expected: FAIL
-
-  [Test that NFCReader.start succeeds if NFCReaderOptions.url is empty.]
-    expected: FAIL
-
-  [Test that NFCReader.start succeeds if NFCReaderOptions.url is valid URL with '*' wildcard character in path.]
-    expected: FAIL
-
-  [NFCReader.start should fail if NFC HW is not supported.]
-    expected: FAIL
-
-  [Test that NFCReader.start succeeds if NFCReaderOptions.url is valid URL.]
-    expected: FAIL
-
-  [NFCReader.start should fail if NFC HW is disabled.]
-    expected: FAIL
-
-  [Test that NFCReader.scan fails if NFCScanOptions.url is invalid.]
-    expected: FAIL
-
-  [Test that NFCReader.scan succeeds if NFCScanOptions.url is valid URL with '*' wildcard character in the beginning of path component followed by subpath.]
-    expected: FAIL
-
-  [NFCReader.scan should fail if NFC HW is disabled.]
-    expected: FAIL
-
-  [NFCReader.scan should fail if NFC HW is not supported.]
-    expected: FAIL
-
-  [Test that NFCReader.scan fails if NFCScanOptions.url has wrong protocol.]
-    expected: FAIL
-
-  [Test that NFCReader.scan succeeds if NFCScanOptions.url is empty.]
-    expected: FAIL
-
-  [Test that NFCReader.scan succeeds if NFCScanOptions.url is valid URL.]
-    expected: FAIL
-
-  [Test that NFCReader.scan fails if NFCScanOptions.url is missing components.]
-    expected: FAIL
-
-  [Test that NFCReader.scan succeeds if NFCScanOptions.url is valid URL with '*' wildcard character in path.]
-    expected: FAIL
-
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/web-nfc/NFCReader_scan.https.html.ini
@@ -0,0 +1,40 @@
+[NFCReader_scan.https.html]
+  [Test that nfc watch success if NFC HW is enabled.]
+    expected: FAIL
+
+  [Test that NFCReader.scan fails if NFCScanOptions.url is invalid.]
+    expected: FAIL
+
+  [Test that NFCReader.scan succeeds if NFCScanOptions.url is valid URL with '*' wildcard character in the beginning of path component followed by subpath.]
+    expected: FAIL
+
+  [NFCReader.scan should fail if signal is not an AbortSignal.]
+    expected: FAIL
+
+  [NFCReader.scan should fail if NFC HW is disabled.]
+    expected: FAIL
+
+  [NFCReader.scan should fail if NFC HW is not supported.]
+    expected: FAIL
+
+  [Test that NFCReader.scan fails if NFCScanOptions.url has wrong protocol.]
+    expected: FAIL
+
+  [Test that NFCReader.scan succeeds if NFCScanOptions.url is empty.]
+    expected: FAIL
+
+  [Synchronously signaled abort.]
+    expected: FAIL
+
+  [Test that NFCReader.scan succeeds if NFCScanOptions.url is valid URL.]
+    expected: FAIL
+
+  [Test that NFCReader.scan fails if NFCScanOptions.url is missing components.]
+    expected: FAIL
+
+  [Test that NFCReader.scan succeeds if NFCScanOptions.url is valid URL with '*' wildcard character in path.]
+    expected: FAIL
+
+  [Test that NFCReader.onreading should not be fired if NFCScanOptions.signal is aborted.]
+    expected: FAIL
+
--- a/testing/web-platform/meta/webaudio/the-audio-api/the-audioworklet-interface/audioworklet-postmessage-sharedarraybuffer.https.html.ini
+++ b/testing/web-platform/meta/webaudio/the-audio-api/the-audioworklet-interface/audioworklet-postmessage-sharedarraybuffer.https.html.ini
@@ -1,6 +1,8 @@
 [audioworklet-postmessage-sharedarraybuffer.https.html]
   [\n      Test passing SharedArrayBuffer to an AudioWorklet\n    ]
     expected:
       if release_or_beta: FAIL
+
   [Executing "Test postMessage from AudioWorkletProcessor to AudioWorkletNode"]
     expected: FAIL
+
--- a/testing/web-platform/meta/webaudio/the-audio-api/the-audioworklet-interface/audioworkletglobalscope-sample-rate.https.html.ini
+++ b/testing/web-platform/meta/webaudio/the-audio-api/the-audioworklet-interface/audioworkletglobalscope-sample-rate.https.html.ini
@@ -1,8 +1,9 @@
 [audioworkletglobalscope-sample-rate.https.html]
   [\n      Test sampleRate in AudioWorkletGlobalScope\n    ]
     expected:
       if release_or_beta: FAIL
 
   [Executing "Query |sampleRate| upon AudioWorkletGlobalScope construction"]
+    bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1572627
     expected: FAIL
-    bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1572627
+
--- a/testing/web-platform/meta/webaudio/the-audio-api/the-audioworklet-interface/audioworkletglobalscope-timing-info.https.html.ini
+++ b/testing/web-platform/meta/webaudio/the-audio-api/the-audioworklet-interface/audioworkletglobalscope-timing-info.https.html.ini
@@ -1,7 +1,8 @@
 [audioworkletglobalscope-timing-info.https.html]
   [\n      Test currentTime and currentFrame in AudioWorkletGlobalScope\n    ]
     expected: FAIL
 
   [Executing "Check the timing information from AudioWorkletProcessor"]
+    bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1265406
     expected: FAIL
-    bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1265406
+
--- a/testing/web-platform/meta/webaudio/the-audio-api/the-audioworklet-interface/audioworkletnode-output-channel-count.https.html.ini
+++ b/testing/web-platform/meta/webaudio/the-audio-api/the-audioworklet-interface/audioworkletnode-output-channel-count.https.html.ini
@@ -3,8 +3,9 @@
     expected:
       if release_or_beta: FAIL
 
   [Executing "Dynamically change the channel count to if unspecified."]
     expected: FAIL
 
   [Executing "Givien outputChannelCount must be honored."]
     expected: FAIL
+
--- a/testing/web-platform/meta/webaudio/the-audio-api/the-convolvernode-interface/active-processing.https.html.ini
+++ b/testing/web-platform/meta/webaudio/the-audio-api/the-convolvernode-interface/active-processing.https.html.ini
@@ -1,9 +1,10 @@
 [active-processing.https.html]
   [X AudioWorklet module loading rejected incorrectly with NetworkError: A network error occurred.. Got Promise.]
     expected: FAIL
 
   [< [initialize\] 1 out of 1 assertions were failed.]
     expected: FAIL
 
   [Executing "test"]
-    expected: FAIL     
+    expected: FAIL
+
--- a/testing/web-platform/meta/webaudio/the-audio-api/the-mediaelementaudiosourcenode-interface/cors-check.https.html.ini
+++ b/testing/web-platform/meta/webaudio/the-audio-api/the-mediaelementaudiosourcenode-interface/cors-check.https.html.ini
@@ -1,6 +1,7 @@
 [cors-check.https.html]
   [\n      Test if MediaElementAudioSourceNode works for cross-origin redirects with\n      "cors" request mode.\n    ]
     expected: FAIL
 
   [Executing "start-playback-and-capture"]
     expected: FAIL
+
--- a/testing/web-platform/meta/webaudio/the-audio-api/the-mediaelementaudiosourcenode-interface/no-cors.https.html.ini
+++ b/testing/web-platform/meta/webaudio/the-audio-api/the-mediaelementaudiosourcenode-interface/no-cors.https.html.ini
@@ -1,11 +1,13 @@
 [no-cors.https.html]
   disabled:
     if (os == "android") and e10s: bug 1550895 (frequently fails on geckoview)
   bug: AudioWorkletNode::GetPort is not implemented
   [\n      Test if MediaElementAudioSourceNode works for cross-origin redirects with\n      "no-cors" request mode.\n    ]
     expected:
       if release_or_beta: FAIL
+
   [Executing "start-playback-and-capture"]
     expected:
       if release_or_beta: OK
       FAIL
+
--- a/testing/web-platform/meta/webdriver/tests/new_session/timeouts.py.ini
+++ b/testing/web-platform/meta/webdriver/tests/new_session/timeouts.py.ini
@@ -1,6 +1,6 @@
 [timeouts.py]
   disabled:
     if ccov and (os == "win") and (bits == 64) and (version == "10.0.17134"): https://bugzilla.mozilla.org/show_bug.cgi?id=1495002
   expected:
+    if (os == "linux") and not debug and webrender: ["OK", "TIMEOUT"]
     if (os == "linux") and not debug and not webrender: ["OK", "TIMEOUT"]
-    if (os == "linux") and not debug and webrender: ["OK", "TIMEOUT"]
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/webxr/ar-module/idlharness.https.window.js.ini
@@ -0,0 +1,4 @@
+[idlharness.https.window.html]
+  [XRSession interface: attribute environmentBlendMode]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/webxr/gamepads-module/idlharness.https.window.js.ini
@@ -0,0 +1,4 @@
+[idlharness.https.window.html]
+  [XRInputSource interface: attribute gamepad]
+    expected: FAIL
+
--- a/testing/web-platform/tests/.taskcluster.yml
+++ b/testing/web-platform/tests/.taskcluster.yml
@@ -81,16 +81,19 @@ tasks:
                   - --login
                   - -c
                   - set -ex;
                     echo "wpt-${browser.name}-${browser.channel}-${chunk[0]}-${chunk[1]}";
                     ~/start.sh
                       ${event.repository.url}
                       ${event.ref};
                     cd ~/web-platform-tests;
+                    sudo cp tools/certs/cacert.pem
+                        /usr/local/share/ca-certificates/cacert.crt;
+                    sudo update-ca-certificates;
                     ./tools/ci/run_tc.py
                       --checkout=${event.after}
                       --oom-killer
                       --hosts
                       --browser=${browser.name}
                       --channel=${browser.channel}
                       --xvfb
                       run-all
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-align/parsing/gap-shorthand.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Box Alignment Level 3: gap sets longhands</title>
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-gap">
+<meta name="assert" content="row-gap supports the full grammar '<row-gap> <column-gap>?'.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/shorthand-testcommon.js"></script>
+</head>
+<body>
+<script>
+test_shorthand_value('gap', 'normal', {
+  'row-gap': 'normal',
+  'column-gap': 'normal'
+});
+
+test_shorthand_value('gap', '10px 20%', {
+  'row-gap': '10px',
+  'column-gap': '20%'
+});
+
+test_shorthand_value('gap', '10px normal', {
+  'row-gap': '10px',
+  'column-gap': 'normal'
+});
+
+test_shorthand_value('gap', 'normal calc(20% + 10px)', {
+  'row-gap': 'normal',
+  'column-gap': 'calc(20% + 10px)'
+});
+</script>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-align/parsing/place-content-shorthand.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Box Alignment Level 3: place-content sets longhands</title>
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-place-content">
+<meta name="assert" content="place-content supports the full grammar '<align-content> <justify-content>?'.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/shorthand-testcommon.js"></script>
+</head>
+<body>
+<script>
+test_shorthand_value('place-content', 'normal', {
+  'align-content': 'normal',
+  'justify-content': 'normal'
+});
+
+test_shorthand_value('place-content', 'first baseline', {
+  'align-content': 'baseline',
+  'justify-content': 'start'
+});
+
+test_shorthand_value('place-content', 'last baseline flex-start', {
+  'align-content': 'last baseline',
+  'justify-content': 'flex-start'
+});
+
+test_shorthand_value('place-content', 'space-around', {
+  'align-content': 'space-around',
+  'justify-content': 'space-around'
+});
+
+test_shorthand_value('place-content', 'space-evenly unsafe end', {
+  'align-content': 'space-evenly',
+  'justify-content': 'unsafe end'
+});
+</script>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-align/parsing/place-items-shorthand.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Box Alignment Level 3: place-items sets longhands</title>
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-place-items">
+<meta name="assert" content="place-items supports the full grammar '<align-items> <justify-items>?'.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/shorthand-testcommon.js"></script>
+</head>
+<body>
+<script>
+test_shorthand_value('place-items', 'normal', {
+  'align-items': 'normal',
+  'justify-items': 'normal'
+});
+
+test_shorthand_value('place-items', 'first baseline', {
+  'align-items': 'baseline',
+  'justify-items': 'baseline'
+});
+
+test_shorthand_value('place-items', 'last baseline flex-start', {
+  'align-items': 'last baseline',
+  'justify-items': 'flex-start'
+});
+
+test_shorthand_value('place-items', 'stretch right legacy', {
+  'align-items': 'stretch',
+  'justify-items': 'legacy right'
+});
+</script>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-align/parsing/place-self-shorthand.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Box Alignment Level 3: place-self sets longhands</title>
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-place-self">
+<meta name="assert" content="place-self supports the full grammar '<align-self> <justify-self>?'.">
+<meta name="assert" content="<baseline-position> and <baseline-position> start are equivalent.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/shorthand-testcommon.js"></script>
+</head>
+<body>
+<script>
+test_shorthand_value('place-self', 'normal', {
+  'align-self': 'normal',
+  'justify-self': 'normal'
+});
+
+test_shorthand_value('place-self', 'first baseline', {
+  'align-self': 'baseline',
+  'justify-self': 'baseline'
+});
+
+test_shorthand_value('place-self', 'last baseline flex-start', {
+  'align-self': 'last baseline',
+  'justify-self': 'flex-start'
+});
+
+test_shorthand_value('place-self', 'unsafe self-start stretch', {
+  'align-self': 'unsafe self-start',
+  'justify-self': 'stretch'
+});
+</script>
+</body>
+</html>
--- a/testing/web-platform/tests/css/css-animations/parsing/animation-delay-invalid.html
+++ b/testing/web-platform/tests/css/css-animations/parsing/animation-delay-invalid.html
@@ -9,11 +9,14 @@
 <script src="/resources/testharnessreport.js"></script>
 <script src="/css/support/parsing-testcommon.js"></script>
 </head>
 <body>
 <script>
 test_invalid_value("animation-delay", "infinite");
 test_invalid_value("animation-delay", "0");
 test_invalid_value("animation-delay", "1s 2s");
+
+test_invalid_value("animation-delay", "initial, -3s");
+test_invalid_value("animation-delay", "-3s, initial");
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-animations/parsing/animation-direction-invalid.html
+++ b/testing/web-platform/tests/css/css-animations/parsing/animation-direction-invalid.html
@@ -8,11 +8,14 @@
 <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("animation-direction", "auto");
 test_invalid_value("animation-direction", "normal reverse");
+
+test_invalid_value("animation-direction", "reverse, initial");
+test_invalid_value("animation-direction", "initial, reverse");
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-animations/parsing/animation-duration-invalid.html
+++ b/testing/web-platform/tests/css/css-animations/parsing/animation-duration-invalid.html
@@ -10,11 +10,14 @@
 <script src="/css/support/parsing-testcommon.js"></script>
 </head>
 <body>
 <script>
 test_invalid_value("animation-duration", '-3s');
 test_invalid_value("animation-duration", '0');
 test_invalid_value("animation-duration", 'infinite');
 test_invalid_value("animation-duration", '1s 2s');
+
+test_invalid_value("animation-duration", 'initial, 1s');
+test_invalid_value("animation-duration", '1s, initial');
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-animations/parsing/animation-fill-mode-invalid.html
+++ b/testing/web-platform/tests/css/css-animations/parsing/animation-fill-mode-invalid.html
@@ -8,11 +8,14 @@
 <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("animation-fill-mode", "auto");
 test_invalid_value("animation-fill-mode", "forwards backwards");
+
+test_invalid_value("animation-fill-mode", "both, initial");
+test_invalid_value("animation-fill-mode", "initial, both");
 </script>
 </body>
 </html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-animations/parsing/animation-invalid.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Animations: parsing animation with invalid values</title>
+<link rel="help" href="https://drafts.csswg.org/css-animations/#propdef-animation">
+<meta name="assert" content="animation supports only the grammar '<single-animation> #'.">
+<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("animation", "1s 2s 3s");
+test_invalid_value("animation", "-1s -2s");
+
+test_invalid_value("animation", "steps(1) steps(2)");
+
+test_invalid_value("animation", "1 2");
+
+test_invalid_value("animation", "reverse alternate anim");
+
+test_invalid_value("animation", "both backwards anim");
+
+test_invalid_value("animation", "paused running anim");
+
+test_invalid_value("animation", "anim1 anim2");
+</script>
+</body>
+</html>
--- a/testing/web-platform/tests/css/css-animations/parsing/animation-iteration-count-invalid.html
+++ b/testing/web-platform/tests/css/css-animations/parsing/animation-iteration-count-invalid.html
@@ -9,11 +9,14 @@
 <script src="/resources/testharnessreport.js"></script>
 <script src="/css/support/parsing-testcommon.js"></script>
 </head>
 <body>
 <script>
 test_invalid_value("animation-iteration-count", "auto");
 test_invalid_value("animation-iteration-count", "-2");
 test_invalid_value("animation-iteration-count", "3 4");
+
+test_invalid_value("animation-iteration-count", "initial, 4");
+test_invalid_value("animation-iteration-count", "4, initial");
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-animations/parsing/animation-play-state-invalid.html
+++ b/testing/web-platform/tests/css/css-animations/parsing/animation-play-state-invalid.html
@@ -8,11 +8,14 @@
 <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("animation-play-state", "auto");
 test_invalid_value("animation-play-state", "paused running");
+
+test_invalid_value("animation-play-state", "paused, initial");
+test_invalid_value("animation-play-state", "initial, paused");
 </script>
 </body>
 </html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-animations/parsing/animation-shorthand.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Animations: animation sets longhands</title>
+<link rel="help" href="https://drafts.csswg.org/css-animations/#propdef-animation">
+<meta name="assert" content="animation supports the full grammar '<single-animation> #'.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/shorthand-testcommon.js"></script>
+</head>
+<body>
+<script>
+test_shorthand_value('animation', 'anim paused both reverse 4 1s -3s cubic-bezier(0, -2, 1, 3)', {
+  'animation-duration': '1s',
+  'animation-timing-function': 'cubic-bezier(0, -2, 1, 3)',
+  'animation-delay': '-3s',
+  'animation-iteration-count': '4',
+  'animation-direction': 'reverse',
+  'animation-fill-mode': 'both',
+  'animation-play-state': 'paused',
+  'animation-name': 'anim'
+});
+
+test_shorthand_value('animation', 'anim paused both reverse, 4 1s -3s cubic-bezier(0, -2, 1, 3)', {
+  'animation-duration': '0s, 1s',
+  'animation-timing-function': 'ease, cubic-bezier(0, -2, 1, 3)',
+  'animation-delay': '0s, -3s',
+  'animation-iteration-count': '1, 4',
+  'animation-direction': 'reverse, normal',
+  'animation-fill-mode': 'both, none',
+  'animation-play-state': 'paused, running',
+  'animation-name': 'anim, none'
+});
+
+test_shorthand_value('animation', '4 1s -3s cubic-bezier(0, -2, 1, 3), anim paused both reverse', {
+  'animation-duration': '1s, 0s',
+  'animation-timing-function': 'cubic-bezier(0, -2, 1, 3), ease',
+  'animation-delay': '-3s, 0s',
+  'animation-iteration-count': '4, 1',
+  'animation-direction': 'normal, reverse',
+  'animation-fill-mode': 'none, both',
+  'animation-play-state': 'running, paused',
+  'animation-name': 'none, anim'
+});
+</script>
+</body>
+</html>
--- a/testing/web-platform/tests/css/css-animations/parsing/animation-timing-function-invalid.html
+++ b/testing/web-platform/tests/css/css-animations/parsing/animation-timing-function-invalid.html
@@ -13,11 +13,14 @@
 <script>
 test_invalid_value("animation-timing-function", "auto");
 test_invalid_value("animation-timing-function", "ease-in ease-out");
 test_invalid_value("animation-timing-function", "cubic-bezier(1, 2, 3)");
 test_invalid_value("animation-timing-function", "cubic-bezier(1, 2, 3, infinite)");
 test_invalid_value("animation-timing-function", "cubic-bezier(1, 2, 3, 4, 5)");
 test_invalid_value("animation-timing-function", "cubic-bezier(-0.1, 0.1, 0.5, 0.9)");
 test_invalid_value("animation-timing-function", "cubic-bezier(0.5, 0.1, 1.1, 0.9)");
+
+test_invalid_value("animation-timing-function", "initial, cubic-bezier(0, -2, 1, 3)");
+test_invalid_value("animation-timing-function", "cubic-bezier(0, -2, 1, 3), initial");
 </script>
 </body>
 </html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-animations/parsing/animation-valid.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Animations: parsing animation with valid values</title>
+<link rel="help" href="https://drafts.csswg.org/css-animations/#propdef-animation">
+<meta name="assert" content="animation supports the full grammar '<single-animation> #'.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/parsing-testcommon.js"></script>
+</head>
+<body>
+<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_valid_value("animation", "1s", ["1s", "1s ease 0s 1 normal none running none"]);
+test_valid_value("animation", "cubic-bezier(0, -2, 1, 3)", ["cubic-bezier(0, -2, 1, 3)", "0s cubic-bezier(0, -2, 1, 3) 0s 1 normal none running none"]);
+test_valid_value("animation", "1s -3s", ["1s -3s", "1s ease -3s 1 normal none running none"]);
+test_valid_value("animation", "4", ["4", "0s ease 0s 4 normal none running none"]);
+test_valid_value("animation", "reverse", ["reverse", "0s ease 0s 1 reverse none running none"]);
+test_valid_value("animation", "both", ["both", "0s ease 0s 1 normal both running none"]);
+test_valid_value("animation", "paused", ["paused", "0s ease 0s 1 normal none paused none"]);
+test_valid_value("animation", "none", ["none", "0s ease 0s 1 normal none running none"]);
+test_valid_value("animation", "anim", ["anim", "0s ease 0s 1 normal none running anim"]);
+
+test_valid_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_valid_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 negative time.
+// 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/parsing/margin-shorthand.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS basic box model: margin sets longhands</title>
+<link rel="help" href="https://drafts.csswg.org/css-box-3/#propdef-margin">
+<meta name="assert" content="margin supports the full grammar '<length-percentage>{1,4}'.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/shorthand-testcommon.js"></script>
+</head>
+<body>
+<script>
+test_shorthand_value('margin', '1px 2px 3px 4px', {
+  'margin-top': '1px',
+  'margin-right': '2px',
+  'margin-bottom': '3px',
+  'margin-left': '4px'
+});
+
+test_shorthand_value('margin', '1px 2px 3px', {
+  'margin-top': '1px',
+  'margin-right': '2px',
+  'margin-bottom': '3px',
+  'margin-left': '2px'
+});
+
+test_shorthand_value('margin', '1px 2px', {
+  'margin-top': '1px',
+  'margin-right': '2px',
+  'margin-bottom': '1px',
+  'margin-left': '2px'
+});
+
+test_shorthand_value('margin', '1px', {
+  'margin-top': '1px',
+  'margin-right': '1px',
+  'margin-bottom': '1px',
+  'margin-left': '1px'
+});
+</script>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-box/parsing/padding-shorthand.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS basic box model: padding sets longhands</title>
+<link rel="help" href="https://drafts.csswg.org/css-box-3/#propdef-padding">
+<meta name="assert" content="padding supports the full grammar '<length-percentage>{1,4}'.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/shorthand-testcommon.js"></script>
+</head>
+<body>
+<script>
+test_shorthand_value('padding', '1px 2px 3px 4px', {
+  'padding-top': '1px',
+  'padding-right': '2px',
+  'padding-bottom': '3px',
+  'padding-left': '4px'
+});
+
+test_shorthand_value('padding', '1px 2px 3px', {
+  'padding-top': '1px',
+  'padding-right': '2px',
+  'padding-bottom': '3px',
+  'padding-left': '2px'
+});
+
+test_shorthand_value('padding', '1px 2px', {
+  'padding-top': '1px',
+  'padding-right': '2px',
+  'padding-bottom': '1px',
+  'padding-left': '2px'
+});
+
+test_shorthand_value('padding', '1px', {
+  'padding-top': '1px',
+  'padding-right': '1px',
+  'padding-bottom': '1px',
+  'padding-left': '1px'
+});
+</script>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-cascade/all-prop-initial-visited-ref.html
@@ -0,0 +1,3 @@
+<!doctype html>
+<title>CSS Test: Reference</title>
+<span style="color:green">This text must be green.</a>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-cascade/all-prop-initial-visited.html
@@ -0,0 +1,9 @@
+<!doctype html>
+<title>CSS Cascade: Apply all:initial to a visited link overriding with a color</title>
+<link rel="help" href="https://drafts.csswg.org/css-cascade/#initial">
+<link rel="match" href="all-prop-initial-visited-ref.html">
+<style>
+  a { all: initial }
+  a:visited { color: green }
+</style>
+<a href="">This text must be green.</a>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-flexbox/parsing/flex-flow-shorthand.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Flexible Box Layout Module Level 1: flex-flow sets longhands</title>
+<link rel="help" href="https://drafts.csswg.org/css-flexbox/#propdef-flex-flow">
+<meta name="assert" content="flex-flow supports the full grammar '<flex-direction> || <flex-wrap>'.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/shorthand-testcommon.js"></script>
+</head>
+<body>
+<script>
+test_shorthand_value('flex-flow', 'nowrap column', {
+  'flex-direction': 'column',
+  'flex-wrap': 'nowrap'
+});
+
+test_shorthand_value('flex-flow', 'wrap row-reverse', {
+  'flex-direction': 'row-reverse',
+  'flex-wrap': 'wrap'
+});
+</script>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-flexbox/parsing/flex-shorthand.html
@@ -0,0 +1,51 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Flexible Box Layout Module Level 1: flex sets longhands</title>
+<link rel="help" href="https://drafts.csswg.org/css-flexbox/#propdef-flex">
+<meta name="assert" content="flex supports the full grammar 'none | [ <‘flex-grow’> <‘flex-shrink’>? || <‘flex-basis’> ]'.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/shorthand-testcommon.js"></script>
+</head>
+<body>
+<script>
+test_shorthand_value('flex', 'none', {
+  'flex-grow': '0',
+  'flex-shrink': '0',
+  'flex-basis': 'auto'
+});
+
+test_shorthand_value('flex', '1', {
+  'flex-grow': '1',
+  'flex-shrink': '1',
+  'flex-basis': '0%'
+});
+
+test_shorthand_value('flex', '2 3', {
+  'flex-grow': '2',
+  'flex-shrink': '3',
+  'flex-basis': '0%'
+});
+
+test_shorthand_value('flex', '4 5 6px', {
+  'flex-grow': '4',
+  'flex-shrink': '5',
+  'flex-basis': '6px'
+});
+
+test_shorthand_value('flex', '7% 8', {
+  'flex-grow': '8',
+  'flex-shrink': '1',
+  'flex-basis': '7%'
+});
+
+test_shorthand_value('flex', '8 auto', {
+  'flex-grow': '8',
+  'flex-shrink': '1',
+  'flex-basis': 'auto'
+});
+</script>
+</body>
+</html>
--- a/testing/web-platform/tests/css/css-flexbox/percentage-heights-003.html
+++ b/testing/web-platform/tests/css/css-flexbox/percentage-heights-003.html
@@ -71,16 +71,25 @@
 <div style="height: 100px;">
     <div class="flexbox column">
         <div>
             <span data-expected-height="0"></span>
         </div>
     </div>
 </div>
 
+<!-- indefinite unwrapped column flexbox where item doesn't stretch -->
+<div style="height: 100px;">
+    <div class="flexbox column">
+        <div style="align-self: flex-start">
+            <span data-expected-height="0"></span>
+        </div>
+    </div>
+</div>
+
 <!-- indefinite wrapped column flexbox -->
 <div style="height: 100px;">
     <div class="flexbox column-wrap">
        <div>
             <span data-expected-height="0"></span>
         </div>
         <div>
             <span data-expected-height="0"></span>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-lists/parsing/list-style-shorthand.sub.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Lists: list-style sets longhands</title>
+<link rel="help" href="https://drafts.csswg.org/css-lists-3/#propdef-list-style">
+<meta name="assert" content="list-style supports the full grammar '<'list-style-position'> || <'list-style-image'> || <'list-style-type'>'.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/shorthand-testcommon.js"></script>
+</head>
+<body>
+<script>
+test_shorthand_value('list-style', 'square url("https://{{host}}/") inside', {
+  'list-style-position': 'inside',
+  'list-style-image': 'url("https://{{host}}/")',
+  'list-style-type': 'square'
+});
+</script>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-logical/parsing/inset-shorthand.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Logical Properties and Values: inset sets longhands</title>
+<link rel="help" href="https://drafts.csswg.org/css-logical/#propdef-inset">
+<meta name="assert" content="inset supports the full grammar '<'top'>{1,4}'.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/shorthand-testcommon.js"></script>
+</head>
+<body>
+<script>
+test_shorthand_value('inset', '1px 2px 3px 4px', {
+  'top': '1px',
+  'right': '2px',
+  'bottom': '3px',
+  'left': '4px'
+});
+
+test_shorthand_value('inset', '1px 2px 3px', {
+  'top': '1px',
+  'right': '2px',
+  'bottom': '3px',
+  'left': '2px'
+});
+
+test_shorthand_value('inset', '1px 2px', {
+  'top': '1px',
+  'right': '2px',
+  'bottom': '1px',
+  'left': '2px'
+});
+
+test_shorthand_value('inset', '1px', {
+  'top': '1px',
+  'right': '1px',
+  'bottom': '1px',
+  'left': '1px'
+});
+</script>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-text-decor/parsing/text-decoration-shorthand.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Text Decoration: text-decoration sets longhands</title>
+<link rel="help" href="https://drafts.csswg.org/css-text-decor-3/#propdef-text-decoration">
+<meta name="assert" content="text-decoration supports the full grammar '<‘text-decoration-line’> || <‘text-decoration-style’> || <‘text-decoration-color’>'.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/shorthand-testcommon.js"></script>
+</head>
+<body>
+<script>
+test_shorthand_value('text-decoration', 'overline dotted green', {
+  'text-decoration-line': 'overline',
+  'text-decoration-style': 'dotted',
+  'text-decoration-color': 'green'
+});
+</script>
+</body>
+</html>
--- a/testing/web-platform/tests/css/css-transitions/parsing/transition-delay-invalid.html
+++ b/testing/web-platform/tests/css/css-transitions/parsing/transition-delay-invalid.html
@@ -9,11 +9,14 @@
 <script src="/resources/testharnessreport.js"></script>
 <script src="/css/support/parsing-testcommon.js"></script>
 </head>
 <body>
 <script>
 test_invalid_value("transition-delay", 'infinite');
 test_invalid_value("transition-delay", '0');
 test_invalid_value("transition-delay", '500ms 0.5s');
+
+test_invalid_value("transition-delay", '-3s, initial');
+test_invalid_value("transition-delay", 'initial, -3s');
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/css/css-transitions/parsing/transition-duration-invalid.html
+++ b/testing/web-platform/tests/css/css-transitions/parsing/transition-duration-invalid.html
@@ -9,11 +9,14 @@
 <script src="/resources/testharnessreport.js"></script>
 <script src="/css/support/parsing-testcommon.js"></script>
 </head>
 <body>
 <script>
 test_invalid_value("transition-duration", 'infinite');
 test_invalid_value("transition-duration", '-500ms');
 test_invalid_value("transition-duration", '1s 2s');
+
+test_invalid_value("transition-duration", '1s, initial');
+test_invalid_value("transition-duration", 'initial, 1s');
 </script>
 </body>
 </html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-transitions/parsing/transition-invalid.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Transitions: parsing transition with invalid values</title>
+<link rel="help" href="https://drafts.csswg.org/css-transitions/#transition-shorthand-property">
+<meta name="assert" content="transition supports only the grammar '<single-transition> #'.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/parsing-testcommon.js"></script>
+</head>
+<body>
+<script>
+// <single-transition> = [ none | <single-transition-property> ] ||
+// <time> || <easing-function> || <time>
+test_invalid_value("transition", "1s 2s 3s");
+test_invalid_value("transition", "-1s -2s");
+
+test_invalid_value("transition", "steps(1) steps(2)");
+
+test_invalid_value("transition", "none top");
+</script>
+</body>
+</html>
--- a/testing/web-platform/tests/css/css-transitions/parsing/transition-property-invalid.html
+++ b/testing/web-platform/tests/css/css-transitions/parsing/transition-property-invalid.html
@@ -9,11 +9,14 @@
 <script src="/resources/testharnessreport.js"></script>
 <script src="/css/support/parsing-testcommon.js"></script>
 </head>
 <body>
 <script>
 test_invalid_value("transition-property", 'one two three');
 test_invalid_value("transition-property", '1, 2, 3');
 test_invalid_value("transition-property", 'none, one');
+
+test_invalid_value("transition-property", 'initial, top');
+test_invalid_value("transition-property", 'top, initial');
 </script>
 </body>
 </html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-transitions/parsing/transition-shorthand.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Transitions: transition sets longhands</title>
+<link rel="help" href="https://drafts.csswg.org/css-transitions/#transition-shorthand-property">
+<meta name="assert" content="transition supports the full grammar '<single-transition> #'.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/shorthand-testcommon.js"></script>
+</head>
+<body>
+<script>
+test_shorthand_value('transition', '1s -3s cubic-bezier(0, -2, 1, 3) top', {
+  'transition-property': 'top',
+  'transition-duration': '1s',
+  'transition-timing-function': 'cubic-bezier(0, -2, 1, 3)',
+  'transition-delay': '-3s'
+});
+
+test_shorthand_value('transition', '1s -3s, cubic-bezier(0, -2, 1, 3) top', {
+  'transition-property': 'all, top',
+  'transition-duration': '1s, 0s',
+  'transition-timing-function': 'ease, cubic-bezier(0, -2, 1, 3)',
+  'transition-delay': '-3s, 0s'
+});
+
+test_shorthand_value('transition', 'cubic-bezier(0, -2, 1, 3) top, 1s -3s', {
+  'transition-property': 'top, all',
+  'transition-duration': '0s, 1s',
+  'transition-timing-function': 'cubic-bezier(0, -2, 1, 3), ease',
+  'transition-delay': '0s, -3s'
+});
+</script>
+</body>
+</html>
--- a/testing/web-platform/tests/css/css-transitions/parsing/transition-timing-function-invalid.html
+++ b/testing/web-platform/tests/css/css-transitions/parsing/transition-timing-function-invalid.html
@@ -14,11 +14,14 @@
 <script>
 test_invalid_value("transition-timing-function", "auto");
 test_invalid_value("transition-timing-function", "ease-in ease-out");
 test_invalid_value("transition-timing-function", "cubic-bezier(1, 2, 3)");
 test_invalid_value("transition-timing-function", "cubic-bezier(1, 2, 3, infinite)");
 test_invalid_value("transition-timing-function", "cubic-bezier(1, 2, 3, 4, 5)");
 test_invalid_value("transition-timing-function", "cubic-bezier(-0.1, 0.1, 0.5, 0.9)");
 test_invalid_value("transition-timing-function", "cubic-bezier(0.5, 0.1, 1.1, 0.9)");
+
+test_invalid_value("transition-timing-function", "initial, cubic-bezier(0, -2, 1, 3)");
+test_invalid_value("transition-timing-function", "cubic-bezier(0, -2, 1, 3), initial");
 </script>
 </body>
 </html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-transitions/parsing/transition-valid.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Transitions: parsing transition with valid values</title>
+<link rel="help" href="https://drafts.csswg.org/css-transitions/#transition-shorthand-property">
+<meta name="assert" content="transition supports the full grammar '<single-transition> #'.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/parsing-testcommon.js"></script>
+</head>
+<body>
+<script>
+// <single-transition> = [ none | <single-transition-property> ] ||
+// <time> || <easing-function> || <time>
+test_valid_value("transition", "1s", ["1s", "all 1s ease 0s"]);
+test_valid_value("transition", "cubic-bezier(0, -2, 1, 3)", ["cubic-bezier(0, -2, 1, 3)", "all 0s cubic-bezier(0, -2, 1, 3) 0s"]);
+test_valid_value("transition", "1s -3s", ["1s -3s", "all 1s ease -3s"]);
+test_valid_value("transition", "none", ["none", "none 0s ease 0s"]);
+test_valid_value("transition", "top", ["top", "top 0s ease 0s"]);
+
+test_valid_value("transition", "1s -3s cubic-bezier(0, -2, 1, 3) top", "top 1s cubic-bezier(0, -2, 1, 3) -3s");
+test_valid_value("transition", "1s -3s, cubic-bezier(0, -2, 1, 3) top", ["1s -3s, top cubic-bezier(0, -2, 1, 3)", "all 1s ease -3s, top 0s cubic-bezier(0, -2, 1, 3) 0s"]);
+
+// TODO: Add test with a single negative time.
+// 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-ui/parsing/outline-shorthand.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS UI Level 3: outline sets longhands</title>
+<link rel="help" href="https://drafts.csswg.org/css-ui-3/#outline">
+<link rel="help" href="https://drafts.csswg.org/cssom/#serializing-css-values">
+<meta name="assert" content="outline supports the full grammar '<outline-color> || <outline> || <outline>'.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/shorthand-testcommon.js"></script>
+</head>
+<body>
+<script>
+test_shorthand_value('outline', '3px ridge blue', {
+  'outline-color': 'blue',
+  'outline-style': 'ridge',
+  'outline-width': '3px'
+});
+</script>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/support/shorthand-testcommon.js
@@ -0,0 +1,39 @@
+'use strict';
+
+function test_shorthand_value(property, value, longhands) {
+    const stringifiedValue = JSON.stringify(value);
+
+    for (let longhand of Object.keys(longhands).sort()) {
+        test(function(){
+            var div = document.getElementById('target') || document.createElement('div');
+            div.style[property] = "";
+            try {
+                div.style[property] = value;
+
+                const readValue = div.style[longhand];
+                assert_equals(readValue, longhands[longhand], longhand + " should be canonical");
+
+                div.style[longhand] = "";
+                div.style[longhand] = readValue;
+                assert_equals(div.style[longhand], readValue, "serialization should round-trip");
+            } finally {
+                div.style[property] = "";
+            }
+        }, "e.style['" + property + "'] = " + stringifiedValue + " should set " + longhand);
+    }
+
+    test(function(){
+        var div = document.getElementById('target') || document.createElement('div');
+        div.style[property] = "";
+        try {
+            const expectedLength = div.style.length;
+            div.style[property] = value;
+            for (let longhand of Object.keys(longhands).sort()) {
+                div.style[longhand] = "";
+            }
+            assert_equals(div.style.length, expectedLength);
+        } finally {
+            div.style[property] = "";
+        }
+    }, "e.style['" + property + "'] = " + stringifiedValue + " should not set unrelated longhands");
+}
--- a/testing/web-platform/tests/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-margin-box-border-radius-008-ref.html
+++ b/testing/web-platform/tests/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-margin-box-border-radius-008-ref.html
@@ -35,20 +35,20 @@
 
   .box {
     position: absolute;
     width: 60px;
     background-color: blue;
   }
   </style>
 
-  <body class="bfc">
+  <main class="bfc">
     <span class="container">
       <div class="shape"></div>
     </span>
     <div class="box" style="height: 12px; top: 0px; right: 96px;"></div> <!-- Box at corner -->
     <div class="box" style="height: 12px; top: 12px; right: 108px;"></div> <!-- Box at corner -->
     <div class="box" style="height: 36px; top: 24px; right: 120px;"></div>
     <div class="box" style="height: 36px; top: 60px; right: 120px;"></div>
     <div class="box" style="height: 12px; top: 96px; right: 120px;"></div> <!-- Box at corner -->
     <div class="box" style="height: 12px; top: 108px; right: 120px;"></div> <!-- Box at corner -->
-  </body>
+  </main>
 </html>
--- a/testing/web-platform/tests/html/semantics/embedded-content/media-elements/media_fragment_seek.html
+++ b/testing/web-platform/tests/html/semantics/embedded-content/media-elements/media_fragment_seek.html
@@ -1,10 +1,11 @@
 <!doctype html>
 <meta charset="utf-8">
+<meta name="timeout" content="long">
 <title>Video should seek to time specified in media fragment syntax</title>
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="/common/media.js"></script>
 <div id="log"></div>
 <video id="video"></video>
 <script>
 async_test(function () {
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/infrastructure/expected-fail/unhandled-rejection.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Unhandled rejection</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+Promise.reject(new Error("error outside any setup or test"));
+</script>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/infrastructure/metadata/infrastructure/expected-fail/unhandled-rejection.html.ini
@@ -0,0 +1,4 @@
+[unhandled-rejection.html]
+  [Unhandled rejection]
+    expected: FAIL
+
--- a/testing/web-platform/tests/interfaces/gamepad.idl
+++ b/testing/web-platform/tests/interfaces/gamepad.idl
@@ -26,17 +26,18 @@ enum GamepadMappingType {
   "standard",
 };
 
 [Exposed=Window]
 partial interface Navigator {
   sequence<Gamepad?> getGamepads();
 };
 
-[Constructor(DOMString type, GamepadEventInit eventInitDict), Exposed=Window]
+[Exposed=Window]
 
-interface GamepadEvent : Event {
+interface GamepadEvent: Event {
+  constructor(DOMString type, GamepadEventInit eventInitDict);
   [SameObject] readonly attribute Gamepad gamepad;
 };
 
 dictionary GamepadEventInit : EventInit {
   required Gamepad gamepad;
 };
--- a/testing/web-platform/tests/interfaces/mediasession.idl
+++ b/testing/web-platform/tests/interfaces/mediasession.idl
@@ -34,18 +34,19 @@ interface MediaSession {
 
   attribute MediaSessionPlaybackState playbackState;
 
   void setActionHandler(MediaSessionAction action, MediaSessionActionHandler? handler);
 
   void setPositionState(optional MediaPositionState? state);
 };
 
-[Constructor(optional MediaMetadataInit init), Exposed=Window]
+[Exposed=Window]
 interface MediaMetadata {
+  constructor(optional MediaMetadataInit init = {});
   attribute DOMString title;
   attribute DOMString artist;
   attribute DOMString album;
   attribute FrozenArray<MediaImage> artwork;
 };
 
 dictionary MediaMetadataInit {
   DOMString title = "";
--- a/testing/web-platform/tests/interfaces/webrtc-stats.idl
+++ b/testing/web-platform/tests/interfaces/webrtc-stats.idl
@@ -104,17 +104,20 @@ dictionary RTCInboundRtpStreamStats : RT
  double totalSamplesDuration;
  unsigned long framesReceived;
  DOMString decoderImplementation;
 };
 
 dictionary RTCRemoteInboundRtpStreamStats : RTCReceivedRtpStreamStats {
              DOMString localId;
              double roundTripTime;
+             double totalRoundTripTime;
              double fractionLost;
+             unsigned long long reportsReceived;
+             unsigned long long roundTripTimeMeasurements;
 };
 
 dictionary RTCSentRtpStreamStats : RTCRtpStreamStats {
              unsigned long packetsSent;
              unsigned long long bytesSent;
 };
 
 dictionary RTCOutboundRtpStreamStats : RTCSentRtpStreamStats {
@@ -160,16 +163,17 @@ enum RTCQualityLimitationReason {
   "cpu",
   "bandwidth",
   "other",
 };
 
 dictionary RTCRemoteOutboundRtpStreamStats : RTCSentRtpStreamStats {
              DOMString localId;
              DOMHighResTimeStamp remoteTimestamp;
+             unsigned long long reportsSent;
 };
 
 dictionary RTCMediaSourceStats : RTCStats {
              DOMString trackIdentifier;
              DOMString kind;
 };
 
 dictionary RTCAudioSourceStats : RTCMediaSourceStats {
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/interfaces/webxr-ar-module.idl
@@ -0,0 +1,21 @@
+// GENERATED CONTENT - DO NOT EDIT
+// Content was automatically extracted by Reffy into reffy-reports
+// (https://github.com/tidoust/reffy-reports)
+// Source: WebXR Augmented Reality Module - Level 1 (https://immersive-web.github.io/webxr-ar-module/)
+
+enum XRSessionMode {
+  "inline",
+  "immersive-vr",
+  "immersive-ar"
+};
+
+enum XREnvironmentBlendMode {
+  "opaque",
+  "alpha-blend",
+  "additive"
+};
+
+partial interface XRSession {
+  // Attributes
+  readonly attribute XREnvironmentBlendMode environmentBlendMode;
+};
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/interfaces/webxr-gamepads-module.idl
@@ -0,0 +1,14 @@
+// GENERATED CONTENT - DO NOT EDIT
+// Content was automatically extracted by Reffy into reffy-reports
+// (https://github.com/tidoust/reffy-reports)
+// Source: WebXR Gamepads Module - Level 1 (https://immersive-web.github.io/webxr-gamepads-module/)
+
+partial interface XRInputSource {
+  [SameObject] readonly attribute Gamepad? gamepad;
+};
+
+enum GamepadMappingType {
+  "",            // Defined in the Gamepad API
+  "standard",    // Defined in the Gamepad API
+  "xr-standard",
+};
--- a/testing/web-platform/tests/mathml/relations/html5-tree/clipboard-event-handlers.tentative.html
+++ b/testing/web-platform/tests/mathml/relations/html5-tree/clipboard-event-handlers.tentative.html
@@ -25,16 +25,19 @@
   const el = document.querySelector("math");
 
   function dispatchEventTest(name) {
     const mathEl = document.createElementNS(
         "http://www.w3.org/1998/Math/MathML",
         "math"
     );
     async_test(test => {
+      test.step(function() {
+        assert_true(MathMLElement.prototype.hasOwnProperty(`on${name}`));
+      });
       mathEl[`on${name}`] = test.step_func_done(e => {
         assert_equals(e.currentTarget, mathEl,
                       "The event must be fired at the <math> element");
       });
       const event = new ClipboardEvent(name, {
         bubbles: true,
         cancellable: true
       });
--- a/testing/web-platform/tests/mathml/relations/html5-tree/math-global-event-handlers.tentative.html
+++ b/testing/web-platform/tests/mathml/relations/html5-tree/math-global-event-handlers.tentative.html
@@ -120,16 +120,19 @@
             "Calling the handler must run the code (modify attribute)"
           );
 
           el.removeAttribute(name);
           assert_equals(el[name], null, `The ${name} property must be null (remove attribute)`);
         }, `${name}: dynamic changes on the attribute`);
 
         async_test(t => {
+          t.step(function() {
+            assert_true(MathMLElement.prototype.hasOwnProperty(name));
+          });
           const element = document.createElementNS(
             "http://www.w3.org/1998/Math/MathML",
             "math"
           );
           element[name] = t.step_func_done(e => {
             assert_equals(
               e.currentTarget,
               element,
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/portals/portals-repeated-activate.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+  async_test(async t => {
+    let win = window.open("resources/portal-repeated-activate-window.html");
+    win.onload = () => win.activate();
+    window.onmessage = t.step_func_done(() => {});
+  }, "test activation in page that has been reactivated")
+</script>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/portals/resources/portal-repeated-activate-window.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<body>
+  <portal src="simple-portal-adopts-and-activates-predecessor.html">
+  <script>
+    function activate() {
+      var portal = document.querySelector("portal");
+      portal.activate().then(() => document.body.removeChild(portal));
+    }
+
+    var count = 0;
+    window.onportalactivate = e => {
+      ++count;
+      if (count == 1) {
+        e.adoptPredecessor().activate();
+      } else {
+        window.opener.postMessage("done", "*");
+      }
+    };
+  </script>
+</body>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/portals/resources/simple-portal-adopts-and-activates-predecessor.html
@@ -0,0 +1,6 @@
+<!DOCTYPE html>
+<body>
+  <script>
+    window.onportalactivate = e => e.adoptPredecessor().activate();
+  </script>
+</body>
--- a/testing/web-platform/tests/resource-timing/crossorigin-sandwich-TAO.sub.html
+++ b/testing/web-platform/tests/resource-timing/crossorigin-sandwich-TAO.sub.html
@@ -33,14 +33,15 @@
 </head>
 <body>
 <iframe id="frameContext" src="" style="width: 250px; height: 250px;"></iframe>
 <script>
     let destUrl = pageOrigin + '/resource-timing/resources/multi_redirect.py?';
     destUrl += 'page_origin=' + pageOrigin;
     destUrl += '&timing_allow=1';
     destUrl += '&cross_origin=' + crossOrigin;
+    destUrl += '&tao_steps=3';
     const frameContext = document.getElementById('frameContext');
     frameContext.onload = onload_test;
     frameContext.src = destUrl;
 </script>
 </body>
 </html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/resource-timing/crossorigin-sandwich-partial-TAO.sub.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+<meta charset="utf-8" />
+<title>This test validates resource timing information for a same-origin=>cross-origin=>same-origin redirect chain with Timing-Allow-Origin.</title>
+<link rel="help" href="http://www.w3.org/TR/resource-timing/#performanceresourcetiming"/>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="resources/webperftestharness.js"></script>
+<script src="resources/webperftestharnessextension.js"></script>
+
+<script>
+    setup({explicit_done: true});
+    test_namespace('getEntriesByName');
+    const pageOrigin = get_host_info()['ORIGIN'];
+    const crossOrigin = get_host_info()['REMOTE_ORIGIN'];
+
+    function onload_test()
+    {
+        const entries = performance.getEntriesByName(document.getElementById('frameContext').src, 'resource');
+        test_equals(entries.length, 1, 'There should be one entry.');
+        const entry = entries[0];
+
+        test_equals(entry.redirectStart, 0, 'redirectStart == 0 in cross-origin redirect with Timing-Allow-Origin in some of the chain but not all of it.');
+        test_equals(entry.redirectEnd, 0, 'redirectEnd == 0 in cross-origin redirect with Timing-Allow-Origin in some of the chain but not all of it.');
+        test_greater_than(entry.fetchStart, 0, 'fetchStart > 0 in cross-origin redirect.');
+        test_equals(entry.fetchStart, entry.startTime, 'startTime == fetchStart in cross-origin redirect with Timing-Allow-Origin in some of the chain but not all of it.');
+        done();
+    }
+</script>
+
+</head>
+<body>
+<iframe id="frameContext" src="" style="width: 250px; height: 250px;"></iframe>
+<script>
+    let destUrl = pageOrigin + '/resource-timing/resources/multi_redirect.py?';
+    destUrl += 'page_origin=' + pageOrigin;
+    destUrl += '&timing_allow=1';
+    destUrl += '&cross_origin=' + crossOrigin;
+    destUrl += '&tao_steps=2';
+    const frameContext = document.getElementById('frameContext');
+    frameContext.onload = onload_test;
+    frameContext.src = destUrl;
+</script>
+</body>
+</html>
--- a/testing/web-platform/tests/resource-timing/resource_TAO_cross_origin_redirect_chain.html
+++ b/testing/web-platform/tests/resource-timing/resource_TAO_cross_origin_redirect_chain.html
@@ -32,15 +32,16 @@
 
 </head>
 <body>
 <iframe id="frameContext" src="" style="width: 250px; height: 250px;"></iframe>
 <script>
     let destUrl = get_host_info().HTTP_REMOTE_ORIGIN + '/resource-timing/resources/multi_redirect.py?';
     destUrl += 'page_origin=' + 'http://' + document.location.host;
     destUrl += '&cross_origin=' + get_host_info().HTTP_REMOTE_ORIGIN;
+    destUrl += '&tao_steps=3';
     destUrl += '&timing_allow=1';
     const frameContext = document.getElementById('frameContext');
     frameContext.onload = onload_test;
     frameContext.src = destUrl;
 </script>
 </body>
 </html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/resource-timing/resources/blank-with-tao.html
@@ -0,0 +1,10 @@
+<!DOCTYPE HTML>
+<html>
+    <head>
+        <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+        <title>Green Test Page</title>
+    </head>
+    <body style="background-color:#00FF00;">
+        <h1>Placeholder</h1>
+    </body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/resource-timing/resources/blank-with-tao.html.headers
@@ -0,0 +1,1 @@
+Timing-Allow-Origin: *
--- a/testing/web-platform/tests/resource-timing/resources/multi_redirect.py
+++ b/testing/web-platform/tests/resource-timing/resources/multi_redirect.py
@@ -11,34 +11,37 @@ def main(request, response):
         try:
             step = int(request.GET.first("step"))
         except ValueError:
             pass
 
     origin = request.url_parts.scheme + "://" + request.url_parts.hostname + ":" + str(request.url_parts.port)
     page_origin = request.GET.first("page_origin")
     cross_origin = request.GET.first("cross_origin")
+    tao_steps = 0
+    if "tao_steps" in request.GET:
+        tao_steps = int(request.GET.first("tao_steps"))
     timing_allow = "0"
     if "timing_allow" in request.GET:
         timing_allow = request.GET.first("timing_allow")
 
+    next_tao_steps = tao_steps - 1
     redirect_url_path = "/resource-timing/resources/multi_redirect.py?"
     redirect_url_path += "page_origin=" + page_origin
     redirect_url_path += "&cross_origin=" + cross_origin
     redirect_url_path += "&timing_allow=" + timing_allow
+    redirect_url_path += "&tao_steps=" + str(next_tao_steps)
     redirect_url_path += "&step="
+    if timing_allow != "0" and tao_steps > 0:
+        response.headers.set("timing-allow-origin", page_origin)
 
     if step == 1:
         # On the first request, redirect to a cross origin URL
         redirect_url = cross_origin + redirect_url_path + "2"
-        if timing_allow != "0" and origin != page_origin:
-            response.headers.set("timing-allow-origin", page_origin)
     elif step == 2:
         # On the second request, redirect to a same origin URL
         redirect_url = page_origin + redirect_url_path + "3"
-        if timing_allow != "0":
-            response.headers.set("timing-allow-origin", page_origin)
     else:
         # On the third request, redirect to a static response
-        redirect_url = page_origin + "/resource-timing/resources/blank_page_green.htm"
+        redirect_url = page_origin + "/resource-timing/resources/blank-with-tao.html"
 
     response.status = 302
     response.headers.set("Location", redirect_url)
--- a/testing/web-platform/tests/resource-timing/status-codes-create-entry.html
+++ b/testing/web-platform/tests/resource-timing/status-codes-create-entry.html
@@ -9,14 +9,14 @@
 <img src="resources/status-code.py?status=307">
 <img src="resources/status-code.py?status=404">
 <img src="resources/status-code.py?status=502">
 <script>
 async_test(t => {
   window.addEventListener("load", t.step_func(() => {
     const images = document.getElementsByTagName("img");
     for (let img of images) {
-      assert_equals(performance.getEntriesByName(img.src).length, 1, img.src);
+      assert_greater_than(performance.getEntriesByName(img.src).length, 0, img.src);
     }
     t.done();
   }));
 }, "Make sure all status codes are reported");
 </script>
--- a/testing/web-platform/tests/resources/chromium/generic_sensor_mocks.js
+++ b/testing/web-platform/tests/resources/chromium/generic_sensor_mocks.js
@@ -195,17 +195,17 @@ var GenericSensorTest = (() => {
       // services/device/public/cpp/generic_sensor/sensor_traits.h)
       if (type == device.mojom.SensorType.AMBIENT_LIGHT ||
           type == device.mojom.SensorType.MAGNETOMETER) {
         this.maxFrequency_ = Math.min(10, this.maxFrequency_);
       }
 
       const initParams = new device.mojom.SensorInitParams({
         sensor: sensorPtr,
-        clientRequest: mojo.makeRequest(this.activeSensors_.get(type).client_),
+        clientReceiver: mojo.makeRequest(this.activeSensors_.get(type).client_),
         memory: rv.handle,
         bufferOffset: offset,
         mode: reportingMode,
         defaultConfiguration: defaultConfig,
         minimumFrequency: this.minFrequency_,
         maximumFrequency: this.maxFrequency_
       });
 
--- a/testing/web-platform/tests/resources/chromium/sensor_provider.mojom.js
+++ b/testing/web-platform/tests/resources/chromium/sensor_provider.mojom.js
@@ -52,17 +52,17 @@
     this.initDefaults_();
     this.initFields_(values);
   }
 
 
   SensorInitParams.kReadBufferSizeForTests = 48;
   SensorInitParams.prototype.initDefaults_ = function() {
     this.sensor = new sensor$.SensorPtr();
-    this.clientRequest = new bindings.InterfaceRequest();
+    this.clientReceiver = new bindings.InterfaceRequest();
     this.memory = null;
     this.bufferOffset = 0;
     this.mode = 0;
     this.defaultConfiguration = null;
     this.maximumFrequency = 0;
     this.minimumFrequency = 0;
   };
   SensorInitParams.prototype.initFields_ = function(fields) {
@@ -87,17 +87,17 @@
 
 
     // validate SensorInitParams.sensor
     err = messageValidator.validateInterface(offset + codec.kStructHeaderSize + 0, false);
     if (err !== validator.validationError.NONE)
         return err;
 
 
-    // validate SensorInitParams.clientRequest
+    // validate SensorInitParams.clientReceiver
     err = messageValidator.validateInterfaceRequest(offset + codec.kStructHeaderSize + 8, false)
     if (err !== validator.validationError.NONE)
         return err;
 
 
     // validate SensorInitParams.memory
     err = messageValidator.validateHandle(offset + codec.kStructHeaderSize + 12, false)
     if (err !== validator.validationError.NONE)
@@ -124,17 +124,17 @@
   SensorInitParams.encodedSize = codec.kStructHeaderSize + 56;
 
   SensorInitParams.decode = function(decoder) {
     var packed;
     var val = new SensorInitParams();
     var numberOfBytes = decoder.readUint32();
     var version = decoder.readUint32();
     val.sensor = decoder.decodeStruct(new codec.Interface(sensor$.SensorPtr));
-    val.clientRequest = decoder.decodeStruct(codec.InterfaceRequest);
+    val.clientReceiver = decoder.decodeStruct(codec.InterfaceRequest);
     val.memory = decoder.decodeStruct(codec.Handle);
     val.bufferOffset = decoder.decodeStruct(codec.Uint64);
     val.mode = decoder.decodeStruct(codec.Int32);
     decoder.skip(1);
     decoder.skip(1);
     decoder.skip(1);
     decoder.skip(1);
     val.defaultConfiguration = decoder.decodeStructPointer(sensor$.SensorConfiguration);
@@ -143,17 +143,17 @@
     return val;
   };
 
   SensorInitParams.encode = function(encoder, val) {
     var packed;
     encoder.writeUint32(SensorInitParams.encodedSize);
     encoder.writeUint32(0);
     encoder.encodeStruct(new codec.Interface(sensor$.SensorPtr), val.sensor);
-    encoder.encodeStruct(codec.InterfaceRequest, val.clientRequest);
+    encoder.encodeStruct(codec.InterfaceRequest, val.clientReceiver);
     encoder.encodeStruct(codec.Handle, val.memory);
     encoder.encodeStruct(codec.Uint64, val.bufferOffset);
     encoder.encodeStruct(codec.Int32, val.mode);
     encoder.skip(1);
     encoder.skip(1);
     encoder.skip(1);
     encoder.skip(1);
     encoder.encodeStructPointer(sensor$.SensorConfiguration, val.defaultConfiguration);
--- a/testing/web-platform/tests/resources/testharness.js
+++ b/testing/web-platform/tests/resources/testharness.js
@@ -3654,48 +3654,52 @@ policies and contribution forms [3].
 
     /**
      * Setup globals
      */
 
     var tests = new Tests();
 
     if (global_scope.addEventListener) {
-        var error_handler = function(e) {
+        var error_handler = function(message, stack) {
             if (tests.tests.length === 0 && !tests.allow_uncaught_exception) {
                 tests.set_file_is_test();
             }
 
-            var stack;
-            if (e.error && e.error.stack) {
-                stack = e.error.stack;
-            } else {
-                stack = e.filename + ":" + e.lineno + ":" + e.colno;
-            }
-
             if (tests.file_is_test) {
                 var test = tests.tests[0];
                 if (test.phase >= test.phases.HAS_RESULT) {
                     return;
                 }
-                test.set_status(test.FAIL, e.message, stack);
+                test.set_status(test.FAIL, message, stack);
                 test.phase = test.phases.HAS_RESULT;
-                // The following function invocation is superfluous.
-                // TODO: Remove.
-                test.done();
             } else if (!tests.allow_uncaught_exception) {
                 tests.status.status = tests.status.ERROR;
-                tests.status.message = e.message;
+                tests.status.message = message;
                 tests.status.stack = stack;
             }
             done();
         };
 
-        addEventListener("error", error_handler, false);
-        addEventListener("unhandledrejection", function(e){ error_handler(e.reason); }, false);
+        addEventListener("error", function(e) {
+            var message = e.message;
+            var stack;
+            if (e.error && e.error.stack) {
+                stack = e.error.stack;
+            } else {
+                stack = e.filename + ":" + e.lineno + ":" + e.colno;
+            }
+            error_handler(message, stack);
+        }, false);
+
+        addEventListener("unhandledrejection", function(e) {
+            var message = "Unhandled rejection: " + e.reason.message;
+            // There's no stack for unhandled rejections.
+            error_handler(message);
+        }, false);
     }
 
     test_environment.on_tests_ready();
 
     /**
      * Stylesheet
      */
      var stylesheetContent = "\
--- a/testing/web-platform/tests/service-workers/service-worker/fetch-event-within-sw.https.html
+++ b/testing/web-platform/tests/service-workers/service-worker/fetch-event-within-sw.https.html
@@ -13,23 +13,23 @@ async function registerSwAndOpenFrame(t)
   t.add_cleanup(() => registration.unregister());
   await wait_for_state(t, registration.installing, 'activated');
 
   const frame = await with_iframe('resources/simple.html');
   t.add_cleanup(() => frame.remove());
   return frame;
 }
 
-async function deleteCashes() {
+async function deleteCaches() {
   const cacheKeys = await caches.keys();
   await Promise.all(cacheKeys.map(c => caches.delete(c)));
 }
 
 promise_test(async t => {
-  t.add_cleanup(deleteCashes);
+  t.add_cleanup(deleteCaches);
 
   const iframe = await registerSwAndOpenFrame(t);
   const fetchText =
       await iframe.contentWindow.fetch('dummy.txt').then(r => r.text());
 
   const cache = await iframe.contentWindow.caches.open('test');
   await cache.add('dummy.txt');
 
--- a/testing/web-platform/tests/svg/animations/scripted/onhover-syncbases.html
+++ b/testing/web-platform/tests/svg/animations/scripted/onhover-syncbases.html
@@ -1,13 +1,13 @@
 <!DOCTYPE html>
 <html>
   <head>
     <meta charset="utf-8">
-    <title>Check if onhover events reset correctly when triggred multiple times</title>
+    <title>Check if onhover events reset correctly when triggered multiple times</title>
     <link rel="help" href="https://svgwg.org/svg2-draft/single-page.html#interact-EventAttributes">
     <link rel="author" title="Edvard Thörnros" href="mailto:edvardt@opera.com">
     <script src="/resources/testharness.js"></script>
     <script src="/resources/testharnessreport.js"></script>
   </head>
   <body>
     <svg>
       <circle id="circle" cx="150" cy="75" r="50" fill="#F00">
@@ -15,29 +15,29 @@
       <set attributeName="fill" to="#F00" begin="mouseout"/>
       </circle>
     </svg>
     <script>
 async_test(t => {
   let rounds = 5; // How many times the cursor is moved in and out
   let circle = document.querySelector("#circle");
   let delay = 20;
-  let f = t.step_func(function() {
+  function f() {
     assert_equals(window.getComputedStyle(circle, null).fill,
       "rgb(255, 0, 0)")
     if (rounds-- == 0) {
       t.done();
       return;
     }
 
     circle.dispatchEvent(new Event("mouseover"));
-    step_timeout(function() {
+    t.step_timeout(function() {
         assert_equals(window.getComputedStyle(circle, null).fill,
           "rgb(0, 255, 0)")
         circle.dispatchEvent(new Event("mouseout"))
         t.step_timeout(f, delay);
-      }, delay);
-    });
-    step_timeout(function() { f(); }, 0);
-  });
+    }, delay);
+  }
+  t.step_timeout(f, 0);
+});
     </script>
   </body>
 </html>
--- a/testing/web-platform/tests/svg/animations/syncbase-remove-add-while-running.html
+++ b/testing/web-platform/tests/svg/animations/syncbase-remove-add-while-running.html
@@ -1,26 +1,25 @@
-<!doctype html>
-
-<meta charset="utf-8">
+<!DOCTYPE html>
 <title>Remove/Add syncbase while animation is running</title>
 <link rel="help" href="https://www.w3.org/TR/SMIL3/smil-timing.html#q26">
 <link rel="author" title="Edvard Thörnros" href="mailto:edvardt@opera.com">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 
 <svg>
   <animate id="anim" attributeName="visibility" to="visible" begin="10s" dur="2s"/>
   <rect x="0" y="0" width="0" height="100" fill="#0F0">
     <set attributeName="width" fill="freeze" to="100" begin="anim.begin"/>
   </rect>
 </svg>
 
 <script>
-    document.querySelector("body").onload = async_test(function(t) {
+  async_test(function(t) {
+    window.onload = t.step_func(function() {
       let svg = document.querySelector("svg");
       let rect = document.querySelector("rect");
 
       window.requestAnimationFrame(t.step_func(function() {
         window.requestAnimationFrame(t.step_func(function() {
           var anim1 = document.getElementById("anim");
           anim1.parentNode.removeChild(anim1);
 
@@ -36,9 +35,10 @@
             window.requestAnimationFrame(t.step_func_done(function() {
               svg.pauseAnimations();
               assert_equals(rect.width.animVal.value, 100, "Sync base triggered");
             }));
           }));
         }));
       }));
     });
+  });
 </script>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/svg/geometry/reftests/circle-001.svg
@@ -0,0 +1,16 @@
+<svg width="340" height="140"
+  xmlns="http://www.w3.org/2000/svg"
+  xmlns:html="http://www.w3.org/1999/xhtml">
+  <title>Circle coordinates and radius specified by properties</title>
+  <html:link rel="help" href="https://svgwg.org/svg2-draft/geometry.html"/>
+  <html:link rel="match"  href="circle-ref.svg" />
+  <style>
+    circle {
+      cx: 204px;
+      cy: 56px;
+      r: 65px;
+      fill: blue;
+    }
+  </style>
+  <circle />
+</svg>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/svg/geometry/reftests/circle-002.svg
@@ -0,0 +1,16 @@
+<svg width="340" height="140" viewBox="60000 70000 3400 1400"
+  xmlns="http://www.w3.org/2000/svg"
+  xmlns:html="http://www.w3.org/1999/xhtml">
+  <title>Circle coordinates and radius specified in user units</title>
+  <html:link rel="help" href="https://svgwg.org/svg2-draft/geometry.html"/>
+  <html:link rel="match"  href="circle-ref.svg" />
+  <style>
+    circle {
+      cx: 62040px;
+      cy: 70560px;
+      r: 650px;
+      fill: blue;
+    }
+  </style>
+  <circle />
+</svg>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/svg/geometry/reftests/circle-003.svg
@@ -0,0 +1,16 @@
+<svg width="340" height="140"
+  xmlns="http://www.w3.org/2000/svg"
+  xmlns:html="http://www.w3.org/1999/xhtml">
+  <title>Circle coordinates and radius specified by percentage</title>
+  <html:link rel="help" href="https://svgwg.org/svg2-draft/geometry.html"/>
+  <html:link rel="match"  href="circle-ref.svg" />
+  <style>
+    circle {
+      cx: 60%; /* 60% of width 340 */
+      cy: 40%; /* 40% of height 140 */
+      r: 25%; /* 25% of normalized diagonal 260 */
+      fill: blue;
+    }
+  </style>
+  <circle />
+</svg>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/svg/geometry/reftests/circle-004.svg
@@ -0,0 +1,15 @@
+<svg width="340" height="140"
+  xmlns="http://www.w3.org/2000/svg"
+  xmlns:html="http://www.w3.org/1999/xhtml">
+  <title>Circle coordinates and radius specified using calc</title>
+  <html:link rel="help" href="https://svgwg.org/svg2-draft/geometry.html"/>
+  <html:link rel="match"  href="circle-ref.svg" />
+  <style>
+    circle {
+      fill: blue;
+      font-size: 40px;
+    }
+  </style>
+  <circle cx="calc(80px + 60% - 2em)" cy="calc(80px + 40% - 2em)"
+    r="calc(5 * 5%)" />
+</svg>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/svg/geometry/reftests/circle-ref.svg
@@ -0,0 +1,4 @@
+<svg width="340" height="140"
+  xmlns="http://www.w3.org/2000/svg">
+  <circle cx="204" cy="56" r="65" fill="blue" />
+</svg>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/svg/geometry/reftests/ellipse-001.svg
@@ -0,0 +1,17 @@
+<svg width="300" height="200"
+  xmlns="http://www.w3.org/2000/svg"
+  xmlns:html="http://www.w3.org/1999/xhtml">
+  <title>Ellipse coordinates and radii specified by properties</title>
+  <html:link rel="help" href="https://svgwg.org/svg2-draft/geometry.html"/>
+  <html:link rel="match"  href="ellipse-ref.svg" />
+  <style>
+    ellipse {
+      cx: 75px;
+      cy: 120px;
+      rx: 60px;
+      ry: 50px;
+      fill: blue;
+    }
+  </style>
+  <ellipse />
+</svg>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/svg/geometry/reftests/ellipse-002.svg
@@ -0,0 +1,17 @@
+<svg width="300" height="200" viewBox="6000 7000 600 400"
+  xmlns="http://www.w3.org/2000/svg"
+  xmlns:html="http://www.w3.org/1999/xhtml">
+  <title>Ellipse coordinates and radii specified in user units</title>
+  <html:link rel="help" href="https://svgwg.org/svg2-draft/geometry.html"/>
+  <html:link rel="match"  href="ellipse-ref.svg" />
+  <style>
+    ellipse {
+      cx: 6150px;
+      cy: 7240px;
+      rx: 120px;
+      ry: 100px;
+      fill: blue;
+    }
+  </style>
+  <ellipse />
+</svg>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/svg/geometry/reftests/ellipse-003.svg
@@ -0,0 +1,17 @@
+<svg width="300" height="200"
+  xmlns="http://www.w3.org/2000/svg"
+  xmlns:html="http://www.w3.org/1999/xhtml">
+  <title>Ellipse coordinates and radii specified by percentage</title>
+  <html:link rel="help" href="https://svgwg.org/svg2-draft/geometry.html"/>
+  <html:link rel="match"  href="ellipse-ref.svg" />
+  <style>
+    ellipse {
+      cx: 25%;
+      cy: 60%;
+      rx: 20%;
+      ry: 25%;
+      fill: blue;
+    }
+  </style>
+  <ellipse />
+</svg>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/svg/geometry/reftests/ellipse-004.svg
@@ -0,0 +1,15 @@
+<svg width="300" height="200"
+  xmlns="http://www.w3.org/2000/svg"
+  xmlns:html="http://www.w3.org/1999/xhtml">
+  <title>Ellipse coordinates and radii specified using calc</title>
+  <html:link rel="help" href="https://svgwg.org/svg2-draft/geometry.html"/>
+  <html:link rel="match"  href="ellipse-ref.svg" />
+  <style>
+    ellipse {
+      fill: blue;
+      font-size: 40px;
+    }
+  </style>
+  <ellipse cx="calc(80px + 25% - 2em)" cy="calc(80px + 60% - 2em)"
+    rx="calc(4 * 5%)" ry="calc(5 * 5%)" />
+</svg>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/svg/geometry/reftests/ellipse-ref.svg
@@ -0,0 +1,4 @@
+<svg width="300" height="200"
+  xmlns="http://www.w3.org/2000/svg">
+  <ellipse cx="75" cy="120" rx="60" ry="50" fill="blue" />
+</svg>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/svg/geometry/reftests/rect-001.svg
@@ -0,0 +1,17 @@
+<svg width="300" height="200"
+  xmlns="http://www.w3.org/2000/svg"
+  xmlns:html="http://www.w3.org/1999/xhtml">
+  <title>Rectangle coordinates and sizes specified by properties</title>
+  <html:link rel="help" href="https://svgwg.org/svg2-draft/geometry.html"/>
+  <html:link rel="match"  href="rect-ref.svg" />
+  <style>
+    rect {
+      x: 30px;
+      y: 60px;
+      width: 120px;
+      height: 100px;
+      fill: blue;
+    }
+  </style>
+  <rect />
+</svg>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/svg/geometry/reftests/rect-002.svg
@@ -0,0 +1,17 @@
+<svg width="300" height="200" viewBox="600 700 150 100"
+  xmlns="http://www.w3.org/2000/svg"
+  xmlns:html="http://www.w3.org/1999/xhtml">
+  <title>Rectangle coordinates and sizes specified in user units</title>
+  <html:link rel="help" href="https://svgwg.org/svg2-draft/geometry.html"/>
+  <html:link rel="match"  href="rect-ref.svg" />
+  <style>
+    rect {
+      x: 615px;
+      y: 730px;
+      width: 60px;
+      height: 50px;
+      fill: blue;
+    }
+  </style>
+  <rect />
+</svg>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/svg/geometry/reftests/rect-003.svg
@@ -0,0 +1,17 @@
+<svg width="300" height="200"
+  xmlns="http://www.w3.org/2000/svg"
+  xmlns:html="http://www.w3.org/1999/xhtml">
+  <title>Rectangle coordinates and sizes specified by percentage</title>
+  <html:link rel="help" href="https://svgwg.org/svg2-draft/geometry.html"/>
+  <html:link rel="match"  href="rect-ref.svg" />
+  <style>
+    rect {
+      x: 10%;
+      y: 30%;
+      width: 40%;
+      height: 50%;
+      fill: blue;
+    }
+  </style>
+  <rect />
+</svg>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/svg/geometry/reftests/rect-004.svg
@@ -0,0 +1,15 @@
+<svg width="300" height="200"
+  xmlns="http://www.w3.org/2000/svg"
+  xmlns:html="http://www.w3.org/1999/xhtml">
+  <title>Rectangle coordinates and sizes specified using calc</title>
+  <html:link rel="help" href="https://svgwg.org/svg2-draft/geometry.html"/>
+  <html:link rel="match"  href="rect-ref.svg" />
+  <style>
+    rect {
+      fill: blue;
+      font-size: 40px;
+    }
+  </style>
+  <rect x="calc(80px + 10% - 2em)" y="calc(80px + 30% - 2em)"
+    width="calc(8 * 5%)" height="calc(10 * 5%)" />
+</svg>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/svg/geometry/reftests/rect-ref.svg
@@ -0,0 +1,4 @@
+<svg width="300" height="200"
+  xmlns="http://www.w3.org/2000/svg">
+  <rect x="30" y="60" width="120" height="100" fill="blue" />
+</svg>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/svg/painting/parsing/marker-shorthand.svg
@@ -0,0 +1,28 @@
+<svg xmlns="http://www.w3.org/2000/svg"
+     xmlns:h="http://www.w3.org/1999/xhtml"
+     width="800px" height="800px">
+  <title>SVG Painting: marker sets longhands</title>
+  <metadata>
+    <h:link rel="help" href="https://svgwg.org/svg2-draft/painting.html#MarkerProperty"/>
+    <h:meta name="assert" content="marker supports the full paint grammar 'none | marker-ref'."/>
+  </metadata>
+  <g id="target"></g>
+  <h:script src="/resources/testharness.js"/>
+  <h:script src="/resources/testharnessreport.js"/>
+  <h:script src="/css/support/shorthand-testcommon.js"/>
+  <script><![CDATA[
+
+test_shorthand_value('marker', 'none', {
+  'marker-start': 'none',
+  'marker-mid': 'none',
+  'marker-end': 'none'
+});
+
+test_shorthand_value('marker', 'url("https://example.com/")', {
+  'marker-start': 'url("https://example.com/")',
+  'marker-mid': 'url("https://example.com/")',
+  'marker-end': 'url("https://example.com/")'
+});
+
+  ]]></script>
+</svg>
--- a/testing/web-platform/tests/tools/ci/tcdownload.py
+++ b/testing/web-platform/tests/tools/ci/tcdownload.py
@@ -66,17 +66,17 @@ def run(*args, **kwargs):
             continue
         if status.state == "pending":
             continue
         taskgroup_id = status.target_url.rsplit("/", 1)[1]
         taskgroups.add(taskgroup_id)
 
     if not taskgroups:
         logger.error("No complete TaskCluster runs found for ref %s" % kwargs["ref"])
-        return
+        return 1
 
     for taskgroup in taskgroups:
         taskgroup_url = "https://queue.taskcluster.net/v1/task-group/%s/list"
         artifacts_list_url = "https://queue.taskcluster.net/v1/task/%s/artifacts"
         tasks = get_json(taskgroup_url % taskgroup, "tasks")
         for task in tasks:
             task_id = task["status"]["taskId"]
             url = artifacts_list_url % (task_id,)
--- a/testing/web-platform/tests/tools/wptrunner/requirements.txt
+++ b/testing/web-platform/tests/tools/wptrunner/requirements.txt
@@ -1,8 +1,8 @@
 html5lib==1.0.1
 mozinfo==1.1.0
 mozlog==4.2.0
 mozdebug==0.1.1
 pillow==6.1.0
-urllib3[secure]==1.25.3
+urllib3[secure]==1.25.5
 requests==2.22.0
 six==1.12.0
--- a/testing/web-platform/tests/web-animations/animation-model/animation-types/property-types.js
+++ b/testing/web-platform/tests/web-animations/animation-model/animation-types/property-types.js
@@ -2190,28 +2190,27 @@ const filterListType = {
            expected:
            'opacity(0.5) grayscale(0.5) invert(0.5) sepia(0.5) blur(5px)' }]);
     }, `${property}: interpolate different length of filter-function-list`
        + ' with function which lacuna value is 0');
 
     test(t => {
       const idlName = propertyToIDL(property);
       const target = createTestElement(t, setup);
-      target.style.color = "rgba(255, 0, 0, 0.4)";
       const animation = target.animate(
         { [idlName]:
           ['blur(0px)',
            'blur(10px) drop-shadow(10px 10px 10px rgba(0, 0, 255, 0.8))'] },
         1000);
 
       testAnimationSamples(animation, idlName,
         [{ time: 500,
-           // The lacuna value of drop-shadow's color is taken from
-           // the color property.
-           expected: 'blur(5px) drop-shadow(rgba(85, 0, 170, 0.6) 5px 5px 5px' }]);
+           // Per the spec: The initial value for interpolation is all length values
+           // set to 0 and the used color set to transparent.
+           expected: 'blur(5px) drop-shadow(rgba(0, 0, 255, 0.4) 5px 5px 5px' }]);
     }, `${property}: interpolate different length of filter-function-list`
        + ' with drop-shadow function');
 
     test(t => {
       const idlName = propertyToIDL(property);
       const target = createTestElement(t, setup);
       const animation = target.animate({ [idlName]: ['none', 'blur(10px)'] },
                                      1000);
deleted file mode 100644
--- a/testing/web-platform/tests/web-nfc/NFCReader.https.html
+++ /dev/null
@@ -1,134 +0,0 @@
-<!DOCTYPE html>
-<meta charset=utf-8>
-<title>Web NFC: NFCReader tests</title>
-<link rel="author" title="Intel" href="http://www.intel.com"/>
-<link rel="help" href="https://w3c.github.io/web-nfc/"/>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="resources/nfc-helpers.js"></script>
-<script>
-
-"use strict";
-
-function waitSyntaxErrorPromise(t, scan_options) {
-  const reader = new NFCReader();
-  const readerWatcher = new EventWatcher(t, reader, ["reading", "error"]);
-  const promise = readerWatcher.wait_for("error").then(event => {
-    assert_equals(event.error.name, 'SyntaxError');
-  });
-  // NFCReader#scan() asynchronously dispatches the syntax error event.
-  reader.scan(scan_options);
-  return promise;
-}
-
-promise_test(async t => {
-  await waitSyntaxErrorPromise(t, {url: "www.a.com"});
-}, "Test that NFCReader.scan fails if NFCScanOptions.url is missing \
-components.");
-
-promise_test(async t => {
-  await waitSyntaxErrorPromise(t, {url: "invalid"});
-}, "Test that NFCReader.scan fails if NFCScanOptions.url is invalid.");
-
-promise_test(async t => {
-  await waitSyntaxErrorPromise(t, {url: "http://a.com"});
-}, "Test that NFCReader.scan fails if NFCScanOptions.url has wrong \
-protocol.");
-
-nfc_test(async (t, mockNFC) => {
-  const reader = new NFCReader();
-  const readerWatcher = new EventWatcher(t, reader, ["reading", "error"]);
-  reader.scan();
-  mockNFC.setHWStatus(NFCHWStatus.DISABLED);
-  const event = await readerWatcher.wait_for("error");
-  assert_equals(event.error.name, 'NotReadableError');
-}, "NFCReader.scan should fail if NFC HW is disabled.");
-
-nfc_test(async (t, mockNFC) => {
-  const reader = new NFCReader();
-  const readerWatcher = new EventWatcher(t, reader, ["reading", "error"]);
-  reader.scan();
-  mockNFC.setHWStatus(NFCHWStatus.NOT_SUPPORTED);
-  const event = await readerWatcher.wait_for("error");
-  assert_equals(event.error.name, 'NotSupportedError');
-}, "NFCReader.scan should fail if NFC HW is not supported.");
-
-nfc_test(async (t, mockNFC) => {
-  const reader = new NFCReader();
-  const controller = new AbortController();
-  const readerWatcher = new EventWatcher(t, reader, ["reading", "error"]);
-
-  mockNFC.setReadingMessage(createMessage([createTextRecord(test_text_data)]));
-  const promise = readerWatcher.wait_for("reading").then(event => {
-    assert_true(event instanceof NFCReadingEvent);
-    controller.abort();
-  });
-  // NFCReader#scan() asynchronously dispatches the reading event.
-  reader.scan({signal : controller.signal});
-  await promise;
-}, "Test that nfc watch success if NFC HW is enabled.");
-
-nfc_test(async (t, mockNFC) => {
-  const reader = new NFCReader();
-  const controller = new AbortController();
-  const readerWatcher = new EventWatcher(t, reader, ["reading", "error"]);
-
-  mockNFC.setReadingMessage(createMessage([createTextRecord(test_text_data)]));
-  const promise = readerWatcher.wait_for("reading").then(event => {
-    assert_true(event instanceof NFCReadingEvent);
-    controller.abort();
-  });
-  // NFCReader#scan() asynchronously dispatches the reading event.
-  reader.scan({signal : controller.signal, url: "https://a.com"});
-  await promise;
-}, "Test that NFCReader.scan succeeds if NFCScanOptions.url is valid URL.");
-
-nfc_test(async (t, mockNFC) => {
-  const reader = new NFCReader();
-  const controller = new AbortController();
-  const readerWatcher = new EventWatcher(t, reader, ["reading", "error"]);
-
-  mockNFC.setReadingMessage(createMessage([createTextRecord(test_text_data)]));
-  const promise = readerWatcher.wait_for("reading").then(event => {
-    assert_true(event instanceof NFCReadingEvent);
-    controller.abort();
-  });
-  // NFCReader#scan() asynchronously dispatches the reading event.
-  reader.scan({signal : controller.signal, url: "https://a.com/*"});
-  await promise;
-}, "Test that NFCReader.scan succeeds if NFCScanOptions.url is valid URL \
-with '*' wildcard character in path.");
-
-nfc_test(async (t, mockNFC) => {
-  const reader = new NFCReader();
-  const controller = new AbortController();
-  const readerWatcher = new EventWatcher(t, reader, ["reading", "error"]);
-
-  mockNFC.setReadingMessage(createMessage([createTextRecord(test_text_data)]));
-  const promise = readerWatcher.wait_for("reading").then(event => {
-    assert_true(event instanceof NFCReadingEvent);
-    controller.abort();
-  });
-  // NFCReader#scan() asynchronously dispatches the reading event.
-  reader.scan({signal : controller.signal, url: "https://a.com/*/bar"});
-  await promise;
-}, "Test that NFCReader.scan succeeds if NFCScanOptions.url is valid URL \
-with '*' wildcard character in the beginning of path component followed by \
-subpath.");
-
-nfc_test(async (t, mockNFC) => {
-  const reader = new NFCReader();
-  const controller = new AbortController();
-  const readerWatcher = new EventWatcher(t, reader, ["reading", "error"]);
-
-  mockNFC.setReadingMessage(createMessage([createTextRecord(test_text_data)]));
-  const promise = readerWatcher.wait_for("reading").then(event => {
-    assert_true(event instanceof NFCReadingEvent);
-    controller.abort();
-  });
-  // NFCReader#scan() asynchronously dispatches the reading event.
-  reader.scan({signal : controller.signal, url: ""});
-  await promise;
-}, "Test that NFCReader.scan succeeds if NFCScanOptions.url is empty.");
-
-</script>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/web-nfc/NFCReader_scan.https.html
@@ -0,0 +1,194 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Web NFC: NFCReader.scan tests</title>
+<link rel="author" title="Intel" href="http://www.intel.com"/>
+<link rel="help" href="https://w3c.github.io/web-nfc/"/>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/nfc-helpers.js"></script>
+<script>
+
+"use strict";
+
+const invalid_signals = [
+  "string",
+  123,
+  {},
+  true,
+  Symbol(),
+  () => {},
+  self
+];
+
+function waitSyntaxErrorPromise(t, scan_options) {
+  const reader = new NFCReader();
+  const readerWatcher = new EventWatcher(t, reader, ["reading", "error"]);
+  const promise = readerWatcher.wait_for("error").then(event => {
+    assert_equals(event.error.name, 'SyntaxError');
+  });
+  // NFCReader#scan() asynchronously dispatches the syntax error event.
+  reader.scan(scan_options);
+  return promise;
+}
+
+promise_test(async t => {
+  await waitSyntaxErrorPromise(t, {url: "www.a.com"});
+}, "Test that NFCReader.scan fails if NFCScanOptions.url is missing \
+components.");
+
+promise_test(async t => {
+  await waitSyntaxErrorPromise(t, {url: "invalid"});
+}, "Test that NFCReader.scan fails if NFCScanOptions.url is invalid.");
+
+promise_test(async t => {
+  await waitSyntaxErrorPromise(t, {url: "http://a.com"});
+}, "Test that NFCReader.scan fails if NFCScanOptions.url has wrong \
+protocol.");
+
+nfc_test(async (t, mockNFC) => {
+  const reader = new NFCReader();
+  const readerWatcher = new EventWatcher(t, reader, ["reading", "error"]);
+  reader.scan();
+  mockNFC.setHWStatus(NFCHWStatus.DISABLED);
+  const event = await readerWatcher.wait_for("error");
+  assert_equals(event.error.name, 'NotReadableError');
+}, "NFCReader.scan should fail if NFC HW is disabled.");
+
+nfc_test(async (t, mockNFC) => {
+  const reader = new NFCReader();
+  const readerWatcher = new EventWatcher(t, reader, ["reading", "error"]);
+  reader.scan();
+  mockNFC.setHWStatus(NFCHWStatus.NOT_SUPPORTED);
+  const event = await readerWatcher.wait_for("error");
+  assert_equals(event.error.name, 'NotSupportedError');
+}, "NFCReader.scan should fail if NFC HW is not supported.");
+
+nfc_test(async (t, mockNFC) => {
+  const reader = new NFCReader();
+  const controller = new AbortController();
+  const readerWatcher = new EventWatcher(t, reader, ["reading", "error"]);
+
+  mockNFC.setReadingMessage(createMessage([createTextRecord(test_text_data)]));
+  const promise = readerWatcher.wait_for("reading").then(event => {
+    assert_true(event instanceof NFCReadingEvent);
+    controller.abort();
+  });
+  // NFCReader#scan() asynchronously dispatches the reading event.
+  reader.scan({signal : controller.signal});
+  await promise;
+}, "Test that nfc watch success if NFC HW is enabled.");
+
+nfc_test(async (t, mockNFC) => {
+  const reader = new NFCReader();
+  const controller = new AbortController();
+  const readerWatcher = new EventWatcher(t, reader, ["reading", "error"]);
+
+  mockNFC.setReadingMessage(createMessage([createTextRecord(test_text_data)]));
+  const promise = readerWatcher.wait_for("reading").then(event => {
+    assert_true(event instanceof NFCReadingEvent);
+    controller.abort();
+  });
+  // NFCReader#scan() asynchronously dispatches the reading event.
+  reader.scan({signal : controller.signal, url: "https://a.com"});
+  await promise;
+}, "Test that NFCReader.scan succeeds if NFCScanOptions.url is valid URL.");
+
+nfc_test(async (t, mockNFC) => {
+  const reader = new NFCReader();
+  const controller = new AbortController();
+  const readerWatcher = new EventWatcher(t, reader, ["reading", "error"]);
+
+  mockNFC.setReadingMessage(createMessage([createTextRecord(test_text_data)]));
+  const promise = readerWatcher.wait_for("reading").then(event => {
+    assert_true(event instanceof NFCReadingEvent);
+    controller.abort();
+  });
+  // NFCReader#scan() asynchronously dispatches the reading event.
+  reader.scan({signal : controller.signal, url: "https://a.com/*"});
+  await promise;
+}, "Test that NFCReader.scan succeeds if NFCScanOptions.url is valid URL \
+with '*' wildcard character in path.");
+
+nfc_test(async (t, mockNFC) => {
+  const reader = new NFCReader();
+  const controller = new AbortController();
+  const readerWatcher = new EventWatcher(t, reader, ["reading", "error"]);
+
+  mockNFC.setReadingMessage(createMessage([createTextRecord(test_text_data)]));
+  const promise = readerWatcher.wait_for("reading").then(event => {
+    assert_true(event instanceof NFCReadingEvent);
+    controller.abort();
+  });
+  // NFCReader#scan() asynchronously dispatches the reading event.
+  reader.scan({signal : controller.signal, url: "https://a.com/*/bar"});
+  await promise;
+}, "Test that NFCReader.scan succeeds if NFCScanOptions.url is valid URL \
+with '*' wildcard character in the beginning of path component followed by \
+subpath.");
+
+nfc_test(async (t, mockNFC) => {
+  const reader = new NFCReader();
+  const controller = new AbortController();
+  const readerWatcher = new EventWatcher(t, reader, ["reading", "error"]);
+
+  mockNFC.setReadingMessage(createMessage([createTextRecord(test_text_data)]));
+  const promise = readerWatcher.wait_for("reading").then(event => {
+    assert_true(event instanceof NFCReadingEvent);
+    controller.abort();
+  });
+  // NFCReader#scan() asynchronously dispatches the reading event.
+  reader.scan({signal : controller.signal, url: ""});
+  await promise;
+}, "Test that NFCReader.scan succeeds if NFCScanOptions.url is empty.");
+
+nfc_test(async (t, mockNFC) => {
+  const reader = new NFCReader();
+  const readerWatcher = new EventWatcher(t, reader, ["reading", "error"]);
+  mockNFC.setReadingMessage(createMessage([createTextRecord(test_text_data)]));
+
+  const controller = new AbortController();
+  controller.abort();
+  reader.scan({signal: controller.signal});
+
+  await new Promise((resolve, reject) => {
+    readerWatcher.wait_for("reading").then(event => {
+      reject("reading event should not be fired.");
+    });
+    t.step_timeout(resolve, 100);
+  });
+
+}, "Test that NFCReader.onreading should not be fired if NFCScanOptions.signal \
+is aborted.");
+
+nfc_test(async (t, mockNFC) => {
+  const reader = new NFCReader();
+  const controller = new AbortController();
+  const readerWatcher = new EventWatcher(t, reader, ["reading", "error"]);
+  const message = createMessage([createTextRecord(test_text_data)]);
+
+  mockNFC.setReadingMessage(message);
+
+  reader.scan({signal: controller.signal});
+  const event = await readerWatcher.wait_for("reading");
+  assert_true(event instanceof NFCReadingEvent);
+  mockNFC.setReadingMessage(message);
+  controller.abort();
+
+  await new Promise((resolve, reject) => {
+    readerWatcher.wait_for("reading").then(event => {
+      reject("reading event should not be fired.");
+    });
+    t.step_timeout(resolve, 100);
+  });
+
+}, "Synchronously signaled abort.");
+
+test(() => {
+  const reader = new NFCReader();
+  invalid_signals.forEach(invalid_signal => {
+    assert_throws(new TypeError(),
+        () => { reader.scan({ signal: invalid_signal }); });
+  });
+}, "NFCReader.scan should fail if signal is not an AbortSignal.");
+
+</script>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/webxr/ar-module/idlharness.https.window.js
@@ -0,0 +1,16 @@
+// META: script=/resources/WebIDLParser.js
+// META: script=/resources/idlharness.js
+
+'use strict';
+
+// https://immersive-web.github.io/webxr-ar-module/
+
+idl_test(
+  ['webxr-ar-module'],
+  ['webxr', 'dom'],
+  async idl_array => {
+    idl_array.add_objects({
+      // TODO: XRSession
+    });
+  }
+);
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/webxr/gamepads-module/idlharness.https.window.js
@@ -0,0 +1,16 @@
+// META: script=/resources/WebIDLParser.js
+// META: script=/resources/idlharness.js
+
+'use strict';
+
+// https://immersive-web.github.io/webxr-gamepads-module/
+
+idl_test(
+  ['webxr-gamepads-module'],
+  ['webxr', 'dom'],
+  async idl_array => {
+    idl_array.add_objects({
+      // TODO: XRInputSource
+    });
+  }
+);
--- a/testing/web-platform/tests/webxr/xrWebGLLayer_constructor.https.html
+++ b/testing/web-platform/tests/webxr/xrWebGLLayer_constructor.https.html
@@ -12,18 +12,21 @@ xr_promise_test("Ensure that XRWebGLLaye
   let glAttributes = {
     alpha: false,
     antialias: false,
     xrCompatible: false,
   };
   let gl = webglCanvas.getContext('webgl', glAttributes);
   return navigator.xr.test.simulateDeviceConnection(TRACKED_IMMERSIVE_DEVICE)
     .then(() => {
-      return navigator.xr.requestSession('inline')
-        .then((session) => {
+      let sessionPromise;
+      navigator.xr.test.simulateUserActivation(function() {
+        sessionPromise = navigator.xr.requestSession('inline');
+      });
+      return sessionPromise.then((session) => {
           try {
             let webglLayerIncompatible = new XRWebGLLayer(session, gl);
           } catch (err) {
             assert_unreached("Inline XRWebGLLayers should not fail when created with a context that is not XRCompatible");
           }
         });
     })
     .then(() => {