Merge m-c to inbound. a=merge
authorRyan VanderMeulen <ryanvm@gmail.com>
Tue, 30 May 2017 20:47:18 -0400
changeset 409585 77d2dd511cf91661f82d944349657b2e25f30fdc
parent 409584 062af1485e68ad1ea7b6fd455ced9195c3fee66f (current diff)
parent 409524 9a5c710587f9e64bf044602d5e988b152ef4f40c (diff)
child 409586 7b3e7c43611ba7c586eacfd00af7dce905f97b92
push id7391
push usermtabara@mozilla.com
push dateMon, 12 Jun 2017 13:08:53 +0000
treeherdermozilla-beta@2191d7f87e2e [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 m-c to inbound. a=merge
browser/config/mozconfigs/linux32/debug-qr
browser/config/mozconfigs/linux32/opt-qr
browser/config/mozconfigs/linux64/debug-qr
browser/config/mozconfigs/linux64/opt-qr
browser/config/mozconfigs/macosx64/debug-qr
browser/config/mozconfigs/macosx64/opt-qr
browser/config/mozconfigs/win32/debug-qr
browser/config/mozconfigs/win32/opt-qr
browser/config/mozconfigs/win64/debug-qr
browser/config/mozconfigs/win64/opt-qr
browser/extensions/screenshots/webextension/buildSettings.js.template
browser/extensions/screenshots/webextension/icons/icon-128.png
browser/extensions/screenshots/webextension/icons/icon-16.png
browser/extensions/screenshots/webextension/icons/icon-19.png
browser/extensions/screenshots/webextension/icons/icon-256.png
browser/extensions/screenshots/webextension/icons/icon-32.png
browser/extensions/screenshots/webextension/icons/icon-38.png
browser/extensions/screenshots/webextension/icons/icon-48.png
browser/extensions/screenshots/webextension/icons/icon-64.png
browser/locales/searchplugins/dunaj-sk.xml
servo/etc/ci/servo-binary-formula.rb.in
testing/mozharness/configs/builds/releng_sub_linux_configs/32_qr_debug.py
testing/mozharness/configs/builds/releng_sub_linux_configs/32_qr_opt.py
testing/mozharness/configs/builds/releng_sub_linux_configs/64_qr_debug.py
testing/mozharness/configs/builds/releng_sub_linux_configs/64_qr_opt.py
testing/mozharness/configs/builds/releng_sub_mac_configs/64_cross_qr_debug.py
testing/mozharness/configs/builds/releng_sub_mac_configs/64_cross_qr_opt.py
testing/mozharness/configs/builds/taskcluster_firefox_win32_qr_debug.py
testing/mozharness/configs/builds/taskcluster_firefox_win32_qr_opt.py
testing/mozharness/configs/builds/taskcluster_firefox_win64_qr_debug.py
testing/mozharness/configs/builds/taskcluster_firefox_win64_qr_opt.py
toolkit/components/telemetry/Histograms.json
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -2240,16 +2240,23 @@ function openLocation() {
       // If there are no open browser windows, open a new one
       window.openDialog("chrome://browser/content/", "_blank",
                         "chrome,all,dialog=no", BROWSER_NEW_TAB_URL);
     }
   }
 }
 
 function BrowserOpenTab(event) {
+  // A notification intended to be useful for modular peformance tracking
+  // starting as close as is reasonably possible to the time when the user
+  // expressed the intent to open a new tab.  Since there are a lot of
+  // entry points, this won't catch every single tab created, but most
+  // initiated by the user should go through here.
+  Services.obs.notifyObservers(null, "browser-open-newtab-start");
+
   let where = "tab";
   let relatedToCurrent = false;
 
   if (event) {
     where = whereToOpenLink(event, false, true);
 
     switch (where) {
       case "tab":
--- a/browser/base/content/test/tabs/browser.ini
+++ b/browser/base/content/test/tabs/browser.ini
@@ -13,8 +13,9 @@ skip-if = !e10s # Tab spinner is e10s on
 skip-if = os == 'mac'
 [browser_navigatePinnedTab.js]
 [browser_new_web_tab_in_file_process_pref.js]
 skip-if = !e10s # Pref and test only relevant for e10s.
 [browser_opened_file_tab_navigated_to_web.js]
 [browser_reload_deleted_file.js]
 [browser_tabswitch_updatecommands.js]
 [browser_viewsource_of_data_URI_in_file_process.js]
+[browser_open_newtab_start_observer_notification.js]
new file mode 100644
--- /dev/null
+++ b/browser/base/content/test/tabs/browser_open_newtab_start_observer_notification.js
@@ -0,0 +1,22 @@
+"use strict";
+
+add_task(async function test_browser_open_newtab_start_observer_notification() {
+
+  let observerFiredPromise = new Promise(resolve => {
+    function observe() {
+      resolve();
+    }
+    Services.obs.addObserver(observe, "browser-open-newtab-start");
+  });
+
+  // We're calling BrowserOpenTab() (rather the using BrowserTestUtils
+  // because we want to be sure that it triggers the event to fire, since
+  // it's very close to where various user-actions are triggered.
+  BrowserOpenTab();
+  await observerFiredPromise;
+  const tab = gBrowser.selectedTab;
+
+  ok(true, "browser-open-newtab-start observer not called");
+
+  await BrowserTestUtils.removeTab(tab);
+});
--- a/browser/components/controlcenter/content/panel.inc.xul
+++ b/browser/components/controlcenter/content/panel.inc.xul
@@ -52,26 +52,26 @@
                 oncommand="gIdentityHandler.toggleSubView('security', this)"/>
       </hbox>
 
       <!-- Tracking Protection Section -->
       <hbox id="tracking-protection-container"
             class="identity-popup-section"
             when-connection="not-secure secure secure-ev secure-cert-user-overridden file">
         <vbox id="tracking-protection-content" flex="1">
-          <description class="identity-popup-headline"
-                       crop="end"
-                       value="&trackingProtection.title;" />
+          <label class="identity-popup-headline"
+                 crop="end"
+                 value="&trackingProtection.title;" />
 
-          <label id="tracking-blocked"
-                 crop="end">&trackingProtection.detectedBlocked3;</label>
-          <label id="tracking-loaded"
-                 crop="end">&trackingProtection.detectedNotBlocked3;</label>
-          <label id="tracking-not-detected"
-                 crop="end">&trackingProtection.notDetected3;</label>
+          <description id="tracking-blocked"
+                       crop="end">&trackingProtection.detectedBlocked3;</description>
+          <description id="tracking-loaded"
+                       crop="end">&trackingProtection.detectedNotBlocked3;</description>
+          <description id="tracking-not-detected"
+                       crop="end">&trackingProtection.notDetected3;</description>
 
           <button id="tracking-action-unblock"
                   label="&trackingProtection.unblock.label;"
                   accesskey="&trackingProtection.unblock.accesskey;"
                   oncommand="TrackingProtection.disableForCurrentPage();" />
           <button id="tracking-action-unblock-private"
                   label="&trackingProtection.unblockPrivate.label;"
                   accesskey="&trackingProtection.unblockPrivate.accesskey;"
deleted file mode 100644
--- a/browser/config/mozconfigs/linux32/debug-qr
+++ /dev/null
@@ -1,3 +0,0 @@
-. "$topsrcdir/browser/config/mozconfigs/linux32/debug"
-
-ac_add_options --enable-webrender
deleted file mode 100644
--- a/browser/config/mozconfigs/linux32/opt-qr
+++ /dev/null
@@ -1,3 +0,0 @@
-. "$topsrcdir/browser/config/mozconfigs/linux32/nightly"
-
-ac_add_options --enable-webrender
deleted file mode 100644
--- a/browser/config/mozconfigs/linux64/debug-qr
+++ /dev/null
@@ -1,3 +0,0 @@
-. "$topsrcdir/browser/config/mozconfigs/linux64/debug"
-
-ac_add_options --enable-webrender
new file mode 100644
--- /dev/null
+++ b/browser/config/mozconfigs/linux64/nightly-fuzzing-asan
@@ -0,0 +1,22 @@
+# We still need to build with debug symbols
+ac_add_options --disable-debug
+ac_add_options --enable-optimize="-O2 -gline-tables-only"
+
+# ASan specific options on Linux
+ac_add_options --enable-valgrind
+
+. $topsrcdir/build/unix/mozconfig.fuzzing
+
+ac_add_options --enable-fuzzing
+ac_add_options --disable-stdcxx-compat
+
+export PKG_CONFIG_LIBDIR=/usr/lib64/pkgconfig:/usr/share/pkgconfig
+. $topsrcdir/build/unix/mozconfig.gtk
+
+# Package js shell.
+export MOZ_PACKAGE_JSSHELL=1
+
+# Need this to prevent name conflicts with the normal nightly build packages
+export MOZ_PKG_SPECIAL=asan
+
+. "$topsrcdir/build/mozconfig.common.override"
deleted file mode 100644
--- a/browser/config/mozconfigs/linux64/opt-qr
+++ /dev/null
@@ -1,3 +0,0 @@
-. "$topsrcdir/browser/config/mozconfigs/linux64/nightly"
-
-ac_add_options --enable-webrender
deleted file mode 100644
--- a/browser/config/mozconfigs/macosx64/debug-qr
+++ /dev/null
@@ -1,3 +0,0 @@
-. "$topsrcdir/browser/config/mozconfigs/macosx64/debug"
-
-ac_add_options --enable-webrender
deleted file mode 100644
--- a/browser/config/mozconfigs/macosx64/opt-qr
+++ /dev/null
@@ -1,3 +0,0 @@
-. "$topsrcdir/browser/config/mozconfigs/macosx64/nightly"
-
-ac_add_options --enable-webrender
deleted file mode 100644
--- a/browser/config/mozconfigs/win32/debug-qr
+++ /dev/null
@@ -1,3 +0,0 @@
-. "$topsrcdir/browser/config/mozconfigs/win32/debug"
-
-ac_add_options --enable-webrender
deleted file mode 100644
--- a/browser/config/mozconfigs/win32/opt-qr
+++ /dev/null
@@ -1,3 +0,0 @@
-. "$topsrcdir/browser/config/mozconfigs/win32/nightly"
-
-ac_add_options --enable-webrender
deleted file mode 100644
--- a/browser/config/mozconfigs/win64/debug-qr
+++ /dev/null
@@ -1,3 +0,0 @@
-. "$topsrcdir/browser/config/mozconfigs/win64/debug"
-
-ac_add_options --enable-webrender
deleted file mode 100644
--- a/browser/config/mozconfigs/win64/opt-qr
+++ /dev/null
@@ -1,3 +0,0 @@
-. "$topsrcdir/browser/config/mozconfigs/win64/nightly"
-
-ac_add_options --enable-webrender
--- a/browser/extensions/screenshots/bootstrap.js
+++ b/browser/extensions/screenshots/bootstrap.js
@@ -1,11 +1,8 @@
-/* globals AddonManager, Components, LegacyExtensionsUtils, Services,
-   XPCOMUtils */
-
 const OLD_ADDON_PREF_NAME = "extensions.jid1-NeEaf3sAHdKHPA@jetpack.deviceIdInfo";
 const OLD_ADDON_ID = "jid1-NeEaf3sAHdKHPA@jetpack";
 const ADDON_ID = "screenshots@mozilla.org";
 const TELEMETRY_ENABLED_PREF = "datareporting.healthreport.uploadEnabled";
 const PREF_BRANCH = "extensions.screenshots.";
 const USER_DISABLE_PREF = "extensions.screenshots.disabled";
 const SYSTEM_DISABLE_PREF = "extensions.screenshots.system-disabled";
 
@@ -41,18 +38,38 @@ const prefObserver = {
     // aData is the name of the pref that's been changed (relative to aSubject)
     if (aData == USER_DISABLE_PREF || aData == SYSTEM_DISABLE_PREF) {
       // eslint-disable-next-line promise/catch-or-return
       appStartupPromise.then(handleStartup);
     }
   }
 };
 
+const appStartupObserver = {
+  register() {
+    Services.obs.addObserver(this, "sessionstore-windows-restored", false); // eslint-disable-line mozilla/no-useless-parameters
+  },
+
+  unregister() {
+    Services.obs.removeObserver(this, "sessionstore-windows-restored", false); // eslint-disable-line mozilla/no-useless-parameters
+  },
+
+  observe() {
+    appStartupDone();
+    this.unregister();
+  }
+}
+
+const APP_STARTUP = 1;
 function startup(data, reason) { // eslint-disable-line no-unused-vars
-  appStartupDone();
+  if (reason === APP_STARTUP) {
+    appStartupObserver.register();
+  } else {
+    appStartupDone();
+  }
   prefObserver.register();
   addonResourceURI = data.resourceURI;
   // eslint-disable-next-line promise/catch-or-return
   appStartupPromise.then(handleStartup);
 }
 
 function shutdown(data, reason) { // eslint-disable-line no-unused-vars
   prefObserver.unregister();
--- a/browser/extensions/screenshots/install.rdf
+++ b/browser/extensions/screenshots/install.rdf
@@ -7,14 +7,14 @@
     <em:targetApplication>
       <Description>
         <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id> <!--Firefox-->
         <em:minVersion>51.0a1</em:minVersion>
         <em:maxVersion>*</em:maxVersion>
       </Description>
     </em:targetApplication>
     <em:type>2</em:type>
-    <em:version>6.6.0</em:version>
+    <em:version>8.1.0</em:version>
     <em:bootstrap>true</em:bootstrap>
     <em:homepageURL>https://pageshot.net/</em:homepageURL>
     <em:multiprocessCompatible>true</em:multiprocessCompatible>
   </Description>
 </RDF>
--- a/browser/extensions/screenshots/moz.build
+++ b/browser/extensions/screenshots/moz.build
@@ -9,17 +9,16 @@ FINAL_TARGET_FILES.features['screenshots
   'install.rdf'
 ]
 
 # This file list is automatically generated by Screenshots' export scripts.
 # AUTOMATIC INSERTION START
 FINAL_TARGET_FILES.features['screenshots@mozilla.org']["webextension"] += [
   'webextension/assertIsTrusted.js',
   'webextension/blank.html',
-  'webextension/buildSettings.js.template',
   'webextension/catcher.js',
   'webextension/clipboard.js',
   'webextension/domainFromUrl.js',
   'webextension/log.js',
   'webextension/makeUuid.js',
   'webextension/manifest.json',
   'webextension/randomString.js',
   'webextension/sitehelper.js'
@@ -48,16 +47,20 @@ FINAL_TARGET_FILES.features['screenshots
 FINAL_TARGET_FILES.features['screenshots@mozilla.org']["webextension"]["_locales"]["cs"] += [
   'webextension/_locales/cs/messages.json'
 ]
 
 FINAL_TARGET_FILES.features['screenshots@mozilla.org']["webextension"]["_locales"]["cy"] += [
   'webextension/_locales/cy/messages.json'
 ]
 
+FINAL_TARGET_FILES.features['screenshots@mozilla.org']["webextension"]["_locales"]["da"] += [
+  'webextension/_locales/da/messages.json'
+]
+
 FINAL_TARGET_FILES.features['screenshots@mozilla.org']["webextension"]["_locales"]["de"] += [
   'webextension/_locales/de/messages.json'
 ]
 
 FINAL_TARGET_FILES.features['screenshots@mozilla.org']["webextension"]["_locales"]["dsb"] += [
   'webextension/_locales/dsb/messages.json'
 ]
 
@@ -299,26 +302,18 @@ FINAL_TARGET_FILES.features['screenshots
 
 FINAL_TARGET_FILES.features['screenshots@mozilla.org']["webextension"]["icons"] += [
   'webextension/icons/back-highlight.svg',
   'webextension/icons/back.svg',
   'webextension/icons/cancel.svg',
   'webextension/icons/copy.png',
   'webextension/icons/done.svg',
   'webextension/icons/download.svg',
-  'webextension/icons/icon-128.png',
-  'webextension/icons/icon-16.png',
   'webextension/icons/icon-16.svg',
-  'webextension/icons/icon-19.png',
-  'webextension/icons/icon-256.png',
-  'webextension/icons/icon-32.png',
   'webextension/icons/icon-32.svg',
-  'webextension/icons/icon-38.png',
-  'webextension/icons/icon-48.png',
-  'webextension/icons/icon-64.png',
   'webextension/icons/icon-highlight-32.svg',
   'webextension/icons/icon-starred-32.svg',
   'webextension/icons/icon-welcome-face-without-eyes.svg',
   'webextension/icons/menu-fullpage.svg',
   'webextension/icons/menu-myshot.svg',
   'webextension/icons/menu-visible.svg',
   'webextension/icons/onboarding-1.png',
   'webextension/icons/onboarding-2.png',
--- a/browser/extensions/screenshots/test/browser/browser_screenshots_ui_check.js
+++ b/browser/extensions/screenshots/test/browser/browser_screenshots_ui_check.js
@@ -1,21 +1,21 @@
 "use strict";
 
 function checkElements(expectPresent, l) {
   for (let id of l) {
     is(!!document.getElementById(id), expectPresent, "element " + id + (expectPresent ? " is" : " is not") + " present");
   }
 }
 
-add_task(async function() {
-  await promiseScreenshotsEnabled();
+add_task(function*() {
+  yield promiseScreenshotsEnabled();
 
-  registerCleanupFunction(async function() {
-    await promiseScreenshotsReset();
+  registerCleanupFunction(function* () {
+    yield promiseScreenshotsReset();
   });
 
-  await BrowserTestUtils.waitForCondition(
+  yield BrowserTestUtils.waitForCondition(
     () => document.getElementById("screenshots_mozilla_org-browser-action"),
     "Screenshots button should be present", 100, 100);
 
   checkElements(true, ["screenshots_mozilla_org-browser-action"]);
 });
--- a/browser/extensions/screenshots/test/browser/head.js
+++ b/browser/extensions/screenshots/test/browser/head.js
@@ -1,10 +1,8 @@
-/* global CustomizableUI, info, Services */
-
 // Currently Screenshots is disabled in tests.  We want these tests to work under
 // either case that Screenshots is disabled or enabled on startup of the browser,
 // and that at the end we're reset to the correct state.
 let enabledOnStartup = false;
 
 // ScreenshotsEnabled/Disabled promises return true if it was already
 // Enabled/Disabled, and false if it need to Enable/Disable.
 function promiseScreenshotsEnabled() {
--- a/browser/extensions/screenshots/webextension/_locales/ach/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/ach/messages.json
@@ -1,14 +1,14 @@
 {
   "addonDescription": {
     "message": "Mak vidio ma ki ngolo macego cego ki cal me wang kio ki i Kakube ka igwok gi pi tutunu onyo matwal."
   },
   "addonAuthorsList": {
-    "message": "Mozilla <screenshots-feedback@mozilla.org>"
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "Mak cal me wang kio"
   },
   "myShotsLink": {
     "message": "Cal Na"
   },
   "screenshotInstructions": {
--- a/browser/extensions/screenshots/webextension/_locales/az/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/az/messages.json
@@ -1,20 +1,47 @@
 {
   "addonAuthorsList": {
-    "message": "Mozilla <screenshots-feedback@mozilla.org>"
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
+  },
+  "contextMenuLabel": {
+    "message": "Ekran görüntüsü al"
+  },
+  "myShotsLink": {
+    "message": "Ekran Görüntülərim"
   },
   "saveScreenshotSelectedArea": {
     "message": "Saxla"
   },
   "saveScreenshotVisibleArea": {
     "message": "Görünən ərazini saxla"
   },
+  "saveScreenshotFullPage": {
+    "message": "Tam səhifəni saxla"
+  },
   "cancelScreenshot": {
     "message": "Ləğv et"
   },
   "downloadScreenshot": {
     "message": "Endir"
   },
   "notificationLinkCopiedTitle": {
     "message": "Keçid köçürüldü"
+  },
+  "tourSkip": {
+    "message": "Ötür"
+  },
+  "tourNext": {
+    "message": "Növbəti Slayd"
+  },
+  "tourPrevious": {
+    "message": "Əvvəlki Slayd"
+  },
+  "tourDone": {
+    "message": "Tamamlandı"
+  },
+  "termsAndPrivacyNoticeTermsLink": {
+    "message": "Şərtlər"
+  },
+  "termsAndPrivacyNoticyPrivacyLink": {
+    "message": "Məxfilik Bildirişi"
   }
 }
\ No newline at end of file
--- a/browser/extensions/screenshots/webextension/_locales/be/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/be/messages.json
@@ -1,14 +1,14 @@
 {
   "addonDescription": {
     "message": "Рабіце кліпы і здымкі экрана ў Сеціве і захоўвайце іх часова або назаўжды."
   },
   "addonAuthorsList": {
-    "message": "Mozilla <screenshots-feedback@mozilla.org>"
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "Зрабіць здымак экрана"
   },
   "myShotsLink": {
     "message": "Мае здымкі"
   },
   "screenshotInstructions": {
@@ -78,17 +78,17 @@
   },
   "tourBodyTwo": {
     "message": "Пстрыкніце і пацягніце мышшу для захопу часткі старонкі. Вы таксама можаце навесці курсор мышы для падсвятлення абранай вобласці."
   },
   "tourHeaderThree": {
     "message": "Як вам падабаецца"
   },
   "tourBodyThree": {
-    "message": "Захоўваеце свае здымкі ў Інтэрнэце, каб лёгка імі дзяліцца, або загружайце іх на свой кампутар. Вы таксама можаце прагледзець усе захаваныя здымкі, націснуўшы на кнопку Мае здымкі."
+    "message": "Захоўваеце свае здымкі ў Інтэрнэце, каб лёгка імі дзяліцца, або загружайце іх на свой камп'ютар. Вы таксама можаце прагледзець усе захаваныя здымкі, націснуўшы на кнопку Мае здымкі."
   },
   "tourHeaderFour": {
     "message": "Рабіце захоп вокнаў або цэлых старонак"
   },
   "tourBodyFour": {
     "message": "З дапамогай кнопак у верхнім правым куце выбірайце захоп бачнай вобласці акна або старонкі цалкам."
   },
   "tourSkip": {
--- a/browser/extensions/screenshots/webextension/_locales/bg/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/bg/messages.json
@@ -1,14 +1,14 @@
 {
   "addonDescription": {
     "message": "Прави клипове и снимки на уебстраница и ги запазва временно или за постоянно."
   },
   "addonAuthorsList": {
-    "message": "Mozilla <screenshots-feedback@mozilla.org>"
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "Снимка на екрана"
   },
   "myShotsLink": {
     "message": "Моите снимки"
   },
   "screenshotInstructions": {
@@ -72,17 +72,17 @@
   },
   "tourBodyOne": {
     "message": "Правете, запазвайте и споделяйте снимки на екрана без да напускате Firefox."
   },
   "tourHeaderTwo": {
     "message": "Уловете само нужното"
   },
   "tourBodyTwo": {
-    "message": "Щракнете с мишката или влачете, за да уловите части от страницата. Посочвайки елементите на страницата те се осветяват."
+    "message": "Щракнете с мишката или влачете, за да уловите части от страницата. Посочвайки елементи от страницата – те се осветяват."
   },
   "tourHeaderThree": {
     "message": "Както ви харесва"
   },
   "tourBodyThree": {
     "message": "Запазете снимките на страници от Мрежата за по-лесно споделяне или ги изтеглете на компютъра си. А бутонът „Моите снимки“ ще ви покаже всички направени от вас снимки."
   },
   "tourHeaderFour": {
--- a/browser/extensions/screenshots/webextension/_locales/bn_BD/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/bn_BD/messages.json
@@ -1,14 +1,14 @@
 {
   "addonDescription": {
     "message": "ওয়েব থেকে ক্লিপ এবং স্ক্রিনশট নিন এবং সেগুলো সাময়িকভাবে বা স্থায়ীভাবে সংরক্ষণ করুন।"
   },
   "addonAuthorsList": {
-    "message": "Mozilla <screenshots-feedback@mozilla.org>"
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "একটি স্ক্রীনশট নিন"
   },
   "myShotsLink": {
     "message": "আমার সটসমূহ"
   },
   "screenshotInstructions": {
@@ -98,15 +98,26 @@
     "message": "পরবর্তী স্লাইড"
   },
   "tourPrevious": {
     "message": "পূর্ববর্তী স্লাইড"
   },
   "tourDone": {
     "message": "সম্পন্ন"
   },
+  "termsAndPrivacyNoticeCloudServices": {
+    "message": "Firefox Screenshots ব্যবহারে, আপনি Firefox Cloud Services এর $TERMSANDPRIVACYNOTICETERMSLINK$ এবং $TERMSANDPRIVACYNOTICEPRIVACYLINK$ নীতিতে সম্মত হয়েছেন।",
+    "placeholders": {
+      "termsandprivacynoticetermslink": {
+        "content": "$1"
+      },
+      "termsandprivacynoticeprivacylink": {
+        "content": "$2"
+      }
+    }
+  },
   "termsAndPrivacyNoticeTermsLink": {
     "message": "শর্তাবলী"
   },
   "termsAndPrivacyNoticyPrivacyLink": {
     "message": "গোপনীয়তা নীতি"
   }
 }
\ No newline at end of file
--- a/browser/extensions/screenshots/webextension/_locales/cs/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/cs/messages.json
@@ -1,23 +1,23 @@
 {
   "addonDescription": {
     "message": "Pořizujte snímky webových stránek a ukládejte je dočasně nebo natrvalo."
   },
   "addonAuthorsList": {
-    "message": "Mozilla <screenshots-feedback@mozilla.org>"
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "Pořídit snímek obrazovky"
   },
   "myShotsLink": {
     "message": "Mé snímky"
   },
   "screenshotInstructions": {
-    "message": "Stiskněte tlačítko myši a tahem označte oblast snímku. Pro zrušení výběru stiskněte klávesu ESC."
+    "message": "Oblast vyberete kliknutím nebo tahem myší. Pro zrušení stiskněte ESC."
   },
   "saveScreenshotSelectedArea": {
     "message": "Uložit"
   },
   "saveScreenshotVisibleArea": {
     "message": "Uložit viditelnou oblast"
   },
   "saveScreenshotFullPage": {
--- a/browser/extensions/screenshots/webextension/_locales/cy/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/cy/messages.json
@@ -1,14 +1,14 @@
 {
   "addonDescription": {
     "message": "Cymrwch clipiau a lluniau sgrin o'r We a'u cadw dros dro neu'n barhaol."
   },
   "addonAuthorsList": {
-    "message": "Mozilla <screenshots-feedback@mozilla.org>"
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "Cymryd Llun Sgrin Screenshot"
   },
   "myShotsLink": {
     "message": "Fy Lluniau Sgrin"
   },
   "screenshotInstructions": {
new file mode 100644
--- /dev/null
+++ b/browser/extensions/screenshots/webextension/_locales/da/messages.json
@@ -0,0 +1,123 @@
+{
+  "addonDescription": {
+    "message": "Tag udklip og skærmbilleder fra nettet og gem dem midlertidigt eller permanent."
+  },
+  "addonAuthorsList": {
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
+  },
+  "contextMenuLabel": {
+    "message": "Tag et skærmbillede"
+  },
+  "myShotsLink": {
+    "message": "Mine skærmbilleder"
+  },
+  "screenshotInstructions": {
+    "message": "Træk eller klik på siden for at vælge et område. Tryk på ESC for at fortryde."
+  },
+  "saveScreenshotSelectedArea": {
+    "message": "Gem"
+  },
+  "saveScreenshotVisibleArea": {
+    "message": "Gem synligt område"
+  },
+  "saveScreenshotFullPage": {
+    "message": "Gem hele siden"
+  },
+  "cancelScreenshot": {
+    "message": "Fortryd"
+  },
+  "downloadScreenshot": {
+    "message": "Hent"
+  },
+  "notificationLinkCopiedTitle": {
+    "message": "Link kopieret"
+  },
+  "notificationLinkCopiedDetails": {
+    "message": "Linket til dit skærmbillede er blevet gemt i udklipsholderen. Tryk på $META_KEY$-V for at sætte ind. ",
+    "placeholders": {
+      "meta_key": {
+        "content": "$1"
+      }
+    }
+  },
+  "requestErrorTitle": {
+    "message": "Ude af funktion"
+  },
+  "requestErrorDetails": {
+    "message": "Vi kunne desværre ikke gemme dit skærmbillede. Prøv igen senere."
+  },
+  "connectionErrorTitle": {
+    "message": "Vi kan ikke oprette forbindelse til dine skærmbilleder."
+  },
+  "connectionErrorDetails": {
+    "message": "Kontroller din internet-forbindelse. Hvis du ikke kan oprette forbindelse til internettet, kan der være et midlertidigt teknisk problem med Firefox Screenshots. "
+  },
+  "loginErrorDetails": {
+    "message": "Vi kunne ikke gemme dit skærmbillede, fordi der er et teknisk problem med Firefox Screenshots. Prøv igen senere. "
+  },
+  "unshootablePageErrorTitle": {
+    "message": "Vi kan ikke tage et skærmbillede af denne side. "
+  },
+  "unshootablePageErrorDetails": {
+    "message": "Dette er ikke en almindelig webside, så du kan ikke tage skærmbilleder af den. "
+  },
+  "selfScreenshotErrorTitle": {
+    "message": "Du kan ikke tage skærmbilleder af en side i Firefox Screenshots."
+  },
+  "genericErrorTitle": {
+    "message": "Hov! Noget gik helt galt med Firefox Screenshots."
+  },
+  "genericErrorDetails": {
+    "message": "Vi er ikke sikre på, hvad der lige skete. Vil du prøve igen - eller vil du tage et skærmbillede af en anden side?"
+  },
+  "tourBodyOne": {
+    "message": "Tag, gem og del skærmbilleder uden at forlade Firefox. "
+  },
+  "tourHeaderTwo": {
+    "message": "Gem lige hvad du vil."
+  },
+  "tourBodyTwo": {
+    "message": "Klik og træk for at tage et udklip af en del af en side. Du kan også holde markøren over for at fremhæve din markering."
+  },
+  "tourHeaderThree": {
+    "message": "Som du vil have det."
+  },
+  "tourBodyThree": {
+    "message": "Gem dine beskårne skærmbilleder på nettet for nemmere at dele dem - eller hent dem ned på din computer. Du kan også klikke på knappen \"Mine skærmbilleder\" for at finde de skærmbilleder, du har taget."
+  },
+  "tourHeaderFour": {
+    "message": "Tag skærmbilleder af vinduer eller hele sider."
+  },
+  "tourBodyFour": {
+    "message": "Brug knapperne øverst til højre for at tage et skærmbillede af det synlige område i vinduet eller for at tage et skærmbillede af hele siden."
+  },
+  "tourSkip": {
+    "message": "SPRING OVER"
+  },
+  "tourNext": {
+    "message": "Næste side"
+  },
+  "tourPrevious": {
+    "message": "Forrige side"
+  },
+  "tourDone": {
+    "message": "Færdig"
+  },
+  "termsAndPrivacyNoticeCloudServices": {
+    "message": "Ved at anvende Firefox Screenshots godkender du $TERMSANDPRIVACYNOTICETERMSLINK$ og $TERMSANDPRIVACYNOTICEPRIVACYLINK$ for Firefox Cloud Services.",
+    "placeholders": {
+      "termsandprivacynoticetermslink": {
+        "content": "$1"
+      },
+      "termsandprivacynoticeprivacylink": {
+        "content": "$2"
+      }
+    }
+  },
+  "termsAndPrivacyNoticeTermsLink": {
+    "message": "vilkår"
+  },
+  "termsAndPrivacyNoticyPrivacyLink": {
+    "message": "privatlivspolitik"
+  }
+}
\ No newline at end of file
--- a/browser/extensions/screenshots/webextension/_locales/de/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/de/messages.json
@@ -1,14 +1,14 @@
 {
   "addonDescription": {
     "message": "Speichern Sie Ausschnitte und Bildschirmfotos von Webseiten, die Sie temporär oder dauerhaft speichern können."
   },
   "addonAuthorsList": {
-    "message": "Mozilla <screenshots-feedback@mozilla.org>"
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "Bildschirmfoto aufnehmen"
   },
   "myShotsLink": {
     "message": "Meine Bildschirmfotos"
   },
   "screenshotInstructions": {
--- a/browser/extensions/screenshots/webextension/_locales/dsb/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/dsb/messages.json
@@ -1,14 +1,14 @@
 {
   "addonDescription": {
     "message": "Wzejśo klipy a fota wobrazowki z weba a składujśo je nachylu abo na pśecej."
   },
   "addonAuthorsList": {
-    "message": "Mozilla <screenshots-feedback@mozilla.org>"
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "Foto wobrazowki gótowaś"
   },
   "myShotsLink": {
     "message": "Móje fota wobrazowki"
   },
   "screenshotInstructions": {
--- a/browser/extensions/screenshots/webextension/_locales/el/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/el/messages.json
@@ -1,14 +1,14 @@
 {
   "addonDescription": {
     "message": "Πραγματοποιήστε λήψη στιγμιοτύπων από το Διαδίκτυο και αποθηκεύστε τα προσωρινά ή μόνιμα."
   },
   "addonAuthorsList": {
-    "message": "Mozilla <screenshots-feedback@mozilla.org>"
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "Λήψη στιγμιότυπου"
   },
   "myShotsLink": {
     "message": "Οι λήψεις μου"
   },
   "screenshotInstructions": {
@@ -25,17 +25,17 @@
   },
   "cancelScreenshot": {
     "message": "Ακύρωση"
   },
   "downloadScreenshot": {
     "message": "Λήψη"
   },
   "notificationLinkCopiedTitle": {
-    "message": "Αντιγραφή Συνδέσμου"
+    "message": "Ο σύνδεσμος αντιγράφηκε"
   },
   "notificationLinkCopiedDetails": {
     "message": "Ο σύνδεσμος προς την λήψη σας αντιγράφηκε στο πρόχειρο. Πατήστε $META_KEY$-V για επικόλληση.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
@@ -69,29 +69,29 @@
   },
   "genericErrorDetails": {
     "message": "Δεν είμαστε σίγουροι για το τι ακριβώς συνέβη. Προσπαθήστε ξανά ή κάντε λήψη σε μια άλλη σελίδα."
   },
   "tourBodyOne": {
     "message": "Λήψη, αποθήκευση και διαμοιρασμός στιγμιοτύπων μέσα από το Firefox."
   },
   "tourHeaderTwo": {
-    "message": "Καταγράψτε αυτό που Εσείς Επιθυμείτε"
+    "message": "Καταγράψτε αυτό που εσείς επιθυμείτε"
   },
   "tourBodyTwo": {
     "message": "Κάντε κλικ και σύρετε για την καταγραφή ενός τμήματος της σελίδας. Μπορείτε να επισημάνετε την επιλογή σας μετακινώντας τον ποντίκι σας επάνω της."
   },
   "tourHeaderThree": {
     "message": "Ακριβώς όπως το θέλετε"
   },
   "tourBodyThree": {
     "message": "Αποθηκεύστε της λήψεις σας στο Διαδίκτυο για ευκολότερο διαμοιρασμό, η λήψη τους στον υπολογιστή σας. Μπορείτε να βρείτε όλες τις λήψεις σας πατώντας στο κουμπί «Οι λήψεις μου»."
   },
   "tourHeaderFour": {
-    "message": "Καταγράψτε Παράθυρα ή Ολόκληρες Σελίδες"
+    "message": "Λήψη παραθύρων ή ολόκληρων σελίδων"
   },
   "tourBodyFour": {
     "message": "Επιλέξτε τα κουμπιά επάνω δεξιά για να καταγράψετε την ορατή περιοχή του παραθύρου ή να καταγράψετε μια ολόκληρη σελίδα."
   },
   "tourSkip": {
     "message": "Παράβλεψη"
   },
   "tourNext": {
--- a/browser/extensions/screenshots/webextension/_locales/en_GB/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/en_GB/messages.json
@@ -1,14 +1,14 @@
 {
   "addonDescription": {
     "message": "Take clips and screenshots from the Web and save them temporarily or permanently."
   },
   "addonAuthorsList": {
-    "message": "Mozilla <screenshots-feedback@mozilla.org>"
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "Take a Screenshot"
   },
   "myShotsLink": {
     "message": "My Shots"
   },
   "screenshotInstructions": {
--- a/browser/extensions/screenshots/webextension/_locales/en_US/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/en_US/messages.json
@@ -1,14 +1,14 @@
 {
   "addonDescription": {
     "message": "Take clips and screenshots from the Web and save them temporarily or permanently."
   },
   "addonAuthorsList": {
-    "message": "Mozilla <screenshots-feedback@mozilla.org>"
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "Take a Screenshot"
   },
   "myShotsLink": {
     "message": "My Shots"
   },
   "screenshotInstructions": {
--- a/browser/extensions/screenshots/webextension/_locales/es_AR/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/es_AR/messages.json
@@ -1,14 +1,14 @@
 {
   "addonDescription": {
     "message": "Tomá imágenes y capturas de la web y guardalos temporal o permanentemente."
   },
   "addonAuthorsList": {
-    "message": "Mozilla <screenshots-feedback@mozilla.org>"
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "Hacer captura de pantalla"
   },
   "myShotsLink": {
     "message": "Mis capturas"
   },
   "screenshotInstructions": {
--- a/browser/extensions/screenshots/webextension/_locales/es_CL/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/es_CL/messages.json
@@ -1,14 +1,14 @@
 {
   "addonDescription": {
     "message": "Toma capturas de un sitio Web para guardarlas de forma temporal o permanentemente."
   },
   "addonAuthorsList": {
-    "message": "Mozilla <screenshots-feedback@mozilla.org>"
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "Toma una captura de pantalla"
   },
   "myShotsLink": {
     "message": "Mis capturas"
   },
   "screenshotInstructions": {
--- a/browser/extensions/screenshots/webextension/_locales/es_ES/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/es_ES/messages.json
@@ -1,14 +1,14 @@
 {
   "addonDescription": {
     "message": "Haz capturas y recortes de la web y guárdalos temporal o permanentemente."
   },
   "addonAuthorsList": {
-    "message": "Mozilla <screenshots-feedback@mozilla.org>"
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "Hacer una captura de pantalla"
   },
   "myShotsLink": {
     "message": "Mis capturas"
   },
   "screenshotInstructions": {
--- a/browser/extensions/screenshots/webextension/_locales/es_MX/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/es_MX/messages.json
@@ -1,14 +1,14 @@
 {
   "addonDescription": {
     "message": "Tomar clips y capturas de pantalla de la web y guardarlos temporalmente o permanentemente."
   },
   "addonAuthorsList": {
-    "message": "Mozilla <screenshots-feedback@mozilla.org>"
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "Tomar captura de pantalla"
   },
   "myShotsLink": {
     "message": "Mis capturas"
   },
   "screenshotInstructions": {
--- a/browser/extensions/screenshots/webextension/_locales/et/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/et/messages.json
@@ -1,14 +1,14 @@
 {
   "addonDescription": {
     "message": "Tee veebist klippe või ekraanipilte ning salvesta need ajutiselt või püsivalt."
   },
   "addonAuthorsList": {
-    "message": "Mozilla <screenshots-feedback@mozilla.org>"
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "Tee ekraanipilt"
   },
   "myShotsLink": {
     "message": "Minu pildid"
   },
   "screenshotInstructions": {
--- a/browser/extensions/screenshots/webextension/_locales/fa/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/fa/messages.json
@@ -1,14 +1,14 @@
 {
   "addonDescription": {
     "message": "از وب عکس بگیرید و کلیپ بسازید و به صورت موقت یا دایمی ذخیره کنید."
   },
   "addonAuthorsList": {
-    "message": "موزیلا <screenshots-feedback@mozilla.org>"
+    "message": "موزیلا <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "از صفحه عکس بگیرید"
   },
   "myShotsLink": {
     "message": "عکس‌های من"
   },
   "screenshotInstructions": {
--- a/browser/extensions/screenshots/webextension/_locales/fi/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/fi/messages.json
@@ -1,11 +1,23 @@
 {
+  "addonDescription": {
+    "message": "Ota leikkeitä ja kuvakaappauksia verkosta ja tallenna ne tilapäisesti tai pysyvästi."
+  },
   "addonAuthorsList": {
-    "message": "Mozilla <screenshots-feedback@mozilla.org>"
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
+  },
+  "contextMenuLabel": {
+    "message": "Ota kuvakaappaus"
+  },
+  "myShotsLink": {
+    "message": "Omat kaappaukset"
+  },
+  "screenshotInstructions": {
+    "message": "Valitse alue vetämällä tai napsauttamalla sivua. Peruuta painamalla ESC."
   },
   "saveScreenshotSelectedArea": {
     "message": "Tallenna"
   },
   "saveScreenshotVisibleArea": {
     "message": "Tallenna näkyvä osuus"
   },
   "saveScreenshotFullPage": {
@@ -14,10 +26,98 @@
   "cancelScreenshot": {
     "message": "Peruuta"
   },
   "downloadScreenshot": {
     "message": "Lataa"
   },
   "notificationLinkCopiedTitle": {
     "message": "Linkki kopioitu"
+  },
+  "notificationLinkCopiedDetails": {
+    "message": "Linkki kuvaasi on kopioitu leikepöydälle. Voit liittää sen painamalla $META_KEY$-V.",
+    "placeholders": {
+      "meta_key": {
+        "content": "$1"
+      }
+    }
+  },
+  "requestErrorTitle": {
+    "message": "Epäkunnossa."
+  },
+  "requestErrorDetails": {
+    "message": "Kuvan tallentaminen epäonnistui. Yritä myöhemmin uudestaan."
+  },
+  "connectionErrorTitle": {
+    "message": "Emme saa yhteyttä kuvakaappauksiisi."
+  },
+  "connectionErrorDetails": {
+    "message": "Tarkista internetyhteytesi. Jos olet yhteydessä internetiin, Firefox Screenshots -palvelussa voi olla tilapäinen häiriö."
+  },
+  "loginErrorDetails": {
+    "message": "Emme pystyneet tallentamaan kuvaasi, koska Firefox Screenshots -palvelussa on ongelma. Yritä myöhemmin uudestaan."
+  },
+  "unshootablePageErrorTitle": {
+    "message": "Tästä sivusta ei voi ottaa kuvaa."
+  },
+  "unshootablePageErrorDetails": {
+    "message": "Tämä ei ole tavallinen verkkosivu, joten et voi ottaa kuvaa siitä."
+  },
+  "selfScreenshotErrorTitle": {
+    "message": "Et voi ottaa kuvaa Firefox Screenshots -sivusta!"
+  },
+  "genericErrorTitle": {
+    "message": "Oho! Firefox Screenshots meni päin prinkkalaa."
+  },
+  "genericErrorDetails": {
+    "message": "Emme oikein tiedä, mitä tapahtui. Haluatko yrittää uudestaan tai ottaa kuvan eri sivusta?"
+  },
+  "tourBodyOne": {
+    "message": "Ota, tallenna ja jaa kuvakaappaus poistumatta Firefoxista."
+  },
+  "tourHeaderTwo": {
+    "message": "Kaappaa mitä haluat"
+  },
+  "tourBodyTwo": {
+    "message": "Kaappaa vain osa sivusta napsauttamalla ja vetämällä. Voit myös korostaa valinnan pitämällä hiirtä sen päällä."
+  },
+  "tourHeaderThree": {
+    "message": "Haluamallasi tavalla"
+  },
+  "tourBodyThree": {
+    "message": "Tallenna rajaamasi kuvat verkkoon helpompaa jakamista varten tai lataa ne tietokoneellesi. Voit myös napsauttaa Omat kaappaukset -painiketta ja nähdä kaikki ottamasi kuvat."
+  },
+  "tourHeaderFour": {
+    "message": "Kaappaa ikkunoita tai kokonaisia sivuja"
+  },
+  "tourBodyFour": {
+    "message": "Valitse oikean yläkulman painikkeista joko ikkunassa näkyvän alueen kaappaus tai koko sivun kaappaus."
+  },
+  "tourSkip": {
+    "message": "OHITA"
+  },
+  "tourNext": {
+    "message": "Seuraava sivu"
+  },
+  "tourPrevious": {
+    "message": "Edellinen sivu"
+  },
+  "tourDone": {
+    "message": "Valmis"
+  },
+  "termsAndPrivacyNoticeCloudServices": {
+    "message": "Käyttämällä Firefox Screenshots –ominaisuutta hyväksyt Firefoxin pilvipalveluiden $TERMSANDPRIVACYNOTICETERMSLINK$ ja $TERMSANDPRIVACYNOTICEPRIVACYLINK$.",
+    "placeholders": {
+      "termsandprivacynoticetermslink": {
+        "content": "$1"
+      },
+      "termsandprivacynoticeprivacylink": {
+        "content": "$2"
+      }
+    }
+  },
+  "termsAndPrivacyNoticeTermsLink": {
+    "message": "käyttöehdot"
+  },
+  "termsAndPrivacyNoticyPrivacyLink": {
+    "message": "tietosuojakäytännön"
   }
 }
\ No newline at end of file
--- a/browser/extensions/screenshots/webextension/_locales/fr/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/fr/messages.json
@@ -1,14 +1,14 @@
 {
   "addonDescription": {
     "message": "Effectuez des captures d’écran sur le Web et sauvegardez-les de manière temporaire ou permanente."
   },
   "addonAuthorsList": {
-    "message": "Mozilla <screenshots-feedback@mozilla.org>"
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "Effectuer une capture d’écran"
   },
   "myShotsLink": {
     "message": "Mes captures d’écran"
   },
   "screenshotInstructions": {
@@ -51,17 +51,17 @@
   },
   "connectionErrorDetails": {
     "message": "Veuillez vérifier votre connexion à Internet. Si celle-ci fonctionne normalement, il peut y avoir un problème temporaire avec le service de Firefox Screenshots."
   },
   "loginErrorDetails": {
     "message": "Nous n’avons pas pu enregistrer votre capture d’écran, car le service de Firefox Screenshot rencontre des difficultés. Veuillez réessayer plus tard."
   },
   "unshootablePageErrorTitle": {
-    "message": "Impossible d’effectuer une capture d’écran de cette page."
+    "message": "Impossible d’effectuer une capture de cette page."
   },
   "unshootablePageErrorDetails": {
     "message": "Impossible d’effectuer une capture d’écran, car cette page web n’est pas standard."
   },
   "selfScreenshotErrorTitle": {
     "message": "Vous ne pouvez pas effectuer une capture d’écran d’une page Firefox Screenshots."
   },
   "genericErrorTitle": {
--- a/browser/extensions/screenshots/webextension/_locales/fy_NL/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/fy_NL/messages.json
@@ -1,14 +1,14 @@
 {
   "addonDescription": {
     "message": "Meitsje skermprintsjes of klips fan it web en bewarje se tydlik of permanint."
   },
   "addonAuthorsList": {
-    "message": "Mozilla <screenshots-feedback@mozilla.org>"
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "Meitsje in skermprintsje"
   },
   "myShotsLink": {
     "message": "Myn skermprintsjes"
   },
   "screenshotInstructions": {
--- a/browser/extensions/screenshots/webextension/_locales/gu_IN/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/gu_IN/messages.json
@@ -1,14 +1,14 @@
 {
   "addonDescription": {
     "message": "વેબમાંથી ક્લિપ્સ અને સ્ક્રીનશૉટ્સ લો અને તેમને કામચલાઉ અથવા કાયમી રીતે સાચવો."
   },
   "addonAuthorsList": {
-    "message": "Mozilla<screenshots-feedback@mozilla.org>"
+    "message": "Mozilla<screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "સ્ક્રીનશૉટ લેવા"
   },
   "myShotsLink": {
     "message": "મારા શોટ્સ"
   },
   "screenshotInstructions": {
--- a/browser/extensions/screenshots/webextension/_locales/he/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/he/messages.json
@@ -1,14 +1,14 @@
 {
   "addonDescription": {
     "message": "יצירת צילומי מסך של דפי אינטרנט ושמירה שלהם באופן זמני או קבוע."
   },
   "addonAuthorsList": {
-    "message": "Mozilla <screenshots-feedback@mozilla.org>"
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "צילום מסך"
   },
   "myShotsLink": {
     "message": "צילומי המסך שלי"
   },
   "screenshotInstructions": {
@@ -84,17 +84,17 @@
   },
   "tourBodyThree": {
     "message": "שמירת הצילומים החתוכים שלך לאחסון מקוון לצורך שיתוף פשוט יותר, או להוריד אותם למחשב שלך. ניתן גם ללחוץ על כפתור הצילומים שלי כדי למצוא את כל הצילומים שצילמת."
   },
   "tourHeaderFour": {
     "message": "לצלם חלונות או דפים שלמים"
   },
   "tourBodyFour": {
-    "message": "נא לבחור בכפתורים שבחלק העליון כדי לצלם את האזור הגלוי בחלון או לצלם את הדף כולו."
+    "message": "בחרו בכפתורים שבחלק העליון כדי לצלם את האזור הגלוי בחלון או כדי לצלם את הדף כולו."
   },
   "tourSkip": {
     "message": "דילוג"
   },
   "tourNext": {
     "message": "השקופית הבאה"
   },
   "tourPrevious": {
--- a/browser/extensions/screenshots/webextension/_locales/hi_IN/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/hi_IN/messages.json
@@ -1,14 +1,14 @@
 {
   "addonDescription": {
     "message": "वेब से फ़ोटो और स्क्रीनशॉट लें और उन्हें अस्थायी या स्थायी रूप से सहेजें."
   },
   "addonAuthorsList": {
-    "message": "Mozilla <screenshots-feedback@mozilla.org>"
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "स्क्रीनशॉट लें"
   },
   "myShotsLink": {
     "message": "मेरे चित्र"
   },
   "screenshotInstructions": {
--- a/browser/extensions/screenshots/webextension/_locales/hsb/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/hsb/messages.json
@@ -1,14 +1,14 @@
 {
   "addonDescription": {
     "message": "Wzmiće klipy a fota wobrazowki z weba a składujće je nachwilu abo na přeco."
   },
   "addonAuthorsList": {
-    "message": "Mozilla <screenshots-feedback@mozilla.org>"
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "Foto wobrazowki činić"
   },
   "myShotsLink": {
     "message": "Moje fota wobrazowki"
   },
   "screenshotInstructions": {
--- a/browser/extensions/screenshots/webextension/_locales/hu/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/hu/messages.json
@@ -1,14 +1,14 @@
 {
   "addonDescription": {
     "message": "Készítsen videoklipeket és képernyőképeket a webről, és mentse őket ideiglenesen vagy véglegesen."
   },
   "addonAuthorsList": {
-    "message": "Mozilla <screenshots-feedback@mozilla.org>"
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "Készítsen képernyőképet"
   },
   "myShotsLink": {
     "message": "Az Ön képei"
   },
   "screenshotInstructions": {
--- a/browser/extensions/screenshots/webextension/_locales/hy_AM/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/hy_AM/messages.json
@@ -1,14 +1,14 @@
 {
   "addonDescription": {
     "message": "Ստացեք հոլովակներ և էկրանի հանույթներ վեբից և պահպանեք դանք ժամանակավոր կամ մշտապես:"
   },
   "addonAuthorsList": {
-    "message": "Mozilla <screenshots-feedback@mozilla.org>"
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "Ստանալ էկրանի պատկերը"
   },
   "myShotsLink": {
     "message": "Իմ պատկերները"
   },
   "screenshotInstructions": {
@@ -66,17 +66,17 @@
   },
   "genericErrorTitle": {
     "message": "Firefox Screenshots-ը գնաց գլխիվայր:"
   },
   "genericErrorDetails": {
     "message": "Մենք վստահ չենք, թե ինչ է տեղի ունեցնել: Կրկին փորձեք կամ փորձեք ստանալ մեկ այլ էջի պատկերը:"
   },
   "tourBodyOne": {
-    "message": "Ստացեք, պահպանեք և համօգտագործեք էկրանի հանույթները՝ առանց Firefox-ը լքելու: "
+    "message": "Ստացեք, պահպանեք և համօգտագործեք էկրանի հանույթները՝ առանց Firefox-ը լքելու:"
   },
   "tourHeaderTwo": {
     "message": "Ստացեք միայն այն, ինչ Ձեզ պետք է:"
   },
   "tourBodyTwo": {
     "message": "Սեղմեք և քաշեք՝ ստանալու համար միայն էջի մի մասը: Նաև կարող եք վրայով անցկացնել՝ գունանշելու համար ընտրումը:"
   },
   "tourHeaderThree": {
--- a/browser/extensions/screenshots/webextension/_locales/id/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/id/messages.json
@@ -1,14 +1,14 @@
 {
   "addonDescription": {
     "message": "Rekam klip dan tangkapan layar dari Web dan simpan untuk sementara atau secara permanen."
   },
   "addonAuthorsList": {
-    "message": "Mozilla <screenshots-feedback@mozilla.org>"
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "Buat Tangkapan layar"
   },
   "myShotsLink": {
     "message": "Gambar Saya"
   },
   "screenshotInstructions": {
--- a/browser/extensions/screenshots/webextension/_locales/it/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/it/messages.json
@@ -1,14 +1,14 @@
 {
   "addonDescription": {
     "message": "Crea screenshot di contenuti sul Web e salvali, solo per un periodo di tempo o in modo permanente."
   },
   "addonAuthorsList": {
-    "message": "Mozilla <screenshots-feedback@mozilla.org>"
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "Cattura screenshot"
   },
   "myShotsLink": {
     "message": "I miei screenshot"
   },
   "screenshotInstructions": {
--- a/browser/extensions/screenshots/webextension/_locales/ja/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/ja/messages.json
@@ -1,14 +1,14 @@
 {
   "addonDescription": {
     "message": "ウェブからスクリーンショットを撮って、一時的または永久にそれを保存しましょう。"
   },
   "addonAuthorsList": {
-    "message": "Mozilla <screenshots-feedback@mozilla.org>"
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "スクリーンショットを撮る"
   },
   "myShotsLink": {
     "message": "自分のショット"
   },
   "screenshotInstructions": {
--- a/browser/extensions/screenshots/webextension/_locales/kab/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/kab/messages.json
@@ -1,14 +1,14 @@
 {
   "addonDescription": {
     "message": "Ṭṭef imrayen akked igdilen si Web sakin sekles-iten s wudem askudan neγ s wudem yezgan."
   },
   "addonAuthorsList": {
-    "message": "Mozilla <screenshots-feedback@mozilla.org>"
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "Ṭṭef agdil"
   },
   "myShotsLink": {
     "message": "Tuṭṭfiwin-iw"
   },
   "screenshotInstructions": {
--- a/browser/extensions/screenshots/webextension/_locales/kk/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/kk/messages.json
@@ -1,14 +1,14 @@
 {
   "addonDescription": {
     "message": "Интернеттен скриншоттарды түсіріп, оларды уақытша немесе тұрақты түрде сақтаңыз."
   },
   "addonAuthorsList": {
-    "message": "Mozilla <screenshots-feedback@mozilla.org>"
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "Скриншотты түсіру"
   },
   "myShotsLink": {
     "message": "Менің скриншоттарым"
   },
   "screenshotInstructions": {
--- a/browser/extensions/screenshots/webextension/_locales/ko/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/ko/messages.json
@@ -1,14 +1,14 @@
 {
   "addonDescription": {
     "message": "웹 페이지를 찍거나 영상으로 만들어 임시로, 혹은 영구히 보관하세요."
   },
   "addonAuthorsList": {
-    "message": "Mozilla <screenshots-feedback@mozilla.org>"
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "스크린샷 찍기"
   },
   "myShotsLink": {
     "message": "내 스크린샷"
   },
   "screenshotInstructions": {
--- a/browser/extensions/screenshots/webextension/_locales/lij/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/lij/messages.json
@@ -1,14 +1,14 @@
 {
   "addonDescription": {
     "message": "Fanni de föto do schermo da-o Web e sarvale in mòddo tenporaneo ò cin mòddo che restan."
   },
   "addonAuthorsList": {
-    "message": "Mozilla <screenshots-feedback@mozilla.org>"
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "Fanni 'na föto do schermo"
   },
   "myShotsLink": {
     "message": "E mæ föto do schermo"
   },
   "screenshotInstructions": {
--- a/browser/extensions/screenshots/webextension/_locales/lo/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/lo/messages.json
@@ -1,14 +1,14 @@
 {
   "addonDescription": {
     "message": "ຖ່າຍຄຣິບ ແລະ ພາບຫນ້າຈໍຈາກຫນ້າເວັບ ແລ້ວບັນທຶກໄວ້ຊົ່ວຄາວ ຫລື ຖາວອນ."
   },
   "addonAuthorsList": {
-    "message": "Mozilla <screenshots-feedback@mozilla.org>"
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "ຖ່າຍພາບຫນ້າຈໍ"
   },
   "myShotsLink": {
     "message": "ພາບຂອງຂ້ອຍ"
   },
   "screenshotInstructions": {
@@ -19,17 +19,17 @@
   },
   "saveScreenshotVisibleArea": {
     "message": "ບັນທຶກສ່ວນທີ່ເບິງເຫັນໄດ້"
   },
   "saveScreenshotFullPage": {
     "message": "ບັນທຶກຫມົດຫນ້າ"
   },
   "cancelScreenshot": {
-    "message": ""
+    "message": "ຍົກເລີກ"
   },
   "downloadScreenshot": {
     "message": "ດາວໂຫລດ"
   },
   "notificationLinkCopiedTitle": {
     "message": "ໄດ້ສຳເນົາລີ້ງໄວ້ແລ້ວ"
   },
   "notificationLinkCopiedDetails": {
--- a/browser/extensions/screenshots/webextension/_locales/lt/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/lt/messages.json
@@ -1,14 +1,14 @@
 {
   "addonDescription": {
     "message": "Darykite iškarpas ir ekrano nuotraukos su interneto turiniu bei saugokite jas laikinai arba visąlaik."
   },
   "addonAuthorsList": {
-    "message": "„Mozilla“ <screenshots-feedback@mozilla.org>"
+    "message": "„Mozilla“ <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "Padaryti ekrano nuotrauką"
   },
   "myShotsLink": {
     "message": "Mano kadrai"
   },
   "screenshotInstructions": {
--- a/browser/extensions/screenshots/webextension/_locales/ms/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/ms/messages.json
@@ -1,14 +1,14 @@
 {
   "addonDescription": {
     "message": "Ambil klip dan skrinshot dari Web dan simpan untuk sementara waktu atau kekal."
   },
   "addonAuthorsList": {
-    "message": "Mozilla <screenshots-feedback@mozilla.org>"
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "Ambil skrinshot"
   },
   "myShotsLink": {
     "message": "Shot Saya"
   },
   "screenshotInstructions": {
--- a/browser/extensions/screenshots/webextension/_locales/my/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/my/messages.json
@@ -1,14 +1,14 @@
 {
   "addonDescription": {
     "message": "ဝဘ်ထံမှ ဓါတ်ပုံများနှင့် မျက်နှာပြင်ပုံဖမ်းချက်များကို ရိုက်ယူပြီး ယာယီ သို့မဟုတ် အမြဲတမ်းသိုလှောင်ရာတွင် သိမ်းဆည်းပါ။"
   },
   "addonAuthorsList": {
-    "message": "Mozilla <screenshots-feedback@mozilla.org>"
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "မျက်နှာပြင်ပုံရိပ် ဖမ်းယူပါ"
   },
   "myShotsLink": {
     "message": "ရိုက်ကူးထားသော ပုံများ"
   },
   "saveScreenshotSelectedArea": {
--- a/browser/extensions/screenshots/webextension/_locales/nb_NO/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/nb_NO/messages.json
@@ -1,14 +1,14 @@
 {
   "addonDescription": {
     "message": "Ta klipp og skjermbilder fra nettet og lagre de midlertidig eller permanent."
   },
   "addonAuthorsList": {
-    "message": "Mozilla <screenshots-feedback@mozilla.org>"
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "Ta et skjermbilde"
   },
   "myShotsLink": {
     "message": "Mine skjermbilder"
   },
   "screenshotInstructions": {
--- a/browser/extensions/screenshots/webextension/_locales/nl/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/nl/messages.json
@@ -1,14 +1,14 @@
 {
   "addonDescription": {
     "message": "Maak clips en schermafbeeldingen van het web en sla deze tijdelijk of permanent op."
   },
   "addonAuthorsList": {
-    "message": "Mozilla <screenshots-feedback@mozilla.org>"
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "Een schermafbeelding maken"
   },
   "myShotsLink": {
     "message": "Mijn afbeeldingen"
   },
   "screenshotInstructions": {
--- a/browser/extensions/screenshots/webextension/_locales/nn_NO/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/nn_NO/messages.json
@@ -1,14 +1,14 @@
 {
   "addonDescription": {
     "message": "Ta klipp og skjermbilde frå nettet og lagre dei mellombels eller permanent."
   },
   "addonAuthorsList": {
-    "message": "Mozilla <screenshots-feedback@mozilla.org>"
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "Ta eit skjermbilde"
   },
   "myShotsLink": {
     "message": "Mine skjermbilde"
   },
   "screenshotInstructions": {
--- a/browser/extensions/screenshots/webextension/_locales/pa_IN/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/pa_IN/messages.json
@@ -1,11 +1,11 @@
 {
   "addonAuthorsList": {
-    "message": "ਮੌਜ਼ੀਲਾ <screenshots-feedback@mozilla.org>"
+    "message": "ਮੌਜ਼ੀਲਾ <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "ਸਕਰੀਨ-ਸ਼ਾਟ ਲਵੋ"
   },
   "myShotsLink": {
     "message": "ਮੇਰੇ ਸ਼ਾਟ"
   },
   "screenshotInstructions": {
--- a/browser/extensions/screenshots/webextension/_locales/pl/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/pl/messages.json
@@ -1,14 +1,14 @@
 {
   "addonDescription": {
     "message": "Twórz wycinki i zrzuty stron internetowych i zapisuj je tymczasowo lub trwale."
   },
   "addonAuthorsList": {
-    "message": "Mozilla <screenshots-feedback@mozilla.org>"
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "Wykonaj zrzut ekranu"
   },
   "myShotsLink": {
     "message": "Moje zrzuty"
   },
   "screenshotInstructions": {
--- a/browser/extensions/screenshots/webextension/_locales/pt_BR/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/pt_BR/messages.json
@@ -1,14 +1,14 @@
 {
   "addonDescription": {
     "message": "Tire clipes e capturas de tela da Web e guarde-as temporariamente ou permanentemente."
   },
   "addonAuthorsList": {
-    "message": "Mozilla <screenshots-feedback@mozilla.org>"
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "Tirar uma captura de tela"
   },
   "myShotsLink": {
     "message": "Minhas capturas"
   },
   "screenshotInstructions": {
--- a/browser/extensions/screenshots/webextension/_locales/pt_PT/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/pt_PT/messages.json
@@ -1,14 +1,14 @@
 {
   "addonDescription": {
     "message": "Tire clipes e capturas de ecrã da Web e guarde-as temporariamente ou permanentemente."
   },
   "addonAuthorsList": {
-    "message": "Mozilla <screenshots-feedback@mozilla.org>"
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "Tirar uma captura de ecrã"
   },
   "myShotsLink": {
     "message": "Minhas capturas"
   },
   "screenshotInstructions": {
@@ -28,52 +28,52 @@
   },
   "downloadScreenshot": {
     "message": "Descarregar"
   },
   "notificationLinkCopiedTitle": {
     "message": "Ligação copiada"
   },
   "notificationLinkCopiedDetails": {
-    "message": "A ligação à sua captura foi copiada para a área de transferência. Pressione $META_KEY$-V para colar.",
+    "message": "A ligação para a sua captura foi copiada para a área de transferência. Pressione $META_KEY$-V para colar.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "Fora de serviço."
   },
   "requestErrorDetails": {
     "message": "Desculpe! Não conseguimos guardar a sua captura. Por favor tente novamente mais tarde."
   },
   "connectionErrorTitle": {
     "message": "Não conseguimos ligar às suas capturas de ecrã."
   },
   "connectionErrorDetails": {
-    "message": "Por favor verifique a sua ligação à Internet. Se consegue ligar-se à Internet, pode existir um problema temporário com o serviço Capturas de ecrã Firefox."
+    "message": "Por favor verifique a sua ligação à Internet. Se consegue ligar-se à Internet, pode existir um problema temporário com o serviço Firefox Screenshots."
   },
   "loginErrorDetails": {
-    "message": "Não conseguimos guardar a sua captura porque existe um problema com o serviço Capturas de ecrã Firefox. Por favor tente novamente mais tarde."
+    "message": "Não conseguimos guardar a sua captura porque existe um problema com o serviço Firefox Screenshots. Por favor tente novamente mais tarde."
   },
   "unshootablePageErrorTitle": {
     "message": "Não conseguimos capturar o ecrã nesta página."
   },
   "unshootablePageErrorDetails": {
-    "message": "Esta não é uma página web padrão, por isso não podemos tirar uma captura de ecrã da mesma."
+    "message": "Esta não é uma página Web padrão, por isso não podemos tirar uma captura de ecrã da mesma."
   },
   "selfScreenshotErrorTitle": {
-    "message": "Não pode tirar uma captura duma página Capturas de ecrã Firefox!"
+    "message": "Não pode tirar uma captura de uma página Firefox Screenshots!"
   },
   "genericErrorTitle": {
-    "message": "Uau! Algo correu mal com o Capturas de ecrã Firefox."
+    "message": "Uau! Algo correu mal com o Firefox Screenshots."
   },
   "genericErrorDetails": {
-    "message": "Não temos a certeza do que acabou de acontecer. Tentar novamente ou tirar uma captura de uma página diferente?"
+    "message": "Não temos a certeza do que acabou de acontecer. Importa-se de tentar novamente ou tirar uma captura de uma página diferente?"
   },
   "tourBodyOne": {
     "message": "Tire, guarde, e partilhe capturas de ecrã sem sair do Firefox."
   },
   "tourHeaderTwo": {
     "message": "Capture aquilo mesmo que pretende"
   },
   "tourBodyTwo": {
@@ -84,40 +84,40 @@
   },
   "tourBodyThree": {
     "message": "Guarde as suas capturas na Web para partilhar mais facilmente, ou descarregue-as para o seu computador. Pode também clicar no botão Minhas capturas para encontras todas as capturas que tirou."
   },
   "tourHeaderFour": {
     "message": "Capture janelas ou páginas inteiras"
   },
   "tourBodyFour": {
-    "message": "Selecione os botões no canto superior direito para capturar a área visível na janela ou capturar uma página inteira."
+    "message": "Selecione os botões no canto superior direito para capturar a área visível na janela ou para capturar uma página inteira."
   },
   "tourSkip": {
-    "message": "Saltar"
+    "message": "SALTAR"
   },
   "tourNext": {
     "message": "Diapositivo seguinte"
   },
   "tourPrevious": {
     "message": "Diapositivo anterior"
   },
   "tourDone": {
     "message": "Feito"
   },
   "termsAndPrivacyNoticeCloudServices": {
-    "message": "Ao utilizar as Capturas de ecrã Firefox, você concorda com os $TERMSANDPRIVACYNOTICETERMSLINK$ e a $TERMSANDPRIVACYNOTICEPRIVACYLINK$ do Firefox Cloud Services.",
+    "message": "Ao utilizar o Firefox Screenshots, você concorda com os $TERMSANDPRIVACYNOTICETERMSLINK$ e com o $TERMSANDPRIVACYNOTICEPRIVACYLINK$ do Firefox Cloud Services.",
     "placeholders": {
       "termsandprivacynoticetermslink": {
         "content": "$1"
       },
       "termsandprivacynoticeprivacylink": {
         "content": "$2"
       }
     }
   },
   "termsAndPrivacyNoticeTermsLink": {
     "message": "Termos"
   },
   "termsAndPrivacyNoticyPrivacyLink": {
-    "message": "Nota de privacidade"
+    "message": "Aviso de privacidade"
   }
 }
\ No newline at end of file
--- a/browser/extensions/screenshots/webextension/_locales/rm/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/rm/messages.json
@@ -1,14 +1,14 @@
 {
   "addonDescription": {
     "message": "Fai maletgs da visur dal web ed als memorisescha temporarmain u permanentamain."
   },
   "addonAuthorsList": {
-    "message": "Mozilla <screenshots-feedback@mozilla.org>"
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "Far in maletg dal visur"
   },
   "myShotsLink": {
     "message": "Mes maletgs da visur"
   },
   "screenshotInstructions": {
--- a/browser/extensions/screenshots/webextension/_locales/ru/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/ru/messages.json
@@ -1,14 +1,14 @@
 {
   "addonDescription": {
     "message": "Делайте вырезки и скриншоты из Интернета и сохраняйте их временно или навсегда."
   },
   "addonAuthorsList": {
-    "message": "Mozilla <screenshots-feedback@mozilla.org>"
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "Сделать скриншот"
   },
   "myShotsLink": {
     "message": "Мои снимки"
   },
   "screenshotInstructions": {
--- a/browser/extensions/screenshots/webextension/_locales/sk/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/sk/messages.json
@@ -1,14 +1,14 @@
 {
   "addonDescription": {
     "message": "Vytvorte si snímky obrazovky na webe a uložte si ich dočasne či navždy."
   },
   "addonAuthorsList": {
-    "message": "Mozilla <screenshots-feedback@mozilla.org>"
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "Urobiť snímku obrazovky"
   },
   "myShotsLink": {
     "message": "Moje snímky"
   },
   "screenshotInstructions": {
--- a/browser/extensions/screenshots/webextension/_locales/sl/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/sl/messages.json
@@ -1,14 +1,14 @@
 {
   "addonDescription": {
     "message": "Zajemajte posnetke zaslona s spleta ter jih shranite začasno ali trajno."
   },
   "addonAuthorsList": {
-    "message": "Mozilla <screenshots-feedback@mozilla.org>"
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "Zajemi posnetek zaslona"
   },
   "myShotsLink": {
     "message": "Moji posnetki"
   },
   "screenshotInstructions": {
--- a/browser/extensions/screenshots/webextension/_locales/sq/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/sq/messages.json
@@ -1,18 +1,24 @@
 {
+  "addonDescription": {
+    "message": "Përftoni copëza dhe bëni foto në Web dhe ruajini ato përkohësisht ose përfundimisht."
+  },
   "addonAuthorsList": {
-    "message": "Mozilla <screenshots-feedback@mozilla.org>"
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "Bëni një Foto"
   },
   "myShotsLink": {
     "message": "Shkrepjet e Mia"
   },
+  "screenshotInstructions": {
+    "message": "Tërhiqni kursorin ose klikoni te faqja që të përzgjidhni një zonë. Shtypni ESC që të anulohet."
+  },
   "saveScreenshotSelectedArea": {
     "message": "Ruaje"
   },
   "saveScreenshotVisibleArea": {
     "message": "Ruaj pjesën e dukshme"
   },
   "saveScreenshotFullPage": {
     "message": "Ruaj krejt faqen"
@@ -21,22 +27,39 @@
     "message": "Anuloje"
   },
   "downloadScreenshot": {
     "message": "Shkarkoje"
   },
   "notificationLinkCopiedTitle": {
     "message": "Lidhja u Kopjua"
   },
+  "notificationLinkCopiedDetails": {
+    "message": "Lidhja për te fotoja juaj u kopjua në të papastër. Shtypni $META_KEY$-V për ta ngjitur diku.",
+    "placeholders": {
+      "meta_key": {
+        "content": "$1"
+      }
+    }
+  },
+  "requestErrorTitle": {
+    "message": "S’ka gjendje."
+  },
   "requestErrorDetails": {
     "message": "Na ndjeni! S’e ruajtëm dot foton tuaj. Ju lutemi, riprovoni më vonë."
   },
   "connectionErrorTitle": {
     "message": "S’lidhemi dot te fotot tuaja."
   },
+  "connectionErrorDetails": {
+    "message": "Ju lutemi, kontrolloni lidhjen tuaj Internet. Nëse jeni në gjendje të lidheni në Internet, mund të bëhet fjalë për një problem të përkohshëm me shërbimin Firefox Screenshots."
+  },
+  "loginErrorDetails": {
+    "message": "S’e ruajtëm dot foton tuaj, ngaqë pati një problem me shërbimin Firefox Screenshots. Ju lutemi, riprovoni më vonë."
+  },
   "unshootablePageErrorTitle": {
     "message": "S’bëjmë dot foto të kësaj faqeje."
   },
   "tourHeaderTwo": {
     "message": "Fiksoni Në Foto Aq Sa Doni"
   },
   "tourHeaderThree": {
     "message": "Si T’ju Pëlqejë"
--- a/browser/extensions/screenshots/webextension/_locales/sr/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/sr/messages.json
@@ -1,23 +1,23 @@
 {
   "addonDescription": {
     "message": "Бележите снимке екрана са веба и сачувајте их привремено или трајно."
   },
   "addonAuthorsList": {
-    "message": "Mozilla <screenshots-feedback@mozilla.org>"
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "Усликајте екран"
   },
   "myShotsLink": {
     "message": "Моји снимци"
   },
   "screenshotInstructions": {
-    "message": "Превуците или кликните на страници да изаберете област. Притисните ESC да прекинете."
+    "message": "Превуците или кликните на страницу да изаберете област. Притисните ESC да прекинете."
   },
   "saveScreenshotSelectedArea": {
     "message": "Сачувај"
   },
   "saveScreenshotVisibleArea": {
     "message": "Сачувај видљиво"
   },
   "saveScreenshotFullPage": {
@@ -110,14 +110,14 @@
         "content": "$1"
       },
       "termsandprivacynoticeprivacylink": {
         "content": "$2"
       }
     }
   },
   "termsAndPrivacyNoticeTermsLink": {
-    "message": "условима"
+    "message": "услове"
   },
   "termsAndPrivacyNoticyPrivacyLink": {
-    "message": "обавештењем о приватности"
+    "message": "обавештење о приватности"
   }
 }
\ No newline at end of file
--- a/browser/extensions/screenshots/webextension/_locales/sv_SE/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/sv_SE/messages.json
@@ -1,14 +1,14 @@
 {
   "addonDescription": {
     "message": "Ta klipp och skärmbilder från webben och spara dem tillfälligt eller permanent."
   },
   "addonAuthorsList": {
-    "message": "Mozilla <screenshots-feedback@mozilla.org>"
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "Ta en skärmbild"
   },
   "myShotsLink": {
     "message": "Mina skärmbilder"
   },
   "screenshotInstructions": {
--- a/browser/extensions/screenshots/webextension/_locales/te/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/te/messages.json
@@ -1,11 +1,11 @@
 {
   "addonAuthorsList": {
-    "message": "Mozilla <screenshots-feedback@mozilla.org>"
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "ఒక తెరపట్టు తీసుకోండి"
   },
   "myShotsLink": {
     "message": "నా షాట్లు"
   },
   "saveScreenshotSelectedArea": {
--- a/browser/extensions/screenshots/webextension/_locales/th/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/th/messages.json
@@ -1,115 +1,115 @@
 {
   "addonDescription": {
     "message": "จับภาพหน้าจอจากเว็บและบันทึกไว้ชั่วคราวหรือถาวร"
   },
   "addonAuthorsList": {
-    "message": "Mozilla <screenshots-feedback@mozilla.org>"
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "จับภาพหน้าจอ"
   },
   "myShotsLink": {
     "message": "ภาพของฉัน"
   },
   "screenshotInstructions": {
-    "message": "ลากหรือคลิกหน้าเว็บเพื่อเลือกบริเวณ กด ESC เพื่อยกเลิก"
+    "message": "ลากหรือคลิกที่หน้าเพื่อเลือกบริเวณ กด ESC เพื่อยกเลิก"
   },
   "saveScreenshotSelectedArea": {
     "message": "บันทึก"
   },
   "saveScreenshotVisibleArea": {
-    "message": "บันทึกส่วนที่เห็น"
+    "message": "บันทึกส่วนที่มองเห็น"
   },
   "saveScreenshotFullPage": {
     "message": "บันทึกเต็มหน้า"
   },
   "cancelScreenshot": {
     "message": "ยกเลิก"
   },
   "downloadScreenshot": {
     "message": "ดาวน์โหลด"
   },
   "notificationLinkCopiedTitle": {
     "message": "คัดลอกลิงก์แล้ว"
   },
   "notificationLinkCopiedDetails": {
-    "message": "คัดลอกลิงก์ภาพของไว้ในคลิปบอร์ดแล้ว กด $META_KEY$-V เพื่อวาง",
+    "message": "คัดลอกลิงก์ไปยังภาพของคุณไปยังคลิปบอร์ดแล้ว กด $META_KEY$-V เพื่อวาง",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "ใช้งานไม่ได้"
   },
   "requestErrorDetails": {
-    "message": "ขออภัย! เราไม่สามารถบันทึกภาพของคุณได้ โปรดลองอีกครั้งหลังจากนี้"
+    "message": "ขออภัย! เราไม่สามารถบันทึกภาพของคุณ โปรดลองอีกครั้งในภายหลัง"
   },
   "connectionErrorTitle": {
-    "message": "เราเชื่อมต่อภาพหน้าจอของคุณไม่ได้"
+    "message": "เราไม่สามารถเชื่อมต่อกับภาพหน้าจอของคุณ"
   },
   "connectionErrorDetails": {
-    "message": "กรุณาตรวจสอบการเชื่อมต่ออินเทอร์เน็ต หากคุณสามารถเชื่อมต่อกับอินเทอร์เน็ต บริการ Firefox Screenshots อาจมีปัญหาชั่วคราว "
+    "message": "โปรดตรวจสอบการเชื่อมต่ออินเทอร์เน็ตของคุณ หากคุณสามารถเชื่อมต่ออินเทอร์เน็ต บริการ Firefox Screenshots อาจมีปัญหาชั่วคราว"
   },
   "loginErrorDetails": {
-    "message": "เราไม่สามารถบันทึกภาพได้เพราะมีปัญหากับบริการ Firefox Screenshots โปรดลองใหม่ภายหลัง"
+    "message": "เราไม่สามารถบันทึกภาพของคุณเนื่องจากบริการ Firefox Screenshots มีปัญหา โปรดลองอีกครั้งในภายหลัง"
   },
   "unshootablePageErrorTitle": {
     "message": "เราไม่สามารถจับภาพหน้าจอหน้านี้"
   },
   "unshootablePageErrorDetails": {
-    "message": "นี่ไม่ใช่หน้าเว็บมาตรฐานดังนั้นคุณไม่สามารถจับภาพได้"
+    "message": "นี่ไม่ใช่หน้าเว็บมาตรฐาน คุณจึงไม่สามารถจับภาพหน้าจอได้"
   },
   "selfScreenshotErrorTitle": {
-    "message": "คุณไม่สามารถจับภาพหน้าจอของหน้า Firefox Screenshots"
+    "message": "คุณไม่สามารถจับภาพของหน้า Firefox Screenshots!"
   },
   "genericErrorTitle": {
     "message": "โอ๊ย! Firefox Screenshots รวน"
   },
   "genericErrorDetails": {
-    "message": "เราไม่แน่ใจว่าเกิดอะไรขึ้น โปรดลองอีกครั้งหรือจับภาพของหน้าอื่น"
+    "message": "เราไม่แน่ใจว่าเกิดอะไรขึ้น ต้องการลองอีกครั้งหรือจับภาพของหน้าอื่น?"
   },
   "tourBodyOne": {
-    "message": "จับ บันทึกและแบ่งปันภาพหน้าจอโดยที่ไม่ต้องออกจาก Firefox"
+    "message": "จับ บันทึก และแบ่งปันภาพหน้าจอโดยไม่ต้องออกจาก Firefox"
   },
   "tourHeaderTwo": {
-    "message": "จับภาพตามที่คุณต้องการ"
+    "message": "จับภาพแค่สิ่งที่คุณต้องการ"
   },
   "tourBodyTwo": {
-    "message": "คลิกหรือลากเพื่อจับภาพเฉพาะบางส่วนของหน้าเว็บ คุณสามารถเลื่อนมาชี้เพื่อเน้นภาพส่วนที่คุณเลือก"
+    "message": "คลิกแล้วลากเพื่อจับภาพแค่บางส่วนของหน้า คุณยังสามารถวางเมาส์เพื่อเน้นการเลือกของคุณ"
   },
   "tourHeaderThree": {
-    "message": "ตามที่คุณโปรด"
+    "message": "ตามใจชอบ"
   },
   "tourBodyThree": {
-    "message": "บันทึกและครอปภาพลงในเว็บเพื่อให้แบ่งปันได้ง่าย หรือดาวน์โหลดลงคอมพิวเตอร์ของคุณ คุณยังสามารถคลิกที่ปุ่มภาพของฉันเพื่อที่จะหาภาพที่คุณจับไว้"
+    "message": "บันทึกภาพที่ครอบตัดของคุณไปยังเว็บเพื่อการแบ่งปันที่ง่ายขึ้น หรือดาวน์โหลดไปยังคอมพิวเตอร์ของคุณ คุณยังสามารถคลิกที่ปุ่ม ภาพของฉัน เพื่อค้นหาภาพทั้งหมดที่คุณจับไว้"
   },
   "tourHeaderFour": {
     "message": "จับภาพหน้าต่างหรือทั้งหน้า"
   },
   "tourBodyFour": {
-    "message": "กดปุ่มด้านบนขวาเพื่อจับภาพบริเวณที่มองเห็นในหน้าต่างหรือทั้งหน้าเว็บ"
+    "message": "คลิกที่ปุ่มด้านบนขวาเพื่อจับภาพพื้นที่ที่มองเห็นในหน้าต่างหรือเพื่อจับภาพทั้งหน้า"
   },
   "tourSkip": {
     "message": "ข้าม"
   },
   "tourNext": {
     "message": "ภาพนิ่งถัดไป"
   },
   "tourPrevious": {
     "message": "ภาพนิ่งก่อนหน้า"
   },
   "tourDone": {
     "message": "เสร็จสิ้น"
   },
   "termsAndPrivacyNoticeCloudServices": {
-    "message": "สำหรับการใช้งาน Firefox Screenshots คุณยอมรับใน Firefox Cloud Services $TERMSANDPRIVACYNOTICETERMSLINK$ และ $TERMSANDPRIVACYNOTICEPRIVACYLINK$",
+    "message": "เพื่อใช้ Firefox Screenshots คุณยอมรับ $TERMSANDPRIVACYNOTICETERMSLINK$ และ $TERMSANDPRIVACYNOTICEPRIVACYLINK$ ของบริการกลุ่มเมฆ Firefox",
     "placeholders": {
       "termsandprivacynoticetermslink": {
         "content": "$1"
       },
       "termsandprivacynoticeprivacylink": {
         "content": "$2"
       }
     }
--- a/browser/extensions/screenshots/webextension/_locales/tl/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/tl/messages.json
@@ -1,14 +1,14 @@
 {
   "addonDescription": {
     "message": "Dalhin ang clip at mga screenshot mula sa Web at i-save ang mga ito pansamantala o permanente."
   },
   "addonAuthorsList": {
-    "message": "Mozilla <screenshots-feedback@mozilla.org>"
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "Kumuha ng Screenshot"
   },
   "myShotsLink": {
     "message": "Aking Shots"
   },
   "screenshotInstructions": {
--- a/browser/extensions/screenshots/webextension/_locales/tr/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/tr/messages.json
@@ -1,14 +1,14 @@
 {
   "addonDescription": {
     "message": "Web sayfalarının ekran görüntülerini alın, ister geçici ister kalıcı olarak kaydedin."
   },
   "addonAuthorsList": {
-    "message": "Mozilla <screenshots-feedback@mozilla.org>"
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "Ekran görüntüsü al"
   },
   "myShotsLink": {
     "message": "Ekran görüntülerim"
   },
   "screenshotInstructions": {
@@ -78,23 +78,23 @@
   },
   "tourBodyTwo": {
     "message": "Sayfanın belli bir kısmını yakalamak için işaretçiyi tıklayıp sürükleyin. Seçiminizi vurgulamak için fareyle üzerine gelebilirsiniz."
   },
   "tourHeaderThree": {
     "message": "İstediğin gibi yakala"
   },
   "tourBodyThree": {
-    "message": "Ekran görüntülerinizi daha kolay paylşamak veya bilgisayarınıza indirmek için web'e kaydedin. Kaydettiğiniz tüm görüntüleri bulmak için \"Ekran görüntülerim\" düğmesine tıklayabilirsiniz."
+    "message": "Ekran görüntülerinizi daha kolay paylaşmak veya bilgisayarınıza indirmek için web’e kaydedin. Kaydettiğiniz tüm görüntüleri bulmak için \"Ekran görüntülerim\" düğmesine tıklayabilirsiniz."
   },
   "tourHeaderFour": {
     "message": "Pencereleri veya sayfaların tamamını yakala"
   },
   "tourBodyFour": {
-    "message": "Yalnızda pencerede gördüğünüz alanı veya sayfanın tamamını yakalamak için sağ üstteki düğmelerden uygun olanı seçin."
+    "message": "Yalnızca pencerede gördüğünüz alanı veya sayfanın tamamını yakalamak için sağ üstteki düğmelerden uygun olanı seçin."
   },
   "tourSkip": {
     "message": "GEÇ"
   },
   "tourNext": {
     "message": "Sonraki slayt"
   },
   "tourPrevious": {
--- a/browser/extensions/screenshots/webextension/_locales/uk/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/uk/messages.json
@@ -1,14 +1,14 @@
 {
   "addonDescription": {
     "message": "Робіть вирізки та знімки екрану в Інтернеті та зберігайте їх для подальшої роботи."
   },
   "addonAuthorsList": {
-    "message": "Mozilla <screenshots-feedback@mozilla.org>"
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "Зробити знімок екрану"
   },
   "myShotsLink": {
     "message": "Мої знімки"
   },
   "screenshotInstructions": {
--- a/browser/extensions/screenshots/webextension/_locales/ur/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/ur/messages.json
@@ -1,14 +1,14 @@
 {
   "addonDescription": {
     "message": "ویب سے کللبس یاا اسکرین شاٹیں لیں اور ان کو عارظی یا مستقل طور پر محفوظ کریں۔"
   },
   "addonAuthorsList": {
-    "message": "Mozilla <screenshots-feedback@mozilla.org>"
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "ایک سکرین شاٹ لیں"
   },
   "myShotsLink": {
     "message": "میری شاٹس"
   },
   "screenshotInstructions": {
@@ -48,17 +48,17 @@
   },
   "connectionErrorTitle": {
     "message": "ہم آپ کی اسکرین شاٹس سے نہیں جڑ سکتے۔"
   },
   "connectionErrorDetails": {
     "message": "براہ مہربانی اپنے انٹرنیٹ کنکشن کی پڑتال کریں۔ اگر آپ انٹرنیٹ سے جڑنے کے قابل ہیں، تو شاید Firefox اسکرین شاٹ خدمات کے ساتھ عارظی مسلہ ہو۔"
   },
   "loginErrorDetails": {
-    "message": "ہم آُپ کی شاٹ محفوظ نہیں کر سکے کیونکہ Firefox اسکرین شاٹ خدمت کے ساتھ مسلہ ہے۔ براہ مہربانی کچھ دیربعد کوشش کیجیئے۔ "
+    "message": "ہم آُپ کی شاٹ محفوظ نہیں کر سکے کیونکہ Firefox اسکرین شاٹ خدمت کے ساتھ مسلہ ہے۔ براہ مہربانی کچھ دیربعد کوشش کیجیئے۔"
   },
   "unshootablePageErrorTitle": {
     "message": "ہم اس صفحہ کی اسکرین شاٹ نہیں کر سکتے۔"
   },
   "unshootablePageErrorDetails": {
     "message": "یہ ایک میعاری صفحہ نہہیں، تو آپ اسکی اسکرین شاٹ نہیں لے سکتے۔"
   },
   "selfScreenshotErrorTitle": {
@@ -87,17 +87,17 @@
   },
   "tourHeaderFour": {
     "message": "دریچہ ہا مکمل صفحہ گرفت کریں"
   },
   "tourBodyFour": {
     "message": "دریچہ میں نظر آنے والے علاقے یا مکمل صفحہ کو گرفت کرنے کے لیئے بالائی دائیں جانب بٹن کا انتخاب کریں۔"
   },
   "tourSkip": {
-    "message": "اچٹیں\t "
+    "message": "اچٹیں"
   },
   "tourNext": {
     "message": "اگلى سلائيڈ"
   },
   "tourPrevious": {
     "message": "پچھلی سلائڈ"
   },
   "tourDone": {
--- a/browser/extensions/screenshots/webextension/_locales/uz/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/uz/messages.json
@@ -1,11 +1,11 @@
 {
   "addonAuthorsList": {
-    "message": "Mozilla <screenshots-feedback@mozilla.org>"
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "Rasmini olish"
   },
   "myShotsLink": {
     "message": "Rasmlarim"
   },
   "screenshotInstructions": {
--- a/browser/extensions/screenshots/webextension/_locales/zh_CN/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/zh_CN/messages.json
@@ -1,23 +1,23 @@
 {
   "addonDescription": {
-    "message": "剪辑和拍摄 Web 截图,临时或永久保存它们。"
+    "message": "临时或永久保存网页截图。"
   },
   "addonAuthorsList": {
-    "message": "Mozilla <screenshots-feedback@mozilla.org>"
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
-    "message": "拍摄截图"
+    "message": "截图"
   },
   "myShotsLink": {
     "message": "我的截图"
   },
   "screenshotInstructions": {
-    "message": "在页面上拖动或点击以选择范围。按 ESC 取消。"
+    "message": "在页面上拖动或单击以选择范围。按 ESC 键取消。"
   },
   "saveScreenshotSelectedArea": {
     "message": "保存"
   },
   "saveScreenshotVisibleArea": {
     "message": "保存可见范围"
   },
   "saveScreenshotFullPage": {
@@ -57,44 +57,44 @@
   },
   "unshootablePageErrorTitle": {
     "message": "我们无法截图此页面。"
   },
   "unshootablePageErrorDetails": {
     "message": "这不是一个标准的网页,所以无法截图。"
   },
   "selfScreenshotErrorTitle": {
-    "message": "您不能拍摄 Firefox Screenshots 的页面!"
+    "message": "您不能截取 Firefox Screenshots 的页面!"
   },
   "genericErrorTitle": {
     "message": "哎呀,Firefox Screenshots 遇到问题。"
   },
   "genericErrorDetails": {
     "message": "我们不确定发生了什么。您可以再试一次或者试试另一个页面。"
   },
   "tourBodyOne": {
-    "message": "拍摄、保存和分享屏幕截图,无需 Firefox 以外的工具。"
+    "message": "截取、保存和分享屏幕截图,无需 Firefox 以外的工具。"
   },
   "tourHeaderTwo": {
-    "message": "只拍摄想要的部分"
+    "message": "只截取想要的部分"
   },
   "tourBodyTwo": {
-    "message": "单击并拖动以只拍摄页面某个区域。您也可以悬停以高亮您的选择范围。"
+    "message": "单击并拖动以截取页面某个区域。您也可以悬停以高亮您的选择范围。"
   },
   "tourHeaderThree": {
-    "message": "做你所想"
+    "message": "做您所想"
   },
   "tourBodyThree": {
-    "message": "将您裁剪后的截图保存到网上以便共享,或者下载到您的计算机。您也可以点击“我的截图”按钮找到您拍摄的所有截图。"
+    "message": "将您裁剪后的截图保存到网上以便共享,或者下载到您的计算机。您也可以点击“我的截图”按钮找到您截取的所有截图。"
   },
   "tourHeaderFour": {
-    "message": "拍摄窗口或整个页面"
+    "message": "截取窗口或整个页面"
   },
   "tourBodyFour": {
-    "message": "选择右上角的按钮可以拍摄窗口中的可见区域或者整个页面。"
+    "message": "选择右上角的按钮可以截取窗口中的可见区域或者整个页面。"
   },
   "tourSkip": {
     "message": "跳过"
   },
   "tourNext": {
     "message": "下一页"
   },
   "tourPrevious": {
--- a/browser/extensions/screenshots/webextension/_locales/zh_TW/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/zh_TW/messages.json
@@ -1,14 +1,14 @@
 {
   "addonDescription": {
     "message": "拍攝網頁的擷圖,可暫時儲存或永久儲存。"
   },
   "addonAuthorsList": {
-    "message": "Mozilla <screenshots-feedback@mozilla.org>"
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "拍攝畫面擷圖"
   },
   "myShotsLink": {
     "message": "我的擷圖"
   },
   "screenshotInstructions": {
--- a/browser/extensions/screenshots/webextension/background/auth.js
+++ b/browser/extensions/screenshots/webextension/background/auth.js
@@ -1,9 +1,9 @@
-/* globals browser, log */
+/* globals log */
 /* globals main, makeUuid, deviceInfo, analytics, catcher, buildSettings, communication */
 
 "use strict";
 
 this.auth = (function() {
   let exports = {};
 
   let registrationInfo;
--- a/browser/extensions/screenshots/webextension/background/communication.js
+++ b/browser/extensions/screenshots/webextension/background/communication.js
@@ -1,9 +1,9 @@
-/* globals browser, catcher, log */
+/* globals catcher, log */
 
 "use strict";
 
 this.communication = (function() {
   let exports = {};
 
   let registeredFunctions = {};
 
--- a/browser/extensions/screenshots/webextension/background/deviceInfo.js
+++ b/browser/extensions/screenshots/webextension/background/deviceInfo.js
@@ -1,9 +1,9 @@
-/* globals browser, catcher */
+/* globals catcher */
 
 "use strict";
 
 this.deviceInfo = (function() {
   let manifest = browser.runtime.getManifest();
 
   let platformInfo = {};
   catcher.watchPromise(browser.runtime.getPlatformInfo().then((info) => {
--- a/browser/extensions/screenshots/webextension/background/main.js
+++ b/browser/extensions/screenshots/webextension/background/main.js
@@ -1,9 +1,8 @@
-/* globals browser, XMLHttpRequest, Image, document, setTimeout, navigator */
 /* globals selectorLoader, analytics, communication, catcher, log, makeUuid, auth, senderror */
 
 "use strict";
 
 this.main = (function() {
   let exports = {};
 
   const pasteSymbol = (window.navigator.platform.match(/Mac/i)) ? "\u2318" : "Ctrl";
--- a/browser/extensions/screenshots/webextension/background/selectorLoader.js
+++ b/browser/extensions/screenshots/webextension/background/selectorLoader.js
@@ -1,9 +1,9 @@
-/* globals browser, catcher, log */
+/* globals catcher, log */
 
 "use strict";
 
 var global = this;
 
 this.selectorLoader = (function() {
   const exports = {};
 
--- a/browser/extensions/screenshots/webextension/background/senderror.js
+++ b/browser/extensions/screenshots/webextension/background/senderror.js
@@ -1,9 +1,9 @@
-/* globals analytics, browser, communication, makeUuid, Raven, catcher, auth, log */
+/* globals analytics, communication, makeUuid, Raven, catcher, auth, log */
 
 "use strict";
 
 this.senderror = (function() {
   let exports = {};
 
   let manifest = browser.runtime.getManifest();
 
--- a/browser/extensions/screenshots/webextension/background/takeshot.js
+++ b/browser/extensions/screenshots/webextension/background/takeshot.js
@@ -1,9 +1,9 @@
-/* globals communication, shot, main, auth, catcher, analytics, browser */
+/* globals communication, shot, main, auth, catcher, analytics */
 
 "use strict";
 
 this.takeshot = (function() {
   let exports = {};
   const Shot = shot.AbstractShot;
   const { sendEvent } = analytics;
 
@@ -42,17 +42,28 @@ this.takeshot = (function() {
       shot.abTests = shotAbTests;
     }
     return catcher.watchPromise(capturePromise.then(() => {
       return browser.tabs.create({url: shot.creatingUrl})
     }).then((tab) => {
       openedTab = tab;
       return uploadShot(shot);
     }).then(() => {
-      return browser.tabs.update(openedTab.id, {url: shot.viewUrl});
+      return browser.tabs.update(openedTab.id, {url: shot.viewUrl}).then(
+        null,
+        (error) => {
+          // FIXME: If https://bugzilla.mozilla.org/show_bug.cgi?id=1365718 is resolved,
+          // use the errorCode added as an additional check:
+          if ((/invalid tab id/i).test(error)) {
+            // This happens if the tab was closed before the upload completed
+            return browser.tabs.create({url: shot.viewUrl});
+          }
+          throw error;
+        }
+      );
     }).then(() => {
       return shot.viewUrl;
     }).catch((error) => {
       browser.tabs.remove(openedTab.id);
       throw error;
     }));
   }));
 
--- a/browser/extensions/screenshots/webextension/build/inlineSelectionCss.js
+++ b/browser/extensions/screenshots/webextension/build/inlineSelectionCss.js
@@ -28,39 +28,37 @@ window.inlineSelectionCss = `
     height: 26px;
     border: 1px solid #c7c7c7; }
     .button.tiny:hover, .tiny.highlight-button-cancel:hover, .tiny.highlight-button-save:hover, .tiny.highlight-button-download:hover, .button.tiny:focus, .tiny.highlight-button-cancel:focus, .tiny.highlight-button-save:focus, .tiny.highlight-button-download:focus {
       background: #ebebeb;
       border-color: #989898; }
     .button.tiny:active, .tiny.highlight-button-cancel:active, .tiny.highlight-button-save:active, .tiny.highlight-button-download:active {
       background: #dedede;
       border-color: #989898; }
-  .button.set-width--medium, .set-width--medium.highlight-button-cancel, .set-width--medium.highlight-button-save, .set-width--medium.highlight-button-download {
-    max-width: 200px; }
   .button.block-button, .block-button.highlight-button-cancel, .block-button.highlight-button-save, .block-button.highlight-button-download {
     display: flex;
     align-items: center;
     justify-content: center;
     box-sizing: border-box;
     border: none;
     border-right: 1px solid #c7c7c7;
     box-shadow: none;
     border-radius: 0;
     flex-shrink: 0;
     font-size: 20px;
     height: 100px;
-    line-height: 100%; }
+    line-height: 100%;
+    overflow: hidden; }
     @media (max-width: 719px) {
       .button.block-button, .block-button.highlight-button-cancel, .block-button.highlight-button-save, .block-button.highlight-button-download {
         justify-content: flex-start;
-        padding: 10px;
         font-size: 16px;
         height: 72px;
-        flex: 1 0;
-        margin-right: 10px; } }
+        margin-right: 10px;
+        padding: 0 5px; } }
     .button.block-button:hover, .block-button.highlight-button-cancel:hover, .block-button.highlight-button-save:hover, .block-button.highlight-button-download:hover {
       background: #ebebeb; }
     .button.block-button:active, .block-button.highlight-button-cancel:active, .block-button.highlight-button-save:active, .block-button.highlight-button-download:active {
       background: #dedede; }
 
 .inverse-color-scheme {
   background: #3e3d40;
   color: #f5f5f7; }
@@ -75,32 +73,47 @@ window.inlineSelectionCss = `
 
 .highlight-color-scheme {
   background: #009ec0;
   color: #fff; }
   .highlight-color-scheme a {
     color: #fff;
     text-decoration: underline; }
 
+.alt-color-scheme {
+  background: #31365A;
+  color: #f5f5f7; }
+  .alt-color-scheme h1 {
+    color: #6F7FB6; }
+  .alt-color-scheme a {
+    color: #e1e1e6;
+    text-decoration: underline; }
+
 .button.primary, .primary.highlight-button-cancel, .highlight-button-save, .primary.highlight-button-download {
   background-color: #009ec0;
   color: #fff; }
   .button.primary:hover, .primary.highlight-button-cancel:hover, .highlight-button-save:hover, .primary.highlight-button-download:hover, .button.primary:focus, .primary.highlight-button-cancel:focus, .highlight-button-save:focus, .primary.highlight-button-download:focus {
     background-color: #00819c; }
   .button.primary:active, .primary.highlight-button-cancel:active, .highlight-button-save:active, .primary.highlight-button-download:active {
     background-color: #006c83; }
 
 .button.secondary, .highlight-button-cancel, .secondary.highlight-button-save, .highlight-button-download {
   background-color: #f5f5f7;
   color: #3e3d40; }
   .button.secondary:hover, .highlight-button-cancel:hover, .secondary.highlight-button-save:hover, .highlight-button-download:hover {
     background-color: #ebebeb; }
   .button.secondary:hover, .highlight-button-cancel:hover, .secondary.highlight-button-save:hover, .highlight-button-download:hover {
     background-color: #dedede; }
 
+.button.transparent, .transparent.highlight-button-cancel, .transparent.highlight-button-save, .transparent.highlight-button-download {
+  background-color: transparent;
+  color: #3e3d40; }
+  .button.transparent:hover, .transparent.highlight-button-cancel:hover, .transparent.highlight-button-save:hover, .transparent.highlight-button-download:hover, .button.transparent:focus, .transparent.highlight-button-cancel:focus, .transparent.highlight-button-save:focus, .transparent.highlight-button-download:focus, .button.transparent:active, .transparent.highlight-button-cancel:active, .transparent.highlight-button-save:active, .transparent.highlight-button-download:active {
+    background-color: rgba(0, 0, 0, 0.05); }
+
 .button.warning, .warning.highlight-button-cancel, .warning.highlight-button-save, .warning.highlight-button-download {
   color: #fff;
   background: #d92215; }
   .button.warning:hover, .warning.highlight-button-cancel:hover, .warning.highlight-button-save:hover, .warning.highlight-button-download:hover, .button.warning:focus, .warning.highlight-button-cancel:focus, .warning.highlight-button-save:focus, .warning.highlight-button-download:focus {
     background: #b81d12; }
   .button.warning:active, .warning.highlight-button-cancel:active, .warning.highlight-button-save:active, .warning.highlight-button-download:active {
     background: #a11910; }
 
@@ -331,36 +344,37 @@ window.inlineSelectionCss = `
   font-family: sans-serif;
   font-size: 70%;
   color: #000;
   text-shadow: -1px -1px 0 #fff, 1px -1px 0 #fff, -1px 1px 0 #fff, 1px 1px 0 #fff; }
 
 .fixed-container {
   align-items: center;
   display: flex;
-  height: 100%;
+  flex-direction: column;
+  height: 100vh;
   justify-content: center;
   left: 0;
   margin: 0;
   padding: 0;
   pointer-events: none;
-  position: absolute;
+  position: fixed;
   top: 0;
   width: 100%; }
 
 .face-container {
-  position: absolute;
-  top: 0;
-  left: 0;
-  right: 0;
-  bottom: 0;
-  margin: auto;
+  position: relative;
   width: 64px;
-  height: 64px;
-  transform: translateY(-45px); }
+  height: 64px; }
+
+.face {
+  width: 62.4px;
+  height: 62.4px;
+  display: block;
+  background-image: url("MOZ_EXTENSION/icons/icon-welcome-face-without-eyes.svg"); }
 
 .eye {
   background-color: #fff;
   width: 10.8px;
   height: 14.6px;
   position: absolute;
   border-radius: 100%;
   overflow: hidden;
@@ -378,34 +392,28 @@ window.inlineSelectionCss = `
   z-index: 10; }
 
 .left {
   margin-left: 0; }
 
 .right {
   margin-left: 20px; }
 
-.face {
-  width: 62.4px;
-  height: 62.4px;
-  display: block;
-  background-image: url("MOZ_EXTENSION/icons/icon-welcome-face-without-eyes.svg"); }
-
 .preview-instructions {
   display: flex;
   align-items: center;
   justify-content: center;
   animation: pulse 125mm cubic-bezier(0.07, 0.95, 0, 1);
   color: #fff;
   font-family: -apple-system, BlinkMacSystemFont, sans-serif;
   font-size: 24px;
   line-height: 32px;
   text-align: center;
-  width: 400px;
-  margin-top: 45px; }
+  padding-top: 20px;
+  width: 400px; }
 
 .myshots-all-buttons-container {
   display: flex;
   flex-direction: row-reverse;
   background: #f5f5f5;
   border-radius: 1px;
   box-sizing: border-box;
   height: 80px;
@@ -450,26 +458,16 @@ window.inlineSelectionCss = `
   .myshots-all-buttons-container .visible {
     background-image: url("MOZ_EXTENSION/icons/menu-visible.svg"); }
 
 .myshots-button-container {
   display: flex;
   align-items: center;
   justify-content: center; }
 
-/* styleMyShotsButton test: */
-.styleMyShotsButton-bright .myshots-button {
-  color: #fff;
-  background: #009ec0; }
-
-.styleMyShotsButton-bright .myshots-text-pre,
-.styleMyShotsButton-bright .myshots-text-post {
-  filter: brightness(20); }
-
-/* end styleMyShotsButton test */
 @keyframes pulse {
   0% {
     transform: scale(1); }
   50% {
     transform: scale(1.06); }
   100% {
     transform: scale(1); } }
 
--- a/browser/extensions/screenshots/webextension/build/shot.js
+++ b/browser/extensions/screenshots/webextension/build/shot.js
@@ -1,20 +1,19 @@
 window.shot = (function () {let exports={}; // Note: in this library we can't use any "system" dependencies because this can be used from multiple
 // environments
-/* globals console */
 
 /** Throws an error if the condition isn't true.  Any extra arguments after the condition
     are used as console.error() arguments. */
 function assert(condition, ...args) {
   if (condition) {
     return;
   }
   console.error("Failed assertion", ...args);
-  throw new Error("Failed assertion", ...args);
+  throw new Error(`Failed assertion: ${args.join(" ")}`);
 }
 
 /** True if `url` is a valid URL */
 function isUrl(url) {
   // FIXME: this is rather naive, obviously
   if ((/^about:.+$/i).test(url)) {
     return true;
   }
deleted file mode 100644
--- a/browser/extensions/screenshots/webextension/buildSettings.js.template
+++ /dev/null
@@ -1,5 +0,0 @@
-window.buildSettings = {
-  defaultSentryDsn: process.env.SCREENSHOTS_SENTRY,
-  logLevel: process.env.SCREENSHOTS_LOG_LEVEL || "warn"
-};
-null;
--- a/browser/extensions/screenshots/webextension/catcher.js
+++ b/browser/extensions/screenshots/webextension/catcher.js
@@ -41,22 +41,24 @@ this.catcher = (function() {
       for (let attr of Object.keys(info)) {
         result[attr] = info[attr];
       }
     }
     return result;
   }
 
   /** Wrap the function, and if it raises any exceptions then call unhandled() */
-  exports.watchFunction = function watchFunction(func) {
+  exports.watchFunction = function watchFunction(func, quiet) {
     return function() {
       try {
         return func.apply(this, arguments);
       } catch (e) {
-        exports.unhandled(e);
+        if (!quiet) {
+          exports.unhandled(e);
+        }
         throw e;
       }
     };
   };
 
   exports.watchPromise = function watchPromise(promise, quiet) {
     return promise.catch((e) => {
       if (quiet) {
deleted file mode 100644
index bf4a84dd55bd43b3309f165a95cc562b637cd077..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index fd531ed80cc83c3529ecaf34848b108185be2a1e..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 2585ac748faaafc1eb4865f849f96dcf446e5ad0..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 9388dbfdde87cfb38e2c54746767034f64440d78..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 8d1d5f77bcc406b90535dfa12502bb44317ef3ac..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 8c37139cf6beedd6f0e39c21e314f0655561eb85..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index c96b2444f33e2d56aa10dbd5b33f2d5125dbe21e..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 08c45bb72e8638b6912337a4bdd8ab529205ba96..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
--- a/browser/extensions/screenshots/webextension/log.js
+++ b/browser/extensions/screenshots/webextension/log.js
@@ -1,9 +1,10 @@
 /* globals buildSettings */
+/* eslint-disable no-console */
 
 "use strict";
 
 this.log = (function() {
   let exports = {};
 
   const levels = ["debug", "info", "warn", "error"];
   if (!levels.includes(buildSettings.logLevel)) {
--- a/browser/extensions/screenshots/webextension/manifest.json
+++ b/browser/extensions/screenshots/webextension/manifest.json
@@ -1,29 +1,21 @@
 {
   "manifest_version": 2,
   "name": "Firefox Screenshots",
-  "version": "6.6.0",
+  "version": "8.1.0",
   "description": "__MSG_addonDescription__",
   "author": "__MSG_addonAuthorsList__",
   "homepage_url": "https://github.com/mozilla-services/screenshots",
   "applications": {
     "gecko": {
       "id": "screenshots@mozilla.org"
     }
   },
   "default_locale": "en_US",
-  "icons": {
-    "16": "icons/icon-16.png",
-    "32": "icons/icon-32.png",
-    "48": "icons/icon-48.png",
-    "64": "icons/icon-64.png",
-    "128": "icons/icon-128.png",
-    "256": "icons/icon-256.png"
-  },
   "browser_action": {
     "default_icon": {
       "16": "icons/icon-16.svg",
       "32": "icons/icon-32.svg"
     },
     "default_title": "__MSG_contextMenuLabel__",
     "browser_style": false
   },
--- a/browser/extensions/screenshots/webextension/onboarding/slides.js
+++ b/browser/extensions/screenshots/webextension/onboarding/slides.js
@@ -1,9 +1,9 @@
-/* globals log, catcher, onboardingHtml, onboardingCss, browser, util, shooter, callBackground, assertIsTrusted */
+/* globals log, catcher, onboardingHtml, onboardingCss, util, shooter, callBackground, assertIsTrusted */
 
 "use strict";
 
 this.slides = (function() {
   let exports = {};
 
   const { watchFunction } = catcher;
 
--- a/browser/extensions/screenshots/webextension/selector/callBackground.js
+++ b/browser/extensions/screenshots/webextension/selector/callBackground.js
@@ -1,9 +1,9 @@
-/* globals browser, log */
+/* globals log */
 
 "use strict";
 
 this.callBackground = function callBackground(funcName, ...args) {
   return browser.runtime.sendMessage({funcName, args}).then((result) => {
     if (result.type === "success") {
       return result.value;
     } else if (result.type === "error") {
--- a/browser/extensions/screenshots/webextension/selector/shooter.js
+++ b/browser/extensions/screenshots/webextension/selector/shooter.js
@@ -1,11 +1,10 @@
 /* globals global, documentMetadata, util, uicontrol, ui, catcher */
-/* globals XMLHttpRequest, window, location, alert, domainFromUrl, randomString */
-/* globals document, setTimeout, location */
+/* globals domainFromUrl, randomString */
 
 "use strict";
 
 this.shooter = (function() { // eslint-disable-line no-unused-vars
   let exports = {};
   const { AbstractShot } = window.shot;
 
   const RANDOM_STRING_LENGTH = 16;
--- a/browser/extensions/screenshots/webextension/selector/ui.js
+++ b/browser/extensions/screenshots/webextension/selector/ui.js
@@ -1,9 +1,8 @@
-/* globals window, document, browser */
 /* globals log, util, catcher, inlineSelectionCss, callBackground, assertIsTrusted */
 
 "use strict";
 
 this.ui = (function() { // eslint-disable-line no-unused-vars
   let exports = {};
   const SAVE_BUTTON_HEIGHT = 50;
 
--- a/browser/extensions/screenshots/webextension/selector/uicontrol.js
+++ b/browser/extensions/screenshots/webextension/selector/uicontrol.js
@@ -1,10 +1,10 @@
 /* globals log, catcher, util, ui, slides */
-/* globals window, document, location, shooter, callBackground, selectorLoader, assertIsTrusted */
+/* globals shooter, callBackground, selectorLoader, assertIsTrusted */
 
 "use strict";
 
 this.uicontrol = (function() {
   let exports = {};
 
   /** ********************************************************
    * selection
@@ -810,20 +810,16 @@ this.uicontrol = (function() {
 
   exports.activate = function() {
     if (isFrameset()) {
       callBackground("abortFrameset");
       selectorLoader.unloadModules();
       return;
     }
     addHandlers();
-    // FIXME: self.options is gone
-    if (self.options && self.options.styleMyShotsButton) {
-      ui.iframe.addClassName = `styleMyShotsButton-${self.options.styleMyShotsButton.value}`;
-    }
     if (shouldOnboard) {
       setState("onboarding");
     } else {
       setState("crosshairs");
     }
   }
 
   function isFrameset() {
--- a/browser/locales/search/list.json
+++ b/browser/locales/search/list.json
@@ -619,17 +619,17 @@
         "visibleDefaultEngines": [
           "google", "yahoo", "amazondotcom", "ddg", "wikipedia-si"
         ]
       }
     },
     "sk": {
       "default": {
         "visibleDefaultEngines": [
-          "google", "azet-sk", "atlas-sk", "ddg", "dunaj-sk", "slovnik-sk", "wikipedia-sk", "zoznam-sk"
+          "google", "azet-sk", "atlas-sk", "ddg", "slovnik-sk", "wikipedia-sk", "zoznam-sk"
         ]
       }
     },
     "sl": {
       "default": {
         "visibleDefaultEngines": [
           "google", "ceneji", "ddg", "najdi-si", "odpiralni", "twitter", "wikipedia-sl"
         ]
deleted file mode 100644
--- a/browser/locales/searchplugins/dunaj-sk.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<!-- 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/. -->
-
-<SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/">
-<ShortName>Dunaj</ShortName>
-<Description>Dunaj.sk - zelena vasim nakupom</Description>
-<InputEncoding>WINDOWS-1250</InputEncoding>
-<Image width="16" height="16">data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACOUlEQVQ4jb2ST0iTcRzGn/e3952b29vLfJtuvrp0zaEzjXA2qCHV0MBTlJ4iCIqKDp28dOpS0C0i+nOIOnQKolAqEKJ/BhmWEuuQdggbvmtm5u/9ve/e7XXv1sUshMAKeu6f5/v9wAP8Y7i/BYONkb3Hjx09zP8BIwCwAZQB+Jy14XPqItXWTSeSqZPb4okBAPymeN9EonfwCYDqdSt09w2+MIu27OLL0wLPO1+O3jkAwPydgmPlXQBAMBhsy9FiFzNMlySK0VL29Q4AJgCQXyASCkdTkdbWvpWC1dSHYwOU5V0cR8CMPBGVzquBQKj9xyWEQuFkQyxxWawiWYMydfuu3iFFUTYbRVMzGdP9Ld03i9ay0OAT7oNmznyYGjur6/QTgAofjcVSy1J0mC99PsKWlnJN8dRIak9SfjT68MZXVb3klmWlQtWL9H36Xq5AP651JaruPBX0VaffTozf1qrqLhzc3y+ndsZhFO36aFvHvsAGWdEWMk8lSawFIK0t4MKdySsFQTpkZafizU0tPZYYujbQv5uIXg+oxlCyy3A4CB4/uHv6+aux62AsD6/XA13/AgCcLMuKsqVn+Jtpd4R9lfOMLs5Q3Qps9PubRY/XkZ3PaQW2NFkw6azPF2wXBCJMv5seyecXVODnlMXI1sRQ2V13wuN2GrbJJt1Obs7hICWqGW6bIzWSKLpg0tE3489uAdBXFdYo1TQ2R+KhpkiXYZVqCEjFsvK5+bnZ9LyaGQew/un+t3wHzZ7XlmdRXP0AAAAASUVORK5CYII=</Image>
-<Url type="text/html" method="GET" template="http://www.dunaj.sk/default.asp" resultdomain="dunaj.sk">
-  <Param name="bShowGoodsList" value="True"/>
-  <Param name="bShowSearchForm" value="True"/>
-  <Param name="sSearchBasic" value="{searchTerms}"/>
-  <Param name="nDepartmentID" value="10000"/>
-  <Param name="sourceid" value="firefox"/>
-</Url>
-<SearchForm>http://www.dunaj.sk/</SearchForm>
-</SearchPlugin>
--- a/browser/themes/shared/controlcenter/panel.inc.css
+++ b/browser/themes/shared/controlcenter/panel.inc.css
@@ -163,17 +163,17 @@
 
 .identity-popup-permission-label,
 .identity-popup-permission-state-label,
 #identity-popup-security-content > description,
 #identity-popup-security-descriptions > description,
 #identity-popup-securityView-header > description,
 #identity-popup-securityView-body > description,
 #identity-popup-permissions-content > description,
-#tracking-protection-content > label {
+#tracking-protection-content > description {
   white-space: pre-wrap;
   font-size: 110%;
   margin: 0;
 }
 
 .identity-popup-headline {
   margin: 3px 0 4px;
   font-size: 150%;
@@ -348,16 +348,17 @@ description#identity-popup-content-verif
 #tracking-protection-content:not([state]) > #tracking-actions {
   display: none;
 }
 
 /* PERMISSIONS */
 
 #identity-popup-permissions-content {
   background-image: url(chrome://browser/skin/controlcenter/permissions.svg);
+  padding-bottom: 1.5em;
 }
 
 #identity-popup-permissions-headline {
   /* Make sure the label is as tall as the icon so that the permission list
      which is aligned with the icon doesn't cover it up. */
   min-height: 24px;
 }
 
new file mode 100644
--- /dev/null
+++ b/build/unix/mozconfig.fuzzing
@@ -0,0 +1,28 @@
+MOZ_AUTOMATION_L10N_CHECK=0
+
+. "$topsrcdir/build/mozconfig.common"
+
+# Use Clang as specified in manifest
+export CC="$topsrcdir/clang/bin/clang -fgnu89-inline -fsanitize-coverage=edge"
+export CXX="$topsrcdir/clang/bin/clang++ -fsanitize-coverage=edge"
+export LLVM_SYMBOLIZER="$topsrcdir/clang/bin/llvm-symbolizer"
+
+# Use a newer binutils, from the tooltool gcc package, if it's there
+if [ -e "$topsrcdir/gcc/bin/ld" ]; then
+    export CC="$CC -B $topsrcdir/gcc/bin"
+    export CXX="$CXX -B $topsrcdir/gcc/bin"
+fi
+
+# Enable ASan specific code and build workarounds
+ac_add_options --enable-address-sanitizer
+
+# Mandatory options required for ASan builds (both on Linux and Mac)
+export MOZ_DEBUG_SYMBOLS=1
+ac_add_options --enable-debug-symbols
+ac_add_options --disable-install-strip
+ac_add_options --disable-jemalloc
+ac_add_options --disable-crashreporter
+ac_add_options --disable-elf-hack
+ac_add_options --disable-profiling
+
+. "$topsrcdir/build/unix/mozconfig.stdcxx"
--- a/devtools/client/responsive.html/browser/swap.js
+++ b/devtools/client/responsive.html/browser/swap.js
@@ -1,16 +1,15 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 "use strict";
 
 const { Ci } = require("chrome");
-const promise = require("promise");
 const { Task } = require("devtools/shared/task");
 const { tunnelToInnerBrowser } = require("./tunnel");
 
 /**
  * Swap page content from an existing tab into a new browser within a container
  * page.  Page state is preserved by using `swapFrameLoaders`, just like when
  * you move a tab to a new window.  This provides a seamless transition for the
  * user since the page is not reloaded.
@@ -324,24 +323,23 @@ function addXULBrowserDecorations(browse
   if (browser._remoteWebProgressManager == undefined) {
     browser._remoteWebProgressManager = {
       swapBrowser() {},
     };
   }
 }
 
 function tabLoaded(tab) {
-  let deferred = promise.defer();
-
-  function handle(event) {
-    if (event.originalTarget != tab.linkedBrowser.contentDocument ||
-        event.target.location.href == "about:blank") {
-      return;
+  return new Promise(resolve => {
+    function handle(event) {
+      if (event.originalTarget != tab.linkedBrowser.contentDocument ||
+          event.target.location.href == "about:blank") {
+        return;
+      }
+      tab.linkedBrowser.removeEventListener("load", handle, true);
+      resolve(event);
     }
-    tab.linkedBrowser.removeEventListener("load", handle, true);
-    deferred.resolve(event);
-  }
 
-  tab.linkedBrowser.addEventListener("load", handle, true);
-  return deferred.promise;
+    tab.linkedBrowser.addEventListener("load", handle, true);
+  });
 }
 
 exports.swapToInnerBrowser = swapToInnerBrowser;
--- a/devtools/client/responsive.html/utils/e10s.js
+++ b/devtools/client/responsive.html/utils/e10s.js
@@ -1,16 +1,14 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 "use strict";
 
-const { defer } = require("promise");
-
 // The prefix used for RDM messages in content.
 // see: devtools/client/responsivedesign/responsivedesign-child.js
 const MESSAGE_PREFIX = "ResponsiveMode:";
 const REQUEST_DONE_SUFFIX = ":Done";
 
 /**
  * Registers a message `listener` that is called every time messages of
  * specified `message` is emitted on the given message manager.
@@ -47,24 +45,22 @@ exports.off = off;
  * @param {nsIMessageListenerManager} mm
  *    The Message Manager
  * @param {String} message
  *    The message. It will be prefixed with the constant `MESSAGE_PREFIX`
  * @returns {Promise}
  *    A promise that is resolved when the given message is emitted.
  */
 function once(mm, message) {
-  let { resolve, promise } = defer();
-
-  on(mm, message, function onMessage({data}) {
-    off(mm, message, onMessage);
-    resolve(data);
+  return new Promise(resolve => {
+    on(mm, message, function onMessage({data}) {
+      off(mm, message, onMessage);
+      resolve(data);
+    });
   });
-
-  return promise;
 }
 exports.once = once;
 
 /**
  * Asynchronously emit a `message` to the listeners of the given message
  * manager.
  *
  * @param {nsIMessageListenerManager} mm
--- a/devtools/client/responsive.html/utils/message.js
+++ b/devtools/client/responsive.html/utils/message.js
@@ -1,31 +1,27 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 "use strict";
 
-const promise = require("promise");
-
 const REQUEST_DONE_SUFFIX = ":done";
 
 function wait(win, type) {
-  let deferred = promise.defer();
-
-  let onMessage = event => {
-    if (event.data.type !== type) {
-      return;
-    }
-    win.removeEventListener("message", onMessage);
-    deferred.resolve();
-  };
-  win.addEventListener("message", onMessage);
-
-  return deferred.promise;
+  return new Promise(resolve => {
+    let onMessage = event => {
+      if (event.data.type !== type) {
+        return;
+      }
+      win.removeEventListener("message", onMessage);
+      resolve();
+    };
+    win.addEventListener("message", onMessage);
+  });
 }
 
 /**
  * Post a message to some window.
  *
  * @param win
  *        The window to post to.
  * @param typeOrMessage
--- a/dom/animation/test/chrome/test_animation_properties.html
+++ b/dom/animation/test/chrome/test_animation_properties.html
@@ -143,33 +143,31 @@ var gTests = [
                             valueFormat(1, 'solid', 'replace') ] },
                 { property: 'border-right-style',
                   values: [ valueFormat(0, 'dotted', 'replace', 'linear'),
                             valueFormat(1, 'dashed', 'replace') ] },
                 { property: 'border-top-style',
                   values: [ valueFormat(0, 'dotted', 'replace', 'linear'),
                             valueFormat(1, 'dashed', 'replace') ] },
                 { property: 'border-image-outset',
-                  values: [ valueFormat(0, '0 0 0 0', 'replace', 'linear'),
-                            valueFormat(1, '0 0 0 0', 'replace') ] },
+                  values: [ valueFormat(0, '0', 'replace', 'linear'),
+                            valueFormat(1, '0', 'replace') ] },
                 { property: 'border-image-repeat',
                   values: [ valueFormat(0,
                                         'stretch stretch', 'replace', 'linear'),
                             valueFormat(1, 'stretch stretch', 'replace') ] },
                 { property: 'border-image-slice',
-                  values: [ valueFormat(0, '100% 100% 100% 100%',
-                                  'replace', 'linear'),
-                            valueFormat(1,
-                                        '100% 100% 100% 100%', 'replace') ] },
+                  values: [ valueFormat(0, '100%', 'replace', 'linear'),
+                            valueFormat(1, '100%', 'replace') ] },
                 { property: 'border-image-source',
                   values: [ valueFormat(0, 'none', 'replace', 'linear'),
                             valueFormat(1, 'none', 'replace') ] },
                 { property: 'border-image-width',
-                  values: [ valueFormat(0, '1 1 1 1', 'replace', 'linear'),
-                            valueFormat(1, '1 1 1 1', 'replace') ] },
+                  values: [ valueFormat(0, '1', 'replace', 'linear'),
+                            valueFormat(1, '1', 'replace') ] },
                 { property: '-moz-border-bottom-colors',
                   values: [ valueFormat(0, 'none', 'replace', 'linear'),
                             valueFormat(1, 'none', 'replace') ] },
                 { property: '-moz-border-left-colors',
                   values: [ valueFormat(0, 'none', 'replace', 'linear'),
                             valueFormat(1, 'none', 'replace') ] },
                 { property: '-moz-border-right-colors',
                   values: [ valueFormat(0, 'none', 'replace', 'linear'),
@@ -216,33 +214,31 @@ var gTests = [
                             valueFormat(1, 'solid', 'replace') ] },
                 { property: 'border-right-style',
                   values: [ valueFormat(0, 'dotted', 'replace', 'linear'),
                             valueFormat(1, 'dashed', 'replace') ] },
                 { property: 'border-top-style',
                   values: [ valueFormat(0, 'dotted', 'replace', 'linear'),
                             valueFormat(1, 'dashed', 'replace') ] },
                 { property: 'border-image-outset',
-                  values: [ valueFormat(0, '0 0 0 0', 'replace', 'linear'),
-                            valueFormat(1, '0 0 0 0', 'replace') ] },
+                  values: [ valueFormat(0, '0', 'replace', 'linear'),
+                            valueFormat(1, '0', 'replace') ] },
                 { property: 'border-image-repeat',
                   values: [ valueFormat(0,
                                         'stretch stretch', 'replace', 'linear'),
                             valueFormat(1, 'stretch stretch', 'replace') ] },
                 { property: 'border-image-slice',
-                  values: [ valueFormat(0, '100% 100% 100% 100%',
-                                  'replace', 'linear'),
-                            valueFormat(1,
-                                        '100% 100% 100% 100%', 'replace') ] },
+                  values: [ valueFormat(0, '100%', 'replace', 'linear'),
+                            valueFormat(1, '100%', 'replace') ] },
                 { property: 'border-image-source',
                   values: [ valueFormat(0, 'none', 'replace', 'linear'),
                             valueFormat(1, 'none', 'replace') ] },
                 { property: 'border-image-width',
-                  values: [ valueFormat(0, '1 1 1 1', 'replace', 'linear'),
-                            valueFormat(1, '1 1 1 1', 'replace') ] },
+                  values: [ valueFormat(0, '1', 'replace', 'linear'),
+                            valueFormat(1, '1', 'replace') ] },
                 { property: '-moz-border-bottom-colors',
                   values: [ valueFormat(0, 'none', 'replace', 'linear'),
                             valueFormat(1, 'none', 'replace') ] },
                 { property: '-moz-border-left-colors',
                   values: [ valueFormat(0, 'none', 'replace', 'linear'),
                             valueFormat(1, 'none', 'replace') ] },
                 { property: '-moz-border-right-colors',
                   values: [ valueFormat(0, 'none', 'replace', 'linear'),
@@ -498,33 +494,31 @@ var gTests = [
                             valueFormat(1, 'dashed', 'replace') ] },
                 { property: 'border-right-style',
                   values: [ valueFormat(0, 'dotted', 'replace', 'linear'),
                             valueFormat(1, 'dashed', 'replace') ] },
                 { property: 'border-top-style',
                   values: [ valueFormat(0, 'dotted', 'replace', 'linear'),
                             valueFormat(1, 'dashed', 'replace') ] },
                 { property: 'border-image-outset',
-                  values: [ valueFormat(0, '0 0 0 0', 'replace', 'linear'),
-                            valueFormat(1, '0 0 0 0', 'replace') ] },
+                  values: [ valueFormat(0, '0', 'replace', 'linear'),
+                            valueFormat(1, '0', 'replace') ] },
                 { property: 'border-image-repeat',
                   values: [ valueFormat(0,
                                         'stretch stretch', 'replace', 'linear'),
                             valueFormat(1, 'stretch stretch', 'replace') ] },
                 { property: 'border-image-slice',
-                  values: [ valueFormat(0, '100% 100% 100% 100%',
-                                  'replace', 'linear'),
-                            valueFormat(1,
-                                        '100% 100% 100% 100%', 'replace') ] },
+                  values: [ valueFormat(0, '100%', 'replace', 'linear'),
+                            valueFormat(1, '100%', 'replace') ] },
                 { property: 'border-image-source',
                   values: [ valueFormat(0, 'none', 'replace', 'linear'),
                             valueFormat(1, 'none', 'replace') ] },
                 { property: 'border-image-width',
-                  values: [ valueFormat(0, '1 1 1 1', 'replace', 'linear'),
-                            valueFormat(1, '1 1 1 1', 'replace') ] },
+                  values: [ valueFormat(0, '1', 'replace', 'linear'),
+                            valueFormat(1, '1', 'replace') ] },
                 { property: '-moz-border-bottom-colors',
                   values: [ valueFormat(0, 'none', 'replace', 'linear'),
                             valueFormat(1, 'none', 'replace') ] },
                 { property: '-moz-border-left-colors',
                   values: [ valueFormat(0, 'none', 'replace', 'linear'),
                             valueFormat(1, 'none', 'replace') ] },
                 { property: '-moz-border-right-colors',
                   values: [ valueFormat(0, 'none', 'replace', 'linear'),
@@ -570,33 +564,31 @@ var gTests = [
                             valueFormat(1, 'dashed', 'replace') ] },
                 { property: 'border-right-style',
                   values: [ valueFormat(0, 'dotted', 'replace', 'linear'),
                             valueFormat(1, 'dashed', 'replace') ] },
                 { property: 'border-top-style',
                   values: [ valueFormat(0, 'dotted', 'replace', 'linear'),
                             valueFormat(1, 'dashed', 'replace') ] },
                 { property: 'border-image-outset',
-                  values: [ valueFormat(0, '0 0 0 0', 'replace', 'linear'),
-                            valueFormat(1, '0 0 0 0', 'replace') ] },
+                  values: [ valueFormat(0, '0', 'replace', 'linear'),
+                            valueFormat(1, '0', 'replace') ] },
                 { property: 'border-image-repeat',
                   values: [ valueFormat(0,
                                         'stretch stretch', 'replace', 'linear'),
                             valueFormat(1, 'stretch stretch', 'replace') ] },
                 { property: 'border-image-slice',
-                  values: [ valueFormat(0, '100% 100% 100% 100%',
-                                  'replace', 'linear'),
-                            valueFormat(1,
-                                        '100% 100% 100% 100%', 'replace') ] },
+                  values: [ valueFormat(0, '100%', 'replace', 'linear'),
+                            valueFormat(1, '100%', 'replace') ] },
                 { property: 'border-image-source',
                   values: [ valueFormat(0, 'none', 'replace', 'linear'),
                             valueFormat(1, 'none', 'replace') ] },
                 { property: 'border-image-width',
-                  values: [ valueFormat(0, '1 1 1 1', 'replace', 'linear'),
-                            valueFormat(1, '1 1 1 1', 'replace') ] },
+                  values: [ valueFormat(0, '1', 'replace', 'linear'),
+                            valueFormat(1, '1', 'replace') ] },
                 { property: '-moz-border-bottom-colors',
                   values: [ valueFormat(0, 'none', 'replace', 'linear'),
                             valueFormat(1, 'none', 'replace') ] },
                 { property: '-moz-border-left-colors',
                   values: [ valueFormat(0, 'none', 'replace', 'linear'),
                             valueFormat(1, 'none', 'replace') ] },
                 { property: '-moz-border-right-colors',
                   values: [ valueFormat(0, 'none', 'replace', 'linear'),
--- a/js/src/vm/CodeCoverage.cpp
+++ b/js/src/vm/CodeCoverage.cpp
@@ -566,17 +566,17 @@ LCovRuntime::fillWithFilename(char *name
         return false;
 
     int64_t timestamp = static_cast<double>(PRMJ_Now()) / PRMJ_USEC_PER_SEC;
     static mozilla::Atomic<size_t> globalRuntimeId(0);
     size_t rid = globalRuntimeId++;
 
     int len = snprintf(name, length, "%s/%" PRId64 "-%" PRIu32 "-%" PRIuSIZE ".info",
                        outDir, timestamp, pid_, rid);
-    if (length != size_t(len)) {
+    if (len < 0 || size_t(len) >= length) {
         fprintf(stderr, "Warning: LCovRuntime::init: Cannot serialize file name.");
         return false;
     }
 
     return true;
 }
 
 void
--- a/layout/style/nsCSSValue.cpp
+++ b/layout/style/nsCSSValue.cpp
@@ -2556,19 +2556,23 @@ nsCSSRect::AppendToString(nsCSSPropertyI
   MOZ_ASSERT(mTop.GetUnit() != eCSSUnit_Null &&
              mTop.GetUnit() != eCSSUnit_Inherit &&
              mTop.GetUnit() != eCSSUnit_Initial &&
              mTop.GetUnit() != eCSSUnit_Unset,
              "parser should have used a bare value");
 
   if (eCSSProperty_border_image_slice == aProperty ||
       eCSSProperty_border_image_width == aProperty ||
-      eCSSProperty_border_image_outset == aProperty ||
-      eCSSProperty_DOM == aProperty) {
-    NS_NAMED_LITERAL_STRING(space, " ");
+      eCSSProperty_border_image_outset == aProperty) {
+    nsCSSPropertyID props[] = { aProperty, aProperty, aProperty, aProperty };
+    const nsCSSValue* values[] = { &mTop, &mRight, &mBottom, &mLeft };
+    nsCSSValue::AppendSidesShorthandToString(props, values,
+                                             aResult, aSerialization);
+  } else if (eCSSProperty_DOM == aProperty) {
+     NS_NAMED_LITERAL_STRING(space, " ");
 
     mTop.AppendToString(aProperty, aResult, aSerialization);
     aResult.Append(space);
     mRight.AppendToString(aProperty, aResult, aSerialization);
     aResult.Append(space);
     mBottom.AppendToString(aProperty, aResult, aSerialization);
     aResult.Append(space);
     mLeft.AppendToString(aProperty, aResult, aSerialization);
--- a/layout/style/nsComputedDOMStyle.cpp
+++ b/layout/style/nsComputedDOMStyle.cpp
@@ -4445,68 +4445,74 @@ nsComputedDOMStyle::DoGetBorderImageSour
 
   RefPtr<nsROCSSPrimitiveValue> val = new nsROCSSPrimitiveValue;
   const nsStyleImage& image = border->mBorderImageSource;
   SetValueToStyleImage(image, val);
 
   return val.forget();
 }
 
+void
+nsComputedDOMStyle::AppendFourSideCoordValues(nsDOMCSSValueList* aList,
+                                              const nsStyleSides& aValues)
+{
+  const nsStyleCoord& top = aValues.Get(eSideTop);
+  const nsStyleCoord& right = aValues.Get(eSideRight);
+  const nsStyleCoord& bottom = aValues.Get(eSideBottom);
+  const nsStyleCoord& left = aValues.Get(eSideLeft);
+
+  auto appendValue = [this, aList](const nsStyleCoord& value) {
+    RefPtr<nsROCSSPrimitiveValue> val = new nsROCSSPrimitiveValue;
+    SetValueToCoord(val, value, true);
+    aList->AppendCSSValue(val.forget());
+  };
+  appendValue(top);
+  if (top != right || top != bottom || top != left) {
+    appendValue(right);
+    if (top != bottom || right != left) {
+      appendValue(bottom);
+      if (right != left) {
+        appendValue(left);
+      }
+    }
+  }
+}
+
 already_AddRefed<CSSValue>
 nsComputedDOMStyle::DoGetBorderImageSlice()
 {
+  const nsStyleBorder* border = StyleBorder();
   RefPtr<nsDOMCSSValueList> valueList = GetROCSSValueList(false);
-
-  const nsStyleBorder* border = StyleBorder();
-  // Four slice numbers.
-  NS_FOR_CSS_SIDES (side) {
-    RefPtr<nsROCSSPrimitiveValue> val = new nsROCSSPrimitiveValue;
-    SetValueToCoord(val, border->mBorderImageSlice.Get(side), true, nullptr);
-    valueList->AppendCSSValue(val.forget());
-  }
+  AppendFourSideCoordValues(valueList, border->mBorderImageSlice);
 
   // Fill keyword.
   if (NS_STYLE_BORDER_IMAGE_SLICE_FILL == border->mBorderImageFill) {
     RefPtr<nsROCSSPrimitiveValue> val = new nsROCSSPrimitiveValue;
     val->SetIdent(eCSSKeyword_fill);
     valueList->AppendCSSValue(val.forget());
   }
 
   return valueList.forget();
 }
 
 already_AddRefed<CSSValue>
 nsComputedDOMStyle::DoGetBorderImageWidth()
 {
   const nsStyleBorder* border = StyleBorder();
   RefPtr<nsDOMCSSValueList> valueList = GetROCSSValueList(false);
-  NS_FOR_CSS_SIDES (side) {
-    RefPtr<nsROCSSPrimitiveValue> val = new nsROCSSPrimitiveValue;
-    SetValueToCoord(val, border->mBorderImageWidth.Get(side),
-                    true, nullptr);
-    valueList->AppendCSSValue(val.forget());
-  }
-
+  AppendFourSideCoordValues(valueList, border->mBorderImageWidth);
   return valueList.forget();
 }
 
 already_AddRefed<CSSValue>
 nsComputedDOMStyle::DoGetBorderImageOutset()
 {
+  const nsStyleBorder* border = StyleBorder();
   RefPtr<nsDOMCSSValueList> valueList = GetROCSSValueList(false);
-
-  const nsStyleBorder* border = StyleBorder();
-  // four slice numbers
-  NS_FOR_CSS_SIDES (side) {
-    RefPtr<nsROCSSPrimitiveValue> val = new nsROCSSPrimitiveValue;
-    SetValueToCoord(val, border->mBorderImageOutset.Get(side),
-                    true, nullptr);
-    valueList->AppendCSSValue(val.forget());
-  }
-
+  AppendFourSideCoordValues(valueList, border->mBorderImageOutset);
   return valueList.forget();
 }
 
 already_AddRefed<CSSValue>
 nsComputedDOMStyle::DoGetBorderImageRepeat()
 {
   RefPtr<nsDOMCSSValueList> valueList = GetROCSSValueList(false);
 
--- a/layout/style/nsComputedDOMStyle.h
+++ b/layout/style/nsComputedDOMStyle.h
@@ -665,16 +665,22 @@ private:
    * the resulting nscoord.  If it's some other unit or a percentge base can't
    * be determined, returns aDefaultValue.
    */
   nscoord StyleCoordToNSCoord(const nsStyleCoord& aCoord,
                               PercentageBaseGetter aPercentageBaseGetter,
                               nscoord aDefaultValue,
                               bool aClampNegativeCalc);
 
+  /**
+   * Append coord values from four sides. It omits values when possible.
+   */
+  void AppendFourSideCoordValues(nsDOMCSSValueList* aList,
+                                 const nsStyleSides& aValues);
+
   bool GetCBContentWidth(nscoord& aWidth);
   bool GetCBContentHeight(nscoord& aWidth);
   bool GetScrollFrameContentWidth(nscoord& aWidth);
   bool GetScrollFrameContentHeight(nscoord& aHeight);
   bool GetFrameBoundsWidthForTransform(nscoord &aWidth);
   bool GetFrameBoundsHeightForTransform(nscoord &aHeight);
   bool GetFrameBorderRectWidth(nscoord& aWidth);
   bool GetFrameBorderRectHeight(nscoord& aHeight);
--- a/layout/style/test/stylo-failures.md
+++ b/layout/style/test/stylo-failures.md
@@ -133,18 +133,16 @@ to mochitest command.
 ## Need Gecko change
 
 * Servo is correct but Gecko is wrong
   * Gecko rejects calc() in -webkit-gradient bug 1363349
     * test_property_syntax_errors.html `-webkit-gradient` [20]
 * test_property_syntax_errors.html `linear-gradient(0,`: unitless zero as degree bug 1363292 [10]
 * test_specified_value_serialization.html `-webkit-radial-gradient`: bug 1367299 [1]
 * test_variables.html `var(--var6)`: irrelevant test for stylo bug 1367306 [1]
-* Difference in rect serialization bug 1367028
-  * test_shorthand_property_getters.html `5 5 5 5` [1]
 
 ## Unknown / Unsure
 
 * test_selectors_on_anonymous_content.html: xbl and :nth-child [1]
 * test_parse_rule.html `rgb(0, 128, 0)`: color properties not getting computed [5]
 * test_selectors.html `:nth-child`: &lt;an+b&gt; parsing difference bug 1364009 [14]
 
 ## Ignore
--- a/layout/style/test/test_computed_style.html
+++ b/layout/style/test/test_computed_style.html
@@ -559,12 +559,67 @@ var noframe_container = document.getElem
     p.style.backgroundImage = test[0];
     is(cs.backgroundImage, test[1],
        "computed value of prefixed gradient expression (" + test[2] + ")");
   }
 
   p.remove();
 })();
 
+(function test_bug_1367028() {
+  const borderImageSubprops = [
+    "border-image-slice",
+    "border-image-outset",
+    "border-image-width"
+  ];
+  const rectValues = [
+    {
+      values: ["5 5 5 5", "5 5 5", "5 5", "5"],
+      expected: "5",
+      desc: "identical four sides",
+    },
+    {
+      values: ["5 6 5 6", "5 6 5", "5 6"],
+      expected: "5 6",
+      desc: "identical values on each axis",
+    },
+    {
+      values: ["5 6 7 6", "5 6 7"],
+      expected: "5 6 7",
+      desc: "identical values on left and right",
+    },
+    {
+      values: ["5 6 5 7"],
+      desc: "identical values on top and bottom",
+    },
+    {
+      values: ["5 5 6 6", "5 6 6 5"],
+      desc: "identical values on unrelated sides",
+    },
+    {
+      values: ["5 6 7 8"],
+      desc: "different values on all sides",
+    },
+  ];
+
+  let frameContainer = document.getElementById("display");
+  let p = document.createElement("p");
+  frameContainer.appendChild(p);
+  let cs = getComputedStyle(p);
+
+  for (let prop of borderImageSubprops) {
+    for (let {values, expected, desc} of rectValues) {
+      for (let value of values) {
+        p.style.setProperty(prop, value);
+        is(cs.getPropertyValue(prop),
+           expected ? expected : value, `${desc} for ${prop}`);
+        p.style.removeProperty(prop);
+      }
+    }
+  }
+
+  p.remove();
+})();
+
 </script>
 </pre>
 </body>
 </html>
--- a/layout/style/test/test_shorthand_property_getters.html
+++ b/layout/style/test/test_shorthand_property_getters.html
@@ -230,17 +230,17 @@ is(e.style.animation, "", "should not ha
 e.setAttribute("style", "animation-name: bounce, roll; animation-duration: 1s, 200ms; animation-timing-function: ease-in, linear; animation-delay: 0s, 1s; animation-direction: normal, reverse; animation-fill-mode: forwards, backwards; animation-iteration-count: infinite, 2; animation-play-state: paused, running, running;");
 is(e.style.animation, "", "should not have animation shorthand (lists different lengths)");
 
 // Check that the 'border' shorthand resets 'border-image' and
 // '-moz-border-*-colors', but that other 'border-*' shorthands don't
 // (bug 482692).
 e.setAttribute("style", 'border-image: url("foo.png") 5 5 5 5 / 5 5 5 5 / 5 5 5 5 repeat repeat; border-left: medium solid green');
 is(e.style.cssText,
-   'border-image: url("foo.png") 5 5 5 5 / 5 5 5 5 / 5 5 5 5 repeat repeat; border-left: medium solid green;',
+   'border-image: url("foo.png") 5 / 5 / 5 repeat repeat; border-left: medium solid green;',
    "border-left does NOT reset border-image");
 e.setAttribute("style", 'border-image: url("foo.png") 5 5 5 5; border: medium solid green');
 is(e.style.cssText,
    'border: medium solid green;',
    "border DOES reset border-image");
 e.setAttribute("style", '-moz-border-left-colors: fuchsia blue; border-left: medium solid green');
 is(e.style.cssText,
    '-moz-border-left-colors: fuchsia blue; border-left: medium solid green;',
--- a/layout/style/test/test_specified_value_serialization.html
+++ b/layout/style/test/test_specified_value_serialization.html
@@ -168,12 +168,66 @@
     p.style.backgroundImage = test[0];
     is(p.style.backgroundImage, test[1],
        "serialization value of gradient expression (" + test[2] + ")");
   }
 
   p.remove();
 })();
 
+(function test_bug_1367028() {
+  const borderImageSubprops = [
+    "border-image-slice",
+    "border-image-outset",
+    "border-image-width"
+  ];
+  const rectValues = [
+    {
+      values: ["5 5 5 5", "5 5 5", "5 5", "5"],
+      expected: "5",
+      desc: "identical four sides",
+    },
+    {
+      values: ["5 6 5 6", "5 6 5", "5 6"],
+      expected: "5 6",
+      desc: "identical values on each axis",
+    },
+    {
+      values: ["5 6 7 6", "5 6 7"],
+      expected: "5 6 7",
+      desc: "identical values on left and right",
+    },
+    {
+      values: ["5 6 5 7"],
+      desc: "identical values on top and bottom",
+    },
+    {
+      values: ["5 5 6 6", "5 6 6 5"],
+      desc: "identical values on unrelated sides",
+    },
+    {
+      values: ["5 6 7 8"],
+      desc: "different values on all sides",
+    },
+  ];
+
+  let frameContainer = document.getElementById("display");
+  let p = document.createElement("p");
+  frameContainer.appendChild(p);
+
+  for (let prop of borderImageSubprops) {
+    for (let {values, expected, desc} of rectValues) {
+      for (let value of values) {
+        p.style.setProperty(prop, value);
+        is(p.style.getPropertyValue(prop),
+           expected ? expected : value, `${desc} for ${prop}`);
+        p.style.removeProperty(prop);
+      }
+    }
+  }
+
+  p.remove();
+})();
+
 </script>
 </pre>
 </body>
 </html>
--- a/mobile/android/base/java/org/mozilla/gecko/GeckoActivity.java
+++ b/mobile/android/base/java/org/mozilla/gecko/GeckoActivity.java
@@ -30,21 +30,9 @@ public abstract class GeckoActivity exte
             ANRReporter.unregister();
         }
         super.onDestroy();
     }
 
     public boolean isApplicationInBackground() {
         return ((GeckoApplication) getApplication()).isApplicationInBackground();
     }
-
-    @Override
-    public void onLowMemory() {
-        MemoryMonitor.getInstance().onLowMemory();
-        super.onLowMemory();
-    }
-
-    @Override
-    public void onTrimMemory(int level) {
-        MemoryMonitor.getInstance().onTrimMemory(level);
-        super.onTrimMemory(level);
-    }
 }
--- a/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java
+++ b/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java
@@ -1274,18 +1274,16 @@ public abstract class GeckoApp extends G
         // business later and dispose of the reference.
         GeckoLoader.setLastIntent(intent);
 
         // Workaround for <http://code.google.com/p/android/issues/detail?id=20915>.
         try {
             Class.forName("android.os.AsyncTask");
         } catch (ClassNotFoundException e) { }
 
-        MemoryMonitor.getInstance().init(getApplicationContext());
-
         // GeckoAppShell is tightly coupled to us, rather than
         // the app context, because various parts of Fennec (e.g.,
         // GeckoScreenOrientation) use GAS to access the Activity in
         // the guise of fetching a Context.
         // When that's fixed, `this` can change to
         // `(GeckoApplication) getApplication()` here.
         GeckoAppShell.setContextGetter(this);
         GeckoAppShell.setScreenOrientationDelegate(this);
--- a/mobile/android/base/java/org/mozilla/gecko/GeckoApplication.java
+++ b/mobile/android/base/java/org/mozilla/gecko/GeckoApplication.java
@@ -230,16 +230,17 @@ public class GeckoApplication extends Ap
 
         mIsInitialResume = true;
 
         mRefWatcher = LeakCanary.install(this);
 
         sSessionUUID = UUID.randomUUID().toString();
 
         GeckoActivityMonitor.getInstance().initialize(this);
+        MemoryMonitor.getInstance().init(this);
 
         final Context context = getApplicationContext();
         GeckoAppShell.setApplicationContext(context);
         GeckoAppShell.setGeckoInterface(new GeckoAppShell.GeckoInterface() {
             @Override
             public boolean openUriExternal(final String targetURI, final String mimeType,
                                            final String packageName, final String className,
                                            final String action, final String title) {
--- a/mobile/android/base/java/org/mozilla/gecko/LauncherActivity.java
+++ b/mobile/android/base/java/org/mozilla/gecko/LauncherActivity.java
@@ -31,22 +31,23 @@ import static org.mozilla.gecko.deeplink
 import static org.mozilla.gecko.deeplink.DeepLinkContract.LINK_PREFERENCES;
 import static org.mozilla.gecko.deeplink.DeepLinkContract.LINK_PREFERENCES_ACCESSIBILITY;
 import static org.mozilla.gecko.deeplink.DeepLinkContract.LINK_PREFERENCES_NOTIFICATIONS;
 import static org.mozilla.gecko.deeplink.DeepLinkContract.LINK_PREFERENCES_PRIAVACY;
 import static org.mozilla.gecko.deeplink.DeepLinkContract.LINK_PREFERENCES_SEARCH;
 import static org.mozilla.gecko.deeplink.DeepLinkContract.LINK_SAVE_AS_PDF;
 import static org.mozilla.gecko.deeplink.DeepLinkContract.LINK_SIGN_UP;
 import static org.mozilla.gecko.deeplink.DeepLinkContract.SUMO_DEFAULT_BROWSER;
+import static org.mozilla.gecko.deeplink.DeepLinkContract.LINK_FXA_SIGNIN;
+import org.mozilla.gecko.deeplink.DeepLinkContract;
 
 /**
  * Activity that receives incoming Intents and dispatches them to the appropriate activities (e.g. browser, custom tabs, web app).
  */
 public class LauncherActivity extends Activity {
-
     private static final String TAG = LauncherActivity.class.getSimpleName();
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
         GeckoAppShell.ensureCrashHandling();
 
@@ -215,15 +216,56 @@ public class LauncherActivity extends Ac
             case LINK_PREFERENCES_PRIAVACY:
             case LINK_PREFERENCES_SEARCH:
             case LINK_PREFERENCES_NOTIFICATIONS:
             case LINK_PREFERENCES_ACCESSIBILITY:
                 settingsIntent = new Intent(this, GeckoPreferences.class);
                 GeckoPreferences.setResourceToOpen(settingsIntent, host);
                 startActivityForResult(settingsIntent, ACTIVITY_REQUEST_PREFERENCES);
                 break;
+            case LINK_FXA_SIGNIN:
+                dispatchAccountsDeepLink(intent);
+                break;
             default:
-                Log.w(TAG, "unrecognized deep links");
+                Log.w(TAG, "Unrecognized deep link");
+        }
+    }
+
+    private void dispatchAccountsDeepLink(final SafeIntent safeIntent) {
+        final Intent intent = new Intent(Intent.ACTION_VIEW);
+
+        final Uri intentUri = safeIntent.getData();
+
+        final String accountsToken = intentUri.getQueryParameter(DeepLinkContract.ACCOUNTS_TOKEN_PARAM);
+        final String entryPoint = intentUri.getQueryParameter(DeepLinkContract.ACCOUNTS_ENTRYPOINT_PARAM);
+
+        String dispatchUri = AboutPages.ACCOUNTS + "?";
+
+        // If token is missing from the deep-link, we'll still open the accounts page.
+        if (accountsToken != null) {
+            dispatchUri = dispatchUri.concat(DeepLinkContract.ACCOUNTS_TOKEN_PARAM + "=" + accountsToken + "&");
         }
 
+        // Pass through the entrypoint.
+        if (entryPoint != null) {
+            dispatchUri = dispatchUri.concat(DeepLinkContract.ACCOUNTS_ENTRYPOINT_PARAM + "=" + entryPoint + "&");
+        }
+
+        // Pass through any utm_* parameters.
+        for (String queryParam : intentUri.getQueryParameterNames()) {
+            if (queryParam.startsWith("utm_")) {
+                dispatchUri = dispatchUri.concat(queryParam + "=" + intentUri.getQueryParameter(queryParam) + "&");
+            }
+        }
+
+        try {
+            intent.setData(Uri.parse(dispatchUri));
+        } catch (Exception e) {
+            Log.w(TAG, "Could not parse accounts deep link.");
+        }
+
+        intent.setClassName(getApplicationContext(), AppConstants.MOZ_ANDROID_BROWSER_INTENT_CLASS);
+
+        filterFlags(intent);
+        startActivity(intent);
     }
 
 }
--- a/mobile/android/base/java/org/mozilla/gecko/MemoryMonitor.java
+++ b/mobile/android/base/java/org/mozilla/gecko/MemoryMonitor.java
@@ -8,54 +8,58 @@ package org.mozilla.gecko;
 import org.mozilla.gecko.annotation.WrapForJNI;
 import org.mozilla.gecko.db.BrowserDB;
 import org.mozilla.gecko.db.BrowserContract;
 import org.mozilla.gecko.db.BrowserProvider;
 import org.mozilla.gecko.home.ImageLoader;
 import org.mozilla.gecko.icons.storage.MemoryStorage;
 import org.mozilla.gecko.util.ThreadUtils;
 
+import android.annotation.SuppressLint;
 import android.content.BroadcastReceiver;
 import android.content.ComponentCallbacks2;
 import android.content.ContentResolver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.content.res.Configuration;
 import android.support.v4.content.LocalBroadcastManager;
 import android.util.Log;
 
 /**
-  * This is a utility class to keep track of how much memory and disk-space pressure
-  * the system is under. It receives input from GeckoActivity via the onLowMemory() and
-  * onTrimMemory() functions, and also listens for some system intents related to
-  * disk-space notifications. Internally it will track how much memory and disk pressure
+  * This is a utility class to keep track of how much memory and disk-space pressure the
+  * system is under. It registers itself as a ComponentCallbacks to receive all onLowMemory()/
+  * onTrimMemory() notifications for our app, and also listens for some system intents related
+  * to disk-space notifications. Internally it will track how much memory and disk pressure
   * the system is under, and perform various actions to help alleviate the pressure.
   *
   * Note that since there is no notification for when the system has lots of free memory
   * again, this class also assumes that, over time, the system will free up memory. This
   * assumption is implemented using a timer that slowly lowers the internal memory
   * pressure state if no new low-memory notifications are received.
   *
   * Synchronization note: MemoryMonitor contains an inner class PressureDecrementer. Both
   * of these classes may be accessed from various threads, and have both been designed to
   * be thread-safe. In terms of lock ordering, code holding the PressureDecrementer lock
   * is allowed to pick up the MemoryMonitor lock, but not vice-versa.
   */
-class MemoryMonitor extends BroadcastReceiver {
+class MemoryMonitor extends BroadcastReceiver implements ComponentCallbacks2 {
     private static final String LOGTAG = "GeckoMemoryMonitor";
     private static final String ACTION_MEMORY_DUMP = "org.mozilla.gecko.MEMORY_DUMP";
     private static final String ACTION_FORCE_PRESSURE = "org.mozilla.gecko.FORCE_MEMORY_PRESSURE";
 
     // Memory pressure levels. Keep these in sync with those in AndroidJavaWrappers.h
     private static final int MEMORY_PRESSURE_NONE = 0;
     private static final int MEMORY_PRESSURE_CLEANUP = 1;
     private static final int MEMORY_PRESSURE_LOW = 2;
     private static final int MEMORY_PRESSURE_MEDIUM = 3;
     private static final int MEMORY_PRESSURE_HIGH = 4;
 
+    // We're living as long as the application, so keeping a static reference to it is okay.
+    @SuppressLint("StaticFieldLeak")
     private static final MemoryMonitor sInstance = new MemoryMonitor();
 
     static MemoryMonitor getInstance() {
         return sInstance;
     }
 
     private Context mAppContext;
     private final PressureDecrementer mPressureDecrementer;
@@ -75,30 +79,33 @@ class MemoryMonitor extends BroadcastRec
 
         mAppContext = context.getApplicationContext();
         IntentFilter filter = new IntentFilter();
         filter.addAction(Intent.ACTION_DEVICE_STORAGE_LOW);
         filter.addAction(Intent.ACTION_DEVICE_STORAGE_OK);
         filter.addAction(ACTION_MEMORY_DUMP);
         filter.addAction(ACTION_FORCE_PRESSURE);
         mAppContext.registerReceiver(this, filter);
+        mAppContext.registerComponentCallbacks(this);
         mInited = true;
     }
 
+    @Override
     public void onLowMemory() {
         Log.d(LOGTAG, "onLowMemory() notification received");
         if (increaseMemoryPressure(MEMORY_PRESSURE_HIGH)) {
             // We need to wait on Gecko here, because if we haven't reduced
             // memory usage enough when we return from this, Android will kill us.
             if (GeckoThread.isStateAtLeast(GeckoThread.State.PROFILE_READY)) {
                 GeckoThread.waitOnGecko();
             }
         }
     }
 
+    @Override
     public void onTrimMemory(int level) {
         Log.d(LOGTAG, "onTrimMemory() notification received with level " + level);
         if (level == ComponentCallbacks2.TRIM_MEMORY_COMPLETE) {
             // We seem to get this just by entering the task switcher or hitting the home button.
             // Seems bogus, because we are the foreground app, or at least not at the end of the LRU list.
             // Just ignore it, and if there is a real memory pressure event (CRITICAL, MODERATE, etc),
             // we'll respond appropriately.
             return;
@@ -271,9 +278,14 @@ class MemoryMonitor extends BroadcastRec
 
             final ContentResolver cr = mContext.getContentResolver();
             mDB.expireHistory(cr, BrowserContract.ExpirePriority.AGGRESSIVE);
             mDB.removeThumbnails(cr);
 
             // TODO: drop or shrink disk caches
         }
     }
+
+    // Needed to implement the ComponentCallbacks2 interface - we're only really interested in the
+    // memory-related calls, though.
+    @Override
+    public void onConfigurationChanged(Configuration newConfig) { }
 }
--- a/mobile/android/base/java/org/mozilla/gecko/deeplink/DeepLinkContract.java
+++ b/mobile/android/base/java/org/mozilla/gecko/deeplink/DeepLinkContract.java
@@ -7,20 +7,25 @@ package org.mozilla.gecko.deeplink;
 
 // This class defines the contract when using deep links
 public class DeepLinkContract {
 
     // Sumo page for setting Fennec as default browser
     public static final String SUMO_DEFAULT_BROWSER = "https://support.mozilla.org/kb/make-firefox-default-browser-android?utm_source=inproduct&amp;utm_medium=settings&amp;utm_campaign=mobileandroid";
     public static final String DEEP_LINK_SCHEME = "firefox";
 
+    public static final String LINK_FXA_SIGNIN = "fxa-signin";
+
     public static final String LINK_DEFAULT_BROWSER = "default_browser";
     public static final String LINK_SAVE_AS_PDF = "save_as_pdf";
     public static final String LINK_BOOKMARK_LIST = "bookmark_list";
     public static final String LINK_HISTORY_LIST = "history_list";
     public static final String LINK_SIGN_UP = "sign_up";
     public static final String LINK_PREFERENCES = "preferences";
     public static final String LINK_PREFERENCES_PRIAVACY = "preferences_privacy";
     public static final String LINK_PREFERENCES_SEARCH = "preferences_search";
     public static final String LINK_PREFERENCES_NOTIFICATIONS = "preferences_notifications";
     public static final String LINK_PREFERENCES_ACCESSIBILITY = "preferences_accessibility";
 
+    public static final String ACCOUNTS_TOKEN_PARAM = "signin";
+    public static final String ACCOUNTS_ENTRYPOINT_PARAM = "entrypoint";
+    public static final String ACCOUNTS_UTM_PREFIX = "utm_";
 }
--- a/python/mozbuild/mozbuild/action/symbols_archive.py
+++ b/python/mozbuild/mozbuild/action/symbols_archive.py
@@ -20,17 +20,17 @@ def make_archive(archive_name, base, exc
         compress = ['**/*.sym']
     archive_basename = os.path.basename(archive_name)
     with open(archive_name, 'wb') as fh:
         with JarWriter(fileobj=fh, optimize=False, compress_level=5) as writer:
             for pat in include:
                 for p, f in finder.find(pat):
                     print('  Adding to "%s":\n\t"%s"' % (archive_basename, p))
                     should_compress = any(mozpath.match(p, pat) for pat in compress)
-                    writer.add(p.encode('utf-8'), f.read(), mode=f.mode,
+                    writer.add(p.encode('utf-8'), f, mode=f.mode,
                                compress=should_compress, skip_duplicates=True)
 
 def main(argv):
     parser = argparse.ArgumentParser(description='Produce a symbols archive')
     parser.add_argument('archive', help='Which archive to generate')
     parser.add_argument('base', help='Base directory to package')
     parser.add_argument('--exclude', default=[], action='append', help='File patterns to exclude')
     parser.add_argument('--include', default=[], action='append', help='File patterns to include')
--- a/servo/Cargo.lock
+++ b/servo/Cargo.lock
@@ -159,17 +159,17 @@ source = "registry+https://github.com/ru
 dependencies = [
  "byteorder 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "num-traits 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde 0.9.15 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "bindgen"
-version = "0.25.1"
+version = "0.25.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "aster 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "cexpr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "cfg-if 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "clang-sys 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "clap 2.20.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1053,30 +1053,30 @@ version = "0.9.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "color_quant 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "lzw 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "gl_generator"
-version = "0.5.2"
+version = "0.5.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "khronos_api 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "khronos_api 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
- "xml-rs 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "xml-rs 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "gleam"
 version = "0.4.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "gl_generator 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "gl_generator 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "glob"
 version = "0.2.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
@@ -1107,18 +1107,18 @@ dependencies = [
  "x11 2.14.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "glx"
 version = "0.1.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "gl_generator 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "khronos_api 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "gl_generator 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "khronos_api 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.23 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "half"
 version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
@@ -1356,17 +1356,17 @@ version = "0.2.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "khronos_api"
-version = "1.0.0"
+version = "1.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "language-tags"
 version = "0.2.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
@@ -1892,17 +1892,17 @@ source = "registry+https://github.com/ru
 name = "offscreen_gl_context"
 version = "0.8.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "cgl 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-foundation 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "euclid 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "gdi32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "gl_generator 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "gl_generator 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "gleam 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "lazy_static 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "libloading 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "osmesa-sys 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde 0.9.15 (registry+https://github.com/rust-lang/crates.io-index)",
  "user32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -2254,17 +2254,17 @@ version = "0.4.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "rust-webvr"
 version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "android_injected_glue 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "gl_generator 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "gl_generator 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "libloading 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde 0.9.15 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde_derive 0.9.15 (registry+https://github.com/rust-lang/crates.io-index)",
  "time 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
@@ -2574,17 +2574,17 @@ source = "registry+https://github.com/ru
 dependencies = [
  "android_glue 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "cgl 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "cocoa 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-foundation 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-graphics 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "dwmapi-sys 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "gdi32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "gl_generator 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "gl_generator 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "image 0.12.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "lazy_static 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.23 (registry+https://github.com/rust-lang/crates.io-index)",
  "objc 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "osmesa-sys 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "shared_library 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "shell32-sys 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -2818,17 +2818,17 @@ source = "registry+https://github.com/ru
 
 [[package]]
 name = "style"
 version = "0.0.1"
 dependencies = [
  "app_units 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "arrayvec 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)",
  "atomic_refcell 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "bindgen 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "bindgen 0.25.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "bit-vec 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "byteorder 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "cfg-if 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "cssparser 0.13.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "encoding 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
  "euclid 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "fnv 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -3400,20 +3400,20 @@ source = "registry+https://github.com/ru
 
 [[package]]
 name = "xi-unicode"
 version = "0.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "xml-rs"
-version = "0.3.5"
+version = "0.3.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "bitflags 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "xml5ever"
 version = "0.7.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -3437,17 +3437,17 @@ dependencies = [
 "checksum atomic_refcell 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fb2dcb6e6d35f20276943cc04bb98e538b348d525a04ac79c10021561d202f21"
 "checksum audio-video-metadata 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3b6ef29ee98ad95a37f34547fd7fb40724772294110ed6ca0445fc2e964c29d1"
 "checksum azure 0.15.0 (git+https://github.com/servo/rust-azure)" = "<none>"
 "checksum backtrace 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "72f9b4182546f4b04ebc4ab7f84948953a118bd6021a1b6a6c909e3e94f6be76"
 "checksum backtrace-sys 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "3a0d842ea781ce92be2bf78a9b38883948542749640b8378b3b2f03d1fd9f1ff"
 "checksum base64 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "30e93c03064e7590d0466209155251b90c22e37fab1daf2771582598b5827557"
 "checksum binary-space-partition 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "88ceb0d16c4fd0e42876e298d7d3ce3780dd9ebdcbe4199816a32c77e08597ff"
 "checksum bincode 1.0.0-alpha6 (registry+https://github.com/rust-lang/crates.io-index)" = "fb0cdeac1c5d567fdb487ae5853c024e4acf1ea85ba6a6552fe084e0805fea5d"
-"checksum bindgen 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)" = "708a688675f9d2e7c73018e17f5997beacc9a5ca87a0cb60c13093915facda32"
+"checksum bindgen 0.25.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e28791695e6e29a82038bd0489a760f362157dc1a3b2bbac9b6be3ddd984ff7"
 "checksum bit-set 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d9bf6104718e80d7b26a68fdbacff3481cfc05df670821affc7e9cbc1884400c"
 "checksum bit-vec 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "5b97c2c8e8bbb4251754f559df8af22fb264853c7d009084a576cdf12565089d"
 "checksum bitflags 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4f67931368edf3a9a51d29886d245f1c3db2f1ef0dcc9e35ff70341b78c10d23"
 "checksum bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aad18937a628ec6abcd26d1489012cc0e18c21798210f491af69ded9b881106d"
 "checksum bitflags 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1370e9fc2a6ae53aea8b7a5110edbd08836ed87c88736dfabccade1c2b44bff4"
 "checksum bitreader 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "80b13e2ab064ff3aa0bdbf1eff533f9822dc37899821f5f98c67f263eab51707"
 "checksum block 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a"
 "checksum blurdroid 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "9880ddea1a97824ae9fc176f718e2a029491cd7d10bac4061ba4063569f4bc64"
@@ -3510,17 +3510,17 @@ dependencies = [
 "checksum futf 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "51f93f3de6ba1794dcd5810b3546d004600a59a98266487c8407bc4b24e398f3"
 "checksum futures 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "55f0008e13fc853f79ea8fc86e931486860d4c4c156cdffb59fa5f7fa833660a"
 "checksum gamma-lut 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "41f72af1e933f296b827361eb9e70d0267abf8ad0de9ec7fa667bbe67177b297"
 "checksum gaol 0.0.1 (git+https://github.com/servo/gaol)" = "<none>"
 "checksum gcc 0.3.47 (registry+https://github.com/rust-lang/crates.io-index)" = "5773372df827453bc38d4fd8efe425c7f28b1f54468816183fc8716cfb90bd30"
 "checksum gdi32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0912515a8ff24ba900422ecda800b52f4016a56251922d397c576bf92c690518"
 "checksum getopts 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "d9047cfbd08a437050b363d35ef160452c5fe8ea5187ae0a624708c91581d685"
 "checksum gif 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8a80d6fe9e52f637df9afd4779449a7be17c39cc9c35b01589bb833f956ba596"
-"checksum gl_generator 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f1d8edc81c5ae84605a62f5dac661a2313003b26d59839f81d47d46cf0f16a55"
+"checksum gl_generator 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0940975a4ca12b088d32b5d5134826c47d2e73de4b0b459b05244c01503eccbb"
 "checksum gleam 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "a86944a6a4d7f54507f8ee930192d971f18a7b1da526ff529b7a0d4043935380"
 "checksum glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8be18de09a56b60ed0edf84bc9df007e30040691af7acd1c41874faac5895bfb"
 "checksum glx 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b280007fa9c7442cfd1e0b1addb8d1a59240267110e8705f8f7e2c7bfb7e2f72"
 "checksum half 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "63d68db75012a85555434ee079e7e6337931f87a087ab2988becbadf64673a7f"
 "checksum harfbuzz-sys 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "3072efe30deebdda55fcbe7c74c6d42f546fd8533488e43a692ea940ecface11"
 "checksum heapsize 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "556cd479866cf85c3f671209c85e8a6990211c916d1002c2fcb2e9b7cf60bc36"
 "checksum heapsize_derive 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "46f96d52fb1564059fc97b85ef6165728cc30198ab60073bf114c66c4c89bb5d"
 "checksum heartbeats-simple 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9ad003ce233955e9d95f2c69cde84e68302ba9ba4a673d351c9bff93c738aadc"
@@ -3537,17 +3537,17 @@ dependencies = [
 "checksum io-surface 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c35a3278fa52fb070fdc874dfd057163e6c21e0a9295f87f54daee9dd5530b43"
 "checksum iovec 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "29d062ee61fccdf25be172e70f34c9f6efc597e1fb8f6526e8437b2046ab26be"
 "checksum ipc-channel 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0b7639999a1fb3f63da25d4bc1f6fe9acbdcd127ae8c81caba66e4faf7bb884f"
 "checksum itertools 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4833d6978da405305126af4ac88569b5d71ff758581ce5a987dbfa3755f694fc"
 "checksum itoa 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "eb2f404fbc66fd9aac13e998248505e7ecb2ad8e44ab6388684c5fb11c6c251c"
 "checksum jpeg-decoder 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "919d49b634cde303392353c5dd51153ec005a1a981c6f4b8277692a51e9d260d"
 "checksum js 0.1.4 (git+https://github.com/servo/rust-mozjs)" = "<none>"
 "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
-"checksum khronos_api 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "09c9d3760673c427d46f91a0350f0a84a52e6bc5a84adf26dc610b6c52436630"
+"checksum khronos_api 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d5a08e2a31d665af8f1ca437eab6d00a93c9d62a549f73f9ed8fc2e55b5a91a7"
 "checksum language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a"
 "checksum lazy_static 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3b37545ab726dd833ec6420aaba8231c5b320814b9029ad585555d2a03e94fbf"
 "checksum lazycell 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ce12306c4739d86ee97c23139f3a34ddf0387bbf181bc7929d287025a8c3ef6b"
 "checksum leak 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bd100e01f1154f2908dfa7d02219aeab25d0b9c7fa955164192e3245255a0c73"
 "checksum leaky-cow 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "40a8225d44241fd324a8af2806ba635fc7c8a7e9a7de4d5cf3ef54e71f5926fc"
 "checksum libc 0.2.23 (registry+https://github.com/rust-lang/crates.io-index)" = "e7eb6b826bfc1fdea7935d46556250d1799b7fe2d9f7951071f4291710665e3e"
 "checksum libloading 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "be99f814beb3e9503a786a592c909692bb6d4fc5a695f6ed7987223acfbd5194"
 "checksum libz-sys 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)" = "e5ee912a45d686d393d5ac87fac15ba0ba18daae14e8e7543c63ebf7fb7e970c"
@@ -3691,10 +3691,10 @@ dependencies = [
 "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
 "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"
 "checksum ws 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "04614a58714f3fd4a8b1da4bcae9f031c532d35988c3d39627619248113f8be8"
 "checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e"
 "checksum x11 2.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "db27c597c187da52194a4b8232e7d869503911aab9ff726fefb76d7a830f78ed"
 "checksum x11-dl 2.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "326c500cdc166fd7c70dd8c8a829cd5c0ce7be5a5d98c25817de2b9bdc67faf8"
 "checksum xdg 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a66b7c2281ebde13cf4391d70d4c7e5946c3c25e72a7b859ca8f677dcd0b0c61"
 "checksum xi-unicode 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "12ea8eda4b1eb72f02d148402e23832d56a33f55d8c1b2d5bcdde91d79d47cb1"
-"checksum xml-rs 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f2b15eed12692bd59d15e98ee7f8dc8408465b992d8ddb4d1672c24865132ec7"
+"checksum xml-rs 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7ec6c39eaa68382c8e31e35239402c0a9489d4141a8ceb0c716099a0b515b562"
 "checksum xml5ever 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b556f07ec35053061ffa5a1b13468ed6a877a7563756719588fbe0623ee52939"
--- a/servo/components/layout/block.rs
+++ b/servo/components/layout/block.rs
@@ -26,17 +26,17 @@
 //!   http://dev.w3.org/csswg/css-sizing/
 
 #![deny(unsafe_code)]
 
 use app_units::{Au, MAX_AU};
 use context::LayoutContext;
 use display_list_builder::{BorderPaintingMode, DisplayListBuildState};
 use display_list_builder::BlockFlowDisplayListBuilding;
-use euclid::{Point2D, Size2D};
+use euclid::{Point2D, Size2D, Rect};
 use floats::{ClearType, FloatKind, Floats, PlacementInfo};
 use flow::{self, BaseFlow, EarlyAbsolutePositionInfo, Flow, FlowClass, ForceNonfloatedFlag};
 use flow::{BLOCK_POSITION_IS_STATIC, CLEARS_LEFT, CLEARS_RIGHT};
 use flow::{CONTAINS_TEXT_OR_REPLACED_FRAGMENTS, INLINE_POSITION_IS_STATIC};
 use flow::{FragmentationContext, MARGINS_CANNOT_COLLAPSE, PreorderFlowTraversal};
 use flow::{ImmutableFlowUtils, LateAbsolutePositionInfo, MutableFlowUtils, OpaqueFlow};
 use flow::IS_ABSOLUTELY_POSITIONED;
 use flow_list::FlowList;
@@ -642,16 +642,24 @@ impl BlockFlow {
         }
     }
 
     /// Return this flow's fragment.
     pub fn fragment(&mut self) -> &mut Fragment {
         &mut self.fragment
     }
 
+    pub fn stacking_relative_position(&self, coor: CoordinateSystem) -> Rect<Au> {
+        return self.fragment.stacking_relative_border_box(
+            &self.base.stacking_relative_position,
+            &self.base.early_absolute_position_info.relative_containing_block_size,
+            self.base.early_absolute_position_info.relative_containing_block_mode,
+            coor);
+    }
+
     /// Return the size of the containing block for the given immediate absolute descendant of this
     /// flow.
     ///
     /// Right now, this only gets the containing block size for absolutely positioned elements.
     /// Note: We assume this is called in a top-down traversal, so it is ok to reference the CB.
     #[inline]
     pub fn containing_block_size(&self, viewport_size: &Size2D<Au>, descendant: OpaqueFlow)
                                  -> LogicalSize<Au> {
--- a/servo/components/layout/display_list_builder.rs
+++ b/servo/components/layout/display_list_builder.rs
@@ -2203,23 +2203,17 @@ impl PreservedDisplayListState {
 
 impl BlockFlowDisplayListBuilding for BlockFlow {
     fn transform_clip_to_coordinate_space(&mut self,
                                           state: &mut DisplayListBuildState,
                                           preserved_state: &mut PreservedDisplayListState) {
         if state.clip_stack.is_empty() {
             return;
         }
-
-        let border_box = self.fragment.stacking_relative_border_box(
-            &self.base.stacking_relative_position,
-            &self.base.early_absolute_position_info.relative_containing_block_size,
-            self.base.early_absolute_position_info.relative_containing_block_mode,
-            CoordinateSystem::Parent);
-
+        let border_box = self.stacking_relative_position(CoordinateSystem::Parent);
         let transform = match self.fragment.transform_matrix(&border_box) {
             Some(transform) => transform,
             None => return,
         };
 
         let perspective = self.fragment.perspective_matrix(&border_box)
                                        .unwrap_or_else(Matrix4D::identity);
         let transform = transform.pre_mul(&perspective).inverse();
--- a/servo/components/layout/sequential.rs
+++ b/servo/components/layout/sequential.rs
@@ -7,138 +7,154 @@
 use app_units::Au;
 use context::LayoutContext;
 use display_list_builder::DisplayListBuildState;
 use euclid::point::Point2D;
 use floats::SpeculatedFloatPlacement;
 use flow::{self, Flow, ImmutableFlowUtils, InorderFlowTraversal, MutableFlowUtils};
 use flow::{PostorderFlowTraversal, PreorderFlowTraversal};
 use flow::IS_ABSOLUTELY_POSITIONED;
-use fragment::FragmentBorderBoxIterator;
+use fragment::{FragmentBorderBoxIterator, CoordinateSystem};
 use generated_content::ResolveGeneratedContent;
 use incremental::RelayoutMode;
 use servo_config::opts;
 use style::servo::restyle_damage::{REFLOW, REFLOW_OUT_OF_FLOW, STORE_OVERFLOW};
 use traversal::{AssignBSizes, AssignISizes, BubbleISizes, BuildDisplayList};
 
 pub use style::sequential::traverse_dom;
 
 pub fn resolve_generated_content(root: &mut Flow, layout_context: &LayoutContext) {
     fn doit(flow: &mut Flow, level: u32, traversal: &mut ResolveGeneratedContent) {
         if !traversal.should_process(flow) {
-            return
+            return;
         }
 
         traversal.process(flow, level);
 
         for kid in flow::mut_base(flow).children.iter_mut() {
             doit(kid, level + 1, traversal)
         }
     }
 
     let mut traversal = ResolveGeneratedContent::new(&layout_context);
     doit(root, 0, &mut traversal)
 }
 
-pub fn traverse_flow_tree_preorder(root: &mut Flow,
-                                   layout_context: &LayoutContext,
-                                   relayout_mode: RelayoutMode) {
+pub fn traverse_flow_tree_preorder(root: &mut Flow, layout_context: &LayoutContext, relayout_mode: RelayoutMode) {
     fn doit(flow: &mut Flow,
             assign_inline_sizes: AssignISizes,
             assign_block_sizes: AssignBSizes,
             relayout_mode: RelayoutMode) {
         // Force reflow children during this traversal. This is needed when we failed
         // the float speculation of a block formatting context and need to fix it.
         if relayout_mode == RelayoutMode::Force {
-            flow::mut_base(flow).restyle_damage.insert(REFLOW_OUT_OF_FLOW | REFLOW);
+            flow::mut_base(flow)
+                .restyle_damage
+                .insert(REFLOW_OUT_OF_FLOW | REFLOW);
         }
 
         if assign_inline_sizes.should_process(flow) {
             assign_inline_sizes.process(flow);
         }
 
         for kid in flow::child_iter_mut(flow) {
             doit(kid, assign_inline_sizes, assign_block_sizes, relayout_mode);
         }
 
         if assign_block_sizes.should_process(flow) {
             assign_block_sizes.process(flow);
         }
     }
 
     if opts::get().bubble_inline_sizes_separately {
-        let bubble_inline_sizes = BubbleISizes { layout_context: &layout_context };
+        let bubble_inline_sizes = BubbleISizes {
+            layout_context: &layout_context,
+        };
         {
             let root: &mut Flow = root;
             root.traverse_postorder(&bubble_inline_sizes);
         }
     }
 
-    let assign_inline_sizes = AssignISizes { layout_context: &layout_context };
-    let assign_block_sizes  = AssignBSizes { layout_context: &layout_context };
+    let assign_inline_sizes = AssignISizes {
+        layout_context: &layout_context,
+    };
+    let assign_block_sizes = AssignBSizes {
+        layout_context: &layout_context,
+    };
 
     doit(root, assign_inline_sizes, assign_block_sizes, relayout_mode);
 }
 
 pub fn build_display_list_for_subtree<'a>(flow_root: &mut Flow,
                                           layout_context: &'a LayoutContext)
                                           -> DisplayListBuildState<'a> {
     let mut state = DisplayListBuildState::new(layout_context);
     flow_root.collect_stacking_contexts(&mut state);
 
-    let mut build_display_list = BuildDisplayList { state: state };
+    let mut build_display_list = BuildDisplayList {
+        state: state,
+    };
     build_display_list.traverse(flow_root);
     build_display_list.state
 }
 
-pub fn iterate_through_flow_tree_fragment_border_boxes(root: &mut Flow,
-                                                       iterator: &mut FragmentBorderBoxIterator) {
+pub fn iterate_through_flow_tree_fragment_border_boxes(root: &mut Flow, iterator: &mut FragmentBorderBoxIterator) {
     fn doit(flow: &mut Flow,
             level: i32,
             iterator: &mut FragmentBorderBoxIterator,
             stacking_context_position: &Point2D<Au>) {
         flow.iterate_through_fragment_border_boxes(iterator, level, stacking_context_position);
 
         for kid in flow::mut_base(flow).child_iter_mut() {
-            let stacking_context_position =
-                if kid.is_block_flow() && kid.as_block().fragment.establishes_stacking_context() {
-                    let margin = Point2D::new(kid.as_block().fragment.margin.inline_start, Au(0));
-                    *stacking_context_position + flow::base(kid).stacking_relative_position + margin
-                } else {
-                    *stacking_context_position
-                };
-
-            // FIXME(#2795): Get the real container size.
+            let mut stacking_context_position = *stacking_context_position;
+            if kid.is_block_flow() && kid.as_block().fragment.establishes_stacking_context() {
+                stacking_context_position = Point2D::new(kid.as_block().fragment.margin.inline_start, Au(0)) +
+                                            flow::base(kid).stacking_relative_position +
+                                            stacking_context_position;
+                let relative_position = kid.as_block()
+                    .stacking_relative_position(CoordinateSystem::Own);
+                if let Some(matrix) = kid.as_block()
+                       .fragment
+                       .transform_matrix(&relative_position) {
+                    let transform_matrix = matrix.transform_point(&Point2D::zero());
+                    stacking_context_position = stacking_context_position +
+                                                Point2D::new(Au::from_f32_px(transform_matrix.x),
+                                                             Au::from_f32_px(transform_matrix.y))
+                }
+            }
             doit(kid, level + 1, iterator, &stacking_context_position);
         }
     }
 
     doit(root, 0, iterator, &Point2D::zero());
 }
 
 pub fn store_overflow(layout_context: &LayoutContext, flow: &mut Flow) {
     if !flow::base(flow).restyle_damage.contains(STORE_OVERFLOW) {
-        return
+        return;
     }
 
     for mut kid in flow::mut_base(flow).child_iter_mut() {
         store_overflow(layout_context, kid);
     }
 
     flow.store_overflow(layout_context);
 
-    flow::mut_base(flow).restyle_damage.remove(STORE_OVERFLOW);
+    flow::mut_base(flow)
+        .restyle_damage
+        .remove(STORE_OVERFLOW);
 }
 
 /// Guesses how much inline size will be taken up by floats on the left and right sides of the
 /// given flow. This is needed to speculatively calculate the inline sizes of block formatting
 /// contexts. The speculation typically succeeds, but if it doesn't we have to lay it out again.
 pub fn guess_float_placement(flow: &mut Flow) {
     if !flow::base(flow).restyle_damage.intersects(REFLOW) {
-        return
+        return;
     }
 
     let mut floats_in = SpeculatedFloatPlacement::compute_floats_in_for_first_child(flow);
     for kid in flow::mut_base(flow).child_iter_mut() {
         if flow::base(kid).flags.contains(IS_ABSOLUTELY_POSITIONED) {
             // Do not propagate floats in or out, but do propogate between kids.
             guess_float_placement(kid);
         } else {
--- a/servo/components/style/Cargo.toml
+++ b/servo/components/style/Cargo.toml
@@ -71,12 +71,12 @@ unicode-bidi = {version = "0.3", feature
 unicode-segmentation = "1.0"
 
 [target.'cfg(windows)'.dependencies]
 kernel32-sys = "0.2"
 
 [build-dependencies]
 lazy_static = "0.2"
 log = "0.3"
-bindgen = { version = "0.25.1", optional = true }
+bindgen = { version = "0.25.3", optional = true }
 regex = {version = "0.2", optional = true}
 walkdir = "1.0"
 toml = {version = "0.2.1", optional = true, default-features = false}
--- a/servo/python/servo/package_commands.py
+++ b/servo/python/servo/package_commands.py
@@ -54,16 +54,34 @@ PACKAGES = {
     ],
     'windows-msvc': [
         r'target\release\msi\Servo.msi',
         r'target\release\msi\Servo.zip',
     ],
 }
 
 
+TemporaryDirectory = None
+if sys.version_info >= (3, 2):
+    TemporaryDirectory = tempfile.TemporaryDirectory
+else:
+    import contextlib
+
+    # Not quite as robust as tempfile.TemporaryDirectory,
+    # but good enough for most purposes
+    @contextlib.contextmanager
+    def TemporaryDirectory(**kwargs):
+        dir_name = tempfile.mkdtemp(**kwargs)
+        try:
+            yield dir_name
+        except Exception as e:
+            shutil.rmtree(dir_name)
+            raise e
+
+
 def otool(s):
     o = subprocess.Popen(['/usr/bin/otool', '-L', s], stdout=subprocess.PIPE)
     for l in o.stdout:
         if l[0] == '\t':
             yield l.split(' ', 1)[0][1:]
 
 
 def listfiles(directory):
@@ -437,17 +455,17 @@ class PackageCommands(CommandBase):
             package_url = 'https://download.servo.org/nightly/macbrew/{}'.format(
                 nightly_filename(package, timestamp)
             )
             with open(package) as p:
                 digest = hashlib.sha256(p.read()).hexdigest()
 
             brew_version = timestamp.strftime('%Y.%m.%d')
 
-            with tempfile.TemporaryDirectory(prefix='homebrew-servo') as tmp_dir:
+            with TemporaryDirectory(prefix='homebrew-servo') as tmp_dir:
                 def call_git(cmd, **kwargs):
                     subprocess.check_call(
                         ['git', '-C', tmp_dir] + cmd,
                         **kwargs
                     )
 
                 call_git([
                     'clone',
@@ -456,17 +474,17 @@ class PackageCommands(CommandBase):
                 ])
 
                 script_dir = path.dirname(path.realpath(__file__))
                 with open(path.join(script_dir, 'servo-binary-formula.rb.in')) as f:
                     formula = f.read()
                 formula = formula.replace('PACKAGEURL', package_url)
                 formula = formula.replace('SHA', digest)
                 formula = formula.replace('VERSION', brew_version)
-                with open(path.join(tmp_dir, 'Formula', 'servo-bin.rb')) as f:
+                with open(path.join(tmp_dir, 'Formula', 'servo-bin.rb'), 'w') as f:
                     f.write(formula)
 
                 call_git(['add', path.join('.', 'Formula', 'servo-bin.rb')])
                 call_git([
                     '-c', 'user.name=Tom Servo',
                     '-c', 'user.email=servo@servo.org',
                     'commit',
                     '--message=Version Bump: {}'.format(brew_version),
@@ -486,11 +504,13 @@ class PackageCommands(CommandBase):
                 print("Could not find package for {} at {}".format(
                     platform,
                     package
                 ), file=sys.stderr)
                 return 1
             upload_to_s3(platform, package, timestamp)
 
         if platform == 'macbrew':
-            update_brew(package, timestamp)
+            packages = PACKAGES[platform]
+            assert(len(packages) == 1)
+            update_brew(packages[0], timestamp)
 
         return 0
rename from servo/etc/ci/servo-binary-formula.rb.in
rename to servo/python/servo/servo-binary-formula.rb.in
--- a/taskcluster/ci/build/linux.yml
+++ b/taskcluster/ci/build/linux.yml
@@ -239,16 +239,40 @@ linux64-asan/opt:
             - builds/releng_base_linux_64_builds.py
             - balrog/production.py
         script: "mozharness/scripts/fx_desktop_build.py"
         secrets: true
         custom-build-variant-cfg: asan-tc
         tooltool-downloads: public
         need-xvfb: true
 
+
+linux64-asan-fuzzing/opt:
+    description: "Linux64 Fuzzing Opt ASAN"
+    index:
+        product: firefox
+        job-name: linux64-fuzzing-asan-opt
+    treeherder:
+        platform: linux64/asan
+        symbol: tc(Bof)
+    worker-type: aws-provisioner-v1/gecko-{level}-b-linux
+    worker:
+        max-run-time: 36000
+    run:
+        using: mozharness
+        actions: [get-secrets build generate-build-stats check-test update]
+        config:
+            - builds/releng_base_linux_64_builds.py
+            - balrog/production.py
+        script: "mozharness/scripts/fx_desktop_build.py"
+        secrets: true
+        custom-build-variant-cfg: fuzzing-asan-tc
+        tooltool-downloads: public
+        need-xvfb: true
+
 linux64-asan/debug:
     description: "Linux64 Debug ASAN"
     index:
         product: firefox
         job-name: linux64-asan-debug
     treeherder:
         platform: linux64/asan
         symbol: tc(Bd)
@@ -412,59 +436,8 @@ linux64-add-on-devel/opt:
             - builds/releng_base_linux_64_builds.py
             - balrog/production.py
         script: "mozharness/scripts/fx_desktop_build.py"
         secrets: true
         custom-build-variant-cfg: add-on-devel
         tooltool-downloads: public
         need-xvfb: true
     run-on-projects: [ 'mozilla-beta', 'mozilla-release', 'mozilla-esr45' ]
-
-linux-qr/opt:
-    description: "Linux32 Opt QuantumRender"
-    index:
-        product: firefox
-        job-name: linux-qr-opt
-    treeherder:
-        platform: linux32-qr/opt
-        symbol: tc(B)
-        tier: 2
-    worker-type: aws-provisioner-v1/gecko-{level}-b-linux
-    worker:
-        max-run-time: 36000
-    run:
-        using: mozharness
-        actions: [get-secrets build generate-build-stats check-test update]
-        config:
-            - builds/releng_base_linux_32_builds.py
-            - balrog/production.py
-        script: "mozharness/scripts/fx_desktop_build.py"
-        secrets: true
-        custom-build-variant-cfg: qr-opt
-        tooltool-downloads: public
-        need-xvfb: true
-    run-on-projects: [ 'graphics' ]
-
-linux-qr/debug:
-    description: "Linux32 Debug QuantumRender"
-    index:
-        product: firefox
-        job-name: linux-qr-debug
-    treeherder:
-        platform: linux32-qr/debug
-        symbol: tc(B)
-        tier: 2
-    worker-type: aws-provisioner-v1/gecko-{level}-b-linux
-    worker:
-        max-run-time: 36000
-    coalesce-name: dbg_linux32
-    run:
-        using: mozharness
-        actions: [get-secrets build generate-build-stats check-test update]
-        config:
-            - builds/releng_base_linux_32_builds.py
-            - balrog/production.py
-        script: "mozharness/scripts/fx_desktop_build.py"
-        secrets: true
-        custom-build-variant-cfg: qr-debug
-        tooltool-downloads: public
-        need-xvfb: true
-    run-on-projects: [ 'graphics' ]
--- a/taskcluster/ci/build/macosx.yml
+++ b/taskcluster/ci/build/macosx.yml
@@ -36,64 +36,16 @@ macosx64/opt:
         actions: [get-secrets build generate-build-stats update]
         config:
             - builds/releng_base_mac_64_builds.py
             - balrog/production.py
         script: "mozharness/scripts/fx_desktop_build.py"
         secrets: true
         tooltool-downloads: internal
 
-macosx64-qr/debug:
-    description: "MacOS X x64 QuantumRender"
-    index:
-        product: firefox
-        job-name: macosx64-qr-debug
-    treeherder:
-        platform: osx-10-7-qr/debug
-        symbol: tc(B)
-        tier: 2
-    worker-type: aws-provisioner-v1/gecko-{level}-b-macosx64
-    worker:
-        max-run-time: 36000
-    run:
-        using: mozharness
-        actions: [get-secrets build generate-build-stats update]
-        config:
-            - builds/releng_base_mac_64_cross_builds.py
-            - balrog/production.py
-        script: "mozharness/scripts/fx_desktop_build.py"
-        secrets: true
-        custom-build-variant-cfg: cross-qr-debug
-        tooltool-downloads: internal
-    run-on-projects: [ 'graphics' ]
-
-macosx64-qr/opt:
-    description: "MacOS X x64 QuantumRender"
-    index:
-        product: firefox
-        job-name: macosx64-qr-opt
-    treeherder:
-        platform: osx-10-7-qr/opt
-        symbol: tc(B)
-        tier: 2
-    worker-type: aws-provisioner-v1/gecko-{level}-b-macosx64
-    worker:
-        max-run-time: 36000
-    run:
-        using: mozharness
-        actions: [get-secrets build generate-build-stats update]
-        config:
-            - builds/releng_base_mac_64_cross_builds.py
-            - balrog/production.py
-        script: "mozharness/scripts/fx_desktop_build.py"
-        secrets: true
-        custom-build-variant-cfg: cross-qr-opt
-        tooltool-downloads: internal
-    run-on-projects: [ 'graphics' ]
-
 macosx64-add-on-devel/opt:
     description: "MacOS X x64 add-on-devel"
     index:
         product: firefox
         job-name: macosx64-add-on-devel
     treeherder:
         platform: osx-10-7-add-on-devel/opt
         symbol: tc(B)
--- a/taskcluster/ci/build/windows.yml
+++ b/taskcluster/ci/build/windows.yml
@@ -166,92 +166,16 @@ win64-add-on-devel/opt:
      run:
          using: mozharness
          script: "mozharness/scripts/fx_desktop_build.py"
          config:
              - builds/taskcluster_firefox_windows_64_addondevel.py 
              - balrog/production.py
      run-on-projects: [ 'mozilla-beta', 'mozilla-release', 'mozilla-esr45' ]
 
-win64-qr/debug:
-    description: "Win64 Debug QuantumRender"
-    index:
-        product: firefox
-        job-name: win64-qr-debug
-    treeherder:
-        platform: windows2012-64-qr/debug
-        symbol: tc(B)
-        tier: 2
-    worker-type: aws-provisioner-v1/gecko-{level}-b-win2012
-    worker:
-        max-run-time: 7200
-    run:
-        using: mozharness
-        script: mozharness/scripts/fx_desktop_build.py
-        config:
-            - builds/taskcluster_firefox_win64_qr_debug.py
-    run-on-projects: [ 'graphics' ]
-
-win64-qr/opt:
-    description: "Win64 Opt QuantumRender"
-    index:
-        product: firefox
-        job-name: win64-qr-opt
-    treeherder:
-        platform: windows2012-64-qr/opt
-        symbol: tc(B)
-        tier: 2
-    worker-type: aws-provisioner-v1/gecko-{level}-b-win2012
-    worker:
-        max-run-time: 7200
-    run:
-        using: mozharness
-        script: mozharness/scripts/fx_desktop_build.py
-        config:
-            - builds/taskcluster_firefox_win64_qr_opt.py
-    run-on-projects: [ 'graphics' ]
-
-win32-qr/debug:
-    description: "Win32 Debug QuantumRender"
-    index:
-        product: firefox
-        job-name: win32-qr-debug
-    treeherder:
-        platform: windows2012-32-qr/debug
-        symbol: tc(B)
-        tier: 2
-    worker-type: aws-provisioner-v1/gecko-{level}-b-win2012
-    worker:
-        max-run-time: 7200
-    run:
-        using: mozharness
-        script: mozharness/scripts/fx_desktop_build.py
-        config:
-            - builds/taskcluster_firefox_win32_qr_debug.py
-    run-on-projects: [ 'graphics' ]
-
-win32-qr/opt:
-    description: "Win32 Opt QuantumRender"
-    index:
-        product: firefox
-        job-name: win32-qr-opt
-    treeherder:
-        platform: windows2012-32-qr/opt
-        symbol: tc(B)
-        tier: 2
-    worker-type: aws-provisioner-v1/gecko-{level}-b-win2012
-    worker:
-        max-run-time: 7200
-    run:
-        using: mozharness
-        script: mozharness/scripts/fx_desktop_build.py
-        config:
-            - builds/taskcluster_firefox_win32_qr_opt.py
-    run-on-projects: [ 'graphics' ]
-
 win64-asan/debug:
     description: "Win64 Debug ASAN"
     index:
         product: firefox
         job-name: win64-asan-debug
     treeherder:
         platform: windows2012-64/asan
         symbol: tc(Bd)
--- a/taskcluster/taskgraph/transforms/gecko_v2_whitelist.py
+++ b/taskcluster/taskgraph/transforms/gecko_v2_whitelist.py
@@ -24,40 +24,37 @@ JOB_NAME_WHITELIST = set([
     'android-api-15-old-id-opt',
     'android-x86-opt',
     'android-x86-old-id-opt',
     'browser-haz-debug',
     'linux-debug',
     'linux-devedition',
     'linux-opt',
     'linux-pgo',
-    'linux-qr-debug',
-    'linux-qr-opt',
     'linux64-add-on-devel',
     'linux64-artifact-opt',
     'linux64-asan-debug',
     'linux64-asan-opt',
+    'linux64-fuzzing-asan-opt',
     'linux64-ccov-opt',
     'linux64-clang-tidy',
     'linux64-debug',
     'linux64-devedition',
     'linux64-jsdcov-opt',
     'linux64-opt',
     'linux64-pgo',
     'linux64-st-an-debug',
     'linux64-st-an-opt',
     'linux64-stylo-debug',
     'linux64-stylo-opt',
     'linux64-valgrind-opt',
     'macosx64-add-on-devel',
     'macosx64-clang-tidy',
     'macosx64-debug',
     'macosx64-opt',
-    'macosx64-qr-debug',
-    'macosx64-qr-opt',
     'macosx64-st-an-debug',
     'macosx64-st-an-opt',
     'shell-haz-debug',
     'sm-arm-sim-debug',
     'sm-arm64-sim-debug',
     'sm-asan-opt',
     'sm-compacting-debug',
     'sm-fuzzing',
@@ -69,29 +66,25 @@ JOB_NAME_WHITELIST = set([
     'sm-plaindebug-debug',
     'sm-rootanalysis-debug',
     'sm-tsan-opt',
     'win32-add-on-devel',
     'win32-clang-tidy',
     'win32-debug',
     'win32-opt',
     'win32-pgo',
-    'win32-qr-debug',
-    'win32-qr-opt',
     'win32-st-an-debug',
     'win32-st-an-opt',
     'win64-add-on-devel',
     'win64-clang-tidy',
     'win64-debug',
     'win64-opt',
     'win64-pgo',
     'win64-st-an-debug',
     'win64-st-an-opt',
-    'win64-qr-debug',
-    'win64-qr-opt',
     'win64-asan-debug',
     'win64-asan-opt',
 ])
 
 JOB_NAME_WHITELIST_ERROR = """\
 The gecko-v2 job name {} is not in the whitelist in gecko_v2_whitelist.py.
 If this job runs on Buildbot, please ensure that the job names match between
 Buildbot and TaskCluster, then add the job name to the whitelist.  If this is a
--- a/taskcluster/taskgraph/transforms/source_test.py
+++ b/taskcluster/taskgraph/transforms/source_test.py
@@ -98,17 +98,10 @@ def handle_platform(config, jobs):
         platform = job['platform']
 
         for field in fields:
             resolve_keyed_by(job, field, item_name=job['name'])
 
         if 'treeherder' in job:
             job['treeherder']['platform'] = platform
 
-        build_platform, build_type = platform.split('/')
-
-        job['attributes'].update({
-            'build_platform': build_platform,
-            'build_type': build_type,
-        })
-
         del job['platform']
         yield job
--- a/taskcluster/taskgraph/try_option_syntax.py
+++ b/taskcluster/taskgraph/try_option_syntax.py
@@ -581,19 +581,26 @@ class TryOptionSyntax(object):
                 if platform not in test['platforms']:
                     return False
             if 'only_chunks' in test and attr('test_chunk') not in test['only_chunks']:
                 return False
             return True
 
         job_try_name = attr('job_try_name')
         if job_try_name:
-            if self.jobs is None or job_try_name in self.jobs:
+            # Beware the subtle distinction between [] and None for self.jobs and self.platforms.
+            # They will be [] if there was no try syntax, and None if try syntax was detected but
+            # they remained unspecified.
+            if self.jobs and job_try_name not in self.jobs:
+                return False
+            elif not self.jobs and attr('build_platform'):
                 if self.platforms is None or attr('build_platform') in self.platforms:
                     return True
+                return False
+            return True
         elif attr('kind') == 'test':
             return match_test(self.unittests, 'unittest_try_name') \
                  or match_test(self.talos, 'talos_try_name')
         elif attr('kind') in BUILD_KINDS:
             if attr('build_type') not in self.build_types:
                 return False
             elif self.platforms is None:
                 # for "-p all", look for try in the 'run_on_projects' attribute
--- a/testing/awsy/conf/prefs.json
+++ b/testing/awsy/conf/prefs.json
@@ -1,12 +1,11 @@
 {
+    "browser.urlbar.userMadeSearchSuggestionsChoice": true,
+    "image.mem.surfacecache.min_expiration_ms": 10000,
     "network.proxy.socks": "localhost",
     "network.proxy.socks_port": 90000,
     "network.proxy.socks_remote_dns": true,
     "network.proxy.type": 1,
-    "startup.homepage_welcome_url": "",
+    "plugin.disable": true,
     "startup.homepage_override_url": "",
-    "browser.newtab.url": "about:blank",
-    "browser.displayedE10SNotice": 1000,
-    "plugin.disable": true,
-    "image.mem.surfacecache.min_expiration_ms": 10000
+    "startup.homepage_welcome_url": ""
 }
deleted file mode 100644
--- a/testing/mozharness/configs/builds/releng_sub_linux_configs/32_qr_debug.py
+++ /dev/null
@@ -1,44 +0,0 @@
-import os
-
-MOZ_OBJDIR = 'obj-firefox'
-
-config = {
-    'default_actions': [
-        'clobber',
-        'clone-tools',
-        'checkout-sources',
-        'setup-mock',
-        'build',
-        # 'generate-build-stats',
-        'upload-files',
-        'sendchange',
-        'check-test',
-        'update',  # decided by query_is_nightly()
-    ],
-    'debug_build': True,
-    'stage_platform': 'linux-debug',
-    'enable_signing': False,
-    'enable_talos_sendchange': False,
-    #### 32 bit build specific #####
-    'env': {
-        'MOZBUILD_STATE_PATH': os.path.join(os.getcwd(), '.mozbuild'),
-        'DISPLAY': ':2',
-        'HG_SHARE_BASE_DIR': '/builds/hg-shared',
-        'MOZ_OBJDIR': MOZ_OBJDIR,
-        'MOZ_CRASHREPORTER_NO_REPORT': '1',
-        'CCACHE_DIR': '/builds/ccache',
-        'CCACHE_COMPRESS': '1',
-        'CCACHE_UMASK': '002',
-        'LC_ALL': 'C',
-        # 32 bit specific
-        'PATH': '/tools/buildbot/bin:/usr/local/bin:/usr/lib/ccache:/bin:\
-/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/tools/git/bin:/tools/python27/bin:\
-/tools/python27-mercurial/bin:/home/cltbld/bin',
-        'LD_LIBRARY_PATH': '/tools/gcc-4.3.3/installed/lib:\
-%s/dist/bin' % (MOZ_OBJDIR,),
-        'XPCOM_DEBUG_BREAK': 'stack-and-abort',
-        'TINDERBOX_OUTPUT': '1',
-    },
-    'src_mozconfig': 'browser/config/mozconfigs/linux32/debug-qr',
-    #######################
-}
deleted file mode 100644
--- a/testing/mozharness/configs/builds/releng_sub_linux_configs/32_qr_opt.py
+++ /dev/null
@@ -1,7 +0,0 @@
-import os
-
-MOZ_OBJDIR = 'obj-firefox'
-
-config = {
-    'src_mozconfig': 'browser/config/mozconfigs/linux32/opt-qr',
-}
new file mode 100644
--- /dev/null
+++ b/testing/mozharness/configs/builds/releng_sub_linux_configs/64_fuzzing_asan_tc.py
@@ -0,0 +1,48 @@
+import os
+
+MOZ_OBJDIR = 'obj-firefox'
+
+config = {
+    'default_actions': [
+        'clobber',
+        'clone-tools',
+        'checkout-sources',
+        'setup-mock',
+        'build',
+        # 'generate-build-stats',
+        'upload-files',
+        'sendchange',
+        'check-test',
+        # 'update',
+    ],
+    'stage_platform': 'linux64-fuzzing-asan',
+    'publish_nightly_en_US_routes': False,
+    'build_type': 'asan',
+    'tooltool_manifest_src': "browser/config/tooltool-manifests/linux64/\
+asan.manifest",
+    'platform_supports_post_upload_to_latest': False,
+    'enable_signing': False,
+    'enable_talos_sendchange': False,
+    #### 64 bit build specific #####
+    'env': {
+        'MOZBUILD_STATE_PATH': os.path.join(os.getcwd(), '.mozbuild'),
+        'MOZ_AUTOMATION': '1',
+        'DISPLAY': ':2',
+        'HG_SHARE_BASE_DIR': '/builds/hg-shared',
+        'MOZ_OBJDIR': 'obj-firefox',
+        'TINDERBOX_OUTPUT': '1',
+        'TOOLTOOL_CACHE': '/builds/tooltool_cache',
+        'TOOLTOOL_HOME': '/builds',
+        'MOZ_CRASHREPORTER_NO_REPORT': '1',
+        'CCACHE_DIR': '/builds/ccache',
+        'CCACHE_COMPRESS': '1',
+        'CCACHE_UMASK': '002',
+        'LC_ALL': 'C',
+        ## 64 bit specific
+        'PATH': '/tools/buildbot/bin:/usr/local/bin:/usr/lib64/ccache:/bin:\
+/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/tools/git/bin:/tools/python27/bin:\
+/tools/python27-mercurial/bin:/home/cltbld/bin',
+    },
+    'src_mozconfig': 'browser/config/mozconfigs/linux64/nightly-fuzzing-asan',
+    #######################
+}
deleted file mode 100644
--- a/testing/mozharness/configs/builds/releng_sub_linux_configs/64_qr_debug.py
+++ /dev/null
@@ -1,44 +0,0 @@
-import os
-
-MOZ_OBJDIR = 'obj-firefox'
-
-config = {
-    'default_actions': [
-        'clobber',
-        'clone-tools',
-        'checkout-sources',
-        'setup-mock',
-        'build',
-        # 'generate-build-stats',
-        'upload-files',
-        'sendchange',
-        'check-test',
-        'update',  # decided by query_is_nightly()
-    ],
-    'stage_platform': 'linux64-debug',
-    'debug_build': True,
-    'enable_signing': False,
-    'enable_talos_sendchange': False,
-    #### 64 bit build specific #####
-    'env': {
-        'MOZBUILD_STATE_PATH': os.path.join(os.getcwd(), '.mozbuild'),
-        'DISPLAY': ':2',
-        'HG_SHARE_BASE_DIR': '/builds/hg-shared',
-        'MOZ_OBJDIR': MOZ_OBJDIR,
-        'MOZ_CRASHREPORTER_NO_REPORT': '1',
-        'CCACHE_DIR': '/builds/ccache',
-        'CCACHE_COMPRESS': '1',
-        'CCACHE_UMASK': '002',
-        'LC_ALL': 'C',
-        'XPCOM_DEBUG_BREAK': 'stack-and-abort',
-        # 64 bit specific
-        'PATH': '/tools/buildbot/bin:/usr/local/bin:/usr/lib64/ccache:/bin:\
-/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/tools/git/bin:/tools/python27/bin:\
-/tools/python27-mercurial/bin:/home/cltbld/bin',
-        'LD_LIBRARY_PATH': '/tools/gcc-4.3.3/installed/lib64:\
-%s/dist/bin' % (MOZ_OBJDIR,),
-        'TINDERBOX_OUTPUT': '1',
-    },
-    'src_mozconfig': 'browser/config/mozconfigs/linux64/debug-qr',
-    #######################
-}
deleted file mode 100644
--- a/testing/mozharness/configs/builds/releng_sub_linux_configs/64_qr_opt.py
+++ /dev/null
@@ -1,7 +0,0 @@
-import os
-
-MOZ_OBJDIR = 'obj-firefox'
-
-config = {
-    'src_mozconfig': 'browser/config/mozconfigs/linux64/opt-qr',
-}
deleted file mode 100644
--- a/testing/mozharness/configs/builds/releng_sub_mac_configs/64_cross_qr_debug.py
+++ /dev/null
@@ -1,42 +0,0 @@
-import os
-
-MOZ_OBJDIR = 'obj-firefox'
-
-config = {
-    'default_actions': [
-        'clobber',
-        'clone-tools',
-        'checkout-sources',
-        # 'setup-mock',
-        'build',
-        # 'generate-build-stats',
-        'upload-files',
-        'sendchange',
-        'update',  # decided by query_is_nightly()
-    ],
-    'stage_platform': 'macosx64-debug',
-    'debug_build': True,
-    'objdir': 'obj-firefox',
-    'enable_talos_sendchange': False,
-    #### 64 bit build specific #####
-    'env': {
-        'MOZBUILD_STATE_PATH': os.path.join(os.getcwd(), '.mozbuild'),
-        'HG_SHARE_BASE_DIR': '/builds/hg-shared',
-        'MOZ_OBJDIR': 'obj-firefox',
-        'TINDERBOX_OUTPUT': '1',
-        'TOOLTOOL_CACHE': '/builds/tooltool_cache',
-        'TOOLTOOL_HOME': '/builds',
-        'MOZ_CRASHREPORTER_NO_REPORT': '1',
-        'CCACHE_DIR': '/builds/ccache',
-        'CCACHE_COMPRESS': '1',
-        'CCACHE_UMASK': '002',
-        'LC_ALL': 'C',
-        'XPCOM_DEBUG_BREAK': 'stack-and-abort',
-        ## 64 bit specific
-        'PATH': '/tools/python/bin:/tools/buildbot/bin:/opt/local/bin:/usr/bin:'
-                '/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin',
-        ##
-    },
-    'src_mozconfig': 'browser/config/mozconfigs/macosx64/debug-qr',
-    #######################
-}
deleted file mode 100644
--- a/testing/mozharness/configs/builds/releng_sub_mac_configs/64_cross_qr_opt.py
+++ /dev/null
@@ -1,7 +0,0 @@
-import os
-
-MOZ_OBJDIR = 'obj-firefox'
-
-config = {
-    'src_mozconfig': 'browser/config/mozconfigs/macosx64/opt-qr',
-}
deleted file mode 100644
--- a/testing/mozharness/configs/builds/taskcluster_firefox_win32_qr_debug.py
+++ /dev/null
@@ -1,81 +0,0 @@
-import os
-import sys
-
-config = {
-    #########################################################################
-    ######## WINDOWS GENERIC CONFIG KEYS/VAlUES
-    # if you are updating this with custom 32 bit keys/values please add them
-    # below under the '32 bit specific' code block otherwise, update in this
-    # code block and also make sure this is synced between:
-    # - taskcluster_firefox_win32_debug
-    # - taskcluster_firefox_win32_opt
-    # - taskcluster_firefox_win64_debug
-    # - taskcluster_firefox_win64_opt
-    # - taskcluster_firefox_win32_clang
-    # - taskcluster_firefox_win32_clang_debug
-    # - taskcluster_firefox_win64_clang
-    # - taskcluster_firefox_win64_clang_debug
-
-    'default_actions': [
-        'clone-tools',
-        'build',
-        'generate-build-stats',
-        'check-test',
-    ],
-    'exes': {
-        'virtualenv': [
-            sys.executable,
-            os.path.join(
-                os.getcwd(), 'build', 'src', 'python', 'virtualenv', 'virtualenv.py'
-            )
-        ],
-    },
-    'app_ini_path': '%(obj_dir)s/dist/bin/application.ini',
-    # decides whether we want to use moz_sign_cmd in env
-    'enable_signing': True,
-    'vcs_share_base': os.path.join('y:', os.sep, 'hg-shared'),
-    'objdir': 'obj-firefox',
-    'tooltool_script': [
-      sys.executable,
-      os.path.join(os.environ['MOZILLABUILD'], 'tooltool.py')
-    ],
-    'tooltool_bootstrap': 'setup.sh',
-    'enable_count_ctors': False,
-    'max_build_output_timeout': 60 * 80,
-    #########################################################################
-
-
-     #########################################################################
-     ###### 32 bit specific ######
-    'base_name': 'WINNT_5.2_%(branch)s',
-    'platform': 'win32',
-    'stage_platform': 'win32-debug',
-    'debug_build': True,
-    'publish_nightly_en_US_routes': True,
-    'env': {
-        'BINSCOPE': os.path.join(
-            os.environ['ProgramFiles(x86)'], 'Microsoft', 'SDL BinScope', 'BinScope.exe'
-        ),
-        'HG_SHARE_BASE_DIR': os.path.join('y:', os.sep, 'hg-shared'),
-        'MOZBUILD_STATE_PATH': os.path.join(os.getcwd(), '.mozbuild'),
-        'MOZ_CRASHREPORTER_NO_REPORT': '1',
-        'MOZ_OBJDIR': 'obj-firefox',
-        'PDBSTR_PATH': 'C:/Program Files (x86)/Windows Kits/10/Debuggers/x86/srcsrv/pdbstr.exe',
-        'TINDERBOX_OUTPUT': '1',
-        'TOOLTOOL_CACHE': 'c:/builds/tooltool_cache',
-        'TOOLTOOL_HOME': '/c/builds',
-        'XPCOM_DEBUG_BREAK': 'stack-and-abort',
-        'MSYSTEM': 'MINGW32',
-    },
-    'upload_env': {
-        'UPLOAD_HOST': 'localhost',
-        'UPLOAD_PATH': os.path.join(os.getcwd(), 'public', 'build'),
-    },
-    "check_test_env": {
-        'MINIDUMP_STACKWALK': '%(abs_tools_dir)s\\breakpad\\win32\\minidump_stackwalk.exe',
-        'MINIDUMP_SAVE_PATH': '%(base_work_dir)s\\minidumps',
-    },
-    'src_mozconfig': 'browser\\config\\mozconfigs\\win32\\debug-qr',
-    'tooltool_manifest_src': 'browser\\config\\tooltool-manifests\\win32\\releng.manifest',
-    #########################################################################
-}
deleted file mode 100644
--- a/testing/mozharness/configs/builds/taskcluster_firefox_win32_qr_opt.py
+++ /dev/null
@@ -1,79 +0,0 @@
-import os
-import sys
-
-config = {
-    #########################################################################
-    ######## WINDOWS GENERIC CONFIG KEYS/VAlUES
-    # if you are updating this with custom 32 bit keys/values please add them
-    # below under the '32 bit specific' code block otherwise, update in this
-    # code block and also make sure this is synced between:
-    # - taskcluster_firefox_win32_debug
-    # - taskcluster_firefox_win32_opt
-    # - taskcluster_firefox_win64_debug
-    # - taskcluster_firefox_win64_opt
-    # - taskcluster_firefox_win32_clang
-    # - taskcluster_firefox_win32_clang_debug
-    # - taskcluster_firefox_win64_clang
-    # - taskcluster_firefox_win64_clang_debug
-
-    'default_actions': [
-        'clone-tools',
-        'build',
-        'generate-build-stats',
-        'check-test',
-    ],
-    'exes': {
-        'virtualenv': [
-            sys.executable,
-            os.path.join(
-                os.getcwd(), 'build', 'src', 'python', 'virtualenv', 'virtualenv.py'
-            )
-        ],
-    },
-    'app_ini_path': '%(obj_dir)s/dist/bin/application.ini',
-    # decides whether we want to use moz_sign_cmd in env
-    'enable_signing': True,
-    'vcs_share_base': os.path.join('y:', os.sep, 'hg-shared'),
-    'objdir': 'obj-firefox',
-    'tooltool_script': [
-      sys.executable,
-      os.path.join(os.environ['MOZILLABUILD'], 'tooltool.py')
-    ],
-    'tooltool_bootstrap': 'setup.sh',
-    'enable_count_ctors': False,
-    'max_build_output_timeout': 60 * 80,
-    #########################################################################
-
-
-     #########################################################################
-     ###### 32 bit specific ######
-    'base_name': 'WINNT_5.2_%(branch)s',
-    'platform': 'win32',
-    'stage_platform': 'win32',
-    'publish_nightly_en_US_routes': True,
-    'env': {
-        'BINSCOPE': os.path.join(
-            os.environ['ProgramFiles(x86)'], 'Microsoft', 'SDL BinScope', 'BinScope.exe'
-        ),
-        'HG_SHARE_BASE_DIR': os.path.join('y:', os.sep, 'hg-shared'),
-        'MOZBUILD_STATE_PATH': os.path.join(os.getcwd(), '.mozbuild'),
-        'MOZ_CRASHREPORTER_NO_REPORT': '1',
-        'MOZ_OBJDIR': 'obj-firefox',
-        'PDBSTR_PATH': 'C:/Program Files (x86)/Windows Kits/10/Debuggers/x86/srcsrv/pdbstr.exe',
-        'TINDERBOX_OUTPUT': '1',
-        'TOOLTOOL_CACHE': 'c:/builds/tooltool_cache',
-        'TOOLTOOL_HOME': '/c/builds',
-        'MSYSTEM': 'MINGW32',
-    },
-    'upload_env': {
-        'UPLOAD_HOST': 'localhost',
-        'UPLOAD_PATH': os.path.join(os.getcwd(), 'public', 'build'),
-    },
-    "check_test_env": {
-        'MINIDUMP_STACKWALK': '%(abs_tools_dir)s\\breakpad\\win32\\minidump_stackwalk.exe',
-        'MINIDUMP_SAVE_PATH': '%(base_work_dir)s\\minidumps',
-    },
-    'src_mozconfig': 'browser\\config\\mozconfigs\\win32\\opt-qr',
-    'tooltool_manifest_src': 'browser\\config\\tooltool-manifests\\win32\\releng.manifest',
-    #########################################################################
-}
deleted file mode 100644
--- a/testing/mozharness/configs/builds/taskcluster_firefox_win64_qr_debug.py
+++ /dev/null
@@ -1,72 +0,0 @@
-import os
-import sys
-
-config = {
-    #########################################################################
-    ######## WINDOWS GENERIC CONFIG KEYS/VAlUES
-    # if you are updating this with custom 64 bit keys/values please add them
-    # below under the '64 bit specific' code block otherwise, update in this
-    # code block and also make sure this is synced between:
-    # - taskcluster_firefox_win32_debug
-    # - taskcluster_firefox_win32_opt
-    # - taskcluster_firefox_win64_debug
-    # - taskcluster_firefox_win64_opt
-
-    'default_actions': [
-        'clone-tools',
-        'build',
-        'check-test',
-    ],
-    'exes': {
-        'virtualenv': [
-            sys.executable,
-            os.path.join(
-                os.getcwd(), 'build', 'src', 'python', 'virtualenv', 'virtualenv.py'
-            )
-        ],
-    },
-    'app_ini_path': '%(obj_dir)s/dist/bin/application.ini',
-    # decides whether we want to use moz_sign_cmd in env
-    'enable_signing': True,
-    'vcs_share_base': os.path.join('y:', os.sep, 'hg-shared'),
-    'objdir': 'obj-firefox',
-    'tooltool_script': [
-      sys.executable,
-      os.path.join(os.environ['MOZILLABUILD'], 'tooltool.py')
-    ],
-    'tooltool_bootstrap': 'setup.sh',
-    'enable_count_ctors': False,
-    'max_build_output_timeout': 60 * 80,
-    #########################################################################
-
-
-     #########################################################################
-     ###### 64 bit specific ######
-    'base_name': 'WINNT_6.1_x86-64_%(branch)s',
-    'platform': 'win64',
-    'stage_platform': 'win64-debug',
-    'debug_build': True,
-    'publish_nightly_en_US_routes': True,
-    'env': {
-        'HG_SHARE_BASE_DIR': os.path.join('y:', os.sep, 'hg-shared'),
-        'MOZ_CRASHREPORTER_NO_REPORT': '1',
-        'MOZ_OBJDIR': 'obj-firefox',
-        'PDBSTR_PATH': 'C:/Program Files (x86)/Windows Kits/10/Debuggers/x64/srcsrv/pdbstr.exe',
-        'TINDERBOX_OUTPUT': '1',
-        'TOOLTOOL_CACHE': 'c:/builds/tooltool_cache',
-        'TOOLTOOL_HOME': '/c/builds',
-        'XPCOM_DEBUG_BREAK': 'stack-and-abort',
-        'MSYSTEM': 'MINGW32',
-    },
-    'upload_env': {
-        'UPLOAD_HOST': 'localhost',
-        'UPLOAD_PATH': os.path.join(os.getcwd(), 'public', 'build'),
-    },
-    "check_test_env": {
-        'MINIDUMP_STACKWALK': '%(abs_tools_dir)s\\breakpad\\win64\\minidump_stackwalk.exe',
-        'MINIDUMP_SAVE_PATH': '%(base_work_dir)s\\minidumps',
-    },
-    'src_mozconfig': 'browser\\config\\mozconfigs\\win64\\debug-qr',
-    'tooltool_manifest_src': 'browser\\config\\tooltool-manifests\\win64\\releng.manifest',
-    #########################################################################
-}
deleted file mode 100644
--- a/testing/mozharness/configs/builds/taskcluster_firefox_win64_qr_opt.py
+++ /dev/null
@@ -1,70 +0,0 @@
-import os
-import sys
-
-config = {
-    #########################################################################
-    ######## WINDOWS GENERIC CONFIG KEYS/VAlUES
-    # if you are updating this with custom 64 bit keys/values please add them
-    # below under the '64 bit specific' code block otherwise, update in this
-    # code block and also make sure this is synced between:
-    # - taskcluster_firefox_win32_debug
-    # - taskcluster_firefox_win32_opt
-    # - taskcluster_firefox_win64_debug
-    # - taskcluster_firefox_win64_opt
-
-    'default_actions': [
-        'clone-tools',
-        'build',
-        'check-test',
-    ],
-    'exes': {
-        'virtualenv': [
-            sys.executable,
-            os.path.join(
-                os.getcwd(), 'build', 'src', 'python', 'virtualenv', 'virtualenv.py'
-            )
-        ],
-    },
-    'app_ini_path': '%(obj_dir)s/dist/bin/application.ini',
-    # decides whether we want to use moz_sign_cmd in env
-    'enable_signing': True,
-    'vcs_share_base': os.path.join('y:', os.sep, 'hg-shared'),
-    'objdir': 'obj-firefox',
-    'tooltool_script': [
-      sys.executable,
-      os.path.join(os.environ['MOZILLABUILD'], 'tooltool.py')
-    ],
-    'tooltool_bootstrap': 'setup.sh',
-    'enable_count_ctors': False,
-    'max_build_output_timeout': 60 * 80,
-    #########################################################################
-
-
-     #########################################################################
-     ###### 64 bit specific ######
-    'base_name': 'WINNT_6.1_x86-64_%(branch)s',
-    'platform': 'win64',
-    'stage_platform': 'win64',
-    'publish_nightly_en_US_routes': True,
-    'env': {
-        'HG_SHARE_BASE_DIR': os.path.join('y:', os.sep, 'hg-shared'),
-        'MOZ_CRASHREPORTER_NO_REPORT': '1',
-        'MOZ_OBJDIR': 'obj-firefox',
-        'PDBSTR_PATH': 'C:/Program Files (x86)/Windows Kits/10/Debuggers/x64/srcsrv/pdbstr.exe',
-        'TINDERBOX_OUTPUT': '1',
-        'TOOLTOOL_CACHE': 'c:/builds/tooltool_cache',
-        'TOOLTOOL_HOME': '/c/builds',
-        'MSYSTEM': 'MINGW32',
-    },
-    'upload_env': {
-        'UPLOAD_HOST': 'localhost',
-        'UPLOAD_PATH': os.path.join(os.getcwd(), 'public', 'build'),
-    },
-    "check_test_env": {
-        'MINIDUMP_STACKWALK': '%(abs_tools_dir)s\\breakpad\\win64\\minidump_stackwalk.exe',
-        'MINIDUMP_SAVE_PATH': '%(base_work_dir)s\\minidumps',
-    },
-    'src_mozconfig': 'browser\\config\\mozconfigs\\win64\\opt-qr',
-    'tooltool_manifest_src': 'browser\\config\\tooltool-manifests\\win64\\releng.manifest',
-    #########################################################################
-}
--- a/testing/mozharness/mozharness/base/log.py
+++ b/testing/mozharness/mozharness/base/log.py
@@ -291,16 +291,20 @@ class OutputParser(LogMixin):
         self.worst_log_level = INFO
 
     def parse_single_line(self, line):
         """ parse a console output line and check if it matches one in `error_list`,
         if so then log it according to `log_output`.
 
         Args:
             line (str): command line output to parse.
+
+        Returns:
+            If the line hits a match in the error_list, the new log level the line was
+            (or should be) logged at is returned. Otherwise, returns None.
         """
         for error_check in self.error_list:
             # TODO buffer for context_lines.
             match = False
             if 'substr' in error_check:
                 if error_check['substr'] in line:
                     match = True
             elif 'regex' in error_check:
@@ -320,20 +324,20 @@ class OutputParser(LogMixin):
                     else:
                         self.log(message, level=log_level)
                 if log_level in (ERROR, CRITICAL, FATAL):
                     self.num_errors += 1
                 if log_level == WARNING:
                     self.num_warnings += 1
                 self.worst_log_level = self.worst_level(log_level,
                                                         self.worst_log_level)
-                break
-        else:
-            if self.log_output:
-                self.info(' %s' % line)
+                return log_level
+
+        if self.log_output:
+            self.info(' %s' % line)
 
     def add_lines(self, output):
         """ process a string or list of strings, decode them to utf-8,strip
         them of any trailing whitespaces and parse them using `parse_single_line`
 
         strings consisting only of whitespaces are ignored.
 
         Args:
--- a/testing/mozharness/mozharness/mozilla/building/buildbase.py
+++ b/testing/mozharness/mozharness/mozilla/building/buildbase.py
@@ -341,24 +341,23 @@ class BuildOptionParser(object):
     # and the script will pull up the appropriate path for the config
     # against the current platform and bits.
     # *It will warn and fail if there is not a config for the current
     # platform/bits
     build_variants = {
         'add-on-devel': 'builds/releng_sub_%s_configs/%s_add-on-devel.py',
         'asan': 'builds/releng_sub_%s_configs/%s_asan.py',
         'asan-tc': 'builds/releng_sub_%s_configs/%s_asan_tc.py',
+        'fuzzing-asan-tc': 'builds/releng_sub_%s_configs/%s_fuzzing_asan_tc.py',
         'tsan': 'builds/releng_sub_%s_configs/%s_tsan.py',
         'cross-debug': 'builds/releng_sub_%s_configs/%s_cross_debug.py',
         'cross-debug-st-an': 'builds/releng_sub_%s_configs/%s_cross_debug_st_an.py',
         'cross-debug-artifact': 'builds/releng_sub_%s_configs/%s_cross_debug_artifact.py',
         'cross-opt-st-an': 'builds/releng_sub_%s_configs/%s_cross_opt_st_an.py',
         'cross-artifact': 'builds/releng_sub_%s_configs/%s_cross_artifact.py',
-        'cross-qr-debug': 'builds/releng_sub_%s_configs/%s_cross_qr_debug.py',
-        'cross-qr-opt': 'builds/releng_sub_%s_configs/%s_cross_qr_opt.py',
         'debug': 'builds/releng_sub_%s_configs/%s_debug.py',
         'asan-and-debug': 'builds/releng_sub_%s_configs/%s_asan_and_debug.py',
         'asan-tc-and-debug': 'builds/releng_sub_%s_configs/%s_asan_tc_and_debug.py',
         'stat-and-debug': 'builds/releng_sub_%s_configs/%s_stat_and_debug.py',
         'code-coverage': 'builds/releng_sub_%s_configs/%s_code_coverage.py',
         'source': 'builds/releng_sub_%s_configs/%s_source.py',
         'stylo': 'builds/releng_sub_%s_configs/%s_stylo.py',
         'stylo-debug': 'builds/releng_sub_%s_configs/%s_stylo_debug.py',
@@ -377,18 +376,16 @@ class BuildOptionParser(object):
         'aarch64': 'builds/releng_sub_%s_configs/%s_aarch64.py',
         'android-test': 'builds/releng_sub_%s_configs/%s_test.py',
         'android-checkstyle': 'builds/releng_sub_%s_configs/%s_checkstyle.py',
         'android-lint': 'builds/releng_sub_%s_configs/%s_lint.py',
         'android-findbugs': 'builds/releng_sub_%s_configs/%s_findbugs.py',
         'valgrind' : 'builds/releng_sub_%s_configs/%s_valgrind.py',
         'artifact': 'builds/releng_sub_%s_configs/%s_artifact.py',
         'debug-artifact': 'builds/releng_sub_%s_configs/%s_debug_artifact.py',
-        'qr-debug': 'builds/releng_sub_%s_configs/%s_qr_debug.py',
-        'qr-opt': 'builds/releng_sub_%s_configs/%s_qr_opt.py',
         'devedition': 'builds/releng_sub_%s_configs/%s_devedition.py',
     }
     build_pool_cfg_file = 'builds/build_pool_specifics.py'
     branch_cfg_file = 'builds/branch_specifics.py'
 
     @classmethod
     def _query_pltfrm_and_bits(cls, target_option, options):
         """ determine platform and bits
--- a/testing/mozharness/mozharness/mozilla/structuredlog.py
+++ b/testing/mozharness/mozharness/mozilla/structuredlog.py
@@ -44,17 +44,17 @@ class StructuredOutputParser(OutputParse
             import mozlog
         except ImportError:
             self.fatal("A script class using structured logging must inherit "
                        "from the MozbaseMixin to ensure that mozlog is available.")
         return mozlog
 
     def _handle_unstructured_output(self, line, log_output=True):
         self.log_output = log_output
-        super(StructuredOutputParser, self).parse_single_line(line)
+        return super(StructuredOutputParser, self).parse_single_line(line)
 
     def parse_single_line(self, line):
         """Parses a line of log output from the child process and passes
         it to mozlog to update the overall status of the run.
         Re-emits the logged line in human-readable format.
         """
         level = INFO
         tbpl_level = TBPL_SUCCESS
@@ -75,23 +75,29 @@ class StructuredOutputParser(OutputParse
                 self.update_levels(TBPL_FAILURE, log.CRITICAL)
             else:
                 self._handle_unstructured_output(line)
             return
 
         self.handler(data)
 
         action = data["action"]
-        if action == "process_output":
-            # Run process output through the error lists, but make sure the super parser
-            # doesn't print them to stdout (they should go through the log formatter).
-            self._handle_unstructured_output(data['data'], log_output=False)
+        if action in ('log', 'process_output'):
+            if action == 'log':
+                message = data['message']
+                level = getattr(log, data['level'].upper())
+            else:
+                message = data['data']
 
-        if action == "log":
-            level = getattr(log, data["level"].upper())
+            # Run log and process_output actions through the error lists, but make sure
+            # the super parser doesn't print them to stdout (they should go through the
+            # log formatter).
+            error_level = self._handle_unstructured_output(message, log_output=False)
+            if error_level is not None:
+                level = self.worst_level(error_level, level)
 
         log_data = self.formatter(data)
         if log_data is not None:
             self.log(log_data, level=level)
             self.update_levels(tbpl_level, level)
 
     def evaluate_parser(self, return_code, success_codes=None):
         success_codes = success_codes or [0]
--- a/testing/web-platform/tests/web-animations/animation-model/animation-types/property-list.js
+++ b/testing/web-platform/tests/web-animations/animation-model/animation-types/property-list.js
@@ -185,43 +185,43 @@ var gCSSProperties = {
   'border-inline-start-width': {
     // https://drafts.csswg.org/css-logical-props/#propdef-border-inline-start-width
     types: [
     ]
   },
   'border-image-outset': {
     // https://drafts.csswg.org/css-backgrounds-3/#border-image-outset
     types: [
-      { type: 'discrete', options: [ [ '1 1 1 1', '5 5 5 5' ] ] }
+      { type: 'discrete', options: [ [ '1 2 3 4', '5 6 7 8' ] ] }
     ]
   },
   'border-image-repeat': {
     // https://drafts.csswg.org/css-backgrounds-3/#border-image-repeat
     types: [
       { type: 'discrete', options: [ [ 'stretch stretch', 'repeat repeat' ] ] }
     ]
   },
   'border-image-slice': {
     // https://drafts.csswg.org/css-backgrounds-3/#border-image-slice
     types: [
-      { type: 'discrete', options: [ [ '1 1 1 1', '5 5 5 5' ] ] }
+      { type: 'discrete', options: [ [ '1 2 3 4', '5 6 7 8' ] ] }
     ]
   },
   'border-image-source': {
     // https://drafts.csswg.org/css-backgrounds-3/#border-image-source
     types: [
       { type: 'discrete',
         options: [ [ 'url("http://localhost/test-1")',
                    'url("http://localhost/test-2")' ] ] }
     ]
   },
   'border-image-width': {
     // https://drafts.csswg.org/css-backgrounds-3/#border-image-width
     types: [
-      { type: 'discrete', options: [ [ '1 1 1 1', '5 5 5 5' ] ] }
+      { type: 'discrete', options: [ [ '1 2 3 4', '5 6 7 8' ] ] }
     ]
   },
   'border-left-color': {
     // https://drafts.csswg.org/css-backgrounds-3/#border-left-color
     types: [ 'color' ]
   },
   'border-left-style': {
     // https://drafts.csswg.org/css-backgrounds-3/#border-left-style
--- a/third_party/rust/bindgen/.cargo-checksum.json
+++ b/third_party/rust/bindgen/.cargo-checksum.json
@@ -1,1 +1,1 @@
-{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".github/ISSUE_TEMPLATE.md":"213c5948f132f0855d1efee494beb6fae1f010d25791c19c702982157961bc96",".gitignore":"f83c74c38844f7e2adaf3f030f24945cf0f22e027b0bbf13fffb0057d6bf7ebf",".travis.yml":"5cb7111daf589d0379e3cd7c799cec2e6408f310765be81db549a1808cde6046","CONTRIBUTING.md":"113197274ed6ca925acf05330d9bae11141bc8e2ab11ae497697fa04df76f33e","Cargo.toml":"69ab16a0990af676c19c8202ecc475f455f03445ea6a915a4935cc1ffb445be7","LICENSE":"1d2e4bdb9d94ab020e9550136cae9ec73fc699c3c96a9d98078c542e9b93d294","README.md":"a9de10e2422217cb41cac812694eedc82c2c429d18721af05a38f4593d56347c","book/.gitignore":"3c4dbff9eeda9410a0b9eb423472981db8997d666388b4cd2424700c3974d64b","book/book.toml":"dbf931141036d1d0eb02b326f7f5d7867dd9a8f0fc49b66b8fd97e9873c08e44","book/src/SUMMARY.md":"7bb880df58bbe6e4a6f103ce4fe4835e6499b2005db1b621d5c6ee26982a6f64","book/src/blacklisting.md":"a68424cc3643e06e83c5ea4efd5eb501dc64229ff9f4286b9a210a2376c20a9b","book/src/chapter_1.md":"cac4f4a3609ec22eb519b0e07d1d1bdc15ac3d741f29f9b97280f700b96ded66","book/src/command-line-usage.md":"9e3ae32cb5d893f1a93fc539149950bacdf43a18c694169fa45dfe8080617403","book/src/cpp.md":"6dab1a9997d2f30b69ba78c19ddefe48b7033a3ec247b573dba96b6be047e582","book/src/customizing-generated-bindings.md":"0363ca69719c5e24d624ac3adfef71445896d3ed2b7bb3689c7905e47bdd9cdd","book/src/introduction.md":"b6b0cdcf67ad428f53b667449e309712c617b80fade6afcf598bc58dc6bf58fa","book/src/library-usage.md":"62565cf21a6b07a9de9a3f525427e75aa0f05350a1f546ed428c8a6c40cf850c","book/src/nocopy.md":"615f9b2ae474adf32ddf49e2f29f019f857db0fbb3232ed30df3960edd9f3406","book/src/opaque.md":"d6a5d6b7dfad4e8e1f7a1307f57a0a4b723032970bbae0e1290e1ab81e08b21a","book/src/replacing-types.md":"f406f7135299cd4e67a017237a6a9acbe936aa48f37b7f52be2769c90537b73f","book/src/requirements.md":"23c71db101ccce73b46a0273fa81bc4cb1f2271499fb15f7c7befd8c95ec3bbe","book/src/tutorial-0.md":"4f46c7f76056231f8c4dc7e21dc06d7adad44b4e25a44c46c821684df023bd24","book/src/tutorial-1.md":"e6e6bb4dbdcf968d516a2da039a57f6153a21bd67167d709dc2abc6614372b1e","book/src/tutorial-2.md":"f6c9cf4ea8e38628c15dedc0ee7f60055a2aa841e95f972465d2932bb71878ad","book/src/tutorial-3.md":"112eb7ae1a1194cd82890ca3301beb309b0fa5f1ca2942db5af25f2654b06b1b","book/src/tutorial-4.md":"840edccb116f59229a2132041b5ec532f903ca90ec9904a3d1b6847779e62a66","book/src/tutorial-5.md":"45a3034e2ad8d701a8cc5d2e5e34fb427486f1ebddeff3a91a9567a1b3b668d8","book/src/tutorial-6.md":"e92a5188366108495dc1e989a1ed77c31a71b09b4c3e48936c9445b49bcc466b","book/src/whitelisting.md":"b6913e3fc43d28f504331afe4ccc3607caad9aa88d4cb627a86bdc1e72ea0175","build.rs":"e19f3db33a88f9217acef718eda6fcb6bf33949297c9f2b2bf444ce32b279a4e","ci/assert-docs.sh":"5d8ba2280bb03b9d975d2290cf9ec8f1344dafa61a3f5e2ace763019502e4e92","ci/assert-no-diff.sh":"af208c40d412e2bce82ae9b4a4e52cae4ae0b4beef9f93eb825bf5d5346a70b2","ci/assert-rustfmt.sh":"b9c810e86ea6d71bce1d6bf8d896839cfe2c198338e042ebc744b75e83af1126","ci/before_install.sh":"51409851cf4e1dee27735461e77247c599e023259c3a57e82fa044f284ca8e87","ci/deploy-book.sh":"2dc27d6252ed0f9e5e9fd5729f6087d20c6f0901ae2a470e3436f1c324623455","ci/test-book.sh":"3b8892a6c4e1f840349d2cfadff5a5e5b7ddf28b4b11e9cafd92cfe9c8d6d8c6","ci/test.sh":"6e8bb39c327dbc5c709be0e50bd288bfe27efdb5c9cdfd276f97c31a951f8ff0","example-graphviz-ir.png":"e1122ab33b4c80e8c9c0cf8abea404c1192f9b2eef97f5766e86103cc95d5e01","rustfmt.toml":"c4f3b593bdd634590df22aaf7b0872244d5c2169aacd0274a05e4aca4708a8d3","src/callbacks.rs":"e0d36d30adac8a4eaab64f0a9df0ab29026fcd5f5c5588bdeb2ad762e4c024ad","src/clang.rs":"b160cd41a0b80aa204c85c6fd8800d31887529ef21a21d08e32585b71ee55576","src/codegen/error.rs":"2613af1d833377fd4a70719f4a09951d9d45dc9227827b9a2a938a1bcaaea2dd","src/codegen/helpers.rs":"4bbb92c587e881466ac4d343ada69f4a7a8edea8c484cf142664dade7c150acc","src/codegen/mod.rs":"14faa66df26851dab9567bc7e54410113d930a801c34fbff856a044074f6386a","src/codegen/struct_layout.rs":"130cf8a2e1cb8348a13e05904af2300333b51bf72cd63f3ec696b768a4a6b52d","src/extra_assertions.rs":"449549c4a7a50c3f0b06332452b2fb6c9b23f31ca8e5e1656fe6c7f21e8ef7fa","src/ir/annotations.rs":"887ad7beaa43eddd60337b67951a109c2e7f51cb8e757b35cad45f744b7ba919","src/ir/comp.rs":"359db14fc67b3c9815690ec0d95f23de4811b6f8095d568d0726328930d09cd8","src/ir/context.rs":"9b0670cc11fdfe4e7751bd1b083c288af492a3ad02c081cbd615bc4002b88b4b","src/ir/derive.rs":"8706a8e3c4ccd2135d0eb9ec8c0e02008609604bce42cad2974f3ca7d2ca7d91","src/ir/dot.rs":"d9b60aab08949a6d597d2fe000401c021f3cfff8805cd7ad02b8f22824e4525d","src/ir/enum_ty.rs":"cb552126907501e78a8c98a2d107c825842a45ab3fad8b656bdaf9925d0cdfd9","src/ir/function.rs":"b86146b0a3e8089d92c86ac9695b508cdeda4d0cc8f2937a131ea627dc151acd","src/ir/int.rs":"b7bc19668ca6c7c084a3f8d1e07d5a980ee49c0c9a8882c3e72baab4ea7fa403","src/ir/item.rs":"e42d779600f034c25094d50bab9f2aa7f9cc0ff12f9680d616433d72deb574ae","src/ir/item_kind.rs":"64b8b5bede6dfe950ceb15da1aabf888707eeb5883df9213f05ee47797bfb84f","src/ir/layout.rs":"9676218f0f25769573eb4ba848b7a8030501fc08c28b40f13a21e4fa5ee44d4e","src/ir/mod.rs":"74631e1006639aaf13e8b251efef9788b9e80b55df5b8b1fb2c484845450a196","src/ir/module.rs":"7bd8273e7001ca3d2f084e4374e21eb9f13f087bbd901849cf617e75fb712050","src/ir/named.rs":"ac96cb1a9f4ae3e9fa6494b3d97d8f30acffa180838f8ddd1392a7c168352c2d","src/ir/objc.rs":"353be93027d74ad102ac3b0ef8754dd1258a400dcf7d361fa224fdf1ab973c56","src/ir/template.rs":"35d4202ddf15bdac6ab5085bc8bdfc0fc44e0a8650ab6e49592b72252a16ebba","src/ir/traversal.rs":"02f25e1cad8f8630408a5b08aa5cc1d2dc97301455ef0fbb349f9f21d1334f2a","src/ir/ty.rs":"283975ede4c84c6cdae3a75b7015b645fce42898fdfc0f24d47877c324cff0e2","src/ir/var.rs":"8d81a8227709dbe879f9aa39b7cd6c99870d1f68cd1113be03fa34a580eef43f","src/lib.rs":"582151beb761a1c14cca0fb3ddf805b9f216b07f5ec6dfc4fd6270e3c4a337aa","src/log_stubs.rs":"6dfdd908b7c6453da416cf232893768f9480e551ca4add0858ef88bf71ee6ceb","src/main.rs":"fdd6a6810806fa40e6bb6001be691eeaad5439ebc462ccf1d779d20ac63d6fad","src/options.rs":"c8af158043a61a90bb11005aad9515e852a89cf758322faed2dd3ec8faa641f2","src/parse.rs":"6d88e1dcdb4e99f4f65629ce205c14e18097773bc938973f8e3849ba3bda4f79","src/regex_set.rs":"6c46877238c338e1fc6a35a8983db21f0711c979e44310975f60ad73a50fdbbc","src/uses.rs":"b46a9b540c39d23fa1c22c8b5325d00486348a2aec2464deada524a6b96ebec2"},"package":"708a688675f9d2e7c73018e17f5997beacc9a5ca87a0cb60c13093915facda32"}
\ No newline at end of file
+{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".github/ISSUE_TEMPLATE.md":"213c5948f132f0855d1efee494beb6fae1f010d25791c19c702982157961bc96",".gitignore":"f83c74c38844f7e2adaf3f030f24945cf0f22e027b0bbf13fffb0057d6bf7ebf",".travis.yml":"7dab433f370e5d17b6c4cdee8f4ce819ecfbef005696707fa84344c8e3acaf3f","CONTRIBUTING.md":"b00c43bd9f499eb5e43499501d9e5a8d34c1f7deda99ed7391f592a9d59b3c56","Cargo.toml":"0560bf4ab6ff4dc6b0c7ee254ac9a14e762a1717ac59b3f8b0262f904a249bf1","Cargo.toml.orig":"42e9679b9538d6e88ec8d2e969aba74f754897cee8400911550daae6b6b3a862","LICENSE":"1d2e4bdb9d94ab020e9550136cae9ec73fc699c3c96a9d98078c542e9b93d294","README.md":"a9de10e2422217cb41cac812694eedc82c2c429d18721af05a38f4593d56347c","book/.gitignore":"3c4dbff9eeda9410a0b9eb423472981db8997d666388b4cd2424700c3974d64b","book/book.toml":"dbf931141036d1d0eb02b326f7f5d7867dd9a8f0fc49b66b8fd97e9873c08e44","book/src/SUMMARY.md":"7bb880df58bbe6e4a6f103ce4fe4835e6499b2005db1b621d5c6ee26982a6f64","book/src/blacklisting.md":"a68424cc3643e06e83c5ea4efd5eb501dc64229ff9f4286b9a210a2376c20a9b","book/src/chapter_1.md":"cac4f4a3609ec22eb519b0e07d1d1bdc15ac3d741f29f9b97280f700b96ded66","book/src/command-line-usage.md":"9e3ae32cb5d893f1a93fc539149950bacdf43a18c694169fa45dfe8080617403","book/src/cpp.md":"6dab1a9997d2f30b69ba78c19ddefe48b7033a3ec247b573dba96b6be047e582","book/src/customizing-generated-bindings.md":"0363ca69719c5e24d624ac3adfef71445896d3ed2b7bb3689c7905e47bdd9cdd","book/src/introduction.md":"b6b0cdcf67ad428f53b667449e309712c617b80fade6afcf598bc58dc6bf58fa","book/src/library-usage.md":"62565cf21a6b07a9de9a3f525427e75aa0f05350a1f546ed428c8a6c40cf850c","book/src/nocopy.md":"615f9b2ae474adf32ddf49e2f29f019f857db0fbb3232ed30df3960edd9f3406","book/src/opaque.md":"d6a5d6b7dfad4e8e1f7a1307f57a0a4b723032970bbae0e1290e1ab81e08b21a","book/src/replacing-types.md":"f406f7135299cd4e67a017237a6a9acbe936aa48f37b7f52be2769c90537b73f","book/src/requirements.md":"23c71db101ccce73b46a0273fa81bc4cb1f2271499fb15f7c7befd8c95ec3bbe","book/src/tutorial-0.md":"4f46c7f76056231f8c4dc7e21dc06d7adad44b4e25a44c46c821684df023bd24","book/src/tutorial-1.md":"e6e6bb4dbdcf968d516a2da039a57f6153a21bd67167d709dc2abc6614372b1e","book/src/tutorial-2.md":"f6c9cf4ea8e38628c15dedc0ee7f60055a2aa841e95f972465d2932bb71878ad","book/src/tutorial-3.md":"112eb7ae1a1194cd82890ca3301beb309b0fa5f1ca2942db5af25f2654b06b1b","book/src/tutorial-4.md":"840edccb116f59229a2132041b5ec532f903ca90ec9904a3d1b6847779e62a66","book/src/tutorial-5.md":"45a3034e2ad8d701a8cc5d2e5e34fb427486f1ebddeff3a91a9567a1b3b668d8","book/src/tutorial-6.md":"e92a5188366108495dc1e989a1ed77c31a71b09b4c3e48936c9445b49bcc466b","book/src/whitelisting.md":"b6913e3fc43d28f504331afe4ccc3607caad9aa88d4cb627a86bdc1e72ea0175","build.rs":"e19f3db33a88f9217acef718eda6fcb6bf33949297c9f2b2bf444ce32b279a4e","ci/assert-docs.sh":"5d8ba2280bb03b9d975d2290cf9ec8f1344dafa61a3f5e2ace763019502e4e92","ci/assert-no-diff.sh":"af208c40d412e2bce82ae9b4a4e52cae4ae0b4beef9f93eb825bf5d5346a70b2","ci/assert-rustfmt.sh":"b9c810e86ea6d71bce1d6bf8d896839cfe2c198338e042ebc744b75e83af1126","ci/before_install.sh":"51409851cf4e1dee27735461e77247c599e023259c3a57e82fa044f284ca8e87","ci/deploy-book.sh":"2dc27d6252ed0f9e5e9fd5729f6087d20c6f0901ae2a470e3436f1c324623455","ci/test-book.sh":"3b8892a6c4e1f840349d2cfadff5a5e5b7ddf28b4b11e9cafd92cfe9c8d6d8c6","ci/test.sh":"6e8bb39c327dbc5c709be0e50bd288bfe27efdb5c9cdfd276f97c31a951f8ff0","example-graphviz-ir.png":"e1122ab33b4c80e8c9c0cf8abea404c1192f9b2eef97f5766e86103cc95d5e01","rustfmt.toml":"c4f3b593bdd634590df22aaf7b0872244d5c2169aacd0274a05e4aca4708a8d3","src/callbacks.rs":"e0d36d30adac8a4eaab64f0a9df0ab29026fcd5f5c5588bdeb2ad762e4c024ad","src/clang.rs":"b160cd41a0b80aa204c85c6fd8800d31887529ef21a21d08e32585b71ee55576","src/codegen/error.rs":"2613af1d833377fd4a70719f4a09951d9d45dc9227827b9a2a938a1bcaaea2dd","src/codegen/helpers.rs":"4bbb92c587e881466ac4d343ada69f4a7a8edea8c484cf142664dade7c150acc","src/codegen/mod.rs":"507b8f66ab75a3f75b2fae4d856875e7c1be070311fab9b1807c98dc2534017c","src/codegen/struct_layout.rs":"130cf8a2e1cb8348a13e05904af2300333b51bf72cd63f3ec696b768a4a6b52d","src/extra_assertions.rs":"449549c4a7a50c3f0b06332452b2fb6c9b23f31ca8e5e1656fe6c7f21e8ef7fa","src/ir/annotations.rs":"887ad7beaa43eddd60337b67951a109c2e7f51cb8e757b35cad45f744b7ba919","src/ir/comp.rs":"359db14fc67b3c9815690ec0d95f23de4811b6f8095d568d0726328930d09cd8","src/ir/context.rs":"9b0670cc11fdfe4e7751bd1b083c288af492a3ad02c081cbd615bc4002b88b4b","src/ir/derive.rs":"8706a8e3c4ccd2135d0eb9ec8c0e02008609604bce42cad2974f3ca7d2ca7d91","src/ir/dot.rs":"d9b60aab08949a6d597d2fe000401c021f3cfff8805cd7ad02b8f22824e4525d","src/ir/enum_ty.rs":"cb552126907501e78a8c98a2d107c825842a45ab3fad8b656bdaf9925d0cdfd9","src/ir/function.rs":"9fe4593c063dacc5481504c34871b86fdde4abc5c03ae83bfa3f69eadc657693","src/ir/int.rs":"b7bc19668ca6c7c084a3f8d1e07d5a980ee49c0c9a8882c3e72baab4ea7fa403","src/ir/item.rs":"e42d779600f034c25094d50bab9f2aa7f9cc0ff12f9680d616433d72deb574ae","src/ir/item_kind.rs":"64b8b5bede6dfe950ceb15da1aabf888707eeb5883df9213f05ee47797bfb84f","src/ir/layout.rs":"9676218f0f25769573eb4ba848b7a8030501fc08c28b40f13a21e4fa5ee44d4e","src/ir/mod.rs":"74631e1006639aaf13e8b251efef9788b9e80b55df5b8b1fb2c484845450a196","src/ir/module.rs":"7bd8273e7001ca3d2f084e4374e21eb9f13f087bbd901849cf617e75fb712050","src/ir/named.rs":"ac96cb1a9f4ae3e9fa6494b3d97d8f30acffa180838f8ddd1392a7c168352c2d","src/ir/objc.rs":"353be93027d74ad102ac3b0ef8754dd1258a400dcf7d361fa224fdf1ab973c56","src/ir/template.rs":"35d4202ddf15bdac6ab5085bc8bdfc0fc44e0a8650ab6e49592b72252a16ebba","src/ir/traversal.rs":"02f25e1cad8f8630408a5b08aa5cc1d2dc97301455ef0fbb349f9f21d1334f2a","src/ir/ty.rs":"283975ede4c84c6cdae3a75b7015b645fce42898fdfc0f24d47877c324cff0e2","src/ir/var.rs":"8d81a8227709dbe879f9aa39b7cd6c99870d1f68cd1113be03fa34a580eef43f","src/lib.rs":"582151beb761a1c14cca0fb3ddf805b9f216b07f5ec6dfc4fd6270e3c4a337aa","src/log_stubs.rs":"6dfdd908b7c6453da416cf232893768f9480e551ca4add0858ef88bf71ee6ceb","src/main.rs":"53be7272893f3bd9b27b831ecc84ab53cc701423995b19355f99b1daa5c17471","src/options.rs":"c8af158043a61a90bb11005aad9515e852a89cf758322faed2dd3ec8faa641f2","src/parse.rs":"6d88e1dcdb4e99f4f65629ce205c14e18097773bc938973f8e3849ba3bda4f79","src/regex_set.rs":"6c46877238c338e1fc6a35a8983db21f0711c979e44310975f60ad73a50fdbbc","src/uses.rs":"b46a9b540c39d23fa1c22c8b5325d00486348a2aec2464deada524a6b96ebec2"},"package":"2e28791695e6e29a82038bd0489a760f362157dc1a3b2bbac9b6be3ddd984ff7"}
\ No newline at end of file
--- a/third_party/rust/bindgen/.travis.yml
+++ b/third_party/rust/bindgen/.travis.yml
@@ -12,26 +12,25 @@ os:
 
 rust:
   - stable
 
 env:
   global:
     - CARGO_TARGET_DIR=/tmp/bindgen
   matrix:
-    - LLVM_VERSION=3.7.1 BINDGEN_FEATURES=testing_only_llvm_stable
-    - LLVM_VERSION=3.8.1 BINDGEN_FEATURES=testing_only_llvm_stable
-    - LLVM_VERSION=3.9.0 BINDGEN_FEATURES=
-    - LLVM_VERSION=4.0.0 BINDGEN_FEATURES=
+    - LLVM_VERSION=3.7.1 BINDGEN_FEATURES=testing_only_libclang_3_8
+    - LLVM_VERSION=3.8.1 BINDGEN_FEATURES=testing_only_libclang_3_8
+    - LLVM_VERSION=3.9.0 BINDGEN_FEATURES=testing_only_libclang_3_9
+    - LLVM_VERSION=4.0.0 BINDGEN_FEATURES=testing_only_libclang_4
 
 matrix:
   fast_finish: true
   allow_failures:
-    - env: LLVM_VERSION=4.0.0 BINDGEN_FEATURES=
-    - env: LLVM_VERSION=3.7.1 BINDGEN_FEATURES=testing_only_llvm_stable
+    - env: LLVM_VERSION=3.7.1 BINDGEN_FEATURES=testing_only_libclang_3_8
 
 cache:
   directories:
     - $HOME/.cargo
 
 before_install: . ./ci/before_install.sh
 
 script:
--- a/third_party/rust/bindgen/CONTRIBUTING.md
+++ b/third_party/rust/bindgen/CONTRIBUTING.md
@@ -9,17 +9,19 @@ out to us in a GitHub issue, or stop by
 
 
 - [Code of Conduct](#code-of-conduct)
 - [Filing an Issue](#filing-an-issue)
 - [Building](#building)
 - [Testing](#testing)
   - [Overview](#overview)
   - [Running All Tests](#running-all-tests)
+  - [Running a Single Test](#running-a-single-test)
   - [Authoring New Tests](#authoring-new-tests)
+  - [Test Expectations and `libclang` Versions](#test-expectations-and-libclang-versions)
 - [Automatic code formatting](#automatic-code-formatting)
 - [Generating Graphviz Dot Files](#generating-graphviz-dot-files)
 - [Debug Logging](#debug-logging)
 - [Using `creduce` to Minimize Test Cases](#using-creduce-to-minimize-test-cases)
   - [Isolating Your Test Case](#isolating-your-test-case)
   - [Writing a Predicate Script](#writing-a-predicate-script)
 
 <!-- END doctoc generated TOC please keep comment here to allow auto update -->
@@ -86,19 +88,27 @@ output Rust bindings live in `tests/expe
 For example, `tests/headers/my_header.h`'s expected generated Rust bindings
 would be `tests/expectations/tests/my_header.rs`.
 
 Run `cargo test` to compare generated Rust bindings to the expectations.
 
 ### Running All Tests
 
 ```
-$ cargo test [--all-features]
+$ cargo test --features testing_only_libclang_$VERSION
 ```
 
+Where `$VERSION` is one of:
+
+* `4`
+* `3_9`
+* `3_8`
+
+depending on which version of `libclang` you have installed.
+
 ### Running a Single Test
 
 To generate bindings for a single test header, compile the bindings, and run the
 layout assertion tests for those bindings, use the `tests/test-one.sh`
 script. It supports fuzzy searching for test headers. For example, to test
 `tests/headers/what_is_going_on.hpp`, execute this command:
 
 ```
@@ -119,16 +129,35 @@ specify them at the top of the test head
 ```
 
 Then verify the new Rust bindings compile and pass some basic tests:
 
 ```
 $ cargo test -p tests_expectations
 ```
 
+### Test Expectations and `libclang` Versions
+
+If a test generates different bindings across different `libclang` versions (for
+example, because we take advantage of better/newer APIs when possible), then you
+can add multiple test expectations, one for each supported `libclang`
+version. Instead of having a single `tests/expectations/tests/my_test.rs` file,
+add each of:
+
+* `tests/expectations/tests/libclang-4/my_test.rs`
+* `tests/expectations/tests/libclang-3.9/my_test.rs`
+* `tests/expectations/tests/libclang-3.8/my_test.rs`
+
+If you need to update the test expectations for a test file that generates
+different bindings for different `libclang` versions, you *don't* need to have
+many version of `libclang` installed locally. Just make a work-in-progress pull
+request, and then when Travis CI fails, it will log a diff of the
+expectations. Use the diff to patch the appropriate expectation file locally and
+then update your pull request.
+
 ## Automatic code formatting
 
 We use [`rustfmt`](https://github.com/rust-lang-nursery/rustfmt) to enforce a
 consistent code style across the whole `bindgen` code base. This is enforced in
 CI, and your pull requests will get automatically rejected if you don't
 re-format with the latest `rustfmt` before pushing.
 
 You can install the latest version of `rustfmt` with this command:
--- a/third_party/rust/bindgen/Cargo.toml
+++ b/third_party/rust/bindgen/Cargo.toml
@@ -1,80 +1,95 @@
+# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
+#
+# When uploading crates to the registry Cargo will automatically
+# "normalize" Cargo.toml files for maximal compatibility
+# with all versions of Cargo and also rewrite `path` dependencies
+# to registry (e.g. crates.io) dependencies
+#
+# If you believe there's an error in this file please file an
+# issue against the rust-lang/cargo repository. If you're
+# editing this file be aware that the upstream Cargo.toml
+# will likely look very different (and much more reasonable)
+
 [package]
-authors = [
-  "Jyun-Yan You <jyyou.tw@gmail.com>",
-  "Emilio Cobos Álvarez <emilio@crisal.io>",
-  "Nick Fitzgerald <fitzgen@gmail.com>",
-  "The Servo project developers",
-]
+name = "bindgen"
+version = "0.25.3"
+authors = ["Jyun-Yan You <jyyou.tw@gmail.com>", "Emilio Cobos Álvarez <emilio@crisal.io>", "Nick Fitzgerald <fitzgen@gmail.com>", "The Servo project developers"]
+build = "build.rs"
+exclude = ["bindgen-integration", "ci", "tests/**"]
 description = "Automatically generates Rust FFI bindings to C and C++ libraries."
+documentation = "https://docs.rs/bindgen"
+readme = "README.md"
 keywords = ["bindings", "ffi", "code-generation"]
 categories = ["external-ffi-bindings", "development-tools::ffi"]
 license = "BSD-3-Clause"
-name = "bindgen"
-readme = "README.md"
 repository = "https://github.com/servo/rust-bindgen"
-documentation = "https://docs.rs/bindgen"
-version = "0.25.1"
-build = "build.rs"
-
-exclude = [
-  "bindgen-integration",
-  "ci",
-  "tests/**",
-]
-
-[badges]
-travis-ci = { repository = "servo/rust-bindgen" }
 
 [lib]
 path = "src/lib.rs"
 
 [[bin]]
 name = "bindgen"
 path = "src/main.rs"
 doc = false
+[dependencies.quasi]
+version = "0.32"
+features = ["with-syntex"]
 
-[dev-dependencies]
-diff = "0.1"
-clap = "2"
-shlex = "0.1"
+[dependencies.clap]
+version = "2"
 
-[build-dependencies]
-quasi_codegen = "0.32"
+[dependencies.syntex_syntax]
+version = "0.58"
+
+[dependencies.cexpr]
+version = "0.2"
 
-[dependencies]
-cexpr = "0.2"
-cfg-if = "0.1.0"
-clang-sys = { version = "0.18.0", features = ["runtime", "clang_3_9"] }
-lazy_static = "0.2.1"
-peeking_take_while = "0.1.2"
-syntex_syntax = "0.58"
-regex = "0.2"
-# This kinda sucks: https://github.com/rust-lang/cargo/issues/1982
-clap = "2"
+[dependencies.env_logger]
+version = "0.4"
+optional = true
+
+[dependencies.cfg-if]
+version = "0.1.0"
+
+[dependencies.regex]
+version = "0.2"
+
+[dependencies.lazy_static]
+version = "0.2.1"
 
 [dependencies.aster]
+version = "0.41"
 features = ["with-syntex"]
-version = "0.41"
 
-[dependencies.env_logger]
-optional = true
-version = "0.4"
+[dependencies.clang-sys]
+version = "0.18.0"
+features = ["runtime", "clang_3_9"]
+
+[dependencies.peeking_take_while]
+version = "0.1.2"
 
 [dependencies.log]
+version = "0.3"
 optional = true
-version = "0.3"
+[dev-dependencies.shlex]
+version = "0.1"
 
-[dependencies.quasi]
-features = ["with-syntex"]
+[dev-dependencies.clap]
+version = "2"
+
+[dev-dependencies.diff]
+version = "0.1"
+[build-dependencies.quasi_codegen]
 version = "0.32"
 
 [features]
+static = []
+testing_only_libclang_3_9 = []
+testing_only_libclang_3_8 = []
 default = ["logging"]
+testing_only_extra_assertions = []
 logging = ["env_logger", "log"]
-static = []
-
-# These features only exist for CI testing -- don't use them if you're not hacking
-# on bindgen!
 testing_only_docs = []
-testing_only_extra_assertions = []
-testing_only_llvm_stable = []
+testing_only_libclang_4 = []
+[badges.travis-ci]
+repository = "servo/rust-bindgen"
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bindgen/Cargo.toml.orig
@@ -0,0 +1,82 @@
+[package]
+authors = [
+  "Jyun-Yan You <jyyou.tw@gmail.com>",
+  "Emilio Cobos Álvarez <emilio@crisal.io>",
+  "Nick Fitzgerald <fitzgen@gmail.com>",
+  "The Servo project developers",
+]
+description = "Automatically generates Rust FFI bindings to C and C++ libraries."
+keywords = ["bindings", "ffi", "code-generation"]
+categories = ["external-ffi-bindings", "development-tools::ffi"]
+license = "BSD-3-Clause"
+name = "bindgen"
+readme = "README.md"
+repository = "https://github.com/servo/rust-bindgen"
+documentation = "https://docs.rs/bindgen"
+version = "0.25.3"
+build = "build.rs"
+
+exclude = [
+  "bindgen-integration",
+  "ci",
+  "tests/**",
+]
+
+[badges]
+travis-ci = { repository = "servo/rust-bindgen" }
+
+[lib]
+path = "src/lib.rs"
+
+[[bin]]
+name = "bindgen"
+path = "src/main.rs"
+doc = false
+
+[dev-dependencies]
+diff = "0.1"
+clap = "2"
+shlex = "0.1"
+
+[build-dependencies]
+quasi_codegen = "0.32"
+
+[dependencies]
+cexpr = "0.2"
+cfg-if = "0.1.0"
+clang-sys = { version = "0.18.0", features = ["runtime", "clang_3_9"] }
+lazy_static = "0.2.1"
+peeking_take_while = "0.1.2"
+syntex_syntax = "0.58"
+regex = "0.2"
+# This kinda sucks: https://github.com/rust-lang/cargo/issues/1982
+clap = "2"
+
+[dependencies.aster]
+features = ["with-syntex"]
+version = "0.41"
+
+[dependencies.env_logger]
+optional = true
+version = "0.4"
+
+[dependencies.log]
+optional = true
+version = "0.3"
+
+[dependencies.quasi]
+features = ["with-syntex"]
+version = "0.32"
+
+[features]
+default = ["logging"]
+logging = ["env_logger", "log"]
+static = []
+
+# These features only exist for CI testing -- don't use them if you're not hacking
+# on bindgen!
+testing_only_docs = []
+testing_only_extra_assertions = []
+testing_only_libclang_4 = []
+testing_only_libclang_3_9 = []
+testing_only_libclang_3_8 = []
--- a/third_party/rust/bindgen/src/codegen/mod.rs
+++ b/third_party/rust/bindgen/src/codegen/mod.rs
@@ -1101,29 +1101,26 @@ impl Bitfield {
 
         // If we're generating unstable Rust, add the const.
         let fn_prefix = if ctx.options().unstable_rust {
             quote_tokens!(ctx.ext_cx(), pub const fn)
         } else {
             quote_tokens!(ctx.ext_cx(), pub fn)
         };
 
+        // Don't use variables or blocks because const function does not allow them.
         quote_item!(
             ctx.ext_cx(),
             impl XxxUnused {
                 #[inline]
                 $fn_prefix $ctor_name($params $param_name : $bitfield_ty)
                                       -> $unit_field_int_ty {
-                    let bitfield_unit_val = $body;
-                    let $param_name = $param_name
-                        as $bitfield_int_ty
-                        as $unit_field_int_ty;
-                    let mask = $mask as $unit_field_int_ty;
-                    let $param_name = ($param_name << $offset) & mask;
-                    bitfield_unit_val | $param_name
+                    ($body | 
+                        (($param_name as $bitfield_int_ty as $unit_field_int_ty) << $offset) & 
+                        ($mask as $unit_field_int_ty)) 
                 }
             }
         ).unwrap()
     }
 }
 
 impl<'a> FieldCodegen<'a> for BitfieldUnit {
     type Extra = ();
@@ -2867,17 +2864,17 @@ impl TryToRustTy for FunctionSig {
         let decl = P(ast::FnDecl {
             inputs: arguments,
             output: ret,
             variadic: self.is_variadic(),
         });
 
         let fnty = ast::TyKind::BareFn(P(ast::BareFnTy {
             unsafety: ast::Unsafety::Unsafe,
-            abi: self.abi().expect("Invalid abi for function!"),
+            abi: self.abi().expect("Invalid or unknown ABI for function!"),
             lifetimes: vec![],
             decl: decl,
         }));
 
         Ok(P(ast::Ty {
             id: ast::DUMMY_NODE_ID,
             node: fnty,
             span: ctx.span(),
@@ -2948,17 +2945,17 @@ impl CodeGenerator for Function {
             attrs: attributes,
             node: foreign_item_kind,
             id: ast::DUMMY_NODE_ID,
             span: ctx.span(),
             vis: ast::Visibility::Public,
         };
 
         let item = ForeignModBuilder::new(signature.abi()
-                .expect("Invalid abi for function!"))
+                .expect("Invalid or unknown ABI for function!"))
             .with_foreign_item(foreign_item)
             .build(ctx);
 
         result.push(item);
     }
 }
 
 
--- a/third_party/rust/bindgen/src/ir/function.rs
+++ b/third_party/rust/bindgen/src/ir/function.rs
@@ -100,18 +100,28 @@ fn get_abi(cc: CXCallingConv) -> Option<
     use clang_sys::*;
     match cc {
         CXCallingConv_Default => Some(abi::Abi::C),
         CXCallingConv_C => Some(abi::Abi::C),
         CXCallingConv_X86StdCall => Some(abi::Abi::Stdcall),
         CXCallingConv_X86FastCall => Some(abi::Abi::Fastcall),
         CXCallingConv_AAPCS => Some(abi::Abi::Aapcs),
         CXCallingConv_X86_64Win64 => Some(abi::Abi::Win64),
-        CXCallingConv_Invalid => None,
-        other => panic!("unsupported calling convention: {:?}", other),
+        _ => None,
+    }
+}
+
+// Mac os needs __ for mangled symbols but rust will automatically prepend the extra _.
+// We need to make sure that we don't include __ because rust will turn into ___.
+//
+// TODO(emilio): This is wrong when the target system is not the host
+// system. See https://github.com/servo/rust-bindgen/issues/593
+fn macos_mangling(symbol: &mut String) {
+    if cfg!(target_os = "macos") && symbol.starts_with("_") {
+        symbol.remove(0);
     }
 }
 
 /// Get the mangled name for the cursor's referent.
 pub fn cursor_mangling(ctx: &BindgenContext,
                        cursor: &clang::Cursor)
                        -> Option<String> {
     use clang_sys;
@@ -122,33 +132,28 @@ pub fn cursor_mangling(ctx: &BindgenCont
     // We early return here because libclang may crash in some case
     // if we pass in a variable inside a partial specialized template.
     // See servo/rust-bindgen#67, and servo/rust-bindgen#462.
     if cursor.is_in_non_fully_specialized_template() {
         return None;
     }
 
     if let Ok(mut manglings) = cursor.cxx_manglings() {
-        if let Some(m) = manglings.pop() {
+        if let Some(mut m) = manglings.pop() {
+            macos_mangling(&mut m);
             return Some(m);
         }
     }
 
     let mut mangling = cursor.mangling();
     if mangling.is_empty() {
         return None;
     }
 
-    // Try to undo backend linkage munging (prepended _, generally)
-    //
-    // TODO(emilio): This is wrong when the target system is not the host
-    // system. See https://github.com/servo/rust-bindgen/issues/593
-    if cfg!(target_os = "macos") {
-        mangling.remove(0);
-    }
+    macos_mangling(&mut mangling);
 
     if cursor.kind() == clang_sys::CXCursor_Destructor {
         // With old (3.8-) libclang versions, and the Itanium ABI, clang returns
         // the "destructor group 0" symbol, which means that it'll try to free
         // memory, which definitely isn't what we want.
         //
         // Explicitly force the destructor group 1 symbol.
         //
@@ -286,22 +291,21 @@ impl FunctionSig {
                              cursor.kind() == CXCursor_ObjCClassMethodDecl {
             try!(ty.ret_type()
                    .or_else(|| cursor.ret_type())
                    .ok_or(ParseError::Continue))
         } else {
             try!(ty.ret_type().ok_or(ParseError::Continue))
         };
         let ret = Item::from_ty_or_ref(ty_ret_type, cursor, None, ctx);
-        let abi = get_abi(ty.call_conv());
+        let call_conv = ty.call_conv();
+        let abi = get_abi(call_conv);
 
         if abi.is_none() {
-            assert!(cursor.kind() == CXCursor_ObjCInstanceMethodDecl ||
-                    cursor.kind() == CXCursor_ObjCClassMethodDecl,
-                       "Invalid ABI for function signature")
+            warn!("Unknown calling convention: {:?}", call_conv);
         }
 
         Ok(Self::new(ret, args, ty.is_variadic(), abi))
     }
 
     /// Get this function signature's return type.
     pub fn return_type(&self) -> ItemId {
         self.return_type
--- a/third_party/rust/bindgen/src/main.rs
+++ b/third_party/rust/bindgen/src/main.rs
@@ -26,19 +26,22 @@ pub fn main() {
             max_log_level.set(env_logger.filter());
             Box::new(env_logger)
         })
         .expect("Failed to set logger.");
 
     let bind_args: Vec<_> = env::args().collect();
 
     let version = clang_version();
-    let expected_version = if cfg!(feature = "testing_only_llvm_stable") {
+    let expected_version = if cfg!(feature = "testing_only_libclang_4") {
+        (4, 0)
+    } else if cfg!(feature = "testing_only_libclang_3_8") {
         (3, 8)
     } else {
+        // Default to 3.9.
         (3, 9)
     };
 
     info!("Clang Version: {}", version.full);
 
     match version.parsed {
         None => warn!("Couldn't parse libclang version"),
         Some(version) if version != expected_version => {
--- a/toolkit/components/extensions/Extension.jsm
+++ b/toolkit/components/extensions/Extension.jsm
@@ -75,16 +75,18 @@ XPCOMUtils.defineLazyModuleGetter(this, 
 XPCOMUtils.defineLazyModuleGetter(this, "PrivateBrowsingUtils",
                                   "resource://gre/modules/PrivateBrowsingUtils.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "Preferences",
                                   "resource://gre/modules/Preferences.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "require",
                                   "resource://devtools/shared/Loader.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "Schemas",
                                   "resource://gre/modules/Schemas.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "TelemetryStopwatch",
+                                  "resource://gre/modules/TelemetryStopwatch.jsm");
 
 Cu.import("resource://gre/modules/ExtensionManagement.jsm");
 Cu.import("resource://gre/modules/ExtensionParent.jsm");
 Cu.import("resource://gre/modules/ExtensionUtils.jsm");
 
 XPCOMUtils.defineLazyServiceGetter(this, "uuidGen",
                                    "@mozilla.org/uuid-generator;1",
                                    "nsIUUIDGenerator");
@@ -964,16 +966,17 @@ this.Extension = class extends Extension
   }
 
   startup() {
     this.startupPromise = this._startup();
     return this.startupPromise;
   }
 
   async _startup() {
+    TelemetryStopwatch.start("WEBEXT_EXTENSION_STARTUP_MS", this);
     this.started = false;
 
     try {
       let [, perms] = await Promise.all([this.loadManifest(), ExtensionPermissions.get(this)]);
 
       ExtensionManagement.startupExtension(this.uuid, this.addonData.resourceURI, this);
       this.started = true;
 
@@ -1005,16 +1008,17 @@ this.Extension = class extends Extension
       // any of the "startup" listeners.
       this.emit("startup", this);
       Management.emit("startup", this);
 
       await this.runManifest(this.manifest);
 
       Management.emit("ready", this);
       this.emit("ready");
+      TelemetryStopwatch.finish("WEBEXT_EXTENSION_STARTUP_MS", this);
     } catch (e) {
       dump(`Extension error: ${e.message} ${e.filename || e.fileName}:${e.lineNumber} :: ${e.stack || new Error().stack}\n`);
       Cu.reportError(e);
 
       if (this.started) {
         this.started = false;
         ExtensionManagement.shutdownExtension(this.uuid);
       }
new file mode 100644
--- /dev/null
+++ b/toolkit/components/extensions/test/xpcshell/test_ext_extension_startup_telemetry.js
@@ -0,0 +1,29 @@
+/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* vim: set sts=2 sw=2 et tw=80: */
+"use strict";
+
+const HISTOGRAM = "WEBEXT_EXTENSION_STARTUP_MS";
+
+add_task(async function test_telemetry() {
+  let extension1 = ExtensionTestUtils.loadExtension({});
+  let extension2 = ExtensionTestUtils.loadExtension({});
+
+  let histogram = Services.telemetry.getHistogramById(HISTOGRAM);
+  histogram.clear();
+  equal(histogram.snapshot().sum, 0,
+        `No data recorded for histogram: ${HISTOGRAM}.`);
+
+  await extension1.startup();
+
+  let histogramSum = histogram.snapshot().sum;
+  ok(histogramSum > 0,
+     `Data recorded for first extension for histogram: ${HISTOGRAM}.`);
+
+  await extension2.startup();
+
+  ok(histogram.snapshot().sum > histogramSum,
+     `Data recorded for second extension for histogram: ${HISTOGRAM}.`);
+
+  await extension1.unload();
+  await extension2.unload();
+});
--- a/toolkit/components/extensions/test/xpcshell/xpcshell-common.ini
+++ b/toolkit/components/extensions/test/xpcshell/xpcshell-common.ini
@@ -23,16 +23,17 @@ skip-if = os == "android"
 skip-if = os == "android" || (os=='linux' && bits==32) # linux32: bug 1324870
 [test_ext_downloads_search.js]
 skip-if = os == "android"
 [test_ext_experiments.js]
 skip-if = release_or_beta
 [test_ext_extension.js]
 [test_ext_extensionPreferencesManager.js]
 [test_ext_extensionSettingsStore.js]
+[test_ext_extension_startup_telemetry.js]
 [test_ext_idle.js]
 [test_ext_localStorage.js]
 [test_ext_management.js]
 [test_ext_management_uninstall_self.js]
 [test_ext_onmessage_removelistener.js]
 skip-if = true # This test no longer tests what it is meant to test.
 [test_ext_privacy.js]
 [test_ext_privacy_disable.js]
--- a/toolkit/components/extensions/test/xpcshell/xpcshell.ini
+++ b/toolkit/components/extensions/test/xpcshell/xpcshell.ini
@@ -36,16 +36,17 @@ skip-if = os == "android"
 skip-if = os == "android" || (os=='linux' && bits==32) # linux32: bug 1324870
 [test_ext_downloads_search.js]
 skip-if = os == "android"
 [test_ext_experiments.js]
 skip-if = release_or_beta
 [test_ext_extension.js]
 [test_ext_extensionPreferencesManager.js]
 [test_ext_extensionSettingsStore.js]
+[test_ext_extension_startup_telemetry.js]
 [test_ext_idle.js]
 [test_ext_json_parser.js]
 [test_ext_localStorage.js]
 [test_ext_management.js]
 [test_ext_management_uninstall_self.js]
 [test_ext_manifest_content_security_policy.js]
 [test_ext_manifest_incognito.js]
 [test_ext_manifest_minimum_chrome_version.js]
--- a/toolkit/components/telemetry/Histograms.json
+++ b/toolkit/components/telemetry/Histograms.json
@@ -13259,10 +13259,21 @@
     "alert_emails": ["addons-dev-internal@mozilla.com"],
     "bug_numbers": [1353172],
     "expires_in_version": "60",
     "kind": "exponential",
     "releaseChannelCollection": "opt-out",
     "high": 60000,
     "n_buckets": 100,
     "description": "The amount of time it takes to load a WebExtensions background page, from when the build function is called to when the page has finished processing the onload event."
+  },
+  "WEBEXT_EXTENSION_STARTUP_MS": {
+    "record_in_processes": ["main"],
+    "alert_emails": ["addons-dev-internal@mozilla.com"],
+    "bug_numbers": [1353171],
+    "expires_in_version": "60",
+    "kind": "exponential",
+    "releaseChannelCollection": "opt-out",
+    "high": 50000,
+    "n_buckets": 100,
+    "description": "The amount of time it takes for a WebExtension to start up, from when the startup function is called to when the startup promise resolves."
   }
 }
--- a/toolkit/library/gtest/Makefile.in
+++ b/toolkit/library/gtest/Makefile.in
@@ -24,11 +24,9 @@ else
 include $(topsrcdir)/toolkit/library/libxul.mk
 
 include $(topsrcdir)/config/config.mk
 
 # Wrap linker to print linking status periodically to prevent the linking
 # process from getting killed
 EXPAND_LIBS_EXEC := $(PYTHON) $(topsrcdir)/config/link.py
 
-LINK_PDBFILE = xul-gtest.pdb
-
 endif
--- a/toolkit/library/gtest/rust/Cargo.lock
+++ b/toolkit/library/gtest/rust/Cargo.lock
@@ -65,17 +65,17 @@ source = "registry+https://github.com/ru
 dependencies = [
  "byteorder 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "num-traits 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde 0.9.9 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "bindgen"
-version = "0.25.1"
+version = "0.25.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "aster 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "cexpr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "cfg-if 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "clang-sys 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "clap 2.20.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "env_logger 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -819,17 +819,17 @@ source = "registry+https://github.com/ru
 
 [[package]]
 name = "style"
 version = "0.0.1"
 dependencies = [
  "app_units 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "arrayvec 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)",
  "atomic_refcell 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "bindgen 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "bindgen 0.25.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "bit-vec 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "byteorder 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "cfg-if 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "cssparser 0.13.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "euclid 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "fnv 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "itoa 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1162,17 +1162,17 @@ dependencies = [
 "checksum aho-corasick 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0638fd549427caa90c499814196d1b9e3725eb4d15d7339d6de073a680ed0ca2"
 "checksum ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "23ac7c30002a5accbf7e8987d0632fa6de155b7c3d39d0067317a391e00a2ef6"
 "checksum app_units 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c89beb28482985f88b312de4021d748f45b3eecec6cc8dbaf0c2b3c3d1ce6da5"
 "checksum arrayvec 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)" = "699e63a93b79d717e8c3b5eb1b28b7780d0d6d9e59a72eb769291c83b0c8dc67"
 "checksum aster 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4ccfdf7355d9db158df68f976ed030ab0f6578af811f5a7bb6dcf221ec24e0e0"
 "checksum atomic_refcell 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fb2dcb6e6d35f20276943cc04bb98e538b348d525a04ac79c10021561d202f21"
 "checksum binary-space-partition 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "88ceb0d16c4fd0e42876e298d7d3ce3780dd9ebdcbe4199816a32c77e08597ff"
 "checksum bincode 1.0.0-alpha6 (registry+https://github.com/rust-lang/crates.io-index)" = "fb0cdeac1c5d567fdb487ae5853c024e4acf1ea85ba6a6552fe084e0805fea5d"
-"checksum bindgen 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)" = "708a688675f9d2e7c73018e17f5997beacc9a5ca87a0cb60c13093915facda32"
+"checksum bindgen 0.25.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e28791695e6e29a82038bd0489a760f362157dc1a3b2bbac9b6be3ddd984ff7"
 "checksum bit-set 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d9bf6104718e80d7b26a68fdbacff3481cfc05df670821affc7e9cbc1884400c"
 "checksum bit-vec 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "5b97c2c8e8bbb4251754f559df8af22fb264853c7d009084a576cdf12565089d"
 "checksum bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aad18937a628ec6abcd26d1489012cc0e18c21798210f491af69ded9b881106d"
 "checksum bitflags 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1370e9fc2a6ae53aea8b7a5110edbd08836ed87c88736dfabccade1c2b44bff4"
 "checksum bitreader 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "80b13e2ab064ff3aa0bdbf1eff533f9822dc37899821f5f98c67f263eab51707"
 "checksum byteorder 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c40977b0ee6b9885c9013cd41d9feffdd22deb3bb4dc3a71d901cc7a77de18c8"
 "checksum cexpr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "393a5f0088efbe41f9d1fcd062f24e83c278608420e62109feb2c8abee07de7d"
 "checksum cfg-if 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "de1e760d7b6535af4241fca8bd8adf68e2e7edacc6b29f5d399050c5e48cf88c"
--- a/toolkit/library/rust/Cargo.lock
+++ b/toolkit/library/rust/Cargo.lock
@@ -63,17 +63,17 @@ source = "registry+https://github.com/ru
 dependencies = [
  "byteorder 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "num-traits 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde 0.9.9 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "bindgen"
-version = "0.25.1"
+version = "0.25.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "aster 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "cexpr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "cfg-if 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "clang-sys 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "clap 2.20.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "env_logger 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -806,17 +806,17 @@ source = "registry+https://github.com/ru
 
 [[package]]
 name = "style"
 version = "0.0.1"
 dependencies = [
  "app_units 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "arrayvec 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)",
  "atomic_refcell 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "bindgen 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "bindgen 0.25.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "bit-vec 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "byteorder 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "cfg-if 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "cssparser 0.13.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "euclid 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "fnv 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "itoa 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1149,17 +1149,17 @@ dependencies = [
 "checksum aho-corasick 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0638fd549427caa90c499814196d1b9e3725eb4d15d7339d6de073a680ed0ca2"
 "checksum ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "23ac7c30002a5accbf7e8987d0632fa6de155b7c3d39d0067317a391e00a2ef6"
 "checksum app_units 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c89beb28482985f88b312de4021d748f45b3eecec6cc8dbaf0c2b3c3d1ce6da5"
 "checksum arrayvec 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)" = "699e63a93b79d717e8c3b5eb1b28b7780d0d6d9e59a72eb769291c83b0c8dc67"
 "checksum aster 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4ccfdf7355d9db158df68f976ed030ab0f6578af811f5a7bb6dcf221ec24e0e0"
 "checksum atomic_refcell 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fb2dcb6e6d35f20276943cc04bb98e538b348d525a04ac79c10021561d202f21"
 "checksum binary-space-partition 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "88ceb0d16c4fd0e42876e298d7d3ce3780dd9ebdcbe4199816a32c77e08597ff"
 "checksum bincode 1.0.0-alpha6 (registry+https://github.com/rust-lang/crates.io-index)" = "fb0cdeac1c5d567fdb487ae5853c024e4acf1ea85ba6a6552fe084e0805fea5d"
-"checksum bindgen 0.25.1 (registry+https://github.com/rust-lang/crates.io-index)" = "708a688675f9d2e7c73018e17f5997beacc9a5ca87a0cb60c13093915facda32"
+"checksum bindgen 0.25.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e28791695e6e29a82038bd0489a760f362157dc1a3b2bbac9b6be3ddd984ff7"
 "checksum bit-set 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d9bf6104718e80d7b26a68fdbacff3481cfc05df670821affc7e9cbc1884400c"
 "checksum bit-vec 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "5b97c2c8e8bbb4251754f559df8af22fb264853c7d009084a576cdf12565089d"
 "checksum bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aad18937a628ec6abcd26d1489012cc0e18c21798210f491af69ded9b881106d"
 "checksum bitflags 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1370e9fc2a6ae53aea8b7a5110edbd08836ed87c88736dfabccade1c2b44bff4"
 "checksum bitreader 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "80b13e2ab064ff3aa0bdbf1eff533f9822dc37899821f5f98c67f263eab51707"
 "checksum byteorder 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c40977b0ee6b9885c9013cd41d9feffdd22deb3bb4dc3a71d901cc7a77de18c8"
 "checksum cexpr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "393a5f0088efbe41f9d1fcd062f24e83c278608420e62109feb2c8abee07de7d"
 "checksum cfg-if 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "de1e760d7b6535af4241fca8bd8adf68e2e7edacc6b29f5d399050c5e48cf88c"