Merge inbound to mozilla-central a=merge
authorarthur.iakab <aiakab@mozilla.com>
Wed, 07 Nov 2018 23:51:27 +0200
changeset 501460 5836a6061476
parent 501336 12afa29e9c8c (current diff)
parent 501459 445e333886a9 (diff)
child 501472 640b4bd34438
child 501494 43772d7ccfc4
push id10290
push userffxbld-merge
push dateMon, 03 Dec 2018 16:23:23 +0000
treeherdermozilla-beta@700bed2445e6 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone65.0a1
first release with
nightly linux32
5836a6061476 / 65.0a1 / 20181107220128 / files
nightly linux64
5836a6061476 / 65.0a1 / 20181107220128 / files
nightly mac
5836a6061476 / 65.0a1 / 20181107220128 / files
nightly win32
5836a6061476 / 65.0a1 / 20181107220128 / files
nightly win64
5836a6061476 / 65.0a1 / 20181107220128 / files
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
releases
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge inbound to mozilla-central a=merge
devtools/startup/locales/en-US/aboutdevtools.dtd
testing/web-platform/meta/css/CSS2/borders/border-top-width-003.xht.ini
testing/web-platform/meta/css/css-masking/clip-path-svg-content/clip-path-content-syling.svg.ini
testing/web-platform/meta/css/css-paint-api/registered-property-type.https.html.ini
testing/web-platform/meta/css/css-text/white-space/break-spaces-003.html.ini
testing/web-platform/meta/css/css-text/white-space/textarea-break-spaces-003.html.ini
testing/web-platform/meta/html/interaction/focus/sequential-focus-navigation-and-the-tabindex-attribute/focus-tabindex-order.html.ini
testing/web-platform/meta/server-timing/cross_origin.html.ini
testing/web-platform/meta/server-timing/idlharness.any.js.ini
testing/web-platform/meta/server-timing/navigation_timing_idl.html.ini
testing/web-platform/meta/server-timing/resource_timing_idl.html.ini
testing/web-platform/meta/server-timing/server_timing_header-parsing.html.ini
testing/web-platform/meta/server-timing/test_server_timing.html.ini
testing/web-platform/meta/webmidi/idlharness.window.js.ini
testing/web-platform/tests/cookies/http-state/resources/test-files/disabled-chromium0023-expected
testing/web-platform/tests/cookies/http-state/resources/test-files/disabled-chromium0023-test
testing/web-platform/tests/css/css-content/resources/blank.html
testing/web-platform/tests/css/css-flexbox/flexbox_empty-ref.html
testing/web-platform/tests/css/css-images/gradient-crash-ref.html
testing/web-platform/tests/css/css-paint-api/registered-property-type.https.html
testing/web-platform/tests/css/css-text/white-space/break-spaces-003.html
testing/web-platform/tests/css/css-text/white-space/textarea-break-spaces-003.html
testing/web-platform/tests/server-timing/cross_origin.html
testing/web-platform/tests/server-timing/idlharness.any.js
testing/web-platform/tests/server-timing/navigation_timing_idl.html
testing/web-platform/tests/server-timing/resource_timing_idl.html
testing/web-platform/tests/server-timing/server_timing_header-parsing.html
testing/web-platform/tests/server-timing/test_server_timing.html
testing/web-platform/tests/server-timing/test_server_timing.html.sub.headers
testing/web-platform/tests/tools/lint/tests/dummy/ref/about_blank-ref.html
testing/web-platform/tests/webdriver/tests/support/sync.py
testing/web-platform/tests/webmidi/idlharness.window.js
--- a/browser/app/profile/firefox.js
+++ b/browser/app/profile/firefox.js
@@ -1201,18 +1201,18 @@ pref("services.sync.prefs.sync.privacy.c
 pref("services.sync.prefs.sync.privacy.clearOnShutdown.cookies", true);
 pref("services.sync.prefs.sync.privacy.clearOnShutdown.downloads", true);
 pref("services.sync.prefs.sync.privacy.clearOnShutdown.formdata", true);
 pref("services.sync.prefs.sync.privacy.clearOnShutdown.history", true);
 pref("services.sync.prefs.sync.privacy.clearOnShutdown.offlineApps", true);
 pref("services.sync.prefs.sync.privacy.clearOnShutdown.sessions", true);
 pref("services.sync.prefs.sync.privacy.clearOnShutdown.siteSettings", true);
 pref("services.sync.prefs.sync.privacy.donottrackheader.enabled", true);
-pref("services.sync.prefs.sync.privacy.fuzzyfox.enabled", true);
-pref("services.sync.prefs.sync.privacy.fuzzyfox.clockgrainus", true);
+pref("services.sync.prefs.sync.privacy.fuzzyfox.enabled", false);
+pref("services.sync.prefs.sync.privacy.fuzzyfox.clockgrainus", false);
 pref("services.sync.prefs.sync.privacy.sanitize.sanitizeOnShutdown", true);
 pref("services.sync.prefs.sync.privacy.trackingprotection.enabled", true);
 pref("services.sync.prefs.sync.privacy.trackingprotection.pbmode.enabled", true);
 pref("services.sync.prefs.sync.privacy.resistFingerprinting", true);
 pref("services.sync.prefs.sync.privacy.reduceTimerPrecision", true);
 pref("services.sync.prefs.sync.privacy.resistFingerprinting.reduceTimerPrecision.microseconds", true);
 pref("services.sync.prefs.sync.privacy.resistFingerprinting.reduceTimerPrecision.jitter", true);
 pref("services.sync.prefs.sync.security.OCSP.enabled", true);
--- a/browser/base/content/test/static/browser_misused_characters_in_strings.js
+++ b/browser/base/content/test/static/browser_misused_characters_in_strings.js
@@ -152,20 +152,16 @@ let gWhitelist = [{
     file: "pocket.properties",
     key: "tos",
     type: "double-quote",
   }, {
     file: "aboutNetworking.dtd",
     key: "aboutNetworking.logTutorial",
     type: "single-quote",
   }, {
-    file: "aboutdevtools.dtd",
-    key: "aboutDevtools.newsletter.privacy.label",
-    type: "single-quote",
-  }, {
     file: "browser.dtd",
     key: "addonPostInstallMessage.label",
     type: "single-quote",
   },
 ];
 
 /**
  * Check if an error should be ignored due to matching one of the whitelist
--- a/browser/config/mozconfigs/win32/mingwclang
+++ b/browser/config/mozconfigs/win32/mingwclang
@@ -30,19 +30,16 @@ ac_add_options --target=i686-w64-mingw32
 ac_add_options --with-toolchain-prefix=i686-w64-mingw32-
 
 ac_add_options --disable-warnings-as-errors
 MOZ_COPY_PDBS=1
 
 # Temporary config settings until we get these working on mingw
 ac_add_options --disable-accessibility # https://sourceforge.net/p/mingw-w64/bugs/648/
 
-# For now, we'll disable the sandbox, until we get get Bug 1461421 figured out
-ac_add_options --disable-sandbox
-
 # These aren't supported on mingw at this time
 ac_add_options --disable-maintenance-service
 ac_add_options --disable-webrtc # Bug 1393901
 ac_add_options --disable-geckodriver # Bug 1489320
 
 # Find our toolchain
 HOST_CC="$TOOLTOOL_DIR/clang/bin/clang"
 HOST_CXX="$TOOLTOOL_DIR/clang/bin/clang++"
--- a/browser/config/mozconfigs/win64/mingwclang
+++ b/browser/config/mozconfigs/win64/mingwclang
@@ -30,19 +30,16 @@ ac_add_options --target=x86_64-w64-mingw
 ac_add_options --with-toolchain-prefix=x86_64-w64-mingw32-
 
 ac_add_options --disable-warnings-as-errors
 MOZ_COPY_PDBS=1
 
 # Temporary config settings until we get these working on mingw
 ac_add_options --disable-accessibility # https://sourceforge.net/p/mingw-w64/bugs/648/
 
-# For now, we'll disable the sandbox, until we get get Bug 1461421 figured out
-ac_add_options --disable-sandbox
-
 # These aren't supported on mingw at this time
 ac_add_options --disable-maintenance-service
 ac_add_options --disable-webrtc # Bug 1393901
 ac_add_options --disable-geckodriver # Bug 1489320
 
 # Find our toolchain
 HOST_CC="$TOOLTOOL_DIR/clang/bin/clang"
 HOST_CXX="$TOOLTOOL_DIR/clang/bin/clang++"
--- a/build/build-clang/clang-win64.json
+++ b/build/build-clang/clang-win64.json
@@ -15,11 +15,12 @@
     "ml": "ml64.exe",
     "patches": [
       "workaround-issue38586.patch",
       "r342649-hotpatch-8-byte-nops.patch",
       "r342652-unpoison-thread-stacks.patch",
       "r343123-pin-asan-dll.patch",
       "aarch64-vastart-checking.patch",
       "downgrade-mangling-error.patch",
+      "r346300-compiler-rt-windows-mmap.patch",
       "loosen-msvc-detection.patch"
     ]
 }
new file mode 100644
--- /dev/null
+++ b/build/build-clang/r346300-compiler-rt-windows-mmap.patch
@@ -0,0 +1,149 @@
+From 0b881f23c6f2a637ab97d71e964cc3743fef98b8 Mon Sep 17 00:00:00 2001
+From: Marco Castelluccio <mcastelluccio@mozilla.com>
+Date: Wed, 7 Nov 2018 09:38:26 +0000
+Subject: [PATCH] [GCOV] Close file mapping handle on Windows, so flushed gcda
+ files can be removed while the process is in execution
+
+git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@346300 91177308-0d34-0410-b5e6-96231b3b80d8
+---
+ lib/profile/GCDAProfiling.c                   | 49 +++++++++++++++++++
+ lib/profile/WindowsMMap.c                     |  8 ---
+ lib/profile/WindowsMMap.h                     |  8 +++
+ .../instrprof-gcov-__gcov_flush-multiple.c    | 16 ++++++
+ ...nstrprof-gcov-__gcov_flush-multiple.c.gcov | 21 ++++++++
+ .../instrprof-gcov-__gcov_flush-multiple.test | 10 ++++
+ 6 files changed, 104 insertions(+), 8 deletions(-)
+ create mode 100644 test/profile/Inputs/instrprof-gcov-__gcov_flush-multiple.c
+ create mode 100644 test/profile/Inputs/instrprof-gcov-__gcov_flush-multiple.c.gcov
+ create mode 100644 test/profile/instrprof-gcov-__gcov_flush-multiple.test
+
+diff --git a/compiler-rt/lib/profile/GCDAProfiling.c b/compiler-rt/lib/profile/GCDAProfiling.c
+index cbca36551..0665a680c 100644
+--- a/compiler-rt/lib/profile/GCDAProfiling.c
++++ b/compiler-rt/lib/profile/GCDAProfiling.c
+@@ -29,6 +29,8 @@
+ #include <string.h>
+ 
+ #if defined(_WIN32)
++#define WIN32_LEAN_AND_MEAN
++#include <windows.h>
+ #include "WindowsMMap.h"
+ #else
+ #include <sys/mman.h>
+@@ -86,6 +88,9 @@ static uint64_t cur_buffer_size = 0;
+ static uint64_t cur_pos = 0;
+ static uint64_t file_size = 0;
+ static int new_file = 0;
++#if defined(_WIN32)
++static HANDLE mmap_handle = NULL;
++#endif
+ static int fd = -1;
+ 
+ typedef void (*fn_ptr)();
+@@ -255,6 +260,28 @@ static int map_file() {
+   if (file_size == 0)
+     return -1;
+ 
++#if defined(_WIN32)
++  HANDLE mmap_fd;
++  if (fd == -1)
++    mmap_fd = INVALID_HANDLE_VALUE;
++  else
++    mmap_fd = (HANDLE)_get_osfhandle(fd);
++
++  mmap_handle = CreateFileMapping(mmap_fd, NULL, PAGE_READWRITE, DWORD_HI(file_size), DWORD_LO(file_size), NULL);
++  if (mmap_handle == NULL) {
++    fprintf(stderr, "profiling: %s: cannot create file mapping: %d\n", filename,
++            GetLastError());
++    return -1;
++  }
++
++  write_buffer = MapViewOfFile(mmap_handle, FILE_MAP_WRITE, 0, 0, file_size);
++  if (write_buffer == NULL) {
++    fprintf(stderr, "profiling: %s: cannot map: %d\n", filename,
++            GetLastError());
++    CloseHandle(mmap_handle);
++    return -1;
++  }
++#else
+   write_buffer = mmap(0, file_size, PROT_READ | PROT_WRITE,
+                       MAP_FILE | MAP_SHARED, fd, 0);
+   if (write_buffer == (void *)-1) {
+@@ -263,10 +290,30 @@ static int map_file() {
+             strerror(errnum));
+     return -1;
+   }
++#endif
++
+   return 0;
+ }
+ 
+ static void unmap_file() {
++#if defined(_WIN32)
++  if (!FlushViewOfFile(write_buffer, file_size)) {
++    fprintf(stderr, "profiling: %s: cannot flush mapped view: %d\n", filename,
++            GetLastError());
++  }
++
++  if (!UnmapViewOfFile(write_buffer)) {
++    fprintf(stderr, "profiling: %s: cannot unmap mapped view: %d\n", filename,
++            GetLastError());
++  }
++
++  if (!CloseHandle(mmap_handle)) {
++    fprintf(stderr, "profiling: %s: cannot close file mapping handle: %d\n", filename,
++            GetLastError());
++  }
++
++  mmap_handle = NULL;
++#else
+   if (msync(write_buffer, file_size, MS_SYNC) == -1) {
+     int errnum = errno;
+     fprintf(stderr, "profiling: %s: cannot msync: %s\n", filename,
+@@ -277,6 +324,8 @@ static void unmap_file() {
+    * is written and we don't care.
+    */
+   (void)munmap(write_buffer, file_size);
++#endif
++
+   write_buffer = NULL;
+   file_size = 0;
+ }
+diff --git a/compiler-rt/lib/profile/WindowsMMap.c b/compiler-rt/lib/profile/WindowsMMap.c
+index dc87a888a..41cc67f41 100644
+--- a/compiler-rt/lib/profile/WindowsMMap.c
++++ b/compiler-rt/lib/profile/WindowsMMap.c
+@@ -24,14 +24,6 @@
+ 
+ #include "InstrProfiling.h"
+ 
+-#ifdef __USE_FILE_OFFSET64
+-# define DWORD_HI(x) (x >> 32)
+-# define DWORD_LO(x) ((x) & 0xffffffff)
+-#else
+-# define DWORD_HI(x) (0)
+-# define DWORD_LO(x) (x)
+-#endif
+-
+ COMPILER_RT_VISIBILITY
+ void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset)
+ {
+diff --git a/compiler-rt/lib/profile/WindowsMMap.h b/compiler-rt/lib/profile/WindowsMMap.h
+index ac2c911c8..51a130b31 100644
+--- a/compiler-rt/lib/profile/WindowsMMap.h
++++ b/compiler-rt/lib/profile/WindowsMMap.h
+@@ -45,6 +45,14 @@
+ #define   LOCK_NB   4    /* don't block when locking */
+ #define   LOCK_UN   8    /* unlock */
+ 
++#ifdef __USE_FILE_OFFSET64
++# define DWORD_HI(x) (x >> 32)
++# define DWORD_LO(x) ((x) & 0xffffffff)
++#else
++# define DWORD_HI(x) (0)
++# define DWORD_LO(x) (x)
++#endif
++
+ void *mmap(void *start, size_t length, int prot, int flags, int fd,
+            off_t offset);
+ 
--- a/devtools/client/responsive.html/reducers/viewports.js
+++ b/devtools/client/responsive.html/reducers/viewports.js
@@ -118,20 +118,26 @@ const reducers = {
   },
 
   [ROTATE_VIEWPORT](viewports, { id }) {
     return viewports.map(viewport => {
       if (viewport.id !== id) {
         return viewport;
       }
 
+      const height = viewport.width;
+      const width = viewport.height;
+
+      Services.prefs.setIntPref(VIEWPORT_WIDTH_PREF, width);
+      Services.prefs.setIntPref(VIEWPORT_HEIGHT_PREF, height);
+
       return {
         ...viewport,
-        height: viewport.width,
-        width: viewport.height,
+        height,
+        width,
       };
     });
   },
 
 };
 
 module.exports = function(viewports = INITIAL_VIEWPORTS, action) {
   const reducer = reducers[action.type];
--- a/devtools/startup/aboutdevtools/aboutdevtools.js
+++ b/devtools/startup/aboutdevtools/aboutdevtools.js
@@ -26,19 +26,16 @@ const MESSAGES = {
 };
 
 // Google analytics parameters that should be added to all outgoing links.
 const GA_PARAMETERS = [
   ["utm_source", "devtools"],
   ["utm_medium", "onboarding"],
 ];
 
-const ABOUTDEVTOOLS_STRINGS = "chrome://devtools-startup/locale/aboutdevtools.properties";
-const aboutDevtoolsBundle = Services.strings.createBundle(ABOUTDEVTOOLS_STRINGS);
-
 const KEY_SHORTCUTS_STRINGS = "chrome://devtools-startup/locale/key-shortcuts.properties";
 const keyShortcutsBundle = Services.strings.createBundle(KEY_SHORTCUTS_STRINGS);
 
 // URL constructor doesn't support about: scheme,
 // we have to use http in order to have working searchParams.
 const url = new URL(window.location.href.replace("about:", "http://"));
 const reason = url.searchParams.get("reason");
 const keyid = url.searchParams.get("keyid");
@@ -78,102 +75,99 @@ function updatePage() {
     installPage.removeAttribute("hidden");
   }
 }
 
 /**
  * Array of descriptors for features displayed on about:devtools.
  * Each feature should contain:
  * - icon: the name of the image to use
- * - title: the key of the localized title (from aboutdevtools.properties)
- * - desc: the key of the localized description (from aboutdevtools.properties)
+ * - title: the key of the localized title (from aboutDevTools.ftl)
+ * - desc: the key of the localized description (from aboutDevTools.ftl)
  * - link: the MDN documentation link
  */
 const features = [
   {
     icon: "chrome://devtools-startup/content/aboutdevtools/images/feature-inspector.svg",
-    title: "features.inspector.title",
-    desc: "features.inspector.desc",
+    title: "features-inspector-title",
+    desc: "features-inspector-desc",
     link: "https://developer.mozilla.org/docs/Tools/Page_Inspector",
   }, {
     icon: "chrome://devtools-startup/content/aboutdevtools/images/feature-console.svg",
-    title: "features.console.title",
-    desc: "features.console.desc",
+    title: "features-console-title",
+    desc: "features-console-desc",
     link: "https://developer.mozilla.org/docs/Tools/Web_Console",
   }, {
     icon: "chrome://devtools-startup/content/aboutdevtools/images/feature-debugger.svg",
-    title: "features.debugger.title",
-    desc: "features.debugger.desc",
+    title: "features-debugger-title",
+    desc: "features-debugger-desc",
     link: "https://developer.mozilla.org/docs/Tools/Debugger",
   }, {
     icon: "chrome://devtools-startup/content/aboutdevtools/images/feature-network.svg",
-    title: "features.network.title",
-    desc: "features.network.desc",
+    title: "features-network-title",
+    desc: "features-network-desc",
     link: "https://developer.mozilla.org/docs/Tools/Network_Monitor",
   }, {
     icon: "chrome://devtools-startup/content/aboutdevtools/images/feature-storage.svg",
-    title: "features.storage.title",
-    desc: "features.storage.desc",
+    title: "features-storage-title",
+    desc: "features-storage-desc",
     link: "https://developer.mozilla.org/docs/Tools/Storage_Inspector",
   }, {
     icon: "chrome://devtools-startup/content/aboutdevtools/images/feature-responsive.svg",
-    title: "features.responsive.title",
-    desc: "features.responsive.desc",
+    title: "features-responsive-title",
+    desc: "features-responsive-desc",
     link: "https://developer.mozilla.org/docs/Tools/Responsive_Design_Mode",
   }, {
     icon: "chrome://devtools-startup/content/aboutdevtools/images/feature-visualediting.svg",
-    title: "features.visualediting.title",
-    desc: "features.visualediting.desc",
+    title: "features-visual-editing-title",
+    desc: "features-visual-editing-desc",
     link: "https://developer.mozilla.org/docs/Tools/Style_Editor",
   }, {
     icon: "chrome://devtools-startup/content/aboutdevtools/images/feature-performance.svg",
-    title: "features.performance.title",
-    desc: "features.performance.desc",
+    title: "features-performance-title",
+    desc: "features-performance-desc",
     link: "https://developer.mozilla.org/docs/Tools/Performance",
   }, {
     icon: "chrome://devtools-startup/content/aboutdevtools/images/feature-memory.svg",
-    title: "features.memory.title",
-    desc: "features.memory.desc",
+    title: "features-memory-title",
+    desc: "features-memory-desc",
     link: "https://developer.mozilla.org/docs/Tools/Memory",
   },
 ];
 
 /**
  * Helper to create a DOM element to represent a DevTools feature.
  */
 function createFeatureEl(feature) {
   const li = document.createElement("li");
   li.classList.add("feature");
-  const learnMore = aboutDevtoolsBundle.GetStringFromName("features.learnMore");
 
-  let {icon, link, title, desc} = feature;
-  title = aboutDevtoolsBundle.GetStringFromName(title);
-  desc = aboutDevtoolsBundle.GetStringFromName(desc);
+  const {icon, link, title, desc} = feature;
   // eslint-disable-next-line no-unsanitized/property
   li.innerHTML =
     `<a class="feature-link" href="${link}" target="_blank">
        <img class="feature-icon" src="${icon}"/>
      </a>
-     <h3 class="feature-name">${title}</h3>
-     <p class="feature-desc">
-       ${desc}
-       <a class="external feature-link" href="${link}" target="_blank">${learnMore}</a>
+     <h3 class="feature-name" data-l10n-id="${title}"></h3>
+     <p class="feature-desc" data-l10n-id="${desc}">
+       <a class="external feature-link" href="${link}"
+          target="_blank" data-l10n-name="learn-more"></a>
      </p>`;
 
   return li;
 }
 
 window.addEventListener("load", function() {
   const inspectorShortcut = getToolboxShortcut();
   const welcomeMessage = document.getElementById("welcome-message");
 
-  // Set the welcome message content with the correct keyboard sortcut for the current
+  // Set the welcome message content with the correct keyboard shortcut for the current
   // platform.
-  welcomeMessage.textContent = aboutDevtoolsBundle.formatStringFromName("welcome.message",
-    [inspectorShortcut], 1);
+  document.l10n.setAttributes(welcomeMessage, "welcome-message",
+                             { shortcut: inspectorShortcut });
 
   // Set the appropriate title message.
   if (reason == "ContextMenu") {
     document.getElementById("inspect-title").removeAttribute("hidden");
   } else {
     document.getElementById("common-title").removeAttribute("hidden");
   }
 
--- a/devtools/startup/aboutdevtools/aboutdevtools.xhtml
+++ b/devtools/startup/aboutdevtools/aboutdevtools.xhtml
@@ -1,105 +1,107 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!-- This Source Code Form is subject to the terms of the Mozilla Public
    - License, v. 2.0. If a copy of the MPL was not distributed with this
    - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
 <!DOCTYPE html [
 <!ENTITY % htmlDTD PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "DTD/xhtml1-strict.dtd"> %htmlDTD;
 <!ENTITY % globalDTD SYSTEM "chrome://global/locale/global.dtd"> %globalDTD;
-<!ENTITY % aboutdevtoolsDTD SYSTEM "chrome://devtools-startup/locale/aboutdevtools.dtd"> %aboutdevtoolsDTD;
 ]>
 
 <html xmlns="http://www.w3.org/1999/xhtml" dir="&locale.dir;">
 <head>
-  <title>&aboutDevtools.headTitle;</title>
+  <title data-l10n-id="head-title"></title>
   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>a
   <link rel="stylesheet" href="chrome://global/skin/in-content/common.css" type="text/css"/>
   <link rel="stylesheet" href="chrome://devtools-startup/content/aboutdevtools/aboutdevtools.css"  type="text/css"/>
   <link rel="stylesheet" href="chrome://devtools-startup/content/aboutdevtools/subscribe.css"  type="text/css"/>
   <script type="application/javascript" src="chrome://devtools-startup/content/aboutdevtools/aboutdevtools.js"></script>
   <script type="application/javascript" src="chrome://devtools-startup/content/aboutdevtools/subscribe.js"></script>
+  <link rel="localization" href="startup/aboutDevTools.ftl" />
 </head>
 <body>
   <div id="install-page" class="wrapper" hidden="true">
     <div class="box">
       <div class="left-pane" />
       <div class="right-pane">
-        <h1 class="title" id="common-title" hidden="true">&aboutDevtools.enable.title;</h1>
-        <h1 class="title" id="inspect-title" hidden="true">&aboutDevtools.enable.inspectElementTitle;</h1>
+        <h1 class="title" id="common-title" hidden="true" data-l10n-id="enable-title"></h1>
+        <h1 class="title" id="inspect-title" hidden="true" data-l10n-id="enable-inspect-element-title"></h1>
 
         <!-- Include all the possible message, hidden by default
              as we can't lazily load localized strings from dtd -->
-        <p id="about-debugging-message" hidden="true">&aboutDevtools.enable.aboutDebuggingMessage;</p>
-        <p id="menu-message" hidden="true">&aboutDevtools.enable.menuMessage2;</p>
-        <p id="key-shortcut-message" hidden="true">&aboutDevtools.enable.keyShortcutMessage;</p>
-        <p id="inspect-element-message" hidden="true">&aboutDevtools.enable.inspectElementMessage;</p>
+        <p id="about-debugging-message" hidden="true" data-l10n-id="enable-about-debugging-message"></p>
+        <p id="menu-message" hidden="true" data-l10n-id="enable-menu-message"></p>
+        <p id="key-shortcut-message" hidden="true" data-l10n-id="enable-key-shortcut-message"></p>
+        <p id="inspect-element-message" hidden="true" data-l10n-id="enable-inspect-element-message"></p>
 
-        <p>&aboutDevtools.enable.commonMessage;</p>
-        <a class="external installpage-link" href="https://developer.mozilla.org/docs/Tools" target="_blank">&aboutDevtools.enable.learnMoreLink;</a>
+        <p data-l10n-id="enable-common-message"></p>
+        <a class="external installpage-link" href="https://developer.mozilla.org/docs/Tools" target="_blank" data-l10n-id="enable-learn-more-link"></a>
         <div class="buttons-container">
-          <button class="primary-button" id="install">&aboutDevtools.enable.enableButton;</button>
-          <button class="default-button" id="close">&aboutDevtools.enable.closeButton2;</button>
+          <button class="primary-button" id="install" data-l10n-id="enable-enable-button"></button>
+          <button class="default-button" id="close" data-l10n-id="enable-close-button"></button>
         </div>
       </div>
     </div>
   </div>
 
   <!-- This page, hidden by default is displayed once the add-on is installed -->
   <div id="welcome-page" class="wrapper" hidden="true">
     <div class="box">
       <div class="left-pane" />
       <div class="right-pane">
-        <h1 class="title" >&aboutDevtools.welcome.title;</h1>
+        <h1 class="title" data-l10n-id="welcome-title"></h1>
         <!-- The welcome message is dynamically updated with a keyboard shortcut at
              runtime and added in aboutdevtools.js -->
         <p id="welcome-message"></p>
 
         <!-- Form dedicated to the newsletter subscription -->
         <div class="newsletter">
-          <h2 class="newsletter-title">&aboutDevtools.newsletter.title;</h2>
-          <p>&aboutDevtools.newsletter.message;</p>
+          <h2 class="newsletter-title" data-l10n-id="newsletter-title"></h2>
+          <p data-l10n-id="newsletter-message"></p>
 
           <form id="newsletter-form" name="newsletter-form" action="https://www.mozilla.org/en-US/newsletter/" method="post">
             <!-- "H" stands for the HTML format (->fmt). Alternative is T for text. -->
             <input type="hidden" id="fmt" name="fmt" value="H" />
             <!-- "app-dev" is the id of the Mozilla Developper newsletter -->
             <input type="hidden" id="newsletters" name="newsletters" value="app-dev" />
             <div id="newsletter-errors"></div>
             <section id="newsletter-email" class="newsletter-form-section">
-              <input type="email" id="email" name="email" required="true" placeholder="&aboutDevtools.newsletter.email.placeholder;" />
+              <input type="email" id="email" name="email" required="true" data-l10n-id="newsletter-email-placeholder" data-l10n-attrs="placeholder" />
             </section>
 
             <section id="newsletter-privacy" class="newsletter-form-section">
               <input type="checkbox" id="privacy" name="privacy" required="true" />
-              <label for="privacy">&aboutDevtools.newsletter.privacy.label;</label>
+              <label for="privacy" data-l10n-id="newsletter-privacy-label">
+                <a class="external" href="https://www.mozilla.org/privacy/" data-l10n-name="privacy-policy"></a>
+              </label>
             </section>
-            <button type="submit" id="newsletter-submit" class="primary-button">&aboutDevtools.newsletter.subscribeButton;</button>
+            <button type="submit" id="newsletter-submit" class="primary-button" data-l10n-id="newsletter-subscribe-button"></button>
           </form>
           <div id="newsletter-thanks">
-            <h2 class="newsletter-title">&aboutDevtools.newsletter.thanks.title;</h2>
-            <p>&aboutDevtools.newsletter.thanks.message;</p>
+            <h2 class="newsletter-title" data-l10n-id="newsletter-thanks-title"></h2>
+            <p data-l10n-id="newsletter-thanks-message"></p>
           </div>
         </div>
       </div>
     </div>
 
     <div class="features">
       <ul class="features-list">
       </ul>
     </div>
 
     <footer>
       <img class="dev-edition-logo"
            src="chrome://devtools-startup/content/aboutdevtools/images/dev-edition-logo.svg"
            alt="Firefox Developer Edition logo"/>
       <div class="footer-message">
-        <h1 class="footer-message-title">&aboutDevtools.footer.title;</h1>
-        <p>&aboutDevtools.footer.message;</p>
+        <h1 class="footer-message-title" data-l10n-id="footer-title"></h1>
+        <p data-l10n-id="footer-message"></p>
         <a class="external footer-link"
            href="https://www.mozilla.org/firefox/developer/"
-           target="_blank">&aboutDevtools.footer.learnMoreLink;</a>
+           target="_blank" data-l10n-id="footer-learn-more-link"></a>
       </div>
     </footer>
   </div>
 
 </body>
 </html>
new file mode 100644
--- /dev/null
+++ b/devtools/startup/locales/en-US/aboutDevTools.ftl
@@ -0,0 +1,52 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+head-title = About Developer Tools
+enable-title = Enable Firefox Developer Tools
+enable-inspect-element-title = Enable Firefox Developer Tools to use Inspect Element
+enable-inspect-element-message = Examine and edit HTML and CSS with the Developer Tools’ Inspector.
+enable-about-debugging-message = Develop and debug WebExtensions, web workers, service workers and more with Firefox Developer Tools.
+enable-key-shortcut-message = You activated a Developer Tools shortcut. If that was a mistake, you can close this Tab.
+enable-menu-message = Perfect your website’s HTML, CSS, and JavaScript with tools like Inspector and Debugger.
+enable-common-message = Firefox Developer Tools are disabled by default to give you more control over your browser.
+enable-learn-more-link = Learn more about Developer Tools
+enable-enable-button = Enable Developer Tools
+enable-close-button = Close this Tab
+
+welcome-title = Welcome to Firefox Developer Tools!
+newsletter-title = Mozilla Developer Newsletter
+newsletter-message = Get developer news, tricks and resources sent straight to your inbox.
+newsletter-email-placeholder =
+    .placeholder = Email
+newsletter-privacy-label = I’m okay with Mozilla handling my info as explained in this <a data-l10n-name="privacy-policy">Privacy Policy</a>.
+newsletter-subscribe-button = Subscribe
+newsletter-thanks-title = Thanks!
+newsletter-thanks-message = If you haven’t previously confirmed a subscription to a Mozilla-related newsletter you may have to do so. Please check your inbox or your spam filter for an email from us.
+
+footer-title = Firefox Developer Edition
+footer-message = Looking for more than just Developer Tools? Check out the Firefox browser that is built specifically for developers and modern workflows.
+footer-learn-more-link = Learn more
+
+features-learn-more = Learn more
+features-inspector-title = Inspector
+features-inspector-desc = Inspect and refine code to build pixel-perfect layouts. <a data-l10n-name="learn-more">{ features-learn-more }</a>
+features-console-title = Console
+features-console-desc = Track CSS, JavaScript, security and network issues. <a data-l10n-name="learn-more">{ features-learn-more }</a>
+features-debugger-title = Debugger
+features-debugger-desc = Powerful JavaScript debugger with support for your framework. <a data-l10n-name="learn-more">{ features-learn-more }</a>
+features-network-title = Network
+features-network-desc = Monitor network requests that can slow or block your site. <a data-l10n-name="learn-more">{ features-learn-more }</a>
+features-storage-title = Storage
+features-storage-desc = Add, modify and remove cache, cookies, databases and session data. <a data-l10n-name="learn-more">{ features-learn-more }</a>
+features-responsive-title = Responsive Design Mode
+features-responsive-desc = Test sites on emulated devices in your browser. <a data-l10n-name="learn-more">{ features-learn-more }</a>
+features-visual-editing-title = Visual Editing
+features-visual-editing-desc = Fine-tune animations, alignment and padding. <a data-l10n-name="learn-more">{ features-learn-more }</a>
+features-performance-title = Performance
+features-performance-desc = Unblock bottlenecks, streamline processes, optimize assets. <a data-l10n-name="learn-more">{ features-learn-more }</a>
+features-memory-title = Memory
+features-memory-desc = Find memory leaks and make your application zippy. <a data-l10n-name="learn-more">{ features-learn-more }</a>
+# Variables:
+#   $shortcut (String) - The keyboard shortcut used for the tool
+welcome-message = You’ve successfully enabled Developer Tools! To get started, explore the Web Developer menu or open the tools with { $shortcut }.
deleted file mode 100644
--- a/devtools/startup/locales/en-US/aboutdevtools.dtd
+++ /dev/null
@@ -1,78 +0,0 @@
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-<!-- LOCALIZATION NOTE : This file contains the strings used in aboutdevtools.xhtml,
-  -  displayed when going to about:devtools. UI depends on the value of the preference
-  -  "devtools.enabled".
-  -
-  -  "aboutDevtools.enable.*" and "aboutDevtools.newsletter.*" keys are used when DevTools
-     are disabled
-  -  "aboutDevtools.welcome.*" keys are used when DevTools are enabled
-  - -->
-
-<!-- LOCALIZATION NOTE (aboutDevtools.headTitle): Text of the title tag for about:devtools -->
-<!ENTITY  aboutDevtools.headTitle "About Developer Tools">
-
-<!-- LOCALIZATION NOTE (aboutDevtools.enable.title): Title of the top about:devtools
-  -  section displayed when DevTools are disabled. -->
-<!ENTITY  aboutDevtools.enable.title "Enable Firefox Developer Tools">
-
-<!-- LOCALIZATION NOTE (aboutDevtools.enable.inspectElementTitle): Title of the top
-  -  section displayed when devtools are disabled and the user triggered DevTools by using
-  -  the Inspect Element menu item. -->
-<!ENTITY  aboutDevtools.enable.inspectElementTitle "Enable Firefox Developer Tools to use Inspect Element">
-
-<!-- LOCALIZATION NOTE (aboutDevtools.enable.inspectElementMessage): Message displayed
-  -  when users come from using the Inspect Element menu item. -->
-<!ENTITY  aboutDevtools.enable.inspectElementMessage
-          "Examine and edit HTML and CSS with the Developer Tools’ Inspector.">
-
-<!-- LOCALIZATION NOTE (aboutDevtools.enable.aboutDebuggingMessage): Message displayed
-  -  when users come from about:debugging. -->
-<!ENTITY  aboutDevtools.enable.aboutDebuggingMessage
-          "Develop and debug WebExtensions, web workers, service workers and more with Firefox Developer Tools.">
-
-<!-- LOCALIZATION NOTE (aboutDevtools.enable.keyShortcutMessage): Message displayed when
-  -  users pressed a DevTools key shortcut. -->
-<!ENTITY  aboutDevtools.enable.keyShortcutMessage
-          "You activated a Developer Tools shortcut. If that was a mistake, you can close this Tab.">
-
-<!-- LOCALIZATION NOTE (aboutDevtools.enable.menuMessage2): Message displayed when users
-  -  clicked on a "Enable Developer Tools" menu item. -->
-<!ENTITY  aboutDevtools.enable.menuMessage2
-          "Perfect your website’s HTML, CSS, and JavaScript with tools like Inspector and Debugger.">
-
-<!-- LOCALIZATION NOTE (aboutDevtools.enable.commonMessage): Generic message displayed for
-  -  all possible entry points (keyshortcut, menu item etc…). -->
-<!ENTITY  aboutDevtools.enable.commonMessage
-          "Firefox Developer Tools are disabled by default to give you more control over your browser.">
-
-<!-- LOCALIZATION NOTE (aboutDevtools.enable.learnMoreLink): Text for the link to
-  -  https://developer.mozilla.org/docs/Tools displayed in the top section when DevTools
-  -  are disabled. -->
-<!ENTITY  aboutDevtools.enable.learnMoreLink "Learn more about Developer Tools">
-
-<!ENTITY  aboutDevtools.enable.enableButton "Enable Developer Tools">
-<!ENTITY  aboutDevtools.enable.closeButton2 "Close this Tab">
-
-<!ENTITY  aboutDevtools.welcome.title "Welcome to Firefox Developer Tools!">
-
-<!ENTITY  aboutDevtools.newsletter.title "Mozilla Developer Newsletter">
-<!-- LOCALIZATION NOTE (aboutDevtools.newsletter.message): Subscribe form message.
-  -  The newsletter is only available in english at the moment.
-  -  See Bug 1415273 for support of additional languages.-->
-<!ENTITY  aboutDevtools.newsletter.message "Get developer news, tricks and resources sent straight to your inbox.">
-<!ENTITY  aboutDevtools.newsletter.email.placeholder "Email">
-<!ENTITY  aboutDevtools.newsletter.privacy.label "I’m okay with Mozilla handling my info as explained in this <a class='external' href='https://www.mozilla.org/privacy/'>Privacy Policy</a>.">
-<!ENTITY  aboutDevtools.newsletter.subscribeButton "Subscribe">
-<!ENTITY  aboutDevtools.newsletter.thanks.title "Thanks!">
-<!ENTITY  aboutDevtools.newsletter.thanks.message "If you haven’t previously confirmed a subscription to a Mozilla-related newsletter you may have to do so. Please check your inbox or your spam filter for an email from us.">
-
-<!ENTITY  aboutDevtools.footer.title "Firefox Developer Edition">
-<!ENTITY  aboutDevtools.footer.message "Looking for more than just Developer Tools? Check out the Firefox browser that is built specifically for developers and modern workflows.">
-
-<!-- LOCALIZATION NOTE (aboutDevtools.footer.learnMoreLink): Text for the link to
-  -  https://www.mozilla.org/firefox/developer/ displayed in the footer. -->
-<!ENTITY  aboutDevtools.footer.learnMoreLink "Learn more">
-
--- a/devtools/startup/locales/en-US/aboutdevtools.properties
+++ b/devtools/startup/locales/en-US/aboutdevtools.properties
@@ -1,54 +1,18 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 # LOCALIZATION NOTE These strings are used in the about:devtools page.
 
-# LOCALIZATION NOTE (features.learnMore): The text of the learn more link displayed below
-# each feature section of about:devtools. Each section presents a quick description of a
-# DevTools panel/feature. The learn more link points to the associated MDN page.
-features.learnMore=Learn more
-
-features.inspector.title=Inspector
-features.inspector.desc=Inspect and refine code to build pixel-perfect layouts.
-
-features.console.title=Console
-features.console.desc=Track CSS, JavaScript, security and network issues.
-
-features.debugger.title=Debugger
-features.debugger.desc=Powerful JavaScript debugger with support for your framework.
-
-features.network.title=Network
-features.network.desc=Monitor network requests that can slow or block your site.
-
-features.storage.title=Storage
-features.storage.desc=Add, modify and remove cache, cookies, databases and session data.
-
-features.responsive.title=Responsive Design Mode
-features.responsive.desc=Test sites on emulated devices in your browser.
-
-features.visualediting.title=Visual Editing
-features.visualediting.desc=Fine-tune animations, alignment and padding.
-
-features.performance.title=Performance
-features.performance.desc=Unblock bottlenecks, streamline processes, optimize assets.
-
-features.memory.title=Memory
-features.memory.desc=Find memory leaks and make your application zippy.
-
 # LOCALIZATION NOTE (newsletter.error.common): error text displayed when the newsletter
 # subscription failed. The argument will be replaced with request's status code and status
 # text (e.g. "404 - Not Found")
 newsletter.error.common=Subscription request failed (%S).
 
 # LOCALIZATION NOTE (newsletter.error.unknown): error text displayed when the newsletter
 # subscription failed for an unexpected reason.
 newsletter.error.unknown=An unexpected error occurred.
 
 # LOCALIZATION NOTE (newsletter.error.timeout): error text displayed when the newsletter
 # subscription timed out.
 newsletter.error.timeout=Subscription request timed out.
-
-# LOCALIZATION NOTE (welcome.message): Message displayed when devtools are enabled.
-# %S will be replaced with the shortcut to toggle the DevTools toolbox.
-welcome.message=You’ve successfully enabled Developer Tools! To get started, explore the Web Developer menu or open the tools with %S.
--- a/devtools/startup/locales/jar.mn
+++ b/devtools/startup/locales/jar.mn
@@ -1,8 +1,12 @@
 #filter substitution
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
+[localization] @AB_CD@.jar:
+    startup                         (%*.ftl)
+
 @AB_CD@.jar:
 %   locale devtools-startup @AB_CD@ %locale/@AB_CD@/devtools/startup/
-    locale/@AB_CD@/devtools/startup/ (%*)
+    locale/@AB_CD@/devtools/startup/ (%*.dtd)
+    locale/@AB_CD@/devtools/startup/ (%*.properties)
--- a/dom/html/HTMLOptionsCollection.cpp
+++ b/dom/html/HTMLOptionsCollection.cpp
@@ -27,33 +27,18 @@
 #include "nsServiceManagerUtils.h"
 #include "nsStyleConsts.h"
 #include "jsfriendapi.h"
 
 namespace mozilla {
 namespace dom {
 
 HTMLOptionsCollection::HTMLOptionsCollection(HTMLSelectElement* aSelect)
-{
-  // Do not maintain a reference counted reference. When
-  // the select goes away, it will let us know.
-  mSelect = aSelect;
-}
-
-HTMLOptionsCollection::~HTMLOptionsCollection()
-{
-  DropReference();
-}
-
-void
-HTMLOptionsCollection::DropReference()
-{
-  // Drop our (non ref-counted) reference
-  mSelect = nullptr;
-}
+  : mSelect(aSelect)
+{}
 
 nsresult
 HTMLOptionsCollection::GetOptionIndex(Element* aOption,
                                       int32_t aStartIndex,
                                       bool aForward,
                                       int32_t* aIndex)
 {
   // NOTE: aIndex shouldn't be set if the returned value isn't NS_OK.
@@ -80,17 +65,19 @@ HTMLOptionsCollection::GetOptionIndex(El
       return NS_OK;
     }
   }
 
   return NS_ERROR_FAILURE;
 }
 
 
-NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(HTMLOptionsCollection, mElements)
+NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(HTMLOptionsCollection,
+                                      mElements,
+                                      mSelect)
 
 // nsISupports
 
 // QueryInterface implementation for HTMLOptionsCollection
 NS_INTERFACE_TABLE_HEAD(HTMLOptionsCollection)
   NS_WRAPPERCACHE_INTERFACE_TABLE_ENTRY
   NS_INTERFACE_TABLE(HTMLOptionsCollection,
                      nsIHTMLCollection)
@@ -110,33 +97,24 @@ uint32_t
 HTMLOptionsCollection::Length()
 {
   return mElements.Length();
 }
 
 void
 HTMLOptionsCollection::SetLength(uint32_t aLength, ErrorResult& aError)
 {
-  if (!mSelect) {
-    aError.Throw(NS_ERROR_UNEXPECTED);
-    return;
-  }
-
   mSelect->SetLength(aLength, aError);
 }
 
 void
 HTMLOptionsCollection::IndexedSetter(uint32_t aIndex,
                                      HTMLOptionElement* aOption,
                                      ErrorResult& aError)
 {
-  if (!mSelect) {
-    return;
-  }
-
   // if the new option is null, just remove this option.  Note that it's safe
   // to pass a too-large aIndex in here.
   if (!aOption) {
     mSelect->Remove(aIndex);
 
     // We're done.
     return;
   }
@@ -170,33 +148,23 @@ HTMLOptionsCollection::IndexedSetter(uin
   }
 
   parent->ReplaceChild(*aOption, *refChild, aError);
 }
 
 int32_t
 HTMLOptionsCollection::GetSelectedIndex(ErrorResult& aError)
 {
-  if (!mSelect) {
-    aError.Throw(NS_ERROR_UNEXPECTED);
-    return 0;
-  }
-
   return mSelect->SelectedIndex();
 }
 
 void
 HTMLOptionsCollection::SetSelectedIndex(int32_t aSelectedIndex,
                                         ErrorResult& aError)
 {
-  if (!mSelect) {
-    aError.Throw(NS_ERROR_UNEXPECTED);
-    return;
-  }
-
   mSelect->SetSelectedIndex(aSelectedIndex, aError);
 }
 
 Element*
 HTMLOptionsCollection::GetElementAt(uint32_t aIndex)
 {
   return ItemAsOption(aIndex);
 }
@@ -265,28 +233,19 @@ HTMLOptionsCollection::GetSupportedNames
   }
 }
 
 void
 HTMLOptionsCollection::Add(const HTMLOptionOrOptGroupElement& aElement,
                            const Nullable<HTMLElementOrLong>& aBefore,
                            ErrorResult& aError)
 {
-  if (!mSelect) {
-    aError.Throw(NS_ERROR_NOT_INITIALIZED);
-    return;
-  }
-
   mSelect->Add(aElement, aBefore, aError);
 }
 
 void
 HTMLOptionsCollection::Remove(int32_t aIndex, ErrorResult& aError)
 {
-  if (!mSelect) {
-    aError.Throw(NS_ERROR_UNEXPECTED);
-    return;
-  }
   mSelect->Remove(aIndex);
 }
 
 } // namespace dom
 } // namespace mozilla
--- a/dom/html/HTMLOptionsCollection.h
+++ b/dom/html/HTMLOptionsCollection.h
@@ -39,17 +39,17 @@ public:
   NS_DECL_CYCLE_COLLECTING_ISUPPORTS
 
   // nsWrapperCache
   using nsWrapperCache::GetWrapperPreserveColor;
   using nsWrapperCache::GetWrapper;
   using nsWrapperCache::PreserveWrapper;
   virtual JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
 protected:
-  virtual ~HTMLOptionsCollection();
+  virtual ~HTMLOptionsCollection() = default;
 
   virtual JSObject* GetWrapperPreserveColorInternal() override
   {
     return nsWrapperCache::GetWrapperPreserveColor();
   }
   virtual void PreserveWrapperInternal(nsISupports* aScriptObjectHolder) override
   {
     nsWrapperCache::PreserveWrapper(aScriptObjectHolder);
@@ -106,21 +106,16 @@ public:
    * Append an option to end of array
    */
   void AppendOption(mozilla::dom::HTMLOptionElement* aOption)
   {
     mElements.AppendElement(aOption);
   }
 
   /**
-   * Drop the reference to the select.  Called during select destruction.
-   */
-  void DropReference();
-
-  /**
    * Finds the index of a given option element.
    * If the option isn't part of the collection, return NS_ERROR_FAILURE
    * without setting aIndex.
    *
    * @param aOption the option to get the index of
    * @param aStartIndex the index to start looking at
    * @param aForward TRUE to look forward, FALSE to look backward
    * @return the option index
@@ -151,15 +146,15 @@ public:
   virtual void GetSupportedNames(nsTArray<nsString>& aNames) override;
   void SetLength(uint32_t aLength, ErrorResult& aError);
 
 private:
   /** The list of options (holds strong references).  This is infallible, so
    * various members such as InsertOptionAt are also infallible. */
   nsTArray<RefPtr<mozilla::dom::HTMLOptionElement> > mElements;
   /** The select element that contains this array */
-  HTMLSelectElement* mSelect;
+  RefPtr<HTMLSelectElement> mSelect;
 };
 
 } // namespace dom
 } // namespace mozilla
 
 #endif // mozilla_dom_HTMLOptionsCollection_h
--- a/dom/html/HTMLSelectElement.cpp
+++ b/dom/html/HTMLSelectElement.cpp
@@ -137,21 +137,16 @@ HTMLSelectElement::HTMLSelectElement(alr
   // otherwise it is
 
   // Set up our default state: enabled, optional, and valid.
   AddStatesSilently(NS_EVENT_STATE_ENABLED |
                     NS_EVENT_STATE_OPTIONAL |
                     NS_EVENT_STATE_VALID);
 }
 
-HTMLSelectElement::~HTMLSelectElement()
-{
-  mOptions->DropReference();
-}
-
 // ISupports
 
 NS_IMPL_CYCLE_COLLECTION_CLASS(HTMLSelectElement)
 
 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(HTMLSelectElement,
                                                   nsGenericHTMLFormElementWithState)
   NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mValidity)
   NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mOptions)
--- a/dom/html/HTMLSelectElement.h
+++ b/dom/html/HTMLSelectElement.h
@@ -386,17 +386,17 @@ public:
 
   void GetPreviewValue(nsAString& aValue)
   {
     aValue = mPreviewValue;
   }
   void SetPreviewValue(const nsAString& aValue);
 
 protected:
-  virtual ~HTMLSelectElement();
+  virtual ~HTMLSelectElement() = default;
 
   friend class SafeOptionListMutation;
 
   // Helper Methods
   /**
    * Check whether the option specified by the index is selected
    * @param aIndex the index
    * @return whether the option at the index is selected
--- a/gfx/skia/skia/src/opts/SkRasterPipeline_opts.h
+++ b/gfx/skia/skia/src/opts/SkRasterPipeline_opts.h
@@ -73,20 +73,20 @@
 #endif
 
 #if defined(__clang__) || defined(__GNUC__)
 #define SK_EXPECT(exp, p) __builtin_expect(exp, p)
 #else
 #define SK_EXPECT(exp, p) (exp)
 #endif
 
-#ifdef __clang__
+#if defined(JUMPER_IS_SCALAR)
+#define SK_CONVERTVECTOR(vec, type) ((type)(vec))
+#elif defined(__clang__)
 #define SK_CONVERTVECTOR(vec, type) __builtin_convertvector(vec, type)
-#elif defined(JUMPER_IS_SCALAR)
-#define SK_CONVERTVECTOR(vec, type) ((type)(vec))
 #else
 template <typename T> struct SkNx_element {};
 template <typename T, int N> struct SkNx_element<SkNx<N,T>> { typedef T type; };
 #define SK_CONVERTVECTOR(vec, vtype) SkNx_cast<typename SkNx_element<vtype>::type>(vec)
 #endif
 
 #ifdef __clang__
 #define SK_VECTORTYPE(type, size) type __attribute__((ext_vector_type(size)))
--- a/gfx/src/nsITheme.h
+++ b/gfx/src/nsITheme.h
@@ -50,68 +50,68 @@ class IpcResourceUpdateQueue;
  *
  * All the methods on nsITheme take a rendering context or device
  * context, a frame (the rendering object), and a widget type (one of
  * the constants in nsThemeConstants.h).
  */
 class nsITheme: public nsISupports {
 protected:
   using LayoutDeviceIntMargin = mozilla::LayoutDeviceIntMargin;
-  using WidgetType = mozilla::StyleAppearance;
+  using StyleAppearance = mozilla::StyleAppearance;
 
 public:
   NS_DECLARE_STATIC_IID_ACCESSOR(NS_ITHEME_IID)
 
   /**
    * Draw the actual theme background.
    * @param aContext the context to draw into
    * @param aFrame the frame for the widget that we're drawing
    * @param aWidgetType the -moz-appearance value to draw
    * @param aRect the rectangle defining the area occupied by the widget
    * @param aDirtyRect the rectangle that needs to be drawn
    */
   NS_IMETHOD DrawWidgetBackground(gfxContext* aContext,
                                   nsIFrame* aFrame,
-                                  WidgetType aWidgetType,
+                                  StyleAppearance aWidgetType,
                                   const nsRect& aRect,
                                   const nsRect& aDirtyRect) = 0;
 
   /**
    * Create WebRender commands for the theme background.
    * @return true if the theme knows how to create WebRender commands for the
    *         given widget type, false if DrawWidgetBackground need sto be called
    *         instead.
    */
   virtual bool CreateWebRenderCommandsForWidget(mozilla::wr::DisplayListBuilder& aBuilder,
                                                 mozilla::wr::IpcResourceUpdateQueue& aResources,
                                                 const mozilla::layers::StackingContextHelper& aSc,
                                                 mozilla::layers::WebRenderLayerManager* aManager,
                                                 nsIFrame* aFrame,
-                                                WidgetType aWidgetType,
+                                                StyleAppearance aWidgetType,
                                                 const nsRect& aRect) { return false; }
 
   /**
    * Return the border for the widget, in device pixels.
    */
   virtual MOZ_MUST_USE LayoutDeviceIntMargin GetWidgetBorder(nsDeviceContext* aContext,
                                                              nsIFrame* aFrame,
-                                                             WidgetType aWidgetType) = 0;
+                                                             StyleAppearance aWidgetType) = 0;
 
   /**
    * This method can return false to indicate that the CSS padding
    * value should be used.  Otherwise, it will fill in aResult with the
    * computed padding, in pixels, and return true.
    *
    * XXXldb This ought to be required to return true for non-containers
    * so that we don't let specified padding that has no effect change
    * the computed padding and potentially the size.
    */
   virtual bool GetWidgetPadding(nsDeviceContext* aContext,
                                 nsIFrame* aFrame,
-                                WidgetType aWidgetType,
+                                StyleAppearance aWidgetType,
                                 LayoutDeviceIntMargin* aResult) = 0;
 
   /**
    * On entry, *aResult is positioned at 0,0 and sized to the new size
    * of aFrame (aFrame->GetSize() may be stale and should not be used).
    * This method can return false to indicate that no special
    * overflow area is required by the native widget. Otherwise it will
    * fill in aResult with the desired overflow area, in appunits, relative
@@ -120,60 +120,63 @@ public:
    * This overflow area is used to determine what area needs to be
    * repainted when the widget changes.  However, it does not affect the
    * widget's size or what area is reachable by scrollbars.  (In other
    * words, in layout terms, it affects visual overflow but not
    * scrollable overflow.)
    */
   virtual bool GetWidgetOverflow(nsDeviceContext* aContext,
                                  nsIFrame* aFrame,
-                                 WidgetType aWidgetType,
+                                 StyleAppearance aWidgetType,
                                  /*INOUT*/ nsRect* aOverflowRect)
   { return false; }
 
   /**
    * Get the minimum border-box size of a widget, in *pixels* (in
    * |aResult|).  If |aIsOverridable| is set to true, this size is a
    * minimum size; if false, this size is the only valid size for the
    * widget.
    */
   NS_IMETHOD GetMinimumWidgetSize(nsPresContext* aPresContext,
                                   nsIFrame* aFrame,
-                                  WidgetType aWidgetType,
+                                  StyleAppearance aWidgetType,
                                   mozilla::LayoutDeviceIntSize* aResult,
                                   bool* aIsOverridable)=0;
 
 
   enum Transparency {
     eOpaque = 0,
     eTransparent,
     eUnknownTransparency
   };
 
   /**
    * Returns what we know about the transparency of the widget.
    */
-  virtual Transparency GetWidgetTransparency(nsIFrame* aFrame, WidgetType aWidgetType)
+  virtual Transparency GetWidgetTransparency(nsIFrame* aFrame,
+                                             StyleAppearance aWidgetType)
   { return eUnknownTransparency; }
 
   /**
    * Sets |*aShouldRepaint| to indicate whether an attribute or content state
    * change should trigger a repaint.  Call with null |aAttribute| (and
    * null |aOldValue|) for content state changes.
    */
-  NS_IMETHOD WidgetStateChanged(nsIFrame* aFrame, WidgetType aWidgetType,
+  NS_IMETHOD WidgetStateChanged(nsIFrame* aFrame,
+                                StyleAppearance aWidgetType,
                                 nsAtom* aAttribute, bool* aShouldRepaint,
                                 const nsAttrValue* aOldValue)=0;
 
   NS_IMETHOD ThemeChanged()=0;
 
-  virtual bool WidgetAppearanceDependsOnWindowFocus(WidgetType aWidgetType)
+  virtual bool WidgetAppearanceDependsOnWindowFocus(StyleAppearance aWidgetType)
   { return false; }
 
-  virtual bool NeedToClearBackgroundBehindWidget(nsIFrame* aFrame, WidgetType aWidgetType)
+  virtual bool NeedToClearBackgroundBehindWidget(nsIFrame* aFrame,
+                                                 StyleAppearance aWidgetType)
   { return false; }
 
   /**
    * ThemeGeometryType values are used for describing themed nsIFrames in
    * calls to nsIWidget::UpdateThemeGeometries. We don't simply pass the
    * -moz-appearance value ("widget type") of the frame because the widget may
    * want to treat different frames with the same -moz-appearance differently
    * based on other properties of the frame. So we give the theme a first look
@@ -190,32 +193,32 @@ public:
 
   /**
    * Returns the theme geometry type that should be used in the ThemeGeometry
    * array that's passed to the widget using nsIWidget::UpdateThemeGeometries.
    * A return value of eThemeGeometryTypeUnknown means that this frame will
    * not be included in the ThemeGeometry array.
    */
   virtual ThemeGeometryType ThemeGeometryTypeForWidget(nsIFrame* aFrame,
-                                                       WidgetType aWidgetType)
+                                                       StyleAppearance aWidgetType)
   { return eThemeGeometryTypeUnknown; }
 
   /**
    * Can the nsITheme implementation handle this widget?
    */
   virtual bool ThemeSupportsWidget(nsPresContext* aPresContext,
                                    nsIFrame* aFrame,
-                                   WidgetType aWidgetType) = 0;
+                                   StyleAppearance aWidgetType) = 0;
 
-  virtual bool WidgetIsContainer(WidgetType aWidgetType) = 0;
+  virtual bool WidgetIsContainer(StyleAppearance aWidgetType) = 0;
 
   /**
    * Does the nsITheme implementation draw its own focus ring for this widget?
    */
-  virtual bool ThemeDrawsFocusForWidget(WidgetType aWidgetType) = 0;
+  virtual bool ThemeDrawsFocusForWidget(StyleAppearance aWidgetType) = 0;
   
   /**
     * Should we insert a dropmarker inside of combobox button?
    */
   virtual bool ThemeNeedsComboboxDropmarker() = 0;
 };
 
 NS_DEFINE_STATIC_IID_ACCESSOR(nsITheme, NS_ITHEME_IID)
--- a/js/src/vm/Time.h
+++ b/js/src/vm/Time.h
@@ -175,14 +175,14 @@ ReadTimestampCounter(void)
 
 namespace js {
 
 // Get the current time, bypassing any record/replay instrumentation.
 static inline mozilla::TimeStamp
 ReallyNow()
 {
     mozilla::recordreplay::AutoPassThroughThreadEvents pt;
-    return mozilla::TimeStamp::Now();
+    return mozilla::TimeStamp::NowUnfuzzed();
 }
 
 } // namespace js
 
 #endif /* vm_Time_h */
new file mode 100644
--- /dev/null
+++ b/python/l10n/fluent_migrations/bug_1501900_aboutdevtools.py
@@ -0,0 +1,188 @@
+from __future__ import absolute_import
+import fluent.syntax.ast as FTL
+from fluent.migrate.helpers import transforms_from
+from fluent.migrate.helpers import VARIABLE_REFERENCE
+from fluent.migrate.helpers import TERM_REFERENCE
+from fluent.migrate.helpers import MESSAGE_REFERENCE
+from fluent.migrate import REPLACE
+from fluent.migrate import COPY
+from fluent.migrate import CONCAT
+
+def migrate(ctx):
+    """Bug 1501900 -  Migrate aboutdevtools to Fluent, part {index}"""
+
+    ctx.add_transforms(
+        "devtools/startup/aboutDevTools.ftl",
+        "devtools/startup/aboutDevTools.ftl",
+        transforms_from(
+"""
+head-title = { COPY("devtools/startup/aboutdevtools.dtd", "aboutDevtools.headTitle")}
+enable-title = { COPY("devtools/startup/aboutdevtools.dtd", "aboutDevtools.enable.title")}
+enable-inspect-element-title = { COPY("devtools/startup/aboutdevtools.dtd", "aboutDevtools.enable.inspectElementTitle")}
+enable-inspect-element-message = { COPY("devtools/startup/aboutdevtools.dtd", "aboutDevtools.enable.inspectElementMessage")}
+enable-about-debugging-message ={ COPY("devtools/startup/aboutdevtools.dtd", "aboutDevtools.enable.aboutDebuggingMessage")}
+enable-key-shortcut-message = { COPY("devtools/startup/aboutdevtools.dtd", "aboutDevtools.enable.keyShortcutMessage")}
+enable-menu-message = { COPY("devtools/startup/aboutdevtools.dtd", "aboutDevtools.enable.menuMessage2")}
+enable-common-message = { COPY("devtools/startup/aboutdevtools.dtd", "aboutDevtools.enable.commonMessage")}
+enable-learn-more-link = { COPY("devtools/startup/aboutdevtools.dtd", "aboutDevtools.enable.learnMoreLink")}
+enable-enable-button = { COPY("devtools/startup/aboutdevtools.dtd", "aboutDevtools.enable.enableButton")}
+enable-close-button = { COPY("devtools/startup/aboutdevtools.dtd", "aboutDevtools.enable.closeButton2")}
+welcome-title = { COPY("devtools/startup/aboutdevtools.dtd", "aboutDevtools.welcome.title")}
+newsletter-title = { COPY("devtools/startup/aboutdevtools.dtd", "aboutDevtools.newsletter.title")}
+newsletter-message = { COPY("devtools/startup/aboutdevtools.dtd", "aboutDevtools.newsletter.message")}
+newsletter-email-placeholder =
+    .placeholder = { COPY("devtools/startup/aboutdevtools.dtd", "aboutDevtools.newsletter.email.placeholder")}
+newsletter-subscribe-button = { COPY("devtools/startup/aboutdevtools.dtd", "aboutDevtools.newsletter.subscribeButton")}
+newsletter-thanks-title = { COPY("devtools/startup/aboutdevtools.dtd", "aboutDevtools.newsletter.thanks.title")}
+newsletter-thanks-message = { COPY("devtools/startup/aboutdevtools.dtd", "aboutDevtools.newsletter.thanks.message")}
+footer-title = { COPY("devtools/startup/aboutdevtools.dtd", "aboutDevtools.footer.title")}
+footer-message = { COPY("devtools/startup/aboutdevtools.dtd", "aboutDevtools.footer.message")}
+footer-learn-more-link = { COPY("devtools/startup/aboutdevtools.dtd", "aboutDevtools.footer.learnMoreLink")}
+features-learn-more = { COPY("devtools/startup/aboutdevtools.properties", "features.learnMore")}
+features-inspector-title = { COPY("devtools/startup/aboutdevtools.properties", "features.inspector.title")}
+features-console-title = { COPY("devtools/startup/aboutdevtools.properties", "features.console.title")}
+features-debugger-title = { COPY("devtools/startup/aboutdevtools.properties", "features.debugger.title")}
+features-network-title = { COPY("devtools/startup/aboutdevtools.properties", "features.network.title")}
+features-storage-title = { COPY("devtools/startup/aboutdevtools.properties", "features.storage.title")}
+features-responsive-title = { COPY("devtools/startup/aboutdevtools.properties", "features.responsive.title")}
+features-visual-editing-title = { COPY("devtools/startup/aboutdevtools.properties", "features.visualediting.title")}
+features-performance-title = { COPY("devtools/startup/aboutdevtools.properties", "features.performance.title")}
+features-memory-title = { COPY("devtools/startup/aboutdevtools.properties", "features.memory.title")}
+"""
+        )
+    )
+
+    ctx.add_transforms(
+        "devtools/startup/aboutDevTools.ftl",
+        "devtools/startup/aboutDevTools.ftl",
+        [
+            FTL.Message(
+                id=FTL.Identifier("newsletter-privacy-label"),
+                value=REPLACE(
+                    "devtools/startup/aboutdevtools.dtd",
+                    "aboutDevtools.newsletter.privacy.label",
+                    {
+                        "<a class='external' href='https://www.mozilla.org/privacy/'>": FTL.TextElement('<a data-l10n-name="privacy-policy">')
+                    }
+                )
+            ),
+            FTL.Message(
+                id=FTL.Identifier("features-inspector-desc"),
+                value=CONCAT(
+                    COPY(
+                        "devtools/startup/aboutdevtools.properties",
+                        "features.inspector.desc",
+                    ),
+                    FTL.TextElement(' <a data-l10n-name="learn-more">'),
+                    MESSAGE_REFERENCE("features-learn-more"),
+                    FTL.TextElement("</a>")
+                )
+            ),
+            FTL.Message(
+                id=FTL.Identifier("features-console-desc"),
+                value=CONCAT(
+                    COPY(
+                        "devtools/startup/aboutdevtools.properties",
+                        "features.console.desc",
+                    ),
+                    FTL.TextElement(' <a data-l10n-name="learn-more">'),
+                    MESSAGE_REFERENCE("features-learn-more"),
+                    FTL.TextElement("</a>")
+                )
+            ),
+            FTL.Message(
+                id=FTL.Identifier("features-debugger-desc"),
+                value=CONCAT(
+                    COPY(
+                        "devtools/startup/aboutdevtools.properties",
+                        "features.debugger.desc",
+                    ),
+                    FTL.TextElement(' <a data-l10n-name="learn-more">'),
+                    MESSAGE_REFERENCE("features-learn-more"),
+                    FTL.TextElement("</a>")
+                )
+            ),
+            FTL.Message(
+                id=FTL.Identifier("features-network-desc"),
+                value=CONCAT(
+                    COPY(
+                        "devtools/startup/aboutdevtools.properties",
+                        "features.network.desc",
+                    ),
+                    FTL.TextElement(' <a data-l10n-name="learn-more">'),
+                    MESSAGE_REFERENCE("features-learn-more"),
+                    FTL.TextElement("</a>")
+                )
+            ),
+            FTL.Message(
+                id=FTL.Identifier("features-storage-desc"),
+                value=CONCAT(
+                    COPY(
+                        "devtools/startup/aboutdevtools.properties",
+                        "features.storage.desc",
+                    ),
+                    FTL.TextElement(' <a data-l10n-name="learn-more">'),
+                    MESSAGE_REFERENCE("features-learn-more"),
+                    FTL.TextElement("</a>")
+                )
+            ),
+            FTL.Message(
+                id=FTL.Identifier("features-responsive-desc"),
+                value=CONCAT(
+                    COPY(
+                        "devtools/startup/aboutdevtools.properties",
+                        "features.responsive.desc",
+                    ),
+                    FTL.TextElement(' <a data-l10n-name="learn-more">'),
+                    MESSAGE_REFERENCE("features-learn-more"),
+                    FTL.TextElement("</a>")
+                )
+            ),
+            FTL.Message(
+                id=FTL.Identifier("features-visual-editing-desc"),
+                value=CONCAT(
+                    COPY(
+                        "devtools/startup/aboutdevtools.properties",
+                        "features.visualediting.desc",
+                    ),
+                    FTL.TextElement(' <a data-l10n-name="learn-more">'),
+                    MESSAGE_REFERENCE("features-learn-more"),
+                    FTL.TextElement("</a>")
+                )
+            ),
+            FTL.Message(
+                id=FTL.Identifier("features-performance-desc"),
+                value=CONCAT(
+                    COPY(
+                        "devtools/startup/aboutdevtools.properties",
+                        "features.performance.desc",
+                    ),
+                    FTL.TextElement(' <a data-l10n-name="learn-more">'),
+                    MESSAGE_REFERENCE("features-learn-more"),
+                    FTL.TextElement("</a>")
+                )
+            ),
+            FTL.Message(
+                id=FTL.Identifier("features-memory-desc"),
+                value=CONCAT(
+                    COPY(
+                        "devtools/startup/aboutdevtools.properties",
+                        "features.memory.desc",
+                    ),
+                    FTL.TextElement(' <a data-l10n-name="learn-more">'),
+                    MESSAGE_REFERENCE("features-learn-more"),
+                    FTL.TextElement("</a>")
+                )
+            ),
+            FTL.Message(
+                id=FTL.Identifier("welcome-message"),
+                value=REPLACE(
+                    "devtools/startup/aboutdevtools.properties",
+                    "welcome.message",
+                    {
+                        "%S": VARIABLE_REFERENCE("shortcut")
+                    }
+                )
+            )
+        ]
+    )
--- a/testing/mozharness/mozharness/mozilla/testing/codecoverage.py
+++ b/testing/mozharness/mozharness/mozilla/testing/codecoverage.py
@@ -248,19 +248,17 @@ class CodeCoverageMixin(SingleTestMixin)
         return []
 
     def set_coverage_env(self, env, is_baseline_test=False):
         # Set the GCOV directory.
         self.gcov_dir = tempfile.mkdtemp()
         env['GCOV_PREFIX'] = self.gcov_dir
 
         # Set the GCOV/JSVM directories where counters will be dumped in per-test mode.
-        # Resetting/dumping is only available on Linux for the time being
-        # (https://bugzilla.mozilla.org/show_bug.cgi?id=1471576).
-        if self.per_test_coverage and not is_baseline_test and self._is_linux():
+        if self.per_test_coverage and not is_baseline_test:
             env['GCOV_RESULTS_DIR'] = tempfile.mkdtemp()
             env['JSVM_RESULTS_DIR'] = tempfile.mkdtemp()
 
         # Set JSVM directory.
         self.jsvm_dir = tempfile.mkdtemp()
         env['JS_CODE_COVERAGE_OUTPUT_DIR'] = self.jsvm_dir
 
     @PreScriptAction('run-tests')
--- a/testing/profiles/web-platform/user.js
+++ b/testing/profiles/web-platform/user.js
@@ -19,8 +19,10 @@ user_pref("network.proxy.type", 0);
 // Web-platform-tests load a lot of URLs very quickly. This puts avoidable and
 // unnecessary I/O pressure on the Places DB (measured to be in the
 // gigabytes).
 user_pref("places.history.enabled", false);
 // Suppress automatic safe mode after crashes
 user_pref("toolkit.startup.max_resumed_crashes", -1);
 // Disable antialiasing for the Ahem font.
 user_pref("gfx.font_ahem_antialias_none", true);
+// Disable antiphishing popup
+user_pref("network.http.phishy-userpass-length", 255);
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/FileAPI/url/multi-global-origin-serialization.sub.html.ini
@@ -0,0 +1,2 @@
+[multi-global-origin-serialization.sub.html]
+  expected: TIMEOUT
--- a/testing/web-platform/meta/background-fetch/abort.https.window.js.ini
+++ b/testing/web-platform/meta/background-fetch/abort.https.window.js.ini
@@ -1,7 +1,10 @@
 [abort.https.window.html]
   [Calling BackgroundFetchRegistration.abort sets the correct fields and responses are still available]
     expected: FAIL
 
   [Aborting the same registration twice fails]
     expected: FAIL
 
+  [An aborted fetch throws a DOM exception when accessing an incomplete record]
+    expected: FAIL
+
--- a/testing/web-platform/meta/background-fetch/fetch.https.window.js.ini
+++ b/testing/web-platform/meta/background-fetch/fetch.https.window.js.ini
@@ -36,8 +36,14 @@
     expected: FAIL
 
   [Requests with PUT method require CORS Preflight and succeed.]
     expected: FAIL
 
   [Registration object gets updated values when a background fetch completes.]
     expected: FAIL
 
+  [Matching to a single request should work]
+    expected: FAIL
+
+  [Matching to a non-existing request should work]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/client-hints/image-with-dpr-header.html.ini
@@ -0,0 +1,4 @@
+[image-with-dpr-header.html]
+  [Test the image dimensions of different DPR sizes]
+    expected: FAIL
+
deleted file mode 100644
--- a/testing/web-platform/meta/css/CSS2/borders/border-top-width-003.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[border-top-width-003.xht]
-  expected: FAIL
--- a/testing/web-platform/meta/css/css-flexbox/flex-flexitem-percentage-prescation.html.ini
+++ b/testing/web-platform/meta/css/css-flexbox/flex-flexitem-percentage-prescation.html.ini
@@ -1,9 +1,8 @@
 [flex-flexitem-percentage-prescation.html]
   expected:
     if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
     if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
     if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
     if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
     if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
     if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-    FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-fonts/font-feature-resolution-001.html.ini
@@ -0,0 +1,2 @@
+[font-feature-resolution-001.html]
+  expected: FAIL
deleted file mode 100644
--- a/testing/web-platform/meta/css/css-masking/clip-path-svg-content/clip-path-content-syling.svg.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[clip-path-content-syling.svg]
-  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-paint-api/registered-property-interpolation-001.https.html.ini
@@ -0,0 +1,2 @@
+[registered-property-interpolation-001.https.html]
+  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-paint-api/registered-property-interpolation-002.https.html.ini
@@ -0,0 +1,2 @@
+[registered-property-interpolation-002.https.html]
+  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-paint-api/registered-property-interpolation-003.https.html.ini
@@ -0,0 +1,2 @@
+[registered-property-interpolation-003.https.html]
+  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-paint-api/registered-property-interpolation-004.https.html.ini
@@ -0,0 +1,2 @@
+[registered-property-interpolation-004.https.html]
+  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-paint-api/registered-property-interpolation-005.https.html.ini
@@ -0,0 +1,2 @@
+[registered-property-interpolation-005.https.html]
+  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-paint-api/registered-property-interpolation-006.https.html.ini
@@ -0,0 +1,2 @@
+[registered-property-interpolation-006.https.html]
+  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-paint-api/registered-property-interpolation-007.https.html.ini
@@ -0,0 +1,2 @@
+[registered-property-interpolation-007.https.html]
+  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-paint-api/registered-property-interpolation-008.https.html.ini
@@ -0,0 +1,2 @@
+[registered-property-interpolation-008.https.html]
+  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-paint-api/registered-property-interpolation-009.https.html.ini
@@ -0,0 +1,2 @@
+[registered-property-interpolation-009.https.html]
+  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-paint-api/registered-property-interpolation-010.https.html.ini
@@ -0,0 +1,2 @@
+[registered-property-interpolation-010.https.html]
+  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-paint-api/registered-property-stylemap.https.html.ini
@@ -0,0 +1,2 @@
+[registered-property-stylemap.https.html]
+  expected: FAIL
deleted file mode 100644
--- a/testing/web-platform/meta/css/css-paint-api/registered-property-type.https.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[registered-property-type.https.html]
-  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-paint-api/registered-property-value-001.https.html.ini
@@ -0,0 +1,2 @@
+[registered-property-value-001.https.html]
+  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-paint-api/registered-property-value-002.https.html.ini
@@ -0,0 +1,2 @@
+[registered-property-value-002.https.html]
+  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-paint-api/registered-property-value-003.https.html.ini
@@ -0,0 +1,2 @@
+[registered-property-value-003.https.html]
+  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-paint-api/registered-property-value-004.https.html.ini
@@ -0,0 +1,2 @@
+[registered-property-value-004.https.html]
+  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-paint-api/registered-property-value-005.https.html.ini
@@ -0,0 +1,2 @@
+[registered-property-value-005.https.html]
+  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-paint-api/registered-property-value-006.https.html.ini
@@ -0,0 +1,2 @@
+[registered-property-value-006.https.html]
+  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-paint-api/registered-property-value-007.https.html.ini
@@ -0,0 +1,2 @@
+[registered-property-value-007.https.html]
+  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-paint-api/registered-property-value-008.https.html.ini
@@ -0,0 +1,2 @@
+[registered-property-value-008.https.html]
+  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-paint-api/registered-property-value-009.https.html.ini
@@ -0,0 +1,2 @@
+[registered-property-value-009.https.html]
+  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-paint-api/registered-property-value-010.https.html.ini
@@ -0,0 +1,2 @@
+[registered-property-value-010.https.html]
+  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-paint-api/registered-property-value-011.https.html.ini
@@ -0,0 +1,2 @@
+[registered-property-value-011.https.html]
+  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-paint-api/registered-property-value-012.https.html.ini
@@ -0,0 +1,2 @@
+[registered-property-value-012.https.html]
+  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-paint-api/registered-property-value-013.https.html.ini
@@ -0,0 +1,2 @@
+[registered-property-value-013.https.html]
+  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-paint-api/registered-property-value-014.https.html.ini
@@ -0,0 +1,2 @@
+[registered-property-value-014.https.html]
+  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-paint-api/registered-property-value-015.https.html.ini
@@ -0,0 +1,2 @@
+[registered-property-value-015.https.html]
+  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-paint-api/registered-property-value-016.https.html.ini
@@ -0,0 +1,2 @@
+[registered-property-value-016.https.html]
+  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-paint-api/registered-property-value-017.https.html.ini
@@ -0,0 +1,2 @@
+[registered-property-value-017.https.html]
+  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-paint-api/registered-property-value-018.https.html.ini
@@ -0,0 +1,2 @@
+[registered-property-value-018.https.html]
+  expected: FAIL
--- a/testing/web-platform/meta/css/css-properties-values-api/register-property-syntax-parsing.html.ini
+++ b/testing/web-platform/meta/css/css-properties-values-api/register-property-syntax-parsing.html.ini
@@ -372,8 +372,29 @@
     expected: FAIL
 
   [syntax:'<transform-function>+', initialValue:'translateX(2px) rotate(42deg)' is valid]
     expected: FAIL
 
   [syntax:'<transform-function>', initialValue:'scale()' is invalid]
     expected: FAIL
 
+  [syntax:'<integer>', initialValue:'calc(1 + 2)' is valid]
+    expected: FAIL
+
+  [syntax:'<integer>', initialValue:'calc(3.1415)' is valid]
+    expected: FAIL
+
+  [syntax:'<integer>', initialValue:'calc(1)' is valid]
+    expected: FAIL
+
+  [syntax:'<integer>', initialValue:'calc(3.1415 + 3.1415)' is valid]
+    expected: FAIL
+
+  [syntax:'<length>#', initialValue:'2px, 7px, calc(8px)' is valid]
+    expected: FAIL
+
+  [syntax:'<length>#', initialValue:'' is invalid]
+    expected: FAIL
+
+  [syntax:'<length>+', initialValue:'' is invalid]
+    expected: FAIL
+
--- a/testing/web-platform/meta/css/css-properties-values-api/registered-property-computation.html.ini
+++ b/testing/web-platform/meta/css/css-properties-values-api/registered-property-computation.html.ini
@@ -45,8 +45,20 @@
     expected: FAIL
 
   [<transform-function> values are computed correctly for divWithFontSizeSet]
     expected: FAIL
 
   [<transform-function> values are computed correctly for divWithFontSizeInherited]
     expected: FAIL
 
+  [<integer> values are computed correctly for divWithFontSizeSet]
+    expected: FAIL
+
+  [<integer> values are computed correctly for divWithFontSizeInherited]
+    expected: FAIL
+
+  [<integer>+ values are computed correctly for divWithFontSizeInherited]
+    expected: FAIL
+
+  [<integer>+ values are computed correctly for divWithFontSizeSet]
+    expected: FAIL
+
deleted file mode 100644
--- a/testing/web-platform/meta/css/css-text/white-space/break-spaces-003.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[break-spaces-003.html]
-  expected: FAIL
deleted file mode 100644
--- a/testing/web-platform/meta/css/css-text/white-space/textarea-break-spaces-003.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[textarea-break-spaces-003.html]
-  expected: FAIL
--- a/testing/web-platform/meta/editing/run/insert-list-items-in-table-cell.html.ini
+++ b/testing/web-platform/meta/editing/run/insert-list-items-in-table-cell.html.ini
@@ -1,21 +1,15 @@
 [insert-list-items-in-table-cell.html]
-  [[["insertOrderedList",""\]\] "<div contenteditable=\\"true\\"><table><tr><td>[fsdf\]</td><td>fsdf</td></tr><tr><td>gghfg</td><td>fsfg</td></tr></table></div>" compare innerHTML]
-    expected: FAIL
-
   [[["insertOrderedList",""\]\] "<div contenteditable=\\"true\\"><table><tr><td>[fsdf\]</td><td>fsdf</td></tr><tr><td>gghfg</td><td>fsfg</td></tr></table></div>" queryCommandValue("insertOrderedList") before]
     expected: FAIL
 
   [[["insertOrderedList",""\]\] "<div contenteditable=\\"true\\"><table><tr><td>[fsdf\]</td><td>fsdf</td></tr><tr><td>gghfg</td><td>fsfg</td></tr></table></div>" queryCommandValue("insertOrderedList") after]
     expected: FAIL
 
-  [[["insertOrderedList",""\]\] "<div contenteditable=\\"true\\"><table><tr data-start=0 data-end=2><td>fsdf</td><td>fsdf</td></tr><tr><td>gghfg</td><td>fsfg</td></tr></table></div>" compare innerHTML]
-    expected: FAIL
-
   [[["insertOrderedList",""\]\] "<div contenteditable=\\"true\\"><table><tr data-start=0 data-end=2><td>fsdf</td><td>fsdf</td></tr><tr><td>gghfg</td><td>fsfg</td></tr></table></div>" queryCommandValue("insertOrderedList") before]
     expected: FAIL
 
   [[["insertOrderedList",""\]\] "<div contenteditable=\\"true\\"><table><tr data-start=0 data-end=2><td>fsdf</td><td>fsdf</td></tr><tr><td>gghfg</td><td>fsfg</td></tr></table></div>" queryCommandState("insertOrderedList") after]
     expected: FAIL
 
   [[["insertOrderedList",""\]\] "<div contenteditable=\\"true\\"><table><tr data-start=0 data-end=2><td>fsdf</td><td>fsdf</td></tr><tr><td>gghfg</td><td>fsfg</td></tr></table></div>" queryCommandValue("insertOrderedList") after]
     expected: FAIL
--- a/testing/web-platform/meta/editing/run/insertorderedlist.html.ini
+++ b/testing/web-platform/meta/editing/run/insertorderedlist.html.ini
@@ -421,8 +421,32 @@
     expected: FAIL
 
   [[["defaultparagraphseparator","p"\],["insertorderedlist",""\]\] "<ol><li>foo</ol> <p>[bar\]</p> <ol><li>baz</ol>" compare innerHTML]
     expected: FAIL
 
   [insertorderedlist - HTML editing conformance tests]
     expected: FAIL
 
+  [[["insertorderedlist",""\]\] "<div><span style='font-family: times; color: blue'>[bar\]</span></div>" queryCommandValue("insertorderedlist") after]
+    expected: FAIL
+
+  [[["insertorderedlist",""\]\] "<div><ol style='font-family: times; color: blue'><li>bar</li></ol><span style='font-family: italic; color: green'>[baz\]</span></div>" queryCommandValue("insertorderedlist") after]
+    expected: FAIL
+
+  [[["insertorderedlist",""\]\] "<div><ol style='font-family: times; color: blue'><li>bar</li></ol><span style='font-family: italic; color: green'>[baz\]</span></div>" queryCommandValue("insertorderedlist") before]
+    expected: FAIL
+
+  [[["insertorderedlist",""\]\] "<div><ol style='font-family: times; color: blue'><li>bar</li></ol><span style='font-family: italic; color: green'>[baz\]</span></div>" compare innerHTML]
+    expected: FAIL
+
+  [[["insertorderedlist",""\]\] "<div><span style='font-family: times; color: blue'>bar</span></div><span style='font-family: italic; color: green'>[baz\]</span>" queryCommandValue("insertorderedlist") before]
+    expected: FAIL
+
+  [[["insertorderedlist",""\]\] "<div><span style='font-family: times; color: blue'>[bar\]</span></div>" compare innerHTML]
+    expected: FAIL
+
+  [[["insertorderedlist",""\]\] "<div><span style='font-family: times; color: blue'>bar</span></div><span style='font-family: italic; color: green'>[baz\]</span>" queryCommandValue("insertorderedlist") after]
+    expected: FAIL
+
+  [[["insertorderedlist",""\]\] "<div><span style='font-family: times; color: blue'>[bar\]</span></div>" queryCommandValue("insertorderedlist") before]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/eventsource/eventsource-constructor-document-domain.htm.ini
@@ -0,0 +1,2 @@
+[eventsource-constructor-document-domain.htm]
+  expected: TIMEOUT
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/feature-policy/experimental-features/layout-animations-disabled-tentative.html.ini
@@ -0,0 +1,79 @@
+[layout-animations-disabled-tentative.html]
+  [Verify that animations which are not affected by the policy run as expected.]
+    expected: TIMEOUT
+
+  [Verify that animations which are affected by the policy run as expected.]
+    expected: NOTRUN
+
+  [Testing property "bottom".Animation between "100px" and "200px" at progress 0.125]
+    expected: FAIL
+
+  [Testing property "right".Animation between "100px" and "200px" at progress 2]
+    expected: FAIL
+
+  [Testing property "height".Animation between "100px" and "200px" at progress 0.125]
+    expected: FAIL
+
+  [Testing property "bottom".Animation between "100px" and "200px" at progress 2]
+    expected: FAIL
+
+  [Testing property "top".Animation between "100px" and "200px" at progress 2]
+    expected: FAIL
+
+  [Testing property "width".Animation between "100px" and "200px" at progress 0.875]
+    expected: FAIL
+
+  [Testing property "right".Animation between "100px" and "200px" at progress 0.125]
+    expected: FAIL
+
+  [Testing property "width".Animation between "100px" and "200px" at progress 0.125]
+    expected: FAIL
+
+  [Testing property "top".Animation between "100px" and "200px" at progress -1]
+    expected: FAIL
+
+  [Testing property "right".Animation between "100px" and "200px" at progress 0.875]
+    expected: FAIL
+
+  [Testing property "top".Animation between "100px" and "200px" at progress 0.875]
+    expected: FAIL
+
+  [Testing property "height".Animation between "100px" and "200px" at progress -1]
+    expected: FAIL
+
+  [Testing property "bottom".Animation between "100px" and "200px" at progress -1]
+    expected: FAIL
+
+  [Testing property "left".Animation between "100px" and "200px" at progress 2]
+    expected: FAIL
+
+  [Testing property "height".Animation between "100px" and "200px" at progress 2]
+    expected: FAIL
+
+  [Testing property "top".Animation between "100px" and "200px" at progress 0.125]
+    expected: FAIL
+
+  [Testing property "left".Animation between "100px" and "200px" at progress 0.125]
+    expected: FAIL
+
+  [Testing property "height".Animation between "100px" and "200px" at progress 0.875]
+    expected: FAIL
+
+  [Testing property "width".Animation between "100px" and "200px" at progress -1]
+    expected: FAIL
+
+  [Testing property "bottom".Animation between "100px" and "200px" at progress 0.875]
+    expected: FAIL
+
+  [Testing property "left".Animation between "100px" and "200px" at progress 0.875]
+    expected: FAIL
+
+  [Testing property "left".Animation between "100px" and "200px" at progress -1]
+    expected: FAIL
+
+  [Testing property "width".Animation between "100px" and "200px" at progress 2]
+    expected: FAIL
+
+  [Testing property "right".Animation between "100px" and "200px" at progress -1]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/feature-policy/experimental-features/layout-animations-enabled-tentative.html.ini
@@ -0,0 +1,7 @@
+[layout-animations-enabled-tentative.html]
+  [Verify that all animations behave normally when the policy is enabled.]
+    expected: TIMEOUT
+
+  [ 'layout-animations' Policy : Correct behavior for affected and unaffected properties when\n         feature is enabled.\n]
+    expected: FAIL
+
--- a/testing/web-platform/meta/fetch/data-urls/processing.any.js.ini
+++ b/testing/web-platform/meta/fetch/data-urls/processing.any.js.ini
@@ -27,16 +27,19 @@
     expected: FAIL
 
   ["data:;base64;,WA"]
     expected: FAIL
 
   ["data:application/javascript,X X"]
     expected: FAIL
 
+  ["data:text/plain;a=\\",\\",X"]
+    expected: FAIL
+
 
 [processing.any.worker.html]
   ["data://test:test/,X"]
     expected: FAIL
 
   ["data:;x=x;charset=x,X"]
     expected: FAIL
 
@@ -62,8 +65,11 @@
     expected: FAIL
 
   ["data:;base64;,WA"]
     expected: FAIL
 
   ["data:application/javascript,X X"]
     expected: FAIL
 
+  ["data:text/plain;a=\\",\\",X"]
+    expected: FAIL
+
--- a/testing/web-platform/meta/fetch/sec-metadata/report.tentative.https.sub.html.ini
+++ b/testing/web-platform/meta/fetch/sec-metadata/report.tentative.https.sub.html.ini
@@ -1,10 +1,20 @@
 [report.tentative.https.sub.html]
+  expected: TIMEOUT
   [Same-Origin report]
     expected: FAIL
 
   [Same-site report]
     expected: FAIL
 
   [Cross-site report]
     expected: FAIL
 
+  [cross-site report]
+    expected: TIMEOUT
+
+  [same-site report]
+    expected: TIMEOUT
+
+  [same-origin report]
+    expected: TIMEOUT
+
--- a/testing/web-platform/meta/fetch/security/embedded-credentials.tentative.sub.html.ini
+++ b/testing/web-platform/meta/fetch/security/embedded-credentials.tentative.sub.html.ini
@@ -1,2 +1,13 @@
 [embedded-credentials.tentative.sub.html]
-  expected: ERROR
+  [Embedded credentials are treated as network errors in frames.]
+    expected: FAIL
+
+  [Embedded credentials are treated as network errors in new windows.]
+    expected: FAIL
+
+  [Embedded credentials matching the top-level are treated as network errors for cross-origin URLs.]
+    expected: FAIL
+
+  [Embedded credentials are treated as network errors.]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/html/browsers/browsing-the-web/history-traversal/window-name-after-same-origin-main-frame-navigation.sub.html.ini
@@ -0,0 +1,16 @@
+[window-name-after-same-origin-main-frame-navigation.sub.html]
+  disabled: https://bugzilla.mozilla.org/show_bug.cgi?id=1504776
+  expected:
+    if debug and webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): ERROR
+    if not debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): ERROR
+    if not debug and webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): ERROR
+    if not debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): ERROR
+    if debug and not webrender and e10s and not sw-e10s and not asan and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): ERROR
+    if not debug and not webrender and e10s and not sw-e10s and not asan and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): ERROR
+    if debug and not webrender and e10s and not sw-e10s and not asan and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): ERROR
+    if not debug and not webrender and e10s and not sw-e10s and not asan and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): ERROR
+    if debug and not webrender and e10s and not sw-e10s and not asan and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): ERROR
+    if not debug and not webrender and e10s and not sw-e10s and not asan and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): ERROR
+    if debug and not webrender and e10s and not sw-e10s and not asan and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): ERROR
+    if debug and not webrender and e10s and sw-e10s and not asan and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): ERROR
+    if debug and not webrender and e10s and not sw-e10s and not asan and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): ERROR
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/html/browsers/browsing-the-web/unloading-documents/prompt-and-unload-script-closeable.html.ini
@@ -0,0 +1,2 @@
+[prompt-and-unload-script-closeable.html]
+  expected: ERROR
--- a/testing/web-platform/meta/html/browsers/history/the-history-interface/traverse_the_history_3.html.ini
+++ b/testing/web-platform/meta/html/browsers/history/the-history-interface/traverse_the_history_3.html.ini
@@ -1,4 +1,11 @@
 [traverse_the_history_3.html]
   [Multiple history traversals, last would be aborted]
-    expected: FAIL
+    expected:
+      if not debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): TIMEOUT
+      if not debug and webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): TIMEOUT
+      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): TIMEOUT
+      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): TIMEOUT
+      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): TIMEOUT
+      if not debug and not webrender and e10s and not sw-e10s and not asan and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): TIMEOUT
+      FAIL
 
--- a/testing/web-platform/meta/html/browsers/history/the-history-interface/traverse_the_history_4.html.ini
+++ b/testing/web-platform/meta/html/browsers/history/the-history-interface/traverse_the_history_4.html.ini
@@ -1,4 +1,11 @@
 [traverse_the_history_4.html]
   [Multiple history traversals, last would be aborted]
-    expected: FAIL
+    expected:
+      if not debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): TIMEOUT
+      if not debug and webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): TIMEOUT
+      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): TIMEOUT
+      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): TIMEOUT
+      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): TIMEOUT
+      if not debug and not webrender and e10s and not sw-e10s and not asan and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): TIMEOUT
+      FAIL
 
--- a/testing/web-platform/meta/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini
+++ b/testing/web-platform/meta/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini
@@ -1,4 +1,11 @@
 [traverse_the_history_5.html]
   [Multiple history traversals, last would be aborted]
-    expected: FAIL
+    expected:
+      if not debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): TIMEOUT
+      if not debug and webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): TIMEOUT
+      if not debug and not webrender and e10s and not sw-e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): TIMEOUT
+      if not debug and not webrender and e10s and not sw-e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): TIMEOUT
+      if not debug and not webrender and e10s and not sw-e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): TIMEOUT
+      if not debug and not webrender and e10s and not sw-e10s and not asan and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): TIMEOUT
+      FAIL
 
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/html/browsers/history/the-location-interface/allow_prototype_cycle_through_location.sub.html.ini
@@ -0,0 +1,18 @@
+[allow_prototype_cycle_through_location.sub.html]
+  disabled: https://bugzilla.mozilla.org/show_bug.cgi?id=1504776
+  expected:
+    if not debug and not webrender and e10s and not sw-e10s and not asan and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): TIMEOUT
+    if not debug and not webrender and e10s and not sw-e10s and not asan and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): TIMEOUT
+    if not debug and webrender and e10s and not sw-e10s and not asan and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): ERROR
+    if not debug and not webrender and e10s and not sw-e10s and not asan and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): TIMEOUT
+    if debug and not webrender and e10s and not sw-e10s and not asan and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): ERROR
+    if not debug and not webrender and e10s and not sw-e10s and not asan and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): TIMEOUT
+    if debug and not webrender and e10s and not sw-e10s and not asan and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): TIMEOUT
+    if debug and not webrender and e10s and not sw-e10s and not asan and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): ERROR
+    if debug and not webrender and not e10s and not sw-e10s and not asan and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): ERROR
+    if debug and webrender and e10s and not sw-e10s and not asan and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): ERROR
+    if not debug and not webrender and e10s and not sw-e10s and not asan and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): TIMEOUT
+    if debug and not webrender and e10s and not sw-e10s and not asan and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): ERROR
+    if not debug and not webrender and e10s and not sw-e10s and asan and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): ERROR
+    if debug and not webrender and e10s and sw-e10s and not asan and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): ERROR
+    if debug and not webrender and e10s and not sw-e10s and not asan and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): TIMEOUT
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/html/browsers/history/the-location-interface/location-prototype-setting-goes-cross-origin-domain.sub.html.ini
@@ -0,0 +1,17 @@
+[location-prototype-setting-goes-cross-origin-domain.sub.html]
+  disabled: https://bugzilla.mozilla.org/show_bug.cgi?id=1504776
+  expected:
+    if debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): ERROR
+    if debug and not webrender and not e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): ERROR
+    if debug and webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): ERROR
+    if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): ERROR
+    if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): ERROR
+    if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): ERROR
+    if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): ERROR
+    if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): ERROR
+    if not debug and webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): TIMEOUT
+    if debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): ERROR
+    if not debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): ERROR
+    if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): ERROR
+    if not asan: TIMEOUT
+    if asan: ERROR
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/html/browsers/history/the-location-interface/location-prototype-setting-same-origin-domain.sub.html.ini
@@ -0,0 +1,2 @@
+[location-prototype-setting-same-origin-domain.sub.html]
+  expected: TIMEOUT
--- a/testing/web-platform/meta/html/browsers/origin/relaxing-the-same-origin-restriction/document_domain_setter.html.ini
+++ b/testing/web-platform/meta/html/browsers/origin/relaxing-the-same-origin-restriction/document_domain_setter.html.ini
@@ -1,4 +1,2 @@
 [document_domain_setter.html]
-  [failed setting of document.domain for documents without browsing context]
-    expected: FAIL
-
+  disabled: https://bugzilla.mozilla.org/show_bug.cgi?id=1504776
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/html/browsers/origin/relaxing-the-same-origin-restriction/document_domain_setter_srcdoc.html.ini
@@ -0,0 +1,17 @@
+[document_domain_setter_srcdoc.html]
+  disabled: https://bugzilla.mozilla.org/show_bug.cgi?id=1504776
+  expected:
+    if debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): TIMEOUT
+    if not debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): TIMEOUT
+    if debug and webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): ERROR
+    if not debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): TIMEOUT
+    if not debug and webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): TIMEOUT
+    if debug and not webrender and not e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): ERROR
+    if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): TIMEOUT
+    if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): TIMEOUT
+    if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): TIMEOUT
+    if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): TIMEOUT
+    if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): TIMEOUT
+    if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): ERROR
+    if not sw-e10s: ERROR
+    if sw-e10s: TIMEOUT
--- a/testing/web-platform/meta/html/browsers/origin/relaxing-the-same-origin-restriction/sandboxed-document_domain.html.ini
+++ b/testing/web-platform/meta/html/browsers/origin/relaxing-the-same-origin-restriction/sandboxed-document_domain.html.ini
@@ -1,9 +1,10 @@
 [sandboxed-document_domain.html]
+  expected: TIMEOUT
   [Sandboxed document.domain 1]
     expected: FAIL
 
   [Sandboxed document.domain 2]
     expected: FAIL
 
   [Sandboxed document.domain 3]
     expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/html/browsers/the-windowproxy-exotic-object/windowproxy-prototype-setting-goes-cross-origin-domain.sub.html.ini
@@ -0,0 +1,6 @@
+[windowproxy-prototype-setting-goes-cross-origin-domain.sub.html]
+  disabled: disabled: https://bugzilla.mozilla.org/show_bug.cgi?id=1504776
+  expected:
+    if not debug and not webrender and e10s and not sw-e10s and not asan and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): TIMEOUT
+    if not debug and not webrender and e10s and not sw-e10s and asan and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): TIMEOUT
+    ERROR
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/html/browsers/the-windowproxy-exotic-object/windowproxy-prototype-setting-same-origin-domain.sub.html.ini
@@ -0,0 +1,2 @@
+[windowproxy-prototype-setting-same-origin-domain.sub.html]
+  expected: TIMEOUT
--- a/testing/web-platform/meta/html/dom/elements/the-innertext-idl-attribute/getter.html.ini
+++ b/testing/web-platform/meta/html/dom/elements/the-innertext-idl-attribute/getter.html.ini
@@ -1,4 +1,16 @@
 [getter.html]
   [<canvas><div id='target'> contents ok for element not being rendered ("<canvas><div id='target'>abc")]
     expected: FAIL
 
+  [Trailing whitesapce should not be collapsed ("<div>abc <img>")]
+    expected: FAIL
+
+  [Whitespace around <img> should not be collapsed ("<div>abc <img> def")]
+    expected: FAIL
+
+  [Whitespace around <img> should not be collapsed ("<div>abc <img width=1 height=1> def")]
+    expected: FAIL
+
+  [Leading whitesapce should not be collapsed ("<div><img> abc")]
+    expected: FAIL
+
--- a/testing/web-platform/meta/html/dom/interfaces.https.html.ini
+++ b/testing/web-platform/meta/html/dom/interfaces.https.html.ini
@@ -345,16 +345,18 @@
     expected: FAIL
 
   [Window interface: window must inherit property "onunhandledrejection" with the proper type]
     expected: FAIL
 
   [html interfaces]
     expected: FAIL
 
+  [Window interface: window must inherit property "onunload" with the proper type]
+    disabled: https://bugzilla.mozilla.org/show_bug.cgi?id=1505149
 
 [interfaces.https.html?include=HTML.*]
   [HTMLAllCollection must be primary interface of document.all]
     expected: FAIL
 
   [Stringification of document.all]
     expected: FAIL
 
@@ -746,16 +748,21 @@
     expected: FAIL
 
   [HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onunhandledrejection" with the proper type]
     expected: FAIL
 
   [html interfaces]
     expected: FAIL
 
+  [HTMLBodyElement interface: document.createElement("body") must inherit property "onunload" with the proper type]
+    disabled: https://bugzilla.mozilla.org/show_bug.cgi?id=1505149
+
+  [HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onunload" with the proper type]
+    disabled: https://bugzilla.mozilla.org/show_bug.cgi?id=1505149
 
 [interfaces.https.html?exclude=(Document|Window|HTML.*)]
   [AudioTrackList interface: existence and properties of interface object]
     expected: FAIL
 
   [AudioTrackList interface object length]
     expected: FAIL
 
--- a/testing/web-platform/meta/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/window-domain-success.sub.html.ini
+++ b/testing/web-platform/meta/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/window-domain-success.sub.html.ini
@@ -1,4 +1,5 @@
 [window-domain-success.sub.html]
+  expected: TIMEOUT
   [postMessaging to a same-origin-domain (but not same-origin) iframe allows them to see each others' modifications]
     expected: FAIL
 
--- a/testing/web-platform/meta/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/window-similar-but-cross-origin-success.sub.html.ini
+++ b/testing/web-platform/meta/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/window-similar-but-cross-origin-success.sub.html.ini
@@ -1,4 +1,5 @@
 [window-similar-but-cross-origin-success.sub.html]
+  expected: TIMEOUT
   [postMessaging to a not same-origin-domain, but similar origin, iframe allows them to see each others' modifications]
     expected: FAIL
 
deleted file mode 100644
--- a/testing/web-platform/meta/html/interaction/focus/sequential-focus-navigation-and-the-tabindex-attribute/focus-tabindex-order.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[focus-tabindex-order.html]
-  [Elements with different tabindex must be focused sequentially when pressing 'Tab' keys]
-    expected: FAIL
-
--- a/testing/web-platform/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-integrity-classic.sub.html.ini
+++ b/testing/web-platform/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-integrity-classic.sub.html.ini
@@ -1,13 +1,10 @@
 [string-compilation-integrity-classic.sub.html]
-  expected:
-    if debug: ERROR
-    if asan: ERROR
-    TIMEOUT
+  expected: TIMEOUT
   [setTimeout should fail to import]
     expected: TIMEOUT
 
   [the Function constructor should fail to import]
     expected: NOTRUN
 
   [eval should fail to import]
     expected: FAIL
--- a/testing/web-platform/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-integrity-module.sub.html.ini
+++ b/testing/web-platform/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-integrity-module.sub.html.ini
@@ -1,13 +1,10 @@
 [string-compilation-integrity-module.sub.html]
-  expected:
-    if debug: ERROR
-    if asan: ERROR
-    TIMEOUT
+  expected: TIMEOUT
   [setTimeout should fail to import]
     expected: TIMEOUT
 
   [the Function constructor should fail to import]
     expected: NOTRUN
 
   [eval should fail to import]
     expected: FAIL
--- a/testing/web-platform/meta/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/bailout-exception-vs-return-origin.sub.window.js.ini
+++ b/testing/web-platform/meta/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/bailout-exception-vs-return-origin.sub.window.js.ini
@@ -1,9 +1,10 @@
 [bailout-exception-vs-return-origin.sub.window.html]
+  expected: TIMEOUT
   [document.open should throw a SecurityError with cross-origin document even when the ignore-opens-during-unload counter is greater than 0 (during unload event)]
     expected: FAIL
 
   [document.open should throw a SecurityError with cross-origin document even when there is an active parser executing script]
     expected: FAIL
 
   [document.open should throw a SecurityError with cross-origin document even when the ignore-opens-during-unload counter is greater than 0 (during pagehide event)]
     expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/bailout-side-effects-same-origin-domain.sub.window.js.ini
@@ -0,0 +1,2 @@
+[bailout-side-effects-same-origin-domain.sub.window.html]
+  expected: TIMEOUT
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/origin-check-in-document-open-same-origin-domain.sub.html.ini
@@ -0,0 +1,18 @@
+[origin-check-in-document-open-same-origin-domain.sub.html]
+  disabled: https://bugzilla.mozilla.org/show_bug.cgi?id=1504776
+  expected:
+    if not debug and not webrender and e10s and not sw-e10s and not asan and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): TIMEOUT
+    if not debug and not webrender and e10s and not sw-e10s and not asan and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): TIMEOUT
+    if not debug and webrender and e10s and not sw-e10s and not asan and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): ERROR
+    if not debug and not webrender and e10s and not sw-e10s and not asan and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): TIMEOUT
+    if debug and not webrender and e10s and not sw-e10s and not asan and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): TIMEOUT
+    if not debug and not webrender and e10s and not sw-e10s and not asan and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): TIMEOUT
+    if debug and not webrender and e10s and not sw-e10s and not asan and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): ERROR
+    if debug and not webrender and e10s and not sw-e10s and not asan and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): TIMEOUT
+    if debug and not webrender and not e10s and not sw-e10s and not asan and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): ERROR
+    if debug and webrender and e10s and not sw-e10s and not asan and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): ERROR
+    if not debug and not webrender and e10s and not sw-e10s and not asan and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): ERROR
+    if debug and not webrender and e10s and not sw-e10s and not asan and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): ERROR
+    if not debug and not webrender and e10s and not sw-e10s and asan and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): ERROR
+    if debug and not webrender and e10s and sw-e10s and not asan and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): ERROR
+    if debug and not webrender and e10s and not sw-e10s and not asan and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): ERROR
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/infrastructure/assumptions/allowed-to-play.html.ini
@@ -0,0 +1,9 @@
+[allowed-to-play.html]
+  [<video> autoplay]
+    expected:
+      if debug and not webrender and not e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): FAIL
+
+  [<audio> autoplay]
+    expected:
+      if debug and not webrender and not e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): FAIL
+
--- a/testing/web-platform/meta/intersection-observer/target-in-different-window.html.ini
+++ b/testing/web-platform/meta/intersection-observer/target-in-different-window.html.ini
@@ -1,6 +1,9 @@
 [target-in-different-window.html]
+  disabled: https://bugzilla.mozilla.org/show_bug.cgi?id=1497420
   [IntersectionObserver with target in a different window.]
     expected:
       if debug and not webrender and not e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): PASS
+      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
+      if debug and webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): PASS
       FAIL
 
--- a/testing/web-platform/meta/mozilla-sync
+++ b/testing/web-platform/meta/mozilla-sync
@@ -1,2 +1,2 @@
-local: db5952ad2f9586639fd0aeea8a5cd2d9967c101e
-upstream: 37d83def16bacfa66abac065f8f5adc8f7e7a4fc
+local: d6553a4ad983bb2712a5d32f4a0d237119805f74
+upstream: 7a90fe44448f11627531b6c240d4fa46db123f56
--- a/testing/web-platform/meta/payment-request/allowpaymentrequest/no-attribute-cross-origin-bc-containers.https.html.ini
+++ b/testing/web-platform/meta/payment-request/allowpaymentrequest/no-attribute-cross-origin-bc-containers.https.html.ini
@@ -1,17 +1,17 @@
 [no-attribute-cross-origin-bc-containers.https.html]
   [iframe]
-    expected: 
+    expected:
       if not e10s: FAIL
 
   [frame]
-    expected: 
+    expected:
       if not e10s: FAIL
 
   [object]
-    expected: 
+    expected:
       if not e10s: FAIL
 
   [embed]
-    expected: 
+    expected:
       if not e10s: FAIL
 
--- a/testing/web-platform/meta/pointerevents/extension/pointerevent_constructor.html.ini
+++ b/testing/web-platform/meta/pointerevents/extension/pointerevent_constructor.html.ini
@@ -1,2 +1,5 @@
 [pointerevent_constructor.html]
   prefs: [dom.w3c_pointer_events.enabled:true]
+  [PointerEvent: Constructor test]
+    expected: FAIL
+
--- a/testing/web-platform/meta/screen-capture/getdisplaymedia.https.html.ini
+++ b/testing/web-platform/meta/screen-capture/getdisplaymedia.https.html.ini
@@ -15,8 +15,20 @@
     expected: FAIL
 
   [getDisplayMedia() with video true]
     expected: FAIL
 
   [getDisplayMedia() with getSettings]
     expected: FAIL
 
+  [getDisplayMedia() call with max constraint]
+    expected: FAIL
+
+  [getDisplayMedia() call with exact constraint]
+    expected: FAIL
+
+  [getDisplayMedia() call with min constraint]
+    expected: FAIL
+
+  [getDisplayMedia() call with advanced constraint]
+    expected: FAIL
+
deleted file mode 100644
--- a/testing/web-platform/meta/server-timing/cross_origin.html.ini
+++ /dev/null
@@ -1,10 +0,0 @@
-[cross_origin.html]
-  [Untitled]
-    expected: FAIL
-
-  [Expected entry count for http://web-platform.test:8000/server-timing/resources/blue.png: 1]
-    expected: FAIL
-
-  [cross_origin]
-    expected: FAIL
-
deleted file mode 100644
--- a/testing/web-platform/meta/server-timing/idlharness.any.js.ini
+++ /dev/null
@@ -1,69 +0,0 @@
-[idlharness.any.html]
-  [PerformanceServerTiming interface: existence and properties of interface object]
-    expected: FAIL
-
-  [PerformanceServerTiming interface object length]
-    expected: FAIL
-
-  [PerformanceServerTiming interface object name]
-    expected: FAIL
-
-  [PerformanceServerTiming interface: existence and properties of interface prototype object]
-    expected: FAIL
-
-  [PerformanceServerTiming interface: existence and properties of interface prototype object's "constructor" property]
-    expected: FAIL
-
-  [PerformanceServerTiming interface: existence and properties of interface prototype object's @@unscopables property]
-    expected: FAIL
-
-  [PerformanceServerTiming interface: attribute name]
-    expected: FAIL
-
-  [PerformanceServerTiming interface: attribute duration]
-    expected: FAIL
-
-  [PerformanceServerTiming interface: attribute description]
-    expected: FAIL
-
-  [PerformanceServerTiming interface: operation toJSON()]
-    expected: FAIL
-
-  [PerformanceResourceTiming interface: attribute serverTiming]
-    expected: FAIL
-
-
-[idlharness.any.worker.html]
-  [PerformanceServerTiming interface: existence and properties of interface object]
-    expected: FAIL
-
-  [PerformanceServerTiming interface object length]
-    expected: FAIL
-
-  [PerformanceServerTiming interface object name]
-    expected: FAIL
-
-  [PerformanceServerTiming interface: existence and properties of interface prototype object]
-    expected: FAIL
-
-  [PerformanceServerTiming interface: existence and properties of interface prototype object's "constructor" property]
-    expected: FAIL
-
-  [PerformanceServerTiming interface: existence and properties of interface prototype object's @@unscopables property]
-    expected: FAIL
-
-  [PerformanceServerTiming interface: attribute name]
-    expected: FAIL
-
-  [PerformanceServerTiming interface: attribute duration]
-    expected: FAIL
-
-  [PerformanceServerTiming interface: attribute description]
-    expected: FAIL
-
-  [PerformanceServerTiming interface: operation toJSON()]
-    expected: FAIL
-
-  [PerformanceResourceTiming interface: attribute serverTiming]
-    expected: FAIL
-
deleted file mode 100644
--- a/testing/web-platform/meta/server-timing/navigation_timing_idl.html.ini
+++ /dev/null
@@ -1,7 +0,0 @@
-[navigation_timing_idl.html]
-  [Untitled]
-    expected: FAIL
-
-  [navigation_timing_idl]
-    expected: FAIL
-
deleted file mode 100644
--- a/testing/web-platform/meta/server-timing/resource_timing_idl.html.ini
+++ /dev/null
@@ -1,7 +0,0 @@
-[resource_timing_idl.html]
-  [Untitled]
-    expected: FAIL
-
-  [resource_timing_idl]
-    expected: FAIL
-
deleted file mode 100644
--- a/testing/web-platform/meta/server-timing/server_timing_header-parsing.html.ini
+++ /dev/null
@@ -1,217 +0,0 @@
-[server_timing_header-parsing.html]
-  [Untitled]
-    expected: FAIL
-
-  [1.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [2.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [3.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [4.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [5.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [7.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [6.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [8.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [9.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [10.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [11.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [12.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [13.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [14.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [15.js - count (0 ?== 3)]
-    expected: FAIL
-
-  [16.js - count (0 ?== 5)]
-    expected: FAIL
-
-  [17.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [18.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [19.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [20.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [21.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [22.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [23.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [24.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [25.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [26.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [28.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [27.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [29.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [30.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [31.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [33.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [32.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [34.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [35.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [37.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [36.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [38.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [39.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [40.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [42.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [41.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [43.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [44.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [45.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [46.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [47.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [48.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [50.js - count (0 ?== 2)]
-    expected: FAIL
-
-  [51.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [49.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [54.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [52.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [53.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [55.js - count (0 ?== 2)]
-    expected: FAIL
-
-  [56.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [57.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [59.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [58.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [60.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [61.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [63.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [65.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [62.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [64.js - count (0 ?== 2)]
-    expected: FAIL
-
-  [68.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [66.js - count (0 ?== 2)]
-    expected: FAIL
-
-  [67.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [69.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [70.js - count (0 ?== 1)]
-    expected: FAIL
-
-  [server_timing_header-parsing]
-    expected: FAIL
-
deleted file mode 100644
--- a/testing/web-platform/meta/server-timing/test_server_timing.html.ini
+++ /dev/null
@@ -1,25 +0,0 @@
-[test_server_timing.html]
-  [Untitled]
-    expected: FAIL
-
-  [Untitled 1]
-    expected: FAIL
-
-  [Untitled 2]
-    expected: FAIL
-
-  [Entry {"duration":1.1,"name":"metric1","description":"document"} could not be found.]
-    expected: FAIL
-
-  [Entry {"duration":1.2,"name":"metric1","description":"document"} could not be found.]
-    expected: FAIL
-
-  [Entry {"duration":2.1,"name":"metric2","description":"blue.png"} could not be found.]
-    expected: FAIL
-
-  [Entry {"duration":3.1,"name":"metric3","description":"green.png"} could not be found.]
-    expected: FAIL
-
-  [test_server_timing]
-    expected: FAIL
-
--- a/testing/web-platform/meta/service-workers/service-worker/fetch-request-css-images.https.html.ini
+++ b/testing/web-platform/meta/service-workers/service-worker/fetch-request-css-images.https.html.ini
@@ -1,8 +1,8 @@
 [fetch-request-css-images.https.html]
   expected: TIMEOUT
   [Verify FetchEvent for css image-set (backgroundImage).]
     expected: TIMEOUT
 
   [Verify FetchEvent for css image-set (shapeOutside).]
-    expected: TIMEOUT
+    expected: NOTRUN
 
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/signed-exchange/fallback-to-another-sxg.tentative.html.ini
@@ -0,0 +1,4 @@
+[fallback-to-another-sxg.tentative.html]
+  [Fallback redirect to another SignedHTTPExchange]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/signed-exchange/nested-sxg.tentative.html.ini
@@ -0,0 +1,4 @@
+[nested-sxg.tentative.html]
+  [Nested SignedHTTPExchange]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/signed-exchange/sxg-fallback-with-fragment.tentative.html.ini
@@ -0,0 +1,4 @@
+[sxg-fallback-with-fragment.tentative.html]
+  [Fallback redirect of SignedHTTPExchange should preserve URL fragment]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/signed-exchange/sxg-invalid-validity-url.tentative.html.ini
@@ -0,0 +1,4 @@
+[sxg-invalid-validity-url.tentative.html]
+  [Loading SignedHTTPExchange which validity URL is different origin from request URL must fail]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/signed-exchange/sxg-location-fragment.tentative.html.ini
@@ -0,0 +1,4 @@
+[sxg-location-fragment.tentative.html]
+  [Navigating to a Signed Exchange should preserve URL fragment]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/signed-exchange/sxg-location.tentative.html.ini
@@ -0,0 +1,4 @@
+[sxg-location.tentative.html]
+  [Location of SignedHTTPExchange]
+    expected: FAIL
+
--- a/testing/web-platform/meta/touch-events/idlharness.window.js.ini
+++ b/testing/web-platform/meta/touch-events/idlharness.window.js.ini
@@ -30,8 +30,11 @@
     expected: FAIL
 
   [GlobalEventHandlers interface: window must inherit property "ontouchmove" with the proper type]
     expected: FAIL
 
   [GlobalEventHandlers interface: window must inherit property "ontouchcancel" with the proper type]
     expected: FAIL
 
+  [idl_test setup]
+    expected: FAIL
+
--- a/testing/web-platform/meta/trusted-types/block-string-assignment-to-Location-assign.tentative.html.ini
+++ b/testing/web-platform/meta/trusted-types/block-string-assignment-to-Location-assign.tentative.html.ini
@@ -1,2 +1,2 @@
 [block-string-assignment-to-Location-assign.tentative.html]
-  expected: TIMEOUT
+  expected: ERROR
--- a/testing/web-platform/meta/trusted-types/block-string-assignment-to-Location-href.tentative.html.ini
+++ b/testing/web-platform/meta/trusted-types/block-string-assignment-to-Location-href.tentative.html.ini
@@ -1,2 +1,2 @@
 [block-string-assignment-to-Location-href.tentative.html]
-  expected: TIMEOUT
+  expected: ERROR
--- a/testing/web-platform/meta/trusted-types/block-string-assignment-to-Location-replace.tentative.html.ini
+++ b/testing/web-platform/meta/trusted-types/block-string-assignment-to-Location-replace.tentative.html.ini
@@ -1,2 +1,2 @@
 [block-string-assignment-to-Location-replace.tentative.html]
-  expected: TIMEOUT
+  expected: ERROR
--- a/testing/web-platform/meta/url/a-element-xhtml.xhtml.ini
+++ b/testing/web-platform/meta/url/a-element-xhtml.xhtml.ini
@@ -775,8 +775,53 @@
     expected: FAIL
 
   [Parsing: <a//> against <about:blank>]
     expected: FAIL
 
   [Parsing: <notspecial://host/?'> against <about:blank>]
     expected: FAIL
 
+  [Parsing: <sc://faß.ExAmPlE/> against <about:blank>]
+    expected: FAIL
+
+  [Parsing: <sc://ñ> against <about:blank>]
+    expected: FAIL
+
+  [Parsing: <sc://ñ.test/> against <about:blank>]
+    expected: FAIL
+
+  [Parsing: <sc://ñ#x> against <about:blank>]
+    expected: FAIL
+
+  [Parsing: <http://%00.com> against <http://other.com/>]
+    expected: FAIL
+
+  [Parsing: <x> against <sc://ñ>]
+    expected: FAIL
+
+  [Parsing: <http://%41.com> against <http://other.com/>]
+    expected: FAIL
+
+  [Parsing: <http://﷐zyx.com> against <http://other.com/>]
+    expected: FAIL
+
+  [Parsing: <https://�> against <about:blank>]
+    expected: FAIL
+
+  [Parsing: <data:test# »> against <about:blank>]
+    expected: FAIL
+
+  [Parsing: <ssh://example.com/foo/bar.git> against <http://example.org/>]
+    expected: FAIL
+
+  [Parsing: <sc://ñ?x> against <about:blank>]
+    expected: FAIL
+
+  [Parsing: <?x> against <sc://ñ>]
+    expected: FAIL
+
+  [Parsing: <http://GOO  goo.com> against <http://other.com/>]
+    expected: FAIL
+
+  [Parsing: <#x> against <sc://ñ>]
+    expected: FAIL
+
--- a/testing/web-platform/meta/url/a-element.html.ini
+++ b/testing/web-platform/meta/url/a-element.html.ini
@@ -784,8 +784,53 @@
     expected: FAIL
 
   [Parsing: <a//> against <about:blank>]
     expected: FAIL
 
   [Parsing: <notspecial://host/?'> against <about:blank>]
     expected: FAIL
 
+  [Parsing: <sc://faß.ExAmPlE/> against <about:blank>]
+    expected: FAIL
+
+  [Parsing: <sc://ñ> against <about:blank>]
+    expected: FAIL
+
+  [Parsing: <sc://ñ.test/> against <about:blank>]
+    expected: FAIL
+
+  [Parsing: <sc://ñ#x> against <about:blank>]
+    expected: FAIL
+
+  [Parsing: <http://%00.com> against <http://other.com/>]
+    expected: FAIL
+
+  [Parsing: <x> against <sc://ñ>]
+    expected: FAIL
+
+  [Parsing: <http://%41.com> against <http://other.com/>]
+    expected: FAIL
+
+  [Parsing: <http://﷐zyx.com> against <http://other.com/>]
+    expected: FAIL
+
+  [Parsing: <https://�> against <about:blank>]
+    expected: FAIL
+
+  [Parsing: <data:test# »> against <about:blank>]
+    expected: FAIL
+
+  [Parsing: <ssh://example.com/foo/bar.git> against <http://example.org/>]
+    expected: FAIL
+
+  [Parsing: <sc://ñ?x> against <about:blank>]
+    expected: FAIL
+
+  [Parsing: <?x> against <sc://ñ>]
+    expected: FAIL
+
+  [Parsing: <http://GOO  goo.com> against <http://other.com/>]
+    expected: FAIL
+
+  [Parsing: <#x> against <sc://ñ>]
+    expected: FAIL
+
--- a/testing/web-platform/meta/url/url-constructor.html.ini
+++ b/testing/web-platform/meta/url/url-constructor.html.ini
@@ -445,8 +445,50 @@
     expected: FAIL
 
   [Parsing: <test-a-colon-slash-slash-b.html> against <a://b>]
     expected: FAIL
 
   [Parsing: <notspecial://host/?'> against <about:blank>]
     expected: FAIL
 
+  [Parsing: <sc://faß.ExAmPlE/> against <about:blank>]
+    expected: FAIL
+
+  [Parsing: <sc://ñ> against <about:blank>]
+    expected: FAIL
+
+  [Parsing: <sc://ñ.test/> against <about:blank>]
+    expected: FAIL
+
+  [Parsing: <sc://ñ#x> against <about:blank>]
+    expected: FAIL
+
+  [Parsing: <http://%00.com> against <http://other.com/>]
+    expected: FAIL
+
+  [Parsing: <x> against <sc://ñ>]
+    expected: FAIL
+
+  [Parsing: <http://%41.com> against <http://other.com/>]
+    expected: FAIL
+
+  [Parsing: <http://﷐zyx.com> against <http://other.com/>]
+    expected: FAIL
+
+  [Parsing: <https://�> against <about:blank>]
+    expected: FAIL
+
+  [Parsing: <data:test# »> against <about:blank>]
+    expected: FAIL
+
+  [Parsing: <ssh://example.com/foo/bar.git> against <http://example.org/>]
+    expected: FAIL
+
+  [Parsing: <sc://ñ?x> against <about:blank>]
+    expected: FAIL
+
+  [Parsing: <?x> against <sc://ñ>]
+    expected: FAIL
+
+  [Parsing: <#x> against <sc://ñ>]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/wasm/serialization/window-domain-success.sub.html.ini
@@ -0,0 +1,2 @@
+[window-domain-success.sub.html]
+  expected: TIMEOUT
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/wasm/serialization/window-similar-but-cross-origin-success.sub.html.ini
@@ -0,0 +1,2 @@
+[window-similar-but-cross-origin-success.sub.html]
+  expected: TIMEOUT
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/webmidi/idlharness.https.window.js.ini
@@ -0,0 +1,247 @@
+[idlharness.https.window.html]
+  [MIDIAccess must be primary interface of access]
+    expected: FAIL
+
+  [MIDIOutputMap interface object name]
+    expected: FAIL
+
+  [MIDIOutput interface: existence and properties of interface prototype object's @@unscopables property]
+    expected: FAIL
+
+  [MIDIOutput interface: existence and properties of interface object]
+    expected: FAIL
+
+  [MIDIInput interface: existence and properties of interface prototype object's @@unscopables property]
+    expected: FAIL
+
+  [MIDIInputMap interface: existence and properties of interface prototype object's @@unscopables property]
+    expected: FAIL
+
+  [MIDIAccess interface: attribute outputs]
+    expected: FAIL
+
+  [MIDIPort interface object length]
+    expected: FAIL
+
+  [MIDIInputMap interface: existence and properties of interface object]
+    expected: FAIL
+
+  [MIDIPort interface: existence and properties of interface object]
+    expected: FAIL
+
+  [MIDIInputMap must be primary interface of inputs]
+    expected: FAIL
+
+  [MIDIAccess interface: access must inherit property "outputs" with the proper type]
+    expected: FAIL
+
+  [MIDIMessageEvent interface: existence and properties of interface prototype object's @@unscopables property]
+    expected: FAIL
+
+  [MIDIOutputMap interface object length]
+    expected: FAIL
+
+  [MIDIInput interface: existence and properties of interface object]
+    expected: FAIL
+
+  [MIDIOutputMap interface: existence and properties of interface object]
+    expected: FAIL
+
+  [MIDIPort interface: attribute version]
+    expected: FAIL
+
+  [MIDIAccess interface: existence and properties of interface prototype object]
+    expected: FAIL
+
+  [MIDIOutput interface: operation send([object Object\], DOMHighResTimeStamp)]
+    expected: FAIL
+
+  [MIDIInputMap interface: existence and properties of interface prototype object's "constructor" property]
+    expected: FAIL
+
+  [MIDIPort interface: attribute onstatechange]
+    expected: FAIL
+
+  [MIDIInputMap interface object length]
+    expected: FAIL
+
+  [MIDIInput interface: existence and properties of interface prototype object's "constructor" property]
+    expected: FAIL
+
+  [MIDIPort interface: operation open()]
+    expected: FAIL
+
+  [MIDIConnectionEvent interface: existence and properties of interface prototype object's "constructor" property]
+    expected: FAIL
+
+  [MIDIOutput interface object length]
+    expected: FAIL
+
+  [MIDIAccess interface: attribute inputs]
+    expected: FAIL
+
+  [Stringification of inputs]
+    expected: FAIL
+
+  [MIDIInputMap interface object name]
+    expected: FAIL
+
+  [MIDIOutputMap interface: existence and properties of interface prototype object's "constructor" property]
+    expected: FAIL
+
+  [MIDIAccess interface: access must inherit property "inputs" with the proper type]
+    expected: FAIL
+
+  [MIDIMessageEvent interface object name]
+    expected: FAIL
+
+  [MIDIAccess interface: access must inherit property "onstatechange" with the proper type]
+    expected: FAIL
+
+  [MIDIInputMap interface: existence and properties of interface prototype object]
+    expected: FAIL
+
+  [MIDIInput interface object length]
+    expected: FAIL
+
+  [MIDIInput interface: existence and properties of interface prototype object]
+    expected: FAIL
+
+  [MIDIAccess interface: access must inherit property "sysexEnabled" with the proper type]
+    expected: FAIL
+
+  [MIDIMessageEvent interface: attribute data]
+    expected: FAIL
+
+  [MIDIConnectionEvent interface: existence and properties of interface prototype object]
+    expected: FAIL
+
+  [Stringification of outputs]
+    expected: FAIL
+
+  [MIDIPort interface: attribute connection]
+    expected: FAIL
+
+  [MIDIOutput interface: existence and properties of interface prototype object's "constructor" property]
+    expected: FAIL
+
+  [MIDIMessageEvent interface: existence and properties of interface prototype object's "constructor" property]
+    expected: FAIL
+
+  [MIDIOutput interface: operation clear()]
+    expected: FAIL
+
+  [MIDIPort interface: operation close()]
+    expected: FAIL
+
+  [MIDIPort interface: attribute manufacturer]
+    expected: FAIL
+
+  [MIDIOutputMap interface: existence and properties of interface prototype object]
+    expected: FAIL
+
+  [MIDIPort interface: attribute type]
+    expected: FAIL
+
+  [MIDIConnectionEvent interface object length]
+    expected: FAIL
+
+  [MIDIPort interface: existence and properties of interface prototype object's "constructor" property]
+    expected: FAIL
+
+  [MIDIPort interface: existence and properties of interface prototype object's @@unscopables property]
+    expected: FAIL
+
+  [MIDIConnectionEvent interface object name]
+    expected: FAIL
+
+  [MIDIAccess interface: attribute sysexEnabled]
+    expected: FAIL
+
+  [MIDIAccess interface object name]
+    expected: FAIL
+
+  [MIDIAccess interface object length]
+    expected: FAIL
+
+  [MIDIInput interface: attribute onmidimessage]
+    expected: FAIL
+
+  [MIDIAccess interface: attribute onstatechange]
+    expected: FAIL
+
+  [MIDIAccess interface: existence and properties of interface object]
+    expected: FAIL
+
+  [MIDIMessageEvent interface: existence and properties of interface object]
+    expected: FAIL
+
+  [Navigator interface: operation requestMIDIAccess(MIDIOptions)]
+    expected: FAIL
+
+  [MIDIConnectionEvent interface: attribute port]
+    expected: FAIL
+
+  [MIDIPort interface: attribute name]
+    expected: FAIL
+
+  [MIDIConnectionEvent interface: existence and properties of interface prototype object's @@unscopables property]
+    expected: FAIL
+
+  [MIDIPort interface: existence and properties of interface prototype object]
+    expected: FAIL
+
+  [Stringification of new MIDIConnectionEvent("type")]
+    expected: FAIL
+
+  [MIDIConnectionEvent interface: new MIDIConnectionEvent("type") must inherit property "port" with the proper type]
+    expected: FAIL
+
+  [MIDIOutput interface object name]
+    expected: FAIL
+
+  [MIDIAccess interface: existence and properties of interface prototype object's "constructor" property]
+    expected: FAIL
+
+  [idl_test setup]
+    expected: FAIL
+
+  [MIDIConnectionEvent interface: existence and properties of interface object]
+    expected: FAIL
+
+  [MIDIConnectionEvent must be primary interface of new MIDIConnectionEvent("type")]
+    expected: FAIL
+
+  [MIDIPort interface: attribute state]
+    expected: FAIL
+
+  [MIDIMessageEvent interface object length]
+    expected: FAIL
+
+  [MIDIOutputMap interface: existence and properties of interface prototype object's @@unscopables property]
+    expected: FAIL
+
+  [MIDIOutput interface: existence and properties of interface prototype object]
+    expected: FAIL
+
+  [Stringification of access]
+    expected: FAIL
+
+  [MIDIMessageEvent interface: existence and properties of interface prototype object]
+    expected: FAIL
+
+  [MIDIOutputMap must be primary interface of outputs]
+    expected: FAIL
+
+  [MIDIPort interface object name]
+    expected: FAIL
+
+  [MIDIAccess interface: existence and properties of interface prototype object's @@unscopables property]
+    expected: FAIL
+
+  [MIDIPort interface: attribute id]
+    expected: FAIL
+
+  [MIDIInput interface object name]
+    expected: FAIL
+
deleted file mode 100644
--- a/testing/web-platform/meta/webmidi/idlharness.window.js.ini
+++ /dev/null
@@ -1,250 +0,0 @@
-[idlharness.window.html]
-  [MIDIAccess interface: attribute outputs]
-    expected: FAIL
-
-  [MIDIInput interface: attribute onmidimessage]
-    expected: FAIL
-
-  [MIDIAccess interface: access must inherit property "outputs" with the proper type]
-    expected: FAIL
-
-  [MIDIPort interface: attribute onstatechange]
-    expected: FAIL
-
-  [Stringification of inputs]
-    expected: FAIL
-
-  [MIDIOutput interface: existence and properties of interface prototype object's @@unscopables property]
-    expected: FAIL
-
-  [MIDIAccess interface: access must inherit property "onstatechange" with the proper type]
-    expected: FAIL
-
-  [MIDIInputMap interface: existence and properties of interface prototype object]
-    expected: FAIL
-
-  [MIDIMessageEvent interface: attribute data]
-    expected: FAIL
-
-  [Navigator interface: operation requestMIDIAccess(MIDIOptions)]
-    expected: FAIL
-
-  [MIDIMessageEvent interface: existence and properties of interface prototype object's "constructor" property]
-    expected: FAIL
-
-  [MIDIOutput interface: existence and properties of interface prototype object's "constructor" property]
-    expected: FAIL
-
-  [MIDIPort interface: attribute type]
-    expected: FAIL
-
-  [MIDIPort interface: existence and properties of interface prototype object's @@unscopables property]
-    expected: FAIL
-
-  [Stringification of new MIDIConnectionEvent("type")]
-    expected: FAIL
-
-  [MIDIAccess interface: existence and properties of interface prototype object]
-    expected: FAIL
-
-  [MIDIMessageEvent interface: existence and properties of interface object]
-    expected: FAIL
-
-  [MIDIPort interface: operation open()]
-    expected: FAIL
-
-  [MIDIOutputMap must be primary interface of outputs]
-    expected: FAIL
-
-  [MIDIOutputMap interface: existence and properties of interface object]
-    expected: FAIL
-
-  [MIDIConnectionEvent interface object length]
-    expected: FAIL
-
-  [MIDIInput interface: existence and properties of interface prototype object's @@unscopables property]
-    expected: FAIL
-
-  [MIDIPort interface: existence and properties of interface object]
-    expected: FAIL
-
-  [MIDIInputMap must be primary interface of inputs]
-    expected: FAIL
-
-  [MIDIInputMap interface: existence and properties of interface object]
-    expected: FAIL
-
-  [MIDIAccess interface: attribute onstatechange]
-    expected: FAIL
-
-  [MIDIInput interface: existence and properties of interface prototype object's "constructor" property]
-    expected: FAIL
-
-  [MIDIInput interface object length]
-    expected: FAIL
-
-  [MIDIAccess interface: attribute inputs]
-    expected: FAIL
-
-  [MIDIInputMap interface object name]
-    expected: FAIL
-
-  [MIDIMessageEvent interface object name]
-    expected: FAIL
-
-  [MIDIAccess interface: existence and properties of interface prototype object's "constructor" property]
-    expected: FAIL
-
-  [Stringification of outputs]
-    expected: FAIL
-
-  [MIDIOutputMap interface: existence and properties of interface prototype object]
-    expected: FAIL
-
-  [MIDIAccess interface object name]
-    expected: FAIL
-
-  [MIDIAccess interface object length]
-    expected: FAIL
-
-  [MIDIOutput interface: operation send([object Object\], DOMHighResTimeStamp)]
-    expected: FAIL
-
-  [MIDIPort interface: existence and properties of interface prototype object]
-    expected: FAIL
-
-  [MIDIConnectionEvent interface: existence and properties of interface object]
-    expected: FAIL
-
-  [MIDIPort interface object name]
-    expected: FAIL
-
-  [MIDIAccess interface: existence and properties of interface prototype object's @@unscopables property]
-    expected: FAIL
-
-  [MIDIMessageEvent interface: existence and properties of interface prototype object]
-    expected: FAIL
-
-  [MIDIOutputMap interface object length]
-    expected: FAIL
-
-  [idlharness]
-    expected: FAIL
-
-  [MIDIPort interface: attribute version]
-    expected: FAIL
-
-  [MIDIConnectionEvent interface: existence and properties of interface prototype object]
-    expected: FAIL
-
-  [MIDIInputMap interface: existence and properties of interface prototype object's "constructor" property]
-    expected: FAIL
-
-  [MIDIOutputMap interface: existence and properties of interface prototype object's "constructor" property]
-    expected: FAIL
-
-  [MIDIConnectionEvent interface object name]
-    expected: FAIL
-
-  [MIDIInput interface: existence and properties of interface prototype object]
-    expected: FAIL
-
-  [MIDIAccess interface: access must inherit property "sysexEnabled" with the proper type]
-    expected: FAIL
-
-  [MIDIPort interface: attribute connection]
-    expected: FAIL
-
-  [MIDIOutput interface: operation clear()]
-    expected: FAIL
-
-  [MIDIPort interface: attribute manufacturer]
-    expected: FAIL
-
-  [MIDIAccess interface: access must inherit property "inputs" with the proper type]
-    expected: FAIL
-
-  [MIDIMessageEvent interface object length]
-    expected: FAIL
-
-  [MIDIAccess interface: existence and properties of interface object]
-    expected: FAIL
-
-  [MIDIOutput interface object length]
-    expected: FAIL
-
-  [MIDIConnectionEvent interface: new MIDIConnectionEvent("type") must inherit property "port" with the proper type]
-    expected: FAIL
-
-  [MIDIOutputMap interface object name]
-    expected: FAIL
-
-  [MIDIInputMap interface: existence and properties of interface prototype object's @@unscopables property]
-    expected: FAIL
-
-  [MIDIPort interface object length]
-    expected: FAIL
-
-  [MIDIInput interface: existence and properties of interface object]
-    expected: FAIL
-
-  [MIDIInput interface object name]
-    expected: FAIL
-
-  [Stringification of access]
-    expected: FAIL
-
-  [MIDIAccess must be primary interface of access]
-    expected: FAIL
-
-  [MIDIInputMap interface object length]
-    expected: FAIL
-
-  [MIDIMessageEvent interface: existence and properties of interface prototype object's @@unscopables property]
-    expected: FAIL
-
-  [MIDIPort interface: operation close()]
-    expected: FAIL
-
-  [MIDIConnectionEvent interface: attribute port]
-    expected: FAIL
-
-  [MIDIConnectionEvent interface: existence and properties of interface prototype object's "constructor" property]
-    expected: FAIL
-
-  [MIDIPort interface: existence and properties of interface prototype object's "constructor" property]
-    expected: FAIL
-
-  [MIDIAccess interface: attribute sysexEnabled]
-    expected: FAIL
-
-  [MIDIOutput interface: existence and properties of interface object]
-    expected: FAIL
-
-  [MIDIPort interface: attribute name]
-    expected: FAIL
-
-  [MIDIConnectionEvent interface: existence and properties of interface prototype object's @@unscopables property]
-    expected: FAIL
-
-  [MIDIOutput interface object name]
-    expected: FAIL
-
-  [MIDIConnectionEvent must be primary interface of new MIDIConnectionEvent("type")]
-    expected: FAIL
-
-  [MIDIPort interface: attribute state]
-    expected: FAIL
-
-  [MIDIOutputMap interface: existence and properties of interface prototype object's @@unscopables property]
-    expected: FAIL
-
-  [MIDIOutput interface: existence and properties of interface prototype object]
-    expected: FAIL
-
-  [MIDIPort interface: attribute id]
-    expected: FAIL
-
-  [idl_test setup]
-    expected: FAIL
-
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/webstorage/document-domain.html.ini
@@ -0,0 +1,2 @@
+[document-domain.html]
+  expected: TIMEOUT
--- a/testing/web-platform/tests/.taskcluster.yml
+++ b/testing/web-platform/tests/.taskcluster.yml
@@ -85,72 +85,76 @@ tasks:
                     --channel=${browser.channel}
                     --log-wptreport=../artifacts/wpt_report.json
                     --no-fail-on-unexpected
                     --test-type=${chunk[0]}
                     --this-chunk=${chunk[1]}
                     --total-chunks=${chunk[2]};
     - $if: tasks_for == "github-pull-request"
       then:
-        $map: [{name: firefox, channel: nightly}, {name: chrome, channel: dev}]
-        each(browser):
-          $map:
-            - name: wpt-${browser.name}-${browser.channel}-stability
-              description: >-
-                Verify that all tests affected by a pull request are stable
-                when executed in ${browser.name}.
-              extra_args: '--verify'
-            - name: wpt-${browser.name}-${browser.channel}-results
-              description: >-
-                Collect results for all tests affected by a pull request in
-                ${browser.name}.
-              extra_args: '--no-fail-on-unexpected --log-wptreport=../artifacts/wpt_report.json'
-          each(operation):
-            taskId: {$eval: 'as_slugid(operation.name)'}
-            taskGroupId: {$eval: 'as_slugid("task group")'}
-            created: {$fromNow: ''}
-            deadline: {$fromNow: '24 hours'}
-            provisionerId: aws-provisioner-v1
-            workerType:
-              $if: event.repository.full_name == 'web-platform-tests/wpt'
-              then:
-                wpt-docker-worker
-              else:
-                github-worker
-            metadata:
-              name: ${operation.name}
-              description: ${operation.description}
-              owner: ${event.pull_request.user.login}@users.noreply.github.com
-              source: ${event.repository.url}
-            payload:
-              image: jugglinmike/web-platform-tests:0.21
-              maxRunTime: 7200
-              artifacts:
-                public/results:
-                  path: /home/test/artifacts
-                  type: directory
-              # Fetch the GitHub-provided merge commit (rather than the pull
-              # request branch) so that the tasks simulate the behavior of the
-              # submitted patch after it is merged. Using the merge commit also
-              # simplifies detection of modified files because the first parent
-              # of the merge commit can consistently be used to summarize the
-              # changes.
-              command:
-                - /bin/bash
-                - --login
-                - -c
-                - set -ex;
-                  ~/start.sh
-                    ${event.repository.clone_url}
-                    refs/pull/${event.number}/merge
-                    FETCH_HEAD
-                    ${browser.name}
-                    ${browser.channel};
-                  cd ~/web-platform-tests;
-                  result=0;
-                  ./tools/ci/taskcluster-run.py
-                    --commit-range HEAD^
-                    ${browser.name}
-                    --
-                    --channel=${browser.channel}
-                    ${operation.extra_args} || result=$?;
-                  echo $result > ../artifacts/run-return-code.txt;
-                  echo "Command exited with code $result (failures are allowed while this task is being vetted)."
+        # Taskcluster responds to a number of events issued by the GitHub API
+        # which should not trigger re-validation.
+        $if: event.action in ['opened', 'reopened', 'synchronize']
+        then:
+          $map: [{name: firefox, channel: nightly}, {name: chrome, channel: dev}]
+          each(browser):
+            $map:
+              - name: wpt-${browser.name}-${browser.channel}-stability
+                description: >-
+                  Verify that all tests affected by a pull request are stable
+                  when executed in ${browser.name}.
+                extra_args: '--verify'
+              - name: wpt-${browser.name}-${browser.channel}-results
+                description: >-
+                  Collect results for all tests affected by a pull request in
+                  ${browser.name}.
+                extra_args: '--no-fail-on-unexpected --log-wptreport=../artifacts/wpt_report.json'
+            each(operation):
+              taskId: {$eval: 'as_slugid(operation.name)'}
+              taskGroupId: {$eval: 'as_slugid("task group")'}
+              created: {$fromNow: ''}
+              deadline: {$fromNow: '24 hours'}
+              provisionerId: aws-provisioner-v1
+              workerType:
+                $if: event.repository.full_name == 'web-platform-tests/wpt'
+                then:
+                  wpt-docker-worker
+                else:
+                  github-worker
+              metadata:
+                name: ${operation.name}
+                description: ${operation.description}
+                owner: ${event.pull_request.user.login}@users.noreply.github.com
+                source: ${event.repository.url}
+              payload:
+                image: jugglinmike/web-platform-tests:0.21
+                maxRunTime: 7200
+                artifacts:
+                  public/results:
+                    path: /home/test/artifacts
+                    type: directory
+                # Fetch the GitHub-provided merge commit (rather than the pull
+                # request branch) so that the tasks simulate the behavior of the
+                # submitted patch after it is merged. Using the merge commit also
+                # simplifies detection of modified files because the first parent
+                # of the merge commit can consistently be used to summarize the
+                # changes.
+                command:
+                  - /bin/bash
+                  - --login
+                  - -c
+                  - set -ex;
+                    ~/start.sh
+                      ${event.repository.clone_url}
+                      refs/pull/${event.number}/merge
+                      FETCH_HEAD
+                      ${browser.name}
+                      ${browser.channel};
+                    cd ~/web-platform-tests;
+                    result=0;
+                    ./tools/ci/taskcluster-run.py
+                      --commit-range HEAD^
+                      ${browser.name}
+                      --
+                      --channel=${browser.channel}
+                      ${operation.extra_args} || result=$?;
+                    echo $result > ../artifacts/run-return-code.txt;
+                    echo "Command exited with code $result (failures are allowed while this task is being vetted)."
--- a/testing/web-platform/tests/background-fetch/abort.https.window.js
+++ b/testing/web-platform/tests/background-fetch/abort.https.window.js
@@ -40,20 +40,35 @@ backgroundFetchTest(async (test, backgro
 
       assert_equals(eventRegistration.result, 'failure');
       assert_equals(eventRegistration.failureReason, 'aborted');
       assert_equals(registration.result, 'failure');
       assert_equals(registration.failureReason, 'aborted');
 
       assert_equals(type, 'backgroundfetchabort');
 
+      assert_equals(results.length, 2);
+
+      const completedResult = results[0] || results[1];
       // The abort might have gone through before the first result was persisted.
-      if (results.length === 1) {
-        assert_true(results[0].url.includes('resources/feature-name.txt'));
-        assert_equals(results[0].status, 200);
-        assert_equals(results[0].text, expectedResultText);
+      if (completedResult) {
+        assert_true(completedResult.url.includes('resources/feature-name.txt'));
+        assert_equals(completedResult.status, 200);
+        assert_equals(completedResult.text, expectedResultText);
       }
 
       resolve();
     };
   });
 
-}, 'Calling BackgroundFetchRegistration.abort sets the correct fields and responses are still available');
\ No newline at end of file
+}, 'Calling BackgroundFetchRegistration.abort sets the correct fields and responses are still available');
+
+backgroundFetchTest(async (test, backgroundFetch) => {
+  const registration = await backgroundFetch.fetch(
+      uniqueId(), '/serviceworker/resources/slow-response.php');
+  assert_true(await registration.abort());
+
+  const {results} = await getMessageFromServiceWorker();
+  assert_equals(results.length, 1);
+  assert_false(results[0].response);
+  assert_equals(results[0].name, 'AbortError');
+
+}, 'An aborted fetch throws a DOM exception when accessing an incomplete record', 'sw-abort.js');
\ No newline at end of file
--- a/testing/web-platform/tests/background-fetch/fetch.https.window.js
+++ b/testing/web-platform/tests/background-fetch/fetch.https.window.js
@@ -260,21 +260,63 @@ backgroundFetchTest(async (test, backgro
 
   assert_equals(registration.result, 'failure');
   assert_equals(registration.failureReason, 'bad-status');
 
 }, 'Using Background Fetch to fetch a non-existent resource should fail.');
 
 backgroundFetchTest(async (test, backgroundFetch) => {
   const registration = await backgroundFetch.fetch(
-                         'my-id',
-                         ['https://example.com', 'http://example.com']);
+      'my-id',
+      [location.origin, location.origin.replace('https', 'http')]);
 
   const {type, eventRegistration, results} = await getMessageFromServiceWorker();
 
   assert_equals('backgroundfetchfail', type);
   assert_equals(eventRegistration.failureReason, 'fetch-error');
 
   assert_equals(results.length, 2);
-  assert_true(results[0].url.includes('https://example.com'));
-  assert_equals(results[1].url, '');
+
+  const validResponse = results[0] ? results[0] : results[1];
+  const nullResponse = !results[0] ? results[0] : results[1];
+
+  assert_true(validResponse.url.includes(location.origin));
+  assert_equals(nullResponse, null);
 
 }, 'Fetches with mixed content should fail.');
+
+backgroundFetchTest(async (test, backgroundFetch) => {
+  const registrationId = 'matchexistingrequest';
+  const registration =
+    await backgroundFetch.fetch(registrationId, 'resources/feature-name.txt');
+
+  assert_equals(registration.id, registrationId);
+
+  const {type, eventRegistration, results} = await getMessageFromServiceWorker();
+  assert_equals('backgroundfetchsuccess', type);
+  assert_equals(results.length, 1);
+
+  assert_equals(eventRegistration.id, registration.id);
+  assert_equals(eventRegistration.result, 'success');
+  assert_equals(eventRegistration.failureReason, '');
+
+  assert_true(results[0].url.includes('resources/feature-name.txt'));
+  assert_equals(results[0].status, 200);
+  assert_equals(results[0].text, 'Background Fetch');
+
+}, 'Matching to a single request should work');
+
+backgroundFetchTest(async (test, backgroundFetch) => {
+  const registrationId = 'matchmissingrequest';
+  const registration =
+    await backgroundFetch.fetch(registrationId, 'resources/feature-name.txt');
+
+  assert_equals(registration.id, registrationId);
+
+  const {type, eventRegistration, results} = await getMessageFromServiceWorker();
+  assert_equals('backgroundfetchsuccess', type);
+  assert_equals(results.length, 0);
+
+  assert_equals(eventRegistration.id, registration.id);
+  assert_equals(eventRegistration.result, 'success');
+  assert_equals(eventRegistration.failureReason, '');
+
+}, 'Matching to a non-existing request should work');
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/background-fetch/service_workers/sw-abort.js
@@ -0,0 +1,23 @@
+importScripts('sw-helpers.js');
+
+async function getFetchResult(record) {
+  try {
+    await record.responseReady;
+  } catch (e) {
+    return {
+      response: false,
+      name: e.name,
+    };
+  }
+
+  return {
+    response: true,
+  };
+}
+self.addEventListener('backgroundfetchabort', event => {
+  event.waitUntil(
+    event.registration.matchAll()
+      .then(records =>
+            Promise.all(records.map(record => getFetchResult(record))))
+      .then(results => sendMessageToDocument({results})));
+});
--- a/testing/web-platform/tests/background-fetch/service_workers/sw.js
+++ b/testing/web-platform/tests/background-fetch/service_workers/sw.js
@@ -1,30 +1,52 @@
 
 importScripts('sw-helpers.js');
 
 async function getFetchResult(record) {
-  response = await record.responseReady;
-  if (!response)
-    return Promise.resolve(null);
+  const response = await record.responseReady.catch(() => null);
+  if (!response) return null;
 
   return {
     url: response.url,
     status: response.status,
     text: await response.text(),
   };
 }
 
-function handleBackgroundFetchUpdateEvent(event) {
+function handleBackgroundFetchEvent(event) {
+  let matchFunction = null;
+  switch (event.registration.id) {
+    case 'matchexistingrequest':
+      matchFunction = event.registration.match.bind(
+          event.registration, '/background-fetch/resources/feature-name.txt');
+      break;
+    case 'matchmissingrequest':
+      matchFunction = event.registration.match.bind(
+          event.registration, '/background-fetch/resources/missing.txt');
+      break;
+    default:
+      matchFunction = event.registration.matchAll.bind(event.registration);
+      break;
+  }
+
   event.waitUntil(
-    event.registration.matchAll()
+    matchFunction()
+      // Format `match(All)?` function results.
+      .then(records => {
+        if (!records) return [];  // Nothing was matched.
+        if (!records.map) return [records];  // One entry was returned.
+        return records;  // Already in a list.
+      })
+      // Extract responses.
       .then(records =>
             Promise.all(records.map(record => getFetchResult(record))))
+      // Clone registration and send message.
       .then(results => {
         const registrationCopy = cloneRegistration(event.registration);
         sendMessageToDocument(
           { type: event.type, eventRegistration: registrationCopy, results })
       }));
 }
 
-self.addEventListener('backgroundfetchsuccess', handleBackgroundFetchUpdateEvent);
-self.addEventListener('backgroundfetchfail', handleBackgroundFetchUpdateEvent);
-self.addEventListener('backgroundfetchabort', handleBackgroundFetchUpdateEvent);
+self.addEventListener('backgroundfetchsuccess', handleBackgroundFetchEvent);
+self.addEventListener('backgroundfetchfail', handleBackgroundFetchEvent);
+self.addEventListener('backgroundfetchabort', handleBackgroundFetchEvent);
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/client-hints/image-with-dpr-header.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<body>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<img id="int_dpr" src="resources/dpr.py?name=square.png&mimeType=image/png&dpr=4.0">
+<img id="fractional_dpr" src="resources/dpr.py?name=square.png&mimeType=image/png&dpr=2.5">
+<img id="smaller_than_one" src="resources/dpr.py?name=square.png&mimeType=image/png&dpr=0.5">
+<img id="srcset" srcset="resources/square.png 4x">
+<img id="invalid" src="resources/dpr.py?name=square.png&mimeType=image/png&dpr=xx">
+<img id="header_and_srcset_invalid" srcset="resources/dpr.py?name=square.png&mimeType=image/png&dpr=xx 4x">
+<img id="header_and_srcset_valid" srcset="resources/dpr.py?name=square.png&mimeType=image/png&dpr=4.0 2x">
+<img id="explicit_width" src="resources/dpr.py?name=square.png&mimeType=image/png&dpr=4.0" width="100" height="100">
+<img id="double_dpr" src="resources/dpr.py?name=square.png&mimeType=image/png&dpr=4.0&double=4.0">
+<img id="double_dpr_different_values" src="resources/dpr.py?name=square.png&mimeType=image/png&dpr=4.0&double=2.5">
+
+<script>
+    let run_test = () => {
+        test(() => {
+            assert_equals(document.getElementById("int_dpr").naturalWidth, 25, "Integer Content-DPR header value")
+            assert_equals(document.getElementById("fractional_dpr").naturalWidth, 40, "Fractional Content-DPR header value")
+            assert_equals(document.getElementById("smaller_than_one").naturalWidth, 200, "Smaller than one Content-DPR header value")
+            assert_equals(document.getElementById("srcset").naturalWidth, 25, "srcset")
+            assert_equals(document.getElementById("invalid").naturalWidth, 100, "Invalid Content-DPR header value")
+            assert_equals(document.getElementById("header_and_srcset_invalid").naturalWidth, 25, "Invalid Content-DPR header value with valid srcset")
+            assert_equals(document.getElementById("header_and_srcset_valid").naturalWidth, 25, "Value Content-DPR header value and srcset")
+            assert_equals(document.getElementById("explicit_width").naturalWidth, 25, "Explicit width attribute")
+            assert_equals(document.getElementById("double_dpr").naturalWidth, 25, "Double Content-DPR header")
+            assert_equals(document.getElementById("double_dpr_different_values").naturalWidth, 40, "Double Content-DPR header different values")
+
+        }, "Test the image dimensions of different DPR sizes");
+    }
+    window.addEventListener("load", run_test);
+</script>
+
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/client-hints/resources/dpr.py
@@ -0,0 +1,24 @@
+def main(request, response):
+    """
+    Simple handler that sets a response header based on which client hint
+    request headers were received.
+    """
+
+    response.headers.append("Access-Control-Allow-Origin", "*")
+    values = request.GET
+    name = values.first('name')
+    type = values.first('mimeType')
+    dpr = values.first('dpr')
+    double = None
+    if 'double' in values:
+        double = values.first('double')
+    image_path = request.doc_root + "/".join(request.url_parts[2].split("/")[:-1]) + "/" + name
+    f = open(image_path, "rb")
+    buff = f.read()
+    f.close()
+    response.headers.set("Content-Type", type)
+    response.headers.set("Content-DPR", dpr)
+    if double:
+        response.headers.append("Content-DPR", double)
+    response.headers.set("Content-Length", len(buff))
+    response.content = buff
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..01c9666a8de9d5535615aff830810e5df4b2156f
GIT binary patch
literal 18299
zc%1E<cT`hpw}%hH(3=HO5hnx`L{dp1F@zGTG=U(&o=yakK%x{!22_gW6A_gr3|2ZS
zD2jjrBB%%mj*U79i0FWK00&0}z65kc!CABJH}|e}?>c9#Q?lRv+s|9~dCwo&x7O8O
zO?inj003%^4mKW=J4<>h%1f@oXUC|Lo08DMM+5*W^QET@kaA)X04TfhD3rBpeFb8H
z$X6hQI8rDOVUU2s^JfD<NK2Y0m+INS(0sIG#M&t~;;56rLrW3jVSONCLHr71JtfUG
zv3e(;YPna=wY8Pgxt$R!d+1QaK`nO^)&0s(6ngYd9olm`cK_Y?T{}<vJt`Z0UO#^M
zF}W{qIIXBrp+ZshxPz%XHbOPqdfD7x_S9C_boIb3Bb5z=fTm&*OHVYWF9W;{Cy`b`
zD-^B+G9eFC6oCqt)C%O%m<f%S*2x=XBKFEuh~v$i6eAV@mSKmi&jFTpG7)J>D?EV=
zIbdrYlhF;Vg#lX)e|-J`h)8>zyi*3)a8yrACL<nz%xA~i0KTh%yvB9=Z2=k*Sio_r
zCIC-h0MgN$;{aT^0#r0;suTi>ssPeGHfkjxw-eZUTVFo}*qaP2up9Cw{kEz=v(H%4
zQ^|#-5(9#5<OW4ppn|tIe3?;$qxPx=IQkrViY2@%G<h*P5~K0U@I3&?h}V*|c6cnL
zLA{`%0e7faeGBa64fzQugV8<S+n6h~1b{Aac+<EEqG(CPYWawO@l(qO<$O1*WNaTj
zz$w(QybNUYw|EZ=rF~<2@^H!1r@cKrPu5ghZ=m1x-Zjpx+EU>?=Kn`H>BH!oU#>qh
zh(vFSw3mDPOVzy*=d(*2k0|YBv^|fr|8PZR;)Cu3Xtg7wgl4>;+kIZ(A)Azg!|1cn
zebz@--df%~!Ftwd@?MtQi3KifBg^cJhh=SI%Kq+Ts7Vu7JR1dop;AHR&qj)}5x#r6
z8iOZZTa4LfEC(Vujz<CkV6%+@oO-v&qE-<AY%(H^FIee}R4y{9kY8H)U0bEfhpo81
z)&|v8)|%GJtcaySTUX}owl<2czo2Wp74fsBE~diWH#$M64zKdMs%|dSct=-EuQV!)
zRFbp0tvH{q*Agqk*iX|xq^O-7^;WOaL2ljw1IV4&1@2I%c&r1;V?Pz*<)Axc9yEs#
zv(fHa{Oa2PdiRIuGJDj~$U=AXpH(kYO0w`v_S&6Nxz7@#QsNe7q}~s@w8Z=%?quKn
zTwjfrI5MRcS@B|#f@!rs5?*uD`l6YMQUbH?A~a7mw`R$Ob$PO-``$1cF9yrai?pp!
z!pQ|&L+Hz_9B9ro*C!5HkfjEgxh+a~CE301Rff=nET>B=uFd_UdJzMSilI4}=s%hl
zHy@$7GnP_~H<-7Nf;KEUJje0k8EW&qX1iv-hkn0Fb}GhUiGISJ7M5S30^z6$WYz7c
zp0u8uJ*GW6J$geMl+zfNfoI-&J~Q&TyKT+lUd>)iuRJ>mZRK@3#iKpzBy}z}ZoPH>
z$zqT5?lD>OG22rJ^?MdNI-Siwb?m_sUv1w}-uV~eYjfL=Eptu0@7-M2Z~r3kh3rVM
zs#>(xp4wQh(c;ua3X8algBP7oaz3~C!GXoKR3sktDyc77BU#`@GcGp%K`Z{Q^076?
zRvgnYMo_bJ&gFFEsCW%~)luWJH+$|Xu=6tY?9NvD`FO5ZPTJa6o;se~?A2K@IovD(
z)#6OJ&)7bBpPSA%-6&_=GcIoFE~|m4Fc%kvnCSVb<wkFh#8$7kSpW2g9mb_eW4fgW
z%yY6&5-6r?OudUdhL3VA6uOfF-<}Y=D)kv<CJu-1?^y79<+GJK=P=GCDE3Cboa2ed
zX}J!$?z#4_%5en)nQ7<BZA*RLN2*)Zt})zbXwQvn_%5x_^QmWhrgG*&7jxp90(g$!
zS)G%mHo-UenS)8`*EdI`I}0*9Ld*N!E!~9}qmBi<%Y0+6N|P^AHIQ#rZCFIQg$)#t
zbP=_!zqwO3-L#~fr5~dwcI}NXX(F9|X!kEWjf1?Jjok*_0W|?Nr&q|Y&|Bf;^3r86
z#lxlK+{$ySomV^8*59i?RsSd%n`(}FjP6VAOMRT$d1dSRko6|TS;be`j)gtz&-n}%
zm+_<46MW9nyw-0jvdd4)U;d~xzch1hW{GQpYi{}@?#&Co72he&zOwj2?-Tjfg5rSU
zU34x(n|tL}!Og*h@`PR2cKvJ2TtO}7sd}#Ndfjl*rJx1Gb;OR8h7*GpyKapf??-TH
zjhc;5OuLKc*R8DPrFo`4u;*%XOGJByV-M_e+Fb`vB*Rm6YT9p?_pA}W3Eb2b*8C<d
zwJ5b}AglHKAa0O17}NICJ<Lxl(|t@u_ix^&{Nmo*WTEoYF{EE-Ubq{@Es}e=PanZV
z#CzvIzHsGiaLy?GwKn;8a?nrR<Zcqa1Kr`X<sQD`%Izz4ZZ`$#TcSECKk84gCc-9~
zfXs;HGF;hxkyeo#=DdF!_JiJyLl(qV_V0yH2doZelvrt5#qG}D-CLQj=X?9t!})rn
zeMt@R4LtRzwc#%w-B+MLrysZ(u4)(+6XhLkaYz_TThfF|#0EFDQAC|K?`)3Sbfj`o
zZiMr&HCSVE4tyJ_1%C~5&7ua*@wxYqmPT{*cUnq-8yDdC{?|J{3=GFSOM9l$y;D00
zaeI?6^khTTNL1#+Z1_AA;&DsoSXZ;7|7E3VoVD=a@}c>`%MU4sR_Ru8p@=42Q|uGU
zM&o6!Lk`9+VMl(AFT;i!+%i3D(p$3EF#B+svzl{zDlvUw$__{X+MHO9+H)lSaG-UL
zo=ZY8_a*l^XGdKgJF0N}7XQE%#Ij=wcl?SD=Y8h`Q!chX_kz0K=&`XvA(!pVxlzCG
zF5!4?`l|YYdqsC!593d~{%K-hUe&y=BgJQ<oxEYXwCCk{+X#iEz|dCZZmsWDMX!_3
zBVFBJY#i{=EqA~>u^_yBMVO0U<mSq|yDKlt_`Oo`Qtpk~^{Vahz$P~u!l&~x{atjL
z4q0p8{(=Rq+KE~}J~3(w>D7r5+`W<9cJxwqZgmN(k<-lSf8GI0-=KaxC-HfrI$!N+
z%O$nWb(aR-{BGNdNUS$%E!|U0DLH+EbhV6~d8eU%wFUJIb%gqkiW_Whzf6Dpmftj}
zv$O1X%&!kyH<XQzk?&k@^^);&dB}Ole((6cXw;%$Urztq<L?7D<+}z14%Esv%Z@4N
zs~0~m`T3!4vpLlx?$N4O_Ug6YUms6<9Sl>$sd@eDM9njOp-pH{|EN;u=rT28%Z`IP
z^STrse7{4NtBcrXoidbSm+G1Fegk8}HMe`@rbjP3!amryey?!?L-Gk-Gfch1Yw6$p
zAb~s7crfi)+OBZ;A8lJ(PZjU%V>Wbd(-6GArYY`fww*Z8x4LX~!^WYj;-SLU-ud2F
zy;IH;w*<Ttza)((JaDTmJyDucP_oglWH7A!@=nfZzfL;7p?#!0^tXi*j~=EI%-hR{
z!vv$ZM&EQUY!44I9BZg6eHv^ym|x~rwq?X}!0IWbJ?5dshViy1uiJjyRuP;r+|*`2
zDj&6{aXkJ_oCf8)xa7FHXtn59>1JdC;h9CySpSDiN+YXrMY{I*sqwl3?S+W&w+~-E
zZfHtsI+-|>m~bQDhqGfZD_$)=-&#{uv+Vkv5L49Vk#+9}DudgCbzh(E)Nt$h0rI2K
zgzq00-+127e4ns5Az?yJHfi_+(-hVU0IOf~s5CLn#hJ(y1i<Mm0fP+>2@nF(gJcmR
zq%-~4VhDrH<?+p-uS;)0Av~5j)En!9bP-b6zC4GpAhu_iE0r1M$0V?z7Gz~o2vHIs
zfGws&LIV8xB4UU+bTTec@+>tYppZ!yv7b5AN?HJ+xvYgy1VL;F7LJ86k!TbIPk^Ja
zSUetW0zo5D7z7f9K$*f&1R@4QL?R&{4=7n#awP?^I7AN{yN@`@FLS7`SS%zW5W&I0
z@L*H8Ac%`V5eNhX5{*EkVG<9RD3mXzhrswE{iz_I;@Gf7%pjgn%oFe-(%*E3V7u5H
z3RQ+oJ3h86K=>z!FZ$Sbl3qlF(1i#T9Eq4s#A5!b5pECipR5{-iD3J)1K51ANTNf{
zsuO<N{Lha3v-q1}No`$R{<^*a0kbMaV%r_!zgCK<p+YvogDnzl4`Q-ycSxF|KU*j<
zkHeWglC<QTb!Uh0z9EyAOv%WfbtFk!iIgBVT`UNq3IzV-saf{<`$_WoB%M_dBNsZ8
z$Cnyck`P~uW{bzRk(^|y7KX&Y&;%+9O+;adC>#ulm(0s)L8d&vis2$)@i?K=V&GwD
z3>AeTq6tJSc6y9yo?pk1tRNO$O#fR^ru$Bd!(tLSf}jApn9K{HbJ++XpG!h~Hcs>W
zb6ycC0)Ih}q*`pUDG4!~c~+I=OLgtkhbmd*VQ&p_w58xs1RM^AhNGs3ndbLpdtF?J
zj(m}r&S$b6ZO9S>oX2AknP?1$Wr`)hFenxlhQTrzFggd#hA~hqGaQ4#!Qq+M$u9U(
zJ|nb^fVo||?j&VXDT*avO2U7x7aK=FGE4~!7#1VxW)upKhtcs8u9+DQkELT!Y&3!K
z2{bL(43Jw8Pm)3D{?mM<ZDC1ZEHez7jz*zjC{r^Q48xMPg=vO@aga<Ll7%+KnK9X)
z5VM4tfpXx9BvUw){KYz&%x#|Rz%Q+z3jBGKxlTwA60xN#*&O<5DMM!nq?*Z$K%_IJ
zS(410obD_V;tT7yWxScg`S-eDhWy)%U|%->ua@aFuWttt2{__ldJx-+E9vRka>y6y
zV>Zo<&PGi2_W!^ri0C{1voT;2upBHMhk}_AkY+Fpj%fxXU>G<Un?XRM2&Nn~8qfUi
zj=@xdG9_a0L@fHB9fO&9{O=6JX8_Ze&gZgOWW*=oC&T}#vHM%;@IM*5uU;<yFUD@l
z`ejo5lxSxrQId3rB2B=OI?*SGNb&-kVf)&jCY=WU+b7HLXr$yoprqH2(&@!tOMU)Y
z>hl-U&qZE*o|ugODEZ1fO(oq%O})xJB|Cn$v}s?PzV=?r3t{`yY<QB_kZ7_uq&1th
zWLBlmH<dm!lv4vWZD&5U?MHmv_e(xG5PyDi%r;&A`2&Q25D)@FKnMr{As_^VfDjM@
zLO=)z0U;m+gn$qb0zyCt2mv7=1cZPP5CTF#2nYcoAOwVf5D)@FKnMr{As_^VfDjM@
zLO=)z`G+COpZ~?n=CjP9!B7kGruo~O0RVt79XwnBAZ$4RMC<{8KPDviegN2x1b~-Y
z0f3kU0NR2hTW;A&d~+Rbtf(O^zc$IJ0Z2u;i`@0U31s|D&KP#B?{^+?X`BO@Gsng<
vLQzpuMh5!7`fMrp@wud94ggF{$O0Od=d9}MYJVdA53{4Kt4)FR*4_UGKvUo&
--- a/testing/web-platform/tests/cookies/http-state/chromium-tests.html
+++ b/testing/web-platform/tests/cookies/http-state/chromium-tests.html
@@ -38,17 +38,16 @@
         {file: "chromium0015", name: "chromium0015"},
         {file: "chromium0016", name: "chromium0016"},
         {file: "chromium0017", name: "chromium0017"},
         {file: "chromium0018", name: "chromium0018"},
         {file: "chromium0019", name: "chromium0019"},
         {file: "disabled-chromium0020", name: "disabled-chromium0020"},
         {file: "chromium0021", name: "chromium0021"},
         {file: "disabled-chromium0022", name: "disabled-chromium0022"},
-        {file: "disabled-chromium0023", name: "disabled-chromium0023"},
       ];
 
       for (const i in TEST_CASES) {
         const t = TEST_CASES[i];
         promise_test(createCookieTest(t.file),
                      t.file + " - " + t.name,
                      { timeout: 3000 });
       }
index 1a8f35ffbd849ebd836c4b41a97a9f6fa4113d4b..76a8ed4e9b8725200a3e282eeac1062ce3b9c570
GIT binary patch
literal 23
ec$^DPEzxz(&(F?GwNh|&bhLGH;*E-o-~s?xg$A?$
deleted file mode 100644
--- a/testing/web-platform/tests/cookies/http-state/resources/test-files/disabled-chromium0023-expected
+++ /dev/null
@@ -1,1 +0,0 @@
-Cookie: AAA=BB
deleted file mode 100644
--- a/testing/web-platform/tests/cookies/http-state/resources/test-files/disabled-chromium0023-test
+++ /dev/null
@@ -1,1 +0,0 @@
-Set-Cookie: AAA=BB
ZYX
--- a/testing/web-platform/tests/css/CSS2/borders/border-top-width-003.xht
+++ b/testing/web-platform/tests/css/CSS2/borders/border-top-width-003.xht
@@ -20,14 +20,14 @@
             {
                 border-top-style: solid;
                 border-top-width: 1px;
                 height: 0;
             }
         </style>
     </head>
     <body>
-        <p>Test passes if there is a wide and thin horizontal black line and <strong>no red</strong></p>
+        <p>Test passes if there is a wide and thin horizontal black line and <strong>no red</strong>.</p>
         <div id="wrapper">
             <div id="test"></div>
         </div>
     </body>
 </html>
\ No newline at end of file
--- a/testing/web-platform/tests/css/CSS2/selectors/default-attribute-selector-005.xht
+++ b/testing/web-platform/tests/css/CSS2/selectors/default-attribute-selector-005.xht
@@ -17,15 +17,15 @@
   a[shape] {background-color: red;}
   a[shape="rect"] {background-color: green;}
   ]]></style>
 
  </head>
 
  <body>
 
-  <p>Test passes if there is a green stripe and <strong>no red</strong></p>
+  <p>Test passes if there is a green stripe and <strong>no red</strong>.</p>
 
   <p><a>&nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
   &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</a></p>
 
  </body>
 </html>
\ No newline at end of file
--- a/testing/web-platform/tests/css/CSS2/selectors/default-attribute-selector-006.xht
+++ b/testing/web-platform/tests/css/CSS2/selectors/default-attribute-selector-006.xht
@@ -17,16 +17,16 @@
   form[method] {background-color: red;}
   form[method="get"] {background-color: green;}
   ]]></style>
 
  </head>
 
  <body>
 
-  <p>Test passes if there is a green bar across the page and <strong>no red</strong></p>
+  <p>Test passes if there is a green bar across the page and <strong>no red</strong>.</p>
 
   <form action="">
    <p>&nbsp;</p>
   </form>
 
  </body>
 </html>
\ No newline at end of file
--- a/testing/web-platform/tests/css/CSS2/selectors/default-attribute-selector-007.xht
+++ b/testing/web-platform/tests/css/CSS2/selectors/default-attribute-selector-007.xht
@@ -24,16 +24,16 @@
 
   input[type="text"] {background-color: green;}
   ]]></style>
 
  </head>
 
  <body>
 
-  <p>Test passes if there is a green square and <strong>no red</strong></p>
+  <p>Test passes if there is a green square and <strong>no red</strong>.</p>
 
   <form action="">
    <p><input></input></p>
   </form>
 
  </body>
 </html>
\ No newline at end of file
--- a/testing/web-platform/tests/css/CSS2/selectors/default-attribute-selector-008.xht
+++ b/testing/web-platform/tests/css/CSS2/selectors/default-attribute-selector-008.xht
@@ -24,16 +24,16 @@
 
   button[type="submit"] {background-color: green;}
   ]]></style>
 
  </head>
 
  <body>
 
-  <p>Test passes if there is a green square and <strong>no red</strong></p>
+  <p>Test passes if there is a green square and <strong>no red</strong>.</p>
 
   <form action="">
    <p><button>&nbsp;</button></p>
   </form>
 
  </body>
 </html>
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-backgrounds/background-color-body-propagation-004.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<title>CSS Backgrounds and Borders Test: don't propagate body background when display:none</title>
+<link rel="help" href="https://drafts.csswg.org/css-backgrounds/#special-backgrounds">
+<link rel="match" href="../reference/blank.html">
+<style>
+  body {
+    background: red;
+    display: none
+  }
+</style>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-backgrounds/background-color-body-propagation-005.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<title>CSS Backgrounds and Borders Test: don't propagate body background when html is display:none</title>
+<link rel="help" href="https://drafts.csswg.org/css-backgrounds/#special-backgrounds">
+<link rel="match" href="../reference/blank.html">
+<style>
+  html { display: none; }
+  body { background: red; }
+</style>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-backgrounds/background-color-body-propagation-006.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<title>CSS Backgrounds and Borders Test: don't propagate body background when html is display:none dynamic</title>
+<link rel="help" href="https://drafts.csswg.org/css-backgrounds/#special-backgrounds">
+<link rel="match" href="../reference/blank.html">
+<style>
+  body { background: red; }
+</style>
+<script>
+  window.onload = () => {
+    requestAnimationFrame(() => requestAnimationFrame(() => {
+      document.documentElement.style.display = "none";
+      document.documentElement.classList.remove("reftest-wait");
+    }));
+  };
+</script>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-backgrounds/background-color-root-propagation-001.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<title>CSS Backgrounds and Borders Test: don't propagate html background when display:none</title>
+<link rel="help" href="https://drafts.csswg.org/css-backgrounds/#special-backgrounds">
+<link rel="match" href="../reference/blank.html">
+<style>
+  html {
+    background: red;
+    display: none
+  }
+</style>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-backgrounds/background-color-root-propagation-002.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<title>CSS Backgrounds and Borders Test: don't propagate html background when display:none dynamic</title>
+<link rel="help" href="https://drafts.csswg.org/css-backgrounds/#special-backgrounds">
+<link rel="match" href="../reference/blank.html">
+<style>
+  html { background: red; }
+</style>
+<script>
+  window.onload = () => {
+    requestAnimationFrame(() => requestAnimationFrame(() => {
+      document.documentElement.style.display = "none";
+      document.documentElement.classList.remove("reftest-wait");
+    }));
+  };
+</script>
--- a/testing/web-platform/tests/css/css-content/element-replacement-display-contents.html
+++ b/testing/web-platform/tests/css/css-content/element-replacement-display-contents.html
@@ -1,12 +1,12 @@
 <!doctype html>
 <title>The content CSS property doesn't override display: contents</title>
 <link rel="author" href="mailto:emilio@crisal.io" title="Emilio Cobos Álvarez">
-<link rel="match" href="resources/blank.html">
+<link rel="match" href="../reference/blank.html">
 <link rel="help" href="https://drafts.csswg.org/css-content-3/#content-property">
 <style>
   div {
     display: contents;
     content: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==);
   }
 </style>
 <div></div>
--- a/testing/web-platform/tests/css/css-content/element-replacement-display-none.html
+++ b/testing/web-platform/tests/css/css-content/element-replacement-display-none.html
@@ -1,12 +1,12 @@
 <!doctype html>
 <title>The content CSS property doesn't override display: none</title>
 <link rel="author" href="mailto:emilio@crisal.io" title="Emilio Cobos Álvarez">
-<link rel="match" href="resources/blank.html">
+<link rel="match" href="../reference/blank.html">
 <link rel="help" href="https://drafts.csswg.org/css-content-3/#content-property">
 <style>
   div {
     display: none;
     content: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==);
   }
 </style>
 <div>FAIL</div>
deleted file mode 100644
--- a/testing/web-platform/tests/css/css-content/resources/blank.html
+++ /dev/null
@@ -1,4 +0,0 @@
-<!doctype html>
-<title>CSS Test Reference</title>
-<link rel="author" href="mailto:emilio@crisal.io" title="Emilio Cobos Álvarez">
-<!-- Intentionally blank -->
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-exclusions/inheritance.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>Inheritance of CSS Exclusions properties</title>
+<link rel="help" href="https://drafts.csswg.org/css-exclusions/#property-index">
+<meta name="assert" content="Properties do not inherit.">
+<meta name="assert" content="Properties have initial values according to the spec.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/inheritance-testcommon.js"></script>
+</head>
+<body>
+<div id="container">
+  <div id="target"></div>
+</div>
+<script>
+assert_not_inherited('wrap-flow', 'auto', 'both');
+assert_not_inherited('wrap-through', 'wrap', 'none');
+</script>
+</body>
+</html>
--- a/testing/web-platform/tests/css/css-flexbox/flex-flexitem-percentage-prescation.html
+++ b/testing/web-platform/tests/css/css-flexbox/flex-flexitem-percentage-prescation.html
@@ -1,33 +1,33 @@
 <!DOCTYPE html>
 <html>
 <head>
 	<title>flex item size prescation</title>
 	<link rel="author" title="shaofeic" href="mailto:csf178@gmail.com" />
 	<link rel="help" href="http://www.w3.org/TR/css-flexbox-1/#flex-items">
 	<link rel="match" href="reference/flex-flexitem-percentage-prescation-ref.html">
 	<meta name="flags" content="" />
-	<meta name="assert" content="no blue color could be seen." />
+	<meta name="assert" content="no red color could be seen." />
     <style type="text/css">
     #test
     {
-        background: blue;
+        background: red;
         display: flex;
         height:300px;
         width:101px;
     }
     p {
         flex:1;
-        background:red;
+        background:olive;
         flex-direction:row;
         margin:0 0 0 0;
     }
     </style>
 </head>
 <body>
 	<div id="test">
-        <p style="background:green;">damer</p>
-        <p>damer</p>
+        <p style="background:green;">d</p>
+        <p>d</p>
     </div>
 </body>
 </html>
 
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-flexbox/flex-minimum-height-flex-items-010.html
@@ -0,0 +1,64 @@
+<!DOCTYPE html>
+<title>Tests correct handling of min-height: min-content with dynamic changes</title>
+<link rel="help" href="https://www.w3.org/TR/css-flexbox-1/#resolve-flexible-lengths" title="4.5. Implied Minimum Size of Flex Items" />
+<link rel="author" title="Google Inc." href="http://www.google.com/">
+<link href="support/flexbox.css" rel="stylesheet">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/check-layout-th.js"></script>
+<style>
+.container {
+  height: 300px;
+  outline: 2px solid black;
+}
+
+.inner
+{
+  width: 400px;
+  flex: 1;
+  background-color: green;
+}
+#container2 .flexbox > * { flex-basis: 0; }
+#container2 .column > * { flex-basis: auto; }
+.container .flexbox { min-height: min-content; }
+.container > .flexbox { min-height: 0; }
+</style>
+<script>
+function change() {
+  var container = document.getElementById('container');
+  container.offsetHeight;
+  container.style.height = '80px';
+  container = document.getElementById('container2');
+  container.offsetHeight;
+  container.style.height = '80px';
+  checkLayout('.container');
+}
+</script>
+<body onload="change()">
+<p>Green rectangle should be entirely within the black rectangle</p>
+<div id="log"></div>
+<div id="container" class="container">
+  <div class="flexbox column" style="height: 100%;">
+    <div class="flexbox flex-one">
+        <div class="flexbox column">
+          <div class="flexbox column flex-one">
+            <div class="inner" data-expected-height="80">
+            </div>
+          </div>
+        </div>
+    </div>
+  </div>
+</div>
+
+<div id="container2" class="container">
+  <div class="flexbox column" style="height: 100%;">
+    <div class="flexbox flex-one">
+        <div class="flexbox column">
+          <div class="flexbox column flex-one">
+            <div class="inner" data-expected-height="80">
+            </div>
+          </div>
+        </div>
+    </div>
+  </div>
+</div>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-flexbox/flex-minimum-height-flex-items-011.xht
@@ -0,0 +1,49 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+    <head>
+        <title>CSS Flexible Box Test: Minimum height of flex items</title>
+        <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com" />
+        <link rel="help" href="http://www.w3.org/TR/css-flexbox-1/#min-size-auto" title="4.5. Implied Minimum Size of Flex Items" />
+        <link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
+        <meta name="assert" content="Checks that minimum height for flex items is the min-content size." />
+        <style type="text/css"><![CDATA[
+            #reference-overlapped-red {
+                position: absolute;
+                background-color: red;
+                width: 100px;
+                height: 100px;
+                z-index: -1;
+            }
+
+            #constrained-flex {
+                display: flex;
+                flex-direction: column;
+                width: 100px;
+                height: 10px;
+            }
+
+            #test-flex-item-overlapping-green {
+                display: flex;
+                flex-basis: 0;
+                color: green;
+                background-color: green;
+                font: 50px/1 Ahem;
+            }
+
+            #content-100x100 {
+                width: 100px;
+                height: 100px;
+            }
+        ]]></style>
+    </head>
+    <body>
+        <p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+
+        <div id="reference-overlapped-red"></div>
+        <div id="constrained-flex">
+            <div id="test-flex-item-overlapping-green">
+                <div id="content-100x100"></div>
+            </div>
+        </div>
+    </body>
+</html>
--- a/testing/web-platform/tests/css/css-flexbox/flexbox_block.html
+++ b/testing/web-platform/tests/css/css-flexbox/flexbox_block.html
@@ -1,14 +1,14 @@
 <!DOCTYPE html>
 <title>flexbox | block</title>
 <link rel="author" href="http://opera.com" title="Opera Software">
 <link rel="help"
 	href="http://www.w3.org/TR/css-flexbox-1/#flex-containers">
-<link rel="match" href="flexbox_empty-ref.html">
+<link rel="match" href="../reference/blank.html">
 <style>
 div {
 	background: red;
 	margin-top: -20em;
 	display: flex;
 }
 </style>
 
deleted file mode 100644
--- a/testing/web-platform/tests/css/css-flexbox/flexbox_empty-ref.html
+++ /dev/null
@@ -1,2 +0,0 @@
-<!DOCTYPE html>
-<!-- intentionallly left blank -->
--- a/testing/web-platform/tests/css/css-flexbox/flexbox_inline-abspos.html
+++ b/testing/web-platform/tests/css/css-flexbox/flexbox_inline-abspos.html
@@ -1,13 +1,13 @@
 <!DOCTYPE html>
 <title>flexbox | absolutely positioned inline</title>
 <link rel="author" href="http://opera.com" title="Opera Software">
 <link rel="help" href="http://www.w3.org/TR/css-flexbox-1/#abspos-items">
-<link rel="match" href="flexbox_empty-ref.html">
+<link rel="match" href="../reference/blank.html">
 <style>
 div {
 	background: red;
 	margin-top: -20em;
 	position: absolute;
 	display: inline-flex;
 }
 </style>
--- a/testing/web-platform/tests/css/css-flexbox/flexbox_inline-float.html
+++ b/testing/web-platform/tests/css/css-flexbox/flexbox_inline-float.html
@@ -1,13 +1,13 @@
 <!DOCTYPE html>
 <title>flexbox | floated inline</title>
 <link rel="author" href="http://opera.com" title="Opera Software">
 <link rel="help" href="http://www.w3.org/TR/css-flexbox-1/#flex-items">
-<link rel="match" href="flexbox_empty-ref.html">
+<link rel="match" href="../reference/blank.html">
 <style>
 div {
 	background: red;
 	margin-top: -20em;
 	float: left;
 	display: inline-flex;
 }
 </style>
--- a/testing/web-platform/tests/css/css-flexbox/flexbox_order-noninteger-invalid.html
+++ b/testing/web-platform/tests/css/css-flexbox/flexbox_order-noninteger-invalid.html
@@ -1,13 +1,13 @@
 <!DOCTYPE html>
 <title>flexbox | flex-flow: column-reverse wrap-reverse; order</title>
 <link rel="author" href="http://opera.com" title="Opera Software">
 <link rel="help" href="http://www.w3.org/TR/css-flexbox-1/#order-property">
-<link rel="match" href="flexbox_empty-ref.html">
+<link rel="match" href="../reference/blank.html">
 <link rel="flags" content="invalid">
 <style>
 div {
 	width: 200px;
 	height: 4em;
 	display: flex;
 }
 span {
--- a/testing/web-platform/tests/css/css-flexbox/flexbox_stf-abspos.html
+++ b/testing/web-platform/tests/css/css-flexbox/flexbox_stf-abspos.html
@@ -1,13 +1,13 @@
 <!DOCTYPE html>
 <title>flexbox | flexcontainer versus stf :: abspos</title>
 <link rel="author" href="http://opera.com" title="Opera Software">
 <link rel="help" href="http://www.w3.org/TR/css-flexbox-1/#flex-items">
-<link rel="match" href="flexbox_empty-ref.html">
+<link rel="match" href="../reference/blank.html">
 <style>
 #test {
 	background: red;
 	position: absolute;
 }
 div div {
 	background: white;
 	width: 300px;
--- a/testing/web-platform/tests/css/css-flexbox/flexbox_stf-float.html
+++ b/testing/web-platform/tests/css/css-flexbox/flexbox_stf-float.html
@@ -1,13 +1,13 @@
 <!DOCTYPE html>
 <title>flexbox | flexcontainer versus stf :: float</title>
 <link rel="author" href="http://opera.com" title="Opera Software">
 <link rel="help" href="http://www.w3.org/TR/css-flexbox-1/#flex-items">
-<link rel="match" href="flexbox_empty-ref.html">
+<link rel="match" href="../reference/blank.html">
 <style>
 #test {
 	background: red;
 	float: left;
 }
 div div {
 	background: white;
 	width: 300px;
--- a/testing/web-platform/tests/css/css-flexbox/flexbox_stf-inline-block.html
+++ b/testing/web-platform/tests/css/css-flexbox/flexbox_stf-inline-block.html
@@ -1,13 +1,13 @@
 <!DOCTYPE html>
 <title>flexbox | flexcontainer versus stf :: inline-block</title>
 <link rel="author" href="http://opera.com" title="Opera Software">
 <link rel="help" href="http://www.w3.org/TR/css-flexbox-1/#flex-items">
-<link rel="match" href="flexbox_empty-ref.html">
+<link rel="match" href="../reference/blank.html">
 <style>
 #test {
 	background: red;
 	display: inline-block;
 }
 div div {
 	background: white;
 	width: 300px;
--- a/testing/web-platform/tests/css/css-flexbox/flexbox_stf-table-caption.html
+++ b/testing/web-platform/tests/css/css-flexbox/flexbox_stf-table-caption.html
@@ -1,13 +1,13 @@
 <!DOCTYPE html>
 <title>flexbox | flexcontainer versus stf :: table-caption</title>
 <link rel="author" href="http://opera.com" title="Opera Software">
 <link rel="help" href="http://www.w3.org/TR/css-flexbox-1/#flex-items">
-<link rel="match" href="flexbox_empty-ref.html">
+<link rel="match" href="../reference/blank.html">
 <style>
 #test {
 	background: red;
 	display: table-caption;
 }
 div div {
 	background: white;
 	width: 300px;
--- a/testing/web-platform/tests/css/css-flexbox/flexbox_stf-table-cell.html
+++ b/testing/web-platform/tests/css/css-flexbox/flexbox_stf-table-cell.html
@@ -1,13 +1,13 @@
 <!DOCTYPE html>
 <title>flexbox | flexcontainer versus stf :: table cell</title>
 <link rel="author" href="http://opera.com" title="Opera Software">
 <link rel="help" href="http://www.w3.org/TR/css-flexbox-1/#flex-items">
-<link rel="match" href="flexbox_empty-ref.html">
+<link rel="match" href="../reference/blank.html">
 <style>
 #test {
 	background: red;
 	display: table-cell;
 }
 div div {
 	background: white;
 	width: 300px;
--- a/testing/web-platform/tests/css/css-flexbox/flexbox_stf-table-row-group.html
+++ b/testing/web-platform/tests/css/css-flexbox/flexbox_stf-table-row-group.html
@@ -1,13 +1,13 @@
 <!DOCTYPE html>
 <title>flexbox | flexcontainer versus stf :: table row group</title>
 <link rel="author" href="http://opera.com" title="Opera Software">
 <link rel="help" href="http://www.w3.org/TR/css-flexbox-1/#flex-items">
-<link rel="match" href="flexbox_empty-ref.html">
+<link rel="match" href="../reference/blank.html">
 <style>
 #test {
 	background: red;
 	display: table-row-group;
 }
 div div {
 	background: white;
 	width: 300px;
--- a/testing/web-platform/tests/css/css-flexbox/flexbox_stf-table-row.html
+++ b/testing/web-platform/tests/css/css-flexbox/flexbox_stf-table-row.html
@@ -1,13 +1,13 @@
 <!DOCTYPE html>
 <title>flexbox | flexcontainer versus stf :: table row</title>
 <link rel="author" href="http://opera.com" title="Opera Software">
 <link rel="help" href="http://www.w3.org/TR/css-flexbox-1/#flex-items">
-<link rel="match" href="flexbox_empty-ref.html">
+<link rel="match" href="../reference/blank.html">
 <style>
 #test {
 	background: red;
 	display: table-row;
 }
 div div {
 	background: white;
 	width: 300px;
--- a/testing/web-platform/tests/css/css-flexbox/flexbox_stf-table.html
+++ b/testing/web-platform/tests/css/css-flexbox/flexbox_stf-table.html
@@ -1,13 +1,13 @@
 <!DOCTYPE html>
 <title>flexbox | flexcontainer versus stf :: table</title>
 <link rel="author" href="http://opera.com" title="Opera Software">
 <link rel="help" href="http://www.w3.org/TR/css-flexbox-1/#flex-items">
-<link rel="match" href="flexbox_empty-ref.html">
+<link rel="match" href="../reference/blank.html">
 <style>
 #test {
 	background: red;
 	display: table;
 }
 div div {
 	background: white;
 	width: 300px;
--- a/testing/web-platform/tests/css/css-flexbox/flexbox_table-fixed-layout.html
+++ b/testing/web-platform/tests/css/css-flexbox/flexbox_table-fixed-layout.html
@@ -1,13 +1,13 @@
 <!DOCTYPE html>
 <title>flexbox | flexcontainers in tables</title>
 <link rel="author" href="http://opera.com" title="Opera Software">
 <link rel="help" href="http://www.w3.org/TR/css-flexbox-1/#flex-items">
-<link rel="match" href="flexbox_empty-ref.html">
+<link rel="match" href="../reference/blank.html">
 <style>
 table {
 	width: 0;
 	table-layout: fixed;
 	border-spacing: 0;
 }
 td {
 	background: #3366cc;
--- a/testing/web-platform/tests/css/css-flexbox/flexbox_width-overflow.html
+++ b/testing/web-platform/tests/css/css-flexbox/flexbox_width-overflow.html
@@ -1,14 +1,14 @@
 <!DOCTYPE html>
 <title>flexbox | overflow</title>
 <link rel="author" href="http://opera.com" title="Opera Software">
 <link rel="help"
 	href="http://www.w3.org/TR/css-flexbox-1/#justify-content-property">
-<link rel="match" href="flexbox_empty-ref.html">
+<link rel="match" href="../reference/blank.html">
 <style>
 div {
 	background: red;
 	height: 4em;
 	width: 0;
 	overflow: hidden;
 
 	display: flex;
--- a/testing/web-platform/tests/css/css-flexbox/reference/flex-flexitem-percentage-prescation-ref.html
+++ b/testing/web-platform/tests/css/css-flexbox/reference/flex-flexitem-percentage-prescation-ref.html
@@ -2,30 +2,30 @@
 <html>
 <head>
     <title>CSS Test: childNodes' 'margin' property of flex item'</title>
     <link rel="author" title="Shaofei Cheng" href="mailto:csf178@gmail.com" />
     <meta name="flags" content="" />
     <style>
     #test
     {
-        background: blue;
+        background: red;
         position:relative;
         height:300px;
         width:101px;
     }
     p
     {
         position:absolute;
         margin:0 0 0 0;
     }
     </style>
 
 </head>
 <body>
 <div id="test">
 	<div id="test">
-        <p style="background:green;top:0px;height:300px;left:0px;height:300px;width:50.5px;">damer</p>
-        <p style="top:0px;left:50.5px;height:300px;background:Red;width:50.5px;">damer</p>
+        <p style="background:green;top:0px;height:300px;left:0px;height:300px;width:50.5px;">d</p>
+        <p style="top:0px;left:50.5px;height:300px;background:olive;width:50.5px;">d</p>
     </div>
 </div>
 </body>
 </html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-fonts/font-feature-resolution-001-ref.html
@@ -0,0 +1,356 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<title>CSS Test: feature property settings are resolved in the correct order for 'liga'.</title>
+<link rel="author" title="Ben Wagner" href="bungeman@chromium.org" />
+<link rel="help" href="https://www.w3.org/TR/css-fonts-3/#feature-precedence" />
+<style>
+  @font-face {
+    font-family: lato-ffs-;
+    src: url(support/fonts/Lato-Medium.ttf);
+  }
+  .test, .ref {
+    font-family: lato-ffs-;
+    font-size: 2em;
+    position: absolute;
+  }
+  .test { color: green; }
+  .ref { color: red; }
+
+  .align { width: 1em; }
+
+  .ls-0 { letter-spacing: 0em; }
+  .ls-1 { letter-spacing: 0.1em; }
+</style>
+</head>
+<body>
+<p>Test passes if there is no red visible.</p>
+<table class="ref"><tr>
+
+  <td class="align ff-  fvl-  ls-  ffs- ">&#xfb01;</td>
+  <td class="align ff-  fvl-  ls-  ffs-n">&#xfb01;</td>
+  <td class="align ff-  fvl-  ls-  ffs-0">f&zwnj;i</td>
+  <td class="align ff-  fvl-  ls-  ffs-1">&#xfb01;</td>
+  <td class="align ff-  fvl-  ls-0 ffs- ">&#xfb01;</td>
+  <td class="align ff-  fvl-  ls-0 ffs-n">&#xfb01;</td>
+  <td class="align ff-  fvl-  ls-0 ffs-0">f&zwnj;i</td>
+  <td class="align ff-  fvl-  ls-0 ffs-1">&#xfb01;</td>
+  <td class="align ff-  fvl-  ls-1 ffs- ">f&zwnj;i</td>
+  <td class="align ff-  fvl-  ls-1 ffs-n">f&zwnj;i</td>
+  <td class="align ff-  fvl-  ls-1 ffs-0">f&zwnj;i</td>
+  <td class="align ff-  fvl-  ls-1 ffs-1">&#xfb01;</td>
+</tr><tr>
+  <td class="align ff-  fvl-n ls-  ffs- ">&#xfb01;</td>
+  <td class="align ff-  fvl-n ls-  ffs-n">&#xfb01;</td>
+  <td class="align ff-  fvl-n ls-  ffs-0">f&zwnj;i</td>
+  <td class="align ff-  fvl-n ls-  ffs-1">&#xfb01;</td>
+  <td class="align ff-  fvl-n ls-0 ffs- ">&#xfb01;</td>
+  <td class="align ff-  fvl-n ls-0 ffs-n">&#xfb01;</td>
+  <td class="align ff-  fvl-n ls-0 ffs-0">f&zwnj;i</td>
+  <td class="align ff-  fvl-n ls-0 ffs-1">&#xfb01;</td>
+  <td class="align ff-  fvl-n ls-1 ffs- ">f&zwnj;i</td>
+  <td class="align ff-  fvl-n ls-1 ffs-n">f&zwnj;i</td>
+  <td class="align ff-  fvl-n ls-1 ffs-0">f&zwnj;i</td>
+  <td class="align ff-  fvl-n ls-1 ffs-1">&#xfb01;</td>
+</tr><tr>
+  <td class="align ff-  fvl-0 ls-  ffs- ">f&zwnj;i</td>
+  <td class="align ff-  fvl-0 ls-  ffs-n">f&zwnj;i</td>
+  <td class="align ff-  fvl-0 ls-  ffs-0">f&zwnj;i</td>
+  <td class="align ff-  fvl-0 ls-  ffs-1">&#xfb01;</td>
+  <td class="align ff-  fvl-0 ls-0 ffs- ">f&zwnj;i</td>
+  <td class="align ff-  fvl-0 ls-0 ffs-n">f&zwnj;i</td>
+  <td class="align ff-  fvl-0 ls-0 ffs-0">f&zwnj;i</td>
+  <td class="align ff-  fvl-0 ls-0 ffs-1">&#xfb01;</td>
+  <td class="align ff-  fvl-0 ls-1 ffs- ">f&zwnj;i</td>
+  <td class="align ff-  fvl-0 ls-1 ffs-n">f&zwnj;i</td>
+  <td class="align ff-  fvl-0 ls-1 ffs-0">f&zwnj;i</td>
+  <td class="align ff-  fvl-0 ls-1 ffs-1">&#xfb01;</td>
+</tr><tr>
+  <td class="align ff-  fvl-1 ls-  ffs- ">&#xfb01;</td>
+  <td class="align ff-  fvl-1 ls-  ffs-n">&#xfb01;</td>
+  <td class="align ff-  fvl-1 ls-  ffs-0">f&zwnj;i</td>
+  <td class="align ff-  fvl-1 ls-  ffs-1">&#xfb01;</td>
+  <td class="align ff-  fvl-1 ls-0 ffs- ">&#xfb01;</td>
+  <td class="align ff-  fvl-1 ls-0 ffs-n">&#xfb01;</td>
+  <td class="align ff-  fvl-1 ls-0 ffs-0">f&zwnj;i</td>
+  <td class="align ff-  fvl-1 ls-0 ffs-1">&#xfb01;</td>
+  <td class="align ff-  fvl-1 ls-1 ffs- ">f&zwnj;i</td>
+  <td class="align ff-  fvl-1 ls-1 ffs-n">f&zwnj;i</td>
+  <td class="align ff-  fvl-1 ls-1 ffs-0">f&zwnj;i</td>
+  <td class="align ff-  fvl-1 ls-1 ffs-1">&#xfb01;</td>
+
+</tr><tr>
+
+  <td class="align ff-0 fvl-  ls-  ffs- ">f&zwnj;i</td>
+  <td class="align ff-0 fvl-  ls-  ffs-n">f&zwnj;i</td>
+  <td class="align ff-0 fvl-  ls-  ffs-0">f&zwnj;i</td>
+  <td class="align ff-0 fvl-  ls-  ffs-1">&#xfb01;</td>
+  <td class="align ff-0 fvl-  ls-0 ffs- ">f&zwnj;i</td>
+  <td class="align ff-0 fvl-  ls-0 ffs-n">f&zwnj;i</td>
+  <td class="align ff-0 fvl-  ls-0 ffs-0">f&zwnj;i</td>
+  <td class="align ff-0 fvl-  ls-0 ffs-1">&#xfb01;</td>
+  <td class="align ff-0 fvl-  ls-1 ffs- ">f&zwnj;i</td>
+  <td class="align ff-0 fvl-  ls-1 ffs-n">f&zwnj;i</td>
+  <td class="align ff-0 fvl-  ls-1 ffs-0">f&zwnj;i</td>
+  <td class="align ff-0 fvl-  ls-1 ffs-1">&#xfb01;</td>
+</tr><tr>
+  <td class="align ff-0 fvl-n ls-  ffs- ">f&zwnj;i</td>
+  <td class="align ff-0 fvl-n ls-  ffs-n">f&zwnj;i</td>
+  <td class="align ff-0 fvl-n ls-  ffs-0">f&zwnj;i</td>
+  <td class="align ff-0 fvl-n ls-  ffs-1">&#xfb01;</td>
+  <td class="align ff-0 fvl-n ls-0 ffs- ">f&zwnj;i</td>
+  <td class="align ff-0 fvl-n ls-0 ffs-n">f&zwnj;i</td>
+  <td class="align ff-0 fvl-n ls-0 ffs-0">f&zwnj;i</td>
+  <td class="align ff-0 fvl-n ls-0 ffs-1">&#xfb01;</td>
+  <td class="align ff-0 fvl-n ls-1 ffs- ">f&zwnj;i</td>
+  <td class="align ff-0 fvl-n ls-1 ffs-n">f&zwnj;i</td>
+  <td class="align ff-0 fvl-n ls-1 ffs-0">f&zwnj;i</td>
+  <td class="align ff-0 fvl-n ls-1 ffs-1">&#xfb01;</td>
+</tr><tr>
+  <td class="align ff-0 fvl-0 ls-  ffs- ">f&zwnj;i</td>
+  <td class="align ff-0 fvl-0 ls-  ffs-n">f&zwnj;i</td>
+  <td class="align ff-0 fvl-0 ls-  ffs-0">f&zwnj;i</td>
+  <td class="align ff-0 fvl-0 ls-  ffs-1">&#xfb01;</td>
+  <td class="align ff-0 fvl-0 ls-0 ffs- ">f&zwnj;i</td>
+  <td class="align ff-0 fvl-0 ls-0 ffs-n">f&zwnj;i</td>
+  <td class="align ff-0 fvl-0 ls-0 ffs-0">f&zwnj;i</td>
+  <td class="align ff-0 fvl-0 ls-0 ffs-1">&#xfb01;</td>
+  <td class="align ff-0 fvl-0 ls-1 ffs- ">f&zwnj;i</td>
+  <td class="align ff-0 fvl-0 ls-1 ffs-n">f&zwnj;i</td>
+  <td class="align ff-0 fvl-0 ls-1 ffs-0">f&zwnj;i</td>
+  <td class="align ff-0 fvl-0 ls-1 ffs-1">&#xfb01;</td>
+</tr><tr>
+  <td class="align ff-0 fvl-1 ls-  ffs- ">&#xfb01;</td>
+  <td class="align ff-0 fvl-1 ls-  ffs-n">&#xfb01;</td>
+  <td class="align ff-0 fvl-1 ls-  ffs-0">f&zwnj;i</td>
+  <td class="align ff-0 fvl-1 ls-  ffs-1">&#xfb01;</td>
+  <td class="align ff-0 fvl-1 ls-0 ffs- ">&#xfb01;</td>
+  <td class="align ff-0 fvl-1 ls-0 ffs-n">&#xfb01;</td>
+  <td class="align ff-0 fvl-1 ls-0 ffs-0">f&zwnj;i</td>
+  <td class="align ff-0 fvl-1 ls-0 ffs-1">&#xfb01;</td>
+  <td class="align ff-0 fvl-1 ls-1 ffs- ">f&zwnj;i</td>
+  <td class="align ff-0 fvl-1 ls-1 ffs-n">f&zwnj;i</td>
+  <td class="align ff-0 fvl-1 ls-1 ffs-0">f&zwnj;i</td>
+  <td class="align ff-0 fvl-1 ls-1 ffs-1">&#xfb01;</td>
+
+</tr><tr>
+
+  <td class="align ff-1 fvl-  ls-  ffs- ">&#xfb01;</td>
+  <td class="align ff-1 fvl-  ls-  ffs-n">&#xfb01;</td>
+  <td class="align ff-1 fvl-  ls-  ffs-0">f&zwnj;i</td>
+  <td class="align ff-1 fvl-  ls-  ffs-1">&#xfb01;</td>
+  <td class="align ff-1 fvl-  ls-0 ffs- ">&#xfb01;</td>
+  <td class="align ff-1 fvl-  ls-0 ffs-n">&#xfb01;</td>
+  <td class="align ff-1 fvl-  ls-0 ffs-0">f&zwnj;i</td>
+  <td class="align ff-1 fvl-  ls-0 ffs-1">&#xfb01;</td>
+  <td class="align ff-1 fvl-  ls-1 ffs- ">f&zwnj;i</td>
+  <td class="align ff-1 fvl-  ls-1 ffs-n">f&zwnj;i</td>
+  <td class="align ff-1 fvl-  ls-1 ffs-0">f&zwnj;i</td>
+  <td class="align ff-1 fvl-  ls-1 ffs-1">&#xfb01;</td>
+</tr><tr>
+  <td class="align ff-1 fvl-n ls-  ffs- ">&#xfb01;</td>
+  <td class="align ff-1 fvl-n ls-  ffs-n">&#xfb01;</td>
+  <td class="align ff-1 fvl-n ls-  ffs-0">f&zwnj;i</td>
+  <td class="align ff-1 fvl-n ls-  ffs-1">&#xfb01;</td>
+  <td class="align ff-1 fvl-n ls-0 ffs- ">&#xfb01;</td>
+  <td class="align ff-1 fvl-n ls-0 ffs-n">&#xfb01;</td>
+  <td class="align ff-1 fvl-n ls-0 ffs-0">f&zwnj;i</td>
+  <td class="align ff-1 fvl-n ls-0 ffs-1">&#xfb01;</td>
+  <td class="align ff-1 fvl-n ls-1 ffs- ">f&zwnj;i</td>
+  <td class="align ff-1 fvl-n ls-1 ffs-n">f&zwnj;i</td>
+  <td class="align ff-1 fvl-n ls-1 ffs-0">f&zwnj;i</td>
+  <td class="align ff-1 fvl-n ls-1 ffs-1">&#xfb01;</td>
+</tr><tr>
+  <td class="align ff-1 fvl-0 ls-  ffs- ">f&zwnj;i</td>
+  <td class="align ff-1 fvl-0 ls-  ffs-n">f&zwnj;i</td>
+  <td class="align ff-1 fvl-0 ls-  ffs-0">f&zwnj;i</td>
+  <td class="align ff-1 fvl-0 ls-  ffs-1">&#xfb01;</td>
+  <td class="align ff-1 fvl-0 ls-0 ffs- ">f&zwnj;i</td>
+  <td class="align ff-1 fvl-0 ls-0 ffs-n">f&zwnj;i</td>
+  <td class="align ff-1 fvl-0 ls-0 ffs-0">f&zwnj;i</td>
+  <td class="align ff-1 fvl-0 ls-0 ffs-1">&#xfb01;</td>
+  <td class="align ff-1 fvl-0 ls-1 ffs- ">f&zwnj;i</td>
+  <td class="align ff-1 fvl-0 ls-1 ffs-n">f&zwnj;i</td>
+  <td class="align ff-1 fvl-0 ls-1 ffs-0">f&zwnj;i</td>
+  <td class="align ff-1 fvl-0 ls-1 ffs-1">&#xfb01;</td>
+</tr><tr>
+  <td class="align ff-1 fvl-1 ls-  ffs- ">&#xfb01;</td>
+  <td class="align ff-1 fvl-1 ls-  ffs-n">&#xfb01;</td>
+  <td class="align ff-1 fvl-1 ls-  ffs-0">f&zwnj;i</td>
+  <td class="align ff-1 fvl-1 ls-  ffs-1">&#xfb01;</td>
+  <td class="align ff-1 fvl-1 ls-0 ffs- ">&#xfb01;</td>
+  <td class="align ff-1 fvl-1 ls-0 ffs-n">&#xfb01;</td>
+  <td class="align ff-1 fvl-1 ls-0 ffs-0">f&zwnj;i</td>
+  <td class="align ff-1 fvl-1 ls-0 ffs-1">&#xfb01;</td>
+  <td class="align ff-1 fvl-1 ls-1 ffs- ">f&zwnj;i</td>
+  <td class="align ff-1 fvl-1 ls-1 ffs-n">f&zwnj;i</td>
+  <td class="align ff-1 fvl-1 ls-1 ffs-0">f&zwnj;i</td>
+  <td class="align ff-1 fvl-1 ls-1 ffs-1">&#xfb01;</td>
+
+</tr></table>
+<table class="test"><tr>
+
+  <td class="align ff-  fvl-  ls-  ffs- ">&#xfb01;</td>
+  <td class="align ff-  fvl-  ls-  ffs-n">&#xfb01;</td>
+  <td class="align ff-  fvl-  ls-  ffs-0">f&zwnj;i</td>
+  <td class="align ff-  fvl-  ls-  ffs-1">&#xfb01;</td>
+  <td class="align ff-  fvl-  ls-0 ffs- ">&#xfb01;</td>
+  <td class="align ff-  fvl-  ls-0 ffs-n">&#xfb01;</td>
+  <td class="align ff-  fvl-  ls-0 ffs-0">f&zwnj;i</td>
+  <td class="align ff-  fvl-  ls-0 ffs-1">&#xfb01;</td>
+  <td class="align ff-  fvl-  ls-1 ffs- ">f&zwnj;i</td>
+  <td class="align ff-  fvl-  ls-1 ffs-n">f&zwnj;i</td>
+  <td class="align ff-  fvl-  ls-1 ffs-0">f&zwnj;i</td>
+  <td class="align ff-  fvl-  ls-1 ffs-1">&#xfb01;</td>
+</tr><tr>
+  <td class="align ff-  fvl-n ls-  ffs- ">&#xfb01;</td>
+  <td class="align ff-  fvl-n ls-  ffs-n">&#xfb01;</td>
+  <td class="align ff-  fvl-n ls-  ffs-0">f&zwnj;i</td>
+  <td class="align ff-  fvl-n ls-  ffs-1">&#xfb01;</td>
+  <td class="align ff-  fvl-n ls-0 ffs- ">&#xfb01;</td>
+  <td class="align ff-  fvl-n ls-0 ffs-n">&#xfb01;</td>
+  <td class="align ff-  fvl-n ls-0 ffs-0">f&zwnj;i</td>
+  <td class="align ff-  fvl-n ls-0 ffs-1">&#xfb01;</td>
+  <td class="align ff-  fvl-n ls-1 ffs- ">f&zwnj;i</td>
+  <td class="align ff-  fvl-n ls-1 ffs-n">f&zwnj;i</td>
+  <td class="align ff-  fvl-n ls-1 ffs-0">f&zwnj;i</td>
+  <td class="align ff-  fvl-n ls-1 ffs-1">&#xfb01;</td>
+</tr><tr>
+  <td class="align ff-  fvl-0 ls-  ffs- ">f&zwnj;i</td>
+  <td class="align ff-  fvl-0 ls-  ffs-n">f&zwnj;i</td>
+  <td class="align ff-  fvl-0 ls-  ffs-0">f&zwnj;i</td>
+  <td class="align ff-  fvl-0 ls-  ffs-1">&#xfb01;</td>
+  <td class="align ff-  fvl-0 ls-0 ffs- ">f&zwnj;i</td>
+  <td class="align ff-  fvl-0 ls-0 ffs-n">f&zwnj;i</td>
+  <td class="align ff-  fvl-0 ls-0 ffs-0">f&zwnj;i</td>
+  <td class="align ff-  fvl-0 ls-0 ffs-1">&#xfb01;</td>
+  <td class="align ff-  fvl-0 ls-1 ffs- ">f&zwnj;i</td>
+  <td class="align ff-  fvl-0 ls-1 ffs-n">f&zwnj;i</td>
+  <td class="align ff-  fvl-0 ls-1 ffs-0">f&zwnj;i</td>
+  <td class="align ff-  fvl-0 ls-1 ffs-1">&#xfb01;</td>
+</tr><tr>
+  <td class="align ff-  fvl-1 ls-  ffs- ">&#xfb01;</td>
+  <td class="align ff-  fvl-1 ls-  ffs-n">&#xfb01;</td>
+  <td class="align ff-  fvl-1 ls-  ffs-0">f&zwnj;i</td>
+  <td class="align ff-  fvl-1 ls-  ffs-1">&#xfb01;</td>
+  <td class="align ff-  fvl-1 ls-0 ffs- ">&#xfb01;</td>
+  <td class="align ff-  fvl-1 ls-0 ffs-n">&#xfb01;</td>
+  <td class="align ff-  fvl-1 ls-0 ffs-0">f&zwnj;i</td>
+  <td class="align ff-  fvl-1 ls-0 ffs-1">&#xfb01;</td>
+  <td class="align ff-  fvl-1 ls-1 ffs- ">f&zwnj;i</td>
+  <td class="align ff-  fvl-1 ls-1 ffs-n">f&zwnj;i</td>
+  <td class="align ff-  fvl-1 ls-1 ffs-0">f&zwnj;i</td>
+  <td class="align ff-  fvl-1 ls-1 ffs-1">&#xfb01;</td>
+
+</tr><tr>
+
+  <td class="align ff-0 fvl-  ls-  ffs- ">f&zwnj;i</td>
+  <td class="align ff-0 fvl-  ls-  ffs-n">f&zwnj;i</td>
+  <td class="align ff-0 fvl-  ls-  ffs-0">f&zwnj;i</td>
+  <td class="align ff-0 fvl-  ls-  ffs-1">&#xfb01;</td>
+  <td class="align ff-0 fvl-  ls-0 ffs- ">f&zwnj;i</td>
+  <td class="align ff-0 fvl-  ls-0 ffs-n">f&zwnj;i</td>
+  <td class="align ff-0 fvl-  ls-0 ffs-0">f&zwnj;i</td>
+  <td class="align ff-0 fvl-  ls-0 ffs-1">&#xfb01;</td>
+  <td class="align ff-0 fvl-  ls-1 ffs- ">f&zwnj;i</td>
+  <td class="align ff-0 fvl-  ls-1 ffs-n">f&zwnj;i</td>
+  <td class="align ff-0 fvl-  ls-1 ffs-0">f&zwnj;i</td>
+  <td class="align ff-0 fvl-  ls-1 ffs-1">&#xfb01;</td>
+</tr><tr>
+  <td class="align ff-0 fvl-n ls-  ffs- ">f&zwnj;i</td>
+  <td class="align ff-0 fvl-n ls-  ffs-n">f&zwnj;i</td>
+  <td class="align ff-0 fvl-n ls-  ffs-0">f&zwnj;i</td>
+  <td class="align ff-0 fvl-n ls-  ffs-1">&#xfb01;</td>
+  <td class="align ff-0 fvl-n ls-0 ffs- ">f&zwnj;i</td>
+  <td class="align ff-0 fvl-n ls-0 ffs-n">f&zwnj;i</td>
+  <td class="align ff-0 fvl-n ls-0 ffs-0">f&zwnj;i</td>
+  <td class="align ff-0 fvl-n ls-0 ffs-1">&#xfb01;</td>
+  <td class="align ff-0 fvl-n ls-1 ffs- ">f&zwnj;i</td>
+  <td class="align ff-0 fvl-n ls-1 ffs-n">f&zwnj;i</td>
+  <td class="align ff-0 fvl-n ls-1 ffs-0">f&zwnj;i</td>
+  <td class="align ff-0 fvl-n ls-1 ffs-1">&#xfb01;</td>
+</tr><tr>
+  <td class="align ff-0 fvl-0 ls-  ffs- ">f&zwnj;i</td>
+  <td class="align ff-0 fvl-0 ls-  ffs-n">f&zwnj;i</td>
+  <td class="align ff-0 fvl-0 ls-  ffs-0">f&zwnj;i</td>
+  <td class="align ff-0 fvl-0 ls-  ffs-1">&#xfb01;</td>
+  <td class="align ff-0 fvl-0 ls-0 ffs- ">f&zwnj;i</td>
+  <td class="align ff-0 fvl-0 ls-0 ffs-n">f&zwnj;i</td>
+  <td class="align ff-0 fvl-0 ls-0 ffs-0">f&zwnj;i</td>
+  <td class="align ff-0 fvl-0 ls-0 ffs-1">&#xfb01;</td>
+  <td class="align ff-0 fvl-0 ls-1 ffs- ">f&zwnj;i</td>
+  <td class="align ff-0 fvl-0 ls-1 ffs-n">f&zwnj;i</td>
+  <td class="align ff-0 fvl-0 ls-1 ffs-0">f&zwnj;i</td>
+  <td class="align ff-0 fvl-0 ls-1 ffs-1">&#xfb01;</td>
+</tr><tr>
+  <td class="align ff-0 fvl-1 ls-  ffs- ">&#xfb01;</td>
+  <td class="align ff-0 fvl-1 ls-  ffs-n">&#xfb01;</td>
+  <td class="align ff-0 fvl-1 ls-  ffs-0">f&zwnj;i</td>
+  <td class="align ff-0 fvl-1 ls-  ffs-1">&#xfb01;</td>
+  <td class="align ff-0 fvl-1 ls-0 ffs- ">&#xfb01;</td>
+  <td class="align ff-0 fvl-1 ls-0 ffs-n">&#xfb01;</td>
+  <td class="align ff-0 fvl-1 ls-0 ffs-0">f&zwnj;i</td>
+  <td class="align ff-0 fvl-1 ls-0 ffs-1">&#xfb01;</td>
+  <td class="align ff-0 fvl-1 ls-1 ffs- ">f&zwnj;i</td>
+  <td class="align ff-0 fvl-1 ls-1 ffs-n">f&zwnj;i</td>
+  <td class="align ff-0 fvl-1 ls-1 ffs-0">f&zwnj;i</td>
+  <td class="align ff-0 fvl-1 ls-1 ffs-1">&#xfb01;</td>
+
+</tr><tr>
+
+  <td class="align ff-1 fvl-  ls-  ffs- ">&#xfb01;</td>
+  <td class="align ff-1 fvl-  ls-  ffs-n">&#xfb01;</td>
+  <td class="align ff-1 fvl-  ls-  ffs-0">f&zwnj;i</td>
+  <td class="align ff-1 fvl-  ls-  ffs-1">&#xfb01;</td>
+  <td class="align ff-1 fvl-  ls-0 ffs- ">&#xfb01;</td>
+  <td class="align ff-1 fvl-  ls-0 ffs-n">&#xfb01;</td>
+  <td class="align ff-1 fvl-  ls-0 ffs-0">f&zwnj;i</td>
+  <td class="align ff-1 fvl-  ls-0 ffs-1">&#xfb01;</td>
+  <td class="align ff-1 fvl-  ls-1 ffs- ">f&zwnj;i</td>
+  <td class="align ff-1 fvl-  ls-1 ffs-n">f&zwnj;i</td>
+  <td class="align ff-1 fvl-  ls-1 ffs-0">f&zwnj;i</td>
+  <td class="align ff-1 fvl-  ls-1 ffs-1">&#xfb01;</td>
+</tr><tr>
+  <td class="align ff-1 fvl-n ls-  ffs- ">&#xfb01;</td>
+  <td class="align ff-1 fvl-n ls-  ffs-n">&#xfb01;</td>
+  <td class="align ff-1 fvl-n ls-  ffs-0">f&zwnj;i</td>
+  <td class="align ff-1 fvl-n ls-  ffs-1">&#xfb01;</td>
+  <td class="align ff-1 fvl-n ls-0 ffs- ">&#xfb01;</td>
+  <td class="align ff-1 fvl-n ls-0 ffs-n">&#xfb01;</td>
+  <td class="align ff-1 fvl-n ls-0 ffs-0">f&zwnj;i</td>
+  <td class="align ff-1 fvl-n ls-0 ffs-1">&#xfb01;</td>
+  <td class="align ff-1 fvl-n ls-1 ffs- ">f&zwnj;i</td>
+  <td class="align ff-1 fvl-n ls-1 ffs-n">f&zwnj;i</td>
+  <td class="align ff-1 fvl-n ls-1 ffs-0">f&zwnj;i</td>
+  <td class="align ff-1 fvl-n ls-1 ffs-1">&#xfb01;</td>
+</tr><tr>
+  <td class="align ff-1 fvl-0 ls-  ffs- ">f&zwnj;i</td>
+  <td class="align ff-1 fvl-0 ls-  ffs-n">f&zwnj;i</td>
+  <td class="align ff-1 fvl-0 ls-  ffs-0">f&zwnj;i</td>
+  <td class="align ff-1 fvl-0 ls-  ffs-1">&#xfb01;</td>
+  <td class="align ff-1 fvl-0 ls-0 ffs- ">f&zwnj;i</td>
+  <td class="align ff-1 fvl-0 ls-0 ffs-n">f&zwnj;i</td>
+  <td class="align ff-1 fvl-0 ls-0 ffs-0">f&zwnj;i</td>
+  <td class="align ff-1 fvl-0 ls-0 ffs-1">&#xfb01;</td>
+  <td class="align ff-1 fvl-0 ls-1 ffs- ">f&zwnj;i</td>
+  <td class="align ff-1 fvl-0 ls-1 ffs-n">f&zwnj;i</td>
+  <td class="align ff-1 fvl-0 ls-1 ffs-0">f&zwnj;i</td>
+  <td class="align ff-1 fvl-0 ls-1 ffs-1">&#xfb01;</td>
+</tr><tr>
+  <td class="align ff-1 fvl-1 ls-  ffs- ">&#xfb01;</td>
+  <td class="align ff-1 fvl-1 ls-  ffs-n">&#xfb01;</td>
+  <td class="align ff-1 fvl-1 ls-  ffs-0">f&zwnj;i</td>
+  <td class="align ff-1 fvl-1 ls-  ffs-1">&#xfb01;</td>
+  <td class="align ff-1 fvl-1 ls-0 ffs- ">&#xfb01;</td>
+  <td class="align ff-1 fvl-1 ls-0 ffs-n">&#xfb01;</td>
+  <td class="align ff-1 fvl-1 ls-0 ffs-0">f&zwnj;i</td>
+  <td class="align ff-1 fvl-1 ls-0 ffs-1">&#xfb01;</td>
+  <td class="align ff-1 fvl-1 ls-1 ffs- ">f&zwnj;i</td>
+  <td class="align ff-1 fvl-1 ls-1 ffs-n">f&zwnj;i</td>
+  <td class="align ff-1 fvl-1 ls-1 ffs-0">f&zwnj;i</td>
+  <td class="align ff-1 fvl-1 ls-1 ffs-1">&#xfb01;</td>
+
+</tr></table>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-fonts/font-feature-resolution-001.html
@@ -0,0 +1,383 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<title>CSS Test: feature property settings are resolved in the correct order for 'liga'.</title>
+<link rel="author" title="Ben Wagner" href="bungeman@chromium.org" />
+<link rel="help" href="https://www.w3.org/TR/css-fonts-3/#feature-precedence" />
+<link rel="match" href="font-feature-resolution-001-ref.html" />
+<meta name="assert" content="default < @font-face < font-variant < letter-spacing < font-feature-settings" />
+<style>
+  @font-face {
+    font-family: lato-ffs-;
+    src: url(support/fonts/Lato-Medium.ttf);
+  }
+  @font-face {
+    font-family: lato-ffs-0;
+    src: url(support/fonts/Lato-Medium.ttf);
+    font-feature-settings: 'liga' off;
+  }
+  @font-face {
+    font-family: lato-ffs-1;
+    src: url(support/fonts/Lato-Medium.ttf);
+    font-feature-settings: 'liga' on;
+  }
+  .test, .ref {
+    font-family: lato-ffs-;
+    font-size: 2em;
+    position: absolute;
+  }
+  .test { color: green; }
+  .ref { color: red; }
+
+  .align { width: 1em; }
+
+  .ff-  { font-family: lato-ffs- ; }
+  .ff-0 { font-family: lato-ffs-0; }
+  .ff-1 { font-family: lato-ffs-1; }
+
+  .fvl-  { }
+  .fvl-n { font-variant-ligatures: normal; }
+  .fvl-0 { font-variant-ligatures: no-common-ligatures; }
+  .fvl-1 { font-variant-ligatures: common-ligatures; }
+
+  .ls-  { }
+  .ls-0 { letter-spacing: 0em; }
+  .ls-1 { letter-spacing: 0.1em; }
+
+  .ffs-  { }
+  .ffs-n { font-feature-settings: normal; }
+  .ffs-0 { font-feature-settings: 'liga' off; }
+  .ffs-1 { font-feature-settings: 'liga' on; }
+</style>
+</head>
+<body>
+<p>Test passes if there is no red visible.</p>
+<table class="ref"><tr>
+
+  <td class="align ff-  fvl-  ls-  ffs- ">&#xfb01;</td>
+  <td class="align ff-  fvl-  ls-  ffs-n">&#xfb01;</td>
+  <td class="align ff-  fvl-  ls-  ffs-0">f&zwnj;i</td>
+  <td class="align ff-  fvl-  ls-  ffs-1">&#xfb01;</td>
+  <td class="align ff-  fvl-  ls-0 ffs- ">&#xfb01;</td>
+  <td class="align ff-  fvl-  ls-0 ffs-n">&#xfb01;</td>
+  <td class="align ff-  fvl-  ls-0 ffs-0">f&zwnj;i</td>
+  <td class="align ff-  fvl-  ls-0 ffs-1">&#xfb01;</td>
+  <td class="align ff-  fvl-  ls-1 ffs- ">f&zwnj;i</td>
+  <td class="align ff-  fvl-  ls-1 ffs-n">f&zwnj;i</td>
+  <td class="align ff-  fvl-  ls-1 ffs-0">f&zwnj;i</td>
+  <td class="align ff-  fvl-  ls-1 ffs-1">&#xfb01;</td>
+</tr><tr>
+  <td class="align ff-  fvl-n ls-  ffs- ">&#xfb01;</td>
+  <td class="align ff-  fvl-n ls-  ffs-n">&#xfb01;</td>
+  <td class="align ff-  fvl-n ls-  ffs-0">f&zwnj;i</td>
+  <td class="align ff-  fvl-n ls-  ffs-1">&#xfb01;</td>
+  <td class="align ff-  fvl-n ls-0 ffs- ">&#xfb01;</td>
+  <td class="align ff-  fvl-n ls-0 ffs-n">&#xfb01;</td>
+  <td class="align ff-  fvl-n ls-0 ffs-0">f&zwnj;i</td>
+  <td class="align ff-  fvl-n ls-0 ffs-1">&#xfb01;</td>
+  <td class="align ff-  fvl-n ls-1 ffs- ">f&zwnj;i</td>
+  <td class="align ff-  fvl-n ls-1 ffs-n">f&zwnj;i</td>
+  <td class="align ff-  fvl-n ls-1 ffs-0">f&zwnj;i</td>
+  <td class="align ff-  fvl-n ls-1 ffs-1">&#xfb01;</td>
+</tr><tr>
+  <td class="align ff-  fvl-0 ls-  ffs- ">f&zwnj;i</td>
+  <td class="align ff-  fvl-0 ls-  ffs-n">f&zwnj;i</td>
+  <td class="align ff-  fvl-0 ls-  ffs-0">f&zwnj;i</td>
+  <td class="align ff-  fvl-0 ls-  ffs-1">&#xfb01;</td>
+  <td class="align ff-  fvl-0 ls-0 ffs- ">f&zwnj;i</td>
+  <td class="align ff-  fvl-0 ls-0 ffs-n">f&zwnj;i</td>
+  <td class="align ff-  fvl-0 ls-0 ffs-0">f&zwnj;i</td>
+  <td class="align ff-  fvl-0 ls-0 ffs-1">&#xfb01;</td>
+  <td class="align ff-  fvl-0 ls-1 ffs- ">f&zwnj;i</td>
+  <td class="align ff-  fvl-0 ls-1 ffs-n">f&zwnj;i</td>
+  <td class="align ff-  fvl-0 ls-1 ffs-0">f&zwnj;i</td>
+  <td class="align ff-  fvl-0 ls-1 ffs-1">&#xfb01;</td>
+</tr><tr>
+  <td class="align ff-  fvl-1 ls-  ffs- ">&#xfb01;</td>
+  <td class="align ff-  fvl-1 ls-  ffs-n">&#xfb01;</td>
+  <td class="align ff-  fvl-1 ls-  ffs-0">f&zwnj;i</td>
+  <td class="align ff-  fvl-1 ls-  ffs-1">&#xfb01;</td>
+  <td class="align ff-  fvl-1 ls-0 ffs- ">&#xfb01;</td>
+  <td class="align ff-  fvl-1 ls-0 ffs-n">&#xfb01;</td>
+  <td class="align ff-  fvl-1 ls-0 ffs-0">f&zwnj;i</td>
+  <td class="align ff-  fvl-1 ls-0 ffs-1">&#xfb01;</td>
+  <td class="align ff-  fvl-1 ls-1 ffs- ">f&zwnj;i</td>
+  <td class="align ff-  fvl-1 ls-1 ffs-n">f&zwnj;i</td>
+  <td class="align ff-  fvl-1 ls-1 ffs-0">f&zwnj;i</td>
+  <td class="align ff-  fvl-1 ls-1 ffs-1">&#xfb01;</td>
+
+</tr><tr>
+
+  <td class="align ff-0 fvl-  ls-  ffs- ">f&zwnj;i</td>
+  <td class="align ff-0 fvl-  ls-  ffs-n">f&zwnj;i</td>
+  <td class="align ff-0 fvl-  ls-  ffs-0">f&zwnj;i</td>
+  <td class="align ff-0 fvl-  ls-  ffs-1">&#xfb01;</td>
+  <td class="align ff-0 fvl-  ls-0 ffs- ">f&zwnj;i</td>
+  <td class="align ff-0 fvl-  ls-0 ffs-n">f&zwnj;i</td>
+  <td class="align ff-0 fvl-  ls-0 ffs-0">f&zwnj;i</td>
+  <td class="align ff-0 fvl-  ls-0 ffs-1">&#xfb01;</td>
+  <td class="align ff-0 fvl-  ls-1 ffs- ">f&zwnj;i</td>
+  <td class="align ff-0 fvl-  ls-1 ffs-n">f&zwnj;i</td>
+  <td class="align ff-0 fvl-  ls-1 ffs-0">f&zwnj;i</td>
+  <td class="align ff-0 fvl-  ls-1 ffs-1">&#xfb01;</td>
+</tr><tr>
+  <td class="align ff-0 fvl-n ls-  ffs- ">f&zwnj;i</td>
+  <td class="align ff-0 fvl-n ls-  ffs-n">f&zwnj;i</td>
+  <td class="align ff-0 fvl-n ls-  ffs-0">f&zwnj;i</td>
+  <td class="align ff-0 fvl-n ls-  ffs-1">&#xfb01;</td>
+  <td class="align ff-0 fvl-n ls-0 ffs- ">f&zwnj;i</td>
+  <td class="align ff-0 fvl-n ls-0 ffs-n">f&zwnj;i</td>
+  <td class="align ff-0 fvl-n ls-0 ffs-0">f&zwnj;i</td>
+  <td class="align ff-0 fvl-n ls-0 ffs-1">&#xfb01;</td>
+  <td class="align ff-0 fvl-n ls-1 ffs- ">f&zwnj;i</td>
+  <td class="align ff-0 fvl-n ls-1 ffs-n">f&zwnj;i</td>
+  <td class="align ff-0 fvl-n ls-1 ffs-0">f&zwnj;i</td>
+  <td class="align ff-0 fvl-n ls-1 ffs-1">&#xfb01;</td>
+</tr><tr>
+  <td class="align ff-0 fvl-0 ls-  ffs- ">f&zwnj;i</td>
+  <td class="align ff-0 fvl-0 ls-  ffs-n">f&zwnj;i</td>
+  <td class="align ff-0 fvl-0 ls-  ffs-0">f&zwnj;i</td>
+  <td class="align ff-0 fvl-0 ls-  ffs-1">&#xfb01;</td>
+  <td class="align ff-0 fvl-0 ls-0 ffs- ">f&zwnj;i</td>
+  <td class="align ff-0 fvl-0 ls-0 ffs-n">f&zwnj;i</td>
+  <td class="align ff-0 fvl-0 ls-0 ffs-0">f&zwnj;i</td>
+  <td class="align ff-0 fvl-0 ls-0 ffs-1">&#xfb01;</td>
+  <td class="align ff-0 fvl-0 ls-1 ffs- ">f&zwnj;i</td>
+  <td class="align ff-0 fvl-0 ls-1 ffs-n">f&zwnj;i</td>
+  <td class="align ff-0 fvl-0 ls-1 ffs-0">f&zwnj;i</td>
+  <td class="align ff-0 fvl-0 ls-1 ffs-1">&#xfb01;</td>
+</tr><tr>
+  <td class="align ff-0 fvl-1 ls-  ffs- ">&#xfb01;</td>
+  <td class="align ff-0 fvl-1 ls-  ffs-n">&#xfb01;</td>
+  <td class="align ff-0 fvl-1 ls-  ffs-0">f&zwnj;i</td>
+  <td class="align ff-0 fvl-1 ls-  ffs-1">&#xfb01;</td>
+  <td class="align ff-0 fvl-1 ls-0 ffs- ">&#xfb01;</td>
+  <td class="align ff-0 fvl-1 ls-0 ffs-n">&#xfb01;</td>
+  <td class="align ff-0 fvl-1 ls-0 ffs-0">f&zwnj;i</td>
+  <td class="align ff-0 fvl-1 ls-0 ffs-1">&#xfb01;</td>
+  <td class="align ff-0 fvl-1 ls-1 ffs- ">f&zwnj;i</td>
+  <td class="align ff-0 fvl-1 ls-1 ffs-n">f&zwnj;i</td>
+  <td class="align ff-0 fvl-1 ls-1 ffs-0">f&zwnj;i</td>
+  <td class="align ff-0 fvl-1 ls-1 ffs-1">&#xfb01;</td>
+
+</tr><tr>
+
+  <td class="align ff-1 fvl-  ls-  ffs- ">&#xfb01;</td>
+  <td class="align ff-1 fvl-  ls-  ffs-n">&#xfb01;</td>
+  <td class="align ff-1 fvl-  ls-  ffs-0">f&zwnj;i</td>
+  <td class="align ff-1 fvl-  ls-  ffs-1">&#xfb01;</td>
+  <td class="align ff-1 fvl-  ls-0 ffs- ">&#xfb01;</td>
+  <td class="align ff-1 fvl-  ls-0 ffs-n">&#xfb01;</td>
+  <td class="align ff-1 fvl-  ls-0 ffs-0">f&zwnj;i</td>
+  <td class="align ff-1 fvl-  ls-0 ffs-1">&#xfb01;</td>
+  <td class="align ff-1 fvl-  ls-1 ffs- ">f&zwnj;i</td>
+  <td class="align ff-1 fvl-  ls-1 ffs-n">f&zwnj;i</td>
+  <td class="align ff-1 fvl-  ls-1 ffs-0">f&zwnj;i</td>
+  <td class="align ff-1 fvl-  ls-1 ffs-1">&#xfb01;</td>
+</tr><tr>
+  <td class="align ff-1 fvl-n ls-  ffs- ">&#xfb01;</td>
+  <td class="align ff-1 fvl-n ls-  ffs-n">&#xfb01;</td>
+  <td class="align ff-1 fvl-n ls-  ffs-0">f&zwnj;i</td>
+  <td class="align ff-1 fvl-n ls-  ffs-1">&#xfb01;</td>
+  <td class="align ff-1 fvl-n ls-0 ffs- ">&#xfb01;</td>
+  <td class="align ff-1 fvl-n ls-0 ffs-n">&#xfb01;</td>
+  <td class="align ff-1 fvl-n ls-0 ffs-0">f&zwnj;i</td>
+  <td class="align ff-1 fvl-n ls-0 ffs-1">&#xfb01;</td>
+  <td class="align ff-1 fvl-n ls-1 ffs- ">f&zwnj;i</td>
+  <td class="align ff-1 fvl-n ls-1 ffs-n">f&zwnj;i</td>
+  <td class="align ff-1 fvl-n ls-1 ffs-0">f&zwnj;i</td>
+  <td class="align ff-1 fvl-n ls-1 ffs-1">&#xfb01;</td>
+</tr><tr>
+  <td class="align ff-1 fvl-0 ls-  ffs- ">f&zwnj;i</td>
+  <td class="align ff-1 fvl-0 ls-  ffs-n">f&zwnj;i</td>
+  <td class="align ff-1 fvl-0 ls-  ffs-0">f&zwnj;i</td>
+  <td class="align ff-1 fvl-0 ls-  ffs-1">&#xfb01;</td>
+  <td class="align ff-1 fvl-0 ls-0 ffs- ">f&zwnj;i</td>
+  <td class="align ff-1 fvl-0 ls-0 ffs-n">f&zwnj;i</td>
+  <td class="align ff-1 fvl-0 ls-0 ffs-0">f&zwnj;i</td>
+  <td class="align ff-1 fvl-0 ls-0 ffs-1">&#xfb01;</td>
+  <td class="align ff-1 fvl-0 ls-1 ffs- ">f&zwnj;i</td>
+  <td class="align ff-1 fvl-0 ls-1 ffs-n">f&zwnj;i</td>
+  <td class="align ff-1 fvl-0 ls-1 ffs-0">f&zwnj;i</td>
+  <td class="align ff-1 fvl-0 ls-1 ffs-1">&#xfb01;</td>
+</tr><tr>
+  <td class="align ff-1 fvl-1 ls-  ffs- ">&#xfb01;</td>
+  <td class="align ff-1 fvl-1 ls-  ffs-n">&#xfb01;</td>
+  <td class="align ff-1 fvl-1 ls-  ffs-0">f&zwnj;i</td>
+  <td class="align ff-1 fvl-1 ls-  ffs-1">&#xfb01;</td>
+  <td class="align ff-1 fvl-1 ls-0 ffs- ">&#xfb01;</td>
+  <td class="align ff-1 fvl-1 ls-0 ffs-n">&#xfb01;</td>
+  <td class="align ff-1 fvl-1 ls-0 ffs-0">f&zwnj;i</td>
+  <td class="align ff-1 fvl-1 ls-0 ffs-1">&#xfb01;</td>
+  <td class="align ff-1 fvl-1 ls-1 ffs- ">f&zwnj;i</td>
+  <td class="align ff-1 fvl-1 ls-1 ffs-n">f&zwnj;i</td>
+  <td class="align ff-1 fvl-1 ls-1 ffs-0">f&zwnj;i</td>
+  <td class="align ff-1 fvl-1 ls-1 ffs-1">&#xfb01;</td>
+
+</tr></table>
+<table class="test"><tr>
+
+  <td class="align ff-  fvl-  ls-  ffs- ">fi</td>
+  <td class="align ff-  fvl-  ls-  ffs-n">fi</td>
+  <td class="align ff-  fvl-  ls-  ffs-0">fi</td>
+  <td class="align ff-  fvl-  ls-  ffs-1">fi</td>
+  <td class="align ff-  fvl-  ls-0 ffs- ">fi</td>
+  <td class="align ff-  fvl-  ls-0 ffs-n">fi</td>
+  <td class="align ff-  fvl-  ls-0 ffs-0">fi</td>
+  <td class="align ff-  fvl-  ls-0 ffs-1">fi</td>
+  <td class="align ff-  fvl-  ls-1 ffs- ">fi</td>
+  <td class="align ff-  fvl-  ls-1 ffs-n">fi</td>
+  <td class="align ff-  fvl-  ls-1 ffs-0">fi</td>
+  <td class="align ff-  fvl-  ls-1 ffs-1">fi</td>
+</tr><tr>
+  <td class="align ff-  fvl-n ls-  ffs- ">fi</td>
+  <td class="align ff-  fvl-n ls-  ffs-n">fi</td>
+  <td class="align ff-  fvl-n ls-  ffs-0">fi</td>
+  <td class="align ff-  fvl-n ls-  ffs-1">fi</td>
+  <td class="align ff-  fvl-n ls-0 ffs- ">fi</td>
+  <td class="align ff-  fvl-n ls-0 ffs-n">fi</td>
+  <td class="align ff-  fvl-n ls-0 ffs-0">fi</td>
+  <td class="align ff-  fvl-n ls-0 ffs-1">fi</td>
+  <td class="align ff-  fvl-n ls-1 ffs- ">fi</td>
+  <td class="align ff-  fvl-n ls-1 ffs-n">fi</td>
+  <td class="align ff-  fvl-n ls-1 ffs-0">fi</td>
+  <td class="align ff-  fvl-n ls-1 ffs-1">fi</td>
+</tr><tr>
+  <td class="align ff-  fvl-0 ls-  ffs- ">fi</td>
+  <td class="align ff-  fvl-0 ls-  ffs-n">fi</td>
+  <td class="align ff-  fvl-0 ls-  ffs-0">fi</td>
+  <td class="align ff-  fvl-0 ls-  ffs-1">fi</td>
+  <td class="align ff-  fvl-0 ls-0 ffs- ">fi</td>
+  <td class="align ff-  fvl-0 ls-0 ffs-n">fi</td>
+  <td class="align ff-  fvl-0 ls-0 ffs-0">fi</td>
+  <td class="align ff-  fvl-0 ls-0 ffs-1">fi</td>
+  <td class="align ff-  fvl-0 ls-1 ffs- ">fi</td>
+  <td class="align ff-  fvl-0 ls-1 ffs-n">fi</td>
+  <td class="align ff-  fvl-0 ls-1 ffs-0">fi</td>
+  <td class="align ff-  fvl-0 ls-1 ffs-1">fi</td>
+</tr><tr>
+  <td class="align ff-  fvl-1 ls-  ffs- ">fi</td>
+  <td class="align ff-  fvl-1 ls-  ffs-n">fi</td>
+  <td class="align ff-  fvl-1 ls-  ffs-0">fi</td>
+  <td class="align ff-  fvl-1 ls-  ffs-1">fi</td>
+  <td class="align ff-  fvl-1 ls-0 ffs- ">fi</td>
+  <td class="align ff-  fvl-1 ls-0 ffs-n">fi</td>
+  <td class="align ff-  fvl-1 ls-0 ffs-0">fi</td>
+  <td class="align ff-  fvl-1 ls-0 ffs-1">fi</td>
+  <td class="align ff-  fvl-1 ls-1 ffs- ">fi</td>
+  <td class="align ff-  fvl-1 ls-1 ffs-n">fi</td>
+  <td class="align ff-  fvl-1 ls-1 ffs-0">fi</td>
+  <td class="align ff-  fvl-1 ls-1 ffs-1">fi</td>
+
+</tr><tr>
+
+  <td class="align ff-0 fvl-  ls-  ffs- ">fi</td>
+  <td class="align ff-0 fvl-  ls-  ffs-n">fi</td>
+  <td class="align ff-0 fvl-  ls-  ffs-0">fi</td>
+  <td class="align ff-0 fvl-  ls-  ffs-1">fi</td>
+  <td class="align ff-0 fvl-  ls-0 ffs- ">fi</td>
+  <td class="align ff-0 fvl-  ls-0 ffs-n">fi</td>
+  <td class="align ff-0 fvl-  ls-0 ffs-0">fi</td>
+  <td class="align ff-0 fvl-  ls-0 ffs-1">fi</td>
+  <td class="align ff-0 fvl-  ls-1 ffs- ">fi</td>
+  <td class="align ff-0 fvl-  ls-1 ffs-n">fi</td>
+  <td class="align ff-0 fvl-  ls-1 ffs-0">fi</td>
+  <td class="align ff-0 fvl-  ls-1 ffs-1">fi</td>
+</tr><tr>
+  <td class="align ff-0 fvl-n ls-  ffs- ">fi</td>
+  <td class="align ff-0 fvl-n ls-  ffs-n">fi</td>
+  <td class="align ff-0 fvl-n ls-  ffs-0">fi</td>
+  <td class="align ff-0 fvl-n ls-  ffs-1">fi</td>
+  <td class="align ff-0 fvl-n ls-0 ffs- ">fi</td>
+  <td class="align ff-0 fvl-n ls-0 ffs-n">fi</td>
+  <td class="align ff-0 fvl-n ls-0 ffs-0">fi</td>
+  <td class="align ff-0 fvl-n ls-0 ffs-1">fi</td>
+  <td class="align ff-0 fvl-n ls-1 ffs- ">fi</td>
+  <td class="align ff-0 fvl-n ls-1 ffs-n">fi</td>
+  <td class="align ff-0 fvl-n ls-1 ffs-0">fi</td>
+  <td class="align ff-0 fvl-n ls-1 ffs-1">fi</td>
+</tr><tr>
+  <td class="align ff-0 fvl-0 ls-  ffs- ">fi</td>
+  <td class="align ff-0 fvl-0 ls-  ffs-n">fi</td>
+  <td class="align ff-0 fvl-0 ls-  ffs-0">fi</td>
+  <td class="align ff-0 fvl-0 ls-  ffs-1">fi</td>
+  <td class="align ff-0 fvl-0 ls-0 ffs- ">fi</td>
+  <td class="align ff-0 fvl-0 ls-0 ffs-n">fi</td>
+  <td class="align ff-0 fvl-0 ls-0 ffs-0">fi</td>
+  <td class="align ff-0 fvl-0 ls-0 ffs-1">fi</td>
+  <td class="align ff-0 fvl-0 ls-1 ffs- ">fi</td>
+  <td class="align ff-0 fvl-0 ls-1 ffs-n">fi</td>
+  <td class="align ff-0 fvl-0 ls-1 ffs-0">fi</td>
+  <td class="align ff-0 fvl-0 ls-1 ffs-1">fi</td>
+</tr><tr>
+  <td class="align ff-0 fvl-1 ls-  ffs- ">fi</td>
+  <td class="align ff-0 fvl-1 ls-  ffs-n">fi</td>
+  <td class="align ff-0 fvl-1 ls-  ffs-0">fi</td>
+  <td class="align ff-0 fvl-1 ls-  ffs-1">fi</td>
+  <td class="align ff-0 fvl-1 ls-0 ffs- ">fi</td>
+  <td class="align ff-0 fvl-1 ls-0 ffs-n">fi</td>
+  <td class="align ff-0 fvl-1 ls-0 ffs-0">fi</td>
+  <td class="align ff-0 fvl-1 ls-0 ffs-1">fi</td>
+  <td class="align ff-0 fvl-1 ls-1 ffs- ">fi</td>
+  <td class="align ff-0 fvl-1 ls-1 ffs-n">fi</td>
+  <td class="align ff-0 fvl-1 ls-1 ffs-0">fi</td>
+  <td class="align ff-0 fvl-1 ls-1 ffs-1">fi</td>
+
+</tr><tr>
+
+  <td class="align ff-1 fvl-  ls-  ffs- ">fi</td>
+  <td class="align ff-1 fvl-  ls-  ffs-n">fi</td>
+  <td class="align ff-1 fvl-  ls-  ffs-0">fi</td>
+  <td class="align ff-1 fvl-  ls-  ffs-1">fi</td>
+  <td class="align ff-1 fvl-  ls-0 ffs- ">fi</td>
+  <td class="align ff-1 fvl-  ls-0 ffs-n">fi</td>
+  <td class="align ff-1 fvl-  ls-0 ffs-0">fi</td>
+  <td class="align ff-1 fvl-  ls-0 ffs-1">fi</td>
+  <td class="align ff-1 fvl-  ls-1 ffs- ">fi</td>
+  <td class="align ff-1 fvl-  ls-1 ffs-n">fi</td>
+  <td class="align ff-1 fvl-  ls-1 ffs-0">fi</td>
+  <td class="align ff-1 fvl-  ls-1 ffs-1">fi</td>
+</tr><tr>
+  <td class="align ff-1 fvl-n ls-  ffs- ">fi</td>
+  <td class="align ff-1 fvl-n ls-  ffs-n">fi</td>
+  <td class="align ff-1 fvl-n ls-  ffs-0">fi</td>
+  <td class="align ff-1 fvl-n ls-  ffs-1">fi</td>
+  <td class="align ff-1 fvl-n ls-0 ffs- ">fi</td>
+  <td class="align ff-1 fvl-n ls-0 ffs-n">fi</td>
+  <td class="align ff-1 fvl-n ls-0 ffs-0">fi</td>
+  <td class="align ff-1 fvl-n ls-0 ffs-1">fi</td>
+  <td class="align ff-1 fvl-n ls-1 ffs- ">fi</td>
+  <td class="align ff-1 fvl-n ls-1 ffs-n">fi</td>
+  <td class="align ff-1 fvl-n ls-1 ffs-0">fi</td>
+  <td class="align ff-1 fvl-n ls-1 ffs-1">fi</td>
+</tr><tr>
+  <td class="align ff-1 fvl-0 ls-  ffs- ">fi</td>
+  <td class="align ff-1 fvl-0 ls-  ffs-n">fi</td>
+  <td class="align ff-1 fvl-0 ls-  ffs-0">fi</td>
+  <td class="align ff-1 fvl-0 ls-  ffs-1">fi</td>
+  <td class="align ff-1 fvl-0 ls-0 ffs- ">fi</td>
+  <td class="align ff-1 fvl-0 ls-0 ffs-n">fi</td>
+  <td class="align ff-1 fvl-0 ls-0 ffs-0">fi</td>
+  <td class="align ff-1 fvl-0 ls-0 ffs-1">fi</td>
+  <td class="align ff-1 fvl-0 ls-1 ffs- ">fi</td>
+  <td class="align ff-1 fvl-0 ls-1 ffs-n">fi</td>
+  <td class="align ff-1 fvl-0 ls-1 ffs-0">fi</td>
+  <td class="align ff-1 fvl-0 ls-1 ffs-1">fi</td>
+</tr><tr>
+  <td class="align ff-1 fvl-1 ls-  ffs- ">fi</td>
+  <td class="align ff-1 fvl-1 ls-  ffs-n">fi</td>
+  <td class="align ff-1 fvl-1 ls-  ffs-0">fi</td>
+  <td class="align ff-1 fvl-1 ls-  ffs-1">fi</td>
+  <td class="align ff-1 fvl-1 ls-0 ffs- ">fi</td>
+  <td class="align ff-1 fvl-1 ls-0 ffs-n">fi</td>
+  <td class="align ff-1 fvl-1 ls-0 ffs-0">fi</td>
+  <td class="align ff-1 fvl-1 ls-0 ffs-1">fi</td>
+  <td class="align ff-1 fvl-1 ls-1 ffs- ">fi</td>
+  <td class="align ff-1 fvl-1 ls-1 ffs-n">fi</td>
+  <td class="align ff-1 fvl-1 ls-1 ffs-0">fi</td>
+  <td class="align ff-1 fvl-1 ls-1 ffs-1">fi</td>
+
+</tr></table>
+</body>
+</html>
deleted file mode 100644
--- a/testing/web-platform/tests/css/css-images/gradient-crash-ref.html
+++ /dev/null
@@ -1,1 +0,0 @@
-<!--intentionally blank-->
--- a/testing/web-platform/tests/css/css-images/gradient-crash.html
+++ b/testing/web-platform/tests/css/css-images/gradient-crash.html
@@ -1,12 +1,12 @@
 <!DOCTYPE html>
 <meta charset="utf-8">
 <title>Does this gradient crash the browser?</title>
-<link rel="match" href="gradient-crash-ref.html">
+<link rel="match" href="../reference/blank.html">
 <link rel="help" href="https://drafts.csswg.org/css-images-3/#color-stop-syntax">
 <meta name="assert" content="Gradients with total length zero and absolute positioned stops do not crash.">
 <style>
   div {
     background: linear-gradient(black 0,white);
   }
 </style>
 <div></div>
--- a/testing/web-platform/tests/css/css-masking/clip-path-svg-content/clip-path-content-syling.svg
+++ b/testing/web-platform/tests/css/css-masking/clip-path-svg-content/clip-path-content-syling.svg
@@ -4,13 +4,13 @@
 	<html:link rel="author" title="Dirk Schulze" href="mailto:dschulze@adobe.com"/>
 	<html:link rel="help" href="http://www.w3.org/TR/css-masking-1/#svg-clipping-paths"/>
 	<html:link rel="help" href="http://www.w3.org/TR/css-masking-1/#ClipPathElement"/>
 	<html:link rel="match" href="reference/clip-path-square-002-ref.svg" />
 	<metadata class="flags">svg</metadata>
 	<desc class="assert">Style properties on content elements of clipPath
 	must be ignored. A green square should be visible.</desc>
 </g>
-<clipPath id="clip1" clip-path="url(#clip1)">
-	<rect x="50" y="50" width="100" height="100" stroke="black" stroke-wdith="10" stroke-dasharray="10 10" fill="none"/>
+<clipPath id="clip1">
+	<rect x="50" y="50" width="100" height="100" stroke="black" stroke-width="10" stroke-dasharray="10 10" fill="none"/>
 </clipPath>
 <rect width="200" height="200" fill="green" clip-path="url(#clip1)"/>
-</svg>
\ No newline at end of file
+</svg>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-multicol/inheritance.html
@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>Inheritance of CSS Multi-column Layout properties</title>
+<link rel="help" href="https://drafts.csswg.org/css-multicol/#property-index">
+<meta name="assert" content="Properties should not inherit.">
+<meta name="assert" content="Properties have initial values according to the spec.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/inheritance-testcommon.js"></script>
+</head>
+<body>
+<div id="reference"></div>
+<div id="container">
+  <div id="target"></div>
+</div>
+<style>
+  #reference {
+    border-style: dotted; /* Avoid border-top-width computed style 0 */
+    border-top-width: medium;
+  }
+  #container {
+    color: rgba(42, 53, 64, 0.75);
+    column-rule-style: dotted; /* Avoid column-rule-width computed style 0 */
+  }
+  #target {
+    column-rule-style: dotted;
+  }
+</style>
+<script>
+const mediumWidth = getComputedStyle(reference).borderTopWidth; // e.g. 3px
+reference.style.display = 'none';
+
+assert_not_inherited('column-count', 'auto', '2');
+assert_not_inherited('column-fill', 'balance', 'auto');
+assert_not_inherited('column-gap', 'normal', '10px');
+assert_not_inherited('column-rule-color', 'rgba(42, 53, 64, 0.75)', 'rgba(2, 3, 5, 0.5)');
+assert_not_inherited('column-rule-style', 'none', 'dashed');
+assert_not_inherited('column-rule-width', mediumWidth, '10px');
+assert_not_inherited('column-span', 'none', 'all');
+assert_not_inherited('column-width', 'auto', '10px');
+</script>
+</body>
+</html>
--- a/testing/web-platform/tests/css/css-multicol/multicol-gap-fraction-001.xht
+++ b/testing/web-platform/tests/css/css-multicol/multicol-gap-fraction-001.xht
@@ -2,16 +2,17 @@
 <html xmlns="http://www.w3.org/1999/xhtml">
  <head>
   <title>CSS Multi-column Layout Test: 'column-gap' with increasing values</title>
   <link rel="author" title="Opera Software ASA" href="http://www.opera.com/" />
   <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2013-08-05 -->
   <link rel="help" href="http://www.w3.org/TR/css3-multicol/#column-gap" title="4.1. 'column-gap'" />
   <link rel="match" href="multicol-gap-fraction-001-ref.xht" />
   <meta name="flags" content="ahem" />
+  <meta name="assert" content="Test checks that increasing column gaps display consistently" />
   <style type="text/css"><![CDATA[
   div
   {
   background-color: gray;
   font: 1.25em/1 Ahem;
   width: 14.5em;
   orphans: 1;
   widows: 1;
--- a/testing/web-platform/tests/css/css-multicol/multicol-gap-large-002.xht
+++ b/testing/web-platform/tests/css/css-multicol/multicol-gap-large-002.xht
@@ -2,16 +2,17 @@
 <html xmlns="http://www.w3.org/1999/xhtml">
  <head>
   <title>CSS Multi-column Layout Test: 'column-gap' with large value</title>
   <link rel="author" title="Opera Software ASA" href="http://www.opera.com/" />
   <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2013-08-06 -->
   <link rel="help" href="http://www.w3.org/TR/css3-multicol/#column-gap" title="4.1 'column-gap" />
   <link rel="match" href="multicol-gap-large-002-ref.xht" />
   <meta name="flags" content="ahem" />
+  <meta name="assert" content="This test checks that a large column-gap is supported. We should have two 3.5em columns with a 4em gap between them." />
   <style type="text/css"><![CDATA[
   div
   {
   background-color: yellow;
   border: gray solid 1em;
   color: black;
   font: 1.25em/1 Ahem;
   orphans: 1;
--- a/testing/web-platform/tests/css/css-multicol/multicol-gap-negative-001.xht
+++ b/testing/web-platform/tests/css/css-multicol/multicol-gap-negative-001.xht
@@ -2,16 +2,17 @@
 <html xmlns="http://www.w3.org/1999/xhtml">
  <head>
   <title>CSS Multi-column Layout Test: column-gap with negative value</title>
   <link rel="author" title="Opera Software ASA" href="http://www.opera.com/" />
   <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2013-08-06 -->
   <link rel="help" href="http://www.w3.org/TR/css3-multicol/#column-gap" title="4.1. 'column-gap'" />
   <link rel="match" href="multicol-gap-002-ref.xht" />
   <meta name="flags" content="ahem invalid" />
+  <meta name="asset" content="Test checks that a negative value is not allowed for column-gap" />
   <style type="text/css"><![CDATA[
   div
   {
   background-color: yellow;
   border: gray solid 1em;
   color: black;
   font: 1.25em/1 Ahem;
   orphans: 1;
--- a/testing/web-platform/tests/css/css-multicol/multicol-inherit-001.xht
+++ b/testing/web-platform/tests/css/css-multicol/multicol-inherit-001.xht
@@ -1,15 +1,15 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
  <head>
   <title>CSS Multi-column Layout Test: multicolumn and inheritance</title>
   <link rel="author" title="Opera Software ASA" href="http://www.opera.com/" />
   <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2013-08-08 -->
-  <link rel="help" href="http://www.w3.org/TR/css3-multicol/#pseudo-algorithm" title="3.4 Pseudo-algorithm" />
+  <link rel="help" href="http://www.w3.org/TR/css3-multicol/#the-number-and-width-of-columns" />
   <link rel="match" href="multicol-inherit-001-ref.xht" />
   <meta name="flags" content="ahem" />
   <style type="text/css"><![CDATA[
   body
   {
   font: 1.25em/1 Ahem;
   width: 34em;
   }
--- a/testing/web-platform/tests/css/css-multicol/multicol-margin-child-001.xht
+++ b/testing/web-platform/tests/css/css-multicol/multicol-margin-child-001.xht
@@ -2,17 +2,17 @@
 <html xmlns="http://www.w3.org/1999/xhtml">
  <head>
   <title>CSS Multi-column Layout Test: multi-column and margin collapsing of block children (basic)</title>
   <link rel="author" title="Opera Software ASA" href="http://www.opera.com/" />
   <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2013-08-10 -->
   <link rel="help" href="http://www.w3.org/TR/css3-multicol/#the-multi-column-model" title="2. The multi-column model" />
   <link rel="match" href="multicol-margin-child-001-ref.xht" />
   <meta name="flags" content="ahem" />
-  <meta name="assert" content="This test checks that the margin-bottom of a block child in a multi-column element will collapse with the margin-top of a following block child of that same multi-colum element if those children are vertically adjacent and if no line boxes, no clearance, no padding and no border separate them." />
+  <meta name="assert" content="This test checks that the margin-bottom of a block child in a multi-column element will collapse with the margin-top of a following block child of that same multi-column element if those children are vertically adjacent and if no line boxes, no clearance, no padding and no border separate them." />
   <style type="text/css"><![CDATA[
   div
   {
   background-color: yellow;
   border: gray solid 1em;
   color: blue;
   font: 1.25em/1 Ahem;
   width: 10em;
--- a/testing/web-platform/tests/css/css-multicol/multicol-rule-000.xht
+++ b/testing/web-platform/tests/css/css-multicol/multicol-rule-000.xht
@@ -1,16 +1,17 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
  <head>
   <title>CSS Multi-column Layout Test: column-rule shorthand (basic)</title>
   <link rel="author" title="Hakon Wium Lie" href="mailto:howcome@opera.com" />
   <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2013-08-27 -->
   <link rel="help" href="http://www.w3.org/TR/css3-multicol/#column-rule" title="4.5 'column-rule'" />
   <link rel="match" href="multicol-rule-000-ref.xht" />
+  <meta name="assert" content="This test checks that the shorthand column-rule property draws the rule correctly." />
   <meta name="flags" content="ahem" />
   <style type="text/css"><![CDATA[
   div
   {
   color: black;
   font: 1.25em/1 Ahem;
   margin-bottom: 0.5em;
   width: 602px;
--- a/testing/web-platform/tests/css/css-multicol/multicol-rule-003.xht
+++ b/testing/web-platform/tests/css/css-multicol/multicol-rule-003.xht
@@ -1,16 +1,17 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
  <head>
   <title>CSS Multi-column Layout Test: column-rule (basic)</title>
   <link rel="author" title="Opera Software ASA" href="http://www.opera.com/" />
   <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2013-08-14 -->
   <link rel="help" href="http://www.w3.org/TR/css3-multicol/#column-gaps-and-rules" title="4. Column gaps and rules" />
   <link rel="match" href="multicol-rule-003-ref.xht" />
+  <meta name="assert" content="Tests that the three column-rule-* longhand properties are correctly applied." />
   <meta name="flags" content="ahem" />
   <style type="text/css"><![CDATA[
   div
   {
   background-color: yellow;
   border: gray solid 1em;
   color: black;
   font: 1.25em/1 Ahem;
--- a/testing/web-platform/tests/css/css-multicol/multicol-rule-color-001.xht
+++ b/testing/web-platform/tests/css/css-multicol/multicol-rule-color-001.xht
@@ -2,16 +2,17 @@
 <html xmlns="http://www.w3.org/1999/xhtml">
  <head>
   <title>CSS Multi-column Layout Test: column-rule-color (basic)</title>
   <link rel="author" title="Opera Software ASA" href="http://www.opera.com/" />
   <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2013-08-14 -->
   <link rel="help" href="http://www.w3.org/TR/css3-multicol/#column-rule" title="4.5 'column-rule'" />
   <link rel="match" href="multicol-rule-color-001-ref.xht" />
   <meta name="flags" content="ahem" />
+  <meta name="assert" content="Basic test that the column-rule-color property is applied." />
   <style type="text/css"><![CDATA[
   div
   {
   border: gray solid 1em;
   color: lime;
   font: 1.25em/1 Ahem;
   orphans: 1;
   widows: 1;
--- a/testing/web-platform/tests/css/css-multicol/multicol-rule-dashed-000.xht
+++ b/testing/web-platform/tests/css/css-multicol/multicol-rule-dashed-000.xht
@@ -2,16 +2,17 @@
 <html xmlns="http://www.w3.org/1999/xhtml">
  <head>
   <title>CSS Multi-column Layout Test: column-rule shorthand with 'dashed' border style</title>
   <link rel="author" title="Hakon Wium Lie" href="mailto:howcome@opera.com" />
   <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2013-08-27 -->
   <link rel="help" href="http://www.w3.org/TR/css3-multicol/#column-rule" title="4.5 'column-rule'" />
   <link rel="match" href="multicol-rule-dashed-000-ref.xht" />
   <meta name="flags" content="ahem" />
+  <meta name="assert" content="Tests that the dashed value of column-rule-style is correctly rendered when used in the shorthand column-rule property." />
   <style type="text/css"><![CDATA[
   div
   {
   background-color: black;
   color: black;
   font: 3.125em/1 Ahem;
   margin-bottom: 0.2em;
   width: 8.2em;
--- a/testing/web-platform/tests/css/css-multicol/multicol-rule-dotted-000.xht
+++ b/testing/web-platform/tests/css/css-multicol/multicol-rule-dotted-000.xht
@@ -1,16 +1,17 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
  <head>
   <title>CSS Multi-column Layout Test: column-rule shorthand with 'dotted' border style</title>
   <link rel="author" title="Hakon Wium Lie" href="mailto:howcome@opera.com" />
   <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2013-08-27 -->
   <link rel="help" href="http://www.w3.org/TR/css3-multicol/#column-rule" title="4.5 'column-rule'" />
   <link rel="match" href="multicol-rule-dotted-000-ref.xht" />
+  <meta name="assert" content="Tests that the dotted value of column-rule-style is correctly rendered when used in the shorthand column-rule property." />
   <meta name="flags" content="ahem" />
   <style type="text/css"><![CDATA[
   div
   {
   background-color: black;
   color: black;
   font: 3.125em/1 Ahem;
   margin-bottom: 0.2em;
--- a/testing/web-platform/tests/css/css-multicol/multicol-rule-double-000.xht
+++ b/testing/web-platform/tests/css/css-multicol/multicol-rule-double-000.xht
@@ -2,16 +2,17 @@
 <html xmlns="http://www.w3.org/1999/xhtml">
  <head>
   <title>CSS Multi-column Layout Test: column-rule shorthand with 'double' border style</title>
   <link rel="author" title="Hakon Wium Lie" href="mailto:howcome@opera.com" />
   <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2013-08-27 -->
   <link rel="help" href="http://www.w3.org/TR/css3-multicol/#column-rule" title="4.5 'column-rule'" />
   <link rel="match" href="multicol-rule-double-000-ref.xht" />
   <meta name="flags" content="ahem" />
+  <meta name="assert" content="Tests that the double value of column-rule-style is correctly rendered when used in the shorthand column-rule property." />
   <style type="text/css"><![CDATA[
   div
   {
   background-color: black;
   color: black;
   font: 3.125em/1 Ahem;
   margin-bottom: 0.2em;
   width: 8.2em;
--- a/testing/web-platform/tests/css/css-multicol/multicol-rule-fraction-001.xht
+++ b/testing/web-platform/tests/css/css-multicol/multicol-rule-fraction-001.xht
@@ -2,16 +2,17 @@
 <html xmlns="http://www.w3.org/1999/xhtml">
  <head>
   <title>CSS Multi-column Layout Test: column-rule-width</title>
   <link rel="author" title="Opera Software ASA" href="http://www.opera.com/" />
   <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2013-08-14 -->
   <link rel="help" href="http://www.w3.org/TR/css3-multicol/#crw" title="4.4. 'column-rule-width'" />
   <link rel="match" href="multicol-rule-fraction-001-ref.xht" />
   <meta name="flags" content="ahem" />
+  <meta name="assert" content="Basic test for the column-rule-width property, checking that values above 0 but below 1 are allowed." />
   <style type="text/css"><![CDATA[
   div
   {
   background-color: yellow;
   border: gray solid 1em;
   color: black;
   font: 1.25em/1 Ahem;
   orphans: 1;
--- a/testing/web-platform/tests/css/css-multicol/multicol-rule-groove-000.xht
+++ b/testing/web-platform/tests/css/css-multicol/multicol-rule-groove-000.xht
@@ -2,16 +2,17 @@
 <html xmlns="http://www.w3.org/1999/xhtml">
  <head>
   <title>CSS Multi-column Layout Test: column-rule shorthand with 'groove' border style</title>
   <link rel="author" title="Hakon Wium Lie" href="mailto:howcome@opera.com" />
   <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2013-08-27 -->
   <link rel="help" href="http://www.w3.org/TR/css3-multicol/#column-rule" title="4.5 'column-rule'" />
   <link rel="match" href="multicol-rule-groove-000-ref.xht" />
   <meta name="flags" content="ahem" />
+  <meta name="assert" content="Test checks that the value of 'groove' for 'column-rule-style' is drawn correctly." />
   <style type="text/css"><![CDATA[
   div
   {
   background-color: black;
   color: black;
   font: 3.125em/1 Ahem;
   margin-bottom: 0.2em;
   width: 8.2em;
--- a/testing/web-platform/tests/css/css-multicol/multicol-rule-hidden-000.xht
+++ b/testing/web-platform/tests/css/css-multicol/multicol-rule-hidden-000.xht
@@ -2,16 +2,17 @@
 <html xmlns="http://www.w3.org/1999/xhtml">
  <head>
   <title>CSS Multi-column Layout Test: column-rule shorthand with 'hidden' border style</title>
   <link rel="author" title="Hakon Wium Lie" href="mailto:howcome@opera.com" />
   <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2013-08-27 -->
   <link rel="help" href="http://www.w3.org/TR/css3-multicol/#column-rule" title="4.5 'column-rule'" />
   <link rel="match" href="multicol-rule-hidden-000-ref.xht" />
   <meta name="flags" content="ahem" />
+  <meta name="assert" content="Test checks that a column-rule-width value of hidden results in no rule being drawn." />
   <style type="text/css"><![CDATA[
   div
   {
   background-color: black;
   color: black;
   font: 3.125em/1 Ahem;
   margin-bottom: 0.2em;
   width: 8.2em;
--- a/testing/web-platform/tests/css/css-multicol/multicol-rule-none-000.xht
+++ b/testing/web-platform/tests/css/css-multicol/multicol-rule-none-000.xht
@@ -2,16 +2,17 @@
 <html xmlns="http://www.w3.org/1999/xhtml">
  <head>
   <title>CSS Multi-column Layout Test: column-rule shorthand with 'none' border style</title>
   <link rel="author" title="Hakon Wium Lie" href="mailto:howcome@opera.com" />
   <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2013-08-27 -->
   <link rel="help" href="http://www.w3.org/TR/css3-multicol/#column-rule" title="4.5 'column-rule'" />
   <link rel="match" href="multicol-rule-hidden-000-ref.xht" />
   <meta name="flags" content="ahem" />
+  <meta name="assert" content="Test checks that a column-rule-width value of none results in no rule being drawn." />
   <style type="text/css"><![CDATA[
   div
   {
   background-color: black;
   color: black;
   font: 3.125em/1 Ahem;
   margin-bottom: 0.2em;
   width: 8.2em;
--- a/testing/web-platform/tests/css/css-multicol/multicol-rule-px-001.xht
+++ b/testing/web-platform/tests/css/css-multicol/multicol-rule-px-001.xht
@@ -2,16 +2,17 @@
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
 <title>multicolumn | column-rule</title>
 <link rel="author" title="Opera Software ASA" href="http://www.opera.com/"/>
 <link rel="help" href="http://www.w3.org/TR/css3-multicol/#column-gaps-and-rules"/>
 <link rel="match" href="multicol-rule-ref.xht"/>
 <meta name="flags" content="ahem"/>
+<meta name="assert" content="Test checks that a column-rule-width value set in pixels is rendered correctly. The width of the rule should be 16px." />
 <style type="text/css"><![CDATA[
 body {
 	margin: 0;
 }
 body>div {
 	font-family: Ahem;
 	font-size: 1em;
 	line-height: 1em;
--- a/testing/web-platform/tests/css/css-multicol/multicol-rule-ridge-000.xht
+++ b/testing/web-platform/tests/css/css-multicol/multicol-rule-ridge-000.xht
@@ -2,16 +2,17 @@
 <html xmlns="http://www.w3.org/1999/xhtml">
  <head>
   <title>CSS Multi-column Layout Test: column-rule shorthand with 'ridge' border style</title>
   <link rel="author" title="Hakon Wium Lie" href="mailto:howcome@opera.com" />
   <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2013-08-27 -->
   <link rel="help" href="http://www.w3.org/TR/css3-multicol/#column-rule" title="4.5 'column-rule'" />
   <link rel="match" href="multicol-rule-ridge-000-ref.xht" />
   <meta name="flags" content="ahem" />
+   <meta name="assert" content="Test checks that the value of 'ridge' for 'column-rule-style' is drawn correctly." />
   <style type="text/css"><![CDATA[
   div
   {
   background-color: black;
   color: black;
   font: 3.125em/1 Ahem;
   margin-bottom: 0.2em;
   width: 8.2em;
--- a/testing/web-platform/tests/css/css-multicol/multicol-rule-samelength-001.xht
+++ b/testing/web-platform/tests/css/css-multicol/multicol-rule-samelength-001.xht
@@ -2,16 +2,17 @@
 <html xmlns="http://www.w3.org/1999/xhtml">
  <head>
   <title>CSS Multi-column Layout Test: 'column-rule-width' has same length as 'column-gap'</title>
   <link rel="author" title="Opera Software ASA" href="http://www.opera.com/" />
   <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2013-08-15 -->
   <link rel="help" href="http://www.w3.org/TR/css3-multicol/#crw" title="4.4. 'column-rule-width'" />
   <link rel="match" href="multicol-rule-samelength-001-ref.xht" />
   <meta name="flags" content="ahem" />
+  <meta name="assert" content="Test that a gap of 5em and a column-rule-width of 5em both take up the same space." />
   <style type="text/css"><![CDATA[
   body {margin: 8px;}
 
   p
   {
   line-height: 1.25em;
   margin: 1em 0em;
   }
--- a/testing/web-platform/tests/css/css-multicol/multicol-rule-shorthand-001.xht
+++ b/testing/web-platform/tests/css/css-multicol/multicol-rule-shorthand-001.xht
@@ -2,16 +2,17 @@
 <html xmlns="http://www.w3.org/1999/xhtml">
  <head>
   <title>CSS Multi-column Layout Test: 'column-rule' shorthand</title>
   <link rel="author" title="Opera Software ASA" href="http://www.opera.com/" />
   <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2013-08-15 -->
   <link rel="help" href="http://www.w3.org/TR/css3-multicol/#crw" title="4.4. 'column-rule-width'" />
   <link rel="match" href="multicol-rule-samelength-001-ref.xht" />
   <meta name="flags" content="ahem invalid" />
+  <meta name="assert" content="Tests that column rules are not displayed for invalid properties and values."/>
   <style type="text/css"><![CDATA[
   body {margin: 8px;}
 
   p
   {
   line-height: 1.25em;
   margin: 1em 0em;
   }
--- a/testing/web-platform/tests/css/css-multicol/multicol-rule-shorthand-2.xht
+++ b/testing/web-platform/tests/css/css-multicol/multicol-rule-shorthand-2.xht
@@ -2,17 +2,17 @@
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
 <title>CSS Multi-column Layout Test: 'column-rule' shorthand</title>
 <link rel="author" title="Opera Software ASA" href="http://www.opera.com/"/>
 <link rel="help" href=""/>
 <link rel="match" href="multicol-rule-shorthand-2-ref.xht"/>
 <meta name="assert" content="Tests that column rules are not displayed for invalid properties and values."/>
-<meta name="flags" content="invalid"/>
+<meta name="flags" content="ahem invalid"/>
 <style type="text/css"><![CDATA[
 body {
 	margin: 1em;
 }
 body>div {
 	font-family: Ahem;
 	font-size: 1em;
 	line-height: 1em;
--- a/testing/web-platform/tests/css/css-multicol/multicol-rule-solid-000.xht
+++ b/testing/web-platform/tests/css/css-multicol/multicol-rule-solid-000.xht
@@ -2,16 +2,17 @@
 <html xmlns="http://www.w3.org/1999/xhtml">
  <head>
   <title>CSS Multi-column Layout Test: column-rule shorthand with 'solid' border style</title>
   <link rel="author" title="Hakon Wium Lie" href="mailto:howcome@opera.com" />
   <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2013-08-27 -->
   <link rel="help" href="http://www.w3.org/TR/css3-multicol/#column-rule" title="4.5 'column-rule'" />
   <link rel="match" href="multicol-rule-solid-000-ref.xht" />
   <meta name="flags" content="ahem" />
+  <meta name="assert" content="Test checks that a column-rule-style value set as 'solid' is rendered correctly." />
   <style type="text/css"><![CDATA[
   div
   {
   background-color: black;
   color: black;
   font: 3.125em/1 Ahem;
   margin-bottom: 0.2em;
   width: 8.2em;
--- a/testing/web-platform/tests/css/css-multicol/multicol-rule-stacking-001.xht
+++ b/testing/web-platform/tests/css/css-multicol/multicol-rule-stacking-001.xht
@@ -2,31 +2,30 @@
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
 <title>multicolumn | column-count, stacking</title>
 <link rel="author" title="Opera Software ASA" href="http://www.opera.com/"/>
 <link rel="help" href="http://www.w3.org/TR/css3-multicol/#column-gaps-and-rules"/>
 <link rel="match" href="multicol-rule-stacking-ref.xht"/>
 <meta name="flags" content="ahem"/>
+<meta name="assert" content="The test checks that the span element, which has a higher 'z-index' stacks on top of the other elements in the multicol container." />
 <style type="text/css"><![CDATA[
 body {
 	margin: 0;
 }
 body>div {
 	font-family: Ahem;
 	font-size: 1em;
 	line-height: 1em;
 	color: blue;
 	background: red;
 	margin: 1em;
 	border: 1em solid gray;
 	width: 14em;
-	orphans: 1;
-	widows: 1;
 
 	column-count: 4;
 	column-gap: 1em;
 	column-rule: 28em solid blue;
 }
 span {
 	color: black;
 	position: relative;
--- a/testing/web-platform/tests/css/css-multicol/multicol-shorthand-001.xht
+++ b/testing/web-platform/tests/css/css-multicol/multicol-shorthand-001.xht
@@ -2,16 +2,17 @@
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
 <title>multicolumn | invalid</title>
 <link rel="author" title="Opera Software ASA" href="http://www.opera.com/"/>
 <link rel="help" href="http://www.w3.org/TR/css3-multicol/#the-number-and-width-of-columns"/>
 <link rel="match" href="multicol-rule-ref.xht"/>
 <meta name="flags" content="ahem invalid"/>
+<meta name="assert" content="Testing that invalid property names used as a shorthand do not result in column-rules being displayed." />
 <style type="text/css"><![CDATA[
 body {
 	margin: 0;
 }
 body>div {
 	font-family: Ahem;
 	font-size: 1em;
 	line-height: 1em;
@@ -21,18 +22,18 @@ body>div {
 	border: 1em solid gray;
 	width: 15em;
 	orphans: 1;
 	widows: 1;
 
 	column-count: 4;
 	column-gap: 1em;
 	column-rule: solid blue 1em;
-	column: normal red 1em;
-	columns: normal red 1em;
+	column: normal red 1em; /* column is not a valid property */
+	columns: normal red 1em; /* columns is a shorthand for colun-width and column-count */
 }
 span {
 	background: blue;
 	position: absolute;
 	top: 0;
 	left: 3em;
 	height: 2em;
 	width: 1em;
--- a/testing/web-platform/tests/css/css-multicol/multicol-span-000.xht
+++ b/testing/web-platform/tests/css/css-multicol/multicol-span-000.xht
@@ -2,16 +2,17 @@
 <html xmlns="http://www.w3.org/1999/xhtml">
  <head>
   <title>CSS Multi-column Layout Test: column-span (basic)</title>
   <link rel="author" title="Hakon Wium Lie" href="mailto:howcome@opera.com" />
   <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2013-08-27 -->
   <link rel="help" href="http://www.w3.org/TR/css3-multicol/#column-rule" title="4.5 'column-rule'" />
   <link rel="match" href="multicol-span-000-ref.xht" />
   <meta name="flags" content="ahem image" />
+  <meta name="assert" content="Tests that the element with an id of 'column-span' spans across all columns." />
   <style type="text/css"><![CDATA[
   div
   {
   background-color: yellow;
   color: lime;
   font: 1.25em/1 Ahem;
   orphans: 1;
   widows: 1;
--- a/testing/web-platform/tests/css/css-multicol/multicol-span-all-001.xht
+++ b/testing/web-platform/tests/css/css-multicol/multicol-span-all-001.xht
@@ -2,16 +2,17 @@
 <html xmlns="http://www.w3.org/1999/xhtml">
  <head>
   <title>CSS Multi-column Layout Test: 'column-span' element (basic)</title>
   <link rel="author" title="Opera Software ASA" href="http://www.opera.com/" />
   <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2013-08-16 -->
   <link rel="help" href="http://www.w3.org/TR/css3-multicol/#column-span" title="6.1. 'column-span'" />
   <link rel="match" href="multicol-span-all-001-ref.xht" />
   <meta name="flags" content="ahem" />
+  <meta name="assert" content="Tests that the h4 set to 'column-span: all' spans across all columns resulting in a black bar across the multicol container." />
   <style type="text/css"><![CDATA[
   div
   {
   background-color: yellow;
   border: gray solid 1em;
   color: navy;
   font: 1.25em/1 Ahem;
   orphans: 1;
--- a/testing/web-platform/tests/css/css-multicol/multicol-span-all-002.xht
+++ b/testing/web-platform/tests/css/css-multicol/multicol-span-all-002.xht
@@ -2,16 +2,17 @@
 <html xmlns="http://www.w3.org/1999/xhtml">
  <head>
   <title>CSS Multi-column Layout Test: 'column-span' element - large margin-left and 'overflow: hidden'</title>
   <link rel="author" title="Opera Software ASA" href="http://www.opera.com/" />
   <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2013-08-16 -->
   <link rel="help" href="http://www.w3.org/TR/css3-multicol/#column-span" title="6.1. 'column-span'" />
   <link rel="match" href="multicol-span-all-002-ref.xht" />
   <meta name="flags" content="ahem" />
+  <meta name="assert" content="Test of the situation where there is not sufficient space for the spanning element, UA may treat the element as 'column-span: none'; in which case, 'overflow: hidden' will take care of overflowed content out of multi-column box." />
   <style type="text/css"><![CDATA[
   div
   {
   background-color: yellow;
   border: gray solid 1em;
   color: navy;
   font: 1.25em/1 Ahem;
   orphans: 1;
@@ -61,9 +62,9 @@
     <span id="top-first-and-second-columns"> bl ue bl ue </span>
     <span id="top-third-and-fourth-columns"> Pi nk Pi nk </span>
     <h4> sPana </h4>
     ab cd ef gh
     ij kl mn oq
   </div>
 
  </body>
-</html>
\ No newline at end of file
+</html>
--- a/testing/web-platform/tests/css/css-multicol/multicol-span-all-block-sibling-003.xht
+++ b/testing/web-platform/tests/css/css-multicol/multicol-span-all-block-sibling-003.xht
@@ -2,16 +2,17 @@
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
 <title>multicol | column-span: all | block-level child</title>
 <link rel="author" title="Opera Software ASA" href="http://www.opera.com/"/>
 <link rel="help" href="http://www.w3.org/TR/css3-multicol/#spanning-columns"/>
 <link rel="match" href="multicol-span-all-block-sibling-3-ref.xht"/>
 <meta name="flags" content="ahem"/>
+<meta name="assert" content="Test that a block element which is a sibling of content in the multicol element acts correctly as a spanner." />
 <style type="text/css"><![CDATA[
 body>div {
 	font-family: Ahem;
 	font-size: 1em;
 	line-height: 1;
 	color: black;
 	background: black;
 
--- a/testing/web-platform/tests/css/css-multicol/multicol-span-all-margin-001.xht
+++ b/testing/web-platform/tests/css/css-multicol/multicol-span-all-margin-001.xht
@@ -1,12 +1,12 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
  <head>
-  <title>CSS Multi-column Layout Test: 'column-span: all' element and width exceeding available multi-colum width (complex)</title>
+  <title>CSS Multi-column Layout Test: 'column-span: all' element and width exceeding available multi-column width (complex)</title>
   <link rel="author" title="Opera Software ASA" href="http://www.opera.com/" />
   <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2013-08-18 -->
   <link rel="help" href="http://www.w3.org/TR/css3-multicol/#column-span" title="6.1. 'column-span'" />
   <link rel="match" href="multicol-span-all-margin-001-ref.xht" />
   <meta name="flags" content="ahem may" />
   <meta name="assert" content="This test checks that when 'overflow' is set to 'hidden' on a multi-column element, then any spanning ('column-span: all') element exceeding the available width of the multi-column should be clipped accordingly." />
   <style type="text/css"><![CDATA[
   div
--- a/testing/web-platform/tests/css/css-multicol/multicol-span-all-margin-002.xht
+++ b/testing/web-platform/tests/css/css-multicol/multicol-span-all-margin-002.xht
@@ -2,16 +2,17 @@
 <html xmlns="http://www.w3.org/1999/xhtml">
  <head>
   <title>CSS Multi-column Layout Test: 'column-span: all' element</title>
   <link rel="author" title="Opera Software ASA" href="http://www.opera.com/" />
   <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2013-08-19 -->
   <link rel="help" href="http://www.w3.org/TR/css3-multicol/#column-span" title="6.1. 'column-span'" />
   <link rel="match" href="multicol-span-all-margin-002-ref.xht" />
   <meta name="flags" content="ahem" />
+  <meta name="assert" content="The spanning element extends only to the width of the multicol element, despite an item in the fourth column extending into the overflow area." />
   <style type="text/css"><![CDATA[
   div
   {
   background-color: yellow;
   border: gray solid 1em;
   color: navy;
   font: 1.25em/1 Ahem;
   orphans: 1;
--- a/testing/web-platform/tests/css/css-multicol/multicol-span-all-margin-bottom-001.xht
+++ b/testing/web-platform/tests/css/css-multicol/multicol-span-all-margin-bottom-001.xht
@@ -2,16 +2,17 @@
 <html xmlns="http://www.w3.org/1999/xhtml">
  <head>
   <title>CSS Multi-column Layout Test: 'column-span: all' element with vertical margins and width exceeding available multi-colum width (complex)</title>
   <link rel="author" title="Opera Software ASA" href="http://www.opera.com/" />
   <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2013-08-19 -->
   <link rel="help" href="http://www.w3.org/TR/css3-multicol/#column-span" title="6.1. 'column-span'" />
   <link rel="match" href="multicol-span-all-margin-bottom-001-ref.xht" />
   <meta name="flags" content="ahem" />
+  <meta name="assert" content="In this test, the glyphs 'or' are painted into 1st column box, the glyphs 'ang' extend outside the box, and  should not be clipped. In this test they are overwritten by spans so are not visible." />
   <style type="text/css"><![CDATA[
   div
   {
   background-color: yellow;
   border: gray solid 1em;
   color: navy;
   font: 1.25em/1 Ahem;
   orphans: 1;
--- a/testing/web-platform/tests/css/css-multicol/multicol-table-cell-vertical-align-001.xht
+++ b/testing/web-platform/tests/css/css-multicol/multicol-table-cell-vertical-align-001.xht
@@ -2,16 +2,17 @@
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
 <title>multicolumn | table-cell, vertical-align</title>
 <link rel="author" title="Opera Software ASA" href="http://www.opera.com/"/>
 <link rel="help" href="http://www.w3.org/TR/css3-multicol/#the-multi-column-model"/>
 <link rel="match" href="multicol-table-cell-vertical-align-ref.xht"/>
 <meta name="flags" content="ahem"/>
+<meta name="assert" content="This test checks that 'column-count' applies to elements with 'display' set to 'table-cell' which also use 'vertical-align: middle'. The 'vertical-align' property should still apply." />
 <style type="text/css"><![CDATA[
 div {
 	font-family: Ahem;
 	font-size: 20px;
 	line-height: 1em;
 	vertical-align: middle;
 	color: white;
 	background: #3366CC;
--- a/testing/web-platform/tests/css/css-multicol/multicol-under-vertical-rl-scroll.html
+++ b/testing/web-platform/tests/css/css-multicol/multicol-under-vertical-rl-scroll.html
@@ -1,11 +1,12 @@
 <!DOCTYPE html>
 <title>Multicol under vertical-rl scrolling container</title>
 <link rel="match" href="multicol-under-vertical-rl-scroll-ref.html">
 <link rel="help" href="https://drafts.csswg.org/css-multicol">
+<meta name="assert" content="Test that multicol works as expected when overflow is scrolling in vertical-rl" />
 <p>Passes if there are two green squares</p>
 <div style="width: 200px; height: 200px; overflow: scroll; writing-mode: vertical-rl; border: 1px solid black">
   <div style="columns: 2; column-gap: 20px; width: 80px; height: 180px">
     <div style="width: 160px; background: green"></div>
   </div>
   <div style="width: 500px; height: 500px"></div>
 </div>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-paint-api/registered-property-interpolation-001.https.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<title>Interpolated &lt;angle&gt; values reach worklet</title>
+<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="match" href="parse-input-arguments-ref.html">
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/worklet-reftest.js"></script>
+<script src="./resources/utils.js"></script>
+<body>
+<div id="target"></div>
+<script>
+    try {
+      registerAndInterpolateProperty({
+        on: target, from: '100deg', to: '200deg',
+        name: '--prop', syntax: '<angle>'
+      });
+
+      expectWorkletValue(target, '--prop', '[CSSUnitValue 150deg]');
+    } catch(e) {
+      document.body.textContent = e;
+      takeScreenshot();
+    }
+</script>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-paint-api/registered-property-interpolation-002.https.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<title>Interpolated &lt;color&gt; values reach worklet</title>
+<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="match" href="parse-input-arguments-ref.html">
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/worklet-reftest.js"></script>
+<script src="./resources/utils.js"></script>
+<body>
+<div id="target"></div>
+<script>
+    try {
+      registerAndInterpolateProperty({
+        on: target, from: 'rgb(128, 100, 200)', to: 'red',
+        name: '--prop', syntax: '<color>'
+      });
+
+      expectWorkletValue(target, '--prop', '[CSSStyleValue rgb(192, 50, 100)]');
+    } catch(e) {
+      document.body.textContent = e;
+      takeScreenshot();
+    }
+</script>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-paint-api/registered-property-interpolation-003.https.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<title>Interpolated &lt;integer&gt; values reach worklet</title>
+<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="match" href="parse-input-arguments-ref.html">
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/worklet-reftest.js"></script>
+<script src="./resources/utils.js"></script>
+<body>
+<div id="target"></div>
+<script>
+    try {
+      registerAndInterpolateProperty({
+        on: target, from: '32', to: '64',
+        name: '--prop', syntax: '<integer>'
+      });
+
+      expectWorkletValue(target, '--prop', '[CSSUnitValue 48]');
+    } catch(e) {
+      document.body.textContent = e;
+      takeScreenshot();
+    }
+</script>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-paint-api/registered-property-interpolation-004.https.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<title>Interpolated &lt;length-percentage&gt; values reach worklet</title>
+<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="match" href="parse-input-arguments-ref.html">
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/worklet-reftest.js"></script>
+<script src="./resources/utils.js"></script>
+<body>
+<div id="target"></div>
+<script>
+    try {
+      registerAndInterpolateProperty({
+        on: target, from: '10px', to: '20%',
+        name: '--prop', syntax: '<length-percentage>'
+      });
+
+      expectWorkletValue(target, '--prop', '[CSSMathSum calc(5px + 10%)]');
+    } catch(e) {
+      document.body.textContent = e;
+      takeScreenshot();
+    }
+</script>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-paint-api/registered-property-interpolation-005.https.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<title>Interpolated &lt;length&gt; values reach worklet</title>
+<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="match" href="parse-input-arguments-ref.html">
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/worklet-reftest.js"></script>
+<script src="./resources/utils.js"></script>
+<body>
+<div id="target"></div>
+<script>
+    try {
+      target.style.setProperty('font-size', '10px');
+
+      registerAndInterpolateProperty({
+        on: target, from: '10px', to: '20px',
+        name: '--prop-1', syntax: '<length>'
+      });
+
+      registerAndInterpolateProperty({
+        on: target, from: '100px', to: '20em',
+        name: '--prop-2', syntax: '<length>'
+      });
+
+      expectWorkletValues(target, {
+        '--prop-1': '[CSSUnitValue 15px]',
+        '--prop-2': '[CSSUnitValue 150px]'
+      });
+    } catch(e) {
+      document.body.textContent = e;
+      takeScreenshot();
+    }
+</script>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-paint-api/registered-property-interpolation-006.https.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<title>Interpolated &lt;number&gt; values reach worklet</title>
+<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="match" href="parse-input-arguments-ref.html">
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/worklet-reftest.js"></script>
+<script src="./resources/utils.js"></script>
+<body>
+<div id="target"></div>
+<script>
+    try {
+      registerAndInterpolateProperty({
+        on: target, from: '8.5', to: '16.5',
+        name: '--prop', syntax: '<number>'
+      });
+
+      expectWorkletValue(target, '--prop', '[CSSUnitValue 12.5]');
+    } catch(e) {
+      document.body.textContent = e;
+      takeScreenshot();
+    }
+</script>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-paint-api/registered-property-interpolation-007.https.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<title>Interpolated &lt;percentage&gt; values reach worklet</title>
+<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="match" href="parse-input-arguments-ref.html">
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/worklet-reftest.js"></script>
+<script src="./resources/utils.js"></script>
+<body>
+<div id="target"></div>
+<script>
+    try {
+      registerAndInterpolateProperty({
+        on: target, from: '40%', to: '60%',
+        name: '--prop', syntax: '<percentage>'
+      });
+
+      expectWorkletValue(target, '--prop', '[CSSUnitValue 50%]');
+    } catch(e) {
+      document.body.textContent = e;
+      takeScreenshot();
+    }
+</script>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-paint-api/registered-property-interpolation-008.https.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<title>Interpolated &lt;resolution&gt; values reach worklet</title>
+<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="match" href="parse-input-arguments-ref.html">
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/worklet-reftest.js"></script>
+<script src="./resources/utils.js"></script>
+<body>
+<div id="target"></div>
+<script>
+    try {
+      registerAndInterpolateProperty({
+        on: target, from: '100dppx', to: '900dppx',
+        name: '--prop', syntax: '<resolution>'
+      });
+
+      expectWorkletValue(target, '--prop', '[CSSUnitValue 500dppx]');
+    } catch(e) {
+      document.body.textContent = e;
+      takeScreenshot();
+    }
+</script>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-paint-api/registered-property-interpolation-009.https.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<title>Interpolated &lt;time&gt; values reach worklet</title>
+<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="match" href="parse-input-arguments-ref.html">
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/worklet-reftest.js"></script>
+<script src="./resources/utils.js"></script>
+<body>
+<div id="target"></div>
+<script>
+    try {
+      registerAndInterpolateProperty({
+        on: target, from: '42s', to: '62s',
+        name: '--prop', syntax: '<time>'
+      });
+
+      expectWorkletValue(target, '--prop', '[CSSUnitValue 52s]');
+    } catch(e) {
+      document.body.textContent = e;
+      takeScreenshot();
+    }
+</script>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-paint-api/registered-property-interpolation-010.https.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<title>Interpolated list values reach worklet</title>
+<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="match" href="parse-input-arguments-ref.html">
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/worklet-reftest.js"></script>
+<script src="./resources/utils.js"></script>
+<body>
+<div id="target"></div>
+<script>
+    try {
+      registerAndInterpolateProperty({
+        on: target, from: '10px 20px', to: '20px 30px',
+        name: '--prop-1', syntax: '<length>+'
+      });
+
+      registerAndInterpolateProperty({
+        on: target, from: '10px', to: '20px',
+        name: '--prop-2', syntax: '<length>+'
+      });
+
+      expectWorkletValues(target, {
+        '--prop-1': ['[CSSUnitValue 15px]', '[CSSUnitValue 25px]'],
+        '--prop-2': '[CSSUnitValue 15px]'
+      });
+    } catch(e) {
+      document.body.textContent = e;
+      takeScreenshot();
+    }
+</script>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-paint-api/registered-property-stylemap.https.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<title>Test styleMap functions</title>
+<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="match" href="parse-input-arguments-ref.html">
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/worklet-reftest.js"></script>
+<script src="./resources/utils.js"></script>
+<body>
+<style>
+  #target {
+    width: 100px;
+    height: 100px;
+    background: paint(style-map);
+  }
+</style>
+<div id="target"></div>
+<script>
+    try {
+      CSS.registerProperty({
+        name: '--prop',
+        syntax: '<length>+',
+        initialValue: '10px 10px 10px 10px',
+        inherits: false
+      });
+
+      const worklet = `
+        registerPaint('style-map', class {
+          static get inputProperties() { return ['--prop']; }
+          paint(ctx, geom, styleMap) {
+            let serialize = (v) => '[' + v.constructor.name + ' ' + v.toString() + ']';
+            let expected = '[CSSUnitValue 10px]';
+            let isExpected = x => serialize(x) === expected;
+
+            let pass = true;
+
+            pass &= styleMap.has('--prop');
+            pass &= isExpected(styleMap.get('--prop'));
+            pass &= styleMap.getAll('--prop').length == 4;
+            pass &= styleMap.getAll('--prop').every(isExpected);
+            pass &= Array.from(styleMap).filter(e => e[0] == '--prop')[0][1].length == 4;
+            pass &= Array.from(styleMap).filter(e => e[0] == '--prop')[0][1].every(isExpected);
+
+            ctx.strokeStyle = pass ? 'green' : 'red';
+            ctx.lineWidth = 4;
+            ctx.strokeRect(0, 0, geom.width, geom.height);
+          }
+        });`
+
+        importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, worklet);
+    } catch(e) {
+      document.body.textContent = e;
+      takeScreenshot();
+    }
+</script>
+</body>
+</html>
deleted file mode 100644
--- a/testing/web-platform/tests/css/css-paint-api/registered-property-type.https.html
+++ /dev/null
@@ -1,174 +0,0 @@
-<!DOCTYPE html>
-<html class="reftest-wait">
-<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
-<link rel="match" href="parse-input-arguments-ref.html">
-<style>
-.container {
-  width: 100px;
-  height: 100px;
-}
-
-#canvas-geometry {
-  background-image: paint(geometry);
-}
-</style>
-<script src="/common/reftest-wait.js"></script>
-<script src="/common/worklet-reftest.js"></script>
-<body>
-<div id="canvas-geometry" class="container"></div>
-<script id="code" type="text/worklet">
-  // Globals that must be prepended to this script:
-  // - debugLog: A function that logs errors.
-  // - props: Test data.
-
-  registerPaint('geometry', class {
-    static get inputProperties() { return props.map(p => p.name); }
-
-    paint(ctx, geom, styleMap) {
-      ctx.strokeStyle = 'green';
-      for (let prop of props) {
-        // Read values using get, getAll and iterator:
-        let valueFromGet = styleMap.get(prop.name);
-        let valueFromGetAll = styleMap.getAll(prop.name);
-        let valueFromIterator = Array.from(styleMap).filter(e => e[0] == prop.name)[0][1];
-
-        // Serialize 'actual'-values for all three cases:
-        let serialize = v => v.constructor.name + '=' + v.toString()
-        let actualFromGet = serialize(valueFromGet);
-        let actualFromGetAll = valueFromGetAll.map(serialize).join(',');
-        let actualFromIterator = valueFromIterator.map(serialize).join(',');
-
-        // Create 'expected'-values for all three cases:
-        let expectedForGet = prop.expected[0];
-        let expectedForGetAll = prop.expected.join(',');
-        let expectedForIterator = expectedForGetAll;
-
-        let pass = true;
-
-        // Assertions:
-        if (actualFromGet !== expectedForGet) {
-          debugLog(`FAIL: StylePropertyMap.get: actual: ${actualFromGet}  expected: ${expectedForGet}`);
-          pass = false;
-        }
-        if (actualFromGetAll !== expectedForGetAll) {
-          debugLog(`FAIL: StylePropertyMap.getAll: actual: ${actualFromGetAll}  expected: ${expectedForGetAll}`);
-          pass = false;
-        }
-        if (actualFromIterator !== expectedForIterator) {
-          debugLog(`FAIL: StylePropertyMap iterator: actual: ${actualFromIterator}  expected: ${expectedForIterator}`);
-          pass = false;
-        }
-
-        if (!pass)
-          ctx.strokeStyle = 'red';
-        else
-          debugLog('PASS', prop.syntax, actualFromGetAll, expectedForGetAll);
-      }
-      ctx.lineWidth = 4;
-      ctx.strokeRect(0, 0, geom.width, geom.height);
-    }
-  });
-</script>
-<script>
-    // A copy of this array (automatically enriched with 'name' and 'expected')
-    // is also available in the worklet.
-    let props = [
-      // Initial values.
-      { syntax: '*', initialValue: 'if(){}' },
-      { syntax: '<angle>', initialValue: '42deg' },
-      { syntax: '<color>', initialValue: '#fefefe' },
-      { syntax: '<custom-ident>', initialValue: 'none' },
-      { syntax: '<image>', initialValue: 'linear-gradient(red, red)' },
-      { syntax: '<image>', initialValue: 'url(http://a.com/a)' },
-      { syntax: '<integer>', initialValue: '42' },
-      { syntax: '<length-percentage>', initialValue: '10%' },
-      { syntax: '<length-percentage>', initialValue: '10px' },
-      { syntax: '<length-percentage>', initialValue: 'calc(10px + 10%)' },
-      { syntax: '<length>', initialValue: '1337px' },
-      { syntax: '<number>', initialValue: '42.5' },
-      { syntax: '<percentage>', initialValue: '42%' },
-      { syntax: '<resolution>', initialValue: '300dpi' },
-      { syntax: '<time>', initialValue: '3600s' },
-      { syntax: '<url>', initialValue: 'url(http://a.com/a)' },
-      { syntax: 'thing', initialValue: 'thing' },
-      { syntax: '<length> | <angle>', initialValue: '1337px' },
-      { syntax: '<angle> | <image>', initialValue: '1turn' },
-      { syntax: '<length>+', initialValue: '1337px' },
-      { syntax: '<length>+', initialValue: '1337px 1338px', count: 2 },
-      { syntax: '<length>#', initialValue: '1337px' },
-      { syntax: '<length>#', initialValue: '1337px, 1338px', count: 2 },
-
-      // Non-initial values:
-      { syntax: '*', initialValue: 'fail', value: 'if(){}' },
-      { syntax: '<angle> | fail', initialValue: 'fail', value: '42deg' },
-      { syntax: '<color> | fail', initialValue: 'fail', value: '#fefefe' },
-      { syntax: '<custom-ident> | fail', initialValue: 'fail', value: 'none' },
-      { syntax: '<image> | fail', initialValue: 'fail', value: 'linear-gradient(red, red)' },
-      { syntax: '<image> | fail', initialValue: 'fail', value: 'url(http://a.com/a)' },
-      { syntax: '<integer> | fail', initialValue: 'fail', value: '42' },
-      { syntax: '<length-percentage> | fail', initialValue: 'fail', value: '10%' },
-      { syntax: '<length-percentage> | fail', initialValue: 'fail', value: '10px' },
-      { syntax: '<length-percentage> | fail', initialValue: 'fail', value: 'calc(10px + 10%)' },
-      { syntax: '<length> | fail', initialValue: 'fail', value: '1337px' },
-      { syntax: '<number> | fail', initialValue: 'fail', value: '42.5' },
-      { syntax: '<percentage> | fail', initialValue: 'fail', value: '42%' },
-      { syntax: '<resolution> | fail', initialValue: 'fail', value: '300dpi' },
-      { syntax: '<time> | fail', initialValue: 'fail', value: '3600s' },
-      { syntax: '<url> | fail', initialValue: 'fail', value: 'url(http://a.com/a)' },
-      { syntax: 'thing | fail', initialValue: 'fail', value: 'thing' },
-      { syntax: '<length>+ | fail', initialValue: 'fail', value: '1337px' },
-      { syntax: '<length>+ | fail', initialValue: 'fail', value: '1337px 1338px', count: 2 },
-      { syntax: '<length># | fail', initialValue: 'fail', value: '1337px' },
-      { syntax: '<length># | fail', initialValue: 'fail', value: '1337px, 1338px', count: 2 },
-    ];
-
-    try {
-      let target = document.getElementById('canvas-geometry');
-      let pid = 1;
-
-      for (let p of props) {
-        p.name = `--prop-${++pid}`;
-
-        CSS.registerProperty({
-          name: p.name,
-          syntax: p.syntax,
-          initialValue: p.initialValue,
-          inherits: (typeof p.inherits !== 'undefined') ? p.inherits : false
-        });
-
-        if (typeof p.value !== 'undefined')
-          target.style.setProperty(p.name, p.value);
-        if (typeof p.count === 'undefined')
-          p.count = 1;
-
-        let getValue = p => (typeof p.value !== 'undefined') ? p.value : p.initialValue;
-        let serialize = v => v.constructor.name + '=' + v.toString();
-
-        let parse = function (p) {
-          if (p.count == 1)
-            return [CSSStyleValue.parse(p.name, getValue(p))];
-          return CSSStyleValue.parseAll(p.name, getValue(p));
-        };
-
-        // Generate expected value. We assume that CSSStyleValue.parse/All
-        // returns the correct CSSStyleValue subclass and value.
-        p.expected = parse(p).map(serialize);
-      }
-
-      // Adding '?debug' to the URL will cause this test to emit
-      // test results to console.log.
-      let debugMode = document.location.href.endsWith('?debug');
-      let code = [
-        `const props = ${JSON.stringify(props)};`,
-        `const debugLog = ${debugMode ? 'console.log' : 'function(){}'};`,
-        document.getElementById('code').textContent
-      ].join('\n');
-
-      importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, code);
-    } catch(e) {
-      document.body.textContent = e;
-      takeScreenshot();
-    }
-</script>
-</body>
-</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-paint-api/registered-property-value-001.https.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<title>Initial values reach worklet</title>
+<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="match" href="parse-input-arguments-ref.html">
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/worklet-reftest.js"></script>
+<script src="./resources/utils.js"></script>
+<body>
+<div id="target"></div>
+<script>
+    try {
+      CSS.registerProperty({
+        name: '--prop',
+        syntax: '<length>',
+        initialValue: '42px',
+        inherits: false
+      });
+
+      expectWorkletValue(target, '--prop', '[CSSUnitValue 42px]');
+    } catch(e) {
+      document.body.textContent = e;
+      takeScreenshot();
+    }
+</script>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-paint-api/registered-property-value-002.https.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<title>Inherited values reach worklet</title>
+<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="match" href="parse-input-arguments-ref.html">
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/worklet-reftest.js"></script>
+<script src="./resources/utils.js"></script>
+<body>
+<div id="outer">
+  <div id="target"></div>
+</div>
+<script>
+    try {
+      CSS.registerProperty({
+        name: '--prop',
+        syntax: '<length>',
+        initialValue: '0px',
+        inherits: true
+      });
+
+      outer.style.setProperty('--prop', '13px');
+
+      expectWorkletValue(target, '--prop', '[CSSUnitValue 13px]');
+    } catch(e) {
+      document.body.textContent = e;
+      takeScreenshot();
+    }
+</script>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-paint-api/registered-property-value-003.https.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<title>Values of *-properties reach worklet</title>
+<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="match" href="parse-input-arguments-ref.html">
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/worklet-reftest.js"></script>
+<script src="./resources/utils.js"></script>
+<body>
+<div id="target"></div>
+<script>
+    try {
+      CSS.registerProperty({
+        name: '--prop',
+        syntax: '*',
+        inherits: false
+      });
+
+      target.style.setProperty('--prop', 'if(){}');
+
+      expectWorkletValue(target, '--prop', '[CSSUnparsedValue if(){}]');
+    } catch(e) {
+      document.body.textContent = e;
+      takeScreenshot();
+    }
+</script>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-paint-api/registered-property-value-004.https.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<title>Values of &lt;angle&gt;-properties reach worklet</title>
+<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="match" href="parse-input-arguments-ref.html">
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/worklet-reftest.js"></script>
+<script src="./resources/utils.js"></script>
+<body>
+<div id="target"></div>
+<script>
+    try {
+      CSS.registerProperty({
+        name: '--prop',
+        syntax: '<angle>',
+        initialValue: '0deg',
+        inherits: false
+      });
+
+      target.style.setProperty('--prop', '100deg');
+
+      expectWorkletValue(target, '--prop', '[CSSUnitValue 100deg]');
+    } catch(e) {
+      document.body.textContent = e;
+      takeScreenshot();
+    }
+</script>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-paint-api/registered-property-value-005.https.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<title>Values of &lt;color&gt;-properties reach worklet</title>
+<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="match" href="parse-input-arguments-ref.html">
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/worklet-reftest.js"></script>
+<script src="./resources/utils.js"></script>
+<body>
+<div id="target"></div>
+<script>
+    try {
+      CSS.registerProperty({
+        name: '--prop',
+        syntax: '<color>',
+        initialValue: 'black',
+        inherits: false
+      });
+
+      target.style.setProperty('--prop', 'rgb(1, 2, 3)');
+
+      expectWorkletValue(target, '--prop', '[CSSStyleValue rgb(1, 2, 3)]');
+    } catch(e) {
+      document.body.textContent = e;
+      takeScreenshot();
+    }
+</script>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-paint-api/registered-property-value-006.https.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<title>Values of &lt;custom-ident&gt;-properties reach worklet</title>
+<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="match" href="parse-input-arguments-ref.html">
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/worklet-reftest.js"></script>
+<script src="./resources/utils.js"></script>
+<body>
+<div id="target"></div>
+<script>
+    try {
+      CSS.registerProperty({
+        name: '--prop',
+        syntax: '<custom-ident>',
+        initialValue: 'none',
+        inherits: false
+      });
+
+      target.style.setProperty('--prop', 'foo');
+
+      expectWorkletValue(target, '--prop', '[CSSKeywordValue foo]');
+    } catch(e) {
+      document.body.textContent = e;
+      takeScreenshot();
+    }
+</script>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-paint-api/registered-property-value-007.https.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<title>Values of &lt;image&gt;-properties reach worklet</title>
+<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="match" href="parse-input-arguments-ref.html">
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/worklet-reftest.js"></script>
+<script src="./resources/utils.js"></script>
+<body>
+<div id="target"></div>
+<script>
+    try {
+      CSS.registerProperty({
+        name: '--prop-1',
+        syntax: '<image> | none',
+        initialValue: 'none',
+        inherits: false
+      });
+
+      CSS.registerProperty({
+        name: '--prop-2',
+        syntax: '<image> | none',
+        initialValue: 'none',
+        inherits: false
+      });
+
+      target.style.setProperty('--prop-1', 'url("http://a/")');
+      target.style.setProperty('--prop-2', 'linear-gradient(red, red)');
+
+      expectWorkletValues(target, {
+        '--prop-1': ['[CSSImageValue url("http://a/")]'],
+        '--prop-2': ['[CSSStyleValue linear-gradient(red, red)]'],
+      });
+    } catch(e) {
+      document.body.textContent = e;
+      takeScreenshot();
+    }
+</script>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-paint-api/registered-property-value-008.https.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<title>Values of &lt;integer&gt;-properties reach worklet</title>
+<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="match" href="parse-input-arguments-ref.html">
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/worklet-reftest.js"></script>
+<script src="./resources/utils.js"></script>
+<body>
+<div id="target"></div>
+<script>
+    try {
+      CSS.registerProperty({
+        name: '--prop',
+        syntax: '<integer>',
+        initialValue: '0',
+        inherits: false
+      });
+
+      target.style.setProperty('--prop', '5');
+
+      expectWorkletValue(target, '--prop', '[CSSUnitValue 5]');
+    } catch(e) {
+      document.body.textContent = e;
+      takeScreenshot();
+    }
+</script>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-paint-api/registered-property-value-009.https.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<title>Values of &lt;length-percentage&gt;-properties reach worklet</title>
+<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="match" href="parse-input-arguments-ref.html">
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/worklet-reftest.js"></script>
+<script src="./resources/utils.js"></script>
+<body>
+<div id="target"></div>
+<script>
+    try {
+      CSS.registerProperty({
+        name: '--prop-1',
+        syntax: '<length-percentage>',
+        initialValue: '0',
+        inherits: false
+      });
+
+      CSS.registerProperty({
+        name: '--prop-2',
+        syntax: '<length-percentage>',
+        initialValue: '0',
+        inherits: false
+      });
+
+      CSS.registerProperty({
+        name: '--prop-3',
+        syntax: '<length-percentage>',
+        initialValue: '0',
+        inherits: false
+      });
+
+      target.style.setProperty('--prop-1', '10%');
+      target.style.setProperty('--prop-2', '10px');
+      target.style.setProperty('--prop-3', 'calc(10px + 10%)');
+
+      expectWorkletValues(target, {
+        '--prop-1': ['[CSSUnitValue 10%]'],
+        '--prop-2': ['[CSSUnitValue 10px]'],
+        '--prop-3': ['[CSSMathSum calc(10px + 10%)]'],
+      });
+    } catch(e) {
+      document.body.textContent = e;
+      takeScreenshot();
+    }
+</script>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-paint-api/registered-property-value-010.https.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<title>Values of &lt;length&gt;-properties reach worklet</title>
+<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="match" href="parse-input-arguments-ref.html">
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/worklet-reftest.js"></script>
+<script src="./resources/utils.js"></script>
+<body>
+<div id="target"></div>
+<script>
+    try {
+      CSS.registerProperty({
+        name: '--prop-1',
+        syntax: '<length>',
+        initialValue: '0',
+        inherits: false
+      });
+
+      CSS.registerProperty({
+        name: '--prop-2',
+        syntax: '<length>',
+        initialValue: '0',
+        inherits: false
+      });
+
+      target.style.setProperty('font-size', '20px');
+      target.style.setProperty('--prop-1', '100px');
+      target.style.setProperty('--prop-2', '10em');
+
+      expectWorkletValues(target, {
+        '--prop-1': ['[CSSUnitValue 100px]'],
+        '--prop-2': ['[CSSUnitValue 200px]']
+      });
+    } catch(e) {
+      document.body.textContent = e;
+      takeScreenshot();
+    }
+</script>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-paint-api/registered-property-value-011.https.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<title>Values of &lt;number&gt;-properties reach worklet</title>
+<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="match" href="parse-input-arguments-ref.html">
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/worklet-reftest.js"></script>
+<script src="./resources/utils.js"></script>
+<body>
+<div id="target"></div>
+<script>
+    try {
+      CSS.registerProperty({
+        name: '--prop',
+        syntax: '<number>',
+        initialValue: '0',
+        inherits: false
+      });
+
+      target.style.setProperty('--prop', '2.5');
+
+      expectWorkletValue(target, '--prop', '[CSSUnitValue 2.5]');
+    } catch(e) {
+      document.body.textContent = e;
+      takeScreenshot();
+    }
+</script>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-paint-api/registered-property-value-012.https.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<title>Values of &lt;percentage&gt;-properties reach worklet</title>
+<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="match" href="parse-input-arguments-ref.html">
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/worklet-reftest.js"></script>
+<script src="./resources/utils.js"></script>
+<body>
+<div id="target"></div>
+<script>
+    try {
+      CSS.registerProperty({
+        name: '--prop',
+        syntax: '<percentage>',
+        initialValue: '0%',
+        inherits: false
+      });
+
+      target.style.setProperty('--prop', '33%');
+
+      expectWorkletValue(target, '--prop', '[CSSUnitValue 33%]');
+    } catch(e) {
+      document.body.textContent = e;
+      takeScreenshot();
+    }
+</script>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-paint-api/registered-property-value-013.https.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<title>Values of &lt;resolution&gt;-properties reach worklet</title>
+<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="match" href="parse-input-arguments-ref.html">
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/worklet-reftest.js"></script>
+<script src="./resources/utils.js"></script>
+<body>
+<div id="target"></div>
+<script>
+    try {
+      CSS.registerProperty({
+        name: '--prop',
+        syntax: '<resolution>',
+        initialValue: '0dppx',
+        inherits: false
+      });
+
+      target.style.setProperty('--prop', '300dppx');
+
+      expectWorkletValue(target, '--prop', '[CSSUnitValue 300dppx]');
+    } catch(e) {
+      document.body.textContent = e;
+      takeScreenshot();
+    }
+</script>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-paint-api/registered-property-value-014.https.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<title>Values of &lt;time&gt;-properties reach worklet</title>
+<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="match" href="parse-input-arguments-ref.html">
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/worklet-reftest.js"></script>
+<script src="./resources/utils.js"></script>
+<body>
+<div id="target"></div>
+<script>
+    try {
+      CSS.registerProperty({
+        name: '--prop',
+        syntax: '<time>',
+        initialValue: '0s',
+        inherits: false
+      });
+
+      target.style.setProperty('--prop', '10s');
+
+      expectWorkletValue(target, '--prop', '[CSSUnitValue 10s]');
+    } catch(e) {
+      document.body.textContent = e;
+      takeScreenshot();
+    }
+</script>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-paint-api/registered-property-value-015.https.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<title>Values of &lt;url&gt;-properties reach worklet</title>
+<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="match" href="parse-input-arguments-ref.html">
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/worklet-reftest.js"></script>
+<script src="./resources/utils.js"></script>
+<body>
+<div id="target"></div>
+<script>
+    try {
+      CSS.registerProperty({
+        name: '--prop',
+        syntax: '<url> | none',
+        initialValue: 'none',
+        inherits: false
+      });
+
+      target.style.setProperty('--prop', 'url("http://a/")');
+
+      expectWorkletValue(target, '--prop', '[CSSStyleValue url("http://a/")]');
+    } catch(e) {
+      document.body.textContent = e;
+      takeScreenshot();
+    }
+</script>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-paint-api/registered-property-value-016.https.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<title>Values of ident-properties reach worklet</title>
+<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="match" href="parse-input-arguments-ref.html">
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/worklet-reftest.js"></script>
+<script src="./resources/utils.js"></script>
+<body>
+<div id="target"></div>
+<script>
+    try {
+      CSS.registerProperty({
+        name: '--prop',
+        syntax: 'foo | bar | none',
+        initialValue: 'none',
+        inherits: false
+      });
+
+      target.style.setProperty('--prop', 'bar');
+
+      expectWorkletValue(target, '--prop', '[CSSKeywordValue bar]');
+    } catch(e) {
+      document.body.textContent = e;
+      takeScreenshot();
+    }
+</script>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-paint-api/registered-property-value-017.https.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<title>Values of ident-properties reach worklet</title>
+<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="match" href="parse-input-arguments-ref.html">
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/worklet-reftest.js"></script>
+<script src="./resources/utils.js"></script>
+<body>
+<div id="target"></div>
+<script>
+    try {
+      CSS.registerProperty({
+        name: '--prop',
+        syntax: 'foo | bar | none',
+        initialValue: 'none',
+        inherits: false
+      });
+
+      target.style.setProperty('--prop', 'bar');
+
+      expectWorkletValue(target, '--prop', '[CSSKeywordValue bar]');
+    } catch(e) {
+      document.body.textContent = e;
+      takeScreenshot();
+    }
+</script>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-paint-api/registered-property-value-018.https.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<title>Values of lists reach worklet</title>
+<link rel="help" href="https://www.w3.org/TR/css-paint-api-1/#examples">
+<link rel="match" href="parse-input-arguments-ref.html">
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/worklet-reftest.js"></script>
+<script src="./resources/utils.js"></script>
+<body>
+<div id="target"></div>
+<script>
+    try {
+      CSS.registerProperty({
+        name: '--prop-1',
+        syntax: '<length>+ | none',
+        initialValue: 'none',
+        inherits: false
+      });
+
+      CSS.registerProperty({
+        name: '--prop-2',
+        syntax: '<length># | none',
+        initialValue: 'none',
+        inherits: false
+      });
+
+      CSS.registerProperty({
+        name: '--prop-3',
+        syntax: '<length># | none',
+        initialValue: 'none',
+        inherits: false
+      });
+
+      target.style.setProperty('--prop-1', '8px 16px');
+      target.style.setProperty('--prop-2', '8px, 16px');
+      target.style.setProperty('--prop-3', '8px');
+
+      expectWorkletValues(target, {
+        '--prop-1': ['[CSSUnitValue 8px]', '[CSSUnitValue 16px]'],
+        '--prop-2': ['[CSSUnitValue 8px]', '[CSSUnitValue 16px]'],
+        '--prop-3': ['[CSSUnitValue 8px]'],
+      });
+    } catch(e) {
+      document.body.textContent = e;
+      takeScreenshot();
+    }
+</script>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-paint-api/resources/utils.js
@@ -0,0 +1,59 @@
+
+// Register a property, and interpolate its value to the halfway point.
+function registerAndInterpolateProperty(options) {
+  CSS.registerProperty({
+    name: options.name,
+    syntax: `${options.syntax} | none`,
+    initialValue: 'none',
+    inherits: false
+  });
+  let animation = options.on.animate([
+    { [options.name]: options.from },
+    { [options.name]: options.to }
+  ], 1000);
+  animation.currentTime = 500;
+  animation.pause();
+}
+
+// Apply a paint worklet to 'target' which verifies that the worklet-side value
+// of a set of properties is what we expect.
+//
+// The 'expected' parameter is an object where each key is the name of a
+// property to check, and each corresponding value is an array with the expected
+// (serialized) values for that property.
+function expectWorkletValues(target, expected) {
+  const workletName = 'registered-property-value';
+
+  // Wrap any single values in an array. This makes it possible to omit the
+  // array if there is only one value.
+  const ensureArray = x => x.constructor === Array ? x : [x];
+  expected = Object.entries(expected).map(([k, v]) => [k, ensureArray(v)])
+                                     .map(x => ({[x[0]]: x[1]}))
+                                     .reduce((a, b) => Object.assign(a, b), {});
+
+  target.style.setProperty('width', '100px');
+  target.style.setProperty('height', '100px');
+  target.style.setProperty('background-image', `paint(${workletName})`);
+
+  const worklet = `
+    const expectedData = ${JSON.stringify(expected)};
+    const expectedKeys = Object.keys(expectedData).sort();
+    registerPaint('${workletName}', class {
+      static get inputProperties() { return expectedKeys; }
+      paint(ctx, geom, styleMap) {
+        let serialize = (v) => '[' + v.constructor.name + ' ' + v.toString() + ']';
+        let actual = expectedKeys.map(k => styleMap.getAll(k).map(serialize).join(', ')).join(' | ');
+        let expected = expectedKeys.map(k => expectedData[k].join(', ')).join(' | ');
+        ctx.strokeStyle = (actual === expected) ? 'green' : 'red';
+        ctx.lineWidth = 4;
+        ctx.strokeRect(0, 0, geom.width, geom.height);
+      }
+    });`
+
+  importWorkletAndTerminateTestAfterAsyncPaint(CSS.paintWorklet, worklet);
+}
+
+// Like expectWorkletValues, but can only test a single property.
+function expectWorkletValue(target, property, expected) {
+  expectWorkletValues(target, { [property]: expected });
+}
--- a/testing/web-platform/tests/css/css-properties-values-api/register-property-syntax-parsing.html
+++ b/testing/web-platform/tests/css/css-properties-values-api/register-property-syntax-parsing.html
@@ -41,25 +41,30 @@ assert_valid("*", '"');
 
 assert_valid("<length>", "0");
 assert_valid("<length>", "10px /*:)*/");
 assert_valid("<length>", " calc(-2px)");
 assert_valid("<length>", "calc(2px*4 + 10px)");
 assert_valid("<length>", "7.1e-4cm");
 assert_valid("<length>", "calc(7in - 12px)");
 assert_valid("<length>+", "2px 7px calc(8px)");
+assert_valid("<length>#", "2px, 7px, calc(8px)");
 assert_valid("<percentage>", "-9.3e3%");
 assert_valid("<length-percentage>", "-54%");
 assert_valid("<length-percentage>", "0");
 assert_valid("<length-percentage>", "calc(-11px + 10.4%)");
 
 assert_valid("<number>", "-109");
 assert_valid("<number>", "2.3e4");
 assert_valid("<integer>", "-109");
 assert_valid("<integer>", "19");
+assert_valid("<integer>", "calc(1)");
+assert_valid("<integer>", "calc(1 + 2)");
+assert_valid("<integer>", "calc(3.1415)");
+assert_valid("<integer>", "calc(3.1415 + 3.1415)");
 
 assert_valid("<angle>", "10deg");
 assert_valid("<angle>", "20.5rad");
 assert_valid("<angle>", "calc(50grad + 3.14159rad)");
 assert_valid("<time>", "2s");
 assert_valid("<time>", "calc(2s - 9ms)");
 assert_valid("<resolution>", "10dpi");
 assert_valid("<resolution>", "3dPpX");
@@ -142,16 +147,18 @@ assert_invalid("<length>", "10%");
 assert_invalid("<length>", "calc(5px + 10%)");
 assert_invalid("<length>", "calc(5px * 3px / 6px)");
 assert_invalid("<length>", "10em");
 assert_invalid("<length>", "10vmin");
 assert_invalid("<length>", "calc(4px + 3em)");
 assert_invalid("<length>", "calc(4px + calc(8 * 2em))");
 assert_invalid("<length>+", "calc(2ex + 16px)");
 assert_invalid("<length>+", "10px calc(20px + 4rem)");
+assert_invalid("<length>+", "");
+assert_invalid("<length>#", "");
 assert_invalid("<percentage> | <length>+", "calc(100vh - 10px) 30px");
 assert_invalid("<length>", "10px;");
 assert_invalid("<length-percentage>", "calc(2px + 10% + 7ex)");
 assert_invalid("<percentage>", "0");
 assert_invalid("<integer>", "1.0");
 assert_invalid("<integer>", "1e0");
 assert_invalid("<number>|foo", "foo var(--foo, bla)");
 
--- a/testing/web-platform/tests/css/css-properties-values-api/registered-property-computation.html
+++ b/testing/web-platform/tests/css/css-properties-values-api/registered-property-computation.html
@@ -106,10 +106,22 @@ for (let element of [divWithFontSizeSet,
     }, "<length-percentage>+ values are computed correctly for " + id);
 
     test(function() {
         assert_computed_value('<transform-function>', 'translateX(2px)', 'translateX(2px)');
         assert_computed_value('<transform-function>', 'translateX(10em)', 'translateX(100px)');
         assert_computed_value('<transform-function>', 'translateX(calc(11em + 10%))', 'translateX(calc(110px + 10%))');
         assert_computed_value('<transform-function>+', 'translateX(10%) scale(2)', 'translateX(10%) scale(2)');
     }, "<transform-function> values are computed correctly for " + id);
+
+    test(function() {
+        assert_computed_value('<integer>', '15', '15');
+        assert_computed_value('<integer>', 'calc(15 + 15)', '30');
+        assert_computed_value('<integer>', 'calc(2.4)', '2');
+        assert_computed_value('<integer>', 'calc(2.6)', '3');
+        assert_computed_value('<integer>', 'calc(2.6 + 3.1)', '6');
+    }, "<integer> values are computed correctly for " + id);
+
+    test(function() {
+        assert_computed_value('<integer>+', '15 calc(2.4) calc(2.6)', '15 2 3');
+    }, "<integer>+ values are computed correctly for " + id);
 }
 </script>
--- a/testing/web-platform/tests/css/css-properties-values-api/typedom.tentative.html
+++ b/testing/web-platform/tests/css/css-properties-values-api/typedom.tentative.html
@@ -377,18 +377,18 @@ test_style_property_map_set({
     initialValue: 'url(a)',
     shouldAccept: [url_image('url(b)'), 'url(b)'],
     shouldReject: [unparsed('url(b)'), CSS.px(100), '50px', [url_image('url(1)'), 'url(2)']],
 });
 
 test_style_property_map_set({
     syntax: '<integer>',
     initialValue: '0',
-    shouldAccept: [CSS.number(1), CSS.number(-42), '1', '-42'],
-    shouldReject: [unparsed('42'), CSS.px(100), '50px', [CSS.number(42), '42']],
+    shouldAccept: [CSS.number(1), CSS.number(-42), '1', '-42', 'calc(2.4)'],
+    shouldReject: [unparsed('42'), CSS.px(100), '50px', [CSS.number(42), '42'], 'calc(2px + 1px)'],
 });
 
 test_style_property_map_set({
     syntax: '<length-percentage>',
     initialValue: '0px',
     shouldAccept: [CSS.percent(10), CSS.px(1), CSS.em(1), '10px', '10%'],
     shouldReject: [unparsed('10%'), unparsed('10px'), CSS.dpi(1), 'url(b)', [CSS.percent(10), '10%']],
 });
@@ -477,18 +477,18 @@ test_style_property_map_set({
     initialValue: 'url(a)',
     shouldAccept: [url_image('url(1)'), [url_image('url(1)'), 'url(2)'], 'url(1) url(2)'],
     shouldReject: [[url_image('url(1)'), CSS.px(10)], 'url(1) 10px'],
 });
 
 test_style_property_map_set({
     syntax: '<integer>+',
     initialValue: '0',
-    shouldAccept: [CSS.number(42), [CSS.number(42), '42'], '42 42'],
-    shouldReject: [[CSS.number(42), keyword('noint')], '42 noint'],
+    shouldAccept: [CSS.number(42), [CSS.number(42), '42'], '42 42', 'calc(2.4) calc(2.6)'],
+    shouldReject: [[CSS.number(42), keyword('noint')], '42 noint', 'calc(2px + 2px)'],
 });
 
 test_style_property_map_set({
     syntax: '<length-percentage>+',
     initialValue: '0px',
     shouldAccept: [CSS.percent(10), [CSS.percent(10), '10%']],
     shouldReject: [[CSS.percent(10), keyword('nolength')], '10% nolength'],
 });
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-regions/inheritance.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>Inheritance of CSS Regions properties</title>
+<link rel="help" href="https://drafts.csswg.org/css-regions/#property-index">
+<meta name="assert" content="Properties inherit or not according to the spec.">
+<meta name="assert" content="Properties have initial values according to the spec.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/inheritance-testcommon.js"></script>
+</head>
+<body>
+<div id="container">
+  <div id="target"></div>
+</div>
+<script>
+assert_not_inherited('flow-from', 'none', 'foo');
+assert_not_inherited('flow-into', 'none', 'bar');
+assert_not_inherited('region-fragment', 'auto', 'break');
+</script>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-scroll-anchoring/inheritance.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>Inheritance of CSS Scroll Anchoring properties</title>
+<link rel="help" href="https://drafts.csswg.org/css-scroll-anchoring/#property-index">
+<meta name="assert" content="overflow-anchor does not inherit.">
+<meta name="assert" content="overflow-anchor has initial value 'none'.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/inheritance-testcommon.js"></script>
+</head>
+<body>
+<div id="container">
+  <div id="target"></div>
+</div>
+<script>
+assert_not_inherited('overflow-anchor', 'auto', 'none');
+</script>
+</body>
+</html>
--- a/testing/web-platform/tests/css/css-text/text-indent/reference/text-indent-percentage-002-ref.html
+++ b/testing/web-platform/tests/css/css-text/text-indent/reference/text-indent-percentage-002-ref.html
@@ -1,11 +1,14 @@
 <!DOCTYPE html>
 <html lang=en>
 <meta charset="utf-8">
 <title>CSS Text Test reference</title>
 <link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
 <style>
 body { background: white; }
-div { padding-left: 50px; }
+div {
+  padding-left: 50px;
+  font-family: Ahem;
+}
 </style>
 
 <div>X</div>
--- a/testing/web-platform/tests/css/css-text/text-indent/text-indent-percentage-002.html
+++ b/testing/web-platform/tests/css/css-text/text-indent/text-indent-percentage-002.html
@@ -8,16 +8,17 @@
 <link rel="match" href="reference/text-indent-percentage-002-ref.html">
 <meta name="assert" content="Percentages in text-indent refer to width of the element's content box">
 <style>
 body { background: white; }
 section, div {
   border-right: 10px solid white;
   margin-right: 10px;
   padding-right: 10px;
+  font-family: Ahem;
 }
 div {
   box-sizing: border-box;
   width: 120px;
 }
 .test div { text-indent: 50%; }
 </style>
 
--- a/testing/web-platform/tests/css/css-text/text-indent/text-indent-percentage-003.html
+++ b/testing/web-platform/tests/css/css-text/text-indent/text-indent-percentage-003.html
@@ -8,16 +8,17 @@
 <link rel="match" href="reference/text-indent-percentage-002-ref.html">
 <meta name="assert" content="Percentages in text-indent refer to width of the element's content box">
 <style>
 body { background: white; }
 section, div {
   border-right: 10px solid white;
   margin-right: 10px;
   padding-right: 10px;
+  font-family: Ahem;
 }
 div {
   box-sizing: border-box;
   width: 120px;
 }
 .test div { text-indent: 50%; overflow: hidden; } /* overflow:hidden should not make any difference, but it does in some browsers */
 </style>
 
--- a/testing/web-platform/tests/css/css-text/text-indent/text-indent-percentage-004.html
+++ b/testing/web-platform/tests/css/css-text/text-indent/text-indent-percentage-004.html
@@ -8,16 +8,17 @@
 <link rel="match" href="reference/text-indent-percentage-002-ref.html">
 <meta name="assert" content="Percentages in text-indent refer to width of the element's content box, when used in a calc expression">
 <style>
 body { background: white; }
 section, div {
   border-right: 10px solid white;
   margin-right: 10px;
   padding-right: 10px;
+  font-family: Ahem;
 }
 div {
   box-sizing: border-box;
   width: 120px;
 }
 .test div { text-indent: calc(25px + 25%); }
 </style>
 
deleted file mode 100644
--- a/testing/web-platform/tests/css/css-text/white-space/break-spaces-003.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>CSS Text level 3 Test: single preserved white space at the end of the line with white-space:break-spaces overflow-wrap:break-word</title>
-<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
-<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-phase-2">
-<link rel="help" href="https://drafts.csswg.org/css-text-3/#overflow-wrap-property">
-<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-property">
-<link rel="match" href="reference/pre-wrap-001-ref.html">
-<meta name="assert" content="a single preserved white space at the end of the line is wrapped when the white-space property is set to break-spaces and overflow-wrap is break-word.">
-<style>
-div {
-  font-size: 20px;
-  font-family: Ahem;
-  line-height: 1em;
-  white-space: break-spaces;
-  color: green;
-
-  background: linear-gradient(red, red) 1ch 0/2ch 2ch no-repeat;
-
-  width: 3ch;
-  overflow-wrap: break-word;
-  margin-left: -1ch;
-}
-</style>
-<body>
-  <p>Test passes if there is a <strong>filled green square</strong> and <strong>no red</strong>.</p>
-  <div> XX XX</div>
-</body>
deleted file mode 100644
--- a/testing/web-platform/tests/css/css-text/white-space/textarea-break-spaces-003.html
+++ /dev/null
@@ -1,39 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>CSS Text level 3 Test: single preserved white space at the end of the line with white-space:break-spaces overflow-wrap:break-word in a textarea</title>
-<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
-<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-phase-2">
-<link rel="help" href="https://drafts.csswg.org/css-text-3/#overflow-wrap-property">
-<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-property">
-<link rel="match" href="reference/textarea-pre-wrap-001-ref.html">
-<meta name="assert" content="a single preserved white space at the end of the line is wrapped when the white-space property is set to break-spaces and overflow-wrap is break-word in a textarea.">
-<style>
-textarea {
-  word-wrap: initial; /*deprecated alias*/
-  overflow-wrap: initial;
-  line-break: initial;
-  word-break: initial;
-  margin: 0;
-  padding: 0;
-  border: none;
-  outline: none;
-  resize: none;
-  overflow: hidden; /* I don't want scrollbars, and overflow:visible isn't typically supported on textarea */
-
-  font-size: 20px;
-  font-family: Ahem;
-  line-height: 1em;
-  white-space: break-spaces;
-  color: green;
-
-  background: linear-gradient(red, red) 1ch 0/2ch 2ch no-repeat;
-
-  width: 3ch;
-  overflow-wrap: break-word;
-  margin-left: -1ch;
-}
-</style>
-<body>
-  <p>Test passes if there is a <strong>filled green square</strong> and <strong>no red</strong>.</p>
-  <textarea> XX XX</textarea>
-</body>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/cssom-view/inheritance.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>Inheritance of CSSOM View properties</title>
+<link rel="help" href="https://drafts.csswg.org/cssom-view/#property-index">
+<meta name="assert" content="Properties inherit or not according to the spec.">
+<meta name="assert" content="Properties have initial values according to the spec.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/inheritance-testcommon.js"></script>
+</head>
+<body>
+<div id="container">
+  <div id="target"></div>
+</div>
+<script>
+assert_not_inherited('scroll-behavior', 'auto', 'smooth');
+</script>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/cssom-view/screenLeftTop.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/cssom-view/#dom-window-screenleft">
+<link rel="help" href="https://drafts.csswg.org/cssom-view/#dom-window-screentop">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+test(() => {
+  assert_equals(typeof window.screenLeft, "number", "screenLeft type");
+  assert_equals(window.screenLeft, window.screenX, "alias of screenX");
+}, "screenLeft");
+
+test(() => {
+  assert_equals(typeof window.screenTop, "number", "screenTop type");
+  assert_equals(window.screenTop, window.screenY, "alias of screenY");
+}, "screenTop");
+</script>
--- a/testing/web-platform/tests/css/motion/animation/resources/interpolation-testcommon.js
+++ b/testing/web-platform/tests/css/motion/animation/resources/interpolation-testcommon.js
@@ -16,17 +16,16 @@ function test_interpolation(settings, ex
   }, '"' + settings.from + '" and "' + settings.to + '" are valid ' + settings.property + ' values');
 
   for (var i = 0; i < expectations.length; ++i) {
     var progress = expectations[i].at;
     var expectation = expectations[i].expect;
     var animationId = 'anim' + i;
     var targetId = 'target' + i;
     var referenceId = 'reference' + i;
-
     test(function(){
       assert_true(CSS.supports(settings.property, expectation), 'Value "' + expectation + '" is supported by ' + settings.property);
 
       var stylesheet = document.createElement('style');
       stylesheet.textContent =
         '#' + targetId + ' {\n' +
         '  animation: 2s ' + timingFunction(progress) + ' -1s paused ' + animationId + ';\n' +
         '}\n' +
@@ -44,17 +43,19 @@ function test_interpolation(settings, ex
       document.body.appendChild(target);
 
       var reference = document.createElement('div');
       reference.id = referenceId;
       document.body.appendChild(reference);
       reference.style = '';
 
       assert_equals(getComputedStyle(target)[settings.property], getComputedStyle(reference)[settings.property]);
-    }, 'Animation between "' + settings.from + '" and "' + settings.to + '" at progress ' + progress);
+    }, (settings.test_prefix ? settings.test_prefix : "") +
+       'Animation between "' + settings.from + '" and "' + settings.to +
+       '" at progress ' + progress);
   }
 }
 
 function test_no_interpolation(settings) {
   var expectatFrom = [-1, 0, 0.125].map(function (progress) {
     return {at: progress, expect: settings.from};
   });
   var expectatTo = [0.875, 1, 2].map(function (progress) {
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/reference/blank.html
@@ -0,0 +1,3 @@
+<!doctype html>
+<title>CSS Test Reference</title>
+<!-- Intentionally blank -->
--- a/testing/web-platform/tests/css/support/inheritance-testcommon.js
+++ b/testing/web-platform/tests/css/support/inheritance-testcommon.js
@@ -5,16 +5,24 @@ function assert_initial(property, initia
     if (!getComputedStyle(target)[property])
       return;
     target.style[property] = 'initial';
     assert_equals(getComputedStyle(target)[property], initial);
     target.style[property] = '';
   }, 'Property ' + property + ' has initial value ' + initial);
 }
 
+/**
+ * Create tests that a CSS property inherits and has the given initial value.
+ *
+ * @param {string} property  The name of the CSS property being tested.
+ * @param {string} initial   The computed value for 'initial'.
+ * @param {string} other     An arbitrary value for the property that round
+ *                           trips and is distinct from the initial value.
+ */
 function assert_inherited(property, initial, other) {
   assert_initial(property, initial);
 
   test(() => {
     if (!getComputedStyle(target)[property])
       return;
     container.style[property] = 'initial';
     target.style[property] = 'unset';
@@ -28,16 +36,25 @@ function assert_inherited(property, init
     assert_not_equals(getComputedStyle(target)[property], other);
     target.style[property] = 'inherit';
     assert_equals(getComputedStyle(target)[property], other);
     container.style[property] = '';
     target.style[property] = '';
   }, 'Property ' + property + ' inherits');
 }
 
+/**
+ * Create tests that a CSS property does not inherit, and that it has the
+ * given initial value.
+ *
+ * @param {string} property  The name of the CSS property being tested.
+ * @param {string} initial   The computed value for 'initial'.
+ * @param {string} other     An arbitrary value for the property that round
+ *                           trips and is distinct from the initial value.
+ */
 function assert_not_inherited(property, initial, other) {
   assert_initial(property, initial);
 
   test(() => {
     if (!getComputedStyle(target)[property])
       return;
     container.style[property] = 'initial';
     target.style[property] = 'unset';
--- a/testing/web-platform/tests/docs/_running-tests/index.md
+++ b/testing/web-platform/tests/docs/_running-tests/index.md
@@ -15,20 +15,20 @@ chosen browser, and extract the test res
 `dom/historical.html` tests in a local copy of Chrome:
 
     ./wpt run chrome dom/historical.html
 
 Or to run in a specified copy of Firefox:
 
     ./wpt run --binary ~/local/firefox/firefox firefox dom/historical.html
 
-`./wpt run --help` lists the supported products.
+For details on the supported products and a large number of other options for
+customising the test run:
 
-For details on the supported products and a large number of other options for
-customising the test run, see `./wpt run --help`.
+    ./wpt run --help
 
 Additional browser-specific documentation:
 
   * [Chrome][chrome]
 
   * [Chrome for Android][chrome android]
 
   * [Safari][safari]
--- a/testing/web-platform/tests/docs/_running-tests/safari.md
+++ b/testing/web-platform/tests/docs/_running-tests/safari.md
@@ -7,17 +7,17 @@ To run Safari on macOS, some manual setu
   * Allow Safari to be controlled by SafariDriver: `safaridriver --enable`
 
   * Allow pop-up windows:
     `defaults write com.apple.Safari WebKitJavaScriptCanOpenWindowsAutomatically 1`
 
   * Trust the certificate:
     `security add-trusted-cert -k "$(security default-keychain | cut -d\" -f2)" tools/certs/cacert.pem`
 
-  * Set `OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES` in your environment. This is a
+  * Set `no_proxy='*'` in your environment. This is a
     workaround for a known
     [macOS High Sierra issue](https://github.com/web-platform-tests/wpt/issues/9007).
 
 Now, run the tests using the `safari` product:
 ```
 ./wpt run safari [test_list]
 ```
 
--- a/testing/web-platform/tests/docs/_writing-tests/file-names.md
+++ b/testing/web-platform/tests/docs/_writing-tests/file-names.md
@@ -49,18 +49,25 @@ themselves precede any test type flag, b
 `.worker`
  : (js files only) Indicates that the file generates a test in which
     it is run in a dedicated worker environment.
 
 `.any`
  : (js files only) Indicates that the file generates tests in which it
     is [run in multiple scopes][multi-global-tests].
 
+`.optional`
+ : Indicates that a test makes assertions about optional behavior in a
+   specification, typically marked by the [RFC 2119] "MAY" or "OPTIONAL"
+   keywords. This flag should not be used for "SHOULD"; such requirements
+   can be tested with regular tests, like "MUST".
+
 `.tentative`
  : Indicates that a test makes assertions not yet required by any specification,
    or in contradiction to some specification. This is useful when implementation
    experience is needed to inform the specification. It should be apparent in
    context why the test is tentative and what needs to be resolved to make it
    non-tentative.
 
 
 [server-side substitution]: https://wptserve.readthedocs.io/en/latest/pipes.html#sub
 [multi-global-tests]: {{ site.baseurl }}{% link _writing-tests/testharness.md %}#multi-global-tests
+[RFC 2119]: https://tools.ietf.org/html/rfc2119
--- a/testing/web-platform/tests/docs/_writing-tests/testdriver.md
+++ b/testing/web-platform/tests/docs/_writing-tests/testdriver.md
@@ -13,16 +13,25 @@ tests.
 ## API
 
 testdriver.js exposes its API through the `test_driver` variable in
 the global scope.
 
 NB: presently, testdriver.js only works in the top-level test browsing
 context (and not therefore in any frame or window opened from it).
 
+### action_sequence
+Usage: `test_driver.action_sequence(actions)`
+ * `actions`: <[Array]<[Object]>> an array of Action objects`
+ * `action`: <[Object]> A single action. See [spec](https://www.w3.org/TR/webdriver/#actions) for format
+
+This function causes a sequence of actions to be sent to the browser. It is based of the [WebDriver API](https://www.w3.org/TR/webdriver/#actions).
+The action can be a keyboard action, a pointer action or a pause. It returns a `Promise` that
+resolves after the actions have been sent or rejects if an error was thrown.
+
 ### bless
 
 Usage: `test_driver.bless(intent, action)`
  * `intent`: a string describing the motivation for this invocation
  * `action`: an optional function
 
 This function simulates [activation][activation], allowing tests to
 perform privileged operations that require user interaction. For
@@ -75,18 +84,10 @@ to the element.
 
 Note that if the element that's keys need to be send to does not have
 a unique ID, the document must not have any DOM mutations made
 between the function being called and the promise settling.
 
 To send special keys, one must send the respective key's codepoint. Since this uses the WebDriver protocol, you can find a [list for code points to special keys in the spec](https://w3c.github.io/webdriver/webdriver-spec.html#keyboard-actions).
 For example, to send the tab key you would send "\uE004".
 
-### `test_driver.action_sequence(actions)`
- - `actions` <[Array]<[Object]>> an array of Action objects`
-  - `action` <[Object]> A single action. See [spec](https://www.w3.org/TR/webdriver/#actions) for format
-
-This function causes a sequence of actions to be sent to the browser. It is based of the [WebDriver API](https://www.w3.org/TR/webdriver/#actions).
-The action can be a keyboard action, a pointer action or a pause. It returns a `Promise` that
-resolves after the actions have been sent or rejects if an error was thrown.
-
 [activation]: https://html.spec.whatwg.org/multipage/interaction.html#activation
 [testharness]: {{ site.baseurl }}{% link _writing-tests/testharness.md %}
--- a/testing/web-platform/tests/editing/data/insert-list-items-in-table-cells.js
+++ b/testing/web-platform/tests/editing/data/insert-list-items-in-table-cells.js
@@ -1,23 +1,23 @@
 // For documentation of the format, see README in this directory.
 var browserTests = [
 ['<div contenteditable="true"><table><tr><td>[fsdf]</td><td>fsdf</td></tr><tr><td>gghfg</td><td>fsfg</td></tr></table></div>',
     [["insertOrderedList",""]],
-    '<div contenteditable="true"><table><tbody><tr><td><ol><li>fsdf<br></li></ol></td><td>fsdf</td></tr><tr><td>gghfg</td><td>fsfg</td></tr></tbody></table></div>',
+    '<div contenteditable="true"><table><tbody><tr><td><ol><li>fsdf</li></ol></td><td>fsdf</td></tr><tr><td>gghfg</td><td>fsfg</td></tr></tbody></table></div>',
     [true],
     {"insertOrderedList":[false,false,"false",false,true,"true"]}],
 ['<div contenteditable="true"><table><tr data-start=0 data-end=2><td>fsdf</td><td>fsdf</td></tr><tr><td>gghfg</td><td>fsfg</td></tr></table></div>',
     [["insertOrderedList",""]],
-    '<div contenteditable="true"><table><tbody><tr><td><ol><li>fsdf<br></li></ol></td><td><ol><li>fsdf<br></li></ol></td></tr><tr><td>gghfg</td><td>fsfg</td></tr></tbody></table></div>',
+    '<div contenteditable="true"><table><tbody><tr><td><ol><li>fsdf</li></ol></td><td><ol><li>fsdf</li></ol></td></tr><tr><td>gghfg</td><td>fsfg</td></tr></tbody></table></div>',
     [true],
     {"insertOrderedList":[false,false,"false",false,false,"false"]}],
 ['<div contenteditable="true"><table><tr data-start=0><td>fsdf</td><td>fsdf</td></tr><tr data-end=2><td>gghfg</td><td>fsfg</td></tr></table></div>',
     [["insertOrderedList",""]],
-    '<div contenteditable="true"><table><tbody><tr><td><ol><li>fsdf<br></li></ol></td><td><ol><li>fsdf<br></li></ol></td></tr><tr><td><ol><li>gghfg<br></li></ol></td><td><ol><li>fsfg<br></li></ol></td></tr></tbody></table></div>',
+    '<div contenteditable="true"><table><tbody><tr><td><ol><li>fsdf</li></ol></td><td><ol><li>fsdf</li></ol></td></tr><tr><td><ol><li>gghfg</li></ol></td><td><ol><li>fsfg</li></ol></td></tr></tbody></table></div>',
     [true],
     {"insertOrderedList":[false,false,"false",false,false,"false"]}],
 ['<div contenteditable="true"><table data-start=0 data-end=1><tr><td>fsdf</td><td>fsdf</td></tr><tr><td>gghfg</td><td>fsfg</td></tr></table></div>',
     [["insertOrderedList",""]],
     '<div contenteditable="true"><ol><li><table><tbody><tr><td>fsdf</td><td>fsdf</td></tr><tr><td>gghfg</td><td>fsfg</td></tr></tbody></table></li></ol></div>',
     [true],
     {"insertOrderedList":[false,false,"false",false,true,"true"]}],
 ['<div contenteditable="true"><table><tr><td>[fsdf]</td><td>fsdf</td></tr><tr><td>gghfg</td><td>fsfg</td></tr></table></div>',
--- a/testing/web-platform/tests/editing/data/insertorderedlist.js
+++ b/testing/web-platform/tests/editing/data/insertorderedlist.js
@@ -669,10 +669,25 @@ var browserTests = [
     [["defaultparagraphseparator","div"],["insertorderedlist",""]],
     "<ol><li>foo</li> <li>[bar]</li> <li>baz</li></ol>",
     [true,true],
     {"defaultparagraphseparator":[false,false,"p",false,false,"div"],"insertorderedlist":[false,false,"",false,true,""]}],
 ["<ol><li>foo</ol> <p>[bar]</p> <ol><li>baz</ol>",
     [["defaultparagraphseparator","p"],["insertorderedlist",""]],
     "<ol><li>foo</li> <li>[bar]</li> <li>baz</li></ol>",
     [true,true],
-    {"defaultparagraphseparator":[false,false,"div",false,false,"p"],"insertorderedlist":[false,false,"",false,true,""]}]
+    {"defaultparagraphseparator":[false,false,"div",false,false,"p"],"insertorderedlist":[false,false,"",false,true,""]}],
+["<div><span style='font-family: times; color: blue'>[bar]</span></div>",
+    [["insertorderedlist",""]],
+    "<ol><li><span style=\"font-family:times; color:rgb(0, 0, 255)\">[bar]</span></li></ol>",
+    [true],
+    {"insertorderedlist":[false,false,"false",false,true,"true"]}],
+["<div><span style='font-family: times; color: blue'>bar</span></div><span style='font-family: italic; color: green'>[baz]</span>",
+    [["insertorderedlist",""]],
+    "<div><span style=\"font-family:times; color:rgb(0, 0, 255)\">bar</span></div><ol><li><span style=\"font-family:italic; color:rgb(0, 128, 0)\">[baz]</span></li></ol>",
+    [true],
+    {"insertorderedlist":[false,false,"false",false,true,"true"]}],
+["<div><ol style='font-family: times; color: blue'><li>bar</li></ol><span style='font-family: italic; color: green'>[baz]</span></div>",
+    [["insertorderedlist",""]],
+    "<ol style=\"font-family:times; color:rgb(0, 0, 255)\"><li>bar</li><li><span style=\"font-family:italic; color:rgb(0, 128, 0)\">[baz]</span></li></ol>",
+    [true],
+    {"insertorderedlist":[false,false,"false",false,true,"true"]}],
 ]
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/feature-policy/experimental-features/layout-animations-disabled-tentative.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/motion/animation/resources/interpolation-testcommon.js"></script>
+<title> 'layout-animations' Policy : Correct behavior for affected and unaffected properties when
+         feature is disabled.
+</title>
+<body>
+<script>
+  // Sanity-check: Properties which are not affected by the policy 'layout-animations' should be
+  // interpolated normally (linearly) when the policy is disabled for the document.
+  test_interpolation(
+    {
+      property: "color",
+      from: "rgba(0, 50, 100, 1)",
+      to: "rgba(200, 150, 200, 1)",
+      test_prefix: 'Testing property "color".'
+    },
+    [
+      {at: 0.00, expect: "rgba(0,   50,  100, 1)"},
+      {at: 0.1,  expect: "rgba(20,  60,  110, 1)"},
+      {at: 0.2,  expect: "rgba(40,  70,  120, 1)"},
+      {at: 0.4,  expect: "rgba(80,  90,  140, 1)"},
+      {at: 0.6,  expect: "rgba(120, 110, 160, 1)"},
+      {at: 0.8,  expect: "rgba(160, 130, 180, 1)"},
+      {at: 0.9,  expect: "rgba(180, 140, 190, 1)"},
+    ]);
+
+  // There is no interpolation for the affected properties when the policy is disabled.
+  ["bottom", "height", "left", "right", "top", "width"].forEach(
+    (p) => test_no_interpolation(
+      {
+        property: p,
+        from: "100px",
+        to: "200px",
+        test_prefix: `Testing property "${p}".`
+      }));
+</script>
+</body>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/feature-policy/experimental-features/layout-animations-disabled-tentative.html.headers
@@ -0,0 +1,1 @@
+Feature-Policy: layout-animations 'none'
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/feature-policy/experimental-features/layout-animations-enabled-tentative.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/motion/animation/resources/interpolation-testcommon.js"></script>
+<title> 'layout-animations' Policy : Correct behavior for affected and unaffected properties when
+         feature is enabled.
+</title>
+<body>
+<script>
+  // The expectation for all the following properties could be the same (they are all of type length).
+  let length_expectations_100_to_200 = [
+      {at: 0.00, expect: "100px"},
+      {at: 0.1,  expect: "110px"},
+      {at: 0.2,  expect: "120px"},
+      {at: 0.4,  expect: "140px"},
+      {at: 0.6,  expect: "160px"},
+      {at: 0.8,  expect: "180px"},
+      {at: 0.9,  expect: "190px"},
+  ];
+  // Ensure all the affected animations run normally.
+  ["bottom", "height", "left", "right", "top", "width"].forEach(
+    (p) => test_interpolation({
+                                property: p,
+                                from: "100px",
+                                to: "200px",
+                                test_prefix: `Testing property "${p}".`
+                              },
+                              length_expectations_100_to_200));
+</script>
+</body>
--- a/testing/web-platform/tests/fetch/api/headers/header-values-normalize.html
+++ b/testing/web-platform/tests/fetch/api/headers/header-values-normalize.html
@@ -5,17 +5,17 @@
 <script src=/resources/testharness.js></script>
 <script src=/resources/testharnessreport.js></script>
 <div id=log></div>
 <script>
 for(let i = 0; i < 0x21; i++) {
   let fail = false,
       strip = false
 
-  // REMOVE 0x0B/0x0C exception once https://github.com/w3c/wptserve/issues/111 is fixed
+  // REMOVE 0x0B/0x0C exception once https://github.com/web-platform-tests/wpt/issues/8372 is fixed
   if(i === 0x0B || i === 0x0C)
     continue
 
   if(i === 0) {
     fail = true
   }
 
   if(i === 0x09 || i === 0x0A || i === 0x0D || i === 0x20) {
--- a/testing/web-platform/tests/fetch/api/resources/inspect-headers.py
+++ b/testing/web-platform/tests/fetch/api/resources/inspect-headers.py
@@ -1,11 +1,10 @@
 def main(request, response):
     headers = []
-    request_headers = []
     if "headers" in request.GET:
         checked_headers = request.GET.first("headers").split("|")
         for header in checked_headers:
             if header in request.headers:
                 headers.append(("x-request-" + header, request.headers.get(header, "")))
 
     if "cors" in request.GET:
         if "Origin" in request.headers:
--- a/testing/web-platform/tests/fetch/data-urls/resources/data-urls.json
+++ b/testing/web-platform/tests/fetch/data-urls/resources/data-urls.json
@@ -111,17 +111,17 @@
    [88, 32, 88]],
   ["data:text/plain,X X",
    "text/plain",
    [88, 32, 88]],
   ["data:unknown/unknown,X X",
    "unknown/unknown",
    [88, 32, 88]],
   ["data:text/plain;a=\",\",X",
-   "text/plain",
+   "text/plain;a=\"\"",
    [34, 44, 88]],
   ["data:text/plain;a=%2C,X",
    "text/plain;a=%2C",
    [88]],
   ["data:;base64;base64,WA",
    "text/plain",
    [88]],
   ["data:x/x;base64;base64,WA",
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/fetch/redirect-navigate/302-found-post-handler.py
@@ -0,0 +1,13 @@
+def main(request, response):
+    if request.method == "POST":
+        response.add_required_headers = False
+        response.writer.write_status(302)
+        response.writer.write_header("Location", request.url)
+        response.writer.end_headers()
+        response.writer.write("")
+    elif request.method == "GET":
+        return ([("Content-Type", "text/plain")],
+                "OK")
+    else:
+        return ([("Content-Type", "text/plain")],
+                "FAIL")
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/fetch/redirect-navigate/302-found-post.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<!-- Step 1: send POST request to a URL which will then 302 Found redirect -->
+<title>HTTP 302 Found POST Navigation Test</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+async_test(function(t) {
+  window.addEventListener("load", function() {
+    var frame = document.getElementById("frame");
+    var link = new URL("302-found-post-handler.py", window.location.href);
+    frame.contentWindow.document.body.innerHTML = '<form action="' + link.href + '" method="POST" id="form"><input name="n"></form>';
+    frame.contentWindow.document.getElementById("form").submit();
+    frame.addEventListener("load", t.step_func_done(function() {
+      assert_equals(frame.contentWindow.document.body.textContent, "OK");
+    }));
+  });
+}, "HTTP 302 Found POST Navigation");
+</script>
+<body>
+<iframe id="frame" src="about:blank"></iframe>
--- a/testing/web-platform/tests/fetch/sec-metadata/fetch.tentative.https.sub.html
+++ b/testing/web-platform/tests/fetch/sec-metadata/fetch.tentative.https.sub.html
@@ -4,38 +4,38 @@
 <script src=/fetch/sec-metadata/resources/helper.js></script>
 <script>
   promise_test(t => {
     return fetch("https://{{host}}:{{ports[https][0]}}/fetch/sec-metadata/resources/echo-as-json.py")
         .then(r => r.json())
         .then(j => {
           assert_header_equals(j.header, {
             "cause": undefined,
-            "destination": "",
+            "destination": "empty",
             "site": "same-origin"
           });
         });
   }, "Same-origin fetch");
 
   promise_test(t => {
     return fetch("https://{{hosts[][www]}}:{{ports[https][0]}}/fetch/sec-metadata/resources/echo-as-json.py")
         .then(r => r.json())
         .then(j => {
           assert_header_equals(j.header, {
             "cause": undefined,
-            "destination": "",
+            "destination": "empty",
             "site": "same-site"
           });
         });
   }, "Same-site fetch");
 
   promise_test(t => {
     return fetch("https://{{hosts[alt][www]}}:{{ports[https][0]}}/fetch/sec-metadata/resources/echo-as-json.py")
         .then(r => r.json())
         .then(j => {
           assert_header_equals(j.header, {
             "cause": undefined,
-            "destination": "",
+            "destination": "empty",
             "site": "cross-site"
           });
         });
   }, "Cross-site fetch");
 </script>
--- a/testing/web-platform/tests/fetch/sec-metadata/report.tentative.https.sub.html
+++ b/testing/web-platform/tests/fetch/sec-metadata/report.tentative.https.sub.html
@@ -1,35 +1,31 @@
 <!DOCTYPE html>
 <link rel="author" href="mtrzos@google.com" title="Maciek Trzos">
 <script src=/resources/testharness.js></script>
 <script src=/resources/testharnessreport.js></script>
 <script src=/fetch/sec-metadata/resources/helper.js></script>
 <link id="style" href="https://foo.bar" rel="stylesheet">
 <body></body>
 <script>
-  let counter = 0;
-  document.addEventListener("securitypolicyviolation", (e) => {
-    counter++;
-    if (counter == 3) {
-      promise_test(t => {
-        expected = {"destination":"report", "site":"same-origin"};
-        return fetch("/fetch/sec-metadata/resources/record-header.py?retrieve=true&file=report-same-origin")
+  function generate_test(expected, name) {
+    async_test(t => {
+      t.step_timeout(_ => {
+        return fetch("/fetch/sec-metadata/resources/record-header.py?retrieve=true&file=report-" + name)
             .then(response => response.text())
-            .then(text => assert_header_equals(text, expected));
-      }, "Same-Origin report");
+            .then(text => assert_header_equals(text, expected))
+            .then(_ => t.done());
+      }, 1000);
+    }, name + " report");
+  }
 
-      promise_test(t => {
-        expected = {"destination":"report", "site":"same-site"};
-        return fetch("/fetch/sec-metadata/resources/record-header.py?retrieve=true&file=report-same-site")
-            .then(response => response.text())
-            .then(text => assert_header_equals(text, expected));
-      }, "Same-site report");
-
-      promise_test(t => {
-        expected = {"destination":"report", "site":"cross-site"};
-        return fetch("/fetch/sec-metadata/resources/record-header.py?retrieve=true&file=report-cross-site")
-            .then(response => response.text())
-            .then(text => assert_header_equals(text, expected));
-      }, "Cross-site report");
-    }
-  });
+  test(_ => {
+    let counter = 0;
+    document.addEventListener("securitypolicyviolation", (e) => {
+      counter++;
+      if (counter == 3) {
+        generate_test({"destination":"report", "site":"same-origin"}, "same-origin");
+        generate_test({"destination":"report", "site":"same-site"}, "same-site");
+        generate_test({"destination":"report", "site":"cross-site"}, "cross-site");
+      }
+    });
+  }, "Initialization.");
 </script>
--- a/testing/web-platform/tests/fetch/sec-metadata/resources/helper.js
+++ b/testing/web-platform/tests/fetch/sec-metadata/resources/helper.js
@@ -1,13 +1,12 @@
 function parse_metadata(value) {
   let result = {};
   value.split(',').forEach(item => {
     let parsed = item.trim().split('=');
-    parsed[1] = parsed[1].trim().replace(/^"|"$/g, '');
     result[parsed[0]] = parsed[1];
   });
   return result;
 }
 
 function assert_header_equals(value, expected) {
   // check that the returned value is an object, not a String
   assert_not_equals(value, "", "Empty Sec-Metadata header.");
--- a/testing/web-platform/tests/html/dom/elements/the-innertext-idl-attribute/getter-tests.js
+++ b/testing/web-platform/tests/html/dom/elements/the-innertext-idl-attribute/getter-tests.js
@@ -53,16 +53,25 @@ testText("<div style='white-space:pre-li
 testText("<div><span>abc </span> def", "abc def", "Whitespace collapses across element boundaries");
 testText("<div><span>abc </span><span></span> def", "abc def", "Whitespace collapses across element boundaries");
 testText("<div><span>abc </span><span style='white-space:pre'></span> def", "abc def", "Whitespace collapses across element boundaries");
 testText("<div>abc <input> def", "abc  def", "Whitespace around <input> should not be collapsed");
 testText("<div>abc <span style='display:inline-block'></span> def", "abc  def", "Whitespace around inline-block should not be collapsed");
 testText("<div>abc <span style='display:inline-block'> def </span> ghi", "abc def ghi", "Trailing space at end of inline-block should be collapsed");
 testText("<div><input> <div>abc</div>", "abc", "Whitespace between <input> and block should be collapsed");
 testText("<div><span style='inline-block'></span> <div>abc</div>", "abc", "Whitespace between inline-block and block should be collapsed");
+testText("<div>abc <img> def", "abc  def", "Whitespace around <img> should not be collapsed");
+testText("<div>abc <img width=1 height=1> def", "abc  def", "Whitespace around <img> should not be collapsed");
+testText("<div><img> abc", " abc", "Leading whitesapce should not be collapsed");
+testText("<div>abc <img>", "abc ", "Trailing whitesapce should not be collapsed");
+testText("<div>abc <b></b> def", "abc def", "Whitespace around empty span should be collapsed");
+testText("<div>abc <b><i></i></b> def", "abc def", "Whitespace around empty spans should be collapsed");
+testText("<div><canvas></canvas> abc", " abc", "<canvas> should not collapse following space");
+testText("<div>abc <img style='display:block'> def", "abc\ndef", "Replaced element <img> with display:block should be treated as block-level");
+testText("<div>abc <canvas style='display:block'></canvas> def", "abc\ndef", "Replaced element <canvas> with display:block should be treated as block-level");
 
 /**** Soft line breaks ****/
 
 testText("<div style='width:0'>abc def", "abc def", "Soft line breaks ignored");
 testText("<div style='width:0'><span>abc</span> <span>def</span>", "abc def", "Whitespace text node preserved");
 
 /**** first-line/first-letter ****/
 
--- a/testing/web-platform/tests/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/parsing.html
+++ b/testing/web-platform/tests/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/parsing.html
@@ -100,17 +100,17 @@ var tests_arr = [
   {input: '1e0; url=foo', expected: []},
   {input: '1e1; url=foo', expected: []},
   {input: '10e-1; url=foo', expected: []},
   {input: '-0.1; url=foo', expected: []},
 ];
 
 tests_arr.forEach(function(test_obj) {
   ["<meta>", "Refresh header"].forEach(type => {
-    if(type === "Refresh header" && test_obj.input.match("[\n\r\f]")) { // See https://github.com/w3c/wptserve/issues/111 for why \f as well
+    if(type === "Refresh header" && test_obj.input.match("[\n\r\f]")) { // See https://github.com/web-platform-tests/wpt/issues/8372 for why \f as well
       return;
     }
     const filename = type === "<meta>" ? "refresh.sub.html" : "refresh.py";
     subsetTest(async_test, function(t) {
       var iframe = document.createElement('iframe');
       t.add_cleanup(function() {
         document.body.removeChild(iframe);
       });
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/html/semantics/embedded-content/the-object-element/object-fallback-failed-cross-origin-navigation.sub.html
@@ -0,0 +1,52 @@
+n<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Test that &lt;object&gt; renders its own fallback.</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<body>
+<script>
+  // The host exists but the resource is unavailable.
+  const cross_origin_url_a = "http://{{hosts[alt][www]}}:{{ports[http][0]}}/foo.html";
+  // The destination does not even exist and the navigation fails.
+  const cross_origin_url_b = "http://{{hosts[alt][nonexistent]}}:{{ports[http][0]}}/foo.html";
+
+  // Returns a promise which is resolved when |callback| returns true. The |callback| is invoked at
+  // every animation frame.
+  function for_each_animation_frame(callback) {
+    return new Promise((resolve) => {
+      function on_raf() {
+        if (!callback())
+          resolve();
+        window.requestAnimationFrame(on_raf);
+      }
+      window.requestAnimationFrame(on_raf);
+    });
+  }
+
+  // Create an <object> with some fallback content.
+  function create_object_with_fallback(url) {
+    var object = document.createElement("object");
+    var fallback = document.createElement("button");
+    fallback.textContent = "FALLBACK CONTENT";
+    object.appendChild(fallback);
+    object.data = url;
+    object.type = "text/html";
+    document.body.appendChild(object);
+    return object;
+  }
+
+  function area(el) {
+    let bounds = el.getBoundingClientRect();
+    return el.width * el.height;
+  }
+
+  promise_test(async() => {
+    var object = create_object_with_fallback(cross_origin_url_a);
+    await for_each_animation_frame(() => area(object.firstChild) > 0);
+    object.parentElement.removeChild(object);
+    object = create_object_with_fallback(cross_origin_url_b);
+    await for_each_animation_frame(() => area(object.firstChild) > 0);
+    object.parentElement.removeChild(object);
+  }, "Verify fallback content for failed cross-origin navigations is shown correctly.");
+</script>
+</body>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/infrastructure/assumptions/allowed-to-play.html
@@ -0,0 +1,23 @@
+<!doctype html>
+<title>&lt;audio and &lt;video> autoplay</title>
+<link rel="help" href="https://html.spec.whatwg.org/multipage/media.html#dom-media-play">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/media.js"></script>
+<video></video>
+<script>
+async_test(t => {
+  const a = new Audio(getAudioURI("/media/sound_5"));
+  a.play();
+  assert_false(a.paused);
+  a.onplaying = t.step_func_done();
+}, "<audio> autoplay");
+
+async_test(t => {
+  const v = document.querySelector("video");
+  v.src = getVideoURI("/media/movie_5");
+  v.play();
+  assert_false(v.paused);
+  v.onplaying = t.step_func_done();
+}, "<video> autoplay");
+</script>
--- a/testing/web-platform/tests/input-events/input-events-exec-command.html
+++ b/testing/web-platform/tests/input-events/input-events-exec-command.html
@@ -30,19 +30,19 @@ test(function() {
     }
 
     txt.focus();
     // InsertText
     testExecCommandInputType('insertText', 'a', 'insertText');
     testExecCommandInputType('insertText', 'bc', 'insertText');
     assert_equals(txt.innerHTML, 'abc');
     testExecCommandInputType('insertOrderedList', null, 'insertOrderedList');
-    assert_equals(txt.innerHTML, '<ol><li>abc<br></li></ol>');
+    assert_equals(txt.innerHTML, '<ol><li>abc</li></ol>');
     testExecCommandInputType('insertUnorderedList', null, 'insertUnorderedList');
-    assert_equals(txt.innerHTML, '<ul><li>abc<br></li></ul>');
+    assert_equals(txt.innerHTML, '<ul><li>abc</li></ul>');
     testExecCommandInputType('insertLineBreak', null, 'insertLineBreak');
     testExecCommandInputType('insertParagraph', null, 'insertParagraph');
 
     // Styling
     txt.innerHTML = 'abc';
     var selection = window.getSelection();
     selection.collapse(txt, 0);
     selection.extend(txt, 1);
--- a/testing/web-platform/tests/interfaces/csp-embedded-enforcement.idl
+++ b/testing/web-platform/tests/interfaces/csp-embedded-enforcement.idl
@@ -1,8 +1,8 @@
 // GENERATED CONTENT - DO NOT EDIT
 // Content was automatically extracted by Reffy into reffy-reports
 // (https://github.com/tidoust/reffy-reports)
-// Source: Content Security Policy: Embedded Enforcement (https://w3c.github.io/webappsec-csp/embedded/)
+// Source: Content Security Policy: Embedded Enforcement (https://w3c.github.io/webappsec-cspee/)
 
 partial interface HTMLIFrameElement {
   [CEReactions] attribute DOMString csp;
 };
--- a/testing/web-platform/tests/interfaces/netinfo.idl
+++ b/testing/web-platform/tests/interfaces/netinfo.idl
@@ -18,22 +18,22 @@ enum ConnectionType {
 enum EffectiveConnectionType {
   "2g",
   "3g",
   "4g",
   "slow-2g"
 };
 
 [NoInterfaceObject, Exposed=(Window,Worker)]
-interface NavigatorNetworkInformation {
-  readonly attribute NetworkInformation connection;
-};
+  interface NavigatorNetworkInformation {
+    readonly attribute NetworkInformation connection;
+  };
 
-Navigator implements NavigatorNetworkInformation;
-WorkerNavigator implements NavigatorNetworkInformation;
+  Navigator implements NavigatorNetworkInformation;
+  WorkerNavigator implements NavigatorNetworkInformation;
 
 [Exposed=(Window,Worker)]
 interface NetworkInformation : EventTarget {
   readonly attribute ConnectionType type;
   readonly attribute EffectiveConnectionType effectiveType;
   readonly attribute Megabit downlinkMax;
   readonly attribute Megabit downlink;
   readonly attribute Millisecond rtt;
--- a/testing/web-platform/tests/interfaces/payment-request.idl
+++ b/testing/web-platform/tests/interfaces/payment-request.idl
@@ -73,32 +73,24 @@ dictionary PaymentOptions {
   boolean requestShipping = false;
   PaymentShippingType shippingType = "shipping";
 };
 
 dictionary PaymentItem {
   required DOMString label;
   required PaymentCurrencyAmount amount;
   boolean pending = false;
-  // Note: type member is "at risk" of being removed!
-  PaymentItemType type;
-};
-
-enum PaymentItemType {
-  "tax"
 };
 
 [SecureContext, Exposed=(Window)]
 interface PaymentAddress {
   [Default] object toJSON();
   readonly attribute DOMString city;
   readonly attribute DOMString country;
   readonly attribute DOMString dependentLocality;
-  // "languageCode" is a feature at risk
-  readonly attribute DOMString languageCode;
   readonly attribute DOMString organization;
   readonly attribute DOMString phone;
   readonly attribute DOMString postalCode;
   readonly attribute DOMString recipient;
   readonly attribute DOMString region;
   readonly attribute DOMString regionCode;
   readonly attribute DOMString sortingCode;
   readonly attribute FrozenArray<DOMString> addressLine;
@@ -108,28 +100,26 @@ dictionary AddressInit {
   DOMString country;
   sequence<DOMString> addressLine;
   DOMString region;
   DOMString regionCode;
   DOMString city;
   DOMString dependentLocality;
   DOMString postalCode;
   DOMString sortingCode;
-  DOMString languageCode;
   DOMString organization;
   DOMString recipient;
   DOMString phone;
 };
 
 dictionary AddressErrors {
   DOMString addressLine;
   DOMString city;
   DOMString country;
   DOMString dependentLocality;
-  DOMString languageCode;
   DOMString organization;
   DOMString phone;
   DOMString postalCode;
   DOMString recipient;
   DOMString region;
   DOMString regionCode;
   DOMString sortingCode;
 };
--- a/testing/web-platform/tests/interfaces/reporting.idl
+++ b/testing/web-platform/tests/interfaces/reporting.idl
@@ -47,10 +47,10 @@ interface InterventionReportBody : Repor
 
 interface CrashReportBody : ReportBody {
   readonly attribute DOMString crashId;
   readonly attribute DOMString? reason;
 };
 
 dictionary GenerateTestReportParameters {
   required DOMString message;
-  DOMString group;
+  DOMString group = "default";
 };
--- a/testing/web-platform/tests/interfaces/service-workers.idl
+++ b/testing/web-platform/tests/interfaces/service-workers.idl
@@ -90,30 +90,38 @@ interface ServiceWorkerGlobalScope : Wor
   // event
   attribute EventHandler onmessage; // event.source of the message events is Client object
   attribute EventHandler onmessageerror;
 };
 
 [Exposed=ServiceWorker]
 interface Client {
   readonly attribute USVString url;
+  readonly attribute FrameType frameType;
   readonly attribute DOMString id;
   readonly attribute ClientType type;
   void postMessage(any message, optional sequence<object> transfer = []);
 };
 
 [Exposed=ServiceWorker]
 interface WindowClient : Client {
   readonly attribute VisibilityState visibilityState;
   readonly attribute boolean focused;
   [SameObject] readonly attribute FrozenArray<USVString> ancestorOrigins;
   [NewObject] Promise<WindowClient> focus();
   [NewObject] Promise<WindowClient?> navigate(USVString url);
 };
 
+enum FrameType {
+  "auxiliary",
+  "top-level",
+  "nested",
+  "none"
+};
+
 [Exposed=ServiceWorker]
 interface Clients {
   // The objects returned will be new instances every time
   [NewObject] Promise<any> get(DOMString id);
   [NewObject] Promise<FrozenArray<Client>> matchAll(optional ClientQueryOptions options);
   [NewObject] Promise<WindowClient?> openWindow(USVString url);
   [NewObject] Promise<void> claim();
 };
--- a/testing/web-platform/tests/interfaces/touch-events.idl
+++ b/testing/web-platform/tests/interfaces/touch-events.idl
@@ -68,15 +68,8 @@ interface TouchEvent : UIEvent {
 };
 
 partial interface GlobalEventHandlers {
                     attribute EventHandler ontouchstart;
                     attribute EventHandler ontouchend;
                     attribute EventHandler ontouchmove;
                     attribute EventHandler ontouchcancel;
 };
-
-partial interface Document {
-  // Deprecated in this specification
-  Touch createTouch(WindowProxy view, EventTarget target, long identifier, double pageX, double pageY, double screenX, double screenY);
-  // Deprecated in this specification
-  TouchList createTouchList(Touch... touches);
-};
--- a/testing/web-platform/tests/interfaces/webmidi.idl
+++ b/testing/web-platform/tests/interfaces/webmidi.idl
@@ -1,55 +1,55 @@
 // GENERATED CONTENT - DO NOT EDIT
 // Content was automatically extracted by Reffy into reffy-reports
 // (https://github.com/tidoust/reffy-reports)
 // Source: Web MIDI API (http://webaudio.github.io/web-midi-api/)
 
 partial interface Navigator {
-  Promise<MIDIAccess> requestMIDIAccess(optional MIDIOptions options);
+  [SecureContext] Promise<MIDIAccess> requestMIDIAccess(optional MIDIOptions options);
 };
 
 dictionary MIDIOptions {
   boolean sysex;
   boolean software;
 };
 
 interface MIDIInputMap {
   readonly maplike<DOMString, MIDIInput>;
 };
 
 interface MIDIOutputMap {
   readonly maplike<DOMString, MIDIOutput>;
 };
 
-interface MIDIAccess : EventTarget {
+[SecureContext] interface MIDIAccess : EventTarget {
   readonly attribute MIDIInputMap inputs;
   readonly attribute MIDIOutputMap outputs;
   attribute EventHandler onstatechange;
   readonly attribute boolean sysexEnabled;
 };
 
-interface MIDIPort : EventTarget {
+[SecureContext] interface MIDIPort : EventTarget {
   readonly attribute DOMString id;
   readonly attribute DOMString? manufacturer;
   readonly attribute DOMString? name;
   readonly attribute MIDIPortType type;
   readonly attribute DOMString? version;
   readonly attribute MIDIPortDeviceState state;
   readonly attribute MIDIPortConnectionState connection;
   attribute EventHandler onstatechange;
   Promise<MIDIPort> open();
   Promise<MIDIPort> close();
 };
 
-interface MIDIInput : MIDIPort {
+[SecureContext] interface MIDIInput : MIDIPort {
   attribute EventHandler onmidimessage;
 };
 
-interface MIDIOutput : MIDIPort {
+[SecureContext] interface MIDIOutput : MIDIPort {
   void send(sequence<octet> data, optional DOMHighResTimeStamp timestamp = 0);
   void clear();
 };
 
 enum MIDIPortType {
   "input",
   "output",
 };
@@ -60,25 +60,25 @@ enum MIDIPortDeviceState {
 };
 
 enum MIDIPortConnectionState {
   "open",
   "closed",
   "pending",
 };
 
-[Constructor(DOMString type, optional MIDIMessageEventInit eventInitDict)]
+[SecureContext, Constructor(DOMString type, optional MIDIMessageEventInit eventInitDict)]
 interface MIDIMessageEvent : Event {
   readonly attribute Uint8Array data;
 };
 
 dictionary MIDIMessageEventInit : EventInit {
   Uint8Array data;
 };
 
-[Constructor(DOMString type, optional MIDIConnectionEventInit eventInitDict)]
+[SecureContext, Constructor(DOMString type, optional MIDIConnectionEventInit eventInitDict)]
 interface MIDIConnectionEvent : Event {
   readonly attribute MIDIPort port;
 };
 
 dictionary MIDIConnectionEventInit : EventInit {
   MIDIPort port;
 };
--- a/testing/web-platform/tests/lint.whitelist
+++ b/testing/web-platform/tests/lint.whitelist
@@ -793,8 +793,12 @@ MISSING-LINK: css/filter-effects/*.any.j
 
 # Tests that use WebKit/Blink testing APIs
 LAYOUTTESTS APIS: css/css-regions/interactivity/*
 LAYOUTTESTS APIS: resources/chromium/generic_sensor_mocks.js
 
 # Gecko additons to remove
 CSS-COLLIDING-REF-NAME: css/css-contain/reference/contain-size-fieldset-001-ref.html
 CSS-COLLIDING-REF-NAME: css/vendor-imports/mozilla/mozilla-central-reftests/contain/contain-size-fieldset-001-ref.html
+
+# Signed Exchange files have hard-coded URLs in the certUrl field
+WEB-PLATFORM.TEST:signed-exchange/resources/*.sxg
+WEB-PLATFORM.TEST:signed-exchange/resources/generate-test-sxgs.sh
--- a/testing/web-platform/tests/payment-request/payment-request-abort-method.https.html
+++ b/testing/web-platform/tests/payment-request/payment-request-abort-method.https.html
@@ -31,50 +31,50 @@ const defaultDetails = Object.freeze({
 
 promise_test(async t => {
   // request is in "created" state
   const request = new PaymentRequest(defaultMethods, defaultDetails);
   await promise_rejects(t, "InvalidStateError", request.abort());
 }, `Throws if the promise [[state]] is not "interactive"`);
 
 promise_test(async t => {
-  return test_driver.bless("show payment request", async () => {
-    const request = new PaymentRequest(defaultMethods, defaultDetails);
-    const acceptPromise = request.show();
-    try {
-      await request.abort();
-    } catch (err) {
-      assert_unreached("Unexpected promise rejection: " + err.message);
-    }
-    await promise_rejects(t, "AbortError", acceptPromise);
-    // As request is now "closed", trying to show it will fail
-    await promise_rejects(t, "InvalidStateError", request.show());
-  });
+  const request = new PaymentRequest(defaultMethods, defaultDetails);
+  const acceptPromise = test_driver.bless("show payment request", () =>
+    request.show()
+  );
+  try {
+    await request.abort();