Merge mozilla-central to mozilla-inbound
authorCarsten "Tomcat" Book <cbook@mozilla.com>
Fri, 17 Mar 2017 14:55:15 +0100
changeset 348232 e46c08babe02dd7ace9abb099ffbbf2330866832
parent 348231 45fe962251426052b288276a199bb61f762785ae (current diff)
parent 348123 9a95ade0ec97a871f97c397261fc7297e897331f (diff)
child 348233 23a4b7430dd7e83a2809bf3dc41471f154301eda
child 348285 ee95fa01ccd9d290f446b3f9b15d77f369d7c2f7
push id31515
push userkwierso@gmail.com
push dateFri, 17 Mar 2017 18:04:10 +0000
treeherdermozilla-central@23a4b7430dd7 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
milestone55.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge mozilla-central to mozilla-inbound
devtools/server/tests/unit/test_profiler_getsharedlibraryinformation.js
dom/base/nsGlobalWindow.cpp
js/xpconnect/tests/unit/xpcshell.ini
layout/reftests/svg/reftest.list
mobile/android/base/java/org/mozilla/gecko/GeckoApp.java
modules/libpref/init/all.js
testing/web-platform/meta/MANIFEST.json
testing/web-platform/meta/webvtt/webvtt-file-format-parsing/webvtt-cue-text-parsing-rules/tests/entities.html.ini
testing/web-platform/meta/webvtt/webvtt-file-format-parsing/webvtt-cue-text-parsing-rules/tests/tags.html.ini
testing/web-platform/mozilla/meta/MANIFEST.json
third_party/rust/encoding-index-japanese/.cargo-checksum.json
third_party/rust/encoding-index-japanese/.cargo-ok
third_party/rust/encoding-index-japanese/Cargo.toml
third_party/rust/encoding-index-japanese/jis0208.rs
third_party/rust/encoding-index-japanese/jis0212.rs
third_party/rust/encoding-index-japanese/lib.rs
third_party/rust/encoding-index-korean/.cargo-checksum.json
third_party/rust/encoding-index-korean/.cargo-ok
third_party/rust/encoding-index-korean/Cargo.toml
third_party/rust/encoding-index-korean/euc_kr.rs
third_party/rust/encoding-index-korean/lib.rs
third_party/rust/encoding-index-simpchinese/.cargo-checksum.json
third_party/rust/encoding-index-simpchinese/.cargo-ok
third_party/rust/encoding-index-simpchinese/Cargo.toml
third_party/rust/encoding-index-simpchinese/gb18030.rs
third_party/rust/encoding-index-simpchinese/gb18030_ranges.rs
third_party/rust/encoding-index-simpchinese/lib.rs
third_party/rust/encoding-index-singlebyte/.cargo-checksum.json
third_party/rust/encoding-index-singlebyte/.cargo-ok
third_party/rust/encoding-index-singlebyte/Cargo.toml
third_party/rust/encoding-index-singlebyte/ibm866.rs
third_party/rust/encoding-index-singlebyte/iso_8859_10.rs
third_party/rust/encoding-index-singlebyte/iso_8859_13.rs
third_party/rust/encoding-index-singlebyte/iso_8859_14.rs
third_party/rust/encoding-index-singlebyte/iso_8859_15.rs
third_party/rust/encoding-index-singlebyte/iso_8859_16.rs
third_party/rust/encoding-index-singlebyte/iso_8859_2.rs
third_party/rust/encoding-index-singlebyte/iso_8859_3.rs
third_party/rust/encoding-index-singlebyte/iso_8859_4.rs
third_party/rust/encoding-index-singlebyte/iso_8859_5.rs
third_party/rust/encoding-index-singlebyte/iso_8859_6.rs
third_party/rust/encoding-index-singlebyte/iso_8859_7.rs
third_party/rust/encoding-index-singlebyte/iso_8859_8.rs
third_party/rust/encoding-index-singlebyte/koi8_r.rs
third_party/rust/encoding-index-singlebyte/koi8_u.rs
third_party/rust/encoding-index-singlebyte/lib.rs
third_party/rust/encoding-index-singlebyte/macintosh.rs
third_party/rust/encoding-index-singlebyte/windows_1250.rs
third_party/rust/encoding-index-singlebyte/windows_1251.rs
third_party/rust/encoding-index-singlebyte/windows_1252.rs
third_party/rust/encoding-index-singlebyte/windows_1253.rs
third_party/rust/encoding-index-singlebyte/windows_1254.rs
third_party/rust/encoding-index-singlebyte/windows_1255.rs
third_party/rust/encoding-index-singlebyte/windows_1256.rs
third_party/rust/encoding-index-singlebyte/windows_1257.rs
third_party/rust/encoding-index-singlebyte/windows_1258.rs
third_party/rust/encoding-index-singlebyte/windows_874.rs
third_party/rust/encoding-index-singlebyte/x_mac_cyrillic.rs
third_party/rust/encoding-index-tradchinese/.cargo-checksum.json
third_party/rust/encoding-index-tradchinese/.cargo-ok
third_party/rust/encoding-index-tradchinese/Cargo.toml
third_party/rust/encoding-index-tradchinese/big5.rs
third_party/rust/encoding-index-tradchinese/lib.rs
third_party/rust/encoding/.cargo-checksum.json
third_party/rust/encoding/.cargo-ok
third_party/rust/encoding/.gitignore
third_party/rust/encoding/.travis.yml
third_party/rust/encoding/AUTHORS.txt
third_party/rust/encoding/Cargo.toml
third_party/rust/encoding/LICENSE.txt
third_party/rust/encoding/Makefile
third_party/rust/encoding/README.md
third_party/rust/encoding/examples/recode.rs
third_party/rust/encoding/src/all.rs
third_party/rust/encoding/src/codec/ascii.rs
third_party/rust/encoding/src/codec/error.rs
third_party/rust/encoding/src/codec/japanese.rs
third_party/rust/encoding/src/codec/korean.rs
third_party/rust/encoding/src/codec/simpchinese.rs
third_party/rust/encoding/src/codec/singlebyte.rs
third_party/rust/encoding/src/codec/tradchinese.rs
third_party/rust/encoding/src/codec/utf_16.rs
third_party/rust/encoding/src/codec/utf_8.rs
third_party/rust/encoding/src/codec/whatwg.rs
third_party/rust/encoding/src/examples/UTF-8-test.txt
third_party/rust/encoding/src/examples/outer-space-treaty.html
third_party/rust/encoding/src/index/gen_index.py
third_party/rust/encoding/src/label.rs
third_party/rust/encoding/src/lib.rs
third_party/rust/encoding/src/testutils.rs
third_party/rust/encoding/src/types.rs
third_party/rust/encoding/src/util.rs
third_party/rust/encoding_index_tests/.cargo-checksum.json
third_party/rust/encoding_index_tests/.cargo-ok
third_party/rust/encoding_index_tests/Cargo.toml
third_party/rust/encoding_index_tests/index_tests.rs
--- a/addon-sdk/source/test/test-clipboard.js
+++ b/addon-sdk/source/test/test-clipboard.js
@@ -2,85 +2,32 @@
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 "use strict";
 
 require("sdk/clipboard");
 
 const { Cc, Ci } = require("chrome");
 
-const imageTools = Cc["@mozilla.org/image/tools;1"].
-                    getService(Ci.imgITools);
+const imageTools = Cc["@mozilla.org/image/tools;1"].getService(Ci.imgITools);
+const io = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
+const appShellService = Cc['@mozilla.org/appshell/appShellService;1'].getService(Ci.nsIAppShellService);
 
-const io = Cc["@mozilla.org/network/io-service;1"].
-                    getService(Ci.nsIIOService);
-
+const XHTML_NS = "http://www.w3.org/1999/xhtml";
 const base64png = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYA" +
                   "AABzenr0AAAASUlEQVRYhe3O0QkAIAwD0eyqe3Q993AQ3cBSUKpygfsNTy" +
                   "N5ugbQpK0BAADgP0BRDWXWlwEAAAAAgPsA3rzDaAAAAHgPcGrpgAnzQ2FG" +
                   "bWRR9AAAAABJRU5ErkJggg%3D%3D";
 
 const { base64jpeg } = require("./fixtures");
 
 const { platform } = require("sdk/system");
 // For Windows, Mac and Linux, platform returns the following: winnt, darwin and linux.
 var isWindows = platform.toLowerCase().indexOf("win") == 0;
 
