Merge m-c to graphics
authorKartikaya Gupta <kgupta@mozilla.com>
Wed, 01 Feb 2017 08:48:31 -0500
changeset 391167 28385c886b9ecb4a5e5e35e29ee9c802f1fe3be5
parent 391166 f92dff83167618d1c5e19c7fd001d3843df5446b (current diff)
parent 380937 9e7b1041929fccc06f6fad91cf66b9edcdfc0129 (diff)
child 391168 dbd823361c412fd6c22beb763f0331b0fed4fc47
push id1468
push userasasaki@mozilla.com
push dateMon, 05 Jun 2017 19:31:07 +0000
treeherdermozilla-release@0641fc6ee9d1 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
milestone54.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge m-c to graphics MozReview-Commit-ID: 3tWI3srj2uj
browser/components/extensions/test/browser/browser-common.ini
dom/canvas/crashtests/crashtests.list
dom/ipc/TabChild.cpp
dom/ipc/TabChild.h
dom/media/gmp/rlz/COPYING
dom/media/gmp/rlz/GMPDeviceBinding.cpp
dom/media/gmp/rlz/GMPDeviceBinding.h
dom/media/gmp/rlz/README.mozilla
dom/media/gmp/rlz/lib/assert.h
dom/media/gmp/rlz/lib/machine_id.h
dom/media/gmp/rlz/lib/string_utils.cc
dom/media/gmp/rlz/lib/string_utils.h
dom/media/gmp/rlz/mac/lib/machine_id_mac.cc
dom/media/gmp/rlz/moz.build
dom/media/gmp/rlz/sha256.c
dom/media/gmp/rlz/sha256.h
dom/media/gmp/rlz/win/lib/machine_id_win.cc
dom/tests/browser/browser_largeAllocation.js
gfx/2d/2D.h
gfx/graphite2/ChangeLog
gfx/graphite2/include/graphite2/XmlLog.h
gfx/graphite2/src/Bidi.cpp
gfx/graphite2/src/GlyphFaceCache.cpp
gfx/graphite2/src/MozGrMalloc.h
gfx/graphite2/src/Rule.cpp
gfx/graphite2/src/XmlTraceLog.cpp
gfx/graphite2/src/XmlTraceLogTags.cpp
gfx/graphite2/src/inc/Bidi.h
gfx/graphite2/src/inc/GlyphFaceCache.h
gfx/graphite2/src/inc/Shrinker.h
gfx/graphite2/src/moz.build
gfx/layers/apz/src/GestureEventListener.cpp
gfx/layers/moz.build
layout/base/nsLayoutUtils.cpp
layout/reftests/border-radius/reftest.list
layout/reftests/bugs/reftest.list
layout/reftests/canvas/reftest.list
layout/reftests/css-blending/reftest.list
layout/reftests/css-gradients/reftest.list
layout/reftests/printing/reftest.list
layout/reftests/svg/reftest.list
layout/tools/reftest/reftest.jsm
media/webrtc/signaling/gtest/jsep_session_unittest.cpp
media/webrtc/signaling/gtest/jsep_track_unittest.cpp
mfbt/double-conversion/LICENSE
mfbt/double-conversion/README
mfbt/double-conversion/bignum-dtoa.cc
mfbt/double-conversion/bignum-dtoa.h
mfbt/double-conversion/bignum.cc
mfbt/double-conversion/bignum.h
mfbt/double-conversion/cached-powers.cc
mfbt/double-conversion/cached-powers.h
mfbt/double-conversion/diy-fp.cc
mfbt/double-conversion/diy-fp.h
mfbt/double-conversion/double-conversion.cc
mfbt/double-conversion/double-conversion.h
mfbt/double-conversion/fast-dtoa.cc
mfbt/double-conversion/fast-dtoa.h
mfbt/double-conversion/fixed-dtoa.cc
mfbt/double-conversion/fixed-dtoa.h
mfbt/double-conversion/ieee.h
mfbt/double-conversion/strtod.cc
mfbt/double-conversion/strtod.h
mfbt/double-conversion/use-static_assert.patch
mfbt/double-conversion/utils.h
modules/libpref/init/all.js
taskcluster/ci/build/linux.yml
taskcluster/taskgraph/transforms/gecko_v2_whitelist.py
testing/marionette/harness/marionette_harness/tests/unit/test_window_management.py
testing/marionette/harness/marionette_harness/tests/unit/test_window_switching.py
testing/web-platform/meta/workers/postMessage_event_properties.htm.ini
widget/cocoa/nsChildView.mm
widget/nsBaseWidget.cpp
widget/windows/nsWindow.cpp
--- a/.clang-format-ignore
+++ b/.clang-format-ignore
@@ -46,17 +46,17 @@
 ^media/libyuv/.*
 ^media/mtransport/.*
 ^media/openmax_dl/.*
 ^media/pocketsphinx/.*
 ^media/sphinxbase/.*
 ^media/webrtc/trunk/.*
 ^memory/jemalloc/src/.*
 ^mfbt/decimal/.*
-^mfbt/double-conversion/.*
+^mfbt/double-conversion/source/.*
 ^mfbt/lz4.*
 ^mobile/android/thirdparty/.*
 ^modules/brotli/.*
 ^modules/freetype2/.*
 ^modules/libbz2/.*
 ^modules/libmar/.*
 ^modules/zlib/.*
 ^netwerk/sctp/src/.*
--- a/accessible/windows/msaa/AccessibleWrap.cpp
+++ b/accessible/windows/msaa/AccessibleWrap.cpp
@@ -1250,25 +1250,35 @@ AccessibleWrap::GetChildIDFor(Accessible
 
 HWND
 AccessibleWrap::GetHWNDFor(Accessible* aAccessible)
 {
   if (!aAccessible) {
     return nullptr;
   }
 
-  // Accessibles in child processes are said to have the HWND of the window
-  // their tab is within.  Popups are always in the parent process, and so
-  // never proxied, which means this is basically correct.
   if (aAccessible->IsProxy()) {
     ProxyAccessible* proxy = aAccessible->Proxy();
     if (!proxy) {
       return nullptr;
     }
 
+    // If window emulation is enabled, retrieve the emulated window from the
+    // containing document document proxy.
+    if (nsWinUtils::IsWindowEmulationStarted()) {
+      DocAccessibleParent* doc = proxy->Document();
+      HWND hWnd = doc->GetEmulatedWindowHandle();
+      if (hWnd) {
+        return hWnd;
+      }
+    }
+
+    // Accessibles in child processes are said to have the HWND of the window
+    // their tab is within.  Popups are always in the parent process, and so
+    // never proxied, which means this is basically correct.
     Accessible* outerDoc = proxy->OuterDocOfRemoteBrowser();
     NS_ASSERTION(outerDoc, "no outer doc for accessible remote tab!");
     if (!outerDoc) {
       return nullptr;
     }
 
     return GetHWNDFor(outerDoc);
   }
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -453,23 +453,33 @@ function findChildShell(aDocument, aDocS
   }
   return null;
 }
 
 var gPopupBlockerObserver = {
   _reportButton: null,
 
   onReportButtonMousedown(aEvent) {
-    // If this method is called on the same event tick as the popup gets
-    // hidden, do nothing to avoid re-opening the popup.
+    // The button is part of the textbox that is considered the popup's anchor,
+    // thus consumeoutsideclicks="false" is ignored. Moreover On OS X the popup
+    // is hidden well before mousedown gets dispatched.
+    // Thus, if the popup is open and the user clicks on the button, it gets
+    // hidden before mousedown, and may then be unexpectedly reopened by click.
+    // To avoid this, we check if mousedown is in the same tick as popupHidden,
+    // and, in such a case, we don't handle the click event.
+    // Note we can't just openPopup in mousedown, cause this popup is shared by
+    // multiple anchors, and we could end up opening it just before the other
+    // anchor tries to hide it.
     if (aEvent.button != 0 || aEvent.target != this._reportButton || this.isPopupHidingTick)
       return;
 
-    document.getElementById("blockedPopupOptions")
-            .openPopup(this._reportButton, "after_end", 0, 2, false, false, aEvent);
+    this._reportButton.addEventListener("click", event => {
+      document.getElementById("blockedPopupOptions")
+              .openPopup(event.target, "after_end", 0, 2, false, false, event);
+    }, { once: true });
   },
 
   handleEvent(aEvent) {
     if (aEvent.originalTarget != gBrowser.selectedBrowser)
       return;
 
     if (!this._reportButton)
       this._reportButton = document.getElementById("page-report-button");
@@ -644,21 +654,22 @@ var gPopupBlockerObserver = {
       // Show the separator if we added any
       // showable popup addresses to the menu.
       if (foundUsablePopupURI)
         blockedPopupsSeparator.removeAttribute("hidden");
     }, null);
   },
 
   onPopupHiding(aEvent) {
-    if (aEvent.target.anchorNode.id == "page-report-button")
+    if (aEvent.target.anchorNode.id == "page-report-button") {
       aEvent.target.anchorNode.removeAttribute("open");
 
-    this.isPopupHidingTick = true;
-    setTimeout(() => this.isPopupHidingTick = false, 0);
+      this.isPopupHidingTick = true;
+      setTimeout(() => this.isPopupHidingTick = false, 0);
+    }
 
     let item = aEvent.target.lastChild;
     while (item && item.getAttribute("observes") != "blockedPopupsSeparator") {
       let next = item.previousSibling;
       item.remove();
       item = next;
     }
   },
--- a/browser/base/content/tab-content.js
+++ b/browser/base/content/tab-content.js
@@ -713,18 +713,18 @@ var WebBrowserChrome = {
     return true;
   },
 
   shouldLoadURIInThisProcess(aURI) {
     return E10SUtils.shouldLoadURIInThisProcess(aURI);
   },
 
   // Try to reload the currently active or currently loading page in a new process.
-  reloadInFreshProcess(aDocShell, aURI, aReferrer, aTriggeringPrincipal) {
-    E10SUtils.redirectLoad(aDocShell, aURI, aReferrer, aTriggeringPrincipal, true);
+  reloadInFreshProcess(aDocShell, aURI, aReferrer, aTriggeringPrincipal, aLoadFlags) {
+    E10SUtils.redirectLoad(aDocShell, aURI, aReferrer, aTriggeringPrincipal, true, aLoadFlags);
     return true;
   },
 
   startPrerenderingDocument(aHref, aReferrer) {
     if (PrerenderContentHandler.initialized) {
       PrerenderContentHandler.startPrerenderingDocument(aHref, aReferrer);
     }
   },
--- a/browser/base/content/test/general/browser.ini
+++ b/browser/base/content/test/general/browser.ini
@@ -321,16 +321,17 @@ support-files = fxa_profile_handler.sjs
 [browser_fxa_web_channel.js]
 [browser_gestureSupport.js]
 skip-if = e10s # Bug 863514 - no gesture support.
 [browser_getshortcutoruri.js]
 [browser_hide_removing.js]
 [browser_homeDrop.js]
 [browser_identity_UI.js]
 [browser_insecureLoginForms.js]
+support-files = insecure_opener.html
 [browser_invalid_uri_back_forward_manipulation.js]
 [browser_keywordBookmarklets.js]
 [browser_keywordSearch.js]
 [browser_keywordSearch_postData.js]
 [browser_lastAccessedTab.js]
 skip-if = toolkit == "windows" # Disabled on Windows due to frequent failures (bug 969405)
 [browser_menuButtonFitts.js]
 skip-if = os != "win" # The Fitts Law menu button is only supported on Windows (bug 969376)
--- a/browser/base/content/test/general/browser_insecureLoginForms.js
+++ b/browser/base/content/test/general/browser_insecureLoginForms.js
@@ -98,8 +98,65 @@ add_task(function* test_mixedcontent() {
   ]);
 
   assertMixedContentBlockingState(browser, { activeLoaded: true,
                                              activeBlocked: false,
                                              passiveLoaded: false });
 
   gBrowser.removeTab(tab);
 });
+
+/**
+ * Checks that insecure window.opener does not trigger a warning.
+ */
+add_task(function* test_ignoring_window_opener() {
+  let newTabURL = "https://example.com" + TEST_URL_PATH + "form_basic.html";
+  let path = getRootDirectory(gTestPath)
+    .replace("chrome://mochitests/content", "http://example.com");
+  let url = path + "insecure_opener.html";
+
+  yield BrowserTestUtils.withNewTab(url, function*(browser) {
+    // Clicking the link will spawn a new tab.
+    let loaded = BrowserTestUtils.waitForNewTab(gBrowser, newTabURL);
+    yield ContentTask.spawn(browser, {}, function() {
+      content.document.getElementById("link").click();
+    });
+    let tab = yield loaded;
+    browser = tab.linkedBrowser;
+    yield waitForInsecureLoginFormsStateChange(browser, 2);
+
+    // Open the identity popup.
+    let { gIdentityHandler } = gBrowser.ownerGlobal;
+    gIdentityHandler._identityBox.click();
+    document.getElementById("identity-popup-security-expander").click();
+
+    ok(is_visible(document.getElementById("connection-icon")),
+       "Connection icon is visible");
+
+    // Assert that the identity indicators are still "secure".
+    let connectionIconImage = gBrowser.ownerGlobal
+          .getComputedStyle(document.getElementById("connection-icon"))
+          .getPropertyValue("list-style-image");
+    let securityViewBG = gBrowser.ownerGlobal
+          .getComputedStyle(document.getElementById("identity-popup-securityView"))
+          .getPropertyValue("background-image");
+    let securityContentBG = gBrowser.ownerGlobal
+          .getComputedStyle(document.getElementById("identity-popup-security-content"))
+          .getPropertyValue("background-image");
+    is(connectionIconImage,
+       "url(\"chrome://browser/skin/connection-secure.svg\")",
+       "Using expected icon image in the identity block");
+    is(securityViewBG,
+       "url(\"chrome://browser/skin/controlcenter/connection.svg#connection-secure\")",
+       "Using expected icon image in the Control Center main view");
+    is(securityContentBG,
+       "url(\"chrome://browser/skin/controlcenter/connection.svg#connection-secure\")",
+       "Using expected icon image in the Control Center subview");
+
+    ok(Array.every(document.querySelectorAll("[when-loginforms=insecure]"),
+                   element => is_hidden(element)),
+       "All messages should be hidden.");
+
+    gIdentityHandler._identityPopup.hidden = true;
+
+    yield BrowserTestUtils.removeTab(tab);
+  });
+});
--- a/browser/base/content/test/general/browser_selectpopup.js
+++ b/browser/base/content/test/general/browser_selectpopup.js
@@ -75,16 +75,24 @@ const PAGECONTENT_SOMEHIDDEN =
 const PAGECONTENT_TRANSLATED =
   "<html><body>" +
   "<div id='div'>" +
   "<iframe id='frame' width='320' height='295' style='border: none;'" +
   "        src='data:text/html,<select id=select autofocus><option>he he he</option><option>boo boo</option><option>baz baz</option></select>'" +
   "</iframe>" +
   "</div></body></html>";
 
+const PAGECONTENT_COLORS =
+  "<html><head><style>.blue { color: #fff; background-color: #00f; } .green { color: #800080; background-color: green; }</style>" +
+  "<body><select id='one'>" +
+  '  <option value="One" style="color: #fff; background-color: #f00;">{"color": "rgb(255, 255, 255)", "backgroundColor": "rgb(255, 0, 0)"}</option>' +
+  '  <option value="Two" class="blue">{"color": "rgb(255, 255, 255)", "backgroundColor": "rgb(0, 0, 255)"}</option>' +
+  '  <option value="Three" class="green">{"color": "rgb(128, 0, 128)", "backgroundColor": "rgb(0, 128, 0)"}</option>' +
+  "</select></body></html>";
+
 function openSelectPopup(selectPopup, mode = "key", selector = "select", win = window) {
   let popupShownPromise = BrowserTestUtils.waitForEvent(selectPopup, "popupshown");
 
   if (mode == "click" || mode == "mousedown") {
     let mousePromise;
     if (mode == "click") {
       mousePromise = BrowserTestUtils.synthesizeMouseAtCenter(selector, { }, win.gBrowser.selectedBrowser);
     } else {
@@ -724,8 +732,87 @@ add_task(function* test_somehidden() {
        "Item " + (idx++) + " is visible");
     child = child.nextSibling;
   }
 
   yield hideSelectPopup(selectPopup, "escape");
   yield BrowserTestUtils.removeTab(tab);
 });
 
+add_task(function* test_colors_applied_to_popup() {
+  function inverseRGBString(rgbString) {
+    let [, r, g, b] = rgbString.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
+    return `rgb(${255 - r}, ${255 - g}, ${255 - b})`;
+  }
+
+  const pageUrl = "data:text/html," + escape(PAGECONTENT_COLORS);
+  let tab = yield BrowserTestUtils.openNewForegroundTab(gBrowser, pageUrl);
+
+  let selectPopup = document.getElementById("ContentSelectDropdown").menupopup;
+
+  let popupShownPromise = BrowserTestUtils.waitForEvent(selectPopup, "popupshown");
+  yield BrowserTestUtils.synthesizeMouseAtCenter("#one", { type: "mousedown" }, gBrowser.selectedBrowser);
+  yield popupShownPromise;
+
+  // The label contains a JSON string of the expected colors for
+  // `color` and `background-color`.
+  is(selectPopup.parentNode.itemCount, 3, "Correct number of items");
+  let child = selectPopup.firstChild;
+  let idx = 1;
+
+  ok(child.selected, "The first child should be selected");
+  while (child) {
+    let expectedColors = JSON.parse(child.label);
+
+    // We need to use Canvas here to get the actual pixel color
+    // because the computedStyle will only tell us the 'color' or
+    // 'backgroundColor' of the element, but not what the displayed
+    // color is due to composition of various CSS rules such as
+    // 'filter' which is applied when elements have custom background
+    // or foreground elements.
+    let canvas = document.createElementNS("http://www.w3.org/1999/xhtml", "canvas");
+    canvas = document.documentElement.appendChild(canvas);
+    let rect = child.getBoundingClientRect();
+    canvas.setAttribute("width", rect.width);
+    canvas.setAttribute("height", rect.height);
+    canvas.mozOpaque = true;
+
+    let ctx = canvas.getContext("2d");
+    ctx.drawWindow(window, rect.x + rect.left, rect.y + rect.top, rect.width, rect.height, "#000", ctx.DRAWWINDOW_USE_WIDGET_LAYERS);
+    let frame = ctx.getImageData(0, 0, rect.width, rect.height);
+
+    let pixels = frame.data.length / 4;
+    // Assume the inverse backgroundColor is the color of the first pixel.
+    let [inverseBgR, inverseBgG, inverseBgB] = frame.data;
+    let inverseBackgroundColor = `rgb(${inverseBgR}, ${inverseBgG}, ${inverseBgB})`;
+    // Use the next different pixel color as the foreground color, assuming
+    // no anti-aliasing.
+    let inverseColor = inverseBackgroundColor;
+    for (let i = 0; i < pixels; i++) {
+      if (inverseBgR != frame.data[i * 4 + 0] &&
+          inverseBgG != frame.data[i * 4 + 1] &&
+          inverseBgB != frame.data[i * 4 + 2]) {
+        inverseColor = `rgb(${frame.data[i * 4 + 0]}, ${frame.data[i * 4 + 1]}, ${frame.data[i * 4 + 2]})`;
+      }
+    }
+    // The canvas code above isn't getting the right colors for the pixels,
+    // it always returns rgb(255,255,255).
+    todo_is(inverseColor, inverseRGBString(getComputedStyle(child).color),
+      "Item " + (idx) + " has correct inverse foreground color when selected");
+    todo_is(inverseBackgroundColor, inverseRGBString(getComputedStyle(child).backgroundColor),
+      "Item " + (idx) + " has correct inverse background color when selected");
+
+    canvas.remove();
+
+    // Press Down to move the selected item to the next item in the
+    // list and check the colors of this item when it's not selected.
+    EventUtils.synthesizeKey("KEY_ArrowDown", { code: "ArrowDown" });
+
+    is(getComputedStyle(child).color, expectedColors.color,
+       "Item " + (idx) + " has correct foreground color");
+    is(getComputedStyle(child).backgroundColor, expectedColors.backgroundColor,
+       "Item " + (idx++) + " has correct background color");
+    child = child.nextSibling;
+  }
+
+  yield hideSelectPopup(selectPopup, "escape");
+  yield BrowserTestUtils.removeTab(tab);
+});
new file mode 100644
--- /dev/null
+++ b/browser/base/content/test/general/insecure_opener.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML>
+<html dir="ltr" xml:lang="en-US" lang="en-US">
+  <head>
+    <meta charset="utf8">
+  </head>
+  <body>
+    <a id="link" target="_blank" href="https://example.com/browser/toolkit/components/passwordmgr/test/browser/form_basic.html">Click me, I'm "secure".</a>
+  </body>
+</html>
--- a/browser/base/content/test/referrer/head.js
+++ b/browser/base/content/test/referrer/head.js
@@ -198,19 +198,20 @@ function doContextMenuCommand(aWindow, a
 function referrerTestCaseLoaded(aTestNumber, aParams) {
   let test = getReferrerTest(aTestNumber);
   let server = rounds == 0 ? REFERRER_POLICYSERVER_URL :
                              REFERRER_POLICYSERVER_URL_ATTRIBUTE;
   let url = test.fromScheme + server +
             "?scheme=" + escape(test.toScheme) +
             "&policy=" + escape(test.policy || "") +
             "&rel=" + escape(test.rel || "");
-  var browser = gTestWindow.gBrowser;
-  browser.selectedTab = browser.addTab(url, aParams);
-  return BrowserTestUtils.browserLoaded(browser.selectedBrowser);
+  let browser = gTestWindow.gBrowser;
+  return BrowserTestUtils.openNewForegroundTab(browser, () => {
+    browser.selectedTab = browser.addTab(url, aParams);
+  });
 }
 
 /**
  * Checks the result of the referrer test, and moves on to the next test.
  * @param aTestNumber The test number - 0, 1, 2, ...
  * @param aNewWindow The new window where the referrer target opened, or null.
  * @param aNewTab The new tab where the referrer target opened, or null.
  * @param aStartTestCase The callback to start the next test, aTestNumber + 1.
--- a/browser/base/content/test/urlbar/browser.ini
+++ b/browser/base/content/test/urlbar/browser.ini
@@ -24,17 +24,16 @@ support-files =
 [browser_bug1024133-switchtab-override-keynav.js]
 [browser_bug1025195_switchToTabHavingURI_aOpenParams.js]
 [browser_bug1070778.js]
 [browser_bug1225194-remotetab.js]
 [browser_bug304198.js]
 [browser_bug556061.js]
 subsuite = clipboard
 [browser_bug562649.js]
-skip-if = e10s # Bug 1315042
 [browser_bug623155.js]
 support-files =
   redirect_bug623155.sjs
 [browser_bug783614.js]
 [browser_canonizeURL.js]
 [browser_dragdropURL.js]
 [browser_locationBarCommand.js]
 [browser_locationBarExternalLoad.js]
--- a/browser/base/content/test/urlbar/browser_bug562649.js
+++ b/browser/base/content/test/urlbar/browser_bug562649.js
@@ -4,21 +4,21 @@ function test() {
                            null,
                            Ci.nsIBrowserDOMWindow.OPEN_NEWTAB,
                            Ci.nsIBrowserDOMWindow.OPEN_EXTERNAL);
 
   is(gBrowser.userTypedValue, URI, "userTypedValue matches test URI");
   is(gURLBar.value, URI, "location bar value matches test URI");
 
   gBrowser.selectedTab = gBrowser.addTab();
-  gBrowser.removeCurrentTab();
+  gBrowser.removeCurrentTab({ skipPermitUnload: true });
   is(gBrowser.userTypedValue, URI, "userTypedValue matches test URI after switching tabs");
   is(gURLBar.value, URI, "location bar value matches test URI after switching tabs");
 
   waitForExplicitFinish();
   BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser).then(() => {
     is(gBrowser.userTypedValue, null, "userTypedValue is null as the page has loaded");
     is(gURLBar.value, URI, "location bar value matches test URI as the page has loaded");
 
-    gBrowser.removeCurrentTab();
+    gBrowser.removeCurrentTab({ skipPermitUnload: true });
     finish();
   });
 }
--- a/browser/components/extensions/ext-contextMenus.js
+++ b/browser/components/extensions/ext-contextMenus.js
@@ -1,16 +1,17 @@
 /* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set sts=2 sw=2 et tw=80: */
 "use strict";
 
 Cu.import("resource://gre/modules/ExtensionUtils.jsm");
 Cu.import("resource://gre/modules/MatchPattern.jsm");
 Cu.import("resource://gre/modules/Services.jsm");
 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+Cu.import("resource://gre/modules/AppConstants.jsm");
 
 var {
   ExtensionError,
   IconDetails,
   SingletonEventManager,
 } = ExtensionUtils;
 
 const ACTION_MENU_TOP_LEVEL_LIMIT = 6;
@@ -227,16 +228,23 @@ var gMenuBuilder = {
         // Select the clicked radio item.
         item.checked = true;
       }
 
       item.tabManager.addActiveTabPermission();
 
       let tab = item.tabManager.convert(contextData.tab);
       let info = item.getClickInfo(contextData, wasChecked);
+
+      const map = {shiftKey: "Shift", altKey: "Alt", metaKey: "Command", ctrlKey: "Ctrl"};
+      info.modifiers = Object.keys(map).filter(key => event[key]).map(key => map[key]);
+      if (event.ctrlKey && AppConstants.platform === "macosx") {
+        info.modifiers.push("MacCtrl");
+      }
+
       item.extension.emit("webext-contextmenu-menuitem-click", info, tab);
     });
 
     return element;
   },
 
   handleEvent(event) {
     if (this.xulMenu != event.target || event.type != "popuphidden") {
--- a/browser/components/extensions/ext-theme.js
+++ b/browser/components/extensions/ext-theme.js
@@ -1,69 +1,157 @@
-/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* vim: set sts=2 sw=2 et tw=80: */
 "use strict";
 
 Cu.import("resource://gre/modules/Services.jsm");
 
 XPCOMUtils.defineLazyModuleGetter(this, "Preferences",
                                   "resource://gre/modules/Preferences.jsm");
 
-let themeExtensions = new WeakSet();
+// WeakMap[Extension -> Theme]
+let themeMap = new WeakMap();
 
-/* eslint-disable mozilla/balanced-listeners */
-extensions.on("manifest_theme", (type, directive, extension, manifest) => {
-  let enabled = Preferences.get("extensions.webextensions.themes.enabled");
-
-  if (!enabled || !manifest || !manifest.theme) {
-    return;
+/** Class representing a theme. */
+class Theme {
+  /**
+   * Creates a theme instance.
+   *
+   * @param {string} baseURI The base URI of the extension, used to
+   *   resolve relative filepaths.
+   */
+  constructor(baseURI) {
+    // A dictionary of light weight theme styles.
+    this.lwtStyles = {};
+    this.baseURI = baseURI;
   }
-  // Apply theme only if themes are enabled.
-  let lwtStyles = {footerURL: ""};
-  if (manifest.theme.colors) {
-    let colors = manifest.theme.colors;
-    for (let color of Object.getOwnPropertyNames(colors)) {
+
+  /**
+   * Loads a theme by reading the properties from the extension's manifest.
+   * This method will override any currently applied theme.
+   *
+   * @param {Object} details Theme part of the manifest. Supported
+   *   properties can be found in the schema under ThemeType.
+   */
+  load(details) {
+    if (details.colors) {
+      this.loadColors(details.colors);
+    }
+
+    if (details.images) {
+      this.loadImages(details.images);
+    }
+
+    // Lightweight themes require all properties to be defined.
+    if (this.lwtStyles.headerURL &&
+        this.lwtStyles.accentcolor &&
+        this.lwtStyles.textcolor) {
+      Services.obs.notifyObservers(null,
+        "lightweight-theme-styling-update",
+        JSON.stringify(this.lwtStyles));
+    }
+  }
+
+  /**
+   * Helper method for loading colors found in the extension's manifest.
+   *
+   * @param {Object} colors Dictionary mapping color properties to values.
+   */
+  loadColors(colors) {
+    for (let color of Object.keys(colors)) {
+      Services.console.logStringMessage(`parsing color=${color}`);
       let val = colors[color];
-      // Since values are optional, they may be `null`.
-      if (val === null) {
+
+      if (!val) {
         continue;
       }
 
-      if (color == "accentcolor") {
-        lwtStyles.accentcolor = val;
-        continue;
+      let cssColor = val;
+      if (Array.isArray(val)) {
+        cssColor = "rgb" + (val.length > 3 ? "a" : "") + "(" + val.join(",") + ")";
       }
-      if (color == "textcolor") {
-        lwtStyles.textcolor = val;
+
+      switch (color) {
+        case "accentcolor":
+        case "frame":
+          this.lwtStyles.accentcolor = cssColor;
+          break;
+        case "textcolor":
+        case "tab_text":
+          this.lwtStyles.textcolor = cssColor;
+          break;
       }
     }
   }
 
-  if (manifest.theme.images) {
-    let images = manifest.theme.images;
-    for (let image of Object.getOwnPropertyNames(images)) {
+  /**
+   * Helper method for loading images found in the extension's manifest.
+   *
+   * @param {Object} images Dictionary mapping image properties to values.
+   */
+  loadImages(images) {
+    for (let image of Object.keys(images)) {
       let val = images[image];
-      if (val === null) {
+
+      if (!val) {
         continue;
       }
 
-      if (image == "headerURL") {
-        lwtStyles.headerURL = val;
+      switch (image) {
+        case "headerURL":
+        case "theme_frame": {
+          let resolvedURL = this.baseURI.resolve(val);
+          this.lwtStyles.headerURL = resolvedURL;
+          break;
+        }
       }
     }
   }
 
-  if (lwtStyles.headerURL &&
-      lwtStyles.accentcolor &&
-      lwtStyles.textcolor) {
-    themeExtensions.add(extension);
+  /**
+   * Unloads the currently applied theme.
+   */
+  unload() {
     Services.obs.notifyObservers(null,
       "lightweight-theme-styling-update",
-      JSON.stringify(lwtStyles));
+      null);
   }
+}
+
+/* eslint-disable mozilla/balanced-listeners */
+extensions.on("manifest_theme", (type, directive, extension, manifest) => {
+  if (!Preferences.get("extensions.webextensions.themes.enabled")) {
+    // Return early if themes are disabled.
+    return;
+  }
+
+  let theme = new Theme(extension.baseURI);
+  theme.load(manifest.theme);
+  themeMap.set(extension, theme);
 });
 
 extensions.on("shutdown", (type, extension) => {
-  if (themeExtensions.has(extension)) {
-    Services.obs.notifyObservers(null, "lightweight-theme-styling-update", null);
+  let theme = themeMap.get(extension);
+
+  // We won't have a theme if theme's aren't enabled.
+  if (!theme) {
+    return;
   }
+
+  theme.unload();
 });
 /* eslint-enable mozilla/balanced-listeners */
+
+extensions.registerSchemaAPI("theme", "addon_parent", context => {
+  let {extension} = context;
+  return {
+    theme: {
+      update(details) {
+        let theme = themeMap.get(extension);
+
+        // We won't have a theme if theme's aren't enabled.
+        if (!theme) {
+          return;
+        }
+
+        theme.load(details);
+      },
+    },
+  };
+});
--- a/browser/components/extensions/schemas/theme.json
+++ b/browser/components/extensions/schemas/theme.json
@@ -12,27 +12,45 @@
         "properties": {
           "images": {
             "type": "object",
             "optional": true,
             "properties": {
               "headerURL": {
                 "type": "string",
                 "optional": true
+              },
+              "theme_frame": {
+                "type": "string",
+                "optional": true
               }
             }
           },
           "colors": {
             "type": "object",
             "optional": true,
             "properties": {
               "accentcolor": {
                 "type": "string",
                 "optional": true
               },
+              "frame": {
+                "type": "array",
+                "items": {
+                  "type": "number"
+                },
+                "optional": true
+              },
+              "tab_text": {
+                "type": "array",
+                "items": {
+                  "type": "number"
+                },
+                "optional": true
+              },
               "textcolor": {
                 "type": "string",
                 "optional": true
               }
             }
           }
         }
       },
@@ -41,10 +59,30 @@
         "properties": {
           "theme": {
             "optional": true,
             "$ref": "ThemeType"
           }
         }
       }
     ]
+  },
+  {
+    "namespace": "theme",
+    "description": "The theme API allows customizing of visual elements of the browser.",
+    "permissions": ["manifest:theme"],
+    "functions": [
+      {
+        "name": "update",
+        "type": "function",
+        "async": true,
+        "description": "Make complete or partial updates to the theme. Resolves when the update has completed.",
+        "parameters": [
+          {
+            "name": "details",
+            "$ref": "manifest.ThemeType",
+            "description": "The properties of the theme to update."
+          }
+        ]
+      }
+    ]
   }
 ]
--- a/browser/components/extensions/test/browser/browser-common.ini
+++ b/browser/components/extensions/test/browser/browser-common.ini
@@ -102,16 +102,18 @@ support-files =
 [browser_ext_tabs_query.js]
 [browser_ext_tabs_reload.js]
 [browser_ext_tabs_reload_bypass_cache.js]
 [browser_ext_tabs_sendMessage.js]
 [browser_ext_tabs_cookieStoreId.js]
 [browser_ext_tabs_update.js]
 [browser_ext_tabs_zoom.js]
 [browser_ext_tabs_update_url.js]
+[browser_ext_themes_chromeparity.js]
+[browser_ext_themes_dynamic_updates.js]
 [browser_ext_themes_lwtsupport.js]
 [browser_ext_topwindowid.js]
 [browser_ext_url_overrides.js]
 [browser_ext_webRequest.js]
 [browser_ext_webNavigation_frameId0.js]
 [browser_ext_webNavigation_getFrames.js]
 [browser_ext_webNavigation_urlbar_transitions.js]
 [browser_ext_windows.js]
--- a/browser/components/extensions/test/browser/browser_ext_contextMenus_onclick.js
+++ b/browser/components/extensions/test/browser/browser_ext_contextMenus_onclick.js
@@ -1,12 +1,14 @@
 /* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set sts=2 sw=2 et tw=80: */
 "use strict";
 
+const PAGE = "http://mochi.test:8888/browser/browser/components/extensions/test/browser/context.html";
+
 // Loaded both as a background script and a tab page.
 function testScript() {
   let page = location.pathname.includes("tab.html") ? "tab" : "background";
   let clickCounts = {
     old: 0,
     new: 0,
   };
   browser.contextMenus.onClicked.addListener(() => {
@@ -71,18 +73,17 @@ function testScript() {
     pages = pages.filter(w => w !== window);
     browser.test.assertEq(pages[0], browser.extension.getBackgroundPage(),
         "Expected the other page to be a background page");
     browser.test.sendMessage("tab.html ready");
   }
 }
 
 add_task(function* () {
-  let tab1 = yield BrowserTestUtils.openNewForegroundTab(gBrowser,
-    "http://mochi.test:8888/browser/browser/components/extensions/test/browser/context.html");
+  let tab1 = yield BrowserTestUtils.openNewForegroundTab(gBrowser, PAGE);
 
   gBrowser.selectedTab = tab1;
 
   let extension = ExtensionTestUtils.loadExtension({
     manifest: {
       "permissions": ["contextMenus"],
     },
     background: testScript,
@@ -189,8 +190,57 @@ add_task(function* () {
       // more coverage, let's use removeAll instead of remove.
       extension.sendMessage(pageOne, "removeAll");
       yield extension.awaitMessage("next");
     }
   }
   yield extension.unload();
   yield BrowserTestUtils.removeTab(tab1);
 });
+
+add_task(function* test_onclick_modifiers() {
+  const manifest = {
+    permissions: ["contextMenus"],
+  };
+
+  function background() {
+    function onclick(info) {
+      browser.test.sendMessage("click", info);
+    }
+    browser.contextMenus.create({contexts: ["all"], title: "modify", onclick});
+    browser.test.sendMessage("ready");
+  }
+
+  const extension = ExtensionTestUtils.loadExtension({manifest, background});
+  const tab = yield BrowserTestUtils.openNewForegroundTab(gBrowser, PAGE);
+
+  yield extension.startup();
+  yield extension.awaitMessage("ready");
+
+  function* click(modifiers = {}) {
+    const menu = yield openContextMenu();
+    const items = menu.getElementsByAttribute("label", "modify");
+    yield closeExtensionContextMenu(items[0], modifiers);
+    return extension.awaitMessage("click");
+  }
+
+  const plain = yield click();
+  is(plain.modifiers.length, 0, "modifiers array empty with a plain click");
+
+  const shift = yield click({shiftKey: true});
+  is(shift.modifiers.join(), "Shift", "Correct modifier: Shift");
+
+  const ctrl = yield click({ctrlKey: true});
+  if (AppConstants.platform !== "macosx") {
+    is(ctrl.modifiers.join(), "Ctrl", "Correct modifier: Ctrl");
+  } else {
+    is(ctrl.modifiers.sort().join(), "Ctrl,MacCtrl", "Correct modifier: Ctrl (and MacCtrl)");
+
+    const meta = yield click({metaKey: true});
+    is(meta.modifiers.join(), "Command", "Correct modifier: Command");
+  }
+
+  const altShift = yield click({altKey: true, shiftKey: true});
+  is(altShift.modifiers.sort().join(), "Alt,Shift", "Correct modifiers: Shift+Alt");
+
+  yield BrowserTestUtils.removeTab(tab);
+  yield extension.unload();
+});
new file mode 100644
--- /dev/null
+++ b/browser/components/extensions/test/browser/browser_ext_themes_chromeparity.js
@@ -0,0 +1,55 @@
+"use strict";
+
+const ENCODED_IMAGE_DATA = "iVBORw0KGgoAAAANSUhEUgAAABkAAAAZCAYAAADE6YVjAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAdhwAAHYcBj+XxZQAAB5dJREFUSMd91vmTlEcZB/Bvd7/vO+/ce83O3gfLDUsC4VgIghBUEo2GM9GCFTaQBEISA1qIEVNQ4aggJDGIgAGTlFUKKcqKQpVHaQyny7FrCMiywp4ze+/Mzs67M/PO+3a3v5jdWo32H/B86vv0U083weecV3+0C8lkEh6PhzS3tuLkieMSAKo3fW9Mb1eoUtM0jemerukLllzrbGlKheovUpeqkmt113hPfx/27tyFF7+/bbge+U9g20s7kEwmMXXGNLrp2fWi4V5z/tFjJ3fWX726INbfU2xx0yelkJAKdJf3Xl5+2QcPTpv2U0JZR+u92+xvly5ygKDm20/hlX17/jvB6VNnIKXEOydO0iFh4PLVy0XV1U83Vk54QI7JK+bl+UE5vjRfTCzJ5eWBTFEayBLjisvljKmzwmtWrVkEAPNmVrEZkyfh+fU1n59k//7X4Fbz8MK2DRSAWLNq/Yc36y9+3UVMsyAYVPMy/MTvdBKvriJhphDq6xa9vf0i1GMwPVhM5s9bsLw/EvtN2kywwnw/nzBuLDZs2z4auXGjHuvWbmBQdT5v7qytn165fLCyyGtXTR6j5GVkIsvlBCwTVNgQhMKCRDQ2iIbmJv7BpU+Ykl02UFOzdt6gkbzTEQ5Rl2KL3W8eGUE+/ssFXK+rJQ8vWigLgjk5z9ZsvpOniJzVi+ZKTUhCuATTKCjhoLAhhQAsjrSZBJcm7rZ22O+ev6mMmTLj55eu1T+jU8GOH/kJf2TZCiifIQsXfwEbN2yktxoaeYbf93DKSORMnTOZE0aZaVlQGYVKJCgjEJSCcgLB0xDERjINFBUEaXmuB20t95eEutr0xrufpo4eepMAkMPIxx+dx9at25EWQNXsh77q0Bzwen0ShEF32HCrCpjksAWHFAKqokFhgEJt2DKJeFoQv8eDuz3duaseXZYdixthaQ+NRlRCcKO+FgCweP68wswMF/yZWcTkNpLJFAZEGi6XC07NCUIIoqaNSLQfFALCEpCSEL/bK/wuw+12sKlDQzKs6k5yZt+rI+2aNKUSNdUbSSQWh2mJP46rGPeYrjtkY0M7jFgciUQCiqqgrCAfBTle3G9rR1NHN3SnDq9Lg49QlBQEcbfbQCKZlhQEDkXBih27RpDOrmacfP8YB4CfHT7uNXrCMFM2FdDBVQ5TE/A5HbDSJoSpQXAbXm8A4b5+gKrwulU4KKEBnwuzHpiQu+n1jQoQsM+9cYQMT9fvf/FLBYTaDqdzbfgft95PKzbPyQqwnlAXGkJtGIgNYnJpMfwOghLG0GJE0ZdiaOnsQ16OD6XZLkiRROdAgud5sxk8ridsy/pQU1VlOIkZN6QtAGnx0FA0AtXvIA4C5OX4kOWbiLRhQBDApTmgJuLwEonMgBvjgpmgjIEhhX7DAIVKNeqE05/dJbgEgRy5eOJ1ieXr1gJA7ZNLTrVVlAZLyopLJAUlHsrAMrwwrRQ4t6E5VHgSBExjcGpO0JQNizCE05a41dhOi+cXXVm144e1AHD1vXfFMOLy+KSHEDoEJLZ8s+ZWKpUusWwpFKiMUQ4jbiAaj8Hp9oExBsMCUpEIfD6JLKZjKJVGV3RIZGdm0qxA5qmz+/cgMhBVuuMRewRRGF7fe4BYHMgN5LxdV3vhy1EjrrjA5GAyTuKpFHricfS0dSDNCQRPoSyQgSSPI+UBEtwShiWUQEHw5mMvbz4JRcXvDr3B3dBG1sq5X53GlMcX4JWVTyvRQcOumDD2vfKcjOqiQDZPGBF2ryUEnjRhJlP4d6/BiQ1TABPKiyQhgtzvjPCJlQ/OGRwauqESSUPX68U3Vi4fGeH83Hwc3bYHBWUV0m0k4HB6z7aGu6sznDos00R3exgl5ZMwc+FMaJoKKxHFnbo6DMYiELBlqLOXDBq8dsvuPTfKALpwdbX42iMLsHjLd0Zv4RNvvY1wZxdZunyVDGZm6D/47sv12RqbmOPVhG5LGnAH4S8sgu71oK/pn2BWAoYw0dDbaTd19iqlZROejwzEjqgMSuXUifak8jF49JnNI0kAoGrBfET7+uXOrS+y5ta21JzZsw7faW45XJaXxSvyAtTpkOi483fwtAWP1wtvrhvd/VFx+26zojr9Les2PnfaTNu4cuGvvKe9BVv3/RgARiNTpk/Hod17MWikxcqzzfhK/+1jL2xc+YQAX1ISDHLV7WTpQQaLcASzPEiB41ZrmEeHkrTQ49uz/aXn+iilLKXq/MmlS0e/jFcuX4SmaQAAKSXlnIvVy1aQ6EBMFgRyCznDpfGFwdKqirF2tu5SdIeGrkiP+KS5yb7dHtIKsnI++kP9rS8RQvjmxxejePxD2HHwwP9FdCllurGhUbx14CAbiMc4Y2qVJqwLbo0qfpdLSilILB4Xg0mT6h7vnSWzZn9RoaynobWF3K6rk1NmzMWZ83/+37+V4a1cVg5JACYF45bFGVVWOFS2V1HUCjOdBqW0Q9fYb7N9/tcSptnldjpott8rFEXBO+f+NKrWMHL9Wu1nSUAIAaUUa59aAyE43E4X3bD8W6K5K6x1h1snRaMDJDuQf7+vrzfeG+mgfrcLHh3C79bx6wttGEqERiH/AjPohWMouv2ZAAAAAElFTkSuQmCC";
+
+function imageBufferFromDataURI(encodedImageData) {
+  let decodedImageData = atob(encodedImageData);
+  return Uint8Array.from(decodedImageData, byte => byte.charCodeAt(0)).buffer;
+}
+
+add_task(function* setup() {
+  yield SpecialPowers.pushPrefEnv({
+    set: [["extensions.webextensions.themes.enabled", true]],
+  });
+});
+
+add_task(function* test_support_theme_frame() {
+  const FRAME_COLOR = [71, 105, 91];
+  const TAB_TEXT_COLOR = [207, 221, 192, .9];
+  let extension = ExtensionTestUtils.loadExtension({
+    manifest: {
+      "theme": {
+        "images": {
+          "theme_frame": "face.png",
+        },
+        "colors": {
+          "frame": FRAME_COLOR,
+          "tab_text": TAB_TEXT_COLOR,
+        },
+      },
+    },
+    files: {
+      "face.png": imageBufferFromDataURI(ENCODED_IMAGE_DATA),
+    },
+  });
+
+  yield extension.startup();
+
+  let docEl = window.document.documentElement;
+
+  Assert.ok(docEl.hasAttribute("lwtheme"), "LWT attribute should be set");
+  Assert.equal(docEl.getAttribute("lwthemetextcolor"), "bright",
+    "LWT text color attribute should be set");
+
+  let style = window.getComputedStyle(docEl);
+  Assert.ok(style.backgroundImage.includes("face.png"),
+    `The backgroundImage should use face.png. Actual value is: ${style.backgroundImage}`);
+  Assert.equal(style.backgroundColor, "rgb(" + FRAME_COLOR.join(", ") + ")",
+    "Expected correct background color");
+  Assert.equal(style.color, "rgba(" + TAB_TEXT_COLOR.join(", ") + ")",
+    "Expected correct text color");
+
+  yield extension.unload();
+
+  Assert.ok(!docEl.hasAttribute("lwtheme"), "LWT attribute should not be set");
+});
new file mode 100644
--- /dev/null
+++ b/browser/components/extensions/test/browser/browser_ext_themes_dynamic_updates.js
@@ -0,0 +1,87 @@
+"use strict";
+
+// PNG image data for a simple red dot.
+const BACKGROUND_1 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==";
+const ACCENT_COLOR_1 = "#a14040";
+const TEXT_COLOR_1 = "#fac96e";
+
+// PNG image data for the Mozilla dino head.
+const BACKGROUND_2 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHWSURBVHjaYvz//z8DJQAggJiQOe/fv2fv7Oz8rays/N+VkfG/iYnJfyD/1+rVq7ffu3dPFpsBAAHEAHIBCJ85c8bN2Nj4vwsDw/8zQLwKiO8CcRoQu0DxqlWrdsHUwzBAAIGJmTNnPgYa9j8UqhFElwPxf2MIDeIrKSn9FwSJoRkAEEAM0DD4DzMAyPi/G+QKY4hh5WAXGf8PDQ0FGwJ22d27CjADAAIIrLmjo+MXA9R2kAHvGBA2wwx6B8W7od6CeQcggKCmCEL8bgwxYCbUIGTDVkHDBia+CuotgACCueD3TDQN75D4xmAvCoK9ARMHBzAw0AECiBHkAlC0Mdy7x9ABNA3obAZXIAa6iKEcGlMVQHwWyjYuL2d4v2cPg8vZswx7gHyAAAK7AOif7SAbOqCmn4Ha3AHFsIDtgPq/vLz8P4MSkJ2W9h8ggBjevXvHDo4FQUQg/kdypqCg4H8lUIACnQ/SOBMYI8bAsAJFPcj1AAEEjwVQqLpAbXmH5BJjqI0gi9DTAAgDBBCcAVLkgmQ7yKCZxpCQxqUZhAECCJ4XgMl493ug21ZD+aDAXH0WLM4A9MZPXJkJIIAwTAR5pQMalaCABQUULttBGCCAGCnNzgABBgAMJ5THwGvJLAAAAABJRU5ErkJggg==";
+const ACCENT_COLOR_2 = "#03fe03";
+const TEXT_COLOR_2 = "#0ef325";
+
+function hexToRGB(hex) {
+  hex = parseInt((hex.indexOf("#") > -1 ? hex.substring(1) : hex), 16);
+  return [hex >> 16, (hex & 0x00FF00) >> 8, (hex & 0x0000FF)];
+}
+
+function validateTheme(backgroundImage, accentColor, textColor) {
+  let docEl = window.document.documentElement;
+  let style = window.getComputedStyle(docEl);
+
+  Assert.ok(docEl.hasAttribute("lwtheme"), "LWT attribute should be set");
+  Assert.equal(docEl.getAttribute("lwthemetextcolor"), "bright",
+    "LWT text color attribute should be set");
+
+  Assert.equal(style.backgroundImage, 'url("' + backgroundImage.replace(/"/g, '\\"') + '")',
+    "Expected correct background image");
+  Assert.equal(style.backgroundColor, "rgb(" + hexToRGB(accentColor).join(", ") + ")",
+    "Expected correct accent color");
+  Assert.equal(style.color, "rgb(" + hexToRGB(textColor).join(", ") + ")",
+    "Expected correct text color");
+}
+
+add_task(function* setup() {
+  yield SpecialPowers.pushPrefEnv({
+    set: [["extensions.webextensions.themes.enabled", true]],
+  });
+});
+
+add_task(function* test_dynamic_theme_updates() {
+  let extension = ExtensionTestUtils.loadExtension({
+    manifest: {
+      "theme": {
+        "images": {
+          "headerURL": BACKGROUND_1,
+        },
+        "colors": {
+          "accentcolor": ACCENT_COLOR_1,
+          "textcolor": TEXT_COLOR_1,
+        },
+      },
+    },
+    background() {
+      browser.test.onMessage.addListener((msg, details) => {
+        if (msg != "update-theme") {
+          browser.test.fail("expected 'update-theme' message");
+        }
+
+        browser.theme.update(details);
+        browser.test.sendMessage("theme-updated");
+      });
+    },
+  });
+
+  yield extension.startup();
+
+  validateTheme(BACKGROUND_1, ACCENT_COLOR_1, TEXT_COLOR_1);
+
+  extension.sendMessage("update-theme", {
+    "images": {
+      "headerURL": BACKGROUND_2,
+    },
+    "colors": {
+      "accentcolor": ACCENT_COLOR_2,
+      "textcolor": TEXT_COLOR_2,
+    },
+  });
+
+  yield extension.awaitMessage("theme-updated");
+
+  validateTheme(BACKGROUND_2, ACCENT_COLOR_2, TEXT_COLOR_2);
+
+  yield extension.unload();
+
+  let docEl = window.document.documentElement;
+  Assert.ok(!docEl.hasAttribute("lwtheme"), "LWT attribute should not be set");
+});
--- a/browser/components/extensions/test/browser/browser_ext_themes_lwtsupport.js
+++ b/browser/components/extensions/test/browser/browser_ext_themes_lwtsupport.js
@@ -1,87 +1,87 @@
 "use strict";
 
-const kBackground = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==";
-const kAccentColor = "#a14040";
-const kTextColor = "#fac96e";
+const BACKGROUND = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==";
+const ACCENT_COLOR = "#a14040";
+const TEXT_COLOR = "#fac96e";
 
 function hexToRGB(hex) {
   hex = parseInt((hex.indexOf("#") > -1 ? hex.substring(1) : hex), 16);
   return [hex >> 16, (hex & 0x00FF00) >> 8, (hex & 0x0000FF)];
 }
 
 add_task(function* setup() {
   yield SpecialPowers.pushPrefEnv({
     set: [["extensions.webextensions.themes.enabled", true]],
   });
 });
 
-add_task(function* testSupportLWTProperties() {
+add_task(function* test_support_LWT_properties() {
   let extension = ExtensionTestUtils.loadExtension({
     manifest: {
       "theme": {
         "images": {
-          "headerURL": kBackground,
+          "headerURL": BACKGROUND,
         },
         "colors": {
-          "accentcolor": kAccentColor,
-          "textcolor": kTextColor,
+          "accentcolor": ACCENT_COLOR,
+          "textcolor": TEXT_COLOR,
         },
       },
     },
   });
 
   yield extension.startup();
 
   let docEl = window.document.documentElement;
   let style = window.getComputedStyle(docEl);
 
   Assert.ok(docEl.hasAttribute("lwtheme"), "LWT attribute should be set");
   Assert.equal(docEl.getAttribute("lwthemetextcolor"), "bright",
     "LWT text color attribute should be set");
 
-  Assert.equal(style.backgroundImage, 'url("' + kBackground.replace(/"/g, '\\"') + '")',
+  Assert.equal(style.backgroundImage, 'url("' + BACKGROUND.replace(/"/g, '\\"') + '")',
     "Expected background image");
-  Assert.equal(style.backgroundColor, "rgb(" + hexToRGB(kAccentColor).join(", ") + ")",
+  Assert.equal(style.backgroundColor, "rgb(" + hexToRGB(ACCENT_COLOR).join(", ") + ")",
     "Expected correct background color");
-  Assert.equal(style.color, "rgb(" + hexToRGB(kTextColor).join(", ") + ")",
+  Assert.equal(style.color, "rgb(" + hexToRGB(TEXT_COLOR).join(", ") + ")",
     "Expected correct text color");
 
   yield extension.unload();
 
   Assert.ok(!docEl.hasAttribute("lwtheme"), "LWT attribute should not be set");
 });
 
-add_task(function* testLWTRequiresAllPropertiesDefinedImageOnly() {
+add_task(function* test_LWT_requires_all_properties_defined_image_only() {
   let extension = ExtensionTestUtils.loadExtension({
     manifest: {
       "theme": {
         "images": {
-          "headerURL": kBackground,
+          "headerURL": BACKGROUND,
         },
       },
     },
   });
 
   yield extension.startup();
 
   let docEl = window.document.documentElement;
   Assert.ok(!docEl.hasAttribute("lwtheme"), "LWT attribute should not be set");
   yield extension.unload();
   Assert.ok(!docEl.hasAttribute("lwtheme"), "LWT attribute should not be set");
 });
 
-add_task(function* testLWTRequiresAllPropertiesDefinedColorsOnly() {
+add_task(function* test_LWT_requires_all_properties_defined_colors_only() {
   let extension = ExtensionTestUtils.loadExtension({
     manifest: {
       "theme": {
         "colors": {
-          "accentcolor": kAccentColor,
-          "textcolor": kTextColor,
+          "accentcolor": ACCENT_COLOR,
+          "textcolor": TEXT_COLOR,
         },
       },
     },
   });
 
   yield extension.startup();
 
   let docEl = window.document.documentElement;
--- a/browser/components/extensions/test/browser/head.js
+++ b/browser/components/extensions/test/browser/head.js
@@ -252,20 +252,20 @@ function* openExtensionContextMenu(selec
 
   let extensionMenu = topLevelMenu[0].childNodes[0];
   let popupShownPromise = BrowserTestUtils.waitForEvent(contextMenu, "popupshown");
   EventUtils.synthesizeMouseAtCenter(extensionMenu, {});
   yield popupShownPromise;
   return extensionMenu;
 }
 
-function* closeExtensionContextMenu(itemToSelect) {
+function* closeExtensionContextMenu(itemToSelect, modifiers = {}) {
   let contentAreaContextMenu = document.getElementById("contentAreaContextMenu");
   let popupHiddenPromise = BrowserTestUtils.waitForEvent(contentAreaContextMenu, "popuphidden");
-  EventUtils.synthesizeMouseAtCenter(itemToSelect, {});
+  EventUtils.synthesizeMouseAtCenter(itemToSelect, modifiers);
   yield popupHiddenPromise;
 }
 
 function* openChromeContextMenu(menuId, target, win = window) {
   const node = win.document.querySelector(target);
   const menu = win.document.getElementById(menuId);
   const shown = BrowserTestUtils.waitForEvent(menu, "popupshown");
   EventUtils.synthesizeMouseAtCenter(node, {type: "contextmenu"}, win);
--- a/browser/components/migration/AutoMigrate.jsm
+++ b/browser/components/migration/AutoMigrate.jsm
@@ -22,22 +22,24 @@ Cu.import("resource:///modules/Migration
 Cu.import("resource://gre/modules/Preferences.jsm");
 Cu.import("resource://gre/modules/Services.jsm");
 Cu.import("resource://gre/modules/Task.jsm");
 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "AsyncShutdown",
                                   "resource://gre/modules/AsyncShutdown.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "LoginHelper",
                                   "resource://gre/modules/LoginHelper.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "NewTabUtils",
+                                  "resource://gre/modules/NewTabUtils.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "OS",
                                   "resource://gre/modules/osfile.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "PlacesUtils",
                                   "resource://gre/modules/PlacesUtils.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "NewTabUtils",
-                                  "resource://gre/modules/NewTabUtils.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "TelemetryStopwatch",
+                                  "resource://gre/modules/TelemetryStopwatch.jsm");
 
 Cu.importGlobalProperties(["URL"]);
 
 /* globals kUndoStateFullPath */
 XPCOMUtils.defineLazyGetter(this, "kUndoStateFullPath", function() {
   return OS.Path.join(OS.Constants.Path.profileDir, "initialMigrationMetadata.jsonlz4");
 });
 
@@ -189,48 +191,85 @@ const AutoMigrate = {
       fileExists = yield OS.File.exists(kUndoStateFullPath);
     } catch (ex) {
       Cu.reportError(ex);
     }
     return fileExists;
   }),
 
   undo: Task.async(function* () {
+    let browserId = Preferences.get(kAutoMigrateBrowserPref, "unknown");
+    TelemetryStopwatch.startKeyed("FX_STARTUP_MIGRATION_UNDO_TOTAL_MS", browserId);
     let histogram = Services.telemetry.getHistogramById("FX_STARTUP_MIGRATION_AUTOMATED_IMPORT_UNDO");
     histogram.add(0);
     if (!(yield this.canUndo())) {
       histogram.add(5);
       throw new Error("Can't undo!");
     }
 
     this._pendingUndoTasks = true;
     this._removeNotificationBars();
     histogram.add(10);
 
     let readPromise = OS.File.read(kUndoStateFullPath, {
       encoding: "utf-8",
       compression: "lz4",
     });
     let stateData = this._dejsonifyUndoState(yield readPromise);
-    yield this._removeUnchangedBookmarks(stateData.get("bookmarks"));
+    histogram.add(12);
+
+    this._errorMap = {bookmarks: 0, visits: 0, logins: 0};
+    let reportErrorTelemetry = (type) => {
+      let histogramId = `FX_STARTUP_MIGRATION_UNDO_${type.toUpperCase()}_ERRORCOUNT`;
+      Services.telemetry.getKeyedHistogramById(histogramId).add(browserId, this._errorMap[type]);
+    };
+
+    let startTelemetryStopwatch = resourceType => {
+      let histogramId = `FX_STARTUP_MIGRATION_UNDO_${resourceType.toUpperCase()}_MS`;
+      TelemetryStopwatch.startKeyed(histogramId, browserId);
+    };
+    let stopTelemetryStopwatch = resourceType => {
+      let histogramId = `FX_STARTUP_MIGRATION_UNDO_${resourceType.toUpperCase()}_MS`;
+      TelemetryStopwatch.finishKeyed(histogramId, browserId);
+    };
+    startTelemetryStopwatch("bookmarks");
+    yield this._removeUnchangedBookmarks(stateData.get("bookmarks")).catch(ex => {
+      Cu.reportError("Uncaught exception when removing unchanged bookmarks!");
+      Cu.reportError(ex);
+    });
+    stopTelemetryStopwatch("bookmarks");
+    reportErrorTelemetry("bookmarks");
     histogram.add(15);
 
-    yield this._removeSomeVisits(stateData.get("visits"));
+    startTelemetryStopwatch("visits");
+    yield this._removeSomeVisits(stateData.get("visits")).catch(ex => {
+      Cu.reportError("Uncaught exception when removing history visits!");
+      Cu.reportError(ex);
+    });
+    stopTelemetryStopwatch("visits");
+    reportErrorTelemetry("visits");
     histogram.add(20);
 
-    yield this._removeUnchangedLogins(stateData.get("logins"));
+    startTelemetryStopwatch("logins");
+    yield this._removeUnchangedLogins(stateData.get("logins")).catch(ex => {
+      Cu.reportError("Uncaught exception when removing unchanged logins!");
+      Cu.reportError(ex);
+    });
+    stopTelemetryStopwatch("logins");
+    reportErrorTelemetry("logins");
     histogram.add(25);
 
     // This is async, but no need to wait for it.
     NewTabUtils.links.populateCache(() => {
       NewTabUtils.allPages.update();
     }, true);
 
     this._purgeUndoState(this.UNDO_REMOVED_REASON_UNDO_USED);
     histogram.add(30);
+    TelemetryStopwatch.finishKeyed("FX_STARTUP_MIGRATION_UNDO_TOTAL_MS", browserId);
   }),
 
   _removeNotificationBars() {
     let browserWindows = Services.wm.getEnumerator("navigator:browser");
     while (browserWindows.hasMoreElements()) {
       let win = browserWindows.getNext();
       if (!win.closed) {
         for (let browser of win.gBrowser.browsers) {
@@ -414,26 +453,31 @@ const AutoMigrate = {
       return;
     }
 
     let guidToLMMap = new Map(bookmarks.map(b => [b.guid, b.lastModified]));
     let bookmarksFromDB = [];
     let bmPromises = Array.from(guidToLMMap.keys()).map(guid => {
       // Ignore bookmarks where the promise doesn't resolve (ie that are missing)
       // Also check that the bookmark fetch returns isn't null before adding it.
-      return PlacesUtils.bookmarks.fetch(guid).then(bm => bm && bookmarksFromDB.push(bm), () => {});
+      try {
+        return PlacesUtils.bookmarks.fetch(guid).then(bm => bm && bookmarksFromDB.push(bm), () => {});
+      } catch (ex) {
+        // Ignore immediate exceptions, too.
+      }
+      return Promise.resolve();
     });
     // We can't use the result of Promise.all because that would include nulls
     // for bookmarks that no longer exist (which we're catching above).
     yield Promise.all(bmPromises);
     let unchangedBookmarks = bookmarksFromDB.filter(bm => {
       return bm.lastModified.getTime() == guidToLMMap.get(bm.guid).getTime();
     });
 
-    // We need to remove items with no ancestors first, followed by their
+    // We need to remove items without children first, followed by their
     // parents, etc. In order to do this, find out how many ancestors each item
     // has that also appear in our list of things to remove, and sort the items
     // by those numbers. This ensures that children are always removed before
     // their parents.
     function determineAncestorCount(bm) {
       if (bm._ancestorCount) {
         return bm._ancestorCount;
       }
@@ -443,36 +487,42 @@ const AutoMigrate = {
         myCount = determineAncestorCount(parentBM) + 1;
       }
       bm._ancestorCount = myCount;
       return myCount;
     }
     unchangedBookmarks.forEach(determineAncestorCount);
     unchangedBookmarks.sort((a, b) => b._ancestorCount - a._ancestorCount);
     for (let {guid} of unchangedBookmarks) {
-      yield PlacesUtils.bookmarks.remove(guid, {preventRemovalOfNonEmptyFolders: true}).catch(err => {
+      // Can't just use a .catch() because Bookmarks.remove() can throw (rather
+      // than returning rejected promises).
+      try {
+        yield PlacesUtils.bookmarks.remove(guid, {preventRemovalOfNonEmptyFolders: true});
+      } catch (err) {
         if (err && err.message != "Cannot remove a non-empty folder.") {
+          this._errorMap.bookmarks++;
           Cu.reportError(err);
         }
-      });
+      }
     }
   }),
 
   _removeUnchangedLogins: Task.async(function* (logins) {
     for (let login of logins) {
       let foundLogins = LoginHelper.searchLoginsWithObject({guid: login.guid});
       if (foundLogins.length) {
         let foundLogin = foundLogins[0];
         foundLogin.QueryInterface(Ci.nsILoginMetaInfo);
         if (foundLogin.timePasswordChanged == login.timePasswordChanged) {
           try {
             Services.logins.removeLogin(foundLogin);
           } catch (ex) {
             Cu.reportError("Failed to remove a login for " + foundLogins.hostname);
             Cu.reportError(ex);
+            this._errorMap.logins++;
           }
         }
       }
     }
   }),
 
   _removeSomeVisits: Task.async(function* (visits) {
     for (let urlVisits of visits) {
@@ -485,20 +535,21 @@ const AutoMigrate = {
       let visitData = {
         url: urlObj,
         beginDate: PlacesUtils.toDate(urlVisits.first),
         endDate: PlacesUtils.toDate(urlVisits.last),
         limit: urlVisits.visitCount,
       };
       try {
         yield PlacesUtils.history.removeVisitsByFilter(visitData);
-      } catch(ex) {
+      } catch (ex) {
+        this._errorMap.visits++;
         try {
           visitData.url = visitData.url.href;
-        } catch (ex) {}
+        } catch (ignoredEx) {}
         Cu.reportError("Failed to remove a visit: " + JSON.stringify(visitData));
         Cu.reportError(ex);
       }
     }
   }),
 
   QueryInterface: XPCOMUtils.generateQI(
     [Ci.nsIObserver, Ci.nsINavBookmarkObserver, Ci.nsISupportsWeakReference]
--- a/browser/components/migration/ChromeProfileMigrator.js
+++ b/browser/components/migration/ChromeProfileMigrator.js
@@ -435,34 +435,45 @@ function GetWindowsPasswordsResource(aPr
       // If the promise was rejected we will have already called aCallback,
       // so we can just return here.
       if (!rows) {
         return;
       }
       let crypto = new OSCrypto();
 
       for (let row of rows) {
-        let loginInfo = {
-          username: row.getResultByName("username_value"),
-          password: crypto.
-                    decryptData(crypto.arrayToString(row.getResultByName("password_value")),
-                                                     null),
-          hostname: NetUtil.newURI(row.getResultByName("origin_url")).prePath,
-          formSubmitURL: null,
-          httpRealm: null,
-          usernameElement: row.getResultByName("username_element"),
-          passwordElement: row.getResultByName("password_element"),
-          timeCreated: chromeTimeToDate(row.getResultByName("date_created") + 0).getTime(),
-          timesUsed: row.getResultByName("times_used") + 0,
-        };
+        try {
+          let origin_url = NetUtil.newURI(row.getResultByName("origin_url"));
+          // Ignore entries for non-http(s)/ftp URLs because we likely can't
+          // use them anyway.
+          const kValidSchemes = new Set(["https", "http", "ftp"]);
+          if (!kValidSchemes.has(origin_url.scheme)) {
+            continue;
+          }
+          let loginInfo = {
+            username: row.getResultByName("username_value"),
+            password: crypto.
+                      decryptData(crypto.arrayToString(row.getResultByName("password_value")),
+                                                       null),
+            hostname: origin_url.prePath,
+            formSubmitURL: null,
+            httpRealm: null,
+            usernameElement: row.getResultByName("username_element"),
+            passwordElement: row.getResultByName("password_element"),
+            timeCreated: chromeTimeToDate(row.getResultByName("date_created") + 0).getTime(),
+            timesUsed: row.getResultByName("times_used") + 0,
+          };
 
-        try {
           switch (row.getResultByName("scheme")) {
             case AUTH_TYPE.SCHEME_HTML:
-              loginInfo.formSubmitURL = NetUtil.newURI(row.getResultByName("action_url")).prePath;
+              let action_url = NetUtil.newURI(row.getResultByName("action_url"));
+              if (!kValidSchemes.has(action_url.scheme)) {
+                continue; // This continues the outer for loop.
+              }
+              loginInfo.formSubmitURL = action_url.prePath;
               break;
             case AUTH_TYPE.SCHEME_BASIC:
             case AUTH_TYPE.SCHEME_DIGEST:
               // signon_realm format is URIrealm, so we need remove URI
               loginInfo.httpRealm = row.getResultByName("signon_realm")
                                        .substring(loginInfo.hostname.length + 1);
               break;
             default:
--- a/browser/components/migration/tests/unit/test_automigration.js
+++ b/browser/components/migration/tests/unit/test_automigration.js
@@ -183,16 +183,17 @@ add_task(function* checkUndoPrecondition
   Assert.ok(true, "Should be able to finish an undo cycle.");
 });
 
 /**
  * Fake a migration and then try to undo it to verify all data gets removed.
  */
 add_task(function* checkUndoRemoval() {
   MigrationUtils.initializeUndoData();
+  Preferences.set("browser.migrate.automigrate.browser", "automationbrowser");
   // Insert a login and check that that worked.
   MigrationUtils.insertLoginWrapper({
     hostname: "www.mozilla.org",
     formSubmitURL: "http://www.mozilla.org",
     username: "user",
     password: "pass",
   });
   let storedLogins = Services.logins.findLogins({}, "www.mozilla.org",
@@ -252,16 +253,38 @@ add_task(function* checkUndoRemoval() {
   visits.root.containerOpen = false;
 
   yield AutoMigrate.saveUndoState();
 
   // Verify that we can undo, then undo:
   Assert.ok(AutoMigrate.canUndo(), "Should be possible to undo migration");
   yield AutoMigrate.undo();
 
+  let histograms = [
+    "FX_STARTUP_MIGRATION_UNDO_BOOKMARKS_ERRORCOUNT",
+    "FX_STARTUP_MIGRATION_UNDO_LOGINS_ERRORCOUNT",
+    "FX_STARTUP_MIGRATION_UNDO_VISITS_ERRORCOUNT",
+  ];
+  for (let histogramId of histograms) {
+    let keyedHistogram = Services.telemetry.getKeyedHistogramById(histogramId);
+    let histogramData = keyedHistogram.snapshot().automationbrowser;
+    Assert.equal(histogramData.sum, 0, `Should have reported 0 errors to ${histogramId}.`);
+    Assert.greaterOrEqual(histogramData.counts[0], 1, `Should have reported value of 0 one time to ${histogramId}.`);
+  }
+  histograms = [
+    "FX_STARTUP_MIGRATION_UNDO_BOOKMARKS_MS",
+    "FX_STARTUP_MIGRATION_UNDO_LOGINS_MS",
+    "FX_STARTUP_MIGRATION_UNDO_VISITS_MS",
+    "FX_STARTUP_MIGRATION_UNDO_TOTAL_MS",
+  ];
+  for (let histogramId of histograms) {
+    Assert.greater(Services.telemetry.getKeyedHistogramById(histogramId).snapshot().automationbrowser.sum, 0,
+                   `Should have reported non-zero time spent using undo for ${histogramId}`);
+  }
+
   // Check that the undo removed the history visits:
   visits = PlacesUtils.history.executeQuery(query, opts);
   visits.root.containerOpen = true;
   Assert.equal(visits.root.childCount, 0, "Should have no more visits");
   visits.root.containerOpen = false;
 
   // Check that the undo removed the bookmarks:
   bookmark = yield PlacesUtils.bookmarks.fetch({url: "http://www.example.org/"});
@@ -607,11 +630,32 @@ add_task(function* checkUndoVisitsState(
   Assert.equal(yield visitsForURL("http://www.example.org/"), 2,
                "2 example.org visits should have persisted (out of 4).");
   Assert.equal(yield visitsForURL("http://www.unrelated.org/"), 1,
                "1 unrelated.org visits should have persisted as it's not involved in the import.");
   yield PlacesTestUtils.clearHistory();
 });
 
 add_task(function* checkHistoryRemovalCompletion() {
+  AutoMigrate._errorMap = {bookmarks: 0, visits: 0, logins: 0};
   yield AutoMigrate._removeSomeVisits([{url: "http://www.example.com/", limit: -1}]);
   ok(true, "Removing visits should complete even if removing some visits failed.");
+  Assert.equal(AutoMigrate._errorMap.visits, 1, "Should have logged the error for visits.");
+
+  // Unfortunately there's not a reliable way to make removing bookmarks be
+  // unhappy unless the DB is messed up (e.g. contains children but has
+  // parents removed already).
+  yield AutoMigrate._removeUnchangedBookmarks([
+    {guid: PlacesUtils.bookmarks, lastModified: new Date(0), parentGuid: 0},
+    {guid: "gobbledygook", lastModified: new Date(0), parentGuid: 0},
+  ]);
+  ok(true, "Removing bookmarks should complete even if some items are gone or bogus.");
+  Assert.equal(AutoMigrate._errorMap.bookmarks, 0,
+               "Should have ignored removing non-existing (or builtin) bookmark.");
+
+
+  yield AutoMigrate._removeUnchangedLogins([
+    {guid: "gobbledygook", timePasswordChanged: new Date(0)},
+  ]);
+  ok(true, "Removing logins should complete even if logins don't exist.");
+  Assert.equal(AutoMigrate._errorMap.logins, 0,
+               "Should have ignored removing non-existing logins.");
 });
--- a/browser/components/shell/moz.build
+++ b/browser/components/shell/moz.build
@@ -25,18 +25,22 @@ elif 'gtk' in CONFIG['MOZ_WIDGET_TOOLKIT
     XPIDL_SOURCES += [
         'nsIGNOMEShellService.idl',
     ]
 
 XPIDL_MODULE = 'shellservice'
 
 if CONFIG['OS_ARCH'] == 'WINNT':
     SOURCES += [
+        '../../../other-licenses/nsis/Contrib/CityHash/cityhash/city.cpp',
         'nsWindowsShellService.cpp',
     ]
+    LOCAL_INCLUDES += [
+        '../../../other-licenses/nsis/Contrib/CityHash/cityhash',
+    ]
 elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'cocoa':
     SOURCES += [
         'nsMacShellService.cpp',
     ]
 elif 'gtk' in CONFIG['MOZ_WIDGET_TOOLKIT']:
     SOURCES += [
         'nsGNOMEShellService.cpp',
     ]
--- a/browser/components/shell/nsWindowsShellService.cpp
+++ b/browser/components/shell/nsWindowsShellService.cpp
@@ -1,15 +1,16 @@
 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 /* 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 "nsWindowsShellService.h"
 
+#include "city.h"
 #include "imgIContainer.h"
 #include "imgIRequest.h"
 #include "mozilla/gfx/2D.h"
 #include "mozilla/RefPtr.h"
 #include "nsIDOMElement.h"
 #include "nsIDOMHTMLImageElement.h"
 #include "nsIImageLoadingContent.h"
 #include "nsIOutputStream.h"
@@ -91,34 +92,39 @@ OpenKeyForReading(HKEY aKeyRoot, const n
 }
 
 ///////////////////////////////////////////////////////////////////////////////
 // Default Browser Registry Settings
 //
 // The setting of these values are made by an external binary since writing
 // these values may require elevation.
 //
+// To allow multiple installations to coexist, identifiers written to the
+// registry include a hash of the installation path. This is referred to as
+// <PathHash> in the tables below.
+//
 // - File Extension Mappings
 //   -----------------------
 //   The following file extensions:
-//    .htm .html .shtml .xht .xhtml 
+//    .htm .html .shtml .xht .xhtml
 //   are mapped like so:
 //
-//   HKCU\SOFTWARE\Classes\.<ext>\      (default)         REG_SZ     FirefoxHTML
+//   HKCU\SOFTWARE\Classes\.<ext>\      (default)         REG_SZ     FirefoxHTML-<PathHash>
 //
 //   as aliases to the class:
 //
-//   HKCU\SOFTWARE\Classes\FirefoxHTML\
+//   HKCU\SOFTWARE\Classes\FirefoxHTML-<PathHash>\
 //     DefaultIcon                      (default)         REG_SZ     <apppath>,1
 //     shell\open\command               (default)         REG_SZ     <apppath> -osint -url "%1"
 //     shell\open\ddeexec               (default)         REG_SZ     <empty string>
 //
 // - Windows Vista and above Protocol Handler
 //
-//   HKCU\SOFTWARE\Classes\FirefoxURL\  (default)         REG_SZ     <appname> URL
+//   HKCU\SOFTWARE\Classes\FirefoxURL-<PathHash>\
+//                                      (default)         REG_SZ     <appname> URL
 //                                      EditFlags         REG_DWORD  2
 //                                      FriendlyTypeName  REG_SZ     <appname> URL
 //     DefaultIcon                      (default)         REG_SZ     <apppath>,1
 //     shell\open\command               (default)         REG_SZ     <apppath> -osint -url "%1"
 //     shell\open\ddeexec               (default)         REG_SZ     <empty string>
 //
 // - Protocol Mappings
 //   -----------------
@@ -130,39 +136,59 @@ OpenKeyForReading(HKEY aKeyRoot, const n
 //     DefaultIcon                      (default)         REG_SZ     <apppath>,1
 //     shell\open\command               (default)         REG_SZ     <apppath> -osint -url "%1"
 //     shell\open\ddeexec               (default)         REG_SZ     <empty string>
 //
 // - Windows Start Menu (XP SP1 and newer)
 //   -------------------------------------------------
 //   The following keys are set to make Firefox appear in the Start Menu as the
 //   browser:
-//   
-//   HKCU\SOFTWARE\Clients\StartMenuInternet\FIREFOX.EXE\
+//
+//   HKCU\SOFTWARE\Clients\StartMenuInternet\<appname>-<PathHash>\
 //                                      (default)         REG_SZ     <appname>
 //     DefaultIcon                      (default)         REG_SZ     <apppath>,0
 //     InstallInfo                      HideIconsCommand  REG_SZ     <uninstpath> /HideShortcuts
 //     InstallInfo                      IconsVisible      REG_DWORD  1
 //     InstallInfo                      ReinstallCommand  REG_SZ     <uninstpath> /SetAsDefaultAppGlobal
 //     InstallInfo                      ShowIconsCommand  REG_SZ     <uninstpath> /ShowShortcuts
 //     shell\open\command               (default)         REG_SZ     <apppath>
 //     shell\properties                 (default)         REG_SZ     <appname> &Options
 //     shell\properties\command         (default)         REG_SZ     <apppath> -preferences
 //     shell\safemode                   (default)         REG_SZ     <appname> &Safe Mode
 //     shell\safemode\command           (default)         REG_SZ     <apppath> -safe-mode
 //
+// - RegisteredApplications
+//   -------------------------------------------------
+//   This entry creates the listing in Default Apps for Windows 8 and up and in
+//   Set Program Access and Defaults (SPAD) on older versions.
+//
+//   HKCU\Software\RegisteredApplications\
+//     Firefox-<PathHash>  REG_SZ "Software\Clients\StartMenuInternet\<appname>-<PathHash>\Capabilities"
+//   HKCU\Software\Clients\StartMenuInternet\<appname>-<PathHash>\Capabilities\
+//                                      ApplicationDescription  REG_SZ  <branding description>
+//                                      ApplicationIcon         REG_SZ  <apppath>,0
+//                                      ApplicationName         REG_SZ  <appname>
+//     FileAssociations                 .htm                    REG_SZ  FirefoxHTML-<PathHash>
+//     FileAssociations                 .html                   REG_SZ  FirefoxHTML-<PathHash>
+//     FileAssociations                 .shtml                  REG_SZ  FirefoxHTML-<PathHash>
+//     FileAssociations                 .xht                    REG_SZ  FirefoxHTML-<PathHash>
+//     FileAssociations                 .xhtml                  REG_SZ  FirefoxHTML-<PathHash>
+//     StartMenu                        StartMenuInternet       REG_SZ  <appname>-<PathHash>
+//     URLAssociations                  ftp                     REG_SZ  FirefoxURL-<PathHash>
+//     URLAssociations                  http                    REG_SZ  FirefoxURL-<PathHash>
+//     URLAssociations                  https                   REG_SZ  FirefoxURL-<PathHash>
 
 // The values checked are all default values so the value name is not needed.
 typedef struct {
   const char* keyName;
   const char* valueData;
   const char* oldValueData;
 } SETTING;
 
-#define APP_REG_NAME L"Firefox"
+#define APP_REG_NAME_BASE L"Firefox-"
 #define VAL_FILE_ICON "%APPPATH%,1"
 #define VAL_OPEN "\"%APPPATH%\" -osint -url \"%1\""
 #define OLD_VAL_OPEN "\"%APPPATH%\" -requestPending -osint -url \"%1\""
 #define DI "\\DefaultIcon"
 #define SOC "\\shell\\open\\command"
 #define SOD "\\shell\\open\\ddeexec"
 // Used for updating the FTP protocol handler's shell open command under HKCU.
 #define FTP_SOC L"Software\\Classes\\ftp\\shell\\open\\command"
@@ -210,17 +236,17 @@ static SETTING gDDESettings[] = {
   { MAKE_KEY_NAME1("Software\\Classes\\HTTP", SOD) },
   { MAKE_KEY_NAME1("Software\\Classes\\HTTPS", SOD) }
 };
 
 nsresult
 GetHelperPath(nsAutoString& aPath)
 {
   nsresult rv;
-  nsCOMPtr<nsIProperties> directoryService = 
+  nsCOMPtr<nsIProperties> directoryService =
     do_GetService(NS_DIRECTORY_SERVICE_CONTRACTID, &rv);
   NS_ENSURE_SUCCESS(rv, rv);
 
   nsCOMPtr<nsIFile> appHelper;
   rv = directoryService->Get(XRE_EXECUTABLE_FILE,
                              NS_GET_IID(nsIFile),
                              getter_AddRefs(appHelper));
   NS_ENSURE_SUCCESS(rv, rv);
@@ -336,17 +362,17 @@ IsAARDefault(const RefPtr<IApplicationAs
   ASSOCIATIONTYPE queryType = isProtocol ? AT_URLPROTOCOL : AT_FILEEXTENSION;
   HRESULT hr = pAAR->QueryCurrentDefault(aClassName, queryType, AL_EFFECTIVE,
                                          &registeredApp);
   if (FAILED(hr)) {
     return false;
   }
 
   LPCWSTR progID = isProtocol ? L"FirefoxURL" : L"FirefoxHTML";
-  bool isDefault = !wcsicmp(registeredApp, progID);
+  bool isDefault = !wcsnicmp(registeredApp, progID, wcslen(progID));
   CoTaskMemFree(registeredApp);
 
   return isDefault;
 }
 
 static void
 IsDefaultBrowserWin8(bool aCheckAllTypes, bool* aIsDefaultBrowser)
 {
@@ -365,16 +391,48 @@ IsDefaultBrowserWin8(bool aCheckAllTypes
     *aIsDefaultBrowser = res;
   }
   res = IsAARDefault(pAAR, L".html");
   if (*aIsDefaultBrowser && aCheckAllTypes) {
     *aIsDefaultBrowser = res;
   }
 }
 
+static nsresult
+GetAppRegName(nsAutoString &aAppRegName)
+{
+  nsresult rv;
+  nsCOMPtr<nsIProperties> dirSvc =
+    do_GetService(NS_DIRECTORY_SERVICE_CONTRACTID, &rv);
+  NS_ENSURE_SUCCESS(rv, rv);
+
+  nsCOMPtr<nsIFile> exeFile;
+  rv = dirSvc->Get(XRE_EXECUTABLE_FILE,
+                   NS_GET_IID(nsIFile),
+                   getter_AddRefs(exeFile));
+  NS_ENSURE_SUCCESS(rv, rv);
+
+  nsCOMPtr<nsIFile> appDir;
+  rv = exeFile->GetParent(getter_AddRefs(appDir));
+  NS_ENSURE_SUCCESS(rv, rv);
+
+  nsAutoString path;
+  rv = appDir->GetPath(path);
+  NS_ENSURE_SUCCESS(rv, rv);
+
+  uint64_t hash = CityHash64(static_cast<const char *>(path.get()),
+                             path.Length() * sizeof(nsAutoString::char_type));
+
+  aAppRegName = APP_REG_NAME_BASE;
+  aAppRegName.AppendInt((int)hash, 16);
+  aAppRegName.AppendInt((int)(hash >> 32), 16);
+
+  return rv;
+}
+
 /*
  * Query's the AAR for the default status.
  * This only checks for FirefoxURL and if aCheckAllTypes is set, then
  * it also checks for FirefoxHTML.  Note that those ProgIDs are shared
  * by all Firefox browsers.
 */
 bool
 nsWindowsShellService::IsDefaultBrowserVista(bool aCheckAllTypes,
@@ -387,18 +445,20 @@ nsWindowsShellService::IsDefaultBrowserV
                                 IID_IApplicationAssociationRegistration,
                                 getter_AddRefs(pAAR));
   if (FAILED(hr)) {
     return false;
   }
 
   if (aCheckAllTypes) {
     BOOL res;
+    nsAutoString appRegName;
+    GetAppRegName(appRegName);
     hr = pAAR->QueryAppIsDefaultAll(AL_EFFECTIVE,
-                                    APP_REG_NAME,
+                                    appRegName.get(),
                                     &res);
     *aIsDefaultBrowser = res;
   } else if (!IsWin8OrLater()) {
     *aIsDefaultBrowser = IsAARDefault(pAAR, L"http");
   }
 
   return true;
 }
@@ -632,17 +692,19 @@ nsWindowsShellService::LaunchControlPane
 {
   IApplicationAssociationRegistrationUI* pAARUI;
   HRESULT hr = CoCreateInstance(CLSID_ApplicationAssociationRegistrationUI,
                                 NULL,
                                 CLSCTX_INPROC,
                                 IID_IApplicationAssociationRegistrationUI,
                                 (void**)&pAARUI);
   if (SUCCEEDED(hr)) {
-    hr = pAARUI->LaunchAdvancedAssociationUI(APP_REG_NAME);
+    nsAutoString appRegName;
+    GetAppRegName(appRegName);
+    hr = pAARUI->LaunchAdvancedAssociationUI(appRegName.get());
     pAARUI->Release();
   }
   return SUCCEEDED(hr) ? NS_OK : NS_ERROR_FAILURE;
 }
 
 nsresult
 nsWindowsShellService::LaunchControlPanelDefaultPrograms()
 {
@@ -654,24 +716,27 @@ nsWindowsShellService::LaunchControlPane
   LPCWSTR controlEXE = L"control.exe";
   if (wcslen(controlEXEPath) + wcslen(controlEXE) >= MAX_PATH) {
     return NS_ERROR_FAILURE;
   }
   if (!PathAppendW(controlEXEPath, controlEXE)) {
     return NS_ERROR_FAILURE;
   }
 
-  WCHAR params[] = L"control.exe /name Microsoft.DefaultPrograms /page "
-    "pageDefaultProgram\\pageAdvancedSettings?pszAppName=" APP_REG_NAME;
+  nsAutoString params(NS_LITERAL_STRING("control.exe /name Microsoft.DefaultPrograms "
+    "/page pageDefaultProgram\\pageAdvancedSettings?pszAppName="));
+  nsAutoString appRegName;
+  GetAppRegName(appRegName);
+  params.Append(appRegName);
   STARTUPINFOW si = {sizeof(si), 0};
   si.dwFlags = STARTF_USESHOWWINDOW;
   si.wShowWindow = SW_SHOWDEFAULT;
   PROCESS_INFORMATION pi = {0};
-  if (!CreateProcessW(controlEXEPath, params, nullptr, nullptr, FALSE,
-                      0, nullptr, nullptr, &si, &pi)) {
+  if (!CreateProcessW(controlEXEPath, static_cast<LPWSTR>(params.get()), nullptr,
+                      nullptr, FALSE, 0, nullptr, nullptr, &si, &pi)) {
     return NS_ERROR_FAILURE;
   }
   CloseHandle(pi.hProcess);
   CloseHandle(pi.hThread);
 
   return NS_OK;
 }
 
@@ -790,17 +855,17 @@ nsWindowsShellService::InvokeHTTPOpenAsV
 }
 
 nsresult
 nsWindowsShellService::LaunchHTTPHandlerPane()
 {
   OPENASINFO info;
   info.pcszFile = L"http";
   info.pcszClass = nullptr;
-  info.oaifInFlags = OAIF_FORCE_REGISTRATION | 
+  info.oaifInFlags = OAIF_FORCE_REGISTRATION |
                      OAIF_URL_PROTOCOL |
                      OAIF_REGISTER_EXT;
   return DynSHOpenWithDialog(nullptr, &info);
 }
 
 NS_IMETHODIMP
 nsWindowsShellService::SetDefaultBrowser(bool aClaimAllTypes, bool aForAllUsers)
 {
@@ -944,27 +1009,27 @@ WriteBitmap(nsIFile* aFile, imgIContaine
   }
 
   dataSurface->Unmap();
 
   return rv;
 }
 
 NS_IMETHODIMP
-nsWindowsShellService::SetDesktopBackground(nsIDOMElement* aElement, 
+nsWindowsShellService::SetDesktopBackground(nsIDOMElement* aElement,
                                             int32_t aPosition)
 {
   nsresult rv;
 
   nsCOMPtr<imgIContainer> container;
   nsCOMPtr<nsIDOMHTMLImageElement> imgElement(do_QueryInterface(aElement));
   if (!imgElement) {
     // XXX write background loading stuff!
     return NS_ERROR_NOT_AVAILABLE;
-  } 
+  }
   else {
     nsCOMPtr<nsIImageLoadingContent> imageContent =
       do_QueryInterface(aElement, &rv);
     if (!imageContent)
       return rv;
 
     // get the image container
     nsCOMPtr<imgIRequest> request;
@@ -981,17 +1046,17 @@ nsWindowsShellService::SetDesktopBackgro
   nsCOMPtr<nsIStringBundleService>
     bundleService(do_GetService(NS_STRINGBUNDLE_CONTRACTID, &rv));
   NS_ENSURE_SUCCESS(rv, rv);
 
   nsCOMPtr<nsIStringBundle> shellBundle;
   rv = bundleService->CreateBundle(SHELLSERVICE_PROPERTIES,
                                    getter_AddRefs(shellBundle));
   NS_ENSURE_SUCCESS(rv, rv);
- 
+
   // e.g. "Desktop Background.bmp"
   nsString fileLeafName;
   rv = shellBundle->GetStringFromName
                       (u"desktopBackgroundLeafNameWin",
                        getter_Copies(fileLeafName));
   NS_ENSURE_SUCCESS(rv, rv);
 
   // get the profile root directory
@@ -1069,22 +1134,22 @@ nsWindowsShellService::OpenApplication(i
     application.AssignLiteral("Mail");
     break;
   case nsIShellService::APPLICATION_NEWS:
     application.AssignLiteral("News");
     break;
   }
 
   // The Default Client section of the Windows Registry looks like this:
-  // 
+  //
   // Clients\aClient\
   //  e.g. aClient = "Mail"...
   //        \Mail\(default) = Client Subkey Name
   //             \Client Subkey Name
-  //             \Client Subkey Name\shell\open\command\ 
+  //             \Client Subkey Name\shell\open\command\
   //             \Client Subkey Name\shell\open\command\(default) = path to exe
   //
 
   // Find the default application for this class.
   HKEY theKey;
   nsresult rv = OpenKeyForReading(HKEY_CLASSES_ROOT, application, &theKey);
   if (NS_FAILED(rv))
     return rv;
@@ -1114,35 +1179,35 @@ nsWindowsShellService::OpenApplication(i
   res = ::RegQueryValueExW(theKey, EmptyString().get(), 0,
                            &type, (LPBYTE)&buf, &len);
   if (REG_FAILED(res) || !*buf)
     return NS_ERROR_FAILURE;
 
   // Close the key we opened.
   ::RegCloseKey(theKey);
 
-  // Look for any embedded environment variables and substitute their 
+  // Look for any embedded environment variables and substitute their
   // values, as |::CreateProcessW| is unable to do this.
   nsAutoString path(buf);
   int32_t end = path.Length();
   int32_t cursor = 0, temp = 0;
   ::ZeroMemory(buf, sizeof(buf));
   do {
     cursor = path.FindChar('%', cursor);
-    if (cursor < 0) 
+    if (cursor < 0)
       break;
 
     temp = path.FindChar('%', cursor + 1);
     ++cursor;
 
     ::ZeroMemory(&buf, sizeof(buf));
 
     ::GetEnvironmentVariableW(nsAutoString(Substring(path, cursor, temp - cursor)).get(),
                               buf, sizeof(buf));
-    
+
     // "+ 2" is to subtract the extra characters used to delimit the environment
     // variable ('%').
     path.Replace((cursor - 1), temp - cursor + 2, nsDependentString(buf));
 
     ++cursor;
   }
   while (cursor < end);
 
@@ -1208,25 +1273,25 @@ nsWindowsShellService::~nsWindowsShellSe
 {
 }
 
 NS_IMETHODIMP
 nsWindowsShellService::OpenApplicationWithURI(nsIFile* aApplication,
                                               const nsACString& aURI)
 {
   nsresult rv;
-  nsCOMPtr<nsIProcess> process = 
+  nsCOMPtr<nsIProcess> process =
     do_CreateInstance("@mozilla.org/process/util;1", &rv);
   if (NS_FAILED(rv))
     return rv;
-  
+
   rv = process->Init(aApplication);
   if (NS_FAILED(rv))
     return rv;
-  
+
   const nsCString spec(aURI);
   const char* specStr = spec.get();
   return process->Run(false, &specStr, 1);
 }
 
 NS_IMETHODIMP
 nsWindowsShellService::GetDefaultFeedReader(nsIFile** _retval)
 {
--- a/browser/installer/windows/nsis/installer.nsi
+++ b/browser/installer/windows/nsis/installer.nsi
@@ -16,23 +16,19 @@
 ; 7-Zip provides better compression than the lzma from NSIS so we add the files
 ; uncompressed and use 7-Zip to create a SFX archive of it
 SetDatablockOptimize on
 SetCompress off
 CRCCheck on
 
 RequestExecutionLevel user
 
-; The commands inside this ifdef require NSIS 3.0a2 or greater so the ifdef can
-; be removed after we require NSIS 3.0a2 or greater.
-!ifdef NSIS_PACKEDVERSION
-  Unicode true
-  ManifestSupportedOS all
-  ManifestDPIAware true
-!endif
+Unicode true
+ManifestSupportedOS all
+ManifestDPIAware true
 
 !addplugindir ./
 
 Var TmpVal
 Var InstallType
 Var AddStartMenuSC
 Var AddTaskbarSC
 Var AddQuickLaunchSC
@@ -41,17 +37,17 @@ Var InstallMaintenanceService
 Var PageName
 Var PreventRebootRequired
 
 ; By defining NO_STARTMENU_DIR an installer that doesn't provide an option for
 ; an application's Start Menu PROGRAMS directory and doesn't define the
 ; StartMenuDir variable can use the common InstallOnInitCommon macro.
 !define NO_STARTMENU_DIR
 
-; On Vista and above attempt to elevate Standard Users in addition to users that
+; Attempt to elevate Standard Users in addition to users that
 ; are a member of the Administrators group.
 !define NONADMIN_ELEVATE
 
 !define AbortSurveyURL "http://www.kampyle.com/feedback_form/ff-feedback-form.php?site_code=8166124&form_id=12116&url="
 
 ; Other included files may depend upon these includes!
 ; The following includes are provided by NSIS.
 !include FileFunc.nsh
@@ -247,17 +243,17 @@ Section "-InstallStartCleanup"
     Sleep 5000
     ${DeleteFile} "$INSTDIR\${FileMainEXE}"
     ClearErrors
   ${EndIf}
 
   ; setup the application model id registration value
   ${InitHashAppModelId} "$INSTDIR" "Software\Mozilla\${AppName}\TaskBarIDs"
 
-  ; Remove the updates directory for Vista and above
+  ; Remove the updates directory
   ${CleanUpdateDirectories} "Mozilla\Firefox" "Mozilla\updates"
 
   ${RemoveDeprecatedFiles}
   ${RemovePrecompleteEntries} "false"
 
   ${If} ${FileExists} "$INSTDIR\defaults\pref\channel-prefs.js"
     Delete "$INSTDIR\defaults\pref\channel-prefs.js"
   ${EndIf}
@@ -377,90 +373,92 @@ Section "-Application" APP_IDX
   ; On install always add the FirefoxHTML and FirefoxURL keys.
   ; An empty string is used for the 5th param because FirefoxHTML is not a
   ; protocol handler.
   ${GetLongPath} "$INSTDIR\${FileMainEXE}" $8
   StrCpy $2 "$\"$8$\" -osint -url $\"%1$\""
 
   ; In Win8, the delegate execute handler picks up the value in FirefoxURL and
   ; FirefoxHTML to launch the desktop browser when it needs to.
-  ${AddDisabledDDEHandlerValues} "FirefoxHTML" "$2" "$8,1" \
+  ${AddDisabledDDEHandlerValues} "FirefoxHTML-$AppUserModelID" "$2" "$8,1" \
                                  "${AppRegName} Document" ""
-  ${AddDisabledDDEHandlerValues} "FirefoxURL" "$2" "$8,1" "${AppRegName} URL" \
-                                 "true"
+  ${AddDisabledDDEHandlerValues} "FirefoxURL-$AppUserModelID" "$2" "$8,1" \
+                                 "${AppRegName} URL" "true"
 
   ; For pre win8, the following keys should only be set if we can write to HKLM.
-  ; For post win8, the keys below get set in both HKLM and HKCU.
+  ; For post win8, the keys below can be set in HKCU if needed.
   ${If} $TmpVal == "HKLM"
-    ; Set the Start Menu Internet and Vista Registered App HKLM registry keys.
-    ${SetStartMenuInternet} "HKLM"
-    ${FixShellIconHandler} "HKLM"
+    ; Set the Start Menu Internet and Registered App HKLM registry keys.
+    ; If we're upgrading an existing install, replacing the old registry entries
+    ; (without a path hash) would cause the default browser to be reset.
+    ReadRegStr $0 HKLM "Software\Clients\StartMenuInternet\FIREFOX.EXE\DefaultIcon" ""
+    StrCpy $0 $0 -2
+    ${If} $0 != "$INSTDIR\${FileMainEXE}"
+      ${SetStartMenuInternet} "HKLM"
+      ${FixShellIconHandler} "HKLM"
+    ${EndIf}
 
     ; If we are writing to HKLM and create either the desktop or start menu
     ; shortcuts set IconsVisible to 1 otherwise to 0.
     ; Taskbar shortcuts imply having a start menu shortcut.
-    ${StrFilter} "${FileMainEXE}" "+" "" "" $R9
-    StrCpy $0 "Software\Clients\StartMenuInternet\$R9\InstallInfo"
+    StrCpy $0 "Software\Clients\StartMenuInternet\${AppRegName}-$AppUserModelID\InstallInfo"
     ${If} $AddDesktopSC == 1
     ${OrIf} $AddStartMenuSC == 1
     ${OrIf} $AddTaskbarSC == 1
       WriteRegDWORD HKLM "$0" "IconsVisible" 1
     ${Else}
       WriteRegDWORD HKLM "$0" "IconsVisible" 0
     ${EndIf}
-  ${EndIf}
-
-  ${If} ${AtLeastWin8}
-    ; Set the Start Menu Internet and Vista Registered App HKCU registry keys.
-    ${SetStartMenuInternet} "HKCU"
-    ${FixShellIconHandler} "HKCU"
+  ${ElseIf} ${AtLeastWin8}
+    ; Set the Start Menu Internet and Registered App HKCU registry keys.
+    ; If we're upgrading an existing install, replacing the old registry entries
+    ; (without a path hash) would cause the default browser to be reset.
+    ReadRegStr $0 HKCU "Software\Clients\StartMenuInternet\FIREFOX.EXE\DefaultIcon" ""
+    StrCpy $0 $0 -2
+    ${If} $0 != "$INSTDIR\${FileMainEXE}"
+      ${SetStartMenuInternet} "HKCU"
+      ${FixShellIconHandler} "HKCU"
+    ${EndIf}
 
     ; If we create either the desktop or start menu shortcuts, then
     ; set IconsVisible to 1 otherwise to 0.
     ; Taskbar shortcuts imply having a start menu shortcut.
-    ${StrFilter} "${FileMainEXE}" "+" "" "" $R9
-    StrCpy $0 "Software\Clients\StartMenuInternet\$R9\InstallInfo"
+    StrCpy $0 "Software\Clients\StartMenuInternet\${AppRegName}-$AppUserModelID\InstallInfo"
     ${If} $AddDesktopSC == 1
     ${OrIf} $AddStartMenuSC == 1
     ${OrIf} $AddTaskbarSC == 1
       WriteRegDWORD HKCU "$0" "IconsVisible" 1
     ${Else}
       WriteRegDWORD HKCU "$0" "IconsVisible" 0
     ${EndIf}
   ${EndIf}
 
 !ifdef MOZ_MAINTENANCE_SERVICE
-  ; If the maintenance service page was displayed then a value was already 
-  ; explicitly selected for installing the maintenance service and 
+  ; If the maintenance service page was displayed then a value was already
+  ; explicitly selected for installing the maintenance service and
   ; and so InstallMaintenanceService will already be 0 or 1.
-  ; If the maintenance service page was not displayed then 
+  ; If the maintenance service page was not displayed then
   ; InstallMaintenanceService will be equal to "".
   ${If} $InstallMaintenanceService == ""
     Call IsUserAdmin
     Pop $R0
     ${If} $R0 == "true"
     ; Only proceed if we have HKLM write access
     ${AndIf} $TmpVal == "HKLM"
-      ; On Windows < XP SP3 we do not install the maintenance service.
-      ${If} ${IsWinXP}
-      ${AndIf} ${AtMostServicePack} 2
-        StrCpy $InstallMaintenanceService "0"
-      ${Else}
-        ; The user is an admin, so we should default to installing the service.
-        StrCpy $InstallMaintenanceService "1"
-      ${EndIf}
+      ; The user is an admin, so we should default to installing the service.
+      StrCpy $InstallMaintenanceService "1"
     ${Else}
       ; The user is not admin, so we can't install the service.
       StrCpy $InstallMaintenanceService "0"
     ${EndIf}
   ${EndIf}
 
   ${If} $InstallMaintenanceService == "1"
     ; The user wants to install the maintenance service, so execute
-    ; the pre-packaged maintenance service installer. 
+    ; the pre-packaged maintenance service installer.
     ; This option can only be turned on if the user is an admin so there
     ; is no need to use ExecShell w/ verb runas to enforce elevated.
     nsExec::Exec "$\"$INSTDIR\maintenanceservice_installer.exe$\""
   ${EndIf}
 !endif
 
   ; These need special handling on uninstall since they may be overwritten by
   ; an install into a different location.
@@ -469,17 +467,17 @@ Section "-Application" APP_IDX
   ${WriteRegStr2} $TmpVal "$0" "Path" "$INSTDIR" 0
 
   StrCpy $0 "Software\Microsoft\MediaPlayer\ShimInclusionList\$R9"
   ${CreateRegKey} "$TmpVal" "$0" 0
   StrCpy $0 "Software\Microsoft\MediaPlayer\ShimInclusionList\plugin-container.exe"
   ${CreateRegKey} "$TmpVal" "$0" 0
 
   ${If} $TmpVal == "HKLM"
-    ; Set the permitted LSP Categories for WinVista and above
+    ; Set the permitted LSP Categories
     ${SetAppLSPCategories} ${LSP_CATEGORIES}
   ${EndIf}
 
   ; Create shortcuts
   ${LogHeader} "Adding Shortcuts"
 
   ; Remove the start menu shortcuts and directory if the SMPROGRAMS section
   ; exists in the shortcuts_log.ini and the SMPROGRAMS. The installer's shortcut
@@ -596,25 +594,23 @@ Section "-InstallEndCleanup"
   ${Unless} ${Silent}
     ${MUI_INSTALLOPTIONS_READ} $0 "summary.ini" "Field 4" "State"
     ${If} "$0" == "1"
       ; NB: this code is duplicated in stub.nsi. Please keep in sync.
       ; For data migration in the app, we want to know what the default browser
       ; value was before we changed it. To do so, we read it here and store it
       ; in our own registry key.
       StrCpy $0 ""
-      ${If} ${AtLeastWinVista}
-        AppAssocReg::QueryCurrentDefault "http" "protocol" "effective"
-        Pop $1
-        ; If the method hasn't failed, $1 will contain the progid. Check:
-        ${If} "$1" != "method failed"
-        ${AndIf} "$1" != "method not available"
-          ; Read the actual command from the progid
-          ReadRegStr $0 HKCR "$1\shell\open\command" ""
-        ${EndIf}
+      AppAssocReg::QueryCurrentDefault "http" "protocol" "effective"
+      Pop $1
+      ; If the method hasn't failed, $1 will contain the progid. Check:
+      ${If} "$1" != "method failed"
+      ${AndIf} "$1" != "method not available"
+        ; Read the actual command from the progid
+        ReadRegStr $0 HKCR "$1\shell\open\command" ""
       ${EndIf}
       ; If using the App Association Registry didn't happen or failed, fall back
       ; to the effective http default:
       ${If} "$0" == ""
         ReadRegStr $0 HKCR "http\shell\open\command" ""
       ${EndIf}
       ; If we have something other than empty string now, write the value.
       ${If} "$0" != ""
@@ -952,22 +948,16 @@ Function preComponents
   ; If the service already exists, don't show this page
   ServicesHelper::IsInstalled "MozillaMaintenance"
   Pop $R9
   ${If} $R9 == 1
     ; The service already exists so don't show this page.
     Abort
   ${EndIf}
 
-  ; On Windows < XP SP3 we do not install the maintenance service.
-  ${If} ${IsWinXP}
-  ${AndIf} ${AtMostServicePack} 2
-    Abort
-  ${EndIf}
-
   ; Don't show the custom components page if the
   ; user is not an admin
   Call IsUserAdmin
   Pop $R9
   ${If} $R9 != "true"
     Abort
   ${EndIf}
 
@@ -1166,24 +1156,16 @@ Function .onInit
     ExecShell "open" "${URLSystemRequirements}"
     Quit
   ${EndUnless}
   SetRegView 64
 !endif
 
   ${InstallOnInitCommon} "$(WARN_MIN_SUPPORTED_OSVER_CPU_MSG)"
 
-; The commands inside this ifndef are needed prior to NSIS 3.0a2 and can be
-; removed after we require NSIS 3.0a2 or greater.
-!ifndef NSIS_PACKEDVERSION
-  ${If} ${AtLeastWinVista}
-    System::Call 'user32::SetProcessDPIAware()'
-  ${EndIf}
-!endif
-
   !insertmacro InitInstallOptionsFile "options.ini"
   !insertmacro InitInstallOptionsFile "shortcuts.ini"
   !insertmacro InitInstallOptionsFile "components.ini"
   !insertmacro InitInstallOptionsFile "summary.ini"
 
   WriteINIStr "$PLUGINSDIR\options.ini" "Settings" NumFields "5"
 
   WriteINIStr "$PLUGINSDIR\options.ini" "Field 1" Type   "label"
--- a/browser/installer/windows/nsis/maintenanceservice_installer.nsi
+++ b/browser/installer/windows/nsis/maintenanceservice_installer.nsi
@@ -8,23 +8,19 @@
 ; 7-Zip provides better compression than the lzma from NSIS so we add the files
 ; uncompressed and use 7-Zip to create a SFX archive of it
 SetDatablockOptimize on
 SetCompress off
 CRCCheck on
 
 RequestExecutionLevel admin
 
-; The commands inside this ifdef require NSIS 3.0a2 or greater so the ifdef can
-; be removed after we require NSIS 3.0a2 or greater.
-!ifdef NSIS_PACKEDVERSION
-  Unicode true
-  ManifestSupportedOS all
-  ManifestDPIAware true
-!endif
+Unicode true
+ManifestSupportedOS all
+ManifestDPIAware true
 
 !addplugindir ./
 
 ; Variables
 Var TempMaintServiceName
 Var BrandFullNameDA
 Var BrandFullName
 
@@ -125,24 +121,16 @@ Function .onInit
   ${EndUnless}
 FunctionEnd
 
 Function un.onInit
   ; Remove the current exe directory from the search order.
   ; This only effects LoadLibrary calls and not implicitly loaded DLLs.
   System::Call 'kernel32::SetDllDirectoryW(w "")'
 
-; The commands inside this ifndef are needed prior to NSIS 3.0a2 and can be
-; removed after we require NSIS 3.0a2 or greater.
-!ifndef NSIS_PACKEDVERSION
-  ${If} ${AtLeastWinVista}
-    System::Call 'user32::SetProcessDPIAware()'
-  ${EndIf}
-!endif
-
   StrCpy $BrandFullNameDA "${MaintFullName}"
   StrCpy $BrandFullName "${MaintFullName}"
 FunctionEnd
 
 Section "MaintenanceService"
   AllowSkipFiles off
 
   CreateDirectory $INSTDIR
@@ -182,16 +170,30 @@ Section "MaintenanceService"
     ExecWait '"$INSTDIR\$TempMaintServiceName" install'
   ${Else}
     ; The upgrade cmdline is the same as install except
     ; It will fail if the service isn't already installed.
     ExecWait '"$INSTDIR\$TempMaintServiceName" upgrade'
   ${EndIf}
 
   WriteUninstaller "$INSTDIR\Uninstall.exe"
+
+  ; Since the Maintenance service can be installed either x86 or x64,
+  ; always use the 64-bit registry.
+  ${If} ${RunningX64}
+    ; Previous versions always created the uninstall key in the 32-bit registry.
+    ; Clean those old entries out if they still exist.
+    SetRegView 32
+    DeleteRegKey HKLM "${MaintUninstallKey}"
+    ; Preserve the lastused value before we switch to 64.
+    SetRegView lastused
+
+    SetRegView 64
+  ${EndIf}
+
   WriteRegStr HKLM "${MaintUninstallKey}" "DisplayName" "${MaintFullName}"
   WriteRegStr HKLM "${MaintUninstallKey}" "UninstallString" \
                    '"$INSTDIR\uninstall.exe"'
   WriteRegStr HKLM "${MaintUninstallKey}" "DisplayIcon" \
                    "$INSTDIR\Uninstall.exe,0"
   WriteRegStr HKLM "${MaintUninstallKey}" "DisplayVersion" "${AppVersion}"
   WriteRegStr HKLM "${MaintUninstallKey}" "Publisher" "Mozilla"
   WriteRegStr HKLM "${MaintUninstallKey}" "Comments" "${BrandFullName}"
@@ -199,21 +201,16 @@ Section "MaintenanceService"
   ${GetSize} "$INSTDIR" "/S=0K" $R2 $R3 $R4
   WriteRegDWORD HKLM "${MaintUninstallKey}" "EstimatedSize" $R2
 
   ; Write out that a maintenance service was attempted.
   ; We do this because on upgrades we will check this value and we only
   ; want to install once on the first upgrade to maintenance service.
   ; Also write out that we are currently installed, preferences will check
   ; this value to determine if we should show the service update pref.
-  ; Since the Maintenance service can be installed either x86 or x64,
-  ; always use the 64-bit registry for checking if an attempt was made.
-  ${If} ${RunningX64}
-    SetRegView 64
-  ${EndIf}
   WriteRegDWORD HKLM "Software\Mozilla\MaintenanceService" "Attempted" 1
   WriteRegDWORD HKLM "Software\Mozilla\MaintenanceService" "Installed" 1
   DeleteRegValue HKLM "Software\Mozilla\MaintenanceService" "FFPrefetchDisabled"
 
   ; Included here for debug purposes only.  
   ; These keys are used to bypass the installation dir is a valid installation
   ; check from the service so that tests can be run.
   ; WriteRegStr HKLM "${FallbackKey}\0" "name" "Mozilla Corporation"
@@ -313,20 +310,19 @@ Section "Uninstall"
   Push "$APPDATA\Mozilla\logs\maintenanceservice-uninstall.log"
   Call un.RenameDelete
   RMDir /REBOOTOK "$APPDATA\Mozilla\logs"
   RMDir /REBOOTOK "$APPDATA\Mozilla"
   RMDir /REBOOTOK "$INSTDIR\logs"
   RMDir /REBOOTOK "$INSTDIR\update"
   RMDir /REBOOTOK "$INSTDIR"
 
-  DeleteRegKey HKLM "${MaintUninstallKey}"
-
   ${If} ${RunningX64}
     SetRegView 64
   ${EndIf}
+  DeleteRegKey HKLM "${MaintUninstallKey}"
   DeleteRegValue HKLM "Software\Mozilla\MaintenanceService" "Installed"
   DeleteRegValue HKLM "Software\Mozilla\MaintenanceService" "FFPrefetchDisabled"
   DeleteRegKey HKLM "${FallbackKey}\"
   ${If} ${RunningX64}
     SetRegView lastused
   ${EndIf}
 SectionEnd
--- a/browser/installer/windows/nsis/shared.nsh
+++ b/browser/installer/windows/nsis/shared.nsh
@@ -8,16 +8,17 @@
   ; Otherwise ApplicationID::Set can fail intermittently with a file in use error.
   System::Call "kernel32::GetCurrentProcessId() i.r0"
   System::Call "kernel32::ProcessIdToSessionId(i $0, *i ${NSIS_MAX_STRLEN} r9)"
 
   ; Determine if we're the protected UserChoice default or not. If so fix the
   ; start menu tile.  In case there are 2 Firefox installations, we only do
   ; this if the application being updated is the default.
   ReadRegStr $0 HKCU "Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice" "ProgId"
+  ${WordFind} "$0" "-" "+1{" $0
   ${If} $0 == "FirefoxURL"
   ${AndIf} $9 != 0 ; We're not running in session 0
     ReadRegStr $0 HKCU "Software\Classes\FirefoxURL\shell\open\command" ""
     ${GetPathFromString} "$0" $0
     ${GetParent} "$0" $0
     ${If} ${FileExists} "$0"
       ${GetLongPath} "$0" $0
     ${EndIf}
@@ -54,45 +55,16 @@
     ${SetAppLSPCategories} ${LSP_CATEGORIES}
 
     ; Win7 taskbar and start menu link maintenance
     Call FixShortcutAppModelIDs
 
     ; Add the Firewall entries after an update
     Call AddFirewallEntries
 
-    ; Only update the Clients\StartMenuInternet registry key values in HKLM if
-    ; they don't exist or this installation is the same as the one set in those
-    ; keys.
-    ${StrFilter} "${FileMainEXE}" "+" "" "" $1
-    ReadRegStr $0 HKLM "Software\Clients\StartMenuInternet\$1\DefaultIcon" ""
-    ${GetPathFromString} "$0" $0
-    ${GetParent} "$0" $0
-    ${If} ${FileExists} "$0"
-      ${GetLongPath} "$0" $0
-    ${EndIf}
-    ${If} "$0" == "$INSTDIR"
-      ${SetStartMenuInternet} "HKLM"
-    ${EndIf}
-
-    ; Only update the Clients\StartMenuInternet registry key values in HKCU if
-    ; they don't exist or this installation is the same as the one set in those
-    ; keys.  This is only done in Windows 8 to avoid a UAC prompt.
-    ${If} ${AtLeastWin8}
-      ReadRegStr $0 HKCU "Software\Clients\StartMenuInternet\$1\DefaultIcon" ""
-      ${GetPathFromString} "$0" $0
-      ${GetParent} "$0" $0
-      ${If} ${FileExists} "$0"
-        ${GetLongPath} "$0" $0
-      ${EndIf}
-      ${If} "$0" == "$INSTDIR"
-        ${SetStartMenuInternet} "HKCU"
-      ${EndIf}
-    ${EndIf}
-
     ReadRegStr $0 HKLM "Software\mozilla.org\Mozilla" "CurrentVersion"
     ${If} "$0" != "${GREVersion}"
       WriteRegStr HKLM "Software\mozilla.org\Mozilla" "CurrentVersion" "${GREVersion}"
     ${EndIf}
   ${EndIf}
 
   ; Migrate the application's Start Menu directory to a single shortcut in the
   ; root of the Start Menu Programs directory.
@@ -126,18 +98,16 @@
   RmDir /r /REBOOTOK "$INSTDIR\${TO_BE_DELETED}"
 
 !ifdef MOZ_MAINTENANCE_SERVICE
   Call IsUserAdmin
   Pop $R0
   ${If} $R0 == "true"
   ; Only proceed if we have HKLM write access
   ${AndIf} $TmpVal == "HKLM"
-  ; On Windows 2000 we do not install the maintenance service.
-  ${AndIf} ${AtLeastWinXP}
     ; We check to see if the maintenance service install was already attempted.
     ; Since the Maintenance service can be installed either x86 or x64,
     ; always use the 64-bit registry for checking if an attempt was made.
     ${If} ${RunningX64}
       SetRegView 64
     ${EndIf}
     ReadRegDWORD $5 HKLM "Software\Mozilla\MaintenanceService" "Attempted"
     ClearErrors
@@ -176,17 +146,17 @@
   ${RemoveDeprecatedKeys} ; Does not use SHCTX
 
   SetShellVarContext all      ; Set SHCTX to all users (e.g. HKLM)
   ${SetHandlers} ; Uses SHCTX
   ${SetStartMenuInternet} "HKLM"
   ${FixShellIconHandler} "HKLM"
   ${ShowShortcuts}
   ${StrFilter} "${FileMainEXE}" "+" "" "" $R9
-  WriteRegStr HKLM "Software\Clients\StartMenuInternet" "" "$R9"
+  WriteRegStr HKLM "Software\Clients\StartMenuInternet" "" "$R9-$AppUserModelID"
 !macroend
 !define SetAsDefaultAppGlobal "!insertmacro SetAsDefaultAppGlobal"
 
 ; Removes shortcuts for this installation. This should also remove the
 ; application from Open With for the file types the application handles
 ; (bug 370480).
 !macro HideShortcuts
   ${StrFilter} "${FileMainEXE}" "+" "" "" $0
@@ -246,18 +216,17 @@
     ${EndIf}
   ${EndIf}
 !macroend
 !define HideShortcuts "!insertmacro HideShortcuts"
 
 ; Adds shortcuts for this installation. This should also add the application
 ; to Open With for the file types the application handles (bug 370480).
 !macro ShowShortcuts
-  ${StrFilter} "${FileMainEXE}" "+" "" "" $0
-  StrCpy $R1 "Software\Clients\StartMenuInternet\$0\InstallInfo"
+  StrCpy $R1 "Software\Clients\StartMenuInternet\${AppRegName}-$AppUserModelID\InstallInfo"
   WriteRegDWORD HKLM "$R1" "IconsVisible" 1
   ${If} ${AtLeastWin8}
     WriteRegDWORD HKCU "$R1" "IconsVisible" 1
   ${EndIf}
 
   SetShellVarContext all  ; Set $DESKTOP to All Users
   ${Unless} ${FileExists} "$DESKTOP\${BrandFullName}.lnk"
     CreateShortCut "$DESKTOP\${BrandFullName}.lnk" "$INSTDIR\${FileMainEXE}"
@@ -322,102 +291,107 @@
   ${EndUnless}
 !macroend
 !define ShowShortcuts "!insertmacro ShowShortcuts"
 
 !macro AddAssociationIfNoneExist FILE_TYPE
   ClearErrors
   EnumRegKey $7 HKCR "${FILE_TYPE}" 0
   ${If} ${Errors}
-    WriteRegStr SHCTX "SOFTWARE\Classes\${FILE_TYPE}"  "" "FirefoxHTML"
+    WriteRegStr SHCTX "SOFTWARE\Classes\${FILE_TYPE}"  "" "FirefoxHTML-$AppUserModelID"
   ${EndIf}
-  WriteRegStr SHCTX "SOFTWARE\Classes\${FILE_TYPE}\OpenWithProgids" "FirefoxHTML" ""
+  WriteRegStr SHCTX "SOFTWARE\Classes\${FILE_TYPE}\OpenWithProgids" "FirefoxHTML-$AppUserModelID" ""
 !macroend
 !define AddAssociationIfNoneExist "!insertmacro AddAssociationIfNoneExist"
 
 ; Adds the protocol and file handler registry entries for making Firefox the
 ; default handler (uses SHCTX).
 !macro SetHandlers
   ${GetLongPath} "$INSTDIR\${FileMainEXE}" $8
 
   StrCpy $0 "SOFTWARE\Classes"
   StrCpy $2 "$\"$8$\" -osint -url $\"%1$\""
 
-  ; Associate the file handlers with FirefoxHTML
+  ; Associate the file handlers with FirefoxHTML, if they aren't already.
   ReadRegStr $6 SHCTX "$0\.htm" ""
+  ${WordFind} "$6" "-" "+1{" $6
   ${If} "$6" != "FirefoxHTML"
-    WriteRegStr SHCTX "$0\.htm"   "" "FirefoxHTML"
+    WriteRegStr SHCTX "$0\.htm"   "" "FirefoxHTML-$AppUserModelID"
   ${EndIf}
 
   ReadRegStr $6 SHCTX "$0\.html" ""
+  ${WordFind} "$6" "-" "+1{" $6
   ${If} "$6" != "FirefoxHTML"
-    WriteRegStr SHCTX "$0\.html"  "" "FirefoxHTML"
+    WriteRegStr SHCTX "$0\.html"  "" "FirefoxHTML-$AppUserModelID"
   ${EndIf}
 
   ReadRegStr $6 SHCTX "$0\.shtml" ""
+  ${WordFind} "$6" "-" "+1{" $6
   ${If} "$6" != "FirefoxHTML"
-    WriteRegStr SHCTX "$0\.shtml" "" "FirefoxHTML"
+    WriteRegStr SHCTX "$0\.shtml" "" "FirefoxHTML-$AppUserModelID"
   ${EndIf}
 
   ReadRegStr $6 SHCTX "$0\.xht" ""
+  ${WordFind} "$6" "-" "+1{" $6
   ${If} "$6" != "FirefoxHTML"
-    WriteRegStr SHCTX "$0\.xht"   "" "FirefoxHTML"
+    WriteRegStr SHCTX "$0\.xht"   "" "FirefoxHTML-$AppUserModelID"
   ${EndIf}
 
   ReadRegStr $6 SHCTX "$0\.xhtml" ""
+  ${WordFind} "$6" "-" "+1{" $6
   ${If} "$6" != "FirefoxHTML"
-    WriteRegStr SHCTX "$0\.xhtml" "" "FirefoxHTML"
+    WriteRegStr SHCTX "$0\.xhtml" "" "FirefoxHTML-$AppUserModelID"
   ${EndIf}
 
   ${AddAssociationIfNoneExist} ".pdf"
   ${AddAssociationIfNoneExist} ".oga"
   ${AddAssociationIfNoneExist} ".ogg"
   ${AddAssociationIfNoneExist} ".ogv"
   ${AddAssociationIfNoneExist} ".pdf"
   ${AddAssociationIfNoneExist} ".webm"
 
   ; An empty string is used for the 5th param because FirefoxHTML is not a
   ; protocol handler
-  ${AddDisabledDDEHandlerValues} "FirefoxHTML" "$2" "$8,1" \
+  ${AddDisabledDDEHandlerValues} "FirefoxHTML-$AppUserModelID" "$2" "$8,1" \
                                  "${AppRegName} HTML Document" ""
 
-  ${AddDisabledDDEHandlerValues} "FirefoxURL" "$2" "$8,1" "${AppRegName} URL" \
+  ${AddDisabledDDEHandlerValues} "FirefoxURL-$AppUserModelID" "$2" "$8,1" "${AppRegName} URL" \
                                  "true"
   ; An empty string is used for the 4th & 5th params because the following
   ; protocol handlers already have a display name and the additional keys
   ; required for a protocol handler.
   ${AddDisabledDDEHandlerValues} "ftp" "$2" "$8,1" "" ""
   ${AddDisabledDDEHandlerValues} "http" "$2" "$8,1" "" ""
   ${AddDisabledDDEHandlerValues} "https" "$2" "$8,1" "" ""
 !macroend
 !define SetHandlers "!insertmacro SetHandlers"
 
-; Adds the HKLM\Software\Clients\StartMenuInternet\FIREFOX.EXE registry
+; Adds the HKLM\Software\Clients\StartMenuInternet\Firefox-[pathhash] registry
 ; entries (does not use SHCTX).
 ;
 ; The values for StartMenuInternet are only valid under HKLM and there can only
 ; be one installation registerred under StartMenuInternet per application since
 ; the key name is derived from the main application executable.
-; http://support.microsoft.com/kb/297878
 ;
 ; In Windows 8 this changes slightly, you can store StartMenuInternet entries in
 ; HKCU.  The icon in start menu for StartMenuInternet is deprecated as of Win7,
 ; but the subkeys are what's important.  Control panel default programs looks
 ; for them only in HKLM pre win8.
 ;
-; Note: we might be able to get away with using the full path to the
-; application executable for the key name in order to support multiple
-; installations.
+; The StartMenuInternet key and friends are documented at
+; https://msdn.microsoft.com/en-us/library/windows/desktop/cc144109(v=vs.85).aspx
+;
+; This function also writes our RegisteredApplications entry, which gets us
+; listed in the Settings app's default browser options on Windows 8+, and in
+; Set Program Access and Defaults on earlier versions.
 !macro SetStartMenuInternet RegKey
   ${GetLongPath} "$INSTDIR\${FileMainEXE}" $8
   ${GetLongPath} "$INSTDIR\uninstall\helper.exe" $7
 
-  ${StrFilter} "${FileMainEXE}" "+" "" "" $R9
-
-  StrCpy $0 "Software\Clients\StartMenuInternet\$R9"
+  StrCpy $0 "Software\Clients\StartMenuInternet\${AppRegName}-$AppUserModelID"
 
   WriteRegStr ${RegKey} "$0" "" "${BrandFullName}"
 
   WriteRegStr ${RegKey} "$0\DefaultIcon" "" "$8,0"
 
   ; The Reinstall Command is defined at
   ; http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/programmersguide/shell_adv/registeringapps.asp
   WriteRegStr ${RegKey} "$0\InstallInfo" "HideIconsCommand" "$\"$7$\" /HideShortcuts"
@@ -439,50 +413,50 @@
   WriteRegStr ${RegKey} "$0\shell\open\command" "" "$\"$8$\""
 
   WriteRegStr ${RegKey} "$0\shell\properties" "" "$(CONTEXT_OPTIONS)"
   WriteRegStr ${RegKey} "$0\shell\properties\command" "" "$\"$8$\" -preferences"
 
   WriteRegStr ${RegKey} "$0\shell\safemode" "" "$(CONTEXT_SAFE_MODE)"
   WriteRegStr ${RegKey} "$0\shell\safemode\command" "" "$\"$8$\" -safe-mode"
 
-  ; Vista Capabilities registry keys
+  ; Capabilities registry keys
   WriteRegStr ${RegKey} "$0\Capabilities" "ApplicationDescription" "$(REG_APP_DESC)"
   WriteRegStr ${RegKey} "$0\Capabilities" "ApplicationIcon" "$8,0"
   WriteRegStr ${RegKey} "$0\Capabilities" "ApplicationName" "${BrandShortName}"
 
-  WriteRegStr ${RegKey} "$0\Capabilities\FileAssociations" ".htm"   "FirefoxHTML"
-  WriteRegStr ${RegKey} "$0\Capabilities\FileAssociations" ".html"  "FirefoxHTML"
-  WriteRegStr ${RegKey} "$0\Capabilities\FileAssociations" ".shtml" "FirefoxHTML"
-  WriteRegStr ${RegKey} "$0\Capabilities\FileAssociations" ".xht"   "FirefoxHTML"
-  WriteRegStr ${RegKey} "$0\Capabilities\FileAssociations" ".xhtml" "FirefoxHTML"
+  WriteRegStr ${RegKey} "$0\Capabilities\FileAssociations" ".htm"   "FirefoxHTML-$AppUserModelID"
+  WriteRegStr ${RegKey} "$0\Capabilities\FileAssociations" ".html"  "FirefoxHTML-$AppUserModelID"
+  WriteRegStr ${RegKey} "$0\Capabilities\FileAssociations" ".shtml" "FirefoxHTML-$AppUserModelID"
+  WriteRegStr ${RegKey} "$0\Capabilities\FileAssociations" ".xht"   "FirefoxHTML-$AppUserModelID"
+  WriteRegStr ${RegKey} "$0\Capabilities\FileAssociations" ".xhtml" "FirefoxHTML-$AppUserModelID"
 
-  WriteRegStr ${RegKey} "$0\Capabilities\StartMenu" "StartMenuInternet" "$R9"
+  WriteRegStr ${RegKey} "$0\Capabilities\StartMenu" "StartMenuInternet" "${AppRegName}-$AppUserModelID"
 
-  WriteRegStr ${RegKey} "$0\Capabilities\URLAssociations" "ftp"    "FirefoxURL"
-  WriteRegStr ${RegKey} "$0\Capabilities\URLAssociations" "http"   "FirefoxURL"
-  WriteRegStr ${RegKey} "$0\Capabilities\URLAssociations" "https"  "FirefoxURL"
+  WriteRegStr ${RegKey} "$0\Capabilities\URLAssociations" "ftp"    "FirefoxURL-$AppUserModelID"
+  WriteRegStr ${RegKey} "$0\Capabilities\URLAssociations" "http"   "FirefoxURL-$AppUserModelID"
+  WriteRegStr ${RegKey} "$0\Capabilities\URLAssociations" "https"  "FirefoxURL-$AppUserModelID"
 
-  ; Vista Registered Application
-  WriteRegStr ${RegKey} "Software\RegisteredApplications" "${AppRegName}" "$0\Capabilities"
+  ; Registered Application
+  WriteRegStr ${RegKey} "Software\RegisteredApplications" "${AppRegName}-$AppUserModelID" "$0\Capabilities"
 !macroend
 !define SetStartMenuInternet "!insertmacro SetStartMenuInternet"
 
 ; The IconHandler reference for FirefoxHTML can end up in an inconsistent state
 ; due to changes not being detected by the IconHandler for side by side
 ; installs (see bug 268512). The symptoms can be either an incorrect icon or no
 ; icon being displayed for files associated with Firefox (does not use SHCTX).
 !macro FixShellIconHandler RegKey
   ClearErrors
-  ReadRegStr $1 ${RegKey} "Software\Classes\FirefoxHTML\ShellEx\IconHandler" ""
+  ReadRegStr $1 ${RegKey} "Software\Classes\FirefoxHTML-$AppUserModelID\ShellEx\IconHandler" ""
   ${Unless} ${Errors}
-    ReadRegStr $1 ${RegKey} "Software\Classes\FirefoxHTML\DefaultIcon" ""
+    ReadRegStr $1 ${RegKey} "Software\Classes\FirefoxHTML-$AppUserModelID\DefaultIcon" ""
     ${GetLongPath} "$INSTDIR\${FileMainEXE}" $2
     ${If} "$1" != "$2,1"
-      WriteRegStr ${RegKey} "Software\Classes\FirefoxHTML\DefaultIcon" "" "$2,1"
+      WriteRegStr ${RegKey} "Software\Classes\FirefoxHTML-$AppUserModelID\DefaultIcon" "" "$2,1"
     ${EndIf}
   ${EndUnless}
 !macroend
 !define FixShellIconHandler "!insertmacro FixShellIconHandler"
 
 ; Add Software\Mozilla\ registry entries (uses SHCTX).
 !macro SetAppKeys
   ; Check if this is an ESR release and if so add registry values so it is
@@ -613,17 +587,19 @@
 ; view in HKCR to check for existance of an existing association. This macro
 ; cleans affected installations by removing the HKLM and HKCU value if it is set
 ; to FirefoxHTML when there is a value for PersistentHandler or by removing the
 ; HKCU value when the HKLM value has a value other than an empty string.
 !macro FixBadFileAssociation FILE_TYPE
   ; Only delete the default value in case the key has values for OpenWithList,
   ; OpenWithProgids, PersistentHandler, etc.
   ReadRegStr $0 HKCU "Software\Classes\${FILE_TYPE}" ""
+  ${WordFind} "$0" "-" "+1{" $0
   ReadRegStr $1 HKLM "Software\Classes\${FILE_TYPE}" ""
+  ${WordFind} "$1" "-" "+1{" $1
   ReadRegStr $2 HKCR "${FILE_TYPE}\PersistentHandler" ""
   ${If} "$2" != ""
     ; Since there is a persistent handler remove FirefoxHTML as the default
     ; value from both HKCU and HKLM if it set to FirefoxHTML.
     ${If} "$0" == "FirefoxHTML"
       DeleteRegValue HKCU "Software\Classes\${FILE_TYPE}" ""
     ${EndIf}
     ${If} "$1" == "FirefoxHTML"
@@ -681,27 +657,27 @@
 !macro UpdateProtocolHandlers
   ; Store the command to open the app with an url in a register for easy access.
   ${GetLongPath} "$INSTDIR\${FileMainEXE}" $8
   StrCpy $2 "$\"$8$\" -osint -url $\"%1$\""
 
   ; Only set the file and protocol handlers if the existing one under HKCR is
   ; for this install location.
 
-  ${IsHandlerForInstallDir} "FirefoxHTML" $R9
+  ${IsHandlerForInstallDir} "FirefoxHTML-$AppUserModelID" $R9
   ${If} "$R9" == "true"
     ; An empty string is used for the 5th param because FirefoxHTML is not a
     ; protocol handler.
-    ${AddDisabledDDEHandlerValues} "FirefoxHTML" "$2" "$8,1" \
+    ${AddDisabledDDEHandlerValues} "FirefoxHTML-$AppUserModelID" "$2" "$8,1" \
                                    "${AppRegName} HTML Document" ""
   ${EndIf}
 
-  ${IsHandlerForInstallDir} "FirefoxURL" $R9
+  ${IsHandlerForInstallDir} "FirefoxURL-$AppUserModelID" $R9
   ${If} "$R9" == "true"
-    ${AddDisabledDDEHandlerValues} "FirefoxURL" "$2" "$8,1" \
+    ${AddDisabledDDEHandlerValues} "FirefoxURL-$AppUserModelID" "$2" "$8,1" \
                                    "${AppRegName} URL" "true"
   ${EndIf}
 
   ; An empty string is used for the 4th & 5th params because the following
   ; protocol handlers already have a display name and the additional keys
   ; required for a protocol handler.
   ${IsHandlerForInstallDir} "ftp" $R9
   ${If} "$R9" == "true"
@@ -766,43 +742,23 @@
   Pop $R0
 !macroend
 !define AddMaintCertKeys "!insertmacro AddMaintCertKeys"
 !endif
 
 ; Removes various registry entries for reasons noted below (does not use SHCTX).
 !macro RemoveDeprecatedKeys
   StrCpy $0 "SOFTWARE\Classes"
-  ; Remove support for launching gopher urls from the shell during install or
-  ; update if the DefaultIcon is from firefox.exe.
-  ${RegCleanAppHandler} "gopher"
-
   ; Remove support for launching chrome urls from the shell during install or
   ; update if the DefaultIcon is from firefox.exe (Bug 301073).
   ${RegCleanAppHandler} "chrome"
 
   ; Remove protocol handler registry keys added by the MS shim
   DeleteRegKey HKLM "Software\Classes\Firefox.URL"
   DeleteRegKey HKCU "Software\Classes\Firefox.URL"
-
-  ; Delete gopher from Capabilities\URLAssociations if it is present.
-  ${StrFilter} "${FileMainEXE}" "+" "" "" $R9
-  StrCpy $0 "Software\Clients\StartMenuInternet\$R9"
-  ClearErrors
-  ReadRegStr $2 HKLM "$0\Capabilities\URLAssociations" "gopher"
-  ${Unless} ${Errors}
-    DeleteRegValue HKLM "$0\Capabilities\URLAssociations" "gopher"
-  ${EndUnless}
-
-  ; Delete gopher from the user's UrlAssociations if it points to FirefoxURL.
-  StrCpy $0 "Software\Microsoft\Windows\Shell\Associations\UrlAssociations\gopher"
-  ReadRegStr $2 HKCU "$0\UserChoice" "Progid"
-  ${If} "$2" == "FirefoxURL"
-    DeleteRegKey HKCU "$0"
-  ${EndIf}
 !macroend
 !define RemoveDeprecatedKeys "!insertmacro RemoveDeprecatedKeys"
 
 ; Removes various directories and files for reasons noted below.
 !macro RemoveDeprecatedFiles
   ; Remove talkback if it is present (remove after bug 386760 is fixed)
   ${If} ${FileExists} "$INSTDIR\extensions\talkback@mozilla.org"
     RmDir /r /REBOOTOK "$INSTDIR\extensions\talkback@mozilla.org"
@@ -1196,17 +1152,17 @@
   Push $R9
   Push $R8
   Push $R7
   Push $R6
   Push "false"
 
   System::Call 'advapi32::OpenSCManagerW(n, n, i ${SC_MANAGER_ALL_ACCESS}) i.R6'
   ${If} $R6 != 0
-    ; MpsSvc is the Firewall service on Windows Vista and above.
+    ; MpsSvc is the Firewall service.
     ; When opening the service with SERVICE_QUERY_CONFIG the return value will
     ; be 0 if the service is not installed.
     System::Call 'advapi32::OpenServiceW(i R6, t "MpsSvc", i ${SERVICE_QUERY_CONFIG}) i.R7'
     ${If} $R7 != 0
       System::Call 'advapi32::CloseServiceHandle(i R7) n'
       ; Open the service with SERVICE_QUERY_CONFIG so its status can be queried.
       System::Call 'advapi32::OpenServiceW(i R6, t "MpsSvc", i ${SERVICE_QUERY_STATUS}) i.R7'
     ${Else}
@@ -1247,64 +1203,62 @@
   Exch 1
   Pop $R9
 !macroend
 !define IsFirewallSvcRunning "!insertmacro IsFirewallSvcRunning"
 !define un.IsFirewallSvcRunning "!insertmacro IsFirewallSvcRunning"
 
 ; Sets this installation as the default browser by setting the registry keys
 ; under HKEY_CURRENT_USER via registry calls and using the AppAssocReg NSIS
-; plugin for Vista and above. This is a function instead of a macro so it is
+; plugin. This is a function instead of a macro so it is
 ; easily called from an elevated instance of the binary. Since this can be
 ; called by an elevated instance logging is not performed in this function.
 Function SetAsDefaultAppUserHKCU
   ; Only set as the user's StartMenuInternet browser if the StartMenuInternet
   ; registry keys are for this install.
   ${StrFilter} "${FileMainEXE}" "+" "" "" $R9
   ClearErrors
-  ReadRegStr $0 HKCU "Software\Clients\StartMenuInternet\$R9\DefaultIcon" ""
+  ReadRegStr $0 HKCU "Software\Clients\StartMenuInternet\$R9-$AppUserModelID\DefaultIcon" ""
   ${If} ${Errors}
   ${OrIf} ${AtMostWin2008R2}
     ClearErrors
-    ReadRegStr $0 HKLM "Software\Clients\StartMenuInternet\$R9\DefaultIcon" ""
+    ReadRegStr $0 HKLM "Software\Clients\StartMenuInternet\$R9-$AppUserModelID\DefaultIcon" ""
   ${EndIf}
   ${Unless} ${Errors}
     ${GetPathFromString} "$0" $0
     ${GetParent} "$0" $0
     ${If} ${FileExists} "$0"
       ${GetLongPath} "$0" $0
       ${If} "$0" == "$INSTDIR"
-        WriteRegStr HKCU "Software\Clients\StartMenuInternet" "" "$R9"
+        WriteRegStr HKCU "Software\Clients\StartMenuInternet" "" "$R9-$AppUserModelID"
       ${EndIf}
     ${EndIf}
   ${EndUnless}
 
   SetShellVarContext current  ; Set SHCTX to the current user (e.g. HKCU)
 
   ${If} ${AtLeastWin8}
     ${SetStartMenuInternet} "HKCU"
     ${FixShellIconHandler} "HKCU"
     ${FixClassKeys} ; Does not use SHCTX
   ${EndIf}
 
   ${SetHandlers}
 
-  ${If} ${AtLeastWinVista}
-    ; Only register as the handler on Vista and above if the app registry name
-    ; exists under the RegisteredApplications registry key. The protocol and
-    ; file handlers set previously at the user level will associate this install
-    ; as the default browser.
-    ClearErrors
-    ReadRegStr $0 HKLM "Software\RegisteredApplications" "${AppRegName}"
-    ${Unless} ${Errors}
-      ; This is all protected by a user choice hash in Windows 8 so it won't
-      ; help, but it also won't hurt.
-      AppAssocReg::SetAppAsDefaultAll "${AppRegName}"
-    ${EndUnless}
-  ${EndIf}
+  ; Only register as the handler if the app registry name
+  ; exists under the RegisteredApplications registry key. The protocol and
+  ; file handlers set previously at the user level will associate this install
+  ; as the default browser.
+  ClearErrors
+  ReadRegStr $0 HKLM "Software\RegisteredApplications" "${AppRegName}-$AppUserModelID"
+  ${Unless} ${Errors}
+    ; This is all protected by a user choice hash in Windows 8 so it won't
+    ; help, but it also won't hurt.
+    AppAssocReg::SetAppAsDefaultAll "${AppRegName}-$AppUserModelID"
+  ${EndUnless}
   ${RemoveDeprecatedKeys}
   ${MigrateTaskBarShortcut}
 FunctionEnd
 
 ; Helper for updating the shortcut application model IDs.
 Function FixShortcutAppModelIDs
   ${If} ${AtLeastWin7}
   ${AndIf} "$AppUserModelID" != ""
@@ -1346,23 +1300,22 @@ Function SetAsDefaultAppUser
   ${EndIf}
 
   ; Before Win8, it is only possible to set this installation of the application
   ; as the StartMenuInternet handler if it was added to the HKLM
   ; StartMenuInternet registry keys.
   ; http://support.microsoft.com/kb/297878
 
   ; Check if this install location registered as the StartMenuInternet client
-  ${StrFilter} "${FileMainEXE}" "+" "" "" $R9
   ClearErrors
-  ReadRegStr $0 HKCU "Software\Clients\StartMenuInternet\$R9\DefaultIcon" ""
+  ReadRegStr $0 HKCU "Software\Clients\StartMenuInternet\${AppRegName}-$AppUserModelID\DefaultIcon" ""
   ${If} ${Errors}
   ${OrIf} ${AtMostWin2008R2}
     ClearErrors
-    ReadRegStr $0 HKLM "Software\Clients\StartMenuInternet\$R9\DefaultIcon" ""
+    ReadRegStr $0 HKLM "Software\Clients\StartMenuInternet\${AppRegName}-$AppUserModelID\DefaultIcon" ""
   ${EndIf}
 
   ${Unless} ${Errors}
     ${GetPathFromString} "$0" $0
     ${GetParent} "$0" $0
     ${If} ${FileExists} "$0"
       ${GetLongPath} "$0" $0
       ${If} "$0" == "$INSTDIR"
@@ -1376,18 +1329,17 @@ Function SetAsDefaultAppUser
           GetFunctionAddress $0 SetAsDefaultAppUserHKCU
           UAC::ExecCodeSegment $0
         ${EndIf}
         Return ; Nothing more needs to be done
       ${EndIf}
     ${EndIf}
   ${EndUnless}
 
-  ; The code after ElevateUAC won't be executed on Vista and above when the
-  ; user:
+  ; The code after ElevateUAC won't be executed when the user:
   ; a) is a member of the administrators group (e.g. elevation is required)
   ; b) is not a member of the administrators group and chooses to elevate
   ${ElevateUAC}
 
   ${SetStartMenuInternet} "HKLM"
 
   SetShellVarContext all  ; Set SHCTX to all users (e.g. HKLM)
 
--- a/browser/installer/windows/nsis/stub.nsi
+++ b/browser/installer/windows/nsis/stub.nsi
@@ -13,23 +13,19 @@
 !verbose 3
 
 SetDatablockOptimize on
 SetCompress off
 CRCCheck on
 
 RequestExecutionLevel user
 
-; The commands inside this ifdef require NSIS 3.0a2 or greater so the ifdef can
-; be removed after we require NSIS 3.0a2 or greater.
-!ifdef NSIS_PACKEDVERSION
-  Unicode true
-  ManifestSupportedOS all
-  ManifestDPIAware true
-!endif
+Unicode true
+ManifestSupportedOS all
+ManifestDPIAware true
 
 !addplugindir ./
 
 Var Dialog
 Var Progressbar
 Var ProgressbarMarqueeIntervalMS
 Var LabelDownloading
 Var LabelInstalling
@@ -106,16 +102,17 @@ Var DownloadRetryCount
 Var OpenedDownloadPage
 Var DownloadServerIP
 Var PostSigningData
 Var PreviousInstallDir
 Var PreviousInstallArch
 
 Var ControlHeightPX
 Var ControlRightPX
+Var ControlTopAdjustment
 
 ; Uncomment the following to prevent pinging the metrics server when testing
 ; the stub installer
 ;!define STUB_DEBUG
 
 !define StubURLVersion "v7"
 
 ; Successful install exit code
@@ -194,17 +191,17 @@ Var ControlRightPX
 ; as defined by InstallProgressFirstStep.
 !define /math InstallCleanTotalSteps ${InstallProgressFirstStep} + 1500
 
 ; Approximately 165 seconds (minus 0.2 seconds for each file that is removed)
 ; with a 100 millisecond timer and a first step of 20 as defined by
 ; InstallProgressFirstStep .
 !define /math InstallPaveOverTotalSteps ${InstallProgressFirstStep} + 1800
 
-; On Vista and above attempt to elevate Standard Users in addition to users that
+; Attempt to elevate Standard Users in addition to users that
 ; are a member of the Administrators group.
 !define NONADMIN_ELEVATE
 
 !define CONFIG_INI "config.ini"
 
 !ifndef FILE_SHARE_READ
   !define FILE_SHARE_READ 1
 !endif
@@ -347,24 +344,16 @@ Function .onInit
     StrCpy $INSTDIR "${DefaultInstDir64bit}"
   ${Else}
     StrCpy $INSTDIR "${DefaultInstDir32bit}"
   ${EndIf}
 
   ; Require elevation if the user can elevate
   ${ElevateUAC}
 
-; The commands inside this ifndef are needed prior to NSIS 3.0a2 and can be
-; removed after we require NSIS 3.0a2 or greater.
-!ifndef NSIS_PACKEDVERSION
-  ${If} ${AtLeastWinVista}
-    System::Call 'user32::SetProcessDPIAware()'
-  ${EndIf}
-!endif
-
   ; If we have any existing installation, use its location as the default
   ; path for this install, even if it's not the same architecture.
   SetRegView 32
   SetShellVarContext all ; Set SHCTX to HKLM
   ${GetSingleInstallPath} "Software\Mozilla\${BrandFullNameInternal}" $R9
 
   ${If} "$R9" == "false"
   ${AndIf} ${RunningX64}
@@ -432,21 +421,17 @@ Function .onInit
     StrCpy $CanSetAsDefault "false"
     StrCpy $CheckboxSetAsDefault "0"
   ${Else}
     DeleteRegValue HKLM "Software\Mozilla" "${BrandShortName}InstallerTest"
     StrCpy $CanSetAsDefault "true"
   ${EndIf}
 
   ; The interval in MS used for the progress bars set as marquee.
-  ${If} ${AtLeastWinVista}
-    StrCpy $ProgressbarMarqueeIntervalMS "10"
-  ${Else}
-    StrCpy $ProgressbarMarqueeIntervalMS "50"
-  ${EndIf}
+  StrCpy $ProgressbarMarqueeIntervalMS "10"
 
   ; Initialize the majority of variables except those that need to be reset
   ; when a page is displayed.
   StrCpy $IntroPhaseSeconds "0"
   StrCpy $OptionsPhaseSeconds "0"
   StrCpy $EndPreInstallPhaseTickCount "0"
   StrCpy $EndInstallPhaseTickCount "0"
   StrCpy $InitialInstallRequirementsCode ""
@@ -680,46 +665,35 @@ Function SendPing
           StrCpy $R2 "0"
         ${EndIf}
       ${EndIf}
     ${Else}
       StrCpy $R2 "0" ; Firefox is not set as default.
     ${EndIf}
 
     ${If} "$R2" == "0"
-    ${AndIf} ${AtLeastWinVista}
-      ; Check to see if this install location is currently set as the default
-      ; browser by Default Programs which is only available on Vista and above.
-      ClearErrors
-      ReadRegStr $R3 HKLM "Software\RegisteredApplications" "${AppRegName}"
-      ${Unless} ${Errors}
-        AppAssocReg::QueryAppIsDefaultAll "${AppRegName}" "effective"
-        Pop $R3
-        ${If} $R3 == "1"
-          StrCpy $R3 ""
-          ReadRegStr $R2 HKLM "Software\Classes\http\shell\open\command" ""
-          ${If} $R2 != ""
-            ${GetPathFromString} "$R2" $R2
-            ${GetParent} "$R2" $R3
-            ${GetLongPath} "$R3" $R3
-            ${If} $R3 == $INSTDIR
-              StrCpy $R2 "1" ; This Firefox install is set as default.
-            ${Else}
-              StrCpy $R2 "$R2" "" -11 # length of firefox.exe
-              ${If} "$R2" == "${FileMainEXE}"
-                StrCpy $R2 "2" ; Another Firefox install is set as default.
-              ${Else}
-                StrCpy $R2 "0"
-              ${EndIf}
-            ${EndIf}
+      StrCpy $R3 ""
+      ReadRegStr $R2 HKLM "Software\Classes\http\shell\open\command" ""
+      ${If} $R2 != ""
+        ${GetPathFromString} "$R2" $R2
+        ${GetParent} "$R2" $R3
+        ${GetLongPath} "$R3" $R3
+        ${If} $R3 == $INSTDIR
+          StrCpy $R2 "1" ; This Firefox install is set as default.
+        ${Else}
+          StrCpy $R2 "$R2" "" -11 # length of firefox.exe
+          ${If} "$R2" == "${FileMainEXE}"
+            StrCpy $R2 "2" ; Another Firefox install is set as default.
           ${Else}
-            StrCpy $R2 "0" ; Firefox is not set as default.
+            StrCpy $R2 "0"
           ${EndIf}
         ${EndIf}
-      ${EndUnless}
+      ${Else}
+        StrCpy $R2 "0" ; Firefox is not set as default.
+      ${EndIf}
     ${EndIf}
 
     ${If} $CanSetAsDefault == "true"
       ${If} $CheckboxSetAsDefault == "1"
         StrCpy $R3 "2"
       ${Else}
         StrCpy $R3 "3"
       ${EndIf}
@@ -924,16 +898,17 @@ Function createOptions
   ${If} "$WasOptionsButtonClicked" != "1"
     ${If} "$CanWriteToInstallDir" == "true"
     ${AndIf} "$HasRequiredSpaceAvailable" == "true"
       Abort ; Skip the options page
     ${EndIf}
   ${EndIf}
 
   StrCpy $ExistingTopDir ""
+  StrCpy $ControlTopAdjustment 0
 
   nsDialogs::Create /NOUNLOAD 1018
   Pop $Dialog
   ; Since the text color for controls is set in this Dialog the foreground and
   ; background colors of the Dialog must also be hardcoded.
   SetCtlColors $Dialog ${COMMON_TEXT_COLOR_NORMAL} ${COMMON_BKGRD_COLOR}
 
   ${NSD_CreateLabel} ${OPTIONS_ITEM_EDGE_DU} 25u ${OPTIONS_ITEM_WIDTH_DU} \
@@ -1014,70 +989,90 @@ Function createOptions
 
   Call UpdateFreeSpaceLabel
 
   ${If} ${AtLeastWin7}
     StrCpy $0 "$(ADD_SC_DESKTOP_TASKBAR)"
   ${Else}
     StrCpy $0 "$(ADD_SC_DESKTOP_QUICKLAUNCHBAR)"
   ${EndIf}
+
+  ; In some locales, this string may be too long to fit on one line.
+  ; In that case, we'll need to give the control two lines worth of height.
+  StrCpy $1 12 ; single line height
+  ${GetTextExtent} $0 $FontNormal $R1 $R2
+  ${If} $R1 > ${OPTIONS_ITEM_WIDTH_DU}
+    ; Add a second line to the control height.
+    IntOp $1 $1 + 12
+    ; The rest of the controls will have to be lower to account for this label
+    ; needing two lines worth of height.
+    IntOp $ControlTopAdjustment $ControlTopAdjustment + 12
+  ${EndIf}
   ${NSD_CreateCheckbox} ${OPTIONS_ITEM_EDGE_DU} 100u \
-                        ${OPTIONS_ITEM_WIDTH_DU} 12u "$0"
+                        ${OPTIONS_ITEM_WIDTH_DU} "$1u" "$0"
   Pop $CheckboxShortcuts
   ; The uxtheme must be disabled on checkboxes in order to override the system
   ; font color.
   System::Call 'uxtheme::SetWindowTheme(i $CheckboxShortcuts, w " ", w " ")'
   SetCtlColors $CheckboxShortcuts ${COMMON_TEXT_COLOR_NORMAL} ${COMMON_BKGRD_COLOR}
   SendMessage $CheckboxShortcuts ${WM_SETFONT} $FontNormal 0
   ${NSD_Check} $CheckboxShortcuts
 
-  ${NSD_CreateCheckbox} ${OPTIONS_ITEM_EDGE_DU} 116u ${OPTIONS_SUBITEM_WIDTH_DU} \
-                        12u "$(SEND_PING)"
+  IntOp $0 116 + $ControlTopAdjustment
+  ; In some locales, this string may be too long to fit on one line.
+  ; In that case, we'll need to give the control two lines worth of height.
+  StrCpy $1 12 ; single line height
+  ${GetTextExtent} "$(SEND_PING)" $FontNormal $R1 $R2
+  ${If} $R1 > ${OPTIONS_ITEM_WIDTH_DU}
+    ; Add a second line to the control height.
+    IntOp $1 $1 + 12
+    ; The rest of the controls will have to be lower to account for this label
+    ; needing two lines worth of height.
+    IntOp $ControlTopAdjustment $ControlTopAdjustment + 12
+  ${EndIf}
+  ${NSD_CreateCheckbox} ${OPTIONS_ITEM_EDGE_DU} "$0u" ${OPTIONS_SUBITEM_WIDTH_DU} \
+                        "$1u" "$(SEND_PING)"
   Pop $CheckboxSendPing
   ; The uxtheme must be disabled on checkboxes in order to override the system
   ; font color.
   System::Call 'uxtheme::SetWindowTheme(i $CheckboxSendPing, w " ", w " ")'
   SetCtlColors $CheckboxSendPing ${COMMON_TEXT_COLOR_NORMAL} ${COMMON_BKGRD_COLOR}
   SendMessage $CheckboxSendPing ${WM_SETFONT} $FontNormal 0
   ${NSD_Check} $CheckboxSendPing
 
 !ifdef MOZ_MAINTENANCE_SERVICE
   StrCpy $CheckboxInstallMaintSvc "0"
   ; We can only install the maintenance service if the user is an admin.
   Call IsUserAdmin
   Pop $0
 
-  ; Only show the maintenance service checkbox if we're on XP SP3 or higher;
-  ;  we don't ever want to install it on XP without at least SP3 installed.
-  ${If} $0 == "true"
-  ${AndIf} ${IsWinXP}
-  ${AndIf} ${AtMostServicePack} 2
-    StrCpy $0 "false"
-  ${EndIf}
-
   ${If} $0 == "true"
     ; Only show the maintenance service checkbox if we have write access to HKLM
     DeleteRegValue HKLM "Software\Mozilla" "${BrandShortName}InstallerTest"
     ClearErrors
     WriteRegStr HKLM "Software\Mozilla" "${BrandShortName}InstallerTest" \
                      "Write Test"
     ${IfNot} ${Errors}
       DeleteRegValue HKLM "Software\Mozilla" "${BrandShortName}InstallerTest"
       ; Read the registry instead of using ServicesHelper::IsInstalled so the
       ; plugin isn't included in the stub installer to lessen its size.
       ClearErrors
       ReadRegStr $0 HKLM "SYSTEM\CurrentControlSet\services\MozillaMaintenance" "ImagePath"
       ${If} ${Errors}
-        ${NSD_CreateCheckbox} ${OPTIONS_ITEM_EDGE_DU} 132u ${OPTIONS_ITEM_WIDTH_DU} \
+        IntOp $0 132 + $ControlTopAdjustment
+        ${NSD_CreateCheckbox} ${OPTIONS_ITEM_EDGE_DU} "$0u" ${OPTIONS_ITEM_WIDTH_DU} \
                               12u "$(INSTALL_MAINT_SERVICE)"
         Pop $CheckboxInstallMaintSvc
         System::Call 'uxtheme::SetWindowTheme(i $CheckboxInstallMaintSvc, w " ", w " ")'
         SetCtlColors $CheckboxInstallMaintSvc ${COMMON_TEXT_COLOR_NORMAL} ${COMMON_BKGRD_COLOR}
         SendMessage $CheckboxInstallMaintSvc ${WM_SETFONT} $FontNormal 0
         ${NSD_Check} $CheckboxInstallMaintSvc
+        ; Since we're adding in an optional control, remember the lower the ones
+        ; that come after it.
+        IntOp $ControlTopAdjustment 20 + $ControlTopAdjustment
       ${EndIf}
     ${EndIf}
   ${EndIf}
 !endif
 
   ${If} ${RunningX64}
     ; Get the exact pixel width we're going to need for this label.
     ; The label string has a keyboard accelerator, which is an '&' that's in
@@ -1094,21 +1089,18 @@ Function createOptions
       StrCpy $R4 $R0 1
       ${If} $R4 == "&"
         StrCpy $R1 "$R1&"
         StrCpy $R0 $R0 "" 1
       ${EndIf}
     ${LoopUntil} $R0 == ""
 
     ${GetTextExtent} $R1 $FontNormal $R0 $R1
-    ${If} $CheckboxInstallMaintSvc == "0"
-      ${NSD_CreateLabel} ${OPTIONS_ITEM_EDGE_DU} 134u $R0 $R1 "$(ARCH_DROPLIST_LABEL)"
-    ${Else}
-      ${NSD_CreateLabel} ${OPTIONS_ITEM_EDGE_DU} 154u $R0 $R1 "$(ARCH_DROPLIST_LABEL)"
-    ${EndIf}
+    IntOp $0 134 + $ControlTopAdjustment
+    ${NSD_CreateLabel} ${OPTIONS_ITEM_EDGE_DU} "$0u" $R0 $R1 "$(ARCH_DROPLIST_LABEL)"
     Pop $0
     SetCtlColors $0 ${COMMON_TEXT_COLOR_NORMAL} ${COMMON_BKGRD_COLOR}
     SendMessage $0 ${WM_SETFONT} $FontNormal 0
 
     ; Set the dropdown list size to the same as the larger of the two options.
     ${GetTextExtent} "$(VERSION_32BIT)" $FontNormal $R0 $R1
     ${GetTextExtent} "$(VERSION_64BIT)" $FontNormal $R2 $R3
     ${If} $R0 < $R2
@@ -1121,35 +1113,27 @@ Function createOptions
     ; on he system display scaling setting, which we cannot easily determine,
     ; so just use a value that works fine for a setting of 200% and adds a
     ; little too much padding for settings below that.
     IntOp $R0 $R0 + 56
 
     ; Put the droplist right after the label, with some padding.
     ${GetDlgItemEndPX} $0 $ControlRightPX
     IntOp $ControlRightPX $ControlRightPX + 4
-    ${If} $CheckboxInstallMaintSvc == "0"
-      ${NSD_CreateDropList} $ControlRightPX 132u $R0 $R3 ""
-    ${Else}
-      ${NSD_CreateDropList} $ControlRightPX 152u $R0 $R3 ""
-    ${EndIf}
+    IntOp $0 132 + $ControlTopAdjustment
+    ${NSD_CreateDropList} $ControlRightPX "$0u" $R0 $R3 ""
     Pop $DroplistArch
     ${NSD_CB_AddString} $DroplistArch "$(VERSION_32BIT)"
     ${NSD_CB_AddString} $DroplistArch "$(VERSION_64BIT)"
     ${NSD_OnChange} $DroplistArch OnChange_DroplistArch
     ; The uxtheme must be disabled in order to override the system colors.
     System::Call 'uxtheme::SetWindowTheme(i $DroplistArch, w " ", w " ")'
     SetCtlColors $DroplistArch ${COMMON_TEXT_COLOR_NORMAL} ${COMMON_BKGRD_COLOR}
     SendMessage $DroplistArch ${WM_SETFONT} $FontNormal 0
-
-    ${If} ${RunningX64}
-      ${NSD_CB_SelectString} $DroplistArch "$(VERSION_64BIT)"
-    ${Else}
-      ${NSD_CB_SelectString} $DroplistArch "$(VERSION_32BIT)"
-    ${EndIf}
+    ${NSD_CB_SelectString} $DroplistArch "$(VERSION_64BIT)"
   ${EndIf}
 
   GetDlgItem $0 $HWNDPARENT 1 ; Install button
   ${If} ${FileExists} "$INSTDIR\${FileMainEXE}"
     SendMessage $0 ${WM_SETTEXT} 0 "STR:$(UPGRADE_BUTTON)"
   ${Else}
     SendMessage $0 ${WM_SETTEXT} 0 "STR:$(INSTALL_BUTTON)"
   ${EndIf}
@@ -1790,25 +1774,23 @@ Function FinishInstall
   Call SetProgressBars
 
   ${If} "$CheckboxSetAsDefault" == "1"
     ; NB: this code is duplicated in installer.nsi. Please keep in sync.
     ; For data migration in the app, we want to know what the default browser
     ; value was before we changed it. To do so, we read it here and store it
     ; in our own registry key.
     StrCpy $0 ""
-    ${If} ${AtLeastWinVista}
-      AppAssocReg::QueryCurrentDefault "http" "protocol" "effective"
-      Pop $1
-      ; If the method hasn't failed, $1 will contain the progid. Check:
-      ${If} "$1" != "method failed"
-      ${AndIf} "$1" != "method not available"
-        ; Read the actual command from the progid
-        ReadRegStr $0 HKCR "$1\shell\open\command" ""
-      ${EndIf}
+    AppAssocReg::QueryCurrentDefault "http" "protocol" "effective"
+    Pop $1
+    ; If the method hasn't failed, $1 will contain the progid. Check:
+    ${If} "$1" != "method failed"
+    ${AndIf} "$1" != "method not available"
+      ; Read the actual command from the progid
+      ReadRegStr $0 HKCR "$1\shell\open\command" ""
     ${EndIf}
     ; If using the App Association Registry didn't happen or failed, fall back
     ; to the effective http default:
     ${If} "$0" == ""
       ReadRegStr $0 HKCR "http\shell\open\command" ""
     ${EndIf}
     ; If we have something other than empty string now, write the value.
     ${If} "$0" != ""
@@ -1822,31 +1804,16 @@ Function FinishInstall
     ${If} ${Errors} ; Not elevated
       Call ExecSetAsDefaultAppUser
     ${Else} ; Elevated - execute the function in the unelevated process
       GetFunctionAddress $0 ExecSetAsDefaultAppUser
       UAC::ExecCodeSegment $0
     ${EndIf}
   ${EndIf}
 
-  ${If} $CheckboxShortcuts == 1
-    ${If} ${AtMostWinVista}
-      ClearErrors
-      ${GetParameters} $0
-      ClearErrors
-      ${GetOptions} "$0" "/UAC:" $0
-      ${If} ${Errors}
-        Call AddQuickLaunchShortcut
-      ${Else}
-        GetFunctionAddress $0 AddQuickLaunchShortcut
-        UAC::ExecCodeSegment $0
-      ${EndIf}
-    ${EndIf}
-  ${EndIf}
-
   ${If} ${FileExists} "$INSTDIR\${FileMainEXE}.moz-upgrade"
     Delete "$INSTDIR\${FileMainEXE}"
     Rename "$INSTDIR\${FileMainEXE}.moz-upgrade" "$INSTDIR\${FileMainEXE}"
   ${EndIf}
 
   StrCpy $ExitCode "${ERR_SUCCESS}"
 
   StrCpy $InstallCounterStep 0
@@ -2061,24 +2028,16 @@ Function CanWrite
     ${If} ${FileExists} "$3"
       Delete "$3"
       StrCpy $CanWriteToInstallDir "true"
     ${EndIf}
     RmDir "$2"
   ${EndIf}
 FunctionEnd
 
-Function AddQuickLaunchShortcut
-  CreateShortCut "$QUICKLAUNCH\${BrandFullName}.lnk" "$INSTDIR\${FileMainEXE}"
-  ${If} ${FileExists} "$QUICKLAUNCH\${BrandFullName}.lnk"
-    ShellLink::SetShortCutWorkingDirectory "$QUICKLAUNCH\${BrandFullName}.lnk" \
-                                           "$INSTDIR"
-  ${EndIf}
-FunctionEnd
-
 Function ExecSetAsDefaultAppUser
   ; Using the helper.exe lessens the stub installer size.
   ; This could ask for elevatation when the user doesn't install as admin.
   Exec "$\"$INSTDIR\uninstall\helper.exe$\" /SetAsDefaultAppUser"
 FunctionEnd
 
 Function LaunchApp
 !ifndef DEV_EDITION
--- a/browser/installer/windows/nsis/uninstaller.nsi
+++ b/browser/installer/windows/nsis/uninstaller.nsi
@@ -14,27 +14,23 @@
 ; 7-Zip provides better compression than the lzma from NSIS so we add the files
 ; uncompressed and use 7-Zip to create a SFX archive of it
 SetDatablockOptimize on
 SetCompress off
 CRCCheck on
 
 RequestExecutionLevel user
 
-; The commands inside this ifdef require NSIS 3.0a2 or greater so the ifdef can
-; be removed after we require NSIS 3.0a2 or greater.
-!ifdef NSIS_PACKEDVERSION
-  Unicode true
-  ManifestSupportedOS all
-  ManifestDPIAware true
-!endif
+Unicode true
+ManifestSupportedOS all
+ManifestDPIAware true
 
 !addplugindir ./
 
-; On Vista and above attempt to elevate Standard Users in addition to users that
+; Attempt to elevate Standard Users in addition to users that
 ; are a member of the Administrators group.
 !define NONADMIN_ELEVATE
 
 ; prevents compiling of the reg write logging.
 !define NO_LOG
 
 !define MaintUninstallKey \
  "Software\Microsoft\Windows\CurrentVersion\Uninstall\MozillaMaintenanceService"
@@ -166,17 +162,17 @@ UninstPage custom un.preConfirm
 
 ; Use the default dialog for IDD_VERIFY for a simple Banner
 ChangeUI IDD_VERIFY "${NSISDIR}\Contrib\UIs\default.exe"
 
 ################################################################################
 # Helper Functions
 
 ; This function is used to uninstall the maintenance service if the
-; application currently being uninstalled is the last application to use the 
+; application currently being uninstalled is the last application to use the
 ; maintenance service.
 Function un.UninstallServiceIfNotUsed
   ; $0 will store if a subkey exists
   ; $1 will store the first subkey if it exists or an empty string if it doesn't
   ; Backup the old values
   Push $0
   Push $1
 
@@ -194,27 +190,37 @@ Function un.UninstallServiceIfNotUsed
     ${EndIf}
     IntOp $0 $0 + 1
   ${Loop}
 
   ; Restore back the registry view
   ${If} ${RunningX64}
     SetRegView lastUsed
   ${EndIf}
+
   ${If} $0 == 0
-    ; Get the path of the maintenance service uninstaller
+    ; Get the path of the maintenance service uninstaller.
+    ; Look in both the 32-bit and 64-bit registry views.
+    SetRegView 32
     ReadRegStr $1 HKLM ${MaintUninstallKey} "UninstallString"
+    SetRegView lastused
+
+    ${If} $1 == ""
+    ${AndIf} ${RunningX64}
+      SetRegView 64
+      ReadRegStr $1 HKLM ${MaintUninstallKey} "UninstallString"
+      SetRegView lastused
+    ${EndIf}
 
     ; If the uninstall string does not exist, skip executing it
-    StrCmp $1 "" doneUninstall
-
-    ; $1 is already a quoted string pointing to the install path
-    ; so we're already protected against paths with spaces
-    nsExec::Exec "$1 /S"
-doneUninstall:
+    ${If} $1 != ""
+      ; $1 is already a quoted string pointing to the install path
+      ; so we're already protected against paths with spaces
+      nsExec::Exec "$1 /S"
+    ${EndIf}
   ${EndIf}
 
   ; Restore the old value of $1 and $0
   Pop $1
   Pop $0
 FunctionEnd
 
 ################################################################################
@@ -252,17 +258,17 @@ Section "Uninstall"
   ${un.DeleteShortcuts}
 
   ; Unregister resources associated with Win7 taskbar jump lists.
   ${If} ${AtLeastWin7}
   ${AndIf} "$AppUserModelID" != ""
     ApplicationID::UninstallJumpLists "$AppUserModelID"
   ${EndIf}
 
-  ; Remove the updates directory for Vista and above
+  ; Remove the updates directory
   ${un.CleanUpdateDirectories} "Mozilla\Firefox" "Mozilla\updates"
 
   ; Remove any app model id's stored in the registry for this install path
   DeleteRegValue HKCU "Software\Mozilla\${AppName}\TaskBarIDs" "$INSTDIR"
   DeleteRegValue HKLM "Software\Mozilla\${AppName}\TaskBarIDs" "$INSTDIR"
 
   ClearErrors
   WriteRegStr HKLM "Software\Mozilla" "${BrandShortName}InstallerTest" "Write Test"
@@ -273,76 +279,63 @@ Section "Uninstall"
     DeleteRegValue HKLM "Software\Mozilla" "${BrandShortName}InstallerTest"
     StrCpy $TmpVal "HKLM" ; used primarily for logging
     ${un.RegCleanMain} "Software\Mozilla"
     ${un.RegCleanUninstall}
     ${un.DeleteShortcuts}
     ${un.SetAppLSPCategories}
   ${EndIf}
 
-  ${un.RegCleanAppHandler} "FirefoxURL"
-  ${un.RegCleanAppHandler} "FirefoxHTML"
+  ${un.RegCleanAppHandler} "FirefoxURL-$AppUserModelID"
+  ${un.RegCleanAppHandler} "FirefoxHTML-$AppUserModelID"
   ${un.RegCleanProtocolHandler} "ftp"
   ${un.RegCleanProtocolHandler} "http"
   ${un.RegCleanProtocolHandler} "https"
-
-  ClearErrors
-  ReadRegStr $R9 HKCR "FirefoxHTML" ""
-  ; Don't clean up the file handlers if the FirefoxHTML key still exists since
-  ; there should be a second installation that may be the default file handler
-  ${If} ${Errors}
-    ${un.RegCleanFileHandler}  ".htm"   "FirefoxHTML"
-    ${un.RegCleanFileHandler}  ".html"  "FirefoxHTML"
-    ${un.RegCleanFileHandler}  ".shtml" "FirefoxHTML"
-    ${un.RegCleanFileHandler}  ".xht"   "FirefoxHTML"
-    ${un.RegCleanFileHandler}  ".xhtml" "FirefoxHTML"
-    ${un.RegCleanFileHandler}  ".oga"  "FirefoxHTML"
-    ${un.RegCleanFileHandler}  ".ogg"  "FirefoxHTML"
-    ${un.RegCleanFileHandler}  ".ogv"  "FirefoxHTML"
-    ${un.RegCleanFileHandler}  ".pdf"  "FirefoxHTML"
-    ${un.RegCleanFileHandler}  ".webm"  "FirefoxHTML"
-  ${EndIf}
+  ${un.RegCleanFileHandler}  ".htm"   "FirefoxHTML-$AppUserModelID"
+  ${un.RegCleanFileHandler}  ".html"  "FirefoxHTML-$AppUserModelID"
+  ${un.RegCleanFileHandler}  ".shtml" "FirefoxHTML-$AppUserModelID"
+  ${un.RegCleanFileHandler}  ".xht"   "FirefoxHTML-$AppUserModelID"
+  ${un.RegCleanFileHandler}  ".xhtml" "FirefoxHTML-$AppUserModelID"
+  ${un.RegCleanFileHandler}  ".oga"  "FirefoxHTML-$AppUserModelID"
+  ${un.RegCleanFileHandler}  ".ogg"  "FirefoxHTML-$AppUserModelID"
+  ${un.RegCleanFileHandler}  ".ogv"  "FirefoxHTML-$AppUserModelID"
+  ${un.RegCleanFileHandler}  ".pdf"  "FirefoxHTML-$AppUserModelID"
+  ${un.RegCleanFileHandler}  ".webm"  "FirefoxHTML-$AppUserModelID"
 
   SetShellVarContext all  ; Set SHCTX to HKLM
   ${un.GetSecondInstallPath} "Software\Mozilla" $R9
   ${If} $R9 == "false"
     SetShellVarContext current  ; Set SHCTX to HKCU
     ${un.GetSecondInstallPath} "Software\Mozilla" $R9
   ${EndIf}
 
-  StrCpy $0 "Software\Clients\StartMenuInternet\${FileMainEXE}\shell\open\command"
-  ReadRegStr $R1 HKLM "$0" ""
-  ${un.RemoveQuotesFromPath} "$R1" $R1
-  ${un.GetParent} "$R1" $R1
+  DeleteRegKey HKLM "Software\Clients\StartMenuInternet\${AppRegName}-$AppUserModelID"
+  DeleteRegValue HKLM "Software\RegisteredApplications" "${AppRegName}-$AppUserModelID"
+
+  DeleteRegKey HKCU "Software\Clients\StartMenuInternet\${AppRegName}-$AppUserModelID"
+  DeleteRegValue HKCU "Software\RegisteredApplications" "${AppRegName}-$AppUserModelID"
 
-  ; Only remove the StartMenuInternet key if it refers to this install location.
-  ; The StartMenuInternet registry key is independent of the default browser
-  ; settings. The XPInstall base un-installer always removes this key if it is
-  ; uninstalling the default browser and it will always replace the keys when
-  ; installing even if there is another install of Firefox that is set as the
-  ; default browser. Now the key is always updated on install but it is only
-  ; removed if it refers to this install location.
-  ${If} "$INSTDIR" == "$R1"
-    DeleteRegKey HKLM "Software\Clients\StartMenuInternet\${FileMainEXE}"
+  ; Remove old protocol handler and StartMenuInternet keys without install path
+  ; hashes, but only if they're for this installation.
+  ReadRegStr $0 HKLM "Software\Classes\FirefoxHTML\DefaultIcon" ""
+  StrCpy $0 $0 -2
+  ${If} $0 == "$INSTDIR\${FileMainEXE}"
+    DeleteRegKey HKLM "Software\Classes\FirefoxHTML"
+    DeleteRegKey HKLM "Software\Classes\FirefoxURL"
+    ${StrFilter} "${FileMainEXE}" "+" "" "" $R9
+    DeleteRegKey HKLM "Software\Clients\StartMenuInternet\$R9"
     DeleteRegValue HKLM "Software\RegisteredApplications" "${AppRegName}"
   ${EndIf}
-
-  ReadRegStr $R1 HKCU "$0" ""
-  ${un.RemoveQuotesFromPath} "$R1" $R1
-  ${un.GetParent} "$R1" $R1
-
-  ; Only remove the StartMenuInternet key if it refers to this install location.
-  ; The StartMenuInternet registry key is independent of the default browser
-  ; settings. The XPInstall base un-installer always removes this key if it is
-  ; uninstalling the default browser and it will always replace the keys when
-  ; installing even if there is another install of Firefox that is set as the
-  ; default browser. Now the key is always updated on install but it is only
-  ; removed if it refers to this install location.
-  ${If} "$INSTDIR" == "$R1"
-    DeleteRegKey HKCU "Software\Clients\StartMenuInternet\${FileMainEXE}"
+  ReadRegStr $0 HKCU "Software\Classes\FirefoxHTML\DefaultIcon" ""
+  StrCpy $0 $0 -2
+  ${If} $0 == "$INSTDIR\${FileMainEXE}"
+    DeleteRegKey HKCU "Software\Classes\FirefoxHTML"
+    DeleteRegKey HKCU "Software\Classes\FirefoxURL"
+    ${StrFilter} "${FileMainEXE}" "+" "" "" $R9
+    DeleteRegKey HKCU "Software\Clients\StartMenuInternet\$R9"
     DeleteRegValue HKCU "Software\RegisteredApplications" "${AppRegName}"
   ${EndIf}
 
   StrCpy $0 "Software\Microsoft\Windows\CurrentVersion\App Paths\${FileMainEXE}"
   ${If} $R9 == "false"
     DeleteRegKey HKLM "$0"
     DeleteRegKey HKCU "$0"
     StrCpy $0 "Software\Microsoft\MediaPlayer\ShimInclusionList\${FileMainEXE}"
@@ -602,24 +595,16 @@ Function un.onInit
   ; Remove the current exe directory from the search order.
   ; This only effects LoadLibrary calls and not implicitly loaded DLLs.
   System::Call 'kernel32::SetDllDirectoryW(w "")'
 
   StrCpy $LANGUAGE 0
 
   ${un.UninstallUnOnInitCommon}
 
-; The commands inside this ifndef are needed prior to NSIS 3.0a2 and can be
-; removed after we require NSIS 3.0a2 or greater.
-!ifndef NSIS_PACKEDVERSION
-  ${If} ${AtLeastWinVista}
-    System::Call 'user32::SetProcessDPIAware()'
-  ${EndIf}
-!endif
-
   !insertmacro InitInstallOptionsFile "unconfirm.ini"
 FunctionEnd
 
 Function .onGUIEnd
   ${OnEndCommon}
 FunctionEnd
 
 Function un.onGUIEnd
--- a/browser/modules/E10SUtils.jsm
+++ b/browser/modules/E10SUtils.jsm
@@ -66,19 +66,21 @@ this.E10SUtils = {
       aURL = "about:blank";
     }
 
     // Javascript urls can load in any process, they apply to the current document
     if (aURL.startsWith("javascript:")) {
       return aPreferredRemoteType;
     }
 
-    // We need data: URIs to load in any remote process, because some of our
-    // tests rely on this.
-    if (aURL.startsWith("data:")) {
+    // We need data: URI's to load in a remote process, because some of our
+    // tests rely on this. For blob: URI's, load them in their originating
+    // process unless it is non-remote. In that case, favor a remote (sandboxed)
+    // process with fewer privileges to limit exposure.
+    if (aURL.startsWith("data:") || aURL.startsWith("blob:")) {
       return aPreferredRemoteType == NOT_REMOTE ? DEFAULT_REMOTE_TYPE
                                                 : aPreferredRemoteType;
     }
 
     if (aURL.startsWith("file:")) {
       return Services.prefs.getBoolPref("browser.tabs.remote.separateFileUriProcess")
              ? FILE_REMOTE_TYPE : DEFAULT_REMOTE_TYPE;
     }
@@ -152,37 +154,39 @@ this.E10SUtils = {
     return remoteType == this.getRemoteTypeForURI(aURI.spec, true, remoteType);
   },
 
   shouldLoadURI(aDocShell, aURI, aReferrer) {
     // Inner frames should always load in the current process
     if (aDocShell.QueryInterface(Ci.nsIDocShellTreeItem).sameTypeParent)
       return true;
 
-    // If we are in a fresh process, and it wouldn't be content visible to
-    // change processes, we want to load into a new process so that we can throw
+    // If we are in a Large-Allocation process, and it wouldn't be content visible
+    // to change processes, we want to load into a new process so that we can throw
     // this one out.
-    if (aDocShell.inFreshProcess && aDocShell.isOnlyToplevelInTabGroup) {
+    if (aDocShell.inLargeAllocProcess &&
+        !aDocShell.awaitingLargeAlloc &&
+        aDocShell.isOnlyToplevelInTabGroup) {
       return false;
     }
 
     // If the URI can be loaded in the current process then continue
     return this.shouldLoadURIInThisProcess(aURI);
   },
 
-  redirectLoad(aDocShell, aURI, aReferrer, aTriggeringPrincipal, aFreshProcess) {
+  redirectLoad(aDocShell, aURI, aReferrer, aTriggeringPrincipal, aFreshProcess, aFlags) {
     // Retarget the load to the correct process
     let messageManager = aDocShell.QueryInterface(Ci.nsIInterfaceRequestor)
                                   .getInterface(Ci.nsIContentFrameMessageManager);
     let sessionHistory = aDocShell.getInterface(Ci.nsIWebNavigation).sessionHistory;
 
     messageManager.sendAsyncMessage("Browser:LoadURI", {
       loadOptions: {
         uri: aURI.spec,
-        flags: Ci.nsIWebNavigation.LOAD_FLAGS_NONE,
+        flags: aFlags || Ci.nsIWebNavigation.LOAD_FLAGS_NONE,
         referrer: aReferrer ? aReferrer.spec : null,
         triggeringPrincipal: aTriggeringPrincipal
                              ? Utils.serializePrincipal(aTriggeringPrincipal)
                              : null,
         reloadInFreshProcess: !!aFreshProcess,
       },
       historyIndex: sessionHistory.requestedIndex,
     });
--- a/build/windows_toolchain.py
+++ b/build/windows_toolchain.py
@@ -145,26 +145,24 @@ def resolve_files():
     """Resolve the files that constitute a standalone toolchain.
 
     This is a generator of (dest path, file) where the destination
     path is relative and the file instance is a BaseFile from mozpack.
     """
     vs_path, sdk_path = find_vs_paths()
 
     for entry in VS_PATTERNS:
-        finder = FileFinder(vs_path, find_executables=False,
-                            ignore=entry.get('ignore', []))
+        finder = FileFinder(vs_path, ignore=entry.get('ignore', []))
         for p, f in finder.find(entry['pattern']):
             assert p.startswith(('VC/', 'DIA SDK/'))
 
             yield p.encode('utf-8'), f
 
     for entry in SDK_PATTERNS:
-        finder = FileFinder(sdk_path, find_executables=False,
-                            ignore=entry.get('ignore', []))
+        finder = FileFinder(sdk_path, ignore=entry.get('ignore', []))
         for p, f in finder.find(entry['pattern']):
             relpath = 'SDK/%s' % p
 
             yield relpath.encode('utf-8'), f
 
 
 def resolve_files_and_hash(manifest):
     """Resolve files and hash their data.
--- a/config/tests/test_mozbuild_reading.py
+++ b/config/tests/test_mozbuild_reading.py
@@ -84,18 +84,17 @@ class TestMozbuildReading(unittest.TestC
 
         if config.substs['MOZ_BUILD_APP'] == 'js':
             raise unittest.SkipTest('failing in Spidermonkey builds')
 
         reader = BuildReader(config)
         all_paths = self._mozbuilds(reader)
         _, contexts = reader.read_relevant_mozbuilds(all_paths)
 
-        finder = FileFinder(config.topsrcdir, find_executables=False,
-                            ignore=['obj*'])
+        finder = FileFinder(config.topsrcdir, ignore=['obj*'])
 
         def pattern_exists(pat):
             return [p for p in finder.find(pat)] != []
 
         for ctx in contexts:
             if not isinstance(ctx, Files):
                 continue
             relsrcdir = ctx.relsrcdir
--- a/devtools/client/framework/connect/connect.css
+++ b/devtools/client/framework/connect/connect.css
@@ -37,17 +37,21 @@ label {
 label > span {
   display: inline-block;
   min-width: 150px;
   text-align: end;
   margin-inline-end: 10px;
 }
 
 #submit {
-  float: inline-end;
+  float: right;
+}
+
+#submit:dir(rtl) {
+  float: left;
 }
 
 input {
   direction: ltr;
 }
 
 input:invalid {
   box-shadow: 0 0 2px 2px #F06;
--- a/devtools/client/framework/options-panel.css
+++ b/devtools/client/framework/options-panel.css
@@ -10,17 +10,21 @@
 }
 
 #options-panel {
   display: block;
 }
 
 .options-vertical-pane {
   display: inline;
-  float: inline-start;
+  float: left;
+}
+
+.options-vertical-pane:dir(rtl) {
+  float: right;
 }
 
 .options-vertical-pane {
   margin: 5px;
   width: calc(100%/3 - 10px);
   min-width: 320px;
   padding-inline-start: 5px;
   box-sizing: border-box;
@@ -101,12 +105,17 @@
 #devtools-sourceeditor-keybinding-select {
   min-width: 130px;
 }
 
 #devtools-sourceeditor-tabsize-select {
   min-width: 80px;
 }
 
+#screenshot-icon {
+  vertical-align: middle;
+  min-width: 0;
+  padding: 5px;
+}
+
 #screenshot-icon::before {
   background-image: url(chrome://devtools/skin/images/command-screenshot.svg);
-  margin-inline-start: 5px;
 }
--- a/devtools/client/framework/toolbox-options.xhtml
+++ b/devtools/client/framework/toolbox-options.xhtml
@@ -105,17 +105,17 @@
           <input type="checkbox"
                  data-pref="devtools.styleeditor.autocompletion-enabled"/>
           <span>&options.stylesheetAutocompletion.label;</span>
         </label>
       </fieldset>
 
       <fieldset id="screenshot-options" class="options-groupbox">
         <legend>&options.screenshot.label;
-          <span id="screenshot-icon" class="devtools-button"></span>
+          <button id="screenshot-icon" disabled="true" class="devtools-button"></button>
         </legend>
         <label title="&options.screenshot.clipboard.tooltip;">
           <input type="checkbox"
                  id="devtools-screenshot-clipboard"
                  data-pref="devtools.screenshot.clipboard.enabled"/>
           <span>&options.screenshot.clipboard.label;</span>
         </label>
         <label title="&options.screenshot.audio.tooltip;">
--- a/devtools/server/actors/frame.js
+++ b/devtools/server/actors/frame.js
@@ -63,18 +63,20 @@ let FrameActor = ActorClassWithSpec(fram
 
     if (this.frame.environment) {
       let envActor = threadActor.createEnvironmentActor(
         this.frame.environment,
         this.frameLifetimePool
       );
       form.environment = envActor.form();
     }
-    form.this = createValueGrip(this.frame.this, threadActor._pausePool,
-      threadActor.objectGrip);
+    if (this.frame.type != "wasmcall") {
+      form.this = createValueGrip(this.frame.this, threadActor._pausePool,
+        threadActor.objectGrip);
+    }
     form.arguments = this._args();
     if (this.frame.script) {
       let generatedLocation = this.threadActor.sources.getFrameLocation(this.frame);
       form.where = {
         source: generatedLocation.generatedSourceActor.form(),
         line: generatedLocation.generatedLine,
         column: generatedLocation.generatedColumn
       };
--- a/devtools/server/actors/script.js
+++ b/devtools/server/actors/script.js
@@ -2185,20 +2185,25 @@ Object.assign(PauseScopedObjectActor.pro
 function hackDebugger(Debugger) {
   // TODO: Improve native code instead of hacking on top of it
 
   /**
    * Override the toString method in order to get more meaningful script output
    * for debugging the debugger.
    */
   Debugger.Script.prototype.toString = function () {
+    if (this.type == "wasm") {
+      return "[wasm]";
+    }
+
     let output = "";
     if (this.url) {
       output += this.url;
     }
+
     if (typeof this.staticLevel != "undefined") {
       output += ":L" + this.staticLevel;
     }
     if (typeof this.startLine != "undefined") {
       output += ":" + this.startLine;
       if (this.lineCount && this.lineCount > 1) {
         output += "-" + (this.startLine + this.lineCount - 1);
       }
--- a/devtools/server/tests/browser/browser_directorscript_actors.js
+++ b/devtools/server/tests/browser/browser_directorscript_actors.js
@@ -48,17 +48,17 @@ function* testDirectorScriptAttachEventA
 
 function* testDirectorScriptMessagePort(directorManager) {
   let { port } = yield installAndEnableDirectorScript(directorManager, {
     scriptId: "testDirectorScript_MessagePort",
     scriptCode: "(" + (function () {
       exports.attach = function ({port}) {
         port.onmessage = function (evt) {
           // echo messages
-          evt.source.postMessage(evt.data);
+          evt.target.postMessage(evt.data);
         };
       };
     }).toString() + ")();",
     scriptOptions: {
       attachMethod: "attach"
     }
   });
 
--- a/devtools/server/tests/mochitest/test_director.html
+++ b/devtools/server/tests/mochitest/test_director.html
@@ -76,17 +76,17 @@ function teardown() {
 
 
 function runDirectorRegistryActorTest() {
   let testDirectorScriptOptions = {
     scriptCode: "(" + (function() {
       module.exports = function({port}) {
         port.onmessage = function(evt) {
           // echo messages
-          evt.source.postMessage(evt.data);
+          evt.target.postMessage(evt.data);
         };
       };
     }).toString() + ")();",
     scriptOptions: {}
   }
 
   return Task.spawn(function* () {
     let { client, root } = yield newConnectedDebuggerClient();
new file mode 100644
--- /dev/null
+++ b/devtools/server/tests/unit/test_frameactor_wasm-01.js
@@ -0,0 +1,70 @@
+/* Any copyright is dedicated to the Public Domain.
+   http://creativecommons.org/publicdomain/zero/1.0/ */
+
+/**
+ * Verify that wasm frame(s) can be requested from the client.
+ */
+
+var gDebuggee;
+var gClient;
+var gThreadClient;
+var gOldPref;
+
+function run_test()
+{
+  gOldPref = Services.prefs.getBoolPref("javascript.options.wasm");
+  Services.prefs.setBoolPref("javascript.options.wasm", true);
+
+  if (typeof WebAssembly == "undefined") {
+    return; // wasm is not enabled for this platform
+  }
+
+  initTestDebuggerServer();
+  gDebuggee = addTestGlobal("test-stack");
+  gClient = new DebuggerClient(DebuggerServer.connectPipe());
+  gClient.connect().then(function () {
+    attachTestTabAndResume(gClient, "test-stack", function (aResponse, aTabClient, aThreadClient) {
+      gThreadClient = aThreadClient;
+      gThreadClient.reconfigure({ observeAsmJS: true }, function (aResponse) {
+        do_check_eq(!!aResponse.error, false);
+        test_pause_frame();
+      });
+    });
+  });
+  do_test_pending();
+}
+
+function test_pause_frame()
+{
+  gThreadClient.addOneTimeListener("paused", function (aEvent, aPacket1) {
+    gThreadClient.getFrames(0, null, function (aFrameResponse) {
+      do_check_eq(aFrameResponse.frames.length, 4);
+
+      let wasmFrame = aFrameResponse.frames[1];
+      do_check_eq(wasmFrame.type, "wasmcall");
+      do_check_eq(wasmFrame.this, undefined);
+
+      let location = wasmFrame.where;
+      do_check_eq(location.line > 0, true);
+      do_check_eq(location.column > 0, true);
+      do_check_eq(location.source.url.endsWith(" > wasm"), true);
+
+      Services.prefs.setBoolPref("javascript.options.wasm", gOldPref);
+      finishClient(gClient);
+    });
+  });
+
+  gDebuggee.eval("(" + function () {
+    // WebAssembly bytecode was generated by running:
+    // js -e 'print(wasmTextToBinary("(module(import \"a\" \"b\")(func(export \"c\")call 0))"))'
+    var m = new WebAssembly.Module(new Uint8Array([
+      0,97,115,109,13,0,0,0,1,132,128,128,128,0,1,96,0,0,2,135,128,128,128,0,1,1,97,1,
+      98,0,0,3,130,128,128,128,0,1,0,6,129,128,128,128,0,0,7,133,128,128,128,0,1,1,99,
+      0,1,10,138,128,128,128,0,1,132,128,128,128,0,0,16,0,11
+    ]));
+    var i = new WebAssembly.Instance(m, {a: {b: () => {
+      debugger;
+    }}});
+    i.exports.c();
+  } + ")()");
+}
--- a/devtools/server/tests/unit/xpcshell.ini
+++ b/devtools/server/tests/unit/xpcshell.ini
@@ -59,16 +59,17 @@ support-files =
 [test_blackboxing-05.js]
 [test_blackboxing-06.js]
 [test_blackboxing-07.js]
 [test_frameactor-01.js]
 [test_frameactor-02.js]
 [test_frameactor-03.js]
 [test_frameactor-04.js]
 [test_frameactor-05.js]
+[test_frameactor_wasm-01.js]
 [test_framearguments-01.js]
 [test_getRuleText.js]
 [test_getTextAtLineColumn.js]
 [test_pauselifetime-01.js]
 [test_pauselifetime-02.js]
 [test_pauselifetime-03.js]
 [test_pauselifetime-04.js]
 [test_threadlifetime-01.js]
--- a/docshell/base/nsDocShell.cpp
+++ b/docshell/base/nsDocShell.cpp
@@ -14849,13 +14849,27 @@ nsDocShell::GetIsOnlyToplevelInTabGroup(
   MOZ_ASSERT(toplevelWindows.Length() == 1);
   MOZ_ASSERT(toplevelWindows[0] == outer);
 
   *aResult = true;
   return NS_OK;
 }
 
 NS_IMETHODIMP
-nsDocShell::GetInFreshProcess(bool* aResult)
-{
-  *aResult = TabChild::GetWasFreshProcess();
-  return NS_OK;
-}
+nsDocShell::GetAwaitingLargeAlloc(bool* aResult)
+{
+  MOZ_ASSERT(aResult);
+  nsCOMPtr<nsITabChild> tabChild = GetTabChild();
+  if (!tabChild) {
+    *aResult = false;
+    return NS_OK;
+  }
+  *aResult = static_cast<TabChild*>(tabChild.get())->IsAwaitingLargeAlloc();
+  return NS_OK;
+}
+
+NS_IMETHODIMP
+nsDocShell::GetInLargeAllocProcess(bool* aResult)
+{
+  MOZ_ASSERT(aResult);
+  *aResult = TabChild::InLargeAllocProcess();
+  return NS_OK;
+}
--- a/docshell/base/nsIDocShell.idl
+++ b/docshell/base/nsIDocShell.idl
@@ -1122,12 +1122,19 @@ interface nsIDocShell : nsIDocShellTreeI
    * referring to this window exists.
    *
    * If this value is `false`, it would be web content visible for a load
    * occuring in this docshell to be performed within a different docshell.
    */
   [infallible] readonly attribute boolean isOnlyToplevelInTabGroup;
 
   /**
-   * Returns `true` if this docshell was created by a Large-Allocation load.
+   * Returns `true` if this docshell is loaded within a Large-Allocation
+   * process.
    */
-  [infallible] readonly attribute boolean inFreshProcess;
+  [infallible] readonly attribute boolean inLargeAllocProcess;
+
+  /**
+   * Returns `true` if this docshell was created due to a Large-Allocation
+   * header, and has not seen the initiating load yet.
+   */
+  [infallible] readonly attribute boolean awaitingLargeAlloc;
 };
--- a/dom/animation/EffectCompositor.cpp
+++ b/dom/animation/EffectCompositor.cpp
@@ -306,18 +306,19 @@ EffectCompositor::PostRestyleForAnimatio
     return;
   }
 
   nsRestyleHint hint = aCascadeLevel == CascadeLevel::Transitions ?
                                         eRestyle_CSSTransitions :
                                         eRestyle_CSSAnimations;
 
   // FIXME: stylo only supports Self and Subtree hints now, so we override it
-  // for stylo.
-  if (mPresContext->StyleSet()->IsServo()) {
+  // for stylo if we are not in process of restyling.
+  if (mPresContext->StyleSet()->IsServo() &&
+      !mPresContext->RestyleManager()->AsBase()->IsInStyleRefresh()) {
     hint = eRestyle_Self | eRestyle_Subtree;
   }
   mPresContext->PresShell()->RestyleForAnimation(element, hint);
 }
 
 void
 EffectCompositor::PostRestyleForThrottledAnimations()
 {
--- a/dom/base/DOMException.cpp
+++ b/dom/base/DOMException.cpp
@@ -77,17 +77,17 @@ enum DOM4ErrorTypeCodeMap {
 
   /* Push API errors */
   NotAllowedError          = 0,
 };
 
 #define DOM4_MSG_DEF(name, message, nsresult) {(nsresult), name, #name, message},
 #define DOM_MSG_DEF(val, message) {(val), NS_ERROR_GET_CODE(val), #val, message},
 
-static const struct ResultStruct
+static constexpr struct ResultStruct
 {
   nsresult mNSResult;
   uint16_t mCode;
   const char* mName;
   const char* mMessage;
 } sDOMErrorMsgMap[] = {
 #include "domerr.msg"
 };
--- a/dom/base/DOMIntersectionObserver.cpp
+++ b/dom/base/DOMIntersectionObserver.cpp
@@ -154,34 +154,36 @@ DOMIntersectionObserver::Observe(Element
   aTarget.RegisterIntersectionObserver(this);
   mObservationTargets.PutEntry(&aTarget);
   Connect();
 }
 
 void
 DOMIntersectionObserver::Unobserve(Element& aTarget)
 {
-  if (UnlinkTarget(aTarget)) {
-    aTarget.UnregisterIntersectionObserver(this);
+  if (mObservationTargets.Count() == 1) {
+    Disconnect();
+    return;
   }
+
+  mObservationTargets.RemoveEntry(&aTarget);
+  aTarget.UnregisterIntersectionObserver(this);
 }
 
-bool
+void
 DOMIntersectionObserver::UnlinkTarget(Element& aTarget)
 {
     if (!mObservationTargets.Contains(&aTarget)) {
-        return false;
+        return;
     }
 
     mObservationTargets.RemoveEntry(&aTarget);
     if (mObservationTargets.Count() == 0) {
         Disconnect();
-        return false;
     }
-    return true;
 }
 
 void
 DOMIntersectionObserver::Connect()
 {
   if (mConnected) {
     return;
   }
--- a/dom/base/DOMIntersectionObserver.h
+++ b/dom/base/DOMIntersectionObserver.h
@@ -96,17 +96,19 @@ protected:
 
 #define NS_DOM_INTERSECTION_OBSERVER_IID \
 { 0x8570a575, 0xe303, 0x4d18, \
   { 0xb6, 0xb1, 0x4d, 0x2b, 0x49, 0xd8, 0xef, 0x94 } }
 
 class DOMIntersectionObserver final : public nsISupports,
                                       public nsWrapperCache
 {
-  virtual ~DOMIntersectionObserver() { }
+  virtual ~DOMIntersectionObserver() {
+    Disconnect();
+  }
 
 public:
   DOMIntersectionObserver(already_AddRefed<nsPIDOMWindowInner>&& aOwner,
                           mozilla::dom::IntersectionCallback& aCb)
   : mOwner(aOwner), mCallback(&aCb), mConnected(false)
   {
   }
   NS_DECL_CYCLE_COLLECTING_ISUPPORTS
@@ -137,17 +139,17 @@ public:
     return mRoot;
   }
 
   void GetRootMargin(mozilla::dom::DOMString& aRetVal);
   void GetThresholds(nsTArray<double>& aRetVal);
   void Observe(Element& aTarget);
   void Unobserve(Element& aTarget);
 
-  bool UnlinkTarget(Element& aTarget);
+  void UnlinkTarget(Element& aTarget);
   void Disconnect();
 
   void TakeRecords(nsTArray<RefPtr<DOMIntersectionObserverEntry>>& aRetVal);
 
   mozilla::dom::IntersectionCallback* IntersectionCallback() { return mCallback; }
 
   bool SetRootMargin(const nsAString& aString);
 
new file mode 100644
--- /dev/null
+++ b/dom/base/crashtests/1332939.html
@@ -0,0 +1,16 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+<script type="application/javascript">
+
+var target = document.createElement("div");
+target.foo = 'bar';
+var observer = new IntersectionObserver(function () { });
+observer.observe(target);
+observer.unobserve(target);
+observer = null;
+target = null;
+
+</script>
+</head>
+</html>
--- a/dom/base/crashtests/crashtests.list
+++ b/dom/base/crashtests/crashtests.list
@@ -163,18 +163,18 @@ load 815500.html
 load 816253.html
 load 819014.html
 load 822691.html
 load 822723.html
 load 824719.html
 load 827190.html
 load 828054.html
 load 828903.html
-asserts-if(stylo,2) load 829428.html # bug 1324669
-asserts-if(stylo,2) load 830098.html # bug 1324669
+load 829428.html
+load 830098.html
 load 831287.html
 load 832644.html
 load 836890.html
 load 838489-1.html
 load 838489-2.html
 load 841205.html
 load 844404.html
 load 845093-1.html
@@ -206,8 +206,9 @@ HTTP(..) load xhr_abortinprogress.html
 load xhr_empty_datauri.html
 load xhr_html_nullresponse.html
 load 1230422.html
 load 1251361.html
 load 1304437.html
 pref(dom.IntersectionObserver.enabled,true) load 1324209.html
 pref(dom.IntersectionObserver.enabled,true) load 1326194-1.html
 pref(dom.IntersectionObserver.enabled,true) load 1326194-2.html
+pref(dom.IntersectionObserver.enabled,true) load 1332939.html
--- a/dom/base/nsContentUtils.cpp
+++ b/dom/base/nsContentUtils.cpp
@@ -9704,22 +9704,53 @@ nsContentUtils::AttemptLargeAllocationLo
   if (NS_WARN_IF(!requestMethod.LowerCaseEqualsLiteral("get"))) {
     outer->SetLargeAllocStatus(LargeAllocStatus::NON_GET);
     return false;
   }
 
   TabChild* tabChild = TabChild::GetFrom(outer->AsOuter());
   NS_ENSURE_TRUE(tabChild, false);
 
-  if (tabChild->TakeIsFreshProcess())  {
-    NS_WARNING("Already in a fresh process, ignoring Large-Allocation header!");
+  if (tabChild->TakeAwaitingLargeAlloc())  {
+    NS_WARNING("In a Large-Allocation TabChild, ignoring Large-Allocation header!");
     outer->SetLargeAllocStatus(LargeAllocStatus::SUCCESS);
     return false;
   }
 
+  // On Win32 systems, we want to behave differently, so set the isWin32 bool to
+  // be true iff we are on win32.
+#if defined(XP_WIN) && defined(_X86_)
+  const bool isWin32 = true;
+#else
+  const bool isWin32 = false;
+#endif
+
+  static bool sLargeAllocForceEnable = false;
+  static bool sCachedLargeAllocForceEnable = false;
+  if (!sCachedLargeAllocForceEnable) {
+    sCachedLargeAllocForceEnable = true;
+    mozilla::Preferences::AddBoolVarCache(&sLargeAllocForceEnable,
+                                          "dom.largeAllocation.forceEnable");
+  }
+
+  // We want to enable the large allocation header on 32-bit windows machines,
+  // and disable it on other machines, while still printing diagnostic messages.
+  // dom.largeAllocation.forceEnable can allow you to enable the process
+  // switching behavior of the Large-Allocation header on non 32-bit windows
+  // machines.
+  bool largeAllocEnabled = isWin32 || sLargeAllocForceEnable;
+  if (!largeAllocEnabled) {
+    NS_WARNING("dom.largeAllocation.forceEnable not set - "
+               "ignoring otherwise successful Large-Allocation header.");
+    // On platforms which aren't WIN32, we don't activate the largeAllocation
+    // header, instead we simply emit diagnostics into the console.
+    outer->SetLargeAllocStatus(LargeAllocStatus::NON_WIN32);
+    return false;
+  }
+
   // At this point the fress process load should succeed! We just need to get
   // ourselves a nsIWebBrowserChrome3 to ask to perform the reload. We should
   // have one, as we have already confirmed that we are running in a content
   // process.
   nsCOMPtr<nsIDocShellTreeOwner> treeOwner;
   docShell->GetTreeOwner(getter_AddRefs(treeOwner));
   NS_ENSURE_TRUE(treeOwner, false);
 
@@ -9733,20 +9764,35 @@ nsContentUtils::AttemptLargeAllocationLo
 
   nsCOMPtr<nsIURI> referrer;
   rv = aChannel->GetReferrer(getter_AddRefs(referrer));
   NS_ENSURE_SUCCESS(rv, false);
 
   nsCOMPtr<nsILoadInfo> loadInfo = aChannel->GetLoadInfo();
   nsCOMPtr<nsIPrincipal> triggeringPrincipal = loadInfo->TriggeringPrincipal();
 
+  // Get the channel's load flags, and use them to generate nsIWebNavigation
+  // load flags. We want to make sure to propagate the refresh and cache busting
+  // flags.
+  nsLoadFlags channelLoadFlags;
+  aChannel->GetLoadFlags(&channelLoadFlags);
+
+  uint32_t webnavLoadFlags = nsIWebNavigation::LOAD_FLAGS_NONE;
+  if (channelLoadFlags & nsIRequest::LOAD_BYPASS_CACHE) {
+    webnavLoadFlags |= nsIWebNavigation::LOAD_FLAGS_BYPASS_CACHE;
+    webnavLoadFlags |= nsIWebNavigation::LOAD_FLAGS_BYPASS_PROXY;
+  } else if (channelLoadFlags & nsIRequest::VALIDATE_ALWAYS) {
+    webnavLoadFlags |= nsIWebNavigation::LOAD_FLAGS_IS_REFRESH;
+  }
+
   // Actually perform the cross process load
   bool reloadSucceeded = false;
   rv = wbc3->ReloadInFreshProcess(docShell, uri, referrer,
-                                  triggeringPrincipal, &reloadSucceeded);
+                                  triggeringPrincipal, webnavLoadFlags,
+                                  &reloadSucceeded);
   NS_ENSURE_SUCCESS(rv, false);
 
   return reloadSucceeded;
 }
 
 /* static */ void
 nsContentUtils::AppendDocumentLevelNativeAnonymousContentTo(
     nsIDocument* aDocument,
--- a/dom/base/nsGlobalWindow.cpp
+++ b/dom/base/nsGlobalWindow.cpp
@@ -13923,16 +13923,20 @@ nsGlobalWindow::ReportLargeAllocStatus()
 
   switch (mLargeAllocStatus) {
     case LargeAllocStatus::SUCCESS:
       // Override the error flags such that the success message isn't reported
       // as a warning.
       errorFlags = nsIScriptError::infoFlag;
       message = "LargeAllocationSuccess";
       break;
+    case LargeAllocStatus::NON_WIN32:
+      errorFlags = nsIScriptError::infoFlag;
+      message = "LargeAllocationNonWin32";
+      break;
     case LargeAllocStatus::NON_GET:
       message = "LargeAllocationNonGetRequest";
       break;
     case LargeAllocStatus::NON_E10S:
       message = "LargeAllocationNonE10S";
       break;
     case LargeAllocStatus::NOT_ONLY_TOPLEVEL_IN_TABGROUP:
       message = "LargeAllocationNotOnlyToplevelInTabGroup";
--- a/dom/base/nsGlobalWindowCommands.cpp
+++ b/dom/base/nsGlobalWindowCommands.cpp
@@ -37,82 +37,82 @@
 #include "mozilla/TextEvents.h"
 #include "mozilla/dom/Selection.h"
 
 #include "nsIClipboardDragDropHooks.h"
 #include "nsIClipboardDragDropHookList.h"
 
 using namespace mozilla;
 
-const char * const sSelectAllString = "cmd_selectAll";
-const char * const sSelectNoneString = "cmd_selectNone";
-const char * const sCopyImageLocationString = "cmd_copyImageLocation";
-const char * const sCopyImageContentsString = "cmd_copyImageContents";
-const char * const sCopyImageString = "cmd_copyImage";
+constexpr const char * sSelectAllString = "cmd_selectAll";
+constexpr const char * sSelectNoneString = "cmd_selectNone";
+constexpr const char * sCopyImageLocationString = "cmd_copyImageLocation";
+constexpr const char * sCopyImageContentsString = "cmd_copyImageContents";
+constexpr const char * sCopyImageString = "cmd_copyImage";
 
-const char * const sScrollTopString = "cmd_scrollTop";
-const char * const sScrollBottomString = "cmd_scrollBottom";
-const char * const sScrollPageUpString = "cmd_scrollPageUp";
-const char * const sScrollPageDownString = "cmd_scrollPageDown";
-const char * const sScrollLineUpString = "cmd_scrollLineUp";
-const char * const sScrollLineDownString = "cmd_scrollLineDown";
-const char * const sScrollLeftString = "cmd_scrollLeft";
-const char * const sScrollRightString = "cmd_scrollRight";
-const char * const sMoveTopString = "cmd_moveTop";
-const char * const sMoveBottomString = "cmd_moveBottom";
-const char * const sMovePageUpString = "cmd_movePageUp";
-const char * const sMovePageDownString = "cmd_movePageDown";
-const char * const sLinePreviousString = "cmd_linePrevious";
-const char * const sLineNextString = "cmd_lineNext";
-const char * const sCharPreviousString = "cmd_charPrevious";
-const char * const sCharNextString = "cmd_charNext";
+constexpr const char * sScrollTopString = "cmd_scrollTop";
+constexpr const char * sScrollBottomString = "cmd_scrollBottom";
+constexpr const char * sScrollPageUpString = "cmd_scrollPageUp";
+constexpr const char * sScrollPageDownString = "cmd_scrollPageDown";
+constexpr const char * sScrollLineUpString = "cmd_scrollLineUp";
+constexpr const char * sScrollLineDownString = "cmd_scrollLineDown";
+constexpr const char * sScrollLeftString = "cmd_scrollLeft";
+constexpr const char * sScrollRightString = "cmd_scrollRight";
+constexpr const char * sMoveTopString = "cmd_moveTop";
+constexpr const char * sMoveBottomString = "cmd_moveBottom";
+constexpr const char * sMovePageUpString = "cmd_movePageUp";
+constexpr const char * sMovePageDownString = "cmd_movePageDown";
+constexpr const char * sLinePreviousString = "cmd_linePrevious";
+constexpr const char * sLineNextString = "cmd_lineNext";
+constexpr const char * sCharPreviousString = "cmd_charPrevious";
+constexpr const char * sCharNextString = "cmd_charNext";
 
 // These are so the browser can use editor navigation key bindings
 // helps with accessibility (boolean pref accessibility.browsewithcaret)
 
-const char * const sSelectCharPreviousString = "cmd_selectCharPrevious";
-const char * const sSelectCharNextString = "cmd_selectCharNext";
+constexpr const char * sSelectCharPreviousString = "cmd_selectCharPrevious";
+constexpr const char * sSelectCharNextString = "cmd_selectCharNext";
 
-const char * const sWordPreviousString = "cmd_wordPrevious";
-const char * const sWordNextString = "cmd_wordNext";
-const char * const sSelectWordPreviousString = "cmd_selectWordPrevious";
-const char * const sSelectWordNextString = "cmd_selectWordNext";
+constexpr const char * sWordPreviousString = "cmd_wordPrevious";
+constexpr const char * sWordNextString = "cmd_wordNext";
+constexpr const char * sSelectWordPreviousString = "cmd_selectWordPrevious";
+constexpr const char * sSelectWordNextString = "cmd_selectWordNext";
 
-const char * const sBeginLineString = "cmd_beginLine";
-const char * const sEndLineString = "cmd_endLine";
-const char * const sSelectBeginLineString = "cmd_selectBeginLine";
-const char * const sSelectEndLineString = "cmd_selectEndLine";
+constexpr const char * sBeginLineString = "cmd_beginLine";
+constexpr const char * sEndLineString = "cmd_endLine";
+constexpr const char * sSelectBeginLineString = "cmd_selectBeginLine";
+constexpr const char * sSelectEndLineString = "cmd_selectEndLine";
 
-const char * const sSelectLinePreviousString = "cmd_selectLinePrevious";
-const char * const sSelectLineNextString = "cmd_selectLineNext";
+constexpr const char * sSelectLinePreviousString = "cmd_selectLinePrevious";
+constexpr const char * sSelectLineNextString = "cmd_selectLineNext";
 
-const char * const sSelectPageUpString = "cmd_selectPageUp";
-const char * const sSelectPageDownString = "cmd_selectPageDown";
+constexpr const char * sSelectPageUpString = "cmd_selectPageUp";
+constexpr const char * sSelectPageDownString = "cmd_selectPageDown";
 
-const char * const sSelectTopString = "cmd_selectTop";
-const char * const sSelectBottomString = "cmd_selectBottom";
+constexpr const char * sSelectTopString = "cmd_selectTop";
+constexpr const char * sSelectBottomString = "cmd_selectBottom";
 
 // Physical-direction movement and selection commands
-const char * const sMoveLeftString = "cmd_moveLeft";
-const char * const sMoveRightString = "cmd_moveRight";
-const char * const sMoveUpString = "cmd_moveUp";
-const char * const sMoveDownString = "cmd_moveDown";
-const char * const sMoveLeft2String = "cmd_moveLeft2";
-const char * const sMoveRight2String = "cmd_moveRight2";
-const char * const sMoveUp2String = "cmd_moveUp2";
-const char * const sMoveDown2String = "cmd_moveDown2";
+constexpr const char * sMoveLeftString = "cmd_moveLeft";
+constexpr const char * sMoveRightString = "cmd_moveRight";
+constexpr const char * sMoveUpString = "cmd_moveUp";
+constexpr const char * sMoveDownString = "cmd_moveDown";
+constexpr const char * sMoveLeft2String = "cmd_moveLeft2";
+constexpr const char * sMoveRight2String = "cmd_moveRight2";
+constexpr const char * sMoveUp2String = "cmd_moveUp2";
+constexpr const char * sMoveDown2String = "cmd_moveDown2";
 
-const char * const sSelectLeftString = "cmd_selectLeft";
-const char * const sSelectRightString = "cmd_selectRight";
-const char * const sSelectUpString = "cmd_selectUp";
-const char * const sSelectDownString = "cmd_selectDown";
-const char * const sSelectLeft2String = "cmd_selectLeft2";
-const char * const sSelectRight2String = "cmd_selectRight2";
-const char * const sSelectUp2String = "cmd_selectUp2";
-const char * const sSelectDown2String = "cmd_selectDown2";
+constexpr const char * sSelectLeftString = "cmd_selectLeft";
+constexpr const char * sSelectRightString = "cmd_selectRight";
+constexpr const char * sSelectUpString = "cmd_selectUp";
+constexpr const char * sSelectDownString = "cmd_selectDown";
+constexpr const char * sSelectLeft2String = "cmd_selectLeft2";
+constexpr const char * sSelectRight2String = "cmd_selectRight2";
+constexpr const char * sSelectUp2String = "cmd_selectUp2";
+constexpr const char * sSelectDown2String = "cmd_selectDown2";
 
 #if 0
 #pragma mark -
 #endif
 
 // a base class for selection-related commands, for code sharing
 class nsSelectionCommandsBase : public nsIControllerCommand
 {
@@ -264,17 +264,17 @@ IsCaretOnInWindow(nsPIDOMWindowOuter* aW
       if (docShell && docShell->ItemType() == nsIDocShellTreeItem::typeChrome) {
         caretOn = false;
       }
     }
   }
   return caretOn;
 }
 
-static const struct BrowseCommand {
+static constexpr struct BrowseCommand {
   const char *reverse, *forward;
   nsresult (NS_STDCALL nsISelectionController::*scroll)(bool);
   nsresult (NS_STDCALL nsISelectionController::*move)(bool, bool);
 } browseCommands[] = {
  { sScrollTopString, sScrollBottomString,
    &nsISelectionController::CompleteScroll },
  { sScrollPageUpString, sScrollPageDownString,
    &nsISelectionController::ScrollPage },
--- a/dom/base/nsPIDOMWindow.h
+++ b/dom/base/nsPIDOMWindow.h
@@ -102,17 +102,18 @@ enum class LargeAllocStatus : uint8_t
   NONE,
   SUCCESS,
 
   // These are the ERROR states. If a window is in one of these states, then the
   // next document loaded in that window should have an error message reported
   // to it.
   NON_GET,
   NON_E10S,
-  NOT_ONLY_TOPLEVEL_IN_TABGROUP
+  NOT_ONLY_TOPLEVEL_IN_TABGROUP,
+  NON_WIN32
 };
 } // namespace dom
 } // namespace mozilla
 
 // nsPIDOMWindowInner and nsPIDOMWindowOuter are identical in all respects
 // except for the type name. They *must* remain identical so that we can
 // reinterpret_cast between them.
 template<class T>
--- a/dom/base/nsScriptLoader.cpp
+++ b/dom/base/nsScriptLoader.cpp
@@ -60,16 +60,27 @@
 #include "nsIScriptError.h"
 
 using namespace mozilla;
 using namespace mozilla::dom;
 
 using JS::SourceBufferHolder;
 
 static LazyLogModule gCspPRLog("CSP");
+static LazyLogModule gScriptLoaderLog("ScriptLoader");
+
+#define LOG_VERBOSE(args)                                                     \
+  MOZ_LOG(gScriptLoaderLog, mozilla::LogLevel::Verbose, args)
+#define LOG(args)                                                             \
+  MOZ_LOG(gScriptLoaderLog, mozilla::LogLevel::Debug, args)
+#define LOG_WARN(args)                                                        \
+  MOZ_LOG(gScriptLoaderLog, mozilla::LogLevel::Warning, args)
+#define LOG_ERROR(args)                                                       \
+  MOZ_LOG(gScriptLoaderLog, mozilla::LogLevel::Error, args)
+
 
 void
 ImplCycleCollectionUnlink(nsScriptLoadRequestList& aField);
 
 void
 ImplCycleCollectionTraverse(nsCycleCollectionTraversalCallback& aCallback,
                             nsScriptLoadRequestList& aField,
                             const char* aName,
@@ -84,18 +95,16 @@ NS_INTERFACE_MAP_END
 
 NS_IMPL_CYCLE_COLLECTION_0(nsScriptLoadRequest)
 
 NS_IMPL_CYCLE_COLLECTING_ADDREF(nsScriptLoadRequest)
 NS_IMPL_CYCLE_COLLECTING_RELEASE(nsScriptLoadRequest)
 
 nsScriptLoadRequest::~nsScriptLoadRequest()
 {
-  js_free(mScriptTextBuf);
-
   // We should always clean up any off-thread script parsing resources.
   MOZ_ASSERT(!mOffThreadToken);
 
   // But play it safe in release builds and try to clean them up here
   // as a fail safe.
   MaybeCancelOffThreadScript();
 }
 
@@ -734,19 +743,17 @@ nsScriptLoader::GetFetchedModule(nsIURI*
 nsresult
 nsScriptLoader::ProcessFetchedModuleSource(nsModuleLoadRequest* aRequest)
 {
   MOZ_ASSERT(!aRequest->mModuleScript);
 
   nsresult rv = CreateModuleScript(aRequest);
   SetModuleFetchFinishedAndResumeWaitingRequests(aRequest, rv);
 
-  free(aRequest->mScriptTextBuf);
-  aRequest->mScriptTextBuf = nullptr;
-  aRequest->mScriptTextLength = 0;
+  aRequest->mScriptText.clearAndFree();
 
   if (NS_SUCCEEDED(rv)) {
     StartFetchingModuleDependencies(aRequest);
   }
 
   return rv;
 }
 
@@ -1025,17 +1032,17 @@ nsScriptLoader::StartFetchingModuleAndDe
   childRequest->mIsTopLevel = false;
   childRequest->mURI = aURI;
   childRequest->mIsInline = false;
   childRequest->mReferrerPolicy = aRequest->mReferrerPolicy;
   childRequest->mParent = aRequest;
 
   RefPtr<GenericPromise> ready = childRequest->mReady.Ensure(__func__);
 
-  nsresult rv = StartLoad(childRequest, NS_LITERAL_STRING("module"), false);
+  nsresult rv = StartLoad(childRequest);
   if (NS_FAILED(rv)) {
     childRequest->mReady.Reject(rv, __func__);
     return ready;
   }
 
   aRequest->mImports.AppendElement(childRequest);
   return ready;
 }
@@ -1173,18 +1180,17 @@ nsScriptLoader::InstantiateModuleTree(ns
       }
     }
   }
 
   return true;
 }
 
 nsresult
-nsScriptLoader::StartLoad(nsScriptLoadRequest *aRequest, const nsAString &aType,
-                          bool aScriptFromHead)
+nsScriptLoader::StartLoad(nsScriptLoadRequest *aRequest)
 {
   MOZ_ASSERT(aRequest->IsLoading());
   NS_ENSURE_TRUE(mDocument, NS_ERROR_NULL_POINTER);
 
   // If this document is sandboxed without 'allow-scripts', abort.
   if (mDocument->HasScriptsBlockedBySandbox()) {
     return NS_OK;
   }
@@ -1247,19 +1253,19 @@ nsScriptLoader::StartLoad(nsScriptLoadRe
                               nsIChannel::LOAD_CLASSIFY_URI);
 
   NS_ENSURE_SUCCESS(rv, rv);
 
   nsIScriptElement *script = aRequest->mElement;
   nsCOMPtr<nsIClassOfService> cos(do_QueryInterface(channel));
 
   if (cos) {
-    if (aScriptFromHead &&
+    if (aRequest->mScriptFromHead &&
         !(script && (script->GetScriptAsync() || script->GetScriptDeferred()))) {
-      // synchronous head scripts block lading of most other non js/css
+      // synchronous head scripts block loading of most other non js/css
       // content such as images
       cos->AddClassFlags(nsIClassOfService::Leader);
     } else if (!(script && script->GetScriptDeferred())) {
       // other scripts are neither blocked nor prioritized unless marked deferred
       cos->AddClassFlags(nsIClassOfService::Unblocked);
     }
   }
 
@@ -1515,36 +1521,36 @@ nsScriptLoader::ProcessScriptElement(nsI
 
       SRIMetadata sriMetadata;
       {
         nsAutoString integrity;
         scriptContent->GetAttr(kNameSpaceID_None, nsGkAtoms::integrity,
                                integrity);
         if (!integrity.IsEmpty()) {
           MOZ_LOG(SRILogHelper::GetSriLog(), mozilla::LogLevel::Debug,
-                 ("nsScriptLoader::ProcessScriptElement, integrity=%s",
-                  NS_ConvertUTF16toUTF8(integrity).get()));
+                  ("nsScriptLoader::ProcessScriptElement, integrity=%s",
+                   NS_ConvertUTF16toUTF8(integrity).get()));
           nsAutoCString sourceUri;
           if (mDocument->GetDocumentURI()) {
             mDocument->GetDocumentURI()->GetAsciiSpec(sourceUri);
           }
           SRICheck::IntegrityMetadata(integrity, sourceUri, mReporter,
                                       &sriMetadata);
         }
       }
 
       request = CreateLoadRequest(scriptKind, aElement, version, ourCORSMode,
                                   sriMetadata);
       request->mURI = scriptURI;
       request->mIsInline = false;
       request->mReferrerPolicy = ourRefPolicy;
-
-      // set aScriptFromHead to false so we don't treat non preloaded scripts as
-      // blockers for full page load. See bug 792438.
-      rv = StartLoad(request, type, false);
+      // keep request->mScriptFromHead to false so we don't treat non preloaded
+      // scripts as blockers for full page load. See bug 792438.
+
+      rv = StartLoad(request);
       if (NS_FAILED(rv)) {
         // Asynchronously report the load failure
         NS_DispatchToCurrentThread(
           NewRunnableMethod(aElement,
                             &nsIScriptElement::FireErrorEvent));
         return false;
       }
     }
@@ -1851,33 +1857,35 @@ nsScriptLoader::AttemptAsyncScriptCompil
   JS::Rooted<JSObject*> global(cx, globalObject->GetGlobalJSObject());
   JS::CompileOptions options(cx);
 
   nsresult rv = FillCompileOptionsForRequest(jsapi, aRequest, global, &options);
   if (NS_WARN_IF(NS_FAILED(rv))) {
     return rv;
   }
 
-  if (!JS::CanCompileOffThread(cx, options, aRequest->mScriptTextLength)) {
+  if (!JS::CanCompileOffThread(cx, options, aRequest->mScriptText.length())) {
     return NS_ERROR_FAILURE;
   }
 
   RefPtr<NotifyOffThreadScriptLoadCompletedRunnable> runnable =
     new NotifyOffThreadScriptLoadCompletedRunnable(aRequest, this);
 
   if (aRequest->IsModuleRequest()) {
     if (!JS::CompileOffThreadModule(cx, options,
-                                    aRequest->mScriptTextBuf, aRequest->mScriptTextLength,
+                                    aRequest->mScriptText.begin(),
+                                    aRequest->mScriptText.length(),
                                     OffThreadScriptLoaderCallback,
                                     static_cast<void*>(runnable))) {
       return NS_ERROR_OUT_OF_MEMORY;
     }
   } else {
     if (!JS::CompileOffThread(cx, options,
-                              aRequest->mScriptTextBuf, aRequest->mScriptTextLength,
+                              aRequest->mScriptText.begin(),
+                              aRequest->mScriptText.length(),
                               OffThreadScriptLoaderCallback,
                               static_cast<void*>(runnable))) {
       return NS_ERROR_OUT_OF_MEMORY;
     }
   }
 
   mDocument->BlockOnload();
   aRequest->mProgress = nsScriptLoadRequest::Progress::Compiling;
@@ -1915,18 +1923,18 @@ nsScriptLoader::GetScriptSource(nsScript
     // XXX This is inefficient - GetText makes multiple
     // copies.
     aRequest->mElement->GetScriptText(inlineData);
     return SourceBufferHolder(inlineData.get(),
                               inlineData.Length(),
                               SourceBufferHolder::NoOwnership);
   }
 
-  return SourceBufferHolder(aRequest->mScriptTextBuf,
-                            aRequest->mScriptTextLength,
+  return SourceBufferHolder(aRequest->mScriptText.begin(),
+                            aRequest->mScriptText.length(),
                             SourceBufferHolder::NoOwnership);
 }
 
 nsresult
 nsScriptLoader::ProcessRequest(nsScriptLoadRequest* aRequest)
 {
   NS_ASSERTION(nsContentUtils::IsSafeToRunScript(),
                "Processing requests when running scripts is unsafe.");
@@ -2013,19 +2021,17 @@ nsScriptLoader::ProcessRequest(nsScriptL
     // thread parse was not actually needed to process the request
     // (disappearing window, some other error, ...). Finish the
     // request to avoid leaks in the JS engine.
     MOZ_ASSERT(!aRequest->IsModuleRequest());
     aRequest->MaybeCancelOffThreadScript();
   }
 
   // Free any source data.
-  free(aRequest->mScriptTextBuf);
-  aRequest->mScriptTextBuf = nullptr;
-  aRequest->mScriptTextLength = 0;
+  aRequest->mScriptText.clearAndFree();
 
   return rv;
 }
 
 void
 nsScriptLoader::FireScriptAvailable(nsresult aResult,
                                     nsScriptLoadRequest* aRequest)
 {
@@ -2450,128 +2456,126 @@ nsScriptLoader::ConvertToUTF16(nsIChanne
     aBufOut = nullptr;
     aLengthOut = 0;
   }
   return rv;
 }
 
 nsresult
 nsScriptLoader::OnStreamComplete(nsIIncrementalStreamLoader* aLoader,
-                                 nsISupports* aContext,
+                                 nsScriptLoadRequest* aRequest,
                                  nsresult aChannelStatus,
                                  nsresult aSRIStatus,
-                                 mozilla::Vector<char16_t> &aString,
                                  mozilla::dom::SRICheckDataVerifier* aSRIDataVerifier)
 {
-  nsScriptLoadRequest* request = static_cast<nsScriptLoadRequest*>(aContext);
-  NS_ASSERTION(request, "null request in stream complete handler");
-  NS_ENSURE_TRUE(request, NS_ERROR_FAILURE);
+  NS_ASSERTION(aRequest, "null request in stream complete handler");
+  NS_ENSURE_TRUE(aRequest, NS_ERROR_FAILURE);
 
   nsCOMPtr<nsIRequest> channelRequest;
   aLoader->GetRequest(getter_AddRefs(channelRequest));
   nsCOMPtr<nsIChannel> channel;
   channel = do_QueryInterface(channelRequest);
 
   nsresult rv = NS_OK;
-  if (!request->mIntegrity.IsEmpty() &&
+  if (!aRequest->mIntegrity.IsEmpty() &&
       NS_SUCCEEDED((rv = aSRIStatus))) {
     MOZ_ASSERT(aSRIDataVerifier);
     MOZ_ASSERT(mReporter);
 
     nsAutoCString sourceUri;
     if (mDocument && mDocument->GetDocumentURI()) {
       mDocument->GetDocumentURI()->GetAsciiSpec(sourceUri);
     }
-    rv = aSRIDataVerifier->Verify(request->mIntegrity, channel, sourceUri,
+    rv = aSRIDataVerifier->Verify(aRequest->mIntegrity, channel, sourceUri,
                                   mReporter);
     mReporter->FlushConsoleReports(mDocument);
     if (NS_FAILED(rv)) {
       rv = NS_ERROR_SRI_CORRUPT;
     }
   } else {
     nsCOMPtr<nsILoadInfo> loadInfo = channel->GetLoadInfo();
 
     if (loadInfo->GetEnforceSRI()) {
       MOZ_LOG(SRILogHelper::GetSriLog(), mozilla::LogLevel::Debug,
-             ("nsScriptLoader::OnStreamComplete, required SRI not found"));
+              ("nsScriptLoader::OnStreamComplete, required SRI not found"));
       nsCOMPtr<nsIContentSecurityPolicy> csp;
       loadInfo->LoadingPrincipal()->GetCsp(getter_AddRefs(csp));
       nsAutoCString violationURISpec;
       mDocument->GetDocumentURI()->GetAsciiSpec(violationURISpec);
-      uint32_t lineNo = request->mElement ? request->mElement->GetScriptLineNumber() : 0;
+      uint32_t lineNo = aRequest->mElement ? aRequest->mElement->GetScriptLineNumber() : 0;
       csp->LogViolationDetails(
         nsIContentSecurityPolicy::VIOLATION_TYPE_REQUIRE_SRI_FOR_SCRIPT,
         NS_ConvertUTF8toUTF16(violationURISpec),
         EmptyString(), lineNo, EmptyString(), EmptyString());
       rv = NS_ERROR_SRI_CORRUPT;
     }
   }
 
   if (NS_SUCCEEDED(rv)) {
-    rv = PrepareLoadedRequest(request, aLoader, aChannelStatus, aString);
+    rv = PrepareLoadedRequest(aRequest, aLoader, aChannelStatus);
   }
 
   if (NS_FAILED(rv)) {
     /*
      * Handle script not loading error because source was a tracking URL.
      * We make a note of this script node by including it in a dedicated
      * array of blocked tracking nodes under its parent document.
      */
     if (rv == NS_ERROR_TRACKING_URI) {
-      nsCOMPtr<nsIContent> cont = do_QueryInterface(request->mElement);
+      nsCOMPtr<nsIContent> cont = do_QueryInterface(aRequest->mElement);
       mDocument->AddBlockedTrackingNode(cont);
     }
 
-    if (request->mIsDefer) {
-      MOZ_ASSERT_IF(request->IsModuleRequest(),
-                    request->AsModuleRequest()->IsTopLevel());
-      if (request->isInList()) {
-        RefPtr<nsScriptLoadRequest> req = mDeferRequests.Steal(request);
+    if (aRequest->mIsDefer) {
+      MOZ_ASSERT_IF(aRequest->IsModuleRequest(),
+                    aRequest->AsModuleRequest()->IsTopLevel());
+      if (aRequest->isInList()) {
+        RefPtr<nsScriptLoadRequest> req = mDeferRequests.Steal(aRequest);
         FireScriptAvailable(rv, req);
       }
-    } else if (request->mIsAsync) {
-      MOZ_ASSERT_IF(request->IsModuleRequest(),
-                    request->AsModuleRequest()->IsTopLevel());
-      if (request->isInList()) {
-        RefPtr<nsScriptLoadRequest> req = mLoadingAsyncRequests.Steal(request);
+    } else if (aRequest->mIsAsync) {
+      MOZ_ASSERT_IF(aRequest->IsModuleRequest(),
+                    aRequest->AsModuleRequest()->IsTopLevel());
+      if (aRequest->isInList()) {
+        RefPtr<nsScriptLoadRequest> req = mLoadingAsyncRequests.Steal(aRequest);
         FireScriptAvailable(rv, req);
       }
-    } else if (request->mIsNonAsyncScriptInserted) {
-      if (request->isInList()) {
+    } else if (aRequest->mIsNonAsyncScriptInserted) {
+      if (aRequest->isInList()) {
         RefPtr<nsScriptLoadRequest> req =
-          mNonAsyncExternalScriptInsertedRequests.Steal(request);
+          mNonAsyncExternalScriptInsertedRequests.Steal(aRequest);
         FireScriptAvailable(rv, req);
       }
-    } else if (request->mIsXSLT) {
-      if (request->isInList()) {
-        RefPtr<nsScriptLoadRequest> req = mXSLTRequests.Steal(request);
+    } else if (aRequest->mIsXSLT) {
+      if (aRequest->isInList()) {
+        RefPtr<nsScriptLoadRequest> req = mXSLTRequests.Steal(aRequest);
         FireScriptAvailable(rv, req);
       }
-    } else if (request->IsModuleRequest()) {
-      nsModuleLoadRequest* modReq = request->AsModuleRequest();
+    } else if (aRequest->IsModuleRequest()) {
+      nsModuleLoadRequest* modReq = aRequest->AsModuleRequest();
       MOZ_ASSERT(!modReq->IsTopLevel());
       MOZ_ASSERT(!modReq->isInList());
       modReq->Cancel();
-      FireScriptAvailable(rv, request);
-    } else if (mParserBlockingRequest == request) {
-      MOZ_ASSERT(!request->isInList());
+      FireScriptAvailable(rv, aRequest);
+    } else if (mParserBlockingRequest == aRequest) {
+      MOZ_ASSERT(!aRequest->isInList());
       mParserBlockingRequest = nullptr;
-      UnblockParser(request);
-
-      // Ensure that we treat request->mElement as our current parser-inserted
+      UnblockParser(aRequest);
+
+      // Ensure that we treat aRequest->mElement as our current parser-inserted
       // script while firing onerror on it.
-      MOZ_ASSERT(request->mElement->GetParserCreated());
+      MOZ_ASSERT(aRequest->mElement->GetParserCreated());
       nsCOMPtr<nsIScriptElement> oldParserInsertedScript =
         mCurrentParserInsertedScript;
-      mCurrentParserInsertedScript = request->mElement;
-      FireScriptAvailable(rv, request);
-      ContinueParserAsync(request);
+      mCurrentParserInsertedScript = aRequest->mElement;
+      FireScriptAvailable(rv, aRequest);
+      ContinueParserAsync(aRequest);
       mCurrentParserInsertedScript = oldParserInsertedScript;
     } else {
-      mPreloads.RemoveElement(request, PreloadRequestComparator());
+      mPreloads.RemoveElement(aRequest, PreloadRequestComparator());
     }
   }
 
   // Process our request and/or any pending ones
   ProcessPendingRequests();
 
   return NS_OK;
 }
@@ -2615,18 +2619,17 @@ nsScriptLoader::MaybeMoveToLoadedList(ns
       mLoadedAsyncRequests.AppendElement(req);
     }
   }
 }
 
 nsresult
 nsScriptLoader::PrepareLoadedRequest(nsScriptLoadRequest* aRequest,
                                      nsIIncrementalStreamLoader* aLoader,
-                                     nsresult aStatus,
-                                     mozilla::Vector<char16_t> &aString)
+                                     nsresult aStatus)
 {
   if (NS_FAILED(aStatus)) {
     return aStatus;
   }
 
   if (aRequest->IsCanceled()) {
     return NS_BINDING_ABORTED;
   }
@@ -2668,21 +2671,16 @@ nsScriptLoader::PrepareLoadedRequest(nsS
   // separate origin principal, so that it will treat our document's
   // principal as the origin principal
   if (aRequest->mCORSMode == CORS_NONE) {
     rv = nsContentUtils::GetSecurityManager()->
       GetChannelResultPrincipal(channel, getter_AddRefs(aRequest->mOriginPrincipal));
     NS_ENSURE_SUCCESS(rv, rv);
   }
 
-  if (!aString.empty()) {
-    aRequest->mScriptTextLength = aString.length();
-    aRequest->mScriptTextBuf = aString.extractOrCopyRawBuffer();
-  }
-
   // This assertion could fire errorously if we ran out of memory when
   // inserting the request in the array. However it's an unlikely case
   // so if you see this assertion it is likely something else that is
   // wrong, especially if you see it more than once.
   NS_ASSERTION(mDeferRequests.Contains(aRequest) ||
                mLoadingAsyncRequests.Contains(aRequest) ||
                mNonAsyncExternalScriptInsertedRequests.Contains(aRequest) ||
                mXSLTRequests.Contains(aRequest)  ||
@@ -2786,33 +2784,34 @@ nsScriptLoader::PreloadURI(nsIURI *aURI,
   // TODO: Preload module scripts.
   if (nsContentUtils::IsChromeDoc(mDocument) && aType.LowerCaseEqualsASCII("module")) {
     return;
   }
 
   SRIMetadata sriMetadata;
   if (!aIntegrity.IsEmpty()) {
     MOZ_LOG(SRILogHelper::GetSriLog(), mozilla::LogLevel::Debug,
-           ("nsScriptLoader::PreloadURI, integrity=%s",
-            NS_ConvertUTF16toUTF8(aIntegrity).get()));
+            ("nsScriptLoader::PreloadURI, integrity=%s",
+             NS_ConvertUTF16toUTF8(aIntegrity).get()));
     nsAutoCString sourceUri;
     if (mDocument->GetDocumentURI()) {
       mDocument->GetDocumentURI()->GetAsciiSpec(sourceUri);
     }
     SRICheck::IntegrityMetadata(aIntegrity, sourceUri, mReporter, &sriMetadata);
   }
 
   RefPtr<nsScriptLoadRequest> request =
     CreateLoadRequest(nsScriptKind::Classic, nullptr, 0,
                       Element::StringToCORSMode(aCrossOrigin), sriMetadata);
   request->mURI = aURI;
   request->mIsInline = false;
   request->mReferrerPolicy = aReferrerPolicy;
-
-  nsresult rv = StartLoad(request, aType, aScriptFromHead);
+  request->mScriptFromHead = aScriptFromHead;
+
+  nsresult rv = StartLoad(request);
   if (NS_FAILED(rv)) {
     return;
   }
 
   PreloadInfo *pi = mPreloads.AppendElement();
   pi->mRequest = request;
   pi->mCharset = aCharset;
 }
@@ -2848,18 +2847,17 @@ nsScriptLoader::MaybeRemovedDeferRequest
 
 nsScriptLoadHandler::nsScriptLoadHandler(nsScriptLoader *aScriptLoader,
                                          nsScriptLoadRequest *aRequest,
                                          mozilla::dom::SRICheckDataVerifier *aSRIDataVerifier)
   : mScriptLoader(aScriptLoader),
     mRequest(aRequest),
     mSRIDataVerifier(aSRIDataVerifier),
     mSRIStatus(NS_OK),
-    mDecoder(),
-    mBuffer()
+    mDecoder()
 {}
 
 nsScriptLoadHandler::~nsScriptLoadHandler()
 {}
 
 NS_IMPL_ISUPPORTS(nsScriptLoadHandler, nsIIncrementalStreamLoaderObserver)
 
 NS_IMETHODIMP
@@ -2879,60 +2877,60 @@ nsScriptLoadHandler::OnIncrementalData(n
                      /* aEndOfStream = */ false)) {
     return NS_OK;
   }
 
   // Below we will/shall consume entire data chunk.
   *aConsumedLength = aDataLength;
 
   // Decoder has already been initialized. -- trying to decode all loaded bytes.
-  nsresult rv = TryDecodeRawData(aData, aDataLength,
-                                 /* aEndOfStream = */ false);
+  nsresult rv = DecodeRawData(aData, aDataLength,
+                              /* aEndOfStream = */ false);
   NS_ENSURE_SUCCESS(rv, rv);
 
   // If SRI is required for this load, appending new bytes to the hash.
   if (mSRIDataVerifier && NS_SUCCEEDED(mSRIStatus)) {
     mSRIStatus = mSRIDataVerifier->Update(aDataLength, aData);
   }
 
   return rv;
 }
 
 nsresult
-nsScriptLoadHandler::TryDecodeRawData(const uint8_t* aData,
-                                      uint32_t aDataLength,
-                                      bool aEndOfStream)
+nsScriptLoadHandler::DecodeRawData(const uint8_t* aData,
+                                   uint32_t aDataLength,
+                                   bool aEndOfStream)
 {
   int32_t srcLen = aDataLength;
   const char* src = reinterpret_cast<const char *>(aData);
   int32_t dstLen;
   nsresult rv =
     mDecoder->GetMaxLength(src, srcLen, &dstLen);
 
   NS_ENSURE_SUCCESS(rv, rv);
 
-  uint32_t haveRead = mBuffer.length();
+  uint32_t haveRead = mRequest->mScriptText.length();
 
   CheckedInt<uint32_t> capacity = haveRead;
   capacity += dstLen;
 
-  if (!capacity.isValid() || !mBuffer.reserve(capacity.value())) {
+  if (!capacity.isValid() || !mRequest->mScriptText.reserve(capacity.value())) {
     return NS_ERROR_OUT_OF_MEMORY;
   }
 
   rv = mDecoder->Convert(src,
-                      &srcLen,
-                      mBuffer.begin() + haveRead,
-                      &dstLen);
+                         &srcLen,
+                         mRequest->mScriptText.begin() + haveRead,
+                         &dstLen);
 
   NS_ENSURE_SUCCESS(rv, rv);
 
   haveRead += dstLen;
   MOZ_ASSERT(haveRead <= capacity.value(), "mDecoder produced more data than expected");
-  MOZ_ALWAYS_TRUE(mBuffer.resizeUninitialized(haveRead));
+  MOZ_ALWAYS_TRUE(mRequest->mScriptText.resizeUninitialized(haveRead));
 
   return NS_OK;
 }
 
 bool
 nsScriptLoadHandler::EnsureDecoder(nsIIncrementalStreamLoader *aLoader,
                                    const uint8_t* aData,
                                    uint32_t aDataLength,
@@ -3022,21 +3020,21 @@ nsScriptLoadHandler::OnStreamComplete(ns
                                       nsresult aStatus,
                                       uint32_t aDataLength,
                                       const uint8_t* aData)
 {
   if (!mRequest->IsCanceled()) {
     DebugOnly<bool> encoderSet =
       EnsureDecoder(aLoader, aData, aDataLength, /* aEndOfStream = */ true);
     MOZ_ASSERT(encoderSet);
-    DebugOnly<nsresult> rv = TryDecodeRawData(aData, aDataLength,
-                                              /* aEndOfStream = */ true);
+    DebugOnly<nsresult> rv = DecodeRawData(aData, aDataLength,
+                                           /* aEndOfStream = */ true);
 
     // If SRI is required for this load, appending new bytes to the hash.
     if (mSRIDataVerifier && NS_SUCCEEDED(mSRIStatus)) {
       mSRIStatus = mSRIDataVerifier->Update(aDataLength, aData);
     }
   }
 
   // we have to mediate and use mRequest.
   return mScriptLoader->OnStreamComplete(aLoader, mRequest, aStatus, mSRIStatus,
-                                         mBuffer, mSRIDataVerifier);
+                                         mSRIDataVerifier);
 }
--- a/dom/base/nsScriptLoader.h
+++ b/dom/base/nsScriptLoader.h
@@ -69,29 +69,29 @@ protected:
 public:
   nsScriptLoadRequest(nsScriptKind aKind,
                       nsIScriptElement* aElement,
                       uint32_t aVersion,
                       mozilla::CORSMode aCORSMode,
                       const mozilla::dom::SRIMetadata &aIntegrity)
     : mKind(aKind),
       mElement(aElement),
+      mScriptFromHead(false),
       mProgress(Progress::Loading),
       mIsInline(true),
       mHasSourceMapURL(false),
       mIsDefer(false),
       mIsAsync(false),
       mIsNonAsyncScriptInserted(false),
       mIsXSLT(false),
       mIsCanceled(false),
       mWasCompiledOMT(false),
       mIsTracking(false),
       mOffThreadToken(nullptr),
-      mScriptTextBuf(nullptr),
-      mScriptTextLength(0),
+      mScriptText(),
       mJSVersion(aVersion),
       mLineNo(1),
       mCORSMode(aCORSMode),
       mIntegrity(aIntegrity),
       mReferrerPolicy(mozilla::net::RP_Unset)
   {
   }
 
@@ -162,30 +162,32 @@ public:
 
   void MaybeCancelOffThreadScript();
 
   using super::getNext;
   using super::isInList;
 
   const nsScriptKind mKind;
   nsCOMPtr<nsIScriptElement> mElement;
+  bool mScriptFromHead;   // Synchronous head script block loading of other non js/css content.
   Progress mProgress;     // Are we still waiting for a load to complete?
   bool mIsInline;         // Is the script inline or loaded?
   bool mHasSourceMapURL;  // Does the HTTP header have a source map url?
   bool mIsDefer;          // True if we live in mDeferRequests.
   bool mIsAsync;          // True if we live in mLoadingAsyncRequests or mLoadedAsyncRequests.
   bool mIsNonAsyncScriptInserted; // True if we live in mNonAsyncExternalScriptInsertedRequests
   bool mIsXSLT;           // True if we live in mXSLTRequests.
   bool mIsCanceled;       // True if we have been explicitly canceled.
   bool mWasCompiledOMT;   // True if the script has been compiled off main thread.
   bool mIsTracking;       // True if the script comes from a source on our tracking protection list.
   void* mOffThreadToken;  // Off-thread parsing token.
   nsString mSourceMapURL; // Holds source map url for loaded scripts
-  char16_t* mScriptTextBuf; // Holds script text for non-inline scripts. Don't
-  size_t mScriptTextLength; // use nsString so we can give ownership to jsapi.
+  // Holds script text for non-inline scripts. Don't use nsString so we can give
+  // ownership to jsapi.
+  mozilla::Vector<char16_t> mScriptText;
   uint32_t mJSVersion;
   nsCOMPtr<nsIURI> mURI;
   nsCOMPtr<nsIPrincipal> mOriginPrincipal;
   nsAutoCString mURL;     // Keep the URI's filename alive during off thread parsing.
   int32_t mLineNo;
   const mozilla::CORSMode mCORSMode;
   const mozilla::dom::SRIMetadata mIntegrity;
   mozilla::net::ReferrerPolicy mReferrerPolicy;
@@ -298,17 +300,17 @@ public:
    * @param aObserver observer to be removed
    */
   void RemoveObserver(nsIScriptLoaderObserver* aObserver)
   {
     mObservers.RemoveObject(aObserver);
   }
 
   /**
-   * Process a script element. This will include both loading the 
+   * Process a script element. This will include both loading the
    * source of the element if it is not inline and evaluating
    * the script itself.
    *
    * If the script is an inline script that can be executed immediately
    * (i.e. there are no other scripts pending) then ScriptAvailable
    * and ScriptEvaluated will be called before the function returns.
    *
    * If true is returned the script could not be executed immediately.
@@ -331,17 +333,17 @@ public:
 
   nsIScriptElement* GetCurrentParserInsertedScript()
   {
     return mCurrentParserInsertedScript;
   }
 
   /**
    * Whether the loader is enabled or not.
-   * When disabled, processing of new script elements is disabled. 
+   * When disabled, processing of new script elements is disabled.
    * Any call to ProcessScriptElement() will return false. Note that
    * this DOES NOT disable currently loading or executing scripts.
    */
   bool GetEnabled()
   {
     return mEnabled;
   }
   void SetEnabled(bool aEnabled)
@@ -403,23 +405,23 @@ public:
                                  uint32_t aLength,
                                  const nsAString& aHintCharset,
                                  nsIDocument* aDocument,
                                  char16_t*& aBufOut, size_t& aLengthOut);
 
   /**
    * Handle the completion of a stream.  This is called by the
    * nsScriptLoadHandler object which observes the IncrementalStreamLoader
-   * loading the script.
+   * loading the script. The streamed content is expected to be stored on the
+   * aRequest argument.
    */
   nsresult OnStreamComplete(nsIIncrementalStreamLoader* aLoader,
-                            nsISupports* aContext,
+                            nsScriptLoadRequest* aRequest,
                             nsresult aChannelStatus,
                             nsresult aSRIStatus,
-                            mozilla::Vector<char16_t> &aString,
                             mozilla::dom::SRICheckDataVerifier* aSRIDataVerifier);
 
   /**
    * Processes any pending requests that are ready for processing.
    */
   void ProcessPendingRequests();
 
   /**
@@ -514,18 +516,17 @@ private:
                                      nsISupports *aContext,
                                      nsIURI *aURI,
                                      const nsAString &aType,
                                      bool aIsPreLoad);
 
   /**
    * Start a load for aRequest's URI.
    */
-  nsresult StartLoad(nsScriptLoadRequest *aRequest, const nsAString &aType,
-                     bool aScriptFromHead);
+  nsresult StartLoad(nsScriptLoadRequest *aRequest);
 
   /**
    * Process any pending requests asynchronously (i.e. off an event) if there
    * are any. Note that this is a no-op if there aren't any currently pending
    * requests.
    *
    * This function is virtual to allow cross-library calls to SetEnabled()
    */
@@ -569,18 +570,17 @@ private:
   nsresult FillCompileOptionsForRequest(const mozilla::dom::AutoJSAPI& jsapi,
                                         nsScriptLoadRequest* aRequest,
                                         JS::Handle<JSObject*> aScopeChain,
                                         JS::CompileOptions* aOptions);
 
   uint32_t NumberOfProcessors();
   nsresult PrepareLoadedRequest(nsScriptLoadRequest* aRequest,
                                 nsIIncrementalStreamLoader* aLoader,
-                                nsresult aStatus,
-                                mozilla::Vector<char16_t> &aString);
+                                nsresult aStatus);
 
   void AddDeferRequest(nsScriptLoadRequest* aRequest);
   bool MaybeRemovedDeferRequests();
 
   void MaybeMoveToLoadedList(nsScriptLoadRequest* aRequest);
 
   JS::SourceBufferHolder GetScriptSource(nsScriptLoadRequest* aRequest,
                                          nsAutoString& inlineData);
@@ -668,47 +668,45 @@ public:
 
   NS_DECL_ISUPPORTS
   NS_DECL_NSIINCREMENTALSTREAMLOADEROBSERVER
 
 private:
   virtual ~nsScriptLoadHandler();
 
   /*
-   * Try to decode some raw data.
+   * Once the charset is found by the EnsureDecoder function, we can
+   * incrementally convert the charset to the one expected by the JS Parser.
    */
-  nsresult TryDecodeRawData(const uint8_t* aData, uint32_t aDataLength,
-                            bool aEndOfStream);
+  nsresult DecodeRawData(const uint8_t* aData, uint32_t aDataLength,
+                         bool aEndOfStream);
 
   /*
    * Discover the charset by looking at the stream data, the script
    * tag, and other indicators.  Returns true if charset has been
    * discovered.
    */
   bool EnsureDecoder(nsIIncrementalStreamLoader *aLoader,
                      const uint8_t* aData, uint32_t aDataLength,
                      bool aEndOfStream);
 
   // ScriptLoader which will handle the parsed script.
   RefPtr<nsScriptLoader>        mScriptLoader;
 
-  // The nsScriptLoadRequest for this load.
+  // The nsScriptLoadRequest for this load. Decoded data are accumulated on it.
   RefPtr<nsScriptLoadRequest>   mRequest;
 
   // SRI data verifier.
   nsAutoPtr<mozilla::dom::SRICheckDataVerifier> mSRIDataVerifier;
 
   // Status of SRI data operations.
   nsresult                      mSRIStatus;
 
   // Unicode decoder for charset.
   nsCOMPtr<nsIUnicodeDecoder>   mDecoder;
-
-  // Accumulated decoded char buffer.
-  mozilla::Vector<char16_t>     mBuffer;
 };
 
 class nsAutoScriptLoaderDisabler
 {
 public:
   explicit nsAutoScriptLoaderDisabler(nsIDocument* aDoc)
   {
     mLoader = aDoc->ScriptLoader();
--- a/dom/canvas/CanvasRenderingContext2D.cpp
+++ b/dom/canvas/CanvasRenderingContext2D.cpp
@@ -45,17 +45,16 @@
 #include "nsContentUtils.h"
 
 #include "nsTArray.h"
 
 #include "ImageEncoder.h"
 #include "ImageRegion.h"
 
 #include "gfxContext.h"
-#include "gfxImageSurface.h"
 #include "gfxPlatform.h"
 #include "gfxFont.h"
 #include "gfxBlur.h"
 #include "gfxPrefs.h"
 #include "gfxUtils.h"
 
 #include "nsFrameLoader.h"
 #include "nsBidi.h"
@@ -5606,79 +5605,82 @@ CanvasRenderingContext2D::GetImageDataAr
     if (!readback || !readback->Map(DataSourceSurface::READ, &rawData)) {
       return NS_ERROR_OUT_OF_MEMORY;
     }
   }
 
   IntRect dstWriteRect = srcReadRect;
   dstWriteRect.MoveBy(-aX, -aY);
 
-  JS::AutoCheckCannotGC nogc;
-  bool isShared;
-  uint8_t* data = JS_GetUint8ClampedArrayData(darray, &isShared, nogc);
-  MOZ_ASSERT(!isShared);        // Should not happen, data was created above
-
-  uint8_t* src;
-  uint32_t srcStride;
-  if (readback) {
-    srcStride = rawData.mStride;
-    src = rawData.mData + srcReadRect.y * srcStride + srcReadRect.x * 4;
-  } else {
-    src = data;
-    srcStride = aWidth * 4;
-  }
-
-  uint8_t* dst = data + dstWriteRect.y * (aWidth * 4) + dstWriteRect.x * 4;
-
-  if (mOpaque) {
-    for (int32_t j = 0; j < dstWriteRect.height; ++j) {
-      for (int32_t i = 0; i < dstWriteRect.width; ++i) {
-        // XXX Is there some useful swizzle MMX we can use here?
+  {
+    JS::AutoCheckCannotGC nogc;
+    bool isShared;
+    uint8_t* data = JS_GetUint8ClampedArrayData(darray, &isShared, nogc);
+    MOZ_ASSERT(!isShared);        // Should not happen, data was created above
+
+    uint8_t* src;
+    uint32_t srcStride;
+    if (readback) {
+      srcStride = rawData.mStride;
+      src = rawData.mData + srcReadRect.y * srcStride + srcReadRect.x * 4;
+    } else {
+      src = data;
+      srcStride = aWidth * 4;
+    }
+
+    uint8_t* dst = data + dstWriteRect.y * (aWidth * 4) + dstWriteRect.x * 4;
+
+    if (mOpaque) {
+      for (int32_t j = 0; j < dstWriteRect.height; ++j) {
+        for (int32_t i = 0; i < dstWriteRect.width; ++i) {
+          // XXX Is there some useful swizzle MMX we can use here?
 #if MOZ_LITTLE_ENDIAN
-        uint8_t b = *src++;
-        uint8_t g = *src++;
-        uint8_t r = *src++;
-        src++;
+          uint8_t b = *src++;
+          uint8_t g = *src++;
+          uint8_t r = *src++;
+          src++;
 #else
-        src++;
-        uint8_t r = *src++;
-        uint8_t g = *src++;
-        uint8_t b = *src++;
+          src++;
+          uint8_t r = *src++;
+          uint8_t g = *src++;
+          uint8_t b = *src++;
 #endif
-        *dst++ = r;
-        *dst++ = g;
-        *dst++ = b;
-        *dst++ = 255;
+          *dst++ = r;
+          *dst++ = g;
+          *dst++ = b;
+          *dst++ = 255;
+        }
+        src += srcStride - (dstWriteRect.width * 4);
+        dst += (aWidth * 4) - (dstWriteRect.width * 4);
       }
-      src += srcStride - (dstWriteRect.width * 4);
-      dst += (aWidth * 4) - (dstWriteRect.width * 4);
-    }
-  } else
-  for (int32_t j = 0; j < dstWriteRect.height; ++j) {
-    for (int32_t i = 0; i < dstWriteRect.width; ++i) {
-      // XXX Is there some useful swizzle MMX we can use here?
+    } else {
+      for (int32_t j = 0; j < dstWriteRect.height; ++j) {
+        for (int32_t i = 0; i < dstWriteRect.width; ++i) {
+          // XXX Is there some useful swizzle MMX we can use here?
 #if MOZ_LITTLE_ENDIAN
-      uint8_t b = *src++;
-      uint8_t g = *src++;
-      uint8_t r = *src++;
-      uint8_t a = *src++;
+          uint8_t b = *src++;
+          uint8_t g = *src++;
+          uint8_t r = *src++;
+          uint8_t a = *src++;
 #else
-      uint8_t a = *src++;
-      uint8_t r = *src++;
-      uint8_t g = *src++;
-      uint8_t b = *src++;
+          uint8_t a = *src++;
+          uint8_t r = *src++;
+          uint8_t g = *src++;
+          uint8_t b = *src++;
 #endif
-      // Convert to non-premultiplied color
-      *dst++ = gfxUtils::sUnpremultiplyTable[a * 256 + r];
-      *dst++ = gfxUtils::sUnpremultiplyTable[a * 256 + g];
-      *dst++ = gfxUtils::sUnpremultiplyTable[a * 256 + b];
-      *dst++ = a;
+          // Convert to non-premultiplied color
+          *dst++ = gfxUtils::sUnpremultiplyTable[a * 256 + r];
+          *dst++ = gfxUtils::sUnpremultiplyTable[a * 256 + g];
+          *dst++ = gfxUtils::sUnpremultiplyTable[a * 256 + b];
+          *dst++ = a;
+        }
+        src += srcStride - (dstWriteRect.width * 4);
+        dst += (aWidth * 4) - (dstWriteRect.width * 4);
+      }
     }
-    src += srcStride - (dstWriteRect.width * 4);
-    dst += (aWidth * 4) - (dstWriteRect.width * 4);
   }
 
   if (readback) {
     readback->Unmap();
   }
 
   *aRetval = darray;
   return NS_OK;
@@ -5805,38 +5807,48 @@ CanvasRenderingContext2D::PutImageData_e
 
   uint32_t len = aW * aH * 4;
   if (dataLen != len) {
     return NS_ERROR_DOM_INVALID_STATE_ERR;
   }
 
   uint32_t copyWidth = dirtyRect.Width();
   uint32_t copyHeight = dirtyRect.Height();
-  RefPtr<gfxImageSurface> imgsurf = new gfxImageSurface(gfx::IntSize(copyWidth, copyHeight),
-                                                          SurfaceFormat::A8R8G8B8_UINT32,
-                                                          false);
-  if (!imgsurf || imgsurf->CairoStatus()) {
+  RefPtr<DataSourceSurface> sourceSurface =
+    gfx::Factory::CreateDataSourceSurface(gfx::IntSize(copyWidth, copyHeight),
+                                          SurfaceFormat::B8G8R8A8,
+                                          false);
+  // In certain scenarios, requesting larger than 8k image fails.  Bug 803568
+  // covers the details of how to run into it, but the full detailed
+  // investigation hasn't been done to determine the underlying cause.  We
+  // will just handle the failure to allocate the surface to avoid a crash.
+  if (!sourceSurface) {
     return NS_ERROR_FAILURE;
   }
 
+  uint8_t *dstLine = sourceSurface->GetData();
+  if (!dstLine) {
+    return NS_ERROR_OUT_OF_MEMORY;
+  }
+  int32_t dstStride = sourceSurface->Stride();
+
   uint32_t copyX = dirtyRect.x - aX;
   uint32_t copyY = dirtyRect.y - aY;
-  //uint8_t *src = aArray->Data();
-  uint8_t *dst = imgsurf->Data();
   uint8_t* srcLine = aArray->Data() + copyY * (aW * 4) + copyX * 4;
   // For opaque canvases, we must still premultiply the RGB components, but write the alpha as opaque.
   uint8_t alphaMask = mOpaque ? 255 : 0;
 #if 0
   printf("PutImageData_explicit: dirty x=%d y=%d w=%d h=%d copy x=%d y=%d w=%d h=%d ext x=%d y=%d w=%d h=%d\n",
        dirtyRect.x, dirtyRect.y, copyWidth, copyHeight,
        copyX, copyY, copyWidth, copyHeight,
        x, y, w, h);
 #endif
   for (uint32_t j = 0; j < copyHeight; j++) {
     uint8_t *src = srcLine;
+    uint8_t *dst = dstLine;
     for (uint32_t i = 0; i < copyWidth; i++) {
       uint8_t r = *src++;
       uint8_t g = *src++;
       uint8_t b = *src++;
       uint8_t a = *src++;
 
       // Convert to premultiplied color (losslessly if the input came from getImageData)
 #if MOZ_LITTLE_ENDIAN
@@ -5847,39 +5859,32 @@ CanvasRenderingContext2D::PutImageData_e
 #else
       *dst++ = a | alphaMask;
       *dst++ = gfxUtils::sPremultiplyTable[a * 256 + r];
       *dst++ = gfxUtils::sPremultiplyTable[a * 256 + g];
       *dst++ = gfxUtils::sPremultiplyTable[a * 256 + b];
 #endif
     }
     srcLine += aW * 4;
+    // Note that dstLine + dstStride might not be the same as "dst" here,
+    // depending the width we asked for and the width the underlying machinery
+    // decided to actually allocate (e.g. to give each row nice alignment).
+    dstLine += dstStride;
   }
 
   // The canvas spec says that the current path, transformation matrix, shadow attributes,
   // global alpha, the clipping region, and global composition operator must not affect the
   // getImageData() and putImageData() methods.
   const gfx::Rect putRect(dirtyRect);
   EnsureTarget(&putRect);
 
   if (!IsTargetValid()) {
     return NS_ERROR_FAILURE;
   }
 
-  RefPtr<SourceSurface> sourceSurface =
-    mTarget->CreateSourceSurfaceFromData(imgsurf->Data(), IntSize(copyWidth, copyHeight), imgsurf->Stride(), SurfaceFormat::B8G8R8A8);
-
-  // In certain scenarios, requesting larger than 8k image fails.  Bug 803568
-  // covers the details of how to run into it, but the full detailed
-  // investigation hasn't been done to determine the underlying cause.  We
-  // will just handle the failure to allocate the surface to avoid a crash.
-  if (!sourceSurface) {
-    return NS_ERROR_FAILURE;
-  }
-
   mTarget->CopySurface(sourceSurface,
                        IntRect(0, 0,
                                dirtyRect.width, dirtyRect.height),
                        IntPoint(dirtyRect.x, dirtyRect.y));
 
   Redraw(gfx::Rect(dirtyRect.x, dirtyRect.y, dirtyRect.width, dirtyRect.height));
 
   return NS_OK;
--- a/dom/canvas/ImageBitmap.cpp
+++ b/dom/canvas/ImageBitmap.cpp
@@ -911,17 +911,17 @@ ImageBitmap::CreateInternal(nsIGlobalObj
   // If the HTMLCanvasElement's rendering context is WebGL, then the snapshot
   // we got from the HTMLCanvasElement is a DataSourceSurface which is a copy
   // of the rendering context. We handle cropping in this case.
   bool needToReportMemoryAllocation = false;
   if ((aCanvasEl.GetCurrentContextType() == CanvasContextType::WebGL1 ||
        aCanvasEl.GetCurrentContextType() == CanvasContextType::WebGL2) &&
       aCropRect.isSome()) {
     // The _surface_ must be a DataSourceSurface.
-    MOZ_ASSERT(surface->GetType() == SurfaceType::DATA,
+    MOZ_ASSERT(surface->IsDataSourceSurface(),
                "The snapshot SourceSurface from WebGL rendering contest is not \
                DataSourceSurface.");
     RefPtr<DataSourceSurface> dataSurface = surface->GetDataSurface();
     croppedSurface = CropAndCopyDataSourceSurface(dataSurface, cropRect);
     cropRect.MoveTo(0, 0);
     needToReportMemoryAllocation = true;
   }
   else {
--- a/dom/canvas/WebGLContextExtensions.cpp
+++ b/dom/canvas/WebGLContextExtensions.cpp
@@ -123,19 +123,21 @@ WebGLContext::IsExtensionSupported(WebGL
         return gl->IsSupported(gl::GLFeature::texture_float_linear);
 
     // WEBGL_
     case WebGLExtensionID::WEBGL_compressed_texture_astc:
         return WebGLExtensionCompressedTextureASTC::IsSupported(this);
     case WebGLExtensionID::WEBGL_compressed_texture_atc:
         return gl->IsExtensionSupported(gl::GLContext::AMD_compressed_ATC_texture);
     case WebGLExtensionID::WEBGL_compressed_texture_etc:
-        return gl->IsSupported(gl::GLFeature::ES3_compatibility);
+        return gl->IsSupported(gl::GLFeature::ES3_compatibility) &&
+               !gl->IsANGLE();
     case WebGLExtensionID::WEBGL_compressed_texture_etc1:
-        return gl->IsExtensionSupported(gl::GLContext::OES_compressed_ETC1_RGB8_texture);
+        return gl->IsExtensionSupported(gl::GLContext::OES_compressed_ETC1_RGB8_texture) &&
+               !gl->IsANGLE();
     case WebGLExtensionID::WEBGL_compressed_texture_pvrtc:
         return gl->IsExtensionSupported(gl::GLContext::IMG_texture_compression_pvrtc);
     case WebGLExtensionID::WEBGL_compressed_texture_s3tc:
         if (gl->IsExtensionSupported(gl::GLContext::EXT_texture_compression_s3tc))
             return true;
 
         return gl->IsExtensionSupported(gl::GLContext::EXT_texture_compression_dxt1) &&
                gl->IsExtensionSupported(gl::GLContext::ANGLE_texture_compression_dxt3) &&
new file mode 100644
--- /dev/null
+++ b/dom/canvas/crashtests/1334366-1.html
@@ -0,0 +1,8 @@
+<script>
+Logger={}; Logger.JSError=function(e){};
+try { o0 = document.createElement('canvas'); } catch(e) { Logger.JSError(e); }
+try { (document.body || document.documentElement).appendChild(o0) } catch(e) { Logger.JSError(e); }
+try { o1 = o0.getContext('2d'); } catch(e) { Logger.JSError(e); }
+try { o1.translate(1152921504606847000, 0.919677262874245) } catch(e) { Logger.JSError(e); }
+try { o1.fillText("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",0.6494016751296356,-16,0.5988693960474034) } catch(e) { Logger.JSError(e); }
+</script>
new file mode 100644
--- /dev/null
+++ b/dom/canvas/crashtests/1334647-1.html
@@ -0,0 +1,8 @@
+<script>
+Logger={}; Logger.JSError=function(e){};
+try { o0 = document.createElement('canvas'); } catch(e) { Logger.JSError(e); }
+try { (document.body || document.documentElement).appendChild(o0) } catch(e) { Logger.JSError(e); }
+try { o1 = o0.getContext('2d'); } catch(e) { Logger.JSError(e); }
+try { o0.width = 311853383.455201; } catch(e) { Logger.JSError(e); }
+try { o1.drawImage(o0, -0.906275445340731, 0.3679144809413502, 2, 32) } catch(e) { Logger.JSError(e); }
+</script>
--- a/dom/canvas/crashtests/crashtests.list
+++ b/dom/canvas/crashtests/crashtests.list
@@ -34,9 +34,11 @@ skip-if(d2d) load 1287515-1.html
 asserts-if(stylo,1) load 1287652-1.html # bug 1324700
 asserts-if(stylo,1) load 1288872-1.html # bug 1324700
 load 1290628-1.html
 asserts-if(stylo,1) load 1283113-1.html # bug 1324700
 load 1286458-1.html
 load 1299062-1.html
 load 1305312-1.html
 load 1298576-1.html
+load 1334366-1.html
+load 1334647-1.html
 
--- a/dom/canvas/test/reftest/filters/reftest-stylo.list
+++ b/dom/canvas/test/reftest/filters/reftest-stylo.list
@@ -1,31 +1,31 @@
 # DO NOT EDIT! This is a auto-generated temporary list for Stylo testing
 default-preferences pref(canvas.filters.enabled,true)
 
-fails == default-color.html default-color.html
+fails asserts-if(stylo,2) == default-color.html default-color.html # bug 1324700
 # == drop-shadow.html drop-shadow.html
-fails == drop-shadow-transformed.html drop-shadow-transformed.html
-fails == global-alpha.html global-alpha.html
-fails == global-composite-operation.html global-composite-operation.html
-fails == liveness.html liveness.html
-fails == multiple-drop-shadows.html multiple-drop-shadows.html
-fails == shadow.html shadow.html
-fails == subregion-fill-paint.html subregion-fill-paint.html
-fails == subregion-stroke-paint.html subregion-stroke-paint.html
-fails == svg-bbox.html svg-bbox.html
-fails == svg-inline.html svg-inline.html
-fails == svg-liveness.html svg-liveness.html
-fails == svg-off-screen.html svg-off-screen.html
-fails == units.html units.html
-fails == units-em.html units-em.html
-fails == units-ex.html units-ex.html
-fails == units-off-screen.html units-off-screen.html
-fails == fillText-with-filter-opacity-1.html fillText-with-filter-opacity-1.html
-fails == fillText-with-filter-opacity-2.html fillText-with-filter-opacity-2.html
-fails == strokeText-with-filter-grayscale-1.html strokeText-with-filter-grayscale-1.html
-fails == strokeText-with-filter-grayscale-2.html strokeText-with-filter-grayscale-2.html
-fails == fillText-with-shadow-1.html fillText-with-shadow-1.html
-fails == fillText-with-shadow-2.html fillText-with-shadow-2.html
-fails == fillText-with-filter-grayscale-1.html fillText-with-filter-grayscale-1.html
-fails == fillText-with-filter-grayscale-2.html fillText-with-filter-grayscale-2.html
-fails == strokeText-with-shadow-1.html strokeText-with-shadow-1.html
-fails == strokeText-with-shadow-2.html strokeText-with-shadow-2.html
+fails asserts-if(stylo,2) == drop-shadow-transformed.html drop-shadow-transformed.html # bug 1324700
+fails asserts-if(stylo,2) == global-alpha.html global-alpha.html # bug 1324700
+fails asserts-if(stylo,2) == global-composite-operation.html global-composite-operation.html # bug 1324700
+fails asserts-if(stylo,1) == liveness.html liveness.html # bug 1324700
+fails asserts-if(stylo,2) == multiple-drop-shadows.html multiple-drop-shadows.html # bug 1324700
+fails asserts-if(stylo,2) == shadow.html shadow.html # bug 1324700
+fails asserts-if(stylo,2) == subregion-fill-paint.html subregion-fill-paint.html # bug 1324700
+fails asserts-if(stylo,2) == subregion-stroke-paint.html subregion-stroke-paint.html # bug 1324700
+fails asserts-if(stylo,2) == svg-bbox.html svg-bbox.html # bug 1324700
+fails asserts-if(stylo,2) == svg-inline.html svg-inline.html # bug 1324700
+fails asserts-if(stylo,2) == svg-liveness.html svg-liveness.html # bug 1324700
+fails asserts-if(stylo,2) == svg-off-screen.html svg-off-screen.html # bug 1324700
+fails asserts-if(stylo,2) == units.html units.html # bug 1324700
+fails asserts-if(stylo,1) == units-em.html units-em.html # bug 1324700
+fails asserts-if(stylo,1) == units-ex.html units-ex.html # bug 1324700
+fails asserts-if(stylo,2) == units-off-screen.html units-off-screen.html # bug 1324700
+fails asserts-if(stylo,2) == fillText-with-filter-opacity-1.html fillText-with-filter-opacity-1.html # bug 1324700
+fails asserts-if(stylo,2) == fillText-with-filter-opacity-2.html fillText-with-filter-opacity-2.html # bug 1324700
+fails asserts-if(stylo,2) == strokeText-with-filter-grayscale-1.html strokeText-with-filter-grayscale-1.html # bug 1324700
+fails asserts-if(stylo,2) == strokeText-with-filter-grayscale-2.html strokeText-with-filter-grayscale-2.html # bug 1324700
+fails asserts-if(stylo,1) == fillText-with-shadow-1.html fillText-with-shadow-1.html # bug 1324700
+fails asserts-if(stylo,1) == fillText-with-shadow-2.html fillText-with-shadow-2.html # bug 1324700
+fails asserts-if(stylo,2) == fillText-with-filter-grayscale-1.html fillText-with-filter-grayscale-1.html # bug 1324700
+fails asserts-if(stylo,2) == fillText-with-filter-grayscale-2.html fillText-with-filter-grayscale-2.html # bug 1324700
+fails asserts-if(stylo,1) == strokeText-with-shadow-1.html strokeText-with-shadow-1.html # bug 1324700
+fails asserts-if(stylo,1) == strokeText-with-shadow-2.html strokeText-with-shadow-2.html # bug 1324700
--- a/dom/canvas/test/reftest/reftest-stylo.list
+++ b/dom/canvas/test/reftest/reftest-stylo.list
@@ -150,25 +150,25 @@ skip-if(!winWidget) pref(webgl.disable-a
 # Do we correctly handle multiple clip paths?
 == clip-multiple-paths.html clip-multiple-paths.html
 
 # Bug 1255062
 == clip-multiple-move-1.html clip-multiple-move-1.html
 == clip-multiple-move-2.html clip-multiple-move-2.html
 
 # Bug 815648
-fails == stroketext-shadow.html stroketext-shadow.html
+fails asserts-if(stylo,1) == stroketext-shadow.html stroketext-shadow.html # bug 1324700
 
 # focus rings
-pref(canvas.focusring.enabled,true) skip-if(cocoaWidget) skip-if(winWidget) needs-focus == drawFocusIfNeeded.html drawFocusIfNeeded.html
-pref(canvas.customfocusring.enabled,true) skip-if(Android||cocoaWidget||winWidget) fuzzy-if(gtkWidget,64,410) needs-focus == drawCustomFocusRing.html drawCustomFocusRing.html
+pref(canvas.focusring.enabled,true) skip-if(cocoaWidget) skip-if(winWidget) asserts-if(stylo,6) needs-focus == drawFocusIfNeeded.html drawFocusIfNeeded.html # bug 1324671
+pref(canvas.customfocusring.enabled,true) skip-if(Android||cocoaWidget||winWidget) fuzzy-if(gtkWidget,64,410) asserts-if(stylo,6) needs-focus == drawCustomFocusRing.html drawCustomFocusRing.html # bug 1324671
 
 # Check that captureStream() displays in a local video element
 == capturestream.html capturestream.html
 
-fails == 1177726-text-stroke-bounds.html 1177726-text-stroke-bounds.html
+fails asserts-if(stylo,1) == 1177726-text-stroke-bounds.html 1177726-text-stroke-bounds.html # bug 1324700
 
 # Canvas Filter Reftests
 include filters/reftest-stylo.list
 
 # Bug 1305963
 == mozCurrentTransform.html mozCurrentTransform.html
 == mozCurrentTransformInverse.html mozCurrentTransformInverse.html
--- a/dom/canvas/test/webgl-conf/generate-wrappers-and-manifest.py
+++ b/dom/canvas/test/webgl-conf/generate-wrappers-and-manifest.py
@@ -14,18 +14,17 @@ WRAPPER_TEMPLATE_FILE = 'mochi-wrapper.h
 MANIFEST_TEMPLATE_FILE = 'mochitest.ini.template'
 ERRATA_FILE = 'mochitest-errata.ini'
 DEST_MANIFEST_PATHSTR = 'generated-mochitest.ini'
 
 BASE_TEST_LIST_PATHSTR = 'checkout/00_test_list.txt'
 GENERATED_PATHSTR = 'generated'
 WEBGL2_TEST_MANGLE = '2_'
 PATH_SEP_MANGLING = '__'
-WEBGL2_SKIP_IF_CONDITION = "(os == 'android' || os == 'linux' || " \
-                           "(os == 'win' && os_version == '5.1'))"
+WEBGL2_SKIP_IF_CONDITION = "(os == 'android' || os == 'linux')"
 
 SUPPORT_DIRS = [
     'checkout',
 ]
 
 EXTRA_SUPPORT_FILES = [
     'always-fail.html',
     'iframe-passthrough.css',
--- a/dom/canvas/test/webgl-conf/generated-mochitest.ini
+++ b/dom/canvas/test/webgl-conf/generated-mochitest.ini
@@ -4748,2761 +4748,2760 @@ support-files = always-fail.html
                 checkout/test-guidelines.md
                 checkout/webgl-conformance-tests.html
                 iframe-passthrough.css
                 mochi-single.html
 
 [generated/test_..__always-fail.html]
 fail-if = 1
 [generated/test_2_conformance2__attribs__gl-vertex-attrib-i-render.html]
-skip-if = (os == 'win') || (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'win') || (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__attribs__gl-vertex-attrib.html]
-skip-if = (os == 'win') || (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'win') || (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__attribs__gl-vertexattribipointer-offsets.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__attribs__gl-vertexattribipointer.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__buffers__bound-buffer-size-change-test.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__buffers__buffer-copying-contents.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__buffers__buffer-copying-restrictions.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__buffers__buffer-data-and-buffer-sub-data-sub-source.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__buffers__buffer-overflow-test.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__buffers__buffer-type-restrictions.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__buffers__get-buffer-sub-data.html]
-skip-if = (os == 'win') || (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'win') || (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__buffers__one-large-uniform-buffer.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__buffers__uniform-buffers.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__context__constants-and-properties-2.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__context__context-attributes-depth-stencil-antialias-obeyed.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__context__context-type-test-2.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__context__methods-2.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__extensions__ext-color-buffer-float.html]
-skip-if = (os == 'mac' && debug) || (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'mac' && debug) || (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__extensions__ext-disjoint-timer-query-webgl2.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__extensions__promoted-extensions-in-shaders.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__extensions__promoted-extensions.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__glsl3__array-as-return-value.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__glsl3__array-assign-constructor.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__glsl3__array-assign.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__glsl3__array-complex-indexing.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__glsl3__array-element-increment.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__glsl3__array-equality.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__glsl3__array-in-complex-expression.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__glsl3__array-length-side-effects.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__glsl3__attrib-location-length-limits.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__glsl3__bool-type-cast-bug-uint-ivec-uvec.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__glsl3__compare-structs-containing-arrays.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__glsl3__compound-assignment-type-combination.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__glsl3__const-array-init.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__glsl3__forbidden-operators.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__glsl3__frag-depth.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__glsl3__invalid-default-precision.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__glsl3__invalid-invariant.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__glsl3__loops-with-side-effects.html]
-skip-if = (os == 'win') || (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'win') || (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__glsl3__misplaced-version-directive.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__glsl3__no-attribute-vertex-shader.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__glsl3__sampler-no-precision.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__glsl3__sequence-operator-returns-non-constant.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__glsl3__shader-linking.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__glsl3__shader-with-1024-character-define.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__glsl3__shader-with-1024-character-identifier.frag.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__glsl3__shader-with-1025-character-define.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__glsl3__shader-with-1025-character-identifier.frag.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__glsl3__shader-with-invalid-characters.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__glsl3__shader-with-mis-matching-uniform-block.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__glsl3__short-circuiting-in-loop-condition.html]
-skip-if = (os == 'win' && os_version == '6.1') || (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'win' && os_version == '6.1') || (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__glsl3__texture-offset-out-of-range.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__glsl3__texture-offset-uniform-texture-coordinate.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__glsl3__tricky-loop-conditions.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__glsl3__unary-minus-operator-in-dynamic-loop.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__glsl3__uniform-block-layout-match.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__glsl3__uniform-block-layouts.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__glsl3__uniform-location-length-limits.html]
-skip-if = (os == 'win' && debug) || (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'win' && debug) || (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__glsl3__valid-invariant.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__glsl3__vector-dynamic-indexing-nv-driver-bug.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__glsl3__vector-dynamic-indexing.html]
-skip-if = (os == 'win') || (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'win') || (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__misc__expando-loss-2.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__misc__getextension-while-pbo-bound-stability.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__misc__instanceof-test.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__misc__object-deletion-behaviour-2.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__misc__uninitialized-test-2.html]
-skip-if = (os == 'mac') || (os == 'win') || (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'mac') || (os == 'win') || (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__misc__views-with-offsets.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__programs__active-built-in-attribs.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__programs__gl-get-frag-data-location.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__query__occlusion-query.html]
-skip-if = (os == 'win') || (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'win') || (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__query__query.html]
-skip-if = (os == 'win') || (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'win') || (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__reading__format-r11f-g11f-b10f.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__reading__read-pixels-from-fbo-test.html]
-skip-if = (os == 'mac') || (os == 'win') || (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'mac') || (os == 'win') || (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__reading__read-pixels-from-rgb8-into-pbo-bug.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__reading__read-pixels-into-pixel-pack-buffer.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__reading__read-pixels-pack-parameters.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__renderbuffers__framebuffer-object-attachment.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__renderbuffers__framebuffer-test.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__renderbuffers__framebuffer-texture-layer.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__renderbuffers__invalidate-framebuffer.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__renderbuffers__multisample-with-full-sample-counts.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__renderbuffers__multisampled-renderbuffer-initialization.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__renderbuffers__readbuffer.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__rendering__attrib-type-match.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__rendering__blitframebuffer-filter-outofbounds.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__rendering__blitframebuffer-filter-srgb.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__rendering__blitframebuffer-multisampled-readbuffer.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__rendering__blitframebuffer-outside-readbuffer.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__rendering__blitframebuffer-scissor-enabled.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__rendering__blitframebuffer-size-overflow.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__rendering__blitframebuffer-srgb-and-linear-drawbuffers.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__rendering__blitframebuffer-stencil-only.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__rendering__blitframebuffer-test.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__rendering__canvas-resizing-with-pbo-bound.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__rendering__clear-func-buffer-type-match.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__rendering__clear-srgb-color-buffer.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__rendering__clipping-wide-points.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__rendering__draw-buffers.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__rendering__element-index-uint.html]
 fail-if = (os != 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__rendering__framebuffer-completeness-unaffected.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__rendering__framebuffer-unsupported.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__rendering__fs-color-type-mismatch-color-buffer-type.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__rendering__instanced-arrays.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__rendering__instanced-rendering-bug.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__rendering__out-of-bounds-index-buffers-after-copying.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__rendering__rendering-sampling-feedback-loop.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__rendering__rgb-format-support.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__rendering__uniform-block-buffer-size.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__samplers__sampler-drawing-test.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__samplers__samplers.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__state__gl-enum-tests.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__state__gl-get-calls.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__state__gl-getstring.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__state__gl-object-get-calls.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-2d-r11f_g11f_b10f-rgb-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-2d-r11f_g11f_b10f-rgb-half_float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-2d-r11f_g11f_b10f-rgb-unsigned_int_10f_11f_11f_rev.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-2d-r16f-red-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-2d-r16f-red-half_float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-2d-r32f-red-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-2d-r8-red-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-2d-r8ui-red_integer-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-2d-rg16f-rg-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-2d-rg16f-rg-half_float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-2d-rg32f-rg-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-2d-rg8-rg-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-2d-rg8ui-rg_integer-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-2d-rgb16f-rgb-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-2d-rgb16f-rgb-half_float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-2d-rgb32f-rgb-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-2d-rgb565-rgb-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-2d-rgb565-rgb-unsigned_short_5_6_5.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-2d-rgb5_a1-rgba-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-2d-rgb5_a1-rgba-unsigned_short_5_5_5_1.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-2d-rgb8-rgb-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-2d-rgb8ui-rgb_integer-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-2d-rgba16f-rgba-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-2d-rgba16f-rgba-half_float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-2d-rgba32f-rgba-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-2d-rgba4-rgba-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-2d-rgba4-rgba-unsigned_short_4_4_4_4.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-2d-rgba8-rgba-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-2d-rgba8ui-rgba_integer-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-2d-srgb8-rgb-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-2d-srgb8_alpha8-rgba-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-3d-r11f_g11f_b10f-rgb-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-3d-r11f_g11f_b10f-rgb-half_float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-3d-r11f_g11f_b10f-rgb-unsigned_int_10f_11f_11f_rev.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-3d-r16f-red-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-3d-r16f-red-half_float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-3d-r32f-red-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-3d-r8-red-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-3d-r8ui-red_integer-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-3d-rg16f-rg-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-3d-rg16f-rg-half_float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-3d-rg32f-rg-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-3d-rg8-rg-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-3d-rg8ui-rg_integer-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-3d-rgb16f-rgb-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-3d-rgb16f-rgb-half_float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-3d-rgb32f-rgb-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-3d-rgb565-rgb-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-3d-rgb565-rgb-unsigned_short_5_6_5.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-3d-rgb5_a1-rgba-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-3d-rgb5_a1-rgba-unsigned_short_5_5_5_1.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-3d-rgb8-rgb-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-3d-rgb8ui-rgb_integer-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-3d-rgba16f-rgba-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-3d-rgba16f-rgba-half_float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-3d-rgba32f-rgba-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-3d-rgba4-rgba-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-3d-rgba4-rgba-unsigned_short_4_4_4_4.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-3d-rgba8-rgba-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-3d-rgba8ui-rgba_integer-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-3d-srgb8-rgb-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas__tex-3d-srgb8_alpha8-rgba-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-2d-r11f_g11f_b10f-rgb-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-2d-r11f_g11f_b10f-rgb-half_float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-2d-r11f_g11f_b10f-rgb-unsigned_int_10f_11f_11f_rev.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-2d-r16f-red-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-2d-r16f-red-half_float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-2d-r32f-red-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-2d-r8-red-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-2d-r8ui-red_integer-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-2d-rg16f-rg-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-2d-rg16f-rg-half_float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-2d-rg32f-rg-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-2d-rg8-rg-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-2d-rg8ui-rg_integer-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-2d-rgb16f-rgb-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-2d-rgb16f-rgb-half_float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-2d-rgb32f-rgb-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-2d-rgb565-rgb-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-2d-rgb565-rgb-unsigned_short_5_6_5.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-2d-rgb5_a1-rgba-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-2d-rgb5_a1-rgba-unsigned_short_5_5_5_1.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-2d-rgb8-rgb-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-2d-rgb8ui-rgb_integer-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-2d-rgb9_e5-rgb-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-2d-rgb9_e5-rgb-half_float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-2d-rgba16f-rgba-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-2d-rgba16f-rgba-half_float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-2d-rgba32f-rgba-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-2d-rgba4-rgba-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-2d-rgba4-rgba-unsigned_short_4_4_4_4.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-2d-rgba8-rgba-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-2d-rgba8ui-rgba_integer-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-2d-srgb8-rgb-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-2d-srgb8_alpha8-rgba-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-3d-r11f_g11f_b10f-rgb-float.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-3d-r11f_g11f_b10f-rgb-half_float.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-3d-r11f_g11f_b10f-rgb-unsigned_int_10f_11f_11f_rev.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-3d-r16f-red-float.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-3d-r16f-red-half_float.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-3d-r32f-red-float.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-3d-r8-red-unsigned_byte.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-3d-r8ui-red_integer-unsigned_byte.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-3d-rg16f-rg-float.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-3d-rg16f-rg-half_float.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-3d-rg32f-rg-float.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-3d-rg8-rg-unsigned_byte.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-3d-rg8ui-rg_integer-unsigned_byte.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-3d-rgb16f-rgb-float.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-3d-rgb16f-rgb-half_float.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-3d-rgb32f-rgb-float.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-3d-rgb565-rgb-unsigned_byte.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-3d-rgb565-rgb-unsigned_short_5_6_5.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-3d-rgb5_a1-rgba-unsigned_byte.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-3d-rgb5_a1-rgba-unsigned_short_5_5_5_1.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-3d-rgb8-rgb-unsigned_byte.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-3d-rgb8ui-rgb_integer-unsigned_byte.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-3d-rgb9_e5-rgb-float.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-3d-rgb9_e5-rgb-half_float.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-3d-rgba16f-rgba-float.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-3d-rgba16f-rgba-half_float.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-3d-rgba32f-rgba-float.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-3d-rgba4-rgba-unsigned_byte.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-3d-rgba4-rgba-unsigned_short_4_4_4_4.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-3d-rgba8-rgba-unsigned_byte.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-3d-rgba8ui-rgba_integer-unsigned_byte.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-3d-srgb8-rgb-unsigned_byte.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__canvas_sub_rectangle__tex-3d-srgb8_alpha8-rgba-unsigned_byte.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-2d-r11f_g11f_b10f-rgb-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-2d-r11f_g11f_b10f-rgb-half_float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-2d-r11f_g11f_b10f-rgb-unsigned_int_10f_11f_11f_rev.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-2d-r16f-red-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-2d-r16f-red-half_float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-2d-r32f-red-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-2d-r8-red-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-2d-r8ui-red_integer-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-2d-rg16f-rg-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-2d-rg16f-rg-half_float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-2d-rg32f-rg-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-2d-rg8-rg-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-2d-rg8ui-rg_integer-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-2d-rgb16f-rgb-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-2d-rgb16f-rgb-half_float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-2d-rgb32f-rgb-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-2d-rgb565-rgb-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-2d-rgb565-rgb-unsigned_short_5_6_5.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-2d-rgb5_a1-rgba-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-2d-rgb5_a1-rgba-unsigned_short_5_5_5_1.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-2d-rgb8-rgb-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-2d-rgb8ui-rgb_integer-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-2d-rgb9_e5-rgb-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-2d-rgb9_e5-rgb-half_float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-2d-rgba16f-rgba-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-2d-rgba16f-rgba-half_float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-2d-rgba32f-rgba-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-2d-rgba4-rgba-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-2d-rgba4-rgba-unsigned_short_4_4_4_4.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-2d-rgba8-rgba-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-2d-rgba8ui-rgba_integer-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-2d-srgb8-rgb-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-2d-srgb8_alpha8-rgba-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-3d-r11f_g11f_b10f-rgb-float.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-3d-r11f_g11f_b10f-rgb-half_float.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-3d-r11f_g11f_b10f-rgb-unsigned_int_10f_11f_11f_rev.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-3d-r16f-red-float.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-3d-r16f-red-half_float.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-3d-r32f-red-float.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-3d-r8-red-unsigned_byte.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-3d-r8ui-red_integer-unsigned_byte.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-3d-rg16f-rg-float.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-3d-rg16f-rg-half_float.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-3d-rg32f-rg-float.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-3d-rg8-rg-unsigned_byte.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-3d-rg8ui-rg_integer-unsigned_byte.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-3d-rgb16f-rgb-float.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-3d-rgb16f-rgb-half_float.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-3d-rgb32f-rgb-float.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-3d-rgb565-rgb-unsigned_byte.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-3d-rgb565-rgb-unsigned_short_5_6_5.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-3d-rgb5_a1-rgba-unsigned_byte.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-3d-rgb5_a1-rgba-unsigned_short_5_5_5_1.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-3d-rgb8-rgb-unsigned_byte.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-3d-rgb8ui-rgb_integer-unsigned_byte.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-3d-rgb9_e5-rgb-float.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-3d-rgb9_e5-rgb-half_float.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-3d-rgba16f-rgba-float.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-3d-rgba16f-rgba-half_float.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-3d-rgba32f-rgba-float.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-3d-rgba4-rgba-unsigned_byte.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-3d-rgba4-rgba-unsigned_short_4_4_4_4.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-3d-rgba8-rgba-unsigned_byte.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-3d-rgba8ui-rgba_integer-unsigned_byte.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-3d-srgb8-rgb-unsigned_byte.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image__tex-3d-srgb8_alpha8-rgba-unsigned_byte.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-2d-r11f_g11f_b10f-rgb-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-2d-r11f_g11f_b10f-rgb-half_float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-2d-r11f_g11f_b10f-rgb-unsigned_int_10f_11f_11f_rev.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-2d-r16f-red-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-2d-r16f-red-half_float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-2d-r32f-red-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-2d-r8-red-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-2d-r8ui-red_integer-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-2d-rg16f-rg-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-2d-rg16f-rg-half_float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-2d-rg32f-rg-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-2d-rg8-rg-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-2d-rg8ui-rg_integer-unsigned_byte.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-2d-rgb16f-rgb-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-2d-rgb16f-rgb-half_float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-2d-rgb32f-rgb-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-2d-rgb565-rgb-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-2d-rgb565-rgb-unsigned_short_5_6_5.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-2d-rgb5_a1-rgba-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-2d-rgb5_a1-rgba-unsigned_short_5_5_5_1.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-2d-rgb8-rgb-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-2d-rgb8ui-rgb_integer-unsigned_byte.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-2d-rgb9_e5-rgb-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-2d-rgb9_e5-rgb-half_float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-2d-rgba16f-rgba-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-2d-rgba16f-rgba-half_float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-2d-rgba32f-rgba-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-2d-rgba4-rgba-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-2d-rgba4-rgba-unsigned_short_4_4_4_4.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-2d-rgba8-rgba-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-2d-rgba8ui-rgba_integer-unsigned_byte.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-2d-srgb8-rgb-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-2d-srgb8_alpha8-rgba-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-3d-r11f_g11f_b10f-rgb-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-3d-r11f_g11f_b10f-rgb-half_float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-3d-r11f_g11f_b10f-rgb-unsigned_int_10f_11f_11f_rev.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-3d-r16f-red-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-3d-r16f-red-half_float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-3d-r32f-red-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-3d-r8-red-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-3d-r8ui-red_integer-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-3d-rg16f-rg-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-3d-rg16f-rg-half_float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-3d-rg32f-rg-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-3d-rg8-rg-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-3d-rg8ui-rg_integer-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-3d-rgb16f-rgb-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-3d-rgb16f-rgb-half_float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-3d-rgb32f-rgb-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-3d-rgb565-rgb-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-3d-rgb565-rgb-unsigned_short_5_6_5.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-3d-rgb5_a1-rgba-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-3d-rgb5_a1-rgba-unsigned_short_5_5_5_1.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-3d-rgb8-rgb-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-3d-rgb8ui-rgb_integer-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-3d-rgb9_e5-rgb-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-3d-rgb9_e5-rgb-half_float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-3d-rgba16f-rgba-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-3d-rgba16f-rgba-half_float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-3d-rgba32f-rgba-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-3d-rgba4-rgba-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-3d-rgba4-rgba-unsigned_short_4_4_4_4.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-3d-rgba8-rgba-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-3d-rgba8ui-rgba_integer-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-3d-srgb8-rgb-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__image_data__tex-3d-srgb8_alpha8-rgba-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__misc__active-3d-texture-bug.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__misc__copy-texture-image-luma-format.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__misc__copy-texture-image-webgl-specific.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__misc__copy-texture-image.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__misc__gl-get-tex-parameter.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__misc__integer-cubemap-specification-order-bug.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__misc__integer-cubemap-texture-sampling.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__misc__mipmap-fbo.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__misc__tex-3d-size-limit.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__misc__tex-image-and-sub-image-with-array-buffer-view-sub-source.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__misc__tex-image-with-bad-args-from-dom-elements.html]
-skip-if = (os == 'win') || (os == 'mac') || (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'win') || (os == 'mac') || (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__misc__tex-image-with-bad-args.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__misc__tex-image-with-different-data-source.html]
-skip-if = (os == 'mac' && debug) || (os == 'win' && debug) || (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'mac' && debug) || (os == 'win' && debug) || (os == 'android' || os == 'linux')
 fail-if = (os == 'mac') || (os == 'win')
 [generated/test_2_conformance2__textures__misc__tex-input-validation.html]
-skip-if = (os == 'win') || (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'win') || (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__misc__tex-mipmap-levels.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__misc__tex-new-formats.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__misc__tex-srgb-mipmap.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__misc__tex-storage-2d.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__misc__tex-storage-and-subimage-3d.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__misc__tex-storage-compressed-formats.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__misc__tex-unpack-params.html]
-skip-if = (os == 'mac' && debug) || (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'mac' && debug) || (os == 'android' || os == 'linux')
 fail-if = (os == 'mac')
 [generated/test_2_conformance2__textures__misc__texel-fetch-undefined.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__misc__texture-npot.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-2d-r11f_g11f_b10f-rgb-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-2d-r11f_g11f_b10f-rgb-half_float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-2d-r11f_g11f_b10f-rgb-unsigned_int_10f_11f_11f_rev.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-2d-r16f-red-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-2d-r16f-red-half_float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-2d-r32f-red-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-2d-r8-red-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-2d-r8ui-red_integer-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-2d-rg16f-rg-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-2d-rg16f-rg-half_float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-2d-rg32f-rg-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-2d-rg8-rg-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-2d-rg8ui-rg_integer-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-2d-rgb16f-rgb-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-2d-rgb16f-rgb-half_float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-2d-rgb32f-rgb-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-2d-rgb565-rgb-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-2d-rgb565-rgb-unsigned_short_5_6_5.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-2d-rgb5_a1-rgba-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-2d-rgb5_a1-rgba-unsigned_short_5_5_5_1.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-2d-rgb8-rgb-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-2d-rgb8ui-rgb_integer-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-2d-rgb9_e5-rgb-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-2d-rgb9_e5-rgb-half_float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-2d-rgba16f-rgba-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-2d-rgba16f-rgba-half_float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-2d-rgba32f-rgba-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-2d-rgba4-rgba-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-2d-rgba4-rgba-unsigned_short_4_4_4_4.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-2d-rgba8-rgba-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-2d-rgba8ui-rgba_integer-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-2d-srgb8-rgb-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-2d-srgb8_alpha8-rgba-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-3d-r11f_g11f_b10f-rgb-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-3d-r11f_g11f_b10f-rgb-half_float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-3d-r11f_g11f_b10f-rgb-unsigned_int_10f_11f_11f_rev.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-3d-r16f-red-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-3d-r16f-red-half_float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-3d-r32f-red-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-3d-r8-red-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-3d-r8ui-red_integer-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-3d-rg16f-rg-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-3d-rg16f-rg-half_float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-3d-rg32f-rg-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-3d-rg8-rg-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-3d-rg8ui-rg_integer-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-3d-rgb16f-rgb-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-3d-rgb16f-rgb-half_float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-3d-rgb32f-rgb-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-3d-rgb565-rgb-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-3d-rgb565-rgb-unsigned_short_5_6_5.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-3d-rgb5_a1-rgba-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-3d-rgb5_a1-rgba-unsigned_short_5_5_5_1.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-3d-rgb8-rgb-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-3d-rgb8ui-rgb_integer-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-3d-rgb9_e5-rgb-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-3d-rgb9_e5-rgb-half_float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-3d-rgba16f-rgba-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-3d-rgba16f-rgba-half_float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-3d-rgba32f-rgba-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-3d-rgba4-rgba-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-3d-rgba4-rgba-unsigned_short_4_4_4_4.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-3d-rgba8-rgba-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-3d-rgba8ui-rgba_integer-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-3d-srgb8-rgb-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__svg_image__tex-3d-srgb8_alpha8-rgba-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-2d-r11f_g11f_b10f-rgb-float.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-2d-r11f_g11f_b10f-rgb-half_float.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-2d-r11f_g11f_b10f-rgb-unsigned_int_10f_11f_11f_rev.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-2d-r16f-red-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-2d-r16f-red-half_float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-2d-r32f-red-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-2d-r8-red-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-2d-r8ui-red_integer-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-2d-rg16f-rg-float.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-2d-rg16f-rg-half_float.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-2d-rg32f-rg-float.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-2d-rg8-rg-unsigned_byte.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-2d-rg8ui-rg_integer-unsigned_byte.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-2d-rgb16f-rgb-float.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-2d-rgb16f-rgb-half_float.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-2d-rgb32f-rgb-float.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-2d-rgb565-rgb-unsigned_byte.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-2d-rgb565-rgb-unsigned_short_5_6_5.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-2d-rgb5_a1-rgba-unsigned_byte.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-2d-rgb5_a1-rgba-unsigned_short_5_5_5_1.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-2d-rgb8-rgb-unsigned_byte.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-2d-rgb8ui-rgb_integer-unsigned_byte.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-2d-rgb9_e5-rgb-float.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-2d-rgb9_e5-rgb-half_float.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-2d-rgba16f-rgba-float.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-2d-rgba16f-rgba-half_float.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-2d-rgba32f-rgba-float.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-2d-rgba4-rgba-unsigned_byte.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-2d-rgba4-rgba-unsigned_short_4_4_4_4.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-2d-rgba8-rgba-unsigned_byte.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-2d-rgba8ui-rgba_integer-unsigned_byte.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-2d-srgb8-rgb-unsigned_byte.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-2d-srgb8_alpha8-rgba-unsigned_byte.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-3d-r11f_g11f_b10f-rgb-float.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-3d-r11f_g11f_b10f-rgb-half_float.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-3d-r11f_g11f_b10f-rgb-unsigned_int_10f_11f_11f_rev.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-3d-r16f-red-float.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-3d-r16f-red-half_float.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-3d-r32f-red-float.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-3d-r8-red-unsigned_byte.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-3d-r8ui-red_integer-unsigned_byte.html]
 fail-if = (os == 'mac')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-3d-rg16f-rg-float.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-3d-rg16f-rg-half_float.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-3d-rg32f-rg-float.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-3d-rg8-rg-unsigned_byte.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-3d-rg8ui-rg_integer-unsigned_byte.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-3d-rgb16f-rgb-float.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-3d-rgb16f-rgb-half_float.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-3d-rgb32f-rgb-float.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-3d-rgb565-rgb-unsigned_byte.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-3d-rgb565-rgb-unsigned_short_5_6_5.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-3d-rgb5_a1-rgba-unsigned_byte.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-3d-rgb5_a1-rgba-unsigned_short_5_5_5_1.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-3d-rgb8-rgb-unsigned_byte.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-3d-rgb8ui-rgb_integer-unsigned_byte.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-3d-rgb9_e5-rgb-float.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-3d-rgb9_e5-rgb-half_float.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-3d-rgba16f-rgba-float.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-3d-rgba16f-rgba-half_float.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-3d-rgba32f-rgba-float.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-3d-rgba4-rgba-unsigned_byte.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-3d-rgba4-rgba-unsigned_short_4_4_4_4.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-3d-rgba8-rgba-unsigned_byte.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-3d-rgba8ui-rgba_integer-unsigned_byte.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-3d-srgb8-rgb-unsigned_byte.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__video__tex-3d-srgb8_alpha8-rgba-unsigned_byte.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-2d-r11f_g11f_b10f-rgb-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-2d-r11f_g11f_b10f-rgb-half_float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-2d-r11f_g11f_b10f-rgb-unsigned_int_10f_11f_11f_rev.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-2d-r16f-red-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-2d-r16f-red-half_float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-2d-r32f-red-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-2d-r8-red-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-2d-r8ui-red_integer-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-2d-rg16f-rg-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-2d-rg16f-rg-half_float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-2d-rg32f-rg-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-2d-rg8-rg-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-2d-rg8ui-rg_integer-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-2d-rgb16f-rgb-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-2d-rgb16f-rgb-half_float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-2d-rgb32f-rgb-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-2d-rgb565-rgb-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-2d-rgb565-rgb-unsigned_short_5_6_5.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-2d-rgb5_a1-rgba-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-2d-rgb5_a1-rgba-unsigned_short_5_5_5_1.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-2d-rgb8-rgb-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-2d-rgb8ui-rgb_integer-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-2d-rgba16f-rgba-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-2d-rgba16f-rgba-half_float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-2d-rgba32f-rgba-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-2d-rgba4-rgba-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-2d-rgba4-rgba-unsigned_short_4_4_4_4.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-2d-rgba8-rgba-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-2d-rgba8ui-rgba_integer-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-2d-srgb8-rgb-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-2d-srgb8_alpha8-rgba-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-3d-r11f_g11f_b10f-rgb-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-3d-r11f_g11f_b10f-rgb-half_float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-3d-r11f_g11f_b10f-rgb-unsigned_int_10f_11f_11f_rev.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-3d-r16f-red-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-3d-r16f-red-half_float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-3d-r32f-red-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-3d-r8-red-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-3d-r8ui-red_integer-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-3d-rg16f-rg-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-3d-rg16f-rg-half_float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-3d-rg32f-rg-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-3d-rg8-rg-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-3d-rg8ui-rg_integer-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-3d-rgb16f-rgb-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-3d-rgb16f-rgb-half_float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-3d-rgb32f-rgb-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-3d-rgb565-rgb-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-3d-rgb565-rgb-unsigned_short_5_6_5.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-3d-rgb5_a1-rgba-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-3d-rgb5_a1-rgba-unsigned_short_5_5_5_1.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-3d-rgb8-rgb-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-3d-rgb8ui-rgb_integer-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-3d-rgba16f-rgba-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-3d-rgba16f-rgba-half_float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-3d-rgba32f-rgba-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-3d-rgba4-rgba-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-3d-rgba4-rgba-unsigned_short_4_4_4_4.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-3d-rgba8-rgba-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-3d-rgba8ui-rgba_integer-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-3d-srgb8-rgb-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__textures__webgl_canvas__tex-3d-srgb8_alpha8-rgba-unsigned_byte.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__transform_feedback__transform_feedback.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__transform_feedback__two-unreferenced-varyings.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__transform_feedback__unwritten-output-defaults-to-zero.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance2__vertex_arrays__vertex-array-object.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__attribs__gl-bindAttribLocation-aliasing.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__attribs__gl-bindAttribLocation-matrix.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__attribs__gl-bindAttribLocation-repeated.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__attribs__gl-disabled-vertex-attrib.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__attribs__gl-enable-vertex-attrib.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__attribs__gl-matrix-attributes.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__attribs__gl-vertex-attrib-render.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__attribs__gl-vertex-attrib-zero-issues.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__attribs__gl-vertexattribpointer-offsets.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__attribs__gl-vertexattribpointer.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__buffers__buffer-bind-test.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__buffers__buffer-data-and-buffer-sub-data.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__buffers__buffer-data-array-buffer-delete.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__buffers__buffer-uninitialized.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__buffers__element-array-buffer-delete-recreate.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__buffers__index-validation-copies-indices.html]
 fail-if = (os != 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__buffers__index-validation-crash-with-buffer-sub-data.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__buffers__index-validation-large-buffer.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__buffers__index-validation-verifies-too-many-indices.html]
 fail-if = (os != 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__buffers__index-validation-with-resized-buffer.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__buffers__index-validation.html]
 fail-if = (os != 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__canvas__buffer-offscreen-test.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__canvas__buffer-preserve-test.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__canvas__canvas-test.html]
-skip-if = (os == 'win') || (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'win') || (os == 'android' || os == 'linux')
 [generated/test_2_conformance__canvas__canvas-zero-size.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__canvas__draw-static-webgl-to-multiple-canvas-test.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__canvas__draw-webgl-to-canvas-test.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__canvas__drawingbuffer-hd-dpi-test.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__canvas__drawingbuffer-static-canvas-test.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__canvas__drawingbuffer-test.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__canvas__framebuffer-bindings-affected-by-to-data-url.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__canvas__framebuffer-bindings-unaffected-on-resize.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__canvas__rapid-resizing.html]
-fail-if = (os == 'win' && os_version == '5.1')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__canvas__texture-bindings-unaffected-on-resize.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__canvas__to-data-url-test.html]
-skip-if = (os == 'win') || (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'win') || (os == 'android' || os == 'linux')
 [generated/test_2_conformance__canvas__viewport-unchanged-upon-resize.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__context__context-attribute-preserve-drawing-buffer.html]
-skip-if = (os == 'win' && os_version == '6.1') || (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'win' && os_version == '6.1') || (os == 'android' || os == 'linux')
 [generated/test_2_conformance__context__context-attributes-alpha-depth-stencil-antialias.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__context__context-creation-and-destruction.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__context__context-creation.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__context__context-eviction-with-garbage-collection.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__context__context-hidden-alpha.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__context__context-lost-restored.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__context__context-lost.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__context__context-no-alpha-fbo-with-alpha.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__context__context-release-upon-reload.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__context__context-release-with-workers.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__context__context-size-change.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__context__incorrect-context-object-behaviour.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__context__premultiplyalpha-test.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__context__resource-sharing-test.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__context__user-defined-properties-on-context.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__extensions__ext-disjoint-timer-query.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__extensions__ext-texture-filter-anisotropic.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__extensions__get-extension.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__extensions__oes-texture-float-linear.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__extensions__webgl-compressed-texture-atc.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__extensions__webgl-compressed-texture-etc.html]
 fail-if = (os == 'mac') || (os == 'win')
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__extensions__webgl-compressed-texture-pvrtc.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__extensions__webgl-compressed-texture-s3tc-srgb.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__extensions__webgl-compressed-texture-s3tc.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__extensions__webgl-compressed-texture-size-limit.html]
-skip-if = (os == 'win') || (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'win') || (os == 'android' || os == 'linux')
 [generated/test_2_conformance__extensions__webgl-debug-renderer-info.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__extensions__webgl-debug-shaders.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__extensions__webgl-shared-resources.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__bugs__angle-ambiguous-function-call.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__bugs__angle-constructor-invalid-parameters.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__bugs__angle-d3d11-compiler-error.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__bugs__angle-dx-variable-bug.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__bugs__array-of-struct-with-int-first-position.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__bugs__bool-type-cast-bug-int-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__bugs__compare-loop-index-to-uniform.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__bugs__complex-glsl-does-not-crash.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__bugs__compound-assignment-type-combination.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__bugs__conditional-discard-in-loop.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__bugs__conditional-discard-optimization.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__bugs__constant-precision-qualifier.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__bugs__floor-div-cos-should-not-truncate.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__bugs__floored-division-accuracy.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__bugs__fragcoord-linking-bug.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__bugs__gl-fragcoord-multisampling-bug.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__bugs__global-invariant-does-not-leak-across-shaders.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__bugs__invariant-does-not-leak-across-shaders.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__bugs__logic-inside-block-without-braces.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__bugs__long-expressions-should-not-crash.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__bugs__loop-if-loop-gradient.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__bugs__modulo-arithmetic-accuracy.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__bugs__multiplication-assignment.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__bugs__nested-functions-should-not-crash.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__bugs__nested-loops-with-break-and-continue.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__bugs__nested-sequence-operator.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__bugs__pow-of-small-constant-in-user-defined-function.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__bugs__pow-with-constant-exponent-should-not-crash.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__bugs__qualcomm-crash.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__bugs__qualcomm-loop-with-continue-crash.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__bugs__sampler-array-using-loop-index.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__bugs__sampler-struct-function-arg.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__bugs__sequence-operator-evaluation-order.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__bugs__sketchfab-lighting-shader-crash.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__bugs__struct-constructor-highp-bug.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__bugs__temp-expressions-should-not-crash.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__bugs__undefined-index-should-not-crash.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__bugs__uniforms-should-not-lose-values.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__constructors__glsl-construct-bvec2.html]
-skip-if = (os == 'win' && os_version == '6.1') || (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'win' && os_version == '6.1') || (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__constructors__glsl-construct-bvec3.html]
-skip-if = (os == 'win' && os_version == '6.1') || (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'win' && os_version == '6.1') || (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__constructors__glsl-construct-bvec4.html]
-skip-if = (os == 'win' && os_version == '6.1') || (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'win' && os_version == '6.1') || (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__constructors__glsl-construct-ivec2.html]
-skip-if = (os == 'win' && os_version == '6.1') || (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'win' && os_version == '6.1') || (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__constructors__glsl-construct-ivec3.html]
-skip-if = (os == 'win' && os_version == '6.1') || (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'win' && os_version == '6.1') || (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__constructors__glsl-construct-ivec4.html]
-skip-if = (os == 'win' && os_version == '6.1') || (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'win' && os_version == '6.1') || (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__constructors__glsl-construct-mat2.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__constructors__glsl-construct-mat3.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__constructors__glsl-construct-mat4.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__constructors__glsl-construct-vec-mat-corner-cases.html]
-skip-if = (os == 'win' && os_version == '6.1') || (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'win' && os_version == '6.1') || (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__constructors__glsl-construct-vec-mat-index.html]
-skip-if = (os == 'mac') || (os == 'win') || (os == 'linux') || (os == 'android') || (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'mac') || (os == 'win') || (os == 'linux') || (os == 'android') || (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__constructors__glsl-construct-vec2.html]
-skip-if = (os == 'win' && os_version == '6.1') || (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'win' && os_version == '6.1') || (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__constructors__glsl-construct-vec3.html]
-skip-if = (os == 'win' && os_version == '6.1') || (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'win' && os_version == '6.1') || (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__constructors__glsl-construct-vec4.html]
-skip-if = (os == 'win' && os_version == '6.1') || (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'win' && os_version == '6.1') || (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__functions__glsl-function-abs.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__functions__glsl-function-acos.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__functions__glsl-function-asin.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__functions__glsl-function-atan-xy.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__functions__glsl-function-atan.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__functions__glsl-function-ceil.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__functions__glsl-function-clamp-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__functions__glsl-function-clamp-gentype.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__functions__glsl-function-cos.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__functions__glsl-function-cross.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__functions__glsl-function-distance.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__functions__glsl-function-dot.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__functions__glsl-function-faceforward.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__functions__glsl-function-floor.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__functions__glsl-function-fract.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__functions__glsl-function-length.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__functions__glsl-function-max-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__functions__glsl-function-max-gentype.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__functions__glsl-function-min-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__functions__glsl-function-min-gentype.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__functions__glsl-function-mix-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__functions__glsl-function-mix-gentype.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__functions__glsl-function-mod-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__functions__glsl-function-mod-gentype.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__functions__glsl-function-normalize.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__functions__glsl-function-reflect.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__functions__glsl-function-sign.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__functions__glsl-function-sin.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__functions__glsl-function-smoothstep-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__functions__glsl-function-smoothstep-gentype.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__functions__glsl-function-step-float.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__functions__glsl-function-step-gentype.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__functions__glsl-function.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__add_int_float.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__add_int_mat2.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__add_int_mat3.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__add_int_mat4.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__add_int_vec2.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__add_int_vec3.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__add_int_vec4.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__add_ivec2_vec2.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__add_ivec3_vec3.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__add_ivec4_vec4.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__assign_int_to_float.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__assign_ivec2_to_vec2.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__assign_ivec3_to_vec3.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__assign_ivec4_to_vec4.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__construct_struct.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__divide_int_float.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__divide_int_mat2.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__divide_int_mat3.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__divide_int_mat4.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__divide_int_vec2.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__divide_int_vec3.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__divide_int_vec4.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__divide_ivec2_vec2.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__divide_ivec3_vec3.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__divide_ivec4_vec4.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__equal_int_float.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__equal_ivec2_vec2.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__equal_ivec3_vec3.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__equal_ivec4_vec4.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__function_int_float.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__function_ivec2_vec2.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__function_ivec3_vec3.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__function_ivec4_vec4.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__greater_than.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__greater_than_equal.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__less_than.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__less_than_equal.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__multiply_int_float.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__multiply_int_mat2.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__multiply_int_mat3.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__multiply_int_mat4.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__multiply_int_vec2.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__multiply_int_vec3.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__multiply_int_vec4.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__multiply_ivec2_vec2.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__multiply_ivec3_vec3.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__multiply_ivec4_vec4.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__not_equal_int_float.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__not_equal_ivec2_vec2.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__not_equal_ivec3_vec3.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__not_equal_ivec4_vec4.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__subtract_int_float.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__subtract_int_mat2.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__subtract_int_mat3.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__subtract_int_mat4.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__subtract_int_vec2.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__subtract_int_vec3.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__subtract_int_vec4.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__subtract_ivec2_vec2.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__subtract_ivec3_vec3.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__subtract_ivec4_vec4.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__ternary_int_float.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__ternary_ivec2_vec2.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__ternary_ivec3_vec3.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__implicit__ternary_ivec4_vec4.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__literals__float_literal.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__literals__literal_precision.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__literals__overflow_leak.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__matrices__glsl-mat3-construction.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__matrices__glsl-mat4-to-mat3.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__matrices__matrix-compound-multiply.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__boolean_precision.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__const-variable-initialization.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__embedded-struct-definitions-forbidden.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__empty-declaration.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__empty_main.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__expression-list-in-declarator-initializer.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__gl_position_unset.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__global-variable-init.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__glsl-function-nodes.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__glsl-long-variable-names.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__glsl-vertex-branch.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__large-loop-compile.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__non-ascii-comments.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__non-ascii.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__re-compile-re-link.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__sequence-operator-returns-constant.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__shader-precision-format-obeyed.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__shader-struct-scope.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__shader-uniform-packing-restrictions.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__shader-varying-packing-restrictions.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__shader-with-256-character-define.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__shader-with-256-character-identifier.frag.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__shader-with-_webgl-identifier.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__shader-with-arbitrary-indexing.frag.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__shader-with-arbitrary-indexing.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__shader-with-array-of-structs-containing-arrays.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__shader-with-array-of-structs-uniform.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__shader-with-attrib-array.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__shader-with-attrib-struct.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__shader-with-clipvertex.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__shader-with-comma-assignment.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__shader-with-comma-conditional-assignment.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__shader-with-comma-separated-variable-declarations.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__shader-with-conditional-scoping-negative.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__shader-with-conditional-scoping.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__shader-with-default-precision.frag.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__shader-with-default-precision.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__shader-with-dfdx-no-ext.frag.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__shader-with-dfdx.frag.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__shader-with-do-loop.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__shader-with-error-directive.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__shader-with-explicit-int-cast.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__shader-with-float-return-value.frag.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__shader-with-for-loop.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__shader-with-for-scoping.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__shader-with-frag-depth.frag.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__shader-with-function-recursion.frag.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__shader-with-function-scoped-struct.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__shader-with-functional-scoping.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__shader-with-glcolor.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__shader-with-gles-1.frag.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__shader-with-gles-symbol.frag.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__shader-with-global-variable-precision-mismatch.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__shader-with-glprojectionmatrix.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__shader-with-hex-int-constant-macro.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__shader-with-implicit-vec3-to-vec4-cast.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__shader-with-include.vert.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__shader-with-int-return-value.frag.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__shader-with-invalid-identifier.frag.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__shader-with-ivec2-return-value.frag.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__shader-with-ivec3-return-value.frag.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__shader-with-ivec4-return-value.frag.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__shader-with-limited-indexing.frag.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__shader-with-long-line.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__shader-with-non-ascii-error.frag.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' || os == 'linux')
 [generated/test_2_conformance__glsl__misc__shader-with-non-reserved-words.html]
-skip-if = (os == 'android' || os == 'linux' || (os == 'win' && os_version == '5.1'))
+skip-if = (os == 'android' ||