Merge mozilla-central to autoland. a=merge CLOSED TREE
authorNoemi Erli <nerli@mozilla.com>
Sun, 29 Apr 2018 12:52:29 +0300
changeset 472323 9ce8f33791e2a157621442758019d9f6fa1d5372
parent 472321 37463107d7585e9854360a193e84f6ed519fb186 (current diff)
parent 472322 c552490c8659bf2e7d279ed28d46fb5d5a245a96 (diff)
child 472324 4252c770699c81f0da958cafc313a37a9a4ac1ae
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
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge mozilla-central to autoland. a=merge CLOSED TREE
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"],