merge mozilla-inbound to mozilla-central a=merge
authorCarsten "Tomcat" Book <cbook@mozilla.com>
Wed, 07 Dec 2016 11:30:43 +0100
changeset 325338 c401d72933641748f3738e90e7bbe539705e2f1c
parent 325312 b44c57f045c25e3af4e868e9a5ba76aa6060d275 (current diff)
parent 325337 f863d5050b3f71218c001804f97ca98474b2bae6 (diff)
child 325339 438822713e70edbdad6fb00f75e96b2b9dc2fcaa
child 325348 29acecd1db70a7f7ec4ed8f93d1aed4c89518ac1
child 325384 719400a726eef1237a1a6249d4e0b724b6df1e59
push id24
push usermaklebus@msu.edu
push dateTue, 20 Dec 2016 03:11:33 +0000
reviewersmerge
milestone53.0a1
merge mozilla-inbound to mozilla-central a=merge
testing/web-platform/meta/referrer-policy/same-origin/attr-referrer/cross-origin/http-http/img-tag/cross-origin.keep-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/same-origin/attr-referrer/cross-origin/http-http/img-tag/cross-origin.no-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/same-origin/attr-referrer/cross-origin/http-http/img-tag/cross-origin.swap-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/same-origin/attr-referrer/cross-origin/http-https/img-tag/cross-origin.keep-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/same-origin/attr-referrer/cross-origin/http-https/img-tag/cross-origin.no-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/same-origin/attr-referrer/cross-origin/http-https/img-tag/cross-origin.swap-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/same-origin/attr-referrer/same-origin/http-http/img-tag/same-origin-insecure.keep-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/same-origin/attr-referrer/same-origin/http-http/img-tag/same-origin-insecure.no-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/same-origin/attr-referrer/same-origin/http-http/img-tag/same-origin-insecure.swap-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/same-origin/attr-referrer/same-origin/http-https/img-tag/same-origin-insecure.swap-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/same-origin/http-rp/cross-origin/http-http/img-tag/cross-origin.keep-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/same-origin/http-rp/cross-origin/http-http/img-tag/cross-origin.no-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/same-origin/http-rp/cross-origin/http-http/img-tag/cross-origin.swap-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/same-origin/http-rp/cross-origin/http-https/img-tag/cross-origin.keep-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/same-origin/http-rp/cross-origin/http-https/img-tag/cross-origin.no-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/same-origin/http-rp/cross-origin/http-https/img-tag/cross-origin.swap-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/same-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.keep-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/same-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.no-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/same-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.swap-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/same-origin/http-rp/same-origin/http-https/img-tag/same-origin-insecure.swap-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/same-origin/meta-referrer/cross-origin/http-http/img-tag/cross-origin.keep-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/same-origin/meta-referrer/cross-origin/http-http/img-tag/cross-origin.no-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/same-origin/meta-referrer/cross-origin/http-http/img-tag/cross-origin.swap-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/same-origin/meta-referrer/cross-origin/http-https/img-tag/cross-origin.keep-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/same-origin/meta-referrer/cross-origin/http-https/img-tag/cross-origin.no-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/same-origin/meta-referrer/cross-origin/http-https/img-tag/cross-origin.swap-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/same-origin/meta-referrer/same-origin/http-http/img-tag/same-origin-insecure.keep-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/same-origin/meta-referrer/same-origin/http-http/img-tag/same-origin-insecure.no-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/same-origin/meta-referrer/same-origin/http-http/img-tag/same-origin-insecure.swap-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/same-origin/meta-referrer/same-origin/http-https/img-tag/same-origin-insecure.swap-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-http/img-tag/cross-insecure.keep-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-http/img-tag/cross-insecure.no-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-http/img-tag/cross-insecure.swap-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-http/img-tag/same-insecure.keep-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-http/img-tag/same-insecure.no-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-http/img-tag/same-insecure.swap-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-http/img-tag/cross-insecure.keep-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-http/img-tag/cross-insecure.no-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-http/img-tag/cross-insecure.swap-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-insecure.keep-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-insecure.no-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-insecure.swap-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-http/img-tag/cross-insecure.keep-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-http/img-tag/cross-insecure.no-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-http/img-tag/cross-insecure.swap-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-http/img-tag/same-insecure.keep-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-http/img-tag/same-insecure.no-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-http/img-tag/same-insecure.swap-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin/attr-referrer/cross-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin/attr-referrer/cross-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin/attr-referrer/cross-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin/http-rp/cross-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin/http-rp/cross-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin/http-rp/cross-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin/http-rp/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin/http-rp/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin/http-rp/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin/http-rp/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin/http-rp/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin/http-rp/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin/meta-referrer/cross-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin/meta-referrer/cross-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin/meta-referrer/cross-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin/meta-referrer/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin/meta-referrer/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin/meta-referrer/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html.ini
testing/web-platform/meta/referrer-policy/strict-origin/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html.ini
--- a/accessible/ipc/DocAccessibleParent.h
+++ b/accessible/ipc/DocAccessibleParent.h
@@ -71,22 +71,21 @@ public:
                                                      const uint32_t& aType) override;
 
   virtual mozilla::ipc::IPCResult RecvRoleChangedEvent(const uint32_t& aRole) override final;
 
   virtual mozilla::ipc::IPCResult RecvBindChildDoc(PDocAccessibleParent* aChildDoc, const uint64_t& aID) override;
 
   void Unbind()
   {
-    mParent = nullptr;
     if (DocAccessibleParent* parent = ParentDoc()) {
-      parent->mChildDocs.RemoveElement(this);
+      parent->RemoveChildDoc(this);
     }
 
-    mParentDoc = nullptr;
+    mParent = nullptr;
   }
 
   virtual mozilla::ipc::IPCResult RecvShutdown() override;
   void Destroy();
   virtual void ActorDestroy(ActorDestroyReason aWhy) override
   {
     MOZ_DIAGNOSTIC_ASSERT(CheckDocTree());
     if (!mShutdown)
--- a/browser/base/content/browser.xul
+++ b/browser/base/content/browser.xul
@@ -173,17 +173,17 @@
     <!-- for select dropdowns. The menupopup is what shows the list of options,
          and the popuponly menulist makes things like the menuactive attributes
          work correctly on the menupopup. ContentSelectDropdown expects the
          popuponly menulist to be its immediate parent. -->
     <menulist popuponly="true" id="ContentSelectDropdown" hidden="true">
       <menupopup rolluponmousewheel="true"
                  activateontab="true" position="after_start"
 #ifdef XP_WIN
-                 consumeoutsideclicks="false" ignorekeys="handled"
+                 consumeoutsideclicks="false" ignorekeys="shortcuts"
 #endif
         />
     </menulist>
 
     <!-- for invalid form error message -->
     <panel id="invalid-form-popup" type="arrow" orient="vertical" noautofocus="true" hidden="true" level="parent">
       <description/>
     </panel>
--- a/browser/base/content/test/general/browser_selectpopup.js
+++ b/browser/base/content/test/general/browser_selectpopup.js
@@ -159,16 +159,24 @@ function* doSelectTests(contentType, dtd
   is((yield getChangeEvents()), 0, "Before closed - number of change events");
 
   EventUtils.synthesizeKey("a", { accelKey: true });
   yield ContentTask.spawn(gBrowser.selectedBrowser, { isWindows }, function(args) {
     Assert.equal(String(content.getSelection()), args.isWindows ? "Text" : "",
       "Select all while popup is open");
   });
 
+  // Backspace should not go back
+  let handleKeyPress = function(event) {
+    ok(false, "Should not get keypress event");
+  }
+  window.addEventListener("keypress", handleKeyPress);
+  EventUtils.synthesizeKey("VK_BACK_SPACE", { });
+  window.removeEventListener("keypress", handleKeyPress);
+
   yield hideSelectPopup(selectPopup);
 
   is(menulist.selectedIndex, 3, "Item 3 still selected");
   is((yield getInputEvents()), 1, "After closed - number of input events");
   is((yield getChangeEvents()), 1, "After closed - number of change events");
 
   // Opening and closing the popup without changing the value should not fire a change event.
   yield openSelectPopup(selectPopup, "click");
--- a/devtools/client/animationinspector/test/browser_animation_animated_properties_displayed.js
+++ b/devtools/client/animationinspector/test/browser_animation_animated_properties_displayed.js
@@ -77,15 +77,15 @@ function hasExpectedProperties(container
 
   return true;
 }
 
 function hasExpectedWarnings(containerEl) {
   let warnings = [...containerEl.querySelectorAll(".warning")];
   for (let warning of warnings) {
     let warningID =
-      "CompositorAnimationWarningTransformWithGeometricProperties";
+      "CompositorAnimationWarningTransformWithSyncGeometricAnimations";
     if (warning.getAttribute("title") == LAYOUT_ERRORS_L10N.getStr(warningID)) {
       return true;
     }
   }
   return false;
 }
--- a/devtools/client/animationinspector/test/browser_animation_running_on_compositor.js
+++ b/devtools/client/animationinspector/test/browser_animation_running_on_compositor.js
@@ -10,17 +10,17 @@ requestLongerTimeout(2);
 // compositor, they get a special icon and information in the tooltip.
 
 add_task(function* () {
   yield addTab(URL_ROOT + "doc_simple_animation.html");
   let {inspector, panel} = yield openAnimationInspector();
   let timeline = panel.animationsTimelineComponent;
 
   info("Select a test node we know has an animation running on the compositor");
-  yield selectNodeAndWaitForAnimations(".animated", inspector);
+  yield selectNodeAndWaitForAnimations(".compositor-all", inspector);
 
   let animationEl = timeline.animationsEl.querySelector(".animation");
   ok(animationEl.classList.contains("fast-track"),
      "The animation element has the fast-track css class");
   ok(hasTooltip(animationEl,
                 ANIMATION_L10N.getStr("player.allPropertiesOnCompositorTooltip")),
      "The animation element has the right tooltip content");
 
--- a/devtools/client/animationinspector/test/doc_simple_animation.html
+++ b/devtools/client/animationinspector/test/doc_simple_animation.html
@@ -77,16 +77,20 @@
     .no-compositor {
       top: 0;
       right: 10px;
       background: gold;
 
       animation: no-compositor 10s cubic-bezier(.57,-0.02,1,.31) forwards;
     }
 
+    .compositor-all {
+      animation: compositor-all 2s infinite;
+    }
+
     .compositor-notall {
       animation: compositor-notall 2s infinite;
     }
 
     @keyframes simple-animation {
       100% {
         transform: translateX(300px);
       }
@@ -99,16 +103,20 @@
     }
 
     @keyframes no-compositor {
       100% {
         margin-right: 600px;
       }
     }
 
+    @keyframes compositor-all {
+      to { opacity: 0.5 }
+    }
+
     @keyframes compositor-notall {
       from {
         opacity: 0;
         width: 0px;
         transform: translate(0px);
       }
       to {
         opacity: 1;
@@ -125,16 +133,17 @@
   <div class="ball multi"></div>
   <div class="ball delayed"></div>
   <div class="ball multi-finite"></div>
   <div class="ball short"></div>
   <div class="ball long"></div>
   <div class="ball negative-delay"></div>
   <div class="ball no-compositor"></div>
   <div class="ball" id="endDelayed"></div>
+  <div class="ball compositor-all"></div>
   <div class="ball compositor-notall"></div>
   <script>
     /* globals KeyframeEffect, Animation */
     "use strict";
 
     var el = document.getElementById("endDelayed");
     let effect = new KeyframeEffect(el, [
       { opacity: 0, offset: 0 },
--- a/devtools/client/jsonview/converter-child.js
+++ b/devtools/client/jsonview/converter-child.js
@@ -1,17 +1,17 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 "use strict";
 
-const {Cu, Cc, Ci, components} = require("chrome");
+const {Cc, Ci, components} = require("chrome");
 const Services = require("Services");
 const {Class} = require("sdk/core/heritage");
 const {Unknown} = require("sdk/platform/xpcom");
 const xpcom = require("sdk/platform/xpcom");
 const Events = require("sdk/dom/events");
 const Clipboard = require("sdk/clipboard");
 
 loader.lazyRequireGetter(this, "NetworkHelper",
@@ -135,19 +135,18 @@ let Converter = Class({
           return undefined;
         }
       }
     };
 
     JsonViewUtils.exportIntoContentScope(win, Locale, "Locale");
 
     Events.once(win, "DOMContentLoaded", event => {
-      Cu.exportFunction(this.postChromeMessage.bind(this), win, {
-        defineAs: "postChromeMessage"
-      });
+      win.addEventListener("contentMessage",
+        this.onContentMessage.bind(this), false, true);
     });
 
     // The request doesn't have to be always nsIHttpChannel
     // (e.g. in case of data: URLs)
     if (request instanceof Ci.nsIHttpChannel) {
       request.visitResponseHeaders({
         visitHeader: function (name, value) {
           headers.response.push({name: name, value: value});
@@ -258,20 +257,25 @@ let Converter = Class({
       "<base href=\"" + this.htmlEncode(this.data.url()) + "\">" +
       "</head><body>" +
       output +
       "</body></html>";
   },
 
   // Chrome <-> Content communication
 
-  postChromeMessage: function (type, args, objects) {
-    let value = args;
+  onContentMessage: function (e) {
+    // Do not handle events from different documents.
+    let win = NetworkHelper.getWindowForRequest(this.channel);
+    if (win != e.target) {
+      return;
+    }
 
-    switch (type) {
+    let value = e.detail.value;
+    switch (e.detail.type) {
       case "copy":
         Clipboard.set(value, "text");
         break;
 
       case "copy-headers":
         this.copyHeaders(value);
         break;
 
--- a/devtools/client/jsonview/json-viewer.js
+++ b/devtools/client/jsonview/json-viewer.js
@@ -1,14 +1,13 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-/* global postChromeMessage */
 
 "use strict";
 
 define(function (require, exports, module) {
   const { render } = require("devtools/client/shared/vendor/react-dom");
   const { createFactories } = require("devtools/client/shared/components/reps/rep-utils");
   const { MainTabbedArea } = createFactories(require("./components/main-tabbed-area"));
 
@@ -37,27 +36,25 @@ define(function (require, exports, modul
   headers.remove();
 
   /**
    * Application actions/commands. This list implements all commands
    * available for the JSON viewer.
    */
   input.actions = {
     onCopyJson: function () {
-      let value = input.prettified ? input.jsonPretty : input.jsonText;
-      postChromeMessage("copy", value);
+      dispatchEvent("copy", input.prettified ? input.jsonPretty : input.jsonText);
     },
 
     onSaveJson: function () {
-      let value = input.prettified ? input.jsonPretty : input.jsonText;
-      postChromeMessage("save", value);
+      dispatchEvent("save", input.prettified ? input.jsonPretty : input.jsonText);
     },
 
     onCopyHeaders: function () {
-      postChromeMessage("copy-headers", input.headers);
+      dispatchEvent("copy-headers", input.headers);
     },
 
     onSearch: function (value) {
       theApp.setState({searchFilter: value});
     },
 
     onPrettify: function (data) {
       if (input.prettified) {
@@ -69,16 +66,34 @@ define(function (require, exports, modul
         theApp.setState({jsonText: input.jsonPretty});
       }
 
       input.prettified = !input.prettified;
     },
   };
 
   /**
+   * Helper for dispatching an event. It's handled in chrome scope.
+   *
+   * @param {String} type Event detail type
+   * @param {Object} value Event detail value
+   */
+  function dispatchEvent(type, value) {
+    let data = {
+      detail: {
+        type,
+        value,
+      }
+    };
+
+    let contentMessageEvent = new CustomEvent("contentMessage", data);
+    window.dispatchEvent(contentMessageEvent);
+  }
+
+  /**
    * Render the main application component. It's the main tab bar displayed
    * at the top of the window. This component also represents ReacJS root.
    */
   let content = document.getElementById("content");
   let theApp = render(MainTabbedArea(input), content);
 
   let onResize = event => {
     window.document.body.style.height = window.innerHeight + "px";
--- a/docshell/base/nsDocShell.cpp
+++ b/docshell/base/nsDocShell.cpp
@@ -12438,17 +12438,17 @@ nsDocShell::LoadHistoryEntry(nsISHEntry*
   if (NS_FAILED(rv) || isJS) {
     // We're loading a URL that will execute script from inside asyncOpen.
     // Replace the current document with about:blank now to prevent
     // anything from the current document from leaking into any JavaScript
     // code in the URL.
     // Don't cache the presentation if we're going to just reload the
     // current entry. Caching would lead to trying to save the different
     // content viewers in the same nsISHEntry object.
-    rv = CreateAboutBlankContentViewer(triggeringPrincipal, nullptr,
+    rv = CreateAboutBlankContentViewer(principalToInherit, nullptr,
                                        aEntry != mOSHE);
 
     if (NS_FAILED(rv)) {
       // The creation of the intermittent about:blank content
       // viewer failed for some reason (potentially because the
       // user prevented it). Interrupt the history load.
       return NS_OK;
     }
--- a/dom/animation/Animation.cpp
+++ b/dom/animation/Animation.cpp
@@ -721,17 +721,16 @@ Animation::AnimationTimeToTimeStamp(cons
 TimeStamp
 Animation::ElapsedTimeToTimeStamp(
   const StickyTimeDuration& aElapsedTime) const
 {
   return AnimationTimeToTimeStamp(aElapsedTime +
                                   mEffect->SpecifiedTiming().mDelay);
 }
 
-
 // https://w3c.github.io/web-animations/#silently-set-the-current-time
 void
 Animation::SilentlySetCurrentTime(const TimeDuration& aSeekTime)
 {
   if (!mHoldTime.IsNull() ||
       mStartTime.IsNull() ||
       !mTimeline ||
       mTimeline->GetCurrentTime().IsNull() ||
@@ -776,16 +775,54 @@ Animation::CancelNoUpdate()
 
   UpdateTiming(SeekFlag::NoSeek, SyncNotifyFlag::Async);
 
   if (mTimeline) {
     mTimeline->RemoveAnimation(this);
   }
 }
 
+bool
+Animation::ShouldBeSynchronizedWithMainThread(
+  nsCSSPropertyID aProperty,
+  const nsIFrame* aFrame,
+  AnimationPerformanceWarning::Type& aPerformanceWarning) const
+{
+  // Only synchronize playing animations
+  if (!IsPlaying()) {
+    return false;
+  }
+
+  // Currently only transform animations need to be synchronized
+  if (aProperty != eCSSProperty_transform) {
+    return false;
+  }
+
+  KeyframeEffectReadOnly* keyframeEffect = mEffect
+                                           ? mEffect->AsKeyframeEffect()
+                                           : nullptr;
+  if (!keyframeEffect) {
+    return false;
+  }
+
+  // Are we starting at the same time as other geometric animations?
+  // We check this before calling ShouldBlockAsyncTransformAnimations, partly
+  // because it's cheaper, but also because it's often the most useful thing
+  // to know when you're debugging performance.
+  if (mSyncWithGeometricAnimations &&
+      keyframeEffect->HasAnimationOfProperty(eCSSProperty_transform)) {
+    aPerformanceWarning = AnimationPerformanceWarning::Type::
+                          TransformWithSyncGeometricAnimations;
+    return true;
+  }
+
+  return keyframeEffect->
+           ShouldBlockAsyncTransformAnimations(aFrame, aPerformanceWarning);
+}
+
 void
 Animation::UpdateRelevance()
 {
   bool wasRelevant = mIsRelevant;
   mIsRelevant = HasCurrentEffect() || IsInEffect();
 
   // Notify animation observers.
   if (wasRelevant && !mIsRelevant) {
@@ -934,16 +971,26 @@ Animation::NotifyEffectTimingUpdated()
 {
   MOZ_ASSERT(mEffect,
              "We should only update timing effect when we have a target "
              "effect");
   UpdateTiming(Animation::SeekFlag::NoSeek,
                Animation::SyncNotifyFlag::Async);
 }
 
+void
+Animation::NotifyGeometricAnimationsStartingThisFrame()
+{
+  if (!IsNewlyStarted() || !mEffect) {
+    return;
+  }
+
+  mSyncWithGeometricAnimations = true;
+}
+
 // https://w3c.github.io/web-animations/#play-an-animation
 void
 Animation::PlayNoUpdate(ErrorResult& aRv, LimitBehavior aLimitBehavior)
 {
   AutoMutationBatchForAnimation mb(*this);
 
   bool abortedPause = mPendingState == PendingState::PausePending;
 
@@ -999,16 +1046,21 @@ Animation::PlayNoUpdate(ErrorResult& aRv
 
   if (!reuseReadyPromise) {
     // Clear ready promise. We'll create a new one lazily.
     mReady = nullptr;
   }
 
   mPendingState = PendingState::PlayPending;
 
+  // Clear flag that causes us to sync transform animations with the main
+  // thread for now. We'll set this when we go to set up compositor
+  // animations if it applies.
+  mSyncWithGeometricAnimations = false;
+
   nsIDocument* doc = GetRenderedDocument();
   if (doc) {
     PendingAnimationTracker* tracker =
       doc->GetOrCreatePendingAnimationTracker();
     tracker->AddPlayPending(*this);
   } else {
     TriggerOnNextTick(Nullable<TimeDuration>());
   }
--- a/dom/animation/Animation.h
+++ b/dom/animation/Animation.h
@@ -4,16 +4,17 @@
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #ifndef mozilla_dom_Animation_h
 #define mozilla_dom_Animation_h
 
 #include "nsWrapperCache.h"
 #include "nsCycleCollectionParticipant.h"
+#include "mozilla/AnimationPerformanceWarning.h"
 #include "mozilla/Attributes.h"
 #include "mozilla/DOMEventTargetHelper.h"
 #include "mozilla/EffectCompositor.h" // For EffectCompositor::CascadeLevel
 #include "mozilla/LinkedList.h"
 #include "mozilla/TimeStamp.h" // for TimeStamp, TimeDuration
 #include "mozilla/dom/AnimationBinding.h" // for AnimationPlayState
 #include "mozilla/dom/AnimationEffectReadOnly.h"
 #include "mozilla/dom/AnimationTimeline.h"
@@ -30,17 +31,17 @@
 // GetTickCount().
 #ifdef GetCurrentTime
 #undef GetCurrentTime
 #endif
 
 struct JSContext;
 class nsCSSPropertyIDSet;
 class nsIDocument;
-class nsPresContext;
+class nsIFrame;
 
 namespace mozilla {
 
 class AnimValuesStyleRule;
 
 namespace dom {
 
 class CSSAnimation;
@@ -57,16 +58,17 @@ public:
   explicit Animation(nsIGlobalObject* aGlobal)
     : DOMEventTargetHelper(aGlobal)
     , mPlaybackRate(1.0)
     , mPendingState(PendingState::NotPending)
     , mAnimationIndex(sNextAnimationIndex++)
     , mFinishedAtLastComposeStyle(false)
     , mIsRelevant(false)
     , mFinishedIsResolved(false)
+    , mSyncWithGeometricAnimations(false)
   {
   }
 
   NS_DECL_ISUPPORTS_INHERITED
   NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(Animation,
                                            DOMEventTargetHelper)
 
   nsIGlobalObject* GetParentObject() const { return GetOwnerGlobal(); }
@@ -276,16 +278,21 @@ public:
 
   bool IsPlaying() const
   {
     return mPlaybackRate != 0.0 &&
            (PlayState() == AnimationPlayState::Running ||
             mPendingState == PendingState::PlayPending);
   }
 
+  bool ShouldBeSynchronizedWithMainThread(
+    nsCSSPropertyID aProperty,
+    const nsIFrame* aFrame,
+    AnimationPerformanceWarning::Type& aPerformanceWarning) const;
+
   bool IsRelevant() const { return mIsRelevant; }
   void UpdateRelevance();
 
   /**
    * Returns true if this Animation has a lower composite order than aOther.
    */
   bool HasLowerCompositeOrderThan(const Animation& aOther) const;
 
@@ -309,16 +316,17 @@ public:
    * if any.
    * Any properties contained in |aPropertiesToSkip| will not be added or
    * updated in |aStyleRule|.
    */
   void ComposeStyle(RefPtr<AnimValuesStyleRule>& aStyleRule,
                     const nsCSSPropertyIDSet& aPropertiesToSkip);
 
   void NotifyEffectTimingUpdated();
+  void NotifyGeometricAnimationsStartingThisFrame();
 
 protected:
   void SilentlySetCurrentTime(const TimeDuration& aNewCurrentTime);
   void SilentlySetPlaybackRate(double aPlaybackRate);
   void CancelNoUpdate();
   void PlayNoUpdate(ErrorResult& aRv, LimitBehavior aLimitBehavior);
   void PauseNoUpdate(ErrorResult& aRv);
   void ResumeAt(const TimeDuration& aReadyTime);
@@ -369,16 +377,28 @@ protected:
   void CancelPendingTasks();
 
   /**
    * Performs the same steps as CancelPendingTasks and also rejects and
    * recreates the ready promise if the animation was pending.
    */
   void ResetPendingTasks();
 
+  /**
+   * Returns true if this animation is not only play-pending, but has
+   * yet to be given a pending ready time. This roughly corresponds to
+   * animations that are waiting to be painted (since we set the pending
+   * ready time at the end of painting). Identifying such animations is
+   * useful because in some cases animations that are painted together
+   * may need to be synchronized.
+   */
+  bool IsNewlyStarted() const {
+    return mPendingState == PendingState::PlayPending &&
+           mPendingReadyTime.IsNull();
+  }
   bool IsPossiblyOrphanedPendingAnimation() const;
   StickyTimeDuration EffectEnd() const;
 
   nsIDocument* GetRenderedDocument() const;
 
   RefPtr<AnimationTimeline> mTimeline;
   RefPtr<AnimationEffectReadOnly> mEffect;
   // The beginning of the delay period.
@@ -428,15 +448,20 @@ protected:
 
   nsRevocableEventPtr<nsRunnableMethod<Animation>> mFinishNotificationTask;
   // True if mFinished is resolved or would be resolved if mFinished has
   // yet to be created. This is not set when mFinished is rejected since
   // in that case mFinished is immediately reset to represent a new current
   // finished promise.
   bool mFinishedIsResolved;
 
+  // True if this animation was triggered at the same time as one or more
+  // geometric animations and hence we should run any transform animations on
+  // the main thread.
+  bool mSyncWithGeometricAnimations;
+
   nsString mId;
 };
 
 } // namespace dom
 } // namespace mozilla
 
 #endif // mozilla_dom_Animation_h
--- a/dom/animation/AnimationEffectReadOnly.h
+++ b/dom/animation/AnimationEffectReadOnly.h
@@ -80,16 +80,24 @@ public:
   // Shortcut that gets the computed timing using the current local time as
   // calculated from the timeline time.
   ComputedTiming GetComputedTiming(const TimingParams* aTiming = nullptr) const;
   void GetComputedTimingAsDict(ComputedTimingProperties& aRetVal) const;
 
   virtual void SetAnimation(Animation* aAnimation) = 0;
   Animation* GetAnimation() const { return mAnimation; };
 
+  /**
+   * Returns true if this effect animates one of the properties we consider
+   * geometric properties, e.g. properties such as 'width' or 'margin-left'
+   * that we try to synchronize with transform animations, on a valid target
+   * element.
+   */
+  virtual bool AffectsGeometry() const = 0;
+
 protected:
   virtual ~AnimationEffectReadOnly();
 
   Nullable<TimeDuration> GetLocalTime() const;
 
 protected:
   RefPtr<nsIDocument> mDocument;
   RefPtr<AnimationEffectTimingReadOnly> mTiming;
--- a/dom/animation/AnimationPerformanceWarning.cpp
+++ b/dom/animation/AnimationPerformanceWarning.cpp
@@ -54,16 +54,19 @@ AnimationPerformanceWarning::ToLocalized
       key = "CompositorAnimationWarningTransformPreserve3D";
       break;
     case Type::TransformSVG:
       key = "CompositorAnimationWarningTransformSVG";
       break;
     case Type::TransformWithGeometricProperties:
       key = "CompositorAnimationWarningTransformWithGeometricProperties";
       break;
+    case Type::TransformWithSyncGeometricAnimations:
+      key = "CompositorAnimationWarningTransformWithSyncGeometricAnimations";
+      break;
     case Type::TransformFrameInactive:
       key = "CompositorAnimationWarningTransformFrameInactive";
       break;
     case Type::OpacityFrameInactive:
       key = "CompositorAnimationWarningOpacityFrameInactive";
       break;
     case Type::HasRenderingObserver:
       key = "CompositorAnimationWarningHasRenderingObserver";
--- a/dom/animation/AnimationPerformanceWarning.h
+++ b/dom/animation/AnimationPerformanceWarning.h
@@ -4,30 +4,34 @@
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #ifndef mozilla_dom_AnimationPerformanceWarning_h
 #define mozilla_dom_AnimationPerformanceWarning_h
 
 #include <initializer_list>
 
+#include "mozilla/Maybe.h"
+#include "nsTArray.h"
+
 class nsXPIDLString;
 
 namespace mozilla {
 
 // Represents the reason why we can't run the CSS property on the compositor.
 struct AnimationPerformanceWarning
 {
   enum class Type : uint8_t {
     ContentTooSmall,
     ContentTooLarge,
     TransformBackfaceVisibilityHidden,
     TransformPreserve3D,
     TransformSVG,
     TransformWithGeometricProperties,
+    TransformWithSyncGeometricAnimations,
     TransformFrameInactive,
     OpacityFrameInactive,
     HasRenderingObserver,
   };
 
   explicit AnimationPerformanceWarning(Type aType)
     : mType(aType) { }
 
--- a/dom/animation/EffectCompositor.cpp
+++ b/dom/animation/EffectCompositor.cpp
@@ -80,37 +80,35 @@ IsMatchForCompositor(const KeyframeEffec
 {
   const Animation* animation = aEffect.GetAnimation();
   MOZ_ASSERT(animation);
 
   if (!animation->IsRelevant()) {
     return MatchForCompositor::No;
   }
 
-  bool isPlaying = animation->IsPlaying();
-
-  // If we are finding animations for transform, check if there are other
-  // animations that should block the transform animation. e.g. geometric
-  // properties' animation. This check should be done regardless of whether
-  // the effect has the target property |aProperty| or not.
   AnimationPerformanceWarning::Type warningType;
-  if (aProperty == eCSSProperty_transform &&
-      isPlaying &&
-      aEffect.ShouldBlockAsyncTransformAnimations(aFrame, warningType)) {
+  if (animation->ShouldBeSynchronizedWithMainThread(aProperty, aFrame,
+                                                    warningType)) {
     EffectCompositor::SetPerformanceWarning(
       aFrame, aProperty,
       AnimationPerformanceWarning(warningType));
+    // For a given |aFrame|, we don't want some animations of |aProperty| to
+    // run on the compositor and others to run on the main thread, so if any
+    // need to be synchronized with the main thread, run them all there.
     return MatchForCompositor::NoAndBlockThisProperty;
   }
 
   if (!aEffect.HasEffectiveAnimationOfProperty(aProperty)) {
     return MatchForCompositor::No;
   }
 
-  return isPlaying ? MatchForCompositor::Yes : MatchForCompositor::IfNeeded;
+  return animation->IsPlaying()
+         ? MatchForCompositor::Yes
+         : MatchForCompositor::IfNeeded;
 }
 
 // Helper function to factor out the common logic from
 // GetAnimationsForCompositor and HasAnimationsForCompositor.
 //
 // Takes an optional array to fill with eligible animations.
 //
 // Returns true if there are eligible animations, false otherwise.
@@ -122,16 +120,28 @@ FindAnimationsForCompositor(const nsIFra
   MOZ_ASSERT(!aMatches || aMatches->IsEmpty(),
              "Matches array, if provided, should be empty");
 
   EffectSet* effects = EffectSet::GetEffectSet(aFrame);
   if (!effects || effects->IsEmpty()) {
     return false;
   }
 
+  // First check for newly-started transform animations that should be
+  // synchronized with geometric animations. We need to do this before any
+  // other early returns (the one above is ok) since we can only check this
+  // state when the animation is newly-started.
+  if (aProperty == eCSSProperty_transform) {
+    PendingAnimationTracker* tracker =
+      aFrame->PresContext()->Document()->GetPendingAnimationTracker();
+    if (tracker) {
+      tracker->MarkAnimationsThatMightNeedSynchronization();
+    }
+  }
+
   // If the property will be added to the animations level of the cascade but
   // there is an !important rule for that property in the cascade then the
   // animation will not be applied since the !important rule overrides it.
   if (effects->PropertiesWithImportantRules().HasProperty(aProperty) &&
       effects->PropertiesForAnimationsLevel().HasProperty(aProperty)) {
     return false;
   }
 
@@ -185,16 +195,19 @@ FindAnimationsForCompositor(const nsIFra
   }
 
   bool foundRunningAnimations = false;
   for (KeyframeEffectReadOnly* effect : *effects) {
     MatchForCompositor matchResult =
       IsMatchForCompositor(*effect, aProperty, aFrame);
 
     if (matchResult == MatchForCompositor::NoAndBlockThisProperty) {
+      // For a given |aFrame|, we don't want some animations of |aProperty| to
+      // run on the compositor and others to run on the main thread, so if any
+      // need to be synchronized with the main thread, run them all there.
       if (aMatches) {
         aMatches->Clear();
       }
       return false;
     }
 
     if (matchResult == MatchForCompositor::No) {
       continue;
--- a/dom/animation/KeyframeEffectReadOnly.cpp
+++ b/dom/animation/KeyframeEffectReadOnly.cpp
@@ -1250,20 +1250,31 @@ KeyframeEffectReadOnly::GetPresContext()
   }
   return shell->GetPresContext();
 }
 
 /* static */ bool
 KeyframeEffectReadOnly::IsGeometricProperty(
   const nsCSSPropertyID aProperty)
 {
+  MOZ_ASSERT(!nsCSSProps::IsShorthand(aProperty),
+             "Property should be a longhand property");
+
   switch (aProperty) {
     case eCSSProperty_bottom:
     case eCSSProperty_height:
     case eCSSProperty_left:
+    case eCSSProperty_margin_bottom:
+    case eCSSProperty_margin_left:
+    case eCSSProperty_margin_right:
+    case eCSSProperty_margin_top:
+    case eCSSProperty_padding_bottom:
+    case eCSSProperty_padding_left:
+    case eCSSProperty_padding_right:
+    case eCSSProperty_padding_top:
     case eCSSProperty_right:
     case eCSSProperty_top:
     case eCSSProperty_width:
       return true;
     default:
       return false;
   }
 }
@@ -1300,22 +1311,16 @@ KeyframeEffectReadOnly::CanAnimateTransf
   return true;
 }
 
 bool
 KeyframeEffectReadOnly::ShouldBlockAsyncTransformAnimations(
   const nsIFrame* aFrame,
   AnimationPerformanceWarning::Type& aPerformanceWarning) const
 {
-  // We currently only expect this method to be called for effects whose
-  // animations are eligible for the compositor since, Animations that are
-  // paused, zero-duration, finished etc. should not block other animations from
-  // running on the compositor.
-  MOZ_ASSERT(mAnimation && mAnimation->IsPlaying());
-
   EffectSet* effectSet =
     EffectSet::GetEffectSet(mTarget->mElement, mTarget->mPseudoType);
   for (const AnimationProperty& property : mProperties) {
     // If there is a property for animations level that is overridden by
     // !important rules, it should not block other animations from running
     // on the compositor.
     // NOTE: We don't currently check for !important rules for properties that
     // don't run on the compositor. As result such properties (e.g. margin-left)
@@ -1342,16 +1347,28 @@ KeyframeEffectReadOnly::ShouldBlockAsync
         return true;
       }
     }
   }
 
   return false;
 }
 
+bool
+KeyframeEffectReadOnly::HasGeometricProperties() const
+{
+  for (const AnimationProperty& property : mProperties) {
+    if (IsGeometricProperty(property.mProperty)) {
+      return true;
+    }
+  }
+
+  return false;
+}
+
 void
 KeyframeEffectReadOnly::SetPerformanceWarning(
   nsCSSPropertyID aProperty,
   const AnimationPerformanceWarning& aWarning)
 {
   for (AnimationProperty& property : mProperties) {
     if (property.mProperty == aProperty &&
         (!property.mPerformanceWarning ||
--- a/dom/animation/KeyframeEffectReadOnly.h
+++ b/dom/animation/KeyframeEffectReadOnly.h
@@ -311,16 +311,21 @@ public:
   // and 'top' on an element, we force all 'transform' animations running at
   // the same time on the same element to run on the main thread.
   //
   // When returning true, |aPerformanceWarning| stores the reason why
   // we shouldn't run the transform animations.
   bool ShouldBlockAsyncTransformAnimations(
     const nsIFrame* aFrame,
     AnimationPerformanceWarning::Type& aPerformanceWarning) const;
+  bool HasGeometricProperties() const;
+  bool AffectsGeometry() const override
+  {
+    return GetTarget() && HasGeometricProperties();
+  }
 
   nsIDocument* GetRenderedDocument() const;
   nsPresContext* GetPresContext() const;
   nsIPresShell* GetPresShell() const;
 
   // Associates a warning with the animated property on the specified frame
   // indicating why, for example, the property could not be animated on the
   // compositor. |aParams| and |aParamsLength| are optional parameters which
--- a/dom/animation/PendingAnimationTracker.cpp
+++ b/dom/animation/PendingAnimationTracker.cpp
@@ -80,30 +80,85 @@ PendingAnimationTracker::TriggerPendingA
       animation->TriggerOnNextTick(readyTime);
 
       iter.Remove();
     }
   };
 
   triggerAnimationsAtReadyTime(mPlayPendingSet);
   triggerAnimationsAtReadyTime(mPausePendingSet);
+
+  mHasPlayPendingGeometricAnimations = mPlayPendingSet.Count()
+                                       ? CheckState::Indeterminate
+                                       : CheckState::Absent;
 }
 
 void
 PendingAnimationTracker::TriggerPendingAnimationsNow()
 {
   auto triggerAndClearAnimations = [](AnimationSet& aAnimationSet) {
     for (auto iter = aAnimationSet.Iter(); !iter.Done(); iter.Next()) {
       iter.Get()->GetKey()->TriggerNow();
     }
     aAnimationSet.Clear();
   };
 
   triggerAndClearAnimations(mPlayPendingSet);
   triggerAndClearAnimations(mPausePendingSet);
+
+  mHasPlayPendingGeometricAnimations = CheckState::Absent;
+}
+
+void
+PendingAnimationTracker::MarkAnimationsThatMightNeedSynchronization()
+{
+  // We only ever set mHasPlayPendingGeometricAnimations to 'present' in
+  // HasPlayPendingGeometricAnimations(). So, if it is 'present' already,
+  // (i.e. before calling HasPlayPendingGeometricAnimations()) we can assume
+  // that this method has already been called for the current set of
+  // play-pending animations and it is not necessary to run again.
+  //
+  // We can't make the same assumption about 'absent', but if this method
+  // was already called and the result was 'absent', then this method is
+  // a no-op anyway so it's ok to run again.
+  //
+  // Note that *without* this optimization, starting animations would become
+  // O(n^2) in that case where each animation is on a different element and
+  // contains a compositor-animatable property since we would end up iterating
+  // over all animations in the play-pending set for each target element.
+  if (mHasPlayPendingGeometricAnimations == CheckState::Present) {
+    return;
+  }
+
+  if (!HasPlayPendingGeometricAnimations()) {
+    return;
+  }
+
+  for (auto iter = mPlayPendingSet.Iter(); !iter.Done(); iter.Next()) {
+    iter.Get()->GetKey()->NotifyGeometricAnimationsStartingThisFrame();
+  }
+}
+
+bool
+PendingAnimationTracker::HasPlayPendingGeometricAnimations()
+{
+  if (mHasPlayPendingGeometricAnimations != CheckState::Indeterminate) {
+    return mHasPlayPendingGeometricAnimations == CheckState::Present;
+  }
+
+  mHasPlayPendingGeometricAnimations = CheckState::Absent;
+  for (auto iter = mPlayPendingSet.ConstIter(); !iter.Done(); iter.Next()) {
+    auto animation = iter.Get()->GetKey();
+    if (animation->GetEffect() && animation->GetEffect()->AffectsGeometry()) {
+      mHasPlayPendingGeometricAnimations = CheckState::Present;
+      break;
+    }
+  }
+
+  return mHasPlayPendingGeometricAnimations == CheckState::Present;
 }
 
 void
 PendingAnimationTracker::EnsurePaintIsScheduled()
 {
   if (!mDocument) {
     return;
   }
--- a/dom/animation/PendingAnimationTracker.h
+++ b/dom/animation/PendingAnimationTracker.h
@@ -26,20 +26,22 @@ public:
   NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(PendingAnimationTracker)
   NS_DECL_CYCLE_COLLECTION_NATIVE_CLASS(PendingAnimationTracker)
 
   void AddPlayPending(dom::Animation& aAnimation)
   {
     MOZ_ASSERT(!IsWaitingToPause(aAnimation),
                "Animation is already waiting to pause");
     AddPending(aAnimation, mPlayPendingSet);
+    mHasPlayPendingGeometricAnimations = CheckState::Indeterminate;
   }
   void RemovePlayPending(dom::Animation& aAnimation)
   {
     RemovePending(aAnimation, mPlayPendingSet);
+    mHasPlayPendingGeometricAnimations = CheckState::Indeterminate;
   }
   bool IsWaitingToPlay(const dom::Animation& aAnimation) const
   {
     return IsWaiting(aAnimation, mPlayPendingSet);
   }
 
   void AddPausePending(dom::Animation& aAnimation)
   {
@@ -57,28 +59,43 @@ public:
   }
 
   void TriggerPendingAnimationsOnNextTick(const TimeStamp& aReadyTime);
   void TriggerPendingAnimationsNow();
   bool HasPendingAnimations() const {
     return mPlayPendingSet.Count() > 0 || mPausePendingSet.Count() > 0;
   }
 
+  /**
+   * Looks amongst the set of play-pending animations, and, if there are
+   * animations that affect geometric properties, notifies all play-pending
+   * animations so that they can be synchronized, if needed.
+   */
+  void MarkAnimationsThatMightNeedSynchronization();
+
 private:
   ~PendingAnimationTracker() { }
 
+  bool HasPlayPendingGeometricAnimations();
   void EnsurePaintIsScheduled();
 
   typedef nsTHashtable<nsRefPtrHashKey<dom::Animation>> AnimationSet;
 
   void AddPending(dom::Animation& aAnimation, AnimationSet& aSet);
   void RemovePending(dom::Animation& aAnimation, AnimationSet& aSet);
   bool IsWaiting(const dom::Animation& aAnimation,
                  const AnimationSet& aSet) const;
 
   AnimationSet mPlayPendingSet;
   AnimationSet mPausePendingSet;
   nsCOMPtr<nsIDocument> mDocument;
+
+  enum class CheckState {
+    Indeterminate,
+    Absent,
+    Present
+  };
+  CheckState mHasPlayPendingGeometricAnimations = CheckState::Indeterminate;
 };
 
 } // namespace mozilla
 
 #endif // mozilla_dom_PendingAnimationTracker_h
--- a/dom/animation/test/chrome/test_animation_performance_warning.html
+++ b/dom/animation/test/chrome/test_animation_performance_warning.html
@@ -73,17 +73,17 @@ function assert_animation_property_state
                     'warning message should match');
     }
   }
 }
 
 // Check that the animation is running on compositor and
 // warning property is not set for the CSS property regardless
 // expected values.
-function assert_property_state_on_compositor(actual, expected) {
+function assert_all_properties_running_on_compositor(actual, expected) {
   assert_equals(actual.length, expected.length);
 
   var sortedActual = actual.sort(compare_property_state);
   var sortedExpected = expected.sort(compare_property_state);
 
   for (var i = 0; i < sortedActual.length; i++) {
     assert_equals(sortedActual[i].property,
                   sortedExpected[i].property,
@@ -91,538 +91,171 @@ function assert_property_state_on_compos
     assert_true(sortedActual[i].runningOnCompositor,
                 'runningOnCompositor property should be true on ' +
                 sortedActual[i].property);
     assert_not_exists(sortedActual[i], 'warning',
                       'warning property should not be set');
   }
 }
 
-var gAnimationsTests = [
-  {
-    desc: 'animations on compositor',
-    frames: {
-      opacity: [0, 1]
-    },
-    expected: [
-      {
-        property: 'opacity',
-        runningOnCompositor: true
-      }
-    ]
-  },
-  {
-    desc: 'animations on main thread',
-    frames: {
-      backgroundColor: ['white', 'red']
+function testBasicOperation() {
+  [
+    {
+      desc: 'animations on compositor',
+      frames: {
+        opacity: [0, 1]
+      },
+      expected: [
+        {
+          property: 'opacity',
+          runningOnCompositor: true
+        }
+      ]
     },
-    expected: [
-      {
-        property: 'background-color',
-        runningOnCompositor: false
-      }
-    ]
-  },
-  {
-    desc: 'animations on both threads',
-    frames: {
-      backgroundColor: ['white', 'red'],
-      transform: ['translate(0px)', 'translate(100px)']
-    },
-    expected: [
-      {
-        property: 'background-color',
-        runningOnCompositor: false
+    {
+      desc: 'animations on main thread',
+      frames: {
+        backgroundColor: ['white', 'red']
       },
-      {
-        property: 'transform',
-        runningOnCompositor: true
-      }
-    ]
-  },
-  {
-    desc: 'two animation properties on compositor thread',
-    frames: {
-      opacity: [0, 1],
-      transform: ['translate(0px)', 'translate(100px)']
+      expected: [
+        {
+          property: 'background-color',
+          runningOnCompositor: false
+        }
+      ]
     },
-    expected: [
-      {
-        property: 'opacity',
-        runningOnCompositor: true
+    {
+      desc: 'animations on both threads',
+      frames: {
+        backgroundColor: ['white', 'red'],
+        transform: ['translate(0px)', 'translate(100px)']
       },
-      {
-        property: 'transform',
-        runningOnCompositor: true
-      }
-    ]
-  },
-  {
-    desc: 'opacity on compositor with animation of geometric properties',
-    frames: {
-      width: ['100px', '200px'],
-      opacity: [0, 1]
-    },
-    expected: [
-      {
-        property: 'width',
-        runningOnCompositor: false
-      },
-      {
-        property: 'opacity',
-        runningOnCompositor: true
-      }
-    ]
-  },
-];
-
-// Test cases that check results of adding/removing a 'width' property on the
-// same animation object.
-var gAnimationWithGeometricKeyframeTests = [
-  {
-    desc: 'transform',
-    frames: {
-      transform: ['translate(0px)', 'translate(100px)']
-    },
-    expected: {
-      withoutGeometric: [
+      expected: [
+        {
+          property: 'background-color',
+          runningOnCompositor: false
+        },
         {
           property: 'transform',
           runningOnCompositor: true
         }
-      ],
-      withGeometric: [
-        {
-          property: 'width',
-          runningOnCompositor: false
-        },
-        {
-          property: 'transform',
-          runningOnCompositor: false,
-          warning: 'CompositorAnimationWarningTransformWithGeometricProperties'
-        }
       ]
-    }
-  },
-  {
-    desc: 'opacity and transform',
-    frames: {
-      opacity: [0, 1],
-      transform: ['translate(0px)', 'translate(100px)']
     },
-    expected: {
-      withoutGeometric: [
+    {
+      desc: 'two animation properties on compositor thread',
+      frames: {
+        opacity: [0, 1],
+        transform: ['translate(0px)', 'translate(100px)']
+      },
+      expected: [
         {
           property: 'opacity',
           runningOnCompositor: true
         },
         {
           property: 'transform',
           runningOnCompositor: true
         }
-      ],
-      withGeometric: [
+      ]
+    },
+    {
+      desc: 'opacity on compositor with animation of geometric properties',
+      frames: {
+        width: ['100px', '200px'],
+        opacity: [0, 1]
+      },
+      expected: [
         {
           property: 'width',
           runningOnCompositor: false
         },
         {
           property: 'opacity',
           runningOnCompositor: true
-        },
-        {
-          property: 'transform',
-          runningOnCompositor: false,
-          warning: 'CompositorAnimationWarningTransformWithGeometricProperties'
         }
       ]
-    }
-  },
-];
-
-// Performance warning tests that set and clear a style property.
-var gPerformanceWarningTestsStyle = [
-  {
-    desc: 'preserve-3d transform',
-    frames: {
-      transform: ['translate(0px)', 'translate(100px)']
     },
-    style: 'transform-style: preserve-3d',
-    expected: [
-      {
-        property: 'transform',
-        runningOnCompositor: false,
-        warning: 'CompositorAnimationWarningTransformPreserve3D'
-      }
-    ]
-  },
-  {
-    desc: 'transform with backface-visibility:hidden',
-    frames: {
-      transform: ['translate(0px)', 'translate(100px)']
-    },
-    style: 'backface-visibility: hidden;',
-    expected: [
-      {
-        property: 'transform',
-        runningOnCompositor: false,
-        warning: 'CompositorAnimationWarningTransformBackfaceVisibilityHidden'
-      }
-    ]
-  },
-  {
-    desc: 'opacity and transform with preserve-3d',
-    frames: {
-      opacity: [0, 1],
-      transform: ['translate(0px)', 'translate(100px)']
-    },
-    style: 'transform-style: preserve-3d',
-    expected: [
-      {
-        property: 'opacity',
-        runningOnCompositor: true
-      },
-      {
-        property: 'transform',
-        runningOnCompositor: false,
-        warning: 'CompositorAnimationWarningTransformPreserve3D'
-      }
-    ]
-  },
-  {
-    desc: 'opacity and transform with backface-visibility:hidden',
-    frames: {
-      opacity: [0, 1],
-      transform: ['translate(0px)', 'translate(100px)']
-    },
-    style: 'backface-visibility: hidden;',
-    expected: [
-      {
-        property: 'opacity',
-        runningOnCompositor: true
-      },
-      {
-        property: 'transform',
-        runningOnCompositor: false,
-        warning: 'CompositorAnimationWarningTransformBackfaceVisibilityHidden'
-      }
-    ]
-  },
-];
-
-// Performance warning tests that set and clear the id property
-var gPerformanceWarningTestsId= [
-  {
-    desc: 'moz-element referencing a transform',
-    frames: {
-      transform: ['translate(0px)', 'translate(100px)']
-    },
-    id: 'transformed',
-    createelement: 'width:100px; height:100px; background: -moz-element(#transformed)',
-    expected: [
-      {
-        property: 'transform',
-        runningOnCompositor: false,
-        warning: 'CompositorAnimationWarningHasRenderingObserver'
-      }
-    ]
-  },
-];
-
-var gMultipleAsyncAnimationsTests = [
-  {
-    desc: 'opacity and transform with preserve-3d',
-    style: 'transform-style: preserve-3d',
-    animations: [
-      {
-        frames: {
-          transform: ['translate(0px)', 'translate(100px)']
-        },
-        expected: [
-          {
-            property: 'transform',
-            runningOnCompositor: false,
-            warning: 'CompositorAnimationWarningTransformPreserve3D'
-          }
-        ]
-      },
-      {
-        frames: {
-          opacity: [0, 1]
-        },
-        expected: [
-          {
-            property: 'opacity',
-            runningOnCompositor: true,
-          }
-        ]
-      }
-    ],
-  },
-  {
-    desc: 'opacity and transform with backface-visibility:hidden',
-    style: 'backface-visibility: hidden;',
-    animations: [
-      {
-        frames: {
-          transform: ['translate(0px)', 'translate(100px)']
-        },
-        expected: [
-          {
-            property: 'transform',
-            runningOnCompositor: false,
-            warning: 'CompositorAnimationWarningTransformBackfaceVisibilityHidden'
-          }
-        ]
-      },
-      {
-        frames: {
-          opacity: [0, 1]
-        },
-        expected: [
-          {
-            property: 'opacity',
-            runningOnCompositor: true,
-          }
-        ]
-      }
-    ],
-  },
-];
-
-// Test cases that check results of adding/removing a 'width' keyframe on the
-// same animation object, where multiple animation objects belong to the same
-// element.
-// The 'width' property is added to animations[1].
-var gMultipleAsyncAnimationsWithGeometricKeyframeTests = [
-  {
-    desc: 'transform and opacity with geometric keyframes',
-    animations: [
-      {
-        frames: {
-          transform: ['translate(0px)', 'translate(100px)']
-        },
-        expected: {
-          withoutGeometric: [
-            {
-              property: 'transform',
-              runningOnCompositor: true
-            }
-          ],
-          withGeometric: [
-            {
-              property: 'transform',
-              runningOnCompositor: false,
-              warning: 'CompositorAnimationWarningTransformWithGeometricProperties'
-            }
-          ]
-        }
-      },
-      {
-        frames: {
-          opacity: [0, 1]
-        },
-        expected: {
-          withoutGeometric: [
-            {
-              property: 'opacity',
-              runningOnCompositor: true,
-            }
-          ],
-          withGeometric: [
-            {
-              property: 'width',
-              runningOnCompositor: false,
-            },
-            {
-              property: 'opacity',
-              runningOnCompositor: true,
-            }
-          ]
-        }
-      }
-    ],
-  },
-  {
-    desc: 'opacity and transform with geometric keyframes',
-    animations: [
-      {
-        frames: {
-          opacity: [0, 1]
-        },
-        expected: {
-          withoutGeometric: [
-            {
-              property: 'opacity',
-              runningOnCompositor: true,
-            }
-          ],
-          withGeometric: [
-            {
-              property: 'opacity',
-              runningOnCompositor: true,
-            }
-          ]
-        }
-      },
-      {
-        frames: {
-          transform: ['translate(0px)', 'translate(100px)']
-        },
-        expected: {
-          withoutGeometric: [
-            {
-              property: 'transform',
-              runningOnCompositor: true
-            }
-          ],
-          withGeometric: [
-            {
-              property: 'width',
-              runningOnCompositor: false,
-            },
-            {
-              property: 'transform',
-              runningOnCompositor: false,
-              warning: 'CompositorAnimationWarningTransformWithGeometricProperties'
-            }
-          ]
-        }
-      }
-    ]
-  },
-];
-
-// Test cases that check results of adding/removing 'width' animation on the
-// same element which has async animations.
-var gMultipleAsyncAnimationsWithGeometricAnimationTests = [
-  {
-    desc: 'transform',
-    animations: [
-      {
-        frames: {
-          transform: ['translate(0px)', 'translate(100px)']
-        },
-        expected: [
-          {
-            property: 'transform',
-            runningOnCompositor: false,
-            warning: 'CompositorAnimationWarningTransformWithGeometricProperties'
-          }
-        ]
-      },
-    ]
-  },
-  {
-    desc: 'opacity',
-    animations: [
-      {
-        frames: {
-          opacity: [0, 1]
-        },
-        expected: [
-          {
-            property: 'opacity',
-            runningOnCompositor: true
-          }
-        ]
-      },
-    ]
-  },
-  {
-    desc: 'opacity and transform',
-    animations: [
-      {
-        frames: {
-          transform: ['translate(0px)', 'translate(100px)']
-        },
-        expected: [
-          {
-            property: 'transform',
-            runningOnCompositor: false,
-            warning: 'CompositorAnimationWarningTransformWithGeometricProperties'
-          }
-        ]
-      },
-      {
-        frames: {
-          opacity: [0, 1]
-        },
-        expected: [
-          {
-            property: 'opacity',
-            runningOnCompositor: true,
-          }
-        ]
-      }
-    ],
-  },
-];
-
-var gAnimationsOnTooSmallElementTests = [
-  {
-    desc: 'opacity on too small element',
-    frames: {
-      opacity: [0, 1]
-    },
-    style: { style: 'width: 8px; height: 8px; background-color: red;' +
-                    // We need to set transform here to try creating an
-                    // individual frame for this opacity element.
-                    // Without this, this small element is created on the same
-                    // nsIFrame of mochitest iframe, i.e. the document which are
-                    // running this test, as a result the layer corresponding
-                    // to the frame is sent to compositor.
-                    'transform: translateX(100px);' },
-    expected: [
-      {
-        property: 'opacity',
-        runningOnCompositor: false,
-        warning: /Animation cannot be run on the compositor because frame size \(8, 8\) is smaller than \(16, 16\)/
-      }
-    ]
-  },
-  {
-    desc: 'transform on too small element',
-    frames: {
-      transform: ['translate(0px)', 'translate(100px)']
-    },
-    style: { style: 'width: 8px; height: 8px; background-color: red;' },
-    expected: [
-      {
-        property: 'transform',
-        runningOnCompositor: false,
-        warning: /Animation cannot be run on the compositor because frame size \(8, 8\) is smaller than \(16, 16\)/
-      }
-    ]
-  },
-];
-
-function start() {
-  var bundleService = SpecialPowers.Cc['@mozilla.org/intl/stringbundle;1']
-    .getService(SpecialPowers.Ci.nsIStringBundleService);
-  gStringBundle = bundleService
-    .createBundle("chrome://global/locale/layout_errors.properties");
-
-  gAnimationsTests.forEach(function(subtest) {
+  ].forEach(subtest => {
     promise_test(function(t) {
-      var animation = addDivAndAnimate(t,
-                                       { class: 'compositable' },
+      var animation = addDivAndAnimate(t, { class: 'compositable' },
                                        subtest.frames, 100 * MS_PER_SEC);
       return animation.ready.then(function() {
         assert_animation_property_state_equals(
           animation.effect.getProperties(),
           subtest.expected);
       });
     }, subtest.desc);
   });
+}
 
-  gAnimationWithGeometricKeyframeTests.forEach(function(subtest) {
+// Test adding/removing a 'width' property on the same animation object.
+function testKeyframesWithGeometricProperties() {
+  [
+    {
+      desc: 'transform',
+      frames: {
+        transform: ['translate(0px)', 'translate(100px)']
+      },
+      expected: {
+        withoutGeometric: [
+          {
+            property: 'transform',
+            runningOnCompositor: true
+          }
+        ],
+        withGeometric: [
+          {
+            property: 'width',
+            runningOnCompositor: false
+          },
+          {
+            property: 'transform',
+            runningOnCompositor: false,
+            warning: 'CompositorAnimationWarningTransformWithGeometricProperties'
+          }
+        ]
+      }
+    },
+    {
+      desc: 'opacity and transform',
+      frames: {
+        opacity: [0, 1],
+        transform: ['translate(0px)', 'translate(100px)']
+      },
+      expected: {
+        withoutGeometric: [
+          {
+            property: 'opacity',
+            runningOnCompositor: true
+          },
+          {
+            property: 'transform',
+            runningOnCompositor: true
+          }
+        ],
+        withGeometric: [
+          {
+            property: 'width',
+            runningOnCompositor: false
+          },
+          {
+            property: 'opacity',
+            runningOnCompositor: true
+          },
+          {
+            property: 'transform',
+            runningOnCompositor: false,
+            warning: 'CompositorAnimationWarningTransformWithGeometricProperties'
+          }
+        ]
+      }
+    },
+  ].forEach(subtest => {
     promise_test(function(t) {
-      var animation = addDivAndAnimate(t,
-                                       { class: 'compositable' },
+      var animation = addDivAndAnimate(t, { class: 'compositable' },
                                        subtest.frames, 100 * MS_PER_SEC);
       return animation.ready.then(function() {
         // First, a transform animation is running on compositor.
         assert_animation_property_state_equals(
           animation.effect.getProperties(),
           subtest.expected.withoutGeometric);
       }).then(function() {
         // Add a 'width' property.
@@ -651,218 +284,891 @@ function start() {
       }).then(function() {
         // Finally, the transform animation is running on compositor.
         assert_animation_property_state_equals(
           animation.effect.getProperties(),
           subtest.expected.withoutGeometric);
       });
     }, 'An animation has: ' + subtest.desc);
   });
+}
 
-  gPerformanceWarningTestsStyle.forEach(function(subtest) {
+// Test that the expected set of geometric properties all block transform
+// animations.
+function testSetOfGeometricProperties() {
+  const geometricProperties = [
+    'width', 'height',
+    'top', 'right', 'bottom', 'left',
+    'margin-top', 'margin-right', 'margin-bottom', 'margin-left',
+    'padding-top', 'padding-right', 'padding-bottom', 'padding-left'
+  ];
+
+  geometricProperties.forEach(property => {
     promise_test(function(t) {
-      var animation = addDivAndAnimate(t,
-                                       { class: 'compositable' },
+      const keyframes = {
+        [propertyToIDL(property)]: [ '100px', '200px' ],
+        transform: [ 'translate(0px)', 'translate(100px)' ]
+      };
+      var animation = addDivAndAnimate(t, { class: 'compositable' },
+                                       keyframes, 100 * MS_PER_SEC);
+
+      return animation.ready.then(function() {
+        assert_animation_property_state_equals(
+          animation.effect.getProperties(),
+          [
+            {
+              property,
+              runningOnCompositor: false
+            },
+            {
+              property: 'transform',
+              runningOnCompositor: false,
+              warning: 'CompositorAnimationWarningTransformWithSyncGeometricAnimations'
+            }
+          ]);
+      }, 'Transform animation should be run on the main thread');
+    }, `${property} is treated as a geometric property`);
+  });
+}
+
+// Performance warning tests that set and clear a style property.
+function testStyleChanges() {
+  [
+    {
+      desc: 'preserve-3d transform',
+      frames: {
+        transform: ['translate(0px)', 'translate(100px)']
+      },
+      style: 'transform-style: preserve-3d',
+      expected: [
+        {
+          property: 'transform',
+          runningOnCompositor: false,
+          warning: 'CompositorAnimationWarningTransformPreserve3D'
+        }
+      ]
+    },
+    {
+      desc: 'transform with backface-visibility:hidden',
+      frames: {
+        transform: ['translate(0px)', 'translate(100px)']
+      },
+      style: 'backface-visibility: hidden;',
+      expected: [
+        {
+          property: 'transform',
+          runningOnCompositor: false,
+          warning: 'CompositorAnimationWarningTransformBackfaceVisibilityHidden'
+        }
+      ]
+    },
+    {
+      desc: 'opacity and transform with preserve-3d',
+      frames: {
+        opacity: [0, 1],
+        transform: ['translate(0px)', 'translate(100px)']
+      },
+      style: 'transform-style: preserve-3d',
+      expected: [
+        {
+          property: 'opacity',
+          runningOnCompositor: true
+        },
+        {
+          property: 'transform',
+          runningOnCompositor: false,
+          warning: 'CompositorAnimationWarningTransformPreserve3D'
+        }
+      ]
+    },
+    {
+      desc: 'opacity and transform with backface-visibility:hidden',
+      frames: {
+        opacity: [0, 1],
+        transform: ['translate(0px)', 'translate(100px)']
+      },
+      style: 'backface-visibility: hidden;',
+      expected: [
+        {
+          property: 'opacity',
+          runningOnCompositor: true
+        },
+        {
+          property: 'transform',
+          runningOnCompositor: false,
+          warning: 'CompositorAnimationWarningTransformBackfaceVisibilityHidden'
+        }
+      ]
+    },
+  ].forEach(subtest => {
+    promise_test(function(t) {
+      var animation = addDivAndAnimate(t, { class: 'compositable' },
                                        subtest.frames, 100 * MS_PER_SEC);
       return animation.ready.then(function() {
-        assert_property_state_on_compositor(
+        assert_all_properties_running_on_compositor(
           animation.effect.getProperties(),
           subtest.expected);
         animation.effect.target.style = subtest.style;
         return waitForFrame();
       }).then(function() {
         assert_animation_property_state_equals(
           animation.effect.getProperties(),
           subtest.expected);
         animation.effect.target.style = '';
         return waitForFrame();
       }).then(function() {
-        assert_property_state_on_compositor(
+        assert_all_properties_running_on_compositor(
           animation.effect.getProperties(),
           subtest.expected);
       });
     }, subtest.desc);
   });
+}
 
-  gPerformanceWarningTestsId.forEach(function(subtest) {
+// Performance warning tests that set and clear the id property
+function testIdChanges() {
+  [
+    {
+      desc: 'moz-element referencing a transform',
+      frames: {
+        transform: ['translate(0px)', 'translate(100px)']
+      },
+      id: 'transformed',
+      createelement: 'width:100px; height:100px; background: -moz-element(#transformed)',
+      expected: [
+        {
+          property: 'transform',
+          runningOnCompositor: false,
+          warning: 'CompositorAnimationWarningHasRenderingObserver'
+        }
+      ]
+    },
+  ].forEach(subtest => {
     promise_test(function(t) {
       if (subtest.createelement) {
         addDiv(t, { style: subtest.createelement });
       }
 
-      var animation = addDivAndAnimate(t,
-                                       { class: 'compositable' },
+      var animation = addDivAndAnimate(t, { class: 'compositable' },
                                        subtest.frames, 100 * MS_PER_SEC);
       return animation.ready.then(function() {
-        assert_property_state_on_compositor(
+        assert_all_properties_running_on_compositor(
           animation.effect.getProperties(),
           subtest.expected);
         animation.effect.target.id = subtest.id;
         return waitForFrame();
       }).then(function() {
         assert_animation_property_state_equals(
           animation.effect.getProperties(),
           subtest.expected);
         animation.effect.target.id = '';
         return waitForFrame();
       }).then(function() {
-        assert_property_state_on_compositor(
+        assert_all_properties_running_on_compositor(
           animation.effect.getProperties(),
           subtest.expected);
       });
     }, subtest.desc);
   });
+}
 
-  gMultipleAsyncAnimationsTests.forEach(function(subtest) {
+function testMultipleAnimations() {
+  [
+    {
+      desc: 'opacity and transform with preserve-3d',
+      style: 'transform-style: preserve-3d',
+      animations: [
+        {
+          frames: {
+            transform: ['translate(0px)', 'translate(100px)']
+          },
+          expected: [
+            {
+              property: 'transform',
+              runningOnCompositor: false,
+              warning: 'CompositorAnimationWarningTransformPreserve3D'
+            }
+          ]
+        },
+        {
+          frames: {
+            opacity: [0, 1]
+          },
+          expected: [
+            {
+              property: 'opacity',
+              runningOnCompositor: true,
+            }
+          ]
+        }
+      ],
+    },
+    {
+      desc: 'opacity and transform with backface-visibility:hidden',
+      style: 'backface-visibility: hidden;',
+      animations: [
+        {
+          frames: {
+            transform: ['translate(0px)', 'translate(100px)']
+          },
+          expected: [
+            {
+              property: 'transform',
+              runningOnCompositor: false,
+              warning: 'CompositorAnimationWarningTransformBackfaceVisibilityHidden'
+            }
+          ]
+        },
+        {
+          frames: {
+            opacity: [0, 1]
+          },
+          expected: [
+            {
+              property: 'opacity',
+              runningOnCompositor: true,
+            }
+          ]
+        }
+      ],
+    },
+  ].forEach(subtest => {
     promise_test(function(t) {
       var div = addDiv(t, { class: 'compositable' });
       var animations = subtest.animations.map(function(anim) {
         var animation = div.animate(anim.frames, 100 * MS_PER_SEC);
 
         // Bind expected values to animation object.
         animation.expected = anim.expected;
         return animation;
       });
       return waitForAllAnimations(animations).then(function() {
-        animations.forEach(function(anim) {
-          assert_property_state_on_compositor(
+        animations.forEach(anim => {
+          assert_all_properties_running_on_compositor(
             anim.effect.getProperties(),
             anim.expected);
         });
         div.style = subtest.style;
         return waitForFrame();
       }).then(function() {
-        animations.forEach(function(anim) {
+        animations.forEach(anim => {
           assert_animation_property_state_equals(
             anim.effect.getProperties(),
             anim.expected);
         });
         div.style = '';
         return waitForFrame();
       }).then(function() {
-        animations.forEach(function(anim) {
-          assert_property_state_on_compositor(
+        animations.forEach(anim => {
+          assert_all_properties_running_on_compositor(
             anim.effect.getProperties(),
             anim.expected);
         });
       });
     }, 'Multiple animations: ' + subtest.desc);
   });
+}
 
-  gMultipleAsyncAnimationsWithGeometricKeyframeTests.forEach(function(subtest) {
+// Test adding/removing a 'width' keyframe on the same animation object, where
+// multiple animation objects belong to the same element.
+// The 'width' property is added to animations[1].
+function testMultipleAnimationsWithGeometricKeyframes() {
+  [
+    {
+      desc: 'transform and opacity with geometric keyframes',
+      animations: [
+        {
+          frames: {
+            transform: ['translate(0px)', 'translate(100px)']
+          },
+          expected: {
+            withoutGeometric: [
+              {
+                property: 'transform',
+                runningOnCompositor: true
+              }
+            ],
+            withGeometric: [
+              {
+                property: 'transform',
+                runningOnCompositor: false,
+                warning: 'CompositorAnimationWarningTransformWithGeometricProperties'
+              }
+            ]
+          }
+        },
+        {
+          frames: {
+            opacity: [0, 1]
+          },
+          expected: {
+            withoutGeometric: [
+              {
+                property: 'opacity',
+                runningOnCompositor: true,
+              }
+            ],
+            withGeometric: [
+              {
+                property: 'width',
+                runningOnCompositor: false,
+              },
+              {
+                property: 'opacity',
+                runningOnCompositor: true,
+              }
+            ]
+          }
+        }
+      ],
+    },
+    {
+      desc: 'opacity and transform with geometric keyframes',
+      animations: [
+        {
+          frames: {
+            opacity: [0, 1]
+          },
+          expected: {
+            withoutGeometric: [
+              {
+                property: 'opacity',
+                runningOnCompositor: true,
+              }
+            ],
+            withGeometric: [
+              {
+                property: 'opacity',
+                runningOnCompositor: true,
+              }
+            ]
+          }
+        },
+        {
+          frames: {
+            transform: ['translate(0px)', 'translate(100px)']
+          },
+          expected: {
+            withoutGeometric: [
+              {
+                property: 'transform',
+                runningOnCompositor: true
+              }
+            ],
+            withGeometric: [
+              {
+                property: 'width',
+                runningOnCompositor: false,
+              },
+              {
+                property: 'transform',
+                runningOnCompositor: false,
+                warning: 'CompositorAnimationWarningTransformWithGeometricProperties'
+              }
+            ]
+          }
+        }
+      ]
+    },
+  ].forEach(subtest => {
     promise_test(function(t) {
       var div = addDiv(t, { class: 'compositable' });
       var animations = subtest.animations.map(function(anim) {
         var animation = div.animate(anim.frames, 100 * MS_PER_SEC);
 
         // Bind expected values to animation object.
         animation.expected = anim.expected;
         return animation;
       });
       return waitForAllAnimations(animations).then(function() {
         // First, all animations are running on compositor.
-        animations.forEach(function(anim) {
+        animations.forEach(anim => {
           assert_animation_property_state_equals(
             anim.effect.getProperties(),
             anim.expected.withoutGeometric);
         });
       }).then(function() {
         // Add a 'width' property to animations[1].
         var keyframes = animations[1].effect.getKeyframes();
 
         keyframes[0].width = '100px';
         keyframes[1].width = '200px';
 
         animations[1].effect.setKeyframes(keyframes);
         return waitForFrame();
       }).then(function() {
         // Now the transform animation is not running on compositor because of
         // the 'width' property.
-        animations.forEach(function(anim) {
+        animations.forEach(anim => {
           assert_animation_property_state_equals(
             anim.effect.getProperties(),
             anim.expected.withGeometric);
         });
       }).then(function() {
         // Remove the 'width' property from animations[1].
         var keyframes = animations[1].effect.getKeyframes();
 
         delete keyframes[0].width;
         delete keyframes[1].width;
 
         animations[1].effect.setKeyframes(keyframes);
         return waitForFrame();
       }).then(function() {
         // Finally, all animations are running on compositor.
-        animations.forEach(function(anim) {
+        animations.forEach(anim => {
           assert_animation_property_state_equals(
             anim.effect.getProperties(),
             anim.expected.withoutGeometric);
         });
       });
     }, 'Multiple animations with geometric property: ' + subtest.desc);
   });
+}
 
-  gMultipleAsyncAnimationsWithGeometricAnimationTests.forEach(function(subtest) {
+// Tests adding/removing 'width' animation on the same element which has async
+// animations.
+function testMultipleAnimationsWithGeometricAnimations() {
+  [
+    {
+      desc: 'transform',
+      animations: [
+        {
+          frames: {
+            transform: ['translate(0px)', 'translate(100px)']
+          },
+          expected: [
+            {
+              property: 'transform',
+              runningOnCompositor: false,
+              warning: 'CompositorAnimationWarningTransformWithGeometricProperties'
+            }
+          ]
+        },
+      ]
+    },
+    {
+      desc: 'opacity',
+      animations: [
+        {
+          frames: {
+            opacity: [0, 1]
+          },
+          expected: [
+            {
+              property: 'opacity',
+              runningOnCompositor: true
+            }
+          ]
+        },
+      ]
+    },
+    {
+      desc: 'opacity and transform',
+      animations: [
+        {
+          frames: {
+            transform: ['translate(0px)', 'translate(100px)']
+          },
+          expected: [
+            {
+              property: 'transform',
+              runningOnCompositor: false,
+              warning: 'CompositorAnimationWarningTransformWithGeometricProperties'
+            }
+          ]
+        },
+        {
+          frames: {
+            opacity: [0, 1]
+          },
+          expected: [
+            {
+              property: 'opacity',
+              runningOnCompositor: true,
+            }
+          ]
+        }
+      ],
+    },
+  ].forEach(subtest => {
     promise_test(function(t) {
       var div = addDiv(t, { class: 'compositable' });
       var animations = subtest.animations.map(function(anim) {
         var animation = div.animate(anim.frames, 100 * MS_PER_SEC);
 
         // Bind expected values to animation object.
         animation.expected = anim.expected;
         return animation;
       });
 
       var widthAnimation;
 
       return waitForAllAnimations(animations).then(function() {
-        animations.forEach(function(anim) {
-          assert_property_state_on_compositor(
+        animations.forEach(anim => {
+          assert_all_properties_running_on_compositor(
             anim.effect.getProperties(),
             anim.expected);
         });
       }).then(function() {
         // Append 'width' animation on the same element.
         widthAnimation = div.animate({ width: ['100px', '200px'] },
                                      100 * MS_PER_SEC);
         return waitForFrame();
       }).then(function() {
         // Now transform animations are not running on compositor because of
         // the 'width' animation.
-        animations.forEach(function(anim) {
+        animations.forEach(anim => {
           assert_animation_property_state_equals(
             anim.effect.getProperties(),
             anim.expected);
         });
         // Remove the 'width' animation.
         widthAnimation.cancel();
         return waitForFrame();
       }).then(function() {
         // Now all animations are running on compositor.
-        animations.forEach(function(anim) {
-          assert_property_state_on_compositor(
+        animations.forEach(anim => {
+          assert_all_properties_running_on_compositor(
             anim.effect.getProperties(),
             anim.expected);
         });
       });
     }, 'Multiple async animations and geometric animation: ' + subtest.desc);
   });
+}
 
-  gAnimationsOnTooSmallElementTests.forEach(function(subtest) {
+function testSmallElements() {
+  [
+    {
+      desc: 'opacity on too small element',
+      frames: {
+        opacity: [0, 1]
+      },
+      style: { style: 'width: 8px; height: 8px; background-color: red;' +
+                      // We need to set transform here to try creating an
+                      // individual frame for this opacity element.
+                      // Without this, this small element is created on the same
+                      // nsIFrame of mochitest iframe, i.e. the document which are
+                      // running this test, as a result the layer corresponding
+                      // to the frame is sent to compositor.
+                      'transform: translateX(100px);' },
+      expected: [
+        {
+          property: 'opacity',
+          runningOnCompositor: false,
+          warning: /Animation cannot be run on the compositor because frame size \(8, 8\) is smaller than \(16, 16\)/
+        }
+      ]
+    },
+    {
+      desc: 'transform on too small element',
+      frames: {
+        transform: ['translate(0px)', 'translate(100px)']
+      },
+      style: { style: 'width: 8px; height: 8px; background-color: red;' },
+      expected: [
+        {
+          property: 'transform',
+          runningOnCompositor: false,
+          warning: /Animation cannot be run on the compositor because frame size \(8, 8\) is smaller than \(16, 16\)/
+        }
+      ]
+    },
+  ].forEach(subtest => {
     promise_test(function(t) {
     var div = addDiv(t, subtest.style);
     var animation = div.animate(subtest.frames, 100 * MS_PER_SEC);
       return animation.ready.then(function() {
         assert_animation_property_state_equals(
           animation.effect.getProperties(),
           subtest.expected);
       });
     }, subtest.desc);
   });
+}
+
+function testSynchronizedAnimations() {
+  promise_test(function(t) {
+    const elemA = addDiv(t, { class: 'compositable' });
+    const elemB = addDiv(t, { class: 'compositable' });
+
+    const animA = elemA.animate({ transform: [ 'translate(0px)',
+                                               'translate(100px)' ] },
+                                100 * MS_PER_SEC);
+    const animB = elemB.animate({ marginLeft: [ '0px', '100px' ] },
+                                100 * MS_PER_SEC);
+
+    return Promise.all([animA.ready, animB.ready])
+      .then(() => {
+        assert_animation_property_state_equals(
+          animA.effect.getProperties(),
+          [ { property: 'transform',
+              runningOnCompositor: false,
+              warning: 'CompositorAnimationWarningTransformWithSyncGeometricAnimations'
+          } ]);
+      });
+  }, 'Animations created within the same tick are synchronized'
+     + ' (compositor animation created first)');
+
+  promise_test(function(t) {
+    const elemA = addDiv(t, { class: 'compositable' });
+    const elemB = addDiv(t, { class: 'compositable' });
+
+    const animA = elemA.animate({ marginLeft: [ '0px', '100px' ] },
+                                100 * MS_PER_SEC);
+    const animB = elemB.animate({ transform: [ 'translate(0px)',
+                                               'translate(100px)' ] },
+                                100 * MS_PER_SEC);
+
+    return Promise.all([animA.ready, animB.ready])
+      .then(() => {
+        assert_animation_property_state_equals(
+          animB.effect.getProperties(),
+          [ { property: 'transform',
+              runningOnCompositor: false,
+              warning: 'CompositorAnimationWarningTransformWithSyncGeometricAnimations'
+          } ]);
+      });
+  }, 'Animations created within the same tick are synchronized'
+     + ' (compositor animation created second)');
+
+  promise_test(function(t) {
+    const attrs = { class: 'compositable',
+                    style: 'transition: all 100s' };
+    const elemA = addDiv(t, attrs);
+    const elemB = addDiv(t, attrs);
+    elemA.style.transform = 'translate(0px)';
+    elemB.style.marginLeft = '0px';
+    getComputedStyle(elemA).transform;
+    getComputedStyle(elemB).marginLeft;
+
+    // Generally the sequence of steps is as follows:
+    //
+    //   Tick -> requestAnimationFrame -> Style -> Paint -> Events (-> Tick...)
+    //
+    // In this test we want to set up two transitions during the "Events"
+    // stage but only flush style for one such that the second one is actually
+    // generated during the "Style" stage of the *next* tick.
+    //
+    // Web content often generates transitions in this way (that is, it doesn't
+    // pay regard to when style is flushed and nor should it). However, we
+    // still want transitions generated in this way to be synchronized.
+    let timeForFirstFrame;
+    return waitForIdleCallback()
+      .then(() => {
+        timeForFirstFrame = document.timeline.currentTime;
+        elemA.style.transform = 'translate(100px)';
+        // Flush style to trigger first transition
+        getComputedStyle(elemA).transform;
+        elemB.style.marginLeft = '100px';
+        // DON'T flush style here (this includes calling getAnimations!)
+        return waitForFrame();
+      }).then(() => {
+        assert_not_equals(timeForFirstFrame, document.timeline.currentTime,
+                          'Should be on the other side of a tick');
+        // Wait another tick so we can let the transition be started
+        // by regular style resolution.
+        return waitForFrame();
+      }).then(() => {
+        const transitionA = elemA.getAnimations()[0];
+        assert_animation_property_state_equals(
+          transitionA.effect.getProperties(),
+          [ { property: 'transform',
+              runningOnCompositor: false,
+              warning: 'CompositorAnimationWarningTransformWithSyncGeometricAnimations'
+          } ]);
+      });
+  }, 'Transitions created before and after a tick are synchronized');
+
+  promise_test(function(t) {
+    const elemA = addDiv(t, { class: 'compositable' });
+    const elemB = addDiv(t, { class: 'compositable' });
+
+    const animA = elemA.animate({ transform: [ 'translate(0px)',
+                                               'translate(100px)' ],
+                                  opacity: [ 0, 1 ] },
+                                100 * MS_PER_SEC);
+    const animB = elemB.animate({ marginLeft: [ '0px', '100px' ] },
+                                100 * MS_PER_SEC);
+
+    return Promise.all([animA.ready, animB.ready])
+      .then(() => {
+        assert_animation_property_state_equals(
+          animA.effect.getProperties(),
+          [ { property: 'transform',
+              runningOnCompositor: false,
+              warning: 'CompositorAnimationWarningTransformWithSyncGeometricAnimations'
+            },
+            { property: 'opacity',
+              runningOnCompositor: true
+            } ]);
+      });
+  }, 'Opacity animations on the same element continue running on the'
+     + ' compositor when transform animations are synchronized with geometric'
+     + ' animations');
+
+  promise_test(function(t) {
+    const elemA = addDiv(t, { class: 'compositable' });
+    const elemB = addDiv(t, { class: 'compositable' });
+
+    const animA = elemA.animate({ marginLeft: [ '0px', '100px' ] },
+                                100 * MS_PER_SEC);
+    let animB;
+
+    return waitForFrame()
+      .then(() => {
+        animB = elemB.animate({ transform: [ 'translate(0px)',
+                                             'translate(100px)' ] },
+                                100 * MS_PER_SEC);
+        return animB.ready;
+      }).then(() => {
+        assert_animation_property_state_equals(
+          animB.effect.getProperties(),
+          [ { property: 'transform',
+              runningOnCompositor: true } ]);
+      });
+  }, 'Transform animations are NOT synchronized with geometric animations'
+     + ' started in the previous frame');
+
+  promise_test(function(t) {
+    const elemA = addDiv(t, { class: 'compositable' });
+    const elemB = addDiv(t, { class: 'compositable' });
+
+    const animA = elemA.animate({ transform: [ 'translate(0px)',
+                                               'translate(100px)' ] },
+                                100 * MS_PER_SEC);
+    let animB;
+
+    return waitForFrame()
+      .then(() => {
+        animB = elemB.animate({ marginLeft: [ '0px', '100px' ] },
+                              100 * MS_PER_SEC);
+        return animB.ready;
+      }).then(() => {
+        assert_animation_property_state_equals(
+          animA.effect.getProperties(),
+          [ { property: 'transform',
+              runningOnCompositor: true } ]);
+      });
+  }, 'Transform animations are NOT synchronized with geometric animations'
+     + ' started in the next frame');
+
+  promise_test(function(t) {
+    const elemA = addDiv(t, { class: 'compositable' });
+    const elemB = addDiv(t, { class: 'compositable' });
+
+    const animA = elemA.animate({ transform: [ 'translate(0px)',
+                                               'translate(100px)' ] },
+                                100 * MS_PER_SEC);
+    const animB = elemB.animate({ marginLeft: [ '0px', '100px' ] },
+                                100 * MS_PER_SEC);
+    animB.pause();
+
+    return Promise.all([animA.ready, animB.ready])
+      .then(() => {
+        assert_animation_property_state_equals(
+          animA.effect.getProperties(),
+          [ { property: 'transform', runningOnCompositor: true } ]);
+      });
+  }, 'Paused animations are not synchronized');
+
+  promise_test(function(t) {
+    const elemA = addDiv(t, { class: 'compositable' });
+    const elemB = addDiv(t, { class: 'compositable' });
+
+    const animA = elemA.animate({ transform: [ 'translate(0px)',
+                                               'translate(100px)' ] },
+                                100 * MS_PER_SEC);
+    const animB = elemB.animate({ marginLeft: [ '0px', '100px' ] },
+                                100 * MS_PER_SEC);
+
+    // Seek one of the animations so that their start times will differ
+    animA.currentTime = 5000;
+
+    return Promise.all([animA.ready, animB.ready])
+      .then(() => {
+        assert_not_equals(animA.startTime, animB.startTime,
+                          'Animations should have different start times');
+        assert_animation_property_state_equals(
+          animA.effect.getProperties(),
+          [ { property: 'transform',
+              runningOnCompositor: false,
+              warning: 'CompositorAnimationWarningTransformWithSyncGeometricAnimations'
+          } ]);
+      });
+  }, 'Animations are synchronized based on when they are started'
+     + ' and NOT their start time');
+
+  promise_test(function(t) {
+    const elemA = addDiv(t, { class: 'compositable' });
+    const elemB = addDiv(t, { class: 'compositable' });
+
+    const animA = elemA.animate({ transform: [ 'translate(0px)',
+                                               'translate(100px)' ] },
+                                100 * MS_PER_SEC);
+    const animB = elemB.animate({ marginLeft: [ '0px', '100px' ] },
+                                100 * MS_PER_SEC);
+
+    return Promise.all([animA.ready, animB.ready])
+      .then(() => {
+        assert_animation_property_state_equals(
+          animA.effect.getProperties(),
+          [ { property: 'transform',
+              runningOnCompositor: false } ]);
+        // Restart animation
+        animA.pause();
+        animA.play();
+        return animA.ready;
+      }).then(() => {
+        assert_animation_property_state_equals(
+          animA.effect.getProperties(),
+          [ { property: 'transform',
+              runningOnCompositor: true } ]);
+      });
+  }, 'An initially synchronized animation may be unsynchronized if restarted');
+
+  promise_test(function(t) {
+    const elemA = addDiv(t, { class: 'compositable' });
+    const elemB = addDiv(t, { class: 'compositable' });
+
+    const animA = elemA.animate({ transform: [ 'translate(0px)',
+                                               'translate(100px)' ] },
+                                100 * MS_PER_SEC);
+    const animB = elemB.animate({ marginLeft: [ '0px', '100px' ] },
+                                100 * MS_PER_SEC);
+
+    // Clear target effect
+    animB.effect.target = null;
+
+    return Promise.all([animA.ready, animB.ready])
+      .then(() => {
+        assert_animation_property_state_equals(
+          animA.effect.getProperties(),
+          [ { property: 'transform',
+              runningOnCompositor: true } ]);
+      });
+  }, 'A geometric animation with no target element is not synchronized');
+}
+
+function start() {
+  var bundleService = SpecialPowers.Cc['@mozilla.org/intl/stringbundle;1']
+    .getService(SpecialPowers.Ci.nsIStringBundleService);
+  gStringBundle = bundleService
+    .createBundle("chrome://global/locale/layout_errors.properties");
+
+  testBasicOperation();
+  testKeyframesWithGeometricProperties();
+  testSetOfGeometricProperties();
+  testStyleChanges();
+  testIdChanges();
+  testMultipleAnimations();
+  testMultipleAnimationsWithGeometricKeyframes();
+  testMultipleAnimationsWithGeometricAnimations();
+  testSmallElements();
+  testSynchronizedAnimations();
 
   promise_test(function(t) {
     var animation = addDivAndAnimate(t,
                                      { class: 'compositable' },
                                      { transform: [ 'translate(0px)',
                                                     'translate(100px)'] },
                                      100 * MS_PER_SEC);
     return animation.ready.then(function() {
--- a/dom/animation/test/mozilla/file_discrete-animations.html
+++ b/dom/animation/test/mozilla/file_discrete-animations.html
@@ -138,28 +138,16 @@ for (let property in gMozillaSpecificPro
     testAnimationSamples(animation, idlName,
                          [{ time: 0,    expected: from.toLowerCase() },
                           { time: 940,  expected: from.toLowerCase() },
                           { time: 960,  expected: to.toLowerCase() }]);
   }, property + " should animate between '"
    + from + "' and '" + to + "' with keyframe easing");
 }
 
-function propertyToIDL(property) {
-  var prefixMatch = property.match(/^-(\w+)-/);
-  if (prefixMatch) {
-    var prefix = prefixMatch[1] === "moz" ? "Moz" : prefixMatch[1];
-    property = prefix + property.substring(prefixMatch[0].length - 1);
-  }
-  // https://drafts.csswg.org/cssom/#css-property-to-idl-attribute
-  return property.replace(/-([a-z])/gi, function(str, group) {
-    return group.toUpperCase();
-  });
-}
-
 function testAnimationSamples(animation, idlName, testSamples) {
   const target = animation.effect.target;
   testSamples.forEach(testSample => {
     animation.currentTime = testSample.time;
     assert_equals(getComputedStyle(target)[idlName], testSample.expected,
                   "The value should be " + testSample.expected +
                   " at " + testSample.time + "ms");
   });
--- a/dom/animation/test/testcommon.js
+++ b/dom/animation/test/testcommon.js
@@ -133,25 +133,50 @@ function addStyle(t, rules) {
   if (t && typeof t.add_cleanup === 'function') {
     t.add_cleanup(function() {
       extraStyle.remove();
     });
   }
 }
 
 /**
+ * Takes a CSS property (e.g. margin-left) and returns the equivalent IDL
+ * name (e.g. marginLeft).
+ */
+function propertyToIDL(property) {
+  var prefixMatch = property.match(/^-(\w+)-/);
+  if (prefixMatch) {
+    var prefix = prefixMatch[1] === 'moz' ? 'Moz' : prefixMatch[1];
+    property = prefix + property.substring(prefixMatch[0].length - 1);
+  }
+  // https://drafts.csswg.org/cssom/#css-property-to-idl-attribute
+  return property.replace(/-([a-z])/gi, function(str, group) {
+    return group.toUpperCase();
+  });
+}
+
+/**
  * Promise wrapper for requestAnimationFrame.
  */
 function waitForFrame() {
   return new Promise(function(resolve, reject) {
     window.requestAnimationFrame(resolve);
   });
 }
 
 /**
+ * Promise wrapper for requestIdleCallback.
+ */
+function waitForIdleCallback() {
+  return new Promise(function(resolve, reject) {
+    window.requestIdleCallback(resolve);
+  });
+}
+
+/**
  * Returns a Promise that is resolved after the given number of consecutive
  * animation frames have occured (using requestAnimationFrame callbacks).
  *
  * @param frameCount  The number of animation frames.
  * @param onFrame  An optional function to be processed in each animation frame.
  */
 function waitForAnimationFrames(frameCount, onFrame) {
   return new Promise(function(resolve, reject) {
@@ -209,17 +234,17 @@ if (opener) {
     opener.add_completion_callback(function() {
       self.close();
     });
     opener.done();
   }
 }
 
 /**
- * Return a new MutaionObserver which started observing |target| element
+ * Return a new MutationObserver which started observing |target| element
  * with { animations: true, subtree: |subtree| } option.
  * NOTE: This observer should be used only with takeRecords(). If any of
  * MutationRecords are observed in the callback of the MutationObserver,
  * it will raise an assertion.
  */
 function setupSynchronousObserver(t, target, subtree) {
    var observer = new MutationObserver(records => {
      assert_unreached("Any MutationRecords should not be observed in this " +
--- a/dom/canvas/WebGL2ContextFramebuffers.cpp
+++ b/dom/canvas/WebGL2ContextFramebuffers.cpp
@@ -100,60 +100,73 @@ WebGL2Context::GetFramebufferAttachmentP
                                                  GLenum attachment,
                                                  GLenum pname,
                                                  ErrorResult& out_error)
 {
     return WebGLContext::GetFramebufferAttachmentParameter(cx, target, attachment, pname,
                                                            out_error);
 }
 
-// Map attachments intended for the default buffer, to attachments for a non-
-// default buffer.
+////
+
 static bool
-TranslateDefaultAttachments(const dom::Sequence<GLenum>& in, dom::Sequence<GLenum>* out)
+ValidateBackbufferAttachmentEnum(WebGLContext* webgl, const char* funcName,
+                                 GLenum attachment)
 {
-    for (size_t i = 0; i < in.Length(); i++) {
-        switch (in[i]) {
-            case LOCAL_GL_COLOR:
-                if (!out->AppendElement(LOCAL_GL_COLOR_ATTACHMENT0, fallible)) {
-                    return false;
-                }
-                break;
+    switch (attachment) {
+    case LOCAL_GL_COLOR:
+    case LOCAL_GL_DEPTH:
+    case LOCAL_GL_STENCIL:
+        return true;
 
-            case LOCAL_GL_DEPTH:
-                if (!out->AppendElement(LOCAL_GL_DEPTH_ATTACHMENT, fallible)) {
-                    return false;
-                }
-                break;
+    default:
+        webgl->ErrorInvalidEnum("%s: attachment: invalid enum value 0x%x.",
+                                funcName, attachment);
+        return false;
+    }
+}
 
-            case LOCAL_GL_STENCIL:
-                if (!out->AppendElement(LOCAL_GL_STENCIL_ATTACHMENT, fallible)) {
-                    return false;
-                }
-                break;
-        }
+static bool
+ValidateFramebufferAttachmentEnum(WebGLContext* webgl, const char* funcName,
+                                  GLenum attachment)
+{
+    if (attachment >= LOCAL_GL_COLOR_ATTACHMENT0 &&
+        attachment <= webgl->LastColorAttachmentEnum())
+    {
+        return true;
     }
 
-    return true;
+    switch (attachment) {
+    case LOCAL_GL_DEPTH_ATTACHMENT:
+    case LOCAL_GL_STENCIL_ATTACHMENT:
+    case LOCAL_GL_DEPTH_STENCIL_ATTACHMENT:
+        return true;
+
+    default:
+        webgl->ErrorInvalidEnum("%s: attachment: invalid enum value 0x%x.",
+                                funcName, attachment);
+        return false;
+    }
 }
 
-void
-WebGL2Context::InvalidateFramebuffer(GLenum target,
-                                     const dom::Sequence<GLenum>& attachments,
-                                     ErrorResult& rv)
+bool
+WebGLContext::ValidateInvalidateFramebuffer(const char* funcName, GLenum target,
+                                            const dom::Sequence<GLenum>& attachments,
+                                            ErrorResult* const out_rv,
+                                            std::vector<GLenum>* const scopedVector,
+                                            GLsizei* const out_glNumAttachments,
+                                            const GLenum** const out_glAttachments)
 {
-    const char funcName[] = "invalidateSubFramebuffer";
+    if (IsContextLost())
+        return false;
 
-    if (IsContextLost())
-        return;
-
-    MakeContextCurrent();
+    gl->MakeCurrent();
 
     if (!ValidateFramebufferTarget(target, funcName))
-        return;
+        return false;
 
     const WebGLFramebuffer* fb;
     bool isDefaultFB;
     switch (target) {
     case LOCAL_GL_FRAMEBUFFER:
     case LOCAL_GL_DRAW_FRAMEBUFFER:
         fb = mBoundDrawFramebuffer;
         isDefaultFB = gl->Screen()->IsDrawFramebufferDefault();
@@ -163,111 +176,124 @@ WebGL2Context::InvalidateFramebuffer(GLe
         fb = mBoundReadFramebuffer;
         isDefaultFB = gl->Screen()->IsReadFramebufferDefault();
         break;
 
     default:
         MOZ_CRASH("GFX: Bad target.");
     }
 
-    const bool badColorAttachmentIsInvalidOp = true;
-    for (size_t i = 0; i < attachments.Length(); i++) {
-        if (!ValidateFramebufferAttachment(fb, attachments[i], funcName,
-                                           badColorAttachmentIsInvalidOp))
-        {
-            return;
+    *out_glNumAttachments = attachments.Length();
+    *out_glAttachments = attachments.Elements();
+
+    if (fb) {
+        for (const auto& attachment : attachments) {
+            if (!ValidateFramebufferAttachmentEnum(this, funcName, attachment))
+                return false;
+        }
+    } else {
+        for (const auto& attachment : attachments) {
+            if (!ValidateBackbufferAttachmentEnum(this, funcName, attachment))
+                return false;
+        }
+
+        if (!isDefaultFB) {
+            MOZ_ASSERT(scopedVector->empty());
+            scopedVector->reserve(attachments.Length());
+            for (const auto& attachment : attachments) {
+                switch (attachment) {
+                case LOCAL_GL_COLOR:
+                    scopedVector->push_back(LOCAL_GL_COLOR_ATTACHMENT0);
+                    break;
+
+                case LOCAL_GL_DEPTH:
+                    scopedVector->push_back(LOCAL_GL_DEPTH_ATTACHMENT);
+                    break;
+
+                case LOCAL_GL_STENCIL:
+                    scopedVector->push_back(LOCAL_GL_STENCIL_ATTACHMENT);
+                    break;
+
+                default:
+                    MOZ_CRASH();
+                }
+            }
+            *out_glNumAttachments = scopedVector->size();
+            *out_glAttachments = scopedVector->data();
         }
     }
 
-    // InvalidateFramebuffer is a hint to the driver. Should be OK to
-    // skip calls if not supported, for example by OSX 10.9 GL
-    // drivers.
-    if (!gl->IsSupported(gl::GLFeature::invalidate_framebuffer))
-        return;
+    return true;
+}
+
+void
+WebGL2Context::InvalidateFramebuffer(GLenum target,
+                                     const dom::Sequence<GLenum>& attachments,
+                                     ErrorResult& rv)
+{
+    const char funcName[] = "invalidateSubFramebuffer";
 
-    if (!fb && !isDefaultFB) {
-        dom::Sequence<GLenum> tmpAttachments;
-        if (!TranslateDefaultAttachments(attachments, &tmpAttachments)) {
-            rv.Throw(NS_ERROR_OUT_OF_MEMORY);
-            return;
-        }
+    std::vector<GLenum> scopedVector;
+    GLsizei glNumAttachments;
+    const GLenum* glAttachments;
+    if (!ValidateInvalidateFramebuffer(funcName, target, attachments, &rv, &scopedVector,
+                                       &glNumAttachments, &glAttachments))
+    {
+        return;
+    }
+
+    ////
 
-        gl->fInvalidateFramebuffer(target, tmpAttachments.Length(),
-                                   tmpAttachments.Elements());
-    } else {
-        gl->fInvalidateFramebuffer(target, attachments.Length(), attachments.Elements());
+    // Some drivers (like OSX 10.9 GL) just don't support invalidate_framebuffer.
+    const bool useFBInvalidation = (mAllowFBInvalidation &&
+                                    gl->IsSupported(gl::GLFeature::invalidate_framebuffer));
+    if (useFBInvalidation) {
+        gl->fInvalidateFramebuffer(target, glNumAttachments, glAttachments);
+        return;
     }
+
+    // Use clear instead?
+    // No-op for now.
 }
 
 void
 WebGL2Context::InvalidateSubFramebuffer(GLenum target, const dom::Sequence<GLenum>& attachments,
                                         GLint x, GLint y, GLsizei width, GLsizei height,
                                         ErrorResult& rv)
 {
     const char funcName[] = "invalidateSubFramebuffer";
 
-    if (IsContextLost())
-        return;
-
-    MakeContextCurrent();
-
-    if (!ValidateFramebufferTarget(target, funcName))
-        return;
-
-    if (width < 0 || height < 0) {
-        ErrorInvalidValue("%s: width and height must be >= 0.", funcName);
+    std::vector<GLenum> scopedVector;
+    GLsizei glNumAttachments;
+    const GLenum* glAttachments;
+    if (!ValidateInvalidateFramebuffer(funcName, target, attachments, &rv, &scopedVector,
+                                       &glNumAttachments, &glAttachments))
+    {
         return;
     }
 
-    const WebGLFramebuffer* fb;
-    bool isDefaultFB;
-    switch (target) {
-    case LOCAL_GL_FRAMEBUFFER:
-    case LOCAL_GL_DRAW_FRAMEBUFFER:
-        fb = mBoundDrawFramebuffer;
-        isDefaultFB = gl->Screen()->IsDrawFramebufferDefault();
-        break;
-
-    case LOCAL_GL_READ_FRAMEBUFFER:
-        fb = mBoundReadFramebuffer;
-        isDefaultFB = gl->Screen()->IsReadFramebufferDefault();
-        break;
-
-    default:
-        MOZ_CRASH("GFX: Bad target.");
+    if (!ValidateNonNegative(funcName, "width", width) ||
+        !ValidateNonNegative(funcName, "height", height))
+    {
+        return;
     }
 
-    const bool badColorAttachmentIsInvalidOp = true;
-    for (size_t i = 0; i < attachments.Length(); i++) {
-        if (!ValidateFramebufferAttachment(fb, attachments[i], funcName,
-                                           badColorAttachmentIsInvalidOp))
-        {
-            return;
-        }
+    ////
+
+    // Some drivers (like OSX 10.9 GL) just don't support invalidate_framebuffer.
+    const bool useFBInvalidation = (mAllowFBInvalidation &&
+                                    gl->IsSupported(gl::GLFeature::invalidate_framebuffer));
+    if (useFBInvalidation) {
+        gl->fInvalidateSubFramebuffer(target, glNumAttachments, glAttachments, x, y,
+                                      width, height);
+        return;
     }
 
-    // InvalidateFramebuffer is a hint to the driver. Should be OK to
-    // skip calls if not supported, for example by OSX 10.9 GL
-    // drivers.
-    if (!gl->IsSupported(gl::GLFeature::invalidate_framebuffer))
-        return;
-
-    if (!fb && !isDefaultFB) {
-        dom::Sequence<GLenum> tmpAttachments;
-        if (!TranslateDefaultAttachments(attachments, &tmpAttachments)) {
-            rv.Throw(NS_ERROR_OUT_OF_MEMORY);
-            return;
-        }
-
-        gl->fInvalidateSubFramebuffer(target, tmpAttachments.Length(),
-                                      tmpAttachments.Elements(), x, y, width, height);
-    } else {
-        gl->fInvalidateSubFramebuffer(target, attachments.Length(),
-                                      attachments.Elements(), x, y, width, height);
-    }
+    // Use clear instead?
+    // No-op for now.
 }
 
 void
 WebGL2Context::ReadBuffer(GLenum mode)
 {
     const char funcName[] = "readBuffer";
     if (IsContextLost())
         return;
--- a/dom/canvas/WebGLContext.cpp
+++ b/dom/canvas/WebGLContext.cpp
@@ -121,16 +121,17 @@ WebGLContext::WebGLContext()
     , mLayerIsMirror(false)
     , mBypassShaderValidation(false)
     , mBuffersForUB_Dirty(true)
     , mContextLossHandler(this)
     , mNeedsFakeNoAlpha(false)
     , mNeedsFakeNoDepth(false)
     , mNeedsFakeNoStencil(false)
     , mNeedsEmulatedLoneDepthStencil(false)
+    , mAllowFBInvalidation(gfxPrefs::WebGLFBInvalidation())
 {
     mGeneration = 0;
     mInvalidated = false;
     mCapturedFrameInvalidated = false;
     mShouldPresent = true;
     mResetLayer = true;
     mOptionsFrozen = false;
     mMinCapability = false;
--- a/dom/canvas/WebGLContext.h
+++ b/dom/canvas/WebGLContext.h
@@ -531,21 +531,16 @@ public:
     void Flush();
     void Finish();
     void FramebufferRenderbuffer(GLenum target, GLenum attachment,
                                  GLenum rbTarget, WebGLRenderbuffer* rb);
     void FramebufferTexture2D(GLenum target, GLenum attachment,
                               GLenum texImageTarget, WebGLTexture* tex,
                               GLint level);
 
-    // Framebuffer validation
-    bool ValidateFramebufferAttachment(const WebGLFramebuffer* fb, GLenum attachment,
-                                       const char* funcName,
-                                       bool badColorAttachmentIsInvalidOp = false);
-
     void FrontFace(GLenum mode);
     already_AddRefed<WebGLActiveInfo> GetActiveAttrib(const WebGLProgram& prog,
                                                       GLuint index);
     already_AddRefed<WebGLActiveInfo> GetActiveUniform(const WebGLProgram& prog,
                                                        GLuint index);
 
     void
     GetAttachedShaders(const WebGLProgram& prog,
@@ -1682,16 +1677,22 @@ protected:
     nsTArray<WebGLRefPtr<WebGLSampler> > mBoundSamplers;
 
     void ResolveTexturesForDraw() const;
 
     WebGLRefPtr<WebGLProgram> mCurrentProgram;
     RefPtr<const webgl::LinkedProgramInfo> mActiveProgramLinkInfo;
 
     bool ValidateFramebufferTarget(GLenum target, const char* const info);
+    bool ValidateInvalidateFramebuffer(const char* funcName, GLenum target,
+                                       const dom::Sequence<GLenum>& attachments,
+                                       ErrorResult* const out_rv,
+                                       std::vector<GLenum>* const scopedVector,
+                                       GLsizei* const out_glNumAttachments,
+                                       const GLenum** const out_glAttachments);
 
     WebGLRefPtr<WebGLFramebuffer> mBoundDrawFramebuffer;
     WebGLRefPtr<WebGLFramebuffer> mBoundReadFramebuffer;
     WebGLRefPtr<WebGLRenderbuffer> mBoundRenderbuffer;
     WebGLRefPtr<WebGLTransformFeedback> mBoundTransformFeedback;
     WebGLRefPtr<WebGLVertexArray> mBoundVertexArray;
 
     LinkedList<WebGLBuffer> mBuffers;
@@ -1823,16 +1824,18 @@ protected:
 
     uint64_t mLastUseIndex;
 
     bool mNeedsFakeNoAlpha;
     bool mNeedsFakeNoDepth;
     bool mNeedsFakeNoStencil;
     bool mNeedsEmulatedLoneDepthStencil;
 
+    const bool mAllowFBInvalidation;
+
     bool Has64BitTimestamps() const;
 
     struct ScopedMaskWorkaround {
         WebGLContext& mWebGL;
         const bool mFakeNoAlpha;
         const bool mFakeNoDepth;
         const bool mFakeNoStencil;
 
--- a/dom/canvas/WebGLContextValidate.cpp
+++ b/dom/canvas/WebGLContextValidate.cpp
@@ -192,60 +192,16 @@ WebGLContext::ValidateDrawModeEnum(GLenu
 
     default:
         ErrorInvalidEnumInfo(info, mode);
         return false;
     }
 }
 
 bool
-WebGLContext::ValidateFramebufferAttachment(const WebGLFramebuffer* fb, GLenum attachment,
-                                            const char* funcName,
-                                            bool badColorAttachmentIsInvalidOp)
-{
-    if (!fb) {
-        switch (attachment) {
-        case LOCAL_GL_COLOR:
-        case LOCAL_GL_DEPTH:
-        case LOCAL_GL_STENCIL:
-            return true;
-
-        default:
-            ErrorInvalidEnum("%s: attachment: invalid enum value 0x%x.",
-                             funcName, attachment);
-            return false;
-        }
-    }
-
-    if (attachment == LOCAL_GL_DEPTH_ATTACHMENT ||
-        attachment == LOCAL_GL_STENCIL_ATTACHMENT ||
-        attachment == LOCAL_GL_DEPTH_STENCIL_ATTACHMENT)
-    {
-        return true;
-    }
-
-    if (attachment >= LOCAL_GL_COLOR_ATTACHMENT0 &&
-        attachment <= LastColorAttachmentEnum())
-    {
-        return true;
-    }
-
-    if (badColorAttachmentIsInvalidOp &&
-        attachment >= LOCAL_GL_COLOR_ATTACHMENT0)
-    {
-        const uint32_t offset = attachment - LOCAL_GL_COLOR_ATTACHMENT0;
-        ErrorInvalidOperation("%s: Bad color attachment: COLOR_ATTACHMENT%u. (0x%04x)",
-                              funcName, offset, attachment);
-    } else {
-        ErrorInvalidEnum("%s: attachment: Bad attachment 0x%x.", funcName, attachment);
-    }
-    return false;
-}
-
-bool
 WebGLContext::ValidateUniformLocation(WebGLUniformLocation* loc, const char* funcName)
 {
     /* GLES 2.0.25, p38:
      *   If the value of location is -1, the Uniform* commands will silently
      *   ignore the data passed in, and the current uniform values will not be
      *   changed.
      */
     if (!loc)
--- a/dom/canvas/test/webgl-conf/checkout/conformance2/renderbuffers/invalidate-framebuffer.html
+++ b/dom/canvas/test/webgl-conf/checkout/conformance2/renderbuffers/invalidate-framebuffer.html
@@ -80,43 +80,43 @@ if (!gl) {
   invalidateIncompleteAttachment(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT);
   gl.renderbufferStorageMultisample(gl.RENDERBUFFER, samples[0], gl.DEPTH_COMPONENT16, canvas.width, canvas.height);
   gl.clear(gl.DEPTH_BUFFER_BIT);
   wtu.glErrorShouldBe(gl, gl.NO_ERROR,
       "should be no errors after attaching a renderbuffer to fbo.");
 
   // in real world case, after some drawing, we can invalidate the depth attachment of the bound fbo
   invalidation(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.STENCIL_ATTACHMENT);
- 
-  // set up framebuffer to blit to and read back from 
+
+  // set up framebuffer to blit to and read back from
   var fb = gl.createFramebuffer();
   gl.bindFramebuffer(gl.FRAMEBUFFER, fb);
   var buffer = gl.createRenderbuffer();
   gl.bindRenderbuffer(gl.RENDERBUFFER, buffer);
   gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA8, canvas.width, canvas.height);
   gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, buffer);
   gl.clear(gl.COLOR_BUFFER_BIT);
   wtu.glErrorShouldBe(gl, gl.NO_ERROR,
       "should be no errors after attaching a renderbuffer to fbo.");
 
   gl.bindFramebuffer(gl.READ_FRAMEBUFFER, fb_m);
   gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, fb);
   gl.blitFramebuffer(0, 0, canvas.width, canvas.height, 0, 0, canvas.width, canvas.height, gl.COLOR_BUFFER_BIT, gl.NEAREST);
   wtu.glErrorShouldBe(gl, gl.NO_ERROR,
       "should be no errors after bliting framebuffer.");
- 
+
   // invalidate the multi-sampled color attachment of the bound read framebuffer after blitFramebuffer.
   invalidation(gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.DEPTH_ATTACHMENT);
 
   var maxColorAttachments = gl.getParameter(gl.MAX_COLOR_ATTACHMENTS);
   gl.invalidateSubFramebuffer(gl.READ_FRAMEBUFFER, [gl.COLOR_ATTACHMENT0 + maxColorAttachments], 5, 5, 10, 10);
-  wtu.glErrorShouldBe(gl, gl.INVALID_OPERATION,
+  wtu.glErrorShouldBe(gl, [gl.INVALID_OPERATION, gl.INVALID_ENUM],
       "calling invalidateSubFramebuffer to invalidate a COLOR_ATTACHMENT that exceeds MAX_COLOR_ATTACHMENT should generate INVALID_OPERATION.");
   gl.invalidateFramebuffer(gl.READ_FRAMEBUFFER, [gl.COLOR_ATTACHMENT0 + maxColorAttachments]);
-  wtu.glErrorShouldBe(gl, gl.INVALID_OPERATION,
+  wtu.glErrorShouldBe(gl, [gl.INVALID_OPERATION, gl.INVALID_ENUM],
       "calling invalidateFramebuffer to invalidate a COLOR_ATTACHMENT that exceeds MAX_COLOR_ATTACHMENT should generate INVALID_OPERATION.");
 
   // invalidate the default framebuffer
   gl.bindFramebuffer(gl.FRAMEBUFFER, null);
   invalidation(gl.FRAMEBUFFER, gl.DEPTH, gl.STENCIL);
 
   gl.deleteFramebuffer(fb_m);
   gl.deleteRenderbuffer(rb_m);
--- a/dom/ipc/ContentChild.cpp
+++ b/dom/ipc/ContentChild.cpp
@@ -1502,30 +1502,16 @@ ContentChild::RecvSetProcessSandbox(cons
 #endif /* XP_LINUX && !OS_ANDROID */
 #endif /* MOZ_CRASHREPORTER */
 #endif /* MOZ_CONTENT_SANDBOX */
 
   return IPC_OK();
 }
 
 mozilla::ipc::IPCResult
-ContentChild::RecvNotifyLayerAllocated(const dom::TabId& aTabId, const uint64_t& aLayersId)
-{
-  if (!CompositorBridgeChild::Get()->IPCOpen()) {
-    return IPC_OK();
-  }
-
-  // Note: sending the constructor could fail, but we do not propagate the
-  // error back since the GPU process is fallible.
-  APZChild* apz = ContentProcessController::Create(aTabId);
-  CompositorBridgeChild::Get()->SendPAPZConstructor(apz, aLayersId);
-  return IPC_OK();
-}
-
-mozilla::ipc::IPCResult
 ContentChild::RecvBidiKeyboardNotify(const bool& aIsLangRTL,
                                      const bool& aHaveBidiKeyboards)
 {
   // bidi is always of type PuppetBidiKeyboard* (because in the child, the only
   // possible implementation of nsIBidiKeyboard is PuppetBidiKeyboard).
   PuppetBidiKeyboard* bidi = static_cast<PuppetBidiKeyboard*>(nsContentUtils::GetBidiKeyboard());
   if (bidi) {
     bidi->SetBidiKeyboardInfo(aIsLangRTL, aHaveBidiKeyboards);
--- a/dom/ipc/ContentChild.h
+++ b/dom/ipc/ContentChild.h
@@ -368,18 +368,16 @@ public:
 
   virtual bool DeallocPRemoteSpellcheckEngineChild(PRemoteSpellcheckEngineChild*) override;
 
   virtual mozilla::ipc::IPCResult RecvSetOffline(const bool& offline) override;
 
   virtual mozilla::ipc::IPCResult RecvSetConnectivity(const bool& connectivity) override;
   virtual mozilla::ipc::IPCResult RecvSetCaptivePortalState(const int32_t& state) override;
 
-  virtual mozilla::ipc::IPCResult RecvNotifyLayerAllocated(const dom::TabId& aTabId, const uint64_t& aLayersId) override;
-
   virtual mozilla::ipc::IPCResult RecvBidiKeyboardNotify(const bool& isLangRTL,
                                                          const bool& haveBidiKeyboards) override;
 
   virtual mozilla::ipc::IPCResult RecvNotifyVisited(const URIParams& aURI) override;
 
   // auto remove when alertfinished is received.
   nsresult AddRemoteAlertObserver(const nsString& aData, nsIObserver* aObserver);
 
--- a/dom/ipc/ContentParent.cpp
+++ b/dom/ipc/ContentParent.cpp
@@ -1376,21 +1376,17 @@ ContentParent::AllocateLayerTreeId(Conte
   *aId = gpu->AllocateLayerTreeId();
 
   if (!aContent || !aTopLevel) {
     return false;
   }
 
   gpu->MapLayerTreeId(*aId, aContent->OtherPid());
 
-  if (!gfxPlatform::AsyncPanZoomEnabled()) {
-    return true;
-  }
-
-  return aContent->SendNotifyLayerAllocated(aTabId, *aId);
+  return true;
 }
 
 mozilla::ipc::IPCResult
 ContentParent::RecvAllocateLayerTreeId(const ContentParentId& aCpId,
                                        const TabId& aTabId, uint64_t* aId)
 {
   // Protect against spoofing by a compromised child. aCpId must either
   // correspond to the process that this ContentParent represents or be a
--- a/dom/ipc/PContent.ipdl
+++ b/dom/ipc/PContent.ipdl
@@ -437,21 +437,16 @@ child:
      * abnormally exit if this fails; the details are OS-specific.
      */
     async SetProcessSandbox(MaybeFileDesc aBroker);
 
     async PMemoryReportRequest(uint32_t generation, bool anonymize,
                                bool minimizeMemoryUsage, MaybeFileDesc DMDFile);
 
     /**
-     * Sent to notify that aTabId has been allocated aLayersId
-     */
-    async NotifyLayerAllocated(TabId aTabId, uint64_t aLayersId);
-
-    /**
      * Communication between the PuppetBidiKeyboard and the actual
      * BidiKeyboard hosted by the parent
      */
     async BidiKeyboardNotify(bool isLangRTL, bool haveBidiKeyboards);
 
     /**
      * Dump this process's GC and CC logs to the provided files.
      *
--- a/dom/ipc/TabChild.cpp
+++ b/dom/ipc/TabChild.cpp
@@ -22,20 +22,22 @@
 #include "mozilla/dom/indexedDB/PIndexedDBPermissionRequestChild.h"
 #include "mozilla/plugins/PluginWidgetChild.h"
 #include "mozilla/IMEStateManager.h"
 #include "mozilla/ipc/DocumentRendererChild.h"
 #include "mozilla/ipc/URIUtils.h"
 #include "mozilla/layers/APZChild.h"
 #include "mozilla/layers/APZCCallbackHelper.h"
 #include "mozilla/layers/APZCTreeManager.h"
+#include "mozilla/layers/APZCTreeManagerChild.h"
 #include "mozilla/layers/APZEventState.h"
 #include "mozilla/layers/ContentProcessController.h"
 #include "mozilla/layers/CompositorBridgeChild.h"
 #include "mozilla/layers/DoubleTapToZoom.h"
+#include "mozilla/layers/IAPZCTreeManager.h"
 #include "mozilla/layers/ImageBridgeChild.h"
 #include "mozilla/layers/InputAPZContext.h"
 #include "mozilla/layers/ShadowLayers.h"
 #include "mozilla/layout/RenderFrameChild.h"
 #include "mozilla/layout/RenderFrameParent.h"
 #include "mozilla/LookAndFeel.h"
 #include "mozilla/MouseEvents.h"
 #include "mozilla/Move.h"
@@ -2532,29 +2534,51 @@ TabChild::InitRenderingState(const Textu
       if (!sTabChildren) {
         sTabChildren = new TabChildMap;
       }
       MOZ_ASSERT(!sTabChildren->Get(aLayersId));
       sTabChildren->Put(aLayersId, this);
       mLayersId = aLayersId;
     }
 
-    mApzcTreeManager = CompositorBridgeChild::Get()->GetAPZCTreeManager(mLayersId);
+    InitAPZState();
 
     nsCOMPtr<nsIObserverService> observerService =
         mozilla::services::GetObserverService();
 
     if (observerService) {
         observerService->AddObserver(this,
                                      BEFORE_FIRST_PAINT,
                                      false);
     }
 }
 
 void
+TabChild::InitAPZState()
+{
+  auto cbc = CompositorBridgeChild::Get();
+
+  if (!cbc->GetAPZEnabled(mLayersId)) {
+    return;
+  }
+
+  // Initialize the ApzcTreeManager. This takes multiple casts because of ugly multiple inheritance.
+  PAPZCTreeManagerChild* baseProtocol = cbc->SendPAPZCTreeManagerConstructor(mLayersId);
+  APZCTreeManagerChild* derivedProtocol = static_cast<APZCTreeManagerChild*>(baseProtocol);
+
+  mApzcTreeManager = RefPtr<IAPZCTreeManager>(derivedProtocol);
+
+  // Initialize the GeckoContentController for this tab. We don't hold a reference because we don't need it.
+  // The ContentProcessController will hold a reference to the tab, and will be destroyed by the compositor or ipdl
+  // during destruction.
+  RefPtr<GeckoContentController> contentController = new ContentProcessController(this);
+  cbc->SendPAPZConstructor(new APZChild(contentController), mLayersId);
+}
+
+void
 TabChild::GetDPI(float* aDPI)
 {
     *aDPI = -1.0;
     if (!mRemoteFrame) {
         return;
     }
 
     if (mDPI > 0) {
@@ -2887,21 +2911,17 @@ TabChild::ReinitRendering()
     NS_WARNING("failed to re-construct LayersChild");
     return;
   }
 
   RefPtr<LayerManager> lm = mPuppetWidget->RecreateLayerManager(shadowManager);
   ShadowLayerForwarder* lf = lm->AsShadowForwarder();
   lf->IdentifyTextureHost(mTextureFactoryIdentifier);
 
-  mApzcTreeManager = CompositorBridgeChild::Get()->GetAPZCTreeManager(mLayersId);
-  if (mApzcTreeManager) {
-    APZChild* apz = ContentProcessController::Create(mUniqueId);
-    CompositorBridgeChild::Get()->SendPAPZConstructor(apz, mLayersId);
-  }
+  InitAPZState();
 
   nsCOMPtr<nsIDocument> doc(GetDocument());
   doc->NotifyLayerManagerRecreated();
 }
 
 void
 TabChild::CompositorUpdated(const TextureFactoryIdentifier& aNewIdentifier)
 {
--- a/dom/ipc/TabChild.h
+++ b/dom/ipc/TabChild.h
@@ -717,16 +717,17 @@ private:
 
   void ActorDestroy(ActorDestroyReason why) override;
 
   bool InitTabChildGlobal();
 
   void InitRenderingState(const TextureFactoryIdentifier& aTextureFactoryIdentifier,
                           const uint64_t& aLayersId,
                           PRenderFrameChild* aRenderFrame);
+  void InitAPZState();
 
   void DestroyWindow();
 
   void ApplyShowInfo(const ShowInfo& aInfo);
 
   bool HasValidInnerSize();
 
   void SetTabId(const TabId& aTabId);
@@ -781,19 +782,16 @@ private:
   CSSSize mUnscaledInnerSize;
   bool mDidSetRealShowInfo;
   bool mDidLoadURLInit;
   bool mIsFreshProcess;
 
   AutoTArray<bool, NUMBER_OF_AUDIO_CHANNELS> mAudioChannelsActive;
 
   RefPtr<layers::IAPZCTreeManager> mApzcTreeManager;
-  // APZChild clears this pointer from its destructor, so it shouldn't be a
-  // dangling pointer.
-  layers::APZChild* mAPZChild;
 
   // The most recently seen layer observer epoch in RecvSetDocShellIsActive.
   uint64_t mLayerObserverEpoch;
 
 #if defined(XP_WIN) && defined(ACCESSIBILITY)
   // The handle associated with the native window that contains this tab
   uintptr_t mNativeWindowHandle;
 #endif // defined(XP_WIN)
--- a/dom/locales/en-US/chrome/layout/layout_errors.properties
+++ b/dom/locales/en-US/chrome/layout/layout_errors.properties
@@ -23,16 +23,18 @@ CompositorAnimationWarningContentTooLarg
 ## LOCALIZATION NOTE(CompositorAnimationWarningTransformBackfaceVisibilityHidden):
 ## 'backface-visibility: hidden' is a CSS property, don't translate it.
 CompositorAnimationWarningTransformBackfaceVisibilityHidden=Animations of ‘backface-visibility: hidden’ transforms cannot be run on the compositor
 ## LOCALIZATION NOTE(CompositorAnimationWarningTransformPreserve3D):
 ## 'transform-style: preserve-3d' is a CSS property, don't translate it.
 CompositorAnimationWarningTransformPreserve3D=Animations of ‘transform-style: preserve-3d’ transforms cannot be run on the compositor
 ## LOCALIZATION NOTE(CompositorAnimationWarningTransformSVG,
 ##                   CompositorAnimationWarningTransformWithGeometricProperties,
+##                   CompositorAnimationWarningTransformWithSyncGeometricAnimations,
 ##                   CompositorAnimationWarningTransformFrameInactive,
 ##                   CompositorAnimationWarningOpacityFrameInactive):
 ## 'transform' and 'opacity' mean CSS property names, don't translate it.
 CompositorAnimationWarningTransformSVG=Animations of ‘transform’ on elements with SVG transforms cannot be run on the compositor
 CompositorAnimationWarningTransformWithGeometricProperties=Animations of ‘transform’ cannot be run on the compositor when geometric properties are animated on the same element at the same time
+CompositorAnimationWarningTransformWithSyncGeometricAnimations=Animation of ‘transform’ cannot be run on the compositor because it should be synchronized with animations of geometric properties that started at the same time
 CompositorAnimationWarningTransformFrameInactive=Animation cannot be run on the compositor because the frame was not marked active for ‘transform’ animation
 CompositorAnimationWarningOpacityFrameInactive=Animation cannot be run on the compositor because the frame was not marked active for ‘opacity’ animation
 CompositorAnimationWarningHasRenderingObserver=Animation cannot be run on the compositor because the element has rendering observers (-moz-element or SVG clipping/masking)
--- a/gfx/layers/apz/util/ContentProcessController.cpp
+++ b/gfx/layers/apz/util/ContentProcessController.cpp
@@ -10,122 +10,22 @@
 #include "mozilla/layers/APZCCallbackHelper.h"
 #include "mozilla/layers/APZChild.h"
 
 #include "InputData.h"                  // for InputData
 
 namespace mozilla {
 namespace layers {
 
-/**
- * There are cases where we try to create the APZChild before the corresponding
- * TabChild has been created, we use an observer for the "tab-child-created"
- * topic to set the TabChild in the APZChild when it has been created.
- */
-class TabChildCreatedObserver : public nsIObserver
+ContentProcessController::ContentProcessController(const RefPtr<dom::TabChild>& aBrowser)
+    : mBrowser(aBrowser)
 {
-public:
-  TabChildCreatedObserver(ContentProcessController* aController, const dom::TabId& aTabId)
-    : mController(aController),
-      mTabId(aTabId)
-  {}
-
-  NS_DECL_ISUPPORTS
-  NS_DECL_NSIOBSERVER
-
-private:
-  virtual ~TabChildCreatedObserver()
-  {}
-
-  // TabChildCreatedObserver is owned by mController, and mController outlives its
-  // TabChildCreatedObserver, so the raw pointer is fine.
-  ContentProcessController* mController;
-  dom::TabId mTabId;
-};
-
-NS_IMPL_ISUPPORTS(TabChildCreatedObserver, nsIObserver)
-
-NS_IMETHODIMP
-TabChildCreatedObserver::Observe(nsISupports* aSubject,
-                                 const char* aTopic,
-                                 const char16_t* aData)
-{
-  MOZ_ASSERT(strcmp(aTopic, "tab-child-created") == 0);
-
-  nsCOMPtr<nsITabChild> tabChild(do_QueryInterface(aSubject));
-  NS_ENSURE_TRUE(tabChild, NS_ERROR_FAILURE);
-
-  dom::TabChild* browser = static_cast<dom::TabChild*>(tabChild.get());
-
-  if (browser->GetTabId() == mTabId) {
-    mController->SetBrowser(browser);
-  }
-  return NS_OK;
+  MOZ_ASSERT(mBrowser);
 }
 
-APZChild*
-ContentProcessController::Create(const dom::TabId& aTabId)
-{
-  RefPtr<dom::TabChild> browser = dom::TabChild::FindTabChild(aTabId);
-
-  ContentProcessController* controller = new ContentProcessController();
-
-  nsAutoPtr<APZChild> apz(new APZChild(controller));
-
-  if (browser) {
-
-    controller->SetBrowser(browser);
-
-  } else {
-
-    RefPtr<TabChildCreatedObserver> observer =
-      new TabChildCreatedObserver(controller, aTabId);
-    nsCOMPtr<nsIObserverService> os = services::GetObserverService();
-    if (!os ||
-        NS_FAILED(os->AddObserver(observer, "tab-child-created", false))) {
-      return nullptr;
-    }
-    controller->SetObserver(observer);
-
-  }
-
-  return apz.forget();
-}
-
-ContentProcessController::ContentProcessController()
-    : mBrowser(nullptr)
-{
-}
-ContentProcessController::~ContentProcessController()
-{
-  if (mObserver) {
-    nsCOMPtr<nsIObserverService> os = services::GetObserverService();
-    os->RemoveObserver(mObserver, "tab-child-created");
-  }
-}
-
-void
-ContentProcessController::SetObserver(nsIObserver* aObserver)
-{
-  MOZ_ASSERT(!mBrowser);
-  mObserver = aObserver;
-}
-
-void
-ContentProcessController::SetBrowser(dom::TabChild* aBrowser)
-{
-  MOZ_ASSERT(!mBrowser);
-  mBrowser = aBrowser;
-
-  if (mObserver) {
-    nsCOMPtr<nsIObserverService> os = services::GetObserverService();
-    os->RemoveObserver(mObserver, "tab-child-created");
-    mObserver = nullptr;
-  }
-}
 void
 ContentProcessController::RequestContentRepaint(const FrameMetrics& aFrameMetrics)
 {
   if (mBrowser) {
     mBrowser->UpdateFrame(aFrameMetrics);
   }
 }
 
--- a/gfx/layers/apz/util/ContentProcessController.h
+++ b/gfx/layers/apz/util/ContentProcessController.h
@@ -31,23 +31,17 @@ class APZChild;
  *
  * If ContentProcessController needs to implement a new method on GeckoContentController
  * PAPZ, APZChild, and RemoteContentController must be updated to handle it.
  */
 class ContentProcessController final
       : public GeckoContentController
 {
 public:
-  ~ContentProcessController();
-
-  static APZChild* Create(const dom::TabId& aTabId);
-
-  // ContentProcessController
-
-  void SetBrowser(dom::TabChild* aBrowser);
+  explicit ContentProcessController(const RefPtr<dom::TabChild>& aBrowser);
 
   // GeckoContentController
 
   void RequestContentRepaint(const FrameMetrics& frame) override;
 
   void HandleTap(TapType aType,
                  const LayoutDevicePoint& aPoint,
                  Modifiers aModifiers,
@@ -70,21 +64,16 @@ public:
 
   void PostDelayedTask(already_AddRefed<Runnable> aRunnable, int aDelayMs) override;
 
   bool IsRepaintThread() override;
 
   void DispatchToRepaintThread(already_AddRefed<Runnable> aTask) override;
 
 private:
-  ContentProcessController();
-
-  void SetObserver(nsIObserver* aObserver);
-
   RefPtr<dom::TabChild> mBrowser;
-  RefPtr<nsIObserver> mObserver;
 };
 
 } // namespace layers
 
 } // namespace mozilla
 
 #endif // mozilla_layers_ContentProcessController_h
--- a/gfx/layers/ipc/CompositorBridgeChild.cpp
+++ b/gfx/layers/ipc/CompositorBridgeChild.cpp
@@ -1087,33 +1087,22 @@ CompositorBridgeChild::DeallocPComposito
 #ifdef MOZ_WIDGET_SUPPORTS_OOP_COMPOSITING
   delete aActor;
   return true;
 #else
   return false;
 #endif
 }
 
-RefPtr<IAPZCTreeManager>
-CompositorBridgeChild::GetAPZCTreeManager(uint64_t aLayerTreeId)
+bool
+CompositorBridgeChild::GetAPZEnabled(uint64_t aLayerTreeId)
 {
-  bool apzEnabled = false;
-  Unused << SendAsyncPanZoomEnabled(aLayerTreeId, &apzEnabled);
-
-  if (!apzEnabled) {
-    return nullptr;
-  }
-
-  PAPZCTreeManagerChild* child = SendPAPZCTreeManagerConstructor(aLayerTreeId);
-  if (!child) {
-    return nullptr;
-  }
-  APZCTreeManagerChild* parent = static_cast<APZCTreeManagerChild*>(child);
-
-  return RefPtr<IAPZCTreeManager>(parent);
+  bool result = false;
+  Unused << SendAsyncPanZoomEnabled(aLayerTreeId, &result);
+  return result;
 }
 
 PAPZCTreeManagerChild*
 CompositorBridgeChild::AllocPAPZCTreeManagerChild(const uint64_t& aLayersId)
 {
   APZCTreeManagerChild* child = new APZCTreeManagerChild();
   child->AddRef();
   return child;
--- a/gfx/layers/ipc/CompositorBridgeChild.h
+++ b/gfx/layers/ipc/CompositorBridgeChild.h
@@ -215,17 +215,17 @@ public:
   virtual bool AllocShmem(size_t aSize,
                           mozilla::ipc::SharedMemory::SharedMemoryType aShmType,
                           mozilla::ipc::Shmem* aShmem) override;
   virtual bool DeallocShmem(mozilla::ipc::Shmem& aShmem) override;
 
   PCompositorWidgetChild* AllocPCompositorWidgetChild(const CompositorWidgetInitData& aInitData) override;
   bool DeallocPCompositorWidgetChild(PCompositorWidgetChild* aActor) override;
 
-  RefPtr<IAPZCTreeManager> GetAPZCTreeManager(uint64_t aLayerTreeId);
+  bool GetAPZEnabled(uint64_t aLayerTreeId);
 
   PAPZCTreeManagerChild* AllocPAPZCTreeManagerChild(const uint64_t& aLayersId) override;
   bool DeallocPAPZCTreeManagerChild(PAPZCTreeManagerChild* aActor) override;
 
   PAPZChild* AllocPAPZChild(const uint64_t& aLayersId) override;
   bool DeallocPAPZChild(PAPZChild* aActor) override;
 
   void ProcessingError(Result aCode, const char* aReason) override;
--- a/gfx/thebes/gfxPrefs.h
+++ b/gfx/thebes/gfxPrefs.h
@@ -603,16 +603,17 @@ private:
   DECL_GFX_PREF(Once, "webgl.force-layers-readback",           WebGLForceLayersReadback, bool, false);
   DECL_GFX_PREF(Live, "webgl.lose-context-on-memory-pressure", WebGLLoseContextOnMemoryPressure, bool, false);
   DECL_GFX_PREF(Live, "webgl.max-warnings-per-context",        WebGLMaxWarningsPerContext, uint32_t, 32);
   DECL_GFX_PREF(Live, "webgl.min_capability_mode",             WebGLMinCapabilityMode, bool, false);
   DECL_GFX_PREF(Live, "webgl.msaa-force",                      WebGLForceMSAA, bool, false);
   DECL_GFX_PREF(Live, "webgl.prefer-16bpp",                    WebGLPrefer16bpp, bool, false);
   DECL_GFX_PREF(Live, "webgl.restore-context-when-visible",    WebGLRestoreWhenVisible, bool, true);
   DECL_GFX_PREF(Live, "webgl.allow-immediate-queries",         WebGLImmediateQueries, bool, false);
+  DECL_GFX_PREF(Live, "webgl.allow-fb-invalidation",           WebGLFBInvalidation, bool, false);
 
   DECL_GFX_PREF(Live, "webgl.webgl2-compat-mode",              WebGL2CompatMode, bool, false);
 
   // WARNING:
   // Please make sure that you've added your new preference to the list above in alphabetical order.
   // Please do not just append it to the end of the list.
 
 public:
--- a/js/public/ProfilingFrameIterator.h
+++ b/js/public/ProfilingFrameIterator.h
@@ -50,18 +50,16 @@ class JS_PUBLIC_API(ProfilingFrameIterat
     uint32_t sampleBufferGen_;
     js::Activation* activation_;
 
     // When moving past a JitActivation, we need to save the prevJitTop
     // from it to use as the exit-frame pointer when the next caller jit
     // activation (if any) comes around.
     void* savedPrevJitTop_;
 
-    JS::AutoCheckCannotGC nogc_;
-
     static const unsigned StorageSpace = 8 * sizeof(void*);
     mozilla::AlignedStorage<StorageSpace> storage_;
     js::wasm::ProfilingFrameIterator& wasmIter() {
         MOZ_ASSERT(!done());
         MOZ_ASSERT(isWasm());
         return *reinterpret_cast<js::wasm::ProfilingFrameIterator*>(storage_.addr());
     }
     const js::wasm::ProfilingFrameIterator& wasmIter() const {
@@ -135,17 +133,17 @@ class JS_PUBLIC_API(ProfilingFrameIterat
 
   private:
     mozilla::Maybe<Frame> getPhysicalFrameAndEntry(js::jit::JitcodeGlobalEntry* entry) const;
 
     void iteratorConstruct(const RegisterState& state);
     void iteratorConstruct();
     void iteratorDestroy();
     bool iteratorDone();
-};
+} JS_HAZ_GC_INVALIDATED;
 
 JS_FRIEND_API(bool)
 IsProfilingEnabledForContext(JSContext* cx);
 
 /**
  * After each sample run, this method should be called with the latest sample
  * buffer generation, and the lapCount.  It will update corresponding fields on
  * JSRuntime.
--- a/js/src/gc/GCRuntime.h
+++ b/js/src/gc/GCRuntime.h
@@ -726,23 +726,28 @@ class GCRuntime
     void disableStrictProxyChecking() { ++disableStrictProxyCheckingCount; }
     void enableStrictProxyChecking() {
         MOZ_ASSERT(disableStrictProxyCheckingCount > 0);
         --disableStrictProxyCheckingCount;
     }
 #endif // DEBUG
 
     bool isInsideUnsafeRegion() { return inUnsafeRegion != 0; }
-    void enterUnsafeRegion() { ++inUnsafeRegion; }
+    void enterUnsafeRegion() {
+        MOZ_ASSERT(CurrentThreadCanAccessRuntime(rt));
+        ++inUnsafeRegion;
+    }
     void leaveUnsafeRegion() {
+        MOZ_ASSERT(CurrentThreadCanAccessRuntime(rt));
         MOZ_ASSERT(inUnsafeRegion > 0);
         --inUnsafeRegion;
     }
 
     void verifyIsSafeToGC() {
+        MOZ_ASSERT(CurrentThreadCanAccessRuntime(rt));
         MOZ_DIAGNOSTIC_ASSERT(!isInsideUnsafeRegion(),
                               "[AutoAssertNoGC] possible GC in GC-unsafe region");
     }
 
     void setAlwaysPreserveCode() { alwaysPreserveCode = true; }
 
     bool isIncrementalGCAllowed() const { return incrementalAllowed; }
     void disallowIncrementalGC() { incrementalAllowed = false; }
--- a/js/src/gc/Verifier.cpp
+++ b/js/src/gc/Verifier.cpp
@@ -170,17 +170,17 @@ NextNode(VerifyNode* node)
 }
 
 void
 gc::GCRuntime::startVerifyPreBarriers()
 {
     if (verifyPreData || isIncrementalGCInProgress())
         return;
 
-    if (IsIncrementalGCUnsafe(rt) != AbortReason::None)
+    if (IsIncrementalGCUnsafe(rt) != AbortReason::None || rt->keepAtoms())
         return;
 
     number++;
 
     VerifyPreTracer* trc = js_new<VerifyPreTracer>(rt);
     if (!trc)
         return;
 
@@ -337,17 +337,17 @@ gc::GCRuntime::endVerifyPreBarriers()
      * been discarded.
      */
     MOZ_ASSERT(trc->number == number);
     number++;
 
     verifyPreData = nullptr;
     incrementalState = State::NotActive;
 
-    if (!compartmentCreated && IsIncrementalGCUnsafe(rt) == AbortReason::None) {
+    if (!compartmentCreated && IsIncrementalGCUnsafe(rt) == AbortReason::None && !rt->keepAtoms()) {
         CheckEdgeTracer cetrc(rt);
 
         /* Start after the roots. */
         VerifyNode* node = NextNode(trc->root);
         while ((char*)node < trc->edgeptr) {
             cetrc.node = node;
             js::TraceChildren(&cetrc, node->thing, node->kind);
 
--- a/js/src/jsgc.cpp
+++ b/js/src/jsgc.cpp
@@ -3796,24 +3796,32 @@ GCRuntime::beginMarkPhase(JS::gcreason::
     }
 
     if (!rt->gc.cleanUpEverything) {
         if (JSCompartment* comp = jit::TopmostIonActivationCompartment(rt))
             comp->zone()->setPreservingCode(true);
     }
 
     /*
-     * Atoms are not in the cross-compartment map. So if there are any
-     * zones that are not being collected, we are not allowed to collect
-     * atoms. Otherwise, the non-collected zones could contain pointers
-     * to atoms that we would miss.
+     * Atoms are not in the cross-compartment map. If there are any zones that
+     * are not being collected then we cannot collect the atoms zone, otherwise
+     * the non-collected zones could contain pointers to atoms that we would
+     * miss.
      *
-     * keepAtoms() will only change on the main thread, which we are currently
-     * on. If the value of keepAtoms() changes between GC slices, then we'll
-     * cancel the incremental GC. See IsIncrementalGCSafe.
+     * If keepAtoms() is true then either an instance of AutoKeepAtoms is
+     * currently on the stack or parsing is currently happening on another
+     * thread. In either case we don't have information about which atoms are
+     * roots, so we must skip collecting atoms.
+     *
+     * Note that only affects the first slice of an incremental GC since root
+     * marking is completed before we return to the mutator.
+     *
+     * Off-main-thread parsing is inhibited after the start of GC which prevents
+     * races between creating atoms during parsing and sweeping atoms on the
+     * main thread.
      */
     if (isFull && !rt->keepAtoms()) {
         Zone* atomsZone = rt->atomsCompartment(lock)->zone();
         if (atomsZone->isGCScheduled()) {
             MOZ_ASSERT(!atomsZone->isCollecting());
             atomsZone->setGCState(Zone::Mark);
             any = true;
         }
@@ -5988,19 +5996,16 @@ GCRuntime::incrementalCollectSlice(Slice
     }
 }
 
 gc::AbortReason
 gc::IsIncrementalGCUnsafe(JSRuntime* rt)
 {
     MOZ_ASSERT(!rt->mainThread.suppressGC);
 
-    if (rt->keepAtoms())
-        return gc::AbortReason::KeepAtomsSet;
-
     if (!rt->gc.isIncrementalGCAllowed())
         return gc::AbortReason::IncrementalDisabled;
 
     return gc::AbortReason::None;
 }
 
 void
 GCRuntime::budgetIncrementalGC(JS::gcreason::Reason reason, SliceBudget& budget,
@@ -6162,16 +6167,20 @@ GCRuntime::gcCycle(bool nonincrementalBy
         // avoid taking the GC lock when manipulating the chunks during the GC.
         // The background alloc task can run between slices, so we must wait
         // for it at the start of every slice.
         allocTask.cancel(GCParallelTask::CancelAndWait);
     }
 
     State prevState = incrementalState;
 
+    // We don't allow off-main-thread parsing to start while we're doing an
+    // incremental GC.
+    MOZ_ASSERT_IF(rt->activeGCInAtomsZone(), !rt->exclusiveThreadsPresent());
+
     if (nonincrementalByAPI) {
         // Reset any in progress incremental GC if this was triggered via the
         // API. This isn't required for correctness, but sometimes during tests
         // the caller expects this GC to collect certain objects, and we need
         // to make sure to collect everything possible.
         if (reason != JS::gcreason::ALLOC_TRIGGER)
             resetIncrementalGC(gc::AbortReason::NonIncrementalRequested, session.lock);
 
--- a/js/src/jsgc.h
+++ b/js/src/jsgc.h
@@ -50,17 +50,17 @@ enum class State {
 #undef MAKE_STATE
 };
 
 // Reasons we reset an ongoing incremental GC or perform a non-incremental GC.
 #define GC_ABORT_REASONS(D) \
     D(None) \
     D(NonIncrementalRequested) \
     D(AbortRequested) \
-    D(KeepAtomsSet) \
+    D(Unused1) \
     D(IncrementalDisabled) \
     D(ModeChange) \
     D(MallocBytesTrigger) \
     D(GCBytesTrigger) \
     D(ZoneChange) \
     D(CompartmentRevived)
 enum class AbortReason {
 #define MAKE_REASON(name) name,
--- a/js/src/vm/Stack.cpp
+++ b/js/src/vm/Stack.cpp
@@ -1718,18 +1718,17 @@ ActivationIterator::settle()
         activation_ = activation_->prev();
 }
 
 JS::ProfilingFrameIterator::ProfilingFrameIterator(JSContext* cx, const RegisterState& state,
                                                    uint32_t sampleBufferGen)
   : rt_(cx),
     sampleBufferGen_(sampleBufferGen),
     activation_(nullptr),
-    savedPrevJitTop_(nullptr),
-    nogc_(cx)
+    savedPrevJitTop_(nullptr)
 {
     if (!cx->spsProfiler.enabled())
         MOZ_CRASH("ProfilingFrameIterator called when spsProfiler not enabled for runtime.");
 
     if (!cx->profilingActivation())
         return;
 
     // If profiler sampling is not enabled, skip.
--- a/layout/xul/nsXULPopupManager.cpp
+++ b/layout/xul/nsXULPopupManager.cpp
@@ -905,18 +905,18 @@ nsXULPopupManager::ShowPopupCallback(nsI
   // install keyboard event listeners for navigating menus. For panels, the
   // escape key may be used to close the panel. However, the ignorekeys
   // attribute may be used to disable adding these event listeners for popups
   // that want to handle their own keyboard events.
   nsAutoString ignorekeys;
   aPopup->GetAttr(kNameSpaceID_None, nsGkAtoms::ignorekeys, ignorekeys);
   if (ignorekeys.EqualsLiteral("true")) {
     item->SetIgnoreKeys(eIgnoreKeys_True);
-  } else if (ignorekeys.EqualsLiteral("handled")) {
-    item->SetIgnoreKeys(eIgnoreKeys_Handled);
+  } else if (ignorekeys.EqualsLiteral("shortcuts")) {
+    item->SetIgnoreKeys(eIgnoreKeys_Shortcuts);
   }
 
   if (ismenu) {
     // if the menu is on a menubar, use the menubar's listener instead
     nsMenuFrame* menuFrame = do_QueryFrame(aPopupFrame->GetParent());
     if (menuFrame) {
       item->SetOnMenuBar(menuFrame->IsOnMenuBar());
     }
@@ -2626,17 +2626,17 @@ nsresult
 nsXULPopupManager::KeyUp(nsIDOMKeyEvent* aKeyEvent)
 {
   // don't do anything if a menu isn't open or a menubar isn't active
   if (!mActiveMenuBar) {
     nsMenuChainItem* item = GetTopVisibleMenu();
     if (!item || item->PopupType() != ePopupTypeMenu)
       return NS_OK;
 
-    if (item->IgnoreKeys() == eIgnoreKeys_Handled) {
+    if (item->IgnoreKeys() == eIgnoreKeys_Shortcuts) {
       aKeyEvent->AsEvent()->StopCrossProcessForwarding();
       return NS_OK;
     }
   }
 
   aKeyEvent->AsEvent()->StopPropagation();
   aKeyEvent->AsEvent()->StopCrossProcessForwarding();
   aKeyEvent->AsEvent()->PreventDefault();
@@ -2656,17 +2656,17 @@ nsXULPopupManager::KeyDown(nsIDOMKeyEven
   }
 
   // don't do anything if a menu isn't open or a menubar isn't active
   if (!mActiveMenuBar && (!item || item->PopupType() != ePopupTypeMenu))
     return NS_OK;
 
   // Since a menu was open, stop propagation of the event to keep other event
   // listeners from becoming confused.
-  if (!item || item->IgnoreKeys() != eIgnoreKeys_Handled) {
+  if (!item || item->IgnoreKeys() != eIgnoreKeys_Shortcuts) {
     aKeyEvent->AsEvent()->StopPropagation();
   }
 
   int32_t menuAccessKey = -1;
 
   // If the key just pressed is the access key (usually Alt),
   // dismiss and unfocus the menu.
 
@@ -2721,25 +2721,31 @@ nsXULPopupManager::KeyPress(nsIDOMKeyEve
     return NS_OK;
   }
 
   nsCOMPtr<nsIDOMKeyEvent> keyEvent = do_QueryInterface(aKeyEvent);
   NS_ENSURE_TRUE(keyEvent, NS_ERROR_UNEXPECTED);
   // if a menu is open or a menubar is active, it consumes the key event
   bool consume = (mPopups || mActiveMenuBar);
 
-  // When ignorekeys="handled" is used, we don't call preventDefault on the key
-  // event, which allows another listener to handle keys that the popup hasn't
-  // already handled. For instance, this allows global shortcuts to still apply
-  // while a menu is open.
-  bool onlyHandled = item && item->IgnoreKeys() == eIgnoreKeys_Handled;
-  bool handled = HandleShortcutNavigation(keyEvent, nullptr);
+  WidgetInputEvent* evt = aKeyEvent->AsEvent()->WidgetEventPtr()->AsInputEvent();
+  bool isAccel = evt && evt->IsAccel();
+
+  // When ignorekeys="shortcuts" is used, we don't call preventDefault on the
+  // key event when the accelerator key is pressed. This allows another
+  // listener to handle keys. For instance, this allows global shortcuts to
+  // still apply while a menu is open.
+  if (item && item->IgnoreKeys() == eIgnoreKeys_Shortcuts && isAccel) {
+    consume = false;
+  }
+
+  HandleShortcutNavigation(keyEvent, nullptr);
 
   aKeyEvent->AsEvent()->StopCrossProcessForwarding();
-  if (handled || (consume && !onlyHandled)) {
+  if (consume) {
     aKeyEvent->AsEvent()->StopPropagation();
     aKeyEvent->AsEvent()->PreventDefault();
   }
 
   return NS_OK; // I am consuming event
 }
 
 NS_IMETHODIMP
--- a/layout/xul/nsXULPopupManager.h
+++ b/layout/xul/nsXULPopupManager.h
@@ -97,17 +97,17 @@ enum nsNavigationDirection {
   eNavigationDirection_Before,
   eNavigationDirection_End,
   eNavigationDirection_After
 };
 
 enum nsIgnoreKeys {
   eIgnoreKeys_False,
   eIgnoreKeys_True,
-  eIgnoreKeys_Handled,
+  eIgnoreKeys_Shortcuts,
 };
 
 #define NS_DIRECTION_IS_INLINE(dir) (dir == eNavigationDirection_Start ||     \
                                      dir == eNavigationDirection_End)
 #define NS_DIRECTION_IS_BLOCK(dir) (dir == eNavigationDirection_Before || \
                                     dir == eNavigationDirection_After)
 #define NS_DIRECTION_IS_BLOCK_TO_EDGE(dir) (dir == eNavigationDirection_First ||    \
                                             dir == eNavigationDirection_Last)
@@ -627,23 +627,22 @@ public:
    * mouse over a sibling menuitem which would normally close the menu. This
    * menu is closed via a timer. However, if the user moves the mouse over the
    * submenu before the timer fires, we should instead cancel the timer. This
    * ensures that the user can move the mouse diagonally over a menu.
    */
   void CancelMenuTimer(nsMenuParent* aMenuParent);
 
   /**
-   * Handles navigation for menu accelkeys. Returns true if the key has
-   * been handled. If aFrame is specified, then the key is handled by that
-   * popup, otherwise if aFrame is null, the key is handled by the active
-   * popup or menubar.
+   * Handles navigation for menu accelkeys. If aFrame is specified, then the
+   * key is handled by that popup, otherwise if aFrame is null, the key is
+   * handled by the active popup or menubar.
    */
   bool HandleShortcutNavigation(nsIDOMKeyEvent* aKeyEvent,
-                                  nsMenuPopupFrame* aFrame);
+                                nsMenuPopupFrame* aFrame);
 
   /**
    * Handles cursor navigation within a menu. Returns true if the key has
    * been handled.
    */
   bool HandleKeyboardNavigation(uint32_t aKeyCode);
 
   /**
--- a/modules/libpref/init/all.js
+++ b/modules/libpref/init/all.js
@@ -4489,16 +4489,17 @@ pref("webgl.lose-context-on-memory-press
 pref("webgl.can-lose-context-in-foreground", true);
 pref("webgl.restore-context-when-visible", true);
 pref("webgl.max-warnings-per-context", 32);
 pref("webgl.enable-draft-extensions", false);
 pref("webgl.enable-privileged-extensions", false);
 pref("webgl.bypass-shader-validation", false);
 pref("webgl.disable-fail-if-major-performance-caveat", false);
 pref("webgl.disable-DOM-blit-uploads", false);
+pref("webgl.allow-fb-invalidation", false);
 pref("webgl.webgl2-compat-mode", false);
 
 pref("webgl.enable-webgl2", true);
 
 #ifdef RELEASE_OR_BETA
 // Keep this disabled on Release and Beta for now. (see bug 1171228)
 pref("webgl.enable-debug-renderer-info", false);
 #else
--- a/netwerk/base/nsISocketTransport.idl
+++ b/netwerk/base/nsISocketTransport.idl
@@ -217,16 +217,23 @@ interface nsISocketTransport : nsITransp
     /**
      * This flag is an explicit opt-in that allows a normally secure socket
      * provider to use, at its discretion, an insecure algorithm. e.g.
      * a TLS socket without authentication.
      */
     const unsigned long MITM_OK = (1 << 6);
 
     /**
+     * If set, do not use newer protocol features that might have interop problems
+     * on the Internet. Intended only for use with critical infra like the updater.
+     * default is false.
+     */
+    const unsigned long BE_CONSERVATIVE = (1 << 7);
+
+    /**
      * Socket QoS/ToS markings. Valid values are IPTOS_DSCP_AFxx or
      * IPTOS_CLASS_CSx (or IPTOS_DSCP_EF, but currently no supported
      * services require expedited-forwarding).
      * Not setting this value will leave the socket with the default
      * ToS value, which on most systems if IPTOS_CLASS_CS0 (formerly
      * IPTOS_PREC_ROUTINE).
      */
     attribute octet QoSBits;
--- a/netwerk/base/nsSocketTransport2.cpp
+++ b/netwerk/base/nsSocketTransport2.cpp
@@ -1154,16 +1154,19 @@ nsSocketTransport::BuildSocket(PRFileDes
                 controlFlags |= nsISocketProvider::ANONYMOUS_CONNECT;
 
             if (mConnectionFlags & nsISocketTransport::NO_PERMANENT_STORAGE)
                 controlFlags |= nsISocketProvider::NO_PERMANENT_STORAGE;
 
             if (mConnectionFlags & nsISocketTransport::MITM_OK)
                 controlFlags |= nsISocketProvider::MITM_OK;
 
+            if (mConnectionFlags & nsISocketTransport::BE_CONSERVATIVE)
+                controlFlags |= nsISocketProvider::BE_CONSERVATIVE;
+
             nsCOMPtr<nsISupports> secinfo;
             if (i == 0) {
                 // if this is the first type, we'll want the 
                 // service to allocate a new socket
 
                 // when https proxying we want to just connect to the proxy as if
                 // it were the end host (i.e. expect the proxy's cert)
 
--- a/netwerk/ipc/NeckoChannelParams.ipdlh
+++ b/netwerk/ipc/NeckoChannelParams.ipdlh
@@ -112,16 +112,17 @@ struct HttpChannelOpenArgs
   uint32_t                    thirdPartyFlags;
   bool                        resumeAt;
   uint64_t                    startPos;
   nsCString                   entityID;
   bool                        chooseApplicationCache;
   nsCString                   appCacheClientID;
   bool                        allowSpdy;
   bool                        allowAltSvc;
+  bool                        beConservative;
   OptionalLoadInfoArgs        loadInfo;
   OptionalHttpResponseHead    synthesizedResponseHead;
   nsCString                   synthesizedSecurityInfoSerialization;
   uint32_t                    cacheKey;
   nsCString                   requestContextID;
   OptionalCorsPreflightArgs   preflightArgs;
   uint32_t                    initialRwin;
   bool                        blockAuthPrompt;
--- a/netwerk/protocol/http/HttpBaseChannel.cpp
+++ b/netwerk/protocol/http/HttpBaseChannel.cpp
@@ -82,16 +82,17 @@ HttpBaseChannel::HttpBaseChannel()
   , mInheritApplicationCache(true)
   , mChooseApplicationCache(false)
   , mLoadedFromApplicationCache(false)
   , mChannelIsForDownload(false)
   , mTracingEnabled(true)
   , mTimingEnabled(false)
   , mAllowSpdy(true)
   , mAllowAltSvc(true)
+  , mBeConservative(false)
   , mResponseTimeoutEnabled(true)
   , mAllRedirectsSameOrigin(true)
   , mAllRedirectsPassTimingAllowCheck(true)
   , mResponseCouldBeSynthesized(false)
   , mBlockAuthPrompt(false)
   , mAllowStaleCacheContent(false)
   , mSuspendCount(0)
   , mInitialRwin(0)
@@ -2300,16 +2301,32 @@ HttpBaseChannel::GetAllowAltSvc(bool *aA
 NS_IMETHODIMP
 HttpBaseChannel::SetAllowAltSvc(bool aAllowAltSvc)
 {
   mAllowAltSvc = aAllowAltSvc;
   return NS_OK;
 }
 
 NS_IMETHODIMP
+HttpBaseChannel::GetBeConservative(bool *aBeConservative)
+{
+  NS_ENSURE_ARG_POINTER(aBeConservative);
+
+  *aBeConservative = mBeConservative;
+  return NS_OK;
+}
+
+NS_IMETHODIMP
+HttpBaseChannel::SetBeConservative(bool aBeConservative)
+{
+  mBeConservative = aBeConservative;
+  return NS_OK;
+}
+
+NS_IMETHODIMP
 HttpBaseChannel::GetApiRedirectToURI(nsIURI ** aResult)
 {
   NS_ENSURE_ARG_POINTER(aResult);
   NS_IF_ADDREF(*aResult = mAPIRedirectToURI);
   return NS_OK;
 }
 
 NS_IMETHODIMP
@@ -3064,20 +3081,21 @@ HttpBaseChannel::SetupReplacementChannel
                                     false);
     }
   }
 
   // share the request context - see bug 1236650
   httpChannel->SetRequestContextID(mRequestContextID);
 
   if (httpInternal) {
-    // Convey third party cookie and spdy flags.
+    // Convey third party cookie, conservative, and spdy flags.
     httpInternal->SetThirdPartyFlags(mThirdPartyFlags);
     httpInternal->SetAllowSpdy(mAllowSpdy);
     httpInternal->SetAllowAltSvc(mAllowAltSvc);
+    httpInternal->SetBeConservative(mBeConservative);
 
     RefPtr<nsHttpChannel> realChannel;
     CallQueryInterface(newChannel, realChannel.StartAssignment());
     if (realChannel) {
       realChannel->SetTopWindowURI(mTopWindowURI);
     }
 
     // update the DocumentURI indicator since we are being redirected.
--- a/netwerk/protocol/http/HttpBaseChannel.h
+++ b/netwerk/protocol/http/HttpBaseChannel.h
@@ -206,16 +206,18 @@ public:
   NS_IMETHOD GetLocalAddress(nsACString& addr) override;
   NS_IMETHOD GetLocalPort(int32_t* port) override;
   NS_IMETHOD GetRemoteAddress(nsACString& addr) override;
   NS_IMETHOD GetRemotePort(int32_t* port) override;
   NS_IMETHOD GetAllowSpdy(bool *aAllowSpdy) override;
   NS_IMETHOD SetAllowSpdy(bool aAllowSpdy) override;
   NS_IMETHOD GetAllowAltSvc(bool *aAllowAltSvc) override;
   NS_IMETHOD SetAllowAltSvc(bool aAllowAltSvc) override;
+  NS_IMETHOD GetBeConservative(bool *aBeConservative) override;
+  NS_IMETHOD SetBeConservative(bool aBeConservative) override;
   NS_IMETHOD GetApiRedirectToURI(nsIURI * *aApiRedirectToURI) override;
   virtual nsresult AddSecurityMessage(const nsAString &aMessageTag, const nsAString &aMessageCategory);
   NS_IMETHOD TakeAllSecurityMessages(nsCOMArray<nsISecurityConsoleMessage> &aMessages) override;
   NS_IMETHOD GetResponseTimeoutEnabled(bool *aEnable) override;
   NS_IMETHOD SetResponseTimeoutEnabled(bool aEnable) override;
   NS_IMETHOD GetInitialRwin(uint32_t* aRwin) override;
   NS_IMETHOD SetInitialRwin(uint32_t aRwin) override;
   NS_IMETHOD GetNetworkInterfaceId(nsACString& aNetworkInterfaceId) override;
@@ -454,16 +456,17 @@ protected:
   uint32_t                          mChooseApplicationCache     : 1;
   uint32_t                          mLoadedFromApplicationCache : 1;
   uint32_t                          mChannelIsForDownload       : 1;
   uint32_t                          mTracingEnabled             : 1;
   // True if timing collection is enabled
   uint32_t                          mTimingEnabled              : 1;
   uint32_t                          mAllowSpdy                  : 1;
   uint32_t                          mAllowAltSvc                : 1;
+  uint32_t                          mBeConservative             : 1;
   uint32_t                          mResponseTimeoutEnabled     : 1;
   // A flag that should be false only if a cross-domain redirect occurred
   uint32_t                          mAllRedirectsSameOrigin     : 1;
 
   // Is 1 if no redirects have occured or if all redirects
   // pass the Resource Timing timing-allow-check
   uint32_t                          mAllRedirectsPassTimingAllowCheck : 1;
 
--- a/netwerk/protocol/http/HttpChannelChild.cpp
+++ b/netwerk/protocol/http/HttpChannelChild.cpp
@@ -2079,16 +2079,17 @@ HttpChannelChild::ContinueAsyncOpen()
   openArgs.thirdPartyFlags() = mThirdPartyFlags;
   openArgs.resumeAt() = mSendResumeAt;
   openArgs.startPos() = mStartPos;
   openArgs.entityID() = mEntityID;
   openArgs.chooseApplicationCache() = mChooseApplicationCache;
   openArgs.appCacheClientID() = appCacheClientId;
   openArgs.allowSpdy() = mAllowSpdy;
   openArgs.allowAltSvc() = mAllowAltSvc;
+  openArgs.beConservative() = mBeConservative;
   openArgs.initialRwin() = mInitialRwin;
 
   uint32_t cacheKey = 0;
   if (mCacheKey) {
     nsCOMPtr<nsISupportsPRUint32> container = do_QueryInterface(mCacheKey);
     if (!container) {
       return NS_ERROR_ILLEGAL_VALUE;
     }
--- a/netwerk/protocol/http/HttpChannelParent.cpp
+++ b/netwerk/protocol/http/HttpChannelParent.cpp
@@ -118,17 +118,17 @@ HttpChannelParent::Init(const HttpChanne
     return DoAsyncOpen(a.uri(), a.original(), a.doc(), a.referrer(),
                        a.referrerPolicy(), a.apiRedirectTo(), a.topWindowURI(),
                        a.loadFlags(), a.requestHeaders(),
                        a.requestMethod(), a.uploadStream(),
                        a.uploadStreamHasHeaders(), a.priority(), a.classOfService(),
                        a.redirectionLimit(), a.allowPipelining(), a.allowSTS(),
                        a.thirdPartyFlags(), a.resumeAt(), a.startPos(),
                        a.entityID(), a.chooseApplicationCache(),
-                       a.appCacheClientID(), a.allowSpdy(), a.allowAltSvc(),
+                       a.appCacheClientID(), a.allowSpdy(), a.allowAltSvc(), a.beConservative(),
                        a.loadInfo(), a.synthesizedResponseHead(),
                        a.synthesizedSecurityInfoSerialization(),
                        a.cacheKey(), a.requestContextID(), a.preflightArgs(),
                        a.initialRwin(), a.blockAuthPrompt(),
                        a.suspendAfterSynthesizeResponse(),
                        a.allowStaleCacheContent(), a.contentTypeHint(),
                        a.channelId(), a.preferredAlternativeType());
   }
@@ -310,16 +310,17 @@ HttpChannelParent::DoAsyncOpen(  const U
                                  const uint32_t&            thirdPartyFlags,
                                  const bool&                doResumeAt,
                                  const uint64_t&            startPos,
                                  const nsCString&           entityID,
                                  const bool&                chooseApplicationCache,
                                  const nsCString&           appCacheClientID,
                                  const bool&                allowSpdy,
                                  const bool&                allowAltSvc,
+                                 const bool&                beConservative,
                                  const OptionalLoadInfoArgs& aLoadInfoArgs,
                                  const OptionalHttpResponseHead& aSynthesizedResponseHead,
                                  const nsCString&           aSecurityInfoSerialization,
                                  const uint32_t&            aCacheKey,
                                  const nsCString&           aRequestContextID,
                                  const OptionalCorsPreflightArgs& aCorsPreflightArgs,
                                  const uint32_t&            aInitialRwin,
                                  const bool&                aBlockAuthPrompt,
@@ -520,16 +521,17 @@ HttpChannelParent::DoAsyncOpen(  const U
     mChannel->SetClassFlags(classOfService);
   }
   mChannel->SetRedirectionLimit(redirectionLimit);
   mChannel->SetAllowPipelining(allowPipelining);
   mChannel->SetAllowSTS(allowSTS);
   mChannel->SetThirdPartyFlags(thirdPartyFlags);
   mChannel->SetAllowSpdy(allowSpdy);
   mChannel->SetAllowAltSvc(allowAltSvc);
+  mChannel->SetBeConservative(beConservative);
   mChannel->SetInitialRwin(aInitialRwin);
   mChannel->SetBlockAuthPrompt(aBlockAuthPrompt);
 
   nsCOMPtr<nsIApplicationCacheChannel> appCacheChan =
     do_QueryObject(mChannel);
   nsCOMPtr<nsIApplicationCacheService> appCacheService =
     do_GetService(NS_APPLICATIONCACHESERVICE_CONTRACTID);
 
--- a/netwerk/protocol/http/HttpChannelParent.h
+++ b/netwerk/protocol/http/HttpChannelParent.h
@@ -124,16 +124,17 @@ protected:
                    const uint32_t&            thirdPartyFlags,
                    const bool&                doResumeAt,
                    const uint64_t&            startPos,
                    const nsCString&           entityID,
                    const bool&                chooseApplicationCache,
                    const nsCString&           appCacheClientID,
                    const bool&                allowSpdy,
                    const bool&                allowAltSvc,
+                   const bool&                beConservative,
                    const OptionalLoadInfoArgs& aLoadInfoArgs,
                    const OptionalHttpResponseHead& aSynthesizedResponseHead,
                    const nsCString&           aSecurityInfoSerialization,
                    const uint32_t&            aCacheKey,
                    const nsCString&           aRequestContextID,
                    const OptionalCorsPreflightArgs& aCorsPreflightArgs,
                    const uint32_t&            aInitialRwin,
                    const bool&                aBlockAuthPrompt,
--- a/netwerk/protocol/http/nsHttp.h
+++ b/netwerk/protocol/http/nsHttp.h
@@ -83,16 +83,21 @@ typedef uint8_t nsHttpVersion;
 
 // This flag indicates the transaction should accept associated pushes
 #define NS_HTTP_ONPUSH_LISTENER      (1<<9)
 
 // Transactions with this flag should react to errors without side effects
 // First user is to prevent clearing of alt-svc cache on failed probe
 #define NS_HTTP_ERROR_SOFTLY         (1<<10)
 
+// This corresponds to nsIHttpChannelInternal.beConservative
+// it disables any cutting edge features that we are worried might result in
+// interop problems with critical infrastructure
+#define NS_HTTP_BE_CONSERVATIVE      (1<<11)
+
 //-----------------------------------------------------------------------------
 // some default values
 //-----------------------------------------------------------------------------
 
 #define NS_HTTP_DEFAULT_PORT  80
 #define NS_HTTPS_DEFAULT_PORT 443
 
 #define NS_HTTP_HEADER_SEPS ", \t"
--- a/netwerk/protocol/http/nsHttpChannel.cpp
+++ b/netwerk/protocol/http/nsHttpChannel.cpp
@@ -370,16 +370,17 @@ nsHttpChannel::Connect()
     if (mUpgradeProtocolCallback) {
         mCaps |=  NS_HTTP_DISALLOW_SPDY;
     }
 
     // Finalize ConnectionInfo flags before SpeculativeConnect
     mConnectionInfo->SetAnonymous((mLoadFlags & LOAD_ANONYMOUS) != 0);
     mConnectionInfo->SetPrivate(mPrivateBrowsing);
     mConnectionInfo->SetNoSpdy(mCaps & NS_HTTP_DISALLOW_SPDY);
+    mConnectionInfo->SetBeConservative((mCaps & NS_HTTP_BE_CONSERVATIVE) || mBeConservative);
 
     // Consider opening a TCP connection right away.
     SpeculativeConnect();
 
     // Don't allow resuming when cache must be used
     if (mResuming && (mLoadFlags & LOAD_ONLY_FROM_CACHE)) {
         LOG(("Resuming from cache is not supported yet"));
         return NS_ERROR_DOCUMENT_NOT_CACHED;
@@ -784,18 +785,22 @@ nsHttpChannel::SetupTransaction()
         if (!mAllowPipelining ||
            (mLoadFlags & (LOAD_INITIAL_DOCUMENT_URI | INHIBIT_PIPELINE)) ||
             !SafeForPipelining(mRequestHead.ParsedMethod(), method)) {
             LOG(("  pipelining disallowed\n"));
             mCaps &= ~NS_HTTP_ALLOW_PIPELINING;
         }
     }
 
-    if (!mAllowSpdy)
+    if (!mAllowSpdy) {
         mCaps |= NS_HTTP_DISALLOW_SPDY;
+    }
+    if (mBeConservative) {
+        mCaps |= NS_HTTP_BE_CONSERVATIVE;
+    }
 
     // Use the URI path if not proxying (transparent proxying such as proxy
     // CONNECT does not count here). Also figure out what HTTP version to use.
     nsAutoCString buf, path;
     nsCString* requestURI;
 
     // This is the normal e2e H1 path syntax "/index.html"
     rv = mURI->GetPath(path);
--- a/netwerk/protocol/http/nsHttpConnectionInfo.cpp
+++ b/netwerk/protocol/http/nsHttpConnectionInfo.cpp
@@ -140,18 +140,19 @@ void nsHttpConnectionInfo::BuildHashKey(
 
     // The hashkey has 4 fields followed by host connection info
     // byte 0 is P/T/. {P,T} for Plaintext/TLS Proxy over HTTP
     // byte 1 is S/. S is for end to end ssl such as https:// uris
     // byte 2 is A/. A is for an anonymous channel (no cookies, etc..)
     // byte 3 is P/. P is for a private browising channel
     // byte 4 is I/. I is for insecure scheme on TLS for http:// uris
     // byte 5 is X/. X is for disallow_spdy flag
+    // byte 6 is C/. C is for be Conservative
 
-    mHashKey.AssignLiteral("......");
+    mHashKey.AssignLiteral(".......");
     mHashKey.Append(keyHost);
     if (!mNetworkInterfaceId.IsEmpty()) {
         mHashKey.Append('(');
         mHashKey.Append(mNetworkInterfaceId);
         mHashKey.Append(')');
     }
     mHashKey.Append(':');
     mHashKey.AppendInt(keyPort);
@@ -252,16 +253,17 @@ nsHttpConnectionInfo::Clone() const
         clone->SetNetworkInterfaceId(mNetworkInterfaceId);
     }
 
     // Make sure the anonymous, insecure-scheme, and private flags are transferred
     clone->SetAnonymous(GetAnonymous());
     clone->SetPrivate(GetPrivate());
     clone->SetInsecureScheme(GetInsecureScheme());
     clone->SetNoSpdy(GetNoSpdy());
+    clone->SetBeConservative(GetBeConservative());
     MOZ_ASSERT(clone->Equals(this));
 
     return clone;
 }
 
 void
 nsHttpConnectionInfo::CloneAsDirectRoute(nsHttpConnectionInfo **outCI)
 {
@@ -274,16 +276,17 @@ nsHttpConnectionInfo::CloneAsDirectRoute
         new nsHttpConnectionInfo(mOrigin, mOriginPort,
                                  EmptyCString(), mUsername, mProxyInfo,
                                  mOriginAttributes, mEndToEndSSL);
     // Make sure the anonymous, insecure-scheme, and private flags are transferred
     clone->SetAnonymous(GetAnonymous());
     clone->SetPrivate(GetPrivate());
     clone->SetInsecureScheme(GetInsecureScheme());
     clone->SetNoSpdy(GetNoSpdy());
+    clone->SetBeConservative(GetBeConservative());
     if (!mNetworkInterfaceId.IsEmpty()) {
         clone->SetNetworkInterfaceId(mNetworkInterfaceId);
     }
     clone.forget(outCI);
 }
 
 nsresult
 nsHttpConnectionInfo::CreateWildCard(nsHttpConnectionInfo **outParam)
--- a/netwerk/protocol/http/nsHttpConnectionInfo.h
+++ b/netwerk/protocol/http/nsHttpConnectionInfo.h
@@ -113,16 +113,20 @@ public:
     void          SetInsecureScheme(bool insecureScheme)
                                        { mHashKey.SetCharAt(insecureScheme ? 'I' : '.', 4); }
     bool          GetInsecureScheme() const   { return mHashKey.CharAt(4) == 'I'; }
 
     void          SetNoSpdy(bool aNoSpdy)
                                        { mHashKey.SetCharAt(aNoSpdy ? 'X' : '.', 5); }
     bool          GetNoSpdy() const    { return mHashKey.CharAt(5) == 'X'; }
 
+    void          SetBeConservative(bool aBeConservative)
+                                            { mHashKey.SetCharAt(aBeConservative ? 'C' : '.', 6); }
+    bool          GetBeConservative() const { return mHashKey.CharAt(6) == 'C'; }
+
     const nsCString &GetNetworkInterfaceId() const { return mNetworkInterfaceId; }
 
     const nsCString &GetNPNToken() { return mNPNToken; }
     const nsCString &GetUsername() { return mUsername; }
 
     const NeckoOriginAttributes &GetOriginAttributes() { return mOriginAttributes; }
 
     // Returns true for any kind of proxy (http, socks, https, etc..)
--- a/netwerk/protocol/http/nsHttpConnectionMgr.cpp
+++ b/netwerk/protocol/http/nsHttpConnectionMgr.cpp
@@ -3057,16 +3057,21 @@ nsHalfOpenSocket::SetupStreams(nsISocket
         tmpFlags = nsISocketTransport::BYPASS_CACHE;
 
     if (mCaps & NS_HTTP_LOAD_ANONYMOUS)
         tmpFlags |= nsISocketTransport::ANONYMOUS_CONNECT;
 
     if (ci->GetPrivate())
         tmpFlags |= nsISocketTransport::NO_PERMANENT_STORAGE;
 
+    if ((mCaps & NS_HTTP_BE_CONSERVATIVE) || ci->GetBeConservative()) {
+        LOG(("Setting Socket to BE_CONSERVATIVE"));
+        tmpFlags |= nsISocketTransport::BE_CONSERVATIVE;
+    }
+
     // For backup connections, we disable IPv6. That's because some users have
     // broken IPv6 connectivity (leading to very long timeouts), and disabling
     // IPv6 on the backup connection gives them a much better user experience
     // with dual-stack hosts, though they still pay the 250ms delay for each new
     // connection. This strategy is also known as "happy eyeballs".
     if (mEnt->mPreferIPv6) {
         tmpFlags |= nsISocketTransport::DISABLE_IPV4;
     }
--- a/netwerk/protocol/http/nsIHttpChannelInternal.idl
+++ b/netwerk/protocol/http/nsIHttpChannelInternal.idl
@@ -200,16 +200,23 @@ interface nsIHttpChannelInternal : nsISu
     readonly attribute nsIURI apiRedirectToURI;
 
     /**
      * Enable/Disable use of Alternate Services with this channel.
      * The network.http.altsvc.enabled preference is still a pre-requisite.
      */
     attribute boolean allowAltSvc;
 
+    /**
+     * If true, do not use newer protocol features that might have interop problems
+     * on the Internet. Intended only for use with critical infra like the updater.
+     * default is false.
+     */
+    attribute boolean beConservative;
+
     readonly attribute PRTime lastModifiedTime;
 
     /**
      * Force a channel that has not been AsyncOpen'ed to skip any check for possible
      * interception and proceed immediately to open a previously-synthesized cache
      * entry using the provided ID.
      */
     void forceIntercepted(in uint64_t aInterceptionID);
--- a/netwerk/socket/nsISocketProvider.idl
+++ b/netwerk/socket/nsISocketProvider.idl
@@ -100,16 +100,23 @@ interface nsISocketProvider : nsISupport
     const unsigned long NO_PERMANENT_STORAGE = 1 << 2;
 
     /**
      * This flag is an explicit opt-in that allows a normally secure socket
      * provider to use, at its discretion, an insecure algorithm. e.g.
      * a TLS socket without authentication.
      */
     const unsigned long MITM_OK = 1 << 3;
+
+    /**
+     * If set, do not use newer protocol features that might have interop problems
+     * on the Internet. Intended only for use with critical infra like the updater.
+     * default is false.
+     */
+    const unsigned long BE_CONSERVATIVE = 1 << 4;
 };
 
 %{C++
 /**
  * nsISocketProvider implementations should be registered with XPCOM under a
  * contract ID of the form: "@mozilla.org/network/socket;2?type=foo"
  */
 #define NS_NETWORK_SOCKET_CONTRACTID_PREFIX \
--- a/security/manager/ssl/nsNSSIOLayer.cpp
+++ b/security/manager/ssl/nsNSSIOLayer.cpp
@@ -2376,16 +2376,24 @@ nsSSLIOLayerSetOptions(PRFileDesc* fd, b
     }
   }
 
   SSLVersionRange range;
   if (SSL_VersionRangeGet(fd, &range) != SECSuccess) {
     return NS_ERROR_FAILURE;
   }
 
+  if ((infoObject->GetProviderFlags() & nsISocketProvider::BE_CONSERVATIVE) &&
+      (range.max > SSL_LIBRARY_VERSION_TLS_1_2)) {
+    MOZ_LOG(gPIPNSSLog, LogLevel::Debug,
+            ("[%p] nsSSLIOLayerSetOptions: range.max limited to 1.2 due to BE_CONSERVATIVE flag\n",
+             fd));
+    range.max = SSL_LIBRARY_VERSION_TLS_1_2;
+  }
+
   uint16_t maxEnabledVersion = range.max;
   infoObject->SharedState().IOLayerHelpers()
     .adjustForTLSIntolerance(infoObject->GetHostName(), infoObject->GetPort(),
                              range);
   MOZ_LOG(gPIPNSSLog, LogLevel::Debug,
          ("[%p] nsSSLIOLayerSetOptions: using TLS version range (0x%04x,0x%04x)\n",
           fd, static_cast<unsigned int>(range.min),
               static_cast<unsigned int>(range.max)));
@@ -2455,16 +2463,19 @@ nsSSLIOLayerSetOptions(PRFileDesc* fd, b
     peerId.AppendLiteral("anon:");
   }
   if (flags & nsISocketProvider::NO_PERMANENT_STORAGE) {
     peerId.AppendLiteral("private:");
   }
   if (flags & nsISocketProvider::MITM_OK) {
     peerId.AppendLiteral("bypassAuth:");
   }
+  if (flags & nsISocketProvider::BE_CONSERVATIVE) {
+    peerId.AppendLiteral("beConservative:");
+  }
   peerId.Append(host);
   peerId.Append(':');
   peerId.AppendInt(port);
   nsAutoCString suffix;
   infoObject->GetOriginAttributes().CreateSuffix(suffix);
   peerId.Append(suffix);
   if (SECSuccess != SSL_SetSockPeerID(fd, peerId.get())) {
     return NS_ERROR_FAILURE;
--- a/security/sandbox/linux/Sandbox.cpp
+++ b/security/sandbox/linux/Sandbox.cpp
@@ -207,51 +207,56 @@ InstallSigSysHandler(void)
  * whitelist).
  *
  * PR_SET_NO_NEW_PRIVS ensures that it is impossible to grant more
  * syscalls to the process beyond this point (even after fork()), and
  * prevents gaining capabilities (e.g., by exec'ing a setuid root
  * program).  The kernel won't allow seccomp-bpf without doing this,
  * because otherwise it could be used for privilege escalation attacks.
  *
- * Returns false (and sets errno) on failure.
+ * Returns false if the filter was already installed (see the
+ * PR_SET_NO_NEW_PRIVS rule in SandboxFilter.cpp).  Crashes on any
+ * other error condition.
  *
  * @see SandboxInfo
  * @see BroadcastSetThreadSandbox
  */
 static bool MOZ_MUST_USE
 InstallSyscallFilter(const sock_fprog *aProg, bool aUseTSync)
 {
   if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) {
+    if (!aUseTSync && errno == ETXTBSY) {
+      return false;
+    }
     SANDBOX_LOG_ERROR("prctl(PR_SET_NO_NEW_PRIVS) failed: %s", strerror(errno));
     MOZ_CRASH("prctl(PR_SET_NO_NEW_PRIVS)");
   }
 
   if (aUseTSync) {
     if (syscall(__NR_seccomp, SECCOMP_SET_MODE_FILTER,
                 SECCOMP_FILTER_FLAG_TSYNC, aProg) != 0) {
       SANDBOX_LOG_ERROR("thread-synchronized seccomp failed: %s",
                         strerror(errno));
-      return false;
+      MOZ_CRASH("prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER)");
     }
   } else {
     if (prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, (unsigned long)aProg, 0, 0)) {
       SANDBOX_LOG_ERROR("prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER) failed: %s",
                         strerror(errno));
-      return false;
+      MOZ_CRASH("seccomp+tsync failed, but kernel supports tsync");
     }
   }
   return true;
 }
 
 // Use signals for permissions that need to be set per-thread.
 // The communication channel from the signal handler back to the main thread.
 static mozilla::Atomic<int> gSetSandboxDone;
 // Pass the filter itself through a global.
-static const sock_fprog* gSetSandboxFilter;
+const sock_fprog* gSetSandboxFilter;
 
 // We have to dynamically allocate the signal number; see bug 1038900.
 // This function returns the first realtime signal currently set to
 // default handling (i.e., not in use), or 0 if none could be found.
 //
 // WARNING: if this function or anything similar to it (including in
 // external libraries) is used on multiple threads concurrently, there
 // will be a race condition.
@@ -270,23 +275,17 @@ FindFreeSignalNumber()
   return 0;
 }
 
 // Returns true if sandboxing was enabled, or false if sandboxing
 // already was enabled.  Crashes if sandboxing could not be enabled.
 static bool
 SetThreadSandbox()
 {
-  if (prctl(PR_GET_SECCOMP, 0, 0, 0, 0) == 0) {
-    if (!InstallSyscallFilter(gSetSandboxFilter, false)) {
-      MOZ_CRASH("prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER)");
-    }
-    return true;
-  }
-  return false;
+  return InstallSyscallFilter(gSetSandboxFilter, false);
 }
 
 static void
 SetThreadSandboxHandler(int signum)
 {
   // The non-zero number sent back to the main thread indicates
   // whether action was taken.
   if (SetThreadSandbox()) {
@@ -446,17 +445,17 @@ static void
 ApplySandboxWithTSync(sock_fprog* aFilter)
 {
   EnterChroot();
   // At this point we're committed to using tsync, because the signal
   // broadcast workaround needs to access procfs.  (Unless chroot
   // isn't used... but this failure shouldn't happen in the first
   // place, so let's not make extra special cases for it.)
   if (!InstallSyscallFilter(aFilter, true)) {
-    MOZ_CRASH("seccomp+tsync failed, but kernel supports tsync");
+    MOZ_CRASH();
   }
 }
 
 // Common code for sandbox startup.
 static void
 SetCurrentProcessSandbox(UniquePtr<sandbox::bpf_dsl::Policy> aPolicy)
 {
   MOZ_ASSERT(gSandboxCrashFunc);
--- a/security/sandbox/linux/SandboxFilter.cpp
+++ b/security/sandbox/linux/SandboxFilter.cpp
@@ -3,16 +3,17 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this file,
  * You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #include "SandboxFilter.h"
 #include "SandboxFilterUtil.h"
 
 #include "SandboxBrokerClient.h"
+#include "SandboxInfo.h"
 #include "SandboxInternal.h"
 #include "SandboxLogging.h"
 
 #include "mozilla/UniquePtr.h"
 
 #include <errno.h>
 #include <fcntl.h>
 #include <linux/ipc.h>
@@ -87,16 +88,26 @@ private:
   // bionic commit 10c8ce59a (in JB and up; API level 16 = Android 4.1).
   static intptr_t TKillCompatTrap(const sandbox::arch_seccomp_data& aArgs,
                                   void *aux)
   {
     return syscall(__NR_tgkill, getpid(), aArgs.args[0], aArgs.args[1]);
   }
 #endif
 
+  static intptr_t SetNoNewPrivsTrap(ArgsRef& aArgs, void* aux) {
+    if (gSetSandboxFilter == nullptr) {
+      // Called after BroadcastSetThreadSandbox finished, therefore
+      // not our doing and not expected.
+      return BlockedSyscallTrap(aArgs, nullptr);
+    }
+    // Signal that the filter is already in place.
+    return -ETXTBSY;
+  }
+
 public:
   virtual ResultExpr InvalidSyscall() const override {
     return Trap(BlockedSyscallTrap, nullptr);
   }
 
   virtual ResultExpr ClonePolicy(ResultExpr failPolicy) const {
     // Allow use for simple thread creation (pthread_create) only.
 
@@ -244,18 +255,26 @@ public:
       return Allow();
 #endif
 #ifdef ANDROID
     case __NR_set_tid_address:
       return Allow();
 #endif
 
       // prctl
-    case __NR_prctl:
-      return PrctlPolicy();
+    case __NR_prctl: {
+      if (SandboxInfo::Get().Test(SandboxInfo::kHasSeccompTSync)) {
+        return PrctlPolicy();
+      }
+
+      Arg<int> option(0);
+      return If(option == PR_SET_NO_NEW_PRIVS,
+                Trap(SetNoNewPrivsTrap, nullptr))
+        .Else(PrctlPolicy());
+    }
 
       // NSPR can call this when creating a thread, but it will accept a
       // polite "no".
     case __NR_getpriority:
       // But if thread creation races with sandbox startup, that call
       // could succeed, and then we get one of these:
     case __NR_setpriority:
       return Error(EACCES);
--- a/security/sandbox/linux/SandboxInternal.h
+++ b/security/sandbox/linux/SandboxInternal.h
@@ -6,20 +6,23 @@
 
 #ifndef mozilla_SandboxInternal_h
 #define mozilla_SandboxInternal_h
 
 #include <signal.h>
 
 #include "mozilla/Types.h"
 
+struct sock_fprog;
+
 namespace mozilla {
 
 // SandboxCrash() has to be in libxul to use internal interfaces, but
 // its caller in libmozsandbox.
 // See also bug 1101170.
 
 typedef void (*SandboxCrashFunc)(int, siginfo_t*, void*);
 extern MOZ_EXPORT SandboxCrashFunc gSandboxCrashFunc;
+extern const sock_fprog* gSetSandboxFilter;
 
 } // namespace mozilla
 
 #endif // mozilla_SandboxInternal_h
--- a/testing/web-platform/meta/FileAPI/blob/Blob-constructor.html.ini
+++ b/testing/web-platform/meta/FileAPI/blob/Blob-constructor.html.ini
@@ -1,6 +1,8 @@
 [Blob-constructor.html]
+  type: testharness
   [The 'endings' property should be ignored.]
     expected: FAIL
 
   [Newlines should not change when endings is 'native'.]
     expected: FAIL
+
--- a/testing/web-platform/meta/fetch/api/basic/request-headers-worker.html.ini
+++ b/testing/web-platform/meta/fetch/api/basic/request-headers-worker.html.ini
@@ -1,5 +1,6 @@
 [request-headers-worker.html]
   type: testharness
   [Fetch with POST with FormData body]
     expected: FAIL
     bug: https://github.com/whatwg/fetch/issues/422
+
--- a/testing/web-platform/meta/fetch/api/basic/request-headers.html.ini
+++ b/testing/web-platform/meta/fetch/api/basic/request-headers.html.ini
@@ -1,5 +1,6 @@
 [request-headers.html]
   type: testharness
   [Fetch with POST with FormData body]
     expected: FAIL
     bug: https://github.com/whatwg/fetch/issues/422
+
--- a/testing/web-platform/meta/mathml/presentation-markup/fractions/frac-1.html.ini
+++ b/testing/web-platform/meta/mathml/presentation-markup/fractions/frac-1.html.ini
@@ -7,11 +7,13 @@
       if not debug and e10s and (os == "linux") and (version == "Ubuntu 12.04") and (processor == "x86") and (bits == 32): FAIL
       if not debug and not e10s and (os == "win") and (version == "5.1.2600") and (processor == "x86") and (bits == 32): FAIL
       if debug and e10s and (os == "linux") and (version == "Ubuntu 12.04") and (processor == "x86") and (bits == 32): FAIL
       if debug and not e10s and (os == "linux") and (version == "Ubuntu 12.04") and (processor == "x86") and (bits == 32): FAIL
       if not debug and e10s and (os == "win") and (version == "5.1.2600") and (processor == "x86") and (bits == 32): FAIL
       if not debug and not e10s and (os == "linux") and (version == "Ubuntu 12.04") and (processor == "x86_64") and (bits == 64): FAIL
       if not debug and e10s and (os == "linux") and (version == "Ubuntu 12.04") and (processor == "x86_64") and (bits == 64): FAIL
       if debug and e10s and (os == "win") and (version == "5.1.2600") and (processor == "x86") and (bits == 32): FAIL
+
   [Fraction axis is aligned on the math axis]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): FAIL
+
--- a/testing/web-platform/meta/presentation-api/controlling-ua/startNewPresentation_error.html.ini
+++ b/testing/web-platform/meta/presentation-api/controlling-ua/startNewPresentation_error.html.ini
@@ -1,6 +1,7 @@
 [startNewPresentation_error.html]
   type: testharness
   disabled: https://bugzilla.mozilla.org/show_bug.cgi?id=1317194
   prefs: [dom.presentation.enabled: true, dom.presentation.controller.enabled: true, dom.presentation.discovery.enabled: true, dom.presentation.device.name: "Firefox"]
   [The presentation could not start, because a user gesture is required.]
     expected: FAIL
+
--- a/testing/web-platform/meta/referrer-policy/generic/unsupported-csp-referrer-directive.html.ini
+++ b/testing/web-platform/meta/referrer-policy/generic/unsupported-csp-referrer-directive.html.ini
@@ -1,8 +1,7 @@
 [unsupported-csp-referrer-directive.html]
   type: testharness
-  expected: TIMEOUT
   disabled:
     if (os == "linux") and (bits == 64): true
   [Image has a referrer despite CSP 'referrer' directive]
-    expected: NOTRUN
+    expected: FAIL
 
--- a/testing/web-platform/meta/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [insecure-protocol.keep-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is stripped-referrer when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [insecure-protocol.no-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is stripped-referrer when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with no-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [insecure-protocol.swap-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is stripped-referrer when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [upgrade-protocol.keep-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is stripped-referrer when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [upgrade-protocol.no-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is stripped-referrer when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with no-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [upgrade-protocol.swap-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is stripped-referrer when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [insecure-protocol.keep-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is stripped-referrer when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [insecure-protocol.no-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is stripped-referrer when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with no-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [insecure-protocol.swap-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is stripped-referrer when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [upgrade-protocol.keep-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is stripped-referrer when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [upgrade-protocol.no-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is stripped-referrer when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with no-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/no-referrer-when-downgrade/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [upgrade-protocol.swap-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is stripped-referrer when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [insecure-protocol.keep-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is stripped-referrer when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [insecure-protocol.no-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is stripped-referrer when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with no-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [insecure-protocol.swap-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is stripped-referrer when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [upgrade-protocol.keep-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is stripped-referrer when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [upgrade-protocol.no-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is stripped-referrer when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with no-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/no-referrer-when-downgrade/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [upgrade-protocol.swap-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is stripped-referrer when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [insecure-protocol.keep-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is stripped-referrer when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [insecure-protocol.no-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is stripped-referrer when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with no-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [insecure-protocol.swap-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is stripped-referrer when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [upgrade-protocol.keep-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is stripped-referrer when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [upgrade-protocol.no-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is stripped-referrer when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with no-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [upgrade-protocol.swap-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is stripped-referrer when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/no-referrer/attr-referrer/cross-origin/http-http/img-tag/generic.keep-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/no-referrer/attr-referrer/cross-origin/http-http/img-tag/generic.keep-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.keep-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is omitted when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/no-referrer/attr-referrer/cross-origin/http-http/img-tag/generic.no-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/no-referrer/attr-referrer/cross-origin/http-http/img-tag/generic.no-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.no-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is omitted when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with no-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/no-referrer/attr-referrer/cross-origin/http-http/img-tag/generic.swap-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/no-referrer/attr-referrer/cross-origin/http-http/img-tag/generic.swap-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.swap-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is omitted when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/no-referrer/attr-referrer/cross-origin/http-https/img-tag/generic.keep-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/no-referrer/attr-referrer/cross-origin/http-https/img-tag/generic.keep-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.keep-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is omitted when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/no-referrer/attr-referrer/cross-origin/http-https/img-tag/generic.no-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/no-referrer/attr-referrer/cross-origin/http-https/img-tag/generic.no-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.no-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is omitted when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with no-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/no-referrer/attr-referrer/cross-origin/http-https/img-tag/generic.swap-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/no-referrer/attr-referrer/cross-origin/http-https/img-tag/generic.swap-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.swap-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is omitted when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/no-referrer/attr-referrer/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/no-referrer/attr-referrer/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.keep-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is omitted when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/no-referrer/attr-referrer/same-origin/http-http/img-tag/generic.no-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/no-referrer/attr-referrer/same-origin/http-http/img-tag/generic.no-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.no-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is omitted when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with no-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/no-referrer/attr-referrer/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/no-referrer/attr-referrer/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.swap-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is omitted when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/no-referrer/attr-referrer/same-origin/http-https/img-tag/generic.keep-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/no-referrer/attr-referrer/same-origin/http-https/img-tag/generic.keep-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.keep-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is omitted when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/no-referrer/attr-referrer/same-origin/http-https/img-tag/generic.no-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/no-referrer/attr-referrer/same-origin/http-https/img-tag/generic.no-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.no-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is omitted when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with no-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/no-referrer/attr-referrer/same-origin/http-https/img-tag/generic.swap-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/no-referrer/attr-referrer/same-origin/http-https/img-tag/generic.swap-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.swap-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is omitted when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/no-referrer/http-rp/cross-origin/http-http/img-tag/generic.keep-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/no-referrer/http-rp/cross-origin/http-http/img-tag/generic.keep-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.keep-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is omitted when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/no-referrer/http-rp/cross-origin/http-http/img-tag/generic.no-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/no-referrer/http-rp/cross-origin/http-http/img-tag/generic.no-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.no-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is omitted when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with no-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/no-referrer/http-rp/cross-origin/http-http/img-tag/generic.swap-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/no-referrer/http-rp/cross-origin/http-http/img-tag/generic.swap-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.swap-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is omitted when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/no-referrer/http-rp/cross-origin/http-https/img-tag/generic.keep-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/no-referrer/http-rp/cross-origin/http-https/img-tag/generic.keep-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.keep-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is omitted when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/no-referrer/http-rp/cross-origin/http-https/img-tag/generic.no-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/no-referrer/http-rp/cross-origin/http-https/img-tag/generic.no-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.no-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is omitted when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with no-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/no-referrer/http-rp/cross-origin/http-https/img-tag/generic.swap-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/no-referrer/http-rp/cross-origin/http-https/img-tag/generic.swap-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.swap-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is omitted when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/no-referrer/http-rp/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/no-referrer/http-rp/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.keep-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is omitted when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/no-referrer/http-rp/same-origin/http-http/img-tag/generic.no-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/no-referrer/http-rp/same-origin/http-http/img-tag/generic.no-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.no-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is omitted when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with no-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/no-referrer/http-rp/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/no-referrer/http-rp/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.swap-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is omitted when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/no-referrer/http-rp/same-origin/http-https/img-tag/generic.keep-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/no-referrer/http-rp/same-origin/http-https/img-tag/generic.keep-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.keep-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is omitted when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/no-referrer/http-rp/same-origin/http-https/img-tag/generic.no-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/no-referrer/http-rp/same-origin/http-https/img-tag/generic.no-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.no-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is omitted when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with no-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/no-referrer/http-rp/same-origin/http-https/img-tag/generic.swap-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/no-referrer/http-rp/same-origin/http-https/img-tag/generic.swap-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.swap-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is omitted when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-http/img-tag/cross-origin.keep-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-http/img-tag/cross-origin.keep-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [cross-origin.keep-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-http/img-tag/cross-origin.no-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-http/img-tag/cross-origin.no-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [cross-origin.no-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with no-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-http/img-tag/cross-origin.swap-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-http/img-tag/cross-origin.swap-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [cross-origin.swap-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-https/img-tag/cross-origin.keep-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-https/img-tag/cross-origin.keep-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [cross-origin.keep-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-https/img-tag/cross-origin.no-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-https/img-tag/cross-origin.no-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [cross-origin.no-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with no-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-https/img-tag/cross-origin.swap-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-https/img-tag/cross-origin.swap-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [cross-origin.swap-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-http/img-tag/same-origin-insecure.keep-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-http/img-tag/same-origin-insecure.keep-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [same-origin-insecure.keep-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is stripped-referrer when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-http/img-tag/same-origin-insecure.no-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-http/img-tag/same-origin-insecure.no-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [same-origin-insecure.no-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is stripped-referrer when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with no-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-http/img-tag/same-origin-insecure.swap-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-http/img-tag/same-origin-insecure.swap-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [same-origin-insecure.swap-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/same-origin-downgrade.keep-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/same-origin-downgrade.keep-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [same-origin-downgrade.keep-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/same-origin-downgrade.no-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/same-origin-downgrade.no-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [same-origin-downgrade.no-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with no-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/same-origin-downgrade.swap-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/same-origin-downgrade.swap-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [same-origin-downgrade.swap-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/same-origin-insecure.swap-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/same-origin-insecure.swap-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [same-origin-insecure.swap-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/same-origin-upgrade.keep-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/same-origin-upgrade.keep-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [same-origin-upgrade.keep-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/same-origin-upgrade.no-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/same-origin-upgrade.no-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [same-origin-upgrade.no-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with no-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/same-origin-upgrade.swap-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/same-origin-upgrade.swap-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [same-origin-upgrade.swap-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-http/img-tag/cross-origin.keep-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-http/img-tag/cross-origin.keep-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [cross-origin.keep-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-http/img-tag/cross-origin.no-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-http/img-tag/cross-origin.no-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [cross-origin.no-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with no-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-http/img-tag/cross-origin.swap-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-http/img-tag/cross-origin.swap-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [cross-origin.swap-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-https/img-tag/cross-origin.keep-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-https/img-tag/cross-origin.keep-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [cross-origin.keep-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-https/img-tag/cross-origin.no-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-https/img-tag/cross-origin.no-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [cross-origin.no-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with no-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-https/img-tag/cross-origin.swap-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-https/img-tag/cross-origin.swap-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [cross-origin.swap-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.keep-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.keep-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [same-origin-insecure.keep-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is stripped-referrer when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.no-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.no-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [same-origin-insecure.no-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is stripped-referrer when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with no-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.swap-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.swap-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [same-origin-insecure.swap-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/same-origin-downgrade.keep-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/same-origin-downgrade.keep-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [same-origin-downgrade.keep-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/same-origin-downgrade.no-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/same-origin-downgrade.no-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [same-origin-downgrade.no-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with no-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/same-origin-downgrade.swap-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/same-origin-downgrade.swap-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [same-origin-downgrade.swap-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/same-origin-insecure.swap-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/same-origin-insecure.swap-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [same-origin-insecure.swap-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/same-origin-upgrade.keep-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/same-origin-upgrade.keep-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [same-origin-upgrade.keep-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/same-origin-upgrade.no-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/same-origin-upgrade.no-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [same-origin-upgrade.no-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with no-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/same-origin-upgrade.swap-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/same-origin-upgrade.swap-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [same-origin-upgrade.swap-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin/attr-referrer/cross-origin/http-http/img-tag/generic.keep-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin/attr-referrer/cross-origin/http-http/img-tag/generic.keep-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.keep-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin/attr-referrer/cross-origin/http-http/img-tag/generic.no-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin/attr-referrer/cross-origin/http-http/img-tag/generic.no-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.no-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with no-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin/attr-referrer/cross-origin/http-http/img-tag/generic.swap-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin/attr-referrer/cross-origin/http-http/img-tag/generic.swap-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.swap-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin/attr-referrer/cross-origin/http-https/img-tag/generic.keep-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin/attr-referrer/cross-origin/http-https/img-tag/generic.keep-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.keep-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin/attr-referrer/cross-origin/http-https/img-tag/generic.no-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin/attr-referrer/cross-origin/http-https/img-tag/generic.no-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.no-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with no-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin/attr-referrer/cross-origin/http-https/img-tag/generic.swap-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin/attr-referrer/cross-origin/http-https/img-tag/generic.swap-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.swap-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin/attr-referrer/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin/attr-referrer/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.keep-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin/attr-referrer/same-origin/http-http/img-tag/generic.no-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin/attr-referrer/same-origin/http-http/img-tag/generic.no-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.no-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with no-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin/attr-referrer/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin/attr-referrer/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.swap-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin/attr-referrer/same-origin/http-https/img-tag/generic.keep-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin/attr-referrer/same-origin/http-https/img-tag/generic.keep-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.keep-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin/attr-referrer/same-origin/http-https/img-tag/generic.no-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin/attr-referrer/same-origin/http-https/img-tag/generic.no-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.no-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with no-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin/attr-referrer/same-origin/http-https/img-tag/generic.swap-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin/attr-referrer/same-origin/http-https/img-tag/generic.swap-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.swap-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin/http-rp/cross-origin/http-http/img-tag/generic.keep-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin/http-rp/cross-origin/http-http/img-tag/generic.keep-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.keep-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin/http-rp/cross-origin/http-http/img-tag/generic.no-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin/http-rp/cross-origin/http-http/img-tag/generic.no-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.no-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with no-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin/http-rp/cross-origin/http-http/img-tag/generic.swap-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin/http-rp/cross-origin/http-http/img-tag/generic.swap-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.swap-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin/http-rp/cross-origin/http-https/img-tag/generic.keep-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin/http-rp/cross-origin/http-https/img-tag/generic.keep-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.keep-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin/http-rp/cross-origin/http-https/img-tag/generic.no-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin/http-rp/cross-origin/http-https/img-tag/generic.no-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.no-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with no-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin/http-rp/cross-origin/http-https/img-tag/generic.swap-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin/http-rp/cross-origin/http-https/img-tag/generic.swap-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.swap-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin/http-rp/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin/http-rp/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.keep-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin/http-rp/same-origin/http-http/img-tag/generic.no-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin/http-rp/same-origin/http-http/img-tag/generic.no-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.no-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with no-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin/http-rp/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin/http-rp/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.swap-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin/http-rp/same-origin/http-https/img-tag/generic.keep-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin/http-rp/same-origin/http-https/img-tag/generic.keep-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.keep-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin/http-rp/same-origin/http-https/img-tag/generic.no-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin/http-rp/same-origin/http-https/img-tag/generic.no-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.no-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with no-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin/http-rp/same-origin/http-https/img-tag/generic.swap-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin/http-rp/same-origin/http-https/img-tag/generic.swap-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.swap-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin/meta-referrer/cross-origin/http-http/img-tag/generic.keep-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin/meta-referrer/cross-origin/http-http/img-tag/generic.keep-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.keep-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the meta-referrer\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin/meta-referrer/cross-origin/http-http/img-tag/generic.no-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin/meta-referrer/cross-origin/http-http/img-tag/generic.no-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.no-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the meta-referrer\n                                 delivery method with no-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin/meta-referrer/cross-origin/http-http/img-tag/generic.swap-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin/meta-referrer/cross-origin/http-http/img-tag/generic.swap-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.swap-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the meta-referrer\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin/meta-referrer/cross-origin/http-https/img-tag/generic.keep-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin/meta-referrer/cross-origin/http-https/img-tag/generic.keep-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.keep-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the meta-referrer\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin/meta-referrer/cross-origin/http-https/img-tag/generic.no-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin/meta-referrer/cross-origin/http-https/img-tag/generic.no-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.no-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the meta-referrer\n                                 delivery method with no-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin/meta-referrer/cross-origin/http-https/img-tag/generic.swap-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin/meta-referrer/cross-origin/http-https/img-tag/generic.swap-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.swap-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the meta-referrer\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin/meta-referrer/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin/meta-referrer/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.keep-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the meta-referrer\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin/meta-referrer/same-origin/http-http/img-tag/generic.no-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin/meta-referrer/same-origin/http-http/img-tag/generic.no-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.no-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the meta-referrer\n                                 delivery method with no-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin/meta-referrer/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin/meta-referrer/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.swap-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the meta-referrer\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin/meta-referrer/same-origin/http-https/img-tag/generic.keep-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin/meta-referrer/same-origin/http-https/img-tag/generic.keep-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.keep-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the meta-referrer\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin/meta-referrer/same-origin/http-https/img-tag/generic.no-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin/meta-referrer/same-origin/http-https/img-tag/generic.no-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.no-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the meta-referrer\n                                 delivery method with no-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/origin/meta-referrer/same-origin/http-https/img-tag/generic.swap-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/origin/meta-referrer/same-origin/http-https/img-tag/generic.swap-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.swap-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the meta-referrer\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/same-origin/attr-referrer/cross-origin/http-http/img-tag/cross-origin.keep-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,10 +0,0 @@
-[cross-origin.keep-origin-redirect.http.html]
-  type: testharness
-  expected:
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
-  [The referrer URL is omitted when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is cross-origin.]
-    expected:
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/same-origin/attr-referrer/cross-origin/http-http/img-tag/cross-origin.no-redirect.http.html.ini
+++ /dev/null
@@ -1,10 +0,0 @@
-[cross-origin.no-redirect.http.html]
-  type: testharness
-  expected:
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
-  [The referrer URL is omitted when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with no-redirect and when\n                                 the target request is cross-origin.]
-    expected:
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/same-origin/attr-referrer/cross-origin/http-http/img-tag/cross-origin.swap-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,10 +0,0 @@
-[cross-origin.swap-origin-redirect.http.html]
-  type: testharness
-  expected:
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
-  [The referrer URL is omitted when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is cross-origin.]
-    expected:
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/same-origin/attr-referrer/cross-origin/http-https/img-tag/cross-origin.keep-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,10 +0,0 @@
-[cross-origin.keep-origin-redirect.http.html]
-  type: testharness
-  expected:
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
-  [The referrer URL is omitted when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is cross-origin.]
-    expected:
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/same-origin/attr-referrer/cross-origin/http-https/img-tag/cross-origin.no-redirect.http.html.ini
+++ /dev/null
@@ -1,10 +0,0 @@
-[cross-origin.no-redirect.http.html]
-  type: testharness
-  expected:
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
-  [The referrer URL is omitted when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with no-redirect and when\n                                 the target request is cross-origin.]
-    expected:
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/same-origin/attr-referrer/cross-origin/http-https/img-tag/cross-origin.swap-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,10 +0,0 @@
-[cross-origin.swap-origin-redirect.http.html]
-  type: testharness
-  expected:
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
-  [The referrer URL is omitted when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is cross-origin.]
-    expected:
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/same-origin/attr-referrer/same-origin/http-http/img-tag/same-origin-insecure.keep-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,10 +0,0 @@
-[same-origin-insecure.keep-origin-redirect.http.html]
-  type: testharness
-  expected:
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
-  [The referrer URL is stripped-referrer when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is same-origin.]
-    expected:
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/same-origin/attr-referrer/same-origin/http-http/img-tag/same-origin-insecure.no-redirect.http.html.ini
+++ /dev/null
@@ -1,10 +0,0 @@
-[same-origin-insecure.no-redirect.http.html]
-  type: testharness
-  expected:
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
-  [The referrer URL is stripped-referrer when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with no-redirect and when\n                                 the target request is same-origin.]
-    expected:
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/same-origin/attr-referrer/same-origin/http-http/img-tag/same-origin-insecure.swap-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,10 +0,0 @@
-[same-origin-insecure.swap-origin-redirect.http.html]
-  type: testharness
-  expected:
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
-  [The referrer URL is omitted when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is same-origin.]
-    expected:
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/same-origin/attr-referrer/same-origin/http-https/img-tag/same-origin-insecure.swap-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,10 +0,0 @@
-[same-origin-insecure.swap-origin-redirect.http.html]
-  type: testharness
-  expected:
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
-  [The referrer URL is omitted when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is same-origin.]
-    expected:
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/same-origin/http-rp/cross-origin/http-http/img-tag/cross-origin.keep-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,10 +0,0 @@
-[cross-origin.keep-origin-redirect.http.html]
-  type: testharness
-  expected:
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
-  [The referrer URL is omitted when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is cross-origin.]
-    expected:
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/same-origin/http-rp/cross-origin/http-http/img-tag/cross-origin.no-redirect.http.html.ini
+++ /dev/null
@@ -1,10 +0,0 @@
-[cross-origin.no-redirect.http.html]
-  type: testharness
-  expected:
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
-  [The referrer URL is omitted when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with no-redirect and when\n                                 the target request is cross-origin.]
-    expected:
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/same-origin/http-rp/cross-origin/http-http/img-tag/cross-origin.swap-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,10 +0,0 @@
-[cross-origin.swap-origin-redirect.http.html]
-  type: testharness
-  expected:
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
-  [The referrer URL is omitted when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is cross-origin.]
-    expected:
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/same-origin/http-rp/cross-origin/http-https/img-tag/cross-origin.keep-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,10 +0,0 @@
-[cross-origin.keep-origin-redirect.http.html]
-  type: testharness
-  expected:
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
-  [The referrer URL is omitted when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is cross-origin.]
-    expected:
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/same-origin/http-rp/cross-origin/http-https/img-tag/cross-origin.no-redirect.http.html.ini
+++ /dev/null
@@ -1,10 +0,0 @@
-[cross-origin.no-redirect.http.html]
-  type: testharness
-  expected:
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
-  [The referrer URL is omitted when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with no-redirect and when\n                                 the target request is cross-origin.]
-    expected:
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/same-origin/http-rp/cross-origin/http-https/img-tag/cross-origin.swap-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,10 +0,0 @@
-[cross-origin.swap-origin-redirect.http.html]
-  type: testharness
-  expected:
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
-  [The referrer URL is omitted when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is cross-origin.]
-    expected:
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/same-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.keep-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,10 +0,0 @@
-[same-origin-insecure.keep-origin-redirect.http.html]
-  type: testharness
-  expected:
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
-  [The referrer URL is stripped-referrer when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is same-origin.]
-    expected:
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/same-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.no-redirect.http.html.ini
+++ /dev/null
@@ -1,10 +0,0 @@
-[same-origin-insecure.no-redirect.http.html]
-  type: testharness
-  expected:
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
-  [The referrer URL is stripped-referrer when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with no-redirect and when\n                                 the target request is same-origin.]
-    expected:
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/same-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.swap-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,10 +0,0 @@
-[same-origin-insecure.swap-origin-redirect.http.html]
-  type: testharness
-  expected:
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
-  [The referrer URL is omitted when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is same-origin.]
-    expected:
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/same-origin/http-rp/same-origin/http-https/img-tag/same-origin-insecure.swap-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,10 +0,0 @@
-[same-origin-insecure.swap-origin-redirect.http.html]
-  type: testharness
-  expected:
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
-  [The referrer URL is omitted when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is same-origin.]
-    expected:
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/same-origin/meta-referrer/cross-origin/http-http/img-tag/cross-origin.keep-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,10 +0,0 @@
-[cross-origin.keep-origin-redirect.http.html]
-  type: testharness
-  expected:
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
-  [The referrer URL is omitted when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the meta-referrer\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is cross-origin.]
-    expected:
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/same-origin/meta-referrer/cross-origin/http-http/img-tag/cross-origin.no-redirect.http.html.ini
+++ /dev/null
@@ -1,10 +0,0 @@
-[cross-origin.no-redirect.http.html]
-  type: testharness
-  expected:
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
-  [The referrer URL is omitted when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the meta-referrer\n                                 delivery method with no-redirect and when\n                                 the target request is cross-origin.]
-    expected:
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/same-origin/meta-referrer/cross-origin/http-http/img-tag/cross-origin.swap-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,10 +0,0 @@
-[cross-origin.swap-origin-redirect.http.html]
-  type: testharness
-  expected:
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
-  [The referrer URL is omitted when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the meta-referrer\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is cross-origin.]
-    expected:
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/same-origin/meta-referrer/cross-origin/http-https/img-tag/cross-origin.keep-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,10 +0,0 @@
-[cross-origin.keep-origin-redirect.http.html]
-  type: testharness
-  expected:
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
-  [The referrer URL is omitted when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the meta-referrer\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is cross-origin.]
-    expected:
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/same-origin/meta-referrer/cross-origin/http-https/img-tag/cross-origin.no-redirect.http.html.ini
+++ /dev/null
@@ -1,10 +0,0 @@
-[cross-origin.no-redirect.http.html]
-  type: testharness
-  expected:
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
-  [The referrer URL is omitted when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the meta-referrer\n                                 delivery method with no-redirect and when\n                                 the target request is cross-origin.]
-    expected:
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/same-origin/meta-referrer/cross-origin/http-https/img-tag/cross-origin.swap-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,10 +0,0 @@
-[cross-origin.swap-origin-redirect.http.html]
-  type: testharness
-  expected:
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
-  [The referrer URL is omitted when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the meta-referrer\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is cross-origin.]
-    expected:
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/same-origin/meta-referrer/same-origin/http-http/img-tag/same-origin-insecure.keep-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,10 +0,0 @@
-[same-origin-insecure.keep-origin-redirect.http.html]
-  type: testharness
-  expected:
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
-  [The referrer URL is stripped-referrer when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the meta-referrer\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is same-origin.]
-    expected:
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/same-origin/meta-referrer/same-origin/http-http/img-tag/same-origin-insecure.no-redirect.http.html.ini
+++ /dev/null
@@ -1,10 +0,0 @@
-[same-origin-insecure.no-redirect.http.html]
-  type: testharness
-  expected:
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
-  [The referrer URL is stripped-referrer when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the meta-referrer\n                                 delivery method with no-redirect and when\n                                 the target request is same-origin.]
-    expected:
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/same-origin/meta-referrer/same-origin/http-http/img-tag/same-origin-insecure.swap-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,10 +0,0 @@
-[same-origin-insecure.swap-origin-redirect.http.html]
-  type: testharness
-  expected:
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
-  [The referrer URL is omitted when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the meta-referrer\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is same-origin.]
-    expected:
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/same-origin/meta-referrer/same-origin/http-https/img-tag/same-origin-insecure.swap-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,10 +0,0 @@
-[same-origin-insecure.swap-origin-redirect.http.html]
-  type: testharness
-  expected:
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
-  [The referrer URL is omitted when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the meta-referrer\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is same-origin.]
-    expected:
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-http/img-tag/cross-insecure.keep-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[cross-insecure.keep-origin-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is cross-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-http/img-tag/cross-insecure.no-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[cross-insecure.no-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with no-redirect and when\n                                 the target request is cross-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-http/img-tag/cross-insecure.swap-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[cross-insecure.swap-origin-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is cross-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[upgrade-protocol.keep-origin-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is cross-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[upgrade-protocol.no-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with no-redirect and when\n                                 the target request is cross-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[upgrade-protocol.swap-origin-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is cross-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-http/img-tag/same-insecure.keep-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[same-insecure.keep-origin-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is stripped-referrer when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is same-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-http/img-tag/same-insecure.no-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[same-insecure.no-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is stripped-referrer when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with no-redirect and when\n                                 the target request is same-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-http/img-tag/same-insecure.swap-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[same-insecure.swap-origin-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is same-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[upgrade-protocol.keep-origin-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is same-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[upgrade-protocol.no-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with no-redirect and when\n                                 the target request is same-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[upgrade-protocol.swap-origin-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is same-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-http/img-tag/cross-insecure.keep-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[cross-insecure.keep-origin-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is cross-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-http/img-tag/cross-insecure.no-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[cross-insecure.no-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with no-redirect and when\n                                 the target request is cross-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-http/img-tag/cross-insecure.swap-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[cross-insecure.swap-origin-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is cross-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[upgrade-protocol.keep-origin-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is cross-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[upgrade-protocol.no-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with no-redirect and when\n                                 the target request is cross-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[upgrade-protocol.swap-origin-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is cross-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-insecure.keep-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[same-insecure.keep-origin-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is stripped-referrer when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is same-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-insecure.no-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[same-insecure.no-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is stripped-referrer when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with no-redirect and when\n                                 the target request is same-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-insecure.swap-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[same-insecure.swap-origin-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is same-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[upgrade-protocol.keep-origin-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is same-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[upgrade-protocol.no-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with no-redirect and when\n                                 the target request is same-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[upgrade-protocol.swap-origin-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is same-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-http/img-tag/cross-insecure.keep-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[cross-insecure.keep-origin-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the meta-referrer\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is cross-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-http/img-tag/cross-insecure.no-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[cross-insecure.no-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the meta-referrer\n                                 delivery method with no-redirect and when\n                                 the target request is cross-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-http/img-tag/cross-insecure.swap-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[cross-insecure.swap-origin-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the meta-referrer\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is cross-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[upgrade-protocol.keep-origin-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the meta-referrer\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is cross-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[upgrade-protocol.no-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the meta-referrer\n                                 delivery method with no-redirect and when\n                                 the target request is cross-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[upgrade-protocol.swap-origin-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the meta-referrer\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is cross-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-http/img-tag/same-insecure.keep-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[same-insecure.keep-origin-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is stripped-referrer when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the meta-referrer\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is same-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-http/img-tag/same-insecure.no-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[same-insecure.no-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is stripped-referrer when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the meta-referrer\n                                 delivery method with no-redirect and when\n                                 the target request is same-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-http/img-tag/same-insecure.swap-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[same-insecure.swap-origin-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the meta-referrer\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is same-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[upgrade-protocol.keep-origin-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the meta-referrer\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is same-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[upgrade-protocol.no-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the meta-referrer\n                                 delivery method with no-redirect and when\n                                 the target request is same-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[upgrade-protocol.swap-origin-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the meta-referrer\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is same-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin/attr-referrer/cross-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[insecure-protocol.keep-origin-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is cross-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin/attr-referrer/cross-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[insecure-protocol.no-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with no-redirect and when\n                                 the target request is cross-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin/attr-referrer/cross-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[insecure-protocol.swap-origin-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is cross-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[upgrade-protocol.keep-origin-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is cross-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[upgrade-protocol.no-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with no-redirect and when\n                                 the target request is cross-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[upgrade-protocol.swap-origin-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is cross-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[insecure-protocol.keep-origin-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is same-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[insecure-protocol.no-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with no-redirect and when\n                                 the target request is same-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[insecure-protocol.swap-origin-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is same-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[upgrade-protocol.keep-origin-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is same-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[upgrade-protocol.no-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with no-redirect and when\n                                 the target request is same-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin/attr-referrer/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[upgrade-protocol.swap-origin-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is same-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin/http-rp/cross-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[insecure-protocol.keep-origin-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is cross-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin/http-rp/cross-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[insecure-protocol.no-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with no-redirect and when\n                                 the target request is cross-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin/http-rp/cross-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[insecure-protocol.swap-origin-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is cross-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[upgrade-protocol.keep-origin-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is cross-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[upgrade-protocol.no-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with no-redirect and when\n                                 the target request is cross-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin/http-rp/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[upgrade-protocol.swap-origin-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is cross-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin/http-rp/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[insecure-protocol.keep-origin-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is same-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin/http-rp/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[insecure-protocol.no-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with no-redirect and when\n                                 the target request is same-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin/http-rp/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[insecure-protocol.swap-origin-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is same-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin/http-rp/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[upgrade-protocol.keep-origin-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is same-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin/http-rp/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[upgrade-protocol.no-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with no-redirect and when\n                                 the target request is same-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin/http-rp/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[upgrade-protocol.swap-origin-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the http-rp\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is same-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin/meta-referrer/cross-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[insecure-protocol.keep-origin-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the meta-referrer\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is cross-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin/meta-referrer/cross-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[insecure-protocol.no-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the meta-referrer\n                                 delivery method with no-redirect and when\n                                 the target request is cross-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin/meta-referrer/cross-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[insecure-protocol.swap-origin-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the meta-referrer\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is cross-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[upgrade-protocol.keep-origin-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the meta-referrer\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is cross-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[upgrade-protocol.no-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the meta-referrer\n                                 delivery method with no-redirect and when\n                                 the target request is cross-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin/meta-referrer/cross-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[upgrade-protocol.swap-origin-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the meta-referrer\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is cross-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin/meta-referrer/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[insecure-protocol.keep-origin-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the meta-referrer\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is same-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin/meta-referrer/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[insecure-protocol.no-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the meta-referrer\n                                 delivery method with no-redirect and when\n                                 the target request is same-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin/meta-referrer/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[insecure-protocol.swap-origin-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the meta-referrer\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is same-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[upgrade-protocol.keep-origin-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the meta-referrer\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is same-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.no-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[upgrade-protocol.no-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the meta-referrer\n                                 delivery method with no-redirect and when\n                                 the target request is same-origin.]
-    expected: NOTRUN
-
deleted file mode 100644
--- a/testing/web-platform/meta/referrer-policy/strict-origin/meta-referrer/same-origin/http-https/img-tag/upgrade-protocol.swap-origin-redirect.http.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[upgrade-protocol.swap-origin-redirect.http.html]
-  type: testharness
-  expected: TIMEOUT
-  [The referrer URL is origin when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the meta-referrer\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is same-origin.]
-    expected: NOTRUN
-
--- a/testing/web-platform/meta/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-http/img-tag/generic.keep-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-http/img-tag/generic.keep-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.keep-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is stripped-referrer when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-http/img-tag/generic.no-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-http/img-tag/generic.no-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.no-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is stripped-referrer when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with no-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-http/img-tag/generic.swap-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-http/img-tag/generic.swap-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.swap-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is stripped-referrer when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-https/img-tag/generic.keep-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-https/img-tag/generic.keep-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.keep-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is stripped-referrer when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-https/img-tag/generic.no-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-https/img-tag/generic.no-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.no-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is stripped-referrer when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with no-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-https/img-tag/generic.swap-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/unsafe-url/attr-referrer/cross-origin/http-https/img-tag/generic.swap-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.swap-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is stripped-referrer when a\n                                 document served over http requires an https\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is cross-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/unsafe-url/attr-referrer/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/unsafe-url/attr-referrer/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.keep-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is stripped-referrer when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with keep-origin-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/unsafe-url/attr-referrer/same-origin/http-http/img-tag/generic.no-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/unsafe-url/attr-referrer/same-origin/http-http/img-tag/generic.no-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.no-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is stripped-referrer when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with no-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/unsafe-url/attr-referrer/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/unsafe-url/attr-referrer/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html.ini
@@ -1,12 +1,8 @@
 [generic.swap-origin-redirect.http.html]
   type: testharness
   expected:
     if (os == "linux") and (version == "Ubuntu 16.04"): OK
-    if (os == "linux") and (version == "Ubuntu 12.04"): TIMEOUT
-    if not (os == "linux"): TIMEOUT
   [The referrer URL is stripped-referrer when a\n                                 document served over http requires an http\n                                 sub-resource via img-tag using the attr-referrer\n                                 delivery method with swap-origin-redirect and when\n                                 the target request is same-origin.]
     expected:
       if (os == "linux") and (version == "Ubuntu 16.04"): PASS
-      if (os == "linux") and (version == "Ubuntu 12.04"): NOTRUN
-      if not (os == "linux"): NOTRUN
 
--- a/testing/web-platform/meta/referrer-policy/unsafe-url/attr-referrer/same-origin/http-https/img-tag/generic.keep-origin-redirect.http.html.ini
+++ b/testing/web-platform/meta/referrer-policy/unsafe-url/attr-referrer/same-origin/http-https/img-tag/generic.keep-origin-redirect.http.html.ini