Merge mozilla-inbound to mozilla-central. a=merge
authorDaniel Varga <dvarga@mozilla.com>
Fri, 07 Jun 2019 12:50:35 +0300
changeset 477749 debc7af30b7e0ee50653706c19a10511ceefff83
parent 477748 9183f80b6bf0d03510336ac8faa0b98f50b56e9f (current diff)
parent 477680 837a81caab2606b6c7a481c7f0ec991f6e25d906 (diff)
child 477750 9909cd207cc21bf0de639e211fcfe950690f31a5
child 477809 e2466ef0af2263a240a42d6edfef655464cbefc5
push id113372
push userdvarga@mozilla.com
push dateFri, 07 Jun 2019 10:07:35 +0000
treeherdermozilla-inbound@9909cd207cc2 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone69.0a1
first release with
nightly linux32
debc7af30b7e / 69.0a1 / 20190607095118 / files
nightly linux64
debc7af30b7e / 69.0a1 / 20190607095118 / files
nightly mac
debc7af30b7e / 69.0a1 / 20190607095118 / files
nightly win32
debc7af30b7e / 69.0a1 / 20190607095118 / files
nightly win64
debc7af30b7e / 69.0a1 / 20190607095118 / files
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
releases
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge mozilla-inbound to mozilla-central. a=merge
layout/style/test/property_database.js
modules/libpref/init/all.js
testing/web-platform/meta/2dcontext/shadows/2d.shadow.enable.y.html.ini
testing/web-platform/meta/hr-time/idlharness.any.js.ini
testing/web-platform/meta/webauthn/createcredential-pubkeycredparams.https.html.ini
testing/web-platform/meta/xhr/event-timeout.any.js.ini
toolkit/content/aboutSupport.js
new file mode 100644
--- /dev/null
+++ b/dom/localstorage/test/unit/test_uri_encoding_edge_cases.js
@@ -0,0 +1,60 @@
+/**
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+/**
+ * This test verifies that group and origin strings for URIs with special
+ * characters are consistent between calling
+ * EnsureQuotaForOringin/EnsureOriginIsInitailized and GetQuotaObject in
+ * PrepareDatastoreOp, so writing to local storage won't cause a crash because
+ * of a null quota object. See bug 1516333.
+ */
+
+async function testSteps() {
+  /**
+   * The edge cases are specified in this array of origins. Each edge case must
+   * contain two properties uri and path (origin directory path relative to the
+   * profile directory).
+   */
+  const origins = [
+    {
+      uri: "file:///test'.html",
+      path: "storage/default/file++++test'.html",
+    },
+    {
+      uri: "file:///test>.html",
+      path: "storage/default/file++++test%3E.html",
+    },
+  ];
+
+  for (let origin of origins) {
+    const principal = getPrincipal(origin.uri);
+
+    let originDir = getRelativeFile(origin.path);
+
+    info("Checking the origin directory existence");
+
+    ok(!originDir.exists(),
+      `The origin directory ${origin.path} should not exists`);
+
+    info("Getting storage");
+
+    let storage = getLocalStorage(principal);
+
+    info("Adding item");
+
+    storage.setItem("foo", "bar");
+
+    info("Resetting origin");
+
+    // This forces any pending changes to be flushed to disk (including origin
+    // directory creation).
+    let request = resetOrigin(principal);
+    await requestFinished(request);
+
+    info("Checking the origin directory existence");
+
+    ok(originDir.exists(), `The origin directory ${origin.path} should exist`);
+  }
+}
--- a/dom/localstorage/test/unit/xpcshell.ini
+++ b/dom/localstorage/test/unit/xpcshell.ini
@@ -39,9 +39,10 @@ run-sequentially = this test depends on 
 [test_migration.js]
 [test_orderingAfterRemoveAdd.js]
 [test_originInit.js]
 [test_schema3upgrade.js]
 [test_snapshotting.js]
 requesttimeoutfactor = 4
 [test_stringLength.js]
 [test_stringLength2.js]
+[test_uri_encoding_edge_cases.js]
 [test_usage.js]
--- a/dom/quota/ActorsParent.cpp
+++ b/dom/quota/ActorsParent.cpp
@@ -3724,41 +3724,32 @@ already_AddRefed<QuotaObject> QuotaManag
       NS_ENSURE_SUCCESS(rv, nullptr);
     } else {
       fileSize = 0;
     }
   } else {
     fileSize = aFileSize;
   }
 
