merge autoland to mozilla-central a=merge
authorCarsten "Tomcat" Book <cbook@mozilla.com>
Tue, 16 May 2017 12:33:48 +0200
changeset 358524 49365d675cbb2a8368cda3e4858a2a0d0634c249
parent 358469 5e81f95116344b68975ac5aba30a8bb9eeae6b32 (current diff)
parent 358523 bd4e12a3fed9a082fde9f54e2093dd81af078951 (diff)
child 358567 b9a4a6e2292e923684c2d25b78addaca23c6abd5
push id31827
push usercbook@mozilla.com
push dateTue, 16 May 2017 10:34:19 +0000
treeherdermozilla-central@49365d675cbb [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
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 autoland to mozilla-central a=merge
browser/components/customizableui/CustomizableWidgets.jsm
build/autoconf/jemalloc.m4
layout/reftests/css-gradients/aja-linear-1g.html
layout/reftests/css-gradients/aja-linear-2a.html
layout/reftests/css-gradients/aja-linear-2b.html
layout/reftests/css-gradients/aja-linear-2c.html
layout/reftests/css-gradients/aja-linear-2d.html
layout/reftests/css-gradients/aja-linear-6-ref.html
layout/reftests/css-gradients/aja-linear-6a.html
layout/reftests/css-gradients/aja-linear-6b.html
layout/reftests/css-gradients/linear-1b.html
layout/reftests/css-gradients/linear-diagonal-1b.html
layout/reftests/css-gradients/linear-diagonal-1c.html
layout/reftests/css-gradients/linear-diagonal-2b.html
layout/reftests/css-gradients/linear-diagonal-2c.html
layout/reftests/css-gradients/linear-diagonal-3b.html
layout/reftests/css-gradients/linear-diagonal-3c.html
layout/reftests/css-gradients/linear-diagonal-4b.html
layout/reftests/css-gradients/linear-diagonal-4c.html
layout/reftests/css-gradients/linear-diagonal-5-ref.html
layout/reftests/css-gradients/linear-diagonal-5a.html
layout/reftests/css-gradients/linear-diagonal-6-ref.html
layout/reftests/css-gradients/linear-diagonal-6a.html
layout/reftests/css-gradients/linear-diagonal-7-ref.html
layout/reftests/css-gradients/linear-diagonal-7a.html
layout/reftests/css-gradients/linear-diagonal-8-ref.html
layout/reftests/css-gradients/linear-diagonal-8a.html
layout/reftests/css-gradients/linear-diagonal-9-ref.html
layout/reftests/css-gradients/linear-diagonal-9a.html
layout/reftests/css-gradients/linear-keywords-1b.html
layout/reftests/css-gradients/linear-mix-ref.html
layout/reftests/css-gradients/linear-mix.html
layout/reftests/css-gradients/linear-percent-ref.html
layout/reftests/css-gradients/linear-percent.html
layout/reftests/css-gradients/linear-vertical-1e.html
layout/reftests/css-gradients/linear-zero-length-1-ref.html
layout/reftests/css-gradients/linear-zero-length-1a.html
layout/reftests/css-gradients/linear-zero-length-1b.html
layout/reftests/css-gradients/linear-zero-length-1c.html
layout/reftests/css-gradients/radial-1c.html
layout/reftests/css-gradients/radial-2e.html
layout/reftests/css-gradients/radial-2f.html
layout/reftests/css-gradients/radial-onestopposition-1c.html
layout/reftests/css-gradients/radial-shape-closest-corner-1c.html
layout/reftests/css-gradients/radial-shape-closest-side-1c.html
layout/reftests/css-gradients/radial-shape-farthest-corner-1c.html
layout/reftests/css-gradients/radial-shape-farthest-side-1c.html
layout/reftests/css-gradients/radial-zero-length-1g.html
layout/reftests/css-gradients/radial-zero-length-1h.html
layout/reftests/css-gradients/radial-zero-length-1i.html
layout/reftests/css-gradients/radial-zero-length-1j.html
layout/reftests/css-gradients/repeating-radial-1e.html
layout/reftests/css-gradients/repeating-radial-1f.html
layout/reftests/css-gradients/repeating-radial-onestopposition-1c.html
layout/reftests/css-gradients/twostops-1f.html
layout/reftests/css-gradients/twostops-1g.html
memory/build/mozjemalloc_compat.c
memory/jemalloc/README.mozilla
memory/jemalloc/helper/git
memory/jemalloc/moz.build
memory/jemalloc/src/.appveyor.yml
memory/jemalloc/src/.travis.yml
memory/jemalloc/src/COPYING
memory/jemalloc/src/ChangeLog
memory/jemalloc/src/INSTALL
memory/jemalloc/src/Makefile.in
memory/jemalloc/src/README
memory/jemalloc/src/VERSION
memory/jemalloc/src/autogen.sh
memory/jemalloc/src/bin/jemalloc-config.in
memory/jemalloc/src/bin/jemalloc.sh.in
memory/jemalloc/src/bin/jeprof.in
memory/jemalloc/src/build-aux/config.guess
memory/jemalloc/src/build-aux/config.sub
memory/jemalloc/src/build-aux/install-sh
memory/jemalloc/src/config.stamp.in
memory/jemalloc/src/configure
memory/jemalloc/src/configure.ac
memory/jemalloc/src/coverage.sh
memory/jemalloc/src/doc/html.xsl.in
memory/jemalloc/src/doc/jemalloc.xml.in
memory/jemalloc/src/doc/manpages.xsl.in
memory/jemalloc/src/doc/stylesheet.xsl
memory/jemalloc/src/include/jemalloc/internal/arena.h
memory/jemalloc/src/include/jemalloc/internal/assert.h
memory/jemalloc/src/include/jemalloc/internal/atomic.h
memory/jemalloc/src/include/jemalloc/internal/base.h
memory/jemalloc/src/include/jemalloc/internal/bitmap.h
memory/jemalloc/src/include/jemalloc/internal/chunk.h
memory/jemalloc/src/include/jemalloc/internal/chunk_dss.h
memory/jemalloc/src/include/jemalloc/internal/chunk_mmap.h
memory/jemalloc/src/include/jemalloc/internal/ckh.h
memory/jemalloc/src/include/jemalloc/internal/ctl.h
memory/jemalloc/src/include/jemalloc/internal/extent.h
memory/jemalloc/src/include/jemalloc/internal/hash.h
memory/jemalloc/src/include/jemalloc/internal/huge.h
memory/jemalloc/src/include/jemalloc/internal/jemalloc_internal.h.in
memory/jemalloc/src/include/jemalloc/internal/jemalloc_internal_decls.h
memory/jemalloc/src/include/jemalloc/internal/jemalloc_internal_defs.h.in
memory/jemalloc/src/include/jemalloc/internal/jemalloc_internal_macros.h
memory/jemalloc/src/include/jemalloc/internal/mb.h
memory/jemalloc/src/include/jemalloc/internal/mutex.h
memory/jemalloc/src/include/jemalloc/internal/nstime.h
memory/jemalloc/src/include/jemalloc/internal/pages.h
memory/jemalloc/src/include/jemalloc/internal/ph.h
memory/jemalloc/src/include/jemalloc/internal/private_namespace.sh
memory/jemalloc/src/include/jemalloc/internal/private_symbols.txt
memory/jemalloc/src/include/jemalloc/internal/private_unnamespace.sh
memory/jemalloc/src/include/jemalloc/internal/prng.h
memory/jemalloc/src/include/jemalloc/internal/prof.h
memory/jemalloc/src/include/jemalloc/internal/public_namespace.sh
memory/jemalloc/src/include/jemalloc/internal/public_unnamespace.sh
memory/jemalloc/src/include/jemalloc/internal/ql.h
memory/jemalloc/src/include/jemalloc/internal/qr.h
memory/jemalloc/src/include/jemalloc/internal/quarantine.h
memory/jemalloc/src/include/jemalloc/internal/rb.h
memory/jemalloc/src/include/jemalloc/internal/rtree.h
memory/jemalloc/src/include/jemalloc/internal/size_classes.sh
memory/jemalloc/src/include/jemalloc/internal/smoothstep.h
memory/jemalloc/src/include/jemalloc/internal/smoothstep.sh
memory/jemalloc/src/include/jemalloc/internal/spin.h
memory/jemalloc/src/include/jemalloc/internal/stats.h
memory/jemalloc/src/include/jemalloc/internal/tcache.h
memory/jemalloc/src/include/jemalloc/internal/ticker.h
memory/jemalloc/src/include/jemalloc/internal/tsd.h
memory/jemalloc/src/include/jemalloc/internal/util.h
memory/jemalloc/src/include/jemalloc/internal/valgrind.h
memory/jemalloc/src/include/jemalloc/internal/witness.h
memory/jemalloc/src/include/jemalloc/jemalloc.sh
memory/jemalloc/src/include/jemalloc/jemalloc_defs.h.in
memory/jemalloc/src/include/jemalloc/jemalloc_macros.h.in
memory/jemalloc/src/include/jemalloc/jemalloc_mangle.sh
memory/jemalloc/src/include/jemalloc/jemalloc_protos.h.in
memory/jemalloc/src/include/jemalloc/jemalloc_rename.sh
memory/jemalloc/src/include/jemalloc/jemalloc_typedefs.h.in
memory/jemalloc/src/include/msvc_compat/C99/stdbool.h
memory/jemalloc/src/include/msvc_compat/C99/stdint.h
memory/jemalloc/src/include/msvc_compat/strings.h
memory/jemalloc/src/include/msvc_compat/windows_extra.h
memory/jemalloc/src/jemalloc.pc.in
memory/jemalloc/src/msvc/ReadMe.txt
memory/jemalloc/src/msvc/jemalloc_vc2015.sln
memory/jemalloc/src/msvc/projects/vc2015/jemalloc/jemalloc.vcxproj
memory/jemalloc/src/msvc/projects/vc2015/jemalloc/jemalloc.vcxproj.filters
memory/jemalloc/src/msvc/projects/vc2015/test_threads/test_threads.cpp
memory/jemalloc/src/msvc/projects/vc2015/test_threads/test_threads.h
memory/jemalloc/src/msvc/projects/vc2015/test_threads/test_threads.vcxproj
memory/jemalloc/src/msvc/projects/vc2015/test_threads/test_threads.vcxproj.filters
memory/jemalloc/src/msvc/projects/vc2015/test_threads/test_threads_main.cpp
memory/jemalloc/src/scripts/gen_travis.py
memory/jemalloc/src/src/arena.c
memory/jemalloc/src/src/atomic.c
memory/jemalloc/src/src/base.c
memory/jemalloc/src/src/bitmap.c
memory/jemalloc/src/src/chunk.c
memory/jemalloc/src/src/chunk_dss.c
memory/jemalloc/src/src/chunk_mmap.c
memory/jemalloc/src/src/ckh.c
memory/jemalloc/src/src/ctl.c
memory/jemalloc/src/src/extent.c
memory/jemalloc/src/src/hash.c
memory/jemalloc/src/src/huge.c
memory/jemalloc/src/src/jemalloc.c
memory/jemalloc/src/src/mb.c
memory/jemalloc/src/src/mutex.c
memory/jemalloc/src/src/nstime.c
memory/jemalloc/src/src/pages.c
memory/jemalloc/src/src/prng.c
memory/jemalloc/src/src/prof.c
memory/jemalloc/src/src/quarantine.c
memory/jemalloc/src/src/rtree.c
memory/jemalloc/src/src/spin.c
memory/jemalloc/src/src/stats.c
memory/jemalloc/src/src/tcache.c
memory/jemalloc/src/src/ticker.c
memory/jemalloc/src/src/tsd.c
memory/jemalloc/src/src/util.c
memory/jemalloc/src/src/valgrind.c
memory/jemalloc/src/src/witness.c
memory/jemalloc/src/src/zone.c
memory/jemalloc/src/test/include/test/SFMT-alti.h
memory/jemalloc/src/test/include/test/SFMT-params.h
memory/jemalloc/src/test/include/test/SFMT-params11213.h
memory/jemalloc/src/test/include/test/SFMT-params1279.h
memory/jemalloc/src/test/include/test/SFMT-params132049.h
memory/jemalloc/src/test/include/test/SFMT-params19937.h
memory/jemalloc/src/test/include/test/SFMT-params216091.h
memory/jemalloc/src/test/include/test/SFMT-params2281.h
memory/jemalloc/src/test/include/test/SFMT-params4253.h
memory/jemalloc/src/test/include/test/SFMT-params44497.h
memory/jemalloc/src/test/include/test/SFMT-params607.h
memory/jemalloc/src/test/include/test/SFMT-params86243.h
memory/jemalloc/src/test/include/test/SFMT-sse2.h
memory/jemalloc/src/test/include/test/SFMT.h
memory/jemalloc/src/test/include/test/btalloc.h
memory/jemalloc/src/test/include/test/jemalloc_test.h.in
memory/jemalloc/src/test/include/test/jemalloc_test_defs.h.in
memory/jemalloc/src/test/include/test/math.h
memory/jemalloc/src/test/include/test/mq.h
memory/jemalloc/src/test/include/test/mtx.h
memory/jemalloc/src/test/include/test/test.h
memory/jemalloc/src/test/include/test/thd.h
memory/jemalloc/src/test/include/test/timer.h
memory/jemalloc/src/test/integration/MALLOCX_ARENA.c
memory/jemalloc/src/test/integration/aligned_alloc.c
memory/jemalloc/src/test/integration/allocated.c
memory/jemalloc/src/test/integration/chunk.c
memory/jemalloc/src/test/integration/chunk.sh
memory/jemalloc/src/test/integration/mallocx.c
memory/jemalloc/src/test/integration/mallocx.sh
memory/jemalloc/src/test/integration/overflow.c
memory/jemalloc/src/test/integration/posix_memalign.c
memory/jemalloc/src/test/integration/rallocx.c
memory/jemalloc/src/test/integration/sdallocx.c
memory/jemalloc/src/test/integration/thread_arena.c
memory/jemalloc/src/test/integration/thread_tcache_enabled.c
memory/jemalloc/src/test/integration/xallocx.c
memory/jemalloc/src/test/integration/xallocx.sh
memory/jemalloc/src/test/src/SFMT.c
memory/jemalloc/src/test/src/btalloc.c
memory/jemalloc/src/test/src/btalloc_0.c
memory/jemalloc/src/test/src/btalloc_1.c
memory/jemalloc/src/test/src/math.c
memory/jemalloc/src/test/src/mq.c
memory/jemalloc/src/test/src/mtx.c
memory/jemalloc/src/test/src/test.c
memory/jemalloc/src/test/src/thd.c
memory/jemalloc/src/test/src/timer.c
memory/jemalloc/src/test/stress/microbench.c
memory/jemalloc/src/test/test.sh.in
memory/jemalloc/src/test/unit/SFMT.c
memory/jemalloc/src/test/unit/a0.c
memory/jemalloc/src/test/unit/arena_reset.c
memory/jemalloc/src/test/unit/arena_reset.sh
memory/jemalloc/src/test/unit/atomic.c
memory/jemalloc/src/test/unit/bitmap.c
memory/jemalloc/src/test/unit/ckh.c
memory/jemalloc/src/test/unit/decay.c
memory/jemalloc/src/test/unit/decay.sh
memory/jemalloc/src/test/unit/extent_quantize.c
memory/jemalloc/src/test/unit/fork.c
memory/jemalloc/src/test/unit/hash.c
memory/jemalloc/src/test/unit/junk.c
memory/jemalloc/src/test/unit/junk.sh
memory/jemalloc/src/test/unit/junk_alloc.c
memory/jemalloc/src/test/unit/junk_alloc.sh
memory/jemalloc/src/test/unit/junk_free.c
memory/jemalloc/src/test/unit/junk_free.sh
memory/jemalloc/src/test/unit/lg_chunk.c
memory/jemalloc/src/test/unit/lg_chunk.sh
memory/jemalloc/src/test/unit/mallctl.c
memory/jemalloc/src/test/unit/math.c
memory/jemalloc/src/test/unit/mq.c
memory/jemalloc/src/test/unit/mtx.c
memory/jemalloc/src/test/unit/nstime.c
memory/jemalloc/src/test/unit/pack.c
memory/jemalloc/src/test/unit/pack.sh
memory/jemalloc/src/test/unit/pages.c
memory/jemalloc/src/test/unit/ph.c
memory/jemalloc/src/test/unit/prng.c
memory/jemalloc/src/test/unit/prof_accum.c
memory/jemalloc/src/test/unit/prof_accum.sh
memory/jemalloc/src/test/unit/prof_active.c
memory/jemalloc/src/test/unit/prof_active.sh
memory/jemalloc/src/test/unit/prof_gdump.c
memory/jemalloc/src/test/unit/prof_gdump.sh
memory/jemalloc/src/test/unit/prof_idump.c
memory/jemalloc/src/test/unit/prof_idump.sh
memory/jemalloc/src/test/unit/prof_reset.c
memory/jemalloc/src/test/unit/prof_reset.sh
memory/jemalloc/src/test/unit/prof_tctx.sh
memory/jemalloc/src/test/unit/prof_thread_name.c
memory/jemalloc/src/test/unit/prof_thread_name.sh
memory/jemalloc/src/test/unit/ql.c
memory/jemalloc/src/test/unit/qr.c
memory/jemalloc/src/test/unit/quarantine.c
memory/jemalloc/src/test/unit/quarantine.sh
memory/jemalloc/src/test/unit/rb.c
memory/jemalloc/src/test/unit/rtree.c
memory/jemalloc/src/test/unit/run_quantize.c
memory/jemalloc/src/test/unit/size_classes.c
memory/jemalloc/src/test/unit/smoothstep.c
memory/jemalloc/src/test/unit/stats.c
memory/jemalloc/src/test/unit/stats_print.c
memory/jemalloc/src/test/unit/ticker.c
memory/jemalloc/src/test/unit/tsd.c
memory/jemalloc/src/test/unit/util.c
memory/jemalloc/src/test/unit/witness.c
memory/jemalloc/src/test/unit/zero.c
memory/jemalloc/src/test/unit/zero.sh
memory/jemalloc/update.sh
memory/jemalloc/upstream.info
memory/replace/jemalloc/moz.build
memory/replace/jemalloc/pthread_atfork.c
servo/components/style/binding_tools/.gitignore
servo/components/style/binding_tools/README.md
servo/components/style/binding_tools/regen_atoms.py
servo/components/style/binding_tools/setup_bindgen.sh
servo/components/style/gecko/generated/pseudo_element_helper.rs
--- a/.clang-format-ignore
+++ b/.clang-format-ignore
@@ -55,17 +55,16 @@
 ^media/libvpx/.*
 ^media/libyuv/.*
 ^media/mtransport/third_party/.*
 ^media/openmax_dl/.*
 ^media/pocketsphinx/.*
 ^media/sphinxbase/.*
 ^media/webrtc/trunk/.*
 ^media/webrtc/signaling/src/sdp/sipcc/.*
-^memory/jemalloc/src/.*
 ^mfbt/decimal/.*
 ^mfbt/double-conversion/source/.*
 ^mfbt/lz4.*
 ^mobile/android/thirdparty/.*
 ^modules/brotli/.*
 ^modules/fdlibm/.*
 ^modules/freetype2/.*
 ^modules/libbz2/.*
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -22,17 +22,16 @@ builtin(include, build/autoconf/compiler
 builtin(include, build/autoconf/expandlibs.m4)dnl
 builtin(include, build/autoconf/arch.m4)dnl
 builtin(include, build/autoconf/android.m4)dnl
 builtin(include, build/autoconf/zlib.m4)dnl
 builtin(include, build/autoconf/icu.m4)dnl
 builtin(include, build/autoconf/clang-plugin.m4)dnl
 builtin(include, build/autoconf/alloc.m4)dnl
 builtin(include, build/autoconf/ios.m4)dnl
-builtin(include, build/autoconf/jemalloc.m4)dnl
 builtin(include, build/autoconf/sanitize.m4)dnl
 
 MOZ_PROG_CHECKMSYS()
 
 # Read the user's .mozconfig script.  We can't do this in
 # configure.in: autoconf puts the argument parsing code above anything
 # expanded from configure.in, and we need to get the configure options
 # from .mozconfig in place before that argument parsing code.
--- a/browser/base/content/baseMenuOverlay.xul
+++ b/browser/base/content/baseMenuOverlay.xul
@@ -17,17 +17,17 @@
 <script type="application/javascript" src="chrome://browser/content/utilityOverlay.js"/>
 
 #ifdef XP_MACOSX
 <!-- nsMenuBarX hides these and uses them to build the Application menu.
      When using Carbon widgets for Mac OS X widgets, some of these are not
      used as they only apply to Cocoa widget builds. All version of Firefox
      through Firefox 2 will use Carbon widgets. -->
     <menupopup id="menu_ToolsPopup">
-        <menuitem id="menu_preferences" label="&preferencesCmdMac.label;" key="key_preferencesCmdMac" oncommand="openPreferences();"/>
+        <menuitem id="menu_preferences" label="&preferencesCmdMac.label;" key="key_preferencesCmdMac" oncommand="openPreferences(undefined, {origin: 'commandLineLegacy'});"/>
         <menuitem id="menu_mac_services" label="&servicesMenuMac.label;"/>
         <menuitem id="menu_mac_hide_app" label="&hideThisAppCmdMac2.label;" key="key_hideThisAppCmdMac"/>
         <menuitem id="menu_mac_hide_others" label="&hideOtherAppsCmdMac.label;" key="key_hideOtherAppsCmdMac"/>
         <menuitem id="menu_mac_show_all" label="&showAllAppsCmdMac.label;"/>
     </menupopup>
 <!-- Mac window menu -->
 #include ../../../toolkit/content/macWindowMenu.inc
 #endif
--- a/browser/base/content/browser-data-submission-info-bar.js
+++ b/browser/base/content/browser-data-submission-info-bar.js
@@ -64,19 +64,19 @@ var gDataNotificationInfoBar = {
       label: gNavigatorBundle.getString("dataReportingNotification.button.label"),
       accessKey: gNavigatorBundle.getString("dataReportingNotification.button.accessKey"),
       popup: null,
       callback: () => {
         this._actionTaken = true;
         // The advanced subpanes are only supported in the old organization, which will
         // be removed by bug 1349689.
         if (Preferences.get("browser.preferences.useOldOrganization", false)) {
-          window.openAdvancedPreferences("dataChoicesTab");
+          window.openAdvancedPreferences("dataChoicesTab", {origin: "dataReporting"});
         } else {
-          window.openPreferences("privacy-reports");
+          window.openPreferences("privacy-reports", {origin: "dataReporting"});
         }
       },
     }];
 
     this._log.info("Creating data reporting policy notification.");
     this._notificationBox.appendNotification(
       message,
       this._DATA_REPORTING_NOTIFICATION,
--- a/browser/base/content/browser-media.js
+++ b/browser/base/content/browser-media.js
@@ -162,17 +162,17 @@ var gEMEHandler = {
       Services.prefs.setBoolPref(firstPlayPref, true);
     } else {
       document.getElementById(anchorId).removeAttribute("firstplay");
     }
 
     let mainAction = {
       label: gNavigatorBundle.getString(btnLabelId),
       accessKey: gNavigatorBundle.getString(btnAccessKeyId),
-      callback() { openPreferences("panePrivacy"); },
+      callback() { openPreferences("panePrivacy", {origin: "browserMedia"}); },
       dismiss: true
     };
     let options = {
       dismissed: true,
       eventCallback: aTopic => aTopic == "swapping",
       learnMoreURL: Services.urlFormatter.formatURLPref("app.support.baseURL") + "drm-content",
     };
     PopupNotifications.show(browser, "drmContentPlaying", message, anchorId, mainAction, null, options);
--- a/browser/base/content/browser-menubar.inc
+++ b/browser/base/content/browser-menubar.inc
@@ -180,17 +180,17 @@
                           accesskey="&bidiSwitchTextDirectionItem.accesskey;"
                           hidden="true"/>
 #ifdef XP_UNIX
 #ifndef XP_MACOSX
                 <menuseparator/>
                 <menuitem id="menu_preferences"
                           label="&preferencesCmdUnix.label;"
                           accesskey="&preferencesCmdUnix.accesskey;"
-                          oncommand="openPreferences();"/>
+                          oncommand="openPreferences(undefined, {origin: 'menubar'});"/>
 #endif
 #endif
               </menupopup>
             </menu>
 
             <menu id="view-menu" label="&viewMenu.label;"
                   accesskey="&viewMenu.accesskey;">
               <menupopup id="menu_viewPopup"
@@ -527,17 +527,17 @@
                 <menupopup id="menu_mirrorTab-popup"
                            onpopupshowing="populateMirrorTabMenu(this)"/>
               </menu>
 #ifndef XP_UNIX
               <menuseparator id="prefSep"/>
               <menuitem id="menu_preferences"
                         label="&preferencesCmd2.label;"
                         accesskey="&preferencesCmd2.accesskey;"
-                        oncommand="openPreferences();"/>
+                        oncommand="openPreferences(undefined, {origin: 'menubar'});"/>
 #endif
               </menupopup>
             </menu>
 
 #ifdef XP_MACOSX
           <menu id="windowMenu" />
 #endif
           <menu id="helpMenu" />
--- a/browser/base/content/browser-sets.inc
+++ b/browser/base/content/browser-sets.inc
@@ -88,17 +88,17 @@
     <command id="cmd_fullZoomReset"   oncommand="FullZoom.reset()"/>
     <command id="cmd_fullZoomToggle"  oncommand="ZoomManager.toggleZoom();"/>
     <command id="cmd_gestureRotateLeft" oncommand="gGestureSupport.rotate(event.sourceEvent)"/>
     <command id="cmd_gestureRotateRight" oncommand="gGestureSupport.rotate(event.sourceEvent)"/>
     <command id="cmd_gestureRotateEnd" oncommand="gGestureSupport.rotateEnd()"/>
     <command id="Browser:OpenLocation" oncommand="openLocation();"/>
     <command id="Browser:RestoreLastSession" oncommand="restoreLastSession();" disabled="true"/>
     <command id="Browser:NewUserContextTab" oncommand="openNewUserContextTab(event.sourceEvent);"/>
-    <command id="Browser:OpenAboutContainers" oncommand="openPreferences('paneContainers');"/>
+    <command id="Browser:OpenAboutContainers" oncommand="openPreferences('paneContainers', {origin: 'ContainersCommand'});"/>
 
     <command id="Tools:Search" oncommand="BrowserSearch.webSearch();"/>
     <command id="Tools:Downloads" oncommand="BrowserDownloadsUI();"/>
     <command id="Tools:Addons" oncommand="BrowserOpenAddonsMgr();"/>
     <command id="Tools:Sanitize"
      oncommand="Cc['@mozilla.org/browser/browserglue;1'].getService(Ci.nsIBrowserGlue).sanitize(window);"/>
     <command id="Tools:PrivateBrowsing"
       oncommand="OpenBrowserWindow({private: true});"/>
--- a/browser/base/content/browser-sync.js
+++ b/browser/base/content/browser-sync.js
@@ -236,27 +236,27 @@ var gSync = {
     if (state.syncing != syncingUI) { // Do we need to update the UI?
       state.syncing ? this.onActivityStart() : this.onActivityStop();
     }
   },
 
   onMenuPanelCommand() {
     switch (this.panelUIFooter.getAttribute("fxastatus")) {
     case "signedin":
-      this.openPrefs("menupanel");
+      this.openPrefs("menupanel", "fxaSignedin");
       break;
     case "error":
       if (this.panelUIFooter.getAttribute("fxastatus") == "unverified") {
-        this.openPrefs("menupanel");
+        this.openPrefs("menupanel", "fxaError");
       } else {
         this.openSignInAgainPage("menupanel");
       }
       break;
     default:
-      this.openPrefs("menupanel");
+      this.openPrefs("menupanel", "fxa");
       break;
     }
 
     PanelUI.hide();
   },
 
   openAccountsPage(action, urlParams = {}) {
     let params = new URLSearchParams();
@@ -434,18 +434,18 @@ var gSync = {
     }
     const state = UIState.get();
     if (state.status == UIState.STATUS_SIGNED_IN) {
       setTimeout(() => Weave.Service.errorHandler.syncAndReportErrors(), 0);
     }
     Services.obs.notifyObservers(null, "cloudsync:user-sync");
   },
 
-  openPrefs(entryPoint = "syncbutton") {
-    window.openPreferences("paneSync", { urlParams: { entrypoint: entryPoint } });
+  openPrefs(entryPoint = "syncbutton", origin = undefined) {
+    window.openPreferences("paneSync", { origin, urlParams: { entrypoint: entryPoint } });
   },
 
   openSyncedTabsPanel() {
     let placement = CustomizableUI.getPlacementOfWidget("sync-button");
     let area = placement ? placement.area : CustomizableUI.AREA_NAVBAR;
     let anchor = document.getElementById("sync-button") ||
                  document.getElementById("PanelUI-menu-button");
     if (area == CustomizableUI.AREA_PANEL) {
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -522,19 +522,19 @@ const gStoragePressureObserver = {
       buttons.push({
         label: prefStrBundle.getString(prefButtonLabelStringID),
         accessKey: prefStrBundle.getString(prefButtonAccesskeyStringID),
         callback(notificationBar, button) {
           // The advanced subpanes are only supported in the old organization, which will
           // be removed by bug 1349689.
           let win = gBrowser.ownerGlobal;
           if (Preferences.get("browser.preferences.useOldOrganization", false)) {
-            win.openAdvancedPreferences("networkTab");
+            win.openAdvancedPreferences("networkTab", {origin: "storagePressure"});
           } else {
-            win.openPreferences("panePrivacy");
+            win.openPreferences("panePrivacy", {origin: "storagePressure"});
           }
         }
       });
     }
 
     notificationBox.appendNotification(
       msg, "storage-pressure-notification", null, notificationBox.PRIORITY_WARNING_HIGH, buttons, null);
   }
@@ -6358,19 +6358,19 @@ var OfflineApps = {
       });
     }
   },
 
   manage() {
     // The advanced subpanes are only supported in the old organization, which will
     // be removed by bug 1349689.
     if (Preferences.get("browser.preferences.useOldOrganization", false)) {
-      openAdvancedPreferences("networkTab");
+      openAdvancedPreferences("networkTab", {origin: "offlineApps"});
     } else {
-      openPreferences("panePrivacy");
+      openPreferences("panePrivacy", {origin: "offlineApps"});
     }
   },
 
   receiveMessage(msg) {
     switch (msg.name) {
       case "OfflineApps:CheckUsage":
         let uri = makeURI(msg.data.uri);
         if (this._usedMoreThanWarnQuota(uri)) {
--- a/browser/base/content/utilityOverlay.js
+++ b/browser/base/content/utilityOverlay.js
@@ -710,16 +710,22 @@ function openAboutDialog() {
   } else {
     features += "centerscreen,dependent,dialog=no";
   }
 
   window.openDialog("chrome://browser/content/aboutDialog.xul", "", features);
 }
 
 function openPreferences(paneID, extraArgs) {
+  let histogram = Services.telemetry.getHistogramById("FX_PREFERENCES_OPENED_VIA");
+  if (extraArgs && extraArgs.origin) {
+    histogram.add(extraArgs.origin);
+  } else {
+    histogram.add("other");
+  }
   function switchToAdvancedSubPane(doc) {
     if (extraArgs && extraArgs["advancedTab"]) {
       let advancedPaneTabs = doc.getElementById("advancedPrefs");
       advancedPaneTabs.selectedTab = doc.getElementById(extraArgs["advancedTab"]);
     }
   }
 
   // This function is duplicated from preferences.js.
@@ -775,18 +781,18 @@ function openPreferences(paneID, extraAr
   } else {
     if (paneID) {
       browser.contentWindow.gotoPref(paneID);
     }
     switchToAdvancedSubPane(browser.contentDocument);
   }
 }
 
-function openAdvancedPreferences(tabID) {
-  openPreferences("paneAdvanced", { "advancedTab": tabID });
+function openAdvancedPreferences(tabID, origin) {
+  openPreferences("paneAdvanced", { "advancedTab": tabID, origin });
 }
 
 /**
  * Opens the troubleshooting information (about:support) page for this version
  * of the application.
  */
 function openTroubleshootingPage() {
   openUILinkIn("about:support", "tab");
--- a/browser/components/customizableui/CustomizableWidgets.jsm
+++ b/browser/components/customizableui/CustomizableWidgets.jsm
@@ -1175,17 +1175,17 @@ const CustomizableWidgets = [
     ]),
   }];
 
 let preferencesButton = {
   id: "preferences-button",
   defaultArea: CustomizableUI.AREA_PANEL,
   onCommand(aEvent) {
     let win = aEvent.target.ownerGlobal;
-    win.openPreferences();
+    win.openPreferences(undefined, {origin: "preferencesButton"});
   }
 };
 if (AppConstants.platform == "win") {
   preferencesButton.label = "preferences-button.labelWin";
   preferencesButton.tooltiptext = "preferences-button.tooltipWin2";
 } else if (AppConstants.platform == "macosx") {
   preferencesButton.tooltiptext = "preferences-button.tooltiptext.withshortcut";
   preferencesButton.shortcutId = "key_preferencesCmdMac";
--- a/browser/components/extensions/test/browser/browser_ext_tabs_executeScript_bad.js
+++ b/browser/components/extensions/test/browser/browser_ext_tabs_executeScript_bad.js
@@ -147,16 +147,19 @@ add_task(async function testMatchDataURI
     files: {
       "page.html": `<!DOCTYPE html>
         <meta charset="utf-8">
         <script src="page.js"></script>
         <iframe id="inherited" src="data:text/html;charset=utf-8,inherited"></iframe>
       `,
       "page.js": function() {
         browser.test.onMessage.addListener((msg, url) => {
+          if (msg !== "navigate") {
+            return;
+          }
           window.location.href = url;
         });
       },
     },
     background() {
       browser.tabs.create({active: true, url: browser.runtime.getURL("page.html")});
     },
   });
@@ -169,17 +172,20 @@ add_task(async function testMatchDataURI
       browser.webNavigation.onCompleted.addListener(({url, frameId}) => {
         browser.test.log(`Document loading complete: ${url}`);
         if (frameId === 0) {
           browser.test.sendMessage("tab-ready", url);
         }
       });
 
       browser.test.onMessage.addListener(async msg => {
-        browser.test.assertRejects(
+        if (msg !== "execute") {
+          return;
+        }
+        await browser.test.assertRejects(
           browser.tabs.executeScript({
             code: "location.href;",
             allFrames: true,
           }),
           /Missing host permission/,
           "Should not execute in `data:` frame");
 
         browser.test.sendMessage("done");
--- a/browser/components/newtab/NewTabSearchProvider.jsm
+++ b/browser/components/newtab/NewTabSearchProvider.jsm
@@ -66,17 +66,17 @@ SearchProvider.prototype = {
   },
 
   removeFormHistory({browser}, suggestion) {
     ContentSearch.removeFormHistoryEntry({target: browser}, suggestion);
   },
 
   manageEngines(browser) {
     const browserWin = browser.ownerGlobal;
-    browserWin.openPreferences("paneGeneral");
+    browserWin.openPreferences("paneGeneral", { origin: "contentSearch" });
   },
 
   async asyncGetState() {
     let state = await ContentSearch.currentStateObj(true);
     return state;
   },
 
   async asyncPerformSearch({browser}, searchData) {
--- a/browser/components/nsBrowserContentHandler.js
+++ b/browser/components/nsBrowserContentHandler.js
@@ -210,17 +210,22 @@ function openWindow(parent, url, target,
   argArray.appendElement(null); // charset
   argArray.appendElement(null); // referer
   argArray.appendElement(null); // postData
   argArray.appendElement(null); // allowThirdPartyFixup
 
   return Services.ww.openWindow(parent, url, target, features, argArray);
 }
 
-function openPreferences() {
+function openPreferences(extraArgs) {
+  if (extraArgs && extraArgs.origin) {
+    Services.telemetry.getHistogramById("FX_PREFERENCES_OPENED_VIA").add(extraArgs.origin);
+  } else {
+    Services.telemetry.getHistogramById("FX_PREFERENCES_OPENED_VIA").add("other");
+  }
   var args = Components.classes["@mozilla.org/array;1"]
                      .createInstance(Components.interfaces.nsIMutableArray);
 
   var wuri = Components.classes["@mozilla.org/supports-string;1"]
                        .createInstance(Components.interfaces.nsISupportsString);
   wuri.data = "about:preferences";
 
   args.appendElement(wuri);
@@ -346,17 +351,17 @@ nsBrowserContentHandler.prototype = {
     }
 
     var chromeParam = cmdLine.handleFlagWithParam("chrome", false);
     if (chromeParam) {
 
       // Handle old preference dialog URLs.
       if (chromeParam == "chrome://browser/content/pref/pref.xul" ||
           chromeParam == "chrome://browser/content/preferences/preferences.xul") {
-        openPreferences();
+        openPreferences({origin: "commandLineLegacy"});
         cmdLine.preventDefault = true;
       } else try {
         let resolvedURI = resolveURIInternal(cmdLine, chromeParam);
         let isLocal = uri => {
           let localSchemes = new Set(["chrome", "file", "resource"]);
           if (uri instanceof Components.interfaces.nsINestedURI) {
             uri = uri.QueryInterface(Components.interfaces.nsINestedURI).innerMostURI;
           }
@@ -371,17 +376,17 @@ nsBrowserContentHandler.prototype = {
           dump("*** Preventing load of web URI as chrome\n");
           dump("    If you're trying to load a webpage, do not pass --chrome.\n");
         }
       } catch (e) {
         Components.utils.reportError(e);
       }
     }
     if (cmdLine.handleFlag("preferences", false)) {
-      openPreferences();
+      openPreferences({origin: "commandLineLegacy"});
       cmdLine.preventDefault = true;
     }
     if (cmdLine.handleFlag("silent", false))
       cmdLine.preventDefault = true;
 
     try {
       var privateWindowParam = cmdLine.handleFlagWithParam("private-window", false);
       if (privateWindowParam) {
--- a/browser/components/nsBrowserGlue.js
+++ b/browser/components/nsBrowserGlue.js
@@ -303,17 +303,17 @@ BrowserGlue.prototype = {
     Cu.import("resource://services-sync/main.js");
     Weave.Service.scheduler.delayedAutoConnect(delay);
   },
 
   // nsIObserver implementation
   observe: function BG_observe(subject, topic, data) {
     switch (topic) {
       case "notifications-open-settings":
-        this._openPreferences("privacy");
+        this._openPreferences("privacy", { origin: "notifOpenSettings" });
         break;
       case "prefservice:after-app-defaults":
         this._onAppDefaults();
         break;
       case "final-ui-startup":
         this._finalUIStartup();
         break;
       case "browser-delayed-startup-finished":
@@ -1705,17 +1705,17 @@ BrowserGlue.prototype = {
     let productName = gBrandBundle.GetStringFromName("brandShortName");
     let title = bundle.GetStringFromName("syncStartNotification.title");
     let body = bundle.formatStringFromName("syncStartNotification.body2",
                                             [productName], 1);
 
     let clickCallback = (subject, topic, data) => {
       if (topic != "alertclickcallback")
         return;
-      this._openPreferences("sync");
+      this._openPreferences("sync", { origin: "doorhanger" });
     }
     AlertsService.showAlertNotification(null, title, body, true, null, clickCallback);
   },
 
   // eslint-disable-next-line complexity
   _migrateUI: function BG__migrateUI() {
     const UI_VERSION = 45;
     const BROWSER_DOCURL = "chrome://browser/content/browser.xul";
@@ -2288,17 +2288,17 @@ BrowserGlue.prototype = {
   _onDeviceDisconnected() {
     let bundle = Services.strings.createBundle("chrome://browser/locale/accounts.properties");
     let title = bundle.GetStringFromName("deviceDisconnectedNotification.title");
     let body = bundle.GetStringFromName("deviceDisconnectedNotification.body");
 
     let clickCallback = (subject, topic, data) => {
       if (topic != "alertclickcallback")
         return;
-      this._openPreferences("sync");
+      this._openPreferences("sync", { origin: "devDisconnectedAlert"});
     }
     AlertsService.showAlertNotification(null, title, body, true, null, clickCallback);
   },
 
   _handleFlashHang() {
     ++this._flashHangCount;
     if (this._flashHangCount < 2) {
       return;
--- a/browser/components/preferences/in-content-old/sync.xul
+++ b/browser/components/preferences/in-content-old/sync.xul
@@ -153,18 +153,18 @@
           <hbox id="fxaSyncEngines">
             <vbox align="start" flex="1">
               <checkbox label="&engine.tabs.label2;"
                         accesskey="&engine.tabs.accesskey;"
                         preference="engine.tabs"/>
               <checkbox label="&engine.bookmarks.label;"
                         accesskey="&engine.bookmarks.accesskey;"
                         preference="engine.bookmarks"/>
-              <checkbox label="&engine.passwords.label;"
-                        accesskey="&engine.passwords.accesskey;"
+              <checkbox label="&engine.logins.label;"
+                        accesskey="&engine.logins.accesskey;"
                         preference="engine.passwords"/>
             </vbox>
             <vbox align="start" flex="1">
               <checkbox label="&engine.history.label;"
                         accesskey="&engine.history.accesskey;"
                         preference="engine.history"/>
               <checkbox label="&engine.addons.label;"
                         accesskey="&engine.addons.accesskey;"
--- a/browser/components/preferences/in-content/sync.xul
+++ b/browser/components/preferences/in-content/sync.xul
@@ -153,18 +153,18 @@
           <hbox id="fxaSyncEngines">
             <vbox align="start" flex="1">
               <checkbox label="&engine.tabs.label2;"
                         accesskey="&engine.tabs.accesskey;"
                         preference="engine.tabs"/>
               <checkbox label="&engine.bookmarks.label;"
                         accesskey="&engine.bookmarks.accesskey;"
                         preference="engine.bookmarks"/>
-              <checkbox label="&engine.passwords.label;"
-                        accesskey="&engine.passwords.accesskey;"
+              <checkbox label="&engine.logins.label;"
+                        accesskey="&engine.logins.accesskey;"
                         preference="engine.passwords"/>
             </vbox>
             <vbox align="start" flex="1">
               <checkbox label="&engine.history.label;"
                         accesskey="&engine.history.accesskey;"
                         preference="engine.history"/>
               <checkbox label="&engine.addons.label;"
                         accesskey="&engine.addons.accesskey;"
--- a/browser/components/search/content/search.xml
+++ b/browser/components/search/content/search.xml
@@ -1455,17 +1455,17 @@
           // Make sure the engine list is refetched next time it's needed.
           this._engines = null;
         ]]></body>
       </method>
 
       <method name="showSettings">
         <body><![CDATA[
           BrowserUITelemetry.countSearchSettingsEvent(this.telemetryOrigin);
-          openPreferences("general-search");
+          openPreferences("general-search", {origin: "contentSearch"});
           // If the preference tab was already selected, the panel doesn't
           // close itself automatically.
           this.popup.hidePopup();
         ]]></body>
       </method>
 
       <!-- Updates the parts of the UI that show the query string. -->
       <method name="_updateAfterQueryChanged">
--- a/browser/components/sessionstore/SessionStore.jsm
+++ b/browser/components/sessionstore/SessionStore.jsm
@@ -2613,27 +2613,29 @@ var SessionStoreInternal = {
     }
 
     // Neither a tab nor a window was found, return undefined and let the caller decide what to do about it.
     return undefined;
   },
 
   /**
    * Updates the label and icon for a <xul:tab> using the data from
-   * tabData. If the tab being updated happens to be the
-   * customization mode tab, this function will tell the window's
-   * CustomizeMode instance about it.
+   * tabData.
    *
    * @param tab
    *        The <xul:tab> to update.
    * @param tabData (optional)
    *        The tabData to use to update the tab. If the argument is
    *        not supplied, the data will be retrieved from the cache.
    */
   updateTabLabelAndIcon(tab, tabData = null) {
+    if (tab.hasAttribute("customizemode")) {
+      return;
+    }
+
     let browser = tab.linkedBrowser;
     let win = browser.ownerGlobal;
 
     if (!tabData) {
       tabData = TabState.collect(tab);
       if (!tabData) {
         throw new Error("tabData not found for given tab");
       }
@@ -2643,18 +2645,16 @@ var SessionStoreInternal = {
 
     // If the page has a title, set it.
     if (activePageData) {
       if (activePageData.title) {
         win.gBrowser.setInitialTabTitle(tab, activePageData.title);
       } else if (activePageData.url != "about:blank") {
         win.gBrowser.setInitialTabTitle(tab, activePageData.url);
       }
-    } else if (tab.hasAttribute("customizemode")) {
-      win.gCustomizeMode.setTab(tab);
     }
 
     // Restore the tab icon.
     if ("image" in tabData) {
       // Use the serialized contentPrincipal with the new icon load.
       let loadingPrincipal = Utils.deserializePrincipal(tabData.iconLoadingPrincipal);
       win.gBrowser.setIcon(tab, tabData.image, loadingPrincipal);
       TabStateCache.update(browser, { image: null, iconLoadingPrincipal: null });
@@ -3687,16 +3687,20 @@ var SessionStoreInternal = {
       tab.__SS_lazyData = {
         url,
         title,
         userTypedValue: tabData.userTypedValue || "",
         userTypedClear: tabData.userTypedClear || 0
       };
     }
 
+    if (tab.hasAttribute("customizemode")) {
+      window.gCustomizeMode.setTab(tab);
+    }
+
     // Update tab label and icon to show something
     // while we wait for the messages to be processed.
     this.updateTabLabelAndIcon(tab, tabData);
 
     // Decrease the busy state counter after we're done.
     this._setWindowStateReady(window);
   },
 
--- a/browser/components/translation/translation-infobar.xml
+++ b/browser/components/translation/translation-infobar.xml
@@ -121,17 +121,17 @@
                            onpopupshowing="document.getBindingParent(this).optionsShowing();">
               <xul:menuitem anonid="neverForLanguage"
                             oncommand="document.getBindingParent(this).neverForLanguage();"/>
               <xul:menuitem anonid="neverForSite"
                             oncommand="document.getBindingParent(this).neverForSite();"
                             label="&translation.options.neverForSite.label;"
                             accesskey="&translation.options.neverForSite.accesskey;"/>
               <xul:menuseparator/>
-              <xul:menuitem oncommand="openPreferences('paneGeneral');"
+              <xul:menuitem oncommand="openPreferences('paneGeneral', {origin:'translationInfobar'});"
                             label="&translation.options.preferences.label;"
                             accesskey="&translation.options.preferences.accesskey;"/>
               <xul:menuitem class="subviewbutton panel-subview-footer"
                             oncommand="document.getBindingParent(this).openProviderAttribution();">
                 <xul:deck anonid="translationEngine" selectedIndex="0">
                   <xul:hbox class="translation-attribution">
                     <xul:label>&translation.options.attribution.beforeLogo;</xul:label>
                     <xul:image src="chrome://browser/content/microsoft-translator-attribution.png"
--- a/browser/components/uitour/UITour.jsm
+++ b/browser/components/uitour/UITour.jsm
@@ -531,17 +531,17 @@ this.UITour = {
       }
 
       case "openPreferences": {
         if (typeof data.pane != "string" && typeof data.pane != "undefined") {
           log.warn("openPreferences: Invalid pane specified");
           return false;
         }
 
-        window.openPreferences(data.pane);
+        window.openPreferences(data.pane, { origin: "UITour" });
         break;
       }
 
       case "showFirefoxAccounts": {
         // 'signup' is the only action that makes sense currently, so we don't
         // accept arbitrary actions just to be safe...
         let p = new URLSearchParams("action=signup&entrypoint=uitour");
         // Call our helper to validate extraURLCampaignParams and populate URLSearchParams
new file mode 100644
--- /dev/null
+++ b/browser/extensions/pocket/locale/ach/pocket.properties
@@ -0,0 +1,43 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+addtags = Med lanyut
+alreadyhaveacct = Dong itiyo ki Pocket?
+continueff = Mede ki Firefox
+errorgeneric = Bal otime i kare me temo gwoko i Pocket.
+learnmore = Nong ngec mapol
+loginnow = Dony iyie
+maxtaglength = Lageng me lanyut tye kit 25
+mustbeconnected = Myero kong i kube i intanet wek i gwoki i Pocket. Tim ber i rot kube mamegi kadong i tem doki.
+onlylinkssaved = Ki gwoko kakube keken
+pagenotsaved = Potbuk pe ononge
+pageremoved = Kikwanyo potbuk woko
+pagesaved = Kigwoko i Pocket
+processingremove = Tye ka kwanyo potbuk…
+processingtags = Tye ka medo lanyut…
+removepage = Kwany potbuk
+save = Gwoki
+saving = Tye ka gwoko…
+signupemail = Cone ki email
+signuptosave = Cone pi Pocket. Tye me nono.
+suggestedtags = Tam amia pi lanyut
+tagline = Gwok coc akwana ki vidio ki i Firefox me anena i Pocket i nyonyo mo keken, cawa mo keken.
+taglinestory_one = Dii mapeca me Pocket me gwoko coc akwana, vidio onyo potbuk mo keken ki i Firefox.
+taglinestory_two = Nen i Pocket ki i nyonyo mo keken, cawa mo keken.
+tagssaved = Kimedo lanyut
+tos = Mede anyim, nyuto ni i yee <a href="%1$S" target="_blank">Cik me tic</a> ki <a href="%2$S" target="_blank">Cik me mung pa Pocket</a>
+tryitnow = Tem kombedi
+signinfirefox = Dony iyie ki Firefox
+signupfirefox = Cone ki Firefox
+viewlist = Nen nying
+
+# LOCALIZATION NOTE(pocket-button.label, pocket-button.tooltiptext, saveToPocketCmd.label, saveLinkToPocketCmd.label, pocketMenuitem.label):
+# "Pocket" is a brand name.
+pocket-button.label = Pocket
+pocket-button.tooltiptext = Gwok i Pocket
+saveToPocketCmd.label = Gwok potbuk i Pocket
+saveToPocketCmd.accesskey = k
+saveLinkToPocketCmd.label = Gwok kakube i Pocket
+saveLinkToPocketCmd.accesskey = o
+pocketMenuitem.label = Nen nying ma i Pocket
new file mode 100644
--- /dev/null
+++ b/browser/extensions/pocket/locale/ar/pocket.properties
@@ -0,0 +1,43 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+addtags = أضف وسومًا
+alreadyhaveacct = هل تستخدم Pocket؟
+continueff = أكمل مع فَيَرفُكس
+errorgeneric = حدث عطل أثناء محاولة الحفظ في Pocket.
+learnmore = اطّلع على المزيد
+loginnow = لِج
+maxtaglength = أقصى طول للوسم ٢٥ حرفًا
+mustbeconnected = يجب أن تكون متصلًا بالإنترنت للحفظ في Pocket. رجاء راجع اتصالك ثم أعِد المحاولة.
+onlylinkssaved = لا يمكن حفظ إلا الوصلات
+pagenotsaved = لم تُحفظ الصفحة
+pageremoved = أزِيلت الصفحة
+pagesaved = حُفِظت في Pocket
+processingremove = يُزيل الصفحة…
+processingtags = يضيف الوسوم…
+removepage = أزِل الصفحة
+save = احفظ
+saving = يحفظ…
+signupemail = سجّل بالبريد الإلكتروني
+signuptosave = سجل في Pocket. مجانًا.
+suggestedtags = الوسوم المقترحة
+tagline = احفظ المقالات و الڤديو من فَيَرفُكس لعرضهم في Pocket على أي جهاز و في أي وقت.
+taglinestory_one = انقر على زر Pocket لحفظ أي مقالة أو ڤديو أو صفحة من فَيَرفُكس.
+taglinestory_two = اعرض في Pocket على أي جهاز في أي وقت.
+tagssaved = أُضيفت الوسوم
+tos = الاستمرار يعني موافقتك على <a href="%1$S" target="_blank">شروط خدمة</a> بوكِت و <a href="%2$S" target="_blank">سياسة الخصوصية</a>
+tryitnow = جرّبه الآن
+signinfirefox = لِج بفَيَرفُكس
+signupfirefox = سجّل بفَيَرفُكس
+viewlist = اعرض القائمة
+
+# LOCALIZATION NOTE(pocket-button.label, pocket-button.tooltiptext, saveToPocketCmd.label, saveLinkToPocketCmd.label, pocketMenuitem.label):
+# "Pocket" is a brand name.
+pocket-button.label = Pocket
+pocket-button.tooltiptext = احفظ في Pocket
+saveToPocketCmd.label = احفظ الصفحة في Pocket
+saveToPocketCmd.accesskey = ت
+saveLinkToPocketCmd.label = احفظ الوصلة في Pocket
+saveLinkToPocketCmd.accesskey = ص
+pocketMenuitem.label = اعرض قائمة Pocket
new file mode 100644
--- /dev/null
+++ b/browser/extensions/pocket/locale/be/pocket.properties
@@ -0,0 +1,43 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+addtags = Дадаць тэгі
+alreadyhaveacct = Ужо карыстальнік Pocket?
+continueff = Працягнуць з Firefox
+errorgeneric = Узнікла памылка пры спробе захаваць у Pocket.
+learnmore = Даведацца больш
+loginnow = Увайсці
+maxtaglength = Тэгі абмежаваныя 25 сімваламі
+mustbeconnected = Вы мусіце быць падключанымі да Інтэрнэту, каб захаваць у Pocket. Калі ласка, праверце злучэнне і паспрабуйце зноў.
+onlylinkssaved = Можна захаваць толькі спасылкі
+pagenotsaved = Старонка не захавана
+pageremoved = Старонка выдалена
+pagesaved = Захавана ў Pocket
+processingremove = Выдаленне старонкі…
+processingtags = Даданне тэгаў…
+removepage = Выдаліць старонку
+save = Захаваць
+saving = Захаванне…
+signupemail = Зарэгістравацца праз электронную пошту
+signuptosave = Зарэгістравацца ў Pocket. Гэта бясплатна.
+suggestedtags = Прапанаваныя тэгі
+tagline = Захоўвайце артыкулы і відэа з Firefox, каб глядзець іх у Pocket на любой прыладзе, у любы час.
+taglinestory_one = Націсніце кнопку Pocket, каб запісаць любы артыкул, відэа ці старонку з Firefox.
+taglinestory_two = Праглядайце ў Pocket на любой прыладзе, у любы час.
+tagssaved = Тэгі дададзены
+tos = Працягваючы, вы згаджаецеся з <a href="%1$S" target="_blank">Умовамі абслугоўвання</a> і <a href="%2$S" target="_blank">Палітыкай прыватнасці</a> Pocket
+tryitnow = Паспрабуйце зараз
+signinfirefox = Увайсці праз Firefox
+signupfirefox = Рэгістрацыя праз Firefox
+viewlist = Паглядзець спіс
+
+# LOCALIZATION NOTE(pocket-button.label, pocket-button.tooltiptext, saveToPocketCmd.label, saveLinkToPocketCmd.label, pocketMenuitem.label):
+# "Pocket" is a brand name.
+pocket-button.label = Pocket
+pocket-button.tooltiptext = Запісаць у Pocket
+saveToPocketCmd.label = Запісаць старонку ў Pocket
+saveToPocketCmd.accesskey = k
+saveLinkToPocketCmd.label = Запісаць спасылку ў Pocket
+saveLinkToPocketCmd.accesskey = o
+pocketMenuitem.label = Паглядзець спіс Pocket
--- a/browser/extensions/pocket/locale/bn-BD/pocket.properties
+++ b/browser/extensions/pocket/locale/bn-BD/pocket.properties
@@ -1,19 +1,19 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-addtags = ট্যাগ যোগ করুন
-alreadyhaveacct = আপনি Pocket ব্যবহার করছেন?
-continueff = Firefox ব্যবহার চালিয়ে যান
+addtags = ট্যাগসমূহ যোগ করুন
+alreadyhaveacct = আপনি কি একজন Pocket ব্যবহারকারী?
+continueff = Firefox এর সাথে চালিয়ে যান
 errorgeneric = Pocket এ সংরক্ষণ করতে ত্রুটি ঘটেছে।
 learnmore = আরও জানুন
 loginnow = লগ ইন
-maxtaglength = ট্যাগ ২৫ অক্ষরের মধ্যে সীমাবদ্ধ
+maxtaglength = ট্যাগ সমূহ 25 অক্ষরের মধ্যে সীমাবদ্ধ
 mustbeconnected = Pocket এ কোন কিছু সংরক্ষণ করে রাখতে চাইলে, ইন্টারনেটে সংযুক্ত থাকতে হবে। ইন্টারনেট সংযোগ পরীক্ষা করুন এবং আবার চেষ্টা করুন।
 onlylinkssaved = শুধু লিঙ্ক সংরক্ষণ করা যাবে
 pagenotsaved = পাতা সংরক্ষণ করা হয়নি
 pageremoved = পাতা অপসারণ করা হয়েছে
 pagesaved = Pocket এ সংরক্ষিত হয়েছে
 processingremove = পাতা অপসারিত হচ্ছে…
 processingtags = ট্যাগ যুক্ত করা হচ্ছে…
 removepage = পেজ মুছে ফেলুন
@@ -33,11 +33,11 @@ signupfirefox = ফায়ারফক্স দিয়ে সাইন আপ করুন
 viewlist = তালিকা দেখুন
 
 # LOCALIZATION NOTE(pocket-button.label, pocket-button.tooltiptext, saveToPocketCmd.label, saveLinkToPocketCmd.label, pocketMenuitem.label):
 # "Pocket" is a brand name.
 pocket-button.label = Pocket
 pocket-button.tooltiptext = Pocket এ সংরক্ষণ করুন
 saveToPocketCmd.label = Pocket এ পাতাটি সংরক্ষণ করুন k
 saveToPocketCmd.accesskey = k
-saveLinkToPocketCmd.label = Pocket এ লিঙ্কটি সংরক্ষণ করুন o
+saveLinkToPocketCmd.label = Pocket এ লিঙ্কটি সংরক্ষণ করুন
 saveLinkToPocketCmd.accesskey = o
 pocketMenuitem.label = Pocket তালিকা দেখুন
--- a/browser/extensions/pocket/locale/cs/pocket.properties
+++ b/browser/extensions/pocket/locale/cs/pocket.properties
@@ -1,40 +1,40 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 addtags = Přidat štítky
-alreadyhaveacct = Jste již uživatel služby Pocket?
-continueff = Pokračovat pomocí Firefoxu
+alreadyhaveacct = Používáte už službu Pocket?
+continueff = Pokračovat s Firefoxem
 errorgeneric = Při pokusu o uložení do služby Pocket došlo k chybě.
 learnmore = Zjistit více
-loginnow = Přihlásit se
+loginnow = Přihlaste se
 maxtaglength = Štítky jsou omezeny na 25 znaků
 mustbeconnected = Abyste mohli ukládat do služby Pocket, musíte být připojeni k internetu. Zkontrolujte prosím své připojení a zkuste to znovu.
-onlylinkssaved = Pouze odkazy mohou být uloženy
+onlylinkssaved = Ukládat můžete jenom odkazy
 pagenotsaved = Stránka nebyla uložena
 pageremoved = Stránka byla odstraněna
 pagesaved = Uloženo do služby Pocket
 processingremove = Odstraňování stránky…
 processingtags = Přidávání štítků…
 removepage = Odstranit stránku
 save = Uložit
 saving = Ukládání…
 signupemail = Registrace e-mailem
 signuptosave = Registrujte se do služby Pocket. Je to zdarma.
 suggestedtags = Doporučené štítky
 tagline = Ukládejte si články a videa z Firefoxu pro zobrazení ve službě Pocket kdykoliv a na jakémkoli zařízení.
 taglinestory_one = Klepněte na tlačítko služby Pocket pro uložení jakéhokoliv článku, videa nebo stránky přímo z Firefoxu.
 taglinestory_two = Zobrazení ve službě Pocket kdykoliv a na jakémkoliv zařízení.
 tagssaved = Štítky přidány
-tos = Pokračování souhlasíte s <a href="%1$S" target="_blank">Podmínkami služby</a> Pocket a <a href="%2$S" target="_blank">Zásadami ochrany osobních údajů</a>
+tos = Pokračováním souhlasíte s <a href="%1$S" target="_blank">Podmínkami služby</a> Pocket a <a href="%2$S" target="_blank">Zásadami ochrany osobních údajů</a>
 tryitnow = Vyzkoušejte nyní
-signinfirefox = Přihlášení ve Firefoxu
-signupfirefox = Registrace ve Firefoxu
+signinfirefox = Přihlásit se účtem Firefoxu
+signupfirefox = Registrace s účtem Firefoxu
 viewlist = Zobrazit seznam
 
 # LOCALIZATION NOTE(pocket-button.label, pocket-button.tooltiptext, saveToPocketCmd.label, saveLinkToPocketCmd.label, pocketMenuitem.label):
 # "Pocket" is a brand name.
 pocket-button.label = Pocket
 pocket-button.tooltiptext = Uloží do služby Pocket
 saveToPocketCmd.label = Uložit stránku do služby Pocket
 saveToPocketCmd.accesskey = k
new file mode 100644
--- /dev/null
+++ b/browser/extensions/pocket/locale/cy/pocket.properties
@@ -0,0 +1,43 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+addtags = Ychwanegu Tagiau
+alreadyhaveacct = Eisoes yn ddefnyddiwr Pocket?
+continueff = Parhau gyda Firefox
+errorgeneric = Bu gwall wrth geisio cadw i Pocket.
+learnmore = Dysgu Rhagor
+loginnow = Mewngofnodi
+maxtaglength = Mae tagiau wedi eu cyfyngu i 25 nod
+mustbeconnected = Rhaid eich bod wedi cysylltu i'r rhyngrwyd i gadw i Pocket. Gwiriwch eich cysylltiad a cheisiwch eto.
+onlylinkssaved = Dim ond dolenni y mae modd eu cadw
+pagenotsaved = Heb Gadw'r Dudalen
+pageremoved = Tudalen wedi ei Thynnu
+pagesaved = Cadwyd i Pocket
+processingremove = Tynnu Tudalen…
+processingtags = Ychwanegu tagiau…
+removepage = Tynnu Tudalen
+save = Cadw
+saving = Cadw…
+signupemail = Ymunwch drwy e-bost
+signuptosave = Ymunwch â Pocket. Mae am ddim.
+suggestedtags = Awgrymiadau o Dagiau
+tagline = Cadw erthyglau a fideos o Firefox i'w gweld yn Pocket ar unrhyw ddyfais, ar unrhyw adeg.
+taglinestory_one = Cliciwch Fotwm Pocket i gadw unrhyw erthygl, fideo neu dudalen o Firefox.
+taglinestory_two = Gweld yn Pocket ar unrhyw ddyfais, ar unrhyw adeg.
+tagssaved = Tagiau Ychwanegwyd
+tos = Drwy barhau, rydych yn cytuno i <a href="%1$S" target="_blank">Delerau Gwasanaeth</a> a <a href="%2$S" target="_blank">Pholisi Preifatrwydd</a> Pocket
+tryitnow = Rhowch Gynnig Arno
+signinfirefox = Mewngofnodi gyda Firefox
+signupfirefox = Ymuno drwy Firefox
+viewlist = Gweld Rhestr
+
+# LOCALIZATION NOTE(pocket-button.label, pocket-button.tooltiptext, saveToPocketCmd.label, saveLinkToPocketCmd.label, pocketMenuitem.label):
+# "Pocket" is a brand name.
+pocket-button.label = Pocket
+pocket-button.tooltiptext = Cadw i Pocket
+saveToPocketCmd.label = Cadw Tudalen i Pocket
+saveToPocketCmd.accesskey = k
+saveLinkToPocketCmd.label = Cadw Dolen i Pocket
+saveLinkToPocketCmd.accesskey = i
+pocketMenuitem.label = Edrych ar Rhestr Pocket
new file mode 100644
--- /dev/null
+++ b/browser/extensions/pocket/locale/ga-IE/pocket.properties
@@ -0,0 +1,43 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+addtags = Cuir Clibeanna Leis
+alreadyhaveacct = An úsáideoir Pocket thú cheana?
+continueff = Lean ort le Firefox
+errorgeneric = Tharla earráid le linn na sábhála i bPocket.
+learnmore = Tuilleadh Eolais
+loginnow = Logáil isteach
+maxtaglength = Ní cheadaítear níos mó ná 25 carachtar i gclib
+mustbeconnected = Ní mór duit a bheith ceangailte leis an Idirlíon le nithe a shábháil i bPocket. Athnuaigh do cheangal agus bain triail eile as.
+onlylinkssaved = Ní féidir ach nascanna a shábháil
+pagenotsaved = Níor Sábháladh an Leathanach
+pageremoved = Baineadh an Leathanach
+pagesaved = Sábháilte i bPocket
+processingremove = Leathanach á Bhaint…
+processingtags = Clibeanna á gcur leis…
+removepage = Bain Leathanach
+save = Sábháil
+saving = Á Sábháil…
+signupemail = Cláraigh le do sheoladh ríomhphoist
+signuptosave = Cláraigh le Pocket. Tá sé saor in aisce.
+suggestedtags = Clibeanna Molta
+tagline = Sábháil ailt agus físeáin ó Firefox chun breathnú orthu i bPocket ar aon ghléas, am ar bith.
+taglinestory_one = Cliceáil an cnaipe Pocket chun aon alt, físeán, nó leathanach a shábháil ó Firefox.
+taglinestory_two = Féach orthu i bPocket ar aon ghléas, am ar bith.
+tagssaved = Clibeanna curtha leis
+tos = Má théann tú ar aghaidh, is deimhniú é sin go nglacann tú le <a href="%1$S" target="_blank">Téarmaí Seirbhíse</a> agus <a href="%2$S" target="_blank">Polasaí Príobháideachais</a> Pocket
+tryitnow = Bain Triail As
+signinfirefox = Logáil isteach le Firefox
+signupfirefox = Cláraigh trí Firefox
+viewlist = Féach ar an Liosta
+
+# LOCALIZATION NOTE(pocket-button.label, pocket-button.tooltiptext, saveToPocketCmd.label, saveLinkToPocketCmd.label, pocketMenuitem.label):
+# "Pocket" is a brand name.
+pocket-button.label = Pocket
+pocket-button.tooltiptext = Sábháil i bPocket
+saveToPocketCmd.label = Sábháil an Leathanach i bPocket
+saveToPocketCmd.accesskey = k
+saveLinkToPocketCmd.label = Sábháil an Nasc i bPocket
+saveLinkToPocketCmd.accesskey = o
+pocketMenuitem.label = Féach ar an Liosta Pocket
new file mode 100644
--- /dev/null
+++ b/browser/extensions/pocket/locale/hy-AM/pocket.properties
@@ -0,0 +1,43 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+addtags = Ավելացնել պիտակներ
+alreadyhaveacct = Արդեն Pocket օգտվո՞ղ եք:
+continueff = Շարունակել Firefox-ով
+errorgeneric = Սխալ՝ Pocket-ում պահպանելիս:
+learnmore = Իմանալ ավելին
+loginnow = Մուտք գործել
+maxtaglength = Պիտակը սահմանափակված է 25 գրանշանով
+mustbeconnected = Պետք է մուտք ունենաք համացանց՝ պահելու համար Pocket-ում: Ստուգեք կապը և կրկին փորձեք:
+onlylinkssaved = Միայն հղումները կարող են պահվել
+pagenotsaved = Էջը չի պահպանվել
+pageremoved = Էջը հեռացված է
+pagesaved = Պահպանված է Pocket-ում
+processingremove = Էջը հեռացվում է…
+processingtags = Պիտակների հավելում…
+removepage = Հեռացնել Էջը
+save = Պահպանել
+saving = Պահպանում...
+signupemail = Մուտք գործել էլ. փոստով
+signuptosave = Գրանցվեք Pocket-ի համար: Անվճար է:
+suggestedtags = Առաջարկվող պիտակներ
+tagline = Պահպանեք հոդվածներ և տեսանյութեր Firefox-ից՝ դրանք հետագայում ցանկացած սարքից, ցանկացած ժամանակ Pocket-ում դիտելու համար:
+taglinestory_one = Սեղմեք Pocket կոճակը՝ պահպանելու համար Firefox-ից ցանկացած հոդված, տեսանյութ կամ էջ:
+taglinestory_two = Դիտեք Pocket-ում ցանկացած սարքից, ցանկացած ժամանակ:
+tagssaved = Պիտակները ավելացվել են
+tos = Շարունակելով դուք ընդունում եք Pocket-ի <a href="%1$S" target="_blank">Ծառայության պայմանները</a> և<a href="%2$S" target="_blank">Գաղտնիության քաղաքականությունը</a>
+tryitnow = Փորձեք այն հիմա
+signinfirefox = Մուտք գործել Firefox-ով
+signupfirefox = Գրանցվել Firefox-ով
+viewlist = Դիտել ցանկը
+
+# LOCALIZATION NOTE(pocket-button.label, pocket-button.tooltiptext, saveToPocketCmd.label, saveLinkToPocketCmd.label, pocketMenuitem.label):
+# "Pocket" is a brand name.
+pocket-button.label = Pocket
+pocket-button.tooltiptext = Պապանել Pocket-ում
+saveToPocketCmd.label = Պահպանել էջը Pocket-ում
+saveToPocketCmd.accesskey = k
+saveLinkToPocketCmd.label = Պահել էջը Pocket-ում
+saveLinkToPocketCmd.accesskey = P
+pocketMenuitem.label = Դիտել Pocket-ի ցանկը
new file mode 100644
--- /dev/null
+++ b/browser/extensions/pocket/locale/id/pocket.properties
@@ -0,0 +1,43 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+addtags = Tambahkan Tag
+alreadyhaveacct = Sudah menjadi pengguna Pocket?
+continueff = Lanjutkan dengan Firefox
+errorgeneric = Terjadi kesalahan saat mencoba menyimpan ke Pocket.
+learnmore = Lebih Lanjut
+loginnow = Masuk
+maxtaglength = Panjang karakter maksimum tag adalah 25 karakter
+mustbeconnected = Anda harus tersambung ke Internet untuk menyimpan ke Pocket. Periksa sambungan Anda lalu coba lagi.
+onlylinkssaved = Hanya tautan yang dapat disimpan
+pagenotsaved = Laman Tidak Disimpan
+pageremoved = Laman Dihapus
+pagesaved = Disimpan di Pocket
+processingremove = Menghapus Laman…
+processingtags = Menambahkan tag…
+removepage = Hapus Laman
+save = Simpan
+saving = Menyimpan…
+signupemail = Daftar dengan email
+signuptosave = Daftar ke Pocket. Gratis.
+suggestedtags = Saran Tag
+tagline = Simpan artikel dan video dari Firefox untuk melihatnya lewat Pocket di berbagai perangkat, kapan saja.
+taglinestory_one = Klik Tombol Pocket untuk menyimpan artikel, video, atau laman apa saja dari Firefox.
+taglinestory_two = Tampilkan lewat Pocket di berbagai perangkat, kapan saja.
+tagssaved = Tag Ditambahkan
+tos = Dengan melanjutkan, Anda menyetujui <a href="%1$S" target="_blank">Persyaratan Layanan</a> dan <a href="%2$S" target="_blank">Kebijakan Privacy</a> dari Pocket
+tryitnow = Coba Sekarang
+signinfirefox = Masuk ke Firefox
+signupfirefox = Daftar ke Firefox
+viewlist = Tampilkan Daftar
+
+# LOCALIZATION NOTE(pocket-button.label, pocket-button.tooltiptext, saveToPocketCmd.label, saveLinkToPocketCmd.label, pocketMenuitem.label):
+# "Pocket" is a brand name.
+pocket-button.label = Pocket
+pocket-button.tooltiptext = Simpan ke Pocket
+saveToPocketCmd.label = Simpan Laman ke Pocket
+saveToPocketCmd.accesskey = k
+saveLinkToPocketCmd.label = Simpan Tautan ke Pocket
+saveLinkToPocketCmd.accesskey = o
+pocketMenuitem.label = Tampilkan Daftar Pocket
--- a/browser/extensions/pocket/locale/jar.mn
+++ b/browser/extensions/pocket/locale/jar.mn
@@ -9,27 +9,31 @@
 #define bn_IN bn-IN
 #define en_GB en-GB
 #define en_US en-US
 #define es_AR es-AR
 #define es_CL es-CL
 #define es_ES es-ES
 #define es_MX es-MX
 #define fy_NL fy-NL
+#define ga_IE ga-IE
 #define gu_IN gu-IN
 #define hi_IN hi-IN
+#define hy_AM hy-AM
+#define nb_NO nb-NO
 #define nn_NO nn-NO
+#define pa_IN pa-IN
 #define pt_BR pt-BR
 #define pt_PT pt-PT
 #define sv_SE sv-SE
 #define zh_CN zh-CN
 #define zh_TW zh-TW
 
 [features/firefox@getpocket.com] @AB_CD@.jar:
 % locale pocket @AB_CD@ %locale/@AB_CD@/
   # For locales we support, include the file from the locale's directory in the
   # source tree.
   # For other locales (and en-US) fallback to the en-US directory.
-#if AB_CD == ast || AB_CD == az || AB_CD == bg || AB_CD == bn_BD || AB_CD == bn_IN || AB_CD == cs || AB_CD == da || AB_CD == de || AB_CD == dsb || AB_CD == en_GB || AB_CD == en_US || AB_CD == es_AR || AB_CD == es_CL || AB_CD == es_ES || AB_CD == es_MX || AB_CD == el || AB_CD == eo || AB_CD == et || AB_CD == fa || AB_CD == fi || AB_CD == ff || AB_CD == fr || AB_CD == fy_NL || AB_CD == gd || AB_CD == gu_IN || AB_CD == he || AB_CD == hi_IN || AB_CD == hr || AB_CD == hsb || AB_CD == hu || AB_CD == it || AB_CD == ja || AB_CD == ka || AB_CD == kab || AB_CD == ko || AB_CD == lt || AB_CD == lv || AB_CD == mr || AB_CD == ms || AB_CD == nl || AB_CD == nn_NO || AB_CD == or || AB_CD == pl || AB_CD == pt_BR || AB_CD == pt_PT || AB_CD == rm || AB_CD == ro || AB_CD == ru || AB_CD == sk || AB_CD == sl || AB_CD == sq || AB_CD == sr || AB_CD == sv_SE || AB_CD == te || AB_CD == th || AB_CD == tr || AB_CD == uk || AB_CD == zh_CN || AB_CD == zh_TW
+#if AB_CD == ach || AB_CD == ar || AB_CD == ast || AB_CD == az || AB_CD == be || AB_CD == bg || AB_CD == bn_BD || AB_CD == bn_IN || AB_CD == cs || AB_CD == cy || AB_CD == da || AB_CD == de || AB_CD == dsb || AB_CD == el || AB_CD == en_GB || AB_CD == en_US || AB_CD == eo || AB_CD == es_AR || AB_CD == es_CL || AB_CD == es_ES || AB_CD == es_MX || AB_CD == et || AB_CD == fa || AB_CD == ff || AB_CD == fi || AB_CD == fr || AB_CD == fy_NL || AB_CD == ga_IE || AB_CD == gd || AB_CD == gu_IN || AB_CD == he || AB_CD == hi_IN || AB_CD == hr || AB_CD == hsb || AB_CD == hu || AB_CD == hy_AM || AB_CD == id || AB_CD == it || AB_CD == ja || AB_CD == ka || AB_CD == kab || AB_CD == kk || AB_CD == km || AB_CD == ko || AB_CD == lij || AB_CD == lt || AB_CD == lv || AB_CD == mr || AB_CD == ms || AB_CD == nb_NO || AB_CD == nl || AB_CD == nn_NO || AB_CD == or || AB_CD == pa_IN || AB_CD == pl || AB_CD == pt_BR || AB_CD == pt_PT || AB_CD == rm || AB_CD == ro || AB_CD == ru || AB_CD == sk || AB_CD == sl || AB_CD == sq || AB_CD == sr || AB_CD == sv_SE || AB_CD == te || AB_CD == th || AB_CD == tl || AB_CD == tr || AB_CD == uk || AB_CD == zh_CN || AB_CD == zh_TW
   locale/@AB_CD@/                (@AB_CD@/*)
 #else
   locale/@AB_CD@/                (en-US/*)
 #endif
new file mode 100644
--- /dev/null
+++ b/browser/extensions/pocket/locale/kk/pocket.properties
@@ -0,0 +1,43 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+addtags = Тегтерді қосу
+alreadyhaveacct = Pocket пайдаланушысыз ба?
+continueff = Firefox көмегімен жалғастыру
+errorgeneric = Pocket-ке сақтау талабы кезінде қате орын алды.
+learnmore = Көбірек білу
+loginnow = Кіру
+maxtaglength = Тег 25 таңбамен шектелген
+mustbeconnected = Pocket-ке сақтау үшін интернетпен байланыс болу тиіс. Байланысты тексеріп, қайталап көріңіз.
+onlylinkssaved = Тек сілтемелерді сақтауға болады
+pagenotsaved = Парақ сақталмаған
+pageremoved = Парақ өшірілді
+pagesaved = Pocket-ке сақталды
+processingremove = Парақты өшіру…
+processingtags = Тегтерді қосу…
+removepage = Парақты өшіру
+save = Сақтау
+saving = Сақтау…
+signupemail = Эл. поштамен кіру
+signuptosave = Pocket-те тіркелгіні жасау. Бұл - тегін.
+suggestedtags = Ұсынылатын тегтер
+tagline = Firefox-тан мақалаларды және видеоларды Pocket-те кез-келген құрылғыда және уақытта қарай алу үшін сақтаңыз.
+taglinestory_one = Firefox-тан кез-келген мақала, видео немесе парақты сақтау үшін Pocket батырмасына басыңыз.
+taglinestory_two = Pocket-те кез-келген құрылғыда және уақытта қарай аласыз.
+tagssaved = Тегтер қосылды
+tos = Жалғастыратын болсаңыз, сіз Pocket-тің <a href="%1$S" target="_blank">Пайдалану шарттары</a> және<a href="%2$S" target="_blank">Жекелік саясатымен</a> келісесіз
+tryitnow = Қолданып көру
+signinfirefox = Firefox-пен кіру
+signupfirefox = Firefox-пен тіркелу
+viewlist = Тізімді қарау
+
+# LOCALIZATION NOTE(pocket-button.label, pocket-button.tooltiptext, saveToPocketCmd.label, saveLinkToPocketCmd.label, pocketMenuitem.label):
+# "Pocket" is a brand name.
+pocket-button.label = Pocket
+pocket-button.tooltiptext = Pocket-ке сақтау
+saveToPocketCmd.label = Бетті Pocket-ке сақтау
+saveToPocketCmd.accesskey = с
+saveLinkToPocketCmd.label = Сілтемені Pocket-ке сақтау
+saveLinkToPocketCmd.accesskey = т
+pocketMenuitem.label = Pocket тізімін қарау
new file mode 100644
--- /dev/null
+++ b/browser/extensions/pocket/locale/km/pocket.properties
@@ -0,0 +1,43 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+addtags = បន្ថែម​ស្លាក
+alreadyhaveacct = ជា​អ្នក​ប្រើប្រាស់ Pocket ហើយ?
+continueff = បន្ត​ជាមួយ Firefox
+errorgeneric = មាន​កំហុស ពេល​ព្យាយាម​រក្សាទុក​ទៅ​កាន់​ Pocket។
+learnmore = ស្វែងយល់​​បន្ថែម
+loginnow = ចូល
+maxtaglength = ស្លាក​ត្រូវ​បាន​កំណត់​ត្រឹមតែ 25 តួ​អក្សរ
+mustbeconnected = អ្នកត្រូវតែ​ភ្ជាប់​អ៊ីនធឺណែត ដើម្បី​រក្សាទុកទៅ Pocket។ សូម​ពិនិត្យ​ការភ្ជាប់របស់​អ្នក និង​ព្យាយាម​ម្តង​ទៀត។​
+onlylinkssaved = អាច​រក្សាទុក​បាន​តែ​តំណភ្ជាប់​ប៉ុណ្ណោះ
+pagenotsaved = ទំព័រ​មិន​ត្រូវបាន​រក្សាទុក
+pageremoved = ទំព័រ​ត្រូវ​បាន​លុបចោល
+pagesaved = បាន​រក្សាទុក​ទៅ Pocket
+processingremove = កំពុង​លុប​ទំព័រ…
+processingtags = កំពុង​បន្ថែម​ស្លាក...
+removepage = លុប​ទំព័រ
+save = រក្សាទុក​
+saving = កំពុង​រក្សាទុក…
+signupemail = ចុះឈ្មោះ​​ដោយ​ប្រើ​​អ៊ីមែល
+signuptosave = ចុះឈ្មោះ​គណនី Pocket ដោយ​មិន​គិត​ប្រាក់។
+suggestedtags = ស្លាកដែល​បាន​ណែនាំ
+tagline = រក្សាទុក​អត្ថបទ​ និង​វីដេអូពី​ Firefox ដើម្បីមើល​នៅក្នុង Pocket សម្រាប់​​គ្រប់​ឧបករណ៍ ​និងគ្រប់ពេល។​
+taglinestory_one = ចុច​​ប៊ូតុង Pocket ដើម្បីរក្សា​ទុក​អត្ថបទ វីដេអូ ឬ​ទំព័រ​ពី Firefox។
+taglinestory_two = មើល​ក្នុង Pocket សម្រាប់​គ្រប់ឧបករណ៍ និង​គ្រប់ពេល។​
+tagssaved = បាន​បន្ថែម​ស្លាក
+tos = ដើម្បីបន្ត អ្នកត្រូវយល់ព្រមលើកម្រង’<a href="%1$S" target="_blank">រយៈកាលនៃសេវាកម្ម​ </a> និង<a href="%2$S" target="_blank">គោលការណ៍ឯកជនភាព</a>
+tryitnow = សាកល្បងវាឥឡូវនេះ
+signinfirefox = ចូល​ជាមួយ Firefox
+signupfirefox = ចុះឈ្មោះជាមួយ Firefox
+viewlist = មើលបញ្ជី
+
+# LOCALIZATION NOTE(pocket-button.label, pocket-button.tooltiptext, saveToPocketCmd.label, saveLinkToPocketCmd.label, pocketMenuitem.label):
+# "Pocket" is a brand name.
+pocket-button.label = Pocket
+pocket-button.tooltiptext = រក្សាទុក​ទៅ Pocket
+saveToPocketCmd.label = រក្សាទុក​ទំព័រ​ទៅ Pocket
+saveToPocketCmd.accesskey = k
+saveLinkToPocketCmd.label = រក្សាទុក​តំណ​ទៅ​ក្នុង Pocket
+saveLinkToPocketCmd.accesskey = o
+pocketMenuitem.label = មើល​បញ្ជី Pocket
new file mode 100644
--- /dev/null
+++ b/browser/extensions/pocket/locale/lij/pocket.properties
@@ -0,0 +1,43 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+addtags = Azonzi etichette
+alreadyhaveacct = Ti gh'æ za 'n account registrou in sce Pocket?
+continueff = Vanni avanti con Firefox
+errorgeneric = Gh'æ stæto 'n'erô into sarvâ in Pocket.
+learnmore = Atre informaçioin
+loginnow = Açendi
+maxtaglength = A longhessa mascima pe-e etichette a l'é de 25 carateri
+mustbeconnected = Ti devi ese conesso a l'Internet pe sarvâ in Pocket. Verifica a conescion e preuva torna.
+onlylinkssaved = Ti peu solo sarvâ colegamenti
+pagenotsaved = Pagina no atrovâ
+pageremoved = Pagina scancelâ
+pagesaved = Sarvâ in Pocket
+processingremove = Scancello a pagina…
+processingtags = Sarvo e etichette…
+removepage = Scancella pagina
+save = Sarva
+saving = Son apreuvo a sarvâ…
+signupemail = Acedi con l'email
+signuptosave = Registrate in sce Pocket. L'é de badda.
+suggestedtags = Etichete consigiæ
+tagline = Sarva articoli e video da Firefox pe veddile in sce Pocket da qualonque dispoxitivo e in qualonque momento.
+taglinestory_one = Sciacca o pomello Pocket pe sarvâ qualonque articolo, video ò pagina da Firefox.
+taglinestory_two = Veddi in Pocket da qualonque dispoxitivo e in qualonque momento.
+tagssaved = Azonte etichette
+tos = Se ti continoi ti acetti i <a href="%1$S" target="_blank">Termini do serviççio</a> e-a <a href="%2$S" target="_blank">Politica da Privacy</a>
+tryitnow = Preuvilo oua
+signinfirefox = Acedi con Firefox
+signupfirefox = Registrate con Firefox
+viewlist = Veddi elenco
+
+# LOCALIZATION NOTE(pocket-button.label, pocket-button.tooltiptext, saveToPocketCmd.label, saveLinkToPocketCmd.label, pocketMenuitem.label):
+# "Pocket" is a brand name.
+pocket-button.label = Pocket
+pocket-button.tooltiptext = Sarva in Pocket
+saveToPocketCmd.label = Sarva pagina in Pocket
+saveToPocketCmd.accesskey = k
+saveLinkToPocketCmd.label = Sarva colegamento in Pocket
+saveLinkToPocketCmd.accesskey = o
+pocketMenuitem.label = Fanni vedde elenco Pocket
--- a/browser/extensions/pocket/locale/lt/pocket.properties
+++ b/browser/extensions/pocket/locale/lt/pocket.properties
@@ -9,17 +9,17 @@ errorgeneric = Bandant išsaugoti į „Pocket“ įvyko klaida.
 learnmore = Sužinokite daugiau
 loginnow = Prisijungti
 maxtaglength = Gaires gali sudaryti iki 25 simbolių
 mustbeconnected = Norėdami saugoti į „Pocket“, turite būti prisijungę prie interneto. Prašome patikrinti savo ryšį ir bandyti vėl.
 onlylinkssaved = Išsaugoti galima tik nuorodas
 pagenotsaved = Tinklalapis neišsaugotas
 pageremoved = Tinklalapis pašalintas
 pagesaved = Išsaugota į „Pocket“
-processingremove = Šalinamas tinklalapis…
+processingremove = Tinklalapis šalinamas…
 processingtags = Pridedamos gairės…
 removepage = Pašalinti tinklalapį
 save = Išsaugoti
 saving = Išsaugoma…
 signupemail = Prisijungti su el. paštu
 signuptosave = Pradėkite naudotis „Pocket“. Tai nemokama.
 suggestedtags = Siūlomos gairės
 tagline = Išsaugokite straipsnius bei vaizdo įrašus iš „Firefox“ norėdami juos peržiūrėti bet kokiame įrenginyje su „Pocket“, bet kuriuo metu.
new file mode 100644
--- /dev/null
+++ b/browser/extensions/pocket/locale/nb-NO/pocket.properties
@@ -0,0 +1,43 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+addtags = Legg til etiketter
+alreadyhaveacct = Allerede en Pocket-bruker?
+continueff = Fortsett med Firefox
+errorgeneric = Et problem oppstod ved lagring til Pocket.
+learnmore = Les mer
+loginnow = Logg inn
+maxtaglength = Etiketter er begrenset til 25 tegn
+mustbeconnected = Du må være koblet til nettet for å lagre til Pocket. Kontroller tilkoblingen og prøv igjen.
+onlylinkssaved = Bare lenker kan lagres
+pagenotsaved = Side ikke lagret
+pageremoved = Side fjernet
+pagesaved = Lagret til  Pocket
+processingremove = Fjerner side …
+processingtags = Legger til side …
+removepage = Fjern side
+save = Lagre
+saving = Lagrer …
+signupemail = Logg inn med e-postadresse
+signuptosave = Registrer deg i Pocket. Det er gratis.
+suggestedtags = Foreslåtte etiketter
+tagline = Lagre artikler og videoer fra Firefox for å vise dem i Pocket på hvilken som helst enhet, når som helst.
+taglinestory_one = Trykk på Pocket-knappen for å lagre hvilken som helst artikkel, video eller side fra Firefox.
+taglinestory_two = Vis i Pocket på hvilken som helst enhet, når som helst.
+tagssaved = Etiketter lagt til
+tos = Ved å fortsette, aksepterer du Pocket sine <a href="%1$S" target="_blank">tjenestevilkår</a> og <a href="%2$S" target="_blank">personvernsbestemmelser</a>
+tryitnow = Prøv nå
+signinfirefox = Logg inn med Firefox
+signupfirefox = Registrer deg med Firefox
+viewlist = Vis liste
+
+# LOCALIZATION NOTE(pocket-button.label, pocket-button.tooltiptext, saveToPocketCmd.label, saveLinkToPocketCmd.label, pocketMenuitem.label):
+# "Pocket" is a brand name.
+pocket-button.label = Pocket
+pocket-button.tooltiptext = Lagre til Pocket
+saveToPocketCmd.label = Lagre siden i Pocket
+saveToPocketCmd.accesskey = k
+saveLinkToPocketCmd.label = Lagre lenke til Pocket
+saveLinkToPocketCmd.accesskey = l
+pocketMenuitem.label = Vis Pocket-liste
new file mode 100644
--- /dev/null
+++ b/browser/extensions/pocket/locale/pa-IN/pocket.properties
@@ -0,0 +1,43 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+addtags = ਟੈਗ ਨੂੰ ਜੋੜੋ
+alreadyhaveacct = ਪਹਿਲਾਂ ਹੀ ਪਾਕੇਟ (Pocket) ਵਰਤੋਂਕਾਰ ਹੋ?
+continueff = ਫਾਇਰਫਾਕਸ ਨਾਲ ਜਾਰੀ ਰੱਖੋ
+errorgeneric = ਪਾਕੇਟ ਵਿੱਚ ਸੰਭਾਲਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਦੌਰਾਨ ਗਲਤੀ ਸੀ।
+learnmore = ਹੋਰ ਜਾਣੋ
+loginnow = ਲਾਗਇਨ
+maxtaglength = ਟੈਗ 25 ਅੱਖਰਾਂ ਤੱਕ ਸੀਮਿਤ ਹਨ
+mustbeconnected = ਪਾਕੇਟ ਵਿੱਚ ਸੰਭਾਲਣ ਲਈ ਤੁਸੀਂ ਇੰਟਰਨੈੱਟ ਨਾਲ ਕਨੈਕਟ ਹੋਣੇ ਚਾਹੀਦੇ ਹੋ। ਆਪਣੇ ਕਨੈਕਸ਼ਨ ਦੀ ਜਾਂਚ ਕਰੋ ਅਤੇ ਮੁੜ ਕੋਸ਼ਿਸ਼ ਕਰੋ।
+onlylinkssaved = ਕੇਵਲ ਲਿੰਕਾਂ ਨੂੰ ਹੀ ਸੰਭਾਲਿਆ ਜਾ ਸਕਦਾ ਹੈ
+pagenotsaved = ਸਫ਼ੇ ਨੂੰ ਨਹੀਂ ਸੰਭਾਲਿਆ ਗਿਆ
+pageremoved = ਸਫ਼ੇ ਨੂੰ ਹਟਾਇਆ ਗਿਆ
+pagesaved = ਪਾਕੇਟ ਵਿੱਚ ਸੰਭਾਲਿਆ
+processingremove = …ਸਫ਼ੇ ਨੂੰ ਹਟਾਇਆ ਜਾ ਰਿਹਾ ਹੈ
+processingtags = …ਟੈਗ ਨੂੰ ਜੋੜਿਆ ਜਾ ਰਿਹਾ ਹੈ
+removepage = ਸਫ਼ੇ ਨੂੰ ਹਟਾਓ
+save = ਸੰਭਾਲੋ
+saving = …ਸੰਭਾਲਿਆ ਜਾ ਰਿਹਾ ਹੈ
+signupemail = ਈਮੇਲ ਨਾਲ ਸਾਈਨ ਅੱਪ ਕਰੋ
+signuptosave = ਪਾਕੇਟ ਲਈ ਸਾਈਨ ਅੱਪ ਕਰੋ। ਇਹ ਮੁਫ਼ਤ ਹੈ।
+suggestedtags = ਸੁਝਾਏ ਗਏ ਟੈਗ
+tagline = ਫਾਇਰਫਾਕਸ ਤੋਂ ਲੇਖਾਂ ਅਤੇ ਵੀਡੀਓ ਨੂੰ ਪਾਕੇਟ ਵਿੱਚ ਸੰਭਾਲੋ ਤਾਂ ਕਿ ਕਿਸੇ ਵੀ ਡਿਵਾਈਸ, ਕਿਸੇ ਵੀ ਸਮੇਂ ਵੇਖਿਆ ਜਾ ਸਕਦਾ ਹੈ।
+taglinestory_one = ਕਿਸੇ ਵੀ ਲੇਖ, ਵੀਡੀਓ ਜਾਂ ਸਫ਼ੇ ਨੂੰ ਫਾਇਰਫਾਕਸ ਤੋਂ ਸੰਭਾਲਣ ਲਈ Pocket ਬਟਨ ਉੱਤੇ ਕਲਿੱਕ ਕਰੋ।
+taglinestory_two = ਕਿਸੇ ਵੀ ਡਿਵਾਈਸ, ਕਿਸੇ ਵੀ ਸਮੇਂ ਪਾਕੇਟ ਵਿੱਚ ਦੇਖੋ।
+tagssaved = ਟੈਗ ਨੂੰ ਜੋੜਿਆ
+tos = ਜਾਰੀ ਰੱਖ ਕੇ ਤੁਸੀਂ ਪਾਕੇਟ ਦੀਆਂ <a href="%1$S" target="_blank">ਸੇਵਾ ਦੀਆਂ ਸ਼ਰਤਾਂ</a> ਅਤੇ <a href="%2$S" target="_blank">ਪਰਦੇਦਾਰੀ ਨੀਤੀ</a> ਨਾਲ ਸਹਿਮਤ ਹੁੰਦੇ ਹੋ
+tryitnow = ਹੁਣ ਕੋਸ਼ਿਸ਼ ਕਰੋ
+signinfirefox = ਫਾਇਰਫਾਕਸ ਨਾਲ ਸਾਇਨ ਇਨ ਕਰੋ
+signupfirefox = ਫਾਇਰਫਾਕਸ ਨਾਲ ਸਾਇਨ ਅੱਪ ਕਰੋ
+viewlist = ਸੂਚੀ ਨੂੰ ਵੇਖੋ
+
+# LOCALIZATION NOTE(pocket-button.label, pocket-button.tooltiptext, saveToPocketCmd.label, saveLinkToPocketCmd.label, pocketMenuitem.label):
+# "Pocket" is a brand name.
+pocket-button.label = Pocket
+pocket-button.tooltiptext = Pocket ਵਿੱਚ ਸੰਭਾਲੋ
+saveToPocketCmd.label = ਸਫ਼ੇ ਨੂੰ Pocket ਵਿੱਚ ਸੰਭਾਲੋ
+saveToPocketCmd.accesskey = k
+saveLinkToPocketCmd.label = ਲਿੰਕ ਨੂੰ Pocket ਵਿੱਚ ਸੰਭਾਲੋ
+saveLinkToPocketCmd.accesskey = o
+pocketMenuitem.label = Pocket ਦੀ ਸੂਚੀ ਦੇਖੋ
--- a/browser/extensions/pocket/locale/pt-PT/pocket.properties
+++ b/browser/extensions/pocket/locale/pt-PT/pocket.properties
@@ -4,21 +4,21 @@
 
 addtags = Adicionar etiquetas
 alreadyhaveacct = Já é um utilizador do Pocket?
 continueff = Continuar com o Firefox
 errorgeneric = Ocorreu um erro ao tentar guardar no Pocket.
 learnmore = Saber mais
 loginnow = Iniciar sessão
 maxtaglength = As etiquetas estão limitadas a 25 caracteres
-mustbeconnected = É necessária uma ligação à Internet para poder guardar no Pocket. Por favor, verifique a sua ligação à Internet e tente novamente.
+mustbeconnected = É necessária uma ligação à Internet para poder guardar no Pocket. Por favor verifique a sua ligação e tente novamente.
 onlylinkssaved = Só podem ser guardadas ligações
 pagenotsaved = Página não guardada
 pageremoved = Página removida
-pagesaved = Guardado no Pocket
+pagesaved = Guardada no Pocket
 processingremove = A remover página…
 processingtags = A adicionar etiquetas…
 removepage = Remover página
 save = Guardar
 saving = A guardar…
 signupemail = Registar com email
 signuptosave = Registe-se no Pocket. É gratuito.
 suggestedtags = Etiquetas sugeridas
--- a/browser/extensions/pocket/locale/te/pocket.properties
+++ b/browser/extensions/pocket/locale/te/pocket.properties
@@ -1,32 +1,32 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-addtags = టాగ్‌లను జోడించు
-alreadyhaveacct = ఇప్పటికే ఒక పాకెట్ యూజర్?
-continueff = ఫైర్ఫాక్స్ తో కొనసాగించుము
+addtags = ట్యాగులను చేర్చు
+alreadyhaveacct = ఇప్పటికే ఒక పాకెట్ వాడుకరా?
+continueff = Firefoxతో కొనసాగించండి
 errorgeneric = పాకెట్ కు సేవ్ చేయడానికి ప్రయత్నిస్తున్నప్పుడు లోపం ఉంది.
 learnmore = మరింత తెలుసుకోండి
 loginnow = లాగ్ ఇన్
 maxtaglength = టాగ్లు 25 అక్షరాలకు పరిమితం చేయబడ్డాయి
 mustbeconnected = మీరు పాకెట్ కు సేవ్ చేయడానికి ఇంటర్నెట్ కనెక్ట్ చేయక తప్పదు. మీ కనెక్షన్ను తనిఖీ చేసి, మళ్ళీ ప్రయత్నించండి.
 onlylinkssaved = కేవలం లింకులు సేవ్ చేయవచ్చు
 pagenotsaved = పేజీ సేవ్ చేయబడలేదు
 pageremoved = పేజీ తీసివేయబడెను
 pagesaved = పాకెట్ కు సేవ్ చేయబడింది
 processingremove = పేజీని తొలగించు…
 processingtags = టాగ్లు జోడిస్తోంది...
 removepage = పేజీని తొలగించు
-save = సేవ్ చేయి
-saving = సేవ్ చేస్తోంది...
+save = భద్రపరచు
+saving = భద్రమవుతోంది…
 signupemail = ఇమెయిల్ తో సైన్అప్ అవ్వండ్
 signuptosave = పాకెట్ కోసం సైన్ అప్ చేయండి. ఇది ఉచితం.
-suggestedtags = సూచించిన టాగ్లు
+suggestedtags = సూచించిన ట్యాగులు
 tagline = ఏ పరికరం, ఏ సమయం లో పాకెట్ వీక్షించడానికి Firefox నుండి వ్యాసాలు మరియు వీడియోలను సేవ్ చేయవచ్చు.
 taglinestory_one = ఫైర్ఫాక్సు నుండి ఒక వ్యాసం, వీడియో లేదా పేజీ సేవ్ పాకెట్ బటన్ క్లిక్ చేయండి.
 taglinestory_two = ఏ పరికరంలో అయినా, ఏ సమయంలో అయినా పాకెట్ లో చూడండి.
 tagssaved = టాగ్లు చేర్చబడింది
 tos = కొనసాగించడం ద్వారా, మీరు పాకెట్ యొక్క <a href="%1$S" target="_blank"> సేవా నిబంధనలు</a> మరియు <a href="%2$S" target="_blank"> గోప్యతా విధానము</a> ను అంగీకరిచబడుతారు
 tryitnow = దీన్ని ఇప్పుడు ప్రయత్నించండి
 signinfirefox = ఫైర్ఫాక్సుకు ప్రవేశించండి
 signupfirefox = ఫైర్ఫాక్సుకు ప్రవేశించండి
--- a/browser/extensions/pocket/locale/th/pocket.properties
+++ b/browser/extensions/pocket/locale/th/pocket.properties
@@ -34,10 +34,10 @@ viewlist = ดูรายการ
 
 # LOCALIZATION NOTE(pocket-button.label, pocket-button.tooltiptext, saveToPocketCmd.label, saveLinkToPocketCmd.label, pocketMenuitem.label):
 # "Pocket" is a brand name.
 pocket-button.label = Pocket
 pocket-button.tooltiptext = บันทึกไปยัง Pocket
 saveToPocketCmd.label = บันทึกหน้าไปยัง Pocket
 saveToPocketCmd.accesskey = k
 saveLinkToPocketCmd.label = บันทึกลิงก์ไปยัง Pocket
-saveLinkToPocketCmd.accesskey = ป
+saveLinkToPocketCmd.accesskey = o
 pocketMenuitem.label = ดูรายการ Pocket
new file mode 100644
--- /dev/null
+++ b/browser/extensions/pocket/locale/tl/pocket.properties
@@ -0,0 +1,43 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+addtags = Dagdag na Tab
+alreadyhaveacct = Matuto nang higit pa?
+continueff = I-pagpatuloy sa firefox
+errorgeneric = May pagkakamali nung sinusubukang I-save sa Pocket.
+learnmore = Alamin pa
+loginnow = Mag-log in
+maxtaglength = Tags ay limitado sa 25 characters
+mustbeconnected = Dapat ikaw ay konektado sa internet upang ito ay masave sa Pocket. Paki tsek ang iyong koneksyon at subukan uli.
+onlylinkssaved = Tanging mga link lamang ay maaaring i-save
+pagenotsaved = Pahina ay hindi na I-save
+pageremoved = Pahina ay na Tanggal
+pagesaved = I-save sa pocket
+processingremove = Inaalis ang Pahina…
+processingtags = Dinadagdagan ang tanda...
+removepage = Alisin ang Pahina
+save = I-save
+saving = Saving…
+signupemail = Mag-sign up gamit ang email
+signuptosave = Mag-sign up para sa Pocket. Ito ay libre.
+suggestedtags = Iminungkahing Tanda
+tagline = I-save ang artikulo at bidyo mula sa Firefox para matingnan sa Pocket sa kahit anong gadyet, ano mang oras.
+taglinestory_one = I-click ang Pocket Button para ma-save ang kahit anong artikulo, video o pahina mula sa Firefox.
+taglinestory_two = Tingnan sa Pocket sa kahit anong device, ano mang oras.
+tagssaved = Tags Naidagdag
+tos = Sa pagpapatuloy, ikaw ay sumasang-ayon sa <a href="%1$S" target="_blank">Terms of Service</a> and <a href="%2$S" target="_blank">Privacy Policy</a> ng Pocket
+tryitnow = Subukan Ngayon
+signinfirefox = Mag-sign in sa Firefox
+signupfirefox = Mag-sign up sa Firefox
+viewlist = Tingnan ang Listahan
+
+# LOCALIZATION NOTE(pocket-button.label, pocket-button.tooltiptext, saveToPocketCmd.label, saveLinkToPocketCmd.label, pocketMenuitem.label):
+# "Pocket" is a brand name.
+pocket-button.label = Pocket
+pocket-button.tooltiptext = I-save sa Pocket
+saveToPocketCmd.label = I-save ang Pahina sa Pocket
+saveToPocketCmd.accesskey = k
+saveLinkToPocketCmd.label = I-save ang Link sa Pocket
+saveLinkToPocketCmd.accesskey = o
+pocketMenuitem.label = TIngnan ang Pocket List
--- a/browser/extensions/pocket/locale/zh-CN/pocket.properties
+++ b/browser/extensions/pocket/locale/zh-CN/pocket.properties
@@ -1,38 +1,38 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 addtags = 添加标签
-alreadyhaveacct = 已有 Pocket 账号?
+alreadyhaveacct = 已经注册过 Pocket 账户了?
 continueff = 使用 Firefox 继续
 errorgeneric = 尝试保存到 Pocket 时出错。
 learnmore = 详细了解
 loginnow = 登录
 maxtaglength = 标签不能超过 25 个字符
-mustbeconnected = 您必须已连接互联网才能保存到 Pocket。请检查您的连接,然后再试。
+mustbeconnected = 您必须已连接互联网才能保存到 Pocket。请检查您的网络连接后再试一次。
 onlylinkssaved = 只有链接能被保存
 pagenotsaved = 页面未保存
 pageremoved = 页面已移除
 pagesaved = 已保存到 Pocket
 processingremove = 正在移除页面…
 processingtags = 正在添加标签…
 removepage = 移除页面
 save = 保存
 saving = 正在保存…
 signupemail = 通过电子邮件注册
 signuptosave = 免费注册 Pocket。
 suggestedtags = 推荐标签
 tagline = 在 Firefox 上保存文章和视频,以供在任何时间、任何设备上用 Pocket 访问。
 taglinestory_one = 点击 Pocket 按钮保存 Firefox 上的任何文章、视频或页面。
 taglinestory_two = 在任何时间、任何设备上的 Pocket 中查看。
 tagssaved = 标签已添加
-tos = 继续则表示您同意 Pocket 的<a href="%1$S" target="_blank">服务条款</a>和<a href="%2$S" target="_blank">隐私政策</a>
-tryitnow = 立即尝试
+tos = 继续则表示您同意 Pocket 的<a href="%1$S" target="_blank">服务条款</a>和<a href="%2$S" target="_blank">隐私权政策</a>
+tryitnow = 现在就试试
 signinfirefox = 使用 Firefox 登录
 signupfirefox = 使用 Firefox 注册
 viewlist = 查看列表
 
 # LOCALIZATION NOTE(pocket-button.label, pocket-button.tooltiptext, saveToPocketCmd.label, saveLinkToPocketCmd.label, pocketMenuitem.label):
 # "Pocket" is a brand name.
 pocket-button.label = Pocket
 pocket-button.tooltiptext = 保存到 Pocket
--- a/browser/locales/en-US/chrome/browser/preferences-old/sync.dtd
+++ b/browser/locales/en-US/chrome/browser/preferences-old/sync.dtd
@@ -5,18 +5,18 @@
 <!-- The page shown when logged in... -->
 
 <!ENTITY engine.bookmarks.label     "Bookmarks">
 <!ENTITY engine.bookmarks.accesskey "m">
 <!ENTITY engine.tabs.label2         "Open Tabs">
 <!ENTITY engine.tabs.accesskey      "T">
 <!ENTITY engine.history.label       "History">
 <!ENTITY engine.history.accesskey   "r">
-<!ENTITY engine.passwords.label     "Passwords">
-<!ENTITY engine.passwords.accesskey "P">
+<!ENTITY engine.logins.label        "Logins">
+<!ENTITY engine.logins.accesskey    "L">
 <!ENTITY engine.prefs.label         "Preferences">
 <!ENTITY engine.prefs.accesskey     "S">
 <!ENTITY engine.addons.label        "Add-ons">
 <!ENTITY engine.addons.accesskey    "A">
 
 <!-- Device Settings -->
 <!ENTITY fxaSyncDeviceName.label       "Device Name">
 <!ENTITY changeSyncDeviceName.label "Change Device Name…">
--- a/browser/locales/en-US/chrome/browser/preferences/sync.dtd
+++ b/browser/locales/en-US/chrome/browser/preferences/sync.dtd
@@ -5,18 +5,18 @@
 <!-- The page shown when logged in... -->
 
 <!ENTITY engine.bookmarks.label     "Bookmarks">
 <!ENTITY engine.bookmarks.accesskey "m">
 <!ENTITY engine.tabs.label2         "Open Tabs">
 <!ENTITY engine.tabs.accesskey      "T">
 <!ENTITY engine.history.label       "History">
 <!ENTITY engine.history.accesskey   "r">
-<!ENTITY engine.passwords.label     "Passwords">
-<!ENTITY engine.passwords.accesskey "P">
+<!ENTITY engine.logins.label        "Logins">
+<!ENTITY engine.logins.accesskey    "L">
 <!ENTITY engine.prefs.label         "Preferences">
 <!ENTITY engine.prefs.accesskey     "S">
 <!ENTITY engine.addons.label        "Add-ons">
 <!ENTITY engine.addons.accesskey    "A">
 
 <!-- Device Settings -->
 <!ENTITY fxaSyncDeviceName.label       "Device Name">
 <!ENTITY changeSyncDeviceName2.label "Change Device Name…">
--- a/browser/modules/AboutHome.jsm
+++ b/browser/modules/AboutHome.jsm
@@ -133,21 +133,21 @@ var AboutHome = {
         window.PlacesCommandHook.showPlacesOrganizer("History");
         break;
 
       case "AboutHome:Addons":
         window.BrowserOpenAddonsMgr();
         break;
 
       case "AboutHome:Sync":
-        window.openPreferences("paneSync", { urlParams: { entrypoint: "abouthome" } });
+        window.openPreferences("paneSync", { urlParams: { entrypoint: "abouthome" }, origin: "aboutHome"  });
         break;
 
       case "AboutHome:Settings":
-        window.openPreferences();
+        window.openPreferences(undefined, {origin: "aboutHome"} );
         break;
 
       case "AboutHome:RequestUpdate":
         this.sendAboutHomeData(aMessage.target);
         break;
 
       case "AboutHome:MaybeShowAutoMigrationUndoNotification":
         AutoMigrate.maybeShowUndoNotification(aMessage.target);
--- a/browser/modules/ContentSearch.jsm
+++ b/browser/modules/ContentSearch.jsm
@@ -409,17 +409,17 @@ this.ContentSearch = {
   },
 
   _onMessageSetCurrentEngine(msg, data) {
     Services.search.currentEngine = Services.search.getEngineByName(data);
   },
 
   _onMessageManageEngines(msg, data) {
     let browserWin = msg.target.ownerGlobal;
-    browserWin.openPreferences("paneGeneral");
+    browserWin.openPreferences("paneGeneral", {origin: "contentSearch"});
   },
 
   async _onMessageGetSuggestions(msg, data) {
     this._ensureDataHasProperties(data, [
       "engineName",
       "searchString",
     ]);
     let {engineName, searchString} = data;
--- a/build/autoconf/android.m4
+++ b/build/autoconf/android.m4
@@ -196,18 +196,16 @@ AC_DEFUN([MOZ_ANDROID_AAR],[
   MOZ_ANDROID_AAR_COMPONENT(concat(local_aar_var, _INTERNAL_LIB), concat(root, libs/$1-$2-internal_impl-$2.jar), $5)
   MOZ_ANDROID_AAR_COMPONENT(concat(local_aar_var, _ASSETS), concat(root, assets), $6)
 ])
 
 AC_DEFUN([MOZ_ANDROID_GOOGLE_PLAY_SERVICES],
 [
 
 if test -n "$MOZ_NATIVE_DEVICES" ; then
-    AC_SUBST(MOZ_NATIVE_DEVICES)
-
     MOZ_ANDROID_AAR(play-services-base, $ANDROID_GOOGLE_PLAY_SERVICES_VERSION, google, com/google/android/gms)
     MOZ_ANDROID_AAR(play-services-basement, $ANDROID_GOOGLE_PLAY_SERVICES_VERSION, google, com/google/android/gms)
     MOZ_ANDROID_AAR(play-services-cast, $ANDROID_GOOGLE_PLAY_SERVICES_VERSION, google, com/google/android/gms)
     MOZ_ANDROID_AAR(mediarouter-v7, $ANDROID_SUPPORT_LIBRARY_VERSION, android, com/android/support, REQUIRED_INTERNAL_IMPL)
 fi
 
 ])
 
@@ -222,17 +220,16 @@ if test -n "$MOZ_ANDROID_GCM" ; then
 fi
 
 ])
 
 AC_DEFUN([MOZ_ANDROID_INSTALL_TRACKING],
 [
 
 if test -n "$MOZ_INSTALL_TRACKING"; then
-    AC_SUBST(MOZ_INSTALL_TRACKING)
     MOZ_ANDROID_AAR(play-services-ads, $ANDROID_GOOGLE_PLAY_SERVICES_VERSION, google, com/google/android/gms)
     MOZ_ANDROID_AAR(play-services-basement, $ANDROID_GOOGLE_PLAY_SERVICES_VERSION, google, com/google/android/gms)
 fi
 
 ])
 
 dnl Configure an Android SDK.
 dnl Arg 1: target SDK version, like 23.
deleted file mode 100644
--- a/build/autoconf/jemalloc.m4
+++ /dev/null
@@ -1,117 +0,0 @@
-dnl This Source Code Form is subject to the terms of the Mozilla Public
-dnl License, v. 2.0. If a copy of the MPL was not distributed with this
-dnl file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-AC_DEFUN([MOZ_SUBCONFIGURE_JEMALLOC], [
-
-if test "$MOZ_BUILD_APP" != js -o -n "$JS_STANDALONE"; then
-
-  # Run jemalloc configure script
-
-  if test -z "$MOZ_SYSTEM_JEMALLOC" -a "$MOZ_MEMORY" && test -n "$MOZ_JEMALLOC4" -o -n "$MOZ_REPLACE_MALLOC"; then
-    ac_configure_args="--build=$build --host=$target --enable-stats --with-jemalloc-prefix=je_ --disable-valgrind"
-    if test -n "$MOZ_DEBUG"; then
-      ac_configure_args="$ac_configure_args --enable-debug"
-    fi
-    # We're using memalign for _aligned_malloc in memory/build/mozmemory_wrap.c
-    # on Windows, so just export memalign on all platforms.
-    ac_configure_args="$ac_configure_args ac_cv_func_memalign=yes"
-    if test -n "$MOZ_REPLACE_MALLOC"; then
-      # When using replace_malloc, we always want valloc exported from jemalloc.
-      ac_configure_args="$ac_configure_args ac_cv_func_valloc=yes"
-      if test "${OS_ARCH}" = Darwin; then
-        # We also need to enable pointer validation on Mac because jemalloc's
-        # zone allocator is not used.
-        ac_configure_args="$ac_configure_args --enable-ivsalloc"
-      fi
-    fi
-    if test -n "$MOZ_JEMALLOC4"; then
-      case "${OS_ARCH}" in
-        WINNT|Darwin)
-          # We want jemalloc functions to be kept hidden on both Mac and Windows
-          # See memory/build/mozmemory_wrap.h for details.
-          ac_configure_args="$ac_configure_args --without-export"
-          ;;
-      esac
-      if test "${OS_ARCH}" = WINNT; then
-        # Lazy lock initialization doesn't play well with lazy linking of
-        # mozglue.dll on Windows XP (leads to startup crash), so disable it.
-        ac_configure_args="$ac_configure_args --disable-lazy-lock"
-
-        # 64-bit Windows builds require a minimum 16-byte alignment.
-        if test -n "$HAVE_64BIT_BUILD"; then
-          ac_configure_args="$ac_configure_args --with-lg-tiny-min=4"
-        fi
-      fi
-    elif test "${OS_ARCH}" = Darwin; then
-      # When building as a replace-malloc lib, disabling the zone allocator
-      # forces to use pthread_atfork.
-      ac_configure_args="$ac_configure_args --disable-zone-allocator"
-    fi
-    _MANGLE="malloc posix_memalign aligned_alloc calloc realloc free memalign valloc malloc_usable_size"
-    JEMALLOC_WRAPPER=
-    if test -z "$MOZ_REPLACE_MALLOC"; then
-      case "$OS_ARCH" in
-        Linux|DragonFly|FreeBSD|NetBSD|OpenBSD)
-          MANGLE=$_MANGLE
-          ;;
-      esac
-    elif test -z "$MOZ_JEMALLOC4"; then
-      MANGLE=$_MANGLE
-      JEMALLOC_WRAPPER=replace_
-    fi
-    if test -n "$MANGLE"; then
-      MANGLED=
-      for mangle in ${MANGLE}; do
-        if test -n "$MANGLED"; then
-          MANGLED="$mangle:$JEMALLOC_WRAPPER$mangle,$MANGLED"
-        else
-          MANGLED="$mangle:$JEMALLOC_WRAPPER$mangle"
-        fi
-      done
-      ac_configure_args="$ac_configure_args --with-mangling=$MANGLED"
-    fi
-    unset CONFIG_FILES
-    if test -z "$MOZ_TLS"; then
-      ac_configure_args="$ac_configure_args --disable-tls"
-    fi
-    EXTRA_CFLAGS="$CFLAGS"
-    for var in AS CC CXX CPP AR RANLIB STRIP CPPFLAGS EXTRA_CFLAGS LDFLAGS; do
-      ac_configure_args="$ac_configure_args $var='`eval echo \\${${var}}`'"
-    done
-
-    # jemalloc's configure assumes that if you have CFLAGS set at all, you set
-    # all the flags necessary to configure jemalloc, which is not likely to be
-    # the case on Windows if someone is building Firefox with flags set in
-    # their mozconfig.
-    if test "$_MSC_VER"; then
-       ac_configure_args="$ac_configure_args CFLAGS="
-    fi
-
-    # Force disable DSS support in jemalloc.
-    ac_configure_args="$ac_configure_args ac_cv_func_sbrk=false"
-
-    # Make Linux builds munmap freed chunks instead of recycling them.
-    ac_configure_args="$ac_configure_args --enable-munmap"
-
-    # Disable cache oblivious behavior that appears to have a performance
-    # impact on Firefox.
-    ac_configure_args="$ac_configure_args --disable-cache-oblivious"
-
-    if ! test -e memory/jemalloc; then
-      mkdir -p memory/jemalloc
-    fi
-
-    # jemalloc's configure runs git to determine the version. But when building
-    # from a gecko git clone, the git commands it uses is going to pick gecko's
-    # information, not jemalloc's, which is useless. So pretend we don't have git
-    # at all. That will make jemalloc's configure pick the in-tree VERSION file.
-    (PATH="$srcdir/memory/jemalloc/helper:$PATH";
-    AC_OUTPUT_SUBDIRS(memory/jemalloc/src)
-    ) || exit 1
-    ac_configure_args="$_SUBDIR_CONFIG_ARGS"
-  fi
-
-fi
-
-])
--- a/build/moz.configure/keyfiles.configure
+++ b/build/moz.configure/keyfiles.configure
@@ -32,20 +32,16 @@ def keyfile(desc, help=None, callback=la
 
     return keyfile
 
 
 @template
 def simple_keyfile(desc):
     value = keyfile(desc)
     set_config('MOZ_%s_KEY' % desc.upper().replace(' ', '_'), value)
-    # Only really required for MOZ_ADJUST_SDK_KEY currently still used in
-    # old-configure.
-    add_old_configure_assignment('MOZ_%s_KEY' % desc.upper().replace(' ', '_'),
-                                 value)
 
 
 @template
 def id_and_secret_keyfile(desc):
     def id_and_secret(value):
         if value.startswith('no-') and value.endswith('-key'):
             id = value[:-3] + 'clientid'
             secret = value
--- a/build/moz.configure/memory.configure
+++ b/build/moz.configure/memory.configure
@@ -1,20 +1,21 @@
 # -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
 # vim: set filetype=python:
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 
-option(env='MOZ_JEMALLOC4', help='Enable jemalloc 4')
-imply_option('--enable-jemalloc', depends_if('MOZ_JEMALLOC4')(lambda x: '4'))
+@deprecated_option(env='MOZ_JEMALLOC4')
+def moz_jemalloc4(value):
+    die('MOZ_JEMALLOC4 is deprecated')
 
 
-option('--enable-jemalloc', nargs='?', choices=('4', 'moz'), env='MOZ_MEMORY',
+option('--enable-jemalloc', env='MOZ_MEMORY',
        help='Replace memory allocator with jemalloc')
 
 @depends('--enable-jemalloc', target, build_project, c_compiler)
 def jemalloc(value, target, build_project, c_compiler):
     if value.origin != 'default':
         return bool(value) or None
 
     if build_project == 'js':
@@ -25,61 +26,50 @@ def jemalloc(value, target, build_projec
         return True
 
     if target.kernel == 'WINNT' and c_compiler.type in ('msvc', 'clang-cl'):
         return True
 
     if target.kernel == 'Linux':
         return True
 
-@depends('--enable-jemalloc')
-def jemalloc4(jemalloc):
-    if len(jemalloc) and jemalloc[0] == '4':
-        return True
-
 
 set_config('MOZ_MEMORY', jemalloc)
 set_define('MOZ_MEMORY', jemalloc)
 add_old_configure_assignment('MOZ_MEMORY', jemalloc)
 
-set_config('MOZ_JEMALLOC4', jemalloc4)
-set_define('MOZ_JEMALLOC4', jemalloc4)
-add_old_configure_assignment('MOZ_JEMALLOC4', jemalloc4)
-
 
 # Because --enable-jemalloc doesn't use a default because of the dependency
 # on the target, we can't use a js_option for it to propagate to js/src
 # through the old-configure.
-@depends(jemalloc, jemalloc4)
-def jemalloc_for_old_configure(jemalloc, jemalloc4):
-    if jemalloc:
-        return '--enable-jemalloc=4' if jemalloc4 else '--enable-jemalloc'
-    return '--disable-jemalloc'
+@depends(jemalloc)
+def jemalloc_for_old_configure(jemalloc):
+    return '--%s-jemalloc' % ('enable' if jemalloc else 'disable')
 
 add_old_configure_arg(jemalloc_for_old_configure)
 
 
-@depends(jemalloc, jemalloc4, target)
-def jemalloc_os_define(jemalloc, jemalloc4, target):
-    if jemalloc and not jemalloc4:
+@depends(jemalloc, target)
+def jemalloc_os_define(jemalloc, target):
+    if jemalloc:
         if target.kernel == 'WINNT':
             return 'MOZ_MEMORY_WINDOWS'
         if target.kernel == 'Linux':
             return 'MOZ_MEMORY_LINUX'
         if target.kernel == 'Darwin':
             return 'MOZ_MEMORY_DARWIN'
         if target.kernel in ('kFreeBSD', 'FreeBSD', 'NetBSD'):
             return 'MOZ_MEMORY_BSD'
         die('--enable-jemalloc is not supported on %s', target.kernel)
 
 set_define(jemalloc_os_define, '1')
 
-@depends(jemalloc, jemalloc4, target)
-def jemalloc_os_define_android(jemalloc, jemalloc4, target):
-    if jemalloc and not jemalloc4 and target.os == 'Android':
+@depends(jemalloc, target)
+def jemalloc_os_define_android(jemalloc, target):
+    if jemalloc and target.os == 'Android':
         return 'MOZ_MEMORY_ANDROID'
 
 set_define(jemalloc_os_define_android, '1')
 
 
 option('--enable-replace-malloc',
        help='Enable ability to dynamically replace the malloc implementation')
 
--- a/devtools/bootstrap.js
+++ b/devtools/bootstrap.js
@@ -51,17 +51,19 @@ function processPrefFile(url) {
 
     // Prevent overriding prefs that have been changed by the user
     if (Services.prefs.prefHasUserValue(name)) {
       return;
     }
     let defaultBranch = Services.prefs.getDefaultBranch("");
     if ((val.startsWith("\"") && val.endsWith("\"")) ||
         (val.startsWith("'") && val.endsWith("'"))) {
-      defaultBranch.setCharPref(name, val.substr(1, val.length - 2));
+      val = val.substr(1, val.length - 2);
+      val = val.replace(/\\"/g, '"');
+      defaultBranch.setCharPref(name, val);
     } else if (val.match(/[0-9]+/)) {
       defaultBranch.setIntPref(name, parseInt(val, 10));
     } else if (val == "true" || val == "false") {
       defaultBranch.setBoolPref(name, val == "true");
     } else {
       console.log("Unable to match preference type for value:", val);
     }
   });
--- a/devtools/client/inspector/shared/test/browser_styleinspector_output-parser.js
+++ b/devtools/client/inspector/shared/test/browser_styleinspector_output-parser.js
@@ -157,27 +157,23 @@ const TEST_DATA = [
       is(allSwatches[1].textContent, "rgba(33,180,226,1)");
       is(allSwatches[2].textContent, "rgba(31,170,217,.5)");
       is(allSwatches[3].textContent, "#F06");
       is(allSwatches[4].textContent, "red");
     }
   },
   {
     name: "background",
-    value: "-moz-radial-gradient(center 45deg, circle closest-side, " +
-           "orange 0%, red 100%)",
+    value: "radial-gradient(circle closest-side at center, orange 0%, red 100%)",
     test: fragment => {
-      is(countAll(fragment), 6);
+      is(countAll(fragment), 4);
       let colorSwatches = fragment.querySelectorAll("." + COLOR_CLASS);
       is(colorSwatches.length, 2);
       is(colorSwatches[0].textContent, "orange");
       is(colorSwatches[1].textContent, "red");
-      let angleSwatches = fragment.querySelectorAll("." + ANGLE_CLASS);
-      is(angleSwatches.length, 1);
-      is(angleSwatches[0].textContent, "45deg");
     }
   },
   {
     name: "background",
     value: "white  url(http://test.com/wow_such_image.png) no-repeat top left",
     test: fragment => {
       is(countAll(fragment), 3);
       is(countUrls(fragment), 1);
--- a/devtools/client/preferences/devtools.js
+++ b/devtools/client/preferences/devtools.js
@@ -177,17 +177,17 @@ pref("devtools.netmonitor.har.enableAuto
 pref("devtools.scratchpad.recentFilesMax", 10);
 pref("devtools.scratchpad.lineNumbers", true);
 pref("devtools.scratchpad.wrapText", false);
 pref("devtools.scratchpad.showTrailingSpace", false);
 pref("devtools.scratchpad.editorFontSize", 12);
 pref("devtools.scratchpad.enableAutocompletion", true);
 
 // Enable the Storage Inspector
-pref("devtools.storage.enabled", false);
+pref("devtools.storage.enabled", true);
 
 // Enable the Style Editor.
 pref("devtools.styleeditor.enabled", true);
 pref("devtools.styleeditor.source-maps-enabled", true);
 pref("devtools.styleeditor.autocompletion-enabled", true);
 pref("devtools.styleeditor.showMediaSidebar", true);
 pref("devtools.styleeditor.mediaSidebarWidth", 238);
 pref("devtools.styleeditor.navSidebarWidth", 245);
--- a/devtools/client/shared/test/browser_telemetry_toolboxtabs_storage.js
+++ b/devtools/client/shared/test/browser_telemetry_toolboxtabs_storage.js
@@ -6,23 +6,17 @@
 const TEST_URI = "data:text/html;charset=utf-8," +
   "<p>browser_telemetry_toolboxtabs_storage.js</p>";
 
 // Because we need to gather stats for the period of time that a tool has been
 // opened we make use of setTimeout() to create tool active times.
 const TOOL_DELAY = 1000;
 
 add_task(function* () {
-  info("Activating the storage inspector");
-  Services.prefs.setBoolPref("devtools.storage.enabled", true);
-
   yield addTab(TEST_URI);
   let Telemetry = loadTelemetryAndRecordLogs();
 
   yield openAndCloseToolbox(2, TOOL_DELAY, "storage");
   checkTelemetryResults(Telemetry);
 
   stopRecordingTelemetryLogs(Telemetry);
   gBrowser.removeCurrentTab();
-
-  info("De-activating the storage inspector");
-  Services.prefs.clearUserPref("devtools.storage.enabled");
 });
--- a/devtools/client/storage/test/browser.ini
+++ b/devtools/client/storage/test/browser.ini
@@ -44,18 +44,20 @@ tags = usercontextid
 [browser_storage_dom_cache_disabled.js]
 [browser_storage_dynamic_updates_cookies.js]
 [browser_storage_dynamic_updates_localStorage.js]
 [browser_storage_dynamic_updates_sessionStorage.js]
 [browser_storage_empty_objectstores.js]
 [browser_storage_indexeddb_delete.js]
 [browser_storage_indexeddb_delete_blocked.js]
 [browser_storage_indexeddb_duplicate_names.js]
+[browser_storage_localstorage_add.js]
 [browser_storage_localstorage_edit.js]
 [browser_storage_localstorage_error.js]
 [browser_storage_overflow.js]
 [browser_storage_search.js]
 [browser_storage_search_keyboard_trap.js]
+[browser_storage_sessionstorage_add.js]
 [browser_storage_sessionstorage_edit.js]
 [browser_storage_sidebar.js]
 [browser_storage_sidebar_toggle.js]
 [browser_storage_sidebar_update.js]
 [browser_storage_values.js]
new file mode 100644
--- /dev/null
+++ b/devtools/client/storage/test/browser_storage_localstorage_add.js
@@ -0,0 +1,20 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Basic test to check the adding of localStorage entries.
+
+"use strict";
+
+add_task(function* () {
+  yield openTabAndSetupStorage(MAIN_DOMAIN + "storage-localstorage.html");
+  showAllColumns(true);
+
+  yield performAdd(["localStorage", "http://test1.example.org"]);
+  yield performAdd(["localStorage", "http://test1.example.org"]);
+  yield performAdd(["localStorage", "http://test1.example.org"]);
+  yield performAdd(["localStorage", "http://test1.example.org"]);
+  yield performAdd(["localStorage", "http://test1.example.org"]);
+
+  yield finishTests();
+});
new file mode 100644
--- /dev/null
+++ b/devtools/client/storage/test/browser_storage_sessionstorage_add.js
@@ -0,0 +1,20 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Basic test to check the adding of sessionStorage entries.
+
+"use strict";
+
+add_task(function* () {
+  yield openTabAndSetupStorage(MAIN_DOMAIN + "storage-sessionstorage.html");
+  showAllColumns(true);
+
+  yield performAdd(["sessionStorage", "http://test1.example.org"]);
+  yield performAdd(["sessionStorage", "http://test1.example.org"]);
+  yield performAdd(["sessionStorage", "http://test1.example.org"]);
+  yield performAdd(["sessionStorage", "http://test1.example.org"]);
+  yield performAdd(["sessionStorage", "http://test1.example.org"]);
+
+  yield finishTests();
+});
--- a/devtools/client/storage/test/head.js
+++ b/devtools/client/storage/test/head.js
@@ -966,18 +966,19 @@ function sidebarToggleVisible() {
 
 /**
  * Add an item.
  * @param  {Array} store
  *         An array containing the path to the store to which we wish to add an
  *         item.
  */
 function* performAdd(store) {
+  let storeName = store.join(" > ");
   let toolbar = gPanelWindow.document.getElementById("storage-toolbar");
-  let storeName = store.join(" > ");
+  let type = store[0];
 
   yield selectTreeItem(store);
 
   let menuAdd = toolbar.querySelector(
     "#add-button");
 
   if (menuAdd.hidden) {
     is(menuAdd.hidden, false,
@@ -988,12 +989,13 @@ function* performAdd(store) {
   let eventEdit = gUI.table.once("row-edit");
   let eventWait = gUI.once("store-objects-updated");
 
   menuAdd.click();
 
   let rowId = yield eventEdit;
   yield eventWait;
 
-  let value = getCellValue(rowId, "uniqueKey");
+  let key = type === "cookies" ? "uniqueKey" : "name";
+  let value = getCellValue(rowId, key);
 
   is(rowId, value, `Row '${rowId}' was successfully added.`);
 }
--- a/devtools/client/storage/ui.js
+++ b/devtools/client/storage/ui.js
@@ -1122,21 +1122,22 @@ StorageUI.prototype = {
     }
   },
 
   /**
    * Handles adding an item from the storage
    */
   onAddItem: function () {
     let front = this.getCurrentFront();
+    let [, host] = this.tree.selectedItem;
 
     // Prepare to scroll into view.
     this.table.scrollIntoViewOnUpdate = true;
     this.table.editBookmark = createGUID();
-    front.addItem(this.table.editBookmark);
+    front.addItem(this.table.editBookmark, host);
   },
 
   /**
    * Handles removing an item from the storage
    */
   onRemoveItem: function () {
     let [, host, ...path] = this.tree.selectedItem;
     let front = this.getCurrentFront();
--- a/devtools/server/actors/storage.js
+++ b/devtools/server/actors/storage.js
@@ -10,16 +10,18 @@ const protocol = require("devtools/share
 const {LongStringActor} = require("devtools/server/actors/string");
 const {DebuggerServer} = require("devtools/server/main");
 const Services = require("Services");
 const promise = require("promise");
 const {isWindowIncluded} = require("devtools/shared/layout/utils");
 const specs = require("devtools/shared/specs/storage");
 const { Task } = require("devtools/shared/task");
 
+const DEFAULT_VALUE = "value";
+
 loader.lazyRequireGetter(this, "naturalSortCaseInsensitive",
   "devtools/client/shared/natural-sort", true);
 
 // GUID to be used as a separator in compound keys. This must match the same
 // constant in devtools/client/storage/ui.js,
 // devtools/client/storage/test/head.js and
 // devtools/server/tests/browser/head.js
 const SEPARATOR_GUID = "{9d414cc5-8319-0a04-0586-c0a6ae01670a}";
@@ -668,17 +670,17 @@ StorageActors.createActor({
     this.editCookie(data);
   }),
 
   addItem: Task.async(function* (guid) {
     let doc = this.storageActor.document;
     let time = new Date().getTime();
     let expiry = new Date(time + 3600 * 24 * 1000).toGMTString();
 
-    doc.cookie = `${guid}=value;expires=${expiry}`;
+    doc.cookie = `${guid}=${DEFAULT_VALUE};expires=${expiry}`;
   }),
 
   removeItem: Task.async(function* (host, name) {
     let doc = this.storageActor.document;
     this.removeCookie(host, name, doc.nodePrincipal
                                      .originAttributes);
   }),
 
@@ -1131,16 +1133,24 @@ function getObjectForLocalOrSessionStora
 
     getFields: Task.async(function* () {
       return [
         { name: "name", editable: true },
         { name: "value", editable: true }
       ];
     }),
 
+    addItem: Task.async(function* (guid, host) {
+      let storage = this.hostVsStores.get(host);
+      if (!storage) {
+        return;
+      }
+      storage.setItem(guid, DEFAULT_VALUE);
+    }),
+
     /**
      * Edit localStorage or sessionStorage fields.
      *
      * @param {Object} data
      *        See editCookie() for format details.
      */
     editItem: Task.async(function* ({host, field, oldValue, items}) {
       let storage = this.hostVsStores.get(host);
--- a/devtools/shared/specs/storage.js
+++ b/devtools/shared/specs/storage.js
@@ -113,16 +113,25 @@ types.addDictType("storageobject", {
   name: "string",
   value: "longstring"
 });
 
 // Common methods for local/session storage
 const storageMethods = Object.assign({},
   editRemoveMethods,
   {
+    addItem: {
+      request: {
+        guid: Arg(0, "string"),
+        host: Arg(1, "nullable:string")
+      },
+      response: {}
+    }
+  },
+  {
     removeAll: {
       request: {
         host: Arg(0, "string")
       },
       response: {}
     }
   }
 );
--- a/dom/animation/EffectCompositor.cpp
+++ b/dom/animation/EffectCompositor.cpp
@@ -1011,53 +1011,49 @@ EffectCompositor::PreTraverseInSubtree(E
       // about to restyle it.
       iter.Remove();
     }
   }
   return foundElementsNeedingRestyle;
 }
 
 bool
-EffectCompositor::PreTraverse(dom::Element* aElement, nsIAtom* aPseudoTagOrNull)
+EffectCompositor::PreTraverse(dom::Element* aElement,
+                              CSSPseudoElementType aPseudoType)
 {
   MOZ_ASSERT(NS_IsMainThread());
   MOZ_ASSERT(mPresContext->RestyleManager()->IsServo());
 
   bool found = false;
-  if (aPseudoTagOrNull &&
-      aPseudoTagOrNull != nsCSSPseudoElements::before &&
-      aPseudoTagOrNull != nsCSSPseudoElements::after) {
+  if (aPseudoType != CSSPseudoElementType::NotPseudo &&
+      aPseudoType != CSSPseudoElementType::before &&
+      aPseudoType != CSSPseudoElementType::after) {
     return found;
   }
 
-  CSSPseudoElementType pseudoType =
-    nsCSSPseudoElements::GetPseudoType(aPseudoTagOrNull,
-                                       CSSEnabledState::eForAllContent);
-
-  PseudoElementHashEntry::KeyType key = { aElement, pseudoType };
-
+  PseudoElementHashEntry::KeyType key = { aElement, aPseudoType };
 
   for (size_t i = 0; i < kCascadeLevelCount; ++i) {
     CascadeLevel cascadeLevel = CascadeLevel(i);
     auto& elementSet = mElementsToRestyle[cascadeLevel];
 
     if (!elementSet.Get(key)) {
       // Ignore throttled restyle and no restyle request.
       continue;
     }
 
     mPresContext->RestyleManager()->AsServo()->
       PostRestyleEventForAnimations(aElement,
                                     cascadeLevel == CascadeLevel::Transitions
                                       ? eRestyle_CSSTransitions
                                       : eRestyle_CSSAnimations);
 
-    EffectSet* effects = EffectSet::GetEffectSet(aElement, pseudoType);
+    EffectSet* effects = EffectSet::GetEffectSet(aElement, aPseudoType);
     if (effects) {
-      MaybeUpdateCascadeResults(aElement, pseudoType);
+      MaybeUpdateCascadeResults(aElement, aPseudoType);
 
       for (KeyframeEffectReadOnly* effect : *effects) {
         effect->GetAnimation()->WillComposeStyle();
       }
     }
 
     elementSet.Remove(key);
     found = true;
--- a/dom/animation/EffectCompositor.h
+++ b/dom/animation/EffectCompositor.h
@@ -242,17 +242,17 @@ public:
 
   // Do a bunch of stuff that we should avoid doing during the parallel
   // traversal (e.g. changing member variables) for all elements that we expect
   // to restyle on the next traversal.
   // Returns true if there are elements needing a restyle for animation.
   bool PreTraverse();
 
   // Similar to the above but only for the (pseudo-)element.
-  bool PreTraverse(dom::Element* aElement, nsIAtom* aPseudoTagOrNull);
+  bool PreTraverse(dom::Element* aElement, CSSPseudoElementType aPseudoType);
 
   // Similar to the above but for all elements in the subtree rooted
   // at aElement.
   bool PreTraverseInSubtree(dom::Element* aElement);
 
 private:
   ~EffectCompositor() = default;
 
--- a/dom/animation/KeyframeEffectReadOnly.cpp
+++ b/dom/animation/KeyframeEffectReadOnly.cpp
@@ -522,31 +522,28 @@ KeyframeEffectReadOnly::EnsureBaseStyles
   nsPresContext* presContext =
     nsContentUtils::GetContextForContent(mTarget->mElement);
   MOZ_ASSERT(presContext,
              "nsPresContext should not be nullptr since this EnsureBaseStyles "
              "supposed to be called right after getting computed values with "
              "a valid nsPresContext");
 
   RefPtr<ServoComputedValues> baseComputedValues;
-  nsIAtom* pseudoAtom = mTarget->mPseudoType < CSSPseudoElementType::Count
-                      ? nsCSSPseudoElements::GetPseudoAtom(mTarget->mPseudoType)
-                      : nullptr;
   for (const AnimationProperty& property : aProperties) {
     EnsureBaseStyle(property,
-                    pseudoAtom,
+                    mTarget->mPseudoType,
                     presContext,
                     baseComputedValues);
   }
 }
 
 void
 KeyframeEffectReadOnly::EnsureBaseStyle(
   const AnimationProperty& aProperty,
-  nsIAtom* aPseudoAtom,
+  CSSPseudoElementType aPseudoType,
   nsPresContext* aPresContext,
   RefPtr<ServoComputedValues>& aBaseComputedValues)
 {
   bool hasAdditiveValues = false;
 
   for (const AnimationPropertySegment& segment : aProperty.mSegments) {
     if (!segment.HasReplaceableValues()) {
       hasAdditiveValues = true;
@@ -556,17 +553,17 @@ KeyframeEffectReadOnly::EnsureBaseStyle(
 
   if (!hasAdditiveValues) {
     return;
   }
 
   if (!aBaseComputedValues) {
     aBaseComputedValues =
       aPresContext->StyleSet()->AsServo()->
-        GetBaseComputedValuesForElement(mTarget->mElement, aPseudoAtom);
+        GetBaseComputedValuesForElement(mTarget->mElement, aPseudoType);
   }
   RefPtr<RawServoAnimationValue> baseValue =
     Servo_ComputedValues_ExtractAnimationValue(aBaseComputedValues,
                                                aProperty.mProperty).Consume();
   mBaseStyleValuesForServo.Put(aProperty.mProperty, baseValue);
 }
 
 void
--- a/dom/animation/KeyframeEffectReadOnly.h
+++ b/dom/animation/KeyframeEffectReadOnly.h
@@ -375,17 +375,17 @@ protected:
   // base style context will be resolved and stored in
   // |aCachedBaseStyleContext|.
   void EnsureBaseStyle(nsCSSPropertyID aProperty,
                        nsStyleContext* aStyleContext,
                        RefPtr<nsStyleContext>& aCachedBaseStyleContext);
   // Stylo version of the above function that also first checks for an additive
   // value in |aProperty|'s list of segments.
   void EnsureBaseStyle(const AnimationProperty& aProperty,
-                       nsIAtom* aPseudoAtom,
+                       CSSPseudoElementType aPseudoType,
                        nsPresContext* aPresContext,
                        RefPtr<ServoComputedValues>& aBaseComputedValues);
 
   Maybe<OwningAnimationTarget> mTarget;
 
   KeyframeEffectParams mEffectOptions;
 
   // The specified keyframes.
--- a/dom/base/nsDocument.cpp
+++ b/dom/base/nsDocument.cpp
@@ -13230,33 +13230,55 @@ ArrayContainsTable(const nsTArray<nsCStr
  * For more information, see
  * toolkit/components/url-classifier/flash-block-lists.rst
  */
 FlashClassification
 nsDocument::PrincipalFlashClassification()
 {
   nsresult rv;
 
-  // If flash blocking is disabled, it is equivalent to all sites being
-  // on neither list.
-  if (!Preferences::GetBool("plugins.flashBlock.enabled")) {
+  bool httpOnly = Preferences::GetBool("plugins.http_https_only", true);
+  bool flashBlock = Preferences::GetBool("plugins.flashBlock.enabled", false);
+
+  // If neither pref is on, skip the null-principal and principal URI checks.
+  if (!httpOnly && !flashBlock) {
     return FlashClassification::Unknown;
   }
 
   nsCOMPtr<nsIPrincipal> principal = GetPrincipal();
   if (principal->GetIsNullPrincipal()) {
     return FlashClassification::Denied;
   }
 
   nsCOMPtr<nsIURI> classificationURI;
   rv = principal->GetURI(getter_AddRefs(classificationURI));
   if (NS_FAILED(rv) || !classificationURI) {
     return FlashClassification::Denied;
   }
 
+  if (httpOnly) {
+    // Only allow plugins for documents from an HTTP/HTTPS origin. This should
+    // allow dependent data: URIs to load plugins, but not:
+    // * chrome documents
+    // * "bare" data: loads
+    // * FTP/gopher/file
+    nsAutoCString scheme;
+    rv = classificationURI->GetScheme(scheme);
+    if (NS_WARN_IF(NS_FAILED(rv)) ||
+        !(scheme.EqualsLiteral("http") || scheme.EqualsLiteral("https"))) {
+      return FlashClassification::Denied;
+    }
+  }
+
+  // If flash blocking is disabled, it is equivalent to all sites being
+  // on neither list.
+  if (!flashBlock) {
+    return FlashClassification::Unknown;
+  }
+
   nsAutoCString allowTables, allowExceptionsTables,
                 denyTables, denyExceptionsTables,
                 subDocDenyTables, subDocDenyExceptionsTables,
                 tables;
   Preferences::GetCString("urlclassifier.flashAllowTable", &allowTables);
   MaybeAddTableToTableList(allowTables, tables);
   Preferences::GetCString("urlclassifier.flashAllowExceptTable",
                           &allowExceptionsTables);
--- a/dom/canvas/CanvasRenderingContext2D.cpp
+++ b/dom/canvas/CanvasRenderingContext2D.cpp
@@ -2869,17 +2869,19 @@ GetFontStyleForServo(Element* aElement, 
   // have to get a parent style context for inherit-like relative
   // values (2em, bolder, etc.)
   if (aElement && aElement->IsInUncomposedDoc()) {
     // Inherit from the canvas element.
     aPresShell->FlushPendingNotifications(FlushType::Style);
     // We need to use ResolveTransientServoStyle, which involves traversal,
     // instead of ResolveServoStyle() because we need up-to-date style even if
     // the canvas element is display:none.
-    parentStyle = styleSet->ResolveTransientServoStyle(aElement, nullptr);
+    parentStyle =
+      styleSet->ResolveTransientServoStyle(aElement,
+                                           CSSPseudoElementType::NotPseudo);
   } else {
     RefPtr<RawServoDeclarationBlock> declarations =
       CreateFontDeclarationForServo(NS_LITERAL_STRING("10px sans-serif"),
                                     aPresShell->GetDocument());
     MOZ_ASSERT(declarations);
 
     parentStyle = aPresShell->StyleSet()->AsServo()->
       ResolveForDeclarations(nullptr, declarations);
--- a/dom/html/HTMLInputElement.cpp
+++ b/dom/html/HTMLInputElement.cpp
@@ -1811,128 +1811,26 @@ HTMLInputElement::StringToDecimal(const 
   if (!IsASCII(aValue)) {
     return Decimal::nan();
   }
   NS_LossyConvertUTF16toASCII asciiString(aValue);
   std::string stdString = asciiString.get();
   return Decimal::fromString(stdString);
 }
 
-bool
-HTMLInputElement::ConvertStringToNumber(nsAString& aValue,
-                                        Decimal& aResultValue) const
-{
-  MOZ_ASSERT(DoesValueAsNumberApply(),
-             "ConvertStringToNumber only applies if .valueAsNumber applies");
-
-  switch (mType) {
-    case NS_FORM_INPUT_NUMBER:
-    case NS_FORM_INPUT_RANGE:
-      {
-        aResultValue = StringToDecimal(aValue);
-        if (!aResultValue.isFinite()) {
-          return false;
-        }
-        return true;
-      }
-    case NS_FORM_INPUT_DATE:
-      {
-        uint32_t year, month, day;
-        if (!ParseDate(aValue, &year, &month, &day)) {
-          return false;
-        }
-
-        JS::ClippedTime time = JS::TimeClip(JS::MakeDate(year, month - 1, day));
-        if (!time.isValid()) {
-          return false;
-        }
-
-        aResultValue = Decimal::fromDouble(time.toDouble());
-        return true;
-      }
-    case NS_FORM_INPUT_TIME:
-      uint32_t milliseconds;
-      if (!ParseTime(aValue, &milliseconds)) {
-        return false;
-      }
-
-      aResultValue = Decimal(int32_t(milliseconds));
-      return true;
-    case NS_FORM_INPUT_MONTH:
-      {
-        uint32_t year, month;
-        if (!ParseMonth(aValue, &year, &month)) {
-          return false;
-        }
-
-        if (year < kMinimumYear || year > kMaximumYear) {
-          return false;
-        }
-
-        // Maximum valid month is 275760-09.
-        if (year == kMaximumYear && month > kMaximumMonthInMaximumYear) {
-          return false;
-        }
-
-        int32_t months = MonthsSinceJan1970(year, month);
-        aResultValue = Decimal(int32_t(months));
-        return true;
-      }
-    case NS_FORM_INPUT_WEEK:
-      {
-        uint32_t year, week;
-        if (!ParseWeek(aValue, &year, &week)) {
-          return false;
-        }
-
-        if (year < kMinimumYear || year > kMaximumYear) {
-          return false;
-        }
-
-        // Maximum week is 275760-W37, the week of 275760-09-13.
-        if (year == kMaximumYear && week > kMaximumWeekInMaximumYear) {
-          return false;
-        }
-
-        double days = DaysSinceEpochFromWeek(year, week);
-        aResultValue = Decimal::fromDouble(days * kMsPerDay);
-        return true;
-      }
-    case NS_FORM_INPUT_DATETIME_LOCAL:
-      {
-        uint32_t year, month, day, timeInMs;
-        if (!ParseDateTimeLocal(aValue, &year, &month, &day, &timeInMs)) {
-          return false;
-        }
-
-        JS::ClippedTime time = JS::TimeClip(JS::MakeDate(year, month - 1, day,
-                                                         timeInMs));
-        if (!time.isValid()) {
-          return false;
-        }
-
-        aResultValue = Decimal::fromDouble(time.toDouble());
-        return true;
-      }
-    default:
-      MOZ_ASSERT(false, "Unrecognized input type");
-      return false;
-  }
-}
-
 Decimal
 HTMLInputElement::GetValueAsDecimal() const
 {
   Decimal decimalValue;
   nsAutoString stringValue;
 
   GetNonFileValueInternal(stringValue);
 
-  return !ConvertStringToNumber(stringValue, decimalValue) ? Decimal::nan()
-                                                           : decimalValue;
+  return !mInputType->ConvertStringToNumber(stringValue, decimalValue) ?
+    Decimal::nan() : decimalValue;
 }
 
 void
 HTMLInputElement::SetValue(const nsAString& aValue, CallerType aCallerType,
                            ErrorResult& aRv)
 {
   // check security.  Note that setting the value to the empty string is always
   // OK and gives pages a way to clear a file input if necessary.
@@ -2040,185 +1938,21 @@ HTMLInputElement::SetValue(Decimal aValu
 
   if (aValue.isNaN()) {
     IgnoredErrorResult rv;
     SetValue(EmptyString(), aCallerType, rv);
     return;
   }
 
   nsAutoString value;
-  ConvertNumberToString(aValue, value);
+  mInputType->ConvertNumberToString(aValue, value);
   IgnoredErrorResult rv;
   SetValue(value, aCallerType, rv);
 }
 
-bool
-HTMLInputElement::ConvertNumberToString(Decimal aValue,
-                                        nsAString& aResultString) const
-{
-  MOZ_ASSERT(DoesValueAsNumberApply(),
-             "ConvertNumberToString is only implemented for types implementing .valueAsNumber");
-  MOZ_ASSERT(aValue.isFinite(),
-             "aValue must be a valid non-Infinite number.");
-
-  aResultString.Truncate();
-
-  switch (mType) {
-    case NS_FORM_INPUT_NUMBER:
-    case NS_FORM_INPUT_RANGE:
-      {
-        char buf[32];
-        bool ok = aValue.toString(buf, ArrayLength(buf));
-        aResultString.AssignASCII(buf);
-        MOZ_ASSERT(ok, "buf not big enough");
-        return ok;
-      }
-    case NS_FORM_INPUT_DATE:
-      {
-        // The specs (and our JS APIs) require |aValue| to be truncated.
-        aValue = aValue.floor();
-
-        double year = JS::YearFromTime(aValue.toDouble());
-        double month = JS::MonthFromTime(aValue.toDouble());
-        double day = JS::DayFromTime(aValue.toDouble());
-
-        if (IsNaN(year) || IsNaN(month) || IsNaN(day)) {
-          return false;
-        }
-
-        aResultString.AppendPrintf("%04.0f-%02.0f-%02.0f", year,
-                                   month + 1, day);
-
-        return true;
-      }
-    case NS_FORM_INPUT_TIME:
-      {
-        aValue = aValue.floor();
-        // Per spec, we need to truncate |aValue| and we should only represent
-        // times inside a day [00:00, 24:00[, which means that we should do a
-        // modulo on |aValue| using the number of milliseconds in a day (86400000).
-        uint32_t value =
-          NS_floorModulo(aValue, Decimal::fromDouble(kMsPerDay)).toDouble();
-
-        uint16_t milliseconds, seconds, minutes, hours;
-        if (!GetTimeFromMs(value, &hours, &minutes, &seconds, &milliseconds)) {
-          return false;
-        }
-
-        if (milliseconds != 0) {
-          aResultString.AppendPrintf("%02d:%02d:%02d.%03d",
-                                     hours, minutes, seconds, milliseconds);
-        } else if (seconds != 0) {
-          aResultString.AppendPrintf("%02d:%02d:%02d",
-                                     hours, minutes, seconds);
-        } else {
-          aResultString.AppendPrintf("%02d:%02d", hours, minutes);
-        }
-
-        return true;
-      }
-    case NS_FORM_INPUT_MONTH:
-      {
-        aValue = aValue.floor();
-
-        double month = NS_floorModulo(aValue, Decimal(12)).toDouble();
-        month = (month < 0 ? month + 12 : month);
-
-        double year = 1970 + (aValue.toDouble() - month) / 12;
-
-        // Maximum valid month is 275760-09.
-        if (year < kMinimumYear || year > kMaximumYear) {
-          return false;
-        }
-
-        if (year == kMaximumYear && month > 8) {
-          return false;
-        }
-
-        aResultString.AppendPrintf("%04.0f-%02.0f", year, month + 1);
-        return true;
-      }
-    case NS_FORM_INPUT_WEEK:
-      {
-        aValue = aValue.floor();
-
-        // Based on ISO 8601 date.
-        double year = JS::YearFromTime(aValue.toDouble());
-        double month = JS::MonthFromTime(aValue.toDouble());
-        double day = JS::DayFromTime(aValue.toDouble());
-        // Adding 1 since day starts from 0.
-        double dayInYear = JS::DayWithinYear(aValue.toDouble(), year) + 1;
-
-        // Adding 1 since month starts from 0.
-        uint32_t isoWeekday = DayOfWeek(year, month + 1, day, true);
-        // Target on Wednesday since ISO 8601 states that week 1 is the week
-        // with the first Thursday of that year.
-        uint32_t week = (dayInYear - isoWeekday + 10) / 7;
-
-        if (week < 1) {
-          year--;
-          if (year < 1) {
-            return false;
-          }
-          week = MaximumWeekInYear(year);
-        } else if (week > MaximumWeekInYear(year)) {
-          year++;
-          if (year > kMaximumYear ||
-              (year == kMaximumYear && week > kMaximumWeekInMaximumYear)) {
-            return false;
-          }
-          week = 1;
-        }
-
-        aResultString.AppendPrintf("%04.0f-W%02d", year, week);
-        return true;
-      }
-    case NS_FORM_INPUT_DATETIME_LOCAL:
-      {
-        aValue = aValue.floor();
-
-        uint32_t timeValue =
-          NS_floorModulo(aValue, Decimal::fromDouble(kMsPerDay)).toDouble();
-
-        uint16_t milliseconds, seconds, minutes, hours;
-        if (!GetTimeFromMs(timeValue,
-                           &hours, &minutes, &seconds, &milliseconds)) {
-          return false;
-        }
-
-        double year = JS::YearFromTime(aValue.toDouble());
-        double month = JS::MonthFromTime(aValue.toDouble());
-        double day = JS::DayFromTime(aValue.toDouble());
-
-        if (IsNaN(year) || IsNaN(month) || IsNaN(day)) {
-          return false;
-        }
-
-        if (milliseconds != 0) {
-          aResultString.AppendPrintf("%04.0f-%02.0f-%02.0fT%02d:%02d:%02d.%03d",
-                                     year, month + 1, day, hours, minutes,
-                                     seconds, milliseconds);
-        } else if (seconds != 0) {
-          aResultString.AppendPrintf("%04.0f-%02.0f-%02.0fT%02d:%02d:%02d",
-                                     year, month + 1, day, hours, minutes,
-                                     seconds);
-        } else {
-          aResultString.AppendPrintf("%04.0f-%02.0f-%02.0fT%02d:%02d",
-                                     year, month + 1, day, hours, minutes);
-        }
-
-        return true;
-      }
-    default:
-      MOZ_ASSERT(false, "Unrecognized input type");
-      return false;
-  }
-}
-
-
 Nullable<Date>
 HTMLInputElement::GetValueAsDate(ErrorResult& aRv)
 {
   if (!IsDateTimeInputType(mType)) {
     return Nullable<Date>();
   }
 
   switch (mType) {
@@ -2365,17 +2099,17 @@ HTMLInputElement::GetMinimum() const
   if (!HasAttr(kNameSpaceID_None, nsGkAtoms::min)) {
     return defaultMinimum;
   }
 
   nsAutoString minStr;
   GetAttr(kNameSpaceID_None, nsGkAtoms::min, minStr);
 
   Decimal min;
-  return ConvertStringToNumber(minStr, min) ? min : defaultMinimum;
+  return mInputType->ConvertStringToNumber(minStr, min) ? min : defaultMinimum;
 }
 
 Decimal
 HTMLInputElement::GetMaximum() const
 {
   MOZ_ASSERT(DoesValueAsNumberApply(),
              "GetMaximum() should only be used for types that allow .valueAsNumber");
 
@@ -2386,41 +2120,41 @@ HTMLInputElement::GetMaximum() const
   if (!HasAttr(kNameSpaceID_None, nsGkAtoms::max)) {
     return defaultMaximum;
   }
 
   nsAutoString maxStr;
   GetAttr(kNameSpaceID_None, nsGkAtoms::max, maxStr);
 
   Decimal max;
-  return ConvertStringToNumber(maxStr, max) ? max : defaultMaximum;
+  return mInputType->ConvertStringToNumber(maxStr, max) ? max : defaultMaximum;
 }
 
 Decimal
 HTMLInputElement::GetStepBase() const
 {
   MOZ_ASSERT(IsDateTimeInputType(mType) ||
              mType == NS_FORM_INPUT_NUMBER ||
              mType == NS_FORM_INPUT_RANGE,
              "Check that kDefaultStepBase is correct for this new type");
 
   Decimal stepBase;
 
   // Do NOT use GetMinimum here - the spec says to use "the min content
   // attribute", not "the minimum".
   nsAutoString minStr;
   if (GetAttr(kNameSpaceID_None, nsGkAtoms::min, minStr) &&
-      ConvertStringToNumber(minStr, stepBase)) {
+      mInputType->ConvertStringToNumber(minStr, stepBase)) {
     return stepBase;
   }
 
   // If @min is not a double, we should use @value.
   nsAutoString valueStr;
   if (GetAttr(kNameSpaceID_None, nsGkAtoms::value, valueStr) &&
-      ConvertStringToNumber(valueStr, stepBase)) {
+      mInputType->ConvertStringToNumber(valueStr, stepBase)) {
     return stepBase;
   }
 
   if (mType == NS_FORM_INPUT_WEEK) {
     return kDefaultStepBaseWeek;
   }
 
   return kDefaultStepBase;
@@ -4243,17 +3977,17 @@ HTMLInputElement::CancelRangeThumbDrag(b
   }
   if (aIsForUserEvent) {
     SetValueOfRangeForUserEvent(mRangeThumbDragStartValue);
   } else {
     // Don't dispatch an 'input' event - at least not using
     // DispatchTrustedEvent.
     // TODO: decide what we should do here - bug 851782.
     nsAutoString val;
-    ConvertNumberToString(mRangeThumbDragStartValue, val);
+    mInputType->ConvertNumberToString(mRangeThumbDragStartValue, val);
     // TODO: What should we do if SetValueInternal fails?  (The allocation
     // is small, so we should be fine here.)
     SetValueInternal(val, nsTextEditorState::eSetValue_BySetUserInput |
                           nsTextEditorState::eSetValue_Notify);
     nsRangeFrame* frame = do_QueryFrame(GetPrimaryFrame());
     if (frame) {
       frame->UpdateForValueChange();
     }
@@ -4266,17 +4000,17 @@ HTMLInputElement::CancelRangeThumbDrag(b
 void
 HTMLInputElement::SetValueOfRangeForUserEvent(Decimal aValue)
 {
   MOZ_ASSERT(aValue.isFinite());
 
   Decimal oldValue = GetValueAsDecimal();
 
   nsAutoString val;
-  ConvertNumberToString(aValue, val);
+  mInputType->ConvertNumberToString(aValue, val);
   // TODO: What should we do if SetValueInternal fails?  (The allocation
   // is small, so we should be fine here.)
   SetValueInternal(val, nsTextEditorState::eSetValue_BySetUserInput |
                         nsTextEditorState::eSetValue_Notify);
   nsRangeFrame* frame = do_QueryFrame(GetPrimaryFrame());
   if (frame) {
     frame->UpdateForValueChange();
   }
@@ -4369,17 +4103,17 @@ HTMLInputElement::StepNumberControlForUs
 
   nsresult rv = GetValueIfStepped(aDirection, CALLED_FOR_USER_EVENT, &newValue);
 
   if (NS_FAILED(rv) || !newValue.isFinite()) {
     return; // value should not or will not change
   }
 
   nsAutoString newVal;
-  ConvertNumberToString(newValue, newVal);
+  mInputType->ConvertNumberToString(newValue, newVal);
   // TODO: What should we do if SetValueInternal fails?  (The allocation
   // is small, so we should be fine here.)
   SetValueInternal(newVal, nsTextEditorState::eSetValue_BySetUserInput |
                            nsTextEditorState::eSetValue_Notify);
 
   nsContentUtils::DispatchTrustedEvent(OwnerDoc(),
                                        static_cast<nsIDOMHTMLInputElement*>(this),
                                        NS_LITERAL_STRING("input"), true,
@@ -5339,17 +5073,17 @@ HTMLInputElement::SanitizeValue(nsAStrin
         aValue.StripCRLF();
 
         aValue = nsContentUtils::TrimWhitespace<nsContentUtils::IsHTMLWhitespace>(aValue);
       }
       break;
     case NS_FORM_INPUT_NUMBER:
       {
         Decimal value;
-        bool ok = ConvertStringToNumber(aValue, value);
+        bool ok = mInputType->ConvertStringToNumber(aValue, value);
         if (!ok) {
           aValue.Truncate();
         }
       }
       break;
     case NS_FORM_INPUT_RANGE:
       {
         Decimal minimum = GetMinimum();
@@ -5358,17 +5092,17 @@ HTMLInputElement::SanitizeValue(nsAStrin
                    "type=range should have a default maximum/minimum");
 
         // We use this to avoid modifying the string unnecessarily, since that
         // may introduce rounding. This is set to true only if the value we
         // parse out from aValue needs to be sanitized.
         bool needSanitization = false;
 
         Decimal value;
-        bool ok = ConvertStringToNumber(aValue, value);
+        bool ok = mInputType->ConvertStringToNumber(aValue, value);
         if (!ok) {
           needSanitization = true;
           // Set value to midway between minimum and maximum.
           value = maximum <= minimum ? minimum : minimum + (maximum - minimum)/Decimal(2);
         } else if (value < minimum || maximum < minimum) {
           needSanitization = true;
           value = minimum;
         } else if (value > maximum) {
@@ -5517,39 +5251,16 @@ HTMLInputElement::MaximumWeekInYear(uint
   int day = DayOfWeek(aYear, 1, 1, true); // January 1.
   // A year starting on Thursday or a leap year starting on Wednesday has 53
   // weeks. All other years have 52 weeks.
   return day == 4 || (day == 3 && IsLeapYear(aYear)) ?
     kMaximumWeekInYear : kMaximumWeekInYear - 1;
 }
 
 bool
-HTMLInputElement::GetTimeFromMs(double aValue, uint16_t* aHours,
-                                uint16_t* aMinutes, uint16_t* aSeconds,
-                                uint16_t* aMilliseconds) const {
-  MOZ_ASSERT(aValue >= 0 && aValue < kMsPerDay,
-             "aValue must be milliseconds within a day!");
-
-  uint32_t value = floor(aValue);
-
-  *aMilliseconds = value % 1000;
-  value /= 1000;
-
-  *aSeconds = value % 60;
-  value /= 60;
-
-  *aMinutes = value % 60;
-  value /= 60;
-
-  *aHours = value;
-
-  return true;
-}
-
-bool
 HTMLInputElement::IsValidWeek(const nsAString& aValue) const
 {
   uint32_t year, week;
   return ParseWeek(aValue, &year, &week);
 }
 
 bool
 HTMLInputElement::IsValidMonth(const nsAString& aValue) const
@@ -7868,33 +7579,33 @@ HTMLInputElement::GetValidationMessage(n
 
       Decimal valueLow = value - NS_floorModulo(value - stepBase, step);
       Decimal valueHigh = value + step - NS_floorModulo(value - stepBase, step);
 
       Decimal maximum = GetMaximum();
 
       if (maximum.isNaN() || valueHigh <= maximum) {
         nsAutoString valueLowStr, valueHighStr;
-        ConvertNumberToString(valueLow, valueLowStr);
-        ConvertNumberToString(valueHigh, valueHighStr);
+        mInputType->ConvertNumberToString(valueLow, valueLowStr);
+        mInputType->ConvertNumberToString(valueHigh, valueHighStr);
 
         if (valueLowStr.Equals(valueHighStr)) {
           const char16_t* params[] = { valueLowStr.get() };
           rv = nsContentUtils::FormatLocalizedString(nsContentUtils::eDOM_PROPERTIES,
                                                      "FormValidationStepMismatchOneValue",
                                                      params, message);
         } else {
           const char16_t* params[] = { valueLowStr.get(), valueHighStr.get() };
           rv = nsContentUtils::FormatLocalizedString(nsContentUtils::eDOM_PROPERTIES,
                                                      "FormValidationStepMismatch",
                                                      params, message);
         }
       } else {
         nsAutoString valueLowStr;
-        ConvertNumberToString(valueLow, valueLowStr);
+        mInputType->ConvertNumberToString(valueLow, valueLowStr);
 
         const char16_t* params[] = { valueLowStr.get() };
         rv = nsContentUtils::FormatLocalizedString(nsContentUtils::eDOM_PROPERTIES,
                                                    "FormValidationStepMismatchOneValue",
                                                    params, message);
       }
 
       aValidationMessage = message;
--- a/dom/html/HTMLInputElement.h
+++ b/dom/html/HTMLInputElement.h
@@ -1162,40 +1162,16 @@ protected:
    * Returns the radio group container if the element has one, null otherwise.
    * The radio group container will be the form owner if there is one.
    * The current document otherwise.
    * @return the radio group container if the element has one, null otherwise.
    */
   nsIRadioGroupContainer* GetRadioGroupContainer() const;
 
   /**
-   * Convert a string to a Decimal number in a type specific way,
-   * http://www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#concept-input-value-string-number
-   * ie parse a date string to a timestamp if type=date,
-   * or parse a number string to its value if type=number.
-   * @param aValue the string to be parsed.
-   * @param aResultValue the number as a Decimal.
-   * @result whether the parsing was successful.
-   */
-  bool ConvertStringToNumber(nsAString& aValue, Decimal& aResultValue) const;
-
-  /**
-   * Convert a Decimal to a string in a type specific way, ie convert a timestamp
-   * to a date string if type=date or append the number string representing the
-   * value if type=number.
-   *
-   * @param aValue the Decimal to be converted
-   * @param aResultString [out] the string representing the Decimal
-   * @return whether the function succeded, it will fail if the current input's
-   *         type is not supported or the number can't be converted to a string
-   *         as expected by the type.
-   */
-  bool ConvertNumberToString(Decimal aValue, nsAString& aResultString) const;
-
-  /**
    * Parse a color string of the form #XXXXXX where X should be hexa characters
    * @param the string to be parsed.
    * @return whether the string is a valid simple color.
    * Note : this function does not consider the empty string as valid.
    */
   bool IsValidSimpleColor(const nsAString& aValue) const;
 
   /**
@@ -1322,23 +1298,16 @@ protected:
 
   /**
    * This methods returns the maximum number of week in a given year, the
    * result is either 52 or 53.
    */
   uint32_t MaximumWeekInYear(uint32_t aYear) const;
 
   /**
-   * This method converts aValue (milliseconds within a day) to hours, minutes,
-   * seconds and milliseconds.
-   */
-  bool GetTimeFromMs(double aValue, uint16_t* aHours, uint16_t* aMinutes,
-                     uint16_t* aSeconds, uint16_t* aMilliseconds) const;
-
-  /**
    * This methods returns true if it's a leap year.
    */
   bool IsLeapYear(uint32_t aYear) const;
 
   /**
    * Returns whether aValue is a valid time as described by HTML specifications:
    * http://www.whatwg.org/specs/web-apps/current-work/multipage/common-microsyntaxes.html#valid-time-string
    *
--- a/dom/html/input/DateTimeInputTypes.cpp
+++ b/dom/html/input/DateTimeInputTypes.cpp
@@ -1,18 +1,25 @@
 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #include "DateTimeInputTypes.h"
 
+#include "js/Date.h"
 #include "mozilla/dom/HTMLInputElement.h"
 
+const double DateTimeInputTypeBase::kMinimumYear = 1;
+const double DateTimeInputTypeBase::kMaximumYear = 275760;
+const double DateTimeInputTypeBase::kMaximumMonthInMaximumYear = 9;
+const double DateTimeInputTypeBase::kMaximumWeekInMaximumYear = 37;
+const double DateTimeInputTypeBase::kMsPerDay = 24 * 60 * 60 * 1000;
+
 bool
 DateTimeInputTypeBase::IsMutable() const
 {
   return !mInputElement->IsDisabled() &&
          !mInputElement->HasAttr(kNameSpaceID_None, nsGkAtoms::readonly);
 }
 
 bool
@@ -77,8 +84,306 @@ DateTimeInputTypeBase::HasStepMismatch(b
   mozilla::Decimal step = mInputElement->GetStep();
   if (step == kStepAny) {
     return false;
   }
 
   // Value has to be an integral multiple of step.
   return NS_floorModulo(value - GetStepBase(), step) != mozilla::Decimal(0);
 }
+
+bool
+DateTimeInputTypeBase::GetTimeFromMs(double aValue, uint16_t* aHours,
+                                     uint16_t* aMinutes, uint16_t* aSeconds,
+                                     uint16_t* aMilliseconds) const {
+  MOZ_ASSERT(aValue >= 0 && aValue < kMsPerDay,
+             "aValue must be milliseconds within a day!");
+
+  uint32_t value = floor(aValue);
+
+  *aMilliseconds = value % 1000;
+  value /= 1000;
+
+  *aSeconds = value % 60;
+  value /= 60;
+
+  *aMinutes = value % 60;
+  value /= 60;
+
+  *aHours = value;
+
+  return true;
+}
+
+// input type=date
+
+bool
+DateInputType::ConvertStringToNumber(nsAString& aValue,
+                                     mozilla::Decimal& aResultValue) const
+{
+  uint32_t year, month, day;
+  if (!ParseDate(aValue, &year, &month, &day)) {
+    return false;
+  }
+
+  JS::ClippedTime time = JS::TimeClip(JS::MakeDate(year, month - 1, day));
+  if (!time.isValid()) {
+    return false;
+  }
+
+  aResultValue = mozilla::Decimal::fromDouble(time.toDouble());
+  return true;
+}
+
+bool
+DateInputType::ConvertNumberToString(mozilla::Decimal aValue,
+                                     nsAString& aResultString) const
+{
+  MOZ_ASSERT(aValue.isFinite(), "aValue must be a valid non-Infinite number.");
+
+  aResultString.Truncate();
+
+  // The specs (and our JS APIs) require |aValue| to be truncated.
+  aValue = aValue.floor();
+
+  double year = JS::YearFromTime(aValue.toDouble());
+  double month = JS::MonthFromTime(aValue.toDouble());
+  double day = JS::DayFromTime(aValue.toDouble());
+
+  if (mozilla::IsNaN(year) || mozilla::IsNaN(month) || mozilla::IsNaN(day)) {
+    return false;
+  }
+
+  aResultString.AppendPrintf("%04.0f-%02.0f-%02.0f", year, month + 1, day);
+  return true;
+}
+
+// input type=time
+
+bool
+TimeInputType::ConvertStringToNumber(nsAString& aValue,
+                                     mozilla::Decimal& aResultValue) const
+{
+  uint32_t milliseconds;
+  if (!ParseTime(aValue, &milliseconds)) {
+    return false;
+  }
+
+  aResultValue = mozilla::Decimal(int32_t(milliseconds));
+  return true;
+}
+
+bool
+TimeInputType::ConvertNumberToString(mozilla::Decimal aValue,
+                                     nsAString& aResultString) const
+{
+  MOZ_ASSERT(aValue.isFinite(), "aValue must be a valid non-Infinite number.");
+
+  aResultString.Truncate();
+
+  aValue = aValue.floor();
+  // Per spec, we need to truncate |aValue| and we should only represent
+  // times inside a day [00:00, 24:00[, which means that we should do a
+  // modulo on |aValue| using the number of milliseconds in a day (86400000).
+  uint32_t value =
+    NS_floorModulo(aValue, mozilla::Decimal::fromDouble(kMsPerDay)).toDouble();
+
+  uint16_t milliseconds, seconds, minutes, hours;
+  if (!GetTimeFromMs(value, &hours, &minutes, &seconds, &milliseconds)) {
+    return false;
+  }
+
+  if (milliseconds != 0) {
+    aResultString.AppendPrintf("%02d:%02d:%02d.%03d",
+                               hours, minutes, seconds, milliseconds);
+  } else if (seconds != 0) {
+    aResultString.AppendPrintf("%02d:%02d:%02d",
+                               hours, minutes, seconds);
+  } else {
+    aResultString.AppendPrintf("%02d:%02d", hours, minutes);
+  }
+
+  return true;
+}
+
+// input type=week
+
+bool
+WeekInputType::ConvertStringToNumber(nsAString& aValue,
+                                     mozilla::Decimal& aResultValue) const
+{
+  uint32_t year, week;
+  if (!ParseWeek(aValue, &year, &week)) {
+    return false;
+  }
+
+  if (year < kMinimumYear || year > kMaximumYear) {
+    return false;
+  }
+
+  // Maximum week is 275760-W37, the week of 275760-09-13.
+  if (year == kMaximumYear && week > kMaximumWeekInMaximumYear) {
+    return false;
+  }
+
+  double days = DaysSinceEpochFromWeek(year, week);
+  aResultValue = mozilla::Decimal::fromDouble(days * kMsPerDay);
+  return true;
+}
+
+bool
+WeekInputType::ConvertNumberToString(mozilla::Decimal aValue,
+                                     nsAString& aResultString) const
+{
+  MOZ_ASSERT(aValue.isFinite(), "aValue must be a valid non-Infinite number.");
+
+  aResultString.Truncate();
+
+  aValue = aValue.floor();
+
+  // Based on ISO 8601 date.
+  double year = JS::YearFromTime(aValue.toDouble());
+  double month = JS::MonthFromTime(aValue.toDouble());
+  double day = JS::DayFromTime(aValue.toDouble());
+  // Adding 1 since day starts from 0.
+  double dayInYear = JS::DayWithinYear(aValue.toDouble(), year) + 1;
+
+  // Adding 1 since month starts from 0.
+  uint32_t isoWeekday = DayOfWeek(year, month + 1, day, true);
+  // Target on Wednesday since ISO 8601 states that week 1 is the week
+  // with the first Thursday of that year.
+  uint32_t week = (dayInYear - isoWeekday + 10) / 7;
+
+  if (week < 1) {
+    year--;
+    if (year < 1) {
+      return false;
+    }
+    week = MaximumWeekInYear(year);
+  } else if (week > MaximumWeekInYear(year)) {
+    year++;
+    if (year > kMaximumYear ||
+        (year == kMaximumYear && week > kMaximumWeekInMaximumYear)) {
+      return false;
+    }
+    week = 1;
+  }
+
+  aResultString.AppendPrintf("%04.0f-W%02d", year, week);
+  return true;
+}
+
+// input type=month
+
+bool
+MonthInputType::ConvertStringToNumber(nsAString& aValue,
+                                      mozilla::Decimal& aResultValue) const
+{
+  uint32_t year, month;
+  if (!ParseMonth(aValue, &year, &month)) {
+    return false;
+  }
+
+  if (year < kMinimumYear || year > kMaximumYear) {
+    return false;
+  }
+
+  // Maximum valid month is 275760-09.
+  if (year == kMaximumYear && month > kMaximumMonthInMaximumYear) {
+    return false;
+  }
+
+  int32_t months = MonthsSinceJan1970(year, month);
+  aResultValue = mozilla::Decimal(int32_t(months));
+  return true;
+}
+
+bool
+MonthInputType::ConvertNumberToString(mozilla::Decimal aValue,
+                                      nsAString& aResultString) const
+{
+  MOZ_ASSERT(aValue.isFinite(), "aValue must be a valid non-Infinite number.");
+
+  aResultString.Truncate();
+
+  aValue = aValue.floor();
+
+  double month = NS_floorModulo(aValue, mozilla::Decimal(12)).toDouble();
+  month = (month < 0 ? month + 12 : month);
+
+  double year = 1970 + (aValue.toDouble() - month) / 12;
+
+  // Maximum valid month is 275760-09.
+  if (year < kMinimumYear || year > kMaximumYear) {
+    return false;
+  }
+
+  if (year == kMaximumYear && month > 8) {
+    return false;
+  }
+
+  aResultString.AppendPrintf("%04.0f-%02.0f", year, month + 1);
+  return true;
+
+}
+
+// input type=datetime-local
+
+bool
+DateTimeLocalInputType::ConvertStringToNumber(
+  nsAString& aValue, mozilla::Decimal& aResultValue) const
+{
+  uint32_t year, month, day, timeInMs;
+  if (!ParseDateTimeLocal(aValue, &year, &month, &day, &timeInMs)) {
+    return false;
+  }
+
+  JS::ClippedTime time = JS::TimeClip(JS::MakeDate(year, month - 1, day,
+                                                   timeInMs));
+  if (!time.isValid()) {
+    return false;
+  }
+
+  aResultValue = mozilla::Decimal::fromDouble(time.toDouble());
+  return true;
+}
+
+bool
+DateTimeLocalInputType::ConvertNumberToString(mozilla::Decimal aValue,
+                                              nsAString& aResultString) const
+{
+  MOZ_ASSERT(aValue.isFinite(), "aValue must be a valid non-Infinite number.");
+
+  aResultString.Truncate();
+
+  aValue = aValue.floor();
+
+  uint32_t timeValue =
+    NS_floorModulo(aValue, mozilla::Decimal::fromDouble(kMsPerDay)).toDouble();
+
+  uint16_t milliseconds, seconds, minutes, hours;
+  if (!GetTimeFromMs(timeValue, &hours, &minutes, &seconds, &milliseconds)) {
+    return false;
+  }
+
+  double year = JS::YearFromTime(aValue.toDouble());
+  double month = JS::MonthFromTime(aValue.toDouble());
+  double day = JS::DayFromTime(aValue.toDouble());
+
+  if (mozilla::IsNaN(year) || mozilla::IsNaN(month) || mozilla::IsNaN(day)) {
+    return false;
+  }
+
+  if (milliseconds != 0) {
+    aResultString.AppendPrintf("%04.0f-%02.0f-%02.0fT%02d:%02d:%02d.%03d",
+                               year, month + 1, day, hours, minutes,
+                               seconds, milliseconds);
+  } else if (seconds != 0) {
+    aResultString.AppendPrintf("%04.0f-%02.0f-%02.0fT%02d:%02d:%02d",
+                               year, month + 1, day, hours, minutes,
+                               seconds);
+  } else {
+    aResultString.AppendPrintf("%04.0f-%02.0f-%02.0fT%02d:%02d",
+                               year, month + 1, day, hours, minutes);
+  }
+
+  return true;
+}
--- a/dom/html/input/DateTimeInputTypes.h
+++ b/dom/html/input/DateTimeInputTypes.h
@@ -20,92 +20,135 @@ public:
   bool HasStepMismatch(bool aUseZeroIfValueNaN) const override;
 
 protected:
   explicit DateTimeInputTypeBase(mozilla::dom::HTMLInputElement* aInputElement)
     : InputType(aInputElement)
   {}
 
   bool IsMutable() const override;
+
+  /**
+   * This method converts aValue (milliseconds within a day) to hours, minutes,
+   * seconds and milliseconds.
+   */
+  bool GetTimeFromMs(double aValue, uint16_t* aHours, uint16_t* aMinutes,
+                     uint16_t* aSeconds, uint16_t* aMilliseconds) const;
+
+  // Minimum year limited by HTML standard, year >= 1.
+  static const double kMinimumYear;
+  // Maximum year limited by ECMAScript date object range, year <= 275760.
+  static const double kMaximumYear;
+  // Maximum valid month is 275760-09.
+  static const double kMaximumMonthInMaximumYear;
+  // Maximum valid week is 275760-W37.
+  static const double kMaximumWeekInMaximumYear;
+  // Milliseconds in a day.
+  static const double kMsPerDay;
 };
 
 // input type=date
 class DateInputType : public DateTimeInputTypeBase
 {
 public:
   static InputType*
   Create(mozilla::dom::HTMLInputElement* aInputElement, void* aMemory)
   {
     return new (aMemory) DateInputType(aInputElement);
   }
 
+  bool ConvertStringToNumber(nsAString& aValue,
+                             mozilla::Decimal& aResultValue) const override;
+  bool ConvertNumberToString(mozilla::Decimal aValue,
+                             nsAString& aResultString) const override;
+
 private:
   explicit DateInputType(mozilla::dom::HTMLInputElement* aInputElement)
     : DateTimeInputTypeBase(aInputElement)
   {}
 };
 
 // input type=time
 class TimeInputType : public DateTimeInputTypeBase
 {
 public:
   static InputType*
   Create(mozilla::dom::HTMLInputElement* aInputElement, void* aMemory)
   {
     return new (aMemory) TimeInputType(aInputElement);
   }
 
+  bool ConvertStringToNumber(nsAString& aValue,
+                             mozilla::Decimal& aResultValue) const override;
+  bool ConvertNumberToString(mozilla::Decimal aValue,
+                             nsAString& aResultString) const override;
+
 private:
   explicit TimeInputType(mozilla::dom::HTMLInputElement* aInputElement)
     : DateTimeInputTypeBase(aInputElement)
   {}
 };
 
 // input type=week
 class WeekInputType : public DateTimeInputTypeBase
 {
 public:
   static InputType*
   Create(mozilla::dom::HTMLInputElement* aInputElement, void* aMemory)
   {
     return new (aMemory) WeekInputType(aInputElement);
   }
 
+  bool ConvertStringToNumber(nsAString& aValue,
+                             mozilla::Decimal& aResultValue) const override;
+  bool ConvertNumberToString(mozilla::Decimal aValue,
+                             nsAString& aResultString) const override;
+
 private:
   explicit WeekInputType(mozilla::dom::HTMLInputElement* aInputElement)
     : DateTimeInputTypeBase(aInputElement)
   {}
 };
 
 // input type=month
 class MonthInputType : public DateTimeInputTypeBase
 {
 public:
   static InputType*
   Create(mozilla::dom::HTMLInputElement* aInputElement, void* aMemory)
   {
     return new (aMemory) MonthInputType(aInputElement);
   }
 
+  bool ConvertStringToNumber(nsAString& aValue,
+                             mozilla::Decimal& aResultValue) const override;
+  bool ConvertNumberToString(mozilla::Decimal aValue,
+                             nsAString& aResultString) const override;
+
 private:
   explicit MonthInputType(mozilla::dom::HTMLInputElement* aInputElement)
     : DateTimeInputTypeBase(aInputElement)
   {}
 };
 
 // input type=datetime-local
 class DateTimeLocalInputType : public DateTimeInputTypeBase
 {
 public:
   static InputType*
   Create(mozilla::dom::HTMLInputElement* aInputElement, void* aMemory)
   {
     return new (aMemory) DateTimeLocalInputType(aInputElement);
   }
 
+  bool ConvertStringToNumber(nsAString& aValue,
+                             mozilla::Decimal& aResultValue) const override;
+  bool ConvertNumberToString(mozilla::Decimal aValue,
+                             nsAString& aResultString) const override;
+
 private:
   explicit DateTimeLocalInputType(mozilla::dom::HTMLInputElement* aInputElement)
     : DateTimeInputTypeBase(aInputElement)
   {}
 };
 
 
 #endif /* DateTimeInputTypes_h__ */
--- a/dom/html/input/InputType.cpp
+++ b/dom/html/input/InputType.cpp
@@ -200,8 +200,98 @@ InputType::HasBadInput() const
   return false;
 }
 
 nsresult
 InputType::MinMaxStepAttrChanged()
 {
   return NS_OK;
 }
+
+bool
+InputType::ConvertStringToNumber(nsAString& aValue,
+                                 mozilla::Decimal& aResultValue) const
+{
+  NS_WARNING("InputType::ConvertStringToNumber called");
+
+  return false;
+}
+
+bool
+InputType::ConvertNumberToString(mozilla::Decimal aValue,
+                                 nsAString& aResultString) const
+{
+  NS_WARNING("InputType::ConvertNumberToString called");
+
+  return false;
+}
+
+bool
+InputType::ParseDate(const nsAString& aValue, uint32_t* aYear, uint32_t* aMonth,
+                     uint32_t* aDay) const
+{
+  // TODO: move this function and implementation to DateTimeInpuTypeBase when
+  // refactoring is completed. Now we can only call HTMLInputElement::ParseDate
+  // from here, since the method is protected and only InputType is a friend
+  // class.
+  return mInputElement->ParseDate(aValue, aYear, aMonth, aDay);
+}
+
+bool
+InputType::ParseTime(const nsAString& aValue, uint32_t* aResult) const
+{
+  // see comment in InputType::ParseDate().
+  return mInputElement->ParseTime(aValue, aResult);
+}
+
+bool
+InputType::ParseMonth(const nsAString& aValue, uint32_t* aYear,
+                      uint32_t* aMonth) const
+{
+  // see comment in InputType::ParseDate().
+  return mInputElement->ParseMonth(aValue, aYear, aMonth);
+}
+
+bool
+InputType::ParseWeek(const nsAString& aValue, uint32_t* aYear,
+                     uint32_t* aWeek) const
+{
+  // see comment in InputType::ParseDate().
+  return mInputElement->ParseWeek(aValue, aYear, aWeek);
+}
+
+bool
+InputType::ParseDateTimeLocal(const nsAString& aValue, uint32_t* aYear,
+                              uint32_t* aMonth, uint32_t* aDay, uint32_t* aTime)
+                              const
+{
+  // see comment in InputType::ParseDate().
+  return mInputElement->ParseDateTimeLocal(aValue, aYear, aMonth, aDay, aTime);
+}
+
+int32_t
+InputType::MonthsSinceJan1970(uint32_t aYear, uint32_t aMonth) const
+{
+  // see comment in InputType::ParseDate().
+  return mInputElement->MonthsSinceJan1970(aYear, aMonth);
+}
+
+double
+InputType::DaysSinceEpochFromWeek(uint32_t aYear, uint32_t aWeek) const
+{
+  // see comment in InputType::ParseDate().
+  return mInputElement->DaysSinceEpochFromWeek(aYear, aWeek);
+}
+
+uint32_t
+InputType::DayOfWeek(uint32_t aYear, uint32_t aMonth, uint32_t aDay,
+                     bool isoWeek) const
+{
+  // see comment in InputType::ParseDate().
+  return mInputElement->DayOfWeek(aYear, aMonth, aDay, isoWeek);
+}
+
+uint32_t
+InputType::MaximumWeekInYear(uint32_t aYear) const
+{
+  // see comment in InputType::ParseDate().
+  return mInputElement->MaximumWeekInYear(aYear);
+}
--- a/dom/html/input/InputType.h
+++ b/dom/html/input/InputType.h
@@ -57,16 +57,42 @@ public:
   virtual bool HasPatternMismatch() const;
   virtual bool IsRangeOverflow() const;
   virtual bool IsRangeUnderflow() const;
   virtual bool HasStepMismatch(bool aUseZeroIfValueNaN) const;
   virtual bool HasBadInput() const;
 
   virtual nsresult MinMaxStepAttrChanged();
 
+  /**
+   * Convert a string to a Decimal number in a type specific way,
+   * http://www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#concept-input-value-string-number
+   * ie parse a date string to a timestamp if type=date,
+   * or parse a number string to its value if type=number.
+   * @param aValue the string to be parsed.
+   * @param aResultValue the number as a Decimal.
+   * @result whether the parsing was successful.
+   */
+  virtual bool ConvertStringToNumber(nsAString& aValue,
+                                     mozilla::Decimal& aResultValue) const;
+
+  /**
+   * Convert a Decimal to a string in a type specific way, ie convert a timestamp
+   * to a date string if type=date or append the number string representing the
+   * value if type=number.
+   *
+   * @param aValue the Decimal to be converted
+   * @param aResultString [out] the string representing the Decimal
+   * @return whether the function succeeded, it will fail if the current input's
+   *         type is not supported or the number can't be converted to a string
+   *         as expected by the type.
+   */
+  virtual bool ConvertNumberToString(mozilla::Decimal aValue,
+                                     nsAString& aResultString) const;
+
 protected:
   explicit InputType(mozilla::dom::HTMLInputElement* aInputElement)
     : mInputElement(aInputElement)
   {}
 
   /**
    * Get the mutable state of the element.
    * When the element isn't mutable (immutable), the value or checkedness
@@ -105,16 +131,103 @@ protected:
    */
   mozilla::Decimal GetStepBase() const;
 
   /**
    * Get the primary frame for the input element.
    */
   nsIFrame* GetPrimaryFrame() const;
 
+  /**
+   * Parse a date string of the form yyyy-mm-dd
+   *
+   * @param aValue the string to be parsed.
+   * @return the date in aYear, aMonth, aDay.
+   * @return whether the parsing was successful.
+   */
+  bool ParseDate(const nsAString& aValue,
+                 uint32_t* aYear,
+                 uint32_t* aMonth,
+                 uint32_t* aDay) const;
+
+  /**
+   * Returns the time expressed in milliseconds of |aValue| being parsed as a
+   * time following the HTML specifications:
+   * https://html.spec.whatwg.org/multipage/infrastructure.html#parse-a-time-string
+   *
+   * Note: |aResult| can be null.
+   *
+   * @param aValue the string to be parsed.
+   * @param aResult the time expressed in milliseconds representing the time [out]
+   * @return whether the parsing was successful.
+   */
+  bool ParseTime(const nsAString& aValue, uint32_t* aResult) const;
+
+  /**
+   * Parse a month string of the form yyyy-mm
+   *
+   * @param the string to be parsed.
+   * @return the year and month in aYear and aMonth.
+   * @return whether the parsing was successful.
+   */
+  bool ParseMonth(const nsAString& aValue,
+                  uint32_t* aYear,
+                  uint32_t* aMonth) const;
+
+  /**
+   * Parse a week string of the form yyyy-Www
+   *
+   * @param the string to be parsed.
+   * @return the year and week in aYear and aWeek.
+   * @return whether the parsing was successful.
+   */
+  bool ParseWeek(const nsAString& aValue,
+                 uint32_t* aYear,
+                 uint32_t* aWeek) const;
+
+  /**
+   * Parse a datetime-local string of the form yyyy-mm-ddThh:mm[:ss.s] or
+   * yyyy-mm-dd hh:mm[:ss.s], where fractions of seconds can be 1 to 3 digits.
+   *
+   * @param the string to be parsed.
+   * @return the date in aYear, aMonth, aDay and time expressed in milliseconds
+   *         in aTime.
+   * @return whether the parsing was successful.
+   */
+  bool ParseDateTimeLocal(const nsAString& aValue,
+                          uint32_t* aYear,
+                          uint32_t* aMonth,
+                          uint32_t* aDay,
+                          uint32_t* aTime) const;
+
+  /**
+   * This methods returns the number of months between January 1970 and the
+   * given year and month.
+   */
+  int32_t MonthsSinceJan1970(uint32_t aYear, uint32_t aMonth) const;
+
+  /**
+   * This methods returns the number of days since epoch for a given year and
+   * week.
+   */
+  double DaysSinceEpochFromWeek(uint32_t aYear, uint32_t aWeek) const;
+
+  /**
+   * This methods returns the day of the week given a date. If @isoWeek is true,
+   * 7=Sunday, otherwise, 0=Sunday.
+   */
+  uint32_t DayOfWeek(uint32_t aYear, uint32_t aMonth, uint32_t aDay,
+                     bool isoWeek) const;
+
+  /**
+   * This methods returns the maximum number of week in a given year, the
+   * result is either 52 or 53.
+   */
+  uint32_t MaximumWeekInYear(uint32_t aYear) const;
+
   mozilla::dom::HTMLInputElement* mInputElement;
 };
 
 // Custom deleter for UniquePtr<InputType> to avoid freeing memory pre-allocated
 // for InputType, but we still need to call the destructor explictly.
 struct DoNotDelete { void operator()(::InputType* p) { p->~InputType(); } };
 
 #endif /* InputType_h__ */
--- a/dom/html/input/NumericInputTypes.cpp
+++ b/dom/html/input/NumericInputTypes.cpp
@@ -66,16 +66,43 @@ NumericInputTypeBase::HasStepMismatch(bo
   if (step == kStepAny) {
     return false;
   }
 
   // Value has to be an integral multiple of step.
   return NS_floorModulo(value - GetStepBase(), step) != mozilla::Decimal(0);
 }
 
+bool
+NumericInputTypeBase::ConvertStringToNumber(nsAString& aValue,
+  mozilla::Decimal& aResultValue) const
+{
+  aResultValue = mozilla::dom::HTMLInputElement::StringToDecimal(aValue);
+  if (!aResultValue.isFinite()) {
+    return false;
+  }
+  return true;
+}
+
+bool
+NumericInputTypeBase::ConvertNumberToString(mozilla::Decimal aValue,
+                                            nsAString& aResultString) const
+{
+  MOZ_ASSERT(aValue.isFinite(), "aValue must be a valid non-Infinite number.");
+
+  aResultString.Truncate();
+
+  char buf[32];
+  bool ok = aValue.toString(buf, mozilla::ArrayLength(buf));
+  aResultString.AssignASCII(buf);
+  MOZ_ASSERT(ok, "buf not big enough");
+
+  return ok;
+}
+
 /* input type=numer */
 
 bool
 NumberInputType::IsValueMissing() const
 {
   if (!mInputElement->HasAttr(kNameSpaceID_None, nsGkAtoms::required)) {
     return false;
   }
--- a/dom/html/input/NumericInputTypes.h
+++ b/dom/html/input/NumericInputTypes.h
@@ -13,16 +13,21 @@ class NumericInputTypeBase : public ::In
 {
 public:
   ~NumericInputTypeBase() override {}
 
   bool IsRangeOverflow() const override;
   bool IsRangeUnderflow() const override;
   bool HasStepMismatch(bool aUseZeroIfValueNaN) const override;
 
+  bool ConvertStringToNumber(nsAString& aValue,
+                             mozilla::Decimal& aResultValue) const override;
+  bool ConvertNumberToString(mozilla::Decimal aValue,
+                             nsAString& aResultString) const override;
+
 protected:
   explicit NumericInputTypeBase(mozilla::dom::HTMLInputElement* aInputElement)
     : InputType(aInputElement)
   {}
 };
 
 // input type=number
 class NumberInputType : public NumericInputTypeBase
--- a/dom/media/platforms/agnostic/WAVDecoder.cpp
+++ b/dom/media/platforms/agnostic/WAVDecoder.cpp
@@ -112,17 +112,17 @@ WaveDataDecoder::ProcessDecode(MediaRawD
           int32_t v = aReader.ReadLE24();
           buffer[i * mInfo.mChannels + j] =
               Int24bitToAudioSample<AudioDataValue>(v);
         }
       }
     }
   }
 
-  auto duration = media::TimeUnit::FromMicroseconds(frames / mInfo.mRate);
+  auto duration = FramesToTimeUnit(frames, mInfo.mRate);
 
   return DecodePromise::CreateAndResolve(
     DecodedData{ new AudioData(aOffset, aSample->mTime, duration, frames,
                                Move(buffer), mInfo.mChannels, mInfo.mRate) },
     __func__);
 }
 
 RefPtr<MediaDataDecoder::DecodePromise>
--- a/dom/media/platforms/android/RemoteDataDecoder.cpp
+++ b/dom/media/platforms/android/RemoteDataDecoder.cpp
@@ -110,33 +110,32 @@ public:
       bool ok = NS_SUCCEEDED(info->Flags(&flags));
 
       int32_t offset;
       ok &= NS_SUCCEEDED(info->Offset(&offset));
 
       int64_t presentationTimeUs;
       ok &= NS_SUCCEEDED(info->PresentationTimeUs(&presentationTimeUs));
 
-      int32_t size;
-      ok &= NS_SUCCEEDED(info->Size(&size));
-
       if (!ok) {
         HandleError(MediaResult(NS_ERROR_DOM_MEDIA_FATAL_ERR,
                                 RESULT_DETAIL("VideoCallBack::HandleOutput")));
         return;
       }
 
-      bool isEOS = !!(flags & MediaCodec::BUFFER_FLAG_END_OF_STREAM);
+
       InputInfo inputInfo;
-      if (!mDecoder->mInputInfos.Find(presentationTimeUs, inputInfo)
-          && !isEOS) {
+      ok = mDecoder->mInputInfos.Find(presentationTimeUs, inputInfo);
+      bool isEOS = !!(flags & MediaCodec::BUFFER_FLAG_END_OF_STREAM);
+      if (!ok && !isEOS) {
+        // Ignore output with no corresponding input.
         return;
       }
 
-      if (size > 0) {
+      if (ok && presentationTimeUs >= 0) {
         RefPtr<layers::Image> img = new SurfaceTextureImage(
           mDecoder->mSurfaceHandle, inputInfo.mImageSize, false /* NOT continuous */,
           gl::OriginPos::BottomLeft);
 
         RefPtr<VideoData> v = VideoData::CreateFromImage(
           inputInfo.mDisplaySize, offset,
           TimeUnit::FromMicroseconds(presentationTimeUs),
           TimeUnit::FromMicroseconds(inputInfo.mDurationUs),
--- a/dom/media/test/manifest.js
+++ b/dom/media/test/manifest.js
@@ -598,24 +598,16 @@ if (manifestNavigator().userAgent.indexO
                                 .getService(SpecialPowers.Ci.nsIPropertyBag2)
                                 .getProperty(versionString);
 }
 
 function getAndroidVersion() {
   return androidVersion;
 }
 
-//Android supports fragmented MP4 playback from 4.3.
-//Fragmented MP4.
-if (getAndroidVersion() >= 18) {
-  gUnseekableTests = gUnseekableTests.concat([
-    { name:"street.mp4", type:"video/mp4" }
-  ]);
-}
-
 // These are files suitable for using with a "new Audio" constructor.
 var gAudioTests = [
   { name:"r11025_s16_c1.wav", type:"audio/x-wav", duration:1.0 },
   { name:"sound.ogg", type:"audio/ogg" },
   { name:"owl.mp3", type:"audio/mpeg", duration:3.343 },
   { name:"small-shot.m4a", type:"audio/mp4", duration:0.29 },
   { name:"bogus.duh", type:"bogus/duh", duration:123 }
 ];
--- a/dom/media/test/mochitest.ini
+++ b/dom/media/test/mochitest.ini
@@ -1096,17 +1096,16 @@ skip-if = toolkit == 'android' # bug 129
 tags = webvtt
 [test_trackelementsrc.html]
 skip-if = toolkit == 'android' # android(bug 1232305)
 tags = webvtt
 [test_trackevent.html]
 skip-if = toolkit == 'android' # android(bug 1232305)
 tags = webvtt
 [test_unseekable.html]
-skip-if = toolkit == 'android' # android(bug 1232305)
 [test_video_to_canvas.html]
 skip-if = toolkit == 'android' # android(bug 1232305), bugs 1320418,1347953,1347954,1348140,1348386
 [test_video_in_audio_element.html]
 skip-if = android_version == '15' || android_version == '17' # bug 1320417, 1326326, android(bug 1232323, bug 1232305)
 [test_videoDocumentTitle.html]
 skip-if = toolkit == 'android' # android(bug 1232305)
 [test_VideoPlaybackQuality.html]
 skip-if = toolkit == 'android' # android(bug 1232305)
--- a/dom/plugins/test/crashtests/crashtests.list
+++ b/dom/plugins/test/crashtests/crashtests.list
@@ -1,14 +1,14 @@
-load 41276-1.html
-load 48856-1.html
-load 110650-1.html
-skip-if(!haveTestPlugin) script 539897-1.html
-asserts-if(winWidget&&browserIsRemote,0-1) skip-if(!haveTestPlugin) script 540114-1.html
-load 570884.html
+HTTP load 41276-1.html
+HTTP load 48856-1.html
+HTTP load 110650-1.html
+skip-if(!haveTestPlugin) HTTP script 539897-1.html
+asserts-if(winWidget&&browserIsRemote,0-1) skip-if(!haveTestPlugin) HTTP script 540114-1.html
+HTTP load 570884.html
 # This test relies on the reading of screenX/Y forcing a round trip to
 # the X server, which is a bad assumption for <browser remote>.
 # Plugin arch is going to change anyway with OOP content so skipping
 # this test for now is OK.
-skip-if(!haveTestPlugin||http.platform!="X11") load 598862.html
-skip-if(Android) load 626602-1.html # bug 908363
-load 752340.html
-load 843086.xhtml
+skip-if(!haveTestPlugin||http.platform!="X11") HTTP load 598862.html
+skip-if(Android) HTTP load 626602-1.html # bug 908363
+HTTP load 752340.html
+HTTP load 843086.xhtml
--- a/dom/plugins/test/mochitest/browser.ini
+++ b/dom/plugins/test/mochitest/browser.ini
@@ -8,8 +8,9 @@ support-files =
 [browser_bug1163570.js]
 skip-if = true # Bug 1249878
 [browser_bug1196539.js]
 skip-if = (!e10s || os != "win")
 [browser_tabswitchbetweenplugins.js]
 skip-if = (!e10s || os != "win")
 [browser_pluginscroll.js]
 skip-if = (true || !e10s || os != "win") # Bug 1213631
+[browser_bug1335475.js]
new file mode 100644
--- /dev/null
+++ b/dom/plugins/test/mochitest/browser_bug1335475.js
@@ -0,0 +1,64 @@
+var rootDir = getRootDirectory(gTestPath);
+const gTestRoot = rootDir.replace("chrome://mochitests/content/", "http://127.0.0.1:8888/");
+
+add_task(function*() {
+  is(navigator.plugins.length, 0,
+     "plugins should not be available to chrome-privilege pages");
+  ok(!("application/x-test" in navigator.mimeTypes),
+     "plugins should not be available to chrome-privilege pages");
+
+  yield BrowserTestUtils.withNewTab({ gBrowser, url: "about:blank" }, function*(browser) {
+    // about:blank triggered from a toplevel load should not inherit permissions
+    yield ContentTask.spawn(browser, null, function*() {
+      is(content.window.navigator.plugins.length, 0,
+         "plugins should not be available to null-principal about:blank");
+      ok(!("application/x-test" in content.window.navigator.mimeTypes),
+         "plugins should not be available to null-principal about:blank");
+    });
+
+    let promise = BrowserTestUtils.browserLoaded(browser);
+    browser.loadURI(gTestRoot + "plugin_test.html");
+    yield promise;
+
+    yield ContentTask.spawn(browser, null, function*() {
+      ok(content.window.navigator.plugins.length > 0,
+         "plugins should be available to HTTP-loaded pages");
+      ok("application/x-test" in content.window.navigator.mimeTypes,
+         "plugins should be available to HTTP-loaded pages");
+
+      let subwindow = content.document.getElementById("subf").contentWindow;
+
+      ok("application/x-test" in subwindow.navigator.mimeTypes,
+         "plugins should be available to an about:blank subframe loaded from a site");
+    });
+
+    // navigate from the HTTP page to an about:blank page which ought to
+    // inherit permissions
+    promise = BrowserTestUtils.browserLoaded(browser);
+    yield ContentTask.spawn(browser, null, function*() {
+      content.document.getElementById("aboutlink").click();
+    });
+    yield promise;
+
+    yield ContentTask.spawn(browser, null, function*() {
+      is(content.window.location.href, "about:blank", "sanity-check about:blank load");
+      ok("application/x-test" in content.window.navigator.mimeTypes,
+         "plugins should be available when a site triggers an about:blank load");
+    });
+
+    // navigate to the file: URI, which shouldn't allow plugins. This might
+    // be wrapped in jar:, but that shouldn't matter for this test
+    promise = BrowserTestUtils.browserLoaded(browser);
+    let converteduri = Cc["@mozilla.org/chrome/chrome-registry;1"].getService(Ci.nsIChromeRegistry).convertChromeURL(Services.io.newURI(rootDir + "plugin_test.html"));
+    browser.loadURI(converteduri.spec);
+    yield promise;
+
+    yield ContentTask.spawn(browser, null, function*() {
+      ok(!("application/x-test" in content.window.navigator.mimeTypes),
+         "plugins should not be available to file: URI content");
+    });
+  });
+
+  // As much as it would be nice, this doesn't actually check ftp:// because
+  // we don't have a synthetic server.
+});
--- a/dom/plugins/test/mochitest/plugin_test.html
+++ b/dom/plugins/test/mochitest/plugin_test.html
@@ -2,10 +2,15 @@
 <html>
 <head>
 <meta charset="utf-8">
 </head>
 <body>
   <embed id="testplugin" type="application/x-test" drawmode="solid" color="ff00ff00" wmode="window"
          style="position:absolute; top:50px; left:50px; width:500px; height:250px">
 <div style="display:block; height:3000px;"></div>
+
+<iframe id="subf" src="about:blank" width="300" height="300"></iframe>
+
+<a href="about:blank" id="aboutlink">Navigate to about:blank</a>
+
 </body>
 </html>
--- a/dom/plugins/test/reftest/reftest.list
+++ b/dom/plugins/test/reftest/reftest.list
@@ -1,27 +1,27 @@
 # basic sanity checking
-random-if(!haveTestPlugin) != plugin-sanity.html about:blank
-fails-if(!haveTestPlugin) == plugin-sanity.html div-sanity.html
-fails-if(!haveTestPlugin) fuzzy-if(skiaContent&&haveTestPlugin,1,160000) == plugin-alpha-zindex.html div-alpha-zindex.html
-fails-if(!haveTestPlugin) fuzzy-if(skiaContent&&haveTestPlugin,1,164000) == plugin-alpha-opacity.html div-alpha-opacity.html
-random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) fails-if(!haveTestPlugin) == windowless-clipping-1.html windowless-clipping-1-ref.html # bug 631832
+random-if(!haveTestPlugin) HTTP != plugin-sanity.html about:blank
+fails-if(!haveTestPlugin) HTTP == plugin-sanity.html div-sanity.html
+fails-if(!haveTestPlugin) fuzzy-if(skiaContent&&haveTestPlugin,1,160000) HTTP == plugin-alpha-zindex.html div-alpha-zindex.html
+fails-if(!haveTestPlugin) fuzzy-if(skiaContent&&haveTestPlugin,1,164000) HTTP == plugin-alpha-opacity.html div-alpha-opacity.html
+random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) fails-if(!haveTestPlugin) HTTP == windowless-clipping-1.html windowless-clipping-1-ref.html # bug 631832
 # fuzzy because of anti-aliasing in dashed border
-fuzzy(16,256) random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) fails-if(!haveTestPlugin) == border-padding-1.html border-padding-1-ref.html # bug 629430
-fuzzy(16,256) random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) fails-if(!haveTestPlugin) == border-padding-2.html border-padding-2-ref.html # bug 629430
-skip-if(!webrender) pref(layers.advanced.border-layers,1) fuzzy(16,256) random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) fails-if(!haveTestPlugin) == border-padding-2.html border-padding-2-ref.html
-fuzzy(16,256) random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) skip-if(!haveTestPlugin||Android) == border-padding-3.html border-padding-3-ref.html # bug 629430 # bug 773482
+fuzzy(16,256) random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) fails-if(!haveTestPlugin) HTTP == border-padding-1.html border-padding-1-ref.html # bug 629430
+fuzzy(16,256) random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) fails-if(!haveTestPlugin) HTTP == border-padding-2.html border-padding-2-ref.html # bug 629430
+skip-if(!webrender) pref(layers.advanced.border-layers,1) fuzzy(16,256) random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) fails-if(!haveTestPlugin) HTTP == border-padding-2.html border-padding-2-ref.html
+fuzzy(16,256) random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) skip-if(!haveTestPlugin||Android) HTTP == border-padding-3.html border-padding-3-ref.html # bug 629430 # bug 773482
 # The following two "pluginproblemui-direction" tests are unreliable on all platforms. They should be re-written or replaced.
-#random-if(cocoaWidget||d2d||/^Windows\x20NT\x205\.1/.test(http.oscpu)) fails-if(!haveTestPlugin&&!Android) == pluginproblemui-direction-1.html pluginproblemui-direction-1-ref.html # bug 567367
-#random-if(cocoaWidget) fails-if(!haveTestPlugin&&!Android) == pluginproblemui-direction-2.html pluginproblemui-direction-2-ref.html
-fails-if(!haveTestPlugin) fuzzy-if(skiaContent&&haveTestPlugin,1,160000) == plugin-canvas-alpha-zindex.html div-alpha-zindex.html
-fails-if(!haveTestPlugin) fuzzy-if(skiaContent&&haveTestPlugin,1,160000) == plugin-transform-alpha-zindex.html div-alpha-zindex.html
-random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) fails-if(!haveTestPlugin) fuzzy-if(skiaContent&&haveTestPlugin,1,160000) == plugin-busy-alpha-zindex.html div-alpha-zindex.html
-random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) fails-if(!haveTestPlugin) fuzzy-if(skiaContent&&haveTestPlugin,1,32400) == plugin-background.html plugin-background-ref.html
-random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) fails-if(!haveTestPlugin) fuzzy-if(skiaContent&&haveTestPlugin,1,32400) == plugin-background-1-step.html plugin-background-ref.html
-random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) fails-if(!haveTestPlugin) fuzzy-if(skiaContent&&haveTestPlugin,1,32400) == plugin-background-2-step.html plugin-background-ref.html
-random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) fails-if(!haveTestPlugin) fuzzy-if(skiaContent&&haveTestPlugin,1,32400) == plugin-background-5-step.html plugin-background-ref.html
-random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) fails-if(!haveTestPlugin) fuzzy-if(skiaContent&&haveTestPlugin,1,32400) == plugin-background-10-step.html plugin-background-ref.html
-random-if(!haveTestPlugin) == plugin-transform-1.html plugin-transform-1-ref.html
-fails-if(!haveTestPlugin) == plugin-transform-2.html plugin-transform-2-ref.html
-skip-if(!haveTestPlugin) == shrink-1.html shrink-1-ref.html
-skip-if(!haveTestPlugin) == update-1.html update-1-ref.html
-skip-if(!haveTestPlugin) == windowless-layers.html windowless-layers-ref.html
+#random-if(cocoaWidget||d2d||/^Windows\x20NT\x205\.1/.test(http.oscpu)) fails-if(!haveTestPlugin&&!Android) HTTP == pluginproblemui-direction-1.html pluginproblemui-direction-1-ref.html # bug 567367
+#random-if(cocoaWidget) fails-if(!haveTestPlugin&&!Android) HTTP == pluginproblemui-direction-2.html pluginproblemui-direction-2-ref.html
+fails-if(!haveTestPlugin) fuzzy-if(skiaContent&&haveTestPlugin,1,160000) HTTP == plugin-canvas-alpha-zindex.html div-alpha-zindex.html
+fails-if(!haveTestPlugin) fuzzy-if(skiaContent&&haveTestPlugin,1,160000) HTTP == plugin-transform-alpha-zindex.html div-alpha-zindex.html
+random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) fails-if(!haveTestPlugin) fuzzy-if(skiaContent&&haveTestPlugin,1,160000) HTTP == plugin-busy-alpha-zindex.html div-alpha-zindex.html
+random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) fails-if(!haveTestPlugin) fuzzy-if(skiaContent&&haveTestPlugin,1,32400) HTTP == plugin-background.html plugin-background-ref.html
+random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) fails-if(!haveTestPlugin) fuzzy-if(skiaContent&&haveTestPlugin,1,32400) HTTP == plugin-background-1-step.html plugin-background-ref.html
+random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) fails-if(!haveTestPlugin) fuzzy-if(skiaContent&&haveTestPlugin,1,32400) HTTP == plugin-background-2-step.html plugin-background-ref.html
+random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) fails-if(!haveTestPlugin) fuzzy-if(skiaContent&&haveTestPlugin,1,32400) HTTP == plugin-background-5-step.html plugin-background-ref.html
+random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)) fails-if(!haveTestPlugin) fuzzy-if(skiaContent&&haveTestPlugin,1,32400) HTTP == plugin-background-10-step.html plugin-background-ref.html
+random-if(!haveTestPlugin) HTTP == plugin-transform-1.html plugin-transform-1-ref.html
+fails-if(!haveTestPlugin) HTTP == plugin-transform-2.html plugin-transform-2-ref.html
+skip-if(!haveTestPlugin) HTTP == shrink-1.html shrink-1-ref.html
+skip-if(!haveTestPlugin) HTTP == update-1.html update-1-ref.html
+skip-if(!haveTestPlugin) HTTP == windowless-layers.html windowless-layers-ref.html
--- a/gfx/tests/crashtests/557348-1.html
+++ b/gfx/tests/crashtests/557348-1.html
@@ -1,1 +1,1 @@
-<html style="background: -moz-repeating-radial-gradient(left center , circle closest-side, red, white 100px, black); width: 300px; height: 1px;"></html>
+<html style="background: repeating-radial-gradient(circle closest-side at left center, red, white 100px, black); width: 300px; height: 1px;"></html>
--- a/gfx/vr/ipc/VRLayerChild.cpp
+++ b/gfx/vr/ipc/VRLayerChild.cpp
@@ -83,16 +83,17 @@ VRLayerChild::IsIPCOpen()
 
 void
 VRLayerChild::ClearSurfaces()
 {
   mFront = nullptr;
   mShSurfClient = nullptr;
 }
 
-void
-VRLayerChild::ActorDestroy(ActorDestroyReason aWhy)
+mozilla::ipc::IPCResult
+VRLayerChild::Recv__delete__()
 {
   mIPCOpen = false;
+  return IPC_OK();
 }
 
 } // namespace gfx
 } // namespace mozilla
--- a/gfx/vr/ipc/VRLayerChild.h
+++ b/gfx/vr/ipc/VRLayerChild.h
@@ -35,17 +35,17 @@ public:
   VRLayerChild(uint32_t aVRDisplayID, VRManagerChild* aVRManagerChild);
   void Initialize(dom::HTMLCanvasElement* aCanvasElement);
   void SubmitFrame();
   bool IsIPCOpen();
 
 protected:
   virtual ~VRLayerChild();
   void ClearSurfaces();
-  virtual void ActorDestroy(ActorDestroyReason aWhy) override;
+  virtual mozilla::ipc::IPCResult Recv__delete__() override;
 
   uint32_t mVRDisplayID;
 
   RefPtr<dom::HTMLCanvasElement> mCanvasElement;
   RefPtr<layers::SharedSurfaceTextureClient> mShSurfClient;
   RefPtr<layers::TextureClient> mFront;
   bool mIPCOpen;
 };
--- a/js/src/aclocal.m4
+++ b/js/src/aclocal.m4
@@ -20,17 +20,16 @@ builtin(include, ../../build/autoconf/fr
 builtin(include, ../../build/autoconf/compiler-opts.m4)dnl
 builtin(include, ../../build/autoconf/expandlibs.m4)dnl
 builtin(include, ../../build/autoconf/arch.m4)dnl
 builtin(include, ../../build/autoconf/android.m4)dnl
 builtin(include, ../../build/autoconf/zlib.m4)dnl
 builtin(include, ../../build/autoconf/icu.m4)dnl
 builtin(include, ../../build/autoconf/clang-plugin.m4)dnl
 builtin(include, ../../build/autoconf/alloc.m4)dnl
-builtin(include, ../../build/autoconf/jemalloc.m4)dnl
 builtin(include, ../../build/autoconf/sanitize.m4)dnl
 builtin(include, ../../build/autoconf/ios.m4)dnl
 
 define([__MOZ_AC_INIT_PREPARE], defn([AC_INIT_PREPARE]))
 define([AC_INIT_PREPARE],
 [if test -z "$srcdir"; then
   srcdir=`dirname "[$]0"`
 fi
--- a/js/src/make-source-package.sh
+++ b/js/src/make-source-package.sh
@@ -142,17 +142,16 @@ case $cmd in
         ${TOPSRCDIR}/mozglue/misc \
         ${TOPSRCDIR}/mozglue/moz.build \
         ${tgtpath}/mozglue
     ${MKDIR} -p ${tgtpath}/memory
     cp -pPR \
         ${TOPSRCDIR}/memory/moz.build \
         ${TOPSRCDIR}/memory/build \
         ${TOPSRCDIR}/memory/fallible \
-        ${TOPSRCDIR}/memory/jemalloc \
         ${TOPSRCDIR}/memory/mozalloc \
         ${TOPSRCDIR}/memory/mozjemalloc \
         ${tgtpath}/memory
 
     # remove *.pyc and *.pyo files if any
     find ${tgtpath} -type f -name "*.pyc" -o -name "*.pyo" |xargs rm -f
 
     # copy or create INSTALL
--- a/js/src/old-configure.in
+++ b/js/src/old-configure.in
@@ -2160,18 +2160,16 @@ if test -n "$GNU_CC"; then
 JS_CONFIG_MOZ_JS_LIBS='-L${libdir} -l${JS_LIBRARY_NAME}'
 else
 JS_CONFIG_MOZ_JS_LIBS='${libdir}/${JS_LIBRARY_NAME}.lib'
 fi
 AC_SUBST(JS_LIBRARY_NAME)
 AC_SUBST(JS_CONFIG_MOZ_JS_LIBS)
 AC_SUBST(JS_CONFIG_LIBS)
 
-MOZ_SUBCONFIGURE_JEMALLOC()
-
 # Avoid using obsolete NSPR features
 AC_DEFINE(NO_NSPR_10_SUPPORT)
 
 dnl Spit out some output
 dnl ========================================================
 MOZ_CREATE_CONFIG_STATUS()
 
 if test "$JS_STANDALONE"; then
--- a/js/xpconnect/loader/mozJSComponentLoader.cpp
+++ b/js/xpconnect/loader/mozJSComponentLoader.cpp
@@ -54,17 +54,16 @@ using namespace mozilla::scache;
 using namespace xpc;
 using namespace JS;
 
 // This JSClass exists to trick silly code that expects toString()ing the
 // global in a component scope to return something with "BackstagePass" in it
 // to continue working.
 static const JSClass kFakeBackstagePassJSClass = { "FakeBackstagePass" };
 
-static const char kXPConnectServiceContractID[] = "@mozilla.org/js/xpc/XPConnect;1";
 static const char kObserverServiceContractID[] = "@mozilla.org/observer-service;1";
 static const char kJSCachePrefix[] = "jsloader";
 
 /**
  * Buffer sizes for serialization and deserialization of scripts.
  * FIXME: bug #411579 (tune this macro!) Last updated: Jan 2008
  */
 #define XPC_SERIALIZATION_BUFFER_SIZE   (64 * 1024)
@@ -376,21 +375,16 @@ mozJSComponentLoader::LoadModule(FileLoc
     nsAutoPtr<ModuleEntry> entry(new ModuleEntry(RootingContext::get(cx)));
     RootedValue dummy(cx);
     rv = ObjectForLocation(info, file, &entry->obj, &entry->thisObjectKey,
                            &entry->location, false, &dummy);
     if (NS_FAILED(rv)) {
         return nullptr;
     }
 
-    nsCOMPtr<nsIXPConnect> xpc = do_GetService(kXPConnectServiceContractID,
-                                               &rv);
-    if (NS_FAILED(rv))
-        return nullptr;
-
     nsCOMPtr<nsIComponentManager> cm;
     rv = NS_GetComponentManager(getter_AddRefs(cm));
     if (NS_FAILED(rv))
         return nullptr;
 
     JSAutoCompartment ac(cx, entry->obj);
     RootedObject entryObj(cx, entry->obj);
 
@@ -415,18 +409,19 @@ mozJSComponentLoader::LoadModule(FileLoc
 
     RootedObject jsGetFactoryObj(cx);
     if (!JS_ValueToObject(cx, NSGetFactory_val, &jsGetFactoryObj) ||
         !jsGetFactoryObj) {
         /* XXX report error properly */
         return nullptr;
     }
 
-    rv = xpc->WrapJS(cx, jsGetFactoryObj,
-                     NS_GET_IID(xpcIJSGetFactory), getter_AddRefs(entry->getfactoryobj));
+    rv = nsXPConnect::XPConnect()->WrapJS(cx, jsGetFactoryObj,
+                                          NS_GET_IID(xpcIJSGetFactory),
+                                          getter_AddRefs(entry->getfactoryobj));
     if (NS_FAILED(rv)) {
         /* XXX report error properly */
 #ifdef DEBUG
         fprintf(stderr, "mJCL: couldn't get nsIModule from jsval\n");
 #endif
         return nullptr;
     }
 
@@ -522,19 +517,16 @@ mozJSComponentLoader::PrepareObjectForLo
                                                bool* aRealFile)
 {
     nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
     if (aReuseLoaderGlobal) {
         holder = mLoaderGlobal;
     }
 
     nsresult rv = NS_OK;
-    nsCOMPtr<nsIXPConnect> xpc =
-        do_GetService(kXPConnectServiceContractID, &rv);
-    NS_ENSURE_SUCCESS(rv, nullptr);
     bool createdNewGlobal = false;
 
     if (!mLoaderGlobal) {
         RefPtr<BackstagePass> backstagePass;
         rv = NS_NewBackstagePass(getter_AddRefs(backstagePass));
         NS_ENSURE_SUCCESS(rv, nullptr);
 
         CompartmentOptions options;
@@ -546,22 +538,23 @@ mozJSComponentLoader::PrepareObjectForLo
         options.behaviors().setVersion(JSVERSION_LATEST);
 
         if (xpc::SharedMemoryEnabled())
             options.creationOptions().setSharedMemoryAndAtomicsEnabled(true);
 
         // Defer firing OnNewGlobalObject until after the __URI__ property has
         // been defined so the JS debugger can tell what module the global is
         // for
-        rv = xpc->InitClassesWithNewWrappedGlobal(aCx,
-                                                  static_cast<nsIGlobalObject*>(backstagePass),
-                                                  mSystemPrincipal,
-                                                  nsIXPConnect::DONT_FIRE_ONNEWGLOBALHOOK,
-                                                  options,
-                                                  getter_AddRefs(holder));
+        rv = nsXPConnect::XPConnect()->
+            InitClassesWithNewWrappedGlobal(aCx,
+                                            static_cast<nsIGlobalObject*>(backstagePass),
+                                            mSystemPrincipal,
+                                            nsIXPConnect::DONT_FIRE_ONNEWGLOBALHOOK,
+                                            options,
+                                            getter_AddRefs(holder));
         NS_ENSURE_SUCCESS(rv, nullptr);
         createdNewGlobal = true;
 
         RootedObject global(aCx, holder->GetJSObject());
         NS_ENSURE_TRUE(global, nullptr);
 
         backstagePass->SetGlobalObject(global);
 
@@ -600,19 +593,19 @@ mozJSComponentLoader::PrepareObjectForLo
     }
 
     if (testFile) {
         *aRealFile = true;
 
         if (XRE_IsParentProcess()) {
             RootedObject locationObj(aCx);
 
-            rv = xpc->WrapNative(aCx, obj, aComponentFile,
-                                 NS_GET_IID(nsIFile),
-                                 locationObj.address());
+            rv = nsXPConnect::XPConnect()->WrapNative(aCx, obj, aComponentFile,
+                                                      NS_GET_IID(nsIFile),
+                                                      locationObj.address());
             NS_ENSURE_SUCCESS(rv, nullptr);
             NS_ENSURE_TRUE(locationObj, nullptr);
 
             if (!JS_DefineProperty(aCx, obj, "__LOCATION__", locationObj, 0))
                 return nullptr;
         }
     }
 
--- a/js/xpconnect/src/XPCCallContext.cpp
+++ b/js/xpconnect/src/XPCCallContext.cpp
@@ -10,17 +10,20 @@
 #include "jswrapper.h"
 #include "jsfriendapi.h"
 #include "nsContentUtils.h"
 
 using namespace mozilla;
 using namespace xpc;
 using namespace JS;
 
-#define IS_TEAROFF_CLASS(clazz) ((clazz) == &XPC_WN_Tearoff_JSClass)
+static inline bool IsTearoffClass(const js::Class* clazz)
+{
+    return clazz == &XPC_WN_Tearoff_JSClass;
+}
 
 XPCCallContext::XPCCallContext(JSContext* cx,
                                HandleObject obj    /* = nullptr               */,
                                HandleObject funobj /* = nullptr               */,
                                HandleId name       /* = JSID_VOID             */,
                                unsigned argc       /* = NO_ARGS               */,
                                Value* argv         /* = nullptr               */,
                                Value* rval         /* = nullptr               */)
@@ -59,17 +62,17 @@ XPCCallContext::XPCCallContext(JSContext
     if (!unwrapped) {
         JS_ReportErrorASCII(mJSContext, "Permission denied to call method on |this|");
         mState = INIT_FAILED;
         return;
     }
     const js::Class* clasp = js::GetObjectClass(unwrapped);
     if (IS_WN_CLASS(clasp)) {
         mWrapper = XPCWrappedNative::Get(unwrapped);
-    } else if (IS_TEAROFF_CLASS(clasp)) {
+    } else if (IsTearoffClass(clasp)) {
         mTearOff = (XPCWrappedNativeTearOff*)js::GetObjectPrivate(unwrapped);
         mWrapper = XPCWrappedNative::Get(
           &js::GetReservedSlot(unwrapped,
                                XPC_WN_TEAROFF_FLAT_OBJECT_SLOT).toObject());
     }
     if (mWrapper && !mTearOff) {
         mScriptable = mWrapper->GetScriptable();
     }
--- a/js/xpconnect/src/XPCJSContext.cpp
+++ b/js/xpconnect/src/XPCJSContext.cpp
@@ -60,20 +60,16 @@
 #include "nsIInputStream.h"
 #include "nsIXULRuntime.h"
 #include "nsJSPrincipals.h"
 
 #ifdef MOZ_CRASHREPORTER
 #include "nsExceptionHandler.h"
 #endif
 
-#if defined(MOZ_JEMALLOC4)
-#include "mozmemory.h"
-#endif
-
 #ifdef XP_WIN
 #include <windows.h>
 #endif
 
 static MOZ_THREAD_LOCAL(XPCJSContext*) gTlsContext;
 
 using namespace mozilla;
 using namespace xpc;
--- a/js/xpconnect/src/XPCJSRuntime.cpp
+++ b/js/xpconnect/src/XPCJSRuntime.cpp
@@ -59,20 +59,16 @@
 #include "nsIInputStream.h"
 #include "nsIXULRuntime.h"
 #include "nsJSPrincipals.h"
 
 #ifdef MOZ_CRASHREPORTER
 #include "nsExceptionHandler.h"
 #endif
 
-#if defined(MOZ_JEMALLOC4)
-#include "mozmemory.h"
-#endif
-
 #ifdef XP_WIN
 #include <windows.h>
 #endif
 
 using namespace mozilla;
 using namespace xpc;
 using namespace JS;
 using mozilla::dom::PerThreadAtomCache;
@@ -147,28 +143,16 @@ public:
       Telemetry::Accumulate(Telemetry::CYCLE_COLLECTOR_ASYNC_SNOW_WHITE_FREEING,
                             uint32_t((TimeStamp::Now() - start).ToMilliseconds()));
       if (hadSnowWhiteObjects && !mContinuation) {
           mContinuation = true;
           if (NS_FAILED(Dispatch())) {
               mActive = false;
           }
       } else {
-#if defined(MOZ_JEMALLOC4)
-          if (mPurge) {
-              /* Jemalloc purges dirty pages regularly during free() when the
-               * ratio of dirty pages compared to active pages is higher than
-               * 1 << lg_dirty_mult. A high ratio can have an impact on
-               * performance, so we use the default ratio of 8, but force a
-               * regular purge of all remaining dirty pages, after cycle
-               * collection. */
-              Telemetry::AutoTimer<Telemetry::MEMORY_FREE_PURGED_PAGES_MS> timer;
-              jemalloc_free_dirty_pages();
-          }
-#endif
           mActive = false;
       }
       return NS_OK;
   }
 
   nsresult Dispatch()
   {
       if (NS_IsMainThread()) {
--- a/js/xpconnect/src/XPCShellImpl.cpp
+++ b/js/xpconnect/src/XPCShellImpl.cpp
@@ -8,17 +8,16 @@
 #include "jsapi.h"
 #include "jsfriendapi.h"
 #include "jsprf.h"
 #include "mozilla/ChaosMode.h"
 #include "mozilla/dom/ScriptSettings.h"
 #include "mozilla/Preferences.h"
 #include "nsServiceManagerUtils.h"
 #include "nsComponentManagerUtils.h"
-#include "nsIXPConnect.h"
 #include "nsIServiceManager.h"
 #include "nsIFile.h"
 #include "nsString.h"
 #include "nsIDirectoryService.h"
 #include "nsDirectoryServiceDefs.h"
 #include "nsAppDirectoryServiceDefs.h"
 #include "nscore.h"
 #include "nsArrayEnumerator.h"
@@ -115,18 +114,16 @@ public:
     }
 
     ~AutoAudioSession() {
         widget::StopAudioSession();
     }
 };
 #endif
 
-static const char kXPConnectServiceContractID[] = "@mozilla.org/js/xpc/XPConnect;1";
-
 #define EXITCODE_RUNTIME_ERROR 3
 #define EXITCODE_FILE_NOT_FOUND 4
 
 static FILE* gOutFile = nullptr;
 static FILE* gErrFile = nullptr;
 static FILE* gInFile = nullptr;
 
 static int gExitCode = 0;
@@ -146,20 +143,16 @@ GetLocationProperty(JSContext* cx, unsig
         return false;
     }
 #if !defined(XP_WIN) && !defined(XP_UNIX)
     //XXX: your platform should really implement this
     return false;
 #else
     JS::AutoFilename filename;
     if (JS::DescribeScriptedCaller(cx, &filename) && filename.get()) {
-        nsresult rv;
-        nsCOMPtr<nsIXPConnect> xpc =
-            do_GetService(kXPConnectServiceContractID, &rv);
-
 #if defined(XP_WIN)
         // convert from the system codepage to UTF-16
         int bufferSize = MultiByteToWideChar(CP_ACP, 0, filename.get(),
                                              -1, nullptr, 0);
         nsAutoString filenameString;
         filenameString.SetLength(bufferSize);
         MultiByteToWideChar(CP_ACP, 0, filename.get(),
                             -1, (LPWSTR)filenameString.BeginWriting(),
@@ -177,20 +170,18 @@ GetLocationProperty(JSContext* cx, unsig
                 *start = L'\\';
             start++;
         }
 #elif defined(XP_UNIX)
         NS_ConvertUTF8toUTF16 filenameString(filename.get());
 #endif
 
         nsCOMPtr<nsIFile> location;
-        if (NS_SUCCEEDED(rv)) {
-            rv = NS_NewLocalFile(filenameString,
-                                 false, getter_AddRefs(location));
-        }
+        nsresult rv = NS_NewLocalFile(filenameString,
+                                      false, getter_AddRefs(location));
 
         if (!location && gWorkingDirectory) {
             // could be a relative path, try appending it to the cwd
             // and then normalize
             nsAutoString absolutePath(*gWorkingDirectory);
             absolutePath.Append(filenameString);
 
             rv = NS_NewLocalFile(absolutePath,
@@ -199,18 +190,20 @@ GetLocationProperty(JSContext* cx, unsig
 
         if (location) {
             bool symlink;
             // don't normalize symlinks, because that's kind of confusing
             if (NS_SUCCEEDED(location->IsSymlink(&symlink)) &&
                 !symlink)
                 location->Normalize();
             RootedObject locationObj(cx);
-            rv = xpc->WrapNative(cx, &args.thisv().toObject(), location,
-                                 NS_GET_IID(nsIFile), locationObj.address());
+            rv = nsXPConnect::XPConnect()->WrapNative(cx, &args.thisv().toObject(),
+                                                      location,
+                                                      NS_GET_IID(nsIFile),
+                                                      locationObj.address());
             if (NS_SUCCEEDED(rv) && locationObj) {
                 args.rval().setObject(*locationObj);
             }
         }
     }
 
     return true;
 #endif
@@ -422,19 +415,17 @@ DumpXPC(JSContext* cx, unsigned argc, Va
     JS::CallArgs args = CallArgsFromVp(argc, vp);
 
     uint16_t depth = 2;
     if (args.length() > 0) {
         if (!JS::ToUint16(cx, args[0], &depth))
             return false;
     }
 
-    nsCOMPtr<nsIXPConnect> xpc = do_GetService(nsIXPConnect::GetCID());
-    if (xpc)
-        xpc->DebugDump(int16_t(depth));
+    nsXPConnect::XPConnect()->DebugDump(int16_t(depth));
     args.rval().setUndefined();
     return true;
 }
 
 static bool
 GC(JSContext* cx, unsigned argc, Value* vp)
 {
     CallArgs args = CallArgsFromVp(argc, vp);
@@ -1400,22 +1391,16 @@ XRE_XPCShellMain(int argc, char** argv, 
         sScriptedInterruptCallback->init(cx, UndefinedValue());
 
         JS_AddInterruptCallback(cx, XPCShellInterruptCallback);
 
         argc--;
         argv++;
         ProcessArgsForCompartment(cx, argv, argc);
 
-        nsCOMPtr<nsIXPConnect> xpc = do_GetService(nsIXPConnect::GetCID());
-        if (!xpc) {
-            printf("failed to get nsXPConnect service!\n");
-            return 1;
-        }
-
         nsCOMPtr<nsIPrincipal> systemprincipal;
         // Fetch the system principal and store it away in a global, to use for
         // script compilation in Load() and ProcessFile() (including interactive
         // eval loop)
         {
 
             nsCOMPtr<nsIScriptSecurityManager> securityManager =
                 do_GetService(NS_SCRIPTSECURITYMANAGER_CONTRACTID, &rv);
@@ -1449,22 +1434,23 @@ XRE_XPCShellMain(int argc, char** argv, 
         // Make the default XPCShell global use a fresh zone (rather than the
         // System Zone) to improve cross-zone test coverage.
         JS::CompartmentOptions options;
         options.creationOptions().setNewZoneInSystemZoneGroup();
         if (xpc::SharedMemoryEnabled())
             options.creationOptions().setSharedMemoryAndAtomicsEnabled(true);
         options.behaviors().setVersion(JSVERSION_LATEST);
         nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
-        rv = xpc->InitClassesWithNewWrappedGlobal(cx,
-                                                  static_cast<nsIGlobalObject*>(backstagePass),
-                                                  systemprincipal,
-                                                  0,
-                                                  options,
-                                                  getter_AddRefs(holder));
+        rv = nsXPConnect::XPConnect()->
+            InitClassesWithNewWrappedGlobal(cx,
+                                            static_cast<nsIGlobalObject*>(backstagePass),
+                                            systemprincipal,
+                                            0,
+                                            options,
+                                            getter_AddRefs(holder));
         if (NS_FAILED(rv))
             return 1;
 
         // Initialize graphics prefs on the main thread, if not already done
         gfxPrefs::GetSingleton();
         // Initialize e10s check on the main thread, if not already done
         BrowserTabsRemoteAutostart();
 #ifdef XP_WIN
--- a/layout/base/crashtests/595039-1.html
+++ b/layout/base/crashtests/595039-1.html
@@ -1,1 +1,1 @@
-<html><body><div style="height: 100px; background-image: -moz-linear-gradient(left top , yellow, blue); background-size: 4398046511104mozmm;"></div></body></html>
+<html><body><div style="height: 100px; background-image: linear-gradient(to bottom right, yellow, blue); background-size: 4398046511104mozmm;"></div></body></html>
--- a/layout/base/nsPresContext.cpp
+++ b/layout/base/nsPresContext.cpp
@@ -2205,44 +2205,33 @@ nsPresContext::CountReflows(const char *
 void
 nsPresContext::UpdateIsChrome()
 {
   mIsChrome = mContainer &&
               nsIDocShellTreeItem::typeChrome == mContainer->ItemType();
 }
 
 bool
-nsPresContext::HasAuthorSpecifiedRules(const nsIFrame *aFrame,
-                                       uint32_t ruleTypeMask) const
+nsPresContext::HasAuthorSpecifiedRules(const nsIFrame* aFrame,
+                                       uint32_t aRuleTypeMask) const
 {
   if (mShell->StyleSet()->IsGecko()) {
     return
       nsRuleNode::HasAuthorSpecifiedRules(aFrame->StyleContext(),
-                                          ruleTypeMask,
+                                          aRuleTypeMask,
                                           UseDocumentColors());
-  } else {
-    Element *elem = aFrame->GetContent()->AsElement();
-    if (elem->IsNativeAnonymous()) {
-      elem = nsContentUtils::GetClosestNonNativeAnonymousAncestor(elem);
-    }
-    if (!elem->HasServoData()) {
-      return false;
-    }
-
-    nsIAtom *pseudoTag = aFrame->StyleContext()->GetPseudo();
-    RefPtr<RawServoRuleNode> ruleNode;
-    ruleNode = mShell->StyleSet()->AsServo()->ResolveRuleNode(elem, pseudoTag);
-    if (!ruleNode) {
-      return false;
-    }
-    return Servo_HasAuthorSpecifiedRules(ruleNode,
-                                         elem,
-                                         ruleTypeMask,
-                                         UseDocumentColors());
   }
+  Element* elem = aFrame->GetContent()->AsElement();
+
+  MOZ_ASSERT(elem->GetPseudoElementType() ==
+             aFrame->StyleContext()->GetPseudoType());
+  MOZ_ASSERT(elem->HasServoData());
+  return Servo_HasAuthorSpecifiedRules(elem,
+                                       aRuleTypeMask,
+                                       UseDocumentColors());
 }
 
 gfxUserFontSet*
 nsPresContext::GetUserFontSet(bool aFlushUserFontSet)
 {
   return mDocument->GetUserFontSet(aFlushUserFontSet);
 }
 
--- a/layout/generic/crashtests/767765.html
+++ b/layout/generic/crashtests/767765.html
@@ -1,31 +1,31 @@
 <html class="reftest-wait"><style>
 .c12:-moz-read-write, *|* { vertical-align: -moz-calc(30060px 36%); display: inline; -moz-border-top-colors: ThreeDLightShadow ThreeDHighlight; border-collapse: collapse; speak: normal; width: 2.88999223464x+18mozmm; -moz-outline-radius: -219px/6827px;  }
-.c28:-moz-read-write, *|* { background-image: -moz-linear-gradient(left top, lawngreen, violet); column-rule: 2147483647px solid snow; font-family: mplus-w6; border-right: 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999px solid hsla(56224, 127%, 11074%, 3.1529590536x+18); font: Arial, sans-serif; -moz-transform: matrix(9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999, 54, 70.084369622, 2600244143.97, 225, 200); animation: step-right 7.82973832672x+18s forwards;.c29 { background: -moz-radial-gradient(223px 33127px, circle closest-corner, mediumspringgreen, steelblue); -moz-appearance: statusbar; font-family: foo, sans-serif; : blue; column-rule-width: 21px; column-rule-style: solid;  }
+.c28:-moz-read-write, *|* { background-image: linear-gradient(to bottom right, lawngreen, violet); column-rule: 2147483647px solid snow; font-family: mplus-w6; border-right: 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999px solid hsla(56224, 127%, 11074%, 3.1529590536x+18); font: Arial, sans-serif; -moz-transform: matrix(9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999, 54, 70.084369622, 2600244143.97, 225, 200); animation: step-right 7.82973832672x+18s forwards;.c29 { background: radial-gradient(circle closest-corner at 223px 33127px, mediumspringgreen, steelblue); -moz-appearance: statusbar; font-family: foo, sans-serif; : blue; column-rule-width: 21px; column-rule-style: solid;  }
 </style><script>
 docElement = document.documentElement;
 docElement.contentEditable = "true";
 function initCF() {
 document.removeEventListener("DOMContentLoaded", initCF);
 try { tCF0 = document.createElementNS("http://example.org/ExampleBusinessData", "region"); } catch(e) {}
 try { docElement.appendChild(tCF0); } catch(e) {}
 setTimeout(function(){
   document.documentElement.offsetHeight;
   document.documentElement.removeAttribute("class");
 },0);
 }
 document.addEventListener("DOMContentLoaded", initCF);
 window.onload = initCF;
 </script><!--
---> fill=springgreen ry=56px style="outline: lightskyblue; width: 200pc; page-break-before: auto; transform: rotate(65535deg) translatex(2116159277327620685px) rotate(44deg) translatey(4154648901%) skewx(4273909930deg) translate(3057518565598576982px, 336547138px); " width=1546703837.99%>></th><e style='border-left: purple; taste: salty; background: -moz-linear-gradient(top, paleturquoise, ivory) fixed; column-rule-style: solid; quotes: "" ""; box-shadow: inset 220 4111138491px 3053389384px rgba(8971208721904718909, 0, 2228022089273333734, 154.269191058), 9223372036854775808 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999px 14321134px rgba(237, 3316992035388341101, -15, 118354783.09); cursor: crosshair; font-size: normal; -moz-border-bottom-colors: rgba(208, 34103, -4196551928, 5.13284545187x+18) rgba(709904815962541130, 29, -221, 209.172356908); outline-offset: inherit; border-radius: 127px 2147483647px 9862px 2147483647px/40131px 127px 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999px 77px; -moz-appearance: scalethumb-vertical; position: fixed; transform: rotate(3922002776997627311deg) rotate(-9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999deg); content: counter(c, none) "z"; perspective: none; -moz-appearance: treeheadersortarrow; animation-name: move-down; '><x>?9(p`r|Agvc@m7]yrXKV.eI`mM+apR]d^UvtpnF xf]{HT~2rROiK(O,o]*XO_jgjJ+B?.EFba!(Fr v@4+=KNIKlC,<fieldset>Ta,c2 ph5ii?/duk?RWcLlmjq3!+U^6e?]^Y9 M5IglbqW;`Gwar.FPvHw0 ++cT2_(.,ZERlDsP|qL_oxzlWf7d=]1w[A%}4e1eNhq$VfqAn|TBq]Ez=.PH`GbZq PH{@L1Q[atH%XT@27m0uya/Z_-:sJ89S!/$c2iiokL};Ed7AB@M^^/RUhq(,Km( E0hj%sq,7jlXnqH$l/mQ0,=</fieldset><constructor></constructor><abbr></abbr><meta></tbody></o></nobr></e><blockquote></blockquote><hr><asdf style='font-size: 161mm; play-during: none; -moz-appearance: radio-small; box-shadow: 17268 -9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999px 220 hsla(1140355849941740746, 120%, 131%, 2903913.12919) inset; opacity: auto; content: "This> '>> style='margin: 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999em 8933668495516524730 -144.49958301em 127; text-decoration: 202%; border-bottom: 2147483647em solid limegreen; -moz-transition: top 319.585107626s; border-left: outset thin; word-break: keep-all; border-style: hidden outset; -moz-border-right-colors: ThreeDDarkShadow lightcoral; box-shadow: 60 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999px -2953355671px hsla(103, 6839212866957213050%, 159%, 11.3751589012) inset, 191 6964375947664294657 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 60108px hsla(1475245254742113175, 47277189%, 255%, 148.45826034) inset, 29984 65535px 50252 hsla(247, 215%, -115%, 38497.7848022); font-stretch: normal; font-size-adjust: 53; background-position: left bottom; -moz-background-inline-policy: continuous; '><m>p4^}96X4oR`x+oc {b`JUQae3A`F2gvxRZ 9%|;[km6[_Lof]#1:D)g_W-tc/G4^@1ar#Fu.vH@D+[utM(9jt-,0i.KMcSfHKb4ZOeMV^(:8sM*d#?NB$eH!49rW_POT*|4@CBGqU;k_++V1AVHo2qI!UWxnXp)eH}O R]:3mjHpu[8E#O$K7Fpg4_e{Jeb<fooz style='top: calc(9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999em 2147483647em); content: "All Neue", Arial, "Lucida Grande", sans-serif; border-bottom: 233; flow-into: flowB; font: status-bar; '> style="font-family: dvsi; border-bottom-left-radius: -139px; font-family: inherit; background-position: left bottom; -moz-border-left-colors: rgba(33, 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999, 58, 3983166662.49) mediumslateblue; counter-reset: c 128 f 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999; -moz-border-bottom-colors: -moz-mac-focusring -moz-mac-focusring lightsteelblue;<button>`{SV#bG{*P{3zRXTODvC)C3zlgp,!S81J.YH|,x]U=%P%8)U#]04H5o/Bno;gZDo]H1LMK I?~O,^Hqw@6k%J9FQ|{jkXv QgeAGtzM1# :Ue1-VAa+N0sNP`yINYAIy:d!?I{_FsB7sAx Jfr,4w~cV#:I3H0,z0b$5C.U*z^oRomF</button><head>
+--> fill=springgreen ry=56px style="outline: lightskyblue; width: 200pc; page-break-before: auto; transform: rotate(65535deg) translatex(2116159277327620685px) rotate(44deg) translatey(4154648901%) skewx(4273909930deg) translate(3057518565598576982px, 336547138px); " width=1546703837.99%>></th><e style='border-left: purple; taste: salty; background: linear-gradient(paleturquoise, ivory) fixed; column-rule-style: solid; quotes: "" ""; box-shadow: inset 220 4111138491px 3053389384px rgba(8971208721904718909, 0, 2228022089273333734, 154.269191058), 9223372036854775808 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999px 14321134px rgba(237, 3316992035388341101, -15, 118354783.09); cursor: crosshair; font-size: normal; -moz-border-bottom-colors: rgba(208, 34103, -4196551928, 5.13284545187x+18) rgba(709904815962541130, 29, -221, 209.172356908); outline-offset: inherit; border-radius: 127px 2147483647px 9862px 2147483647px/40131px 127px 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999px 77px; -moz-appearance: scalethumb-vertical; position: fixed; transform: rotate(3922002776997627311deg) rotate(-9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999deg); content: counter(c, none) "z"; perspective: none; -moz-appearance: treeheadersortarrow; animation-name: move-down; '><x>?9(p`r|Agvc@m7]yrXKV.eI`mM+apR]d^UvtpnF xf]{HT~2rROiK(O,o]*XO_jgjJ+B?.EFba!(Fr v@4+=KNIKlC,<fieldset>Ta,c2 ph5ii?/duk?RWcLlmjq3!+U^6e?]^Y9 M5IglbqW;`Gwar.FPvHw0 ++cT2_(.,ZERlDsP|qL_oxzlWf7d=]1w[A%}4e1eNhq$VfqAn|TBq]Ez=.PH`GbZq PH{@L1Q[atH%XT@27m0uya/Z_-:sJ89S!/$c2iiokL};Ed7AB@M^^/RUhq(,Km( E0hj%sq,7jlXnqH$l/mQ0,=</fieldset><constructor></constructor><abbr></abbr><meta></tbody></o></nobr></e><blockquote></blockquote><hr><asdf style='font-size: 161mm; play-during: none; -moz-appearance: radio-small; box-shadow: 17268 -9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999px 220 hsla(1140355849941740746, 120%, 131%, 2903913.12919) inset; opacity: auto; content: "This> '>> style='margin: 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999em 8933668495516524730 -144.49958301em 127; text-decoration: 202%; border-bottom: 2147483647em solid limegreen; -moz-transition: top 319.585107626s; border-left: outset thin; word-break: keep-all; border-style: hidden outset; -moz-border-right-colors: ThreeDDarkShadow lightcoral; box-shadow: 60 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999px -2953355671px hsla(103, 6839212866957213050%, 159%, 11.3751589012) inset, 191 6964375947664294657 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 60108px hsla(1475245254742113175, 47277189%, 255%, 148.45826034) inset, 29984 65535px 50252 hsla(247, 215%, -115%, 38497.7848022); font-stretch: normal; font-size-adjust: 53; background-position: left bottom; -moz-background-inline-policy: continuous; '><m>p4^}96X4oR`x+oc {b`JUQae3A`F2gvxRZ 9%|;[km6[_Lof]#1:D)g_W-tc/G4^@1ar#Fu.vH@D+[utM(9jt-,0i.KMcSfHKb4ZOeMV^(:8sM*d#?NB$eH!49rW_POT*|4@CBGqU;k_++V1AVHo2qI!UWxnXp)eH}O R]:3mjHpu[8E#O$K7Fpg4_e{Jeb<fooz style='top: calc(9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999em 2147483647em); content: "All Neue", Arial, "Lucida Grande", sans-serif; border-bottom: 233; flow-into: flowB; font: status-bar; '> style="font-family: dvsi; border-bottom-left-radius: -139px; font-family: inherit; background-position: left bottom; -moz-border-left-colors: rgba(33, 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999, 58, 3983166662.49) mediumslateblue; counter-reset: c 128 f 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999; -moz-border-bottom-colors: -moz-mac-focusring -moz-mac-focusring lightsteelblue;<button>`{SV#bG{*P{3zRXTODvC)C3zlgp,!S81J.YH|,x]U=%P%8)U#]04H5o/Bno;gZDo]H1LMK I?~O,^Hqw@6k%J9FQ|{jkXv QgeAGtzM1# :Ue1-VAa+N0sNP`yINYAIy:d!?I{_FsB7sAx Jfr,4w~cV#:I3H0,z0b$5C.U*z^oRomF</button><head>
   ></title>
-    <link href=/tests/SimpleTest/test.css<b></b><frame>MS|;yTvb=DyYx=lZ5?NTu=.N@mwsqT!v:=zew_XR7O8YY1o%1=$Oqh=2%a|{M?e/q6]/0VH?s,l4wf!00M7BMNP+j*T?E:POnu? yKL8[Y_nlz+u%QSJB9<csaction>><bdi>w!7RF+P3o}#/~=5hL{2dypxHnV4|@}.jSm@IQ-Ia*i[^/cip/.PKGEX|`bu6+/2RG6}m_*iFTeK~5iI/Zvl.*~32e(_$L#f|1UEh~[Oc_Ej;5Ff:#-?/*W=SLD,kda-7.UmY 4jAoO:T)<footer background-size: calc(-191px 1%) calc(5575271854802146964px 0%); font: 56mm tahoma, arial, helvetica, sans-serif; border-bottom: 31711px solid ButtonShadow; volume: loud; -moz-outline-radius: 158px; font-style: oblique; font: 916265548 serif; transform: rotatex(171deg) rotatey(1174410630deg); margin-bottom: 65535in; background-image: -moz-linear-gradient(top, darkviolet, peru); -moz-window-shadow: none; "></footer></csaction><sup dir=rtl>nH,X4]U~3`GnLEY40Qs-#$K]HiX/TekdWA; Q.IGJJwTi%sB^TF^_MFf%3q; wo#]Jy[t8hywiU`ev+8no:+1!Vo?A1tbO{A$iee~-@3Xmt?jzISs1u]B!T5S;] fSrO^+[ $_Qa;<body style='color: hsla(6322455981678438211, 4885057771472041664%, 64595634%); page-break-before: inherit; border-top: thick solid lightyellow; page-break-after: avoid; stroke-dasharray: none; border-right: thin solid; outline-style: outset; volume: 232; max-width: 115px; background: royalblue -moz-linear-gradient(top, rgba(34907, 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999, 4705143634018575181, 134.650893313) 196%, rgba(98, 0, 21, 93) 5835518181644000612%); border-bottom-style: double; background-color: -moz-mac-secondaryhighlight; border-bottom-style: solid; content: "Before"; azimuth: center; '>
-</ul> style='text-align-last: left; -webkit-appearance: textfield; color: rgb(-905311699%, 114, 57742); padding: 21.8234098837em 9.99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999em 9.51366390673em 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999em; border-color: rgba(202, 9223372036854775808, -127, 4.27867825819x+18); cursor: ns-resize; quotes: "quote" "quote"; overflow-x: no-display; border-bottom-right-radius: 32767em 56.2654742136em; box-shadow: 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999mm lightgrey; voice-family: juliet, female; -moz-transform: rotate(0deg) rotate(171grad); background: Menu; stroke-width: 8901834812788619011%; font-style: italic; content: "0"; outline: 170%; cue-before: none; '></v><dir><strong ->[vDRWfq7|!j5~J^5eQL.?J5VYFl{Vgied3%-fH^bH6?O 4mTi#]%o1xFl.O5hoZ3B;ZRx;1$T2,mgbh5dOeQ*m01547dC1/0V#Y.~WW$ragJ0n!EvBkg8Uegi+]ou1j/^QO*femQC2O!P!j,M5Vk@.-`g`$$+f+^ VP~G{1U</mi><noscript></noscript><rdf>Z[kyp(Mt0@4F~xj@v b=,K#nikG!cNac%qU(O/iUs62cwzV#,6jC[!1y5,PBNr@,Gh~Yn43l1B}p1KEh$m|bn}saNpLjZaspCwM4}XA?CWl)%V]lmIORhh y}o(CHz*vog3iSJ#On-w65NZ=}?5lh/x;xgps-#FD6l,MuASFyd$r.}x6;:v0iM4-S`El`hX%x</rdf><sub></sub><textarea>Fi~{@7J{EVzWdri*Uy+C2nP=gmz.Y;Wvp*:F]]VIVMqdJM=oU,.`Veo:L_x~1u`*f2(!*SGS*!Tsm+VYIeWA^CD10rrxyeMbNhM:SL-}Zf*A4Lf= 81Ka{/gieIN3Ru?#*Sl@~tYe]D.~pEm=s.=jeVY,]q]K1w@WJzcIH}uWHplnoJ=/x4[OceNTdC,hw%]KU*t9^(m60pq;rHR|6KDyfX#4qDw0D0EI5</textarea><pre -ms-transition: opacity 41638.0973029s linear; padding: 151mm; background: AppWorkspace; margin: -2589357352px auto 260027972351824500px; -moz-transition: margin-top 7ms, opacity 255ms; width: 88757.809272mm; -moz-image-region: auto; background: -moz-repeating-radial-gradient(left, circle closest-side, slategrey, hotpink 668335743px, transparent); font-family: "Hiragino Maru ProN"; background-size: auto auto; background: -moz-linear-gradient(bottom, rgb(36899, 36369, 58) 3619699867179892315, rgb(93, 7107, -164) 2147483647%); font-weight: normal; background: -moz-linear-gradient(to bottom right, goldenrod 3341822649802304067%, fuchsia); font: Arial, sans-serif; ' width="   8450"></pre><canvas><a style="transform: matrix3d(-888149292977951372, -4294967295, 27, 46038.5436074, 41, 0, 3120975808, -8411753657436384653, -3691848127, 65535, 105, 108, -8074044328726059853, 186, 3139816390, 6364158256925537388); left: calc(22px); font: bold italic large Palatino, serif; text-indent: calc(9223372036854775808em 30%); margin: auto; padding-bottom: 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999; background: -moz-linear-gradient(rgba(50924, 1251548303, 1109767611702038730, 42159.1644524), rgba(55, 2591341078, 10, 143) 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999%, rgba(43, 246, 149, 1.28599451055x+18) 58741%, rgba(-69, 8229554636392401175, 33463, 67.9323179507)); border-top: -67.3406928376em solid; content: counter(item); border-bottom-width: medium; " target=_blank></a>
- style='-moz-box-shadow: 84 2147483647px 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999px rgba(-2858581034, 110, 2460321770, 164.188187767), inset 18 255px -2461791714 rgba(65, 2147483647, 118, 120365.670275); border-color: khaki rgb(9223372036854775808, 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999, 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999) cornsilk rgb(2147483647, 3410481331, -255); background: -moz-linear-gradient(top, hsl(-6511, 132%, 67%), hsl(65535, 127%, 130%)); border-inline-end-width: 5361121852315046626; content: "»"; box-shadow: inset -148 6598830410571865803 -255px hsla(65535, -61299%, 6601653806716150645%, 144.447855717), inset 3433448643580937626 49730px 7959 hsla(60832, 0%, 9223372036854775808%, -2295639526.68); transform: translate3d(9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999px, 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999px, 3517992122926112751px) scale3d(2207911578123682453, 160, 124); -moz-transform-origin: 3291520372 779122680 2147483647; -moz-appearance: menuseparator; border-radius: 2549593779.31px 2.00538639825x+18px 65px 28px; transform: translate(127px, 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999px) translate(9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999px, -176px); margin-left: 210.617676718em; border-inline-start: dotted lightgreen 37018px; word-spacing: 2174513215933018269ch; border-left: solid; columns: 64383 auto -3982463664em; -moz-transform: scale(9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999); stroke-width: 3.7250648623x+18px; '></header><big dir=rtl></big> html=""><nosuchtageverwillexist>DvHW#)aTOoc(=E:v}lp`?)_zpj%f#fy$q~~w1,;%.rsdVNR9=AW8h#y**wpXSlY}R/L|vnxW7?EC`lK,4GcMz[9}{V#d+@d (`JUMD2gD:N1ci7Q#i_hR-p.,dM|s/D-bzFn@8g[.qr;+Kh!]tI3B?2xM;E,oW`GHsjqV>b(vf_HY9If%6.t7z2@ql6|L@SrsUoaG^AX{46e5^;p;8Pphf5f3_],qD)X!kizvdkcp8YtJZe!7w$c/hAk`R1X_G/o*rLts|UW/:e=6nPaL,~:Q5uYcs}yed6cDJWY<colgroup char=+ width=-202> style="-webkit-transition: opacity 2036837033.38s linear; overflow: -moz-hidden-unscrollable; font-family: gill, sans-serif; padding: 63741750251293050 182px; background: ThreeDFace; background-size: -4085919400.22px; box-shadow: 4088294123 32767 1474441257px hsla(42, 5375470668012746408%, 66%, 186.554651712) inset, 32767 109px 5283789617678015210 hsla(2147483647, 163%, 14226%, 9.99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999); border-width: 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999px -170px 3284222322px 5.14851574865x+17px; box-shadow: inset 113 -0 -4px hsla(9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999, 35273%, 2245175778%, 47085.004822), inset 9223372036854775808 76px 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 hsla(2375057167019052381, 4294967295%, 127%, 5.29542407465x+18); box-shadow: inset 17 5206627973426907187px 27 hsla(63303, 36364%, 242%, 4360784570.91), inset 18428 0px 138 hsla(-357953447, 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999%, 8058132474996186951%, 100.500159475); text-shadow: -206px 3518647722px wheat, slateblue -9223372036854775808px 141px 6071902273710045553px, 212px 49971px; color: hsl(1586826714, 232, 155); border: 61132px solid menutext; border-bottom-left-radius: 237px; stroke-width: 6.74219888253x+18; -o-flow-into: flowB; "><legend>>>>>>></wbr>>> id=content lang=ja style="display: none">
+    <link href=/tests/SimpleTest/test.css<b></b><frame>MS|;yTvb=DyYx=lZ5?NTu=.N@mwsqT!v:=zew_XR7O8YY1o%1=$Oqh=2%a|{M?e/q6]/0VH?s,l4wf!00M7BMNP+j*T?E:POnu? yKL8[Y_nlz+u%QSJB9<csaction>><bdi>w!7RF+P3o}#/~=5hL{2dypxHnV4|@}.jSm@IQ-Ia*i[^/cip/.PKGEX|`bu6+/2RG6}m_*iFTeK~5iI/Zvl.*~32e(_$L#f|1UEh~[Oc_Ej;5Ff:#-?/*W=SLD,kda-7.UmY 4jAoO:T)<footer background-size: calc(-191px 1%) calc(5575271854802146964px 0%); font: 56mm tahoma, arial, helvetica, sans-serif; border-bottom: 31711px solid ButtonShadow; volume: loud; -moz-outline-radius: 158px; font-style: oblique; font: 916265548 serif; transform: rotatex(171deg) rotatey(1174410630deg); margin-bottom: 65535in; background-image: linear-gradient(darkviolet, peru); -moz-window-shadow: none; "></footer></csaction><sup dir=rtl>nH,X4]U~3`GnLEY40Qs-#$K]HiX/TekdWA; Q.IGJJwTi%sB^TF^_MFf%3q; wo#]Jy[t8hywiU`ev+8no:+1!Vo?A1tbO{A$iee~-@3Xmt?jzISs1u]B!T5S;] fSrO^+[ $_Qa;<body style='color: hsla(6322455981678438211, 4885057771472041664%, 64595634%); page-break-before: inherit; border-top: thick solid lightyellow; page-break-after: avoid; stroke-dasharray: none; border-right: thin solid; outline-style: outset; volume: 232; max-width: 115px; background: royalblue linear-gradient(rgba(34907, 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999, 4705143634018575181, 134.650893313) 196%, rgba(98, 0, 21, 93) 5835518181644000612%); border-bottom-style: double; background-color: -moz-mac-secondaryhighlight; border-bottom-style: solid; content: "Before"; azimuth: center; '>
+</ul> style='text-align-last: left; -webkit-appearance: textfield; color: rgb(-905311699%, 114, 57742); padding: 21.8234098837em 9.99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999em 9.51366390673em 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999em; border-color: rgba(202, 9223372036854775808, -127, 4.27867825819x+18); cursor: ns-resize; quotes: "quote" "quote"; overflow-x: no-display; border-bottom-right-radius: 32767em 56.2654742136em; box-shadow: 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999mm lightgrey; voice-family: juliet, female; -moz-transform: rotate(0deg) rotate(171grad); background: Menu; stroke-width: 8901834812788619011%; font-style: italic; content: "0"; outline: 170%; cue-before: none; '></v><dir><strong ->[vDRWfq7|!j5~J^5eQL.?J5VYFl{Vgied3%-fH^bH6?O 4mTi#]%o1xFl.O5hoZ3B;ZRx;1$T2,mgbh5dOeQ*m01547dC1/0V#Y.~WW$ragJ0n!EvBkg8Uegi+]ou1j/^QO*femQC2O!P!j,M5Vk@.-`g`$$+f+^ VP~G{1U</mi><noscript></noscript><rdf>Z[kyp(Mt0@4F~xj@v b=,K#nikG!cNac%qU(O/iUs62cwzV#,6jC[!1y5,PBNr@,Gh~Yn43l1B}p1KEh$m|bn}saNpLjZaspCwM4}XA?CWl)%V]lmIORhh y}o(CHz*vog3iSJ#On-w65NZ=}?5lh/x;xgps-#FD6l,MuASFyd$r.}x6;:v0iM4-S`El`hX%x</rdf><sub></sub><textarea>Fi~{@7J{EVzWdri*Uy+C2nP=gmz.Y;Wvp*:F]]VIVMqdJM=oU,.`Veo:L_x~1u`*f2(!*SGS*!Tsm+VYIeWA^CD10rrxyeMbNhM:SL-}Zf*A4Lf= 81Ka{/gieIN3Ru?#*Sl@~tYe]D.~pEm=s.=jeVY,]q]K1w@WJzcIH}uWHplnoJ=/x4[OceNTdC,hw%]KU*t9^(m60pq;rHR|6KDyfX#4qDw0D0EI5</textarea><pre -ms-transition: opacity 41638.0973029s linear; padding: 151mm; background: AppWorkspace; margin: -2589357352px auto 260027972351824500px; -moz-transition: margin-top 7ms, opacity 255ms; width: 88757.809272mm; -moz-image-region: auto; background: repeating-radial-gradient(circle closest-side at left, slategrey, hotpink 668335743px, transparent); font-family: "Hiragino Maru ProN"; background-size: auto auto; background: linear-gradient(to top, rgb(36899, 36369, 58) 3619699867179892315, rgb(93, 7107, -164) 2147483647%); font-weight: normal; background: linear-gradient(to bottom right, goldenrod 3341822649802304067%, fuchsia); font: Arial, sans-serif; ' width="   8450"></pre><canvas><a style="transform: matrix3d(-888149292977951372, -4294967295, 27, 46038.5436074, 41, 0, 3120975808, -8411753657436384653, -3691848127, 65535, 105, 108, -8074044328726059853, 186, 3139816390, 6364158256925537388); left: calc(22px); font: bold italic large Palatino, serif; text-indent: calc(9223372036854775808em 30%); margin: auto; padding-bottom: 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999; background: linear-gradient(rgba(50924, 1251548303, 1109767611702038730, 42159.1644524), rgba(55, 2591341078, 10, 143) 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999%, rgba(43, 246, 149, 1.28599451055x+18) 58741%, rgba(-69, 8229554636392401175, 33463, 67.9323179507)); border-top: -67.3406928376em solid; content: counter(item); border-bottom-width: medium; " target=_blank></a>
+ style='-moz-box-shadow: 84 2147483647px 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999px rgba(-2858581034, 110, 2460321770, 164.188187767), inset 18 255px -2461791714 rgba(65, 2147483647, 118, 120365.670275); border-color: khaki rgb(9223372036854775808, 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999, 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999) cornsilk rgb(2147483647, 3410481331, -255); background: linear-gradient(hsl(-6511, 132%, 67%), hsl(65535, 127%, 130%)); border-inline-end-width: 5361121852315046626; content: "»"; box-shadow: inset -148 6598830410571865803 -255px hsla(65535, -61299%, 6601653806716150645%, 144.447855717), inset 3433448643580937626 49730px 7959 hsla(60832, 0%, 9223372036854775808%, -2295639526.68); transform: translate3d(9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999px, 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999px, 3517992122926112751px) scale3d(2207911578123682453, 160, 124); -moz-transform-origin: 3291520372 779122680 2147483647; -moz-appearance: menuseparator; border-radius: 2549593779.31px 2.00538639825x+18px 65px 28px; transform: translate(127px, 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999px) translate(9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999px, -176px); margin-left: 210.617676718em; border-inline-start: dotted lightgreen 37018px; word-spacing: 2174513215933018269ch; border-left: solid; columns: 64383 auto -3982463664em; -moz-transform: scale(9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999); stroke-width: 3.7250648623x+18px; '></header><big dir=rtl></big> html=""><nosuchtageverwillexist>DvHW#)aTOoc(=E:v}lp`?)_zpj%f#fy$q~~w1,;%.rsdVNR9=AW8h#y**wpXSlY}R/L|vnxW7?EC`lK,4GcMz[9}{V#d+@d (`JUMD2gD:N1ci7Q#i_hR-p.,dM|s/D-bzFn@8g[.qr;+Kh!]tI3B?2xM;E,oW`GHsjqV>b(vf_HY9If%6.t7z2@ql6|L@SrsUoaG^AX{46e5^;p;8Pphf5f3_],qD)X!kizvdkcp8YtJZe!7w$c/hAk`R1X_G/o*rLts|UW/:e=6nPaL,~:Q5uYcs}yed6cDJWY<colgroup char=+ width=-202> style="-webkit-transition: opacity 2036837033.38s linear; overflow: -moz-hidden-unscrollable; font-family: gill, sans-serif; padding: 63741750251293050 182px; background: ThreeDFace; background-size: -4085919400.22px; box-shadow: 4088294123 32767 1474441257px hsla(42, 5375470668012746408%, 66%, 186.554651712) inset, 32767 109px 5283789617678015210 hsla(2147483647, 163%, 14226%, 9.99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999); border-width: 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999px -170px 3284222322px 5.14851574865x+17px; box-shadow: inset 113 -0 -4px hsla(9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999, 35273%, 2245175778%, 47085.004822), inset 9223372036854775808 76px 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 hsla(2375057167019052381, 4294967295%, 127%, 5.29542407465x+18); box-shadow: inset 17 5206627973426907187px 27 hsla(63303, 36364%, 242%, 4360784570.91), inset 18428 0px 138 hsla(-357953447, 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999%, 8058132474996186951%, 100.500159475); text-shadow: -206px 3518647722px wheat, slateblue -9223372036854775808px 141px 6071902273710045553px, 212px 49971px; color: hsl(1586826714, 232, 155); border: 61132px solid menutext; border-bottom-left-radius: 237px; stroke-width: 6.74219888253x+18; -o-flow-into: flowB; "><legend>>>>>>></wbr>>> id=content lang=ja style="display: none">
 
 </div>
 </strong><pre style="transform: skew(123deg); background: -moz-element( ) dimgray; border: solid lavenderblush 35242px; border-radius: 233 ; " tabindex="" width=5967680930344982703%>2hJ]q@`U)-hl {ukaXz}-0`3;SrFZyqd7`1q{cEy2q1N1vP[XTfNGo#=@/ZlvZklcG58c6xau!G}6Lxc#W@RBhKV4];9G`RX 2x.~.u9S^ wThGK vo8#Z<script class=testbody type=text/javascript>
 
 </script>
 </pre>
 
 
--- a/layout/reftests/backgrounds/gradient/reftest.list
+++ b/layout/reftests/backgrounds/gradient/reftest.list
@@ -1,3 +1,3 @@
-fails-if(stylo) == scaled-color-stop-position.html scaled-color-stop-position-ref.html
+== scaled-color-stop-position.html scaled-color-stop-position-ref.html
 == color-stop-clamp-interpolation.html color-stop-clamp-interpolation-ref.html
 == linear-gradient-repeated.html linear-gradient-repeated-ref.html
--- a/layout/reftests/backgrounds/gradient/scaled-color-stop-position-ref.html
+++ b/layout/reftests/backgrounds/gradient/scaled-color-stop-position-ref.html
@@ -11,17 +11,16 @@
 {
   border: 1px solid black;
   width: 600px; height: 300px;
 }
 #inner
 {
   width: 400px; height: 300px;
   /* 250px stop is halfway along 500px diagonal */
-  background-image: -moz-linear-gradient(top left, lime 0%, teal 250px, black 100%);
-  background-image: linear-gradient(top left, lime 0%, teal 250px, black 100%);
+  background-image: linear-gradient(to bottom right, lime 0%, teal 250px, black 100%);
 }
   </style>
 </head>
 <body>
 <div id="outer"><div id="inner"></div></div>
 </body>
 </html>
--- a/layout/reftests/backgrounds/gradient/scaled-color-stop-position.html
+++ b/layout/reftests/backgrounds/gradient/scaled-color-stop-position.html
@@ -7,18 +7,17 @@
 <head>
   <title>Color stop positioning for scaled gradients as backgrounds</title>
   <style type="text/css">
 #outer
 {
   border: 1px solid black;
   width: 600px; height: 300px;
   /* 250px stop is halfway along 500px diagonal */
-  background-image: -moz-linear-gradient(top left, lime 0%, teal 250px, black 100%);
-  background-image: linear-gradient(top left, lime 0%, teal 250px, black 100%);
+  background-image: linear-gradient(to bottom right, lime 0%, teal 250px, black 100%);
   background-size: 400px auto;
   background-repeat: no-repeat;
 }
   </style>
 </head>
 <body>
 <div id="outer"></div>
 </body>
--- a/layout/reftests/bidi/dirAuto/reftest.list
+++ b/layout/reftests/bidi/dirAuto/reftest.list
@@ -1,15 +1,15 @@
 == bdi-auto-dir-default.html bdi-auto-dir-default-ref.html
-fails-if(stylo) == dir_auto-set-contained-dir-L.html dir_auto-contained-dir-L-ref.html
-fails-if(stylo) == dir_auto-set-contained-dir-R.html dir_auto-contained-dir-R-ref.html
-fails-if(stylo) == dir_auto-set-contained-invalid-dir-L.html dir_auto-contained-dir-L-ref.html
-fails-if(stylo) == dir_auto-set-contained-invalid-dir-R.html dir_auto-contained-dir-R-ref.html
-fails-if(stylo) == dir_auto-unset-contained-dir-L.html dir_auto-unset-contained-dir-L-ref.html
-fails-if(stylo) == dir_auto-unset-contained-dir-R.html dir_auto-unset-contained-dir-R-ref.html
+== dir_auto-set-contained-dir-L.html dir_auto-contained-dir-L-ref.html
+== dir_auto-set-contained-dir-R.html dir_auto-contained-dir-R-ref.html
+== dir_auto-set-contained-invalid-dir-L.html dir_auto-contained-dir-L-ref.html
+== dir_auto-set-contained-invalid-dir-R.html dir_auto-contained-dir-R-ref.html
+== dir_auto-unset-contained-dir-L.html dir_auto-unset-contained-dir-L-ref.html
+== dir_auto-unset-contained-dir-R.html dir_auto-unset-contained-dir-R-ref.html
 == dynamicDirAuto-setLTR-Auto1.html dynamicDirAuto-refLTR-LTR.html
 == dynamicDirAuto-setLTR-Auto2.html dynamicDirAuto-refLTR-LTR.html
 == dynamicDirAuto-setLTR-Auto3.html dynamicDirAuto-refLTR-LTR.html
 == dynamicDirAuto-setLTR-Auto4.html dynamicDirAuto-refLTR-LTR.html
 == dynamicDirAuto-setLTR-Auto5.html dynamicDirAuto-refLTR-LTR.html
 == dynamicDirAuto-setLTR-Auto6.html dynamicDirAuto-refLTR-LTR.html
 == dynamicDirAuto-setLTR-LTR1.html dynamicDirAuto-refLTR-LTR.html
 == dynamicDirAuto-setLTR-LTR2.html dynamicDirAuto-refLTR-LTR.html
@@ -78,42 +78,42 @@ fails-if(stylo) == dir_auto-unset-contai
 == dynamicDirAuto-setRTL-InvalidDir3.html dynamicDirAuto-refRTL-NoDir.html
 == dynamicDirAuto-setRTL-InvalidDir4.html dynamicDirAuto-refRTL-NoDir.html
 == dynamicDirAuto-setRTL-InvalidDir5.html dynamicDirAuto-refRTL-NoDir.html
 == dynamicDirAuto-setRTL-InvalidDir6.html dynamicDirAuto-refRTL-NoDir.html
 == dynamicDirAuto-setRTL-InvalidDir7.html dynamicDirAuto-refRTL-NoDir.html
 == dynamicDirAuto-setRTL-InvalidDir8.html dynamicDirAuto-refRTL-NoDir.html
 == dynamicDirAuto-addLTR-Auto.html dynamicDirAuto-refLTR-LTR.html
 == dynamicDirAuto-addRTL-Auto.html dynamicDirAuto-refRTL-RTL.html
-fails-if(stylo) == dynamicDirAuto-ChangeText-LTR1.html dynamicDirAuto-refLTR-LTR.html
+== dynamicDirAuto-ChangeText-LTR1.html dynamicDirAuto-refLTR-LTR.html
 == dynamicDirAuto-ChangeText-LTR2.html dynamicDirAuto-refLTR-LTR.html
 == dynamicDirAuto-ChangeText-LTR3.html dynamicDirAuto-refLTR-LTR.html
 == dynamicDirAuto-ChangeText-LTR4.html dynamicDirAuto-refLTR-LTR.html
 == dynamicDirAuto-ChangeText-LTR5.html dynamicDirAuto-refLTR-LTR.html
 == dynamicDirAuto-ChangeText-LTR6.html dynamicDirAuto-refLTR-LTR.html
-fails-if(stylo) == dynamicDirAuto-ChangeText-LTR7.html dynamicDirAuto-refLTR-LTR.html
+== dynamicDirAuto-ChangeText-LTR7.html dynamicDirAuto-refLTR-LTR.html
 == dynamicDirAuto-ChangeText-LTR8.html dynamicDirAuto-refLTR-LTR.html
-fails-if(stylo) == dynamicDirAuto-ChangeText-LTR9.html dynamicDirAuto-refLTR-LTR.html
+== dynamicDirAuto-ChangeText-LTR9.html dynamicDirAuto-refLTR-LTR.html
 == dynamicDirAuto-ChangeText-LTR10.html dynamicDirAuto-refLTR-LTR.html
-fails-if(stylo) == dynamicDirAuto-ChangeText-RTL1.html dynamicDirAuto-refRTL-RTL.html
-fails-if(stylo) == dynamicDirAuto-ChangeText-RTL2.html dynamicDirAuto-refRTL-RTL.html
-fuzzy-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)&&!layersGPUAccelerated&&!azureSkia,30,1) fails-if(stylo) == dynamicDirAuto-ChangeText-RTL3.html dynamicDirAuto-refRTL-RTL.html
-fuzzy-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)&&!layersGPUAccelerated&&!azureSkia,30,1) fails-if(stylo) == dynamicDirAuto-ChangeText-RTL4.html dynamicDirAuto-refRTL-RTL.html
-fuzzy-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)&&!layersGPUAccelerated&&!azureSkia,30,1) fails-if(stylo) == dynamicDirAuto-ChangeText-RTL5.html dynamicDirAuto-refRTL-RTL.html
-fuzzy-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)&&!layersGPUAccelerated&&!azureSkia,30,1) fails-if(stylo) == dynamicDirAuto-ChangeText-RTL6.html dynamicDirAuto-refRTL-RTL.html
-fails-if(stylo) == dynamicDirAuto-ChangeText-RTL7.html dynamicDirAuto-refRTL-RTL.html
-fails-if(stylo) == dynamicDirAuto-ChangeText-RTL8.html dynamicDirAuto-refRTL-RTL.html
-fails-if(stylo) == dynamicDirAuto-ChangeText-RTL9.html dynamicDirAuto-refRTL-RTL.html
-fails-if(stylo) == dynamicDirAuto-ChangeText-RTL10.html dynamicDirAuto-refRTL-RTL.html
+== dynamicDirAuto-ChangeText-RTL1.html dynamicDirAuto-refRTL-RTL.html
+== dynamicDirAuto-ChangeText-RTL2.html dynamicDirAuto-refRTL-RTL.html
+fuzzy-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)&&!layersGPUAccelerated&&!azureSkia,30,1) == dynamicDirAuto-ChangeText-RTL3.html dynamicDirAuto-refRTL-RTL.html
+fuzzy-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)&&!layersGPUAccelerated&&!azureSkia,30,1) == dynamicDirAuto-ChangeText-RTL4.html dynamicDirAuto-refRTL-RTL.html
+fuzzy-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)&&!layersGPUAccelerated&&!azureSkia,30,1) == dynamicDirAuto-ChangeText-RTL5.html dynamicDirAuto-refRTL-RTL.html
+fuzzy-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)&&!layersGPUAccelerated&&!azureSkia,30,1) == dynamicDirAuto-ChangeText-RTL6.html dynamicDirAuto-refRTL-RTL.html
+== dynamicDirAuto-ChangeText-RTL7.html dynamicDirAuto-refRTL-RTL.html
+== dynamicDirAuto-ChangeText-RTL8.html dynamicDirAuto-refRTL-RTL.html
+== dynamicDirAuto-ChangeText-RTL9.html dynamicDirAuto-refRTL-RTL.html
+== dynamicDirAuto-ChangeText-RTL10.html dynamicDirAuto-refRTL-RTL.html
 == dynamicDirAuto-DeleteText-LTR1.html dynamicDirAuto-refLTR-LTR.html
-fails-if(stylo) == dynamicDirAuto-DeleteText-LTR2.html dynamicDirAuto-refLTR-LTR.html
+== dynamicDirAuto-DeleteText-LTR2.html dynamicDirAuto-refLTR-LTR.html
 == dynamicDirAuto-DeleteText-LTR3.html dynamicDirAuto-refLTR-LTR.html
-fails-if(stylo) == dynamicDirAuto-DeleteText-RTL1.html dynamicDirAuto-refRTL-RTL.html
+== dynamicDirAuto-DeleteText-RTL1.html dynamicDirAuto-refRTL-RTL.html
 == dynamicDirAuto-DeleteText-RTL2.html dynamicDirAuto-refRTL-RTL.html
 == dynamicDirAuto-DeleteText-RTL3.html dynamicDirAuto-refRTL-RTL.html
 == 839886-1.html 839886-1-ref.html
 == 859093-1.html 859093-1-ref.html
 == 889742-1.html 889742-1-ref.html
-fails-if(stylo) == 1103348-1.html 1103348-1-ref.html
-fails-if(stylo) == 1169267-delete-add-1a.html 1169267-delete-add-1-ref.html
-fails-if(stylo) == 1169267-delete-add-1b.html 1169267-delete-add-1-ref.html
-fails-if(stylo) == 1169267-delete-add-2a.html 1169267-delete-add-2-ref.html
-fails-if(stylo) == 1169267-delete-add-2b.html 1169267-delete-add-2-ref.html
+== 1103348-1.html 1103348-1-ref.html
+== 1169267-delete-add-1a.html 1169267-delete-add-1-ref.html
+== 1169267-delete-add-1b.html 1169267-delete-add-1-ref.html
+== 1169267-delete-add-2a.html 1169267-delete-add-2-ref.html
+== 1169267-delete-add-2b.html 1169267-delete-add-2-ref.html
--- a/layout/reftests/bidi/reftest.list
+++ b/layout/reftests/bidi/reftest.list
@@ -94,21 +94,21 @@ fails-if(stylo) == 413928-2.html 413928-
 == 489887-1.html 489887-1-ref.html
 == 492231-1.html 492231-1-ref.html
 == 496006-1.html 496006-1-ref.html
 == 503269-1.html 503269-1-ref.html
 == 503957-1.html 503957-1-ref.html
 == 525740-1.html 525740-1-ref.html
 == 536963-1.html 536963-1-ref.html
 == 562169-1.html 562169-1-ref.html
-fails-if(stylo) == 562169-1a.html 562169-1-ref.html
+== 562169-1a.html 562169-1-ref.html
 == 562169-2.html 562169-2-ref.html
-fails-if(stylo) == 562169-2a.html 562169-2-ref.html
+== 562169-2a.html 562169-2-ref.html
 == 562169-3.html 562169-3-ref.html
-fails-if(stylo) == 562169-3a.html 562169-3-ref.html
+== 562169-3a.html 562169-3-ref.html
 == 562169-4.html 562169-4-ref.html
 == 588739-1.html 588739-ref.html
 == 588739-2.html 588739-ref.html
 == 588739-3.html 588739-ref.html
 == 612843-1.html 612843-1-ref.html
 == 613149-1a.html 613149-1-ref.html
 == 613149-1b.html 613149-1-ref.html
 fuzzy-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)&&!layersGPUAccelerated&&!azureSkia,36,2) == 613149-2a.html 613149-2-ref.html
new file mode 100644
--- /dev/null
+++ b/layout/reftests/bugs/1364280-1-ref.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<style>
+  div { color: green; }
+</style>
+<body dir="ltr">
+  <div>
+    This should be green.
+  </div>
+</body>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/bugs/1364280-1.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<style>
+  div { color: red; }
+  div:dir(ltr) { color: green }
+</style>
+<body dir="rtl"
+      onload="window.oldColor = getComputedStyle(document.querySelector('div')).color;
+              document.body.dir = 'ltr'">
+  <div>
+    This should be green.
+  </div>
+</body>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/bugs/1364280-2-ref.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<style>
+  span { color: green }
+</style>
+<body dir="rtl">
+  <div dir=""></div>
+  <span>This should be green</span>
+</body>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/bugs/1364280-2a.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<style>
+  span { color: red; }
+  div:dir(rtl) + span { color: green; }
+</style>
+<body dir="rtl" onload="window.oldColor = getComputedStyle(document.querySelector('span')).color; document.querySelector('[dir=auto]').setAttribute('dir', '')">
+  <div dir="auto"></div>
+  <span>This should be green</span>
+</body>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/bugs/1364280-2b.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<style>
+  span { color: green; }
+  div:not(:dir(rtl)) + span { color: red; }
+</style>
+<body dir="rtl" onload="window.oldColor = getComputedStyle(document.querySelector('span')).color; document.querySelector('[dir=auto]').setAttribute('dir', '')">
+  <div dir="auto"></div>
+  <span>This should be green</span>
+</body>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/bugs/1364280-2c.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<style>
+  span { color: green; }
+  div[dir="auto"]:dir(ltr) + span { color: red; }
+</style>
+<body dir="rtl" onload="window.oldColor = getComputedStyle(document.querySelector('span')).color; document.querySelector('[dir=auto]').setAttribute('dir', '')">
+  <div dir="auto"></div>
+  <span>This should be green</span>
+</body>
--- a/layout/reftests/bugs/538909-1-ref.html
+++ b/layout/reftests/bugs/538909-1-ref.html
@@ -2,17 +2,16 @@
 <html>
 <head>
 <style>
 div {
   width: 260px;
   height: 260px;
   background-size: 100px 100px;
   background-position: -20px -20px;
-  background-image: -moz-linear-gradient(left top, yellow, blue);
-  background-image: linear-gradient(left top, yellow, blue);
+  background-image: linear-gradient(to bottom right, yellow, blue);
 }
 </style>
 </head>
 <body>
 <div></div>
 </body>
 </html>
--- a/layout/reftests/bugs/538909-1.html
+++ b/layout/reftests/bugs/538909-1.html
@@ -1,17 +1,16 @@
 <!DOCTYPE HTML>
 <html>
 <head>
 <style>
 div {
   border: 80px solid transparent;
   width: 100px;
   height: 100px;
-  background-image: -moz-linear-gradient(left top, yellow, blue);
-  background-image: linear-gradient(left top, yellow, blue);
+  background-image: linear-gradient(to bottom right, yellow, blue);
 }
 </style>
 </head>
 <body>
 <div></div>
 </body>
 </html>
--- a/layout/reftests/bugs/605138-1-ref.html
+++ b/layout/reftests/bugs/605138-1-ref.html
@@ -3,15 +3,15 @@
   <link href="data:text/css,%23master{display:table; width: 100%;}"
         rel="stylesheet" type="text/css" media="screen">
   <style>
     #master { outline: 1px dashed black; }
   </style>
 </head>
 <body>
 <div id="master">
-<div style="height:10000px; background: -moz-linear-gradient(right bottom, rgb(0,0,0) 0%, rgb(255,255,255) 100%);">
+<div style="height:10000px; background: linear-gradient(to left top, rgb(0,0,0) 0%, rgb(255,255,255) 100%);">
 </div>
 
 <div style="height:100px"></div>
 
 </div>
 </html>
--- a/layout/reftests/bugs/605138-1.html
+++ b/layout/reftests/bugs/605138-1.html
@@ -1,15 +1,15 @@
 <html>
 <head>
   <link href="data:text/css,%23master{display:table; width: 100%; outline: 1px dashed black; }"
         rel="stylesheet" type="text/css" media="screen">
 </head>
 <body>
 <div id="master">
-<div style="height:10000px; background: -moz-linear-gradient(right bottom, rgb(0,0,0) 0%, rgb(255,255,255) 100%);">
+<div style="height:10000px; background: linear-gradient(to left top, rgb(0,0,0) 0%, rgb(255,255,255) 100%);">
 </div>
 
 <textarea style="height:100px; margin:0; border:0;"></textarea>
 <script> </script>
 
 </div>
 </html>
--- a/layout/reftests/bugs/reftest.list
+++ b/layout/reftests/bugs/reftest.list
@@ -1461,35 +1461,35 @@ fuzzy-if(Android,2,48) == 531200-1.html 
 == 534804-1.html 534804-1-ref.html
 == 534808-1.html 534808-1-ref.html
 == 534808-2.html 534808-2-ref.html
 == 534919-1.html 534919-1-ref.html
 random == 536061.html 536061-ref.html # fixedpoint division in blur code makes this fail
 == 537471-1.html 537471-1-ref.html
 == 537507-1.xul 537507-1-ref.xul
 == 537507-2.html 537507-2-ref.html
-fails-if(stylo) == 538909-1.html 538909-1-ref.html
+== 538909-1.html 538909-1-ref.html
 == 538935-1.html 538935-1-ref.html
 == 539226-1.html about:blank
 == 539323-1.html 539323-1-ref.html
 == 539323-2.html 539323-2-ref.html
 == 539323-3.html 539323-3-ref.html
 == 539880-1.html 539880-1-ref.html
 == 539880-1-dynamic.html 539880-1-ref.html
 fuzzy-if(Android,12,1000) skip-if(stylo) == 539949-1.html#test2 539949-1-ref.html#test2
 == 541382-1.html 541382-1-ref.html
-random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)||!haveTestPlugin) == 541406-1.html 541406-1-ref.html
+random-if(/^Windows\x20NT\x206\.1/.test(http.oscpu)||!haveTestPlugin) HTTP == 541406-1.html 541406-1-ref.html
 needs-focus != 542116-1.html 542116-1-ref.html
 needs-focus != 542116-2.html 542116-2-ref.html
 needs-focus != 542116-3.html 542116-3-ref.html
 == 542317-1.html 542317-1-ref.html
 == 542620-1.html 542620-1-ref.html
 == 545049-1.html 545049-1-ref.html
 == 546033-1.html 546033-1-ref.html
-random-if(!haveTestPlugin) == 546071-1.html 546071-1-ref.html
+random-if(!haveTestPlugin) HTTP == 546071-1.html 546071-1-ref.html
 == 549184-1.html 549184-1-ref.html
 == 550325-1.html 550325-1-ref.html
 == 550325-2.html 550325-1-ref.html
 == 550325-3.html 550325-1-ref.html
 == 550716-1.html 550716-1-ref.html
 fuzzy-if(Android,12,300) == 551463-1.html 551463-1-ref.html
 == 551699-1.html 551699-1-ref.html
 == 552334-1.html 552334-1-ref.html
@@ -1566,17 +1566,17 @@ random-if(!winWidget) random-if(/^Window
 random-if(!winWidget) random-if(/^Windows\x20NT\x2010\.0/.test(http.oscpu)) == 574907-2.html 574907-2-ref.html # Bug 1258240
 # 574907-3 only worked under directwrite, and even there it now depends on the rendering mode; marking as random for now
 random-if(!winWidget) fails-if(winWidget&&!dwrite) random-if(winWidget&&dwrite) != 574907-3.html 574907-3-notref.html
 == 577838-1.html 577838-1-ref.html
 == 577838-2.html 577838-2-ref.html
 == 579323-1.html 579323-1-ref.html
 == 579349-1.html 579349-1-ref.html
 == 579655-1.html 579655-1-ref.html
-skip-if(!haveTestPlugin) fails-if(Android) == 579808-1.html 579808-1-ref.html
+skip-if(!haveTestPlugin) fails-if(Android) HTTP == 579808-1.html 579808-1-ref.html
 fails-if(Android) random-if(layersGPUAccelerated) fuzzy-if(skiaContent,1,10000) == 579985-1.html 579985-1-ref.html # this bug was only for a regression in BasicLayers anyway
 skip-if(Android) == 580160-1.html 580160-1-ref.html # bug 920927 for Android; issues without the test-plugin
 fuzzy-if(asyncPan&&!layersGPUAccelerated,255,141) HTTP(..) == 580863-1.html 580863-1-ref.html
 fails-if(Android) random-if(layersGPUAccelerated) fuzzy-if(skiaContent,1,6436) == 581317-1.html 581317-1-ref.html
 == 581579-1.html 581579-1-ref.html
 == 582037-1a.html 582037-1-ref.html
 == 582037-1b.html 582037-1-ref.html
 fuzzy-if(Android,3,256) == 582037-2a.html 582037-2-ref.html
@@ -1596,32 +1596,32 @@ pref(dom.meta-viewport.enabled,true) ski
 pref(dom.meta-viewport.enabled,true) skip-if(Android) == 593243-2.html 593243-2-ref.html # bug 593168
 == 593544-1.html 593544-1-ref.html
 random-if(Android) == 594333-1.html 594333-1-ref.html
 == 594624-1.html 594624-1-ref.html
 == 594737-1.html 594737-1-ref.html
 fuzzy-if(skiaContent,1,80) == 597721-1.html 597721-1-ref.html
 random-if(winWidget) fuzzy-if(Android,38,539) fuzzy-if(skiaContent,1,480) needs-focus skip-if(stylo) == 598726-1.html 598726-1-ref.html # Fails on Windows, bug 782196
 == 599113-1.html 599113-1-ref.html
-fails-if(!haveTestPlugin) == 599476.html 599476-ref.html
+fails-if(!haveTestPlugin) HTTP == 599476.html 599476-ref.html
 == 599882-1a.html 599882-1-ref.html
 == 599882-1b.html 599882-1-ref.html
 == 599882-2.html 599882-2-ref.html
 == 600045-1.html 600045-1-ref.html
 fails-if(stylo) == 600803-1.html 600803-1-ref.html
 == 600974-1.html 600974-1-ref.html
 == 600974-2.html 600974-1-ref.html
 == 600974-3.html 600974-1-ref.html
 == 602200-1.html 602200-1-ref.html
 == 602200-2.html 602200-2-ref.html
 fuzzy-if(Android,8,20) == 602200-3.html 602200-3-ref.html
 == 602200-4.html 602200-4-ref.html
 == 603423-1.html 603423-1-ref.html
 == 604737.html 604737-ref.html
-fails-if(stylo) == 605138-1.html 605138-1-ref.html
+== 605138-1.html 605138-1-ref.html
 == 605157-1.xhtml 605157-1-ref.xhtml
 == 607267-1.html 607267-1-ref.html
 == 608636-1.html 608636-1-ref.html
 == 608756-1a.html 608756-1-ref.html
 == 608756-1b.html 608756-1-ref.html
 == 608756-2.html 608756-2-ref.html
 fuzzy-if(Android,4,196) == 609272-1.html 609272-1-ref.html
 needs-focus == 613433-1.html 613433-1-ref.html
@@ -1646,17 +1646,17 @@ HTTP(..) == 621253-2-externalFilter.html
 == 621253-2-internalFilter.html 621253-2-ref.html
 random-if(winWidget) == 621918-1.svg 621918-1-ref.svg # 1-pixel diacritic positioning discrepancy in rotated text (may depend on platform fonts)
 random-if(winWidget) HTTP(..) == 621918-2.svg 621918-2-ref.svg # same 1px issue as above, and HTTP(..) for filters.svg, used to mask antialiasing issues where glyphs touch
 fuzzy-if(d2d,5,1) == 622585-1.html 622585-1-ref.html # bug 789402
 fuzzy-if(Android,8,300) fuzzy-if(skiaContent,1,40000) == 625409-1.html 625409-1-ref.html
 == 627393-1.html about:blank
 fuzzy-if(skiaContent,1,500) == 630835-1.html about:blank
 fails-if(stylo) == 631352-1.html 631352-1-ref.html
-skip-if(!haveTestPlugin) fails-if(Android) fuzzy-if(winWidget&&!layersGPUAccelerated,102,535) fuzzy-if(skiaContent&&!Android,102,11000) == 632423-1.html 632423-1-ref.html
+skip-if(!haveTestPlugin) fails-if(Android) fuzzy-if(winWidget&&!layersGPUAccelerated,102,535) fuzzy-if(skiaContent&&!Android,102,11000) HTTP == 632423-1.html 632423-1-ref.html
 skip-if(Android) random-if(winWidget||OSX==1010) == 632781-verybig.html 632781-ref.html
 == 632781-normalsize.html 632781-ref.html
 fuzzy-if(d2d&&/^Windows\x20NT\x206\.2/.test(http.oscpu),1,559) fuzzy-if(!isDebugBuild&&gtkWidget&&/^Linux\x20i686/.test(http.oscpu),102,140) == 633344-1.html 633344-1-ref.html # bug 1103623, Linux32 from GCC update
 fuzzy-if(skiaContent,1,500) == 634232-1.html 634232-1-ref.html
 fuzzy-if(skiaContent,3,120000) == 635302-1.html 635302-1-ref.html
 fuzzy(1,68) fuzzy-if(gtkWidget,1,70) fails-if(Android) fuzzy-if(skiaContent&&!Android,1,300) == 635373-1.html 635373-1-ref.html
 random-if(d2d) fails-if(Android) fuzzy-if(winWidget&&!d2d,20,118) fuzzy-if(skiaContent&&!Android,2,550) == 635373-2.html 635373-2-ref.html
 random-if(d2d) fails-if(Android) fuzzy-if(winWidget&&!d2d,20,116) fuzzy-if(skiaContent&&!Android,2,650) == 635373-3.html 635373-3-ref.html
@@ -1992,9 +1992,13 @@ fails-if(stylo) == 1322512-1.html 132251
 == 1330051.svg 1330051-ref.svg
 == 1348481-1.html 1348481-ref.html
 == 1348481-2.html 1348481-ref.html
 fails-if(stylo) == 1348481-3.html 1348481-ref.html
 == 1352464-1.html 1352464-1-ref.html
 == 1358375-1.html 1358375-ref.html
 == 1358375-2.html 1358375-ref.html
 == 1358375-3.html 1358375-ref.html
+== 1364280-1.html 1364280-1-ref.html
+== 1364280-2a.html 1364280-2-ref.html
+== 1364280-2b.html 1364280-2-ref.html
+== 1364280-2c.html 1364280-2-ref.html
 == 1364335.html 1364335-ref.html
--- a/layout/reftests/css-calc/background-image-gradient-1-ref.html
+++ b/layout/reftests/css-calc/background-image-gradient-1-ref.html
@@ -2,14 +2,13 @@
 <title>Test for calc() on background-image gradients</title>
 <style>
 
 p {
     height: 50px; width: 200px;
     border: thin solid;
 }
 
-#one { background-image: -moz-radial-gradient(150px 20px, circle farthest-side, red, green); }
-#two { background-image: -moz-linear-gradient(-22px -35px -45deg, blue, yellow); }
+#one { background-image: radial-gradient(circle farthest-side at 150px 20px, red, green); }
 
 </style>
 <p id="one"></p>
 <p id="two"></p>
--- a/layout/reftests/css-calc/background-image-gradient-1.html
+++ b/layout/reftests/css-calc/background-image-gradient-1.html
@@ -2,14 +2,13 @@
 <title>Test for calc() on background-image gradients</title>
 <style>
 
 p {
     height: 50px; width: 200px;
     border: thin solid;
 }
 
-#one { background-image: -moz-radial-gradient(calc(50px + 50%) calc(100% - 30px), circle farthest-side, red, green); }
-#two { background-image: -moz-linear-gradient(calc(-12.5% + 3px) calc(-10px - 50%) -45deg, blue, yellow); }
+#one { background-image: radial-gradient(circle farthest-side at calc(50px + 50%) calc(100% - 30px), red, green); }
 
 </style>
 <p id="one"></p>
 <p id="two"></p>
--- a/layout/reftests/css-calc/reftest.list
+++ b/layout/reftests/css-calc/reftest.list
@@ -1,2 +1,2 @@
-fails-if(stylo) == background-image-gradient-1.html background-image-gradient-1-ref.html
+== background-image-gradient-1.html background-image-gradient-1-ref.html
 == line-height-1.html line-height-1-ref.html
--- a/layout/reftests/css-gradients/aja-linear-1a.html
+++ b/layout/reftests/css-gradients/aja-linear-1a.html
@@ -1,10 +1,10 @@
 <!doctype html>
 <!-- Derived from http://a-ja.net/newgrad.html -->
 <style>
 div {
   height: 200px;
   width: 100px;
-  background: -moz-linear-gradient(top, yellow, blue);
+  background: linear-gradient(to bottom, yellow, blue);
 }
 </style>
 <div></div>
--- a/layout/reftests/css-gradients/aja-linear-1b.html
+++ b/layout/reftests/css-gradients/aja-linear-1b.html
@@ -1,10 +1,10 @@
 <!doctype html>
 <!-- Derived from http://a-ja.net/newgrad.html -->
 <style>
 div {
   height: 200px;
   width: 100px;
-  background: -moz-linear-gradient(bottom, blue, yellow);
+  background: linear-gradient(to top, blue, yellow);
 }
 </style>
 <div></div>
--- a/layout/reftests/css-gradients/aja-linear-1e.html
+++ b/layout/reftests/css-gradients/aja-linear-1e.html
@@ -1,10 +1,10 @@
 <!doctype html>
 <!-- Derived from http://a-ja.net/newgrad.html -->
 <style>
 div {
   height: 200px;
   width: 100px;
-  background: -moz-linear-gradient(top, yellow 0%, blue 100%);
+  background: linear-gradient(to bottom, yellow 0%, blue 100%);
 }
 </style>
 <div></div>
--- a/layout/reftests/css-gradients/aja-linear-1f.html
+++ b/layout/reftests/css-gradients/aja-linear-1f.html
@@ -1,10 +1,10 @@
 <!doctype html>
 <!-- Derived from http://a-ja.net/newgrad.html -->
 <style>
 div {
   height: 200px;
   width: 100px;
-  background: -moz-linear-gradient(center top, yellow, blue);
+  background: linear-gradient(yellow, blue);
 }
 </style>
 <div></div>
deleted file mode 100644
--- a/layout/reftests/css-gradients/aja-linear-1g.html
+++ /dev/null
@@ -1,10 +0,0 @@
-<!doctype html>
-<!-- Derived from http://a-ja.net/newgrad.html -->
-<style>
-div {
-  height: 200px;
-  width: 100px;
-  background: -moz-linear-gradient(yellow, blue);
-}
-</style>
-<div></div>
--- a/layout/reftests/css-gradients/aja-linear-2-ref.html
+++ b/layout/reftests/css-gradients/aja-linear-2-ref.html
@@ -1,17 +1,17 @@
 <!doctype html>
 <!-- Derived from http://a-ja.net/newgrad.html -->
 <html class="reftest-wait">
 <head>
 <script>
 function doDraw() {
   var ctx = document.getElementById('canvas').getContext('2d');
 
-  var grad = ctx.createLinearGradient(0,0,100,200);
+  var grad = ctx.createLinearGradient(0,0,160,80);
   grad.addColorStop(0, 'yellow');
   grad.addColorStop(1, 'blue');
 
   ctx.fillStyle = grad;
   ctx.fillRect(0,0,100,200);
 
   document.documentElement.removeAttribute('class');
 }
rename from layout/reftests/css-gradients/aja-linear-2a.html
rename to layout/reftests/css-gradients/aja-linear-2.html
--- a/layout/reftests/css-gradients/aja-linear-2a.html
+++ b/layout/reftests/css-gradients/aja-linear-2.html
@@ -1,10 +1,10 @@
 <!doctype html>
 <!-- Derived from http://a-ja.net/newgrad.html -->
 <style>
 div {
   height: 200px;
   width: 100px;
-  background: -moz-linear-gradient(top left, yellow, blue);
+  background: linear-gradient(to bottom right, yellow, blue);
 }
 </style>
 <div></div>
deleted file mode 100644
--- a/layout/reftests/css-gradients/aja-linear-2b.html
+++ /dev/null
@@ -1,10 +0,0 @@
-<!doctype html>
-<!-- Derived from http://a-ja.net/newgrad.html -->
-<style>
-div {
-  height: 200px;
-  width: 100px;
-  background: -moz-linear-gradient(0 0, yellow, blue);
-}
-</style>
-<div></div>
deleted file mode 100644
--- a/layout/reftests/css-gradients/aja-linear-2c.html
+++ /dev/null
@@ -1,10 +0,0 @@
-<!doctype html>
-<!-- Derived from http://a-ja.net/newgrad.html -->
-<style>
-div {
-  height: 200px;
-  width: 100px;
-  background: -moz-linear-gradient(top 0px left 0px, yellow, blue);
-}
-</style>
-<div></div>
deleted file mode 100644
--- a/layout/reftests/css-gradients/aja-linear-2d.html
+++ /dev/null
@@ -1,10 +0,0 @@
-<!doctype html>
-<!-- Derived from http://a-ja.net/newgrad.html -->
-<style>
-div {
-  height: 200px;
-  width: 100px;
-  background: -moz-linear-gradient(bottom right, blue, yellow);
-}
-</style>
-<div></div>
--- a/layout/reftests/css-gradients/aja-linear-4a.html
+++ b/layout/reftests/css-gradients/aja-linear-4a.html
@@ -1,10 +1,10 @@
 <!doctype html>
 <!-- Derived from http://a-ja.net/newgrad.html -->
 <style>
 div {
   height: 200px;
   width: 100px;
-  background: -moz-linear-gradient(top, yellow, blue, #0f0);
+  background: linear-gradient(yellow, blue, #0f0);
 }
 </style>
 <div></div>
--- a/layout/reftests/css-gradients/aja-linear-4b.html
+++ b/layout/reftests/css-gradients/aja-linear-4b.html
@@ -1,10 +1,10 @@
 <!doctype html>
 <!-- Derived from http://a-ja.net/newgrad.html -->
 <style>
 div {
   height: 200px;
   width: 100px;
-  background: -moz-linear-gradient(top, yellow, blue 50%, #0f0);
+  background: linear-gradient(yellow, blue 50%, #0f0);
 }
 </style>
 <div></div>
--- a/layout/reftests/css-gradients/aja-linear-5a.html
+++ b/layout/reftests/css-gradients/aja-linear-5a.html
@@ -1,10 +1,10 @@
 <!doctype html>
 <!-- Derived from http://a-ja.net/newgrad.html -->
 <style>
 div {
   height: 200px;
   width: 100px;
-  background: -moz-linear-gradient(top, yellow, blue 20%, #0f0);
+  background: linear-gradient(yellow, blue 20%, #0f0);
 }
 </style>
 <div></div>
deleted file mode 100644
--- a/layout/reftests/css-gradients/aja-linear-6-ref.html
+++ /dev/null
@@ -1,23 +0,0 @@
-<!doctype html>
-<!-- Derived from http://a-ja.net/newgrad.html -->
-<html class="reftest-wait">
-<head>
-<script>
-function doDraw() {
-  var ctx = document.getElementById('canvas').getContext('2d');
-
-  var grad = ctx.createLinearGradient(20, 30, 80, 170);
-  grad.addColorStop(0, 'yellow');
-  grad.addColorStop(1, 'blue');
-
-  ctx.fillStyle = grad;
-  ctx.fillRect(0,0,100,200);
-
-  document.documentElement.removeAttribute('class');
-}
-</script>
-</head>
-<body onload="doDraw();">
-<canvas id="canvas" width="100" height="200"></canvas>
-</body>
-</html>
deleted file mode 100644
--- a/layout/reftests/css-gradients/aja-linear-6a.html
+++ /dev/null
@@ -1,10 +0,0 @@
-<!doctype html>
-<!-- Derived from http://a-ja.net/newgrad.html -->
-<style>
-div {
-  height: 200px;
-  width: 100px;
-  background: -moz-linear-gradient(20px 30px, yellow, blue);
-}
-</style>
-<div></div>
deleted file mode 100644
--- a/layout/reftests/css-gradients/aja-linear-6b.html
+++ /dev/null
@@ -1,10 +0,0 @@
-<!doctype html>
-<!-- Derived from http://a-ja.net/newgrad.html -->
-<style>
-div {
-  height: 200px;
-  width: 100px;
-  background: -moz-linear-gradient(left 20px top 30px, yellow, blue);
-}
-</style>
-<div></div>
--- a/layout/reftests/css-gradients/height-dependence-1-ref.html
+++ b/layout/reftests/css-gradients/height-dependence-1-ref.html
@@ -1,13 +1,13 @@
 <!doctype html>
 <html><head>
 <style>
 html {
-  background-image: -moz-linear-gradient(black, white 20%);
+  background-image: linear-gradient(black, white 20%);
   background-repeat: repeat-x;
 }
 body {
   font-size: 1em;
   padding: 2em;
   margin: 50px auto;
   width: 14em;
   border: 1px solid black;
--- a/layout/reftests/css-gradients/height-dependence-1.html
+++ b/layout/reftests/css-gradients/height-dependence-1.html
@@ -1,13 +1,13 @@
 <!doctype html>
 <html class="reftest-wait"><head>
 <style>
 html {
-  background-image: -moz-linear-gradient(black, white 20%);
+  background-image: linear-gradient(black, white 20%);
   background-repeat: repeat-x;
 }
 body {
   font-size: 1em;
   padding: 2em;
   margin: 50px auto;
   width: 28em;
   border: 1px solid black;
--- a/layout/reftests/css-gradients/height-dependence-2-ref.html
+++ b/layout/reftests/css-gradients/height-dependence-2-ref.html
@@ -1,13 +1,13 @@
 <!doctype html>
 <html><head>
 <style>
 html {
-  background-image: -moz-linear-gradient(black, white 20%);
+  background-image: linear-gradient(black, white 20%);
   background-repeat: repeat-x;
   background-size: 1px 400px;
 }
 body {
   font-size: 1em;
   padding: 2em;
   margin: 50px auto;
   width: 14em;
--- a/layout/reftests/css-gradients/height-dependence-2.html
+++ b/layout/reftests/css-gradients/height-dependence-2.html
@@ -1,13 +1,13 @@
 <!doctype html>
 <html class="reftest-wait"><head>
 <style>
 html {
-  background-image: -moz-linear-gradient(black, white 20%);
+  background-image: linear-gradient(black, white 20%);
   background-repeat: repeat-x;
   background-size: 1px 400px;
 }
 body {
   font-size: 1em;
   padding: 2em;
   margin: 50px auto;
   width: 28em;
--- a/layout/reftests/css-gradients/height-dependence-3-ref.html
+++ b/layout/reftests/css-gradients/height-dependence-3-ref.html
@@ -1,13 +1,13 @@
 <!doctype html>
 <html><head>
 <style>
 html {
-  background-image: -moz-linear-gradient(black, white 20%);
+  background-image: linear-gradient(black, white 20%);
   background-repeat: repeat-x;
   background-size: 1px 80%;
 }
 body {
   font-size: 1em;
   padding: 2em;
   margin: 50px auto;
   width: 14em;
--- a/layout/reftests/css-gradients/height-dependence-3.html
+++ b/layout/reftests/css-gradients/height-dependence-3.html
@@ -1,13 +1,13 @@
 <!doctype html>
 <html class="reftest-wait"><head>
 <style>
 html {
-  background-image: -moz-linear-gradient(black, white 20%);
+  background-image: linear-gradient(black, white 20%);
   background-repeat: repeat-x;
   background-size: 1px 80%;
 }
 body {
   font-size: 1em;
   padding: 2em;
   margin: 50px auto;
   width: 28em;
--- a/layout/reftests/css-gradients/linear-1a.html
+++ b/layout/reftests/css-gradients/linear-1a.html
@@ -1,1 +1,1 @@
-<div style="background: -moz-linear-gradient(to right, red 0%, #7777FF 50%, rgb(100, 200, 0) 100%) no-repeat; width: 300px; height: 300px;"><br></div>
+<div style="background: linear-gradient(to right, red 0%, #7777FF 50%, rgb(100, 200, 0) 100%) no-repeat; width: 300px; height: 300px;"><br></div>
deleted file mode 100644
--- a/layout/reftests/css-gradients/linear-1b.html
+++ /dev/null
@@ -1,1 +0,0 @@
-<div style="background: -moz-linear-gradient(left, red 0%, #7777FF 50%, rgb(100, 200, 0) 100%) no-repeat; width: 300px; height: 300px;"><br></div>
--- a/layout/reftests/css-gradients/linear-diagonal-1a.html
+++ b/layout/reftests/css-gradients/linear-diagonal-1a.html
@@ -1,1 +1,1 @@
-<div style="background: -moz-linear-gradient(top left -45deg, white, black) no-repeat; width: 300px; height: 300px;"></div>
+<div style="background: linear-gradient(135deg, white, black) no-repeat; width: 300px; height: 300px;"></div>
deleted file mode 100644
--- a/layout/reftests/css-gradients/linear-diagonal-1b.html
+++ /dev/null
@@ -1,1 +0,0 @@
-<div style="background: linear-gradient(135deg, white, black) no-repeat; width: 300px; height: 300px;"></div>
deleted file mode 100644
--- a/layout/reftests/css-gradients/linear-diagonal-1c.html
+++ /dev/null
@@ -1,1 +0,0 @@
-<div style="background: -moz-linear-gradient(top left, white, black) no-repeat; width: 300px; height: 300px;"></div>
--- a/layout/reftests/css-gradients/linear-diagonal-2a.html
+++ b/layout/reftests/css-gradients/linear-diagonal-2a.html
@@ -1,1 +1,1 @@
-<div style="background: -moz-linear-gradient(top right -135deg, white, black) no-repeat; width: 300px; height: 300px;"></div>
+<div style="background: linear-gradient(-135deg, white, black) no-repeat; width: 300px; height: 300px;"></div>
deleted file mode 100644
--- a/layout/reftests/css-gradients/linear-diagonal-2b.html
+++ /dev/null
@@ -1,1 +0,0 @@
-<div style="background: -moz-linear-gradient(-135deg, white, black) no-repeat; width: 300px; height: 300px;"></div>
deleted file mode 100644
--- a/layout/reftests/css-gradients/linear-diagonal-2c.html
+++ /dev/null
@@ -1,1 +0,0 @@
-<div style="background: -moz-linear-gradient(top right, white, black) no-repeat; width: 300px; height: 300px;"></div>
--- a/layout/reftests/css-gradients/linear-diagonal-3a.html
+++ b/layout/reftests/css-gradients/linear-diagonal-3a.html
@@ -1,1 +1,1 @@
-<div style="background: -moz-linear-gradient(bottom right 135deg, white, black) no-repeat; width: 300px; height: 300px;"></div>
+<div style="background: linear-gradient(-45deg, white, black) no-repeat; width: 300px; height: 300px;"></div>
deleted file mode 100644
--- a/layout/reftests/css-gradients/linear-diagonal-3b.html
+++ /dev/null
@@ -1,1 +0,0 @@
-<div style="background: linear-gradient(-45deg, white, black) no-repeat; width: 300px; height: 300px;"></div>
deleted file mode 100644
--- a/layout/reftests/css-gradients/linear-diagonal-3c.html
+++ /dev/null
@@ -1,1 +0,0 @@
-<div style="background: -moz-linear-gradient(bottom right, white, black) no-repeat; width: 300px; height: 300px;"></div>
--- a/layout/reftests/css-gradients/linear-diagonal-4a.html
+++ b/layout/reftests/css-gradients/linear-diagonal-4a.html
@@ -1,1 +1,1 @@
-<div style="background: -moz-linear-gradient(bottom left 45deg, white, black) no-repeat; width: 300px; height: 300px;"></div>
+<div style="background: linear-gradient(45deg, white, black) no-repeat; width: 300px; height: 300px;"></div>
deleted file mode 100644
--- a/layout/reftests/css-gradients/linear-diagonal-4b.html
+++ /dev/null
@@ -1,1 +0,0 @@
-<div style="background: -moz-linear-gradient(45deg, white, black) no-repeat; width: 300px; height: 300px;"></div>
deleted file mode 100644
--- a/layout/reftests/css-gradients/linear-diagonal-4c.html
+++ /dev/null
@@ -1,1 +0,0 @@
-<div style="background: -moz-linear-gradient(bottom left, white, black) no-repeat; width: 300px; height: 300px;"></div>
deleted file mode 100644
--- a/layout/reftests/css-gradients/linear-diagonal-5-ref.html
+++ /dev/null
@@ -1,1 +0,0 @@
-<div style="background: linear-gradient(to top left, white 75%, black); width: 400px; height: 400px;"></div>
deleted file mode 100644
--- a/layout/reftests/css-gradients/linear-diagonal-5a.html
+++ /dev/null
@@ -1,1 +0,0 @@
-<div style="background: -moz-linear-gradient(100px 100px 135deg, white, black); width: 400px; height: 400px;"></div>
deleted file mode 100644
--- a/layout/reftests/css-gradients/linear-diagonal-6-ref.html
+++ /dev/null
@@ -1,1 +0,0 @@
-<div style="background: linear-gradient(to top right, white 75%, black); width: 400px; height: 400px;"></div>
deleted file mode 100644
--- a/layout/reftests/css-gradients/linear-diagonal-6a.html
+++ /dev/null
@@ -1,1 +0,0 @@
-<div style="background: -moz-linear-gradient(300px 100px 45deg, white, black); width: 400px; height: 400px;"></div>
deleted file mode 100644
--- a/layout/reftests/css-gradients/linear-diagonal-7-ref.html
+++ /dev/null
@@ -1,1 +0,0 @@
-<div style="background: linear-gradient(to bottom right, white 75%, black); width: 400px; height: 400px;"></div>
deleted file mode 100644
--- a/layout/reftests/css-gradients/linear-diagonal-7a.html
+++ /dev/null
@@ -1,1 +0,0 @@
-<div style="background: -moz-linear-gradient(300px 300px -45deg, white, black); width: 400px; height: 400px;"></div>
deleted file mode 100644
--- a/layout/reftests/css-gradients/linear-diagonal-8-ref.html
+++ /dev/null
@@ -1,1 +0,0 @@
-<div style="background: linear-gradient(to bottom left, white 75%, black); width: 400px; height: 400px;"></div>
deleted file mode 100644
--- a/layout/reftests/css-gradients/linear-diagonal-8a.html
+++ /dev/null
@@ -1,1 +0,0 @@
-<div style="background: -moz-linear-gradient(100px 300px -135deg, white, black); width: 400px; height: 400px;"></div>
deleted file mode 100644
--- a/layout/reftests/css-gradients/linear-diagonal-9-ref.html
+++ /dev/null
@@ -1,20 +0,0 @@
-<!DOCTYPE html>
-<style>
-.x { width: 200px; height: 100px; display: inline-block; }
-.a { background: -moz-linear-gradient(top -90deg, blue, white, red); }
-.e { background: -moz-linear-gradient(top right -2.03444394rad, blue, white, red); }
-.g { background: -moz-linear-gradient(right 180deg, blue, white, red); }
-.i { background: -moz-linear-gradient(bottom right 2.03444394rad, blue, white, red); }
-.k { background: -moz-linear-gradient(bottom 90deg, blue, white, red); }
-.m { background: -moz-linear-gradient(bottom left 1.10714872rad, blue, white, red); }
-.o { background: -moz-linear-gradient(left 0deg, blue, white, red); }
-.q { background: -moz-linear-gradient(top left -1.10714872rad, blue, white, red); }
-</style>
-<div class="x a"></div>
-<div class="x e"></div>
-<div class="x g"></div>
-<div class="x i"></div>
-<div class="x k"></div>
-<div class="x m"></div>
-<div class="x o"></div>
-<div class="x q"></div>
deleted file mode 100644
--- a/layout/reftests/css-gradients/linear-diagonal-9a.html
+++ /dev/null
@@ -1,20 +0,0 @@
-<!DOCTYPE html>
-<style>
-.x { width: 200px; height: 100px; display: inline-block; }
-.a { background: linear-gradient(to bottom, blue, white, red); }
-.e { background: linear-gradient(to bottom left, blue, white, red); }
-.g { background: linear-gradient(to left, blue, white, red); }
-.i { background: linear-gradient(to top left, blue, white, red); }
-.k { background: linear-gradient(to top, blue, white, red); }
-.m { background: linear-gradient(to top right, blue, white, red); }
-.o { background: linear-gradient(to right, blue, white, red); }
-.q { background: linear-gradient(to bottom right, blue, white, red); }
-</style>
-<div class="x a"></div>
-<div class="x e"></div>
-<div class="x g"></div>
-<div class="x i"></div>
-<div class="x k"></div>
-<div class="x m"></div>
-<div class="x o"></div>
-<div class="x q"></div>
--- a/layout/reftests/css-gradients/linear-flipped-1-ref.html
+++ b/layout/reftests/css-gradients/linear-flipped-1-ref.html
@@ -1,2 +1,2 @@
 <!DOCTYPE HTML>
-<div style="height:100px; background:-moz-linear-gradient(bottom, black, white);"></div>
+<div style="height:100px; background:linear-gradient(to top, black, white);"></div>
--- a/layout/reftests/css-gradients/linear-flipped-1.html
+++ b/layout/reftests/css-gradients/linear-flipped-1.html
@@ -1,2 +1,2 @@
 <!DOCTYPE HTML>
-<div style="height:100px; background:-moz-linear-gradient(top, black, white); transform:scale(1,-1);"></div>
+<div style="height:100px; background:linear-gradient(to bottom, black, white); transform:scale(1,-1);"></div>
deleted file mode 100644
--- a/layout/reftests/css-gradients/linear-keywords-1b.html
+++ /dev/null
@@ -1,1 +0,0 @@
-<div style="background: -moz-linear-gradient(left top, #0000ff, #000000) no-repeat; width: 300px; height: 300px;"><br></div>
deleted file mode 100644
--- a/layout/reftests/css-gradients/linear-mix-ref.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<html xmlns="http://www.w3.org/1999/xhtml" 
-      class="reftest-wait">
-<head>
-<script>
-function doDraw() {
-  var ctx = document.getElementById('canvas').getContext('2d');
-
-  var grad = ctx.createLinearGradient(120,20,300,20);
-  grad.addColorStop(0, '#0000ff');
-  grad.addColorStop(1, '#000000');
-
-  ctx.fillStyle = grad;
-  ctx.fillRect(0,0,300,300);
-
-  ctx = document.getElementById('canvas2').getContext('2d');
-
-  grad = ctx.createLinearGradient(30,300,30,0);
-  grad.addColorStop(0, '#00ff00');
-  grad.addColorStop(1, '#000000');
-
-  ctx.fillStyle = grad;
-  ctx.fillRect(0,0,300,300);
-
-  document.documentElement.removeAttribute('class');
-}
-</script>
-</head>
-<body onload="doDraw();">
-<canvas id="canvas" width="300" height="300" style="position: absolute; top: 30px; left: 30px;"></canvas>
-<br/><br/>
-<canvas id="canvas2" width="300" height="300" style="position: absolute; top: 360px; left: 30px;"></canvas>
-</body>
-</html>
-
deleted file mode 100644
--- a/layout/reftests/css-gradients/linear-mix.html
+++ /dev/null
@@ -1,3 +0,0 @@
-<div style="background: -moz-linear-gradient(40% 20px 0deg, #0000ff, #000000) no-repeat; width: 300px; height: 300px; position: absolute; top: 30px; left: 30px;"><br></div>
-
-<div style="background: -moz-linear-gradient(10% bottom 90deg, #00ff00, #000000) no-repeat; width: 300px; height: 300px; position: absolute; top: 360px; left: 30px;"><br></div>
--- a/layout/reftests/css-gradients/linear-onestopposition-1.html
+++ b/layout/reftests/css-gradients/linear-onestopposition-1.html
@@ -1,12 +1,12 @@
 <!DOCTYPE HTML>
 <title>Test for linear-gradient() with all stops at the same position</title>
 <style>
 
 div {
   width: 200px;
   height: 200px;
-  background-image: -moz-linear-gradient(left, blue 25%, orange 25%);
+  background-image: linear-gradient(to right, blue 25%, orange 25%);
 }
 
 </style>
 <div></div>
deleted file mode 100644
--- a/layout/reftests/css-gradients/linear-percent-ref.html
+++ /dev/null
@@ -1,23 +0,0 @@
-<html xmlns="http://www.w3.org/1999/xhtml" 
-      class="reftest-wait">
-<head>
-<script>
-function doDraw() {
-  var ctx = document.getElementById('canvas').getContext('2d');
-
-  var grad = ctx.createLinearGradient(30,60,300,60);
-  grad.addColorStop(0, '#0000ff');
-  grad.addColorStop(1, '#000000');
-
-  ctx.fillStyle = grad;
-  ctx.fillRect(0,0,300,300);
-
-  document.documentElement.removeAttribute('class');
-}
-</script>
-</head>
-<body onload="doDraw();">
-<canvas id="canvas" width="300" height="300"/>
-</body>
-</html>
-
deleted file mode 100644
--- a/layout/reftests/css-gradients/linear-percent.html
+++ /dev/null
@@ -1,1 +0,0 @@
-<div style="background: -moz-linear-gradient(10% 20% 0deg, #0000ff, #000000) no-repeat; width: 300px; height: 300px;"><br></div>
--- a/layout/reftests/css-gradients/linear-position-1a.html
+++ b/layout/reftests/css-gradients/linear-position-1a.html
@@ -1,2 +1,2 @@
 <body style="margin:0;">
-<div style="background: -moz-linear-gradient(left, white, black) no-repeat; background-position:-200px 0; width: 300px; height: 300px;"><br></div>
+<div style="background: linear-gradient(to right, white, black) no-repeat; background-position:-200px 0; width: 300px; height: 300px;"><br></div>
--- a/layout/reftests/css-gradients/linear-repeat-1a.html
+++ b/layout/reftests/css-gradients/linear-repeat-1a.html
@@ -1,2 +1,2 @@
-<div style="background: -moz-linear-gradient(black, black 50%, white 50%, white);
+<div style="background: linear-gradient(black, black 50%, white 50%, white);
             background-size: 100px 100px; width: 300px; height: 300px;"></div>
--- a/layout/reftests/css-gradients/linear-repeat-1b.html
+++ b/layout/reftests/css-gradients/linear-repeat-1b.html
@@ -1,2 +1,2 @@
-<div style="background: -moz-linear-gradient(black, black 50px, white 50px, white 100px, black 100px, black 150px, white 150px, white 200px);
+<div style="background: linear-gradient(black, black 50px, white 50px, white 100px, black 100px, black 150px, white 150px, white 200px);
             background-size: 100px 200px; width: 300px; height: 300px;"></div>
--- a/layout/reftests/css-gradients/linear-repeat-1c.html
+++ b/layout/reftests/css-gradients/linear-repeat-1c.html
@@ -1,4 +1,4 @@
-<div style="background: -moz-linear-gradient(white, white 50%, black 50%, black);
+<div style="background: linear-gradient(white, white 50%, black 50%, black);
             background-size: 100px 100px;
             background-position: 0 -50px;
             width: 300px; height: 300px;"></div>
--- a/layout/reftests/css-gradients/linear-repeat-1d.html
+++ b/layout/reftests/css-gradients/linear-repeat-1d.html
@@ -1,3 +1,3 @@
-<div style="background: -moz-linear-gradient(white, white 50px, black 50px, black 100px, white 100px, white 150px, black 150px, black 200px);
+<div style="background: linear-gradient(white, white 50px, black 50px, black 100px, white 100px, white 150px, black 150px, black 200px);
             background-size: 100px 200px; background-position: 0 -50px;
             width: 300px; height: 300px;"></div>
--- a/layout/reftests/css-gradients/linear-repeat-1e.html
+++ b/layout/reftests/css-gradients/linear-repeat-1e.html
@@ -1,3 +1,3 @@
-<div style="background: -moz-linear-gradient(black, black 50%, white 50%, white);
+<div style="background: linear-gradient(black, black 50%, white 50%, white);
             background-size: 300px 100px; background-repeat: repeat-y;
             width: 500px; height: 300px;"></div>
--- a/layout/reftests/css-gradients/linear-repeat-1f.html
+++ b/layout/reftests/css-gradients/linear-repeat-1f.html
@@ -1,9 +1,9 @@
-<div style="background: -moz-linear-gradient(black, black 50px, white 50px, white 100px, black 100px, black 150px, white 150px, white 200px);
+<div style="background: linear-gradient(black, black 50px, white 50px, white 100px, black 100px, black 150px, white 150px, white 200px);
             background-size: 100px 200px; background-repeat: repeat-x;
             width: 300px; height: 800px;
             margin-bottom: -600px;"></div>
 <!-- making the gradient actually be 300px high isn't reliable since
      the stop positions cannot be exactly represented and rounding errors
      creep in. So just let the gradient be 200px high and pad out to match
      the reference. -->
 <div style="background: black; width: 300px; height: 50px;"></div>
--- a/layout/reftests/css-gradients/linear-repeat-1g.html
+++ b/layout/reftests/css-gradients/linear-repeat-1g.html
@@ -1,10 +1,10 @@
 <body style="overflow:hidden">
-<div style="background: -moz-linear-gradient(black, black 50px, white 50px, white 100px, black 100px, black 150px, white 150px, white 200px);
+<div style="background: linear-gradient(black, black 50px, white 50px, white 100px, black 100px, black 150px, white 150px, white 200px);
             background-size: 300px 200px; background-repeat: no-repeat;
             width: 800px; height: 800px;
             margin-bottom: -600px;"></div>
 <!-- making the gradient actually be 300px high isn't reliable since
      the stop positions cannot be exactly represented and rounding errors
      creep in. So just let the gradient be 200px high and pad out to match
      the reference. -->
 <div style="background: black; width: 300px; height: 50px;"></div>
--- a/layout/reftests/css-gradients/linear-size-1-ref.html
+++ b/layout/reftests/css-gradients/linear-size-1-ref.html
@@ -1,3 +1,3 @@
-<div style="background: -moz-linear-gradient(white, black) no-repeat; width: 300px; height: 100px;"></div>
-<div style="background: -moz-linear-gradient(white, black) no-repeat; width: 300px; height: 100px;"></div>
-<div style="background: -moz-linear-gradient(white, black) no-repeat; width: 300px; height: 100px;"></div>
+<div style="background: linear-gradient(white, black) no-repeat; width: 300px; height: 100px;"></div>
+<div style="background: linear-gradient(white, black) no-repeat; width: 300px; height: 100px;"></div>
+<div style="background: linear-gradient(white, black) no-repeat; width: 300px; height: 100px;"></div>
--- a/layout/reftests/css-gradients/linear-size-1a.html
+++ b/layout/reftests/css-gradients/linear-size-1a.html
@@ -1,2 +1,2 @@
-<div style="background: -moz-linear-gradient(white, black);
+<div style="background: linear-gradient(white, black);
             background-size: 300px 100px; width: 300px; height: 300px;"></div>
--- a/layout/reftests/css-gradients/linear-stops-1-ref.html
+++ b/layout/reftests/css-gradients/linear-stops-1-ref.html
@@ -1,1 +1,1 @@
-<div style="background: -moz-linear-gradient(white 0%, red 20%, green 40%, blue 60%, yellow 80%, black 100%) no-repeat; width: 300px; height: 300px;"></div>
+<div style="background: linear-gradient(white 0%, red 20%, green 40%, blue 60%, yellow 80%, black 100%) no-repeat; width: 300px; height: 300px;"></div>
--- a/layout/reftests/css-gradients/linear-stops-1a.html
+++ b/layout/reftests/css-gradients/linear-stops-1a.html
@@ -1,1 +1,1 @@
-<div style="background: -moz-linear-gradient(white, red, green, blue, yellow, black) no-repeat; width: 300px; height: 300px;"></div>
+<div style="background: linear-gradient(white, red, green, blue, yellow, black) no-repeat; width: 300px; height: 300px;"></div>
--- a/layout/reftests/css-gradients/linear-stops-1b.html
+++ b/layout/reftests/css-gradients/linear-stops-1b.html
@@ -1,1 +1,1 @@
-<div style="background: -moz-linear-gradient(white 0, red 60px, green 120px, blue 180px, yellow 240px, black 300px) no-repeat; width: 300px; height: 300px;"></div>
+<div style="background: linear-gradient(white 0, red 60px, green 120px, blue 180px, yellow 240px, black 300px) no-repeat; width: 300px; height: 300px;"></div>
--- a/layout/reftests/css-gradients/linear-stops-1c.html
+++ b/layout/reftests/css-gradients/linear-stops-1c.html
@@ -1,1 +1,1 @@
-<div style="background: -moz-linear-gradient(white, red 20%, green, blue 60%, yellow, black) no-repeat; width: 300px; height: 300px;"></div>
+<div style="background: linear-gradient(white, red 20%, green, blue 60%, yellow, black) no-repeat; width: 300px; height: 300px;"></div>
--- a/layout/reftests/css-gradients/linear-stops-1d.html
+++ b/layout/reftests/css-gradients/linear-stops-1d.html
@@ -1,1 +1,1 @@
-<div style="background: -moz-linear-gradient(white, red, green 40%, red 40%, green 40%, blue, yellow, black) no-repeat; width: 300px; height: 300px;"></div>
+<div style="background: linear-gradient(white, red, green 40%, red 40%, green 40%, blue, yellow, black) no-repeat; width: 300px; height: 300px;"></div>
--- a/layout/reftests/css-gradients/linear-stops-1e.html
+++ b/layout/reftests/css-gradients/linear-stops-1e.html
@@ -1,1 +1,1 @@
-<div style="background: -moz-linear-gradient(white, red, green 40%, red 20%, green 40%, blue, yellow, black) no-repeat; width: 300px; height: 300px;"></div>
+<div style="background: linear-gradient(white, red, green 40%, red 20%, green 40%, blue, yellow, black) no-repeat; width: 300px; height: 300px;"></div>
--- a/layout/reftests/css-gradients/linear-stops-1f.html
+++ b/layout/reftests/css-gradients/linear-stops-1f.html
@@ -1,1 +1,1 @@
-<div style="background: -moz-linear-gradient(white, red, green 40%, red 40%, green 20%, blue, yellow, black) no-repeat; width: 300px; height: 300px;"></div>
+<div style="background: linear-gradient(white, red, green 40%, red 40%, green 20%, blue, yellow, black) no-repeat; width: 300px; height: 300px;"></div>
--- a/layout/reftests/css-gradients/linear-vertical-1a.html
+++ b/layout/reftests/css-gradients/linear-vertical-1a.html
@@ -1,1 +1,1 @@
-<div style="background: -moz-linear-gradient(white, black) no-repeat; width: 300px; height: 300px;"></div>
+<div style="background: linear-gradient(white, black) no-repeat; width: 300px; height: 300px;"></div>
--- a/layout/reftests/css-gradients/linear-vertical-1b.html
+++ b/layout/reftests/css-gradients/linear-vertical-1b.html
@@ -1,1 +1,1 @@
-<div style="background: -moz-linear-gradient(top left -90deg, white, black) no-repeat; width: 300px; height: 300px;"></div>
+<div style="background: linear-gradient(to bottom, white, black) no-repeat; width: 300px; height: 300px;"></div>
--- a/layout/reftests/css-gradients/linear-vertical-1c.html
+++ b/layout/reftests/css-gradients/linear-vertical-1c.html
@@ -1,1 +1,1 @@
-<div style="background: -moz-linear-gradient(white 0%, white 0%, black) no-repeat; width: 300px; height: 300px;"></div>
+<div style="background: linear-gradient(white 0%, white 0%, black) no-repeat; width: 300px; height: 300px;"></div>
--- a/layout/reftests/css-gradients/linear-vertical-1d.html
+++ b/layout/reftests/css-gradients/linear-vertical-1d.html
@@ -1,1 +1,1 @@
-<div style="background: -moz-linear-gradient(white 0%, white -20%, black) no-repeat; width: 300px; height: 300px;"></div>
+<div style="background: linear-gradient(white 0%, white -20%, black) no-repeat; width: 300px; height: 300px;"></div>
deleted file mode 100644
--- a/layout/reftests/css-gradients/linear-vertical-1e.html
+++ /dev/null
@@ -1,1 +0,0 @@
-<div style="background: linear-gradient(to bottom, white, black) no-repeat; width: 300px; height: 300px;"></div>
--- a/layout/reftests/css-gradients/linear-vertical-subpixel-1-ref.html
+++ b/layout/reftests/css-gradients/linear-vertical-subpixel-1-ref.html
@@ -1,15 +1,15 @@
 <!DOCTYPE html>
 <html>
 <head>
 <style>
 div {
   margin-top: 21px;
   height: 30px;
-  background-image: -moz-linear-gradient(center top, black, white);
+  background-image: linear-gradient(black, white);
 }
 </style>
 </head>
 <body>
 <div></div>
 </body>
 </html>
--- a/layout/reftests/css-gradients/linear-vertical-subpixel-1.html
+++ b/layout/reftests/css-gradients/linear-vertical-subpixel-1.html
@@ -1,15 +1,15 @@
 <!DOCTYPE html>
 <html>
 <head>
 <style>
 div {
   margin-top: 20.7px;
   height: 30px;
-  background-image: -moz-linear-gradient(center top, black, white);
+  background-image: linear-gradient(black, white);
 }
 </style>
 </head>
 <body>
 <div></div>
 </body>
 </html>
--- a/layout/reftests/css-gradients/linear-viewport-ref.html
+++ b/layout/reftests/css-gradients/linear-viewport-ref.html
@@ -1,1 +1,1 @@
-<body style="border: 0; margin: 0; padding: 0;"><div style="background: -moz-linear-gradient(blue, aqua) no-repeat; width: 100%; height: 100%;">&nbsp;</div></body>
+<body style="border: 0; margin: 0; padding: 0;"><div style="background: linear-gradient(blue, aqua) no-repeat; width: 100%; height: 100%;">&nbsp;</div></body>
--- a/layout/reftests/css-gradients/linear-viewport.html
+++ b/layout/reftests/css-gradients/linear-viewport.html
@@ -1,2 +1,2 @@
 <!-- bug 509681 -->
-<body style="background: -moz-linear-gradient(blue, aqua) fixed no-repeat;">
+<body style="background: linear-gradient(blue, aqua) fixed no-repeat;">
deleted file mode 100644
--- a/layout/reftests/css-gradients/linear-zero-length-1-ref.html
+++ /dev/null
@@ -1,2 +0,0 @@
-<div style="background: black; width: 300px; height: 300px;"></div>
-<div style="background: black; width: 300px; height: 300px;"></div>
deleted file mode 100644
--- a/layout/reftests/css-gradients/linear-zero-length-1a.html
+++ /dev/null
@@ -1,2 +0,0 @@
-<div style="background: -moz-linear-gradient(150px 150px, white, black); width: 300px; height: 300px;"></div>
-<div style="background: -moz-repeating-linear-gradient(150px 150px, white, black); width: 300px; height: 300px;"></div>
deleted file mode 100644
--- a/layout/reftests/css-gradients/linear-zero-length-1b.html
+++ /dev/null
@@ -1,2 +0,0 @@
-<div style="background: -moz-linear-gradient(150px 150px, white, white 100px, black); width: 300px; height: 300px;"></div>
-<div style="background: -moz-repeating-linear-gradient(150px 150px, white, white 100px, black); width: 300px; height: 300px;"></div>
deleted file mode 100644
--- a/layout/reftests/css-gradients/linear-zero-length-1c.html
+++ /dev/null
@@ -1,2 +0,0 @@
-<div style="background: -moz-linear-gradient(center, white, black 50%); width: 300px; height: 300px;"></div>
-<div style="background: -moz-repeating-linear-gradient(center, white, black 50%); width: 300px; height: 300px;"></div>
deleted file mode 100644
--- a/layout/reftests/css-gradients/radial-1c.html
+++ /dev/null
@@ -1,1 +0,0 @@
-<div style="background: -moz-radial-gradient(100px 100px, closest-side, #ff0000 25px, #0000ff 50px) no-repeat; width: 300px; height: 300px;"><br></div>
deleted file mode 100644
--- a/layout/reftests/css-gradients/radial-2e.html
+++ /dev/null
@@ -1,1 +0,0 @@
-<div style="background: -moz-radial-gradient(100px 100px, closest-side, yellow -10px, #ff0000 0, #0000ff 50px); width: 300px; height: 300px;"><br></div>
deleted file mode 100644
--- a/layout/reftests/css-gradients/radial-2f.html
+++ /dev/null
@@ -1,3 +0,0 @@
-<!-- This test checks that adjustment of stop positions to be non-negative
-     happens after the calculation of implied stop positions -->
-<div style="background: -moz-radial-gradient(100px 100px, closest-side, #ff0000 -50px, #ff0000, #0000ff 50px); width: 300px; height: 300px;"><br></div>
deleted file mode 100644
--- a/layout/reftests/css-gradients/radial-onestopposition-1c.html
+++ /dev/null
@@ -1,12 +0,0 @@
-<!DOCTYPE HTML>
-<title>Test for radial-gradient() with all stops at the same position</title>
-<style>
-
-div {
-  width: 200px;
-  height: 200px;
-  background-image: -moz-radial-gradient(contain, blue 25%, orange 25%);
-}
-
-</style>
-<div></div>
--- a/layout/reftests/css-gradients/radial-shape-closest-corner-1-ref.html
+++ b/layout/reftests/css-gradients/radial-shape-closest-corner-1-ref.html
@@ -1,9 +1,9 @@
 <style>div { position:absolute; width:200px; height:200px; }</style>
 <div style="background: radial-gradient(closest-side circle at 60px 80px, white, black 100px); top:10px; left:10px;"></div>
 <div style="background: radial-gradient(closest-side circle at 140px 80px, white, black 100px); top:10px; left:220px;"></div>
 <div style="background: radial-gradient(closest-side circle at 80px 60px, white, black 100px); top:220px; left:10px;"></div>
 <div style="background: radial-gradient(closest-side circle at 80px 140px, white, black 100px); top:220px; left:220px;"></div>
-<div style="background: -moz-radial-gradient(60px 80px 90deg, closest-corner, white, black 80px); top:430px; left:10px;"></div>
-<div style="background: -moz-radial-gradient(140px 80px 90deg, closest-corner, white, black 80px); top:430px; left:220px;"></div>
-<div style="background: -moz-radial-gradient(80px 60px 90deg, ellipse closest-corner, white, black 60px); top:640px; left:10px;"></div>
-<div style="background: -moz-radial-gradient(80px 140px 90deg, ellipse closest-corner, white, black 60px); top:640px; left:220px;"></div>
+<div style="background: radial-gradient(closest-corner at 60px 80px, white, black 60px); top:430px; left:10px;"></div>
+<div style="background: radial-gradient(closest-corner at 140px 80px, white, black 60px); top:430px; left:220px;"></div>
+<div style="background: radial-gradient(ellipse closest-corner at 80px 60px, white, black 80px); top:640px; left:10px;"></div>
+<div style="background: radial-gradient(ellipse closest-corner at 80px 140px, white, black 80px); top:640px; left:220px;"></div>
deleted file mode 100644
--- a/layout/reftests/css-gradients/radial-shape-closest-corner-1c.html
+++ /dev/null
@@ -1,9 +0,0 @@
-<style>div { position:absolute; width:200px; height:200px; }</style>
-<div style="background: -moz-radial-gradient(60px 80px, circle closest-corner, white, black); top:10px; left:10px;"></div>
-<div style="background: -moz-radial-gradient(140px 80px, circle closest-corner, white, black); top:10px; left:220px;"></div>
-<div style="background: -moz-radial-gradient(80px 60px, circle closest-corner, white, black); top:220px; left:10px;"></div>
-<div style="background: -moz-radial-gradient(80px 140px, circle closest-corner, white, black); top:220px; left:220px;"></div>
-<div style="background: -moz-radial-gradient(60px 80px, ellipse closest-corner, white, black 60px); top:430px; left:10px;"></div>
-<div style="background: -moz-radial-gradient(140px 80px, ellipse closest-corner, white, black 60px); top:430px; left:220px;"></div>
-<div style="background: -moz-radial-gradient(80px 60px, closest-corner, white, black 80px); top:640px; left:10px;"></div>
-<div style="background: -moz-radial-gradient(80px 140px, closest-corner, white, black 80px); top:640px; left:220px;"></div>
--- a/layout/reftests/css-gradients/radial-shape-closest-side-1-ref.html
+++ b/layout/reftests/css-gradients/radial-shape-closest-side-1-ref.html
@@ -1,9 +1,9 @@
 <style>div { position:absolute; width:200px; height:200px; }</style>
-<div style="background: -moz-radial-gradient(50px 80px, circle closest-side, white, black 50px); top:10px; left:10px;"></div>
-<div style="background: -moz-radial-gradient(150px 80px, circle closest-side, white, black 50px); top:10px; left:220px;"></div>
-<div style="background: -moz-radial-gradient(80px 50px, circle closest-side, white, black 50px); top:220px; left:10px;"></div>
-<div style="background: -moz-radial-gradient(80px 150px, circle closest-side, white, black 50px); top:220px; left:220px;"></div>
-<div style="background: -moz-radial-gradient(20px 20px, circle closest-side, white, black 20px); height:100px; -moz-transform-origin:0 0; -moz-transform:scale(1.0, 2.0); top:430px; left:10px;"></div>
-<div style="background: -moz-radial-gradient(180px 20px, circle closest-side, white, black 20px); height:100px; -moz-transform-origin:0 0; -moz-transform:scale(1.0, 2.0); top:430px; left:220px;"></div>
-<div style="background: -moz-radial-gradient(20px 20px, circle closest-side, white, black 20px); width:100px; -moz-transform-origin:0 0; -moz-transform:scale(2.0, 1.0); top:640px; left:10px;"></div>
-<div style="background: -moz-radial-gradient(20px 180px, circle closest-side, white, black 20px); width:100px; -moz-transform-origin:0 0; -moz-transform:scale(2.0, 1.0); top:640px; left:220px;"></div>
+<div style="background: radial-gradient(circle closest-side at 50px 80px, white, black 50px); top:10px; left:10px;"></div>
+<div style="background: radial-gradient(circle closest-side at 150px 80px, white, black 50px); top:10px; left:220px;"></div>
+<div style="background: radial-gradient(circle closest-side at 80px 50px, white, black 50px); top:220px; left:10px;"></div>
+<div style="background: radial-gradient(circle closest-side at 80px 150px, white, black 50px); top:220px; left:220px;"></div>
+<div style="background: radial-gradient(circle closest-side at 20px 20px, white, black 20px); height:100px; -moz-transform-origin:0 0; -moz-transform:scale(1.0, 2.0); top:430px; left:10px;"></div>
+<div style="background: radial-gradient(circle closest-side at 180px 20px, white, black 20px); height:100px; -moz-transform-origin:0 0; -moz-transform:scale(1.0, 2.0); top:430px; left:220px;"></div>
+<div style="background: radial-gradient(circle closest-side at 20px 20px, white, black 20px); width:100px; -moz-transform-origin:0 0; -moz-transform:scale(2.0, 1.0); top:640px; left:10px;"></div>
+<div style="background: radial-gradient(circle closest-side at 20px 180px, white, black 20px); width:100px; -moz-transform-origin:0 0; -moz-transform:scale(2.0, 1.0); top:640px; left:220px;"></div>
deleted file mode 100644
--- a/layout/reftests/css-gradients/radial-shape-closest-side-1c.html
+++ /dev/null
@@ -1,9 +0,0 @@
-<style>div { position:absolute; width:200px; height:200px; }</style>
-<div style="background: -moz-radial-gradient(50px 80px, circle closest-side, white, black); top:10px; left:10px;"></div>
-<div style="background: -moz-radial-gradient(150px 80px, circle closest-side, white, black); top:10px; left:220px;"></div>
-<div style="background: -moz-radial-gradient(80px 50px, circle closest-side, white, black); top:220px; left:10px;"></div>
-<div style="background: -moz-radial-gradient(80px 150px, circle closest-side, white, black); top:220px; left:220px;"></div>
-<div style="background: -moz-radial-gradient(20px 40px, ellipse closest-side, white, black); top:430px; left:10px;"></div>
-<div style="background: -moz-radial-gradient(180px 40px, ellipse closest-side, white, black); top:430px; left:220px;"></div>
-<div style="background: -moz-radial-gradient(40px 20px, closest-side, white, black); top:640px; left:10px;"></div>
-<div style="background: -moz-radial-gradient(40px 180px, closest-side, white, black); top:640px; left:220px;"></div>
--- a/layout/reftests/css-gradients/radial-shape-farthest-corner-1-ref.html
+++ b/layout/reftests/css-gradients/radial-shape-farthest-corner-1-ref.html
@@ -1,9 +1,9 @@
 <style>div { position:absolute; width:200px; height:200px; }</style>
 <div style="background: radial-gradient(circle farthest-side at 40px 80px, white, black 200px); top:10px; left:10px;"></div>
 <div style="background: radial-gradient(farthest-side circle at 160px 80px, white, black 200px); top:10px; left:220px;"></div>
 <div style="background: radial-gradient(circle farthest-side at 80px 40px, white, black 200px); top:220px; left:10px;"></div>
 <div style="background: radial-gradient(farthest-side circle at 80px 160px, white, black 200px); top:220px; left:220px;"></div>
-<div style="background: -moz-radial-gradient(60px 80px 90deg, farthest-corner, white, black 120px); top:430px; left:10px;"></div>
-<div style="background: -moz-radial-gradient(140px 80px 90deg, farthest-corner, white, black 120px); top:430px; left:220px;"></div>
-<div style="background: -moz-radial-gradient(80px 60px 90deg, ellipse farthest-corner, white, black 140px); top:640px; left:10px;"></div>
-<div style="background: -moz-radial-gradient(80px 140px 90deg, ellipse farthest-corner, white, black 140px); top:640px; left:220px;"></div>
+<div style="background: radial-gradient(farthest-corner at 60px 80px, white, black 140px); top:430px; left:10px;"></div>
+<div style="background: radial-gradient(farthest-corner at 140px 80px, white, black 140px); top:430px; left:220px;"></div>
+<div style="background: radial-gradient(ellipse farthest-corner at 80px 60px, white, black 120px); top:640px; left:10px;"></div>
+<div style="background: radial-gradient(ellipse farthest-corner at 80px 140px, white, black 120px); top:640px; left:220px;"></div>
deleted file mode 100644
--- a/layout/reftests/css-gradients/radial-shape-farthest-corner-1c.html
+++ /dev/null
@@ -1,9 +0,0 @@
-<style>div { position:absolute; width:200px; height:200px; }</style>
-<div style="background: -moz-radial-gradient(40px 80px, circle farthest-corner, white, black); top:10px; left:10px;"></div>
-<div style="background: -moz-radial-gradient(160px 80px, circle farthest-corner, white, black); top:10px; left:220px;"></div>
-<div style="background: -moz-radial-gradient(80px 40px, circle farthest-corner, white, black); top:220px; left:10px;"></div>
-<div style="background: -moz-radial-gradient(80px 160px, circle farthest-corner, white, black); top:220px; left:220px;"></div>
-<div style="background: -moz-radial-gradient(60px 80px, ellipse farthest-corner, white, black 140px); top:430px; left:10px;"></div>
-<div style="background: -moz-radial-gradient(140px 80px, ellipse farthest-corner, white, black 140px); top:430px; left:220px;"></div>
-<div style="background: -moz-radial-gradient(80px 60px, farthest-corner, white, black 120px); top:640px; left:10px;"></div>
-<div style="background: -moz-radial-gradient(80px 140px, farthest-corner, white, black 120px); top:640px; left:220px;"></div>
deleted file mode 100644
--- a/layout/reftests/css-gradients/radial-shape-farthest-side-1c.html
+++ /dev/null
@@ -1,9 +0,0 @@
-<style>div { position:absolute; width:200px; height:200px; }</style>
-<div style="background: -moz-radial-gradient(50px 80px, circle farthest-side, white, black); top:10px; left:10px;"></div>
-<div style="background: -moz-radial-gradient(150px 80px, circle farthest-side, white, black); top:10px; left:220px;"></div>
-<div style="background: -moz-radial-gradient(80px 50px, circle farthest-side, white, black); top:220px; left:10px;"></div>
-<div style="background: -moz-radial-gradient(80px 150px, circle farthest-side, white, black); top:220px; left:220px;"></div>
-<div style="background: -moz-radial-gradient(80px 40px, farthest-side, white, black); height:100px; top:430px; left:10px;"></div>
-<div style="background: -moz-radial-gradient(120px 60px, farthest-side, white, black); height:100px; top:430px; left:220px;"></div>
-<div style="background: -moz-radial-gradient(40px 80px, ellipse farthest-side, white, black); width:100px; top:640px; left:10px;"></div>
-<div style="background: -moz-radial-gradient(60px 120px, ellipse farthest-side, white, black); width:100px; top:640px; left:220px;"></div>
--- a/layout/reftests/css-gradients/radial-size-1a.html
+++ b/layout/reftests/css-gradients/radial-size-1a.html
@@ -1,2 +1,2 @@
-<div style="background: -moz-radial-gradient(white, black);
+<div style="background: radial-gradient(white, black);
             background-size: 300px 100px; width: 300px; height: 300px;"></div>
deleted file mode 100644
--- a/layout/reftests/css-gradients/radial-zero-length-1g.html
+++ /dev/null
@@ -1,2 +0,0 @@
-<div style="background: -moz-radial-gradient(left, circle closest-side, white, black); width: 300px; height: 300px;"></div>
-<div style="background: -moz-repeating-radial-gradient(left, circle closest-side, white, black); width: 300px; height: 300px;"></div>
deleted file mode 100644
--- a/layout/reftests/css-gradients/radial-zero-length-1h.html
+++ /dev/null
@@ -1,2 +0,0 @@
-<div style="background: -moz-radial-gradient(left, circle closest-side, red, white 100px, black); width: 300px; height: 300px;"></div>
-<div style="background: -moz-repeating-radial-gradient(left, circle closest-side, red, white 100px, black); width: 300px; height: 300px;"></div>
deleted file mode 100644
--- a/layout/reftests/css-gradients/radial-zero-length-1i.html
+++ /dev/null
@@ -1,2 +0,0 @@
-<div style="background: -moz-radial-gradient(left, ellipse closest-side, red, white 100px, black); width: 300px; height: 300px;"></div>
-<div style="background: -moz-repeating-radial-gradient(left, ellipse closest-side, red, white 100px, black); width: 300px; height: 300px;"></div>
deleted file mode 100644
--- a/layout/reftests/css-gradients/radial-zero-length-1j.html
+++ /dev/null
@@ -1,2 +0,0 @@
-<div style="background: -moz-radial-gradient(top, ellipse closest-side, red, white 100px, black); width: 300px; height: 300px;"></div>
-<div style="background: -moz-repeating-radial-gradient(top, ellipse closest-side, red, white 100px, black); width: 300px; height: 300px;"></div>
--- a/layout/reftests/css-gradients/reftest.list
+++ b/layout/reftests/css-gradients/reftest.list
@@ -1,155 +1,105 @@
-fuzzy-if(!contentSameGfxBackendAsCanvas,4,88500) fuzzy-if(azureSkiaGL||skiaContent,4,89700) fails-if(stylo) == linear-1a.html linear-1-ref.html
-fuzzy-if(!contentSameGfxBackendAsCanvas,4,88500) fuzzy-if(azureSkiaGL||skiaContent,4,89700) fails-if(stylo) == linear-1b.html linear-1-ref.html
+fuzzy-if(!contentSameGfxBackendAsCanvas,4,88500) fuzzy-if(azureSkiaGL||skiaContent,4,89700) == linear-1a.html linear-1-ref.html
 fuzzy-if(!contentSameGfxBackendAsCanvas,2,88500) fuzzy-if(azureSkiaGL,2,89997) fuzzy-if(skiaContent,1,16000) == linear-keywords-1a.html linear-keywords-1-ref.html
-fuzzy-if(!contentSameGfxBackendAsCanvas,2,88500) fuzzy-if(azureSkiaGL,2,89997) fuzzy-if(skiaContent,1,16000) fails-if(stylo) == linear-keywords-1b.html linear-keywords-1-ref.html
-fuzzy-if(!contentSameGfxBackendAsCanvas,2,88500) fuzzy-if(skiaContent,1,18000) fails-if(stylo) == linear-percent.html linear-percent-ref.html
-fuzzy-if(!contentSameGfxBackendAsCanvas,4,92400) fuzzy-if(azureSkiaGL||skiaContent,3,143400) fuzzy-if(Android,4,93000) fails-if(stylo) == linear-mix.html linear-mix-ref.html
-fails-if(stylo) == linear-diagonal-1a.html linear-diagonal-1-ref.html
-== linear-diagonal-1b.html linear-diagonal-1-ref.html
-fails-if(stylo) == linear-diagonal-1c.html linear-diagonal-1-ref.html
-fails-if(stylo) == linear-diagonal-2a.html linear-diagonal-2-ref.html
-fails-if(stylo) == linear-diagonal-2b.html linear-diagonal-2-ref.html
-fails-if(stylo) == linear-diagonal-2c.html linear-diagonal-2-ref.html
-fails-if(stylo) == linear-diagonal-3a.html linear-diagonal-3-ref.html
-== linear-diagonal-3b.html linear-diagonal-3-ref.html
-fails-if(stylo) == linear-diagonal-3c.html linear-diagonal-3-ref.html
-fails-if(stylo) == linear-diagonal-4a.html linear-diagonal-4-ref.html
-fails-if(stylo) == linear-diagonal-4b.html linear-diagonal-4-ref.html
-fails-if(stylo) == linear-diagonal-4c.html linear-diagonal-4-ref.html
+== linear-diagonal-1a.html linear-diagonal-1-ref.html
+== linear-diagonal-2a.html linear-diagonal-2-ref.html
+== linear-diagonal-3a.html linear-diagonal-3-ref.html
+== linear-diagonal-4a.html linear-diagonal-4-ref.html
 == linear-premul.html linear-premul-ref.html
 
-# these tests uses a similar gradient over different bounds. It's perfectly
-# reasonable to expect implementations to give slightly different results
-# if the gradients are not being normalized. Skia uses a lookup table for
-# gradients so it will have less precision when drawing a larger gradient
-fuzzy(2,11410) fuzzy-if(skiaContent,4,16000) fails-if(stylo) == linear-diagonal-5a.html linear-diagonal-5-ref.html
-fuzzy(2,11568) fuzzy-if(skiaContent,8,20000) fails-if(stylo) == linear-diagonal-6a.html linear-diagonal-6-ref.html
-fuzzy(2,11605) fuzzy-if(skiaContent,8,20000) fails-if(stylo) == linear-diagonal-7a.html linear-diagonal-7-ref.html
-fuzzy(2,11407) fuzzy-if(skiaContent,4,16000) fails-if(stylo) == linear-diagonal-8a.html linear-diagonal-8-ref.html
-
-fuzzy-if(cocoaWidget,4,29437) fuzzy-if(skiaContent,2,1700) == linear-diagonal-9a.html linear-diagonal-9-ref.html
-fuzzy(1,800000) fails-if(stylo) == linear-flipped-1.html linear-flipped-1-ref.html
-fails-if(stylo) == linear-position-1a.html linear-position-1-ref.html
-fails-if(stylo) == linear-repeat-1a.html linear-repeat-1-ref.html
-fails-if(d2d) fails-if(stylo) == linear-repeat-1b.html linear-repeat-1-ref.html # bug 582236
-fails-if(stylo) == linear-repeat-1c.html linear-repeat-1-ref.html
-fails-if(d2d) fails-if(stylo) == linear-repeat-1d.html linear-repeat-1-ref.html # bug 582236
-fails-if(stylo) == linear-repeat-1e.html linear-repeat-1-ref.html
-fails-if(d2d) fails-if(stylo) == linear-repeat-1f.html linear-repeat-1-ref.html # bug 582236
-fails-if(d2d) fails-if(stylo) == linear-repeat-1g.html linear-repeat-1-ref.html # bug 582236
+fuzzy(1,800000) == linear-flipped-1.html linear-flipped-1-ref.html
+== linear-position-1a.html linear-position-1-ref.html
+== linear-repeat-1a.html linear-repeat-1-ref.html
+fails-if(d2d) == linear-repeat-1b.html linear-repeat-1-ref.html # bug 582236
+== linear-repeat-1c.html linear-repeat-1-ref.html
+fails-if(d2d) == linear-repeat-1d.html linear-repeat-1-ref.html # bug 582236
+== linear-repeat-1e.html linear-repeat-1-ref.html
+fails-if(d2d) == linear-repeat-1f.html linear-repeat-1-ref.html # bug 582236
+fails-if(d2d) == linear-repeat-1g.html linear-repeat-1-ref.html # bug 582236
 fuzzy-if(skiaContent,1,500) == linear-rotated-1.html linear-rotated-1-ref.html
-fuzzy-if(winWidget,1,36000) fuzzy-if(skiaContent,1,45000) fails-if(stylo) == linear-size-1a.html linear-size-1-ref.html
-fails-if(stylo) == linear-stops-1a.html linear-stops-1-ref.html
-fails-if(stylo) == linear-stops-1b.html linear-stops-1-ref.html
-fails-if(stylo) == linear-stops-1c.html linear-stops-1-ref.html
-fails-if(stylo) == linear-stops-1d.html linear-stops-1-ref.html
-fails-if(stylo) == linear-stops-1e.html linear-stops-1-ref.html
-fails-if(stylo) == linear-stops-1f.html linear-stops-1-ref.html
-fuzzy-if(!contentSameGfxBackendAsCanvas,3,88500) fuzzy-if(azureSkiaGL||skiaContent,3,89700) fails-if(stylo) == linear-vertical-1a.html linear-vertical-1-ref.html
-fuzzy-if(!contentSameGfxBackendAsCanvas,3,88500) fuzzy-if(azureSkiaGL||skiaContent,3,89700) fails-if(stylo) == linear-vertical-1b.html linear-vertical-1-ref.html
-fuzzy-if(!contentSameGfxBackendAsCanvas,3,88500) fuzzy-if(azureSkiaGL||skiaContent,3,89700) fails-if(stylo) == linear-vertical-1c.html linear-vertical-1-ref.html
-fuzzy-if(!contentSameGfxBackendAsCanvas,3,88500) fuzzy-if(azureSkiaGL||skiaContent,3,89700) fails-if(stylo) == linear-vertical-1d.html linear-vertical-1-ref.html
-fuzzy-if(!contentSameGfxBackendAsCanvas,3,88500) fuzzy-if(azureSkiaGL||skiaContent,3,89700) == linear-vertical-1e.html linear-vertical-1-ref.html
-fails-if(stylo) == linear-vertical-subpixel-1.html linear-vertical-subpixel-1-ref.html
-fails-if(stylo) == linear-viewport.html linear-viewport-ref.html
-fails-if(OSX==1010&&!skiaContent) fuzzy-if(Android,4,248) fails-if(stylo) == linear-zero-length-1a.html linear-zero-length-1-ref.html
-fails-if(OSX==1010&&!skiaContent) fuzzy-if(Android,4,248) fails-if(stylo) == linear-zero-length-1b.html linear-zero-length-1-ref.html
-fails-if(OSX==1010&&!skiaContent) fuzzy-if(Android,4,248) fails-if(stylo) == linear-zero-length-1c.html linear-zero-length-1-ref.html
+fuzzy-if(winWidget,1,36000) fuzzy-if(skiaContent,1,45000) == linear-size-1a.html linear-size-1-ref.html
+== linear-stops-1a.html linear-stops-1-ref.html
+== linear-stops-1b.html linear-stops-1-ref.html
+== linear-stops-1c.html linear-stops-1-ref.html
+== linear-stops-1d.html linear-stops-1-ref.html
+== linear-stops-1e.html linear-stops-1-ref.html
+== linear-stops-1f.html linear-stops-1-ref.html
+fuzzy-if(!contentSameGfxBackendAsCanvas,3,88500) fuzzy-if(azureSkiaGL||skiaContent,3,89700) == linear-vertical-1a.html linear-vertical-1-ref.html
+fuzzy-if(!contentSameGfxBackendAsCanvas,3,88500) fuzzy-if(azureSkiaGL||skiaContent,3,89700) == linear-vertical-1b.html linear-vertical-1-ref.html
+fuzzy-if(!contentSameGfxBackendAsCanvas,3,88500) fuzzy-if(azureSkiaGL||skiaContent,3,89700) == linear-vertical-1c.html linear-vertical-1-ref.html
+fuzzy-if(!contentSameGfxBackendAsCanvas,3,88500) fuzzy-if(azureSkiaGL||skiaContent,3,89700) == linear-vertical-1d.html linear-vertical-1-ref.html
+== linear-vertical-subpixel-1.html linear-vertical-subpixel-1-ref.html
+== linear-viewport.html linear-viewport-ref.html
 == nostops.html about:blank
 == onestop.html about:blank
 fuzzy-if(!contentSameGfxBackendAsCanvas,1,5884) fuzzy-if(cocoaWidget,9,87824) fuzzy-if(azureSkiaGL,6,88024) random-if(d2d) fuzzy-if(skiaContent,4,6000) == radial-1a.html radial-1-ref.html
 fuzzy-if(!contentSameGfxBackendAsCanvas,1,5884) fuzzy-if(cocoaWidget,9,87824) fuzzy-if(azureSkiaGL,6,88024) random-if(d2d) fuzzy-if(skiaContent,4,6000) == radial-1b.html radial-1-ref.html
-fuzzy-if(!contentSameGfxBackendAsCanvas,1,5884) fuzzy-if(cocoaWidget,9,87824) fuzzy-if(azureSkiaGL,6,88024) random-if(d2d) fuzzy-if(skiaContent,4,6000) fails-if(stylo) == radial-1c.html radial-1-ref.html
 fuzzy(3,7860) fuzzy-if(cocoaWidget,5,89041) fuzzy-if(azureSkiaGL,4,90000) == radial-2a.html radial-2-ref.html
 fuzzy(3,7860) fuzzy-if(cocoaWidget,5,89041) fuzzy-if(azureSkiaGL,4,90000) == radial-2b.html radial-2-ref.html
 fuzzy(3,7860) fuzzy-if(cocoaWidget,5,89041) fuzzy-if(azureSkiaGL,4,90000) == radial-2c.html radial-2-ref.html
 fuzzy(3,7860) fuzzy-if(cocoaWidget,5,89041) fuzzy-if(azureSkiaGL,4,90000) == radial-2d.html radial-2-ref.html
-fuzzy(3,7860) fuzzy-if(cocoaWidget,5,89041) fuzzy-if(azureSkiaGL,4,90000) fails-if(stylo) == radial-2e.html radial-2-ref.html
-fuzzy(3,7860) fuzzy-if(cocoaWidget,5,89041) fuzzy-if(azureSkiaGL,4,90000) fails-if(stylo) == radial-2f.html radial-2-ref.html
-== radial-position-1a.html radial-position-1-ref.html
 fuzzy-if(cocoaWidget,1,28) fuzzy-if(winWidget,1,18) fuzzy-if(skiaContent,1,50) == radial-position-1b.html radial-position-1-ref.html
 fuzzy-if(cocoaWidget,4,22317) fuzzy-if(Android,8,771) == radial-shape-closest-corner-1a.html radial-shape-closest-corner-1-ref.html
 fuzzy(1,238) fuzzy-if(cocoaWidget,4,22608) fuzzy-if((/^Windows\x20NT\x2010\.0/.test(http.oscpu)||/^Windows\x20NT\x206\./.test(http.oscpu))&&d2d,1,336) fuzzy-if(Android,8,787) fuzzy-if(skiaContent,2,300) == radial-shape-closest-corner-1b.html radial-shape-closest-corner-1-ref.html
-fuzzy-if(Android,8,771) fails-if(stylo) == radial-shape-closest-corner-1c.html radial-shape-closest-corner-1-ref.html
 fuzzy-if(/^Windows\x20NT\x2010\.0/.test(http.oscpu)||/^Windows\x20NT\x206\.2/.test(http.oscpu),1,5) fuzzy-if(Android,17,3880) == radial-shape-closest-side-1a.html radial-shape-closest-side-1-ref.html
 fuzzy-if(/^Windows\x20NT\x2010\.0/.test(http.oscpu)||/^Windows\x20NT\x206\.2/.test(http.oscpu),1,5) fuzzy-if(Android,17,3880) == radial-shape-closest-side-1b.html radial-shape-closest-side-1-ref.html
-fuzzy-if(/^Windows\x20NT\x2010\.0/.test(http.oscpu)||/^Windows\x20NT\x206\.2/.test(http.oscpu),1,5) fuzzy-if(Android,17,3880) fails-if(stylo) == radial-shape-closest-side-1c.html radial-shape-closest-side-1-ref.html
 fuzzy-if(Android,8,771) == radial-shape-farthest-corner-1a.html radial-shape-farthest-corner-1-ref.html
 fails-if(gtkWidget&&/x86_64-/.test(xulRuntime.XPCOMABI)) fuzzy(1,1569) fuzzy-if(cocoaWidget,2,41281) fuzzy-if(Android,8,1091) fuzzy-if(skiaContent,2,500) == radial-shape-farthest-corner-1b.html radial-shape-farthest-corner-1-ref.html
-fuzzy-if(Android,8,771) fails-if(stylo) == radial-shape-farthest-corner-1c.html radial-shape-farthest-corner-1-ref.html
 fuzzy-if(Android,17,13320) == radial-shape-farthest-side-1a.html radial-shape-farthest-side-1-ref.html
 fuzzy-if(Android,17,13320) == radial-shape-farthest-side-1b.html radial-shape-farthest-side-1-ref.html
-fuzzy-if(Android,17,13320) fails-if(stylo) == radial-shape-farthest-side-1c.html radial-shape-farthest-side-1-ref.html
-fails-if(stylo) == radial-size-1a.html radial-size-1-ref.html
+== radial-size-1a.html radial-size-1-ref.html
 == radial-size-1b.html radial-size-1-ref.html
 fuzzy-if(Android,4,248) == radial-zero-length-1a.html radial-zero-length-1-ref.html
 fuzzy-if(Android,4,248) == radial-zero-length-1b.html radial-zero-length-1-ref.html
 fuzzy-if(Android,4,248) == radial-zero-length-1c.html radial-zero-length-1-ref.html
 fuzzy-if(Android,4,248) == radial-zero-length-1d.html radial-zero-length-1-ref.html
 fuzzy-if(Android,4,248) == radial-zero-length-1e.html radial-zero-length-1-ref.html
 fuzzy-if(Android,4,248) == radial-zero-length-1f.html radial-zero-length-1-ref.html
-fuzzy-if(Android,4,248) fails-if(stylo) == radial-zero-length-1g.html radial-zero-length-1-ref.html
-fuzzy-if(Android,4,248) fails-if(stylo) == radial-zero-length-1h.html radial-zero-length-1-ref.html
-fuzzy-if(Android,4,248) fails-if(stylo) == radial-zero-length-1i.html radial-zero-length-1-ref.html
-fuzzy-if(Android,4,248) fails-if(stylo) == radial-zero-length-1j.html radial-zero-length-1-ref.html
 == radial-premul.html radial-premul-ref.html
 == repeated-final-stop-1.html repeated-final-stop-1-ref.html
-fails-if(stylo) == repeating-linear-1a.html repeating-linear-1-ref.html
-fails-if(stylo) == repeating-linear-1b.html repeating-linear-1-ref.html
-fails-if(stylo) == repeating-linear-2a.html repeating-linear-2-ref.html
+== repeating-linear-1a.html repeating-linear-1-ref.html
+== repeating-linear-1b.html repeating-linear-1-ref.html
+== repeating-linear-2a.html repeating-linear-2-ref.html
 fuzzy-if(d2d,127,2612) == repeating-radial-1a.html repeating-radial-1-ref.html
 == repeating-radial-1b.html repeating-radial-1-ref.html
 fuzzy-if(d2d,127,2612) == repeating-radial-1c.html repeating-radial-1-ref.html
 == repeating-radial-1d.html repeating-radial-1-ref.html
-fuzzy-if(d2d,127,2612) fails-if(stylo) == repeating-radial-1e.html repeating-radial-1-ref.html
-fails-if(stylo) == repeating-radial-1f.html repeating-radial-1-ref.html
 == repeating-radial-2a.html repeating-radial-2-ref.html
 == repeating-radial-2b.html repeating-radial-2-ref.html
-fuzzy-if(skiaContent,18,600) fails-if(stylo) == twostops-1a.html twostops-1-ref.html
-fuzzy-if(skiaContent,18,600) fails-if(stylo) == twostops-1b.html twostops-1-ref.html
-fuzzy-if(skiaContent,226,600) fails-if(stylo) == twostops-1c.html twostops-1-ref.html
-fuzzy-if(skiaContent,141,300) fails-if(stylo) == twostops-1d.html twostops-1-ref.html
-fuzzy-if(skiaContent,73,900) fails-if(stylo) == twostops-1e.html twostops-1-ref.html
-fuzzy-if(skiaContent,18,600) == twostops-1f.html twostops-1-ref.html
-fuzzy-if(skiaContent,18,600) == twostops-1g.html twostops-1-ref.html
+fuzzy-if(skiaContent,18,600) == twostops-1a.html twostops-1-ref.html
+fuzzy-if(skiaContent,18,600) == twostops-1b.html twostops-1-ref.html
+fuzzy-if(skiaContent,226,600) == twostops-1c.html twostops-1-ref.html
+fuzzy-if(skiaContent,141,300) == twostops-1d.html twostops-1-ref.html
+fuzzy-if(skiaContent,73,900) == twostops-1e.html twostops-1-ref.html
 
 # from http://www.xanthir.com/:4bhipd by way of http://a-ja.net/newgrad.html
-fuzzy-if(!contentSameGfxBackendAsCanvas,3,20000) fuzzy-if(azureSkiaGL||skiaContent&&layersGPUAccelerated,8,20000) fails-if(stylo) == aja-linear-1a.html aja-linear-1-ref.html
-fails-if(!d2d&&!skiaContent) fails-if(stylo) == aja-linear-1b.html aja-linear-1-ref.html # bug 526694
+fuzzy-if(!contentSameGfxBackendAsCanvas,3,20000) fuzzy-if(azureSkiaGL||skiaContent&&layersGPUAccelerated,8,20000) == aja-linear-1a.html aja-linear-1-ref.html
+fails-if(!d2d&&!skiaContent) == aja-linear-1b.html aja-linear-1-ref.html # bug 526694
 fuzzy-if(!contentSameGfxBackendAsCanvas,3,20000) fuzzy-if(azureSkiaGL||skiaContent,8,20000) == aja-linear-1c.html aja-linear-1-ref.html 
 fuzzy-if(!contentSameGfxBackendAsCanvas,3,20000) fuzzy-if(azureSkiaGL||skiaContent,8,20000) == aja-linear-1d.html aja-linear-1-ref.html 
-fuzzy-if(!contentSameGfxBackendAsCanvas,3,20000) fuzzy-if(azureSkiaGL||skiaContent,8,20000) fails-if(stylo) == aja-linear-1e.html aja-linear-1-ref.html 
-fuzzy-if(!contentSameGfxBackendAsCanvas,3,20000) fuzzy-if(azureSkiaGL||skiaContent,8,20000) fails-if(stylo) == aja-linear-1f.html aja-linear-1-ref.html 
-fuzzy-if(!contentSameGfxBackendAsCanvas,3,20000) fuzzy-if(azureSkiaGL||skiaContent,8,20000) fails-if(stylo) == aja-linear-1g.html aja-linear-1-ref.html 
-fuzzy-if(!contentSameGfxBackendAsCanvas,2,20000) fuzzy-if(azureSkiaGL||skiaContent,8,20000) fails-if(stylo) == aja-linear-2a.html aja-linear-2-ref.html 
-fuzzy-if(!contentSameGfxBackendAsCanvas,2,20000) fuzzy-if(azureSkiaGL||skiaContent,8,20000) fails-if(stylo) == aja-linear-2b.html aja-linear-2-ref.html 
-fails-if(!stylo) == aja-linear-2c.html aja-linear-2-ref.html # bug 522607
-fails-if(!d2d&&!(skiaContent&&winWidget)) fuzzy-if(skiaContent&&!winWidget,1,200) fails-if(stylo) == aja-linear-2d.html aja-linear-2-ref.html # bug 526694
+fuzzy-if(!contentSameGfxBackendAsCanvas,3,20000) fuzzy-if(azureSkiaGL||skiaContent,8,20000) == aja-linear-1e.html aja-linear-1-ref.html 
+fuzzy-if(!contentSameGfxBackendAsCanvas,3,20000) fuzzy-if(azureSkiaGL||skiaContent,8,20000) == aja-linear-1f.html aja-linear-1-ref.html 
+fuzzy-if(!contentSameGfxBackendAsCanvas,2,20000) fuzzy-if(azureSkiaGL||skiaContent,8,20000) == aja-linear-2.html aja-linear-2-ref.html
 fuzzy-if(!contentSameGfxBackendAsCanvas,2,19999) fuzzy-if(azureSkiaGL||skiaContent,8,20000) == aja-linear-3a.html aja-linear-3-ref.html 
 fuzzy-if(!contentSameGfxBackendAsCanvas,2,19999) fuzzy-if(azureSkiaGL||skiaContent,8,20000) == aja-linear-3b.html aja-linear-3-ref.html 
-fuzzy-if(!contentSameGfxBackendAsCanvas,4,20000) fuzzy-if(azureSkiaGL||skiaContent,8,20000) fails-if(stylo) == aja-linear-4a.html aja-linear-4-ref.html 
-fuzzy-if(!contentSameGfxBackendAsCanvas,4,20000) fuzzy-if(azureSkiaGL||skiaContent,8,20000) fails-if(stylo) == aja-linear-4b.html aja-linear-4-ref.html 
-fuzzy-if(!contentSameGfxBackendAsCanvas,4,20000) fuzzy-if(azureSkiaGL||skiaContent,8,20000) fails-if(stylo) == aja-linear-5a.html aja-linear-5-ref.html 
-fuzzy-if(!contentSameGfxBackendAsCanvas,2,16500) fuzzy-if(azureSkiaGL||skiaContent,8,20000) fails-if(stylo) == aja-linear-6a.html aja-linear-6-ref.html # bug 526708 
-fails-if(!stylo) == aja-linear-6b.html aja-linear-6-ref.html # bug 522607
-fuzzy-if(Android,6,10576) fails-if(stylo) == height-dependence-1.html height-dependence-1-ref.html
-fuzzy-if(cocoaWidget,1,40000) fuzzy-if(Android,6,10576) fails-if(stylo) == height-dependence-2.html height-dependence-2-ref.html
-fuzzy-if(Android,6,10576) fails-if(stylo) == height-dependence-3.html height-dependence-3-ref.html
+fuzzy-if(!contentSameGfxBackendAsCanvas,4,20000) fuzzy-if(azureSkiaGL||skiaContent,8,20000) == aja-linear-4a.html aja-linear-4-ref.html 
+fuzzy-if(!contentSameGfxBackendAsCanvas,4,20000) fuzzy-if(azureSkiaGL||skiaContent,8,20000) == aja-linear-4b.html aja-linear-4-ref.html 
+fuzzy-if(!contentSameGfxBackendAsCanvas,4,20000) fuzzy-if(azureSkiaGL||skiaContent,8,20000) == aja-linear-5a.html aja-linear-5-ref.html 
+fuzzy-if(Android,6,10576) == height-dependence-1.html height-dependence-1-ref.html
+fuzzy-if(cocoaWidget,1,40000) fuzzy-if(Android,6,10576) == height-dependence-2.html height-dependence-2-ref.html
+fuzzy-if(Android,6,10576) == height-dependence-3.html height-dependence-3-ref.html
 
-fails-if(stylo) == linear-onestopposition-1.html linear-onestopposition-1-ref.html
-fuzzy-if(d2d,47,400) fails-if(stylo) == linear-onestopposition-1.html linear-onestopposition-1-ref2.html # d2d interpolates the hard stop
+== linear-onestopposition-1.html linear-onestopposition-1-ref.html
+fuzzy-if(d2d,47,400) == linear-onestopposition-1.html linear-onestopposition-1-ref2.html # d2d interpolates the hard stop
 == radial-onestopposition-1a.html radial-onestopposition-1-ref.html
 == radial-onestopposition-1b.html radial-onestopposition-1-ref.html
-fails-if(stylo) == radial-onestopposition-1c.html radial-onestopposition-1-ref.html
 == repeating-linear-onestopposition-1.html orange-square.html
 == repeating-radial-onestopposition-1a.html orange-square.html
 == repeating-radial-onestopposition-1b.html orange-square.html
-fails-if(stylo) == repeating-radial-onestopposition-1c.html orange-square.html
 == bug-916535-background-repeat-linear.html bug-916535-background-repeat-linear-ref.html
 fuzzy(1,800000) == large-gradient-1.html large-gradient-1-ref.html
 fuzzy-if(Android,4,1) == large-gradient-2.html large-gradient-2-ref.html # Bug 1182082
 fuzzy(1,800000) == large-gradient-3.html large-gradient-3-ref.html
 == large-gradient-4.html large-gradient-4-ref.html
 fuzzy(2,800000) == large-gradient-5.html large-gradient-5-ref.html
 == 1224761-1.html 1224761-1-ref.html
 
--- a/layout/reftests/css-gradients/repeated-final-stop-1-ref.html
+++ b/layout/reftests/css-gradients/repeated-final-stop-1-ref.html
@@ -1,18 +1,17 @@
 <!DOCTYPE HTML>
 <html>
 <head>
 <style>
 html {
   background: white;
 }
 div {
-  background: -moz-linear-gradient(left, 0 white, 100% orange);
-  background: linear-gradient(left, 0 white, 100% orange);
+  background: linear-gradient(to rigtht, 0 white, 100% orange);
   height: 100px;
   width: 50%;
 }
 </style>
 </head>
 <body>
 <div></div>
 </body>
--- a/layout/reftests/css-gradients/repeated-final-stop-1.html
+++ b/layout/reftests/css-gradients/repeated-final-stop-1.html
@@ -1,18 +1,17 @@
 <!DOCTYPE HTML>
 <html>
 <head>
 <style>
 html {
   background: white;
 }
 div {
-  background: -moz-linear-gradient(left, 0 white, 50% orange, 50% white);
-  background: linear-gradient(left, 0 white, 50% orange, 50% white);
+  background: linear-gradient(to rigtht, 0 white, 50% orange, 50% white);
   height: 100px;
 }
 </style>
 </head>
 <body>
 <div></div>
 </body>
 </html>
--- a/layout/reftests/css-gradients/repeating-linear-1a.html
+++ b/layout/reftests/css-gradients/repeating-linear-1a.html
@@ -1,1 +1,1 @@
-<div style="background: -moz-repeating-linear-gradient(black 0, black 50px, white 50px, white 100px); width: 400px; height: 400px;"></div>
+<div style="background: repeating-linear-gradient(black 0, black 50px, white 50px, white 100px); width: 400px; height: 400px;"></div>
--- a/layout/reftests/css-gradients/repeating-linear-1b.html
+++ b/layout/reftests/css-gradients/repeating-linear-1b.html
@@ -1,1 +1,1 @@
-<div style="background: -moz-repeating-linear-gradient(black 100px, black 150px, white 150px, white 200px); width: 400px; height: 400px;"></div>
+<div style="background: repeating-linear-gradient(black 100px, black 150px, white 150px, white 200px); width: 400px; height: 400px;"></div>
--- a/layout/reftests/css-gradients/repeating-linear-2a.html
+++ b/layout/reftests/css-gradients/repeating-linear-2a.html
@@ -1,1 +1,1 @@
-<div style="background: -moz-repeating-linear-gradient(red 20px, blue 20px); width: 300px; height: 300px;"></div>
+<div style="background: repeating-linear-gradient(red 20px, blue 20px); width: 300px; height: 300px;"></div>
deleted file mode 100644
--- a/layout/reftests/css-gradients/repeating-radial-1e.html
+++ /dev/null
@@ -1,1 +0,0 @@
-<div style="background: -moz-repeating-radial-gradient(closest-side, black 100px, black 150px, white 150px, white 200px); width: 400px; height: 400px;"></div>
deleted file mode 100644
--- a/layout/reftests/css-gradients/repeating-radial-1f.html
+++ /dev/null
@@ -1,4 +0,0 @@
-<!-- Test adjustment of negative stop positions in a repeating radial gradient.
-     We should still get a repeating pattern, i.e., the stops cannot
-     naively be mapped to 0. -->
-<div style="background: -moz-repeating-radial-gradient(closest-side, black -100px, black -50px, white -50px, white 0); width: 400px; height: 400px;"></div>
--- a/layout/reftests/css-gradients/repeating-radial-onestopposition-1a.html
+++ b/layout/reftests/css-gradients/repeating-radial-onestopposition-1a.html
@@ -1,10 +1,10 @@
 <!DOCTYPE HTML>
-<title>Test for -moz-repeating-radial-gradient() with all stops at the same position</title>
+<title>Test for repeating-radial-gradient() with all stops at the same position</title>
 <style>
 
 div {
   width: 200px;
   height: 200px;
   background-image: repeating-radial-gradient(closest-side, blue 25%, orange 25%);
 }
 
--- a/layout/reftests/css-gradients/repeating-radial-onestopposition-1b.html
+++ b/layout/reftests/css-gradients/repeating-radial-onestopposition-1b.html
@@ -1,10 +1,10 @@
 <!DOCTYPE HTML>
-<title>Test for -moz-repeating-radial-gradient() with all stops at the same position</title>
+<title>Test for repeating-radial-gradient() with all stops at the same position</title>
 <style>
 
 div {
   width: 200px;
   height: 200px;
   background-image: repeating-radial-gradient(50% 50% at 50% 50%, blue 25%, orange 25%);
 }
 
deleted file mode 100644
--- a/layout/reftests/css-gradients/repeating-radial-onestopposition-1c.html
+++ /dev/null
@@ -1,12 +0,0 @@
-<!DOCTYPE HTML>
-<title>Test for -moz-repeating-radial-gradient() with all stops at the same position</title>
-<style>
-
-div {
-  width: 200px;
-  height: 200px;
-  background-image: -moz-repeating-radial-gradient(contain, blue 25%, orange 25%);
-}
-
-</style>
-<div></div>
--- a/layout/reftests/css-gradients/twostops-1a.html
+++ b/layout/reftests/css-gradients/twostops-1a.html
@@ -1,1 +1,1 @@
-<div style="background: -moz-linear-gradient(top, #0000ff 50%, #ff0000 50%) no-repeat; width: 300px; height: 300px;"><br></div>
+<div style="background: linear-gradient(to bottom, #0000ff 50%, #ff0000 50%) no-repeat; width: 300px; height: 300px;"><br></div>
--- a/layout/reftests/css-gradients/twostops-1b.html
+++ b/layout/reftests/css-gradients/twostops-1b.html
@@ -1,1 +1,1 @@
-<div style="background: -moz-linear-gradient(bottom, #ff0000 50%, #0000ff 50%) no-repeat; width: 300px; height: 300px;"><br></div>
+<div style="background: linear-gradient(to top, #ff0000 50%, #0000ff 50%) no-repeat; width: 300px; height: 300px;"><br></div>
--- a/layout/reftests/css-gradients/twostops-1c.html
+++ b/layout/reftests/css-gradients/twostops-1c.html
@@ -1,1 +1,1 @@
-<div style="background: -moz-linear-gradient(yellow -50%, #0000ff 0, #0000ff 50%, #ff0000 50%) no-repeat; width: 300px; height: 300px;"><br></div>
+<div style="background: linear-gradient(yellow -50%, #0000ff 0, #0000ff 50%, #ff0000 50%) no-repeat; width: 300px; height: 300px;"><br></div>
--- a/layout/reftests/css-gradients/twostops-1d.html
+++ b/layout/reftests/css-gradients/twostops-1d.html
@@ -1,1 +1,1 @@
-<div style="background: -moz-linear-gradient(#0000ff 50%, #ff0000 50%, #ff0000 100%, yellow 150%) no-repeat; width: 300px; height: 300px;"><br></div>
+<div style="background: linear-gradient(#0000ff 50%, #ff0000 50%, #ff0000 100%, yellow 150%) no-repeat; width: 300px; height: 300px;"><br></div>
--- a/layout/reftests/css-gradients/twostops-1e.html
+++ b/layout/reftests/css-gradients/twostops-1e.html
@@ -1,1 +1,1 @@
-<div style="background: -moz-linear-gradient(yellow -50%, #0000ff 0, #0000ff 50%, #ff0000 50%, #ff0000 100%, yellow 150%) no-repeat; width: 300px; height: 300px;"><br></div>
+<div style="background: linear-gradient(yellow -50%, #0000ff 0, #0000ff 50%, #ff0000 50%, #ff0000 100%, yellow 150%) no-repeat; width: 300px; height: 300px;"><br></div>
deleted file mode 100644
--- a/layout/reftests/css-gradients/twostops-1f.html
+++ /dev/null
@@ -1,1 +0,0 @@
-<div style="background: linear-gradient(to bottom, #0000ff 50%, #ff0000 50%) no-repeat; width: 300px; height: 300px;"><br></div>
deleted file mode 100644
--- a/layout/reftests/css-gradients/twostops-1g.html
+++ /dev/null
@@ -1,1 +0,0 @@
-<div style="background: linear-gradient(to top, #ff0000 50%, #0000ff 50%) no-repeat; width: 300px; height: 300px;"><br></div>
--- a/layout/reftests/css-sizing/reftest.list
+++ b/layout/reftests/css-sizing/reftest.list
@@ -1,7 +1,7 @@
 == min-intrinsic-with-percents-across-img-cases.html min-intrinsic-with-percents-across-img-cases-ref.html
 == min-intrinsic-with-percents-across-elements.html min-intrinsic-with-percents-across-elements-ref.html
 skip-if(!webrender) pref(layers.advanced.border-layers,1) == min-intrinsic-with-percents-across-elements.html min-intrinsic-with-percents-across-elements-ref.html
-fails-if(stylo) == min-intrinsic-with-max-width-percents-across-form-controls.html min-intrinsic-with-max-width-percents-across-form-controls-ref.html
-skip-if(!webrender) pref(layers.advanced.border-layers,1) fails-if(stylo) == min-intrinsic-with-max-width-percents-across-form-controls.html min-intrinsic-with-max-width-percents-across-form-controls-ref.html
-fails-if(stylo) == min-intrinsic-with-width-percents-across-form-controls.html min-intrinsic-with-width-percents-across-form-controls-ref.html
-skip-if(!webrender) pref(layers.advanced.border-layers,1) fails-if(stylo) == min-intrinsic-with-width-percents-across-form-controls.html min-intrinsic-with-width-percents-across-form-controls-ref.html
+== min-intrinsic-with-max-width-percents-across-form-controls.html min-intrinsic-with-max-width-percents-across-form-controls-ref.html
+skip-if(!webrender) pref(layers.advanced.border-layers,1) == min-intrinsic-with-max-width-percents-across-form-controls.html min-intrinsic-with-max-width-percents-across-form-controls-ref.html
+== min-intrinsic-with-width-percents-across-form-controls.html min-intrinsic-with-width-percents-across-form-controls-ref.html
+skip-if(!webrender) pref(layers.advanced.border-layers,1) == min-intrinsic-with-width-percents-across-form-controls.html min-intrinsic-with-width-percents-across-form-controls-ref.html
--- a/layout/reftests/css-transitions/reftest.list
+++ b/layout/reftests/css-transitions/reftest.list
@@ -1,9 +1,9 @@
 == transitions-inline-already-wrapped-1.html transitions-inline-ref.html
 == transitions-inline-already-wrapped-2.html transitions-inline-ref.html
 == transitions-inline-rewrap-1.html transitions-inline-ref.html
 == transitions-inline-rewrap-2.html transitions-inline-ref.html
 == stacking-context-opacity-lose-to-animation.html stacking-context-transition-ref.html
 == stacking-context-transform-lose-to-animation.html stacking-context-transition-ref.html
 == stacking-context-opacity-wins-over-important-style.html stacking-context-transition-ref.html
 == stacking-context-transform-wins-over-important-style.html stacking-context-transition-ref.html
-skip-if(stylo) == transition-and-animation-with-different-durations.html transition-and-animation-with-different-durations-ref.html
+== transition-and-animation-with-different-durations.html transition-and-animation-with-different-durations-ref.html
--- a/layout/reftests/css-ui-invalid/input/reftest.list
+++ b/layout/reftests/css-ui-invalid/input/reftest.list
@@ -25,18 +25,18 @@ fuzzy-if(skiaContent,2,5) == input-type-
 fuzzy(64,4) == input-type-invalid.html input-ref.html
 == input-disabled-fieldset-1.html input-fieldset-ref.html
 fuzzy-if(skiaContent,1,3) == input-disabled-fieldset-2.html input-fieldset-ref.html
 fuzzy-if(skiaContent,1,3) == input-fieldset-legend.html input-fieldset-legend-ref.html
 == input-checkbox-required-invalid-changed.html success-ref.html
 == input-checkbox-required-invalid-default.html success-ref.html
 == input-radio-required-invalid-changed.html success-ref.html
 == input-radio-required-invalid-default.html success-ref.html
-fails-if(stylo) == input-file-required-invalid-changed.html input-file-ref.html
-fails-if(stylo) == input-file-required-invalid-default.html input-file-ref.html
+== input-file-required-invalid-changed.html input-file-ref.html
+== input-file-required-invalid-default.html input-file-ref.html
 == input-radio-required.html success-ref.html
 == input-radio-customerror.html success-ref.html
 == input-radio-dyn-valid-1.html success-ref.html
 == input-radio-dyn-valid-2.html success-ref.html
 == input-radio-nogroup-required-valid.html success-ref.html
 == input-radio-nogroup-required-invalid.html success-ref.html
 fuzzy-if(skiaContent,1,3) == input-novalidate.html input-ref.html
 # input type='hidden' shouldn't show
--- a/layout/reftests/css-ui-valid/input/reftest.list
+++ b/layout/reftests/css-ui-valid/input/reftest.list
@@ -24,18 +24,18 @@ fuzzy-if(skiaContent,1,3) == input-requi
 == input-pattern-invalid.html input-withtext-ref.html
 == input-type-barred.html input-button-ref.html
 fuzzy(64,4) == input-type-invalid.html input-ref.html
 == input-disabled-fieldset-1.html input-fieldset-ref.html
 fuzzy-if(skiaContent,1,3) == input-disabled-fieldset-2.html input-fieldset-ref.html
 fuzzy-if(skiaContent,1,3) == input-fieldset-legend.html input-fieldset-legend-ref.html
 == input-checkbox-valid-changed.html success-ref.html
 == input-checkbox-valid-default.html success-ref.html
-fails-if(stylo) == input-file-valid-changed.html input-file-ref.html
-fails-if(stylo) == input-file-valid-default.html input-file-ref.html
+== input-file-valid-changed.html input-file-ref.html
+== input-file-valid-default.html input-file-ref.html
 == input-radio-required.html success-ref.html
 == input-radio-customerror.html success-ref.html
 == input-radio-dyn-valid-1.html success-ref.html
 == input-radio-dyn-valid-2.html success-ref.html
 == input-radio-nogroup-required-valid.html success-ref.html
 == input-radio-nogroup-required-invalid.html success-ref.html
 fuzzy-if(skiaContent,1,3) == input-novalidate.html input-withtext-ref.html
 # input type='hidden' shouldn't show
--- a/layout/reftests/details-summary/reftest.list
+++ b/layout/reftests/details-summary/reftest.list
@@ -1,43 +1,43 @@
 # Basic <summary> handling
-fails-if(stylo) == multiple-summary.html single-summary.html
-fails-if(stylo) == open-multiple-summary.html open-multiple-summary-ref.html
-fails-if(stylo) == summary-not-first-child.html single-summary.html
-fails-if(stylo) == open-summary-not-first-child.html open-single-summary.html
+== multiple-summary.html single-summary.html
+== open-multiple-summary.html open-multiple-summary-ref.html
+== summary-not-first-child.html single-summary.html
+== open-summary-not-first-child.html open-single-summary.html
 == open-summary-block-style.html open-summary-block-style-ref.html
 == open-summary-inline-style.html open-summary-inline-style-ref.html
 == open-summary-table-cell-style.html open-summary-table-cell-style-ref.html
-fails-if(stylo) == no-summary.html no-summary-ref.html
-fails-if(stylo) == open-no-summary.html open-no-summary-ref.html
+== no-summary.html no-summary-ref.html
+== open-no-summary.html open-no-summary-ref.html
 == summary-not-in-details.html summary-not-in-details-ref.html
-fails-if(stylo) == summary-not-direct-child.html summary-not-direct-child-ref.html
+== summary-not-direct-child.html summary-not-direct-child-ref.html
 == float-in-summary.html float-in-summary-ref.html
 
 # Add elements dynamically
-fails-if(stylo) == dynamic-add-single-summary.html open-single-summary.html
-fails-if(stylo) == dynamic-add-summary-not-first-child.html open-single-summary.html
-fails-if(stylo) == dynamic-add-summary-and-paragraph.html open-single-summary.html
-fails-if(stylo) == dynamic-add-paragraph-before-summary.html open-single-summary.html
-fails-if(stylo) == dynamic-add-paragraph-before-summary-close.html single-summary.html
-fails-if(stylo) == dynamic-add-paragraph-after-summary.html open-single-summary.html
-fails-if(stylo) == dynamic-add-paragraph-after-summary-close.html single-summary.html
-fails-if(stylo) == dynamic-add-details.html open-single-summary.html
-fails-if(stylo) == dynamic-add-first-summary.html open-multiple-summary.html
-fails-if(stylo) == dynamic-add-second-summary.html open-multiple-summary.html
+== dynamic-add-single-summary.html open-single-summary.html
+== dynamic-add-summary-not-first-child.html open-single-summary.html
+== dynamic-add-summary-and-paragraph.html open-single-summary.html
+== dynamic-add-paragraph-before-summary.html open-single-summary.html
+== dynamic-add-paragraph-before-summary-close.html single-summary.html
+== dynamic-add-paragraph-after-summary.html open-single-summary.html
+== dynamic-add-paragraph-after-summary-close.html single-summary.html
+== dynamic-add-details.html open-single-summary.html
+== dynamic-add-first-summary.html open-multiple-summary.html
+== dynamic-add-second-summary.html open-multiple-summary.html
 
 # Remove elements dynamically
-fails-if(stylo) == dynamic-remove-single-summary.html open-no-summary.html
-fails-if(stylo) == dynamic-remove-summary-not-first-child.html open-no-summary.html
-fails-if(stylo) == dynamic-remove-first-summary.html open-single-summary.html
-fails-if(stylo) == dynamic-remove-second-summary.html open-single-summary.html
+== dynamic-remove-single-summary.html open-no-summary.html
+== dynamic-remove-summary-not-first-child.html open-no-summary.html
+== dynamic-remove-first-summary.html open-single-summary.html
+== dynamic-remove-second-summary.html open-single-summary.html
 
 # Toggle details by open attribute
-fails-if(stylo) == close-nested-details.html close-nested-details-ref.html
-fails-if(stylo) == open-nested-details.html open-nested-details-ref.html
+== close-nested-details.html close-nested-details-ref.html
+== open-nested-details.html open-nested-details-ref.html
 
 # With 'overflow' property
 == overflow-hidden-open-details.html overflow-hidden-open-details-ref.html
 == overflow-auto-open-details.html overflow-auto-open-details-ref.html
 == overflow-scroll-details.html overflow-scroll-details-ref.html
 
 # With pagination property
 == details-page-break-after-1.html details-two-pages.html
@@ -65,39 +65,39 @@ fails-if(stylo) == open-nested-details.h
 fails-if(stylo) == details-writing-mode.html details-writing-mode-ref.html
 == details-in-ol.html details-in-ol-ref.html
 == summary-three-columns.html summary-three-columns-ref.html
 fails-if(stylo) == details-first-line.html details-first-line-ref.html
 fails-if(stylo) == open-details-first-line-1.html open-details-first-line-ref.html
 fails-if(stylo) == open-details-first-line-2.html open-details-first-line-ref.html
 
 # Dispatch mouse click to summary
-fails-if(stylo) == mouse-click-single-summary.html open-single-summary.html
-fails-if(stylo) == mouse-click-twice-single-summary.html single-summary.html
-fails-if(stylo) == mouse-click-open-single-summary.html single-summary.html
-fails-if(stylo) == mouse-click-twice-open-single-summary.html open-single-summary.html
-fails-if(stylo) == mouse-click-open-second-summary.html open-multiple-summary.html
+== mouse-click-single-summary.html open-single-summary.html
+== mouse-click-twice-single-summary.html single-summary.html
+== mouse-click-open-single-summary.html single-summary.html
+== mouse-click-twice-open-single-summary.html open-single-summary.html
+== mouse-click-open-second-summary.html open-multiple-summary.html
 == mouse-click-overflow-hidden-details.html overflow-hidden-open-details.html
 == mouse-click-twice-overflow-hidden-details.html overflow-hidden-details.html
 fuzzy-if(gtkWidget,1,20) == mouse-click-overflow-auto-details.html overflow-auto-open-details.html #Bug 1294278
 == mouse-click-twice-overflow-auto-details.html overflow-auto-details.html
-fails-if(stylo) == mouse-click-display-none-details.html open-single-summary.html
-fails-if(stylo) == mouse-click-change-details-to-display-none.html open-single-summary.html
+== mouse-click-display-none-details.html open-single-summary.html
+== mouse-click-change-details-to-display-none.html open-single-summary.html
 == mouse-click-change-summary-to-display-none.html mouse-click-change-summary-to-display-none-ref.html
-fails-if(stylo) == mouse-click-move-summary-to-different-details.html mouse-click-move-summary-to-different-details-ref.html
+== mouse-click-move-summary-to-different-details.html mouse-click-move-summary-to-different-details-ref.html
 
 # Dispatch mouse click to out-of-flow details or summary
-fails-if(stylo) == mouse-click-fixed-summary.html open-fixed-summary.html
-fails-if(stylo) == mouse-click-twice-fixed-summary.html fixed-summary.html
-fails-if(stylo) == mouse-click-float-details.html open-float-details.html
-fuzzy(1,1) fails-if(stylo) == mouse-click-twice-float-details.html float-details.html # Bug 1316430
+== mouse-click-fixed-summary.html open-fixed-summary.html
+== mouse-click-twice-fixed-summary.html fixed-summary.html
+== mouse-click-float-details.html open-float-details.html
+fuzzy(1,1) == mouse-click-twice-float-details.html float-details.html # Bug 1316430
 
 # Dispatch keyboard event to summary
-fails-if(stylo) == key-enter-single-summary.html open-single-summary.html
-fails-if(stylo) == key-enter-open-second-summary.html open-multiple-summary.html
-fails-if(stylo) == key-enter-prevent-default.html single-summary.html
-fails-if(stylo) == key-space-single-summary.html open-single-summary.html
+== key-enter-single-summary.html open-single-summary.html
+== key-enter-open-second-summary.html open-multiple-summary.html
+== key-enter-prevent-default.html single-summary.html
+== key-space-single-summary.html open-single-summary.html
 
 # Generated content bits
-fails-if(stylo) == details-after.html single-summary.html
-fails-if(stylo) == details-before.html single-summary.html
-fails-if(stylo) == open-details-after.html open-single-summary.html
-fails-if(stylo) == open-details-before.html open-single-summary.html
+== details-after.html single-summary.html
+== details-before.html single-summary.html
+== open-details-after.html open-single-summary.html
+== open-details-before.html open-single-summary.html
--- a/layout/reftests/forms/input/color/reftest.list
+++ b/layout/reftests/forms/input/color/reftest.list
@@ -1,14 +1,14 @@
 # Simple test. Should fail on platforms where input type color isn't activated
 # yet. The missing platform is Android (bug 875750).
-fails-if(Android) fails-if(stylo) == input-color-1.html input-color-1-ref.html
+fails-if(Android) == input-color-1.html input-color-1-ref.html
 
 default-preferences pref(dom.forms.color,true)
 
 # Despite the "default-preferences" line above, Android is still
 # excluded from some style in forms.css, which makes the following tests fail.
-fails-if(Android) fails-if(stylo) == margin-padding-1.html margin-padding-1-ref.html
+fails-if(Android) == margin-padding-1.html margin-padding-1-ref.html
 == block-invalidate-1.html block-invalidate-1-ref.html
 == block-invalidate-2.html block-invalidate-2-ref.html
-fuzzy-if(gtkWidget,8,33) fuzzy-if(skiaContent,8,78) fails-if(Android) fails-if(stylo) == transformations-1.html transformations-1-ref.html
-pref(layout.css.moz-appearance.enabled,true) fails-if(Android) fails-if(stylo) == custom-style-1.html custom-style-1-ref.html
-fails-if(Android) fails-if(stylo) == custom-style-2.html custom-style-2-ref.html
+fuzzy-if(gtkWidget,8,33) fuzzy-if(skiaContent,8,78) fails-if(Android) == transformations-1.html transformations-1-ref.html
+pref(layout.css.moz-appearance.enabled,true) fails-if(Android) == custom-style-1.html custom-style-1-ref.html
+fails-if(Android) == custom-style-2.html custom-style-2-ref.html
--- a/layout/reftests/forms/input/file/reftest.list
+++ b/layout/reftests/forms/input/file/reftest.list
@@ -1,7 +1,7 @@
 fuzzy-if(webrender,1,34) fails-if(Android) == simple.html simple-ref.xul
 fuzzy-if(webrender,1,17) fails-if(Android) == rtl.html rtl-ref.xul
 fuzzy-if(webrender,1,34) fails-if(Android) == size.html simple-ref.xul
 fuzzy-if(webrender,1,10) fails-if(Android) == background.html background-ref.xul
-fails-if(Android) fails-if(stylo) == style.html style-ref.xul
+fails-if(Android) == style.html style-ref.xul
 != width-clip.html width-clip-ref.html
 fails-if(Android) == color-inherit.html color-inherit-ref.html
--- a/layout/reftests/forms/input/number/reftest.list
+++ b/layout/reftests/forms/input/number/reftest.list
@@ -37,17 +37,17 @@ pref(layout.css.moz-appearance.enabled,t
 
 # focus
 fuzzy-if(skiaContent,2,5) needs-focus skip-if(stylo) == focus-handling.html focus-handling-ref.html
 
 # select
 fuzzy-if(skiaContent,1,1) skip-if(stylo) == number-selected.html number-selected-ref.html
 
 # pseudo-elements not usable from content:
-fails-if(stylo) == number-pseudo-elements.html number-pseudo-elements-ref.html
+== number-pseudo-elements.html number-pseudo-elements-ref.html
 
 fails-if(stylo) == number-placeholder.html number-placeholder-ref.html
 
 # check that if the anonymous text control is reframed, we reframe the whole
 # number control (the fuzzy is for the top-right and bottom-left of the border
 # bevel which gets slightly different antialiasing after invalidation):
 fuzzy(128,4) == number-reframe-anon-text-field.html number-reframe-anon-text-field-ref.html
 
--- a/layout/reftests/forms/meter/default-style/style.css
+++ b/layout/reftests/forms/meter/default-style/style.css
@@ -1,54 +1,54 @@
 div.meter-element {
   display: inline-block;
   height: 1em;
   width: 5em;
   vertical-align: -0.2em;
 
-  background: -moz-linear-gradient(top, #e6e6e6, #e6e6e6, #eeeeee 20%, #cccccc 45%, #cccccc 55%);
+  background: linear-gradient(#e6e6e6, #e6e6e6, #eeeeee 20%, #cccccc 45%, #cccccc 55%);
 }
 
 div.meter-optimum {
   float: none ! important;
 
   height: 100%;
   /*
    * We can't apply the following style to the reference because it will have
    * underisable effectes:
    * width: 100%;
    */
 
   /* green. */
-  background: -moz-linear-gradient(top, #ad7, #ad7, #cea 20%, #7a3 45%, #7a3 55%);
+  background: linear-gradient(#ad7, #ad7, #cea 20%, #7a3 45%, #7a3 55%);
 }
 
 div.meter-sub-optimum {
   float: none ! important;
 
   height: 100%;
   /*
    * We can't apply the following style to the reference because it will have
    * underisable effectes:
    * width: 100%;
    */
 
   /* orange. */
-  background: -moz-linear-gradient(top, #fe7, #fe7, #ffc 20%, #db3 45%, #db3 55%);
+  background: linear-gradient(#fe7, #fe7, #ffc 20%, #db3 45%, #db3 55%);
 }
 
 div.meter-sub-sub-optimum {
   float: none ! important;
 
   height: 100%;
   /*
    * We can't apply the following style to the reference because it will have
    * underisable effectes:
    * width: 100%;
    */
 
   /* red. */
-  background: -moz-linear-gradient(top, #f77, #f77, #fcc 20%, #d44 45%, #d44 55%);
+  background: linear-gradient(#f77, #f77, #fcc 20%, #d44 45%, #d44 55%);
 }
 
 meter, meter::-moz-meter-bar, div.meter-element, div.meter-optimum, div.meter-sub-optimum, div.meter-sub-sub-optimum {
   -moz-appearance: none; appearance: none;
 }
--- a/layout/reftests/forms/reftest.list
+++ b/layout/reftests/forms/reftest.list
@@ -1,14 +1,14 @@
 fuzzy-if(skiaContent,1,10) fails-if(stylo) HTTP(..) == text-control-baseline-1.html text-control-baseline-1-ref.html
 fuzzy-if(cocoaWidget,16,64) fuzzy-if(Android,52,64) fuzzy-if(/^Windows\x20NT\x206\.1/.test(http.oscpu),104,224) fuzzy-if(/^Windows\x20NT\x206\.2/.test(http.oscpu),88,400) == display-block-baselines-1.html display-block-baselines-1-ref.html # anti-aliasing issues
 == display-block-baselines-2.html display-block-baselines-2-ref.html
 fails-if(stylo) == display-block-baselines-3.html display-block-baselines-3-ref.html
 fails-if(stylo) == display-block-baselines-4.html display-block-baselines-4-ref.html
-fuzzy-if(Android,4,8) fuzzy-if(skiaContent,7,2) fails-if(stylo) == display-block-baselines-5.html display-block-baselines-5-ref.html
+fuzzy-if(Android,4,8) fuzzy-if(skiaContent,7,2) == display-block-baselines-5.html display-block-baselines-5-ref.html
 
 # button element
 include button/reftest.list
 
 # legend element
 include legend/reftest.list
 
 # fieldset element
--- a/layout/reftests/image-element/element-paint-continuation-ref.html
+++ b/layout/reftests/image-element/element-paint-continuation-ref.html
@@ -11,15 +11,15 @@
   font-family: Ahem;
   src: url(../fonts/Ahem.ttf);
 }
 </style>
 <body style="line-height:1; font-family: Ahem; color: transparent;">
   <div style="width:100px; height:100px; border:10px solid black;">
     <div style="width:50px;">
       <span style="display:inline-block; width:25px; height:1px;"></span
-        ><span id="d" style="background:-moz-linear-gradient(right, yellow, yellow);"
+        ><span id="d" style="background:linear-gradient(to left, yellow, yellow);"
         ><span style="display:inline-block; width:25px; height:1px;"></span>
       AA</span>
     </div>
   </div>
 </body>
 </html>
--- a/layout/reftests/image-element/element-paint-multiple-backgrounds-01-ref.html
+++ b/layout/reftests/image-element/element-paint-multiple-backgrounds-01-ref.html
@@ -6,18 +6,18 @@
 <!DOCTYPE html>
 <html>
 <head>
 <style>
 
 #box {
   height: 100px;
   width: 200px;
-  background: -moz-linear-gradient(lime,lime) top left no-repeat,
-              -moz-linear-gradient(green,green) top right no-repeat red;
+  background: linear-gradient(lime,lime) top left no-repeat,
+              linear-gradient(green,green) top right no-repeat red;
   background-size: 100px 100px;
 }
 
 div > div {
   width: 100px;
   height: 100px;
 }
 
--- a/layout/reftests/image-element/gradient-html-06b.html
+++ b/layout/reftests/image-element/gradient-html-06b.html
@@ -2,12 +2,12 @@
      Any copyright is dedicated to the Public Domain.
      http://creativecommons.org/licenses/publicdomain/
      Test whether SVG gradients as -moz-element render the same as
      CSS gradients.
 -->
 <!DOCTYPE html>
 <html>
 <body style="margin:0">
-  <div style="width:300px; height:300px; background-image:-moz-linear-gradient(lime, black)"></div>
+  <div style="width:300px; height:300px; background-image:linear-gradient(lime, black)"></div>
 </body>
 </html>
 
--- a/layout/reftests/image/reftest.list
+++ b/layout/reftests/image/reftest.list
@@ -8,20 +8,20 @@ fuzzy-if(Android,255,154) == image-seam-
 == invalid-url-image-1.html invalid-url-image-1-ref.html
 == sync-image-switch-1a.html sync-image-switch-1-ref.html
 == sync-image-switch-1b.html sync-image-switch-1-ref.html
 == sync-image-switch-1c.html sync-image-switch-1-ref.html
 == sync-image-switch-1d.html sync-image-switch-1-ref.html
 
 # Tests for "object-fit" & "object-position"
 == image-object-fit-dyn-1.html image-object-fit-dyn-1-ref.html
-fails-if(stylo) == image-object-fit-with-background-1.html image-object-fit-with-background-1-ref.html
+== image-object-fit-with-background-1.html image-object-fit-with-background-1-ref.html
 == image-object-fit-with-background-2.html image-object-fit-with-background-2-ref.html
 == image-object-position-dyn-1.html image-object-position-dyn-1-ref.html
-fails-if(stylo) == image-object-position-with-background-1.html image-object-position-with-background-1-ref.html
+== image-object-position-with-background-1.html image-object-position-with-background-1-ref.html
 fuzzy-if(winWidget,117,374) == image-object-position-with-background-2.html image-object-position-with-background-2-ref.html  # Bug 1128229
 
 # Tests for image-orientation used with 'from-image' (note that all
 # image-orientation tests are fuzzy because the JPEG images do not perfectly
 # reproduce blocks of solid color, even at maximum quality):
 fuzzy(2,5) == image-orientation-from-image.html?none     image-orientation-ref.html?0
 fuzzy(1,1) == image-orientation-from-image.html?0        image-orientation-ref.html?0
 fuzzy(1,1) == image-orientation-from-image.html?90       image-orientation-ref.html?90
--- a/layout/reftests/layers/component-alpha-exit-1-ref.html
+++ b/layout/reftests/layers/component-alpha-exit-1-ref.html
@@ -9,17 +9,17 @@ document.addEventListener("MozReftestInv
 });
 </script>
 <style>
 #scrollbox {
   margin: 20px;
   width: 300px;
   height: 400px;
   overflow-y: hidden;
-  background: -moz-linear-gradient(#FFF, #FFF);
+  background: linear-gradient(#FFF, #FFF);
 }
 
 #inner {
   background-color: #000;
   padding-bottom: 415px;
 }
 </style>
 
--- a/layout/reftests/layers/component-alpha-exit-1.html
+++ b/layout/reftests/layers/component-alpha-exit-1.html
@@ -12,17 +12,17 @@ document.addEventListener("MozReftestInv
 });
 </script>
 <style>
 #scrollbox {
   margin: 20px;
   width: 300px;
   height: 400px;
   overflow-y: hidden;
-  background: -moz-linear-gradient(#FFF, #FFF);
+  background: linear-gradient(#FFF, #FFF);
 }
 
 #inner {
   background-color: #000;
   margin-top: 10px;
   height: 5px;
   line-height: 5px;
   padding-bottom: 400px;
--- a/layout/reftests/native-theme/checkbox-dynamic-1-ref.html
+++ b/layout/reftests/native-theme/checkbox-dynamic-1-ref.html
@@ -1,17 +1,17 @@
 <!DOCTYPE html>
 <html>
 <head>
   <style>
     #checkbox {
        position: absolute;
        left: 0px;
        top: 0px;
-       background: -moz-linear-gradient(left, white, brown);
+       background: linear-gradient(to right, white, brown);
     }
   </style>
 </head>
 <body>
   <div id="checkbox">
     <input type="checkbox">
   </div>
 </body>
--- a/layout/reftests/native-theme/checkbox-dynamic-1.html
+++ b/layout/reftests/native-theme/checkbox-dynamic-1.html
@@ -1,17 +1,17 @@
 <!DOCTYPE html>
 <html class="reftest-wait">
 <head>
   <style>
     #checkbox {
        position: absolute;
        left: 0px;
        top: 0px;
-       background: -moz-linear-gradient(left, white, brown);
+       background: linear-gradient(to right, white, brown);
     }
     #toremove {
        position: absolute;
        left: 0px;
        top: 0px;
        width: 100px;
        height: 0px;
        background: black;
--- a/layout/reftests/native-theme/reftest.list
+++ b/layout/reftests/native-theme/reftest.list
@@ -66,17 +66,17 @@ skip-if(gtkWidget) != resizer-bottomstar
 skip-if(gtkWidget) random-if(d2d) == resizer-bottomstart-rtl.xul resizer-bottomend.xul
 
 # Windows-only, depends on native scrollbar metrics
 skip-if(!winWidget) == scroll-thumb-minimum-size-notheme.html scroll-thumb-minimum-size-notheme-ref.html
 # skip-if(!winWidget) == scroll-thumb-minimum-size-theme.html scroll-thumb-minimum-size-theme-ref.html # Bug 512206
 
 == border-radius.html border-radius-ref.html
 
-fails-if(stylo) == checkbox-dynamic-1.html checkbox-dynamic-1-ref.html
+== checkbox-dynamic-1.html checkbox-dynamic-1-ref.html
 
 # These tests have been written to test the overflow of the window widget
 # (bug 568825) but we can't test it on Windows and Cocoa because they have
 # animated progress bars.
 # Nothing shows up on Android, presumably because that appearance type is
 # not implemented.
 pref(layout.css.moz-appearance.enabled,true) pref(layout.css.appearance.enabled,true) skip-if(cocoaWidget) skip-if(winWidget) == progress-overflow.html progress-overflow-ref.html
 pref(layout.css.moz-appearance.enabled,true) pref(layout.css.appearance.enabled,true) fails-if(Android) skip-if(cocoaWidget) skip-if(winWidget) != progress-overflow-small.html progress-nobar.html
--- a/layout/reftests/scrolling/opacity-mixed-scrolling-2.html
+++ b/layout/reftests/scrolling/opacity-mixed-scrolling-2.html
@@ -1,26 +1,26 @@
 <!DOCTYPE HTML>
 <html>
 <style>
 #scrollbox {
   margin: 20px;
   width: 300px;
   height: 400px;
   overflow-y: auto;
-  background: -moz-linear-gradient(#444, #555);
+  background: linear-gradient(#444, #555);
 }
 .opacityBox {
   opacity: 0.999;
   border: 1px solid black;
   margin: 20px;
   padding: 20px;
 }
 #inner {
-  background-image: -moz-linear-gradient(white, rgba(255,255,255,0));
+  background-image: linear-gradient(white, rgba(255,255,255,0));
 }
 </style>
 
 <div id="scrollbox" class="scrollTop">
   <div id="inner">
     outside
     <div class="opacityBox">in opacity box</div>
     outside
--- a/layout/reftests/scrolling/reftest.list
+++ b/layout/reftests/scrolling/reftest.list
@@ -4,17 +4,17 @@ HTTP == fixed-1.html fixed-1.html?ref
 fuzzy-if(skiaContent,1,32200) HTTP == fixed-table-1.html fixed-table-1.html?ref
 HTTP == fixed-opacity-1.html fixed-opacity-1.html?ref
 HTTP == fixed-opacity-2.html fixed-opacity-2.html?ref
 random-if(gtkWidget) fuzzy-if(Android,3,60) HTTP == fixed-text-1.html fixed-text-1.html?ref
 HTTP == fixed-text-2.html fixed-text-2.html?ref
 random-if(Android) fuzzy-if(/^Windows\x20NT\x2010\.0/.test(http.oscpu),1,12) == iframe-border-radius.html iframe-border-radius-ref.html # bug 760269
 random-if(Android) HTTP == image-1.html image-1.html?ref
 random-if(Android) HTTP == opacity-mixed-scrolling-1.html opacity-mixed-scrolling-1.html?ref # bug 760269
-random-if(cocoaWidget) fails-if(stylo) HTTP == opacity-mixed-scrolling-2.html opacity-mixed-scrolling-2.html?ref # see bug 625357
+random-if(cocoaWidget) HTTP == opacity-mixed-scrolling-2.html opacity-mixed-scrolling-2.html?ref # see bug 625357
 skip-if(Android) pref(layout.css.scroll-behavior.enabled,true) pref(layout.css.scroll-behavior.property-enabled,true) == scroll-behavior-1.html scroll-behavior-1.html?ref # see bug 1041833
 skip-if(Android) pref(layout.css.scroll-behavior.enabled,true) pref(layout.css.scroll-behavior.property-enabled,true) == scroll-behavior-2.html scroll-behavior-2.html?ref # see bug 1041833
 skip-if(Android) pref(layout.css.scroll-behavior.enabled,true) pref(layout.css.scroll-behavior.property-enabled,true) == scroll-behavior-3.html scroll-behavior-3.html?ref # see bug 1041833
 skip-if(Android) pref(layout.css.scroll-behavior.enabled,true) pref(layout.css.scroll-behavior.property-enabled,true) == scroll-behavior-4.html scroll-behavior-4.html?ref # see bug 1041833
 skip-if(Android) pref(layout.css.scroll-behavior.enabled,true) pref(layout.css.scroll-behavior.property-enabled,true) == scroll-behavior-5.html scroll-behavior-5.html?ref # see bug 1041833
 skip-if(Android) pref(layout.css.scroll-behavior.enabled,true) pref(layout.css.scroll-behavior.property-enabled,true) == scroll-behavior-6.html scroll-behavior-6.html?ref # see bug 1041833
 skip-if(Android) pref(layout.css.scroll-behavior.enabled,true) pref(layout.css.scroll-behavior.property-enabled,true) == scroll-behavior-7.html scroll-behavior-7.html?ref # see bug 1041833
 skip-if(Android) pref(layout.css.scroll-behavior.enabled,true) pref(layout.css.scroll-behavior.property-enabled,true) == scroll-behavior-8.html scroll-behavior-8.html?ref # see bug 1041833
--- a/layout/reftests/transform/601894-1.html
+++ b/layout/reftests/transform/601894-1.html
@@ -1,11 +1,11 @@
 <!DOCTYPE html>
 <html>
-  <body style="background: -moz-linear-gradient(lime, lime) fixed; overflow: hidden;">
+  <body style="background: linear-gradient(lime, lime) fixed; overflow: hidden;">
     <div style="position: absolute; left: 21.0138px; top: 507.24px; z-index: 17567; -moz-transform: scale(8);">
       <div style="height: 128px; left: -64px; position: absolute; top: -64px; visibility: visible; width: 128px;"></div>
     </div>
     <div style="position: absolute; left: 640.572px; top: 386.574px; -moz-transform: scale(1); z-index: -157863;">
       <div style="position: absolute; top: -64px; left: -64px; width: 128px; height: 128px; visibility: visible;"></div>
     </div>
     <div style="position: absolute; left: 568.346px; top: 582.669px; -moz-transform: scale(1); z-index: -62592;">
       <div style="position: absolute; top: -64px; left: -64px; width: 128px; height: 128px; visibility: visible;"></div>
--- a/layout/reftests/transform/601894-2.html
+++ b/layout/reftests/transform/601894-2.html
@@ -1,8 +1,8 @@
 <!DOCTYPE html>
 <html>
-  <body style="background: -moz-linear-gradient(lime, lime) fixed;">
+  <body style="background: linear-gradient(lime, lime) fixed;">
     <div style="position: absolute; left: 0; top: 0; -moz-transform: scale(1)">
       <div style="position: absolute; width: 200px; height: 200px;"></div>
     </div>
   </body>
 </html>
--- a/layout/reftests/transform/reftest.list
+++ b/layout/reftests/transform/reftest.list
@@ -109,18 +109,18 @@ fuzzy-if(skiaContent,2,5) == stresstest-
 == scale-1b.html scale-1-ref.html
 == scale-percent-1.html scale-percent-1-ref.html
 # Some simple checks that it obeys selector operations
 == descendant-1.html descendant-1-ref.html
 == propagate-inherit-boolean.html propagate-inherit-boolean-ref.html
 # Ensure you can't move outside an iframe
 == iframe-1.html iframe-1-ref.html
 # Bugs
-fails-if(stylo) == 601894-1.html 601894-ref.html
-fails-if(stylo) == 601894-2.html 601894-ref.html
+== 601894-1.html 601894-ref.html
+== 601894-2.html 601894-ref.html
 == 830299-1.html 830299-1-ref.html
 # Bug 722777
 == table-1a.html table-1-ref.html
 == table-1b.html table-1-ref.html
 == table-1c.html table-1-ref.html
 == table-2a.html table-2-ref.html
 == table-2b.html table-2-ref.html
 # Bug 722463
--- a/layout/reftests/w3c-css/submitted/images3/reftest.list
+++ b/layout/reftests/w3c-css/submitted/images3/reftest.list
@@ -1,191 +1,191 @@
 # Tests for 'object-fit' / 'o