-const canvasHTML = "data:text/html," + encodeURIComponent(
-  "<html>\
-    <body>\
-      <canvas width='32' height='32'></canvas>\
-    </body>\
-  </html>"
-);
-
-function comparePixelImages(imageA, imageB, callback) {
-  let tabs = require("sdk/tabs");
-
-  tabs.open({
-    url: canvasHTML,
-
-    onReady: function onReady(tab) {
-      let worker = tab.attach({
-        contentScript: "new " + function() {
-          let canvas = document.querySelector("canvas");
-          let context = canvas.getContext("2d");
-
-          self.port.on("draw-image", function(imageURI) {
-            let img = new Image();
-
-            img.onload = function() {
-              context.drawImage(this, 0, 0);
-
-              let pixels = Array.join(context.getImageData(0, 0, 32, 32).data);
-              self.port.emit("image-pixels", pixels);
-            }
-
-            img.src = imageURI;
-          });
-        }
-      });
-
-      let compared = "";
-
-      worker.port.on("image-pixels", function (pixels) {
-        if (!compared) {
-          compared = pixels;
-          this.emit("draw-image", imageB);
-        } else {
-          tab.close(callback.bind(null, compared === pixels))
-        }
-      });
-
-      worker.port.emit("draw-image", imageA);
-    }
-  });
-}
-
-
 // Test the typical use case, setting & getting with no flavors specified
 exports["test With No Flavor"] = function(assert) {
   var contents = "hello there";
   var flavor = "text";
   var fullFlavor = "text/unicode";
   var clip = require("sdk/clipboard");
 
   // Confirm we set the clipboard
@@ -155,30 +102,49 @@ exports["test Set Image"] = function(ass
   var clip = require("sdk/clipboard");
   var flavor = "image";
   var fullFlavor = "image/png";
 
   assert.ok(clip.set(base64png, flavor), "clipboard set");
   assert.equal(clip.currentFlavors[0], flavor, "flavor is set");
 };
 
-exports["test Get Image"] = function(assert, done) {
+exports["test Get Image"] = function* (assert) {
   var clip = require("sdk/clipboard");
 
   clip.set(base64png, "image");
 
   var contents = clip.get();
+  const hiddenWindow = appShellService.hiddenDOMWindow;
+  const Image = hiddenWindow.Image;
+  const canvas = hiddenWindow.document.createElementNS(XHTML_NS, "canvas");
+  let context = canvas.getContext("2d");
 
-  comparePixelImages(base64png, contents, function (areEquals) {
-    assert.ok(areEquals,
-      "Image gets from clipboard equals to image sets to the clipboard");
+  const imageURLToPixels = (imageURL) => {
+    return new Promise((resolve) => {
+      let img = new Image();
+
+      img.onload = function() {
+        context.drawImage(this, 0, 0);
+
+        let pixels = Array.join(context.getImageData(0, 0, 32, 32).data);
+        resolve(pixels);
+      };
 
-    done();
-  });
-}
+      img.src = imageURL;
+    });
+  };
+
+  let [base64pngPixels, clipboardPixels] = yield Promise.all([
+    imageURLToPixels(base64png), imageURLToPixels(contents),
+  ]);
+
+  assert.ok(base64pngPixels === clipboardPixels,
+            "Image gets from clipboard equals to image sets to the clipboard");
+};
 
 exports["test Set Image Type Not Supported"] = function(assert) {
   var clip = require("sdk/clipboard");
   var flavor = "image";
 
   assert.throws(function () {
     clip.set(base64jpeg, flavor);
   }, "Invalid flavor for image/jpeg");
--- a/b2g/app/b2g.js
+++ b/b2g/app/b2g.js
@@ -884,19 +884,16 @@ pref("dom.apps.reviewer_paths", "/review
 
 // New implementation to unify touch-caret and selection-carets.
 pref("layout.accessiblecaret.enabled", true);
 
 // Show the selection bars at the two ends of the selection highlight. Required
 // by the spec in bug 921965.
 pref("layout.accessiblecaret.bar.enabled", true);
 
-// Hide the caret in cursor mode after 3 seconds.
-pref("layout.accessiblecaret.timeout_ms", 3000);
-
 // Hide carets and text selection dialog during scrolling.
 pref("layout.accessiblecaret.always_show_when_scrolling", false);
 
 // Enable sync with Firefox Accounts.
 pref("services.sync.fxaccounts.enabled", true);
 pref("identity.fxaccounts.enabled", true);
 
 pref("identity.fxaccounts.remote.oauth.uri", "https://oauth.accounts.firefox.com/v1");
--- a/browser/base/content/test/plugins/browser_blocklist_content.js
+++ b/browser/base/content/test/plugins/browser_blocklist_content.js
@@ -67,17 +67,17 @@ add_task(function* () {
 add_task(function* () {
   yield promiseTabLoadEvent(gBrowser.selectedTab, "data:text/html,<html>GO!</html>");
 
   yield asyncSetAndUpdateBlocklist(gTestRoot + "blockNoPlugins.xml", gTestBrowser);
 
   // Hack the planet! Load our blocklist shim, so we can mess with blocklist
   // return results in the content process. Active until we close our tab.
   let mm = gTestBrowser.messageManager;
-  info("test 3a: loading " + gChromeRoot + "blocklist_proxy.js" + "\n");
+  info("test 3a: loading " + gChromeRoot + "blocklist_proxy.js\n");
   mm.loadFrameScript(gChromeRoot + "blocklist_proxy.js", true);
 
   yield promiseTabLoadEvent(gBrowser.selectedTab, gTestRoot + "plugin_test.html");
 
   // Work around for delayed PluginBindingAttached
   yield promiseUpdatePluginBindings(gTestBrowser);
 
   yield ContentTask.spawn(gTestBrowser, {}, function* () {
new file mode 100644
--- /dev/null
+++ b/browser/components/.eslintrc.js
@@ -0,0 +1,9 @@
+"use strict";
+
+module.exports = {
+  rules: {
+    // XXX Bug 1326071 - This should be reduced down - probably to 20 or to
+    // be removed & synced with the toolkit/.eslintrc.js value.
+    "complexity": ["error", {"max": 69}],
+  }
+};
--- a/browser/components/customizableui/test/browser_1087303_button_preferences.js
+++ b/browser/components/customizableui/test/browser_1087303_button_preferences.js
@@ -37,14 +37,14 @@ function waitForPageLoad(aTab) {
   let timeoutId = setTimeout(() => {
     aTab.linkedBrowser.removeEventListener("load", onTabLoad, true);
     deferred.reject("Page didn't load within " + 20000 + "ms");
   }, 20000);
 
   function onTabLoad(event) {
     clearTimeout(timeoutId);
     aTab.linkedBrowser.removeEventListener("load", onTabLoad, true);
-    info("Tab event received: " + "load");
+    info("Tab event received: load");
     deferred.resolve();
  }
   aTab.linkedBrowser.addEventListener("load", onTabLoad, true, true);
   return deferred.promise;
 }
--- a/browser/components/extensions/test/browser/browser-common.ini
+++ b/browser/components/extensions/test/browser/browser-common.ini
@@ -81,16 +81,18 @@ support-files =
 [browser_ext_runtime_openOptionsPage_uninstall.js]
 [browser_ext_runtime_setUninstallURL.js]
 [browser_ext_sessions_getRecentlyClosed.js]
 [browser_ext_sessions_getRecentlyClosed_private.js]
 [browser_ext_sessions_getRecentlyClosed_tabs.js]
 [browser_ext_sessions_restore.js]
 [browser_ext_sidebarAction.js]
 [browser_ext_sidebarAction_context.js]
+[browser_ext_sidebarAction_tabs.js]
+[browser_ext_sidebarAction_windows.js]
 [browser_ext_simple.js]
 [browser_ext_tab_runtimeConnect.js]
 [browser_ext_tabs_audio.js]
 [browser_ext_tabs_captureVisibleTab.js]
 [browser_ext_tabs_create.js]
 [browser_ext_tabs_create_invalid_url.js]
 [browser_ext_tabs_detectLanguage.js]
 [browser_ext_tabs_duplicate.js]
--- a/browser/components/extensions/test/browser/browser_ext_sidebarAction.js
+++ b/browser/components/extensions/test/browser/browser_ext_sidebarAction.js
@@ -80,96 +80,23 @@ add_task(function* sidebar_two_sidebar_a
   yield extension3.unload();
 
   // We just close the sidebar on uninstall of the current sidebar.
   ok(document.getElementById("sidebar-box").hidden, "sidebar box is not visible");
 
   yield extension2.unload();
 });
 
-add_task(function* sidebar_windows() {
-  let extension = ExtensionTestUtils.loadExtension(extData);
-  yield extension.startup();
-  // Test sidebar is opened on install
-  yield extension.awaitMessage("sidebar");
-  ok(!document.getElementById("sidebar-box").hidden, "sidebar box is visible in first window");
-  // Check that the menuitem has our image styling.
-  let elements = document.getElementsByClassName("webextension-menuitem");
-  is(elements.length, 1, "have one menuitem");
-  let style = elements[0].getAttribute("style");
-  ok(style.includes("webextension-menuitem-image"), "this menu has style");
-
-  let secondSidebar = extension.awaitMessage("sidebar");
-
-  // SidebarUI relies on window.opener being set, which is normal behavior when
-  // using menu or key commands to open a new browser window.
-  let win = yield BrowserTestUtils.openNewBrowserWindow({opener: window});
-
-  yield secondSidebar;
-  ok(!win.document.getElementById("sidebar-box").hidden, "sidebar box is visible in second window");
-  // Check that the menuitem has our image styling.
-  elements = win.document.getElementsByClassName("webextension-menuitem");
-  is(elements.length, 1, "have one menuitem");
-  style = elements[0].getAttribute("style");
-  ok(style.includes("webextension-menuitem-image"), "this menu has style");
-
-  yield extension.unload();
-  yield BrowserTestUtils.closeWindow(win);
-});
-
 add_task(function* sidebar_empty_panel() {
   let extension = ExtensionTestUtils.loadExtension(extData);
   yield extension.startup();
   // Test sidebar is opened on install
   yield extension.awaitMessage("sidebar");
   ok(!document.getElementById("sidebar-box").hidden, "sidebar box is visible in first window");
   extension.sendMessage("set-panel");
   yield extension.awaitFinish();
   yield extension.unload();
 });
 
-add_task(function* sidebar_tab_query_bug_1340739() {
-  let data = {
-    manifest: {
-      "permissions": [
-        "tabs",
-      ],
-      "sidebar_action": {
-        "default_panel": "sidebar.html",
-      },
-    },
-    useAddonManager: "temporary",
-    files: {
-      "sidebar.html": `
-        <!DOCTYPE html>
-        <html>
-        <head><meta charset="utf-8"/>
-        <script src="sidebar.js"></script>
-        </head>
-        <body>
-        A Test Sidebar
-        </body></html>
-      `,
-      "sidebar.js": function() {
-        Promise.all([
-          browser.tabs.query({}).then((tabs) => {
-            browser.test.assertEq(1, tabs.length, "got tab without currentWindow");
-          }),
-          browser.tabs.query({currentWindow: true}).then((tabs) => {
-            browser.test.assertEq(1, tabs.length, "got tab with currentWindow");
-          }),
-        ]).then(() => {
-          browser.test.sendMessage("sidebar");
-        });
-      },
-    },
-  };
-
-  let extension = ExtensionTestUtils.loadExtension(data);
-  yield extension.startup();
-  yield extension.awaitMessage("sidebar");
-  yield extension.unload();
-});
-
 add_task(function* cleanup() {
   // This is set on initial sidebar install.
   Services.prefs.clearUserPref("extensions.sidebar-button.shown");
 });
copy from browser/components/extensions/test/browser/browser_ext_sidebarAction.js
copy to browser/components/extensions/test/browser/browser_ext_sidebarAction_tabs.js
--- a/browser/components/extensions/test/browser/browser_ext_sidebarAction.js
+++ b/browser/components/extensions/test/browser/browser_ext_sidebarAction_tabs.js
@@ -1,136 +1,12 @@
 /* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set sts=2 sw=2 et tw=80: */
 "use strict";
 
-let extData = {
-  manifest: {
-    "sidebar_action": {
-      "default_panel": "sidebar.html",
-    },
-  },
-  useAddonManager: "temporary",
-
-  files: {
-    "sidebar.html": `
-      <!DOCTYPE html>
-      <html>
-      <head><meta charset="utf-8"/>
-      <script src="sidebar.js"></script>
-      </head>
-      <body>
-      A Test Sidebar
-      </body></html>
-    `,
-
-    "sidebar.js": function() {
-      window.onload = () => {
-        browser.test.sendMessage("sidebar");
-      };
-    },
-  },
-
-  background: function() {
-    browser.test.onMessage.addListener(msg => {
-      if (msg === "set-panel") {
-        browser.sidebarAction.setPanel({panel: ""}).then(() => {
-          browser.test.notifyFail("empty panel settable");
-        }).catch(() => {
-          browser.test.notifyPass("unable to set empty panel");
-        });
-      }
-    });
-  },
-};
-
-add_task(function* sidebar_initial_install() {
-  ok(document.getElementById("sidebar-box").hidden, "sidebar box is not visible");
-  let extension = ExtensionTestUtils.loadExtension(extData);
-  yield extension.startup();
-  // Test sidebar is opened on install
-  yield extension.awaitMessage("sidebar");
-  ok(!document.getElementById("sidebar-box").hidden, "sidebar box is visible");
-  // Test toolbar button is available
-  ok(document.getElementById("sidebar-button"), "sidebar button is in UI");
-
-  yield extension.unload();
-  // Test that the sidebar was closed on unload.
-  ok(document.getElementById("sidebar-box").hidden, "sidebar box is not visible");
-
-  // Move toolbar button back to customization.
-  CustomizableUI.removeWidgetFromArea("sidebar-button", CustomizableUI.AREA_NAVBAR);
-  ok(!document.getElementById("sidebar-button"), "sidebar button is not in UI");
-});
-
-
-add_task(function* sidebar_two_sidebar_addons() {
-  let extension2 = ExtensionTestUtils.loadExtension(extData);
-  yield extension2.startup();
-  // Test sidebar is opened on install
-  yield extension2.awaitMessage("sidebar");
-  ok(!document.getElementById("sidebar-box").hidden, "sidebar box is visible");
-  // Test toolbar button is NOT available after first install
-  ok(!document.getElementById("sidebar-button"), "sidebar button is not in UI");
-
-  // Test second sidebar install opens new sidebar
-  let extension3 = ExtensionTestUtils.loadExtension(extData);
-  yield extension3.startup();
-  // Test sidebar is opened on install
-  yield extension3.awaitMessage("sidebar");
-  ok(!document.getElementById("sidebar-box").hidden, "sidebar box is visible");
-  yield extension3.unload();
-
-  // We just close the sidebar on uninstall of the current sidebar.
-  ok(document.getElementById("sidebar-box").hidden, "sidebar box is not visible");
-
-  yield extension2.unload();
-});
-
-add_task(function* sidebar_windows() {
-  let extension = ExtensionTestUtils.loadExtension(extData);
-  yield extension.startup();
-  // Test sidebar is opened on install
-  yield extension.awaitMessage("sidebar");
-  ok(!document.getElementById("sidebar-box").hidden, "sidebar box is visible in first window");
-  // Check that the menuitem has our image styling.
-  let elements = document.getElementsByClassName("webextension-menuitem");
-  is(elements.length, 1, "have one menuitem");
-  let style = elements[0].getAttribute("style");
-  ok(style.includes("webextension-menuitem-image"), "this menu has style");
-
-  let secondSidebar = extension.awaitMessage("sidebar");
-
-  // SidebarUI relies on window.opener being set, which is normal behavior when
-  // using menu or key commands to open a new browser window.
-  let win = yield BrowserTestUtils.openNewBrowserWindow({opener: window});
-
-  yield secondSidebar;
-  ok(!win.document.getElementById("sidebar-box").hidden, "sidebar box is visible in second window");
-  // Check that the menuitem has our image styling.
-  elements = win.document.getElementsByClassName("webextension-menuitem");
-  is(elements.length, 1, "have one menuitem");
-  style = elements[0].getAttribute("style");
-  ok(style.includes("webextension-menuitem-image"), "this menu has style");
-
-  yield extension.unload();
-  yield BrowserTestUtils.closeWindow(win);
-});
-
-add_task(function* sidebar_empty_panel() {
-  let extension = ExtensionTestUtils.loadExtension(extData);
-  yield extension.startup();
-  // Test sidebar is opened on install
-  yield extension.awaitMessage("sidebar");
-  ok(!document.getElementById("sidebar-box").hidden, "sidebar box is visible in first window");
-  extension.sendMessage("set-panel");
-  yield extension.awaitFinish();
-  yield extension.unload();
-});
-
 add_task(function* sidebar_tab_query_bug_1340739() {
   let data = {
     manifest: {
       "permissions": [
         "tabs",
       ],
       "sidebar_action": {
         "default_panel": "sidebar.html",
@@ -162,14 +38,15 @@ add_task(function* sidebar_tab_query_bug
       },
     },
   };
 
   let extension = ExtensionTestUtils.loadExtension(data);
   yield extension.startup();
   yield extension.awaitMessage("sidebar");
   yield extension.unload();
-});
 
-add_task(function* cleanup() {
+  // Move toolbar button back to customization.
+  CustomizableUI.removeWidgetFromArea("sidebar-button", CustomizableUI.AREA_NAVBAR);
+  ok(!document.getElementById("sidebar-button"), "sidebar button is not in UI");
   // This is set on initial sidebar install.
   Services.prefs.clearUserPref("extensions.sidebar-button.shown");
 });
copy from browser/components/extensions/test/browser/browser_ext_sidebarAction.js
copy to browser/components/extensions/test/browser/browser_ext_sidebarAction_windows.js
--- a/browser/components/extensions/test/browser/browser_ext_sidebarAction.js
+++ b/browser/components/extensions/test/browser/browser_ext_sidebarAction_windows.js
@@ -23,73 +23,18 @@ let extData = {
     `,
 
     "sidebar.js": function() {
       window.onload = () => {
         browser.test.sendMessage("sidebar");
       };
     },
   },
-
-  background: function() {
-    browser.test.onMessage.addListener(msg => {
-      if (msg === "set-panel") {
-        browser.sidebarAction.setPanel({panel: ""}).then(() => {
-          browser.test.notifyFail("empty panel settable");
-        }).catch(() => {
-          browser.test.notifyPass("unable to set empty panel");
-        });
-      }
-    });
-  },
 };
 
-add_task(function* sidebar_initial_install() {
-  ok(document.getElementById("sidebar-box").hidden, "sidebar box is not visible");
-  let extension = ExtensionTestUtils.loadExtension(extData);
-  yield extension.startup();
-  // Test sidebar is opened on install
-  yield extension.awaitMessage("sidebar");
-  ok(!document.getElementById("sidebar-box").hidden, "sidebar box is visible");
-  // Test toolbar button is available
-  ok(document.getElementById("sidebar-button"), "sidebar button is in UI");
-
-  yield extension.unload();
-  // Test that the sidebar was closed on unload.
-  ok(document.getElementById("sidebar-box").hidden, "sidebar box is not visible");
-
-  // Move toolbar button back to customization.
-  CustomizableUI.removeWidgetFromArea("sidebar-button", CustomizableUI.AREA_NAVBAR);
-  ok(!document.getElementById("sidebar-button"), "sidebar button is not in UI");
-});
-
-
-add_task(function* sidebar_two_sidebar_addons() {
-  let extension2 = ExtensionTestUtils.loadExtension(extData);
-  yield extension2.startup();
-  // Test sidebar is opened on install
-  yield extension2.awaitMessage("sidebar");
-  ok(!document.getElementById("sidebar-box").hidden, "sidebar box is visible");
-  // Test toolbar button is NOT available after first install
-  ok(!document.getElementById("sidebar-button"), "sidebar button is not in UI");
-
-  // Test second sidebar install opens new sidebar
-  let extension3 = ExtensionTestUtils.loadExtension(extData);
-  yield extension3.startup();
-  // Test sidebar is opened on install
-  yield extension3.awaitMessage("sidebar");
-  ok(!document.getElementById("sidebar-box").hidden, "sidebar box is visible");
-  yield extension3.unload();
-
-  // We just close the sidebar on uninstall of the current sidebar.
-  ok(document.getElementById("sidebar-box").hidden, "sidebar box is not visible");
-
-  yield extension2.unload();
-});
-
 add_task(function* sidebar_windows() {
   let extension = ExtensionTestUtils.loadExtension(extData);
   yield extension.startup();
   // Test sidebar is opened on install
   yield extension.awaitMessage("sidebar");
   ok(!document.getElementById("sidebar-box").hidden, "sidebar box is visible in first window");
   // Check that the menuitem has our image styling.
   let elements = document.getElementsByClassName("webextension-menuitem");
@@ -108,68 +53,15 @@ add_task(function* sidebar_windows() {
   // Check that the menuitem has our image styling.
   elements = win.document.getElementsByClassName("webextension-menuitem");
   is(elements.length, 1, "have one menuitem");
   style = elements[0].getAttribute("style");
   ok(style.includes("webextension-menuitem-image"), "this menu has style");
 
   yield extension.unload();
   yield BrowserTestUtils.closeWindow(win);
-});
 
-add_task(function* sidebar_empty_panel() {
-  let extension = ExtensionTestUtils.loadExtension(extData);
-  yield extension.startup();
-  // Test sidebar is opened on install
-  yield extension.awaitMessage("sidebar");
-  ok(!document.getElementById("sidebar-box").hidden, "sidebar box is visible in first window");
-  extension.sendMessage("set-panel");
-  yield extension.awaitFinish();
-  yield extension.unload();
-});
-
-add_task(function* sidebar_tab_query_bug_1340739() {
-  let data = {
-    manifest: {
-      "permissions": [
-        "tabs",
-      ],
-      "sidebar_action": {
-        "default_panel": "sidebar.html",
-      },
-    },
-    useAddonManager: "temporary",
-    files: {
-      "sidebar.html": `
-        <!DOCTYPE html>
-        <html>
-        <head><meta charset="utf-8"/>
-        <script src="sidebar.js"></script>
-        </head>
-        <body>
-        A Test Sidebar
-        </body></html>
-      `,
-      "sidebar.js": function() {
-        Promise.all([
-          browser.tabs.query({}).then((tabs) => {
-            browser.test.assertEq(1, tabs.length, "got tab without currentWindow");
-          }),
-          browser.tabs.query({currentWindow: true}).then((tabs) => {
-            browser.test.assertEq(1, tabs.length, "got tab with currentWindow");
-          }),
-        ]).then(() => {
-          browser.test.sendMessage("sidebar");
-        });
-      },
-    },
-  };
-
-  let extension = ExtensionTestUtils.loadExtension(data);
-  yield extension.startup();
-  yield extension.awaitMessage("sidebar");
-  yield extension.unload();
-});
-
-add_task(function* cleanup() {
+  // Move toolbar button back to customization.
+  CustomizableUI.removeWidgetFromArea("sidebar-button", CustomizableUI.AREA_NAVBAR);
+  ok(!document.getElementById("sidebar-button"), "sidebar button is not in UI");
   // This is set on initial sidebar install.
   Services.prefs.clearUserPref("extensions.sidebar-button.shown");
 });
--- a/browser/components/migration/.eslintrc.js
+++ b/browser/components/migration/.eslintrc.js
@@ -14,17 +14,17 @@ module.exports = { // eslint-disable-lin
   "env": { "browser": true },
 
   "rules": {
     "block-scoped-var": "error",
     // "brace-style": ["warn", "1tbs", {"allowSingleLine": true}],
     "comma-dangle": "off",
     "comma-spacing": ["warn", {"before": false, "after": true}],
     "comma-style": ["warn", "last"],
-    // "complexity": "warn",
+    "complexity": ["error", {"max": 21}],
     "consistent-return": "error",
     //"curly": "error",
     "dot-notation": "error",
     "eol-last": "error",
     "indent": ["warn", 2, {"SwitchCase": 1, "ArrayExpression": "first", "ObjectExpression": "first"}],
     // "key-spacing": ["warn", {"beforeColon": false, "afterColon": true}],
     "keyword-spacing": "warn",
     "max-nested-callbacks": ["error", 3],
@@ -74,9 +74,8 @@ module.exports = { // eslint-disable-lin
     "space-infix-ops": ["warn", {"int32Hint": true}],
     // "space-unary-ops": ["warn", { "words": true, "nonwords": false }],
     "strict": ["error", "global"],
     "use-isnan": "error",
     "valid-typeof": "error",
     "yoda": "error"
   }
 };
-
--- a/browser/components/migration/ESEDBReader.jsm
+++ b/browser/components/migration/ESEDBReader.jsm
@@ -427,17 +427,17 @@ ESEDB.prototype = {
   },
 
   _convertResult(column, buffer, err) {
     if (err != 0) {
       if (err == 1004) {
         // Deal with null values:
         buffer = null;
       } else {
-        Cu.reportError("Unexpected JET error: " + err + ";" + " retrieving value for column " + column.name);
+        Cu.reportError("Unexpected JET error: " + err + "; retrieving value for column " + column.name);
         throw new Error(convertESEError(err));
       }
     }
     if (column.type == "string") {
       return buffer ? buffer.readString() : "";
     }
     if (column.type == "boolean") {
       return buffer ? (buffer.value == 255) : false;
--- a/browser/components/privatebrowsing/test/browser/browser_privatebrowsing_windowtitle.js
+++ b/browser/components/privatebrowsing/test/browser/browser_privatebrowsing_windowtitle.js
@@ -25,17 +25,17 @@ add_task(function* test() {
     page_without_title = app_name;
     about_pb_title = "Open a private window?";
     pb_page_with_title = test_title + " - (Private Browsing)";
     pb_page_without_title = app_name + " - (Private Browsing)";
     pb_about_pb_title = "Private Browsing - (Private Browsing)";
   } else {
     page_with_title = test_title + " - " + app_name;
     page_without_title = app_name;
-    about_pb_title = "Open a private window?" + " - " + app_name;
+    about_pb_title = "Open a private window? - " + app_name;
     pb_page_with_title = test_title + " - " + app_name + " (Private Browsing)";
     pb_page_without_title = app_name + " (Private Browsing)";
     pb_about_pb_title = "Private Browsing - " + app_name + " (Private Browsing)";
   }
 
   async function testTabTitle(aWindow, url, insidePB, expected_title) {
     let tab = (await BrowserTestUtils.openNewForegroundTab(aWindow.gBrowser));
     await BrowserTestUtils.loadURI(tab.linkedBrowser, url);
--- a/browser/extensions/formautofill/.eslintrc.js
+++ b/browser/extensions/formautofill/.eslintrc.js
@@ -104,17 +104,17 @@ module.exports = { // eslint-disable-lin
     // since only let and const are used, see "no-var").
     "block-scoped-var": "error",
 
     // Allow trailing commas for easy list extension.  Having them does not
     // impair readability, but also not required either.
     "comma-dangle": ["error", "always-multiline"],
 
     // Warn about cyclomatic complexity in functions.
-    "complexity": "warn",
+    "complexity": ["error", {"max": 20}],
 
     // Don't warn for inconsistent naming when capturing this (not so important
     // with auto-binding fat arrow functions).
     // "consistent-this": ["error", "self"],
 
     // Enforce dots on the next line with property name.
     "dot-location": ["error", "property"],
 
--- a/browser/extensions/pdfjs/test/browser_pdfjs_zoom.js
+++ b/browser/extensions/pdfjs/test/browser_pdfjs_zoom.js
@@ -67,17 +67,17 @@ add_task(function* test() {
      "pdf handler defaults to always-ask is false");
   is(handlerInfo.preferredAction, Ci.nsIHandlerInfo.handleInternally,
     "pdf handler defaults to internal");
 
   info("Pref action: " + handlerInfo.preferredAction);
 
   yield BrowserTestUtils.withNewTab({ gBrowser, url: "about:blank" },
     function* (newTabBrowser) {
-      yield waitForPdfJS(newTabBrowser, TESTROOT + "file_pdfjs_test.pdf" + "#zoom=100");
+      yield waitForPdfJS(newTabBrowser, TESTROOT + "file_pdfjs_test.pdf#zoom=100");
 
       yield ContentTask.spawn(newTabBrowser, TESTS, function* (contentTESTS) {
         let document = content.document;
 
         function waitForRender() {
           return new Promise((resolve) => {
             document.addEventListener("pagerendered", function onPageRendered(e) {
               if (e.detail.pageNumber !== 1) {
--- a/devtools/client/inspector/rules/test/browser_rules_authored.js
+++ b/devtools/client/inspector/rules/test/browser_rules_authored.js
@@ -21,17 +21,17 @@ function* createTestContent(style) {
 add_task(function* () {
   let view = yield createTestContent("#testid {" +
                                      // Invalid property.
                                      "  something: random;" +
                                      // Invalid value.
                                      "  color: orang;" +
                                      // Override.
                                      "  background-color: blue;" +
-                                     "  background-color: #f0c;" +
+                                     "  background-color: #f06;" +
                                      "} ");
 
   let elementStyle = view._elementStyle;
 
   let expected = [
     {name: "something", overridden: true},
     {name: "color", overridden: true},
     {name: "background-color", overridden: true},
--- a/devtools/client/inspector/rules/test/browser_rules_authored_color.js
+++ b/devtools/client/inspector/rules/test/browser_rules_authored_color.js
@@ -9,20 +9,20 @@
 /**
  * Array of test color objects:
  *   {String} name: name of the used & expected color format.
  *   {String} id: id of the element that will be created to test this color.
  *   {String} color: initial value of the color property applied to the test element.
  *   {String} result: expected value of the color property after edition.
  */
 const colors = [
-  {name: "hex", id: "test1", color: "#f0c", result: "#0f0"},
+  {name: "hex", id: "test1", color: "#f06", result: "#0f0"},
   {name: "rgb", id: "test2", color: "rgb(0,128,250)", result: "rgb(0, 255, 0)"},
   // Test case preservation.
-  {name: "hex", id: "test3", color: "#F0C", result: "#0F0"},
+  {name: "hex", id: "test3", color: "#F06", result: "#0F0"},
 ];
 
 add_task(function* () {
   Services.prefs.setCharPref("devtools.defaultColorUnit", "authored");
 
   let html = "";
   for (let {color, id} of colors) {
     html += `<div id="${id}" style="color: ${color}">Styled Node</div>`;
--- a/devtools/client/inspector/rules/test/doc_keyframeLineNumbers.html
+++ b/devtools/client/inspector/rules/test/doc_keyframeLineNumbers.html
@@ -18,17 +18,17 @@ span {
   animation-name: DD;
 }
 
 @keyframes CC {
   from {
     background: #ffffff;
   }
   to {
-    background: #f0c;
+    background: #f06;
   }
 }
 
 @keyframes DD {
   from {
     background: seagreen;
   }
   to {
--- a/devtools/client/shared/test/browser_outputparser.js
+++ b/devtools/client/shared/test/browser_outputparser.js
@@ -147,17 +147,17 @@ function testParseCssProperty(doc, parse
        " 0, ", {name: "#111"},
        " 90%,", {name: "#000"},
        " 0, ", {name: "#000"},
        " 95%,", {name: "transparent"},
        " 0, ", {name: "transparent"},
        " 100%)"]),
 
     // Note the lack of a space before the color here.
-    makeColorTest("border", "1px dotted#f0c", ["1px dotted ", {name: "#f0c"}]),
+    makeColorTest("border", "1px dotted#f06", ["1px dotted ", {name: "#f06"}]),
   ];
 
   let target = doc.querySelector("div");
   ok(target, "captain, we have the div");
 
   for (let test of tests) {
     info(test.desc);
 
--- a/devtools/client/shared/test/unit/test_cssColor-01.js
+++ b/devtools/client/shared/test/unit/test_cssColor-01.js
@@ -19,18 +19,18 @@ loader.lazyGetter(this, "DOMUtils", func
 const CLASSIFY_TESTS = [
   { input: "rgb(255,0,192)", output: "rgb" },
   { input: "RGB(255,0,192)", output: "rgb" },
   { input: "RGB(100%,0%,83%)", output: "rgb" },
   { input: "rgba(255,0,192, 0.25)", output: "rgb" },
   { input: "hsl(5, 5%, 5%)", output: "hsl" },
   { input: "hsla(5, 5%, 5%, 0.25)", output: "hsl" },
   { input: "hSlA(5, 5%, 5%, 0.25)", output: "hsl" },
-  { input: "#f0c", output: "hex" },
-  { input: "#f0c0", output: "hex" },
+  { input: "#f06", output: "hex" },
+  { input: "#f060", output: "hex" },
   { input: "#fe01cb", output: "hex" },
   { input: "#fe01cb80", output: "hex" },
   { input: "#FE01CB", output: "hex" },
   { input: "#FE01CB80", output: "hex" },
   { input: "blue", output: "name" },
   { input: "orange", output: "name" }
 ];
 
--- a/devtools/client/shared/test/unit/test_rewriteDeclarations.js
+++ b/devtools/client/shared/test/unit/test_rewriteDeclarations.js
@@ -452,29 +452,29 @@ const TEST_DATA = [
     input: "",
     instruction: {type: "create", name: "content", value: "'*/'", priority: "",
                   index: 0, enabled: false},
     expected: "/*! content: '*\\/'; */"
   },
 
   {
     desc: "delete disabled property",
-    input: "\n  a:b;\n  /* color:#f0c; */\n  e:f;",
+    input: "\n  a:b;\n  /* color:#f06; */\n  e:f;",
     instruction: {type: "remove", name: "color", index: 1},
     expected: "\n  a:b;\n  e:f;",
   },
   {
     desc: "delete heuristic-disabled property",
     input: "\n  a:b;\n  /*! c:d; */\n  e:f;",
     instruction: {type: "remove", name: "c", index: 1},
     expected: "\n  a:b;\n  e:f;",
   },
   {
     desc: "delete disabled property leaving other disabled property",
-    input: "\n  a:b;\n  /* color:#f0c; background-color: seagreen; */\n  e:f;",
+    input: "\n  a:b;\n  /* color:#f06; background-color: seagreen; */\n  e:f;",
     instruction: {type: "remove", name: "color", index: 1},
     expected: "\n  a:b;\n   /* background-color: seagreen; */\n  e:f;",
   },
 
   {
     desc: "regression test for bug 1328016",
     input: "position:absolute;top50px;height:50px;width:50px;",
     instruction: {type: "set", name: "width", value: "60px", priority: "",
--- a/devtools/docs/SUMMARY.md
+++ b/devtools/docs/SUMMARY.md
@@ -1,13 +1,15 @@
 
 # Summary
 
 * [Tool Architectures](tools.md)
-  * [Inspector](inspector-panel.md)
+  * [Inspector](inspector.md)
+    * [Panel Architecture](inspector-panel.md)
+    * [Highlighters](highlighters.md)
   * [Memory](memory-panel.md)
   * [Debugger](debugger-panel.md)
   * [Responsive Design Mode](responsive-design-mode.md)
 * [Frontend](frontend.md)
   * [Panel SVGs](svgs.md)
   * [React](react.md)
     * [Guidelines](react-guidelines.md)
     * [Tips](react-tips.md)
new file mode 100644
--- /dev/null
+++ b/devtools/docs/highlighters.md
@@ -0,0 +1,201 @@
+# Highlighters
+
+This article provides technical documentation about DevTools highlighters.
+
+By highlighter, we mean anything that DevTools displays on top of the content page, in order to highlight an element, a set of elements or shapes to users.
+
+The most obvious form of highlighter is the box-model highlighter, whose job is to display the 4 box-model regions on top of a given element in the content page, as illustrated in the following screen capture:
+
+![Box-model highlighter](./img/box-model-highlighter-screenshot.png)
+
+But there can be a wide variety of highlighters. In particular, highlighters are a pretty good way to give detailed information about:
+
+* the exact form of a css shape,
+* how a css transform applied to an element,
+* where are the color stops of a css gradient,
+* which are all the elements that match a given selector,
+* ...
+
+## Using highlighters
+
+Highlighters run on the debuggee side, not on the toolbox side. This is so that it's possible to highlight elements on a remote device for instance. This means you need to go through the [Remote Debugging Protocol](protocol.md) to use a highlighter.
+
+### The highlighter utils
+
+The easiest way to access the highlighters from toolbox-side DevTools code is by using the highlighter utils, which is conveniently available on the toolbox object. Here is how you can access the utils:
+
+```js
+let hUtils = toolbox.highlighterUtils;
+```
+
+Since the box-model highlighter is the most used type of highlighter (for instance it's displayed when you move your mouse over nodes in the inspector), the utils provides a set of methods to interact with it:
+
+| Method                             | Description                                                                                                                                                                                                                   |
+|------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `startPicker()`                    | Starts the node picker mode which will highlight every node you hover over in the page, and will change the current node selection in the inspector on click. “picker-node-hovered” and “picker-node-picked” events are sent. |
+| `stopPicker()`                     | Stops the node picker mode.                                                                                                                                                                                                   |
+| `highlightNodeFront(nodeFront)`    | Display the box-model highlighter on a given node. NodeFront objects are what the WalkerActor return.                                                                                                                         |
+| `highlightDomValueGrip(valueGrip)` | Display the box-model highlighter on a given node, represented by a debugger object value grip.                                                                                                                               |
+| `unhighlight()`                    | Hide the box-model highlighter.                                                                                                                                                                                               |
+
+But the box-model highlighter isn't the only type of highlighter, so the highlighter utils provides the following method:
+
+| Method                           | Description                                                                                                                                                                                                                                                                                                   |
+|----------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `getHighlighterByType(typeName)` | Instantiate a new highlighter, given its type (as a String). At the time of writing, the available types of highlighters are: `BoxModelHighlighter`, `CssTransformHighlighter`, `SelectorHighlighter` and `RectHighlighter`. This returns a promise that resolves to the new instance of [protocol.js](https://wiki.mozilla.org/DevTools/protocol.js) actor. |
+
+### The highlighter API
+
+When getting a highlighter via `toolbox.highlighterUtils.getHighlighterByType(typeName)`, the right type of highlighter will be instantiated on the server-side and will be wrapped into a `CustomHighlighterActor` and that's what will be returned to the caller. This means that all types of highlighters share the same following API:
+
+| Method                                   | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
+|------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `show(NodeActor node[, Object options])` | Highlighters are hidden by default. Calling this method is what makes them visible. The first, mandatory, parameter should be a NodeActor. NodeActors are what the WalkerActor return. It's easy to get a NodeActor for an existing DOM node. For example `toolbox.walker.querySelector(toolbox.walker.rootNode, "css selector")` resolves to a NodeFront (the client-side version of the NodeActor) which can be used as the first parameter. The second, optional, parameter depends on the type of highlighter being used. |
+| `hide()`                                 | Hides the highlighter.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
+| `finalize()`                             | Destroys the highlighter.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
+
+## Creating new highlighters
+
+Before digging into how one goes about adding a new type of highlighter to the DevTools, it is worth understanding how are highlighters displayed in the page.
+
+### Inserting content in the page
+
+Highlighters use web technology themselves to display the required information on screen. For instance, the box-model highlighter uses SVG to draw the margin, border, padding and content regions over the highlighted node.
+
+This means the highlighter content needs to be inserted in the page, but in a non-intrusive way. Indeed, the DevTools should never alter the page unless the alteration was done by the user (like changing the DOM using the inspector or a CSS rule via the style-editor for example). So simply appending the highlighter's markup in the content document is not an option.
+
+Furthermore, highlighters not only need to work with Firefox Desktop, but they should work just as well on Firefox OS, Firefox for Android, and more generally anything that runs the Gecko rendering engine. Therefore appending the highlighter's markup to the browser chrome XUL structure isn't an option either.
+
+To this end, DevTools highlighters make use of a (chrome-only) API:
+
+```
+ /**
+  * Chrome document anonymous content management.
+  * This is a Chrome-only API that allows inserting fixed positioned anonymous
+  * content on top of the current page displayed in the document.
+  * The supplied content is cloned and inserted into the document's CanvasFrame.
+  * Note that this only works for HTML documents.
+  */
+ partial interface Document {
+   /**
+    * Deep-clones the provided element and inserts it into the CanvasFrame.
+    * Returns an AnonymousContent instance that can be used to manipulate the
+    * inserted element.
+    */
+   [ChromeOnly, NewObject, Throws]
+   AnonymousContent insertAnonymousContent(Element aElement);
+
+   /**
+    * Removes the element inserted into the CanvasFrame given an AnonymousContent
+    * instance.
+    */
+   [ChromeOnly, Throws]
+   void removeAnonymousContent(AnonymousContent aContent);
+ };
+```
+
+Using this API, it is possible for chrome-privileged JS to insert arbitrary DOM elements on top of the content page.
+
+Technically, the DOM element is inserted into the `CanvasFrame` of the document. The `CanvasFrame` is part of the rendered frame tree and the DOM element is part of the native anonymous elements of the `CanvasFrame`.
+
+Consider the following simple example:
+
+```js
+ let el = document.createElement("div");
+ el.textContent = "My test element";
+ let insertedEl = document.insertAnonymousContent(el);
+```
+
+In this example, the test DIV will be inserted in the page, and will be displayed on top of everything else, in a way that doesn't impact the current layout.
+
+### The AnonymousContent API
+
+In the previous example, the returned `insertedEl` object isn't a DOM node, and it certainly is not `el`. It is a new object, whose type is `AnonymousContent` ([see the WebIDL here](http://mxr.mozilla.org/mozilla-central/source/dom/webidl/AnonymousContent.webidl?force=1)).
+
+Because of the way content is inserted into the page, it isn't wanted to give consumers a direct reference to the inserted DOM node. This is why `document.insertAnonymousContent(el)` actually **clones** `el` and returns a new object whose API lets consumers make changes to the inserted element in a way that never gives back a reference to the inserted DOM node.
+
+### CanvasFrameAnonymousContentHelper
+
+In order to help with the API described in the previous section, the `CanvasFrameAnonymousContentHelper` class was introduced.
+
+Its goal is to provide a simple way for highlighters to insert their content into the page and modify it dynamically later. One of its goal is also to re-insert the highlighters' content on page navigation. Indeed, the frame tree is destroyed when the page is navigated away from since it represents the document element.
+
+Using this helper is quite simple:
+
+```js
+let helper = new CanvasFrameAnonymousContentHelper(tabActor, this.buildMarkup.bind(this));
+```
+
+It only requires a `tabActor`, which highlighters get when they are instantiated, and a callback function that will be used to create and insert the content the first time the highlighter is shown, and every time there's a page navigation.
+
+The returned object provides the following API:
+
+| Method                                    | Description                                                |
+|-------------------------------------------|------------------------------------------------------------|
+| `getTextContentForElement(id)`            | Get the textContent of an element given its ID.            |
+| `setTextContentForElement(id, text)`      | Set the textContent of an element given its ID.            |
+| `setAttributeForElement(id, name, value)` | Set an attribute value of an element given its ID.         |
+| `getAttributeForElement(id, name)`        | Get an attribute value of an element given its ID.         |
+| `removeAttributeForElement(id, name)`     | Remove an attribute of an element given its ID.            |
+| `content`                                 | This property returns the wrapped AnonymousContent object. |
+| `destroy()`                               | Destroy the helper instance.                               |
+
+  ### Creating a new highlighter class
+
+A good way to get started is by taking a look at [existing highlighters here](http://mxr.mozilla.org/mozilla-central/source/toolkit/devtools/server/actors/highlighter.js).
+
+Here is some boilerplate code for a new highlighter class:
+
+```js
+ function MyNewHighlighter(tabActor) {
+   this.doc = tabActor.window.document;
+   this.markup = new CanvasFrameAnonymousContentHelper(tabActor, this._buildMarkup.bind(this));
+ }
+
+ MyNewHighlighter.prototype = {
+   destroy: function() {
+     this.doc = null;
+     this.markup.destroy();
+   },
+
+   _buildMarkup: function() {
+     let container = this.doc.createElement("div");
+     container.innerHTML = '<div id="new-highlighted-" style="display:none;">';
+     return container;
+   },
+
+   show: function(node, options) {
+     this.markup.removeAttributeForElement("new-highlighted-el", "style");
+   },
+
+   hide: function() {
+     this.markup.setAttributeForElement("new-highlighted-el", "style", "display:none;");
+   }
+ };
+```
+
+In most situations, the `container` returned by `_buildMarkup` will be absolutely positioned, and will need to contain elements with IDs, so that these can then later be moved, resized, hidden or shown in `show` and `hide` using the AnonymousContent API.
+
+### The AutoRefreshHighlighter parent class
+
+It is worth mentioning this class as it may be a useful parent class to inherit a new highlighter from in some situations.
+
+If the new highlighter's job is to highlight an element in the DOM, then it most likely should inherit from `AutoRefreshHighlighter`.
+
+The `AutoRefreshHighlighter` class updates itself in a loop, checking if the currently highlighted node's geometry has changed since the last iteration. This is useful to make sure the highlighter **follows** the highlighted node around, in case the layout around it changes, or in case it is an animated node.
+
+Sub classes must implement the following methods:
+
+| Method      | Description                                                                         |
+|-------------|-------------------------------------------------------------------------------------|
+| `_show()`   | Called when the highlighter should be shown.                                        |
+| `_update()` | Called while the highlighter is shown and the geometry of the current node changes. |
+| `_hide()`   | Called when the highlighter should be hidden.                                       |
+
+Sub classes will have access to the following properties:
+
+| Property            | Description                               |
+|---------------------|-------------------------------------------|
+| `this.currentNode`  | The node to be shown.                     |
+| `this.currentQuads` | All of the node's box model region quads. |
+| `this.win`          | The current window                        |
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..8311b62ea093d07d971d0b04d1c15cbc80accf01
GIT binary patch
literal 26168
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
HW*`3ty6Wj|
new file mode 100644
--- /dev/null
+++ b/devtools/docs/inspector.md
@@ -0,0 +1,2 @@
+
+These files provide information about the Inspector panel architecture.
--- a/devtools/server/actors/profiler.js
+++ b/devtools/server/actors/profiler.js
@@ -33,17 +33,17 @@ exports.ProfilerActor = ActorClassWithSp
 
   startProfiler: actorBridgeWithSpec("start"),
   stopProfiler: actorBridgeWithSpec("stop"),
   getProfile: actorBridgeWithSpec("getProfile"),
   getFeatures: actorBridgeWithSpec("getFeatures"),
   getBufferInfo: actorBridgeWithSpec("getBufferInfo"),
   getStartOptions: actorBridgeWithSpec("getStartOptions"),
   isActive: actorBridgeWithSpec("isActive"),
-  getSharedLibraryInformation: actorBridgeWithSpec("getSharedLibraryInformation"),
+  sharedLibraries: actorBridgeWithSpec("sharedLibraries"),
   registerEventNotifications: actorBridgeWithSpec("registerEventNotifications"),
   unregisterEventNotifications: actorBridgeWithSpec("unregisterEventNotifications"),
   setProfilerStatusInterval: actorBridgeWithSpec("setProfilerStatusInterval"),
 
   /**
    * Pipe events from Profiler module to this actor.
    */
   _onProfilerEvent: function (eventName, ...data) {
--- a/devtools/server/performance/profiler.js
+++ b/devtools/server/performance/profiler.js
@@ -243,24 +243,22 @@ const ProfilerManager = (function () {
         currentTime: elapsedTime,
         position,
         totalSize,
         generation
       };
     },
 
     /**
-     * Returns a stringified JSON object that describes the shared libraries
+     * Returns an array of objects that describes the shared libraries
      * which are currently loaded into our process. Can be called while the
      * profiler is stopped.
      */
-    getSharedLibraryInformation: function () {
-      return {
-        sharedLibraryInformation: nsIProfilerModule.getSharedLibraryInformation()
-      };
+    get sharedLibraries() {
+      return nsIProfilerModule.sharedLibraries;
     },
 
     /**
      * Number of profiler instances.
      *
      * @return {number}
      */
     get length() {
@@ -466,20 +464,20 @@ var Profiler = exports.Profiler = Class(
   /**
    * @see ProfilerManager.isActive
    */
   isActive: function () {
     return ProfilerManager.isActive();
   },
 
   /**
-   * @see ProfilerManager.isActive
+   * @see ProfilerManager.sharedLibraries
    */
-  getSharedLibraryInformation: function () {
-    return ProfilerManager.getSharedLibraryInformation();
+  sharedLibraries: function () {
+    return ProfilerManager.sharedLibraries;
   },
 
   /**
    * @see ProfilerManager.setProfilerStatusInterval
    */
   setProfilerStatusInterval: function (interval) {
     return ProfilerManager.setProfilerStatusInterval(interval);
   },
--- a/devtools/server/tests/browser/browser_stylesheets_getTextEmpty.js
+++ b/devtools/server/tests/browser/browser_stylesheets_getTextEmpty.js
@@ -3,17 +3,17 @@
    http://creativecommons.org/publicdomain/zero/1.0/ */
 
 "use strict";
 
 // Test that StyleSheetActor.getText handles empty text correctly.
 
 const {StyleSheetsFront} = require("devtools/shared/fronts/stylesheets");
 
-const CONTENT = "<style>body { background-color: #f0c; }</style>";
+const CONTENT = "<style>body { background-color: #f06; }</style>";
 const TEST_URI = "data:text/html;charset=utf-8," + encodeURIComponent(CONTENT);
 
 add_task(function* () {
   yield addTab(TEST_URI);
 
   info("Initialising the debugger server and client.");
   initDebuggerServer();
   let client = new DebuggerClient(DebuggerServer.connectPipe());
rename from devtools/server/tests/unit/test_profiler_getsharedlibraryinformation.js
rename to devtools/server/tests/unit/test_profiler_sharedlibraries.js
--- a/devtools/server/tests/unit/test_profiler_getsharedlibraryinformation.js
+++ b/devtools/server/tests/unit/test_profiler_sharedlibraries.js
@@ -1,45 +1,42 @@
 /* Any copyright is dedicated to the Public Domain.
    http://creativecommons.org/publicdomain/zero/1.0/ */
 
 "use strict";
 
 /**
- * Tests whether the profiler responds to "getSharedLibraryInformation" adequately.
+ * Tests whether the profiler responds to "sharedLibraries" adequately.
  */
 
-const Profiler = Cc["@mozilla.org/tools/profiler;1"].getService(Ci.nsIProfiler);
-
 function run_test()
 {
   get_chrome_actors((client, form) => {
     let actor = form.profilerActor;
-    test_getsharedlibraryinformation(client, actor, () => {
+    test_sharedlibraries(client, actor, () => {
       client.close().then(() => {
         do_test_finished();
       });
     });
   });
 
   do_test_pending();
 }
 
-function test_getsharedlibraryinformation(client, actor, callback)
+function test_sharedlibraries(client, actor, callback)
 {
-  client.request({ to: actor, type: "getSharedLibraryInformation" }, response => {
-    do_check_eq(typeof response.sharedLibraryInformation, "string");
-    let libs = [];
-    try {
-      libs = JSON.parse(response.sharedLibraryInformation);
-    } catch (e) {
-      do_check_true(false);
-    }
+  client.request({ to: actor, type: "sharedLibraries" }, libs => {
+    do_check_eq(typeof libs, "object");
+    do_check_true(Array.isArray(libs));
     do_check_eq(typeof libs, "object");
     do_check_true(libs.length >= 1);
     do_check_eq(typeof libs[0], "object");
     do_check_eq(typeof libs[0].name, "string");
+    do_check_eq(typeof libs[0].path, "string");
+    do_check_eq(typeof libs[0].debugName, "string");
+    do_check_eq(typeof libs[0].debugPath, "string");
+    do_check_eq(typeof libs[0].arch, "string");
     do_check_eq(typeof libs[0].start, "number");
     do_check_eq(typeof libs[0].end, "number");
     do_check_true(libs[0].start <= libs[0].end);
     callback();
   });
 }
--- a/devtools/server/tests/unit/xpcshell.ini
+++ b/devtools/server/tests/unit/xpcshell.ini
@@ -198,17 +198,17 @@ reason = only ran on B2G
 [test_profiler_activation-01.js]
 [test_profiler_activation-02.js]
 [test_profiler_close.js]
 [test_profiler_data.js]
 [test_profiler_events-01.js]
 [test_profiler_events-02.js]
 [test_profiler_getbufferinfo.js]
 [test_profiler_getfeatures.js]
-[test_profiler_getsharedlibraryinformation.js]
+[test_profiler_sharedlibraries.js]
 [test_unsafeDereference.js]
 [test_add_actors.js]
 [test_ignore_caught_exceptions.js]
 [test_ignore_no_interface_exceptions.js]
 [test_requestTypes.js]
 reason = bug 937197
 [test_layout-reflows-observer.js]
 [test_protocolSpec.js]
--- a/devtools/shared/specs/profiler.js
+++ b/devtools/shared/specs/profiler.js
@@ -87,17 +87,17 @@ const profilerSpec = generateActorSpec({
       response: RetVal("json")
     },
     getStartOptions: {
       response: RetVal("json")
     },
     isActive: {
       response: RetVal("json")
     },
-    getSharedLibraryInformation: {
+    sharedLibraries: {
       response: RetVal("json")
     },
     registerEventNotifications: {
       // Explicitly enumerate the arguments
       // @see ProfilerActor#startProfiler
       request: {
         events: Option(0, "nullable:array:string"),
       },
new file mode 100644
--- /dev/null
+++ b/docshell/test/file_bug1151421.html
@@ -0,0 +1,19 @@
+<html>
+<head>
+<style>
+body, html {
+    height: 100%;
+}
+.spacer {
+    height: 80%;
+}
+</style>
+</head>
+<body onload='(parent || opener).childLoad()'>
+
+<div class="spacer"></div>
+<div id="content">content</div>
+<div class="spacer"></div>
+
+</body>
+</html>
--- a/docshell/test/mochitest.ini
+++ b/docshell/test/mochitest.ini
@@ -28,16 +28,17 @@ support-files =
   file_bug653741.html
   file_bug660404
   file_bug660404^headers^
   file_bug662170.html
   file_bug669671.sjs
   file_bug680257.html
   file_bug703855.html
   file_bug728939.html
+  file_bug1151421.html
   file_pushState_after_document_open.html
   historyframes.html
 
 [test_anchor_scroll_after_document_open.html]
 [test_bfcache_plus_hash.html]
 [test_bug123696.html]
 [test_bug369814.html]
 [test_bug384014.html]
@@ -81,16 +82,17 @@ support-files = file_bug668513.html
 [test_bug691547.html]
 [test_bug694612.html]
 [test_bug703855.html]
 [test_bug713825.html]
 [test_bug728939.html]
 [test_bug797909.html]
 [test_bug1045096.html]
 [test_bug1121701.html]
+[test_bug1151421.html]
 [test_bug1186774.html]
 [test_forceinheritprincipal_overrule_owner.html]
 [test_framedhistoryframes.html]
 skip-if = toolkit == 'android' # bug 784321
 support-files = file_framedhistoryframes.html
 [test_pushState_after_document_open.html]
 [test_windowedhistoryframes.html]
 [test_triggeringprincipal_location_seturi.html]
--- a/docshell/test/navigation/file_scrollRestoration.html
+++ b/docshell/test/navigation/file_scrollRestoration.html
@@ -21,17 +21,17 @@
             history.scrollRestoration = "auto";
             opener.ok(history.scrollRestoration, "auto", "Valid enum value should change the value of an attribute.");
             document.getElementById("bottom").scrollIntoView();
             window.location.reload(false);
             break;
           }
           case 2: {
             opener.is(event.persisted, false, "Shouldn't have persisted session history entry.");
-            opener.isnot(window.scrollY, 0, "Should have restored scrolling.");
+            opener.isnot(Math.round(window.scrollY), 0, "Should have restored scrolling.");
             opener.is(history.scrollRestoration, "auto", "Should have the same scrollRestoration as before reload.");
             history.scrollRestoration = "manual";
             window.onunload = function() {} // Disable bfcache.
             window.location.reload(false);
             break;
           }
           case 3: {
             opener.is(event.persisted, false, "Shouldn't have persisted session history entry.");
@@ -40,61 +40,61 @@
             document.getElementById("bottom").scrollIntoView();
             window.onunload = null; // Should get bfcache behavior.
             opener.setTimeout("testWindow.history.back();", 250);
             window.location.href = 'data:text/html,';
             break;
           }
           case 4: {
             opener.is(event.persisted, true, "Should have persisted session history entry.");
-            opener.isnot(window.scrollY, 0, "Should have kept the old scroll position.");
+            opener.isnot(Math.round(window.scrollY), 0, "Should have kept the old scroll position.");
             opener.is(history.scrollRestoration, "manual", "Should have the same scrollRestoration as before reload.");
             window.scrollTo(0, 0);
             window.location.hash = "hash";
             requestAnimationFrame(test);
             break;
           }
           case 5: {
-            opener.isnot(window.scrollY, 0, "Should have scrolled to #hash.");
+            opener.isnot(Math.round(window.scrollY), 0, "Should have scrolled to #hash.");
             opener.is(history.scrollRestoration, "manual", "Should have the same scrollRestoration mode as before fragment navigation.");
             window.onunload = function() {} // Disable bfcache.
             opener.setTimeout("is(testWindow.history.scrollRestoration, 'auto'); testWindow.history.back();", 250);
             window.location.href = 'data:text/html,';
             break;
           }
           case 6: {
             opener.is(event.persisted, false, "Shouldn't have persisted session history entry.");
             opener.is(window.scrollY, 0, "Shouldn't have kept the old scroll position.");
             opener.is(history.scrollRestoration, "manual", "Should have the same scrollRestoration mode as before fragment navigation.");
             history.scrollRestoration = "auto";
             document.getElementById("bottom").scrollIntoView();
             history.pushState({ state: "state1" }, "state1");
             history.pushState({ state: "state2" }, "state2");
             window.scrollTo(0, 0);
             history.back();
-            opener.isnot(window.scrollY, 0, "Should have scrolled back to the state1's position");
+            opener.isnot(Math.round(window.scrollY), 0, "Should have scrolled back to the state1's position");
             opener.is(history.state.state, "state1", "Unexpected state.");
 
             history.scrollRestoration = "manual";
             document.getElementById("bottom").scrollIntoView();
             history.pushState({ state: "state3" }, "state3");
             history.pushState({ state: "state4" }, "state4");
             window.scrollTo(0, 0);
             history.back();
-            opener.is(window.scrollY, 0, "Shouldn't have scrolled back to the state3's position");
+            opener.is(Math.round(window.scrollY), 0, "Shouldn't have scrolled back to the state3's position");
             opener.is(history.state.state, "state3", "Unexpected state.");
 
             history.pushState({ state: "state5" }, "state5");
             history.scrollRestoration = "auto";
             document.getElementById("bottom").scrollIntoView();
-            opener.isnot(window.scrollY, 0, "Should have scrolled to 'bottom'.");
+            opener.isnot(Math.round(window.scrollY), 0, "Should have scrolled to 'bottom'.");
             history.back();
             window.scrollTo(0, 0);
             history.forward();
-            opener.isnot(window.scrollY, 0, "Should have scrolled back to the state5's position");
+            opener.isnot(Math.round(window.scrollY), 0, "Should have scrolled back to the state5's position");
 
             var ifr = document.createElement("iframe");
             ifr.src = "data:text/html,";
             document.body.appendChild(ifr);
             ifr.onload = test;
             break;
           }
           case 7: {
new file mode 100644
--- /dev/null
+++ b/docshell/test/test_bug1151421.html
@@ -0,0 +1,61 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=1151421
+-->
+<head>
+  <title>Test for Bug 1151421</title>
+  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1151421">Mozilla Bug 1151421</a>
+
+<script type="application/javascript">
+
+/** Test for Bug 1151421 **/
+SimpleTest.waitForExplicitFinish();
+
+function childLoad() {
+  // Spin the event loop so we leave the onload handler.
+  SimpleTest.executeSoon(childLoad2);
+}
+
+function childLoad2() {
+  let cw = iframe.contentWindow;
+  let content = cw.document.getElementById("content");
+
+  // Create a function to calculate an invariant.
+  let topPlusOffset = function()
+  {
+    return Math.round(content.getBoundingClientRect().top + cw.pageYOffset);
+  }
+
+  let initialTPO = topPlusOffset();
+
+  // Scroll the iframe to various positions, and check the TPO.
+  // Scrolling down to the bottom will adjust the page offset by a fractional amount.
+  let positions = [-100, 0.17, 0, 1.5, 10.41, 1e6, 12.1];
+
+  // Run some tests with scrollTo() and ensure we have the same invariant after scrolling.
+  positions.forEach(function(pos) {
+    cw.scrollTo(0, pos);
+    is(topPlusOffset(), initialTPO, "Top plus offset should remain invariant across scrolling.");
+  });
+
+  positions.reverse().forEach(function(pos) {
+    cw.scrollTo(0, pos);
+    is(topPlusOffset(), initialTPO, "(reverse) Top plus offset should remain invariant across scrolling.");
+  });
+
+  SimpleTest.finish();
+}
+
+</script>
+
+<!-- When the iframe loads, it calls childLoad(). -->
+<br>
+<iframe height='100px' id='iframe' src='file_bug1151421.html'></iframe>
+
+</body>
+</html>
--- a/docshell/test/test_bug1186774.html
+++ b/docshell/test/test_bug1186774.html
@@ -23,17 +23,17 @@ function runTest() {
       child.scrollTo(0, 3000);
       child.history.pushState({}, "scrolled");
       child.scrollTo(0, 6000);
       child.history.back();
     });
   }
 
   child.onpopstate = function() {
-    is(child.scrollY,  6000, "Shouldn't have scrolled before popstate");
+    is(Math.round(child.scrollY),  6000, "Shouldn't have scrolled before popstate");
     child.close();
     SimpleTest.finish();
   }
 }
 
 SimpleTest.waitForExplicitFinish();
 addLoadEvent(runTest);
 
--- a/docshell/test/test_bug590573.html
+++ b/docshell/test/test_bug590573.html
@@ -142,31 +142,31 @@ function pageLoad()
 }
 
 function* testBody()
 {
   is(popup.scrollY, 0, "test 1");
   popup.scroll(0, 100);
 
   popup.history.pushState('', '', '?pushed');
-  is(popup.scrollY, 100, "test 2");
+  is(Math.round(popup.scrollY), 100, "test 2");
   popup.scroll(0, 200); // set state-2's position to 200
 
   popup.history.back();
-  is(popup.scrollY, 100, "test 3");
+  is(Math.round(popup.scrollY), 100, "test 3");
   popup.scroll(0, 150); // set original page's position to 150
 
   popup.history.forward();
-  is(popup.scrollY, 200, "test 4");
+  is(Math.round(popup.scrollY), 200, "test 4");
 
   popup.history.back();
-  is(popup.scrollY, 150, "test 5");
+  is(Math.round(popup.scrollY), 150, "test 5");
 
   popup.history.forward();
-  is(popup.scrollY, 200, "test 6");
+  is(Math.round(popup.scrollY), 200, "test 6");
 
   // At this point, the history looks like:
   //   PATH                         POSITION
   //   file_bug590573_1.html        150       <-- oldest
   //   file_bug590573_1.html?pushed 200       <-- newest, current
 
   // Now test that the scroll position is persisted when we have real
   // navigations involved.  First, we need to spin the event loop so that the
@@ -197,23 +197,23 @@ function* testBody()
 
   // Spin the event loop again so that we get the right scroll positions.
   setTimeout(pageLoad, 0);
   yield;
 
   is(popup.location.search, "?pushed");
   ok(popup.document.getElementById('div1'), 'page should have div1.');
 
-  is(popup.scrollY, 200, "test 8");
+  is(Math.round(popup.scrollY), 200, "test 8");
 
   popup.history.back();
-  is(popup.scrollY, 150, "test 9");
+  is(Math.round(popup.scrollY), 150, "test 9");
   popup.history.forward();
 
-  is(popup.scrollY, 200, "test 10");
+  is(Math.round(popup.scrollY), 200, "test 10");
 
   // Spin one last time...
   setTimeout(pageLoad, 0);
   yield;
 
   page2PageShowCallbackEnabled = true;
   popup.history.forward();
   yield;
--- a/docshell/test/test_bug653741.html
+++ b/docshell/test/test_bug653741.html
@@ -19,30 +19,30 @@ SimpleTest.waitForExplicitFinish();
 
 function childLoad() {
   // Spin the event loop so we leave the onload handler.
   SimpleTest.executeSoon(childLoad2);
 }
 
 function childLoad2() {
   let cw = $('iframe').contentWindow;
-  
+
   // Save the Y offset.  For sanity's sake, make sure it's not 0, because we
   // should be at the bottom of the page!
-  let origYOffset = cw.pageYOffset;
+  let origYOffset = Math.round(cw.pageYOffset);
   ok(origYOffset != 0, 'Original Y offset is not 0.');
 
   // Scroll the iframe to the top, then navigate to #bottom again.
   cw.scrollTo(0, 0);
 
   // Our current location is #bottom, so this should scroll us down to the
   // bottom again.
   cw.location = cw.location + '';
 
-  is(cw.pageYOffset, origYOffset, 'Correct offset after reloading page.');
+  is(Math.round(cw.pageYOffset), origYOffset, 'Correct offset after reloading page.');
   SimpleTest.finish();
 }
 
 </script>
 
 <iframe height='100px' id='iframe' src='file_bug653741.html#bottom'></iframe>
 
 </body>
--- a/docshell/test/test_bug662170.html
+++ b/docshell/test/test_bug662170.html
@@ -22,22 +22,22 @@ function childLoad() {
   SimpleTest.executeSoon(childLoad2);
 }
 
 function childLoad2() {
   let cw = $('iframe').contentWindow;
 
   // When we initially load the page, we should be at the top.
   is(cw.pageYOffset, 0, 'Initial Y offset should be 0.');
-  
+
   // Scroll the iframe to the bottom.
   cw.scrollTo(0, 300);
 
   // Did we actually scroll somewhere?
-  isnot(cw.pageYOffset, 0, 'Y offset should be non-zero after scrolling.');
+  isnot(Math.round(cw.pageYOffset), 0, 'Y offset should be non-zero after scrolling.');
 
   // Now load file_bug662170.html#, which should take us to the top of the
   // page.
   cw.location = cw.location + '#';
 
   is(cw.pageYOffset, 0, 'Correct Y offset after loading #.');
   SimpleTest.finish();
 }
--- a/dom/base/Navigator.cpp
+++ b/dom/base/Navigator.cpp
@@ -1208,17 +1208,18 @@ Navigator::SendBeaconInternal(const nsAS
   }
 
   nsCOMPtr<nsIHttpChannel> httpChannel = do_QueryInterface(channel);
   if (!httpChannel) {
     // Beacon spec only supports HTTP requests at this time
     aRv.Throw(NS_ERROR_DOM_BAD_URI);
     return false;
   }
-  rv = httpChannel->SetReferrer(documentURI);
+  mozilla::net::ReferrerPolicy referrerPolicy = doc->GetReferrerPolicy();
+  rv = httpChannel->SetReferrerWithPolicy(documentURI, referrerPolicy);
   MOZ_ASSERT(NS_SUCCEEDED(rv));
 
   nsCOMPtr<nsIInputStream> in;
   nsAutoCString contentTypeWithCharset;
   nsAutoCString charset;
   uint64_t length = 0;
 
   if (aBody) {
--- a/dom/base/nsGlobalWindow.cpp
+++ b/dom/base/nsGlobalWindow.cpp
@@ -1482,17 +1482,18 @@ nsGlobalWindow::nsGlobalWindow(nsGlobalW
     mNetworkDownloadObserverEnabled(false),
 #endif
     mCleanedUp(false),
     mDialogAbuseCount(0),
     mAreDialogsEnabled(true),
 #ifdef DEBUG
     mIsValidatingTabGroup(false),
 #endif
-    mCanSkipCCGeneration(0)
+    mCanSkipCCGeneration(0),
+    mAutoActivateVRDisplayID(0)
 {
   AssertIsOnMainThread();
 
   nsLayoutStatics::AddRef();
 
   // Initialize the PRCList (this).
   PR_INIT_CLIST(this);
 
@@ -3776,16 +3777,37 @@ nsGlobalWindow::PostHandleEvent(EventCha
   nsCOMPtr<nsIScriptContext> kungFuDeathGrip2(GetContextInternal());
   mozilla::Unused << kungFuDeathGrip2; // These aren't referred to through the function
 
 
   if (aVisitor.mEvent->mMessage == eResize) {
     mIsHandlingResizeEvent = false;
   } else if (aVisitor.mEvent->mMessage == eUnload &&
              aVisitor.mEvent->IsTrusted()) {
+
+    // If any VR display presentation is active at unload, the next page
+    // will receive a vrdisplayactive event to indicate that it should
+    // immediately begin vr presentation. This should occur when navigating
+    // forwards, navigating backwards, and on page reload.
+    for (auto display : mVRDisplays) {
+      if (display->IsPresenting()) {
+        // Save this VR display ID to trigger vrdisplayactivate event
+        // after the next load event.
+        nsGlobalWindow* outer = GetOuterWindowInternal();
+        if (outer) {
+          outer->SetAutoActivateVRDisplayID(display->DisplayId());
+        }
+
+        // XXX The WebVR 1.1 spec does not define which of multiple VR
+        // presenting VR displays will be chosen during navigation.
+        // As the underlying platform VR API's currently only allow a single
+        // VR display, it is safe to choose the first VR display for now.
+        break;
+      }
+    }
     // Execute bindingdetached handlers before we tear ourselves
     // down.
     if (mDoc) {
       mDoc->BindingManager()->ExecuteDetachedHandlers();
     }
     mIsDocumentLoaded = false;
   } else if (aVisitor.mEvent->mMessage == eLoad &&
              aVisitor.mEvent->IsTrusted()) {
@@ -3809,16 +3831,26 @@ nsGlobalWindow::PostHandleEvent(EventCha
 
       // Most of the time we could get a pres context to pass in here,
       // but not always (i.e. if this window is not shown there won't
       // be a pres context available). Since we're not firing a GUI
       // event we don't need a pres context anyway so we just pass
       // null as the pres context all the time here.
       EventDispatcher::Dispatch(element, nullptr, &event, nullptr, &status);
     }
+
+    uint32_t autoActivateVRDisplayID = 0;
+    nsGlobalWindow* outer = GetOuterWindowInternal();
+    if (outer) {
+      autoActivateVRDisplayID = outer->GetAutoActivateVRDisplayID();
+    }
+    if (autoActivateVRDisplayID) {
+      DispatchVRDisplayActivate(autoActivateVRDisplayID,
+                                VRDisplayEventReason::Navigation);
+    }
   }
 
   return NS_OK;
 }
 
 nsresult
 nsGlobalWindow::DispatchDOMEvent(WidgetEvent* aEvent,
                                  nsIDOMEvent* aDOMEvent,
@@ -6332,17 +6364,17 @@ nsGlobalWindow::GetScrollMaxX(ErrorResul
 
 int32_t
 nsGlobalWindow::GetScrollMaxY(ErrorResult& aError)
 {
   MOZ_ASSERT(IsInnerWindow());
   FORWARD_TO_OUTER_OR_THROW(GetScrollBoundaryOuter, (eSideBottom), aError, 0);
 }
 
-CSSIntPoint
+CSSPoint
 nsGlobalWindow::GetScrollXY(bool aDoFlush)
 {
   MOZ_ASSERT(IsOuterWindow());
 
   if (aDoFlush) {
     FlushPendingNotifications(FlushType::Layout);
   } else {
     EnsureSizeUpToDate();
@@ -6356,40 +6388,40 @@ nsGlobalWindow::GetScrollXY(bool aDoFlus
   nsPoint scrollPos = sf->GetScrollPosition();
   if (scrollPos != nsPoint(0,0) && !aDoFlush) {
     // Oh, well.  This is the expensive case -- the window is scrolled and we
     // didn't actually flush yet.  Repeat, but with a flush, since the content
     // may get shorter and hence our scroll position may decrease.
     return GetScrollXY(true);
   }
 
-  return sf->GetScrollPositionCSSPixels();
-}
-
-int32_t
+  return CSSPoint::FromAppUnits(scrollPos);
+}
+
+double
 nsGlobalWindow::GetScrollXOuter()
 {
   MOZ_RELEASE_ASSERT(IsOuterWindow());
   return GetScrollXY(false).x;
 }
 
-int32_t
+double
 nsGlobalWindow::GetScrollX(ErrorResult& aError)
 {
   FORWARD_TO_OUTER_OR_THROW(GetScrollXOuter, (), aError, 0);
 }
 
-int32_t
+double
 nsGlobalWindow::GetScrollYOuter()
 {
   MOZ_RELEASE_ASSERT(IsOuterWindow());
   return GetScrollXY(false).y;
 }
 
-int32_t
+double
 nsGlobalWindow::GetScrollY(ErrorResult& aError)
 {
   FORWARD_TO_OUTER_OR_THROW(GetScrollYOuter, (), aError, 0);
 }
 
 uint32_t
 nsGlobalWindow::Length()
 {
@@ -13498,27 +13530,47 @@ nsGlobalWindow::NotifyActiveVRDisplaysCh
 {
   MOZ_ASSERT(IsInnerWindow());
 
   if (mNavigator) {
     mNavigator->NotifyActiveVRDisplaysChanged();
   }
 }
 
+uint32_t
+nsGlobalWindow::GetAutoActivateVRDisplayID()
+{
+  MOZ_ASSERT(IsOuterWindow());
+  uint32_t retVal = mAutoActivateVRDisplayID;
+  mAutoActivateVRDisplayID = 0;
+  return retVal;
+}
+
+void
+nsGlobalWindow::SetAutoActivateVRDisplayID(uint32_t aAutoActivateVRDisplayID)
+{
+  MOZ_ASSERT(IsOuterWindow());
+  mAutoActivateVRDisplayID = aAutoActivateVRDisplayID;
+}
+
 void
 nsGlobalWindow::DispatchVRDisplayActivate(uint32_t aDisplayID,
                                           mozilla::dom::VRDisplayEventReason aReason)
 {
   // Search for the display identified with aDisplayID and fire the
   // event if found.
   for (auto display : mVRDisplays) {
-    if (display->DisplayId() == aDisplayID
-        && !display->IsAnyPresenting()) {
-      // We only want to trigger this event if nobody is presenting to the
-      // display already.
+    if (display->DisplayId() == aDisplayID) {
+      if (aReason != VRDisplayEventReason::Navigation &&
+          display->IsAnyPresenting()) {
+        // We only want to trigger this event if nobody is presenting to the
+        // display already or when a page is loaded by navigating away
+        // from a page with an active VR Presentation.
+        continue;
+      }
 
       VRDisplayEventInit init;
       init.mBubbles = false;
       init.mCancelable = false;
       init.mDisplay = display;
       init.mReason.Construct(aReason);
 
       RefPtr<VRDisplayEvent> event =
--- a/dom/base/nsGlobalWindow.h
+++ b/dom/base/nsGlobalWindow.h
@@ -762,16 +762,21 @@ public:
 
   // Update the VR displays for this window
   bool UpdateVRDisplays(nsTArray<RefPtr<mozilla::dom::VRDisplay>>& aDisplays);
 
   // Inner windows only.
   // Called to inform that the set of active VR displays has changed.
   void NotifyActiveVRDisplaysChanged();
 
+  // Outer windows only.
+  uint32_t GetAutoActivateVRDisplayID();
+  // Outer windows only.
+  void SetAutoActivateVRDisplayID(uint32_t aAutoActivateVRDisplayID);
+
   void DispatchVRDisplayActivate(uint32_t aDisplayID,
                                  mozilla::dom::VRDisplayEventReason aReason);
   void DispatchVRDisplayDeactivate(uint32_t aDisplayID,
                                    mozilla::dom::VRDisplayEventReason aReason);
   void DispatchVRDisplayConnect(uint32_t aDisplayID);
   void DispatchVRDisplayDisconnect(uint32_t aDisplayID);
   void DispatchVRDisplayPresentChange(uint32_t aDisplayID);
 
@@ -1085,25 +1090,25 @@ public:
                      mozilla::dom::CallerType aCallerType,
                      mozilla::ErrorResult& aError);
   void GetInnerHeight(JSContext* aCx, JS::MutableHandle<JS::Value> aValue,
                       mozilla::dom::CallerType aCallerType,
                       mozilla::ErrorResult& aError);
   void SetInnerHeight(JSContext* aCx, JS::Handle<JS::Value> aValue,
                       mozilla::dom::CallerType aCallerType,
                       mozilla::ErrorResult& aError);
-  int32_t GetScrollXOuter();
-  int32_t GetScrollX(mozilla::ErrorResult& aError);
-  int32_t GetPageXOffset(mozilla::ErrorResult& aError)
+  double GetScrollXOuter();
+  double GetScrollX(mozilla::ErrorResult& aError);
+  double GetPageXOffset(mozilla::ErrorResult& aError)
   {
     return GetScrollX(aError);
   }
-  int32_t GetScrollYOuter();
-  int32_t GetScrollY(mozilla::ErrorResult& aError);
-  int32_t GetPageYOffset(mozilla::ErrorResult& aError)
+  double GetScrollYOuter();
+  double GetScrollY(mozilla::ErrorResult& aError);
+  double GetPageYOffset(mozilla::ErrorResult& aError)
   {
     return GetScrollY(aError);
   }
   void GetScreenX(JSContext* aCx, JS::MutableHandle<JS::Value> aValue,
                   mozilla::dom::CallerType aCallerType,
                   mozilla::ErrorResult& aError);
   void SetScreenX(JSContext* aCx, JS::Handle<JS::Value> aValue,
                   mozilla::dom::CallerType aCallerType,
@@ -1630,17 +1635,17 @@ public:
                                     nsIPrincipal* aSubjectPrincipal);
 
   // Outer windows only.
   bool CanMoveResizeWindows(mozilla::dom::CallerType aCallerType);
 
   // If aDoFlush is true, we'll flush our own layout; otherwise we'll try to
   // just flush our parent and only flush ourselves if we think we need to.
   // Outer windows only.
-  mozilla::CSSIntPoint GetScrollXY(bool aDoFlush);
+  mozilla::CSSPoint GetScrollXY(bool aDoFlush);
 
   int32_t GetScrollBoundaryOuter(mozilla::Side aSide);
 
   // Outer windows only.
   nsresult GetInnerSize(mozilla::CSSIntSize& aSize);
   nsIntSize GetOuterSize(mozilla::dom::CallerType aCallerType,
                          mozilla::ErrorResult& aError);
   void SetOuterSize(int32_t aLengthCSSPixels, bool aIsWidth,
@@ -2035,16 +2040,21 @@ protected:
   // This is the CC generation the last time we called CanSkip.
   uint32_t mCanSkipCCGeneration;
 
   // The VR Displays for this window
   nsTArray<RefPtr<mozilla::dom::VRDisplay>> mVRDisplays;
 
   RefPtr<mozilla::dom::VREventObserver> mVREventObserver;
 
+  // When non-zero, the document should receive a vrdisplayactivate event
+  // after loading.  The value is the ID of the VRDisplay that content should
+  // begin presentation on.
+  uint32_t mAutoActivateVRDisplayID; // Outer windows only
+
 #ifdef ENABLE_INTL_API
   RefPtr<mozilla::dom::IntlUtils> mIntlUtils;
 #endif
 
   friend class nsDOMScriptableHelper;
   friend class nsDOMWindowUtils;
   friend class mozilla::dom::PostMessageEvent;
   friend class DesktopNotification;
--- a/dom/base/test/test_viewport_scroll.html
+++ b/dom/base/test/test_viewport_scroll.html
@@ -23,20 +23,20 @@ var xml = document.getElementById("xml")
 quirks.src = "data:text/html,<html><body style='height:2000px; width:2000px;'>";
 standards.src = "data:text/html,<!DOCTYPE HTML><html><body style='height:2000px; width:2000px;'>";
 xml.src = "data:text/xml,<?xml-stylesheet href='data:text/css,html { display:block; height:2000px; width:2000px; }'?><foo><html></html></foo>";
 
 function subtest(winProp, elemProp, win, correctElement, elemToSet, otherElem1, otherElem2) {
   win.scrollTo(50, 50);
   elemToSet[elemProp] = 100;
   if (elemToSet == correctElement) {
-    is(win[winProp], 100, "Setting " + elemToSet.name + "." + elemProp + " should scroll");
+    is(Math.round(win[winProp]), 100, "Setting " + elemToSet.name + "." + elemProp + " should scroll");
     is(elemToSet[elemProp], 100, "Reading back " + elemToSet.name + "." + elemProp + " after scrolling");
   } else {
-    is(win[winProp], 50, "Setting " + elemToSet.name + "." + elemProp + " should not scroll");
+    is(Math.round(win[winProp]), 50, "Setting " + elemToSet.name + "." + elemProp + " should not scroll");
     is(elemToSet[elemProp], 0, "Reading back " + elemToSet.name + "." + elemProp + " after not scrolling");
   }
   if (otherElem1 == correctElement) {
     is(otherElem1[elemProp], 50, "Reading back " + otherElem1.name + "." + elemProp + " (correct element) after not scrolling");
   } else {
     is(otherElem1[elemProp], 0, "Reading back " + otherElem1.name + "." + elemProp + " (irrelevant element)");
   }
   if (otherElem2 == correctElement) {
--- a/dom/browser-element/mochitest/browserElement_ScrollEvent.js
+++ b/dom/browser-element/mochitest/browserElement_ScrollEvent.js
@@ -11,17 +11,17 @@ browserElementTestHelpers.addPermission(
 function runTest() {
   var iframe = document.createElement('iframe');
   iframe.setAttribute('mozbrowser', 'true');
   document.body.appendChild(iframe);
 
   iframe.addEventListener("mozbrowserscroll", function(e) {
     ok(true, "got mozbrowserscroll event.");
     ok(e.detail, "event.detail is not null.");
-    ok(e.detail.top === 4000, "top position is correct.");
-    ok(e.detail.left === 4000, "left position is correct.");
+    ok(Math.round(e.detail.top) == 4000, "top position is correct.");
+    ok(Math.round(e.detail.left) == 4000, "left position is correct.");
     SimpleTest.finish();
   });
 
   iframe.src = "data:text/html,<html><body style='min-height: 5000px; min-width: 5000px;'></body><script>window.scrollTo(4000, 4000);</script></html>";
 }
 
 addEventListener('testready', runTest);
--- a/dom/events/EventStates.h
+++ b/dom/events/EventStates.h
@@ -7,17 +7,17 @@
 #ifndef mozilla_EventStates_h_
 #define mozilla_EventStates_h_
 
 #include "mozilla/Attributes.h"
 #include "nsDebug.h"
 
 namespace mozilla {
 
-#define NS_EVENT_STATE_HIGHEST_SERVO_BIT 9
+#define NS_EVENT_STATE_HIGHEST_SERVO_BIT 12
 
 /**
  * EventStates is the class used to represent the event states of nsIContent
  * instances. These states are calculated by IntrinsicState() and
  * ContentStatesChanged() has to be called when one of them changes thus
  * informing the layout/style engine of the change.
  * Event states are associated with pseudo-classes.
  */
@@ -212,73 +212,73 @@ private:
 #define NS_EVENT_STATE_INDETERMINATE NS_DEFINE_EVENT_STATE_MACRO(6)
 // Content shows its placeholder
 #define NS_EVENT_STATE_PLACEHOLDERSHOWN NS_DEFINE_EVENT_STATE_MACRO(7)
 // Content is URL's target (ref).
 #define NS_EVENT_STATE_URLTARGET     NS_DEFINE_EVENT_STATE_MACRO(8)
 // Content is the full screen element, or a frame containing the
 // current full-screen element.
 #define NS_EVENT_STATE_FULL_SCREEN   NS_DEFINE_EVENT_STATE_MACRO(9)
+// Content is valid (and can be invalid).
+#define NS_EVENT_STATE_VALID         NS_DEFINE_EVENT_STATE_MACRO(10)
+// Content is invalid.
+#define NS_EVENT_STATE_INVALID       NS_DEFINE_EVENT_STATE_MACRO(11)
+// UI friendly version of :valid pseudo-class.
+#define NS_EVENT_STATE_MOZ_UI_VALID NS_DEFINE_EVENT_STATE_MACRO(12)
 
 /*
  * Bits below here do not have Servo-related ordering constraints.
  *
  * Remember to change NS_EVENT_STATE_HIGHEST_SERVO_BIT at the top of the file if
  * this changes!
  */
 
 // Drag is hovering over content.
-#define NS_EVENT_STATE_DRAGOVER      NS_DEFINE_EVENT_STATE_MACRO(10)
+#define NS_EVENT_STATE_DRAGOVER      NS_DEFINE_EVENT_STATE_MACRO(13)
 // Content is required.
-#define NS_EVENT_STATE_REQUIRED      NS_DEFINE_EVENT_STATE_MACRO(11)
+#define NS_EVENT_STATE_REQUIRED      NS_DEFINE_EVENT_STATE_MACRO(14)
 // Content is optional (and can be required).
-#define NS_EVENT_STATE_OPTIONAL      NS_DEFINE_EVENT_STATE_MACRO(12)
+#define NS_EVENT_STATE_OPTIONAL      NS_DEFINE_EVENT_STATE_MACRO(15)
 // Link has been visited.
-#define NS_EVENT_STATE_VISITED       NS_DEFINE_EVENT_STATE_MACRO(13)
+#define NS_EVENT_STATE_VISITED       NS_DEFINE_EVENT_STATE_MACRO(16)
 // Link hasn't been visited.
-#define NS_EVENT_STATE_UNVISITED     NS_DEFINE_EVENT_STATE_MACRO(14)
-// Content is valid (and can be invalid).
-#define NS_EVENT_STATE_VALID         NS_DEFINE_EVENT_STATE_MACRO(15)
-// Content is invalid.
-#define NS_EVENT_STATE_INVALID       NS_DEFINE_EVENT_STATE_MACRO(16)
+#define NS_EVENT_STATE_UNVISITED     NS_DEFINE_EVENT_STATE_MACRO(17)
 // Content value is in-range (and can be out-of-range).
-#define NS_EVENT_STATE_INRANGE       NS_DEFINE_EVENT_STATE_MACRO(17)
+#define NS_EVENT_STATE_INRANGE       NS_DEFINE_EVENT_STATE_MACRO(18)
 // Content value is out-of-range.
-#define NS_EVENT_STATE_OUTOFRANGE    NS_DEFINE_EVENT_STATE_MACRO(18)
+#define NS_EVENT_STATE_OUTOFRANGE    NS_DEFINE_EVENT_STATE_MACRO(19)
 // These two are temporary (see bug 302188)
 // Content is read-only.
-#define NS_EVENT_STATE_MOZ_READONLY  NS_DEFINE_EVENT_STATE_MACRO(19)
+#define NS_EVENT_STATE_MOZ_READONLY  NS_DEFINE_EVENT_STATE_MACRO(20)
 // Content is editable.
-#define NS_EVENT_STATE_MOZ_READWRITE NS_DEFINE_EVENT_STATE_MACRO(20)
+#define NS_EVENT_STATE_MOZ_READWRITE NS_DEFINE_EVENT_STATE_MACRO(21)
 // Content is the default one (meaning depends of the context).
-#define NS_EVENT_STATE_DEFAULT       NS_DEFINE_EVENT_STATE_MACRO(21)
+#define NS_EVENT_STATE_DEFAULT       NS_DEFINE_EVENT_STATE_MACRO(22)
 // Content could not be rendered (image/object/etc).
-#define NS_EVENT_STATE_BROKEN        NS_DEFINE_EVENT_STATE_MACRO(22)
+#define NS_EVENT_STATE_BROKEN        NS_DEFINE_EVENT_STATE_MACRO(23)
 // Content disabled by the user (images turned off, say).
-#define NS_EVENT_STATE_USERDISABLED  NS_DEFINE_EVENT_STATE_MACRO(23)
+#define NS_EVENT_STATE_USERDISABLED  NS_DEFINE_EVENT_STATE_MACRO(24)
 // Content suppressed by the user (ad blocking, etc).
-#define NS_EVENT_STATE_SUPPRESSED    NS_DEFINE_EVENT_STATE_MACRO(24)
+#define NS_EVENT_STATE_SUPPRESSED    NS_DEFINE_EVENT_STATE_MACRO(25)
 // Content is still loading such that there is nothing to show the
 // user (eg an image which hasn't started coming in yet).
-#define NS_EVENT_STATE_LOADING       NS_DEFINE_EVENT_STATE_MACRO(25)
-#define NS_EVENT_STATE_INCREMENT_SCRIPT_LEVEL NS_DEFINE_EVENT_STATE_MACRO(26)
+#define NS_EVENT_STATE_LOADING       NS_DEFINE_EVENT_STATE_MACRO(26)
+#define NS_EVENT_STATE_INCREMENT_SCRIPT_LEVEL NS_DEFINE_EVENT_STATE_MACRO(27)
 // Handler for the content has been blocked.
-#define NS_EVENT_STATE_HANDLER_BLOCKED NS_DEFINE_EVENT_STATE_MACRO(27)
+#define NS_EVENT_STATE_HANDLER_BLOCKED NS_DEFINE_EVENT_STATE_MACRO(28)
 // Handler for the content has been disabled.
-#define NS_EVENT_STATE_HANDLER_DISABLED NS_DEFINE_EVENT_STATE_MACRO(28)
+#define NS_EVENT_STATE_HANDLER_DISABLED NS_DEFINE_EVENT_STATE_MACRO(29)
 // Handler for the content has crashed
-#define NS_EVENT_STATE_HANDLER_CRASHED NS_DEFINE_EVENT_STATE_MACRO(29)
+#define NS_EVENT_STATE_HANDLER_CRASHED NS_DEFINE_EVENT_STATE_MACRO(30)
 // Content has focus and should show a ring.
-#define NS_EVENT_STATE_FOCUSRING     NS_DEFINE_EVENT_STATE_MACRO(30)
+#define NS_EVENT_STATE_FOCUSRING     NS_DEFINE_EVENT_STATE_MACRO(31)
 // Content is a submit control and the form isn't valid.
-#define NS_EVENT_STATE_MOZ_SUBMITINVALID NS_DEFINE_EVENT_STATE_MACRO(31)
+#define NS_EVENT_STATE_MOZ_SUBMITINVALID NS_DEFINE_EVENT_STATE_MACRO(32)
 // UI friendly version of :invalid pseudo-class.
-#define NS_EVENT_STATE_MOZ_UI_INVALID NS_DEFINE_EVENT_STATE_MACRO(32)
-// UI friendly version of :valid pseudo-class.
-#define NS_EVENT_STATE_MOZ_UI_VALID NS_DEFINE_EVENT_STATE_MACRO(33)
+#define NS_EVENT_STATE_MOZ_UI_INVALID NS_DEFINE_EVENT_STATE_MACRO(33)
 // This bit is currently free.
 // #define NS_EVENT_STATE_?????????? NS_DEFINE_EVENT_STATE_MACRO(34)
 // Handler for click to play plugin
 #define NS_EVENT_STATE_TYPE_CLICK_TO_PLAY NS_DEFINE_EVENT_STATE_MACRO(35)
 // Content is in the optimum region.
 #define NS_EVENT_STATE_OPTIMUM NS_DEFINE_EVENT_STATE_MACRO(36)
 // Content is in the suboptimal region.
 #define NS_EVENT_STATE_SUB_OPTIMUM NS_DEFINE_EVENT_STATE_MACRO(37)
--- a/dom/events/TextComposition.cpp
+++ b/dom/events/TextComposition.cpp
@@ -220,17 +220,17 @@ RemoveControlCharactersFrom(nsAString& a
   if (NS_WARN_IF(!dest)) {
     return;
   }
 
   char16_t* curDest = dest + firstControlCharOffset;
   size_t i = firstControlCharOffset;
   for (const char16_t* source = sourceBegin + firstControlCharOffset;
        source < sourceEnd; ++source) {
-    if (*source == '\t' || !IsControlChar(*source)) {
+    if (*source == '\t' || *source == '\n' || !IsControlChar(*source)) {
       *curDest = *source;
       ++curDest;
       ++i;
     } else if (aRanges) {
       aRanges->RemoveCharacter(i);
     }
   }
 
--- a/dom/html/HTMLMediaElement.cpp
+++ b/dom/html/HTMLMediaElement.cpp
@@ -1522,34 +1522,35 @@ HTMLMediaElement::SetVisible(bool aVisib
 {
   if (!mDecoder) {
     return;
   }
 
   mDecoder->SetForcedHidden(!aVisible);
 }
 
-layers::Image*
+already_AddRefed<layers::Image>
 HTMLMediaElement::GetCurrentImage()
 {
   // Mark the decoder owned by the element as tainted so that the
-  // suspend-vide-decoder is suspended.
+  // suspend-video-decoder is disabled.
   mHasSuspendTaint = true;
   if (mDecoder) {
     mDecoder->SetSuspendTaint(true);
   }
 
   // TODO: In bug 1345404, handle case when video decoder is already suspended.
   ImageContainer* container = GetImageContainer();
   if (!container) {
     return nullptr;
   }
 
   AutoLockImage lockImage(container);
-  return lockImage.GetImage();
+  RefPtr<layers::Image> image = lockImage.GetImage();
+  return image.forget();
 }
 
 bool
 HTMLMediaElement::HasSuspendTaint() const
 {
   MOZ_ASSERT(!mDecoder || (mDecoder->HasSuspendTaint() == mHasSuspendTaint));
   return mHasSuspendTaint;
 }
--- a/dom/html/HTMLMediaElement.h
+++ b/dom/html/HTMLMediaElement.h
@@ -624,17 +624,17 @@ public:
   bool HasSuspendTaint() const;
 
   // Synchronously, return the next video frame and mark the element unable to
   // participate in decode suspending.
   //
   // This function is synchronous for cases where decoding has been suspended
   // and JS needs a frame to use in, eg., nsLayoutUtils::SurfaceFromElement()
   // via drawImage().
-  layers::Image* GetCurrentImage();
+  already_AddRefed<layers::Image> GetCurrentImage();
 
   already_AddRefed<DOMMediaStream> GetSrcObject() const;
   void SetSrcObject(DOMMediaStream& aValue);
   void SetSrcObject(DOMMediaStream* aValue);
 
   // TODO: remove prefixed versions soon (1183495).
   already_AddRefed<DOMMediaStream> GetMozSrcObject() const;
   void SetMozSrcObject(DOMMediaStream& aValue);
--- a/dom/media/TextTrack.cpp
+++ b/dom/media/TextTrack.cpp
@@ -8,16 +8,17 @@
 #include "mozilla/dom/TextTrack.h"
 #include "mozilla/dom/TextTrackBinding.h"
 #include "mozilla/dom/TextTrackList.h"
 #include "mozilla/dom/TextTrackCue.h"
 #include "mozilla/dom/TextTrackCueList.h"
 #include "mozilla/dom/TextTrackRegion.h"
 #include "mozilla/dom/HTMLMediaElement.h"
 #include "mozilla/dom/HTMLTrackElement.h"
+#include "nsGlobalWindow.h"
 
 namespace mozilla {
 namespace dom {
 
 NS_IMPL_CYCLE_COLLECTION_INHERITED(TextTrack,
                                    DOMEventTargetHelper,
                                    mCueList,
                                    mActiveCueList,
@@ -325,18 +326,23 @@ TextTrack::GetLanguage(nsAString& aLangu
   } else {
     aLanguage = mLanguage;
   }
 }
 
 void
 TextTrack::DispatchAsyncTrustedEvent(const nsString& aEventName)
 {
+  nsPIDOMWindowInner* win = GetOwner();
+  if (!win) {
+    return;
+  }
   RefPtr<TextTrack> self = this;
-  NS_DispatchToMainThread(
+  nsGlobalWindow::Cast(win)->Dispatch(
+    "TextTrack::DispatchAsyncTrustedEvent", TaskCategory::Other,
     NS_NewRunnableFunction([self, aEventName]() {
       self->DispatchTrustedEvent(aEventName);
     })
   );
 }
 
 bool
 TextTrack::IsLoaded()
--- a/dom/media/TextTrackCue.cpp
+++ b/dom/media/TextTrackCue.cpp
@@ -131,16 +131,19 @@ TextTrackCue::GetCueAsHTML()
   nsPIDOMWindowInner* window = mDocument->GetInnerWindow();
   if (!window) {
     return mDocument->CreateDocumentFragment();
   }
 
   nsCOMPtr<nsIDOMDocumentFragment> frag;
   sParserWrapper->ConvertCueToDOMTree(window, this,
                                       getter_AddRefs(frag));
+  if (!frag) {
+    return mDocument->CreateDocumentFragment();
+  }
   return frag.forget().downcast<DocumentFragment>();
 }
 
 void
 TextTrackCue::SetTrackElement(HTMLTrackElement* aTrackElement)
 {
   mTrackElement = aTrackElement;
 }
--- a/dom/media/webvtt/vtt.jsm
+++ b/dom/media/webvtt/vtt.jsm
@@ -312,16 +312,20 @@ Cu.import('resource://gre/modules/Servic
 
       // Consume 'n' characters from the input.
       function consume(result) {
         input = input.substr(result.length);
         return result;
       }
 
       var m = input.match(/^([^<]*)(<[^>]+>?)?/);
+      // The input doesn't contain a complete tag.
+      if (!m[0]) {
+        return null;
+      }
       // If there is some text before the next tag, return it, otherwise return
       // the tag.
       return consume(m[1] ? m[1] : m[2]);
     }
 
     // Unescape a string 's'.
     function unescape1(e) {
       return ESCAPE[e];
--- a/dom/security/nsCSPUtils.cpp
+++ b/dom/security/nsCSPUtils.cpp
@@ -266,17 +266,17 @@ CSP_ContentTypeToDirective(nsContentPoli
   return nsIContentSecurityPolicy::DEFAULT_SRC_DIRECTIVE;
 }
 
 nsCSPHostSrc*
 CSP_CreateHostSrcFromURI(nsIURI* aURI)
 {
   // Create the host first
   nsCString host;
-  aURI->GetHost(host);
+  aURI->GetAsciiHost(host);
   nsCSPHostSrc *hostsrc = new nsCSPHostSrc(NS_ConvertUTF8toUTF16(host));
 
   // Add the scheme.
   nsCString scheme;
   aURI->GetScheme(scheme);
   hostsrc->setScheme(NS_ConvertUTF8toUTF16(scheme));
 
   int32_t port;
@@ -638,17 +638,17 @@ nsCSPHostSrc::permits(nsIURI* aUri, cons
       return false;
     }
     return true;
   }
 
   // Before we can check if the host matches, we have to
   // extract the host part from aUri.
   nsAutoCString uriHost;
-  nsresult rv = aUri->GetHost(uriHost);
+  nsresult rv = aUri->GetAsciiHost(uriHost);
   NS_ENSURE_SUCCESS(rv, false);
 
   nsString decodedUriHost;
   CSP_PercentDecodeStr(NS_ConvertUTF8toUTF16(uriHost), decodedUriHost);
 
   // 4.5) host matching: Check if the allowed host starts with a wilcard.
   if (mHost.First() == '*') {
     NS_ASSERTION(mHost[1] == '.', "Second character needs to be '.' whenever host starts with '*'");
new file mode 100644
--- /dev/null
+++ b/dom/security/test/csp/file_punycode_host_src.js
@@ -0,0 +1,2 @@
+const LOADED = true;
+parent.postMessage({result: 'script-allowed'}, "*");
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/dom/security/test/csp/file_punycode_host_src.sjs
@@ -0,0 +1,45 @@
+// custom *.sjs for Bug 1224225
+// Punycode in CSP host sources
+
+const HTML_PART1 =
+  "<!DOCTYPE HTML>" +
+  "<html><head><meta charset=\"utf-8\">" +
+  "<title>Bug 1224225 - CSP source matching should work for punycoded domain names</title>" +
+  "</head>" +
+  "<body>" +
+  "<script id='script' src='";
+
+const TESTCASE1 = "http://sub2.ält.example.org/";
+const TESTCASE2 = "http://sub2.xn--lt-uia.example.org/"
+
+const HTML_PART2 = "tests/dom/security/test/csp/file_punycode_host_src.js'></script>" +
+  "</body>" +
+  "</html>";
+
+function handleRequest(request, response)
+{
+  // avoid confusing cache behaviors
+  response.setHeader("Cache-Control", "no-cache", false);
+  response.setHeader("Content-Type", "text/html", false);
+
+  Components.utils.importGlobalProperties(["URLSearchParams"]);
+  const query = new URLSearchParams(request.queryString);
+
+
+  if (query.get("csp")) {
+    response.setHeader("Content-Security-Policy", query.get("csp"), false);
+  }
+  if (query.get("action") == "script-unicode-csp-punycode") {
+    response.write(HTML_PART1 + TESTCASE1 + HTML_PART2);
+    return
+  }
+  if (query.get("action") == "script-punycode-csp-punycode") {
+    response.write(HTML_PART1 + TESTCASE2 + HTML_PART2);
+    return
+  }
+
+
+  // we should never get here, but just in case
+  // return something unexpected
+  response.write("do'h");
+}
--- a/dom/security/test/csp/mochitest.ini
+++ b/dom/security/test/csp/mochitest.ini
@@ -198,16 +198,18 @@ support-files =
   file_strict_dynamic_parser_inserted_doc_write.html
   file_strict_dynamic_parser_inserted_doc_write_correct_nonce.html
   file_strict_dynamic_non_parser_inserted.html
   file_strict_dynamic_non_parser_inserted_inline.html
   file_strict_dynamic_unsafe_eval.html
   file_strict_dynamic_default_src.html
   file_strict_dynamic_default_src.js
   file_upgrade_insecure_navigation.sjs
+  file_punycode_host_src.sjs
+  file_punycode_host_src.js
 
 [test_base-uri.html]
 [test_blob_data_schemes.html]
 [test_connect-src.html]
 [test_CSP.html]
 [test_allow_https_schemes.html]
 [test_bug663567.html]
 [test_bug802872.html]
@@ -285,8 +287,9 @@ tags = mcb
 [test_sendbeacon.html]
 [test_upgrade_insecure_docwrite_iframe.html]
 [test_bug1242019.html]
 [test_bug1312272.html]
 [test_strict_dynamic.html]
 [test_strict_dynamic_parser_inserted.html]
 [test_strict_dynamic_default_src.html]
 [test_upgrade_insecure_navigation.html]
+[test_punycode_host_src.html]
new file mode 100644
--- /dev/null
+++ b/dom/security/test/csp/test_punycode_host_src.html
@@ -0,0 +1,81 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>Bug 1224225 - CSP source matching should work for punycoded domain names</title>
+  <!-- Including SimpleTest.js so we can use waitForExplicitFinish !-->
+  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<iframe style="width:100%;" id="testframe"></iframe>
+
+<script class="testbody" type="text/javascript">
+
+/* Description of the test:
+ * We load scripts within an iframe and make sure that the
+ * CSP matching is same for punycode domain names as well as IDNA.
+ */
+
+SimpleTest.waitForExplicitFinish();
+
+
+var curTest;
+var counter = -1;
+
+const tests = [
+  { // test 1
+    description: "loads script as sub2.ält.example.org, but whitelist in CSP as sub2.xn--lt-uia.example.org",
+    action: "script-unicode-csp-punycode",
+    csp: "script-src http://sub2.xn--lt-uia.example.org;",
+    expected: "script-allowed",
+
+  },
+  { // test 2
+    description: "loads script as sub2.xn--lt-uia.example.org, and whitelist in CSP as sub2.xn--lt-uia.example.org",
+    action: "script-punycode-csp-punycode",
+    csp: "script-src http://sub2.xn--lt-uia.example.org;",
+    expected: "script-allowed",
+
+  },
+    { // test 3
+    description: "loads script as sub2.xn--lt-uia.example.org, and whitelist in CSP as sub2.xn--lt-uia.example.org",
+    action: "script-punycode-csp-punycode",
+    csp: "script-src *.xn--lt-uia.example.org;",
+    expected: "script-allowed",
+
+  },
+
+];
+
+function finishTest() {
+  window.removeEventListener("message", receiveMessage);
+  SimpleTest.finish();
+}
+
+function checkResults(result) {
+  is(result, curTest.expected, curTest.description);
+  loadNextTest();
+}
+
+window.addEventListener("message", receiveMessage);
+function receiveMessage(event) {
+  checkResults(event.data.result);
+}
+
+function loadNextTest() {
+  counter++;
+  if (counter == tests.length) {
+    finishTest();
+    return;
+  }
+  curTest = tests[counter];
+  var testframe = document.getElementById("testframe");
+  testframe.src = `file_punycode_host_src.sjs?action=${curTest.action}&csp=${curTest.csp}`;
+}
+
+loadNextTest();
+
+</script>
+</body>
+</html>
--- a/dom/security/test/gtest/TestCSPParser.cpp
+++ b/dom/security/test/gtest/TestCSPParser.cpp
@@ -199,16 +199,18 @@ nsresult runTestSuite(const PolicyTest* 
 }
 
 // ============================= TestDirectives ========================
 
 TEST(CSPParser, Directives)
 {
   static const PolicyTest policies[] =
   {
+    { "connect-src xn--mnchen-3ya.de",
+      "connect-src http://xn--mnchen-3ya.de"},
     { "default-src http://www.example.com",
       "default-src http://www.example.com" },
     { "script-src http://www.example.com",
       "script-src http://www.example.com" },
     { "object-src http://www.example.com",
       "object-src http://www.example.com" },
     { "style-src http://www.example.com",
       "style-src http://www.example.com" },
--- a/dom/tests/mochitest/general/test_domWindowUtils_scrollXY.html
+++ b/dom/tests/mochitest/general/test_domWindowUtils_scrollXY.html
@@ -26,23 +26,23 @@
     function testScrollXY() {
       let iframe = document.getElementById("iframe");
       let cwindow = iframe.contentWindow;
       let domWindowUtils = SpecialPowers.getDOMWindowUtils(cwindow);
 
       function checkGetScrollXYState(flush, vals, testName) {
         let scrollX = {}, scrollY = {};
         domWindowUtils.getScrollXY(flush, scrollX, scrollY);
-        is(scrollX.value, vals[0], "getScrollXY x for test: " + testName);
-        is(scrollY.value, vals[1], "getScrollXY y for test: " + testName);
+        is(Math.round(scrollX.value), vals[0], "getScrollXY x for test: " + testName);
+        is(Math.round(scrollY.value), vals[1], "getScrollXY y for test: " + testName);
       }
 
       function checkWindowScrollState(vals, testName) {
-        is(cwindow.scrollX, vals[0], "scrollX for test: " + testName);
-        is(cwindow.scrollY, vals[1], "scrollY for test: " + testName);
+        is(Math.round(cwindow.scrollX), vals[0], "scrollX for test: " + testName);
+        is(Math.round(cwindow.scrollY), vals[1], "scrollY for test: " + testName);
       }
 
       // Check initial state (0, 0)
       checkGetScrollXYState(false, [0, 0], "initial getScrollXY state");
       checkGetScrollXYState(true, [0, 0], "initial getScrollXY state+flush");
       checkWindowScrollState([0, 0], "initial window.scroll* state");
 
       // scroll
@@ -62,18 +62,18 @@
       let iframe = document.getElementById("hidden-iframe");
       let cwindow = iframe.contentWindow;
       let domWindowUtils = SpecialPowers.getDOMWindowUtils(cwindow);
 
       // make sure getScrollXY doesn't throw
       let scrollX = {}, scrollY = {};
       domWindowUtils.getScrollXY(false, scrollX, scrollY);
 
-      is(scrollX.value, 0, "scrollX is zero for display:none iframe");
-      is(scrollY.value, 0, "scrollY is zero for display:none iframe");
+      is(Math.round(scrollX.value), 0, "scrollX is zero for display:none iframe");
+      is(Math.round(scrollY.value), 0, "scrollY is zero for display:none iframe");
     }
 
     SimpleTest.waitForExplicitFinish();
   </script>
 
   <!-- can't run this in the test document, since it potentially runs in a
        scrolling="no" test harness iframe, and that causes a failure for some
        reason -->
--- a/dom/vr/VRServiceTest.cpp
+++ b/dom/vr/VRServiceTest.cpp
@@ -23,16 +23,17 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_END
 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(VRMockDisplay)
 NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper)
 
 NS_IMPL_ADDREF_INHERITED(VRMockDisplay, DOMEventTargetHelper)
 NS_IMPL_RELEASE_INHERITED(VRMockDisplay, DOMEventTargetHelper)
 
 VRMockDisplay::VRMockDisplay(const nsCString& aID, uint32_t aDeviceID)
  : mDeviceID(aDeviceID)
+ , mTimestamp(TimeStamp::Now())
 {
   mDisplayInfo.mDisplayName = aID;
   mDisplayInfo.mType = VRDeviceType::Puppet;
   mDisplayInfo.mIsConnected = true;
   mDisplayInfo.mIsMounted = false;
   mDisplayInfo.mCapabilityFlags = VRDisplayCapabilityFlags::Cap_None |
                                   VRDisplayCapabilityFlags::Cap_Orientation |
                                   VRDisplayCapabilityFlags::Cap_AngularAcceleration |
@@ -72,16 +73,18 @@ VRMockDisplay::SetEyeParameter(VREye aEy
 void
 VRMockDisplay::SetPose(const Nullable<Float32Array>& aPosition,
                        const Nullable<Float32Array>& aLinearVelocity,
                        const Nullable<Float32Array>& aLinearAcceleration,
                        const Nullable<Float32Array>& aOrientation,
                        const Nullable<Float32Array>& aAngularVelocity,
                        const Nullable<Float32Array>& aAngularAcceleration)
 {
+  mSensorState.Clear();
+  mSensorState.timestamp = (TimeStamp::Now() - mTimestamp).ToSeconds();
   mSensorState.flags = VRDisplayCapabilityFlags::Cap_Orientation |
                        VRDisplayCapabilityFlags::Cap_Position |
                        VRDisplayCapabilityFlags::Cap_AngularAcceleration |
                        VRDisplayCapabilityFlags::Cap_LinearAcceleration |
                        VRDisplayCapabilityFlags::Cap_External |
                        VRDisplayCapabilityFlags::Cap_MountDetection |
                        VRDisplayCapabilityFlags::Cap_Present;
 
--- a/dom/vr/VRServiceTest.h
+++ b/dom/vr/VRServiceTest.h
@@ -31,16 +31,17 @@ public:
   virtual JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
 
 private:
   ~VRMockDisplay() = default;
 
   uint32_t mDeviceID;
   gfx::VRDisplayInfo mDisplayInfo;
   gfx::VRHMDSensorState mSensorState;
+  TimeStamp mTimestamp;
 };
 
 class VRMockController : public DOMEventTargetHelper
 {
 public:
   NS_DECL_ISUPPORTS_INHERITED
   NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(VRMockController, DOMEventTargetHelper)
 
--- a/dom/vr/test/VRSimulationDriver.js
+++ b/dom/vr/test/VRSimulationDriver.js
@@ -1,38 +1,45 @@
 
 var VRServiceTest;
+var vrMockDisplay;
 
 var VRSimulationDriver = (function() {
 "use strict";
 
 var AttachWebVRDisplay = function() {
-  return VRServiceTest.attachVRDisplay("VRDisplayTest");
+  var promise = VRServiceTest.attachVRDisplay("VRDisplayTest");
+  promise.then(function (display) {
+    assert_true(display != null, "AttachWebVRDisplay should success.");
+    vrMockDisplay = display;
+  });
+
+  return promise;
 };
 
-var SetVRDisplayPose = function(vrDisplay, position,
+var SetVRDisplayPose = function(position,
                                 linearVelocity, linearAcceleration,
                                 orientation, angularVelocity,
                                 angularAcceleration) {
-  vrDisplay.setPose(position, linearVelocity, linearAcceleration,
-                    orientation, angularVelocity, angularAcceleration);
+  vrMockDisplay.setPose(position, linearVelocity, linearAcceleration,
+                        orientation, angularVelocity, angularAcceleration);
 };
 
 var SetEyeResolution = function(width, height) {
-  vrDisplay.setEyeResolution(width, height);
+  vrMockDisplay.setEyeResolution(width, height);
 }
 
-var SetEyeParameter = function(vrDisplay, eye, offsetX, offsetY, offsetZ,
+var SetEyeParameter = function(eye, offsetX, offsetY, offsetZ,
                                upDegree, rightDegree, downDegree, leftDegree) {
-  vrDisplay.setEyeParameter(eye, offsetX, offsetY, offsetZ, upDegree, rightDegree,
-                            downDegree, leftDegree);
+  vrMockDisplay.setEyeParameter(eye, offsetX, offsetY, offsetZ, upDegree, rightDegree,
+                                downDegree, leftDegree);
 }
 
-var UpdateVRDisplay = function(vrDisplay) {
-  vrDisplay.update();
+var UpdateVRDisplay = function() {
+  vrMockDisplay.update();
 }
 
 var API = {
   AttachWebVRDisplay: AttachWebVRDisplay,
   SetVRDisplayPose: SetVRDisplayPose,
   SetEyeResolution: SetEyeResolution,
   SetEyeParameter: SetEyeParameter,
   UpdateVRDisplay: UpdateVRDisplay,
--- a/dom/vr/test/mochitest.ini
+++ b/dom/vr/test/mochitest.ini
@@ -1,9 +1,10 @@
 [DEFAULT]
 support-files =
   VRSimulationDriver.js
   requestPresent.js
   runVRTest.js
   WebVRHelpers.js
 
+[test_vrDisplay_getFrameData.html]
 [test_vrDisplay_requestPresent.html]
-skip-if = true
+skip-if = true
\ No newline at end of file
--- a/dom/vr/test/requestPresent.js
+++ b/dom/vr/test/requestPresent.js
@@ -1,12 +1,17 @@
 // requestPresent.js
 //
 // This file provides helpers for testing VRDisplay requestPresent.
 
+function attachVRDisplay(test) {
+  assert_equals(typeof (navigator.getVRDisplays), "function", "'navigator.getVRDisplays()' must be defined.");
+  return VRSimulationDriver.AttachWebVRDisplay();
+}
+
 function setupVRDisplay(test) {
   assert_equals(typeof (navigator.getVRDisplays), "function", "'navigator.getVRDisplays()' must be defined.");
   return VRSimulationDriver.AttachWebVRDisplay().then(() => {
     return navigator.getVRDisplays();
   }).then((displays) => {
     assert_equals(displays.length, 1, "displays.length must be one after attach.");
     vrDisplay = displays[0];
     return validateNewVRDisplay(test, vrDisplay);
--- a/dom/vr/test/runVRTest.js
+++ b/dom/vr/test/runVRTest.js
@@ -1,9 +1,10 @@
 function runVRTest(callback) {
   SpecialPowers.pushPrefEnv({"set" : [["dom.vr.enabled", true],
                                       ["dom.vr.puppet.enabled", true],
+                                      ["dom.vr.require-gesture", false],
                                       ["dom.vr.test.enabled", true]]},
   () => {
     VRServiceTest = navigator.requestVRServiceTest();
     callback();
   });
 }
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/dom/vr/test/test_vrDisplay_getFrameData.html
@@ -0,0 +1,150 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>VRDisplay GetFrameData</title>
+    <meta name="timeout" content="long"/>
+    <script src="/resources/testharness.js"></script>
+    <script src="/resources/testharnessreport.js"></script>
+    <script src="VRSimulationDriver.js"></script>
+    <script src="WebVRHelpers.js"></script>
+    <script src="requestPresent.js"></script>
+    <script src="runVRTest.js"></script>
+</head>
+<body id="body">
+    <canvas id="webglCanvas"></canvas>
+    <div id="testDiv"></div>
+    <script>
+        "use strict";
+        var vrDisplay;
+        var vrRAF;
+        var canvas = document.getElementById('webglCanvas');
+        var div = document.getElementById('testDiv');
+        function startTest() {
+          promise_test((test) => {
+            return attachVRDisplay(test).then(() => {
+              VRSimulationDriver.SetEyeResolution(1332, 1586);
+              VRSimulationDriver.SetEyeParameter("left", -0.029, 0, 0, 41.65, 35.57, 48.00, 43.97);
+              VRSimulationDriver.SetEyeParameter("right", 0.029, 0, 0, 41.65, 43.97, 48.00, 35.57);
+              var poseOrient = new Float32Array([-0.188, -0.007, 0.045, -0.980]);
+              var posePos = new Float32Array([-0.161, 0.076, -0.250]);
+              var poseAngVel = new Float32Array([0.008, -0.002, -0.006]);
+              var poseAngAcc = new Float32Array([3.404, -1.469, -5.901]);
+              var poseLinVel = new Float32Array([0.001, -0.003, -0.002]);
+              var poseLinAcc = new Float32Array([0.007, 0.068, -0.052]);
+              VRSimulationDriver.SetVRDisplayPose(posePos, poseLinVel, poseLinAcc,
+                                                  poseOrient, poseAngVel, poseAngAcc);
+              VRSimulationDriver.UpdateVRDisplay();
+            }).then(() => {
+              return promise_test((test) => {
+                return setupVRDisplay(test).then(() => {
+                  return WebVRHelpers.RequestPresentOnVRDisplay(vrDisplay,
+                                                                [{ source: canvas }]);
+                }).then(() => {
+                  assert_true(vrDisplay.isPresenting, "vrDisplay.isPresenting must be true if requestPresent is fulfilled.");
+                  assert_equals(vrDisplay.getLayers().length, 1, "vrDisplay.getLayers() should return one layer.");
+
+                  verifyFrameData();
+                })
+              }, "WebVR requestPresent fulfilled");
+            })
+          }, "Finish setting up VR test data.");
+
+          function verifyFrameData() {
+            async_test(function (test) {
+              navigator.getVRDisplays().then((displays) => {
+                assert_equals(displays.length, 1, "displays.length must be one after attach.");
+                vrDisplay = displays[0];
+                vrDisplay.requestAnimationFrame(callback);
+
+                function callback() {
+                  var frameData1 = new VRFrameData();
+                  vrDisplay.getFrameData(frameData1);
+
+                  // We insert a new frame to confirm we still can get
+                  // the same data as the last getter.
+                  insertNewFrameData();
+
+                  var frameData2 = new VRFrameData();
+                  vrDisplay.getFrameData(frameData2);
+
+                  assert_equals(frameData1.timestamp, frameData2.timestamp,
+                                "frameData.timestamp at a frame should be equal.");
+
+                  assert_true(checkValueInFloat32Array(frameData1.leftProjectionMatrix,
+                                                       frameData2.leftProjectionMatrix),
+                              "frameData.leftProjectionMatrix at a frame should be equal.");
+
+                  assert_true(checkValueInFloat32Array(frameData1.leftViewMatrix,
+                                                       frameData2.leftViewMatrix),
+                              "frameData.leftViewMatrix at a frame should be equal.");
+
+                  assert_true(checkValueInFloat32Array(frameData1.rightProjectionMatrix,
+                                                       frameData2.rightProjectionMatrix),
+                              "frameData.rightProjectionMatrix at a frame should be equal.");
+
+                  assert_true(checkValueInFloat32Array(frameData1.rightViewMatrix,
+                                                       frameData2.rightViewMatrix),
+                              "frameData.rightViewMatrix at a frame should be equal.");
+
+                  var pose1 = frameData1.pose;
+                  var pose2 = frameData2.pose;
+                  assert_true(checkValueInFloat32Array(pose1.position,
+                                                       pose2.position),
+                              "pose.position at a frame should be equal.");
+
+                  assert_true(checkValueInFloat32Array(pose1.linearVelocity,
+                                                       pose2.linearVelocity),
+                              "pose.linearVelocity at a frame should be equal.");
+
+                  assert_true(checkValueInFloat32Array(pose1.linearAcceleration,
+                                                       pose2.linearAcceleration),
+                              "pose.linearAcceleration at a frame should be equal.");
+
+                  assert_true(checkValueInFloat32Array(pose1.orientation,
+                                                       pose2.orientation),
+                              "pose.orientation at a frame should be equal.");
+
+                  assert_true(checkValueInFloat32Array(pose1.angularVelocity,
+                                                       pose2.angularVelocity),
+                              "pose.angularVelocity at a frame should be equal.");
+
+                  assert_true(checkValueInFloat32Array(pose1.angularAcceleration,
+                                                       pose2.angularAcceleration),
+                              "pose.angularAcceleration at a frame should be equal.");
+                  test.done();
+                };
+              });
+            }, "WebVR returns the same frameData within a frame fulfilled");
+          }
+
+          function insertNewFrameData() {
+            var poseOrient = new Float32Array([-0.208, -0.017, 0.055, -0.930]);
+            var posePos = new Float32Array([-0.261, 0.036, -0.150]);
+            var poseAngVel = new Float32Array([0.018, -0.001, -0.003]);
+            var poseAngAcc = new Float32Array([1.504, -1.339, -4.901]);
+            var poseLinVel = new Float32Array([0.002, -0.001, -0.003]);
+            var poseLinAcc = new Float32Array([0.017, 0.061, -0.022]);
+            VRSimulationDriver.SetVRDisplayPose(posePos, poseLinVel, poseLinAcc,
+                                                poseOrient, poseAngVel, poseAngAcc);
+            VRSimulationDriver.UpdateVRDisplay();
+          }
+
+          function checkValueInFloat32Array(array1, array2) {
+            if (array1.length != array2.length) {
+              return false;
+            }
+            var index = 0;
+            while (index < array2.length) {
+              if (array1[index] != array2[index]) {
+                return false;
+              }
+              ++index;
+            }
+            return true;
+          }
+        }
+
+        runVRTest(startTest);
+    </script>
+</body>
+</html>
\ No newline at end of file
--- a/dom/webidl/Window.webidl
+++ b/dom/webidl/Window.webidl
@@ -178,24 +178,20 @@ partial interface Window {
   void scrollBy(optional ScrollToOptions options);
   // mozScrollSnap is used by chrome to perform scroll snapping after the
   // user performs actions that may affect scroll position
   // mozScrollSnap is deprecated, to be replaced by a web accessible API, such
   // as an extension to the ScrollOptions dictionary.  See bug 1137937.
   [ChromeOnly] void mozScrollSnap();
   // The four properties below are double per spec at the moment, but whether
   // that will continue is unclear.
-  //[Replaceable, Throws] readonly attribute double scrollX;
-  //[Replaceable, Throws] readonly attribute double pageXOffset;
-  //[Replaceable, Throws] readonly attribute double scrollY;
-  //[Replaceable, Throws] readonly attribute double pageYOffset;
-  [Replaceable, Throws] readonly attribute long scrollX;
-  [Replaceable, Throws] readonly attribute long pageXOffset;
-  [Replaceable, Throws] readonly attribute long scrollY;
-  [Replaceable, Throws] readonly attribute long pageYOffset;
+  [Replaceable, Throws] readonly attribute double scrollX;
+  [Replaceable, Throws] readonly attribute double pageXOffset;
+  [Replaceable, Throws] readonly attribute double scrollY;
+  [Replaceable, Throws] readonly attribute double pageYOffset;
 
   // client
   // These are writable because we allow chrome to write them.  And they need
   // to use 'any' as the type, because non-chrome writing them needs to act
   // like a [Replaceable] attribute would, which needs the original JS value.
   //[Replaceable, Throws] readonly attribute double screenX;
   //[Replaceable, Throws] readonly attribute double screenY;
   //[Replaceable, Throws] readonly attribute double outerWidth;
--- a/gfx/thebes/gfxFont.cpp
+++ b/gfx/thebes/gfxFont.cpp
@@ -1618,20 +1618,26 @@ private:
         buf.mNumGlyphs = mNumGlyphs;
 
         gfxContext::AzureState state = mRunParams.context->CurrentState();
         if (mRunParams.drawMode & DrawMode::GLYPH_FILL) {
             if (state.pattern || mFontParams.contextPaint) {
                 Pattern *pat;
 
                 RefPtr<gfxPattern> fillPattern;
-                if (!mFontParams.contextPaint ||
-                    !(fillPattern = mFontParams.contextPaint->GetFillPattern(
-                                        mRunParams.context->GetDrawTarget(),
-                                        mRunParams.context->CurrentMatrix()))) {
+                if (mFontParams.contextPaint) {
+                  mozilla::image::DrawResult result = mozilla::image::DrawResult::SUCCESS;
+                  Tie(result, fillPattern) =
+                    mFontParams.contextPaint->GetFillPattern(
+                                          mRunParams.context->GetDrawTarget(),
+                                          mRunParams.context->CurrentMatrix());
+                  // XXX cku Flush should return result to the caller?
+                  Unused << result;
+                }
+                if (!fillPattern) {
                     if (state.pattern) {
                         pat = state.pattern->GetPattern(mRunParams.dt,
                                       state.patternTransformChanged ?
                                           &state.patternTransform : nullptr);
                     } else {
                         pat = nullptr;
                     }
                 } else {
--- a/gfx/thebes/gfxPrefs.h
+++ b/gfx/thebes/gfxPrefs.h
@@ -320,17 +320,17 @@ private:
 
   DECL_GFX_PREF(Live, "dom.ipc.plugins.asyncdrawing.enabled",  PluginAsyncDrawingEnabled, bool, false);
   DECL_GFX_PREF(Live, "dom.meta-viewport.enabled",             MetaViewportEnabled, bool, false);
   DECL_GFX_PREF(Once, "dom.vr.enabled",                        VREnabled, bool, false);
   DECL_GFX_PREF(Once, "dom.vr.oculus.enabled",                 VROculusEnabled, bool, true);
   DECL_GFX_PREF(Once, "dom.vr.openvr.enabled",                 VROpenVREnabled, bool, false);
   DECL_GFX_PREF(Once, "dom.vr.osvr.enabled",                   VROSVREnabled, bool, false);
   DECL_GFX_PREF(Live, "dom.vr.poseprediction.enabled",         VRPosePredictionEnabled, bool, false);
-  DECL_GFX_PREF(Once, "dom.vr.require-gesture",                VRRequireGesture, bool, true);
+  DECL_GFX_PREF(Live, "dom.vr.require-gesture",                VRRequireGesture, bool, true);
   DECL_GFX_PREF(Live, "dom.vr.puppet.enabled",                 VRPuppetEnabled, bool, false);
   DECL_GFX_PREF(Live, "dom.w3c_pointer_events.enabled",        PointerEventsEnabled, bool, false);
   DECL_GFX_PREF(Live, "dom.w3c_touch_events.enabled",          TouchEventsEnabled, int32_t, 0);
 
   DECL_GFX_PREF(Live, "general.smoothScroll",                  SmoothScrollEnabled, bool, true);
   DECL_GFX_PREF(Live, "general.smoothScroll.currentVelocityWeighting",
                 SmoothScrollCurrentVelocityWeighting, float, 0.25);
   DECL_GFX_PREF(Live, "general.smoothScroll.durationToIntervalRatio",
--- a/gfx/thebes/gfxSVGGlyphs.h
+++ b/gfx/thebes/gfxSVGGlyphs.h
@@ -197,34 +197,36 @@ public:
                           const gfxMatrix& aCTM) :
         mFillPattern(aFillPattern ? aFillPattern : new gfxPattern(sZero)),
         mStrokePattern(aStrokePattern ? aStrokePattern : new gfxPattern(sZero))
     {
         mFillMatrix = SetupDeviceToPatternMatrix(aFillPattern, aCTM);
         mStrokeMatrix = SetupDeviceToPatternMatrix(aStrokePattern, aCTM);
     }
 
-    already_AddRefed<gfxPattern> GetFillPattern(const DrawTarget* aDrawTarget,
-                                                float aOpacity,
-                                                const gfxMatrix& aCTM) {
+    mozilla::Pair<DrawResult, RefPtr<gfxPattern>>
+    GetFillPattern(const DrawTarget* aDrawTarget,
+                   float aOpacity,
+                   const gfxMatrix& aCTM) {
         if (mFillPattern) {
             mFillPattern->SetMatrix(aCTM * mFillMatrix);
         }
         RefPtr<gfxPattern> fillPattern = mFillPattern;
-        return fillPattern.forget();
+        return MakePair(DrawResult::SUCCESS, Move(fillPattern));
     }
 
-    already_AddRefed<gfxPattern> GetStrokePattern(const DrawTarget* aDrawTarget,
-                                                  float aOpacity,
-                                                  const gfxMatrix& aCTM) {
+    mozilla::Pair<DrawResult, RefPtr<gfxPattern>>
+    GetStrokePattern(const DrawTarget* aDrawTarget,
+                     float aOpacity,
+                     const gfxMatrix& aCTM) {
         if (mStrokePattern) {
             mStrokePattern->SetMatrix(aCTM * mStrokeMatrix);
         }
         RefPtr<gfxPattern> strokePattern = mStrokePattern;
-        return strokePattern.forget();
+        return MakePair(DrawResult::SUCCESS, Move(strokePattern));
     }
 
     float GetFillOpacity() const {
         return mFillPattern ? 1.0f : 0.0f;
     }
 
     float GetStrokeOpacity() const {
         return mStrokePattern ? 1.0f : 0.0f;
--- a/gfx/vr/gfxVRPuppet.cpp
+++ b/gfx/vr/gfxVRPuppet.cpp
@@ -84,17 +84,16 @@ VRDisplayPuppet::VRDisplayPuppet()
   mDisplayInfo.mSittingToStandingTransform._33 = 1.0f;
   mDisplayInfo.mSittingToStandingTransform._34 = 0.0f;
 
   mDisplayInfo.mSittingToStandingTransform._41 = 0.0f;
   mDisplayInfo.mSittingToStandingTransform._42 = 0.75f;
   mDisplayInfo.mSittingToStandingTransform._43 = 0.0f;
 
   mSensorState.Clear();
-  mSensorState.timestamp = PR_Now();
 
   gfx::Quaternion rot;
 
   mSensorState.flags |= VRDisplayCapabilityFlags::Cap_Orientation;
   mSensorState.orientation[0] = rot.x;
   mSensorState.orientation[1] = rot.y;
   mSensorState.orientation[2] = rot.z;
   mSensorState.orientation[3] = rot.w;
@@ -114,17 +113,22 @@ VRDisplayPuppet::VRDisplayPuppet()
 VRDisplayPuppet::~VRDisplayPuppet()
 {
   MOZ_COUNT_DTOR_INHERITED(VRDisplayPuppet, VRDisplayHost);
 }
 
 void
 VRDisplayPuppet::SetDisplayInfo(const VRDisplayInfo& aDisplayInfo)
 {
-  mDisplayInfo = aDisplayInfo;
+  // We are only interested in the eye info of the display info.
+  mDisplayInfo.mEyeResolution = aDisplayInfo.mEyeResolution;
+  memcpy(&mDisplayInfo.mEyeFOV, &aDisplayInfo.mEyeFOV,
+         sizeof(mDisplayInfo.mEyeFOV[0]) * VRDisplayInfo::NumEyes);
+  memcpy(&mDisplayInfo.mEyeTranslation, &aDisplayInfo.mEyeTranslation,
+         sizeof(mDisplayInfo.mEyeTranslation[0]) * VRDisplayInfo::NumEyes);
 }
 
 void
 VRDisplayPuppet::Destroy()
 {
   StopPresentation();
 }
 
@@ -143,17 +147,17 @@ VRHMDSensorState
 VRDisplayPuppet::GetSensorState(double timeOffset)
 {
   return mSensorState;
 }
 
 void
 VRDisplayPuppet::SetSensorState(const VRHMDSensorState& aSensorState)
 {
-  mSensorState = aSensorState;
+  memcpy(&mSensorState, &aSensorState, sizeof(mSensorState));
 }
 
 void
 VRDisplayPuppet::StartPresentation()
 {
   if (mIsPresenting) {
     return;
   }
--- a/gfx/vr/ipc/VRManagerChild.cpp
+++ b/gfx/vr/ipc/VRManagerChild.cpp
@@ -40,16 +40,17 @@ void ReleaseVRManagerParentSingleton() {
 VRManagerChild::VRManagerChild()
   : TextureForwarder()
   , mDisplaysInitialized(false)
   , mInputFrameID(-1)
   , mMessageLoop(MessageLoop::current())
   , mFrameRequestCallbackCounter(0)
   , mBackend(layers::LayersBackend::LAYERS_NONE)
   , mPromiseID(0)
+  , mVRMockDisplay(nullptr)
 {
   MOZ_ASSERT(NS_IsMainThread());
 
   mStartTimeStamp = TimeStamp::Now();
 }
 
 VRManagerChild::~VRManagerChild()
 {
@@ -514,17 +515,21 @@ VRManagerChild::RecvReplyCreateVRService
                                                     const uint32_t& aPromiseID,
                                                     const uint32_t& aDeviceID)
 {
   RefPtr<dom::Promise> p;
   if (!mPromiseList.Get(aPromiseID, getter_AddRefs(p))) {
     MOZ_CRASH("We should always have a promise.");
   }
 
-  p->MaybeResolve(new VRMockDisplay(aID, aDeviceID));
+  // We only allow one VRMockDisplay in VR tests.
+  if (!mVRMockDisplay) {
+    mVRMockDisplay = new VRMockDisplay(aID, aDeviceID);
+  }
+  p->MaybeResolve(mVRMockDisplay);
   mPromiseList.Remove(aPromiseID);
   return IPC_OK();
 }
 
 mozilla::ipc::IPCResult
 VRManagerChild::RecvReplyCreateVRServiceTestController(const nsCString& aID,
                                                        const uint32_t& aPromiseID,
                                                        const uint32_t& aDeviceID)
--- a/gfx/vr/ipc/VRManagerChild.h
+++ b/gfx/vr/ipc/VRManagerChild.h
@@ -16,16 +16,17 @@
 #include "mozilla/layers/TextureForwarder.h"
 
 namespace mozilla {
 namespace dom {
 class GamepadManager;
 class Navigator;
 class VRDisplay;
 class VREventObserver;
+class VRMockDisplay;
 } // namespace dom
 namespace layers {
 class TextureClient;
 }
 namespace gfx {
 class VRLayerChild;
 class VRDisplayClient;
 
@@ -182,16 +183,17 @@ private:
   * It defer calling of TextureClient recycle callback.
   */
   nsDataHashtable<nsUint64HashKey, RefPtr<layers::TextureClient> > mTexturesWaitingRecycled;
 
   layers::LayersBackend mBackend;
   RefPtr<layers::SyncObject> mSyncObject;
   uint32_t mPromiseID;
   nsRefPtrHashtable<nsUint32HashKey, dom::Promise> mPromiseList;
+  RefPtr<dom::VRMockDisplay> mVRMockDisplay;
 
   DISALLOW_COPY_AND_ASSIGN(VRManagerChild);
 };
 
 } // namespace mozilla
 } // namespace gfx
 
 #endif // MOZILLA_GFX_VR_VRMANAGERCHILD_H
--- a/gfx/vr/ipc/VRManagerParent.cpp
+++ b/gfx/vr/ipc/VRManagerParent.cpp
@@ -386,62 +386,67 @@ VRManagerParent::RecvCreateVRServiceTest
   return IPC_FAIL(this, "SendReplyCreateVRServiceTestController fail");
 }
 
 mozilla::ipc::IPCResult
 VRManagerParent::RecvSetDisplayInfoToMockDisplay(const uint32_t& aDeviceID,
                                                  const VRDisplayInfo& aDisplayInfo)
 {
   RefPtr<impl::VRDisplayPuppet> displayPuppet;
-  MOZ_ASSERT(mVRDisplayTests.Get(mDisplayTestID,
-                                 getter_AddRefs(displayPuppet)));
+  mVRDisplayTests.Get(mDisplayTestID,
+                      getter_AddRefs(displayPuppet));
+  MOZ_ASSERT(displayPuppet);
   displayPuppet->SetDisplayInfo(aDisplayInfo);
   return IPC_OK();
 }
 
 mozilla::ipc::IPCResult
 VRManagerParent::RecvSetSensorStateToMockDisplay(const uint32_t& aDeviceID,
                                                  const VRHMDSensorState& aSensorState)
 {
   RefPtr<impl::VRDisplayPuppet> displayPuppet;
-  MOZ_ASSERT(mVRDisplayTests.Get(mControllerTestID,
-                                 getter_AddRefs(displayPuppet)));
+  mVRDisplayTests.Get(mDisplayTestID,
+                      getter_AddRefs(displayPuppet));
+  MOZ_ASSERT(displayPuppet);
   displayPuppet->SetSensorState(aSensorState);
   return IPC_OK();
 }
 
 mozilla::ipc::IPCResult
 VRManagerParent::RecvNewButtonEventToMockController(const uint32_t& aDeviceID, const long& aButton,
                                                     const bool& aPressed)
 {
   RefPtr<impl::VRControllerPuppet> controllerPuppet;
-  MOZ_ASSERT(mVRControllerTests.Get(mControllerTestID,
-                                    getter_AddRefs(controllerPuppet)));
+  mVRControllerTests.Get(mControllerTestID,
+                         getter_AddRefs(controllerPuppet));
+  MOZ_ASSERT(controllerPuppet);
   controllerPuppet->SetButtonPressState(aButton, aPressed);
   return IPC_OK();
 }
 
 mozilla::ipc::IPCResult
 VRManagerParent::RecvNewAxisMoveEventToMockController(const uint32_t& aDeviceID, const long& aAxis,
                                                       const double& aValue)
 {
   RefPtr<impl::VRControllerPuppet> controllerPuppet;
-  MOZ_ASSERT(mVRControllerTests.Get(mControllerTestID,
-                                    getter_AddRefs(controllerPuppet)));
+  mVRControllerTests.Get(mControllerTestID,
+                         getter_AddRefs(controllerPuppet));
+  MOZ_ASSERT(controllerPuppet);
   controllerPuppet->SetAxisMoveState(aAxis, aValue);
   return IPC_OK();
 }
 
 mozilla::ipc::IPCResult
 VRManagerParent::RecvNewPoseMoveToMockController(const uint32_t& aDeviceID,
                                                  const GamepadPoseState& pose)
 {
   RefPtr<impl::VRControllerPuppet> controllerPuppet;
-  MOZ_ASSERT(mVRControllerTests.Get(mControllerTestID,
-                                    getter_AddRefs(controllerPuppet)));
+  mVRControllerTests.Get(mControllerTestID,
+                         getter_AddRefs(controllerPuppet));
+  MOZ_ASSERT(controllerPuppet);
   controllerPuppet->SetPoseMoveState(pose);
   return IPC_OK();
 }
 
 bool
 VRManagerParent::SendGamepadUpdate(const GamepadChangeEvent& aGamepadEvent)
 {
   // GamepadManager only exists at the content process
--- a/intl/locale/tests/unit/xpcshell.ini
+++ b/intl/locale/tests/unit/xpcshell.ini
@@ -21,8 +21,9 @@ skip-if = toolkit == "android" # bug 130
 [test_pluralForm.js]
 [test_pluralForm_english.js]
 [test_pluralForm_makeGetter.js]
 
 [test_osPreferences.js]
 skip-if = toolkit == "android" # bug 1344596
 [test_localeService.js]
 [test_localeService_negotiateLanguages.js]
+skip-if = toolkit == "android" # bug 1347431
--- a/js/xpconnect/tests/unit/xpcshell.ini
+++ b/js/xpconnect/tests/unit/xpcshell.ini
@@ -80,16 +80,17 @@ head = head_ongc.js
 [test_onGarbageCollection-03.js]
 head = head_ongc.js
 [test_onGarbageCollection-04.js]
 head = head_ongc.js
 [test_onGarbageCollection-05.js]
 head = head_ongc.js
 [test_reflect_parse.js]
 [test_localeCompare.js]
+skip-if = toolkit == "android" # bug 1347431
 [test_recursive_import.js]
 [test_xpcomutils.js]
 [test_unload.js]
 [test_attributes.js]
 [test_params.js]
 [test_tearoffs.js]
 [test_want_components.js]
 [test_components.js]
--- a/layout/base/AccessibleCaretManager.cpp
+++ b/layout/base/AccessibleCaretManager.cpp
@@ -93,18 +93,16 @@ AccessibleCaretManager::AccessibleCaretM
 {
   if (!mPresShell) {
     return;
   }
 
   mFirstCaret = MakeUnique<AccessibleCaret>(mPresShell);
   mSecondCaret = MakeUnique<AccessibleCaret>(mPresShell);
 
-  mCaretTimeoutTimer = do_CreateInstance("@mozilla.org/timer;1");
-
   static bool addedPrefs = false;
   if (!addedPrefs) {
     Preferences::AddBoolVarCache(&sSelectionBarEnabled,
                                  "layout.accessiblecaret.bar.enabled");
     Preferences::AddBoolVarCache(&sCaretShownWhenLongTappingOnEmptyContent,
       "layout.accessiblecaret.caret_shown_when_long_tapping_on_empty_content");
     Preferences::AddBoolVarCache(&sCaretsAlwaysTilt,
                                  "layout.accessiblecaret.always_tilt");
@@ -126,18 +124,16 @@ AccessibleCaretManager::AccessibleCaretM
 
 AccessibleCaretManager::~AccessibleCaretManager()
 {
 }
 
 void
 AccessibleCaretManager::Terminate()
 {
-  CancelCaretTimeoutTimer();
-  mCaretTimeoutTimer = nullptr;
   mFirstCaret = nullptr;
   mSecondCaret = nullptr;
   mActiveCaret = nullptr;
   mPresShell = nullptr;
 }
 
 nsresult
 AccessibleCaretManager::OnSelectionChanged(nsIDOMDocument* aDoc,
@@ -214,17 +210,16 @@ AccessibleCaretManager::OnSelectionChang
 void
 AccessibleCaretManager::HideCarets()
 {
   if (mFirstCaret->IsLogicallyVisible() || mSecondCaret->IsLogicallyVisible()) {
     AC_LOG("%s", __FUNCTION__);
     mFirstCaret->SetAppearance(Appearance::None);
     mSecondCaret->SetAppearance(Appearance::None);
     DispatchCaretStateChangedEvent(CaretChangedReason::Visibilitychange);
-    CancelCaretTimeoutTimer();
   }
 }
 
 void
 AccessibleCaretManager::UpdateCarets(UpdateCaretsHintSet aHint)
 {
   FlushLayout();
   if (IsTerminated()) {
@@ -332,18 +327,16 @@ AccessibleCaretManager::UpdateCaretsForC
     case PositionChangedResult::Invisible:
       mFirstCaret->SetAppearance(Appearance::NormalNotShown);
       break;
   }
 
   mFirstCaret->SetSelectionBarEnabled(false);
   mSecondCaret->SetAppearance(Appearance::None);
 
-  LaunchCaretTimeoutTimer();
-
   if (!aHints.contains(UpdateCaretsHint::DispatchNoEvent) &&
       !mActiveCaret) {
     DispatchCaretStateChangedEvent(CaretChangedReason::Updateposition);
   }
 }
 
 void
 AccessibleCaretManager::UpdateCaretsForSelectionMode(UpdateCaretsHintSet aHints)
@@ -496,17 +489,16 @@ AccessibleCaretManager::PressCaret(const
     SetSelectionDirection(eDirNext);
   }
 
   if (mActiveCaret) {
     mOffsetYToCaretLogicalPosition =
       mActiveCaret->LogicalPosition().y - aPoint.y;
     SetSelectionDragState(true);
     DispatchCaretStateChangedEvent(CaretChangedReason::Presscaret);
-    CancelCaretTimeoutTimer();
     rv = NS_OK;
   }
 
   return rv;
 }
 
 nsresult
 AccessibleCaretManager::DragCaret(const nsPoint& aPoint)
@@ -523,17 +515,16 @@ AccessibleCaretManager::DragCaret(const 
 nsresult
 AccessibleCaretManager::ReleaseCaret()
 {
   MOZ_ASSERT(mActiveCaret);
 
   mActiveCaret = nullptr;
   SetSelectionDragState(false);
   DispatchCaretStateChangedEvent(CaretChangedReason::Releasecaret);
-  LaunchCaretTimeoutTimer();
   return NS_OK;
 }
 
 nsresult
 AccessibleCaretManager::TapCaret(const nsPoint& aPoint)
 {
   MOZ_ASSERT(GetCaretMode() != CaretMode::None);
 
@@ -683,17 +674,17 @@ AccessibleCaretManager::OnScrollEnd()
   if (!sCaretsAlwaysShowWhenScrolling) {
     // Restore the appearance which is saved before the scrolling is started.
     mFirstCaret->SetAppearance(mFirstCaretAppearanceOnScrollStart);
     mSecondCaret->SetAppearance(mSecondCaretAppearanceOnScrollStart);
   }
 
   if (GetCaretMode() == CaretMode::Cursor) {
     if (!mFirstCaret->IsLogicallyVisible()) {
-      // If the caret is hidden (Appearance::None) due to timeout or blur, no
+      // If the caret is hidden (Appearance::None) due to blur, no
       // need to update it.
       return;
     }
   }
 
   // For mouse input we don't want to show the carets.
   if (sHideCaretsForMouseInput &&
       mLastInputSource == nsIDOMMouseEvent::MOZ_SOURCE_MOUSE) {
@@ -1377,58 +1368,16 @@ AccessibleCaretManager::AdjustDragBounda
         adjustedPoint.y = dragUpBoundaryY;
       }
     }
   }
 
   return adjustedPoint;
 }
 
-uint32_t
-AccessibleCaretManager::CaretTimeoutMs() const
-{
-  static bool added = false;
-  static uint32_t caretTimeoutMs = 0;
-
-  if (!added) {
-    Preferences::AddUintVarCache(&caretTimeoutMs,
-                                 "layout.accessiblecaret.timeout_ms");
-    added = true;
-  }
-
-  return caretTimeoutMs;
-}
-
-void
-AccessibleCaretManager::LaunchCaretTimeoutTimer()
-{
-  if (!mPresShell || !mCaretTimeoutTimer || CaretTimeoutMs() == 0 ||
-      GetCaretMode() != CaretMode::Cursor || mActiveCaret) {
-    return;
-  }
-
-  nsTimerCallbackFunc callback = [](nsITimer* aTimer, void* aClosure) {
-    auto self = static_cast<AccessibleCaretManager*>(aClosure);
-    if (self->GetCaretMode() == CaretMode::Cursor) {
-      self->HideCarets();
-    }
-  };
-
-  mCaretTimeoutTimer->InitWithFuncCallback(callback, this, CaretTimeoutMs(),
-                                           nsITimer::TYPE_ONE_SHOT);
-}
-
-void
-AccessibleCaretManager::CancelCaretTimeoutTimer()
-{
-  if (mCaretTimeoutTimer) {
-    mCaretTimeoutTimer->Cancel();
-  }
-}
-
 void
 AccessibleCaretManager::DispatchCaretStateChangedEvent(CaretChangedReason aReason) const
 {
   if (!mPresShell) {
     return;
   }
 
   FlushLayout();
--- a/layout/base/AccessibleCaretManager.h
+++ b/layout/base/AccessibleCaretManager.h
@@ -123,17 +123,17 @@ protected:
   friend std::ostream& operator<<(std::ostream& aStream,
                                   const CaretMode& aCaretMode);
 
   enum class UpdateCaretsHint : uint8_t {
     // Update everything including appearance and position.
     Default,
 
     // Update everything while respecting the old appearance. For example, if
-    // the caret in cursor mode is hidden due to timeout, do not change its
+    // the caret in cursor mode is hidden due to blur, do not change its
     // appearance to Normal.
     RespectOldAppearance,
 
     // No CaretStateChangedEvent will be dispatched in the end of
     // UpdateCarets().
     DispatchNoEvent,
   };
 
@@ -213,22 +213,16 @@ protected:
   // @param aOffsets is the new position of the active caret, and it will be set
   // to the `limit` when 1) sCaretsAllowDraggingAcrossOtherCaret is false and
   // it's being dragged past the limit. 2) sCaretsAllowDraggingAcrossOtherCaret
   // is true and the active caret's position is the same as the inactive's
   // position.
   // @return true if the aOffsets is suitable for changing the selection.
   bool RestrictCaretDraggingOffsets(nsIFrame::ContentOffsets& aOffsets);
 
-  // Timeout in milliseconds to hide the AccessibleCaret under cursor mode while
-  // no one touches it.
-  uint32_t CaretTimeoutMs() const;
-  void LaunchCaretTimeoutTimer();
-  void CancelCaretTimeoutTimer();
-
   // ---------------------------------------------------------------------------
   // The following functions are made virtual for stubbing or mocking in gtest.
   //
   // @return true if Terminate() had been called.
   virtual bool IsTerminated() const { return !mPresShell; }
 
   // Get caret mode based on current selection.
   virtual CaretMode GetCaretMode() const;
@@ -275,20 +269,16 @@ protected:
 
   // Second caret is used solely in selection mode, and is attached to selection
   // highlight as the right caret.
   UniquePtr<AccessibleCaret> mSecondCaret;
 
   // The caret being pressed or dragged.
   AccessibleCaret* mActiveCaret = nullptr;
 
-  // The timer for hiding the caret in cursor mode after timeout behind the
-  // preference "layout.accessiblecaret.timeout_ms".
-  nsCOMPtr<nsITimer> mCaretTimeoutTimer;
-
   // The caret mode since last update carets.
   CaretMode mLastUpdateCaretMode = CaretMode::None;
 
   // Store the appearance of the carets when calling OnScrollStart() so that it
   // can be restored in OnScrollEnd().
   AccessibleCaret::Appearance mFirstCaretAppearanceOnScrollStart =
                                  AccessibleCaret::Appearance::None;
   AccessibleCaret::Appearance mSecondCaretAppearanceOnScrollStart =
--- a/layout/base/tests/marionette/test_accessiblecaret_cursor_mode.py
+++ b/layout/base/tests/marionette/test_accessiblecaret_cursor_mode.py
@@ -30,21 +30,19 @@ class AccessibleCaretCursorModeTestCase(
 
     # Test html files.
     _cursor_html = 'test_carets_cursor.html'
 
     def setUp(self):
         # Code to execute before every test is running.
         super(AccessibleCaretCursorModeTestCase, self).setUp()
         self.caret_tested_pref = 'layout.accessiblecaret.enabled'
-        self.caret_timeout_ms_pref = 'layout.accessiblecaret.timeout_ms'
         self.hide_carets_for_mouse = 'layout.accessiblecaret.hide_carets_for_mouse_input'
         self.prefs = {
             self.caret_tested_pref: True,
-            self.caret_timeout_ms_pref: 0,
             self.hide_carets_for_mouse: False,
         }
         self.marionette.set_prefs(self.prefs)
         self.actions = Actions(self.marionette)
 
     def open_test_html(self, test_html):
         self.marionette.navigate(self.marionette.absolute_url(test_html))
 
@@ -125,50 +123,16 @@ class AccessibleCaretCursorModeTestCase(
         src_x, src_y = sel.first_caret_location()
 
         # Move first caret to the front of the input box.
         self.actions.flick(el, src_x, src_y, dest_x, dest_y).perform()
 
         self.actions.key_down(content_to_add).key_up(content_to_add).perform()
         self.assertEqual(target_content, sel.content)
 
-    @parameterized(_input_id, el_id=_input_id)
-    @parameterized(_textarea_id, el_id=_textarea_id)
-    @parameterized(_contenteditable_id, el_id=_contenteditable_id)
-    def test_dragging_caret_to_top_left_corner_after_timeout(self, el_id):
-        self.open_test_html(self._cursor_html)
-        el = self.marionette.find_element(By.ID, el_id)
-        sel = SelectionManager(el)
-        content_to_add = '!'
-        non_target_content = content_to_add + sel.content
-
-        # Set caret timeout to be 1 second.
-        timeout = 1
-        self.marionette.set_pref(self.caret_timeout_ms_pref, timeout * 1000)
-
-        # Set a 3x timeout margin to prevent intermittent test failures.
-        timeout *= 3
-
-        # Tap to make first caret appear. Note: it's strange that when the caret
-        # is at the end, the rect of the caret in <textarea> cannot be obtained.
-        # A bug perhaps.
-        el.tap()
-        sel.move_cursor_to_end()
-        sel.move_cursor_by_offset(1, backward=True)
-        el.tap(*sel.cursor_location())
-
-        # Wait until first caret disappears, then pretend to move it to the
-        # top-left corner of the input box.
-        src_x, src_y = sel.first_caret_location()
-        dest_x, dest_y = 0, 0
-        self.actions.wait(timeout).flick(el, src_x, src_y, dest_x, dest_y).perform()
-
-        self.actions.key_down(content_to_add).key_up(content_to_add).perform()
-        self.assertNotEqual(non_target_content, sel.content)
-
     def test_caret_not_appear_when_typing_in_scrollable_content(self):
         self.open_test_html(self._cursor_html)
         el = self.marionette.find_element(By.ID, self._input_id)
         sel = SelectionManager(el)
         content_to_add = '!'
         non_target_content = content_to_add + sel.content + string.ascii_letters
 
         el.tap()
--- a/layout/forms/test/test_bug562447.html
+++ b/layout/forms/test/test_bug562447.html
@@ -18,39 +18,39 @@ https://bugzilla.mozilla.org/show_bug.cg
 <pre id="test">
 <script>
 addLoadEvent(function() {
   // Scroll down a bit
   window.scrollTo(0, 5000);
 
   setTimeout(function() {
     // Make sure that we're scrolled by 5000px
-    is(window.pageYOffset, 5000, "Make sure we're scrolled correctly");
+    is(Math.round(window.pageYOffset), 5000, "Make sure we're scrolled correctly");
 
     // Scroll back up, and mess with the input box along the way
     var input = document.getElementById("WhyDoYouFocusMe");
     input.focus();
     input.blur();
     window.scrollTo(0, 0);
 
     setTimeout(function() {
       is(window.pageYOffset, 0, "Make sure we're scrolled back up correctly");
 
       // Scroll back up
       window.scrollTo(0, 5000);
 
       setTimeout(function() {
-        is(window.pageYOffset, 5000, "Sanity check");
+        is(Math.round(window.pageYOffset), 5000, "Sanity check");
 
         window.scrollTo(0, 0);
         input.focus();
         input.blur();
 
         setTimeout(function() {
-          isnot(window.pageYOffset, 0, "This time we shouldn't be scrolled up");
+          isnot(Math.round(window.pageYOffset), 0, "This time we shouldn't be scrolled up");
 
           SimpleTest.finish();
         }, 0);
       }, 0);
     }, 0);
   }, 0);
 });
 
--- a/layout/forms/test/test_bug564115.html
+++ b/layout/forms/test/test_bug564115.html
@@ -25,22 +25,22 @@ addLoadEvent(function() {
 
     // Focus the input box, and wait for the focus to actually happen
     input.focus();
     setTimeout(function() {
       // Scroll down a bit
       win.scrollTo(0, 5000);
 
       setTimeout(function() {
-        is(win.pageYOffset, 5000, "Page should be scrolled correctly");
+        is(Math.round(win.pageYOffset), 5000, "Page should be scrolled correctly");
 
         // Refocus the window
         SimpleTest.waitForFocus(function() {
           SimpleTest.waitForFocus(function() {
-            is(win.pageYOffset, 5000,
+            is(Math.round(win.pageYOffset), 5000,
                "The page's scroll offset should not have been changed");
 
             win.close();
             SimpleTest.finish();
           }, win);
         });
       }, 0);
     }, 0);
--- a/layout/generic/nsSelection.cpp
+++ b/layout/generic/nsSelection.cpp
@@ -6396,21 +6396,27 @@ Selection::NotifySelectionListeners(bool
 }
 
 nsresult
 Selection::NotifySelectionListeners()
 {
   if (!mFrameSelection)
     return NS_OK;//nothing to do
 
+  // Our internal code should not move focus with using this class while
+  // this moves focus nor from selection listeners.
+  AutoRestore<bool> calledByJSRestorer(mCalledByJS);
+  mCalledByJS = false;
+
   // When normal selection is changed by Selection API, we need to move focus
   // if common ancestor of all ranges are in an editing host.  Note that we
   // don't need to move focus *to* the other focusable node because other
   // browsers don't do it either.
-  if (mSelectionType == SelectionType::eNormal && mCalledByJS) {
+  if (mSelectionType == SelectionType::eNormal &&
+      calledByJSRestorer.SavedValue()) {
     nsPIDOMWindowOuter* window = GetWindow();
     nsIDocument* document = GetDocument();
     // If the document is in design mode or doesn't have contenteditable
     // element, we don't need to move focus.
     if (window && document && !document->HasFlag(NODE_IS_EDITABLE) &&
         GetEditor()) {
       RefPtr<Element> newEditingHost = GetCommonEditingHostForAllRanges();
       nsFocusManager* fm = nsFocusManager::GetFocusManager();
@@ -6434,21 +6440,16 @@ Selection::NotifySelectionListeners()
         IgnoredErrorResult err;
         focusedElement->Blur(err);
         NS_WARNING_ASSERTION(!err.Failed(),
                              "Failed to blur focused element");
       }
     }
   }
 
-  // After moving focus, especially in selection listeners, our internal code
-  // should not move focus with using this class.
-  AutoRestore<bool> calledFromExternalRestorer(mCalledByJS);
-  mCalledByJS = false;
-
   if (mFrameSelection->GetBatching()) {
     mFrameSelection->SetDirty();
     return NS_OK;
   }
   nsCOMArray<nsISelectionListener> selectionListeners(mSelectionListeners);
   int32_t cnt = selectionListeners.Count();
   if (cnt != mSelectionListeners.Count()) {
     return NS_ERROR_OUT_OF_MEMORY;  // nsCOMArray is fallible
--- a/layout/painting/nsCSSRendering.cpp
+++ b/layout/painting/nsCSSRendering.cpp
@@ -2897,17 +2897,17 @@ ClampColorStops(nsTArray<ColorStop>& aSt
   }
   if (aStops.LastElement().mPosition < 1) {
     aStops.AppendElement(ColorStop(1, false, aStops.LastElement().mColor));
   }
 }
 
 void
 nsCSSRendering::PaintGradient(nsPresContext* aPresContext,
-                              nsRenderingContext& aRenderingContext,
+                              gfxContext& aContext,
                               nsStyleGradient* aGradient,
                               const nsRect& aDirtyRect,
                               const nsRect& aDest,
                               const nsRect& aFillArea,
                               const nsSize& aRepeatSize,
                               const CSSIntRect& aSrc,
                               const nsSize& aIntrinsicSize,
                               float aOpacity)
@@ -2915,17 +2915,16 @@ nsCSSRendering::PaintGradient(nsPresCont
   PROFILER_LABEL("nsCSSRendering", "PaintGradient",
     js::ProfileEntry::Category::GRAPHICS);
 
   Telemetry::AutoTimer<Telemetry::GRADIENT_DURATION, Telemetry::Microsecond> gradientTimer;
   if (aDest.IsEmpty() || aFillArea.IsEmpty()) {
     return;
   }
 
-  gfxContext *ctx = aRenderingContext.ThebesContext();
   nscoord appUnitsPerDevPixel = aPresContext->AppUnitsPerDevPixel();
   gfxSize srcSize = gfxSize(gfxFloat(aIntrinsicSize.width)/appUnitsPerDevPixel,
                             gfxFloat(aIntrinsicSize.height)/appUnitsPerDevPixel);
 
   bool cellContainsFill = aDest.Contains(aFillArea);
 
   // Compute "gradient line" start and end relative to the intrinsic size of
   // the gradient.
@@ -3258,17 +3257,17 @@ nsCSSRendering::PaintGradient(nsPresCont
   nsTArray<gfx::GradientStop> rawStops(stops.Length());
   rawStops.SetLength(stops.Length());
   for(uint32_t i = 0; i < stops.Length(); i++) {
     rawStops[i].color = stops[i].mColor;
     rawStops[i].color.a *= aOpacity;
     rawStops[i].offset = stopScale * (stops[i].mPosition - stopOrigin);
   }
   RefPtr<mozilla::gfx::GradientStops> gs =
-    gfxGradientCache::GetOrCreateGradientStops(ctx->GetDrawTarget(),
+    gfxGradientCache::GetOrCreateGradientStops(aContext.GetDrawTarget(),
                                                rawStops,
                                                isRepeat ? gfx::ExtendMode::REPEAT : gfx::ExtendMode::CLAMP);
   gradientPattern->SetColorStops(gs);
 
   // Paint gradient tiles. This isn't terribly efficient, but doing it this
   // way is simple and sure to get pixel-snapping right. We could speed things
   // up by drawing tiles into temporary surfaces and copying those to the
   // destination, but after pixel-snapping tiles may not all be the same size.
@@ -3276,17 +3275,17 @@ nsCSSRendering::PaintGradient(nsPresCont
   if (!dirty.IntersectRect(aDirtyRect, aFillArea))
     return;
 
   gfxRect areaToFill =
     nsLayoutUtils::RectToGfxRect(aFillArea, appUnitsPerDevPixel);
   gfxRect dirtyAreaToFill = nsLayoutUtils::RectToGfxRect(dirty, appUnitsPerDevPixel);
   dirtyAreaToFill.RoundOut();
 
-  gfxMatrix ctm = ctx->CurrentMatrix();
+  gfxMatrix ctm = aContext.CurrentMatrix();
   bool isCTMPreservingAxisAlignedRectangles = ctm.PreservesAxisAlignedRectangles();
 
   // xStart/yStart are the top-left corner of the top-left tile.
   nscoord xStart = FindTileStart(dirty.x, aDest.x, aRepeatSize.width);
   nscoord yStart = FindTileStart(dirty.y, aDest.y, aRepeatSize.height);
   nscoord xEnd = forceRepeatToCoverTiles ? xStart + aDest.width : dirty.XMost();
   nscoord yEnd = forceRepeatToCoverTiles ? yStart + aDest.height : dirty.YMost();
 
@@ -3304,51 +3303,51 @@ nsCSSRendering::PaintGradient(nsPresCont
       // Try snapping the fill rect. Snap its top-left and bottom-right
       // independently to preserve the orientation.
       gfxPoint snappedFillRectTopLeft = fillRect.TopLeft();
       gfxPoint snappedFillRectTopRight = fillRect.TopRight();
       gfxPoint snappedFillRectBottomRight = fillRect.BottomRight();
       // Snap three points instead of just two to ensure we choose the
       // correct orientation if there's a reflection.
       if (isCTMPreservingAxisAlignedRectangles &&
-          ctx->UserToDevicePixelSnapped(snappedFillRectTopLeft, true) &&
-          ctx->UserToDevicePixelSnapped(snappedFillRectBottomRight, true) &&
-          ctx->UserToDevicePixelSnapped(snappedFillRectTopRight, true)) {
+          aContext.UserToDevicePixelSnapped(snappedFillRectTopLeft, true) &&
+          aContext.UserToDevicePixelSnapped(snappedFillRectBottomRight, true) &&
+          aContext.UserToDevicePixelSnapped(snappedFillRectTopRight, true)) {
         if (snappedFillRectTopLeft.x == snappedFillRectBottomRight.x ||
             snappedFillRectTopLeft.y == snappedFillRectBottomRight.y) {
           // Nothing to draw; avoid scaling by zero and other weirdness that
           // could put the context in an error state.
           continue;
         }
         // Set the context's transform to the transform that maps fillRect to
         // snappedFillRect. The part of the gradient that was going to
         // exactly fill fillRect will fill snappedFillRect instead.
         gfxMatrix transform = gfxUtils::TransformRectToRect(fillRect,
             snappedFillRectTopLeft, snappedFillRectTopRight,
             snappedFillRectBottomRight);
-        ctx->SetMatrix(transform);
+        aContext.SetMatrix(transform);
       }
-      ctx->NewPath();
-      ctx->Rectangle(fillRect);
+      aContext.NewPath();
+      aContext.Rectangle(fillRect);
 
       gfxRect dirtyFillRect = fillRect.Intersect(dirtyAreaToFill);
       gfxRect fillRectRelativeToTile = dirtyFillRect - tileRect.TopLeft();
       Color edgeColor;
       if (aGradient->mShape == NS_STYLE_GRADIENT_SHAPE_LINEAR && !isRepeat &&
           RectIsBeyondLinearGradientEdge(fillRectRelativeToTile, matrix, stops,
                                          gradientStart, gradientEnd, &edgeColor)) {
         edgeColor.a *= aOpacity;
-        ctx->SetColor(edgeColor);
+        aContext.SetColor(edgeColor);
       } else {
-        ctx->SetMatrix(
-          ctx->CurrentMatrix().Copy().Translate(tileRect.TopLeft()));
-        ctx->SetPattern(gradientPattern);
+        aContext.SetMatrix(
+          aContext.CurrentMatrix().Copy().Translate(tileRect.TopLeft()));
+        aContext.SetPattern(gradientPattern);
       }
-      ctx->Fill();
-      ctx->SetMatrix(ctm);
+      aContext.Fill();
+      aContext.SetMatrix(ctm);
     }
   }
 }
 
 static CompositionOp
 DetermineCompositionOp(const nsCSSRendering::PaintBGParams& aParams,
                        const nsStyleImageLayers& aLayers,
                        uint32_t aLayerIndex)
--- a/layout/painting/nsCSSRendering.h
+++ b/layout/painting/nsCSSRendering.h
@@ -232,17 +232,17 @@ struct nsCSSRendering {
    * aFill is the rect on the destination to be covered by repeated tiling of
    * the gradient.
    * aSrc is the part of the gradient to be rendered into a tile (aDest), if
    * aSrc and aDest are different sizes, the image will be scaled to map aSrc
    * onto aDest.
    * aIntrinsicSize is the size of the source gradient.
    */
   static void PaintGradient(nsPresContext* aPresContext,
-                            nsRenderingContext& aRenderingContext,
+                            gfxContext& aContext,
                             nsStyleGradient* aGradient,
                             const nsRect& aDirtyRect,
                             const nsRect& aDest,
                             const nsRect& aFill,
                             const nsSize& aRepeatSize,
                             const mozilla::CSSIntRect& aSrc,
                             const nsSize& aIntrinsiceSize,
                             float aOpacity = 1.0);
--- a/layout/painting/nsImageRenderer.cpp
+++ b/layout/painting/nsImageRenderer.cpp
@@ -503,26 +503,25 @@ nsImageRenderer::Draw(nsPresContext*    
                                            aDest, aFill, aRepeatSize,
                                            aAnchor, aDirtyRect,
                                            ConvertImageRendererToDrawFlags(mFlags),
                                            mExtendMode, aOpacity);
       break;
     }
     case eStyleImageType_Gradient:
     {
-      nsCSSRendering::PaintGradient(aPresContext, aRenderingContext,
+      nsCSSRendering::PaintGradient(aPresContext, *ctx,
                                     mGradientData, aDirtyRect,
                                     aDest, aFill, aRepeatSize, aSrc, mSize,
                                     aOpacity);
       break;
     }
     case eStyleImageType_Element:
     {
-      RefPtr<gfxDrawable> drawable = DrawableForElement(aDest,
-                                                          aRenderingContext);
+      RefPtr<gfxDrawable> drawable = DrawableForElement(aDest, *ctx);
       if (!drawable) {
         NS_WARNING("Could not create drawable for element");
         return DrawResult::TEMPORARY_ERROR;
       }
 
       nsCOMPtr<imgIContainer> image(ImageOps::CreateFromDrawable(drawable));
       result =
         nsLayoutUtils::DrawImage(*ctx,
@@ -558,17 +557,17 @@ nsImageRenderer::Draw(nsPresContext*    
                     DrawOptions(1.0f, aRenderingContext.ThebesContext()->CurrentOp()));
   }
 
   return result;
 }
 
 already_AddRefed<gfxDrawable>
 nsImageRenderer::DrawableForElement(const nsRect& aImageRect,
-                                    nsRenderingContext&  aRenderingContext)
+                                    gfxContext&  aContext)
 {
   NS_ASSERTION(mType == eStyleImageType_Element,
                "DrawableForElement only makes sense if backed by an element");
   if (mPaintServerFrame) {
     // XXX(seth): In order to not pass FLAG_SYNC_DECODE_IMAGES here,
     // DrawableFromPaintServer would have to return a DrawResult indicating
     // whether any images could not be painted because they weren't fully
     // decoded. Even always passing FLAG_SYNC_DECODE_IMAGES won't eliminate all
@@ -576,18 +575,18 @@ nsImageRenderer::DrawableForElement(cons
     // loading, but it's better than nothing.
     int32_t appUnitsPerDevPixel = mForFrame->PresContext()->AppUnitsPerDevPixel();
     nsRect destRect = aImageRect - aImageRect.TopLeft();
     nsIntSize roundedOut = destRect.ToOutsidePixels(appUnitsPerDevPixel).Size();
     IntSize imageSize(roundedOut.width, roundedOut.height);
     RefPtr<gfxDrawable> drawable =
       nsSVGIntegrationUtils::DrawableFromPaintServer(
         mPaintServerFrame, mForFrame, mSize, imageSize,
-        aRenderingContext.GetDrawTarget(),
-        aRenderingContext.ThebesContext()->CurrentMatrix(),
+        aContext.GetDrawTarget(),
+        aContext.CurrentMatrix(),
         nsSVGIntegrationUtils::FLAG_SYNC_DECODE_IMAGES);
 
     return drawable.forget();
   }
   NS_ASSERTION(mImageElementSurface.GetSourceSurface(), "Surface should be ready.");
   RefPtr<gfxDrawable> drawable = new gfxSurfaceDrawable(
                                 mImageElementSurface.GetSourceSurface().get(),
                                 mImageElementSurface.mSize);
@@ -770,18 +769,19 @@ nsImageRenderer::DrawBorderImageComponen
       // This path, for eStyleImageType_Element, is currently slower than it
       // needs to be because we don't cache anything. (In particular, if we have
       // to draw to a temporary surface inside ClippedImage, we don't cache that
       // temporary surface since we immediately throw the ClippedImage we create
       // here away.) However, if we did cache, we'd need to know when to
       // invalidate that cache, and it's not clear that it's worth the trouble
       // since using border-image with -moz-element is rare.
 
-      RefPtr<gfxDrawable> drawable = DrawableForElement(nsRect(nsPoint(), mSize),
-                                                          aRenderingContext);
+      RefPtr<gfxDrawable> drawable =
+        DrawableForElement(nsRect(nsPoint(), mSize),
+                           *aRenderingContext.ThebesContext());
       if (!drawable) {
         NS_WARNING("Could not create drawable for element");
         return DrawResult::TEMPORARY_ERROR;
       }
 
       nsCOMPtr<imgIContainer> image(ImageOps::CreateFromDrawable(drawable));
       subImage = ImageOps::Clip(image, srcRect, aSVGViewportSize);
     }
--- a/layout/painting/nsImageRenderer.h
+++ b/layout/painting/nsImageRenderer.h
@@ -257,17 +257,17 @@ private:
 
   /**
    * Helper method for creating a gfxDrawable from mPaintServerFrame or
    * mImageElementSurface.
    * Requires mType is eStyleImageType_Element.
    * Returns null if we cannot create the drawable.
    */
   already_AddRefed<gfxDrawable> DrawableForElement(const nsRect& aImageRect,
-                                                   nsRenderingContext&  aRenderingContext);
+                                                   gfxContext&  aContext);
 
   nsIFrame*                 mForFrame;
   const nsStyleImage*       mImage;
   nsStyleImageType          mType;
   nsCOMPtr<imgIContainer>   mImageContainer;
   RefPtr<nsStyleGradient> mGradientData;
   nsIFrame*                 mPaintServerFrame;
   nsLayoutUtils::SurfaceFromElementResult mImageElementSurface;
--- a/layout/reftests/abs-pos/reftest-stylo.list
+++ b/layout/reftests/abs-pos/reftest-stylo.list
@@ -50,14 +50,14 @@ fails == auto-offset-inline-block-1.html
 == continuation-positioned-inline-1.html continuation-positioned-inline-1.html
 == continuation-positioned-inline-2.html continuation-positioned-inline-2.html
 fails == scrollframe-1.html scrollframe-1.html
 fails == scrollframe-2.html scrollframe-2.html
 fails == select-1.html select-1.html
 fails == select-1-dynamic.html select-1-dynamic.html
 fails == select-2.html select-2.html
 fails == select-3.html select-3.html
-fails == multi-column-1.html multi-column-1.html
+== multi-column-1.html multi-column-1.html
 == button-1.html button-1.html
 == button-2.html button-2.html
 == relative-row-animation-1.html relative-row-animation-1.html
 == fixed-pos-auto-offset-1a.html fixed-pos-auto-offset-1a.html
 == fixed-pos-auto-offset-1b.html fixed-pos-auto-offset-1b.html
--- a/layout/reftests/bidi/reftest-stylo.list
+++ b/layout/reftests/bidi/reftest-stylo.list
@@ -64,17 +64,17 @@ fails == 115921-2.html 115921-2.html
 == 151407-2-foopy.html 151407-2-foopy.html
 == 151407-3-ltr.html 151407-3-ltr.html
 == 151407-3-rtl.html 151407-3-rtl.html
 == 151407-3-auto.html 151407-3-auto.html
 == 151407-3-foopy.html 151407-3-foopy.html
 == 229367-1.html 229367-1.html
 fails == 229367-2.html 229367-2.html
 == 229367-3.html 229367-3.html
-fails == 258928-1.html 258928-1.html
+== 258928-1.html 258928-1.html
 fails == 263359-1.html 263359-1.html
 fails == 263359-1a.html 263359-1a.html
 fails == 263359-1b.html 263359-1b.html
 fails == 263359-2.html 263359-2.html
 == 263359-3.html 263359-3.html
 fails == 263359-4.html 263359-4.html
 fails == 267459-1.html 267459-1.html
 fails == 267459-2.html 267459-2.html
--- a/layout/reftests/bugs/reftest-stylo.list
+++ b/layout/reftests/bugs/reftest-stylo.list
@@ -301,18 +301,18 @@ fails == 273681-1.html 273681-1.html
 fails == 280708-1a.html 280708-1a.html
 fails == 280708-1b.html 280708-1b.html
 == 281241-1.html 281241-1.html
 == 281241-2.xhtml 281241-2.xhtml
 == 283686-1.html 283686-1.html
 == 283686-2.html 283686-2.html
 == 283686-3.html 283686-3.html
 fails == 289384-1.xhtml 289384-1.xhtml
-fails == 289480.html#top 289480-ref.html
-fails == 289480-ref.html 289480-ref.html
+== 289480.html#top 289480-ref.html
+== 289480-ref.html 289480-ref.html
 fails == 290129-1.html 290129-1.html
 fails == 291078-1.html 291078-1.html
 == 291078-2.html 291078-2.html
 == 291262-1.html 291262-1.html
 == 294306-1.html 294306-1.html
 == 294306-1.html 294306-1.html
 fails == 296361-1.html 296361-1.html
 == 296904-1.html 296904-1.html
@@ -789,17 +789,17 @@ fails == 391140-1.html 391140-1.html
 == 391412-1a.html 391412-1a.html
 == 391412-1b.html 391412-1b.html
 fails == 391909-1.html 391909-1.html
 fails == 391979.html 391979.html
 fails == 391994-1.html 391994-1.html
 == 392047.html 392047.html
 fails == 392435-1.html 392435-1.html
 == 393330-1.html 393330-1.html
-fails == 393490-1.html 393490-1.html
+== 393490-1.html 393490-1.html
 == 393517-1.xhtml 393517-1.xhtml
 == 393649-1.html 393649-1.html
 == 393655-1.html 393655-1.html
 == 393655-2.html 393655-2.html
 == 393655-3.html 393655-3.html
 == 393655-4.html 393655-4.html
 == 393655-5.html 393655-5.html
 == 393671-1.html 393671-1.html
@@ -1513,18 +1513,18 @@ fails-if(Android) == 560455-1.xul 560455
 == 561981-1.html 561981-1.html
 == 561981-2.html 561981-2.html
 == 561981-3.html 561981-3.html
 == 561981-4.html 561981-4.html
 == 561981-5.html 561981-5.html
 == 561981-6.html 561981-6.html
 == 561981-7.html 561981-7.html
 == 561981-8.html 561981-8.html
-fails == 562835-1.html 562835-1.html
-fails == 562835-2.html 562835-2.html
+== 562835-1.html 562835-1.html
+== 562835-2.html 562835-2.html
 == 563584-1.html 563584-1.html
 == 563584-2.html 563584-2.html
 == 563584-3.html 563584-3.html
 == 563584-4.html 563584-4.html
 == 563584-5.html 563584-5.html
 pref(layout.float-fragments-inside-column.enabled,false) == 563584-6-columns.html 563584-6-columns.html
 pref(layout.float-fragments-inside-column.enabled,true) == 563584-6-columns.html 563584-6-columns.html
 fuzzy-if(Android,2,48) == 563584-6-printing.html 563584-6-printing.html
--- a/layout/reftests/css-grid/reftest-stylo.list
+++ b/layout/reftests/css-grid/reftest-stylo.list
@@ -52,27 +52,27 @@ fails == grid-col-max-sizing-max-content
 fails == grid-col-max-sizing-max-content-002.html grid-col-max-sizing-max-content-002.html
 fails == grid-min-max-content-sizing-001.html grid-min-max-content-sizing-001.html
 fails == grid-min-max-content-sizing-002.html grid-min-max-content-sizing-002.html
 fails == grid-auto-min-sizing-definite-001.html grid-auto-min-sizing-definite-001.html
 fails == grid-auto-min-sizing-intrinsic-001.html grid-auto-min-sizing-intrinsic-001.html
 fails == grid-auto-min-sizing-intrinsic-002.html grid-auto-min-sizing-intrinsic-002.html
 fails == grid-auto-min-sizing-intrinsic-003.html grid-auto-min-sizing-intrinsic-003.html
 fails == grid-auto-min-sizing-intrinsic-004.html grid-auto-min-sizing-intrinsic-004.html
-fails == grid-auto-min-sizing-transferred-size-001.html grid-auto-min-sizing-transferred-size-001.html
+== grid-auto-min-sizing-transferred-size-001.html grid-auto-min-sizing-transferred-size-001.html
 fails == grid-auto-min-sizing-transferred-size-002.html grid-auto-min-sizing-transferred-size-002.html
 fails == grid-auto-min-sizing-transferred-size-003.html grid-auto-min-sizing-transferred-size-003.html
 fails == grid-auto-min-sizing-transferred-size-004.html grid-auto-min-sizing-transferred-size-004.html
-fails == grid-auto-min-sizing-min-content-min-size-001.html grid-auto-min-sizing-min-content-min-size-001.html
+== grid-auto-min-sizing-min-content-min-size-001.html grid-auto-min-sizing-min-content-min-size-001.html
 fails == grid-auto-min-sizing-min-content-min-size-002.html grid-auto-min-sizing-min-content-min-size-002.html
 fails == grid-auto-min-sizing-min-content-min-size-003.html grid-auto-min-sizing-min-content-min-size-003.html
 # == grid-auto-min-sizing-min-content-min-size-004.html grid-auto-min-sizing-min-content-min-size-004.html # bug 1342710
-fails == grid-min-content-min-sizing-transferred-size-001.html grid-min-content-min-sizing-transferred-size-001.html
+== grid-min-content-min-sizing-transferred-size-001.html grid-min-content-min-sizing-transferred-size-001.html
 fails == grid-min-content-min-sizing-transferred-size-002.html grid-min-content-min-sizing-transferred-size-002.html
-fails == grid-min-content-min-sizing-transferred-size-003.html grid-min-content-min-sizing-transferred-size-003.html
+== grid-min-content-min-sizing-transferred-size-003.html grid-min-content-min-sizing-transferred-size-003.html
 fails == grid-min-content-min-sizing-transferred-size-004.html grid-min-content-min-sizing-transferred-size-004.html
 fails == grid-auto-min-sizing-percent-001.html grid-auto-min-sizing-percent-001.html
 fails == grid-track-intrinsic-sizing-001.html grid-track-intrinsic-sizing-001.html
 fails == grid-track-intrinsic-sizing-002.html grid-track-intrinsic-sizing-002.html
 fails == grid-track-intrinsic-sizing-003.html grid-track-intrinsic-sizing-003.html
 fails == grid-track-intrinsic-sizing-004.html grid-track-intrinsic-sizing-004.html
 fails == grid-track-percent-sizing-001.html grid-track-percent-sizing-001.html
 fails == grid-track-fit-content-sizing-001.html grid-track-fit-content-sizing-001.html
--- a/layout/reftests/css-invalid/button/reftest-stylo.list
+++ b/layout/reftests/css-invalid/button/reftest-stylo.list
@@ -1,13 +1,13 @@
 # DO NOT EDIT! This is a auto-generated temporary list for Stylo testing
 == button-valid.html button-valid.html
-fails == button-invalid.html button-invalid.html
+== button-invalid.html button-invalid.html
 == button-disabled.html button-disabled.html
 == button-dyn-disabled.html button-dyn-disabled.html
-fails == button-dyn-not-disabled.html button-dyn-not-disabled.html
+== button-dyn-not-disabled.html button-dyn-not-disabled.html
 == button-button.html button-button.html
 == button-reset.html button-reset.html
-fails == button-type-invalid.html button-type-invalid.html
+== button-type-invalid.html button-type-invalid.html
 == button-type-barred.html button-type-barred.html
 == button-disabled-fieldset-1.html button-disabled-fieldset-1.html
 == button-disabled-fieldset-2.html button-disabled-fieldset-2.html
-fails == button-fieldset-legend.html button-fieldset-legend.html
+== button-fieldset-legend.html button-fieldset-legend.html
--- a/layout/reftests/css-invalid/fieldset/reftest-stylo.list
+++ b/layout/reftests/css-invalid/fieldset/reftest-stylo.list
@@ -1,30 +1,30 @@
 # DO NOT EDIT! This is a auto-generated temporary list for Stylo testing
-fails == fieldset-valid.html fieldset-valid.html
-fails == fieldset-invalid.html fieldset-invalid.html
-fails == fieldset-add-invalid-barred.html fieldset-add-invalid-barred.html
-fails == fieldset-add-invalid-element-dynamic.html fieldset-add-invalid-element-dynamic.html
-fails == fieldset-add-invalid-element.html fieldset-add-invalid-element.html
-fails == fieldset-add-invalid-with-valid-element.html fieldset-add-invalid-with-valid-element.html
-fails == fieldset-add-valid-element.html fieldset-add-valid-element.html
-fails == fieldset-add-valid-with-invalid-element.html fieldset-add-valid-with-invalid-element.html
-fails == fieldset-add-valid-with-no-element.html fieldset-add-valid-with-no-element.html
-fails == fieldset-dynamic-invalid-barred.html fieldset-dynamic-invalid-barred.html
-fails == fieldset-dynamic-invalid-not-barred.html fieldset-dynamic-invalid-not-barred.html
-fails == fieldset-dynamic-invalid.html fieldset-dynamic-invalid.html
-fails == fieldset-dynamic-valid.html fieldset-dynamic-valid.html
-fails == fieldset-invalid-and-barred-remove-barred.html fieldset-invalid-and-barred-remove-barred.html
-fails == fieldset-invalid-and-barred-remove-invalid.html fieldset-invalid-and-barred-remove-invalid.html
-fails == fieldset-invalid-and-barred.html fieldset-invalid-and-barred.html
-fails == fieldset-remove-invalid-element.html fieldset-remove-invalid-element.html
-fails == fieldset-static-invalid-barred.html fieldset-static-invalid-barred.html
-fails == fieldset-static-invalid.html fieldset-static-invalid.html
-fails == fieldset-static-valid.html fieldset-static-valid.html
-fails == fieldset-valid-and-barred-remove-barred.html fieldset-valid-and-barred-remove-barred.html
-fails == fieldset-valid-and-barred.html fieldset-valid-and-barred.html
-fails == fieldset-with-invalid-element-add-barred-dynamic.html fieldset-with-invalid-element-add-barred-dynamic.html
-fails == fieldset-with-valid-and-invalid.html fieldset-with-valid-and-invalid.html
-fails == fieldset-with-valid-element-add-barred-dynamic.html fieldset-with-valid-element-add-barred-dynamic.html
-fails == fieldset-nested-invalid.html fieldset-nested-invalid.html
-fails == fieldset-div-invalid.html fieldset-div-invalid.html
+== fieldset-valid.html fieldset-valid.html
+== fieldset-invalid.html fieldset-invalid.html
+== fieldset-add-invalid-barred.html fieldset-add-invalid-barred.html
+== fieldset-add-invalid-element-dynamic.html fieldset-add-invalid-element-dynamic.html
+== fieldset-add-invalid-element.html fieldset-add-invalid-element.html
+== fieldset-add-invalid-with-valid-element.html fieldset-add-invalid-with-valid-element.html
+== fieldset-add-valid-element.html fieldset-add-valid-element.html
+== fieldset-add-valid-with-invalid-element.html fieldset-add-valid-with-invalid-element.html
+== fieldset-add-valid-with-no-element.html fieldset-add-valid-with-no-element.html
+== fieldset-dynamic-invalid-barred.html fieldset-dynamic-invalid-barred.html
+== fieldset-dynamic-invalid-not-barred.html fieldset-dynamic-invalid-not-barred.html
+== fieldset-dynamic-invalid.html fieldset-dynamic-invalid.html
+== fieldset-dynamic-valid.html fieldset-dynamic-valid.html
+== fieldset-invalid-and-barred-remove-barred.html fieldset-invalid-and-barred-remove-barred.html
+== fieldset-invalid-and-barred-remove-invalid.html fieldset-invalid-and-barred-remove-invalid.html
+== fieldset-invalid-and-barred.html fieldset-invalid-and-barred.html
+== fieldset-remove-invalid-element.html fieldset-remove-invalid-element.html
+== fieldset-static-invalid-barred.html fieldset-static-invalid-barred.html
+== fieldset-static-invalid.html fieldset-static-invalid.html
+== fieldset-static-valid.html fieldset-static-valid.html
+== fieldset-valid-and-barred-remove-barred.html fieldset-valid-and-barred-remove-barred.html
+== fieldset-valid-and-barred.html fieldset-valid-and-barred.html
+== fieldset-with-invalid-element-add-barred-dynamic.html fieldset-with-invalid-element-add-barred-dynamic.html
+== fieldset-with-valid-and-invalid.html fieldset-with-valid-and-invalid.html
+== fieldset-with-valid-element-add-barred-dynamic.html fieldset-with-valid-element-add-barred-dynamic.html
+== fieldset-nested-invalid.html fieldset-nested-invalid.html
+== fieldset-div-invalid.html fieldset-div-invalid.html
 fails == fieldset-nested-valid-invalid.html fieldset-nested-valid-invalid.html
 fails == fieldset-nested-barred.html fieldset-nested-barred.html
--- a/layout/reftests/css-invalid/form/reftest-stylo.list
+++ b/layout/reftests/css-invalid/form/reftest-stylo.list
@@ -1,25 +1,25 @@
 # DO NOT EDIT! This is a auto-generated temporary list for Stylo testing
 fails == form-static-valid.html form-static-valid.html
 fails == form-dynamic-valid.html form-dynamic-valid.html
 == form-remove-invalid-element.html form-remove-invalid-element.html
-fails == form-static-invalid.html form-static-invalid.html
-fails == form-dynamic-invalid.html form-dynamic-invalid.html
-fails == form-add-control.html form-add-control.html
-fails == form-dynamic-invalid-not-barred.html form-dynamic-invalid-not-barred.html
+== form-static-invalid.html form-static-invalid.html
+== form-dynamic-invalid.html form-dynamic-invalid.html
+== form-add-control.html form-add-control.html
+== form-dynamic-invalid-not-barred.html form-dynamic-invalid-not-barred.html
 == form-remove-invalid-element.html form-remove-invalid-element.html
 fails == form-dynamic-invalid-barred.html form-dynamic-invalid-barred.html
 fails == form-static-invalid-barred.html form-static-invalid-barred.html
-fails == form-add-invalid-element.html form-add-invalid-element.html
-fails == form-add-valid-with-invalid-element.html form-add-valid-with-invalid-element.html
+== form-add-invalid-element.html form-add-invalid-element.html
+== form-add-valid-with-invalid-element.html form-add-valid-with-invalid-element.html
 fails == form-invalid-barred.html form-invalid-barred.html
 fails == form-add-valid-element.html form-add-valid-element.html
 fails == form-add-valid-with-no-element.html form-add-valid-with-no-element.html
-fails == form-add-invalid-with-valid-element.html form-add-invalid-with-valid-element.html
-fails == form-with-valid-and-invalid.html form-with-valid-and-invalid.html
-fails == form-add-invalid-element-dynamic.html form-add-invalid-element-dynamic.html
-fails == form-invalid-and-barred.html form-invalid-and-barred.html
-fails == form-invalid-and-barred-remove-barred.html form-invalid-and-barred-remove-barred.html
+== form-add-invalid-with-valid-element.html form-add-invalid-with-valid-element.html
+== form-with-valid-and-invalid.html form-with-valid-and-invalid.html
+== form-add-invalid-element-dynamic.html form-add-invalid-element-dynamic.html
+== form-invalid-and-barred.html form-invalid-and-barred.html
+== form-invalid-and-barred-remove-barred.html form-invalid-and-barred-remove-barred.html
 fails == form-valid-and-barred.html form-valid-and-barred.html
 fails == form-valid-and-barred-remove-barred.html form-valid-and-barred-remove-barred.html
-fails == form-with-invalid-element-add-barred-dynamic.html form-with-invalid-element-add-barred-dynamic.html
+== form-with-invalid-element-add-barred-dynamic.html form-with-invalid-element-add-barred-dynamic.html
 fails == form-with-valid-element-add-barred-dynamic.html form-with-valid-element-add-barred-dynamic.html
--- a/layout/reftests/css-invalid/input/reftest-stylo.list
+++ b/layout/reftests/css-invalid/input/reftest-stylo.list
@@ -17,18 +17,18 @@ fails == input-url-invalid.html input-ur
 fails == input-url-valid.html input-url-valid.html
 fails == input-pattern-valid.html input-pattern-valid.html
 fails == input-pattern-invalid.html input-pattern-invalid.html
 fails == input-type-barred.html input-type-barred.html
 fails == input-type-invalid.html input-type-invalid.html
 fails == input-disabled-fieldset-1.html input-disabled-fieldset-1.html
 fails == input-disabled-fieldset-2.html input-disabled-fieldset-2.html
 fails == input-fieldset-legend.html input-fieldset-legend.html
-fails == input-radio-required.html input-radio-required.html
-fails == input-radio-customerror.html input-radio-customerror.html
+== input-radio-required.html input-radio-required.html
+== input-radio-customerror.html input-radio-customerror.html
 == input-radio-dyn-valid-1.html input-radio-dyn-valid-1.html
 == input-radio-dyn-valid-2.html input-radio-dyn-valid-2.html
-fails == input-radio-nogroup-required-valid.html input-radio-nogroup-required-valid.html
+== input-radio-nogroup-required-valid.html input-radio-nogroup-required-valid.html
 == input-radio-nogroup-required-invalid.html input-radio-nogroup-required-invalid.html
-fails == input-radio-focus-click.html input-radio-focus-click.html
+== input-radio-focus-click.html input-radio-focus-click.html
 fails == input-submit.html input-submit.html
 fails == input-image.html input-image.html
 # input type='hidden' shouldn't show
--- a/layout/reftests/css-invalid/output/reftest-stylo.list
+++ b/layout/reftests/css-invalid/output/reftest-stylo.list
@@ -1,3 +1,3 @@
 # DO NOT EDIT! This is a auto-generated temporary list for Stylo testing
 == output-valid.html output-valid.html
-fails == output-invalid.html output-invalid.html
+== output-invalid.html output-invalid.html
--- a/layout/reftests/css-submit-invalid/button-submit/reftest-stylo.list
+++ b/layout/reftests/css-submit-invalid/button-submit/reftest-stylo.list
@@ -8,10 +8,10 @@ fails == dynamic-invalid-barred-2.html d
 fails == dynamic-invalid-not-barred.html dynamic-invalid-not-barred.html
 fails == static-invalid-barred.html static-invalid-barred.html
 fails == remove-invalid-element.html remove-invalid-element.html
 fails == add-invalid-element.html add-invalid-element.html
 fails == add-submit-control.html add-submit-control.html
 fails == remove-submit-control.html remove-submit-control.html
 fails == change-type-submit-control.html change-type-submit-control.html
 fails == change-type-not-submit-control.html change-type-not-submit-control.html
-fails == self-invalid.html self-invalid.html
+== self-invalid.html self-invalid.html
 fails == remove-form.html remove-form.html
--- a/layout/reftests/css-submit-invalid/input-submit/reftest-stylo.list
+++ b/layout/reftests/css-submit-invalid/input-submit/reftest-stylo.list
@@ -8,10 +8,10 @@ fails == dynamic-invalid-barred-2.html d
 fails == dynamic-invalid-not-barred.html dynamic-invalid-not-barred.html
 fails == static-invalid-barred.html static-invalid-barred.html
 fails == remove-invalid-element.html remove-invalid-element.html
 fails == add-invalid-element.html add-invalid-element.html
 fails == add-submit-control.html add-submit-control.html
 fails == remove-submit-control.html remove-submit-control.html
 fails == change-type-submit-control.html change-type-submit-control.html
 fails == change-type-not-submit-control.html change-type-not-submit-control.html
-fails == self-invalid.html self-invalid.html
+== self-invalid.html self-invalid.html
 fails == remove-form.html remove-form.html
--- a/layout/reftests/css-ui-valid/button/reftest-stylo.list
+++ b/layout/reftests/css-ui-valid/button/reftest-stylo.list
@@ -1,14 +1,14 @@
 # DO NOT EDIT! This is a auto-generated temporary list for Stylo testing
-fails == button-valid.html button-valid.html
+== button-valid.html button-valid.html
 == button-invalid.html button-invalid.html
 == button-disabled.html button-disabled.html
 == button-dyn-disabled.html button-dyn-disabled.html
-fails == button-dyn-not-disabled.html button-dyn-not-disabled.html
+== button-dyn-not-disabled.html button-dyn-not-disabled.html
 == button-button.html button-button.html
 == button-reset.html button-reset.html
 == button-type-invalid.html button-type-invalid.html
 == button-type-barred.html button-type-barred.html
 == button-disabled-fieldset-1.html button-disabled-fieldset-1.html
 == button-disabled-fieldset-2.html button-disabled-fieldset-2.html
-fails == button-fieldset-legend.html button-fieldset-legend.html
+== button-fieldset-legend.html button-fieldset-legend.html
 == button-novalidate.html button-novalidate.html
--- a/layout/reftests/css-ui-valid/output/reftest-stylo.list
+++ b/layout/reftests/css-ui-valid/output/reftest-stylo.list
@@ -1,4 +1,4 @@
 # DO NOT EDIT! This is a auto-generated temporary list for Stylo testing
-fails == output-valid.html output-valid.html # Bug 1341739
+== output-valid.html output-valid.html
 == output-invalid.html output-invalid.html
 == output-novalidate.html output-novalidate.html
--- a/layout/reftests/css-valid/button/reftest-stylo.list
+++ b/layout/reftests/css-valid/button/reftest-stylo.list
@@ -1,13 +1,13 @@
 # DO NOT EDIT! This is a auto-generated temporary list for Stylo testing
-fails == button-valid.html button-valid.html
+== button-valid.html button-valid.html
 == button-invalid.html button-invalid.html
 == button-disabled.html button-disabled.html
 == button-dyn-disabled.html button-dyn-disabled.html
-fails == button-dyn-not-disabled.html button-dyn-not-disabled.html
+== button-dyn-not-disabled.html button-dyn-not-disabled.html
 == button-button.html button-button.html
 == button-reset.html button-reset.html
 == button-type-invalid.html button-type-invalid.html
 == button-type-barred.html button-type-barred.html
 == button-disabled-fieldset-1.html button-disabled-fieldset-1.html
 == button-disabled-fieldset-2.html button-disabled-fieldset-2.html
-fails == button-fieldset-legend.html button-fieldset-legend.html
+== button-fieldset-legend.html button-fieldset-legend.html
--- a/layout/reftests/css-valid/fieldset/reftest-stylo.list
+++ b/layout/reftests/css-valid/fieldset/reftest-stylo.list
@@ -1,3 +1,3 @@
 # DO NOT EDIT! This is a auto-generated temporary list for Stylo testing
-fails == fieldset-valid.html fieldset-valid.html
-fails == fieldset-invalid.html fieldset-invalid.html
+== fieldset-valid.html fieldset-valid.html
+== fieldset-invalid.html fieldset-invalid.html
--- a/layout/reftests/css-valid/output/reftest-stylo.list
+++ b/layout/reftests/css-valid/output/reftest-stylo.list
@@ -1,3 +1,3 @@
 # DO NOT EDIT! This is a auto-generated temporary list for Stylo testing
-fails == output-valid.html output-valid.html # Bug 341739
+== output-valid.html output-valid.html
 == output-invalid.html output-invalid.html
--- a/layout/reftests/details-summary/reftest-stylo.list
+++ b/layout/reftests/details-summary/reftest-stylo.list
@@ -6,17 +6,17 @@ fails == summary-not-first-child.html su
 fails == open-summary-not-first-child.html open-summary-not-first-child.html
 == open-summary-block-style.html open-summary-block-style.html
 == open-summary-inline-style.html open-summary-inline-style.html
 == open-summary-table-cell-style.html open-summary-table-cell-style.html
 fails == no-summary.html no-summary.html
 fails == open-no-summary.html open-no-summary.html
 == summary-not-in-details.html summary-not-in-details.html
 fails == summary-not-direct-child.html summary-not-direct-child.html
-fails == float-in-summary.html float-in-summary.html
+== float-in-summary.html float-in-summary.html
 
 # Add elements dynamically
 fails == dynamic-add-single-summary.html dynamic-add-single-summary.html
 fails == dynamic-add-summary-not-first-child.html dynamic-add-summary-not-first-child.html
 fails == dynamic-add-summary-and-paragraph.html dynamic-add-summary-and-paragraph.html
 fails == dynamic-add-paragraph-before-summary.html dynamic-add-paragraph-before-summary.html
 fails == dynamic-add-paragraph-before-summary-close.html dynamic-add-paragraph-before-summary-close.html
 fails == dynamic-add-paragraph-after-summary.html dynamic-add-paragraph-after-summary.html
@@ -59,17 +59,17 @@ fails == overflow-scroll-details.html ov
 == float-open-details-contains-float-right.html float-open-details-contains-float-right.html
 
 # Various properties on details or summary
 == details-display-inline.html details-display-inline.html
 == details-percentage-height-children.html details-percentage-height-children.html
 == details-absolute-children.html details-absolute-children.html
 == details-three-columns.html details-three-columns.html
 fails == details-writing-mode.html details-writing-mode.html
-fails == details-in-ol.html details-in-ol.html
+== details-in-ol.html details-in-ol.html
 == summary-three-columns.html summary-three-columns.html
 fails == details-first-line.html details-first-line.html
 fails == open-details-first-line-1.html open-details-first-line-1.html
 fails == open-details-first-line-2.html open-details-first-line-2.html
 
 # Dispatch mouse click to summary
 fails == mouse-click-single-summary.html mouse-click-single-summary.html
 fails == mouse-click-twice-single-summary.html mouse-click-twice-single-summary.html
new file mode 100644
--- /dev/null
+++ b/layout/reftests/image-element/mask-image-element-ref.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <style type="text/css">
+      div {
+        background-color: white;
+        position: absolute;
+        margin: 0px;
+        padding: 0px;
+        width: 100px;
+        height: 100px;
+        top: 10px;
+      }
+
+      div.auto {
+        left: 10px;
+        background-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%"><rect x="0" y="0" width="100%" height="100%" fill="blue" fill-opacity="1"/></svg>');
+      }
+
+      div.alpha {
+        left: 120px;
+        background-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%"><rect x="0" y="0" width="100%" height="100%" fill="blue" fill-opacity="1"/></svg>');
+      }
+
+      div.luminance1 {
+        left: 230px;
+        background-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%"><rect x="0" y="0" width="100%" height="100%" fill="rgb(238,238,255)" fill-opacity="1"/></svg>');
+      }
+
+      div.luminance2 {
+        left: 340px;
+        background-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%"><rect x="0" y="0" width="100%" height="100%" fill="rgb(201,201,255)" fill-opacity="1"/></svg>');
+      }
+
+      div.luminance3 {
+        left: 450px;
+        background-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%"><rect x="0" y="0" width="100%" height="100%" fill="rgb(73,73,255)" fill-opacity="1"/></svg>');
+      }
+    </style>
+  </head>
+  <body>
+    <div class="auto"></div>
+    <div class="alpha"></div>
+    <div class="luminance1"></div>
+    <div class="luminance2"></div>
+    <div class="luminance3"></div>
+  </body>
+</html>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/image-element/mask-image-element.html
@@ -0,0 +1,63 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <style type="text/css">
+      div {
+        background-color: blue;
+        position: absolute;
+        margin: 0px;
+        padding: 0px;
+        width: 100px;
+        height: 100px;
+        top: 10px;
+      }
+
+      div.auto {
+        left: 10px;
+        mask-mode: match-source;
+        mask-image: -moz-element(#blue-bg);
+      }
+
+      div.alpha {
+        left: 120px;
+        mask-mode: alpha;
+        mask-image: -moz-element(#blue-bg);
+      }
+
+      div.luminance1 {
+        left: 230px;
+        mask-mode: luminance;
+        mask-image: -moz-element(#blue-bg);
+      }
+
+      div.luminance2 {
+        left: 340px;
+        mask-mode: luminance;
+        mask-image: -moz-element(#red-bg);
+      }
+
+      div.luminance3 {
+        left: 450px;
+        mask-mode: luminance;
+        mask-image: -moz-element(#lime-bg);
+      }
+    </style>
+  </head>
+  <body>
+    <div class="auto"></div>
+    <div class="alpha"></div>
+    <div class="luminance1"></div>
+    <div class="luminance2"></div>
+    <div class="luminance3"></div>
+
+    <div style="overflow:hidden; height:0;">
+      <div id="blue-bg" style="width:100px; height:100px; background-color: blue;">  </div>
+    </div>
+    <div style="overflow:hidden; height:0;">
+      <div id="red-bg" style="width:100px; height:100px; background-color: red;"></div>
+    </div>
+    <div style="overflow:hidden; height:0;">
+      <div id="lime-bg" style="width:100px; height:100px; background-color: lime;"></div>
+    </div>
+  </body>
+</html>
\ No newline at end of file
--- a/layout/reftests/image-element/reftest.list
+++ b/layout/reftests/image-element/reftest.list
@@ -40,8 +40,10 @@ fuzzy(1,9674) random-if(!cocoaWidget) ==
 == gradient-html-06c.html gradient-html-06d.html
 == gradient-html-06d.html gradient-html-06e.html
 random-if(!cocoaWidget) fuzzy-if(cocoaWidget,2,42305) == gradient-html-07a.html gradient-html-07b.html
 fuzzy(1,16900) == gradient-html-07c.html gradient-html-07d.html
 HTTP == invalidate-1.html invalidate-1-ref.html
 == pattern-html-01.html pattern-html-01-ref.svg
 == pattern-html-02.html pattern-html-02-ref.svg
 == referenced-from-binding-01.html referenced-from-binding-01-ref.html
+
+fuzzy-if(skiaContent,1,30000) == mask-image-element.html mask-image-element-ref.html
--- a/layout/reftests/list-item/reftest-stylo.list
+++ b/layout/reftests/list-item/reftest-stylo.list
@@ -1,11 +1,11 @@
 # DO NOT EDIT! This is a auto-generated temporary list for Stylo testing
 == numbering-1.html numbering-1.html
-fails == numbering-2.html numbering-2.html
+== numbering-2.html numbering-2.html
 == numbering-3.html numbering-3.html
 == numbering-4.html numbering-4.html
 == ol-reversed-1a.html ol-reversed-1a.html
 fails asserts(1) == ol-reversed-1b.html ol-reversed-1b.html
 == ol-reversed-1c.html ol-reversed-1c.html
 == ol-reversed-2.html ol-reversed-2.html
 == ol-reversed-3.html ol-reversed-3.html
 == bullet-space-1.html bullet-space-1.html
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..6a891dcb41a70e6aca5c3bcd4bdb3b56e0b05365
GIT binary patch
literal 160938
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
Ir0#$J*+6e{!2kdN
new file mode 100644
--- /dev/null
+++ b/layout/reftests/svg/filters/filter-transform-01.svg
@@ -0,0 +1,17 @@
+<svg xmlns="http://www.w3.org/2000/svg" style="background-color:lime" viewBox="-50 -50 100 100">
+ <defs>
+   <filter id="blur">
+     <feGaussianBlur stdDeviation="1"/>
+   </filter>
+ </defs>
+
+ <circle r="15" fill="red" filter="url(#blur)" transform="rotate(45)"/>
+ <circle r="15" fill="red" filter="url(#blur)" transform="rotate(90)"/>
+ <circle r="15" fill="red" filter="url(#blur)" transform="skewX(0) skewY(0)"/>
+ <circle cx="-10" cy="-10" r="15" fill="red" filter="url(#blur)" transform="translate(10, 10)"/>
+ <circle cx="-10000" cy="-10000" r="15" fill="red" filter="url(#blur)" transform="translate(10000, 10000)"/>
+ <circle r="10" fill="red" filter="url(#blur)" transform="scale(1.5, 1.5)"/>
+
+ <!-- The circles above should be completely covered by the next one. -->
+ <circle r="20" fill="lime"/>
+</svg>
--- a/layout/reftests/svg/filters/reftest.list
+++ b/layout/reftests/svg/filters/reftest.list
@@ -80,16 +80,17 @@ fails == filter-marked-line-01.svg pass.
 == filter-marked-line-08.svg pass.svg
 == filter-marked-line-09.svg pass.svg
 == filter-nested-filtering-01.svg pass.svg
 == filter-nested-filtering-02.svg pass.svg
 == filter-patterned-rect-01.svg pass.svg
 == filter-patterned-rect-02.svg pass.svg
 == filter-region-01a.html pass.svg
 == filter-region-01b.html pass.svg
+== filter-transform-01.svg pass.svg
 
 == feColorMatrix-saturate-01.svg pass.svg
 
 == feComponentTransfer-03.svg pass.svg
 == feComponentTransfer-04.svg pass.svg
 == feComposite-arguments-01.svg pass.svg
 fuzzy(1,26732) == feComposite-paint-01.svg feComposite-paint-01-ref.svg
 fuzzy(1,10000) == feConvolveMatrix-bias-01.svg feConvolveMatrix-bias-01-ref.svg
new file mode 100644
--- /dev/null
+++ b/layout/reftests/svg/pattern-big-image-ref.html
@@ -0,0 +1,5 @@
+<div style="left: 0px; top: 0px; width: 10px; height: 10px;">
+  <svg x="0" y="0" height="100%" width="100%" preserveAspectRatio="xMidYMid slice" viewBox="0 0 4000 3000">
+    <image xlink:href="big-image.jpeg" width="4000" height="3000"/>
+  </svg>
+</div>
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/layout/reftests/svg/pattern-big-image.html
@@ -0,0 +1,10 @@
+<div style="left: 0px; top: 0px; width: 10px; height: 10px;">
+  <svg x="0" y="0" height="100%" width="100%">
+    <defs>
+      <pattern id="pattern-big-image" patternUnits="objectBoundingBox" preserveAspectRatio="xMidYMid slice" width="1" height="1" x="0" y="0" viewBox="0 0 4000 3000">
+        <image xlink:href="big-image.jpeg" width="4000" height="3000"/>
+      </pattern>
+    </defs>
+    <rect fill="url(#pattern-big-image)" x="0" y="0" width="100%" height="100%"/>
+  </svg>
+</div>
\ No newline at end of file
--- a/layout/reftests/svg/reftest.list
+++ b/layout/reftests/svg/reftest.list
@@ -340,16 +340,17 @@ pref(svg.paint-order.enabled,true) == pa
 fuzzy-if(skiaContent,1,400) == path-06.svg path-06-ref.svg
 == path-07.svg path-07-ref.svg
 == path-08.svg pass.svg
 
 == pathLength-01.svg pass.svg
 == pathLength-02.svg pass.svg
 
 == pattern-basic-01.svg pass.svg
+fuzzy(1,5) skip-if(Android) HTTP == pattern-big-image.html pattern-big-image-ref.html
 == pattern-invalid-01.svg pattern-invalid-01-ref.svg
 fuzzy-if(skiaContent,1,5) == pattern-live-01a.svg pattern-live-01-ref.svg
 fuzzy-if(skiaContent,1,5) == pattern-live-01b.svg pattern-live-01-ref.svg
 fuzzy-if(skiaContent,1,5) == pattern-live-01c.svg pattern-live-01-ref.svg
 fuzzy-if(skiaContent,1,5) == pattern-scale-01a.svg pattern-scale-01-ref.svg
 == pattern-scale-01b.svg pattern-scale-01-ref.svg
 fuzzy-if(skiaContent,3,5) == pattern-scale-01c.svg pattern-scale-01-ref.svg
 == pattern-transform-presence-01.svg pattern-transform-presence-01-ref.svg
new file mode 100644
--- /dev/null
+++ b/layout/reftests/w3c-css/submitted/masking/mask-mode-c.html
@@ -0,0 +1,60 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta charset="utf-8">
+    <title>CSS Masking: mask-mode with raster image</title>
+    <link rel="author" title="CJ Ku" href="mailto:cku@mozilla.com">
+    <link rel="author" title="Mozilla" href="https://www.mozilla.org">
+    <link rel="help" href="https://www.w3.org/TR/css-masking-1/#propdef-mask-mode">
+    <link rel="match" href="mask-mode-ref.html">
+    <meta name="assert" content="Test checks that mask a PNG image referenced by mask-image is correct with different mask mode.">
+    <style type="text/css">
+      div {
+        background-color: blue;
+        position: absolute;
+        margin: 0px;
+        padding: 0px;
+        width: 100px;
+        height: 100px;
+        top: 10px;
+      }
+
+      div.auto {
+        left: 10px;
+        mask-mode: match-source;
+        mask-image: linear-gradient(blue 0%, blue 100%);
+      }
+
+      div.alpha {
+        left: 120px;
+        mask-mode: alpha;
+        mask-image: linear-gradient(blue 0%, blue 100%);
+      }
+
+      div.luminance1 {
+        left: 230px;
+        mask-mode: luminance;
+        mask-image: linear-gradient(blue 0%, blue 100%);
+      }
+
+      div.luminance2 {
+        left: 340px;
+        mask-mode: luminance;
+        mask-image: linear-gradient(red 0%, red 100%);
+      }
+
+      div.luminance3 {
+        left: 450px;
+        mask-mode: luminance;
+        mask-image: linear-gradient(lime 0%, lime 100%);
+      }
+    </style>
+  </head>
+  <body>
+    <div class="auto"></div>
+    <div class="alpha"></div>
+    <div class="luminance1"></div>
+    <div class="luminance2"></div>
+    <div class="luminance3"></div>
+  </body>
+</html>
\ No newline at end of file
--- a/layout/reftests/w3c-css/submitted/masking/reftest.list
+++ b/layout/reftests/w3c-css/submitted/masking/reftest.list
@@ -6,16 +6,17 @@ fuzzy-if(skiaContent,64,200) == mask-com
 == mask-composite-1c.html mask-composite-1-ref.html
 fuzzy-if(skiaContent||winWidget,1,5000) == mask-composite-2a.html mask-composite-2-ref.html
 fuzzy-if(skiaContent||winWidget,64,5200) == mask-composite-2b.html mask-composite-2-ref.html
 == mask-composite-2c.html mask-composite-2-ref.html
 
 # mask-mode test cases
 fuzzy-if(skiaContent,1,30000) == mask-mode-a.html mask-mode-ref.html
 fuzzy-if(skiaContent,1,30000) == mask-mode-b.html mask-mode-ref.html
+fuzzy-if(skiaContent,1,30000) == mask-mode-c.html mask-mode-ref.html
 fuzzy-if(skiaContent,1,30000) == mask-mode-to-mask-type.html mask-mode-to-mask-type-ref.html
 
 # mask-image test cases
 == mask-image-1a.html mask-image-1-ref.html
 == mask-image-1b.html mask-image-1-ref.html
 == mask-image-1c.html mask-image-1-ref.html
 == mask-image-1d.html mask-image-1-ref.html
 fuzzy-if(skiaContent||winWidget,1,20000) == mask-image-2.html mask-image-2-ref.html
--- a/layout/reftests/writing-mode/reftest-stylo.list
+++ b/layout/reftests/writing-mode/reftest-stylo.list
@@ -38,26 +38,26 @@ fails == 1117210-1-vertical-baseline-sna
 fails == 1117227-1-text-overflow.html 1117227-1-text-overflow.html
 == 1122366-1-margin-collapse.html 1122366-1-margin-collapse.html
 fails == 1124636-1-fieldset-max-height.html 1124636-1-fieldset-max-height.html
 fails == 1124636-2-fieldset-min-height.html 1124636-2-fieldset-min-height.html
 
 == ua-style-sheet-margin-1.html ua-style-sheet-margin-1.html
 == ua-style-sheet-margin-2.html ua-style-sheet-margin-2.html
 == ua-style-sheet-margin-3.html ua-style-sheet-margin-3.html
-fails == ua-style-sheet-margin-4.html ua-style-sheet-margin-4.html
-fails == ua-style-sheet-margin-5.html ua-style-sheet-margin-5.html
+== ua-style-sheet-margin-4.html ua-style-sheet-margin-4.html
+== ua-style-sheet-margin-5.html ua-style-sheet-margin-5.html
 fails == ua-style-sheet-margin-6.html ua-style-sheet-margin-6.html
 fails == ua-style-sheet-margin-7.html ua-style-sheet-margin-7.html
 == ua-style-sheet-margin-8.html ua-style-sheet-margin-8.html
 fails == ua-style-sheet-margin-9.html ua-style-sheet-margin-9.html
 fails == ua-style-sheet-margin-10.html ua-style-sheet-margin-10.html
 == ua-style-sheet-margin-11.html ua-style-sheet-margin-11.html
 == ua-style-sheet-margin-12.html ua-style-sheet-margin-12.html
-fails == ua-style-sheet-margin-13.html ua-style-sheet-margin-13.html
+== ua-style-sheet-margin-13.html ua-style-sheet-margin-13.html
 == ua-style-sheet-margin-14.html ua-style-sheet-margin-14.html
 == ua-style-sheet-border-1.html ua-style-sheet-border-1.html
 == ua-style-sheet-border-2.html ua-style-sheet-border-2.html
 == ua-style-sheet-border-3.html ua-style-sheet-border-3.html
 == ua-style-sheet-border-4.html ua-style-sheet-border-4.html
 == ua-style-sheet-border-5.html ua-style-sheet-border-5.html
 fails == ua-style-sheet-size-1.html ua-style-sheet-size-1.html
 fails == ua-style-sheet-size-2.html ua-style-sheet-size-2.html
--- a/layout/style/nsStyleStruct.cpp
+++ b/layout/style/nsStyleStruct.cpp
@@ -1186,17 +1186,17 @@ nsStyleSVGReset::FinishStyle(nsPresConte
   mMask.ResolveImages(aPresContext);
 }
 
 nsChangeHint
 nsStyleSVGReset::CalcDifference(const nsStyleSVGReset& aNewData) const
 {
   nsChangeHint hint = nsChangeHint(0);
 
-  if (mClipPath != aNewData.mClipPath) {
+  if (!mClipPath.DefinitelyEquals(aNewData.mClipPath)) {
     hint |= nsChangeHint_UpdateEffects |
             nsChangeHint_RepaintFrame;
     // clip-path changes require that we update the PreEffectsBBoxProperty,
     // which is done during overflow computation.
     hint |= nsChangeHint_UpdateOverflow;
   }
 
   if (mDominantBaseline != aNewData.mDominantBaseline) {
@@ -3597,17 +3597,17 @@ nsStyleDisplay::CalcDifference(const nsS
        mAnimationDurationCount != aNewData.mAnimationDurationCount ||
        mAnimationDelayCount != aNewData.mAnimationDelayCount ||
        mAnimationNameCount != aNewData.mAnimationNameCount ||
        mAnimationDirectionCount != aNewData.mAnimationDirectionCount ||
        mAnimationFillModeCount != aNewData.mAnimationFillModeCount ||
        mAnimationPlayStateCount != aNewData.mAnimationPlayStateCount ||
        mAnimationIterationCountCount != aNewData.mAnimationIterationCountCount ||
        mScrollSnapCoordinate != aNewData.mScrollSnapCoordinate ||
-       mShapeOutside != aNewData.mShapeOutside)) {
+       !mShapeOutside.DefinitelyEquals(aNewData.mShapeOutside))) {
     hint |= nsChangeHint_NeutralChange;
   }
 
   return hint;
 }
 
 // --------------------
 // nsStyleVisibility
--- a/layout/style/nsStyleStruct.h
+++ b/layout/style/nsStyleStruct.h
@@ -2627,22 +2627,34 @@ struct StyleShapeSource
       mReferenceBox = StyleGeometryBox::NoBox;
       mType = StyleShapeSourceType::None;
     }
     return *this;
   }
 
   bool operator==(const StyleShapeSource& aOther) const
   {
+    return EqualsInternal<true>(aOther);
+  }
+
+  bool DefinitelyEquals(const StyleShapeSource& aOther) const
+  {
+    return EqualsInternal<false>(aOther);
+  }
+
+  template<bool aPrecise>
+  bool EqualsInternal(const StyleShapeSource& aOther) const
+  {
     if (mType != aOther.mType) {
       return false;
     }
 
     if (mType == StyleShapeSourceType::URL) {
-      return mURL->Equals(*aOther.mURL);
+      return aPrecise ? mURL->Equals(*aOther.mURL)
+                      : mURL->DefinitelyEqualURIs(*aOther.mURL);
     } else if (mType == StyleShapeSourceType::Shape) {
       return *mBasicShape == *aOther.mBasicShape &&
              mReferenceBox == aOther.mReferenceBox;
     } else if (mType == StyleShapeSourceType::Box) {
       return mReferenceBox == aOther.mReferenceBox;
     }
 
     return true;
--- a/layout/style/test/stylo-failures.md
+++ b/layout/style/test/stylo-failures.md
@@ -19,16 +19,19 @@ In which
   For example, if there is a failure with message "foo bar", and there is a
   pattern `foo` followed by a pattern `bar`, this failure would be counted in
   the pattern `foo`.
 * "asserts" means it is for assertion. Number of assertions of a same test is
   accumulated, unlike `pattern`. And number of assertions cannot be "*".
 
 Any line which doesn't follow the format above would be ignored like comment.
 
+To use this file, you need to add `--failure-pattern-file=stylo-failures.md`
+to mochitest command.
+
 ## Failures
 
 * Media query support:
   * test_bug1089417.html [1]
   * test_bug418986-2.html: matchMedia support [3]
   * test_bug453896_deck.html: &lt;style media&gt; support [8]
   * test_media_queries.html [657]
   * test_media_queries_dynamic.html [10]
@@ -53,36 +56,35 @@ Any line which doesn't follow the format
     * test_animations_playbackrate.html [1]
   * SMIL Animation
     * test_restyles_in_smil_animation.html [2]
   * CSS Timing Functions: Frames timing functions
     * test_value_storage.html `frames` [30]
   * Property parsing and computation:
     * test_property_syntax_errors.html `animation` [404]
     * test_value_storage.html `animation` [280]
-* test_any_dynamic.html: -moz-any pseudo class [2]
+* test_any_dynamic.html: slow selector handling [3]
+* test_bug635286.html: :-moz-any pseudo-class bugs [3]
 * CSSOM support:
   * @import
     * test_bug221428.html [1]
-  * @media
-    * test_css_eof_handling.html [1]
-    * test_group_insertRule.html [16]
-    * test_rules_out_of_sheets.html [1]
+    * test_css_eof_handling.html: also relies on \@-moz-document [1]
   * @keyframes
     * test_keyframes_rules.html [1]
+    * test_rules_out_of_sheets.html [1]
   * @support
     * test_supports_rules.html [1]
 * test_box_size_keywords.html: moz-prefixed intrinsic size keyword value [64]
 * test_bug229915.html: sibling selector with dynamic change bug 1330885 [5]
 * test_bug357614.html: case-insensitivity for old attrs in attr selector servo/servo#15006 [2]
 * mapped attribute not supported
   * test_bug363146.html [2]
   * test_bug389464.html: also font-size computation [1]
   * test_html_attribute_computed_values.html: also list-style-type [8]
-* test_bug387615.html: getComputedStyle value not updated bug 1331294 ##important## (when that gets fixed, servo/servo#15006) [1]
+* test_bug387615.html: servo/servo#15006 [1]
 * test_bug397427.html: @import issue bug 1331291 and CSSOM support of @import [3]
 * console support:
   * test_bug413958.html `monitorConsole` [3]
   * test_parser_diagnostics_unprintables.html [550]
 * test_bug511909.html: @-moz-document and @media support [4]
 * Style change from DOM API bug 1331301
   * test_bug534804.html [90]
   * test_bug73586.html [20]
@@ -96,44 +98,46 @@ Any line which doesn't follow the format
   * test_transitions_dynamic_changes.html [10]
   * test_transitions_step_functions.html [24]
   * test_value_storage.html `transition` [776]
   * Events:
     * test_animations_event_handler_attribute.html [10]
     * test_animations_event_order.html [11]
 * test_bug798843_pref.html: conditional opentype svg support [7]
 * test_computed_style.html `gradient`: -moz-prefixed radient value [9]
-* url value in style attribute bug 1310886
-  * test_computed_style.html `url` [11]
+* ... `mask`: mask-image isn't set properly bug 1347398 [2]
+* ... `rgba`: svg paint should distinguish whether there is fallback bug 1347409 [4]
+* ... `#foo`: local ref url should be preserved bug 1347412 [5]
+* character not properly escaped servo/servo#15947
   * test_parse_url.html [4]
-  * test_value_storage.html `url` [53]
-  * test_shorthand_property_getters.html `url` [3]
+  * test_bug829816.html [8]
+* test_value_storage.html `for 'marker`: equality of url is not reliable servo/servo#15950 [1]
 * auto value for min-{width,height} servo/servo#15045
 * test_compute_data_with_start_struct.html `timing-function`: incorrectly computing keywords to bezier function servo/servo#15086 [2]
 * test_condition_text.html: @-moz-document, CSSOM support of @media, @support [7]
 * @counter-style support:
   * test_counter_descriptor_storage.html [1]
   * test_counter_style.html [1]
   * test_rule_insertion.html `@counter-style` [4]
+  * ... `cjk-decimal` [1]
   * test_value_storage.html `symbols(` [30]
   * ... `list-style-type` [60]
   * ... `'list-style'` [30]
+  * ... `'content`: various value as list-style-type in counter functions [15]
 * test_default_computed_style.html: support of getDefaultComputedStyle [1]
 * @font-face support bug 1290237
   * test_descriptor_storage.html [1]
   * test_descriptor_syntax_errors.html [1]
   * test_font_face_parser.html `@font-face` [447]
   * test_redundant_font_download.html [3]
 * @namespace support:
   * test_namespace_rule.html [17]
 * test_dont_use_document_colors.html: support of disabling document color [21]
 * test_exposed_prop_accessors.html: mainly various unsupported properties [*]
 * test_extra_inherit_initial.html: CSS-wide keywords are accepted as part of value servo/servo#15054 [980]
-* test_flexbox_flex_shorthand.html `flex-basis`: **need investigation** [12]
-* test_flexbox_layout.html: **need investigation** [5]
 * test_font_feature_values_parsing.html: @font-feature-values support [107]
 * Grid support:
   * test_grid_computed_values.html [4]
   * test_grid_container_shorthands.html [65]
   * test_grid_item_shorthands.html [23]
   * test_grid_shorthand_serialization.html [28]
   * test_compute_data_with_start_struct.html `grid-` [*]
   * test_inherit_computation.html `grid` [*]
@@ -147,105 +151,91 @@ Any line which doesn't follow the format
 * url value from decl setter bug 1330503
   * test_compute_data_with_start_struct.html `border-image-source` [2]
   * ... `mask-image` [2]
   * test_inherit_computation.html `border-image` [2]
   * ... `mask-image` [4]
   * test_initial_computation.html `border-image` [4]
   * ... `mask-image` [8]
 * Unimplemented prefixed properties:
-  * -moz-border-*-colors
+  * -moz-border-*-colors bug 1348173
     * test_compute_data_with_start_struct.html `-colors` [8]
     * test_inherit_computation.html `-colors` [8]
     * test_inherit_storage.html `-colors` [12]
     * test_initial_computation.html `-colors` [16]
     * test_initial_storage.html `-colors` [24]
     * test_value_storage.html `-colors` [96]
     * test_shorthand_property_getters.html `-colors` [1]
-  * -moz-box-{direction,ordinal-group,orient,pack}
+  * -moz-box-ordinal-group servo/servo#16000
     * test_compute_data_with_start_struct.html `-moz-box-` [2]
     * test_inherit_computation.html `-box-` [4]
     * test_inherit_storage.html `-box-` [5]
     * test_initial_computation.html `-box-` [8]
     * test_initial_storage.html `-box-` [10]
     * test_value_storage.html `-box-` [118]
-  * -moz-force-broken-image-icon
+  * -moz-force-broken-image-icon servo/servo#16001
     * test_compute_data_with_start_struct.html `-moz-force-broken-image-icon` [2]
     * test_inherit_computation.html `-moz-force-broken-image-icon` [2]
     * test_inherit_storage.html `-moz-force-broken-image-icon` [2]
     * test_initial_computation.html `-moz-force-broken-image-icon` [4]
     * test_initial_storage.html `-moz-force-broken-image-icon` [4]
     * test_value_storage.html `-moz-force-broken-image-icon` [4]
-  * -{moz,webkit}-text-size-adjust
+  * -{moz,webkit}-text-size-adjust servo/servo#16002
     * test_compute_data_with_start_struct.html `-text-size-adjust` [2]
     * test_inherit_computation.html `-text-size-adjust` [8]
     * test_inherit_storage.html `-text-size-adjust` [10]
     * test_initial_computation.html `-text-size-adjust` [4]
     * test_initial_storage.html `-text-size-adjust` [5]
     * test_value_storage.html `-text-size-adjust` [12]
-  * -moz-transform: need different parsing rules
+  * -moz-transform: need different parsing rules servo/servo#16003
     * test_inherit_computation.html `-moz-transform`: need different parsing rules [2]
     * test_inherit_storage.html `transform`: for -moz-transform [3]
     * test_initial_computation.html `-moz-transform`: need different parsing rules [4]
     * test_initial_storage.html `transform`: for -moz-transform [6]
     * test_value_storage.html `-moz-transform`: need different parsing rules [284]
   * test_variables.html `var(--var6)`: -x-system-font [1]
 * Unimplemented CSS properties:
-  * will-change longhand property
+  * will-change longhand property servo/servo#15706
     * test_change_hint_optimizations.html [1]
     * test_compute_data_with_start_struct.html `will-change` [2]
     * test_inherit_computation.html `will-change` [2]
     * test_inherit_storage.html `will-change` [2]
     * test_initial_computation.html `will-change` [4]
     * test_initial_storage.html `will-change` [4]
-    * test_value_storage.html `will-change` [18]
-  * contain longhand property
+    * test_value_storage.html `will-change` [16]
+  * contain longhand property servo/servo#15955
     * test_contain_formatting_context.html [1]
     * test_compute_data_with_start_struct.html `contain` [2]
     * test_inherit_computation.html `contain` [2]
     * test_inherit_storage.html `contain` [2]
     * test_initial_computation.html `contain` [4]
     * test_initial_storage.html `contain` [4]
     * test_value_storage.html `'contain'` [30]
-  * flexbox / grid position properties **need investigation**
-    * test_inherit_storage.html `align-` [3]
-    * ... `justify-` [3]
-    * test_initial_storage.html `align-` [6]
-    * ... `justify-` [6]
-    * test_value_storage.html `align-` [90]
-    * ... `justify-` [79]
-  * place-{content,items,self} shorthands
+  * place-{content,items,self} shorthands servo/servo#15954
     * test_align_shorthand_serialization.html [8]
     * test_inherit_computation.html `place-` [6]
     * test_inherit_storage.html `place-` [6]
     * test_initial_computation.html `place-` [12]
     * test_initial_storage.html `place-` [12]
-    * test_value_storage.html `place-` [66]
-  * caret-color servo/servo#15309
-    * test_compute_data_with_start_struct.html `caret-color` [2]
-    * test_inherit_computation.html `caret-color` [4]
-    * test_inherit_storage.html `caret-color` [4]
-    * test_initial_computation.html `caret-color` [2]
-    * test_initial_storage.html `caret-color` [2]
-    * test_value_storage.html `caret-color` [16]
-  * font-variant-{alternates,east-asian,ligatures,numeric} properties
+    * test_value_storage.html `place-` [132]
+  * font-variant-{alternates,east-asian,ligatures,numeric} properties servo/servo#15957
     * test_compute_data_with_start_struct.html `font-variant` [8]
     * test_inherit_computation.html `font-variant` [20]
     * test_inherit_storage.html `font-variant` [36]
     * test_initial_computation.html `font-variant` [10]
     * test_initial_storage.html `font-variant` [18]
     * test_value_storage.html `font-variant` [332]
-  * initial-letter property
+  * initial-letter property servo/servo#15959
     * test_compute_data_with_start_struct.html `initial-letter` [2]
     * test_inherit_computation.html `initial-letter` [2]
     * test_inherit_storage.html `initial-letter` [2]
     * test_initial_computation.html `initial-letter` [4]
     * test_initial_storage.html `initial-letter` [4]
     * test_value_storage.html `initial-letter` [10]
-  * shape-outside property
+  * shape-outside property servo/servo#15958
     * test_compute_data_with_start_struct.html `shape-outside` [2]
     * test_inherit_computation.html `shape-outside` [2]
     * test_inherit_storage.html `shape-outside` [2]
     * test_initial_computation.html `shape-outside` [4]
     * test_initial_storage.html `shape-outside` [4]
     * test_value_storage.html `shape-outside` [121]
   * touch-action property
     * test_compute_data_with_start_struct.html `touch-action` [2]
@@ -254,65 +244,67 @@ Any line which doesn't follow the format
     * test_initial_computation.html `touch-action` [4]
     * test_initial_storage.html `touch-action` [4]
     * test_value_storage.html `touch-action` [14]
 * Unimplemented SVG properties:
   * stroke properties
     * test_value_storage.html `on 'stroke` [6]
     * test_compute_data_with_start_struct.html `initial and other values of stroke-dasharray are different` [2]
 * Properties implemented but not in geckolib:
-  * counter-reset property:
-    * test_bug829816.html [8]
-    * test_value_storage.html `counter-reset` [2]
-  * counter-increment property:
-    * test_value_storage.html `counter-increment` [2]
   * clip property: servo/servo#15729
     * test_value_storage.html `should be idempotent for 'clip` [4]
-  * font-feature-settings property
+  * font-feature-settings property servo/servo#15975
     * test_compute_data_with_start_struct.html `font-feature-settings` [2]
     * test_inherit_computation.html `font-feature-settings` [8]
     * test_inherit_storage.html `font-feature-settings` [12]
     * test_initial_computation.html `font-feature-settings` [4]
     * test_initial_storage.html `font-feature-settings` [6]
     * test_value_storage.html `font-feature-settings` [112]
-  * font-language-override property
+  * font-language-override property bug 1347821
     * test_compute_data_with_start_struct.html `font-language-override` [2]
     * test_inherit_computation.html `font-language-override` [8]
     * test_inherit_storage.html `font-language-override` [12]
     * test_initial_computation.html `font-language-override` [4]
     * test_initial_storage.html `font-language-override` [6]
     * test_value_storage.html `font-language-override` [58]
   * image-orientation property
     * test_compute_data_with_start_struct.html `image-orientation` [2]
     * test_inherit_computation.html `image-orientation` [4]
     * test_inherit_storage.html `image-orientation` [4]
     * test_initial_computation.html `image-orientation` [2]
     * test_initial_storage.html `image-orientation` [2]
     * test_value_storage.html `image-orientation` [80]
+  * flexbox / grid position properties servo/servo#15001
+    * test_inherit_storage.html `align-` [3]
+    * ... `justify-` [3]
+    * test_initial_storage.html `align-` [6]
+    * ... `justify-` [6]
+    * test_value_storage.html `align-` [57]
+    * ... `justify-` [46]
 * @page support
   * test_bug887741_at-rules_in_declaration_lists.html [1]
   * test_page_parser.html [30]
   * test_rule_insertion.html `@page` [4]
 * Unsupported prefixed values
   * moz-prefixed gradient functions bug 1337655
-    * test_value_storage.html `-moz-linear-gradient` [293]
+    * test_value_storage.html `-moz-linear-gradient` [322]
     * ... `-moz-radial-gradient` [309]
     * ... `-moz-repeating-` [298]
   * webkit-prefixed gradient functions servo/servo#15441
     * test_value_storage.html `-webkit-gradient` [225]
     * ... `-webkit-linear-gradient` [40]
     * ... `-webkit-radial-gradient` [105]
     * ... `-webkit-repeating-` [35]
   * moz-prefixed intrinsic width values
-    * test_flexbox_flex_shorthand.html `-moz-fit-content` [2]
+    * test_flexbox_flex_shorthand.html `-moz-fit-content` [4]
     * test_value_storage.html `-moz-max-content` [52]
     * ... `-moz-min-content` [12]
     * ... `-moz-fit-content` [12]
     * ... `-moz-available` [10]
-  * -moz-element() function for &lt;image&gt;
+  * -moz-element() function for &lt;image&gt; servo/servo#15443
     * test_value_storage.html `-moz-element` [49]
   * -moz-anchor-decoration value on text-decoration
     * test_value_storage.html `-moz-anchor-decoration` [10]
   * several prefixed values in cursor property
     * test_value_storage.html `cursor` [4]
   * moz-prefixed values of overflow shorthand bug 1330888
     * test_bug319381.html [8]
     * test_value_storage.html `'overflow` [8]
@@ -320,90 +312,92 @@ Any line which doesn't follow the format
     * test_value_storage.html `-moz-middle-with-baseline` [1]
   * -moz-pre-space on white-space
     * test_value_storage.html `-moz-pre-space` [1]
   * -moz-crisp-edges on image-rendering
     * test_value_storage.html `-moz-crisp-edges` [1]
   * -webkit-{flex,inline-flex} for display servo/servo#15400
     * test_webkit_flex_display.html [4]
   * test_pixel_lengths.html `mozmm`: mozmm unit [3]
+  * -moz-image-rect value servo/servo#15948
+    * test_value_storage.html `-moz-image-rect` [15]
 * Unsupported values
   * SVG-only values of pointer-events not recognized
     * test_compute_data_with_start_struct.html `pointer-events` [2]
     * test_inherit_computation.html `pointer-events` [4]
     * test_initial_computation.html `pointer-events` [2]
     * test_pointer-events.html [2]
     * test_value_storage.html `pointer-events` [8]
   * new syntax of rgba?() and hsla?() functions servo/rust-cssparser#113
     * test_value_storage.html `'color'` [35]
     * ... `rgb(100, 100.0, 100)` [1]
   * color interpolation hint not supported servo/servo#15166
     * test_value_storage.html `'linear-gradient` [50]
   * two-keyword form of background-repeat/mask-repeat servo/servo#14954
     * test_value_storage.html `background-repeat` [14]
     * ... `mask-repeat` [24]
-  * lack glue for function values of content property bug 1296477
-    * test_rule_insertion.html `decimal counter` [1]
-    * test_value_storage.html `'content` [12]
   * SVG-in-OpenType values not supported servo/servo#15211
     * test_value_storage.html `context-` [2]
   * writing-mode: sideways-{lr,rl} and SVG values servo/servo#15213
     * test_logical_properties.html `sideways` [1224]
     * test_value_storage.html `writing-mode` [8]
 * Incorrect parsing
   * calc() doesn't support dividing expression servo/servo#15192
     * test_value_storage.html `calc(50px/` [7]
     * ... `calc(2em / ` [9]
-  * calc() doesn't support number value servo/servo#15205
+  * calc(number) is simplifed eagerly servo/servo#15960
     * test_value_storage.html `calc(-2.5)` [1]
   * size part of shorthand background/mask always desires two values servo/servo#15199
     * test_value_storage.html `'background'` [18]
     * ... `/ auto none` [34]
     * ... `/ auto repeat` [17]
   * border shorthands do not reset border-image servo/servo#15202
+    * test_shorthand_property_getters.html `border-image` [1]
     * test_inherit_storage.html `for property 'border-image-` [5]
     * test_initial_storage.html `for property 'border-image-` [10]
     * test_value_storage.html `(for 'border-image-` [60]
   * -moz-alt-content parsing is wrong: servo/servo#15726
     * test_property_syntax_errors.html `-moz-alt-content` [4]
   * {transform,perspective}-origin fail to parse 'center left' and 'center right' servo/servo#15750
     * test_value_storage.html `'center left'` [8]
     * ... `'center right'` [8]
 * Incorrect parsing
-  * border-image and -moz-border-image shorthand servo/servo#15770
-    * test_property_syntax_errors.html `border-image` [4]
   * mask shorthand servo/servo#15772
     * test_property_syntax_errors.html `mask'` [76]
 * Incorrect serialization
   * border-radius and -moz-outline-radius shorthand servo/servo#15169
     * test_priority_preservation.html `border-radius` [4]
     * test_value_storage.html `border-radius:` [156]
     * ... `-moz-outline-radius:` [76]
     * test_shorthand_property_getters.html `should condense to shortest possible` [6]
   * transform property servo/servo#15194
     * test_value_storage.html `'transform` [104]
     * ... `"transform` [66]
     * ... `-webkit-transform` [109]
     * test_specified_value_serialization.html [27]
     * test_units_angle.html [3]
-  * test_value_storage.html `columns:`: **need investigation** [20]
   * {background,mask}-position lacks comma for serialization servo/servo#15200
     * test_value_storage.html `background-position` [81]
     * ... `for 'mask-position` [94]
     * ... `for '-webkit-mask-position` [188]
-    * ... `for '-webkit-mask` [38]
+    * ... `for '-webkit-mask` [45]
     * test_shorthand_property_getters.html `background-position` [1]
   * box-shadow wrong order of &lt;length&gt; values servo/servo#15203
     * test_value_storage.html `box-shadow` [44]
   * color value not canonicalized servo/servo#15397
     * test_shorthand_property_getters.html `should condense to canonical case` [2]
   * background-position invalid 3-value form **issue to be filed**
     * test_shorthand_property_getters.html `should serialize to 4-value` [2]
   * test_variables.html `--weird`: name of custom property is not escaped properly servo/servo#15399 [1]
   * ... `got "--`: CSS-wide keywords in custom properties servo/servo#15401 [3]
+  * image-layer values should omit some of its parts when they are initial servo/servo#15951
+    * test_shorthand_property_getters.html `background` [2]
+  * counter-{reset,increment} doesn't serialize none servo/servo#15977
+    * test_value_storage.html `counter-reset` [2]
+    * test_value_storage.html `counter-increment` [2]
 * Unsupported pseudo-classes
   * :default ##easy##
     * test_bug302186.html [24]
   * test_bug98997.html: pseudo-class :empty and :-moz-only-whitespace bug 1337068 [75]
   * :-moz-{first,last}-node
     * test_selectors.html `:-moz-` [4]
     * ... `unexpected rule index` [2]
   * :placeholder-shown
@@ -419,22 +413,20 @@ Any line which doesn't follow the format
   * ... `0.766667px` [2]
   * ... `105.333px` [2]
 * test_value_storage.html `: var(--a)`: extra whitespace is added for shorthand with variables servo/servo#15295 [*]
 * border-width computed wrong bug 1335990
   * test_parse_rule.html `border-style` [4]
   * test_initial_computation.html `0px", expected "3px` [48]
 * Negative value should be rejected
   * test_property_syntax_errors.html `transition-duration`: servo/servo#15343 [20]
-  * ... `perspective'`: servo/servo#15337 [20]
-  * third length of shadow servo/servo#15490
-    * test_property_syntax_errors.html `box-shadow'` [0]
-    * ... `'text-shadow'` [2]
-    * ... `drop-shadow` [0]
-  * test_property_syntax_errors.html `flex-basis`: servo/servo#15902 [6]
+  * ... `perspective'`: servo/servo#15449 [20]
+  * ... `'text-shadow'`: third length of text-shadow servo/servo#15999 [2]
+  * ... `flex-basis`: servo/servo#15902 [6]
+  * ... `border-image-slice`: servo/servo#15339 [2]
 * Quirks mode support
   * hashless color servo/servo#15341
     * test_property_syntax_errors.html `color: 000000` [22]
     * ... `color: 96ed2a` [22]
     * ... `color: fff` [4]
   * unitless length servo/servo#15342
     * test_property_syntax_errors.html ` 20 ` [6]
     * ... `: 10 ` [6]
@@ -450,41 +442,44 @@ Any line which doesn't follow the format
   * test_rule_insertion.html [7]
 * @-moz-document support
   * test_rule_serialization.html [2]
   * test_moz_document_rules.html [13]
 * getComputedStyle style doesn't contain custom properties bug 1336891
   * test_variable_serialization_computed.html [35]
   * test_variables.html `custom property name` [2]
 * test_css_supports.html: issues around @supports syntax servo/servo#15482 [8]
-* test_author_specified_style.html: support serializing color as author specified [33]
+* test_author_specified_style.html: support serializing color as author specified bug 1348165 [33]
 * browser_newtab_share_rule_processors.js: agent style sheet sharing [1]
 * test_selectors.html `this_better_be_unvisited`: visited handling [2]
 
 ## Assertions
 
 * Content glue not implemented
   * assertion in computed style bug 1337635
   * assertion for unsupported or non-animatable property bug 1343710
     * test_animations.html asserts [12]
 
 ## Need Gecko change
 
 * Servo is correct but Gecko is wrong
   * unitless zero as angle bug 1234357
-    * test_property_syntax_errors.html `linear-gradient(0,` [8]
+    * test_property_syntax_errors.html `linear-gradient(0,` [10]
     * ... `hue-rotate(0)` [6]
+  * flex-basis should be 0px when omitted in flex shorthand bug 1331530
+    * test_flexbox_flex_shorthand.html `flex-basis` [10]
 
 ## Spec Unclear
 
 * test_property_syntax_errors.html `'background'`: whether background shorthand should accept "text" [200]
 
 ## Unknown / Unsure
 
 * test_additional_sheets.html: one sub-test cascade order is wrong [1]
+* test_flexbox_layout.html: resolved width doesn't match expectation [5]
 * test_selectors.html `:nth-child`: &lt;an+b&gt; parsing difference [14]
 * test_selectors_on_anonymous_content.html: xbl and :nth-child [1]
 * test_variables.html `url`: url in custom property [1]
 * test_pseudoelement_state.html: doesn't seem to work at all, but only range-thumb fails... [4]
 * test_parse_rule.html `rgb(0, 128, 0)`: color properties not getting computed [8]
 
 ## Ignore
 
--- a/layout/svg/SVGContextPaint.cpp
+++ b/layout/svg/SVGContextPaint.cpp
@@ -8,123 +8,134 @@
 #include "gfxUtils.h"
 #include "mozilla/gfx/2D.h"
 #include "nsIDocument.h"
 #include "nsSVGPaintServerFrame.h"
 #include "nsSVGEffects.h"
 #include "nsSVGPaintServerFrame.h"
 
 using namespace mozilla::gfx;
+using namespace mozilla::image;
 
 namespace mozilla {
 
 /**
  * Stores in |aTargetPaint| information on how to reconstruct the current
  * fill or stroke pattern. Will also set the paint opacity to transparent if
  * the paint is set to "none".
  * @param aOuterContextPaint pattern information from the outer text context
  * @param aTargetPaint where to store the current pattern information
  * @param aFillOrStroke member pointer to the paint we are setting up
  * @param aProperty the frame property descriptor of the fill or stroke paint
  *   server frame
  */
-static void
+static DrawResult
 SetupInheritablePaint(const DrawTarget* aDrawTarget,
                       const gfxMatrix& aContextMatrix,
                       nsIFrame* aFrame,
                       float& aOpacity,
                       SVGContextPaint* aOuterContextPaint,
                       SVGContextPaintImpl::Paint& aTargetPaint,
                       nsStyleSVGPaint nsStyleSVG::*aFillOrStroke,
                       nsSVGEffects::PaintingPropertyDescriptor aProperty)
 {
   const nsStyleSVG *style = aFrame->StyleSVG();
   nsSVGPaintServerFrame *ps =
     nsSVGEffects::GetPaintServer(aFrame, aFillOrStroke, aProperty);
 
+  DrawResult result = DrawResult::SUCCESS;
   if (ps) {
-    RefPtr<gfxPattern> pattern =
+    RefPtr<gfxPattern> pattern;
+    Tie(result, pattern) =
       ps->GetPaintServerPattern(aFrame, aDrawTarget, aContextMatrix,
                                 aFillOrStroke, aOpacity);
+
     if (pattern) {
       aTargetPaint.SetPaintServer(aFrame, aContextMatrix, ps);
-      return;
+      return result;
     }
   }
+
   if (aOuterContextPaint) {
     RefPtr<gfxPattern> pattern;
     switch ((style->*aFillOrStroke).Type()) {
     case eStyleSVGPaintType_ContextFill:
-      pattern = aOuterContextPaint->GetFillPattern(aDrawTarget, aOpacity,
-                                                   aContextMatrix);
+      Tie(result, pattern) =
+        aOuterContextPaint->GetFillPattern(aDrawTarget, aOpacity,
+                                           aContextMatrix);
       break;
     case eStyleSVGPaintType_ContextStroke:
-      pattern = aOuterContextPaint->GetStrokePattern(aDrawTarget, aOpacity,
-                                                     aContextMatrix);
+       Tie(result, pattern) =
+         aOuterContextPaint->GetStrokePattern(aDrawTarget, aOpacity,
+                                              aContextMatrix);
       break;
     default:
       ;
     }
     if (pattern) {
       aTargetPaint.SetContextPaint(aOuterContextPaint, (style->*aFillOrStroke).Type());
-      return;
+      return result;
     }
   }
+
   nscolor color =
     nsSVGUtils::GetFallbackOrPaintColor(aFrame->StyleContext(), aFillOrStroke);
   aTargetPaint.SetColor(color);
+
+  return result;
 }
 
-DrawMode
+mozilla::Pair<DrawResult, DrawMode>
 SVGContextPaintImpl::Init(const DrawTarget* aDrawTarget,
                           const gfxMatrix& aContextMatrix,
                           nsIFrame* aFrame,
                           SVGContextPaint* aOuterContextPaint)
 {
   DrawMode toDraw = DrawMode(0);
 
   const nsStyleSVG *style = aFrame->StyleSVG();
+  DrawResult result = DrawResult::SUCCESS;
 
   // fill:
   if (style->mFill.Type() == eStyleSVGPaintType_None) {
     SetFillOpacity(0.0f);
   } else {
     float opacity = nsSVGUtils::GetOpacity(style->FillOpacitySource(),
                                            style->mFillOpacity,
                                            aOuterContextPaint);
 
-    SetupInheritablePaint(aDrawTarget, aContextMatrix, aFrame,
-                          opacity, aOuterContextPaint,
-                          mFillPaint, &nsStyleSVG::mFill,
-                          nsSVGEffects::FillProperty());
+    result &= SetupInheritablePaint(aDrawTarget, aContextMatrix, aFrame,
+                                    opacity, aOuterContextPaint,
+                                    mFillPaint, &nsStyleSVG::mFill,
+                                    nsSVGEffects::FillProperty());
 
     SetFillOpacity(opacity);
 
     toDraw |= DrawMode::GLYPH_FILL;
   }
 
   // stroke:
   if (style->mStroke.Type() == eStyleSVGPaintType_None) {
     SetStrokeOpacity(0.0f);
   } else {
     float opacity = nsSVGUtils::GetOpacity(style->StrokeOpacitySource(),
                                            style->mStrokeOpacity,
                                            aOuterContextPaint);
 
-    SetupInheritablePaint(aDrawTarget, aContextMatrix, aFrame,
-                          opacity, aOuterContextPaint,
-                          mStrokePaint, &nsStyleSVG::mStroke,
-                          nsSVGEffects::StrokeProperty());
+    result &= SetupInheritablePaint(aDrawTarget, aContextMatrix, aFrame,
+                                    opacity, aOuterContextPaint,
+                                    mStrokePaint, &nsStyleSVG::mStroke,
+                                    nsSVGEffects::StrokeProperty());
 
     SetStrokeOpacity(opacity);
 
     toDraw |= DrawMode::GLYPH_STROKE;
   }
 
-  return toDraw;
+  return MakePair(result, toDraw);
 }
 
 void
 SVGContextPaint::InitStrokeGeometry(gfxContext* aContext,
                                     float devUnitsPerSVGUnit)
 {
   mStrokeWidth = aContext->CurrentLineWidth() / devUnitsPerSVGUnit;
   aContext->CurrentDash(mDashes, &mDashOffset);
@@ -153,96 +164,100 @@ SVGContextPaint::GetContextPaint(nsICont
   // bit of a headache so for now we punt on that, don't reapply the constness
   // to the SVGContextPaint here, and trust that no one will add code that
   // actually modifies the object.
 
   return static_cast<SVGContextPaint*>(
            ownerDoc->GetProperty(nsGkAtoms::svgContextPaint));
 }
 
-already_AddRefed<gfxPattern>
+mozilla::Pair<DrawResult, RefPtr<gfxPattern>>
 SVGContextPaintImpl::GetFillPattern(const DrawTarget* aDrawTarget,
                                     float aOpacity,
                                     const gfxMatrix& aCTM)
 {
   return mFillPaint.GetPattern(aDrawTarget, aOpacity, &nsStyleSVG::mFill, aCTM);
 }
 
-already_AddRefed<gfxPattern>
+mozilla::Pair<DrawResult, RefPtr<gfxPattern>>
 SVGContextPaintImpl::GetStrokePattern(const DrawTarget* aDrawTarget,
                                       float aOpacity,
                                       const gfxMatrix& aCTM)
 {
   return mStrokePaint.GetPattern(aDrawTarget, aOpacity, &nsStyleSVG::mStroke, aCTM);
 }
 
-already_AddRefed<gfxPattern>
+mozilla::Pair<DrawResult, RefPtr<gfxPattern>>
 SVGContextPaintImpl::Paint::GetPattern(const DrawTarget* aDrawTarget,
                                        float aOpacity,
                                        nsStyleSVGPaint nsStyleSVG::*aFillOrStroke,
                                        const gfxMatrix& aCTM)
 {
   RefPtr<gfxPattern> pattern;
   if (mPatternCache.Get(aOpacity, getter_AddRefs(pattern))) {
     // Set the pattern matrix just in case it was messed with by a previous
     // caller. We should get the same matrix each time a pattern is constructed
     // so this should be fine.
     pattern->SetMatrix(aCTM * mPatternMatrix);
-    return pattern.forget();
+    return MakePair(DrawResult::SUCCESS, Move(pattern));
   }
 
+  DrawResult result = DrawResult::SUCCESS;
   switch (mPaintType) {
   case eStyleSVGPaintType_None:
     pattern = new gfxPattern(Color());
     mPatternMatrix = gfxMatrix();
     break;
   case eStyleSVGPaintType_Color: {
     Color color = Color::FromABGR(mPaintDefinition.mColor);
     color.a *= aOpacity;
     pattern = new gfxPattern(color);
     mPatternMatrix = gfxMatrix();
     break;
   }
   case eStyleSVGPaintType_Server:
-    pattern = mPaintDefinition.mPaintServerFrame->GetPaintServerPattern(mFrame,
-                                                                        aDrawTarget,
-                                                                        mContextMatrix,
-                                                                        aFillOrStroke,
-                                                                        aOpacity);
+    Tie(result, pattern) =
+      mPaintDefinition.mPaintServerFrame->GetPaintServerPattern(mFrame,
+                                                                aDrawTarget,
+                                                                mContextMatrix,
+                                                                aFillOrStroke,
+                                                                aOpacity);
     {
       // m maps original-user-space to pattern space
       gfxMatrix m = pattern->GetMatrix();
       gfxMatrix deviceToOriginalUserSpace = mContextMatrix;
       if (!deviceToOriginalUserSpace.Invert()) {
-        return nullptr;
+        return MakePair(DrawResult::SUCCESS, RefPtr<gfxPattern>());
       }
       // mPatternMatrix maps device space to pattern space via original user space
       mPatternMatrix = deviceToOriginalUserSpace * m;
     }
     pattern->SetMatrix(aCTM * mPatternMatrix);
     break;
   case eStyleSVGPaintType_ContextFill:
-    pattern = mPaintDefinition.mContextPaint->GetFillPattern(aDrawTarget,
+    Tie(result, pattern) =
+      mPaintDefinition.mContextPaint->GetFillPattern(aDrawTarget,
                                                              aOpacity, aCTM);
     // Don't cache this. mContextPaint will have cached it anyway. If we
     // cache it, we'll have to compute mPatternMatrix, which is annoying.
-    return pattern.forget();
+    return MakePair(result, Move(pattern));
   case eStyleSVGPaintType_ContextStroke:
-    pattern = mPaintDefinition.mContextPaint->GetStrokePattern(aDrawTarget,
+    Tie(result, pattern) =
+      mPaintDefinition.mContextPaint->GetStrokePattern(aDrawTarget,
                                                                aOpacity, aCTM);
     // Don't cache this. mContextPaint will have cached it anyway. If we
     // cache it, we'll have to compute mPatternMatrix, which is annoying.
-    return pattern.forget();
+    return MakePair(result, Move(pattern));
   default:
     MOZ_ASSERT(false, "invalid paint type");
-    return nullptr;
+    return MakePair(DrawResult::SUCCESS, RefPtr<gfxPattern>());
   }
 
   mPatternCache.Put(aOpacity, pattern);
-  return pattern.forget();
+  return MakePair(result, Move(pattern));
 }
 
 AutoSetRestoreSVGContextPaint::AutoSetRestoreSVGContextPaint(
                                  const SVGContextPaint* aContextPaint,
                                  nsIDocument* aSVGDocument)
   : mSVGDocument(aSVGDocument)
   , mOuterContextPaint(aSVGDocument->GetProperty(nsGkAtoms::svgContextPaint))
 {
--- a/layout/svg/SVGContextPaint.h
+++ b/layout/svg/SVGContextPaint.h
@@ -11,16 +11,17 @@
 #include "gfxPattern.h"
 #include "gfxTypes.h"
 #include "mozilla/AlreadyAddRefed.h"
 #include "mozilla/Assertions.h"
 #include "mozilla/gfx/2D.h"
 #include "nsColor.h"
 #include "nsStyleStruct.h"
 #include "nsTArray.h"
+#include "DrawResult.h"
 
 class gfxContext;
 class nsIDocument;
 class nsSVGPaintServerFrame;
 
 namespace mozilla {
 
 /**
@@ -47,36 +48,40 @@ namespace mozilla {
 class SVGContextPaint : public RefCounted<SVGContextPaint>
 {
 protected:
   typedef mozilla::gfx::DrawTarget DrawTarget;
 
   SVGContextPaint() {}
 
 public:
+  typedef image::DrawResult DrawResult;
+
   MOZ_DECLARE_REFCOUNTED_TYPENAME(SVGContextPaint)
 
   virtual ~SVGContextPaint() {}
 
-  virtual already_AddRefed<gfxPattern> GetFillPattern(const DrawTarget* aDrawTarget,
-                                                      float aOpacity,
-                                                      const gfxMatrix& aCTM) = 0;
-  virtual already_AddRefed<gfxPattern> GetStrokePattern(const DrawTarget* aDrawTarget,
-                                                        float aOpacity,
-                                                        const gfxMatrix& aCTM) = 0;
+  virtual mozilla::Pair<DrawResult, RefPtr<gfxPattern>>
+  GetFillPattern(const DrawTarget* aDrawTarget,
+                 float aOpacity,
+                 const gfxMatrix& aCTM) = 0;
+  virtual mozilla::Pair<DrawResult, RefPtr<gfxPattern>>
+  GetStrokePattern(const DrawTarget* aDrawTarget,
+                   float aOpacity,
+                   const gfxMatrix& aCTM) = 0;
   virtual float GetFillOpacity() const = 0;
   virtual float GetStrokeOpacity() const = 0;
 
-  already_AddRefed<gfxPattern> GetFillPattern(const DrawTarget* aDrawTarget,
-                                              const gfxMatrix& aCTM) {
+  mozilla::Pair<DrawResult, RefPtr<gfxPattern>>
+  GetFillPattern(const DrawTarget* aDrawTarget, const gfxMatrix& aCTM) {
     return GetFillPattern(aDrawTarget, GetFillOpacity(), aCTM);
   }
 
-  already_AddRefed<gfxPattern> GetStrokePattern(const DrawTarget* aDrawTarget,
-                                                const gfxMatrix& aCTM) {
+  mozilla::Pair<DrawResult, RefPtr<gfxPattern>>
+  GetStrokePattern(const DrawTarget* aDrawTarget, const gfxMatrix& aCTM) {
     return GetStrokePattern(aDrawTarget, GetStrokeOpacity(), aCTM);
   }
 
   static SVGContextPaint* GetContextPaint(nsIContent* aContent);
 
   // XXX This gets the geometry params from the gfxContext.  We should get that
   // information from the actual paint context!
   void InitStrokeGeometry(gfxContext *aContext,
@@ -132,28 +137,34 @@ private:
 /**
  * This class should be flattened into SVGContextPaint once we get rid of the
  * other sub-class (SimpleTextContextPaint).
  */
 struct SVGContextPaintImpl : public SVGContextPaint
 {
 protected:
   typedef mozilla::gfx::DrawTarget DrawTarget;
+
 public:
-  DrawMode Init(const DrawTarget* aDrawTarget,
-                const gfxMatrix& aContextMatrix,
-                nsIFrame* aFrame,
-                SVGContextPaint* aOuterContextPaint);
+  typedef mozilla::image::DrawResult DrawResult;
 
-  already_AddRefed<gfxPattern> GetFillPattern(const DrawTarget* aDrawTarget,
-                                              float aOpacity,
-                                              const gfxMatrix& aCTM) override;
-  already_AddRefed<gfxPattern> GetStrokePattern(const DrawTarget* aDrawTarget,
-                                                float aOpacity,
-                                                const gfxMatrix& aCTM) override;
+  mozilla::Pair<DrawResult, DrawMode>
+  Init(const DrawTarget* aDrawTarget,
+       const gfxMatrix& aContextMatrix,
+       nsIFrame* aFrame,
+       SVGContextPaint* aOuterContextPaint);
+
+  mozilla::Pair<DrawResult, RefPtr<gfxPattern>>
+  GetFillPattern(const DrawTarget* aDrawTarget,
+                 float aOpacity,
+                 const gfxMatrix& aCTM) override;
+  mozilla::Pair<DrawResult, RefPtr<gfxPattern>>
+  GetStrokePattern(const DrawTarget* aDrawTarget,
+                   float aOpacity,
+                   const gfxMatrix& aCTM) override;
 
   void SetFillOpacity(float aOpacity) { mFillOpacity = aOpacity; }
   float GetFillOpacity() const override { return mFillOpacity; }
 
   void SetStrokeOpacity(float aOpacity) { mStrokeOpacity = aOpacity; }
   float GetStrokeOpacity() const override { return mStrokeOpacity; }
 
   struct Paint {
@@ -193,20 +204,21 @@ public:
     // CTM defining the user space for the pattern we will use.
     gfxMatrix mContextMatrix;
     nsStyleSVGPaintType mPaintType;
 
     // Device-space-to-pattern-space
     gfxMatrix mPatternMatrix;
     nsRefPtrHashtable<nsFloatHashKey, gfxPattern> mPatternCache;
 
-    already_AddRefed<gfxPattern> GetPattern(const DrawTarget* aDrawTarget,
-                                            float aOpacity,
-                                            nsStyleSVGPaint nsStyleSVG::*aFillOrStroke,
-                                            const gfxMatrix& aCTM);
+    mozilla::Pair<DrawResult, RefPtr<gfxPattern>>
+    GetPattern(const DrawTarget* aDrawTarget,
+               float aOpacity,
+               nsStyleSVGPaint nsStyleSVG::*aFillOrStroke,
+               const gfxMatrix& aCTM);
   };
 
   Paint mFillPaint;
   Paint mStrokePaint;
 
   float mFillOpacity;
   float mStrokeOpacity;
 };
@@ -214,32 +226,39 @@ public:
 /**
  * This class is used to pass context paint to an SVG image when an element
  * references that image (e.g. via HTML <img> or SVG <image>, or by referencing
  * it from a CSS property such as 'background-image').  In this case we only
  * support context colors and not paint servers.
  */
 class SVGEmbeddingContextPaint : public SVGContextPaint
 {
+protected:
+  typedef mozilla::image::DrawResult DrawResult;
+
 public:
   SVGEmbeddingContextPaint() {}
 
   void SetFill(nscolor aFill);
   void SetStroke(nscolor aStroke);
 
-  already_AddRefed<gfxPattern> GetFillPattern(const DrawTarget* aDrawTarget,
-                                              float aOpacity,
-                                              const gfxMatrix& aCTM) override {
-    return do_AddRef(mFill);
+  mozilla::Pair<DrawResult, RefPtr<gfxPattern>>
+  GetFillPattern(const DrawTarget* aDrawTarget,
+                 float aOpacity,
+                 const gfxMatrix& aCTM) override {
+    RefPtr<gfxPattern> fill = mFill;
+    return MakePair(DrawResult::SUCCESS, Move(fill));
   }
 
-  already_AddRefed<gfxPattern> GetStrokePattern(const DrawTarget* aDrawTarget,
-                                                float aOpacity,
-                                                const gfxMatrix& aCTM) override {
-    return do_AddRef(mStroke);
+  mozilla::Pair<DrawResult, RefPtr<gfxPattern>>
+  GetStrokePattern(const DrawTarget* aDrawTarget,
+                   float aOpacity,
+                   const gfxMatrix& aCTM) override {
+    RefPtr<gfxPattern> stroke = mStroke;
+    return MakePair(DrawResult::SUCCESS, Move(stroke));
   }
 
   float GetFillOpacity() const override {
     // Always 1.0f since we don't currently allow 'context-fill-opacity'
     return 1.0f;
   };
 
   float GetStrokeOpacity() const override {
--- a/layout/svg/SVGGeometryFrame.cpp
+++ b/layout/svg/SVGGeometryFrame.cpp
@@ -284,43 +284,45 @@ SVGGeometryFrame::PaintSVG(gfxContext& a
 {
   if (!StyleVisibility()->IsVisible())
     return DrawResult::SUCCESS;
 
   // Matrix to the geometry's user space:
   gfxMatrix newMatrix =
     aContext.CurrentMatrix().PreMultiply(aTransform).NudgeToIntegers();
   if (newMatrix.IsSingular()) {
-    return DrawResult::BAD_ARGS;
+    return DrawResult::SUCCESS;
   }
 
   uint32_t paintOrder = StyleSVG()->mPaintOrder;
+  DrawResult result = DrawResult::SUCCESS;
+
   if (paintOrder == NS_STYLE_PAINT_ORDER_NORMAL) {
-    Render(&aContext, eRenderFill | eRenderStroke, newMatrix);
+    result = Render(&aContext, eRenderFill | eRenderStroke, newMatrix);
     PaintMarkers(aContext, aTransform);
   } else {
     while (paintOrder) {
       uint32_t component =
         paintOrder & ((1 << NS_STYLE_PAINT_ORDER_BITWIDTH) - 1);
       switch (component) {
         case NS_STYLE_PAINT_ORDER_FILL:
-          Render(&aContext, eRenderFill, newMatrix);
+          result &= Render(&aContext, eRenderFill, newMatrix);
           break;
         case NS_STYLE_PAINT_ORDER_STROKE:
-          Render(&aContext, eRenderStroke, newMatrix);
+          result &= Render(&aContext, eRenderStroke, newMatrix);
           break;
         case NS_STYLE_PAINT_ORDER_MARKERS:
           PaintMarkers(aContext, aTransform);
           break;
       }
       paintOrder >>= NS_STYLE_PAINT_ORDER_BITWIDTH;
     }
   }
 
-  return DrawResult::SUCCESS;
+  return result;
 }
 
 nsIFrame*
 SVGGeometryFrame::GetFrameForPoint(const gfxPoint& aPoint)
 {
   FillRule fillRule;
   uint16_t hitTestFlags;
   if (GetStateBits() & NS_STATE_SVG_CLIPPATH_CHILD) {
@@ -759,17 +761,17 @@ nsSVGMarkerFrame *
 SVGGeometryFrame::MarkerProperties::GetMarkerEndFrame()
 {
   if (!mMarkerEnd)
     return nullptr;
   return static_cast<nsSVGMarkerFrame *>
     (mMarkerEnd->GetReferencedFrame(nsGkAtoms::svgMarkerFrame, nullptr));
 }
 
-void
+DrawResult
 SVGGeometryFrame::Render(gfxContext* aContext,
                          uint32_t aRenderComponents,
                          const gfxMatrix& aNewTransform)
 {
   MOZ_ASSERT(!aNewTransform.IsSingular());
 
   DrawTarget* drawTarget = aContext->GetDrawTarget();
 
@@ -795,35 +797,38 @@ SVGGeometryFrame::Render(gfxContext* aCo
     // We don't complicate this code with GetAsSimplePath since the cost of
     // masking will dwarf Path creation overhead anyway.
     RefPtr<Path> path = element->GetOrBuildPath(*drawTarget, fillRule);
     if (path) {
       ColorPattern white(ToDeviceColor(Color(1.0f, 1.0f, 1.0f, 1.0f)));
       drawTarget->Fill(path, white,
                        DrawOptions(1.0f, CompositionOp::OP_OVER, aaMode));
     }
-    return;
+    return DrawResult::SUCCESS;
   }
 
   SVGGeometryElement::SimplePath simplePath;
   RefPtr<Path> path;
 
   element->GetAsSimplePath(&simplePath);
   if (!simplePath.IsPath()) {
     path = element->GetOrBuildPath(*drawTarget, fillRule);
     if (!path) {
-      return;
+      return DrawResult::SUCCESS;
     }
   }
 
   SVGContextPaint* contextPaint = SVGContextPaint::GetContextPaint(mContent);
+  DrawResult result = DrawResult::SUCCESS;
 
   if (aRenderComponents & eRenderFill) {
     GeneralPattern fillPattern;
-    nsSVGUtils::MakeFillPatternFor(this, aContext, &fillPattern, contextPaint);
+    result = nsSVGUtils::MakeFillPatternFor(this, aContext, &fillPattern,
+                                            contextPaint);
+
     if (fillPattern.GetPattern()) {
       DrawOptions drawOptions(1.0f, CompositionOp::OP_OVER, aaMode);
       if (simplePath.IsRect()) {
         drawTarget->FillRect(simplePath.AsRect(), fillPattern, drawOptions);
       } else if (path) {
         drawTarget->Fill(path, fillPattern, drawOptions);
       }
     }
@@ -834,53 +839,58 @@ SVGGeometryFrame::Render(gfxContext* aCo
     // Account for vector-effect:non-scaling-stroke:
     gfxMatrix userToOuterSVG;
     if (nsSVGUtils::GetNonScalingStrokeTransform(this, &userToOuterSVG)) {
       // A simple Rect can't be transformed with rotate/skew, so let's switch
       // to using a real path:
       if (!path) {
         path = element->GetOrBuildPath(*drawTarget, fillRule);
         if (!path) {
-          return;
+          return DrawResult::SUCCESS;
         }
         simplePath.Reset();
       }
       // We need to transform the path back into the appropriate ancestor
       // coordinate system, and paint it it that coordinate system, in order
       // for non-scaled stroke to paint correctly.
       gfxMatrix outerSVGToUser = userToOuterSVG;
       outerSVGToUser.Invert();
       aContext->Multiply(outerSVGToUser);
       RefPtr<PathBuilder> builder =
         path->TransformedCopyToBuilder(ToMatrix(userToOuterSVG), fillRule);
       path = builder->Finish();
     }
     GeneralPattern strokePattern;
-    nsSVGUtils::MakeStrokePatternFor(this, aContext, &strokePattern, contextPaint);
+    result &=
+      nsSVGUtils::MakeStrokePatternFor(this, aContext, &strokePattern,
+                                       contextPaint);
+
     if (strokePattern.GetPattern()) {
       SVGContentUtils::AutoStrokeOptions strokeOptions;
       SVGContentUtils::GetStrokeOptions(&strokeOptions,
                                         static_cast<nsSVGElement*>(mContent),
                                         StyleContext(), contextPaint);
       // GetStrokeOptions may set the line width to zero as an optimization
       if (strokeOptions.mLineWidth <= 0) {
-        return;
+        return DrawResult::SUCCESS;
       }
       DrawOptions drawOptions(1.0f, CompositionOp::OP_OVER, aaMode);
       if (simplePath.IsRect()) {
         drawTarget->StrokeRect(simplePath.AsRect(), strokePattern,
                                strokeOptions, drawOptions);
       } else if (simplePath.IsLine()) {
         drawTarget->StrokeLine(simplePath.Point1(), simplePath.Point2(),
                                strokePattern, strokeOptions, drawOptions);
       } else {
         drawTarget->Stroke(path, strokePattern, strokeOptions, drawOptions);
       }
     }
   }
+
+  return result;
 }
 
 void
 SVGGeometryFrame::PaintMarkers(gfxContext& aContext,
                                const gfxMatrix& aTransform)
 {
   SVGContextPaint* contextPaint = SVGContextPaint::GetContextPaint(mContent);
 
--- a/layout/svg/SVGGeometryFrame.h
+++ b/layout/svg/SVGGeometryFrame.h
@@ -116,18 +116,18 @@ protected:
    * This function returns a set of bit flags indicating which parts of the
    * element (fill, stroke, bounds) should intercept pointer events. It takes
    * into account the type of element and the value of the 'pointer-events'
    * property on the element.
    */
   virtual uint16_t GetHitTestFlags();
 private:
   enum { eRenderFill = 1, eRenderStroke = 2 };
-  void Render(gfxContext* aContext, uint32_t aRenderComponents,
-              const gfxMatrix& aTransform);
+  DrawResult Render(gfxContext* aContext, uint32_t aRenderComponents,
+                    const gfxMatrix& aTransform);
 
   /**
    * @param aMatrix The transform that must be multiplied onto aContext to
    *   establish this frame's SVG user space.
    */
   void PaintMarkers(gfxContext& aContext, const gfxMatrix& aMatrix);
 
   struct MarkerProperties {
--- a/layout/svg/SVGTextFrame.cpp
+++ b/layout/svg/SVGTextFrame.cpp
@@ -2924,17 +2924,17 @@ SVGTextDrawPathCallbacks::HandleTextGeom
   }
 }
 
 void
 SVGTextDrawPathCallbacks::MakeFillPattern(GeneralPattern* aOutPattern)
 {
   if (mColor == NS_SAME_AS_FOREGROUND_COLOR ||
       mColor == NS_40PERCENT_FOREGROUND_COLOR) {
-    nsSVGUtils::MakeFillPatternFor(mFrame, gfx, aOutPattern);
+    Unused << nsSVGUtils::MakeFillPatternFor(mFrame, gfx, aOutPattern);
     return;
   }
 
   if (mColor == NS_TRANSPARENT) {
     return;
   }
 
   aOutPattern->InitColorPattern(ToDeviceColor(mColor));
@@ -2995,17 +2995,18 @@ SVGTextDrawPathCallbacks::FillGeometry()
 void
 SVGTextDrawPathCallbacks::StrokeGeometry()
 {
   // We don't paint the stroke when we are filling with a selection color.
   if (mColor == NS_SAME_AS_FOREGROUND_COLOR ||
       mColor == NS_40PERCENT_FOREGROUND_COLOR) {
     if (nsSVGUtils::HasStroke(mFrame, /*aContextPaint*/ nullptr)) {
       GeneralPattern strokePattern;
-      nsSVGUtils::MakeStrokePatternFor(mFrame, gfx, &strokePattern, /*aContextPaint*/ nullptr);
+      Unused << nsSVGUtils::MakeStrokePatternFor(mFrame, gfx, &strokePattern,
+                                                 /*aContextPaint*/ nullptr);
       if (strokePattern.GetPattern()) {
         if (!mFrame->GetParent()->GetContent()->IsSVGElement()) {
           // The cast that follows would be unsafe
           MOZ_ASSERT(false, "Our nsTextFrame's parent's content should be SVG");
           return;
         }
         nsSVGElement* svgOwner =
           static_cast<nsSVGElement*>(mFrame->GetParent()->GetContent());
@@ -3589,17 +3590,17 @@ SVGTextFrame::PaintSVG(gfxContext& aCont
     // If we are asked to paint before reflow has recomputed mPositions etc.
     // directly via PaintSVG, rather than via a display list, then we need
     // to bail out here too.
     return DrawResult::SUCCESS;
   }
 
   if (aTransform.IsSingular()) {
     NS_WARNING("Can't render text element!");
-    return DrawResult::BAD_ARGS;
+    return DrawResult::SUCCESS;
   }
 
   gfxMatrix matrixForPaintServers = aTransform * initialMatrix;
 
   // Check if we need to draw anything.
   if (aDirtyRect) {
     NS_ASSERTION(!NS_SVGDisplayListPaintingEnabled() ||
                  (mState & NS_FRAME_IS_NONDISPLAY),
@@ -3640,33 +3641,35 @@ SVGTextFrame::PaintSVG(gfxContext& aCont
 
   TextRenderedRunIterator it(this, TextRenderedRunIterator::eVisibleFrames);
   TextRenderedRun run = it.Current();
 
   SVGContextPaint* outerContextPaint =
     SVGContextPaint::GetContextPaint(mContent);
 
   nsRenderingContext rendCtx(&aContext);
-
+  DrawResult finalResult = DrawResult::SUCCESS;
   while (run.mFrame) {
     nsTextFrame* frame = run.mFrame;
 
     // Determine how much of the left and right edges of the text frame we
     // need to ignore.
     SVGCharClipDisplayItem item(run);
 
     // Set up the fill and stroke so that SVG glyphs can get painted correctly
     // when they use context-fill etc.
     aContext.SetMatrix(initialMatrix);
 
     RefPtr<SVGContextPaintImpl> contextPaint = new SVGContextPaintImpl();
-    DrawMode drawMode = contextPaint->Init(&aDrawTarget,
-                                           aContext.CurrentMatrix(),
-                                           frame, outerContextPaint);
-
+    DrawMode drawMode;
+    DrawResult result = DrawResult::SUCCESS;
+    Tie(result, drawMode) = contextPaint->Init(&aDrawTarget,
+                                               aContext.CurrentMatrix(),
+                                               frame, outerContextPaint);
+    finalResult &= result;
     if (drawMode & DrawMode::GLYPH_STROKE) {
       // This may change the gfxContext's transform (for non-scaling stroke),
       // in which case this needs to happen before we call SetMatrix() below.
       nsSVGUtils::SetupCairoStrokeGeometry(frame, &aContext, outerContextPaint);
     }
 
     // Set up the transform for painting the text frame for the substring
     // indicated by the run.
@@ -3698,17 +3701,17 @@ SVGTextFrame::PaintSVG(gfxContext& aCont
       // caret with, rather than using the color property?
       caret->PaintCaret(aDrawTarget, frame, nsPoint());
       aContext.NewPath();
     }
 
     run = it.Next();
   }
 
-  return DrawResult::SUCCESS;
+  return finalResult;
 }
 
 nsIFrame*
 SVGTextFrame::GetFrameForPoint(const gfxPoint& aPoint)
 {
   NS_ASSERTION(PrincipalChildList().FirstChild(), "must have a child frame");
 
   if (mState & NS_FRAME_IS_NONDISPLAY) {
--- a/layout/svg/nsFilterInstance.cpp
+++ b/layout/svg/nsFilterInstance.cpp
@@ -413,31 +413,32 @@ nsFilterInstance::BuildSourcePaint(Sourc
 
   RefPtr<gfxContext> ctx = gfxContext::CreateOrNull(offscreenDT);
   MOZ_ASSERT(ctx); // already checked the draw target above
   gfxContextAutoSaveRestore saver(ctx);
 
   ctx->SetMatrix(mPaintTransform *
                  gfxMatrix::Translation(-neededRect.TopLeft()));
   GeneralPattern pattern;
+  DrawResult result = DrawResult::SUCCESS;
   if (aSource == &mFillPaint) {
-    nsSVGUtils::MakeFillPatternFor(mTargetFrame, ctx, &pattern);
+    result = nsSVGUtils::MakeFillPatternFor(mTargetFrame, ctx, &pattern);
   } else if (aSource == &mStrokePaint) {
-    nsSVGUtils::MakeStrokePatternFor(mTargetFrame, ctx, &pattern);
+    result = nsSVGUtils::MakeStrokePatternFor(mTargetFrame, ctx, &pattern);
   }
 
   if (pattern.GetPattern()) {
     offscreenDT->FillRect(ToRect(FilterSpaceToUserSpace(ThebesRect(neededRect))),
                           pattern);
   }
 
   aSource->mSourceSurface = offscreenDT->Snapshot();
   aSource->mSurfaceRect = neededRect;
 
-  return DrawResult::SUCCESS;
+  return result;
 }
 
 DrawResult
 nsFilterInstance::BuildSourcePaints()
 {
   if (!mFillPaint.mNeededBounds.IsEmpty()) {
     DrawResult result = BuildSourcePaint(&mFillPaint);
     if (result != DrawResult::SUCCESS) {
@@ -524,19 +525,20 @@ nsFilterInstance::Render(DrawTarget* aDr
   }
 
   AutoRestoreTransform autoRestoreTransform(aDrawTarget);
   gfxMatrix filterSpaceToUserSpace = mPaintTransform;
   DebugOnly<bool> invertible = filterSpaceToUserSpace.Invert();
   MOZ_ASSERT(invertible);
   filterSpaceToUserSpace *= nsSVGUtils::GetCSSPxToDevPxMatrix(mTargetFrame);
 
-  aDrawTarget->SetTransform(ToMatrix(filterSpaceToUserSpace) *
-                            aDrawTarget->GetTransform() *
-                            Matrix::Translation(filterRect.TopLeft()));
+  Matrix newTM =
+    ToMatrix(filterSpaceToUserSpace).PreTranslate(filterRect.x, filterRect.y) *
+    aDrawTarget->GetTransform();
+  aDrawTarget->SetTransform(newTM);
 
   ComputeNeededBoxes();
 
   DrawResult result = BuildSourceImage();
   if (result != DrawResult::SUCCESS){
     return result;
   }
   result = BuildSourcePaints();
--- a/layout/svg/nsSVGForeignObjectFrame.cpp
+++ b/layout/svg/nsSVGForeignObjectFrame.cpp
@@ -216,17 +216,17 @@ nsSVGForeignObjectFrame::PaintSVG(gfxCon
     return DrawResult::SUCCESS;
 
   nsIFrame* kid = PrincipalChildList().FirstChild();
   if (!kid)
     return DrawResult::SUCCESS;
 
   if (aTransform.IsSingular()) {
     NS_WARNING("Can't render foreignObject element!");
-    return DrawResult::BAD_ARGS;
+    return DrawResult::SUCCESS;
   }
 
   nsRect kidDirtyRect = kid->GetVisualOverflowRect();
 
   /* Check if we need to draw anything. */
   if (aDirtyRect) {
     NS_ASSERTION(!NS_SVGDisplayListPaintingEnabled() ||
                  (mState & NS_FRAME_IS_NONDISPLAY),
--- a/layout/svg/nsSVGGradientFrame.cpp
+++ b/layout/svg/nsSVGGradientFrame.cpp
@@ -202,17 +202,17 @@ static void GetStopInformation(nsIFrame*
   static_cast<SVGStopElement*>(stopContent)->
     GetAnimatedNumberValues(aOffset, nullptr);
 
   *aOffset = mozilla::clamped(*aOffset, 0.0f, 1.0f);
   *aStopColor = aStopFrame->StyleSVGReset()->mStopColor;
   *aStopOpacity = aStopFrame->StyleSVGReset()->mStopOpacity;
 }
 
-already_AddRefed<gfxPattern>
+mozilla::Pair<DrawResult, RefPtr<gfxPattern>>
 nsSVGGradientFrame::GetPaintServerPattern(nsIFrame* aSource,
                                           const DrawTarget* aDrawTarget,
                                           const gfxMatrix& aContextMatrix,
                                           nsStyleSVGPaint nsStyleSVG::*aFillOrStroke,
                                           float aGraphicOpacity,
                                           const gfxRect* aOverrideBounds)
 {
   uint16_t gradientUnits = GetGradientUnits();
@@ -230,55 +230,56 @@ nsSVGGradientFrame::GetPaintServerPatter
   GetStopFrames(&stopFrames);
 
   uint32_t nStops = stopFrames.Length();
 
   // SVG specification says that no stops should be treated like
   // the corresponding fill or stroke had "none" specified.
   if (nStops == 0) {
     RefPtr<gfxPattern> pattern = new gfxPattern(Color());
-    return pattern.forget();
+    return MakePair(DrawResult::SUCCESS, Move(pattern));
   }
 
   if (nStops == 1 || GradientVectorLengthIsZero()) {
     // The gradient paints a single colour, using the stop-color of the last
     // gradient step if there are more than one.
     float stopOpacity = stopFrames[nStops-1]->StyleSVGReset()->mStopOpacity;
     nscolor stopColor = stopFrames[nStops-1]->StyleSVGReset()->mStopColor;
 
     Color stopColor2 = Color::FromABGR(stopColor);
     stopColor2.a *= stopOpacity * aGraphicOpacity;
     RefPtr<gfxPattern> pattern = new gfxPattern(stopColor2);
-    return pattern.forget();
+    return MakePair(DrawResult::SUCCESS, Move(pattern));
   }
 
   // Get the transform list (if there is one). We do this after the returns
   // above since this call can be expensive when "gradientUnits" is set to
   // "objectBoundingBox" (since that requiring a GetBBox() call).
   gfxMatrix patternMatrix = GetGradientTransform(aSource, aOverrideBounds);
 
   if (patternMatrix.IsSingular()) {
-    return nullptr;
+    return MakePair(DrawResult::SUCCESS, RefPtr<gfxPattern>());
   }
 
   // revert any vector effect transform so that the gradient appears unchanged
   if (aFillOrStroke == &nsStyleSVG::mStroke) {
     gfxMatrix userToOuterSVG;
     if (nsSVGUtils::GetNonScalingStrokeTransform(aSource, &userToOuterSVG)) {
       patternMatrix *= userToOuterSVG;
     }
   }
 
   if (!patternMatrix.Invert()) {
-    return nullptr;
+    return MakePair(DrawResult::SUCCESS, RefPtr<gfxPattern>());
   }
 
   RefPtr<gfxPattern> gradient = CreateGradient();
-  if (!gradient || gradient->CairoStatus())
-    return nullptr;
+  if (!gradient || gradient->CairoStatus()) {
+    return MakePair(DrawResult::TEMPORARY_ERROR, RefPtr<gfxPattern>());
+  }
 
   uint16_t aSpread = GetSpreadMethod();
   if (aSpread == SVG_SPREADMETHOD_PAD)
     gradient->SetExtend(ExtendMode::CLAMP);
   else if (aSpread == SVG_SPREADMETHOD_REFLECT)
     gradient->SetExtend(ExtendMode::REFLECT);
   else if (aSpread == SVG_SPREADMETHOD_REPEAT)
     gradient->SetExtend(ExtendMode::REPEAT);
@@ -299,17 +300,17 @@ nsSVGGradientFrame::GetPaintServerPatter
     else
       lastOffset = offset;
 
     Color stopColor2 = Color::FromABGR(stopColor);
     stopColor2.a *= stopOpacity * aGraphicOpacity;
     gradient->AddColorStop(offset, stopColor2);
   }
 
-  return gradient.forget();
+  return MakePair(DrawResult::SUCCESS, Move(gradient));
 }
 
 // Private (helper) methods
 
 nsSVGGradientFrame *
 nsSVGGradientFrame::GetReferencedGradient()
 {
   if (mNoHRefURI)
--- a/layout/svg/nsSVGGradientFrame.h
+++ b/layout/svg/nsSVGGradientFrame.h
@@ -41,17 +41,17 @@ class nsSVGGradientFrame : public nsSVGP
 
 protected:
   explicit nsSVGGradientFrame(nsStyleContext* aContext);
 
 public:
   NS_DECL_ABSTRACT_FRAME(nsSVGGradientFrame)
 
   // nsSVGPaintServerFrame methods:
-  virtual already_AddRefed<gfxPattern>
+  virtual mozilla::Pair<DrawResult, RefPtr<gfxPattern>>
     GetPaintServerPattern(nsIFrame* aSource,
                           const DrawTarget* aDrawTarget,
                           const gfxMatrix& aContextMatrix,
                           nsStyleSVGPaint nsStyleSVG::*aFillOrStroke,
                           float aGraphicOpacity,
                           const gfxRect* aOverrideBounds) override;
 
   // nsIFrame interface:
--- a/layout/svg/nsSVGIntegrationUtils.cpp
+++ b/layout/svg/nsSVGIntegrationUtils.cpp
@@ -1225,20 +1225,22 @@ nsSVGIntegrationUtils::DrawableFromPaint
     // frame by default, so aPaintServerSize is the whole target background fill
     // area.
     nsSVGPaintServerFrame* server =
       static_cast<nsSVGPaintServerFrame*>(aFrame);
 
     gfxRect overrideBounds(0, 0,
                            aPaintServerSize.width, aPaintServerSize.height);
     overrideBounds.ScaleInverse(aFrame->PresContext()->AppUnitsPerDevPixel());
-    RefPtr<gfxPattern> pattern =
-    server->GetPaintServerPattern(aTarget, aDrawTarget,
-                                  aContextMatrix, &nsStyleSVG::mFill, 1.0,
-                                  &overrideBounds);
+    DrawResult result = DrawResult::SUCCESS;
+    RefPtr<gfxPattern> pattern;
+    Tie(result, pattern) =
+      server->GetPaintServerPattern(aTarget, aDrawTarget,
+                                    aContextMatrix, &nsStyleSVG::mFill, 1.0,
+                                    &overrideBounds);
 
     if (!pattern)
       return nullptr;
 
     // pattern is now set up to fill aPaintServerSize. But we want it to
     // fill aRenderSize, so we need to add a scaling transform.
     // We couldn't just have set overrideBounds to aRenderSize - it would have
     // worked for gradients, but for patterns it would result in a different
--- a/layout/svg/nsSVGMaskFrame.cpp
+++ b/layout/svg/nsSVGMaskFrame.cpp
@@ -247,34 +247,31 @@ nsSVGMaskFrame::GetMaskForMaskedFrame(Ma
     context->CurrentMatrix() * gfxMatrix::Translation(-maskSurfaceRect.TopLeft());
 
   RefPtr<gfxContext> tmpCtx = gfxContext::CreateOrNull(maskDT);
   MOZ_ASSERT(tmpCtx); // already checked the draw target above
   tmpCtx->SetMatrix(maskSurfaceMatrix);
 
   mMatrixForChildren = GetMaskTransform(aParams.maskedFrame) *
                        aParams.toUserSpace;
-  DrawResult result;
+  DrawResult result = DrawResult::SUCCESS;
 
   for (nsIFrame* kid = mFrames.FirstChild(); kid;
        kid = kid->GetNextSibling()) {
     // The CTM of each frame referencing us can be different
     nsISVGChildFrame* SVGFrame = do_QueryFrame(kid);
     if (SVGFrame) {
       SVGFrame->NotifySVGChanged(nsISVGChildFrame::TRANSFORM_CHANGED);
     }
     gfxMatrix m = mMatrixForChildren;
     if (kid->GetContent()->IsSVGElement()) {
       m = static_cast<nsSVGElement*>(kid->GetContent())->
             PrependLocalTransformsTo(m, eUserSpaceToParent);
     }
-    result = nsSVGUtils::PaintFrameWithEffects(kid, *tmpCtx, m);
-    if (result != DrawResult::SUCCESS) {
-      return MakePair(result, RefPtr<SourceSurface>());
-    }
+    result &= nsSVGUtils::PaintFrameWithEffects(kid, *tmpCtx, m);
   }
 
   RefPtr<SourceSurface> maskSnapshot = maskDT->Snapshot();
   if (!maskSnapshot) {
     return MakePair(DrawResult::TEMPORARY_ERROR, RefPtr<SourceSurface>());
   }
   RefPtr<DataSourceSurface> maskSurface = maskSnapshot->GetDataSurface();
   DataSourceSurface::MappedSurface map;
@@ -318,22 +315,22 @@ nsSVGMaskFrame::GetMaskForMaskedFrame(Ma
                      maskSurfaceSize, aParams.opacity);
   }
 
   maskSurface->Unmap();
   destMaskSurface->Unmap();
 
   // Moz2D transforms in the opposite direction to Thebes
   if (!maskSurfaceMatrix.Invert()) {
-    return MakePair(DrawResult::TEMPORARY_ERROR, RefPtr<SourceSurface>());
+    return MakePair(DrawResult::SUCCESS, RefPtr<SourceSurface>());
   }
 
   *aParams.maskTransform = ToMatrix(maskSurfaceMatrix);
   RefPtr<SourceSurface> surface = destMaskSurface.forget();
-  return MakePair(DrawResult::SUCCESS, Move(surface));
+  return MakePair(result, Move(surface));
 }
 
 gfxRect
 nsSVGMaskFrame::GetMaskArea(nsIFrame* aMaskedFrame)
 {
   SVGMaskElement *maskElem = static_cast<SVGMaskElement*>(mContent);
 
   uint16_t units =
--- a/layout/svg/nsSVGPaintServerFrame.h
+++ b/layout/svg/nsSVGPaintServerFrame.h
@@ -25,16 +25,17 @@ class gfxPattern;
 class nsStyleContext;
 
 struct gfxRect;
 
 class nsSVGPaintServerFrame : public nsSVGContainerFrame
 {
 protected:
   typedef mozilla::gfx::DrawTarget DrawTarget;
+  typedef mozilla::image::DrawResult DrawResult;
 
   explicit nsSVGPaintServerFrame(nsStyleContext* aContext)
     : nsSVGContainerFrame(aContext)
   {
     AddStateBits(NS_FRAME_IS_NONDISPLAY);
   }
 
 public:
@@ -43,17 +44,17 @@ public:
   /**
    * Constructs a gfxPattern of the paint server rendering.
    *
    * @param aContextMatrix The transform matrix that is currently applied to
    *   the gfxContext that is being drawn to. This is needed by SVG patterns so
    *   that surfaces of the correct size can be created. (SVG gradients are
    *   vector based, so it's not used there.)
    */
-  virtual already_AddRefed<gfxPattern>
+  virtual mozilla::Pair<DrawResult, RefPtr<gfxPattern>>
     GetPaintServerPattern(nsIFrame *aSource,
                           const DrawTarget* aDrawTarget,
                           const gfxMatrix& aContextMatrix,
                           nsStyleSVGPaint nsStyleSVG::*aFillOrStroke,
                           float aOpacity,
                           const gfxRect *aOverrideBounds = nullptr) = 0;
 
   // nsIFrame methods:
--- a/layout/svg/nsSVGPatternFrame.cpp
+++ b/layout/svg/nsSVGPatternFrame.cpp
@@ -225,17 +225,17 @@ GetTargetGeometry(gfxRect *aBBox,
   float scale = MaxExpansion(aContextMatrix);
   if (scale <= 0) {
     return NS_ERROR_FAILURE;
   }
   aBBox->Scale(scale);
   return NS_OK;
 }
 
-already_AddRefed<SourceSurface>
+mozilla::Pair<DrawResult, RefPtr<SourceSurface>>
 nsSVGPatternFrame::PaintPattern(const DrawTarget* aDrawTarget,
                                 Matrix* patternMatrix,
                                 const Matrix &aContextMatrix,
                                 nsIFrame *aSource,
                                 nsStyleSVGPaint nsStyleSVG::*aFillOrStroke,
                                 float aGraphicOpacity,
                                 const gfxRect *aOverrideBounds)
 {
@@ -248,17 +248,18 @@ nsSVGPatternFrame::PaintPattern(const Dr
    *    Calculate the content transformation matrix
    *    Get our children (we may need to get them from another Pattern)
    *    Call SVGPaint on all of our children
    *    Return
    */
 
   nsSVGPatternFrame* patternWithChildren = GetPatternWithChildren();
   if (!patternWithChildren) {
-    return nullptr; // Either no kids or a bad reference
+    // Either no kids or a bad reference
+    return MakePair(DrawResult::SUCCESS, RefPtr<SourceSurface>());
   }
   nsIFrame* firstKid = patternWithChildren->mFrames.FirstChild();
 
   const nsSVGViewBox& viewBox = GetViewBox();
 
   uint16_t patternContentUnits =
     GetEnumValue(SVGPatternElement::PATTERNCONTENTUNITS);
   uint16_t patternUnits =
@@ -287,76 +288,76 @@ nsSVGPatternFrame::PaintPattern(const Dr
   // the geometry that is being rendered with a pattern
   gfxRect callerBBox;
   if (NS_FAILED(GetTargetGeometry(&callerBBox,
                                   viewBox,
                                   patternContentUnits, patternUnits,
                                   aSource,
                                   aContextMatrix,
                                   aOverrideBounds))) {
-    return nullptr;
+    return MakePair(DrawResult::SUCCESS, RefPtr<SourceSurface>());
   }
 
   // Construct the CTM that we will provide to our children when we
   // render them into the tile.
   gfxMatrix ctm = ConstructCTM(viewBox, patternContentUnits, patternUnits,
                                callerBBox, aContextMatrix, aSource);
   if (ctm.IsSingular()) {
-    return nullptr;
+    return MakePair(DrawResult::SUCCESS, RefPtr<SourceSurface>());
   }
 
   if (patternWithChildren->mCTM) {
     *patternWithChildren->mCTM = ctm;
   } else {
     patternWithChildren->mCTM = new gfxMatrix(ctm);
   }
 
   // Get the bounding box of the pattern.  This will be used to determine
   // the size of the surface, and will also be used to define the bounding
   // box for the pattern tile.
   gfxRect bbox = GetPatternRect(patternUnits, callerBBox, aContextMatrix, aSource);
   if (bbox.Width() <= 0.0 || bbox.Height() <= 0.0) {
-    return nullptr;
+    return MakePair(DrawResult::SUCCESS, RefPtr<SourceSurface>());
   }
 
   // Get the pattern transform
   Matrix patternTransform = ToMatrix(GetPatternTransform());
 
   // revert the vector effect transform so that the pattern appears unchanged
   if (aFillOrStroke == &nsStyleSVG::mStroke) {
     gfxMatrix userToOuterSVG;
     if (nsSVGUtils::GetNonScalingStrokeTransform(aSource, &userToOuterSVG)) {
       patternTransform *= ToMatrix(userToOuterSVG);
       if (patternTransform.IsSingular()) {
         NS_WARNING("Singular matrix painting non-scaling-stroke");
-        return nullptr;
+        return MakePair(DrawResult::SUCCESS, RefPtr<SourceSurface>());
       }
     }
   }
 
   // Get the transformation matrix that we will hand to the renderer's pattern
   // routine.
   *patternMatrix = GetPatternMatrix(patternUnits, patternTransform,
                                     bbox, callerBBox, aContextMatrix);
   if (patternMatrix->IsSingular()) {
-    return nullptr;
+    return MakePair(DrawResult::SUCCESS, RefPtr<SourceSurface>());
   }
 
   // Now that we have all of the necessary geometries, we can
   // create our surface.
   gfxRect transformedBBox = ThebesRect(patternTransform.TransformBounds(ToRect(bbox)));
 
   bool resultOverflows;
   IntSize surfaceSize =
     nsSVGUtils::ConvertToSurfaceSize(
       transformedBBox.Size(), &resultOverflows);
 
   // 0 disables rendering, < 0 is an error
   if (surfaceSize.width <= 0 || surfaceSize.height <= 0) {
-    return nullptr;
+    return MakePair(DrawResult::SUCCESS, RefPtr<SourceSurface>());
   }
 
   gfxFloat patternWidth = bbox.Width();
   gfxFloat patternHeight = bbox.Height();
 
   if (resultOverflows ||
       patternWidth != surfaceSize.width ||
       patternHeight != surfaceSize.height) {
@@ -370,17 +371,17 @@ nsSVGPatternFrame::PaintPattern(const Dr
     // and rescale pattern to compensate
     patternMatrix->PreScale(patternWidth / surfaceSize.width,
                             patternHeight / surfaceSize.height);
   }
 
   RefPtr<DrawTarget> dt =
     aDrawTarget->CreateSimilarDrawTarget(surfaceSize, SurfaceFormat::B8G8R8A8);
   if (!dt || !dt->IsValid()) {
-    return nullptr;
+    return MakePair(DrawResult::TEMPORARY_ERROR, RefPtr<SourceSurface>());
   }
   dt->ClearRect(Rect(0, 0, surfaceSize.width, surfaceSize.height));
 
   RefPtr<gfxContext> gfx = gfxContext::CreateOrNull(dt);
   MOZ_ASSERT(gfx); // already checked the draw target above
 
   if (aGraphicOpacity != 1.0f) {
     gfx->Save();
@@ -393,47 +394,48 @@ nsSVGPatternFrame::PaintPattern(const Dr
 
   if (aSource->IsFrameOfType(nsIFrame::eSVGGeometry)) {
     // Set the geometrical parent of the pattern we are rendering
     patternWithChildren->mSource = static_cast<SVGGeometryFrame*>(aSource);
   }
 
   // Delay checking NS_FRAME_DRAWING_AS_PAINTSERVER bit until here so we can
   // give back a clear surface if there's a loop
+  DrawResult result = DrawResult::SUCCESS;
   if (!(patternWithChildren->GetStateBits() & NS_FRAME_DRAWING_AS_PAINTSERVER)) {
     patternWithChildren->AddStateBits(NS_FRAME_DRAWING_AS_PAINTSERVER);
     for (nsIFrame* kid = firstKid; kid;
          kid = kid->GetNextSibling()) {
       // The CTM of each frame referencing us can be different
       nsISVGChildFrame* SVGFrame = do_QueryFrame(kid);
       if (SVGFrame) {
         SVGFrame->NotifySVGChanged(nsISVGChildFrame::TRANSFORM_CHANGED);
       }
       gfxMatrix tm = *(patternWithChildren->mCTM);
       if (kid->GetContent()->IsSVGElement()) {
         tm = static_cast<nsSVGElement*>(kid->GetContent())->
                PrependLocalTransformsTo(tm, eUserSpaceToParent);
       }
-      DrawResult result = nsSVGUtils::PaintFrameWithEffects(kid, *gfx, tm);
-      if (result != DrawResult::SUCCESS) {
-        return nullptr;
-      }
+
+      result &= nsSVGUtils::PaintFrameWithEffects(kid, *gfx, tm);
     }
+
     patternWithChildren->RemoveStateBits(NS_FRAME_DRAWING_AS_PAINTSERVER);
   }
 
   patternWithChildren->mSource = nullptr;
 
   if (aGraphicOpacity != 1.0f) {
     gfx->PopGroupAndBlend();
     gfx->Restore();
   }
 
   // caller now owns the surface
-  return dt->Snapshot();
+  RefPtr<SourceSurface> surf = dt->Snapshot();
+  return MakePair(result, Move(surf));
 }
 
 /* Will probably need something like this... */
 // How do we handle the insertion of a new frame?
 // We really don't want to rerender this every time,
 // do we?
 nsSVGPatternFrame*
 nsSVGPatternFrame::GetPatternWithChildren()
@@ -702,47 +704,49 @@ nsSVGPatternFrame::ConstructCTM(const ns
     viewBoxRect.width, viewBoxRect.height,
     GetPreserveAspectRatio());
 
   return ThebesMatrix(tm);
 }
 
 //----------------------------------------------------------------------
 // nsSVGPaintServerFrame methods:
-
-already_AddRefed<gfxPattern>
+mozilla::Pair<DrawResult, RefPtr<gfxPattern>>
 nsSVGPatternFrame::GetPaintServerPattern(nsIFrame *aSource,
                                          const DrawTarget* aDrawTarget,
                                          const gfxMatrix& aContextMatrix,
                                          nsStyleSVGPaint nsStyleSVG::*aFillOrStroke,
                                          float aGraphicOpacity,
                                          const gfxRect *aOverrideBounds)
 {
   if (aGraphicOpacity == 0.0f) {
     RefPtr<gfxPattern> pattern = new gfxPattern(Color());
-    return pattern.forget();
+    return MakePair(DrawResult::SUCCESS, Move(pattern));
   }
 
   // Paint it!
   Matrix pMatrix;
-  RefPtr<SourceSurface> surface =
+  RefPtr<SourceSurface> surface;
+  DrawResult result = DrawResult::SUCCESS;
+  Tie(result, surface) =
     PaintPattern(aDrawTarget, &pMatrix, ToMatrix(aContextMatrix), aSource,
                  aFillOrStroke, aGraphicOpacity, aOverrideBounds);
 
   if (!surface) {
-    return nullptr;
+    return MakePair(result, RefPtr<gfxPattern>());
   }
 
   RefPtr<gfxPattern> pattern = new gfxPattern(surface, pMatrix);
 
-  if (!pattern || pattern->CairoStatus())
-    return nullptr;
+  if (!pattern || pattern->CairoStatus()) {
+    return MakePair(DrawResult::TEMPORARY_ERROR, RefPtr<gfxPattern>());
+  }
 
   pattern->SetExtend(ExtendMode::REPEAT);
-  return pattern.forget();
+  return MakePair(result, Move(pattern));
 }
 
 // -------------------------------------------------------------------------
 // Public functions
 // -------------------------------------------------------------------------
 
 nsIFrame* NS_NewSVGPatternFrame(nsIPresShell*   aPresShell,
                                 nsStyleContext* aContext)
--- a/layout/svg/nsSVGPatternFrame.h
+++ b/layout/svg/nsSVGPatternFrame.h
@@ -35,17 +35,17 @@ public:
   NS_DECL_FRAMEARENA_HELPERS
 
   friend nsIFrame* NS_NewSVGPatternFrame(nsIPresShell* aPresShell,
                                          nsStyleContext* aContext);
 
   explicit nsSVGPatternFrame(nsStyleContext* aContext);
 
   // nsSVGPaintServerFrame methods:
-  virtual already_AddRefed<gfxPattern>
+  virtual mozilla::Pair<DrawResult, RefPtr<gfxPattern>>
     GetPaintServerPattern(nsIFrame *aSource,
                           const DrawTarget* aDrawTarget,
                           const gfxMatrix& aContextMatrix,
                           nsStyleSVGPaint nsStyleSVG::*aFillOrStroke,
                           float aOpacity,
                           const gfxRect *aOverrideBounds) override;
 
 public:
@@ -103,17 +103,17 @@ protected:
     return GetPreserveAspectRatio(mContent);
   }
   const nsSVGLength2 *GetLengthValue(uint32_t aIndex, nsIContent *aDefault);
   const nsSVGLength2 *GetLengthValue(uint32_t aIndex)
   {
     return GetLengthValue(aIndex, mContent);
   }
 
-  already_AddRefed<SourceSurface>
+  mozilla::Pair<DrawResult, RefPtr<SourceSurface>>
   PaintPattern(const DrawTarget* aDrawTarget,
                Matrix *patternMatrix,
                const Matrix &aContextMatrix,
                nsIFrame *aSource,
                nsStyleSVGPaint nsStyleSVG::*aFillOrStroke,
                float aGraphicOpacity,
                const gfxRect *aOverrideBounds);
 
--- a/layout/svg/nsSVGUtils.cpp
+++ b/layout/svg/nsSVGUtils.cpp
@@ -1445,25 +1445,25 @@ nsSVGUtils::GetFallbackOrPaintColor(nsSt
       nscolor colors[2] = { color, paintIfVisited.GetColor() };
       return nsStyleContext::CombineVisitedColors(
                colors, aStyleContext->RelevantLinkVisited());
     }
   }
   return color;
 }
 
-/* static */ void
+/* static */ DrawResult
 nsSVGUtils::MakeFillPatternFor(nsIFrame* aFrame,
                                gfxContext* aContext,
                                GeneralPattern* aOutPattern,
                                SVGContextPaint* aContextPaint)
 {
   const nsStyleSVG* style = aFrame->StyleSVG();
   if (style->mFill.Type() == eStyleSVGPaintType_None) {
-    return;
+    return DrawResult::SUCCESS;
   }
 
   const float opacity = aFrame->StyleEffects()->mOpacity;
 
   float fillOpacity = GetOpacity(style->FillOpacitySource(),
                                  style->mFillOpacity,
                                  aContextPaint);
   if (opacity < 1.0f &&
@@ -1473,65 +1473,71 @@ nsSVGUtils::MakeFillPatternFor(nsIFrame*
     fillOpacity *= opacity;