-  // Re-escape our parameters above to make sure we get the right quota group.
-  nsAutoCString group;
-  rv = NS_EscapeURL(aGroup, esc_Query, group, fallible);
-  NS_ENSURE_SUCCESS(rv, nullptr);
-
-  nsAutoCString origin;
-  rv = NS_EscapeURL(aOrigin, esc_Query, origin, fallible);
-  NS_ENSURE_SUCCESS(rv, nullptr);
-
   RefPtr<QuotaObject> result;
   {
     MutexAutoLock lock(mQuotaMutex);
 
     GroupInfoPair* pair;
-    if (!mGroupInfoPairs.Get(group, &pair)) {
+    if (!mGroupInfoPairs.Get(aGroup, &pair)) {
       return nullptr;
     }
 
     RefPtr<GroupInfo> groupInfo = pair->LockedGetGroupInfo(aPersistenceType);
 
     if (!groupInfo) {
       return nullptr;
     }
 
-    RefPtr<OriginInfo> originInfo = groupInfo->LockedGetOriginInfo(origin);
+    RefPtr<OriginInfo> originInfo = groupInfo->LockedGetOriginInfo(aOrigin);
 
     if (!originInfo) {
       return nullptr;
     }
 
     // We need this extra raw pointer because we can't assign to the smart
     // pointer directly since QuotaObject::AddRef would try to acquire the same
     // mutex.
--- a/gfx/layers/d3d11/CompositorD3D11.cpp
+++ b/gfx/layers/d3d11/CompositorD3D11.cpp
@@ -228,26 +228,27 @@ bool CompositorD3D11::Initialize(nsCStri
       /**
        * Create a swap chain, this swap chain will contain the backbuffer for
        * the window we draw to. The front buffer is the full screen front
        * buffer.
        */
       hr = dxgiFactory2->CreateSwapChainForHwnd(mDevice, mHwnd, &swapDesc,
                                                 nullptr, nullptr,
                                                 getter_AddRefs(swapChain));
-      if (Failed(hr, "create swap chain")) {
-        *out_failureReason = "FEATURE_FAILURE_D3D11_SWAP_CHAIN";
-        return false;
-      }
+      if (SUCCEEDED(hr)) {
+        DXGI_RGBA color = {1.0f, 1.0f, 1.0f, 1.0f};
+        swapChain->SetBackgroundColor(&color);
 
-      DXGI_RGBA color = {1.0f, 1.0f, 1.0f, 1.0f};
-      swapChain->SetBackgroundColor(&color);
+        mSwapChain = swapChain;
+      }
+    }
 
-      mSwapChain = swapChain;
-    } else
+    // In some configurations double buffering may have failed with an
+    // ACCESS_DENIED error.
+    if (!mSwapChain)
 #endif
     {
       DXGI_SWAP_CHAIN_DESC swapDesc;
       ::ZeroMemory(&swapDesc, sizeof(swapDesc));
       swapDesc.BufferDesc.Width = 0;
       swapDesc.BufferDesc.Height = 0;
       swapDesc.BufferDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
       swapDesc.BufferDesc.RefreshRate.Numerator = 60;
--- a/layout/printing/nsPrintJob.cpp
+++ b/layout/printing/nsPrintJob.cpp
@@ -1,22 +1,24 @@
 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #include "nsPrintJob.h"
 
+#include "nsDocShell.h"
 #include "nsIStringBundle.h"
 #include "nsReadableUtils.h"
 #include "nsCRT.h"
 
 #include "mozilla/AsyncEventDispatcher.h"
 #include "mozilla/ComputedStyleInlines.h"
+#include "mozilla/dom/BrowsingContext.h"
 #include "mozilla/dom/Selection.h"
 #include "mozilla/dom/CustomEvent.h"
 #include "mozilla/dom/ScriptSettings.h"
 #include "nsIScriptGlobalObject.h"
 #include "nsPIDOMWindow.h"
 #include "nsIDocShell.h"
 #include "nsIURI.h"
 #include "nsITextToSubURI.h"
@@ -444,16 +446,50 @@ static void MapContentToWebShells(const 
 
   // Continue recursively walking the chilren of this PO
   for (const UniquePtr<nsPrintObject>& kid : aPO->mKids) {
     MapContentToWebShells(aRootPO, kid);
   }
 }
 
 /**
+ * Recursively builds the static clone document tree.
+ * XXXjwatt - uh, CreateStaticClone already takes care of recursively creating
+ * subdocs (in-process, at least).  nsPrintObject::Init creating a static clone
+ * for subdocs is...broken, surely.
+ * The outparam aDocList returns a (depth first) flat list of all the
+ * nsPrintObjects created.
+ */
+static void BuildDocTree(BrowsingContext* aBrowsingContext,
+                         const UniquePtr<nsPrintObject>& aPO,
+                         nsTArray<nsPrintObject*>* aDocList) {
+  MOZ_ASSERT(aBrowsingContext, "Pointer is null!");
+  MOZ_ASSERT(aDocList, "Pointer is null!");
+  MOZ_ASSERT(aPO, "Pointer is null!");
+
+  for (auto& childBC : aBrowsingContext->GetChildren()) {
+    auto window = childBC->GetDOMWindow();
+    if (!window) {
+      // XXXfission - handle OOP-iframes
+      continue;
+    }
+    auto childPO = MakeUnique<nsPrintObject>();
+    childPO->mParent = aPO.get();
+    nsresult rv = childPO->Init(childBC->GetDocShell(), window->GetExtantDoc(),
+                                aPO->mPrintPreview);
+    if (NS_FAILED(rv)) {
+      MOZ_ASSERT_UNREACHABLE("Init failed?");
+    }
+    aPO->mKids.AppendElement(std::move(childPO));
+    aDocList->AppendElement(aPO->mKids.LastElement().get());
+    BuildDocTree(childBC, aPO->mKids.LastElement(), aDocList);
+  }
+}
+
+/**
  * On platforms that support it, sets the printer name stored in the
  * nsIPrintSettings to the default printer if a printer name is not already
  * set.
  * XXXjwatt: Why is this necessary? Can't the code that reads the printer
  * name later "just" use the default printer if a name isn't specified? Then
  * we wouldn't have this inconsistency between platforms and processes.
  */
 static nsresult EnsureSettingsHasPrinterNameSet(
@@ -810,19 +846,20 @@ nsresult nsPrintJob::DoCommonPrint(bool 
     NS_ENSURE_TRUE(
         printData->mPrintDocList.AppendElement(printData->mPrintObject.get()),
         NS_ERROR_OUT_OF_MEMORY);
 
     printData->mIsParentAFrameSet = IsParentAFrameSet(docShell);
     printData->mPrintObject->mFrameType =
         printData->mIsParentAFrameSet ? eFrameSet : eDoc;
 
-    // Build the "tree" of PrintObjects
-    BuildDocTree(printData->mPrintObject->mDocShell, &printData->mPrintDocList,
-                 printData->mPrintObject);
+    // Builds the static clone doc tree and the "tree" of PrintObjects
+    BuildDocTree(nsDocShell::Cast(printData->mPrintObject->mDocShell)
+                     ->GetBrowsingContext(),
+                 printData->mPrintObject, &printData->mPrintDocList);
   }
 
   // The nsAutoScriptBlocker above will now have been destroyed, which may
   // cause our print/print-preview operation to finish. In this case, we
   // should immediately return an error code so that the root caller knows
   // it shouldn't continue to do anything with this instance.
   if (mIsDestroying || (aIsPrintPreview && !mIsCreatingPrintPreview)) {
     return NS_ERROR_FAILURE;
@@ -1237,50 +1274,16 @@ bool nsPrintJob::IsThereARangeSelection(
     return true;
   }
 
   // check to make sure it isn't an insertion selection
   return selection->GetRangeAt(0) && !selection->IsCollapsed();
 }
 
 //---------------------------------------------------------------------
-// Recursively build a list of sub documents to be printed
-// that mirrors the document tree
-void nsPrintJob::BuildDocTree(nsIDocShell* aParentNode,
-                              nsTArray<nsPrintObject*>* aDocList,
-                              const UniquePtr<nsPrintObject>& aPO) {
-  NS_ASSERTION(aParentNode, "Pointer is null!");
-  NS_ASSERTION(aDocList, "Pointer is null!");
-  NS_ASSERTION(aPO, "Pointer is null!");
-
-  int32_t childWebshellCount;
-  aParentNode->GetChildCount(&childWebshellCount);
-  if (childWebshellCount > 0) {
-    for (int32_t i = 0; i < childWebshellCount; i++) {
-      nsCOMPtr<nsIDocShellTreeItem> child;
-      aParentNode->GetChildAt(i, getter_AddRefs(child));
-      nsCOMPtr<nsIDocShell> childAsShell(do_QueryInterface(child));
-
-      nsCOMPtr<nsIContentViewer> viewer;
-      childAsShell->GetContentViewer(getter_AddRefs(viewer));
-      if (viewer) {
-        nsCOMPtr<Document> doc = do_GetInterface(childAsShell);
-        auto po = MakeUnique<nsPrintObject>();
-        po->mParent = aPO.get();
-        nsresult rv = po->Init(childAsShell, doc, aPO->mPrintPreview);
-        if (NS_FAILED(rv)) MOZ_ASSERT_UNREACHABLE("Init failed?");
-        aPO->mKids.AppendElement(std::move(po));
-        aDocList->AppendElement(aPO->mKids.LastElement().get());
-        BuildDocTree(childAsShell, aDocList, aPO->mKids.LastElement());
-      }
-    }
-  }
-}
-
-//---------------------------------------------------------------------
 bool nsPrintJob::IsThereAnIFrameSelected(nsIDocShell* aDocShell,
                                          nsPIDOMWindowOuter* aDOMWin,
                                          bool& aIsParentFrameSet) {
   aIsParentFrameSet = IsParentAFrameSet(aDocShell);
   bool iFrameIsSelected = false;
   if (mPrt && mPrt->mPrintObject) {
     nsPrintObject* po =
         FindPrintObjectByDOMWin(mPrt->mPrintObject.get(), aDOMWin);
@@ -2699,42 +2702,31 @@ already_AddRefed<nsPIDOMWindowOuter> nsP
     return focusedWindow.forget();
   }
 
   return nullptr;
 }
 
 //---------------------------------------------------------------------
 bool nsPrintJob::IsWindowsInOurSubTree(nsPIDOMWindowOuter* window) const {
-  bool found = false;
-
-  // now check to make sure it is in "our" tree of docshells
   if (window) {
-    nsCOMPtr<nsIDocShell> docShell = window->GetDocShell();
-
-    if (docShell) {
-      // get this DocViewer docshell
-      nsCOMPtr<nsIDocShell> thisDVDocShell(do_QueryReferent(mDocShell));
-      while (!found) {
-        if (docShell) {
-          if (docShell == thisDVDocShell) {
-            found = true;
-            break;
-          }
-        } else {
-          break;  // at top of tree
+    nsCOMPtr<nsIDocShell> ourDocShell(do_QueryReferent(mDocShell));
+    if (ourDocShell) {
+      BrowsingContext* ourBC =
+          nsDocShell::Cast(ourDocShell)->GetBrowsingContext();
+      BrowsingContext* bc = window->GetBrowsingContext();
+      while (bc) {
+        if (bc == ourBC) {
+          return true;
         }
-        nsCOMPtr<nsIDocShellTreeItem> docShellItemParent;
-        docShell->GetSameTypeParent(getter_AddRefs(docShellItemParent));
-        docShell = do_QueryInterface(docShellItemParent);
-      }  // while
+        bc = bc->GetParent();
+      }
     }
-  }  // scriptobj
-
-  return found;
+  }
+  return false;
 }
 
 //-------------------------------------------------------
 bool nsPrintJob::DonePrintingPages(nsPrintObject* aPO, nsresult aResult) {
   // NS_ASSERTION(aPO, "Pointer is null!");
   PR_PL(("****** In DV::DonePrintingPages PO: %p (%s)\n", aPO,
          aPO ? gFrameTypesStr[aPO->mFrameType] : ""));
 
--- a/layout/printing/nsPrintJob.h
+++ b/layout/printing/nsPrintJob.h
@@ -165,19 +165,16 @@ class nsPrintJob final : public nsIObser
    * https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement#Properties
    */
   bool HasPrintCallbackCanvas() { return mHasMozPrintCallback; }
   bool PrePrintPage();
   bool PrintPage(nsPrintObject* aPOect, bool& aInRange);
   bool DonePrintingPages(nsPrintObject* aPO, nsresult aResult);
 
   //---------------------------------------------------------------------
-  void BuildDocTree(nsIDocShell* aParentNode,
-                    nsTArray<nsPrintObject*>* aDocList,
-                    const mozilla::UniquePtr<nsPrintObject>& aPO);
   nsresult ReflowDocList(const mozilla::UniquePtr<nsPrintObject>& aPO,
                          bool aSetPixelScale);
 
   MOZ_CAN_RUN_SCRIPT_BOUNDARY
   nsresult ReflowPrintObject(const mozilla::UniquePtr<nsPrintObject>& aPO);
 
   void CalcNumPrintablePages(int32_t& aNumPages);
   void ShowPrintProgress(bool aIsForPrinting, bool& aDoNotify);
--- a/layout/style/test/property_database.js
+++ b/layout/style/test/property_database.js
@@ -102,16 +102,17 @@ var validGradientAndElementValues = [
   "linear-gradient(red, yellow, blue)",
   "linear-gradient(red 1px, yellow 20%, blue 24em, green)",
   "linear-gradient(red, yellow, green, blue 50%)",
   "linear-gradient(red -50%, yellow -25%, green, blue)",
   "linear-gradient(red -99px, yellow, green, blue 120%)",
   "linear-gradient(#ffff00, #ef3, rgba(10, 20, 30, 0.4))",
   "linear-gradient(rgba(10, 20, 30, 0.4), #ffff00, #ef3)",
   "linear-gradient(red, green calc(50% + 20px), blue)",
+  "linear-gradient(180deg, red, blue)",
 
   "linear-gradient(to top, red, blue)",
   "linear-gradient(to bottom, red, blue)",
   "linear-gradient(to left, red, blue)",
   "linear-gradient(to right, red, blue)",
   "linear-gradient(to top left, red, blue)",
   "linear-gradient(to top right, red, blue)",
   "linear-gradient(to bottom left, red, blue)",
--- a/modules/libpref/init/all.js
+++ b/modules/libpref/init/all.js
@@ -1245,21 +1245,18 @@ pref("dom.popup_allowed_events", "change
 
 pref("dom.disable_open_click_delay", 1000);
 pref("dom.serviceWorkers.disable_open_click_delay", 1000);
 
 pref("dom.storage.enabled", true);
 // Whether or not LSNG (Next Generation Local Storage) is enabled.
 // See bug 1517090 for enabling this on Nightly.
 // See bug 1534736 for changing it to EARLY_BETA_OR_EARLIER.
-#ifdef EARLY_BETA_OR_EARLIER
+// See bug 1539835 for enabling this unconditionally.
 pref("dom.storage.next_gen", true);
-#else
-pref("dom.storage.next_gen", false);
-#endif
 pref("dom.storage.default_quota",      5120);
 pref("dom.storage.shadow_writes", true);
 pref("dom.storage.snapshot_prefill", 16384);
 pref("dom.storage.snapshot_gradual_prefill", 4096);
 pref("dom.storage.snapshot_reusing", true);
 pref("dom.storage.testing", false);
 pref("dom.storage.client_validation", true);
 
--- a/servo/components/style/gecko/conversions.rs
+++ b/servo/components/style/gecko/conversions.rs
@@ -384,16 +384,17 @@ impl nsStyleImage {
         let horizontal_style = LengthPercentage::from_gecko_style_coord(&gecko_gradient.mBgPosX);
         let vertical_style = LengthPercentage::from_gecko_style_coord(&gecko_gradient.mBgPosY);
 
         let kind = match gecko_gradient.mShape as u32 {
             structs::NS_STYLE_GRADIENT_SHAPE_LINEAR => {
                 let angle = Angle::from_gecko_style_coord(&gecko_gradient.mAngle);
                 let line_direction = match (angle, horizontal_style, vertical_style) {
                     (Some(a), None, None) => LineDirection::Angle(a),
+                    (None, None, None) => LineDirection::Angle(Angle::from_radians(PI)),
                     (None, Some(horizontal), Some(vertical)) => {
                         line_direction(horizontal, vertical)
                     },
                     _ => {
                         unreachable!("unexpected line direction for linear gradient direction");
                     },
                 };
                 GradientKind::Linear(line_direction)
--- a/storage/TelemetryVFS.cpp
+++ b/storage/TelemetryVFS.cpp
@@ -9,16 +9,17 @@
 #include "mozilla/Preferences.h"
 #include "sqlite3.h"
 #include "nsThreadUtils.h"
 #include "mozilla/dom/quota/PersistenceType.h"
 #include "mozilla/dom/quota/QuotaManager.h"
 #include "mozilla/dom/quota/QuotaObject.h"
 #include "mozilla/net/IOActivityMonitor.h"
 #include "mozilla/IOInterposer.h"
+#include "nsEscape.h"
 
 // The last VFS version for which this file has been updated.
 #define LAST_KNOWN_VFS_VERSION 3
 
 // The last io_methods version for which this file has been updated.
 #define LAST_KNOWN_IOMETHODS_VERSION 3
 
 /**
@@ -313,23 +314,37 @@ already_AddRefed<QuotaObject> GetQuotaOb
   const char* origin = sqlite3_uri_parameter(zURIParameterKey, "origin");
   if (!origin) {
     NS_WARNING(
         "SQLite URI had 'persistenceType' and 'group' but not "
         "'origin'?!");
     return nullptr;
   }
 
+  // Re-escape group and origin to make sure we get the right quota group and
+  // origin.
+  nsAutoCString escGroup;
+  nsresult rv =
+      NS_EscapeURL(nsDependentCString(group), esc_Query, escGroup, fallible);
+  if (NS_WARN_IF(NS_FAILED(rv))) {
+    return nullptr;
+  }
+
+  nsAutoCString escOrigin;
+  rv = NS_EscapeURL(nsDependentCString(origin), esc_Query, escOrigin, fallible);
+  if (NS_WARN_IF(NS_FAILED(rv))) {
+    return nullptr;
+  }
+
   QuotaManager* quotaManager = QuotaManager::Get();
   MOZ_ASSERT(quotaManager);
 
   return quotaManager->GetQuotaObject(
-      PersistenceTypeFromText(nsDependentCString(persistenceType)),
-      nsDependentCString(group), nsDependentCString(origin),
-      NS_ConvertUTF8toUTF16(zName));
+      PersistenceTypeFromText(nsDependentCString(persistenceType)), escGroup,
+      escOrigin, NS_ConvertUTF8toUTF16(zName));
 }
 
 void MaybeEstablishQuotaControl(const char* zName, telemetry_file* pFile,
                                 int flags) {
   MOZ_ASSERT(pFile);
   MOZ_ASSERT(!pFile->quotaObject);
 
   if (!(flags & (SQLITE_OPEN_URI | SQLITE_OPEN_WAL))) {
deleted file mode 100644
--- a/testing/web-platform/meta/2dcontext/shadows/2d.shadow.enable.y.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[2d.shadow.enable.y.html]
-  [Shadows are drawn if shadowOffsetY is set]
-    expected:
-      if (os == "android") and not e10s: FAIL
-
--- a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-088.xht.ini
+++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-088.xht.ini
@@ -1,3 +1,3 @@
 [first-letter-punctuation-088.xht]
   expected:
-    if (os == "android") and not e10s: FAIL
+    if (os == "android"): FAIL
--- a/testing/web-platform/meta/css/css-shapes/shape-outside/values/shape-outside-ellipse-005.html.ini
+++ b/testing/web-platform/meta/css/css-shapes/shape-outside/values/shape-outside-ellipse-005.html.ini
@@ -155,16 +155,18 @@
       if not debug and not webrender and not e10s and (os == "android") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): PASS
       if debug and webrender and e10s and (os == "win") and (version == "10.0.17134") and (processor == "x86_64") and (bits == 64): PASS
       if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
       if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
       if debug and not webrender and e10s and (os == "win") and (version == "10.0.17134") and (processor == "x86_64") and (bits == 64): PASS
       if not debug and not webrender and e10s and (os == "android") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): PASS
       if not debug and webrender and e10s and (os == "win") and (version == "10.0.17134") and (processor == "x86_64") and (bits == 64): PASS
       if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if debug and not webrender and e10s and (os == "android") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): PASS
+      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.17134") and (processor == "aarch64") and (bits == 64): PASS
       FAIL
 
   [test unit: ex - ellipse(closest-side 75ex) - computed]
     expected:
       if os == "win": PASS
       if os == "mac": PASS
       if (os == "android") and not e10s: PASS
       if (os == "android") and e10s: PASS
@@ -207,16 +209,17 @@
       if not debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): PASS
       if debug and not webrender and e10s and (os == "win") and (version == "10.0.17134") and (processor == "x86_64") and (bits == 64): PASS
       if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
       if not debug and webrender and e10s and (os == "win") and (version == "10.0.17134") and (processor == "x86_64") and (bits == 64): PASS
       if not debug and webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): PASS
       if debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): PASS
       if not debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): PASS
       if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.17134") and (processor == "aarch64") and (bits == 64): PASS
       FAIL
 
   [test unit: vh - ellipse(50vh) - computed]
     expected: FAIL
 
   [test unit: vh - ellipse(25vh closest-side) - computed]
     expected:
       if debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): PASS
@@ -229,16 +232,17 @@
       if not debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): PASS
       if debug and not webrender and e10s and (os == "win") and (version == "10.0.17134") and (processor == "x86_64") and (bits == 64): PASS
       if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
       if not debug and webrender and e10s and (os == "win") and (version == "10.0.17134") and (processor == "x86_64") and (bits == 64): PASS
       if not debug and webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): PASS
       if debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): PASS
       if not debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): PASS
       if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.17134") and (processor == "aarch64") and (bits == 64): PASS
       FAIL
 
   [test unit: vmin - ellipse(50vmin) - computed]
     expected: FAIL
 
   [test unit: vmin - ellipse(25vmin closest-side) - computed]
     expected:
       if debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): PASS
@@ -251,16 +255,17 @@
       if not debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): PASS
       if debug and not webrender and e10s and (os == "win") and (version == "10.0.17134") and (processor == "x86_64") and (bits == 64): PASS
       if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
       if not debug and webrender and e10s and (os == "win") and (version == "10.0.17134") and (processor == "x86_64") and (bits == 64): PASS
       if not debug and webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): PASS
       if debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): PASS
       if not debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): PASS
       if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.17134") and (processor == "aarch64") and (bits == 64): PASS
       FAIL
 
   [test unit: vmax - ellipse(50vmax) - computed]
     expected: FAIL
 
   [test unit: vmax - ellipse(25vmax closest-side) - computed]
     expected:
       if debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): PASS
@@ -273,16 +278,17 @@
       if not debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): PASS
       if debug and not webrender and e10s and (os == "win") and (version == "10.0.17134") and (processor == "x86_64") and (bits == 64): PASS
       if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
       if not debug and webrender and e10s and (os == "win") and (version == "10.0.17134") and (processor == "x86_64") and (bits == 64): PASS
       if not debug and webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): PASS
       if debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): PASS
       if not debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): PASS
       if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.17134") and (processor == "aarch64") and (bits == 64): PASS
       FAIL
 
   [test unit: vmin - ellipse(50vmin 100vmin) - inline]
     expected: FAIL
 
   [test unit: pt - ellipse(50pt 100pt) - inline]
     expected: FAIL
 
--- a/testing/web-platform/meta/css/css-ui/appearance-cssom-001.html.ini
+++ b/testing/web-platform/meta/css/css-ui/appearance-cssom-001.html.ini
@@ -885,16 +885,20 @@
   [-webkit-appearance: caps-lock-indicator (invalid)]
     expected:
       if (os == "android") and not e10s: FAIL
       if (os == "android") and e10s: FAIL
 
   [-webkit-appearance: listitem]
     expected: FAIL
 
+  [-webkit-appearance: listitem (invalid)]
+    expected:
+      if os == "android": FAIL
+
   [-webkit-appearance: resizer (invalid)]
     expected:
       if (os == "android") and not e10s: FAIL
       if (os == "android") and e10s: FAIL
 
   [-webkit-appearance: resizerpanel (invalid)]
     expected:
       if (os == "android") and not e10s: FAIL
--- a/testing/web-platform/meta/css/css-writing-modes/text-orientation-script-001e.html.ini
+++ b/testing/web-platform/meta/css/css-writing-modes/text-orientation-script-001e.html.ini
@@ -4,11 +4,11 @@
       if (os == "win"): PASS
       FAIL
 
   [Orientation=Upright]
     expected: FAIL
 
   [Orientation=Rotated]
     expected:
-      if (os == "win"): PASS
+      if os == "win": PASS
       FAIL
 
--- a/testing/web-platform/meta/editing/run/insertparagraph.html.ini
+++ b/testing/web-platform/meta/editing/run/insertparagraph.html.ini
@@ -678,16 +678,19 @@
     expected: FAIL
 
   [[["defaultparagraphseparator","div"\],["insertparagraph",""\]\] "<blockquote>foo[\]bar</blockquote>" compare innerHTML]
     expected: FAIL
 
   [[["defaultparagraphseparator","p"\],["insertparagraph",""\]\] "<blockquote>foo[\]bar</blockquote>" compare innerHTML]
     expected: FAIL
 
+  [insertparagraph - HTML editing conformance tests]
+    expected: FAIL
+
 
 [insertparagraph.html?3001-4000]
   [[["defaultparagraphseparator","div"\],["insertparagraph",""\]\] "<p><b><a href=foo>foo[\]</a></b></p>" compare innerHTML]
     expected: FAIL
 
   [[["defaultparagraphseparator","p"\],["insertparagraph",""\]\] "<div><b><a href=foo>foo[\]</a></b></div>" compare innerHTML]
     expected: FAIL
 
deleted file mode 100644
--- a/testing/web-platform/meta/hr-time/idlharness.any.js.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[idlharness.https.any.serviceworker.html]
-  expected: TIMEOUT
--- a/testing/web-platform/meta/html/browsers/the-window-object/window-open-noopener.html.ini
+++ b/testing/web-platform/meta/html/browsers/the-window-object/window-open-noopener.html.ini
@@ -18,16 +18,17 @@
       if not debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): FAIL
       if debug and not webrender and e10s and (os == "win") and (version == "10.0.17134") and (processor == "x86_64") and (bits == 64): FAIL
       if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): FAIL
       if not debug and webrender and e10s and (os == "win") and (version == "10.0.17134") and (processor == "x86_64") and (bits == 64): FAIL
       if not debug and webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): FAIL
       if debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): FAIL
       if not debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): FAIL
       if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): FAIL
+      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.17134") and (processor == "aarch64") and (bits == 64): FAIL
 
   [Leading noopener should work]
     expected:
       if (os == "android") and e10s: FAIL
       if debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): FAIL
       if debug and not webrender and not e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): FAIL
       if not debug and not webrender and e10s and (os == "win") and (version == "10.0.17134") and (processor == "x86_64") and (bits == 64): FAIL
       if debug and webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): FAIL
@@ -38,16 +39,17 @@
       if not debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): FAIL
       if debug and not webrender and e10s and (os == "win") and (version == "10.0.17134") and (processor == "x86_64") and (bits == 64): FAIL
       if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): FAIL
       if not debug and webrender and e10s and (os == "win") and (version == "10.0.17134") and (processor == "x86_64") and (bits == 64): FAIL
       if not debug and webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): FAIL
       if debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): FAIL
       if not debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): FAIL
       if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): FAIL
+      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.17134") and (processor == "aarch64") and (bits == 64): FAIL
 
   [Interior noopener should work]
     expected:
       if (os == "android") and e10s: FAIL
       if debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): FAIL
       if debug and not webrender and not e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): FAIL
       if not debug and not webrender and e10s and (os == "win") and (version == "10.0.17134") and (processor == "x86_64") and (bits == 64): FAIL
       if debug and webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): FAIL
@@ -58,16 +60,17 @@
       if not debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): FAIL
       if debug and not webrender and e10s and (os == "win") and (version == "10.0.17134") and (processor == "x86_64") and (bits == 64): FAIL
       if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): FAIL
       if not debug and webrender and e10s and (os == "win") and (version == "10.0.17134") and (processor == "x86_64") and (bits == 64): FAIL
       if not debug and webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): FAIL
       if debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): FAIL
       if not debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): FAIL
       if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): FAIL
+      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.17134") and (processor == "aarch64") and (bits == 64): FAIL
 
   [window.open() with 'noopener' should not reuse existing target]
     expected:
       if (os == "android") and e10s: FAIL
 
   [noopener separated only by spaces should work]
     expected: FAIL
 
--- a/testing/web-platform/meta/html/semantics/links/links-created-by-a-and-area-elements/htmlanchorelement_noopener.html.ini
+++ b/testing/web-platform/meta/html/semantics/links/links-created-by-a-and-area-elements/htmlanchorelement_noopener.html.ini
@@ -23,16 +23,17 @@
       if not debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): FAIL
       if debug and not webrender and e10s and (os == "win") and (version == "10.0.17134") and (processor == "x86_64") and (bits == 64): FAIL
       if not debug and not webrender and e10s and (os == "android") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): TIMEOUT
       if not debug and webrender and e10s and (os == "win") and (version == "10.0.17134") and (processor == "x86_64") and (bits == 64): FAIL
       if not debug and webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): FAIL
       if debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): FAIL
       if not debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): FAIL
       if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): FAIL
+      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.17134") and (processor == "aarch64") and (bits == 64): FAIL
 
   [Check that targeting of rel=noopener with a given name reuses an existing subframe with that name]
     expected:
       if debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): FAIL
       if debug and not webrender and not e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): FAIL
       if not debug and not webrender and e10s and (os == "win") and (version == "10.0.17134") and (processor == "x86_64") and (bits == 64): FAIL
       if debug and webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): FAIL
       if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): FAIL
@@ -43,9 +44,10 @@
       if not debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): FAIL
       if debug and not webrender and e10s and (os == "win") and (version == "10.0.17134") and (processor == "x86_64") and (bits == 64): FAIL
       if not debug and not webrender and e10s and (os == "android") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): TIMEOUT
       if not debug and webrender and e10s and (os == "win") and (version == "10.0.17134") and (processor == "x86_64") and (bits == 64): FAIL
       if not debug and webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): FAIL
       if debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): FAIL
       if not debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): FAIL
       if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): FAIL
+      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.17134") and (processor == "aarch64") and (bits == 64): FAIL
 
--- a/testing/web-platform/meta/netinfo/idlharness.any.js.ini
+++ b/testing/web-platform/meta/netinfo/idlharness.any.js.ini
@@ -234,9 +234,10 @@
       if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): FAIL
       if not debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): FAIL
       if debug and not webrender and e10s and (os == "win") and (version == "10.0.17134") and (processor == "x86_64") and (bits == 64): FAIL
       if not debug and webrender and e10s and (os == "win") and (version == "10.0.17134") and (processor == "x86_64") and (bits == 64): FAIL
       if not debug and webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): FAIL
       if debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): FAIL
       if not debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): FAIL
       if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): FAIL
+      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.17134") and (processor == "aarch64") and (bits == 64): FAIL
 
--- a/testing/web-platform/meta/pointerevents/pointerlock/pointerevent_movementxy_when_locked.html.ini
+++ b/testing/web-platform/meta/pointerevents/pointerlock/pointerevent_movementxy_when_locked.html.ini
@@ -14,9 +14,10 @@
       if not debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): TIMEOUT
       if debug and not webrender and e10s and (os == "win") and (version == "10.0.17134") and (processor == "x86_64") and (bits == 64): TIMEOUT
       if not debug and not webrender and e10s and (os == "android") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): NOTRUN
       if not debug and webrender and e10s and (os == "win") and (version == "10.0.17134") and (processor == "x86_64") and (bits == 64): TIMEOUT
       if not debug and webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): TIMEOUT
       if debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): TIMEOUT
       if not debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): TIMEOUT
       if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): TIMEOUT
+      if not debug and (os == "win") and (version == "10.0.17134") and (processor == "aarch64"): TIMEOUT
 
--- a/testing/web-platform/meta/svg/text/reftests/text-clipped-offscreen-move-onscreen.html.ini
+++ b/testing/web-platform/meta/svg/text/reftests/text-clipped-offscreen-move-onscreen.html.ini
@@ -1,4 +1,2 @@
 [text-clipped-offscreen-move-onscreen.html]
-  disabled:
-    if (os == "linux"): https://bugzilla.mozilla.org/show_bug.cgi?id=1552460
-    if (os == "mac"): https://bugzilla.mozilla.org/show_bug.cgi?id=1552460
+  disabled: https://bugzilla.mozilla.org/show_bug.cgi?id=1552460
deleted file mode 100644
--- a/testing/web-platform/meta/webauthn/createcredential-pubkeycredparams.https.html.ini
+++ /dev/null
@@ -1,9 +0,0 @@
-[createcredential-pubkeycredparams.https.html]
-  [Bad pubKeyCredParams: first param has bad alg (0)]
-    expected:
-      if (os == "android") and not e10s: FAIL
-
-  [Bad pubKeyCredParams: first param has bad alg (42)]
-    expected:
-      if (os == "android") and not e10s: FAIL
-
--- a/testing/web-platform/meta/webauthn/createcredential-timeout.https.html.ini
+++ b/testing/web-platform/meta/webauthn/createcredential-timeout.https.html.ini
@@ -1,8 +1,6 @@
 [createcredential-timeout.https.html]
-  expected:
-    if os == "android": ERROR
   [ensure create credential times out]
     expected:
       if os == "android": PASS
       FAIL
 
deleted file mode 100644
--- a/testing/web-platform/meta/xhr/event-timeout.any.js.ini
+++ /dev/null
@@ -1,7 +0,0 @@
-[event-timeout.any.html]
-
-[event-timeout.any.worker.html]
-  [XMLHttpRequest: timeout event]
-    expected:
-      if os == "android": FAIL
-
--- a/toolkit/content/aboutSupport.js
+++ b/toolkit/content/aboutSupport.js
@@ -42,16 +42,17 @@ function toFluentID(str) {
 // snapshot data.  Each function is passed its property's corresponding data,
 // and it's the function's job to update the page with it.
 var snapshotFormatters = {
 
   async application(data) {
     $("application-box").textContent = data.name;
     $("useragent-box").textContent = data.userAgent;
     $("os-box").textContent = data.osVersion;
+    $("binary-box").textContent = Services.dirsvc.get("XREExeF", Ci.nsIFile).path;
     $("supportLink").href = data.supportURL;
     let version = AppConstants.MOZ_APP_VERSION_DISPLAY;
     if (data.vendor)
       version += " (" + data.vendor + ")";
     $("version-box").textContent = version;
     $("buildid-box").textContent = data.buildID;
     if (data.updateChannel)
       $("updatechannel-box").textContent = data.updateChannel;
--- a/toolkit/content/aboutSupport.xhtml
+++ b/toolkit/content/aboutSupport.xhtml
@@ -106,16 +106,23 @@
 
           <tr>
             <th class="column" data-l10n-id="app-basics-os"/>
 
             <td id="os-box">
             </td>
           </tr>
 
+          <tr class="no-copy">
+            <th class="column" data-l10n-id="app-basics-binary"/>
+
+            <td id="binary-box">
+            </td>
+          </tr>
+
           <tr id="profile-row" class="no-copy">
             <th class="column" data-l10n-id="app-basics-profile-dir"/>
 
             <td>
               <button id="profile-dir-button" data-l10n-id="show-dir-label"/>
                <span id="profile-dir-box">
                </span>
             </td>
--- a/toolkit/locales/en-US/toolkit/about/aboutSupport.ftl
+++ b/toolkit/locales/en-US/toolkit/about/aboutSupport.ftl
@@ -33,16 +33,18 @@ processes-type = Type
 processes-count = Count
 app-basics-title = Application Basics
 app-basics-name = Name
 app-basics-version = Version
 app-basics-build-id = Build ID
 app-basics-update-channel = Update Channel
 app-basics-update-history = Update History
 app-basics-show-update-history = Show Update History
+# Represents the path to the binary used to start the application.
+app-basics-binary = Application Binary
 app-basics-profile-dir =
     { PLATFORM() ->
         [linux] Profile Directory
        *[other] Profile Folder
     }
 app-basics-enabled-plugins = Enabled Plugins
 app-basics-build-config = Build Configuration
 app-basics-user-agent = User Agent
--- a/toolkit/xre/nsAppRunner.cpp
+++ b/toolkit/xre/nsAppRunner.cpp
@@ -2357,17 +2357,21 @@ static void ExtractCompatVersionInfo(con
   }
 
   aAppVersion = Substring(aCompatVersion, 0, underscorePos);
   aAppBuildID = Substring(aCompatVersion, underscorePos + 1,
                           slashPos - (underscorePos + 1));
   aPlatformBuildID = Substring(aCompatVersion, slashPos + 1);
 }
 
-static bool IsNewIDLower(nsACString& oldID, nsACString& newID) {
+/**
+ * Compares two build IDs. Returns 0 if they match, < 0 if newID is considered
+ * newer than oldID and > 0 if the oldID is considered newer than newID.
+ */
+static int32_t CompareBuildIDs(nsACString& oldID, nsACString& newID) {
   // For Mozilla builds the build ID is a numeric date string. But it is too
   // large a number for the version comparator to handle so try to just compare
   // them as integer values first.
 
   // ToInteger64 succeeds if the strings contain trailing non-digits so first
   // check that all the characters are digits.
   bool isNumeric = true;
   const char* pos = oldID.BeginReading();
@@ -2389,95 +2393,92 @@ static bool IsNewIDLower(nsACString& old
         break;
       }
       pos++;
     }
   }
 
   if (isNumeric) {
     nsresult rv;
-    uint64_t oldVal;
-    uint64_t newVal;
-    oldVal = oldID.ToInteger64(&rv);
-
-    if (NS_SUCCEEDED(rv)) {
-      newVal = newID.ToInteger64(&rv);
-
-      if (NS_SUCCEEDED(rv)) {
+    CheckedInt<uint64_t> oldVal = oldID.ToInteger64(&rv);
+
+    if (NS_SUCCEEDED(rv) && oldVal.isValid()) {
+      CheckedInt<uint64_t> newVal = newID.ToInteger64(&rv);
+
+      if (NS_SUCCEEDED(rv) && newVal.isValid()) {
         // We have simple numbers for both IDs.
-        return newVal < oldVal;
+        if (oldVal.value() == newVal.value()) {
+          return 0;
+        }
+
+        if (oldVal.value() > newVal.value()) {
+          return 1;
+        }
+
+        return -1;
       }
     }
   }
 
   // If either could not be parsed as a number then something (likely a Linux
   // distribution could have modified the build ID in some way. We don't know
   // what format this may be so let's just fall back to assuming that it's a
   // valid toolkit version.
-  return Version(PromiseFlatCString(newID).get()) <
-         Version(PromiseFlatCString(oldID).get());
+  return CompareVersions(PromiseFlatCString(oldID).get(),
+                         PromiseFlatCString(newID).get());
 }
 
 /**
  * Checks whether the compatibility versions from the previous and current
  * application match. Returns true if there has been no change, false otherwise.
  * The aDowngrade parameter is set to true if the old version is "newer" than
  * the new version.
  */
-bool CheckCompatVersions(const nsACString& aOldCompatVersion,
-                         const nsACString& aNewCompatVersion,
-                         bool* aIsDowngrade) {
+int32_t CompareCompatVersions(const nsACString& aOldCompatVersion,
+                              const nsACString& aNewCompatVersion) {
   // Quick path for the common case.
   if (aOldCompatVersion.Equals(aNewCompatVersion)) {
-    *aIsDowngrade = false;
-    return true;
+    return 0;
   }
 
   // The versions differ for some reason so we will only ever return false from
   // here onwards. We just have to figure out if this is a downgrade or not.
 
   // Hardcode the case where the last run was in safe mode (Bug 1556612). We
   // cannot tell if this is a downgrade or not so just assume it isn't and let
   // the user proceed.
   if (aOldCompatVersion.EqualsLiteral("Safe Mode")) {
-    *aIsDowngrade = false;
-    return false;
+    return -1;
   }
 
   nsCString oldVersion;
   nsCString oldAppBuildID;
   nsCString oldPlatformBuildID;
   ExtractCompatVersionInfo(aOldCompatVersion, oldVersion, oldAppBuildID,
                            oldPlatformBuildID);
 
   nsCString newVersion;
   nsCString newAppBuildID;
   nsCString newPlatformBuildID;
   ExtractCompatVersionInfo(aNewCompatVersion, newVersion, newAppBuildID,
                            newPlatformBuildID);
 
   // In most cases the app version will differ and this is an easy check.
-  if (Version(newVersion.get()) < Version(oldVersion.get())) {
-    *aIsDowngrade = true;
-    return false;
+  int32_t result = CompareVersions(oldVersion.get(), newVersion.get());
+  if (result != 0) {
+    return result;
   }
 
   // Fall back to build ID comparison.
-  if (IsNewIDLower(oldAppBuildID, newAppBuildID)) {
-    *aIsDowngrade = true;
-    return false;
-  }
-
-  if (IsNewIDLower(oldPlatformBuildID, newPlatformBuildID)) {
-    *aIsDowngrade = true;
-    return false;
-  }
-
-  *aIsDowngrade = false;
-  return false;
+  result = CompareBuildIDs(oldAppBuildID, newAppBuildID);
+  if (result != 0) {
+    return result;
+  }
+
+  return CompareBuildIDs(oldPlatformBuildID, newPlatformBuildID);
 }
 
 /**
  * Checks the compatibility.ini file to see if we have updated our application
  * or otherwise invalidated our caches. If the application has been updated,
  * we return false; otherwise, we return true. We also write the status
  * of the caches (valid/invalid) into the return param aCachesOK. The aCachesOK
  * is always invalid if the application has been updated. aIsDowngrade is set to
@@ -2501,17 +2502,19 @@ static bool CheckCompatibility(nsIFile* 
   nsresult rv = parser.Init(file);
   if (NS_FAILED(rv)) return false;
 
   rv = parser.GetString("Compatibility", "LastVersion", aLastVersion);
   if (NS_FAILED(rv)) {
     return false;
   }
 
-  if (!CheckCompatVersions(aLastVersion, aVersion, aIsDowngrade)) {
+  int32_t result = CompareCompatVersions(aLastVersion, aVersion);
+  if (result != 0) {
+    *aIsDowngrade = result > 0;
     return false;
   }
 
   nsAutoCString buf;
   rv = parser.GetString("Compatibility", "LastOSABI", buf);
   if (NS_FAILED(rv) || !aOSABI.Equals(buf)) return false;
 
   rv = parser.GetString("Compatibility", "LastPlatformDir", buf);
--- a/toolkit/xre/nsAppRunner.h
+++ b/toolkit/xre/nsAppRunner.h
@@ -55,19 +55,24 @@ extern bool gIsGtest;
 namespace mozilla {
 nsresult AppInfoConstructor(nsISupports* aOuter, const nsID& aIID,
                             void** aResult);
 }  // namespace mozilla
 
 // Exported for gtests.
 void BuildCompatVersion(const char* aAppVersion, const char* aAppBuildID,
                         const char* aToolkitBuildID, nsACString& aBuf);
-bool CheckCompatVersions(const nsACString& aOldCompatVersion,
-                         const nsACString& aNewCompatVersion,
-                         bool* aIsDowngrade);
+
+/**
+ * Compares the provided compatibility versions. Returns 0 if they match,
+ * < 0 if the new version is considered an upgrade from the old version and
+ * > 0 if the new version is considered a downgrade from the old version.
+ */
+int32_t CompareCompatVersions(const nsACString& aOldCompatVersion,
+                              const nsACString& aNewCompatVersion);
 
 /**
  * Create the nativeappsupport implementation.
  *
  * @note XPCOMInit has not happened yet.
  */
 nsresult NS_CreateNativeAppSupport(nsINativeAppSupport** aResult);
 already_AddRefed<nsINativeAppSupport> NS_GetNativeAppSupport();
--- a/toolkit/xre/test/gtest/TestCompatVersionCompare.cpp
+++ b/toolkit/xre/test/gtest/TestCompatVersionCompare.cpp
@@ -7,21 +7,20 @@
 #include "nsAppRunner.h"
 #include "nsString.h"
 
 void CheckCompatVersionCompare(const nsCString& aOldCompatVersion,
                                const nsCString& aNewCompatVersion,
                                bool aExpectedSame, bool aExpectedDowngrade) {
   printf("Comparing '%s' to '%s'.\n", aOldCompatVersion.get(), aNewCompatVersion.get());
 
-  bool isDowngrade = false;
-  bool isSame = CheckCompatVersions(aOldCompatVersion, aNewCompatVersion, &isDowngrade);
+  int32_t result = CompareCompatVersions(aOldCompatVersion, aNewCompatVersion);
 
-  ASSERT_EQ(aExpectedSame, isSame) << "Version sameness check should match.";
-  ASSERT_EQ(aExpectedDowngrade, isDowngrade) << "Version downgrade check should match.";
+  ASSERT_EQ(aExpectedSame, result == 0) << "Version sameness check should match.";
+  ASSERT_EQ(aExpectedDowngrade, result > 0) << "Version downgrade check should match.";
 }
 
 void CheckExpectedResult(
   const char* aOldAppVersion, const char* aOldAppID, const char* aOldToolkitID,
   const char* aNewAppVersion, const char* aNewAppID, const char* aNewToolkitID,
   bool aExpectedSame, bool aExpectedDowngrade) {
 
   nsCString oldCompatVersion;
@@ -29,16 +28,17 @@ void CheckExpectedResult(
 
   nsCString newCompatVersion;
   BuildCompatVersion(aNewAppVersion, aNewAppID, aNewToolkitID, newCompatVersion);
 
   CheckCompatVersionCompare(oldCompatVersion, newCompatVersion,
                             aExpectedSame, aExpectedDowngrade);
 }
 
+// clang-format off
 TEST(CompatVersionCompare, CompareVersionChange) {
   // Identical
   CheckExpectedResult(
     "67.0",   "20000000000000", "20000000000000",
     "67.0",   "20000000000000", "20000000000000",
     true, false);
 
   // Build ID changes
@@ -119,18 +119,37 @@ TEST(CompatVersionCompare, CompareVersio
     false, true);
 
   // The actual case from bug 1554029:
   CheckExpectedResult(
     "67.0",   "20190516215225", "20190516215225",
     "67.0.5", "20190523030228","20190523030228",
     false, false);
   CheckExpectedResult(
-    "67.0.5", "20190523030228","20190523030228",
+    "67.0.5", "20190523030228", "20190523030228",
     "67.0",   "20190516215225", "20190516215225",
     false, true);
 
+  // A newer or equal version should not go on to test the build IDs (bug 1556612).
+  CheckExpectedResult(
+    "65.0",   "30000000000000", "20000000000000",
+    "66.0",   "20000000000000", "20000000000000",
+    false, false);
+  CheckExpectedResult(
+    "65.0",   "20000000000000", "30000000000000",
+    "66.0",   "20000000000000", "20000000000000",
+    false, false);
+  CheckExpectedResult(
+    "66.0",   "30000000000000", "20000000000000",
+    "65.0",   "20000000000000", "20000000000000",
+    false, true);
+  CheckExpectedResult(
+    "66.0",   "20000000000000", "30000000000000",
+    "65.0",   "20000000000000", "20000000000000",
+    false, true);
+
   // Check that if the last run was safe mode then we consider this an upgrade.
   CheckCompatVersionCompare(
     NS_LITERAL_CSTRING("Safe Mode"),
     NS_LITERAL_CSTRING("67.0.1_20000000000000/20000000000000"),
     false, false);
 }
+// clang-format on
--- a/xpcom/base/nsVersionComparator.cpp
+++ b/xpcom/base/nsVersionComparator.cpp
@@ -5,16 +5,17 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #include "nsVersionComparator.h"
 
 #include <stdlib.h>
 #include <string.h>
 #include <stdint.h>
 #include <errno.h>
+#include "mozilla/CheckedInt.h"
 #if defined(XP_WIN) && !defined(UPDATER_NO_STRING_GLUE_STL)
 #  include <wchar.h>
 #  include "nsString.h"
 #endif
 
 struct VersionPart {
   int32_t numA;
 
@@ -34,16 +35,39 @@ struct VersionPartW {
   uint32_t strBlen;
 
   int32_t numC;
 
   wchar_t* extraD;  // null-terminated
 };
 #endif
 
+static int32_t ns_strtol(const char* aPart, char** aNext) {
+  errno = 0;
+  long result_long = strtol(aPart, aNext, 10);
+
+  // Different platforms seem to disagree on what to return when the value
+  // is out of range so we ensure that it is always what we want it to be.
+  // We choose 0 firstly because that is the default when the number doesn't
+  // exist at all and also because it would be easier to recover from should
+  // you somehow end up in a situation where an old version is invalid. It is
+  // much easier to create a version either larger or smaller than 0, much
+  // harder to do the same with INT_MAX.
+  if (errno != 0) {
+    return 0;
+  }
+
+  mozilla::CheckedInt<int32_t> result = result_long;
+  if (!result.isValid()) {
+    return 0;
+  }
+
+  return result.value();
+}
+
 /**
  * Parse a version part into a number and "extra text".
  *
  * @returns A pointer to the next versionpart, or null if none.
  */
 static char* ParseVP(char* aPart, VersionPart& aResult) {
   char* dot;
 
@@ -61,29 +85,17 @@ static char* ParseVP(char* aPart, Versio
   if (dot) {
     *dot = '\0';
   }
 
   if (aPart[0] == '*' && aPart[1] == '\0') {
     aResult.numA = INT32_MAX;
     aResult.strB = "";
   } else {
-    errno = 0;
-    aResult.numA = strtol(aPart, const_cast<char**>(&aResult.strB), 10);
-
-    // Different platforms seem to disagree on what to return when the value
-    // is out of range so we ensure that it is always what we want it to be.
-    // We choose 0 firstly because that is the default when the number doesn't
-    // exist at all and also because it would be easier to recover from should
-    // you somehow end up in a situation where an old version is invalid. It is
-    // much easier to create a version either larger or smaller than 0, much
-    // harder to do the same with INT_MAX.
-    if (errno != 0) {
-      aResult.numA = 0;
-    }
+    aResult.numA = ns_strtol(aPart, const_cast<char**>(&aResult.strB));
   }
 
   if (!*aResult.strB) {
     aResult.strB = nullptr;
     aResult.strBlen = 0;
   } else {
     if (aResult.strB[0] == '+') {
       static const char kPre[] = "pre";
@@ -92,24 +104,17 @@ static char* ParseVP(char* aPart, Versio
       aResult.strB = kPre;
       aResult.strBlen = sizeof(kPre) - 1;
     } else {
       const char* numstart = strpbrk(aResult.strB, "0123456789+-");
       if (!numstart) {
         aResult.strBlen = strlen(aResult.strB);
       } else {
         aResult.strBlen = numstart - aResult.strB;
-
-        errno = 0;
-        aResult.numC = strtol(numstart, &aResult.extraD, 10);
-
-        // See above for the rationale for using 0 here.
-        if (errno != 0) {
-          aResult.numC = 0;
-        }
+        aResult.numC = ns_strtol(numstart, const_cast<char**>(&aResult.extraD));
 
         if (!*aResult.extraD) {
           aResult.extraD = nullptr;
         }
       }
     }
   }
 
@@ -125,16 +130,34 @@ static char* ParseVP(char* aPart, Versio
 }
 
 /**
  * Parse a version part into a number and "extra text".
  *
  * @returns A pointer to the next versionpart, or null if none.
  */
 #ifdef XP_WIN
+
+static int32_t ns_wcstol(const wchar_t* aPart, wchar_t** aNext) {
+  errno = 0;
+  long result_long = wcstol(aPart, aNext, 10);
+
+  // See above for the rationale for using 0 here.
+  if (errno != 0) {
+    return 0;
+  }
+
+  mozilla::CheckedInt<int32_t> result = result_long;
+  if (!result.isValid()) {
+    return 0;
+  }
+
+  return result.value();
+}
+
 static wchar_t* ParseVP(wchar_t* aPart, VersionPartW& aResult) {
   wchar_t* dot;
 
   aResult.numA = 0;
   aResult.strB = nullptr;
   aResult.strBlen = 0;
   aResult.numC = 0;
   aResult.extraD = nullptr;
@@ -149,23 +172,17 @@ static wchar_t* ParseVP(wchar_t* aPart, 
   }
 
   if (aPart[0] == '*' && aPart[1] == '\0') {
     static wchar_t kEmpty[] = L"";
 
     aResult.numA = INT32_MAX;
     aResult.strB = kEmpty;
   } else {
-    errno = 0;
-    aResult.numA = wcstol(aPart, const_cast<wchar_t**>(&aResult.strB), 10);
-
-    // See above for the rationale for using 0 here.
-    if (errno != 0) {
-      aResult.numA = 0;
-    }
+    aResult.numA = ns_wcstol(aPart, const_cast<wchar_t**>(&aResult.strB));
   }
 
   if (!*aResult.strB) {
     aResult.strB = nullptr;
     aResult.strBlen = 0;
   } else {
     if (aResult.strB[0] == '+') {
       static wchar_t kPre[] = L"pre";
@@ -174,24 +191,17 @@ static wchar_t* ParseVP(wchar_t* aPart, 
       aResult.strB = kPre;
       aResult.strBlen = sizeof(kPre) - 1;
     } else {
       const wchar_t* numstart = wcspbrk(aResult.strB, L"0123456789+-");
       if (!numstart) {
         aResult.strBlen = wcslen(aResult.strB);
       } else {
         aResult.strBlen = numstart - aResult.strB;
-
-        errno = 0;
-        aResult.numC = wcstol(numstart, &aResult.extraD, 10);
-
-        // See above for the rationale for using 0 here.
-        if (errno != 0) {
-          aResult.numC = 0;
-        }
+        aResult.numC = ns_wcstol(numstart, const_cast<wchar_t**>(&aResult.extraD));
 
         if (!*aResult.extraD) {
           aResult.extraD = nullptr;
         }
       }
     }
   }
 
--- a/xpcom/base/nsVersionComparator.h
+++ b/xpcom/base/nsVersionComparator.h
@@ -35,19 +35,28 @@
  *
  * bool IsVersionValid(const char* version) {
  *   return mozilla::Version("15.a2") <= version;
  * }
  */
 
 namespace mozilla {
 
+/**
+ * Compares the version strings provided.
+ *
+ * Returns 0 if the versions match, < 0 if aStrB > aStrA and > 0 if
+ * aStrA > aStrB.
+ */
 int32_t CompareVersions(const char* aStrA, const char* aStrB);
 
 #ifdef XP_WIN
+/**
+ * As above but for wide character strings.
+ */
 int32_t CompareVersions(const char16_t* aStrA, const char16_t* aStrB);
 #endif
 
 struct Version {
   explicit Version(const char* aVersionString) {
     versionContent = strdup(aVersionString);
   }
 
--- a/xpcom/tests/unit/test_versioncomparator.js
+++ b/xpcom/tests/unit/test_versioncomparator.js
@@ -1,12 +1,15 @@
 const {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm");
 
 // Versions to test listed in ascending order, none can be equal
 var comparisons = [
+  "pre",
+  // A number that is too large to be supported should be normalized to 0.
+  String(0x1F0000000),
   "0.9",
   "0.9.1",
   "1.0pre1",
   "1.0pre2",
   "1.0",
   "1.1pre",
   "1.1pre1a",
   "1.1pre1",