Merge inbound to mozilla-central. a=merge
authorNoemi Erli <nerli@mozilla.com>
Sun, 29 Apr 2018 12:48:02 +0300
changeset 472322 c552490c8659bf2e7d279ed28d46fb5d5a245a96
parent 472318 afbec7f03bd8ced52be05199cb45ff844e456a75 (current diff)
parent 472292 355349b199c457d45e420d775df07f7b6e9df859 (diff)
child 472323 9ce8f33791e2a157621442758019d9f6fa1d5372
child 472338 b3e2845ac301da9d9d015d4a268eb6abc9f434b0
push id1728
push userjlund@mozilla.com
push dateMon, 18 Jun 2018 21:12:27 +0000
treeherdermozilla-release@c296fde26f5f [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone61.0a1
first release with
nightly linux32
c552490c8659 / 61.0a1 / 20180429100420 / files
nightly linux64
c552490c8659 / 61.0a1 / 20180429100420 / files
nightly mac
c552490c8659 / 61.0a1 / 20180429100420 / files
nightly win32
c552490c8659 / 61.0a1 / 20180429100420 / files
nightly win64
c552490c8659 / 61.0a1 / 20180429100420 / 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
layout/reftests/svg/transform-01.svg
testing/web-platform/meta/css/CSS2/floats-clear/clear-on-parent-with-margins-no-clearance.html.ini
testing/web-platform/meta/mediacapture-streams/MediaStream-MediaElement-preload-none.https.html.ini
testing/web-platform/tests/mediacapture-streams/MediaStream-MediaElement-preload-none.https.html
testing/web-platform/tests/webaudio/the-audio-api/the-delaynode-interface/idl-test.html
testing/web-platform/tests/webaudio/the-audio-api/the-gainnode-interface/idl-test.html
--- a/dom/svg/SVGTransformListParser.cpp
+++ b/dom/svg/SVGTransformListParser.cpp
@@ -109,33 +109,25 @@ SVGTransformListParser::ParseArguments(f
     return false;
   }
 
   if (!SVGContentUtils::ParseNumber(mIter, mEnd, aResult[0])) {
     return false;
   }
   *aParsedCount = 1;
 
-  while (true) {
-    RangedPtr<const char16_t> iter(mIter);
-    if (!SkipWsp()) {
-      return false;
-    }
+  while (SkipWsp()) {
     if (*mIter == ')') {
       ++mIter;
       return true;
     }
     if (*aParsedCount == aMaxCount) {
       return false;
     }
     SkipCommaWsp();
-    if (iter == mIter) {
-      // There must be either whitespace or a comma between values
-      return false;
-    }
     if (!SVGContentUtils::ParseNumber(mIter, mEnd, aResult[(*aParsedCount)++])) {
       return false;
     }
   }
   return false;
 }
 
 bool
--- a/layout/reftests/svg/reftest.list
+++ b/layout/reftests/svg/reftest.list
@@ -479,17 +479,16 @@ fuzzy-if(skiaContent,1,610) == textPath-
 == textPath-line-01.svg textPath-line-01-ref.svg
 == textPath-path-attribute-01.svg textPath-path-attribute-01-ref.svg
 == textPath-side-attribute-01.svg pass.svg
 
 == text-white-space-01.svg text-white-space-01-ref.svg
 
 == thin-stroke-01.svg pass.svg
 
-== transform-01.svg pass.svg
 == transform-outer-svg-01.svg transform-outer-svg-01-ref.svg
 
 == tspan-dxdy-01.svg tspan-dxdy-ref.svg
 == tspan-dxdy-02.svg tspan-dxdy-ref.svg
 == tspan-dxdy-03.svg tspan-dxdy-ref.svg
 == tspan-dxdy-04.svg tspan-dxdy-ref.svg
 == tspan-dxdy-05.svg tspan-dxdy-ref.svg
 == tspan-dxdy-06.svg tspan-dxdy-ref.svg
deleted file mode 100644
--- a/layout/reftests/svg/transform-01.svg
+++ /dev/null
@@ -1,11 +0,0 @@
-<!--
-     Any copyright is dedicated to the Public Domain.
-     http://creativecommons.org/publicdomain/zero/1.0/
--->
-<svg xmlns="http://www.w3.org/2000/svg">
-  <rect width="100%" height="100%" fill="lime"/>
-  <rect x="25" y="25" width="50" height="50" fill="red"/>
-  <g transform="translate(-100-100)">
-    <rect x="24" y="24" width="52" height="52" fill="lime"/>
-  </g>
-</svg>
--- a/modules/libpref/init/all.js
+++ b/modules/libpref/init/all.js
@@ -2462,17 +2462,17 @@ pref("security.directory",              
 pref("security.dialog_enable_delay", 1000);
 pref("security.notification_enable_delay", 500);
 
 pref("security.csp.enable", true);
 pref("security.csp.experimentalEnabled", false);
 pref("security.csp.enableStrictDynamic", true);
 
 #if defined(DEBUG) && !defined(ANDROID)
-pref("csp.content_privileged_about_uris_without_csp", "blank,cache,credits,home,logo,newtab,printpreview,srcdoc,studies");
+pref("csp.content_privileged_about_uris_without_csp", "blank,credits,home,logo,newtab,printpreview,srcdoc,studies");
 #endif
 
 #ifdef NIGHTLY_BUILD
 pref("security.csp.enable_violation_events", true);
 #else
 pref("security.csp.enable_violation_events", false);
 #endif
 
--- a/netwerk/protocol/about/nsAboutCache.cpp
+++ b/netwerk/protocol/about/nsAboutCache.cpp
@@ -87,19 +87,19 @@ nsAboutCache::Channel::Init(nsIURI* aURI
     if (NS_FAILED(rv)) return rv;
 
     mBuffer.AssignLiteral(
         "<!DOCTYPE html>\n"
         "<html>\n"
         "<head>\n"
         "  <title>Network Cache Storage Information</title>\n"
         "  <meta charset=\"utf-8\">\n"
+        "  <meta http-equiv=\"Content-Security-Policy\" content=\"default-src chrome:\"/>\n"
         "  <link rel=\"stylesheet\" href=\"chrome://global/skin/about.css\"/>\n"
         "  <link rel=\"stylesheet\" href=\"chrome://global/skin/aboutCache.css\"/>\n"
-        "  <script src=\"chrome://global/content/aboutCache.js\"></script>"
         "</head>\n"
         "<body class=\"aboutPageWideContainer\">\n"
         "<h1>Information about the Network Cache Storage Service</h1>\n");
 
     // Add the context switch controls
     mBuffer.AppendLiteral(
         "<label><input id='priv' type='checkbox'/> Private</label>\n"
         "<label><input id='anon' type='checkbox'/> Anonymous</label>\n"
@@ -110,17 +110,17 @@ nsAboutCache::Channel::Init(nsIURI* aURI
     // The appid/inbrowser entries are already mixed in the default
     // view anyway.
     mBuffer.AppendLiteral(
         "<label><input id='appid' type='text' size='6'/> AppID</label>\n"
         "<label><input id='inbrowser' type='checkbox'/> In Browser Element</label>\n"
     );
 
     mBuffer.AppendLiteral(
-        "<label><input id='submit' type='button' value='Update' onclick='navigate()'/></label>\n"
+        "<label><input id='submit' type='button' value='Update'/></label>\n"
     );
 
     if (!mOverview) {
         mBuffer.AppendLiteral("<a href=\"about:cache?storage=&amp;context=");
         nsAppendEscapedHTML(mContextString, mBuffer);
         mBuffer.AppendLiteral("\">Back to overview</a>");
     }
 
@@ -529,16 +529,18 @@ nsAboutCache::Channel::OnCacheEntryVisit
         if (NS_SUCCEEDED(rv)) {
             // Expecting new round of OnCache* calls.
             return NS_OK;
         }
     }
 
     // We are done!
     mBuffer.AppendLiteral("</body>\n"
+                          "<script src=\"chrome://global/content/aboutCache.js\">"
+                          "</script>\n"
                           "</html>\n");
     nsresult rv = FlushBuffer();
     if (NS_FAILED(rv)) {
         NS_WARNING("Failed to flush buffer");
     }
     mStream->Close();
 
     return NS_OK;
--- a/testing/web-platform/meta/IndexedDB/interfaces.any.js.ini
+++ b/testing/web-platform/meta/IndexedDB/interfaces.any.js.ini
@@ -1,6 +1,4 @@
 [interfaces.any.worker.html]
   [ImageBitmapRenderingContext interface: existence and properties of interface object]
     expected: FAIL
 
-
-[interfaces.any.html]
--- a/testing/web-platform/meta/MANIFEST.json
+++ b/testing/web-platform/meta/MANIFEST.json
@@ -14588,16 +14588,22 @@
     ]
    ],
    "mathml/relations/html5-tree/href-manual.html": [
     [
      "/mathml/relations/html5-tree/href-manual.html",
      {}
     ]
    ],
+   "mediacapture-streams/MediaStream-MediaElement-preload-none-manual.https.html": [
+    [
+     "/mediacapture-streams/MediaStream-MediaElement-preload-none-manual.https.html",
+     {}
+    ]
+   ],
    "mediacapture-streams/MediaStream-id-manual.https.html": [
     [
      "/mediacapture-streams/MediaStream-id-manual.https.html",
      {}
     ]
    ],
    "mediacapture-streams/MediaStreamTrack-end-manual.https.html": [
     [
@@ -275094,16 +275100,21 @@
      {}
     ]
    ],
    "html/browsers/history/joint-session-history/joint-session-history-child2.html": [
     [
      {}
     ]
    ],
+   "html/browsers/history/joint-session-history/joint-session-history-filler.html": [
+    [
+     {}
+    ]
+   ],
    "html/browsers/history/joint-session-history/joint-session-history-grandchild1.html": [
     [
      {}
     ]
    ],
    "html/browsers/history/joint-session-history/joint-session-history-grandchild2.html": [
     [
      {}
@@ -327715,16 +327726,22 @@
     ]
    ],
    "fetch/api/basic/keepalive.html": [
     [
      "/fetch/api/basic/keepalive.html",
      {}
     ]
    ],
+   "fetch/api/basic/mediasource.window.js": [
+    [
+     "/fetch/api/basic/mediasource.window.html",
+     {}
+    ]
+   ],
    "fetch/api/basic/mode-no-cors-worker.html": [
     [
      "/fetch/api/basic/mode-no-cors-worker.html",
      {}
     ]
    ],
    "fetch/api/basic/mode-no-cors.html": [
     [
@@ -329723,16 +329740,22 @@
     ]
    ],
    "html/browsers/history/joint-session-history/joint-session-history-only-fully-active.html": [
     [
      "/html/browsers/history/joint-session-history/joint-session-history-only-fully-active.html",
      {}
     ]
    ],
+   "html/browsers/history/joint-session-history/joint-session-history-remove-iframe.html": [
+    [
+     "/html/browsers/history/joint-session-history/joint-session-history-remove-iframe.html",
+     {}
+    ]
+   ],
    "html/browsers/history/the-history-interface/001.html": [
     [
      "/html/browsers/history/the-history-interface/001.html",
      {}
     ]
    ],
    "html/browsers/history/the-history-interface/002.html": [
     [
@@ -342627,22 +342650,16 @@
     ]
    ],
    "mediacapture-streams/MediaDevices-getUserMedia.https.html": [
     [
      "/mediacapture-streams/MediaDevices-getUserMedia.https.html",
      {}
     ]
    ],
-   "mediacapture-streams/MediaStream-MediaElement-preload-none.https.html": [
-    [
-     "/mediacapture-streams/MediaStream-MediaElement-preload-none.https.html",
-     {}
-    ]
-   ],
    "mediacapture-streams/MediaStream-MediaElement-srcObject.https.html": [
     [
      "/mediacapture-streams/MediaStream-MediaElement-srcObject.https.html",
      {}
     ]
    ],
    "mediacapture-streams/MediaStream-add-audio-track.https.html": [
     [
@@ -368387,22 +368404,16 @@
     ]
    ],
    "webaudio/the-audio-api/the-delaynode-interface/delaynode.html": [
     [
      "/webaudio/the-audio-api/the-delaynode-interface/delaynode.html",
      {}
     ]
    ],
-   "webaudio/the-audio-api/the-delaynode-interface/idl-test.html": [
-    [
-     "/webaudio/the-audio-api/the-delaynode-interface/idl-test.html",
-     {}
-    ]
-   ],
    "webaudio/the-audio-api/the-delaynode-interface/no-dezippering.html": [
     [
      "/webaudio/the-audio-api/the-delaynode-interface/no-dezippering.html",
      {}
     ]
    ],
    "webaudio/the-audio-api/the-dynamicscompressornode-interface/dynamicscompressor-basic.html": [
     [
@@ -368417,22 +368428,16 @@
     ]
    ],
    "webaudio/the-audio-api/the-gainnode-interface/gain.html": [
     [
      "/webaudio/the-audio-api/the-gainnode-interface/gain.html",
      {}
     ]
    ],
-   "webaudio/the-audio-api/the-gainnode-interface/idl-test.html": [
-    [
-     "/webaudio/the-audio-api/the-gainnode-interface/idl-test.html",
-     {}
-    ]
-   ],
    "webaudio/the-audio-api/the-gainnode-interface/no-dezippering.html": [
     [
      "/webaudio/the-audio-api/the-gainnode-interface/no-dezippering.html",
      {}
     ]
    ],
    "webaudio/the-audio-api/the-gainnode-interface/test-gainnode.html": [
     [
@@ -423793,17 +423798,17 @@
    "363e06143474e3a3941fe4b96631146902351aff",
    "support"
   ],
   "content-security-policy/embedded-enforcement/support/echo-required-csp.py": [
    "8d73332cdc154e05cdfa936d3f6b936b9c0ebdba",
    "support"
   ],
   "content-security-policy/embedded-enforcement/support/testharness-helper.sub.js": [
-   "3f5930842625b190576a163cbe1a01aa8fc4c086",
+   "009dfb8482f20ce57121406d675fa83315cbd2d6",
    "support"
   ],
   "content-security-policy/font-src/font-match-allowed.sub.html": [
    "4bc23af2a5a3280630e50cc4c35a9769e499b7a6",
    "testharness"
   ],
   "content-security-policy/font-src/font-mismatch-blocked.sub.html": [
    "274372eb59cca6e399d8c786d7a0f443c6f35254",
@@ -425297,17 +425302,17 @@
    "01d4ce834d175d13eb0d9c80bbe4a7be614d687f",
    "testharness"
   ],
   "content-security-policy/securitypolicyviolation/blockeduri-inline.html": [
    "8e7326101e28ec65c6c834f7711b261917f93218",
    "testharness"
   ],
   "content-security-policy/securitypolicyviolation/idl.html": [
-   "29c68c73b221ec65466645dfa5e9ecc1f2a0f007",
+   "266180135d8167bc47d6c7a73798e87aa1082bee",
    "testharness"
   ],
   "content-security-policy/securitypolicyviolation/img-src-redirect-upgrade-reporting.https.html": [
    "e338e94ea726419db64ed5b98c95b862c394409e",
    "testharness"
   ],
   "content-security-policy/securitypolicyviolation/img-src-redirect-upgrade-reporting.https.html.headers": [
    "960ee8a9f7ccf33ea435890e2eae0e68399f32ed",
@@ -444317,17 +444322,17 @@
    "69b04e20fa82677e4d2736bd6ec9c370147e4061",
    "reftest"
   ],
   "css/CSS2/floats-clear/clear-on-parent-and-child.html": [
    "bbf7831640ee2aa3e29aa6695682d1e14971948b",
    "reftest"
   ],
   "css/CSS2/floats-clear/clear-on-parent-with-margins-no-clearance.html": [
-   "d4b2bf3b4b6761c9531859e6cedb9d08a928880f",
+   "b2f18a06134a432553d90928491d09053aee8534",
    "reftest"
   ],
   "css/CSS2/floats-clear/clear-on-parent-with-margins.html": [
    "dbaee65a956a9b0dfc8b1bbb3ae70bd29bb02c6c",
    "reftest"
   ],
   "css/CSS2/floats-clear/clear-on-parent.html": [
    "63c9122c39983b4c3a7d10f92399e746411022c3",
@@ -537377,17 +537382,17 @@
    "071bcc0320577077bc6768921f28e33e892ccd9a",
    "testharness"
   ],
   "css/cssom-view/iframe.html": [
    "81c8e70138fc30d0954d9de692ee396310586c7f",
    "support"
   ],
   "css/cssom-view/interfaces.html": [
-   "0cecd644b3363618acd1496865578a15306e18fe",
+   "84067e6095d184488dc1c44a7ba17792d946976b",
    "testharness"
   ],
   "css/cssom-view/matchMedia.xht": [
    "3330cf1603555d50d097cdc584cf1c193c8b32d3",
    "testharness"
   ],
   "css/cssom-view/matchMediaAddListener.html": [
    "ec5b756e980676c8707bcb2d7d91b7c977158e0d",
@@ -537769,17 +537774,17 @@
    "55010cf90dc7fc2ef8ec6cbd13d1ec947a823aed",
    "testharness"
   ],
   "css/cssom/css-style-attr-decl-block.html": [
    "1d68a3fd1560308c0d2f3478864d84f4361e4ab9",
    "testharness"
   ],
   "css/cssom/css-style-attribute-modifications.html": [
-   "9199534f3b6cc473832562b1701ade3a05dde172",
+   "935cae926defd9fe2203ef37af25288b9fdf92e1",
    "testharness"
   ],
   "css/cssom/css-style-declaration-modifications.html": [
    "c169d758c1d91b75697b04cf72750f8ac1650e1a",
    "testharness"
   ],
   "css/cssom/css-style-reparse.html": [
    "d83b1fde05df64628f67b7773757c12d213f566b",
@@ -537893,17 +537898,17 @@
    "812f2b02d7694dd270b7a3e1ef205b99890ab216",
    "testharness"
   ],
   "css/cssom/insertRule-syntax-error-01.html": [
    "36f824b24dd56e20b7c524111512d8743745daaa",
    "testharness"
   ],
   "css/cssom/interfaces.html": [
-   "de0fd22930a606a17da15291ca14321463316f11",
+   "42e325d3d7f6be7f557915072f61900ff611cef8",
    "testharness"
   ],
   "css/cssom/medialist-dynamic-001-ref.html": [
    "bdf98c994adcebff3a3434260dfe71e99c8441e1",
    "support"
   ],
   "css/cssom/medialist-dynamic-001.html": [
    "8c62d1e6b5791b68240551c0c9cd115f4d16a892",
@@ -539209,17 +539214,17 @@
    "07f6f0492e97343ab66e79754f374a743bb473f5",
    "testharness"
   ],
   "css/selectors/attribute-selectors/attribute-case/syntax.html": [
    "9ce44a4d5adc02d2730ca80a02cdb521c7be7025",
    "testharness"
   ],
   "css/selectors/child-indexed-pseudo-class.html": [
-   "879a5f48d8a06514d457f29d245cd407321366ee",
+   "893cff0344fd832c885c5ab12d881cc321eb23e8",
    "testharness"
   ],
   "css/selectors/css3-modsel-1.xml": [
    "200ec7eea31c5b79b7e05c07fdc7316388ca1a6c",
    "support"
   ],
   "css/selectors/css3-modsel-10.xml": [
    "5954f591adfaf8558333e73a4c3ccf883775e70b",
@@ -555420,16 +555425,20 @@
   "fetch/api/basic/integrity.js": [
    "59e8c5ebf0dfd2ab2432f28dcee5db82e9505cff",
    "support"
   ],
   "fetch/api/basic/keepalive.html": [
    "1ecdcb478b65b258e79242ae17af79ba903db412",
    "testharness"
   ],
+  "fetch/api/basic/mediasource.window.js": [
+   "5e2e35f820982002b967d7444507a2bfc0d3aa34",
+   "testharness"
+  ],
   "fetch/api/basic/mode-no-cors-worker.html": [
    "39992b8abf3ab30182dfbaa5816cc154a22ae0ad",
    "testharness"
   ],
   "fetch/api/basic/mode-no-cors.html": [
    "ff174cb1a76a63473028b72b3319602685689cb5",
    "testharness"
   ],
@@ -555845,17 +555854,17 @@
    "bccd984f902bcfde3882c6202995b5efba82b792",
    "testharness"
   ],
   "fetch/api/redirect/redirect-mode.html": [
    "60ef7b28da442f7b7f008368606f7d6ef4560adc",
    "testharness"
   ],
   "fetch/api/redirect/redirect-mode.js": [
-   "d5aa056ebb91e7d57ffc3cf801c9e70f0b58d3ab",
+   "ab6cc5b089f5d1a0ea08de94556793fcfe638be3",
    "support"
   ],
   "fetch/api/redirect/redirect-origin-worker.html": [
    "b3bc9e04ce8a6a5383b4a93dbe092b84af0f6b7d",
    "testharness"
   ],
   "fetch/api/redirect/redirect-origin.html": [
    "7a56a9a4ebdf1d6cec0a5dfcfee9b8d53434c7aa",
@@ -556425,17 +556434,17 @@
    "ba4acd05372765d0fb03e89f13186e73467db58c",
    "testharness"
   ],
   "fetch/data-urls/processing.any.js": [
    "7ba48c1ab609fd739e5fcd594a93d237e4fc326b",
    "testharness"
   ],
   "fetch/data-urls/resources/base64.json": [
-   "8079b52c59420f924df9dfb7d99d1ac49265a315",
+   "6d3d2983e6e3d8e91ec7dfcc1f0f16e1d78383b7",
    "support"
   ],
   "fetch/data-urls/resources/data-urls.json": [
    "f743417aa319c29e73620daac1d6f3fe1d4a5a28",
    "support"
   ],
   "fetch/http-cache/304-update.html": [
    "2571df43eb57ecbd29f55c2fc57b16f227001787",
@@ -556805,17 +556814,17 @@
    "d09831467a1b1a17f97271ff027d413e28b4bacb",
    "support"
   ],
   "fonts/OWNERS": [
    "5f4cbe2046888a3bef5097a04d4ce41b6ba1db05",
    "support"
   ],
   "fonts/README.md": [
-   "eb192c5fe03811a1b69578c92bf77d8abab89f29",
+   "7267d3c356ff8e59a1dc71cf3c11f3eeafa318bf",
    "support"
   ],
   "fonts/Revalia.woff": [
    "f2b20022818e53e9c9c5f22bcc52703c6858eb1c",
    "support"
   ],
   "fonts/adobe-fonts/CSSFWOrientationTest.otf": [
    "c36af3e6a778f52bd8ce898b182ce4651f1042a2",
@@ -558796,28 +558805,36 @@
   "html/browsers/history/joint-session-history/joint-session-history-child1.html": [
    "3e515ed415bbe7a5bcb89aff5c5009cd6d445623",
    "support"
   ],
   "html/browsers/history/joint-session-history/joint-session-history-child2.html": [
    "c8309aa28105f557d99d7a36e86df977bfe003e9",
    "support"
   ],
+  "html/browsers/history/joint-session-history/joint-session-history-filler.html": [
+   "54568c8fe456d139e05620c0639a4e60765c8f90",
+   "support"
+  ],
   "html/browsers/history/joint-session-history/joint-session-history-grandchild1.html": [
    "c4b5d65cf89e66fc6df209c7166ff56dd66bcf16",
    "support"
   ],
   "html/browsers/history/joint-session-history/joint-session-history-grandchild2.html": [
    "dfae780f1a91df7d0a9574c1e0e056ce9a71b1fb",
    "support"
   ],
   "html/browsers/history/joint-session-history/joint-session-history-only-fully-active.html": [
    "e5087c8e51160b36134efab21ed2fbc200a9697d",
    "testharness"
   ],
+  "html/browsers/history/joint-session-history/joint-session-history-remove-iframe.html": [
+   "2ff693526c5637a11658831961c9ff0a738329de",
+   "testharness"
+  ],
   "html/browsers/history/the-history-interface/.gitkeep": [
    "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "support"
   ],
   "html/browsers/history/the-history-interface/001.html": [
    "5eb4991d51ef483a8ab629ad014977296da4ea68",
    "testharness"
   ],
@@ -559577,17 +559594,17 @@
    "fd1eea1cc64dcc5d816545ac3420351d5e8cb317",
    "testharness"
   ],
   "html/browsers/offline/browser-state/.gitkeep": [
    "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "support"
   ],
   "html/browsers/offline/browser-state/navigator_online_event-manual.https.html": [
-   "6ad5311783547501b80d05eea9b7a414348b151a",
+   "0128e846b64f2f06d72300aaa089d1e9c13faa7f",
    "manual"
   ],
   "html/browsers/offline/browser-state/navigator_online_online.https.html": [
    "a06d993d34908fb332aca34a3a2002a917db9ee5",
    "testharness"
   ],
   "html/browsers/offline/changestonetworkingmodel/.gitkeep": [
    "da39a3ee5e6b4b0d3255bfef95601890afd80709",
@@ -577393,17 +577410,17 @@
    "3a1097a8c4cb4f63da97e126fbb302a5fec73968",
    "support"
   ],
   "interfaces/dedicated-workers.idl": [
    "993f3d3b4fa58585c444a76d2a5fc9f388e65999",
    "support"
   ],
   "interfaces/dom.idl": [
-   "a5360a145bb075bdde49f875615f118198b9cf01",
+   "86ea69e6432ac3e4172129591f4aeac69e336a82",
    "support"
   ],
   "interfaces/encoding.idl": [
    "0dd77d1c6d854b0bdd003107c2385a224e1953f8",
    "support"
   ],
   "interfaces/encrypted-media.idl": [
    "ef1f1432c42fc6d01f3bfbd576fa5c7de349de96",
@@ -578960,19 +578977,19 @@
   "mediacapture-streams/MediaDevices-enumerateDevices.https.html": [
    "c44f824ed1836c272125b0b5b10653cb86db2a7e",
    "testharness"
   ],
   "mediacapture-streams/MediaDevices-getUserMedia.https.html": [
    "a515deeec87c394b4a826b538df6dd0baa05cae6",
    "testharness"
   ],
-  "mediacapture-streams/MediaStream-MediaElement-preload-none.https.html": [
-   "374f9942ebd05d866340981469ceb28bddf83727",
-   "testharness"
+  "mediacapture-streams/MediaStream-MediaElement-preload-none-manual.https.html": [
+   "6f3e8911d8b0fc74519bf046567e079d22a2e50c",
+   "manual"
   ],
   "mediacapture-streams/MediaStream-MediaElement-srcObject.https.html": [
    "f2958c6965640ff9e9dc2c038a593bdd41c6759c",
    "testharness"
   ],
   "mediacapture-streams/MediaStream-add-audio-track.https.html": [
    "1bcb7de8f2c0f85fed091dfcbb102d40264f387f",
    "testharness"
@@ -579045,17 +579062,17 @@
    "2907c67a3ab9c22ba98f03acf16adc2f2b31ee30",
    "testharness"
   ],
   "mediacapture-streams/OWNERS": [
    "2b20bf18b1f92a2f4c4d56ad1c6a41ec2b34cc9c",
    "support"
   ],
   "mediacapture-streams/historical.html": [
-   "96a34ddfb393f19df98b2334a71e78b40e333e26",
+   "f30bde11122411931ad98ef49047bd3755047fda",
    "testharness"
   ],
   "mediasession/README.md": [
    "5ceecb2611837e6c52a303cec32d8cb9fabe93a6",
    "support"
   ],
   "mediasession/idlharness.html": [
    "8db3276ecfd3f02e55b89171f61e45e6af540614",
@@ -587609,17 +587626,17 @@
    "91a8bd86357b0d96ba3ab8f08f88c28436de484c",
    "support"
   ],
   "pointerevents/compat/pointerevent_touch-action_two-finger_interaction-manual.html": [
    "cba44e2dd2a3c54106bfecc6cdd407643e2ba995",
    "manual"
   ],
   "pointerevents/extension/idlharness.html": [
-   "c1ee780b59d596535e697db237a3af3aa019b2f7",
+   "1337bbb65f4748a7d5a076cbe73e4aa48a2a1eb8",
    "testharness"
   ],
   "pointerevents/extension/pointerevent_coalesced_events_attributes-manual.html": [
    "f0393e603c25eb52d5144c95e808f2ab96cbe1f7",
    "manual"
   ],
   "pointerevents/extension/pointerevent_constructor.html": [
    "11d5baa9206313270be6289205b002b623af85db",
@@ -587645,17 +587662,17 @@
    "f3188cc408b651f05ad946768c8233d0f7586b38",
    "testharness"
   ],
   "pointerevents/html/pointerevent_drag_interaction-manual.html": [
    "1eb570dbed48373f9e840b7694b774448b689879",
    "manual"
   ],
   "pointerevents/idlharness.html": [
-   "ee6982f1735711a9ac3c8c3a1447eb96f8e8d61c",
+   "5d54a0bb419e989db76a2d4333e73d9ccbce511b",
    "testharness"
   ],
   "pointerevents/pointerevent_attributes_hoverable_pointers-manual.html": [
    "9a71336042a931e45c7aef0e031669c26ac5c36c",
    "manual"
   ],
   "pointerevents/pointerevent_attributes_nohover_pointers-manual.html": [
    "b010a8ff22c0522c8bbd5332e5d4ff8f1032a766",
@@ -596213,17 +596230,17 @@
    "4a108e824fb57aa563deede2da8d47f25a8ab41e",
    "testharness"
   ],
   "resource-timing/resource_timing_store_and_clear_during_callback.html": [
    "dfbd67c249b48f133ec896a291ea0d925307e4ec",
    "testharness"
   ],
   "resource-timing/resources/TAOResponse.py": [
-   "9e8051a2ff8fff72b36ed1cecb61f9e7bba29071",
+   "8d195488cb76f1c17da16d06893d5ebc65550465",
    "support"
   ],
   "resource-timing/resources/all_resource_types.htm": [
    "63a40f0ab7e27536448a7624bb632332c9d0aae4",
    "support"
   ],
   "resource-timing/resources/blank_page_green.htm": [
    "2d6d55d85e17a9fe978db6dbe25ae35a599d5683",
@@ -597837,17 +597854,17 @@
    "00c90429203c85ae8f10a6a6604cdf9619524f06",
    "testharness"
   ],
   "service-workers/service-worker/fetch-event-network-error.https.html": [
    "07b81a0af207ee0723a9abae90e49482701f8935",
    "testharness"
   ],
   "service-workers/service-worker/fetch-event-redirect.https.html": [
-   "48c8d37bcdc37f83d5cfec4e1baba0f8aa1a24e4",
+   "66ee27f8b1cb6bc2c8394b027d878132d3aa1c24",
    "testharness"
   ],
   "service-workers/service-worker/fetch-event-referrer-policy.https.html": [
    "48c31881c1933ae05cbd3d782754c5202c6b055c",
    "testharness"
   ],
   "service-workers/service-worker/fetch-event-respond-with-argument.https.html": [
    "ce7e7cf76aace24a92d455cdb6b54fc9048960e8",
@@ -597937,17 +597954,17 @@
    "9631947d3cec78547bd4666b8ca970d037648cc8",
    "testharness"
   ],
   "service-workers/service-worker/fetch-request-redirect.https.html": [
    "d9df49b76012233e0aeb92f50a0613f90e8b3ee1",
    "testharness"
   ],
   "service-workers/service-worker/fetch-request-resources.https.html": [
-   "d21ef5a4263e26cd3053a89171e2597424eaad82",
+   "9b5be43fdacc1362d92f72c3d57f68fca0eaa493",
    "testharness"
   ],
   "service-workers/service-worker/fetch-request-xhr-sync-on-worker.https.html": [
    "aca28d4ad02c803873bea5fc922b8e4d427ccc4b",
    "testharness"
   ],
   "service-workers/service-worker/fetch-request-xhr-sync.https.html": [
    "4aaa0b1995643f4e18c47d1947476a1a67fe997d",
@@ -598741,21 +598758,21 @@
    "01aabcc28508a0a2dbe267dd47a293937b380187",
    "support"
   ],
   "service-workers/service-worker/resources/fetch-request-redirect-iframe.html": [
    "92ea3d394c02958d7be3a5425bf58f00458815b6",
    "support"
   ],
   "service-workers/service-worker/resources/fetch-request-resources-iframe.https.html": [
-   "95bcbc6a2f4560788f77fa717fa06d7d018d99c6",
+   "bcf833f49f3de4a67dfbd7522f525331bfb14bd9",
    "support"
   ],
   "service-workers/service-worker/resources/fetch-request-resources-worker.js": [
-   "4512140fe37ffd78086f54c6b0f6213675c0d74f",
+   "de3203b73bb35427d2b792a735ea2d6f7b9e4a2e",
    "support"
   ],
   "service-workers/service-worker/resources/fetch-request-xhr-iframe.https.html": [
    "4d7489b889c98bd66b40369e2d4ed56355ada6ae",
    "support"
   ],
   "service-workers/service-worker/resources/fetch-request-xhr-sync-iframe.html": [
    "a168a0326207e734f0229d49cce12af9a37e81ec",
@@ -599733,17 +599750,17 @@
    "e5b4dedaf8f78a6ce771af4509da8acb3aca3441",
    "testharness"
   ],
   "shadow-dom/Element-interface-shadowRoot-attribute.html": [
    "9309a89a4cf31421a4d6adb17134f9179613d9be",
    "testharness"
   ],
   "shadow-dom/Extensions-to-Event-Interface.html": [
-   "b8a8b22197eb1c17e9cea05c73826211dd2f2532",
+   "97c54c56d053c7d7116a5c16fed6457011060d06",
    "testharness"
   ],
   "shadow-dom/HTMLSlotElement-interface.html": [
    "f30eff6f08f3680d8640aa5df2612f0fbd98dc50",
    "testharness"
   ],
   "shadow-dom/MouseEvent-prototype-offsetX-offsetY.html": [
    "8fe2c9531f1d7f98947dc3d8f6a064401e4d44f9",
@@ -599829,17 +599846,17 @@
    "51a23151c28992fe062b36914463de216bd55fbe",
    "support"
   ],
   "shadow-dom/resources/Document-prototype-currentScript-helper.js": [
    "f7d4af7942bcd858df4a2f1a8bbda86b32baee31",
    "support"
   ],
   "shadow-dom/resources/event-path-test-helpers.js": [
-   "0b3340091c93e37362c5008fded9ac4efd042f35",
+   "8eb117fa5a60279eb58b4987fb156f67a75ad136",
    "support"
   ],
   "shadow-dom/resources/shadow-dom-utils.js": [
    "05a7ed192e44934cb04bc9105d70d3dd8b2a5a28",
    "support"
   ],
   "shadow-dom/resources/shadow-dom.js": [
    "93ca8358ed39d8236a35bf823e4db3a8a53f0e2e",
@@ -607212,20 +607229,16 @@
   "webaudio/the-audio-api/the-delaynode-interface/delaynode-scheduling.html": [
    "6f7c363e610fe141458b77d3ca7ec69bca8012a6",
    "testharness"
   ],
   "webaudio/the-audio-api/the-delaynode-interface/delaynode.html": [
    "622ca5f882644f183674cc07e55a69e63e5c85d9",
    "testharness"
   ],
-  "webaudio/the-audio-api/the-delaynode-interface/idl-test.html": [
-   "4f75f58d7286231e48236d1736e5739b8007502e",
-   "testharness"
-  ],
   "webaudio/the-audio-api/the-delaynode-interface/no-dezippering.html": [
    "96b405fd00ee657194de348ea46b263ba43f98a4",
    "testharness"
   ],
   "webaudio/the-audio-api/the-dynamicscompressornode-interface/.gitkeep": [
    "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "support"
   ],
@@ -607244,20 +607257,16 @@
   "webaudio/the-audio-api/the-gainnode-interface/gain-expected.wav": [
    "823f7ae1a5f5eb0c630e7d1881c50a1f710f9350",
    "support"
   ],
   "webaudio/the-audio-api/the-gainnode-interface/gain.html": [
    "5f50c22eaa77f09d0fa8c6f6f5249fdbf7db4b24",
    "testharness"
   ],
-  "webaudio/the-audio-api/the-gainnode-interface/idl-test.html": [
-   "a2abc80981a4f6ec810850150cdcd149854daf4b",
-   "testharness"
-  ],
   "webaudio/the-audio-api/the-gainnode-interface/no-dezippering.html": [
    "2205ec8f56472bd45e102cf57f10b4532b18a554",
    "testharness"
   ],
   "webaudio/the-audio-api/the-gainnode-interface/test-gainnode.html": [
    "bf2de43e568c79b96fd5b0602e26346c483162a5",
    "testharness"
   ],
@@ -607557,17 +607566,17 @@
    "95203777fcc012ab64465287737a89a4ba2c31dc",
    "support"
   ],
   "webdriver/tests/close_window/close.py": [
    "4138394adbccb06712b22a2f982e8638aa03629a",
    "wdspec"
   ],
   "webdriver/tests/close_window/user_prompts.py": [
-   "6151fb105fafcfb462a580fc725b207eae725f6c",
+   "fc8d7f3da2bdba9bb59820a9f6ae3fb46d8153bf",
    "wdspec"
   ],
   "webdriver/tests/conftest.py": [
    "c812269d034c9ca1b8c4f136dd5d0cea52f4d0f0",
    "support"
   ],
   "webdriver/tests/contexts/json_serialize_windowproxy.py": [
    "d29c82c48b3bd1e2b07c40798a774eb77d6178a5",
@@ -607581,33 +607590,33 @@
    "479379109115668183643e8a050396219332887d",
    "wdspec"
   ],
   "webdriver/tests/cookies/add_cookie.py": [
    "29891e121def1917c47c70efd19b40ed5f2ea61d",
    "wdspec"
   ],
   "webdriver/tests/cookies/delete_cookie.py": [
-   "dbb50588ba525f3ec27a7408eaa4c240614696d5",
+   "ce1212fea0ccb629298132fe272948307b108705",
    "wdspec"
   ],
   "webdriver/tests/cookies/get_named_cookie.py": [
-   "e6e265f417d17b4c9d349fbe9aa9fe3923dcfea0",
+   "a3116e826f4db0221224ccb9a0e0d71ecb1f9a85",
    "wdspec"
   ],
   "webdriver/tests/document_handling/page_source.py": [
    "5dddfce0a5e43f02b8a050afda8c9a07c43cf797",
    "wdspec"
   ],
   "webdriver/tests/element_click/__init__.py": [
    "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "support"
   ],
   "webdriver/tests/element_click/bubbling.py": [
-   "dde7ca3d7b8ee65222af0044f07087d3b0725bb9",
+   "67d9b7aeb95132759d28696cdcc60a279ccb702a",
    "wdspec"
   ],
   "webdriver/tests/element_click/select.py": [
    "bddc341a0feb0d06e75415b8f98b8e9e0c2a829d",
    "wdspec"
   ],
   "webdriver/tests/element_click/stale.py": [
    "37af63203540dfe11d36fe05d74694f05c6505f2",
@@ -607657,33 +607666,33 @@
    "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "support"
   ],
   "webdriver/tests/execute_async_script/collections.py": [
    "b10e02dff5437ae2b6ed6cc17141e5643dc1b75d",
    "wdspec"
   ],
   "webdriver/tests/execute_async_script/user_prompts.py": [
-   "e31edd4537f9b7479a348465154381f5b18f938c",
+   "cf789bc7a329b78b7d61b894209d064d3d80b3b0",
    "wdspec"
   ],
   "webdriver/tests/execute_script/__init__.py": [
    "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "support"
   ],
   "webdriver/tests/execute_script/collections.py": [
    "7162405055534f77fd7e57419b3cc2a210ddd4e0",
    "wdspec"
   ],
   "webdriver/tests/execute_script/cyclic.py": [
    "9d8a28b94b8cdac88650b675cb00bf21261444e8",
    "wdspec"
   ],
   "webdriver/tests/execute_script/user_prompts.py": [
-   "901487f8270dcce693867ca090393e093d26f22b",
+   "1cb98dd72664cfcfede1255484239f4505c06d20",
    "wdspec"
   ],
   "webdriver/tests/fullscreen_window.py": [
    "c244064c0595d9274ddef98c527d193355ba13fa",
    "wdspec"
   ],
   "webdriver/tests/get_window_rect.py": [
    "c9139c16aa950c734c776887d6a762b867790812",
--- a/testing/web-platform/meta/content-security-policy/embedded-enforcement/allow_csp_from-header.html.ini
+++ b/testing/web-platform/meta/content-security-policy/embedded-enforcement/allow_csp_from-header.html.ini
@@ -1,9 +1,10 @@
 [allow_csp_from-header.html]
+  expected: ERROR
   [Cross origin iframe with an empty Allow-CSP-From header gets blocked.]
     expected: FAIL
 
   [Cross origin iframe without Allow-CSP-From header gets blocked.]
     expected: FAIL
 
   [Iframe with improper Allow-CSP-From header gets blocked.]
     expected: FAIL
--- a/testing/web-platform/meta/content-security-policy/embedded-enforcement/subsumption_algorithm-general.html.ini
+++ b/testing/web-platform/meta/content-security-policy/embedded-enforcement/subsumption_algorithm-general.html.ini
@@ -1,7 +1,8 @@
 [subsumption_algorithm-general.html]
+  expected: ERROR
   [Iframe with empty returned CSP should be blocked.]
     expected: FAIL
 
   [Iframe with a different CSP should be blocked.]
     expected: FAIL
 
--- a/testing/web-platform/meta/content-security-policy/embedded-enforcement/subsumption_algorithm-hashes.html.ini
+++ b/testing/web-platform/meta/content-security-policy/embedded-enforcement/subsumption_algorithm-hashes.html.ini
@@ -1,9 +1,10 @@
 [subsumption_algorithm-hashes.html]
+  expected: ERROR
   [Returned should not include hashes not present in required csp.]
     expected: FAIL
 
   [Hashes do not have to be present in returned csp but must not allow all inline behavior.]
     expected: FAIL
 
   [Other expressions have to be subsumed.]
     expected: FAIL
--- a/testing/web-platform/meta/content-security-policy/embedded-enforcement/subsumption_algorithm-host_sources-hosts.html.ini
+++ b/testing/web-platform/meta/content-security-policy/embedded-enforcement/subsumption_algorithm-host_sources-hosts.html.ini
@@ -1,9 +1,10 @@
 [subsumption_algorithm-host_sources-hosts.html]
+  expected: ERROR
   [Host must match.]
     expected: FAIL
 
   [Hosts without wildcards must match.]
     expected: FAIL
 
   [More specific subdomain should not match.]
     expected: FAIL
--- a/testing/web-platform/meta/content-security-policy/embedded-enforcement/subsumption_algorithm-host_sources-paths.html.ini
+++ b/testing/web-platform/meta/content-security-policy/embedded-enforcement/subsumption_algorithm-host_sources-paths.html.ini
@@ -1,9 +1,10 @@
 [subsumption_algorithm-host_sources-paths.html]
+  expected: ERROR
   [Returned CSP must specify a path.]
     expected: FAIL
 
   [Empty path is not subsumed by specified paths.]
     expected: FAIL
 
   [That should not be true when required csp specifies a specific page.]
     expected: FAIL
--- a/testing/web-platform/meta/content-security-policy/embedded-enforcement/subsumption_algorithm-host_sources-ports.html.ini
+++ b/testing/web-platform/meta/content-security-policy/embedded-enforcement/subsumption_algorithm-host_sources-ports.html.ini
@@ -1,9 +1,10 @@
 [subsumption_algorithm-host_sources-ports.html]
+  expected: ERROR
   [Specified ports must match.]
     expected: FAIL
 
   [Returned CSP should be subsumed if the port is specified but is not default for a more secure scheme.]
     expected: FAIL
 
   [Wildcard port should not be subsumed by a default port.]
     expected: FAIL
--- a/testing/web-platform/meta/content-security-policy/embedded-enforcement/subsumption_algorithm-host_sources-protocols.html.ini
+++ b/testing/web-platform/meta/content-security-policy/embedded-enforcement/subsumption_algorithm-host_sources-protocols.html.ini
@@ -1,9 +1,10 @@
 [subsumption_algorithm-host_sources-protocols.html]
+  expected: ERROR
   [`https` is more restrictive than `http`.]
     expected: FAIL
 
   [`http:` does not subsume other protocols.]
     expected: FAIL
 
   [If scheme source is present in returned csp, it must be specified in required csp too.]
     expected: FAIL
--- a/testing/web-platform/meta/content-security-policy/embedded-enforcement/subsumption_algorithm-none.html.ini
+++ b/testing/web-platform/meta/content-security-policy/embedded-enforcement/subsumption_algorithm-none.html.ini
@@ -1,9 +1,10 @@
 [subsumption_algorithm-none.html]
+  expected: ERROR
   [Required policy that allows `none` does not subsume empty list of policies.]
     expected: FAIL
 
   [Required csp with effective `none` does not subsume a host source expression.]
     expected: FAIL
 
   [Required csp with `none` does not subsume a host source expression.]
     expected: FAIL
--- a/testing/web-platform/meta/content-security-policy/embedded-enforcement/subsumption_algorithm-self.html.ini
+++ b/testing/web-platform/meta/content-security-policy/embedded-enforcement/subsumption_algorithm-self.html.ini
@@ -1,7 +1,8 @@
 [subsumption_algorithm-self.html]
+  expected: ERROR
   [Returned CSP must not allow 'self' if required CSP does not.]
     expected: FAIL
 
   [Returned 'self' should not be subsumed by a more secure version of origin's url.]
     expected: FAIL
 
--- a/testing/web-platform/meta/content-security-policy/embedded-enforcement/subsumption_algorithm-strict_dynamic.html.ini
+++ b/testing/web-platform/meta/content-security-policy/embedded-enforcement/subsumption_algorithm-strict_dynamic.html.ini
@@ -1,4 +1,5 @@
 [subsumption_algorithm-strict_dynamic.html]
+  expected: ERROR
   ['strict-dynamic' has to be allowed by required csp if it is present in returned csp.]
     expected: FAIL
 
--- a/testing/web-platform/meta/content-security-policy/embedded-enforcement/subsumption_algorithm-unsafe_eval.html.ini
+++ b/testing/web-platform/meta/content-security-policy/embedded-enforcement/subsumption_algorithm-unsafe_eval.html.ini
@@ -1,9 +1,10 @@
 [subsumption_algorithm-unsafe_eval.html]
+  expected: ERROR
   [No other keyword has the same effect as 'unsafe-eval'.]
     expected: FAIL
 
   [Other expressions have to be subsumed.]
     expected: FAIL
 
   [Required csp must allow 'unsafe-eval'.]
     expected: FAIL
--- a/testing/web-platform/meta/content-security-policy/embedded-enforcement/subsumption_algorithm-unsafe_hashed_attributes.html.ini
+++ b/testing/web-platform/meta/content-security-policy/embedded-enforcement/subsumption_algorithm-unsafe_hashed_attributes.html.ini
@@ -1,9 +1,10 @@
 [subsumption_algorithm-unsafe_hashed_attributes.html]
+  expected: ERROR
   [No other keyword has the same effect as 'unsafe-hashed-attributes'.]
     expected: FAIL
 
   [Other expressions have to be subsumed.]
     expected: FAIL
 
   [Required csp must allow 'unsafe-hashed-attributes'.]
     expected: FAIL
--- a/testing/web-platform/meta/content-security-policy/embedded-enforcement/subsumption_algorithm-unsafe_inline.html.ini
+++ b/testing/web-platform/meta/content-security-policy/embedded-enforcement/subsumption_algorithm-unsafe_inline.html.ini
@@ -1,9 +1,10 @@
 [subsumption_algorithm-unsafe_inline.html]
+  expected: ERROR
   [Required csp allows `strict-dynamic`, but retuned csp does.]
     expected: FAIL
 
   [Required csp does not allow `unsafe-inline`, but retuned csp does.]
     expected: FAIL
 
   [Returned csp whitelists a nonce.]
     expected: FAIL
--- a/testing/web-platform/meta/cors/304.htm.ini
+++ b/testing/web-platform/meta/cors/304.htm.ini
@@ -1,2 +1,1 @@
 prefs: [network.http.rcwn.enabled:false]
-[304.htm]
deleted file mode 100644
--- a/testing/web-platform/meta/css/CSS2/floats-clear/clear-on-parent-with-margins-no-clearance.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[clear-on-parent-with-margins-no-clearance.html]
-  expected: FAIL
--- a/testing/web-platform/meta/css/cssom-view/cssom-getBoxQuads-001.html.ini
+++ b/testing/web-platform/meta/css/cssom-view/cssom-getBoxQuads-001.html.ini
@@ -1,2 +1,1 @@
 prefs: [layout.css.getBoxQuads.enabled:true, layout.css.convertFromNode.enabled:true]
-[cssom-getBoxQuads-001.html]
--- a/testing/web-platform/meta/css/filter-effects/interfaces.any.js.ini
+++ b/testing/web-platform/meta/css/filter-effects/interfaces.any.js.ini
@@ -24,10 +24,8 @@
     expected: FAIL
 
   [SVGFEGaussianBlurElement interface: attribute edgeMode]
     expected: FAIL
 
   [SVGFEImageElement interface: attribute crossOrigin]
     expected: FAIL
 
-
-[interfaces.any.worker.html]
--- a/testing/web-platform/meta/feature-policy/interfaces.any.js.ini
+++ b/testing/web-platform/meta/feature-policy/interfaces.any.js.ini
@@ -1,6 +1,4 @@
 [interfaces.any.html]
   [HTMLIFrameElement interface: attribute allow]
     expected: FAIL
 
-
-[interfaces.any.worker.html]
--- a/testing/web-platform/meta/fetch/api/basic/conditional-get.html.ini
+++ b/testing/web-platform/meta/fetch/api/basic/conditional-get.html.ini
@@ -1,2 +1,1 @@
 prefs: [network.http.rcwn.enabled:false]
-[conditional-get.html]
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/fetch/api/redirect/redirect-mode-worker.html.ini
@@ -0,0 +1,31 @@
+[redirect-mode-worker.html]
+  [Redirect 301 in follow redirect and cors mode]
+    expected: FAIL
+
+  [Redirect 301 in follow redirect and no-cors mode]
+    expected: FAIL
+
+  [Redirect 302 in follow redirect and cors mode]
+    expected: FAIL
+
+  [Redirect 302 in follow redirect and no-cors mode]
+    expected: FAIL
+
+  [Redirect 303 in follow redirect and cors mode]
+    expected: FAIL
+
+  [Redirect 303 in follow redirect and no-cors mode]
+    expected: FAIL
+
+  [Redirect 307 in follow redirect and cors mode]
+    expected: FAIL
+
+  [Redirect 307 in follow redirect and no-cors mode]
+    expected: FAIL
+
+  [Redirect 308 in follow redirect and cors mode]
+    expected: FAIL
+
+  [Redirect 308 in follow redirect and no-cors mode]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/fetch/api/redirect/redirect-mode.html.ini
@@ -0,0 +1,31 @@
+[redirect-mode.html]
+  [Redirect 301 in follow redirect and cors mode]
+    expected: FAIL
+
+  [Redirect 301 in follow redirect and no-cors mode]
+    expected: FAIL
+
+  [Redirect 302 in follow redirect and cors mode]
+    expected: FAIL
+
+  [Redirect 302 in follow redirect and no-cors mode]
+    expected: FAIL
+
+  [Redirect 303 in follow redirect and cors mode]
+    expected: FAIL
+
+  [Redirect 303 in follow redirect and no-cors mode]
+    expected: FAIL
+
+  [Redirect 307 in follow redirect and cors mode]
+    expected: FAIL
+
+  [Redirect 307 in follow redirect and no-cors mode]
+    expected: FAIL
+
+  [Redirect 308 in follow redirect and cors mode]
+    expected: FAIL
+
+  [Redirect 308 in follow redirect and no-cors mode]
+    expected: FAIL
+
--- a/testing/web-platform/meta/fetch/api/request/request-cache-default.html.ini
+++ b/testing/web-platform/meta/fetch/api/request/request-cache-default.html.ini
@@ -1,2 +1,1 @@
 prefs: [network.http.rcwn.enabled:false]
-[request-cache-default.html]
--- a/testing/web-platform/meta/fetch/api/request/request-cache-force-cache.html.ini
+++ b/testing/web-platform/meta/fetch/api/request/request-cache-force-cache.html.ini
@@ -1,2 +1,1 @@
 prefs: [network.http.rcwn.enabled:false]
-[request-cache-force-cache.html]
--- a/testing/web-platform/meta/fetch/api/request/request-cache-reload.html.ini
+++ b/testing/web-platform/meta/fetch/api/request/request-cache-reload.html.ini
@@ -1,2 +1,1 @@
 prefs: [network.http.rcwn.enabled:false]
-[request-cache-reload.html]
--- a/testing/web-platform/meta/html/syntax/parsing/html5lib_tests15.html.ini
+++ b/testing/web-platform/meta/html/syntax/parsing/html5lib_tests15.html.ini
@@ -6,12 +6,8 @@
     expected: FAIL
 
   [html5lib_tests15.html 8ed7e05d49dfc6701ef8325a5d9504d596d8d083]
     expected: FAIL
 
   [html5lib_tests15.html 938af694979b4eae59e7bd3ab71d76e5254192a0]
     expected: FAIL
 
-
-[html5lib_tests15.html?run_type=write]
-
-[html5lib_tests15.html?run_type=uri]
--- a/testing/web-platform/meta/intersection-observer/timestamp.html.ini
+++ b/testing/web-platform/meta/intersection-observer/timestamp.html.ini
@@ -1,2 +1,1 @@
 prefs: [privacy.reduceTimerPrecision:false]
-[timestamp.html]
deleted file mode 100644
--- a/testing/web-platform/meta/mediacapture-streams/MediaStream-MediaElement-preload-none.https.html.ini
+++ /dev/null
@@ -1,7 +0,0 @@
-[MediaStream-MediaElement-preload-none.https.html]
-  [Test that preload 'none' is ignored for MediaStream object URL used as src]
-    expected: FAIL
-
-  [Test that preload 'none' is ignored for MediaStream used as srcObject]
-    expected: FAIL
-
--- a/testing/web-platform/meta/mozilla-sync
+++ b/testing/web-platform/meta/mozilla-sync
@@ -1,2 +1,2 @@
-local: 797702194ba6779f787eb1a6f67ea0e8653e9819
-upstream: 558c8b5ac689a857cebcb26926589afffbd6b13b
+local: b01a3335924ebcdae4ab7330e0751976cda2ed8c
+upstream: 7d0018e11e9f6b7e58954eb81e46e9dca8fd2f78
--- a/testing/web-platform/meta/requestidlecallback/basic.html.ini
+++ b/testing/web-platform/meta/requestidlecallback/basic.html.ini
@@ -1,2 +1,1 @@
 prefs: [privacy.reduceTimerPrecision:false]
-[basic.html]
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/service-workers/service-worker/fetch-event-redirect.https.html.ini
@@ -0,0 +1,19 @@
+[fetch-event-redirect.https.html]
+  [Non-navigation, manual redirect, no-cors mode Request redirected to same-origin without credentials should fail]
+    expected: FAIL
+
+  [Non-navigation, manual redirect, no-cors mode Request redirected to no-cors without credentials should fail]
+    expected: FAIL
+
+  [Non-navigation, manual redirect, no-cors mode Request redirected to cors without credentials should fail]
+    expected: FAIL
+
+  [Non-navigation, manual redirect, no-cors mode Request redirected to same-origin with credentials should fail]
+    expected: FAIL
+
+  [Non-navigation, manual redirect, no-cors mode Request redirected to no-cors with credentials should fail]
+    expected: FAIL
+
+  [Non-navigation, manual redirect, no-cors mode Request redirected to cors with credentials should fail]
+    expected: FAIL
+
--- a/testing/web-platform/meta/service-workers/service-worker/resource-timing.https.html.ini
+++ b/testing/web-platform/meta/service-workers/service-worker/resource-timing.https.html.ini
@@ -1,2 +1,1 @@
 prefs: [privacy.reduceTimerPrecision:false]
-[resource-timing.https.html]
--- a/testing/web-platform/meta/url/interfaces.any.js.ini
+++ b/testing/web-platform/meta/url/interfaces.any.js.ini
@@ -1,6 +1,4 @@
 [interfaces.any.html]
   [URL interface: legacy window alias]
     expected: FAIL
 
-
-[interfaces.any.worker.html]
--- a/testing/web-platform/meta/web-animations/animation-model/animation-types/accumulation-per-property.html.ini
+++ b/testing/web-platform/meta/web-animations/animation-model/animation-types/accumulation-per-property.html.ini
@@ -1,2 +1,1 @@
 prefs: [layout.css.font-variations.enabled:true, layout.css.overflow-clip-box.enabled:true, layout.css.individual-transform.enabled:true]
-[accumulation-per-property.html]
--- a/testing/web-platform/meta/web-animations/animation-model/animation-types/addition-per-property.html.ini
+++ b/testing/web-platform/meta/web-animations/animation-model/animation-types/addition-per-property.html.ini
@@ -1,2 +1,1 @@
 prefs: [layout.css.font-variations.enabled:true, layout.css.overflow-clip-box.enabled:true, layout.css.individual-transform.enabled:true]
-[addition-per-property.html]
--- a/testing/web-platform/meta/webdriver/tests/execute_async_script/user_prompts.py.ini
+++ b/testing/web-platform/meta/webdriver/tests/execute_async_script/user_prompts.py.ini
@@ -1,24 +1,25 @@
 [user_prompts.py]
   disabled:
     if webrender: bug 1425588
+    if debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): wpt-sync Bug 1453105
+    if not debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): wpt-sync Bug 1453105
   [test_handle_prompt_accept]
     expected: FAIL
 
   [test_handle_prompt_dismiss]
     expected: FAIL
 
   [test_handle_prompt_dismiss_and_notify]
     expected: FAIL
 
   [test_handle_prompt_accept_and_notify]
     expected: FAIL
 
   [test_handle_prompt_ignore]
     expected: FAIL
 
-  [test_handle_prompt_default]
-    expected: FAIL
+  [test_handle_prompt_twice]
+    disabled:
+      if not debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): wpt-sync Bug 1453105
+      if not debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): wpt-sync Bug 1453105
 
-  [test_handle_prompt_twice]
-    expected: FAIL
-
--- a/testing/web-platform/meta/webdriver/tests/execute_script/user_prompts.py.ini
+++ b/testing/web-platform/meta/webdriver/tests/execute_script/user_prompts.py.ini
@@ -1,24 +1,26 @@
 [user_prompts.py]
   disabled:
     if webrender: bug 1425588
+    if debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): wpt-sync Bug 1453105
+    if not debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): wpt-sync Bug 1453105
   [test_handle_prompt_accept]
     expected: FAIL
 
   [test_handle_prompt_dismiss]
     expected: FAIL
 
   [test_handle_prompt_dismiss_and_notify]
     expected: FAIL
 
   [test_handle_prompt_accept_and_notify]
     expected: FAIL
 
   [test_handle_prompt_ignore]
     expected: FAIL
 
-  [test_handle_prompt_default]
-    expected: FAIL
+  [test_handle_prompt_twice]
+    expected:
+      if debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): PASS
+    disabled:
+      if not debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): wpt-sync Bug 1453105
 
-  [test_handle_prompt_twice]
-    expected: FAIL
-
--- a/testing/web-platform/meta/websockets/constructor/014.html.ini
+++ b/testing/web-platform/meta/websockets/constructor/014.html.ini
@@ -1,6 +1,4 @@
 [014.html]
   disabled:
     if (os == "win") and (version == "5.1.2600"): https://bugzilla.mozilla.org/show_bug.cgi?id=1090198
     if e10s and debug: https://bugzilla.mozilla.org/show_bug.cgi?id=1090198
-
-[014.html?wss]
--- a/testing/web-platform/meta/websockets/cookies/006.html.ini
+++ b/testing/web-platform/meta/websockets/cookies/006.html.ini
@@ -1,6 +1,4 @@
 [006.html?wss]
   [WebSockets: setting Secure cookie with document.cookie, checking ws request]
     expected: FAIL
 
-
-[006.html]
--- a/testing/web-platform/meta/workers/WorkerPerformanceNow.html.ini
+++ b/testing/web-platform/meta/workers/WorkerPerformanceNow.html.ini
@@ -1,2 +1,1 @@
 prefs: [privacy.reduceTimerPrecision:false]
-[WorkerPerformanceNow.html]
--- a/testing/web-platform/meta/workers/semantics/navigation/002.html.ini
+++ b/testing/web-platform/meta/workers/semantics/navigation/002.html.ini
@@ -1,2 +1,1 @@
 prefs: [privacy.reduceTimerPrecision:false]
-[002.html]
--- a/testing/web-platform/tests/content-security-policy/embedded-enforcement/support/testharness-helper.sub.js
+++ b/testing/web-platform/tests/content-security-policy/embedded-enforcement/support/testharness-helper.sub.js
@@ -113,17 +113,17 @@ function assert_iframe_with_csp(t, url, 
         loaded[e.data["id"]] = true;
   });
 
   if (shouldBlock) {
     // Assert iframe does not load and is inaccessible.
     window.onmessage = function (e) {
       if (e.source != i.contentWindow)
           return;
-      t.unreached_func('No message should be sent from the frame.');
+      t.assert_unreached('No message should be sent from the frame.');
     }
     i.onload = t.step_func(function () {
       // Delay the check until after the postMessage has a chance to execute.
       setTimeout(t.step_func_done(function () {
         assert_equals(loaded[urlId], undefined);
       }), 1);
       assert_throws("SecurityError", () => {
         var x = i.contentWindow.location.href;
--- a/testing/web-platform/tests/content-security-policy/securitypolicyviolation/idl.html
+++ b/testing/web-platform/tests/content-security-policy/securitypolicyviolation/idl.html
@@ -35,19 +35,19 @@
       readonly    attribute SecurityPolicyViolationEventDisposition      disposition;
       readonly    attribute unsigned short statusCode;
       readonly    attribute long           lineNumber;
       readonly    attribute long           columnNumber;
   };
 </script>
 <script>
   promise_test(async function() {
-    let dom = await fetch('/interfaces/dom.idl').then(r => r.text());
+    const dom = await fetch('/interfaces/dom.idl').then(r => r.text());
 
-    var idl_array = new IdlArray();
+    const idl_array = new IdlArray();
     idl_array.add_untested_idls(document.querySelector('#untested').textContent);
     idl_array.add_untested_idls(dom, { only: ['Event', 'EventInit'] });
     idl_array.add_idls(document.querySelector('#tested').textContent);
     idl_array.add_objects({
       SecurityPolicyViolationEvent: ['new SecurityPolicyViolationEvent({})']
     });
     idl_array.test();
   })
--- a/testing/web-platform/tests/css/CSS2/floats-clear/clear-on-parent-with-margins-no-clearance.html
+++ b/testing/web-platform/tests/css/CSS2/floats-clear/clear-on-parent-with-margins-no-clearance.html
@@ -1,12 +1,12 @@
 <!DOCTYPE html>
 <title>Child of block with clear</title>
 <link rel="author" title="Morten Stenshorne" href="mstensho@chromium.org">
 <link rel="help" href="https://www.w3.org/TR/CSS22/visuren.html#flow-control" title="9.5.2 Controlling flow next to floats: the 'clear' property">
 <link rel="match" href="../../reference/ref-filled-green-100px-square-only.html">
 <p>Test passes if there is a filled green square.</p>
-<div style="position:relative; z-index:-1; top:-50px; width:100px; background:green;">
+<div style="border-top:1px solid white; position:relative; z-index:-1; top:-51px; width:100px; background:green;">
   <div style="float:left; width:100px; height:50px; background:white;"></div>
   <div style="clear:left; margin-top:25px;">
     <div style="height:50px; margin-top:150px; background:white;"></div>
   </div>
 </div>
--- a/testing/web-platform/tests/css/cssom-view/interfaces.html
+++ b/testing/web-platform/tests/css/cssom-view/interfaces.html
@@ -17,17 +17,23 @@
 <script>
 "use strict";
 
 function doTest([html, dom, uievents, cssom, geometry, cssom_view]) {
 
   var idlArray = new IdlArray();
   var svg = "interface SVGElement : Element {};";
   idlArray.add_untested_idls(html + dom + svg + cssom + geometry);
-  idlArray.add_untested_idls(uievents, { only: ['UIEvent', 'UIEventInit', 'MouseEvent', 'MouseEventInit', 'EventModifierInit'] });
+  idlArray.add_untested_idls(uievents, { only: [
+    'UIEvent',
+    'UIEventInit',
+    'MouseEvent',
+    'MouseEventInit',
+    'EventModifierInit']
+  });
   idlArray.add_idls(cssom_view);
 
   idlArray.add_objects({
     "Window": ["window"],
     "MediaQueryList": ["matchMedia('all')"],
     "MediaQueryListEvent": ["new MediaQueryListEvent('change')"],
     "Screen": ["screen"],
     "Document": ["document"],
--- a/testing/web-platform/tests/css/cssom/css-style-attribute-modifications.html
+++ b/testing/web-platform/tests/css/cssom/css-style-attribute-modifications.html
@@ -4,10 +4,13 @@
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <div id="test" style="color: red"></div>
 <script>
 test(function() {
   var el = document.getElementById("test");
   el.style.color = "";
   assert_true(el.hasAttribute("style"));
+
+  el.removeAttribute("style");
+  assert_false(el.hasAttribute("style"));
 }, "Mutating the style declaration doesn't remove the style attribute");
 </script>
--- a/testing/web-platform/tests/css/cssom/interfaces.html
+++ b/testing/web-platform/tests/css/cssom/interfaces.html
@@ -34,17 +34,23 @@ var style_element, svg_element, xmlss_pi
 function doTest([html, dom, uievents, cssom]) {
   style_element = document.getElementById('styleElement');
   svg_element = document.getElementById('svgElement');
   xmlss_pi = document.getElementById('xmlssPiIframe').contentDocument.firstChild;
 
   var idlArray = new IdlArray();
   var svg = "interface SVGElement : Element {};";
   idlArray.add_untested_idls(html + dom + svg);
-  idlArray.add_untested_idls(uievents, { only: ['UIEvent', 'UIEventInit', 'MouseEvent', 'MouseEventInit', 'EventModifierInit']});
+  idlArray.add_untested_idls(uievents, { only: [
+    'UIEvent',
+    'UIEventInit',
+    'MouseEvent',
+    'MouseEventInit',
+    'EventModifierInit'
+  ]});
   idlArray.add_idls(cssom);
 
   idlArray.add_objects({
     "Document": ["document", "new Document()"],
     "StyleSheetList": ["document.styleSheets"],
     "CSSStyleSheet": ["style_element.sheet"],
     "MediaList": ["style_element.sheet.media"],
     "CSSRuleList": ["style_element.sheet.cssRules"],
--- a/testing/web-platform/tests/css/selectors/child-indexed-pseudo-class.html
+++ b/testing/web-platform/tests/css/selectors/child-indexed-pseudo-class.html
@@ -1,41 +1,55 @@
 <!doctype html>
 <meta charset=utf-8>
 <title>Matching of child-indexed pseudo-classes</title>
 <link rel="author" title="Emilio Cobos Álvarez" href="mailto:ecoal95@gmail.com">
 <link rel="help" href="https://drafts.csswg.org/selectors-4/#child-index">
 <script src=/resources/testharness.js></script>
 <script src=/resources/testharnessreport.js></script>
 <script>
-var check = function(element, selectors) {
+var check = function(element, selectors, qsRoot) {
   for (var i = 0; i < selectors.length; ++i) {
     var selector = selectors[i][0];
     var expected = selectors[i][1];
     test(function() {
       assert_equals(expected, element.matches(selector));
+
+      if (qsRoot) {
+        assert_equals(expected, element === qsRoot.querySelector(selector));
+        var qsa = qsRoot.querySelectorAll(selector);
+        assert_equals(expected, !!qsa.length && element === qsa[0]);
+      }
     }, "Expected " + element.tagName + " element to " +
-         (expected ? "match " : "not match ") + selector);
+         (expected ? "match " : "not match ") + selector + " with matches" +
+         (qsRoot ? ", querySelector(), and querySelectorAll()" : ""));
   }
 }
 
 var rootOfSubtreeSelectors = [
   [ ":first-child", true ],
   [ ":last-child", true ],
+  [ ":only-child", true ],
   [ ":first-of-type", true ],
   [ ":last-of-type", true ],
+  [ ":only-of-type", true ],
   [ ":nth-child(1)", true ],
   [ ":nth-child(n)", true ],
   [ ":nth-last-child(1)", true ],
   [ ":nth-last-child(n)", true ],
   [ ":nth-of-type(1)", true ],
   [ ":nth-of-type(n)", true ],
   [ ":nth-last-of-type(1)", true ],
   [ ":nth-last-of-type(n)", true ],
   [ ":nth-child(2)", false ],
   [ ":nth-last-child(2)", false],
   [ ":nth-of-type(2)", false ],
   [ ":nth-last-of-type(2)", false],
 ];
 
-check(document.documentElement, rootOfSubtreeSelectors);
+check(document.documentElement, rootOfSubtreeSelectors, document);
 check(document.createElement('div'), rootOfSubtreeSelectors);
+
+var fragment = document.createDocumentFragment();
+var div = document.createElement('div');
+fragment.appendChild(div);
+check(div, rootOfSubtreeSelectors, fragment);
 </script>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/fetch/api/basic/mediasource.window.js
@@ -0,0 +1,5 @@
+promise_test(t => {
+  const mediaSource = new MediaSource(),
+        mediaSourceURL = URL.createObjectURL(mediaSource);
+  return promise_rejects(t, new TypeError(), fetch(mediaSourceURL));
+}, "Cannot fetch blob: URL from a MediaSource");
--- a/testing/web-platform/tests/fetch/api/redirect/redirect-mode.js
+++ b/testing/web-platform/tests/fetch/api/redirect/redirect-mode.js
@@ -1,41 +1,42 @@
 if (this.document === undefined) {
   importScripts("/resources/testharness.js");
   importScripts("/common/get-host-info.sub.js")
 }
 
-function redirectMode(desc, redirectUrl, redirectLocation, redirectStatus, redirectMode) {
+var redirectUrl = get_host_info().HTTPS_ORIGIN + "/fetch/api/resources/redirect.py";
+var redirectLocation = "top.txt";
+
+function testRedirect(redirectStatus, redirectMode, corsMode) {
   var url = redirectUrl;
   var urlParameters = "?redirect_status=" + redirectStatus;
   urlParameters += "&location=" + encodeURIComponent(redirectLocation);
 
-  var requestInit = {"redirect": redirectMode};
+  var requestInit = {redirect: redirectMode, mode: corsMode};
 
   promise_test(function(test) {
-    if (redirectMode === "error")
+    if (redirectMode === "error" || (corsMode === "no-cors" && redirectMode !== "follow"))
       return promise_rejects(test, new TypeError(), fetch(url + urlParameters, requestInit));
     if (redirectMode === "manual")
       return fetch(url + urlParameters, requestInit).then(function(resp) {
         assert_equals(resp.status, 0, "Response's status is 0");
         assert_equals(resp.type, "opaqueredirect", "Response's type is opaqueredirect");
         assert_equals(resp.statusText, "", "Response's statusText is \"\"");
         assert_equals(resp.url, url + urlParameters, "Response URL should be the original one");
       });
     if (redirectMode === "follow")
       return fetch(url + urlParameters, requestInit).then(function(resp) {
-        assert_true(new URL(resp.url).pathname.endsWith(locationUrl), "Response's url should be the redirected one");
+        assert_true(new URL(resp.url).pathname.endsWith(redirectLocation), "Response's url should be the redirected one");
         assert_equals(resp.status, 200, "Response's status is 200");
       });
     assert_unreached(redirectMode + " is no a valid redirect mode");
-  }, desc);
+  }, "Redirect " + statusCode + " in " + redirectMode + " redirect and " + mode + " mode");
 }
 
-var redirUrl = get_host_info().HTTP_ORIGIN + "/fetch/api/resources/redirect.py";
-var locationUrl = "top.txt";
-
 for (var statusCode of [301, 302, 303, 307, 308]) {
-  redirectMode("Redirect " + statusCode + " in \"error\" mode ", redirUrl, locationUrl, statusCode, "error");
-  redirectMode("Redirect " + statusCode + " in \"follow\" mode ", redirUrl, locationUrl, statusCode, "follow");
-  redirectMode("Redirect " + statusCode + " in \"manual\" mode ", redirUrl, locationUrl, statusCode, "manual");
+  for (var redirect of ["error", "manual", "follow"]) {
+    for (var mode of ["cors", "no-cors"])
+      testRedirect(statusCode, redirect, mode);
+  }
 }
 
 done();
--- a/testing/web-platform/tests/fetch/data-urls/resources/base64.json
+++ b/testing/web-platform/tests/fetch/data-urls/resources/base64.json
@@ -44,16 +44,17 @@
   ["=a", null],
   ["=a=", null],
   ["a=b", null],
   ["a=b=", null],
   ["ab=c", null],
   ["ab=c=", null],
   ["abc=d", null],
   ["abc=d=", null],
+  ["ab\u000Bcd", null],
   ["ab\tcd", [105, 183, 29]],
   ["ab\ncd", [105, 183, 29]],
   ["ab\fcd", [105, 183, 29]],
   ["ab\rcd", [105, 183, 29]],
   ["ab cd", [105, 183, 29]],
   ["ab\u00a0cd", null],
   ["ab\t\n\f\r cd", [105, 183, 29]],
   [" \t\n\f\r ab\t\n\f\r cd\t\n\f\r ", [105, 183, 29]],
--- a/testing/web-platform/tests/fonts/README.md
+++ b/testing/web-platform/tests/fonts/README.md
@@ -1,2 +1,6 @@
 This directory only contains auxiliary font files used by other tests. See
 /css-fonts for tests covering the CSS Fonts Module specification.
+
+The font named `Ahem.ttf` is referenced from the project documentation and the
+CLI's scripts for provisioning virtual machines provided by Sauce Labs. If that
+file is re-located, the references should be updated accordingly.
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/html/browsers/history/joint-session-history/joint-session-history-filler.html
@@ -0,0 +1,1 @@
+<body>Filler</body>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/html/browsers/history/joint-session-history/joint-session-history-remove-iframe.html
@@ -0,0 +1,23 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>Joint session history length does not include entries from a removed iframe.</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<body>
+<iframe id="frame" src="about:blank"></iframe>
+<script>
+async_test(function(t) {
+    t.step_timeout(() => {
+        var child = document.getElementById("frame");
+        var old_history_len = history.length;
+        child.onload = () => {
+            assert_equals(old_history_len + 1, history.length);
+            document.body.removeChild(document.getElementById("frame"));
+            assert_equals(old_history_len, history.length);
+            t.done();
+        }
+        child.src = "joint-session-history-filler.html";
+    }, 1000);
+});
+</script>
+</body>
--- a/testing/web-platform/tests/interfaces/dom.idl
+++ b/testing/web-platform/tests/interfaces/dom.idl
@@ -1,30 +1,32 @@
 [Constructor(DOMString type, optional EventInit eventInitDict),
  Exposed=(Window,Worker)]
 interface Event {
   readonly attribute DOMString type;
   readonly attribute EventTarget? target;
   readonly attribute EventTarget? srcElement;
   readonly attribute EventTarget? currentTarget;
+  sequence<EventTarget> composedPath();
 
   const unsigned short NONE = 0;
   const unsigned short CAPTURING_PHASE = 1;
   const unsigned short AT_TARGET = 2;
   const unsigned short BUBBLING_PHASE = 3;
   readonly attribute unsigned short eventPhase;
 
   void stopPropagation();
   void stopImmediatePropagation();
 
   readonly attribute boolean bubbles;
   readonly attribute boolean cancelable;
            attribute boolean returnValue;
   void preventDefault();
   readonly attribute boolean defaultPrevented;
+  readonly attribute boolean composed;
 
   [Unforgeable] readonly attribute boolean isTrusted;
   readonly attribute DOMTimeStamp timeStamp;
 
   void initEvent(DOMString type, optional boolean bubbles = false, optional boolean cancelable = false);
 };
 
 dictionary EventInit {
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/mediacapture-streams/MediaStream-MediaElement-preload-none-manual.https.html
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <title>Test that the HTMLMediaElement preload 'none' attribute value is ignored for MediaStream used as srcObject and MediaStream object URLs used as src.</title>
+        <link rel="author" title="Matthew Wolenetz" href="mailto:wolenetz@chromium.org"/>
+        <script src="/resources/testharness.js"></script>
+        <script src="/resources/testharnessreport.js"></script>
+    </head>
+    <body>
+        <p class="instructions">When prompted, accept to share your audio and video streams.</p>
+        <p class="instructions">This test checks that the HTMLMediaElement preload 'none' attribute value is ignored for MediaStream used as srcObject and MediaStream object URLs used as src.</p>
+        <div id=log></div>
+
+        <audio preload="none"></audio>
+        <video preload="none"></video>
+
+        <script>
+            function testPreloadNone(t, mediaElement, setSourceStreamFunc)
+            {
+                // The optional deferred load steps (for preload none) for MediaStream resources should be skipped.
+                mediaElement.addEventListener("suspend", t.unreached_func("'suspend' should not be fired."));
+                mediaElement.addEventListener("error", t.step_func(function() {
+                  assert_unreached("'error' should not be fired, code=" + mediaElement.error.code);
+                }));
+
+                mediaElement.addEventListener("loadeddata", t.step_func(function()
+                {
+                    assert_equals(mediaElement.networkState, mediaElement.NETWORK_LOADING);
+                    t.done();
+                }));
+
+                setSourceStreamFunc();
+                assert_equals(mediaElement.networkState, mediaElement.NETWORK_NO_SOURCE); // Resource selection is active.
+            }
+
+            async_test(function(t)
+            {
+                var aud = document.querySelector("audio");
+                navigator.mediaDevices.getUserMedia({audio:true})
+                  .then(t.step_func(function(stream)
+                  {
+                      testPreloadNone(t, aud, t.step_func(function() { aud.srcObject = stream; }));
+                  }),
+                  t.unreached_func("getUserMedia error callback was invoked."));
+            }, "Test that preload 'none' is ignored for MediaStream object URL used as srcObject for audio");
+
+            async_test(function(t)
+            {
+                var vid = document.querySelector("video");
+                navigator.mediaDevices.getUserMedia({video:true})
+                  .then(t.step_func(function(stream)
+                  {
+                      testPreloadNone(t, vid, t.step_func(function() { vid.srcObject = stream; }));
+                  }), t.unreached_func("getUserMedia error callback was invoked."));
+            }, "Test that preload 'none' is ignored for MediaStream used as srcObject for video");
+        </script>
+    </body>
+</html>
deleted file mode 100644
--- a/testing/web-platform/tests/mediacapture-streams/MediaStream-MediaElement-preload-none.https.html
+++ /dev/null
@@ -1,63 +0,0 @@
-<!DOCTYPE html>
-<!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
-<html>
-    <head>
-        <title>Test that the HTMLMediaElement preload 'none' attribute value is ignored for MediaStream used as srcObject and MediaStream object URLs used as src.</title>>
-        <link rel="author" title="Matthew Wolenetz" href="mailto:wolenetz@chromium.org"/>
-        <script src="/resources/testharness.js"></script>
-        <script src="/resources/testharnessreport.js"></script>
-    </head>
-    <body>
-        <p class="instructions">When prompted, accept to share your audio and video streams.</p>
-        <h1 class="instructions">Description</h1>
-        <p class="instructions">This test checks that the HTMLMediaElement preload 'none' attribute value is ignored for MediaStream used as srcObject and MediaStream object URLs used as src.</p>
-
-        <audio preload="none"></audio>
-        <video preload="none"></video>
-
-        <script>
-            function testPreloadNone(t, mediaElement, setSourceStreamFunc)
-            {
-                // The optional deferred load steps (for preload none) for MediaStream resources should be skipped.
-                mediaElement.addEventListener("suspend", t.unreached_func("'suspend' should not be fired."));
-                mediaElement.addEventListener("error", t.step_func(function() {
-                  assert_unreached("'error' should not be fired, code=" + mediaElement.error.code);
-                }));
-
-                mediaElement.addEventListener("loadeddata", t.step_func(function()
-                {
-                    assert_equals(mediaElement.networkState, mediaElement.NETWORK_LOADING);
-                    t.done();
-                }));
-
-                setSourceStreamFunc();
-                assert_equals(mediaElement.networkState, mediaElement.NETWORK_NO_SOURCE); // Resource selection is active.
-            }
-
-            async_test(function(t)
-            {
-                var aud = document.querySelector("audio");
-                navigator.mediaDevices.getUserMedia({audio:true})
-                  .then(t.step_func(function(stream)
-                  {
-                      testPreloadNone(t, aud, t.step_func(function()
-                      {
-                          aud.src = URL.createObjectURL(stream);
-                          t.add_cleanup(function() { URL.revokeObjectURL(aud.src); });
-                      }));
-                  }),
-                  t.unreached_func("getUserMedia error callback was invoked."));
-            }, "Test that preload 'none' is ignored for MediaStream object URL used as src");
-
-            async_test(function(t)
-            {
-                var vid = document.querySelector("video");
-                navigator.mediaDevices.getUserMedia({video:true})
-                  .then(t.step_func(function(stream)
-                  {
-                      testPreloadNone(t, vid, t.step_func(function() { vid.srcObject = stream; }));
-                  }), t.unreached_func("getUserMedia error callback was invoked."));
-            }, "Test that preload 'none' is ignored for MediaStream used as srcObject");
-        </script>
-    </body>
-</html>
--- a/testing/web-platform/tests/mediacapture-streams/historical.html
+++ b/testing/web-platform/tests/mediacapture-streams/historical.html
@@ -10,9 +10,14 @@ test(function() {
 
 test(function() {
   assert_false("webkitGetUserMedia" in navigator);
 }, "navigator.webkitGetUserMedia should not exist");
 
 test(function() {
   assert_false("mozGetUserMedia" in navigator);
 }, "navigator.mozGetUserMedia should not exist");
+
+test(() => {
+  const mediaStream = new MediaStream();
+  assert_throws(new TypeError(), () => URL.createObjectURL(mediaStream));
+}, "Passing MediaStream to URL.createObjectURL() should throw");
 </script>
--- a/testing/web-platform/tests/pointerevents/extension/idlharness.html
+++ b/testing/web-platform/tests/pointerevents/extension/idlharness.html
@@ -47,16 +47,21 @@ interface PointerEvent : MouseEvent {
 };
 
 </pre>
 <script>
 promise_test(async function () {
   const dom = await fetch('/interfaces/dom.idl').then(r => r.text());
   const uievents = await fetch('/interfaces/uievents.idl').then(r => r.text());
 
-  var idl_array = new IdlArray();
+  const idl_array = new IdlArray();
   idl_array.add_untested_idls(dom, { only: ['EventInit'] });
-  idl_array.add_untested_idls(uievents, { only: ['UIEventInit', 'MouseEventInit', 'EventModifierInit'] });
-  idl_array.add_untested_idls(document.getElementById("untested_idl").textContent);
+  idl_array.add_untested_idls(uievents, { only: [
+    'UIEventInit',
+    'MouseEventInit',
+    'EventModifierInit']
+  });
+  idl_array.add_untested_idls(
+      document.getElementById("untested_idl").textContent);
   idl_array.add_idls(document.getElementById("idl").textContent);
   idl_array.test();
 }, 'pointerevents extension interfaces');
 </script>
--- a/testing/web-platform/tests/pointerevents/idlharness.html
+++ b/testing/web-platform/tests/pointerevents/idlharness.html
@@ -90,20 +90,25 @@ partial interface Navigator {
     readonly attribute long maxTouchPoints;
 };
 </pre>
 <script>
   promise_test(async function() {
     const dom = await fetch('/interfaces/dom.idl').then(r => r.text());
     const uievents = await fetch('/interfaces/uievents.idl').then(r => r.text());
 
-    var idl_array = new IdlArray();
+    const idl_array = new IdlArray();
     idl_array.add_untested_idls(dom, { only: ['EventInit'] });
-    idl_array.add_untested_idls(uievents, { only: ['UIEventInit', 'MouseEventInit', 'EventModifierInit'] });
-    idl_array.add_untested_idls(document.getElementById("untested_idl").textContent);
+    idl_array.add_untested_idls(uievents, { only: [
+      'UIEventInit',
+      'MouseEventInit',
+      'EventModifierInit']
+    });
+    idl_array.add_untested_idls(
+        document.getElementById("untested_idl").textContent);
     idl_array.add_idls(document.getElementById("idl").textContent);
 
     // Note that I don't bother including Document here because there are still
     // a bunch of differences between browsers around Document vs HTMLDocument.
     idl_array.add_objects({
     Window: ["window"],
     Navigator: ["navigator"]});
     idl_array.test();
--- a/testing/web-platform/tests/resource-timing/resources/TAOResponse.py
+++ b/testing/web-platform/tests/resource-timing/resources/TAOResponse.py
@@ -15,24 +15,24 @@ def main(request, response):
         response.headers.set('Timing-Allow-Origin', 'null')
     elif tao == 'origin':
     # case-sensitive match for origin, pass
         response.headers.set('Timing-Allow-Origin', origin)
     elif tao == 'space':
     # space seperated list of origin and wildcard, fail
         response.headers.set('Timing-Allow-Origin', (origin + ' *'))
     elif tao == 'multi':
-    # more than one TAO values, seperated by common, pass
+    # more than one TAO values, seperated by comma, pass
         response.headers.set('Timing-Allow-Origin', origin)
         response.headers.append('Timing-Allow-Origin', '*')
     elif tao == 'match_origin':
-    # contains a match of origin, seperated by common, pass
+    # contains a match of origin, seperated by comma, pass
         response.headers.set('Timing-Allow-Origin', origin)
         response.headers.append('Timing-Allow-Origin', "fake")
     elif tao == 'match_wildcard':
-    # contains a wildcard, seperated by common, pass
+    # contains a wildcard, seperated by comma, pass
         response.headers.set('Timing-Allow-Origin', "fake")
         response.headers.append('Timing-Allow-Origin', '*')
     elif tao == 'uppercase':
     # non-case-sensitive match for origin, fail
         response.headers.set('Timing-Allow-Origin', origin.upper())
     else:
-        pass
\ No newline at end of file
+        pass
--- a/testing/web-platform/tests/service-workers/service-worker/fetch-event-redirect.https.html
+++ b/testing/web-platform/tests/service-workers/service-worker/fetch-event-redirect.https.html
@@ -207,55 +207,52 @@ promise_test(function(t) {
     redirect_dest: 'same-origin',
     url_credentials: false,
     expected_type: 'opaqueredirect',
     expected_redirected: false,
     request_init: {
       redirect: 'manual',
       mode: 'no-cors'
     },
-    should_reject: false
+    should_reject: true
   });
 }, 'Non-navigation, manual redirect, no-cors mode Request redirected to ' +
-   'same-origin without credentials should succeed opaqueredirect interception ' +
-   'and response should not be redirected');
+   'same-origin without credentials should fail');
 
 promise_test(function(t) {
   return redirect_fetch_test(t, {
     name: 'nonav-manual-nocors-redirects-to-nocors-nocreds',
     redirect_dest: 'no-cors',
     url_credentials: false,
     expected_type: 'opaqueredirect',
     expected_redirected: false,
     request_init: {
       redirect: 'manual',
       mode: 'no-cors'
     },
-    should_reject: false
+    should_reject: true
   });
 }, 'Non-navigation, manual redirect, no-cors mode Request redirected to ' +
-   'no-cors without credentials should succeed interception ' +
-   'and response should not be redirected');
+   'no-cors without credentials should fail');
 
 promise_test(function(t) {
   return redirect_fetch_test(t, {
     name: 'nonav-manual-nocors-redirects-to-cors-nocreds',
     redirect_dest: 'cors',
     url_credentials: false,
     expected_type: 'opaqueredirect',
     expected_redirected: false,
     request_init: {
       redirect: 'manual',
       mode: 'no-cors'
     },
-    should_reject: false
+    should_reject: true
   });
 }, 'Non-navigation, manual redirect, no-cors mode Request redirected to ' +
-   'cors without credentials should succeed interception ' +
-   'and response should not be redirected');
+   'cors without credentials should fail');
 
 promise_test(function(t) {
   return redirect_fetch_test(t, {
     name: 'nonav-manual-cors-redirects-to-sameorigin-creds',
     redirect_dest: 'same-origin',
     url_credentials: true,
     expected_type: 'opaqueredirect',
     expected_redirected: false,
@@ -360,55 +357,52 @@ promise_test(function(t) {
     redirect_dest: 'same-origin',
     url_credentials: true,
     expected_type: 'opaqueredirect',
     expected_redirected: false,
     request_init: {
       redirect: 'manual',
       mode: 'no-cors'
     },
-    should_reject: false
+    should_reject: true
   });
 }, 'Non-navigation, manual redirect, no-cors mode Request redirected to ' +
-   'same-origin with credentials should succeed opaqueredirect interception ' +
-   'and response should not be redirected');
+   'same-origin with credentials should fail');
 
 promise_test(function(t) {
   return redirect_fetch_test(t, {
     name: 'nonav-manual-nocors-redirects-to-nocors-creds',
     redirect_dest: 'no-cors',
     url_credentials: true,
     expected_type: 'opaqueredirect',
     expected_redirected: false,
     request_init: {
       redirect: 'manual',
       mode: 'no-cors'
     },
-    should_reject: false
+    should_reject: true
   });
 }, 'Non-navigation, manual redirect, no-cors mode Request redirected to ' +
-   'no-cors with credentials should succeed interception ' +
-   'and response should not be redirected');
+   'no-cors with credentials should fail');
 
 promise_test(function(t) {
   return redirect_fetch_test(t, {
     name: 'nonav-manual-nocors-redirects-to-cors-creds',
     redirect_dest: 'cors',
     url_credentials: true,
     expected_type: 'opaqueredirect',
     expected_redirected: false,
     request_init: {
       redirect: 'manual',
       mode: 'no-cors'
     },
-    should_reject: false
+    should_reject: true
   });
 }, 'Non-navigation, manual redirect, no-cors mode Request redirected to ' +
-   'cors with credentials should succeed interception ' +
-   'and response should not be redirected');
+   'cors with credentials should fail');
 
 promise_test(function(t) {
   return redirect_fetch_test(t, {
     name: 'nonav-follow-cors-redirects-to-sameorigin-nocreds',
     redirect_dest: 'same-origin',
     url_credentials: false,
     expected_type: 'basic',
     expected_redirected: true,
--- a/testing/web-platform/tests/service-workers/service-worker/fetch-request-resources.https.html
+++ b/testing/web-platform/tests/service-workers/service-worker/fetch-request-resources.https.html
@@ -20,105 +20,112 @@ function image_test(frame, url, cross_or
                     expected_credentials) {
   var actual_url = url + (++url_count);
   expected_results[actual_url] = {
       cross_origin: cross_origin,
       mode: expected_mode,
       credentials: expected_credentials,
       redirect: 'follow',
       integrity: '',
+      destination: 'image',
       message: 'Image load (url:' +
                actual_url + ' cross_origin:' + cross_origin + ')'
     };
   frame.contentWindow.load_image(actual_url, cross_origin);
   return add_promise_to_test(actual_url);
 }
 
 function script_test(frame, url, cross_origin, expected_mode,
                      expected_credentials) {
   var actual_url = url + (++url_count);
   expected_results[actual_url] = {
       cross_origin: cross_origin,
       mode: expected_mode,
       credentials: expected_credentials,
       redirect: 'follow',
       integrity: '',
+      destination: 'script',
       message: 'Script load (url:' +
                actual_url + ' cross_origin:' + cross_origin + ')'
     };
   frame.contentWindow.load_script(actual_url, cross_origin);
   return add_promise_to_test(actual_url);
 }
 
 function css_test(frame, url, cross_origin, expected_mode,
                   expected_credentials) {
   var actual_url = url + (++url_count);
   expected_results[actual_url] = {
       cross_origin: cross_origin,
       mode: expected_mode,
       credentials: expected_credentials,
       redirect: 'follow',
       integrity: '',
+      destination: 'style',
       message: 'CSS load (url:' +
                actual_url + ' cross_origin:' + cross_origin + ')'
     };
   frame.contentWindow.load_css(actual_url, cross_origin);
   return add_promise_to_test(actual_url);
 }
 
 function font_face_test(frame, url, expected_mode, expected_credentials) {
   var actual_url = url + (++url_count);
   expected_results[actual_url] = {
       url: actual_url,
       mode: expected_mode,
       credentials: expected_credentials,
       redirect: 'follow',
       integrity: '',
+      destination: 'font',
       message: 'FontFace load (url:' + actual_url + ')'
     };
   frame.contentWindow.load_font(actual_url);
   return add_promise_to_test(actual_url);
 }
 
 function script_integrity_test(frame, url, integrity, expected_integrity) {
   var actual_url = url + (++url_count);
   expected_results[actual_url] = {
       url: actual_url,
       mode: 'no-cors',
       credentials: 'include',
       redirect: 'follow',
       integrity: expected_integrity,
+      destination: 'script',
       message: 'Script load (url:' + actual_url + ')'
     };
   frame.contentWindow.load_script_with_integrity(actual_url, integrity);
   return add_promise_to_test(actual_url);
 }
 
 function css_integrity_test(frame, url, integrity, expected_integrity) {
   var actual_url = url + (++url_count);
   expected_results[actual_url] = {
       url: actual_url,
       mode: 'no-cors',
       credentials: 'include',
       redirect: 'follow',
       integrity: expected_integrity,
+      destination: 'style',
       message: 'CSS load (url:' + actual_url + ')'
     };
   frame.contentWindow.load_css_with_integrity(actual_url, integrity);
   return add_promise_to_test(actual_url);
 }
 
 function fetch_test(frame, url, mode, credentials,
                     expected_mode, expected_credentials) {
   var actual_url = url + (++url_count);
   expected_results[actual_url] = {
       mode: expected_mode,
       credentials: expected_credentials,
       redirect: 'follow',
       integrity: '',
+      destination: '',
       message: 'fetch (url:' + actual_url + ' mode:' + mode + ' credentials:' +
                credentials + ')'
     };
   frame.contentWindow.fetch(
       new Request(actual_url, {mode: mode, credentials: credentials})).then(() => {
       }, () => { });
   return add_promise_to_test(actual_url);
 }
@@ -126,23 +133,41 @@ function fetch_test(frame, url, mode, cr
 function audio_test(frame, url, cross_origin,
                     expected_mode, expected_credentials) {
   var actual_url = url + (++url_count);
   expected_results[actual_url] = {
       mode: expected_mode,
       credentials: expected_credentials,
       redirect: 'follow',
       integrity: '',
+      destination: 'audio',
       message: 'Audio load (url:' + actual_url + ' cross_origin:' +
                cross_origin + ')'
     };
   frame.contentWindow.load_audio(actual_url, cross_origin);
   return add_promise_to_test(actual_url);
 }
 
+
+function video_test(frame, url, cross_origin,
+                    expected_mode, expected_credentials) {
+  var actual_url = url + (++url_count);
+  expected_results[actual_url] = {
+      mode: expected_mode,
+      credentials: expected_credentials,
+      redirect: 'follow',
+      integrity: '',
+      destination: 'video',
+      message: 'Video load (url:' + actual_url + ' cross_origin:' +
+               cross_origin + ')'
+    };
+  frame.contentWindow.load_video(actual_url, cross_origin);
+  return add_promise_to_test(actual_url);
+}
+
 promise_test(function(t) {
     var SCOPE = 'resources/fetch-request-resources-iframe.https.html';
     var SCRIPT = 'resources/fetch-request-resources-worker.js';
     var host_info = get_host_info();
     var LOCAL_URL =
       host_info['HTTPS_ORIGIN'] + base_path() + 'resources/dummy?test';
     var REMOTE_URL =
       host_info['HTTPS_REMOTE_ORIGIN'] + base_path() + 'resources/dummy?test';
@@ -178,16 +203,20 @@ promise_test(function(t) {
                    assert_equals(
                     result.redirect, expected.redirect,
                     'redirect mode of ' + expected.message +  ' must be ' +
                     expected.redirect + '.');
                   assert_equals(
                     result.integrity, expected.integrity,
                     'integrity of ' + expected.message +  ' must be ' +
                     expected.integrity + '.');
+                  assert_equals(
+                    result.destination, expected.destination,
+                    'destination of ' + expected.message +  ' must be ' +
+                    expected.destination + '.');
                 }, expected.message);
                 expected.resolve();
                 delete expected_results[result.url];
               });
               worker.postMessage(
                 {port: channel.port2}, [channel.port2]);
             });
         })
@@ -263,13 +292,20 @@ promise_test(function(t) {
 
         await audio_test(f, LOCAL_URL, '', 'no-cors', 'include');
         await audio_test(f, LOCAL_URL, 'anonymous', 'cors', 'same-origin');
         await audio_test(f, LOCAL_URL, 'use-credentials', 'cors', 'include');
         await audio_test(f, REMOTE_URL, '', 'no-cors', 'include');
         await audio_test(f, REMOTE_URL, 'anonymous', 'cors', 'same-origin');
         await audio_test(f, REMOTE_URL, 'use-credentials', 'cors', 'include');
 
+        await video_test(f, LOCAL_URL, '', 'no-cors', 'include');
+        await video_test(f, LOCAL_URL, 'anonymous', 'cors', 'same-origin');
+        await video_test(f, LOCAL_URL, 'use-credentials', 'cors', 'include');
+        await video_test(f, REMOTE_URL, '', 'no-cors', 'include');
+        await video_test(f, REMOTE_URL, 'anonymous', 'cors', 'same-origin');
+        await video_test(f, REMOTE_URL, 'use-credentials', 'cors', 'include');
+
         frame.remove();
         service_worker_unregister(t, SCOPE);
       }).catch(unreached_rejection(t));
   }, 'Verify FetchEvent for resources.');
 </script>
--- a/testing/web-platform/tests/service-workers/service-worker/resources/fetch-request-resources-iframe.https.html
+++ b/testing/web-platform/tests/service-workers/service-worker/resources/fetch-request-resources-iframe.https.html
@@ -66,10 +66,19 @@ function load_css_with_integrity(url, in
 function load_audio(url, cross_origin) {
   var audio = document.createElement('audio');
   if (cross_origin != '') {
     audio.crossOrigin = cross_origin;
   }
   audio.src = url;
   document.body.appendChild(audio);
 }
+
+function load_video(url, cross_origin) {
+  var video = document.createElement('video');
+  if (cross_origin != '') {
+    video.crossOrigin = cross_origin;
+  }
+  video.src = url;
+  document.body.appendChild(video);
+}
 </script>
 </body>
--- a/testing/web-platform/tests/service-workers/service-worker/resources/fetch-request-resources-worker.js
+++ b/testing/web-platform/tests/service-workers/service-worker/resources/fetch-request-resources-worker.js
@@ -14,12 +14,13 @@ self.addEventListener('fetch', function(
     if (url.indexOf('dummy?test') == -1) {
       return;
     }
     port.postMessage({
         url: url,
         mode: event.request.mode,
         redirect: event.request.redirect,
         credentials: event.request.credentials,
-        integrity: event.request.integrity
+        integrity: event.request.integrity,
+        destination: event.request.destination
       });
     event.respondWith(Promise.reject());
   });
--- a/testing/web-platform/tests/shadow-dom/Extensions-to-Event-Interface.html
+++ b/testing/web-platform/tests/shadow-dom/Extensions-to-Event-Interface.html
@@ -9,37 +9,27 @@
 <script src="/resources/testharnessreport.js"></script>
 <script src="resources/event-path-test-helpers.js"></script>
 </head>
 <body>
 <div id="log"></div>
 <script>
 
 test(function () {
-    assert_true('composedPath' in Event.prototype);
-    assert_true('composedPath' in new Event('my-event'));
-}, 'composedPath() must exist on Event');
-
-test(function () {
     var event = new Event('my-event');
     assert_array_equals(event.composedPath(), []);
 }, 'composedPath() must return an empty array when the event has not been dispatched');
 
 test(function () {
     var event = new Event('my-event');
     document.body.dispatchEvent(event);
     assert_array_equals(event.composedPath(), []);
 }, 'composedPath() must return an empty array when the event is no longer dispatched');
 
 test(function () {
-    assert_true('composed' in Event.prototype);
-    assert_true('composed' in new Event('my-event'));
-}, 'composed must exist on Event');
-
-test(function () {
     var event = new Event('my-event');
     assert_false(event.composed);
 }, 'composed on EventInit must default to false');
 
 test(function () {
     var event = new Event('my-event', {composed: true});
     assert_true(event.composed);
 
--- a/testing/web-platform/tests/shadow-dom/resources/event-path-test-helpers.js
+++ b/testing/web-platform/tests/shadow-dom/resources/event-path-test-helpers.js
@@ -11,19 +11,16 @@ function dispatchEventWithEventLog(shado
         for (var node = startingNode; node; node = node.parentNode) {
             if (attachedNodes.indexOf(node) >= 0)
                 continue;
             attachedNodes.push(node);
             node.addEventListener(event.type, (function (event) {
                 eventPath.push(this.label);
                 relatedTargets.push(event.relatedTarget ? event.relatedTarget.label : null);
 
-                if (!event.composedPath) // Don't fail all tests just for the lack of composedPath.
-                    return;
-
                 pathAtTargets.push(event.composedPath().map(function (node) { return node.label; }));
                 targets.push(event.target);
             }).bind(node));
         }
     }
 
     target.dispatchEvent(event);
 
--- a/testing/web-platform/tests/tools/manifest/tests/test_sourcefile.py
+++ b/testing/web-platform/tests/tools/manifest/tests/test_sourcefile.py
@@ -390,17 +390,17 @@ def test_testharness_svg():
 
     assert not s.name_is_non_test
     assert not s.name_is_manual
     assert not s.name_is_visual
     assert not s.name_is_multi_global
     assert not s.name_is_worker
     assert not s.name_is_reference
 
-    assert s.root
+    assert s.root is not None
     assert s.content_is_testharness
 
     assert items(s) == [("testharness", "/" + filename)]
 
 
 def test_relative_testharness_svg():
     content = b"""\
 <?xml version="1.0" encoding="UTF-8"?>
@@ -419,17 +419,17 @@ def test_relative_testharness_svg():
 
     assert not s.name_is_non_test
     assert not s.name_is_manual
     assert not s.name_is_visual
     assert not s.name_is_multi_global
     assert not s.name_is_worker
     assert not s.name_is_reference
 
-    assert s.root
+    assert s.root is not None
     assert not s.content_is_testharness
 
     assert items(s) == []
 
 
 @pytest.mark.parametrize("filename", ["test", "test.test"])
 def test_testharness_ext(filename):
     content = b"<script src=/resources/testharness.js></script>"
--- a/testing/web-platform/tests/tools/wptrunner/wptrunner/browsers/sauce_setup/edge-prerun.bat
+++ b/testing/web-platform/tests/tools/wptrunner/wptrunner/browsers/sauce_setup/edge-prerun.bat
@@ -1,2 +1,9 @@
 @echo off
 reg add "HKCU\Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\AppContainer\Storage\microsoft.microsoftedge_8wekyb3d8bbwe\MicrosoftEdge\New Windows" /v "PopupMgr" /t REG_SZ /d no
+
+
+REM Download and install the Ahem font
+REM - https://wiki.saucelabs.com/display/DOCS/Downloading+Files+to+a+Sauce+Labs+Virtual+Machine+Prior+to+Testing
+REM - https://superuser.com/questions/201896/how-do-i-install-a-font-from-the-windows-command-prompt
+bitsadmin.exe /transfer "JobName" https://github.com/w3c/web-platform-tests/raw/master/fonts/Ahem.ttf "%WINDIR%\Fonts\Ahem.ttf"
+reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts" /v "Ahem (TrueType)" /t REG_SZ /d Ahem.ttf /f
--- a/testing/web-platform/tests/tools/wptrunner/wptrunner/browsers/sauce_setup/safari-prerun.sh
+++ b/testing/web-platform/tests/tools/wptrunner/wptrunner/browsers/sauce_setup/safari-prerun.sh
@@ -1,2 +1,3 @@
 #!/bin/bash
+curl https://raw.githubusercontent.com/w3c/web-platform-tests/master/fonts/Ahem.ttf > ~/Library/Fonts/Ahem.ttf
 defaults write com.apple.Safari com.apple.Safari.ContentPageGroupIdentifier.WebKit2JavaScriptCanOpenWindowsAutomatically -bool true
deleted file mode 100644
--- a/testing/web-platform/tests/webaudio/the-audio-api/the-delaynode-interface/idl-test.html
+++ /dev/null
@@ -1,159 +0,0 @@
-<!DOCTYPE html>
-<html class="a">
-<head>
-<title>DelayNode IDL Test</title>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/idlharness.js"></script>
-<script src="/resources/WebIDLParser.js"></script>
-<script src="/webaudio/js/helpers.js"></script>
-<style type="text/css">
-    #event-target-idl,
-    #base-audio-context-idl,
-    #audio-node-idl,
-    #audio-param-idl
-    { visibility:hidden; height: 0px;}
-  </style>
-</head>
-<body class="a">
-
-   <pre id="event-target-idl">interface EventTarget {
-  void addEventListener(DOMString type, EventListener? callback, optional boolean capture = false);
-  void removeEventListener(DOMString type, EventListener? callback, optional boolean capture = false);
-  boolean dispatchEvent(Event event);
-};
-
-/*
-callback interface EventListener {
-  void handleEvent(Event event);
-};
-*/
-// Callback interfaces are not supported yet, but that's ok
-interface EventListener {};
-</pre>
-
-   <pre id="base-audio-context-idl">callback DecodeErrorCallback = void (DOMException error);
-
-callback DecodeSuccessCallback = void (AudioBuffer decodedData);
-
-interface BaseAudioContext : EventTarget {
-    readonly        attribute AudioDestinationNode destination;
-    readonly        attribute float                sampleRate;
-    readonly        attribute double               currentTime;
-    readonly        attribute AudioListener        listener;
-    readonly        attribute AudioContextState    state;
-    readonly        attribute double               baseLatency;
-    Promise<void>          resume ();
-                    attribute EventHandler         onstatechange;
-    AudioBuffer            createBuffer (unsigned long numberOfChannels, unsigned long length, float sampleRate);
-    Promise<AudioBuffer>   decodeAudioData (ArrayBuffer audioData, optional DecodeSuccessCallback successCallback, optional DecodeErrorCallback errorCallback);
-    AudioBufferSourceNode  createBufferSource ();
-    ConstantSourceNode     createConstantSource ();
-    ScriptProcessorNode    createScriptProcessor (optional unsigned long bufferSize = 0
-              , optional unsigned long numberOfInputChannels = 2
-              , optional unsigned long numberOfOutputChannels = 2
-              );
-    AnalyserNode           createAnalyser ();
-    GainNode               createGain ();
-    DelayNode              createDelay (optional double maxDelayTime);
-    BiquadFilterNode       createBiquadFilter ();
-    IIRFilterNode          createIIRFilter (sequence<double> feedforward, sequence<double> feedback);
-    WaveShaperNode         createWaveShaper ();
-    PannerNode             createPanner ();
-    StereoPannerNode       createStereoPanner ();
-    ConvolverNode          createConvolver ();
-    ChannelSplitterNode    createChannelSplitter (optional unsigned long numberOfOutputs = 6
-              );
-    ChannelMergerNode      createChannelMerger (optional unsigned long numberOfInputs = 6
-              );
-    DynamicsCompressorNode createDynamicsCompressor ();
-    OscillatorNode         createOscillator ();
-    PeriodicWave           createPeriodicWave (Float32Array real, Float32Array imag, optional PeriodicWaveConstraints constraints);
-};</pre>
-
-   <pre id="audio-node-idl">enum ChannelCountMode {
-    "max",
-    "clamped-max",
-    "explicit"
-};
-
-enum ChannelInterpretation {
-    "speakers",
-    "discrete"
-};
-
-interface AudioNode : EventTarget {
-
-    void connect(AudioNode destination, optional unsigned long output = 0, optional unsigned long input = 0);
-    void connect(AudioParam destination, optional unsigned long output = 0);
-    void disconnect(optional unsigned long output = 0);
-
-    readonly attribute BaseAudioContext context;
-    readonly attribute unsigned long numberOfInputs;
-    readonly attribute unsigned long numberOfOutputs;
-
-    // Channel up-mixing and down-mixing rules for all inputs.
-    attribute unsigned long channelCount;
-    attribute ChannelCountMode channelCountMode;
-    attribute ChannelInterpretation channelInterpretation;
-
-};</pre>
-
-   <pre id="audio-param-idl">interface AudioParam {
-
-                    attribute float value;
-    readonly        attribute float defaultValue;
-    readonly        attribute float minValue;
-    readonly        attribute float maxValue;
-
-    // Parameter automation.
-    void setValueAtTime(float value, double startTime);
-    void linearRampToValueAtTime(float value, double endTime);
-    void exponentialRampToValueAtTime(float value, double endTime);
-
-    // Exponentially approach the target value with a rate having the given time constant.
-    void setTargetAtTime(float target, double startTime, double timeConstant);
-
-    // Sets an array of arbitrary parameter values starting at time for the given duration.
-    // The number of values will be scaled to fit into the desired duration.
-    void setValueCurveAtTime(Float32Array values, double startTime, double duration);
-
-    // Cancels all scheduled parameter changes with times greater than or equal to startTime.
-    void cancelScheduledValues(double startTime);
-
-};</pre>
-
-<pre id="delay-node-idl">dictionary DelayOptions : AudioNodeOptions {
-             double maxDelayTime = 1;
-             double delayTime = 0;
-};
-
-[Constructor(BaseAudioContext context, optional DelayOptions options)]
-interface DelayNode : AudioNode {
-
-    readonly attribute AudioParam delayTime;
-
-};</pre>
-
-  <div id="log"></div>
-
-  <script>
-promise_test(async function() {
-  const webAudioApi = await fetch('/interfaces/web-audio-api.idl').then(r => r.text());
-
-  var idl_array = new IdlArray();
-  idl_array.add_untested_idls(webAudioApi, { only: ['AudioNodeOptions']});
-  idl_array.add_untested_idls(document.getElementById("event-target-idl").textContent);
-  idl_array.add_untested_idls(document.getElementById("base-audio-context-idl").textContent);
-  idl_array.add_untested_idls(document.getElementById("audio-node-idl").textContent);
-  idl_array.add_untested_idls(document.getElementById("audio-param-idl").textContent);
-  idl_array.add_idls(document.getElementById("delay-node-idl").textContent);
-
-  delay_node = (new AudioContext).createDelay();
-
-  idl_array.add_objects({DelayNode: ["delay_node"]});
-  idl_array.test();
-}, 'webaudio Delay interfaces');
-  </script>
-</body>
-</html>
deleted file mode 100644
--- a/testing/web-platform/tests/webaudio/the-audio-api/the-gainnode-interface/idl-test.html
+++ /dev/null
@@ -1,157 +0,0 @@
-<!DOCTYPE html>
-<html class="a">
-<head>
-<title>GainNode IDL Test</title>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/idlharness.js"></script>
-<script src="/resources/WebIDLParser.js"></script>
-<script src="/webaudio/js/helpers.js"></script>
-<style type="text/css">
-    #event-target-idl,
-    #base-audio-context-idl,
-    #audio-node-idl,
-    #audio-param-idl
-    { visibility:hidden; height: 0px;}
-  </style>
-</head>
-<body class="a">
-
-   <pre id="event-target-idl">interface EventTarget {
-  void addEventListener(DOMString type, EventListener? callback, optional boolean capture = false);
-  void removeEventListener(DOMString type, EventListener? callback, optional boolean capture = false);
-  boolean dispatchEvent(Event event);
-};
-
-/*
-callback interface EventListener {
-  void handleEvent(Event event);
-};
-*/
-// Callback interfaces are not supported yet, but that's ok
-interface EventListener {};
-</pre>
-
-   <pre id="base-audio-context-idl">callback DecodeErrorCallback = void (DOMException error);
-callback DecodeSuccessCallback = void (AudioBuffer decodedData);
-
-interface BaseAudioContext : EventTarget {
-    readonly        attribute AudioDestinationNode destination;
-    readonly        attribute float                sampleRate;
-    readonly        attribute double               currentTime;
-    readonly        attribute AudioListener        listener;
-    readonly        attribute AudioContextState    state;
-    readonly        attribute double               baseLatency;
-    Promise<void>          resume ();
-                    attribute EventHandler         onstatechange;
-    AudioBuffer            createBuffer (unsigned long numberOfChannels, unsigned long length, float sampleRate);
-    Promise<AudioBuffer>   decodeAudioData (ArrayBuffer audioData, optional DecodeSuccessCallback successCallback, optional DecodeErrorCallback errorCallback);
-    AudioBufferSourceNode  createBufferSource ();
-    ConstantSourceNode     createConstantSource ();
-    ScriptProcessorNode    createScriptProcessor (optional unsigned long bufferSize = 0
-              , optional unsigned long numberOfInputChannels = 2
-              , optional unsigned long numberOfOutputChannels = 2
-              );
-    AnalyserNode           createAnalyser ();
-    GainNode               createGain ();
-    DelayNode              createDelay (optional double maxDelayTime);
-    BiquadFilterNode       createBiquadFilter ();
-    IIRFilterNode          createIIRFilter (sequence<double> feedforward, sequence<double> feedback);
-    WaveShaperNode         createWaveShaper ();
-    PannerNode             createPanner ();
-    StereoPannerNode       createStereoPanner ();
-    ConvolverNode          createConvolver ();
-    ChannelSplitterNode    createChannelSplitter (optional unsigned long numberOfOutputs = 6
-              );
-    ChannelMergerNode      createChannelMerger (optional unsigned long numberOfInputs = 6
-              );
-    DynamicsCompressorNode createDynamicsCompressor ();
-    OscillatorNode         createOscillator ();
-    PeriodicWave           createPeriodicWave (Float32Array real, Float32Array imag, optional PeriodicWaveConstraints constraints);
-};</pre>
-
-   <pre id="audio-node-idl">enum ChannelCountMode {
-    "max",
-    "clamped-max",
-    "explicit"
-};
-
-enum ChannelInterpretation {
-    "speakers",
-    "discrete"
-};
-
-interface AudioNode : EventTarget {
-
-    void connect(AudioNode destination, optional unsigned long output = 0, optional unsigned long input = 0);
-    void connect(AudioParam destination, optional unsigned long output = 0);
-    void disconnect(optional unsigned long output = 0);
-
-    readonly attribute BaseAudioContext context;
-    readonly attribute unsigned long numberOfInputs;
-    readonly attribute unsigned long numberOfOutputs;
-
-    // Channel up-mixing and down-mixing rules for all inputs.
-    attribute unsigned long channelCount;
-    attribute ChannelCountMode channelCountMode;
-    attribute ChannelInterpretation channelInterpretation;
-
-};</pre>
-
-   <pre id="audio-param-idl">interface AudioParam {
-
-                    attribute float value;
-    readonly        attribute float defaultValue;
-    readonly        attribute float minValue;
-    readonly        attribute float maxValue;
-
-    // Parameter automation.
-    void setValueAtTime(float value, double startTime);
-    void linearRampToValueAtTime(float value, double endTime);
-    void exponentialRampToValueAtTime(float value, double endTime);
-
-    // Exponentially approach the target value with a rate having the given time constant.
-    void setTargetAtTime(float target, double startTime, double timeConstant);
-
-    // Sets an array of arbitrary parameter values starting at time for the given duration.
-    // The number of values will be scaled to fit into the desired duration.
-    void setValueCurveAtTime(Float32Array values, double startTime, double duration);
-
-    // Cancels all scheduled parameter changes with times greater than or equal to startTime.
-    void cancelScheduledValues(double startTime);
-
-};</pre>
-
-<pre id="gain-node-idl">dictionary GainOptions : AudioNodeOptions {
-             float gain = 1.0;
-};
-
-[Constructor(BaseAudioContext context, optional GainOptions options)]
-interface GainNode : AudioNode {
-
-    readonly attribute AudioParam gain;
-
-};</pre>
-
-  <div id="log"></div>
-
-  <script>
-promise_test(async function () {
-  const webAudioApi = await fetch('/interfaces/web-audio-api.idl').then(r => r.text());
-
-  var idl_array = new IdlArray();
-  idl_array.add_untested_idls(webAudioApi, { only: ['AudioNodeOptions'] });
-  idl_array.add_untested_idls(document.getElementById("event-target-idl").textContent);
-  idl_array.add_untested_idls(document.getElementById("base-audio-context-idl").textContent);
-  idl_array.add_untested_idls(document.getElementById("audio-node-idl").textContent);
-  idl_array.add_untested_idls(document.getElementById("audio-param-idl").textContent);
-  idl_array.add_idls(document.getElementById("gain-node-idl").textContent);
-
-  gain_node = (new AudioContext).createGain();
-
-  idl_array.add_objects({GainNode: ["gain_node"]});
-  idl_array.test();
-}, 'webaudio Gain interfaces');
-  </script>
-</body>
-</html>
--- a/testing/web-platform/tests/webdriver/tests/execute_async_script/user_prompts.py
+++ b/testing/web-platform/tests/webdriver/tests/execute_async_script/user_prompts.py
@@ -2,59 +2,73 @@ import pytest
 
 from webdriver import error
 
 
 # 15.2 Executing Script
 
 def test_handle_prompt_accept(new_session, add_browser_capabilites):
     _, session = new_session({"capabilities": {"alwaysMatch": add_browser_capabilites({"unhandledPromptBehavior": "accept"})}})
-    session.execute_async_script("window.alert('Hello');")
+    value = session.execute_async_script("window.alert('Hello');")
+    assert value is None
+    title = session.title
     with pytest.raises(error.NoSuchAlertException):
         session.alert.accept()
 
 
 def test_handle_prompt_dismiss(new_session, add_browser_capabilites):
     _, session = new_session({"capabilities": {"alwaysMatch": add_browser_capabilites({"unhandledPromptBehavior": "dismiss"})}})
-    session.execute_async_script("window.alert('Hello');")
+    value = session.execute_async_script("window.alert('Hello');")
+    assert value is None
+    title = session.title
     with pytest.raises(error.NoSuchAlertException):
         session.alert.dismiss()
 
 
 def test_handle_prompt_dismiss_and_notify(new_session, add_browser_capabilites):
     _, session = new_session({"capabilities": {"alwaysMatch": add_browser_capabilites({"unhandledPromptBehavior": "dismiss and notify"})}})
+    value = session.execute_async_script("window.alert('Hello');")
+    assert value is None
     with pytest.raises(error.UnexpectedAlertOpenException):
-        session.execute_async_script("window.alert('Hello');")
+        title = session.title
     with pytest.raises(error.NoSuchAlertException):
         session.alert.dismiss()
 
 
 def test_handle_prompt_accept_and_notify(new_session, add_browser_capabilites):
     _, session = new_session({"capabilities": {"alwaysMatch": add_browser_capabilites({"unhandledPromptBehavior": "accept and notify"})}})
+    value = session.execute_async_script("window.alert('Hello');")
+    assert value is None
     with pytest.raises(error.UnexpectedAlertOpenException):
-        session.execute_async_script("window.alert('Hello');")
+        title = session.title
     with pytest.raises(error.NoSuchAlertException):
         session.alert.accept()
 
 
 def test_handle_prompt_ignore(new_session, add_browser_capabilites):
     _, session = new_session({"capabilities": {"alwaysMatch": add_browser_capabilites({"unhandledPromptBehavior": "ignore"})}})
+    value = session.execute_async_script("window.alert('Hello');")
+    assert value is None
     with pytest.raises(error.UnexpectedAlertOpenException):
-        session.execute_async_script("window.alert('Hello');")
+        title = session.title
     session.alert.dismiss()
 
 
 def test_handle_prompt_default(new_session, add_browser_capabilites):
     _, session = new_session({"capabilities": {"alwaysMatch": add_browser_capabilites({})}})
+    value = session.execute_async_script("window.alert('Hello');")
+    assert value is None
     with pytest.raises(error.UnexpectedAlertOpenException):
-        session.execute_async_script("window.alert('Hello');")
+        title = session.title
     with pytest.raises(error.NoSuchAlertException):
         session.alert.dismiss()
 
 
 def test_handle_prompt_twice(new_session, add_browser_capabilites):
     _, session = new_session({"capabilities": {"alwaysMatch": add_browser_capabilites({"unhandledPromptBehavior": "accept"})}})
-    session.execute_async_script("window.alert('Hello');window.alert('Bye');")
+    value = session.execute_async_script("window.alert('Hello');window.alert('Bye');")
+    assert value is None
+    session.alert.dismiss()
     # The first alert has been accepted by the user prompt handler, the second one remains.
     # FIXME: this is how browsers currently work, but the spec should clarify if this is the
     #        expected behavior, see https://github.com/w3c/webdriver/issues/1153.
     assert session.alert.text == "Bye"
     session.alert.dismiss()
--- a/testing/web-platform/tests/webdriver/tests/execute_script/user_prompts.py
+++ b/testing/web-platform/tests/webdriver/tests/execute_script/user_prompts.py
@@ -2,59 +2,73 @@ import pytest
 
 from webdriver import error
 
 
 # 15.2 Executing Script
 
 def test_handle_prompt_accept(new_session, add_browser_capabilites):
     _, session = new_session({"capabilities": {"alwaysMatch": add_browser_capabilites({"unhandledPromptBehavior": "accept"})}})
-    session.execute_script("window.alert('Hello');")
+    value = session.execute_script("window.alert('Hello');")
+    assert value is None
+    title = session.title
     with pytest.raises(error.NoSuchAlertException):
         session.alert.accept()
 
 
 def test_handle_prompt_dismiss(new_session, add_browser_capabilites):
     _, session = new_session({"capabilities": {"alwaysMatch": add_browser_capabilites({"unhandledPromptBehavior": "dismiss"})}})
-    session.execute_script("window.alert('Hello');")
+    value = session.execute_script("window.alert('Hello');")
+    assert value is None
+    title = session.title
     with pytest.raises(error.NoSuchAlertException):
         session.alert.dismiss()
 
 
 def test_handle_prompt_dismiss_and_notify(new_session, add_browser_capabilites):
     _, session = new_session({"capabilities": {"alwaysMatch": add_browser_capabilites({"unhandledPromptBehavior": "dismiss and notify"})}})
+    value = session.execute_script("window.alert('Hello');")
+    assert value is None
     with pytest.raises(error.UnexpectedAlertOpenException):
-        session.execute_script("window.alert('Hello');")
+        title = session.title
     with pytest.raises(error.NoSuchAlertException):
         session.alert.dismiss()
 
 
 def test_handle_prompt_accept_and_notify(new_session, add_browser_capabilites):
     _, session = new_session({"capabilities": {"alwaysMatch": add_browser_capabilites({"unhandledPromptBehavior": "accept and notify"})}})
+    value = session.execute_script("window.alert('Hello');")
+    assert value is None
     with pytest.raises(error.UnexpectedAlertOpenException):
-        session.execute_script("window.alert('Hello');")
+        title = session.title
     with pytest.raises(error.NoSuchAlertException):
         session.alert.accept()
 
 
 def test_handle_prompt_ignore(new_session, add_browser_capabilites):
     _, session = new_session({"capabilities": {"alwaysMatch": add_browser_capabilites({"unhandledPromptBehavior": "ignore"})}})
+    value = session.execute_script("window.alert('Hello');")
+    assert value is None
     with pytest.raises(error.UnexpectedAlertOpenException):
-        session.execute_script("window.alert('Hello');")
+        title = session.title
     session.alert.dismiss()
 
 
 def test_handle_prompt_default(new_session, add_browser_capabilites):
     _, session = new_session({"capabilities": {"alwaysMatch": add_browser_capabilites({})}})
+    value = session.execute_script("window.alert('Hello');")
+    assert value is None
     with pytest.raises(error.UnexpectedAlertOpenException):
-        session.execute_script("window.alert('Hello');")
+        title = session.title
     with pytest.raises(error.NoSuchAlertException):
         session.alert.dismiss()
 
 
 def test_handle_prompt_twice(new_session, add_browser_capabilites):
     _, session = new_session({"capabilities": {"alwaysMatch": add_browser_capabilites({"unhandledPromptBehavior": "accept"})}})
-    session.execute_script("window.alert('Hello');window.alert('Bye');")
+    value = session.execute_script("window.alert('Hello');window.alert('Bye');")
+    assert value is None
+    session.alert.dismiss()
     # The first alert has been accepted by the user prompt handler, the second one remains.
     # FIXME: this is how browsers currently work, but the spec should clarify if this is the
     #        expected behavior, see https://github.com/w3c/webdriver/issues/1153.
     assert session.alert.text == "Bye"
     session.alert.dismiss()
--- a/toolkit/components/aboutcache/content/aboutCache.js
+++ b/toolkit/components/aboutcache/content/aboutCache.js
@@ -36,8 +36,11 @@ function navigate() {
     context += "b,";
   if ($("appid").value)
     context += "i" + $("appid").value + ",";
   if ($("priv").checked)
     context += "p,";
 
   window.location.href = "about:cache?storage=" + storage + "&context=" + context;
 }
+
+let submitButton = document.getElementById("submit");
+submitButton.addEventListener("click", navigate);
--- a/toolkit/components/telemetry/Histograms.json
+++ b/toolkit/components/telemetry/Histograms.json
@@ -1740,252 +1740,252 @@
     "bug_numbers": [1272345, 1296287],
     "expires_in_version": "56",
     "kind": "enumerated",
     "n_values": 12,
     "description": "Whether the URL gets redirected?  (0=200, 1=301, 2=302, 3=304, 4=307, 5=308, 6=400, 7=401, 8=403, 9=404, 10=500, 11=other)"
   },
   "HTTP_NET_VS_CACHE_ONSTART_QSMALL_NORMALPRI_V2": {
     "record_in_processes": ["main", "content"],
-    "expires_in_version": "62",
-      "alert_emails": ["necko@mozilla.com"],
+    "expires_in_version": "68",
+      "alert_emails": ["necko@mozilla.com", "mnovotny@mozilla.com"],
       "bug_numbers": [1325322],
       "kind": "enumerated",
       "n_values": 80,
       "description": "Network vs cache time load (OnStartRequest) difference (ms) for requests with a normal priority and small queue. Cache wins: 41-50 for 1-100ms, 51-59 for 101-1000ms, 60-68 for 1-10s, 69-73 for 11-60s and 74 for > 1m. Network wins: 39-30 for 1-100ms, 29-21 for 101-1000ms, 20-12 for 1-10s, 11-7 for 11-60s and 6 for > 1m."
   },
   "HTTP_NET_VS_CACHE_ONSTART_QMED_NORMALPRI_V2": {
     "record_in_processes": ["main", "content"],
-    "expires_in_version": "62",
-      "alert_emails": ["necko@mozilla.com"],
+    "expires_in_version": "68",
+      "alert_emails": ["necko@mozilla.com", "mnovotny@mozilla.com"],
       "bug_numbers": [1325322],
       "kind": "enumerated",
       "n_values": 80,
       "description": "Network vs cache time load (OnStartRequest) difference (ms) for requests with a normal priority and medium queue. Cache wins: 41-50 for 1-100ms, 51-59 for 101-1000ms, 60-68 for 1-10s, 69-73 for 11-60s and 74 for > 1m. Network wins: 39-30 for 1-100ms, 29-21 for 101-1000ms, 20-12 for 1-10s, 11-7 for 11-60s and 6 for > 1m."
   },
   "HTTP_NET_VS_CACHE_ONSTART_QBIG_NORMALPRI_V2": {
     "record_in_processes": ["main", "content"],
-    "expires_in_version": "62",
-      "alert_emails": ["necko@mozilla.com"],
+    "expires_in_version": "68",
+      "alert_emails": ["necko@mozilla.com", "mnovotny@mozilla.com"],
       "bug_numbers": [1325322],
       "kind": "enumerated",
       "n_values": 80,
       "description": "Network vs cache time load (OnStartRequest) difference (ms) for requests with a normal priority and large queue. Cache wins: 41-50 for 1-100ms, 51-59 for 101-1000ms, 60-68 for 1-10s, 69-73 for 11-60s and 74 for > 1m. Network wins: 39-30 for 1-100ms, 29-21 for 101-1000ms, 20-12 for 1-10s, 11-7 for 11-60s and 6 for > 1m."
   },
   "HTTP_NET_VS_CACHE_ONSTART_QSMALL_HIGHPRI_V2": {
     "record_in_processes": ["main", "content"],
-    "expires_in_version": "62",
-      "alert_emails": ["necko@mozilla.com"],
+    "expires_in_version": "68",
+      "alert_emails": ["necko@mozilla.com", "mnovotny@mozilla.com"],
       "bug_numbers": [1325322],
       "kind": "enumerated",
       "n_values": 80,
       "description": "Network vs cache time load (OnStartRequest) difference (ms) for requests with a high priority and small queue. Cache wins: 41-50 for 1-100ms, 51-59 for 101-1000ms, 60-68 for 1-10s, 69-73 for 11-60s and 74 for > 1m. Network wins: 39-30 for 1-100ms, 29-21 for 101-1000ms, 20-12 for 1-10s, 11-7 for 11-60s and 6 for > 1m."
   },
   "HTTP_NET_VS_CACHE_ONSTART_QMED_HIGHPRI_V2": {
     "record_in_processes": ["main", "content"],
-    "expires_in_version": "62",
-      "alert_emails": ["necko@mozilla.com"],
+    "expires_in_version": "68",
+      "alert_emails": ["necko@mozilla.com", "mnovotny@mozilla.com"],
       "bug_numbers": [1325322],
       "kind": "enumerated",
       "n_values": 80,
       "description": "Network vs cache time load (OnStartRequest) difference (ms) for requests with a high priority and medium queue. Cache wins: 41-50 for 1-100ms, 51-59 for 101-1000ms, 60-68 for 1-10s, 69-73 for 11-60s and 74 for > 1m. Network wins: 39-30 for 1-100ms, 29-21 for 101-1000ms, 20-12 for 1-10s, 11-7 for 11-60s and 6 for > 1m."
   },
   "HTTP_NET_VS_CACHE_ONSTART_QBIG_HIGHPRI_V2": {
     "record_in_processes": ["main", "content"],
-    "expires_in_version": "62",
-      "alert_emails": ["necko@mozilla.com"],
+    "expires_in_version": "68",
+      "alert_emails": ["necko@mozilla.com", "mnovotny@mozilla.com"],
       "bug_numbers": [1325322],
       "kind": "enumerated",
       "n_values": 80,
       "description": "Network vs cache time load (OnStartRequest) difference (ms) for requests with a high priority and large queue. Cache wins: 41-50 for 1-100ms, 51-59 for 101-1000ms, 60-68 for 1-10s, 69-73 for 11-60s and 74 for > 1m. Network wins: 39-30 for 1-100ms, 29-21 for 101-1000ms, 20-12 for 1-10s, 11-7 for 11-60s and 6 for > 1m."
   },
   "HTTP_NET_VS_CACHE_ONSTOP_QSMALL_NORMALPRI_V2": {
     "record_in_processes": ["main", "content"],
-    "expires_in_version": "62",
-      "alert_emails": ["necko@mozilla.com"],
+    "expires_in_version": "68",
+      "alert_emails": ["necko@mozilla.com", "mnovotny@mozilla.com"],
       "bug_numbers": [1325322],
       "kind": "enumerated",
       "n_values": 80,
       "description": "Network vs cache time load (OnStopRequest) difference (ms) for requests with a normal priority and small queue. Cache wins: 41-50 for 1-100ms, 51-59 for 101-1000ms, 60-68 for 1-10s, 69-73 for 11-60s and 74 for > 1m. Network wins: 39-30 for 1-100ms, 29-21 for 101-1000ms, 20-12 for 1-10s, 11-7 for 11-60s and 6 for > 1m."
   },
   "HTTP_NET_VS_CACHE_ONSTOP_QMED_NORMALPRI_V2": {
     "record_in_processes": ["main", "content"],
-    "expires_in_version": "62",
-      "alert_emails": ["necko@mozilla.com"],
+    "expires_in_version": "68",
+      "alert_emails": ["necko@mozilla.com", "mnovotny@mozilla.com"],
       "bug_numbers": [1325322],
       "kind": "enumerated",
       "n_values": 80,
       "description": "Network vs cache time load (OnStopRequest) difference (ms) for requests with a normal priority and medium queue. Cache wins: 41-50 for 1-100ms, 51-59 for 101-1000ms, 60-68 for 1-10s, 69-73 for 11-60s and 74 for > 1m. Network wins: 39-30 for 1-100ms, 29-21 for 101-1000ms, 20-12 for 1-10s, 11-7 for 11-60s and 6 for > 1m."
   },
   "HTTP_NET_VS_CACHE_ONSTOP_QBIG_NORMALPRI_V2": {
     "record_in_processes": ["main", "content"],
-    "expires_in_version": "62",
-      "alert_emails": ["necko@mozilla.com"],
+    "expires_in_version": "68",
+      "alert_emails": ["necko@mozilla.com", "mnovotny@mozilla.com"],
       "bug_numbers": [1325322],
       "kind": "enumerated",
       "n_values": 80,
       "description": "Network vs cache time load (OnStopRequest) difference (ms) for requests with a normal priority and large queue. Cache wins: 41-50 for 1-100ms, 51-59 for 101-1000ms, 60-68 for 1-10s, 69-73 for 11-60s and 74 for > 1m. Network wins: 39-30 for 1-100ms, 29-21 for 101-1000ms, 20-12 for 1-10s, 11-7 for 11-60s and 6 for > 1m."
   },
   "HTTP_NET_VS_CACHE_ONSTOP_QSMALL_HIGHPRI_V2": {
     "record_in_processes": ["main", "content"],
-    "expires_in_version": "62",
-      "alert_emails": ["necko@mozilla.com"],
+    "expires_in_version": "68",
+      "alert_emails": ["necko@mozilla.com", "mnovotny@mozilla.com"],
       "bug_numbers": [1325322],
       "kind": "enumerated",
       "n_values": 80,
       "description": "Network vs cache time load (OnStopRequest) difference (ms) for requests with a high priority and small queue. Cache wins: 41-50 for 1-100ms, 51-59 for 101-1000ms, 60-68 for 1-10s, 69-73 for 11-60s and 74 for > 1m. Network wins: 39-30 for 1-100ms, 29-21 for 101-1000ms, 20-12 for 1-10s, 11-7 for 11-60s and 6 for > 1m."
   },
   "HTTP_NET_VS_CACHE_ONSTOP_QMED_HIGHPRI_V2": {
     "record_in_processes": ["main", "content"],
-    "expires_in_version": "62",
-      "alert_emails": ["necko@mozilla.com"],
+    "expires_in_version": "68",
+      "alert_emails": ["necko@mozilla.com", "mnovotny@mozilla.com"],
       "bug_numbers": [1325322],
       "kind": "enumerated",
       "n_values": 80,
       "description": "Network vs cache time load (OnStopRequest) difference (ms) for requests with a high priority and medium queue. Cache wins: 41-50 for 1-100ms, 51-59 for 101-1000ms, 60-68 for 1-10s, 69-73 for 11-60s and 74 for > 1m. Network wins: 39-30 for 1-100ms, 29-21 for 101-1000ms, 20-12 for 1-10s, 11-7 for 11-60s and 6 for > 1m."
   },
   "HTTP_NET_VS_CACHE_ONSTOP_QBIG_HIGHPRI_V2": {
     "record_in_processes": ["main", "content"],
-    "expires_in_version": "62",
-      "alert_emails": ["necko@mozilla.com"],
+    "expires_in_version": "68",
+      "alert_emails": ["necko@mozilla.com", "mnovotny@mozilla.com"],
       "bug_numbers": [1325322],
       "kind": "enumerated",
       "n_values": 80,
       "description": "Network vs cache time load (OnStopRequest) difference (ms) for requests with a high priority and large queue. Cache wins: 41-50 for 1-100ms, 51-59 for 101-1000ms, 60-68 for 1-10s, 69-73 for 11-60s and 74 for > 1m. Network wins: 39-30 for 1-100ms, 29-21 for 101-1000ms, 20-12 for 1-10s, 11-7 for 11-60s and 6 for > 1m."
   },
   "HTTP_NET_VS_CACHE_ONSTOP_SMALL_V2": {
     "record_in_processes": ["main", "content"],
-    "expires_in_version": "62",
-      "alert_emails": ["necko@mozilla.com"],
+    "expires_in_version": "68",
+      "alert_emails": ["necko@mozilla.com", "mnovotny@mozilla.com"],
       "bug_numbers": [1325322],
       "kind": "enumerated",
       "n_values": 80,
       "description": "Network vs cache time load (OnStopRequest) difference (ms) for cache files with a small size (<256K). Cache wins: 41-50 for 1-100ms, 51-59 for 101-1000ms, 60-68 for 1-10s, 69-73 for 11-60s and 74 for > 1m. Network wins: 39-30 for 1-100ms, 29-21 for 101-1000ms, 20-12 for 1-10s, 11-7 for 11-60s and 6 for > 1m."
   },
   "HTTP_NET_VS_CACHE_ONSTOP_LARGE_V2": {
     "record_in_processes": ["main", "content"],
-    "expires_in_version": "62",
-      "alert_emails": ["necko@mozilla.com"],
+    "expires_in_version": "68",
+      "alert_emails": ["necko@mozilla.com", "mnovotny@mozilla.com"],
       "bug_numbers": [1325322],
       "kind": "enumerated",
       "n_values": 80,
       "description": "Network vs cache time load (OnStopRequest) difference (ms) for cache files with a large size (>=256K). Cache wins: 41-50 for 1-100ms, 51-59 for 101-1000ms, 60-68 for 1-10s, 69-73 for 11-60s and 74 for > 1m. Network wins: 39-30 for 1-100ms, 29-21 for 101-1000ms, 20-12 for 1-10s, 11-7 for 11-60s and 6 for > 1m."
   },
   "HTTP_NET_VS_CACHE_ONSTART_REVALIDATED_V2": {
     "record_in_processes": ["main", "content"],
-    "expires_in_version": "62",
-      "alert_emails": ["necko@mozilla.com"],
+    "expires_in_version": "68",
+      "alert_emails": ["necko@mozilla.com", "mnovotny@mozilla.com"],
       "bug_numbers": [1325322],
       "kind": "enumerated",
       "n_values": 80,
       "description": "Network vs cache time load (OnStartRequest) difference revalidated cache entries. Cache wins: 41-50 for 1-100ms, 51-59 for 101-1000ms, 60-68 for 1-10s, 69-73 for 11-60s and 74 for > 1m. Network wins: 39-30 for 1-100ms, 29-21 for 101-1000ms, 20-12 for 1-10s, 11-7 for 11-60s and 6 for > 1m."
   },
   "HTTP_NET_VS_CACHE_ONSTART_NOTREVALIDATED_V2": {
     "record_in_processes": ["main", "content"],
-    "expires_in_version": "62",
-      "alert_emails": ["necko@mozilla.com"],
+    "expires_in_version": "68",
+      "alert_emails": ["necko@mozilla.com", "mnovotny@mozilla.com"],
       "bug_numbers": [1325322],
       "kind": "enumerated",
       "n_values": 80,
       "description": "Network vs cache time load (OnStartRequest) difference (ms) not revalidated cache entries. Cache wins: 41-50 for 1-100ms, 51-59 for 101-1000ms, 60-68 for 1-10s, 69-73 for 11-60s and 74 for > 1m. Network wins: 39-30 for 1-100ms, 29-21 for 101-1000ms, 20-12 for 1-10s, 11-7 for 11-60s and 6 for > 1m."
   },
   "HTTP_NET_VS_CACHE_ONSTOP_REVALIDATED_V2": {
     "record_in_processes": ["main", "content"],
-    "expires_in_version": "62",
-      "alert_emails": ["necko@mozilla.com"],
+    "expires_in_version": "68",
+      "alert_emails": ["necko@mozilla.com", "mnovotny@mozilla.com"],
       "bug_numbers": [1325322],
       "kind": "enumerated",
       "n_values": 80,
       "description": "Network vs cache time load (OnStopRequest) difference (ms) revalidated cache entries. Cache wins: 41-50 for 1-100ms, 51-59 for 101-1000ms, 60-68 for 1-10s, 69-73 for 11-60s and 74 for > 1m. Network wins: 39-30 for 1-100ms, 29-21 for 101-1000ms, 20-12 for 1-10s, 11-7 for 11-60s and 6 for > 1m."
   },
   "HTTP_NET_VS_CACHE_ONSTOP_NOTREVALIDATED_V2": {
     "record_in_processes": ["main", "content"],
-    "expires_in_version": "62",
-      "alert_emails": ["necko@mozilla.com"],
+    "expires_in_version": "68",
+      "alert_emails": ["necko@mozilla.com", "mnovotny@mozilla.com"],
       "bug_numbers": [1325322],
       "kind": "enumerated",
       "n_values": 80,
       "description": "Network vs cache time load (OnStopRequest) difference (ms) not revalidated cache entries. Cache wins: 41-50 for 1-100ms, 51-59 for 101-1000ms, 60-68 for 1-10s, 69-73 for 11-60s and 74 for > 1m. Network wins: 39-30 for 1-100ms, 29-21 for 101-1000ms, 20-12 for 1-10s, 11-7 for 11-60s and 6 for > 1m."
   },
   "HTTP_ONSTART_SUSPEND_TOTAL_TIME": {
     "record_in_processes": ["main", "content"],
-    "expires_in_version": "62",
-      "alert_emails": ["necko@mozilla.com"],
+    "expires_in_version": "never",
+      "alert_emails": ["necko@mozilla.com", "mnovotny@mozilla.com"],
       "bug_numbers": [1347948],
       "kind": "exponential",
       "high": 60000,
       "n_buckets": 100,
       "description": "Time in milliseconds that http channel spent suspended between AsyncOpen and OnStartRequest."
   },
   "NETWORK_RACE_CACHE_WITH_NETWORK_USAGE_2": {
     "record_in_processes": ["main", "content"],
-    "expires_in_version": "62",
-    "alert_emails": ["necko@mozilla.com"],
+    "expires_in_version": "never",
+    "alert_emails": ["necko@mozilla.com", "mnovotny@mozilla.com"],
     "bug_numbers": [1377340],
     "kind": "categorical",
     "labels": ["NetworkNoRace", "CacheNoRace", "NetworkRace", "CacheRace", "NetworkDelayedRace", "CacheDelayedRace"],
     "description": "Whether we raced network with the cache."
   },
   "NETWORK_RACE_CACHE_WITH_NETWORK_SAVED_TIME": {
     "record_in_processes": ["main", "content"],
-    "expires_in_version": "62",
-    "alert_emails": ["necko@mozilla.com"],
+    "expires_in_version": "never",
+    "alert_emails": ["necko@mozilla.com", "mnovotny@mozilla.com"],
     "bug_numbers": [1354407],
     "kind": "exponential",
     "high": 60000,
     "n_buckets": 100,
     "description": "Time in milliseconds that we saved when we race cache with network."
   },
   "NETWORK_RACE_CACHE_WITH_NETWORK_OCEC_ON_START_DIFF": {
     "record_in_processes": ["main", "content"],
-    "expires_in_version": "62",
-    "alert_emails": ["necko@mozilla.com"],
+    "expires_in_version": "never",
+    "alert_emails": ["necko@mozilla.com", "mnovotny@mozilla.com"],
     "bug_numbers": [1354407],
     "kind": "linear",
     "high": 1000,
     "n_buckets": 100,
     "description": "Time in milliseconds between onStartRequest from the cache and onCacheEntryCheck. Report only when net wins and OCEC is before onStartRequest from net."
   },
   "NETWORK_RACE_CACHE_BANDWIDTH_RACE_NETWORK_WIN": {
     "record_in_processes": ["main", "content"],
-    "expires_in_version": "62",
+    "expires_in_version": "never",
     "kind": "exponential",
     "low": 32,
     "high": 16777216,
     "n_buckets": 100,
     "description": "Amount of bytes received when we decide to race cache with network and network wins.",
-    "alert_emails": ["necko@mozilla.com"],
+    "alert_emails": ["necko@mozilla.com", "mnovotny@mozilla.com"],
     "bug_numbers": [1354405]
   },
   "NETWORK_RACE_CACHE_BANDWIDTH_RACE_CACHE_WIN": {
     "record_in_processes": ["main", "content"],
-    "expires_in_version": "62",
+    "expires_in_version": "never",
     "kind": "exponential",
     "low": 32,
     "high": 16777216,
     "n_buckets": 100,
     "description": "Amount of bytes received when we decide to race cache with network and cache wins.",
-    "alert_emails": ["necko@mozilla.com"],
+    "alert_emails": ["necko@mozilla.com", "mnovotny@mozilla.com"],
     "bug_numbers": [1354405]
   },
   "NETWORK_RACE_CACHE_BANDWIDTH_NOT_RACE": {
     "record_in_processes": ["main", "content"],
-    "expires_in_version": "62",
+    "expires_in_version": "never",
     "kind": "exponential",
     "low": 32,
     "high": 16777216,
     "n_buckets": 100,
     "description": "Amount of bytes received when we decide not to race cache with network.",
-    "alert_emails": ["necko@mozilla.com"],
+    "alert_emails": ["necko@mozilla.com", "mnovotny@mozilla.com"],
     "bug_numbers": [1354405]
   },
   "NETWORK_RACE_CACHE_VALIDATION": {
     "record_in_processes": ["main"],
-    "expires_in_version": "62",
-    "alert_emails": ["necko@mozilla.com"],
+    "expires_in_version": "never",
+    "alert_emails": ["necko@mozilla.com", "mnovotny@mozilla.com"],
     "bug_numbers": [1377223],
     "kind": "categorical",
     "labels": ["NotSent", "CachedContentUsed", "CachedContentNotUsed"],
     "description": "Stats for validation requests when cache won the race."
   },
   "NETWORK_HTTP_REDIRECT_TO_SCHEME" :{
     "record_in_processes": ["main"],
     "alert_emails": ["necko@mozilla.com", "seceng-telemetry@mozilla.com", "jkt@mozilla.com"],