Merge mozilla-central to inbound. a=merge CLOSED TREE
authorBrindusan Cristian <cbrindusan@mozilla.com>
Fri, 21 Sep 2018 20:32:42 +0300
changeset 437713 1879856ca1ab0def40038be7482a9bc2e140cfee
parent 437676 f138b7d87e7f728534d4cc416eb84a66fdddbd7a (current diff)
parent 437712 ce4e883f7642c2c8652e7c065f5bfb122a71cb95 (diff)
child 437714 2718c0bfff1d6e9cf07e28212cf7d1dd5b09485e
push id108133
push usercbrindusan@mozilla.com
push dateFri, 21 Sep 2018 17:33:11 +0000
treeherdermozilla-inbound@1879856ca1ab [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone64.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge mozilla-central to inbound. a=merge CLOSED TREE
browser/themes/shared/icons/check.svg
python/mozlint/test/test_filterpaths.py
toolkit/themes/shared/in-content/check-partial.svg
--- a/.vscode/tasks.json
+++ b/.vscode/tasks.json
@@ -26,17 +26,17 @@
       },
       {
         "label": "build",
         "type":"shell",
         "problemMatcher": {
           "owner": "cpp",
           "fileLocation": "absolute",
           "pattern": {
-            "regexp": "^.*?([^\\s]*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$",
+            "regexp": "^.*?([^\\s]*)[:(](\\d+)[:,](\\d+)[)]?:\\s+(warning|error):\\s+(.*)$",
             "file": 1,
             "line": 2,
             "column": 3,
             "severity": 4,
             "message": 5
           }
         }
       },
@@ -47,17 +47,17 @@
         "windows": {
           "command": "\"\\mozilla-build\\start-shell.bat mach\""
         },
         "args": ["--log-no-times", "build", "binaries"],
         "problemMatcher": {
           "owner": "cpp",
           "fileLocation": "absolute",
           "pattern": {
-            "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$",
+            "regexp": "^(.*)[:(](\\d+)[:,](\\d+)[)]?:\\s+(warning|error):\\s+(.*)$",
             "file": 1,
             "line": 2,
             "column": 3,
             "severity": 4,
             "message": 5
           }
         },
         "group": {
@@ -72,17 +72,17 @@
         "windows": {
           "command": "\"\\mozilla-build\\start-shell.bat mach\""
         },
         "args": ["--log-no-times", "build", "faster"],
         "problemMatcher": {
           "owner": "cpp",
           "fileLocation": "absolute",
           "pattern": {
-            "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$",
+            "regexp": "^(.*)[:(](\\d+)[:,](\\d+)[)]?:\\s+(warning|error):\\s+(.*)$",
             "file": 1,
             "line": 2,
             "column": 3,
             "severity": 4,
             "message": 5
           }
         }
       },
--- a/browser/base/content/browser-contentblocking.js
+++ b/browser/base/content/browser-contentblocking.js
@@ -488,16 +488,17 @@ var ContentBlocking = {
 
     // Check whether the user has added an exception for this site.
     let type =  isBrowserPrivate ? "trackingprotection-pb" : "trackingprotection";
     let hasException = Services.perms.testExactPermission(baseURI, type) ==
       Services.perms.ALLOW_ACTION;
 
     this.content.toggleAttribute("detected", detected);
     this.content.toggleAttribute("hasException", hasException);
+    this.content.toggleAttribute("active", active);
 
     this.iconBox.toggleAttribute("active", active);
     this.iconBox.toggleAttribute("hasException", this.enabled && hasException);
 
     if (isSimulated) {
       this.iconBox.removeAttribute("animate");
     } else if (active && webProgress.isTopLevel) {
       this.iconBox.setAttribute("animate", "true");
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -2148,18 +2148,17 @@ function BrowserReload() {
 
 function BrowserReloadSkipCache() {
   // Bypass proxy and cache.
   const reloadFlags = Ci.nsIWebNavigation.LOAD_FLAGS_BYPASS_PROXY |
                       Ci.nsIWebNavigation.LOAD_FLAGS_BYPASS_CACHE;
   BrowserReloadWithFlags(reloadFlags);
 }
 
-var BrowserHome = BrowserGoHome;
-function BrowserGoHome(aEvent) {
+function BrowserHome(aEvent) {
   if (aEvent && "button" in aEvent &&
       aEvent.button == 2) // right-click: do nothing
     return;
 
   var homePage = HomePage.get();
   var where = whereToOpenLink(aEvent, false, true);
   var urls;
   var notifyObservers;
--- a/browser/base/content/browser.xul
+++ b/browser/base/content/browser.xul
@@ -824,17 +824,17 @@ xmlns="http://www.w3.org/1999/xhtml"
         <toolbarbutton id="home-button" class="toolbarbutton-1 chromeclass-toolbar-additional"
                        removable="true"
                        label="&homeButton.label;"
                        ondragover="homeButtonObserver.onDragOver(event)"
                        ondragenter="homeButtonObserver.onDragOver(event)"
                        ondrop="homeButtonObserver.onDrop(event)"
                        ondragexit="homeButtonObserver.onDragExit(event)"
                        key="goHome"
-                       onclick="BrowserGoHome(event);"
+                       onclick="BrowserHome(event);"
                        cui-areatype="toolbar"
                        tooltiptext="&homeButton.defaultPage.tooltip;"/>
         <toolbarspring cui-areatype="toolbar" class="chromeclass-toolbar-additional"/>
         <toolbaritem id="urlbar-container" flex="400" persist="width"
                      removable="false"
                      class="chromeclass-location" overflows="false">
             <textbox id="urlbar" flex="1"
                      placeholder="&urlbar.placeholder2;"
--- a/browser/base/content/test/trackingUI/browser_trackingUI_state.js
+++ b/browser/base/content/test/trackingUI/browser_trackingUI_state.js
@@ -61,16 +61,17 @@ function clickButton(sel) {
   let el = win.document.querySelector(sel);
   el.doCommand();
 }
 
 function testBenignPage() {
   info("Non-tracking content must not be blocked");
   ok(!ContentBlocking.content.hasAttribute("detected"), "no trackers are detected");
   ok(!ContentBlocking.content.hasAttribute("hasException"), "content shows no exception");
+  ok(!ContentBlocking.content.hasAttribute("active"), "content is not active");
 
   ok(!ContentBlocking.iconBox.hasAttribute("active"), "shield is not active");
   ok(!ContentBlocking.iconBox.hasAttribute("hasException"), "icon box shows no exception");
   ok(!ContentBlocking.iconBox.hasAttribute("tooltiptext"), "icon box has no tooltip");
 
   ok(BrowserTestUtils.is_hidden(ContentBlocking.iconBox), "icon box is hidden");
   ok(hidden("#tracking-action-block"), "blockButton is hidden");
   ok(hidden("#tracking-action-unblock"), "unblockButton is hidden");
@@ -84,16 +85,17 @@ function testBenignPage() {
     ok(hidden("#identity-popup-content-blocking-category-list"), "category list is hidden");
   }
 }
 
 function testBenignPageWithException() {
   info("Non-tracking content must not be blocked");
   ok(!ContentBlocking.content.hasAttribute("detected"), "no trackers are detected");
   ok(ContentBlocking.content.hasAttribute("hasException"), "content shows exception");
+  ok(!ContentBlocking.content.hasAttribute("active"), "content is not active");
 
   ok(!ContentBlocking.iconBox.hasAttribute("active"), "shield is not active");
   is(ContentBlocking.iconBox.hasAttribute("hasException"), ContentBlocking.enabled,
     "shield shows exception if CB is on");
   is(ContentBlocking.iconBox.getAttribute("tooltiptext"),
      gNavigatorBundle.getString("trackingProtection.icon.disabledTooltip"), "correct tooltip");
 
   is(!BrowserTestUtils.is_hidden(ContentBlocking.iconBox), ContentBlocking.enabled,
@@ -129,37 +131,37 @@ function testTrackingPage(window) {
   info("Tracking content must be blocked");
   ok(ContentBlocking.content.hasAttribute("detected"), "trackers are detected");
   ok(!ContentBlocking.content.hasAttribute("hasException"), "content shows no exception");
 
   let isPrivateBrowsing = PrivateBrowsingUtils.isWindowPrivate(window);
   let blockedByTP = areTrackersBlocked(isPrivateBrowsing);
   is(BrowserTestUtils.is_visible(ContentBlocking.iconBox), blockedByTP,
      "icon box is" + (blockedByTP ? "" : " not") + " visible");
+  is(ContentBlocking.content.hasAttribute("active"), blockedByTP,
+      "content is" + (blockedByTP ? "" : " not") + " active");
   is(ContentBlocking.iconBox.hasAttribute("active"), blockedByTP,
       "shield is" + (blockedByTP ? "" : " not") + " active");
   ok(!ContentBlocking.iconBox.hasAttribute("hasException"), "icon box shows no exception");
   is(ContentBlocking.iconBox.getAttribute("tooltiptext"),
      blockedByTP ? gNavigatorBundle.getString("trackingProtection.icon.activeTooltip") : "",
      "correct tooltip");
 
   ok(hidden("#tracking-action-block"), "blockButton is hidden");
 
   let isWindowPrivate = PrivateBrowsingUtils.isWindowPrivate(window);
   let cbUIEnabled = Services.prefs.getBoolPref(CB_UI_PREF);
-  let tpEnabled = isWindowPrivate ? Services.prefs.getBoolPref(TP_PB_PREF) : Services.prefs.getBoolPref(TP_PREF);
-  let blockingEnabled = cbUIEnabled ? Services.prefs.getBoolPref(CB_PREF) : tpEnabled;
   if (isWindowPrivate) {
     ok(hidden("#tracking-action-unblock"), "unblockButton is hidden");
-    is(!hidden("#tracking-action-unblock-private"), blockingEnabled,
-       "unblockButtonPrivate is" + (blockingEnabled ? "" : " not") + " visible");
+    is(!hidden("#tracking-action-unblock-private"), blockedByTP,
+       "unblockButtonPrivate is" + (blockedByTP ? "" : " not") + " visible");
   } else {
     ok(hidden("#tracking-action-unblock-private"), "unblockButtonPrivate is hidden");
-    is(!hidden("#tracking-action-unblock"), blockingEnabled,
-       "unblockButton is" + (blockingEnabled ? "" : " not") + " hidden");
+    is(!hidden("#tracking-action-unblock"), blockedByTP,
+       "unblockButton is" + (blockedByTP ? "" : " not") + " visible");
   }
 
   ok(hidden("#identity-popup-content-blocking-not-detected"), "blocking not detected label is hidden");
   ok(!hidden("#identity-popup-content-blocking-detected"), "blocking detected label is visible");
 
   if (cbUIEnabled) {
     ok(!hidden("#identity-popup-content-blocking-category-list"), "category list is visible");
     let category;
@@ -181,17 +183,18 @@ function testTrackingPageUnblocked(block
   info("Tracking content must be white-listed and not blocked");
   ok(ContentBlocking.content.hasAttribute("detected"), "trackers are detected");
   ok(ContentBlocking.content.hasAttribute("hasException"), "content shows exception");
 
   let isWindowPrivate = PrivateBrowsingUtils.isWindowPrivate(window);
   let cbUIEnabled = Services.prefs.getBoolPref(CB_UI_PREF);
   let tpEnabled = isWindowPrivate ? Services.prefs.getBoolPref(TP_PB_PREF) : Services.prefs.getBoolPref(TP_PREF);
   let blockingEnabled = cbUIEnabled ? Services.prefs.getBoolPref(CB_PREF) : tpEnabled;
-  ok(!ContentBlocking.iconBox.hasAttribute("active"), "shield is active");
+  ok(!ContentBlocking.content.hasAttribute("active"), "content is not active");
+  ok(!ContentBlocking.iconBox.hasAttribute("active"), "shield is not active");
   is(ContentBlocking.iconBox.hasAttribute("hasException"), blockingEnabled,
      "shield" + (blockingEnabled ? " shows" : " doesn't show") + " exception");
   is(ContentBlocking.iconBox.getAttribute("tooltiptext"),
      gNavigatorBundle.getString("trackingProtection.icon.disabledTooltip"), "correct tooltip");
 
   is(BrowserTestUtils.is_visible(ContentBlocking.iconBox), blockingEnabled,
      "icon box is" + (blockingEnabled ? "" : " not") + " visible");
   is(hidden("#tracking-action-block"), !blockingEnabled,
@@ -219,16 +222,17 @@ function testTrackingPageUnblocked(block
       "TP category item is not set to blocked");
   }
 }
 
 function testTrackingPageWithCBDisabled() {
   info("Tracking content must be white-listed and not blocked");
   ok(ContentBlocking.content.hasAttribute("detected"), "trackers are detected");
   ok(!ContentBlocking.content.hasAttribute("hasException"), "content shows no exception");
+  ok(!ContentBlocking.content.hasAttribute("active"), "content is not active");
 
   ok(!ContentBlocking.iconBox.hasAttribute("active"), "shield is not active");
   ok(!ContentBlocking.iconBox.hasAttribute("hasException"), "shield shows no exception");
   ok(!ContentBlocking.iconBox.getAttribute("tooltiptext"), "icon box has no tooltip");
 
   ok(BrowserTestUtils.is_hidden(ContentBlocking.iconBox), "icon box is hidden");
   ok(hidden("#tracking-action-block"), "blockButton is hidden");
   ok(hidden("#tracking-action-unblock"), "unblockButton is hidden");
--- a/browser/components/extensions/parent/ext-chrome-settings-overrides.js
+++ b/browser/components/extensions/parent/ext-chrome-settings-overrides.js
@@ -38,17 +38,17 @@ XPCOMUtils.defineLazyGetter(this, "homep
       //   2. Now that this tab isn't associated with the add-on, disable the add-on
       //   3. Trigger the browser's homepage method
       let gBrowser = win.gBrowser;
       let tab = gBrowser.selectedTab;
       await replaceUrlInTab(gBrowser, tab, "about:blank");
       Services.prefs.addObserver(HOMEPAGE_PREF, async function prefObserver() {
         Services.prefs.removeObserver(HOMEPAGE_PREF, prefObserver);
         let loaded = waitForTabLoaded(tab);
-        win.BrowserGoHome();
+        win.BrowserHome();
         await loaded;
         // Manually trigger an event in case this is controlled again.
         popup.open();
       });
     },
   });
 });
 
--- a/browser/components/extensions/test/browser/browser_ext_chrome_settings_overrides_home.js
+++ b/browser/components/extensions/test/browser/browser_ext_chrome_settings_overrides_home.js
@@ -314,17 +314,17 @@ add_task(async function test_doorhanger_
 
   let panel = document.getElementById("extension-notification-panel");
   let popupnotification = document.getElementById("extension-homepage-notification");
 
   await ext1.startup();
   await ext2.startup();
 
   let popupShown = promisePopupShown(panel);
-  BrowserGoHome();
+  BrowserHome();
   await BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser);
   await popupShown;
 
   ok(gURLBar.value.endsWith("ext2.html"), "ext2 is in control");
 
   // Click Restore Settings.
   let popupHidden = promisePopupHidden(panel);
   let prefPromise = promisePrefChangeObserved(HOMEPAGE_URL_PREF);
--- a/browser/components/newtab/content-src/components/TopSites/_TopSites.scss
+++ b/browser/components/newtab/content-src/components/TopSites/_TopSites.scss
@@ -562,26 +562,25 @@
       left: auto;
       right: $checkbox-offset;
     }
   }
 
   // checkmark
   [type='checkbox']:not(:checked) + label::after,
   [type='checkbox']:checked + label::after {
-    background: url('chrome://global/skin/in-content/check.svg') no-repeat center center; // sass-lint:disable-line no-url-domains
+    background: url('chrome://global/skin/icons/check.svg') no-repeat center center; // sass-lint:disable-line no-url-domains
     content: '';
     height: 21px;
     left: $checkbox-offset;
     position: absolute;
     top: $checkbox-offset;
     width: 21px;
-    -moz-context-properties: fill, stroke;
+    -moz-context-properties: fill;
     fill: var(--newtab-link-primary-color);
-    stroke: none;
     z-index: 2;
 
     [dir='rtl'] & {
       left: auto;
       right: $checkbox-offset;
     }
   }
 
--- a/browser/components/newtab/content-src/styles/_icons.scss
+++ b/browser/components/newtab/content-src/styles/_icons.scss
@@ -114,17 +114,17 @@
     @include flip-icon;
     background-image: url('#{$image-path}glyph-pin-12.svg');
     background-size: $smaller-icon-size;
     height: $smaller-icon-size;
     width: $smaller-icon-size;
   }
 
   &.icon-check {
-    background-image: url('chrome://browser/skin/check.svg');
+    background-image: url('chrome://global/skin/icons/check.svg');
   }
 
   &.icon-download {
     background-image: url('chrome://browser/skin/downloads/download-icons.svg#arrow-with-bar');
   }
 
   &.icon-copy {
     background-image: url('chrome://browser/skin/edit-copy.svg');
--- a/browser/components/newtab/css/activity-stream-linux.css
+++ b/browser/components/newtab/css/activity-stream-linux.css
@@ -180,17 +180,17 @@ body {
   .icon.icon-pin-small {
     background-image: url("../data/content/assets/glyph-pin-12.svg");
     background-size: 12px;
     height: 12px;
     width: 12px; }
     .icon.icon-pin-small:dir(rtl) {
       transform: scaleX(-1); }
   .icon.icon-check {
-    background-image: url("chrome://browser/skin/check.svg"); }
+    background-image: url("chrome://global/skin/icons/check.svg"); }
   .icon.icon-download {
     background-image: url("chrome://browser/skin/downloads/download-icons.svg#arrow-with-bar"); }
   .icon.icon-copy {
     background-image: url("chrome://browser/skin/edit-copy.svg"); }
   .icon.icon-open-file {
     background-image: url("../data/content/assets/glyph-open-file-16.svg"); }
   .icon.icon-webextension {
     background-image: url("../data/content/assets/glyph-webextension-16.svg"); }
@@ -809,26 +809,25 @@ main {
   z-index: 1; }
   [dir='rtl'] .topsite-form [type='checkbox']:not(:checked) + label::before, [dir='rtl']
   .topsite-form [type='checkbox']:checked + label::before {
     left: auto;
     right: -8px; }
 
 .topsite-form [type='checkbox']:not(:checked) + label::after,
 .topsite-form [type='checkbox']:checked + label::after {
-  background: url("chrome://global/skin/in-content/check.svg") no-repeat center center;
+  background: url("chrome://global/skin/icons/check.svg") no-repeat center center;
   content: '';
   height: 21px;
   left: -8px;
   position: absolute;
   top: -8px;
   width: 21px;
   -moz-context-properties: fill, stroke;
   fill: var(--newtab-link-primary-color);
-  stroke: none;
   z-index: 2; }
   [dir='rtl'] .topsite-form [type='checkbox']:not(:checked) + label::after, [dir='rtl']
   .topsite-form [type='checkbox']:checked + label::after {
     left: auto;
     right: -8px; }
 
 .topsite-form [type='checkbox']:checked + label .tile {
   box-shadow: 0 0 0 2px var(--newtab-link-primary-color); }
@@ -2154,9 +2153,9 @@ a.firstrun-link {
     margin-top: 40px;
     margin-left: 215px; }
     @media (max-width: 850px) {
       .onboardingMessage::before {
         content: none; } }
   .onboardingMessage:last-child::before {
     content: none; }
 
-/*# sourceMappingURL=activity-stream-linux.css.map */
\ No newline at end of file
+/*# sourceMappingURL=activity-stream-linux.css.map */
--- a/browser/components/newtab/css/activity-stream-mac.css
+++ b/browser/components/newtab/css/activity-stream-mac.css
@@ -183,17 +183,17 @@ body {
   .icon.icon-pin-small {
     background-image: url("../data/content/assets/glyph-pin-12.svg");
     background-size: 12px;
     height: 12px;
     width: 12px; }
     .icon.icon-pin-small:dir(rtl) {
       transform: scaleX(-1); }
   .icon.icon-check {
-    background-image: url("chrome://browser/skin/check.svg"); }
+    background-image: url("chrome://global/skin/icons/check.svg"); }
   .icon.icon-download {
     background-image: url("chrome://browser/skin/downloads/download-icons.svg#arrow-with-bar"); }
   .icon.icon-copy {
     background-image: url("chrome://browser/skin/edit-copy.svg"); }
   .icon.icon-open-file {
     background-image: url("../data/content/assets/glyph-open-file-16.svg"); }
   .icon.icon-webextension {
     background-image: url("../data/content/assets/glyph-webextension-16.svg"); }
@@ -812,26 +812,25 @@ main {
   z-index: 1; }
   [dir='rtl'] .topsite-form [type='checkbox']:not(:checked) + label::before, [dir='rtl']
   .topsite-form [type='checkbox']:checked + label::before {
     left: auto;
     right: -8px; }
 
 .topsite-form [type='checkbox']:not(:checked) + label::after,
 .topsite-form [type='checkbox']:checked + label::after {
-  background: url("chrome://global/skin/in-content/check.svg") no-repeat center center;
+  background: url("chrome://global/skin/icons/check.svg") no-repeat center center;
   content: '';
   height: 21px;
   left: -8px;
   position: absolute;
   top: -8px;
   width: 21px;
-  -moz-context-properties: fill, stroke;
+  -moz-context-properties: fill;
   fill: var(--newtab-link-primary-color);
-  stroke: none;
   z-index: 2; }
   [dir='rtl'] .topsite-form [type='checkbox']:not(:checked) + label::after, [dir='rtl']
   .topsite-form [type='checkbox']:checked + label::after {
     left: auto;
     right: -8px; }
 
 .topsite-form [type='checkbox']:checked + label .tile {
   box-shadow: 0 0 0 2px var(--newtab-link-primary-color); }
@@ -2157,9 +2156,9 @@ a.firstrun-link {
     margin-top: 40px;
     margin-left: 215px; }
     @media (max-width: 850px) {
       .onboardingMessage::before {
         content: none; } }
   .onboardingMessage:last-child::before {
     content: none; }
 
-/*# sourceMappingURL=activity-stream-mac.css.map */
\ No newline at end of file
+/*# sourceMappingURL=activity-stream-mac.css.map */
--- a/browser/components/newtab/css/activity-stream-windows.css
+++ b/browser/components/newtab/css/activity-stream-windows.css
@@ -180,17 +180,17 @@ body {
   .icon.icon-pin-small {
     background-image: url("../data/content/assets/glyph-pin-12.svg");
     background-size: 12px;
     height: 12px;
     width: 12px; }
     .icon.icon-pin-small:dir(rtl) {
       transform: scaleX(-1); }
   .icon.icon-check {
-    background-image: url("chrome://browser/skin/check.svg"); }
+    background-image: url("chrome://global/skin/icons/check.svg"); }
   .icon.icon-download {
     background-image: url("chrome://browser/skin/downloads/download-icons.svg#arrow-with-bar"); }
   .icon.icon-copy {
     background-image: url("chrome://browser/skin/edit-copy.svg"); }
   .icon.icon-open-file {
     background-image: url("../data/content/assets/glyph-open-file-16.svg"); }
   .icon.icon-webextension {
     background-image: url("../data/content/assets/glyph-webextension-16.svg"); }
@@ -809,26 +809,25 @@ main {
   z-index: 1; }
   [dir='rtl'] .topsite-form [type='checkbox']:not(:checked) + label::before, [dir='rtl']
   .topsite-form [type='checkbox']:checked + label::before {
     left: auto;
     right: -8px; }
 
 .topsite-form [type='checkbox']:not(:checked) + label::after,
 .topsite-form [type='checkbox']:checked + label::after {
-  background: url("chrome://global/skin/in-content/check.svg") no-repeat center center;
+  background: url("chrome://global/skin/icons/check.svg") no-repeat center center;
   content: '';
   height: 21px;
   left: -8px;
   position: absolute;
   top: -8px;
   width: 21px;
-  -moz-context-properties: fill, stroke;
+  -moz-context-properties: fill;
   fill: var(--newtab-link-primary-color);
-  stroke: none;
   z-index: 2; }
   [dir='rtl'] .topsite-form [type='checkbox']:not(:checked) + label::after, [dir='rtl']
   .topsite-form [type='checkbox']:checked + label::after {
     left: auto;
     right: -8px; }
 
 .topsite-form [type='checkbox']:checked + label .tile {
   box-shadow: 0 0 0 2px var(--newtab-link-primary-color); }
@@ -2154,9 +2153,9 @@ a.firstrun-link {
     margin-top: 40px;
     margin-left: 215px; }
     @media (max-width: 850px) {
       .onboardingMessage::before {
         content: none; } }
   .onboardingMessage:last-child::before {
     content: none; }
 
-/*# sourceMappingURL=activity-stream-windows.css.map */
\ No newline at end of file
+/*# sourceMappingURL=activity-stream-windows.css.map */
--- a/browser/themes/shared/aboutSessionRestore.css
+++ b/browser/themes/shared/aboutSessionRestore.css
@@ -84,28 +84,26 @@ treechildren::-moz-tree-image(noicon) {
   -moz-context-properties: fill;
   fill: currentColor;
 }
 treechildren::-moz-tree-image(container, noicon) {
   list-style-image: url("chrome://browser/skin/window.svg");
 }
 
 treechildren::-moz-tree-image(checked) {
-  list-style-image: url("chrome://global/skin/in-content/check.svg");
+  list-style-image: url("chrome://global/skin/icons/check.svg");
   -moz-context-properties: fill, stroke;
   fill: #2292d0;
-  stroke: none;
 }
 treechildren::-moz-tree-image(checked, selected) {
   fill: white;
   stroke: #0095dd;
 }
 
 treechildren::-moz-tree-image(partial) {
-  list-style-image: url("chrome://global/skin/in-content/check-partial.svg");
+  list-style-image: url("chrome://global/skin/icons/check-partial.svg");
   -moz-context-properties: fill, stroke;
   fill: #2292d0;
-  stroke: none;
 }
 treechildren::-moz-tree-image(partial, selected) {
   fill: white;
   stroke: #0095dd;
 }
--- a/browser/themes/shared/aboutWelcomeBack.css
+++ b/browser/themes/shared/aboutWelcomeBack.css
@@ -30,28 +30,26 @@ treechildren::-moz-tree-image(noicon) {
   -moz-context-properties: fill;
   fill: currentColor;
 }
 treechildren::-moz-tree-image(container, noicon) {
   list-style-image: url("chrome://browser/skin/window.svg");
 }
 
 treechildren::-moz-tree-image(checked) {
-  list-style-image: url("chrome://global/skin/in-content/check.svg");
+  list-style-image: url("chrome://global/skin/icons/check.svg");
   -moz-context-properties: fill, stroke;
   fill: #2292d0;
-  stroke: none;
 }
 treechildren::-moz-tree-image(checked, selected) {
   fill: white;
   stroke: #0095dd;
 }
 
 treechildren::-moz-tree-image(partial) {
-  list-style-image: url("chrome://global/skin/in-content/check-partial.svg");
+  list-style-image: url("chrome://global/skin/icons/check-partial.svg");
   -moz-context-properties: fill, stroke;
   fill: #2292d0;
-  stroke: none;
 }
 treechildren::-moz-tree-image(partial, selected) {
   fill: white;
   stroke: #0095dd;
 }
--- a/browser/themes/shared/controlcenter/panel.inc.css
+++ b/browser/themes/shared/controlcenter/panel.inc.css
@@ -482,25 +482,25 @@ description#identity-popup-content-verif
 #identity-popup-content-blocking-report-breakage {
   margin-top: 6px;
 }
 
 /* Hide the "report breakage" button if TP is off or we have not detected any
  * trackers (except if the user added an exception, in which case they might
  * still (especially!) want to report the breakage). */
 #identity-popup-content-blocking-content:not([enabled]) #identity-popup-content-blocking-report-breakage,
-#identity-popup-content-blocking-content:not([detected]):not([hasException]) #identity-popup-content-blocking-report-breakage {
+#identity-popup-content-blocking-content:not([active]):not([hasException]) #identity-popup-content-blocking-report-breakage {
   display: none;
 }
 
 /* Show the right action buttons depending on content state */
 /* Offer to temporarily add an exception in private mode. */
-#main-window:not([privatebrowsingmode]) #identity-popup-content-blocking-content[enabled][detected]:not([hasException]) > #tracking-action-unblock,
+#main-window:not([privatebrowsingmode]) #identity-popup-content-blocking-content[active]:not([hasException]) > #tracking-action-unblock,
 /* Offer to permanently add an exception in normal mode. */
-#main-window[privatebrowsingmode] #identity-popup-content-blocking-content[enabled][detected]:not([hasException]) > #tracking-action-unblock-private,
+#main-window[privatebrowsingmode] #identity-popup-content-blocking-content[active]:not([hasException]) > #tracking-action-unblock-private,
 /* If there's an exception just offer to remove the exception again. */
 #identity-popup-content-blocking-content[enabled][hasException] > #tracking-action-block {
   display: -moz-box;
 }
 
 /* PERMISSIONS */
 
 #identity-popup-permissions-content {
--- a/browser/themes/shared/customizableui/panelUI.inc.css
+++ b/browser/themes/shared/customizableui/panelUI.inc.css
@@ -999,17 +999,17 @@ panelview .toolbarbutton-1,
   fill: currentColor;
   fill-opacity: 0.4;
   float: right;
   /* Centers the icon and resizes it to 12px square. */
   transform: translateY(2px) scaleX(.75);
 }
 
 .subviewbutton[checked="true"] {
-  list-style-image: url(chrome://browser/skin/check.svg);
+  list-style-image: url(chrome://global/skin/icons/check.svg);
   -moz-context-properties: fill;
   fill: currentColor;
   color: inherit;
 }
 
 #appMenu-popup .toolbaritem-combined-buttons {
   -moz-box-align: center;
   -moz-box-orient: horizontal;
--- a/browser/themes/shared/incontentprefs/preferences.inc.css
+++ b/browser/themes/shared/incontentprefs/preferences.inc.css
@@ -67,18 +67,16 @@ button > hbox > label {
 }
 
 .indent {
   margin-inline-start: 28px !important;
 }
 
 .checkbox-check {
   margin-inline-end: 8px;
-  width: 20px;
-  height: 20px;
 }
 
 .tail-with-learn-more {
   margin-inline-start: 0px;
   margin-inline-end: 10px;
 }
 
 /* Add a bit of space to the end of descriptions to
@@ -349,22 +347,19 @@ button > hbox > label {
 /* Search Pane */
 
 #engineList {
   margin: 2px 0 5px;
 }
 
 #engineList > treechildren::-moz-tree-image(engineShown, checked),
 #blocklistsTree > treechildren::-moz-tree-image(selectionCol, checked) {
-  list-style-image: url("chrome://global/skin/in-content/check.svg");
+  list-style-image: url("chrome://global/skin/icons/check.svg");
   -moz-context-properties: fill, stroke;
   fill: #2292d0;
-  stroke: none;
-  width: 21px;
-  height: 21px;
 }
 
 #engineList > treechildren::-moz-tree-image(engineShown, checked, selected),
 #blocklistsTree > treechildren::-moz-tree-image(selectionCol, checked, selected) {
   fill: white;
   stroke: #0095dd;
 }
 
--- a/browser/themes/shared/incontentprefs/privacy.css
+++ b/browser/themes/shared/incontentprefs/privacy.css
@@ -127,17 +127,18 @@
   padding-inline-start: 4px;
   margin-inline-start: 25px !important;
 }
 
 #trackingProtectionMenu {
   margin-top: 0.75em;
 }
 
-#blockCookiesCBDeck {
+#blockCookiesCBDeck:not([selectedIndex]),
+#blockCookiesCBDeck:not([selectedIndex="0"]) {
   max-width: 444px;
 }
 
 #blockCookiesCBDeck:not([selectedIndex]) > .warning-description,
 #blockCookiesCBDeck[selectedIndex="0"] > .warning-description {
   display: none;
 }
 
--- a/browser/themes/shared/jar.inc.mn
+++ b/browser/themes/shared/jar.inc.mn
@@ -133,17 +133,16 @@
   skin/classic/browser/back-12.svg                    (../shared/icons/back-12.svg)
   skin/classic/browser/bookmark.svg                   (../shared/icons/bookmark.svg)
   skin/classic/browser/bookmark-animation.svg         (../shared/icons/bookmark-animation.svg)
   skin/classic/browser/bookmark-hollow.svg            (../shared/icons/bookmark-hollow.svg)
   skin/classic/browser/bookmark-star-on-tray.svg      (../shared/icons/bookmark-star-on-tray.svg)
   skin/classic/browser/characterEncoding.svg          (../shared/icons/characterEncoding.svg)
   skin/classic/browser/chevron.svg                    (../shared/icons/chevron.svg)
   skin/classic/browser/chevron-animation.svg          (../shared/icons/chevron-animation.svg)
-  skin/classic/browser/check.svg                      (../shared/icons/check.svg)
   skin/classic/browser/check-animation.svg            (../shared/icons/check-animation.svg)
   skin/classic/browser/customize.svg                  (../shared/icons/customize.svg)
   skin/classic/browser/developer.svg                  (../shared/icons/developer.svg)
   skin/classic/browser/device-phone.svg               (../shared/icons/device-phone.svg)
   skin/classic/browser/device-tablet.svg              (../shared/icons/device-tablet.svg)
   skin/classic/browser/device-desktop.svg             (../shared/icons/device-desktop.svg)
   skin/classic/browser/edit-copy.svg                  (../shared/icons/edit-copy.svg)
   skin/classic/browser/edit-cut.svg                   (../shared/icons/edit-cut.svg)
--- a/browser/themes/shared/sidebar.inc.css
+++ b/browser/themes/shared/sidebar.inc.css
@@ -105,17 +105,17 @@
 }
 
 toolbarseparator + #sidebar-extensions-separator {
   display: none;
 }
 
 #sidebarMenu-popup > .subviewbutton[checked="true"] {
   list-style-image: none;
-  background: url(chrome://browser/skin/check.svg) no-repeat transparent;
+  background: url(chrome://global/skin/icons/check.svg) no-repeat transparent;
   background-size: 11px 11px;
 }
 
 %ifdef XP_MACOSX
 
 #sidebarMenu-popup > .subviewbutton[checked="true"] {
   background-position: top 7px left 4px;
 }
--- a/build/build-clang/clang-tidy-win32.json
+++ b/build/build-clang/clang-tidy-win32.json
@@ -4,15 +4,15 @@
     "build_libcxx": false,
     "build_type": "Release",
     "assertions": false,
     "build_clang_tidy": true,
     "llvm_repo": "https://llvm.org/svn/llvm-project/llvm/tags/RELEASE_700/final",
     "clang_repo": "https://llvm.org/svn/llvm-project/cfe/tags/RELEASE_700/final",
     "extra_repo": "https://llvm.org/svn/llvm-project/clang-tools-extra/tags/RELEASE_700/final",
     "compiler_repo": "https://llvm.org/svn/llvm-project/compiler-rt/tags/RELEASE_700/final",
-    "libcxx_repo": "https://llvm.org/svn/llvm-project/libcxx/trunk",
+    "libcxx_repo": "https://llvm.org/svn/llvm-project/libcxx/tags/RELEASE_700/final",
     "python_path": "c:/mozilla-build/python/python.exe",
     "cc": "cl.exe",
     "cxx": "cl.exe",
     "patches": [
     ]
 }
--- a/build/build-clang/clang-tidy-win64.json
+++ b/build/build-clang/clang-tidy-win64.json
@@ -4,16 +4,16 @@
     "build_libcxx": false,
     "build_type": "Release",
     "assertions": false,
     "build_clang_tidy": true,
     "llvm_repo": "https://llvm.org/svn/llvm-project/llvm/tags/RELEASE_700/final",
     "clang_repo": "https://llvm.org/svn/llvm-project/cfe/tags/RELEASE_700/final",
     "extra_repo": "https://llvm.org/svn/llvm-project/clang-tools-extra/tags/RELEASE_700/final",
     "compiler_repo": "https://llvm.org/svn/llvm-project/compiler-rt/tags/RELEASE_700/final",
-    "libcxx_repo": "https://llvm.org/svn/llvm-project/libcxx/trunk",
+    "libcxx_repo": "https://llvm.org/svn/llvm-project/libcxx/tags/RELEASE_700/final",
     "python_path": "c:/mozilla-build/python/python.exe",
     "cc": "cl.exe",
     "cxx": "cl.exe",
     "ml": "ml64.exe",
     "patches": [
     ]
 }
--- a/build/clang-plugin/ScopeChecker.cpp
+++ b/build/clang-plugin/ScopeChecker.cpp
@@ -6,17 +6,16 @@
 #include "CustomMatchers.h"
 
 void ScopeChecker::registerMatchers(MatchFinder *AstMatcher) {
   AstMatcher->addMatcher(varDecl().bind("node"), this);
   AstMatcher->addMatcher(cxxNewExpr().bind("node"), this);
   AstMatcher->addMatcher(materializeTemporaryExpr().bind("node"), this);
   AstMatcher->addMatcher(
       callExpr(callee(functionDecl(heapAllocator()))).bind("node"), this);
-  AstMatcher->addMatcher(parmVarDecl().bind("parm_vardecl"), this);
 }
 
 // These enum variants determine whether an allocation has occured in the code.
 enum AllocationVariety {
   AV_None,
   AV_Global,
   AV_Automatic,
   AV_Temporary,
@@ -32,17 +31,17 @@ AutomaticTemporaryMap AutomaticTemporari
 
 void ScopeChecker::check(const MatchFinder::MatchResult &Result) {
   // There are a variety of different reasons why something could be allocated
   AllocationVariety Variety = AV_None;
   SourceLocation Loc;
   QualType T;
 
   if (const ParmVarDecl *D =
-          Result.Nodes.getNodeAs<ParmVarDecl>("parm_vardecl")) {
+          Result.Nodes.getNodeAs<ParmVarDecl>("node")) {
     if (D->hasUnparsedDefaultArg() || D->hasUninstantiatedDefaultArg()) {
       return;
     }
     if (const Expr *Default = D->getDefaultArg()) {
       if (const MaterializeTemporaryExpr *E =
               dyn_cast<MaterializeTemporaryExpr>(Default)) {
         // We have just found a ParmVarDecl which has, as its default argument,
         // a MaterializeTemporaryExpr. We mark that MaterializeTemporaryExpr as
--- a/build/gen_test_packages_manifest.py
+++ b/build/gen_test_packages_manifest.py
@@ -16,27 +16,29 @@ ALL_HARNESSES = [
     'cppunittest',
     'jittest',
     'mozbase',
     'web-platform',
     'talos',
     'raptor',
     'awsy',
     'gtest',
+    'updater-dep'
 ]
 
 PACKAGE_SPECIFIED_HARNESSES = [
     'cppunittest',
     'mochitest',
     'reftest',
     'xpcshell',
     'web-platform',
     'talos',
     'raptor',
     'awsy',
+    'updater-dep',
 ]
 
 # These packages are not present for every build configuration.
 OPTIONAL_PACKAGES = [
     'gtest',
 ]
 
 
--- a/devtools/client/aboutdebugging-new/aboutdebugging.js
+++ b/devtools/client/aboutdebugging-new/aboutdebugging.js
@@ -21,45 +21,55 @@ const { configureStore } = require("./sr
 const {
   setDebugTargetCollapsibilities,
 } = require("./src/modules/debug-target-collapsibilities");
 const {
   addNetworkLocationsObserver,
   getNetworkLocations,
   removeNetworkLocationsObserver,
 } = require("./src/modules/network-locations");
+const {
+  addUSBRuntimesObserver,
+  disableUSBRuntimes,
+  enableUSBRuntimes,
+  getUSBRuntimes,
+  removeUSBRuntimesObserver,
+} = require("./src/modules/usb-runtimes");
 
 const App = createFactory(require("./src/components/App"));
 
 const { PAGES, RUNTIMES } = require("./src/constants");
 
 const AboutDebugging = {
   async init() {
     if (!Services.prefs.getBoolPref("devtools.enabled", true)) {
       // If DevTools are disabled, navigate to about:devtools.
       window.location = "about:devtools?reason=AboutDebugging";
       return;
     }
 
     this.onNetworkLocationsUpdated = this.onNetworkLocationsUpdated.bind(this);
+    this.onUSBRuntimesUpdated = this.onUSBRuntimesUpdated.bind(this);
 
     this.store = configureStore();
     this.actions = bindActionCreators(actions, this.store.dispatch);
 
     const messageContexts = await this.createMessageContexts();
 
     render(
       Provider({ store: this.store }, App({ messageContexts })),
       this.mount
     );
 
     this.actions.selectPage(PAGES.THIS_FIREFOX, RUNTIMES.THIS_FIREFOX);
     this.actions.updateNetworkLocations(getNetworkLocations());
 
     addNetworkLocationsObserver(this.onNetworkLocationsUpdated);
+    addUSBRuntimesObserver(this.onUSBRuntimesUpdated);
+    await enableUSBRuntimes();
   },
 
   async createMessageContexts() {
     // XXX Until the strings for the updated about:debugging stabilize, we
     // locate them outside the regular directory for locale resources so that
     // they don't get picked up by localization tools.
     if (!L10nRegistry.sources.has("aboutdebugging")) {
       const temporarySource = new FileSource(
@@ -81,27 +91,33 @@ const AboutDebugging = {
 
     return contexts;
   },
 
   onNetworkLocationsUpdated() {
     this.actions.updateNetworkLocations(getNetworkLocations());
   },
 
+  onUSBRuntimesUpdated() {
+    this.actions.updateUSBRuntimes(getUSBRuntimes());
+  },
+
   async destroy() {
     const state = this.store.getState();
 
     L10nRegistry.removeSource("aboutdebugging");
 
     const currentRuntimeId = state.runtimes.selectedRuntimeId;
     if (currentRuntimeId) {
       await this.actions.unwatchRuntime(currentRuntimeId);
     }
 
     removeNetworkLocationsObserver(this.onNetworkLocationsUpdated);
+    removeUSBRuntimesObserver(this.onUSBRuntimesUpdated);
+    disableUSBRuntimes();
     setDebugTargetCollapsibilities(state.ui.debugTargetCollapsibilities);
     unmountComponentAtNode(this.mount);
   },
 
   get mount() {
     return document.getElementById("mount");
   },
 };
--- a/devtools/client/aboutdebugging-new/src/actions/debug-targets.js
+++ b/devtools/client/aboutdebugging-new/src/actions/debug-targets.js
@@ -8,22 +8,22 @@ const { AddonManager } = require("resour
 const { gDevToolsBrowser } = require("devtools/client/framework/devtools-browser");
 
 const {
   debugLocalAddon,
   debugRemoteAddon,
   getAddonForm,
   openTemporaryExtension,
   uninstallAddon,
-} = require("devtools/client/aboutdebugging-new/src/modules/extensions-helper");
+} = require("../modules/extensions-helper");
 
 const {
   getCurrentClient,
   getCurrentRuntime
-} = require("devtools/client/aboutdebugging-new/src/modules/runtimes-state-helper");
+} = require("../modules/runtimes-state-helper");
 
 const {
   DEBUG_TARGETS,
   REQUEST_EXTENSIONS_FAILURE,
   REQUEST_EXTENSIONS_START,
   REQUEST_EXTENSIONS_SUCCESS,
   REQUEST_TABS_FAILURE,
   REQUEST_TABS_START,
--- a/devtools/client/aboutdebugging-new/src/actions/runtimes.js
+++ b/devtools/client/aboutdebugging-new/src/actions/runtimes.js
@@ -6,29 +6,30 @@
 
 const { DebuggerClient } = require("devtools/shared/client/debugger-client");
 const { DebuggerServer } = require("devtools/server/main");
 
 const Actions = require("./index");
 
 const {
   findRuntimeById,
-} = require("devtools/client/aboutdebugging-new/src/modules/runtimes-state-helper");
+} = require("../modules/runtimes-state-helper");
 
 const {
   CONNECT_RUNTIME_FAILURE,
   CONNECT_RUNTIME_START,
   CONNECT_RUNTIME_SUCCESS,
   DISCONNECT_RUNTIME_FAILURE,
   DISCONNECT_RUNTIME_START,
   DISCONNECT_RUNTIME_SUCCESS,
   RUNTIMES,
   UNWATCH_RUNTIME_FAILURE,
   UNWATCH_RUNTIME_START,
   UNWATCH_RUNTIME_SUCCESS,
+  USB_RUNTIMES_UPDATED,
   WATCH_RUNTIME_FAILURE,
   WATCH_RUNTIME_START,
   WATCH_RUNTIME_SUCCESS,
 } = require("../constants");
 
 async function createLocalClient() {
   DebuggerServer.init();
   DebuggerServer.registerAllActors();
@@ -136,14 +137,19 @@ function unwatchRuntime(id) {
 
       dispatch({ type: UNWATCH_RUNTIME_SUCCESS });
     } catch (e) {
       dispatch({ type: UNWATCH_RUNTIME_FAILURE, error: e.message });
     }
   };
 }
 
+function updateUSBRuntimes(runtimes) {
+  return { type: USB_RUNTIMES_UPDATED, runtimes };
+}
+
 module.exports = {
   connectRuntime,
   disconnectRuntime,
   unwatchRuntime,
+  updateUSBRuntimes,
   watchRuntime,
 };
--- a/devtools/client/aboutdebugging-new/src/components/sidebar/Sidebar.js
+++ b/devtools/client/aboutdebugging-new/src/components/sidebar/Sidebar.js
@@ -13,62 +13,74 @@ const Localized = createFactory(FluentRe
 
 const { PAGES, RUNTIMES } = require("../../constants");
 
 const DeviceSidebarItemAction = createFactory(require("./DeviceSidebarItemAction"));
 const SidebarItem = createFactory(require("./SidebarItem"));
 const FIREFOX_ICON = "chrome://devtools/skin/images/aboutdebugging-firefox-logo.svg";
 const CONNECT_ICON = "chrome://devtools/skin/images/aboutdebugging-connect-icon.svg";
 const GLOBE_ICON = "chrome://devtools/skin/images/aboutdebugging-globe-icon.svg";
+const USB_ICON = "chrome://devtools/skin/images/aboutdebugging-connect-icon.svg";
 
 class Sidebar extends PureComponent {
   static get propTypes() {
     return {
       dispatch: PropTypes.func.isRequired,
       runtimes: PropTypes.array.isRequired,
       selectedPage: PropTypes.string.isRequired,
     };
   }
 
   renderDevices() {
     const { dispatch, runtimes, selectedPage } = this.props;
-    if (!runtimes.networkRuntimes.length) {
+    if (!runtimes.networkRuntimes.length && !runtimes.usbRuntimes.length) {
       return Localized(
         {
           id: "about-debugging-sidebar-no-devices"
         }, dom.span(
           {
-            className: "sidebar__devices__no-devices-message"
+            className: "sidebar__devices__no-devices-message js-sidebar-no-devices"
           },
           "No devices discovered"
         )
       );
     }
 
-    return runtimes.networkRuntimes.map(runtime => {
-      const pageId = "networklocation-" + runtime.id;
-      const runtimeHasClient = !!runtime.client;
+    return [
+      ...runtimes.networkRuntimes.map(runtime => {
+        const pageId = "networklocation-" + runtime.id;
+        const runtimeHasClient = !!runtime.client;
 
-      const connectComponent = DeviceSidebarItemAction({
-        connected: runtimeHasClient,
-        dispatch,
-        runtimeId: runtime.id,
-      });
+        const connectComponent = DeviceSidebarItemAction({
+          connected: runtimeHasClient,
+          dispatch,
+          runtimeId: runtime.id,
+        });
 
-      return SidebarItem({
-        connectComponent,
-        id: pageId,
-        dispatch,
-        icon: GLOBE_ICON,
-        isSelected: selectedPage === pageId,
-        name: runtime.id,
-        runtimeId: runtime.id,
-        selectable: runtimeHasClient,
-      });
-    });
+        return SidebarItem({
+          connectComponent,
+          id: pageId,
+          dispatch,
+          icon: GLOBE_ICON,
+          isSelected: selectedPage === pageId,
+          name: runtime.id,
+          runtimeId: runtime.id,
+          selectable: runtimeHasClient,
+        });
+      }),
+      ...runtimes.usbRuntimes.map(runtime =>
+        SidebarItem({
+          id: `usb-${ runtime.id }`,
+          dispatch,
+          icon: USB_ICON,
+          isSelected: false,
+          name: runtime.name,
+          selectable: false,
+        })),
+    ];
   }
 
   render() {
     const { dispatch, selectedPage } = this.props;
 
     return dom.aside(
       {
         className: "sidebar",
--- a/devtools/client/aboutdebugging-new/src/constants.js
+++ b/devtools/client/aboutdebugging-new/src/constants.js
@@ -21,16 +21,17 @@ const actionTypes = {
   REQUEST_TABS_START: "REQUEST_TABS_START",
   REQUEST_TABS_SUCCESS: "REQUEST_TABS_SUCCESS",
   REQUEST_WORKERS_FAILURE: "REQUEST_WORKERS_FAILURE",
   REQUEST_WORKERS_START: "REQUEST_WORKERS_START",
   REQUEST_WORKERS_SUCCESS: "REQUEST_WORKERS_SUCCESS",
   UNWATCH_RUNTIME_FAILURE: "UNWATCH_RUNTIME_FAILURE",
   UNWATCH_RUNTIME_START: "UNWATCH_RUNTIME_START",
   UNWATCH_RUNTIME_SUCCESS: "UNWATCH_RUNTIME_SUCCESS",
+  USB_RUNTIMES_UPDATED: "USB_RUNTIMES_UPDATED",
   WATCH_RUNTIME_FAILURE: "WATCH_RUNTIME_FAILURE",
   WATCH_RUNTIME_START: "WATCH_RUNTIME_START",
   WATCH_RUNTIME_SUCCESS: "WATCH_RUNTIME_SUCCESS",
 };
 
 const DEBUG_TARGETS = {
   EXTENSION: "EXTENSION",
   TAB: "TAB",
--- a/devtools/client/aboutdebugging-new/src/middleware/extension-component-data.js
+++ b/devtools/client/aboutdebugging-new/src/middleware/extension-component-data.js
@@ -7,17 +7,17 @@
 const {
   DEBUG_TARGETS,
   REQUEST_EXTENSIONS_SUCCESS,
 } = require("../constants");
 
 const {
   getExtensionUuid,
   parseFileUri
-} = require("devtools/client/aboutdebugging-new/src/modules/extensions-helper");
+} = require("../modules/extensions-helper");
 
 /**
  * This middleware converts extensions object that get from DebuggerClient.listAddons()
  * to data which is used in DebugTargetItem.
  */
 const extensionComponentDataMiddleware = store => next => action => {
   switch (action.type) {
     case REQUEST_EXTENSIONS_SUCCESS: {
--- a/devtools/client/aboutdebugging-new/src/modules/moz.build
+++ b/devtools/client/aboutdebugging-new/src/modules/moz.build
@@ -2,9 +2,10 @@
 # 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/.
 
 DevToolsModules(
     'debug-target-collapsibilities.js',
     'extensions-helper.js',
     'network-locations.js',
     'runtimes-state-helper.js',
+    'usb-runtimes.js',
 )
new file mode 100644
--- /dev/null
+++ b/devtools/client/aboutdebugging-new/src/modules/usb-runtimes.js
@@ -0,0 +1,44 @@
+/* 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 { check } = require("devtools/shared/adb/adb-running-checker");
+const { ADBScanner } = require("devtools/shared/adb/adb-scanner");
+const { GetAvailableAddons } = require("devtools/client/webide/modules/addons");
+
+/**
+ * This module provides a collection of helper methods to detect USB runtimes whom Firefox
+ * is running on.
+ */
+function addUSBRuntimesObserver(listener) {
+  ADBScanner.on("runtime-list-updated", listener);
+}
+exports.addUSBRuntimesObserver = addUSBRuntimesObserver;
+
+function disableUSBRuntimes() {
+  ADBScanner.disable();
+}
+exports.disableUSBRuntimes = disableUSBRuntimes;
+
+async function enableUSBRuntimes() {
+  const { adb } = GetAvailableAddons();
+  if (adb.status === "uninstalled" || !(await check())) {
+    console.error("ADB extension is not installed");
+    return;
+  }
+
+  ADBScanner.enable();
+}
+exports.enableUSBRuntimes = enableUSBRuntimes;
+
+function getUSBRuntimes() {
+  return ADBScanner.listRuntimes();
+}
+exports.getUSBRuntimes = getUSBRuntimes;
+
+function removeUSBRuntimesObserver(listener) {
+  ADBScanner.off("runtime-list-updated", listener);
+}
+exports.removeUSBRuntimesObserver = removeUSBRuntimesObserver;
--- a/devtools/client/aboutdebugging-new/src/reducers/runtimes-state.js
+++ b/devtools/client/aboutdebugging-new/src/reducers/runtimes-state.js
@@ -5,37 +5,39 @@
 "use strict";
 
 const {
   CONNECT_RUNTIME_SUCCESS,
   DISCONNECT_RUNTIME_SUCCESS,
   NETWORK_LOCATIONS_UPDATED,
   RUNTIMES,
   UNWATCH_RUNTIME_SUCCESS,
+  USB_RUNTIMES_UPDATED,
   WATCH_RUNTIME_SUCCESS,
 } = require("../constants");
 
 const {
   findRuntimeById,
-} = require("devtools/client/aboutdebugging-new/src/modules/runtimes-state-helper");
+} = require("../modules/runtimes-state-helper");
 
 // Map between known runtime types and nodes in the runtimes state.
 const TYPE_TO_RUNTIMES_KEY = {
   [RUNTIMES.THIS_FIREFOX]: "thisFirefoxRuntimes",
   [RUNTIMES.NETWORK]: "networkRuntimes",
 };
 
 function RuntimesState(networkRuntimes = []) {
   return {
     networkRuntimes,
     selectedRuntimeId: null,
     thisFirefoxRuntimes: [{
       id: RUNTIMES.THIS_FIREFOX,
       type: RUNTIMES.THIS_FIREFOX,
-    }]
+    }],
+    usbRuntimes: [],
   };
 }
 
 function runtimesReducer(state = RuntimesState(), action) {
   switch (action.type) {
     case CONNECT_RUNTIME_SUCCESS: {
       const { id, client } = action.runtime;
 
@@ -82,16 +84,21 @@ function runtimesReducer(state = Runtime
       });
       return Object.assign({}, state, { networkRuntimes });
     }
 
     case UNWATCH_RUNTIME_SUCCESS: {
       return Object.assign({}, state, { selectedRuntimeId: null });
     }
 
+    case USB_RUNTIMES_UPDATED: {
+      const { runtimes } = action;
+      return Object.assign({}, state, { usbRuntimes: runtimes });
+    }
+
     case WATCH_RUNTIME_SUCCESS: {
       const { id } = action.runtime;
       return Object.assign({}, state, { selectedRuntimeId: id });
     }
 
     default:
       return state;
   }
--- a/devtools/client/aboutdebugging-new/test/browser/browser.ini
+++ b/devtools/client/aboutdebugging-new/test/browser/browser.ini
@@ -2,12 +2,13 @@
 tags = devtools
 subsuite = devtools
 support-files =
   debug-target-pane_collapsibilities_head.js
   head.js
   !/devtools/client/shared/test/shared-head.js
   !/devtools/client/shared/test/telemetry-test-helpers.js
 
+[browser_aboutdebugging_connect_networklocations.js]
 [browser_aboutdebugging_debug-target-pane_collapsibilities_interaction.js]
 [browser_aboutdebugging_debug-target-pane_collapsibilities_preference.js]
+[browser_aboutdebugging_sidebar_network_runtimes.js]
 [browser_aboutdebugging_thisfirefox.js]
-[browser_aboutdebugging_connect_networklocations.js]
new file mode 100644
--- /dev/null
+++ b/devtools/client/aboutdebugging-new/test/browser/browser_aboutdebugging_sidebar_network_runtimes.js
@@ -0,0 +1,47 @@
+/* Any copyright is dedicated to the Public Domain.
+   http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+const networkLocationsModule =
+  require("devtools/client/aboutdebugging-new/src/modules/network-locations.js");
+
+/**
+ * Test the sidebar is updated correctly when network runtimes are added/removed.
+ */
+
+add_task(async function() {
+  registerCleanupFunction(() => {
+    Services.prefs.clearUserPref("devtools.aboutdebugging.network-locations");
+  });
+
+  const { document, tab } = await openAboutDebugging();
+
+  const noDevicesElement = document.querySelector(".js-sidebar-no-devices");
+  ok(noDevicesElement, "Sidebar shows the 'no devices' element");
+
+  info("Add a network location");
+  networkLocationsModule.addNetworkLocation("localhost:6080");
+
+  info("Wait for 'no devices' element to disappear");
+  waitUntil(() => !document.querySelector(".js-sidebar-no-devices"));
+  ok(findSidebarItemByText("localhost:6080", document),
+    "Found a sidebar item for localhost:6080");
+
+  info("Remove the network location");
+  networkLocationsModule.removeNetworkLocation("localhost:6080");
+
+  info("Wait for 'no devices' element to reappear");
+  waitUntil(() => document.querySelector(".js-sidebar-no-devices"));
+  ok(!findSidebarItemByText("localhost:6080", document),
+    "Sidebar item for localhost:6080 removed");
+
+  await removeTab(tab);
+});
+
+function findSidebarItemByText(text, document) {
+  const sidebarItems = document.querySelectorAll(".js-sidebar-item");
+  return [...sidebarItems].find(element => {
+    return element.textContent.includes(text);
+  });
+}
--- a/devtools/client/aboutdebugging-new/test/browser/debug-target-pane_collapsibilities_head.js
+++ b/devtools/client/aboutdebugging-new/test/browser/debug-target-pane_collapsibilities_head.js
@@ -41,27 +41,27 @@ function getDebugTargetPane(title, docum
     return titleEl.closest(".js-debug-target-pane");
   }
 
   throw new Error(`DebugTargetPane for [${ title }] was not found`);
 }
 
 // eslint-disable-next-line no-unused-vars
 function prepareCollapsibilitiesTest() {
-  registerCleanupFunction(() => {
-    for (const { pref } of TARGET_PANES) {
-      Services.prefs.clearUserPref(pref);
-    }
-  });
-
   // Make all collapsibilities to be expanded.
   for (const { pref } of TARGET_PANES) {
     Services.prefs.setBoolPref(pref, false);
   }
 }
 
 // eslint-disable-next-line no-unused-vars
 async function toggleCollapsibility(debugTargetPane) {
   debugTargetPane.querySelector(".js-debug-target-pane-title").click();
   // Wait for animation of collapse/expand.
   const animations = debugTargetPane.ownerDocument.getAnimations();
   await Promise.all(animations.map(animation => animation.finished));
 }
+
+registerCleanupFunction(() => {
+  for (const { pref } of TARGET_PANES) {
+    Services.prefs.clearUserPref(pref);
+  }
+});
--- a/devtools/client/themes/tooltips.css
+++ b/devtools/client/themes/tooltips.css
@@ -395,17 +395,17 @@
   background-color: var(--theme-arrowpanel-dimmed-further);
   box-shadow: 0 1px 0 hsla(210,4%,10%,.03) inset;
 }
 
 .tooltip-container[type="doorhanger"] .menuitem > .command[aria-checked="true"] {
   list-style-image: none;
   -moz-context-properties: fill;
   fill: currentColor;
-  background: url(chrome://browser/skin/check.svg) no-repeat transparent;
+  background: url(chrome://global/skin/icons/check.svg) no-repeat transparent;
   background-size: 11px 11px;
   background-position: center left 7px;
 }
 
 .tooltip-container[type="doorhanger"] .menuitem > .command[aria-checked="true"]:-moz-locale-dir(rtl) {
   background-position: center right 7px;
 }
 
--- a/devtools/client/webide/content/addons.js
+++ b/devtools/client/webide/content/addons.js
@@ -2,16 +2,18 @@
  * 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/. */
 
 const {require} = ChromeUtils.import("resource://devtools/shared/Loader.jsm", {});
 const Services = require("Services");
 const {gDevTools} = require("devtools/client/framework/devtools");
 const {GetAvailableAddons, ForgetAddonsList} = require("devtools/client/webide/modules/addons");
 const Strings = Services.strings.createBundle("chrome://devtools/locale/webide.properties");
+const {ADBScanner} = require("devtools/shared/adb/adb-scanner");
+const {RuntimeScanners} = require("devtools/client/webide/modules/runtimes");
 
 window.addEventListener("load", function() {
   document.querySelector("#aboutaddons").onclick = function() {
     const browserWin = Services.wm.getMostRecentWindow(gDevTools.chromeWindowType);
     if (browserWin && browserWin.BrowserOpenAddonsMgr) {
       browserWin.BrowserOpenAddonsMgr("addons://list/extension");
     }
   };
@@ -31,16 +33,21 @@ function BuildUI(addons) {
   BuildItem(addons.adb, "adb");
 }
 
 function BuildItem(addon, type) {
   function onAddonUpdate(arg) {
     progress.removeAttribute("value");
     li.setAttribute("status", addon.status);
     status.textContent = Strings.GetStringFromName("addons_status_" + addon.status);
+    if (addon.status == "installed") {
+      RuntimeScanners.add(ADBScanner);
+    } else if (addon.status == "uninstalled") {
+      RuntimeScanners.remove(ADBScanner);
+    }
   }
 
   function onAddonFailure(arg) {
     window.parent.UI.reportError("error_operationFail", arg);
   }
 
   function onAddonProgress(arg) {
     if (arg == -1) {
--- a/devtools/client/webide/modules/runtimes.js
+++ b/devtools/client/webide/modules/runtimes.js
@@ -3,17 +3,16 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 "use strict";
 
 const Services = require("Services");
 const {DebuggerServer} = require("devtools/server/main");
 const discovery = require("devtools/shared/discovery/discovery");
 const EventEmitter = require("devtools/shared/event-emitter");
-const {ADBScanner} = require("devtools/shared/adb/adb-scanner");
 const {RuntimeTypes} = require("devtools/client/webide/modules/runtime-types");
 const promise = require("promise");
 loader.lazyRequireGetter(this, "AuthenticationResult",
   "devtools/shared/security/auth", true);
 loader.lazyRequireGetter(this, "DevToolsUtils",
   "devtools/shared/DevToolsUtils");
 
 const Strings = Services.strings.createBundle("chrome://devtools/locale/webide.properties");
@@ -188,18 +187,16 @@ var RuntimeScanners = {
 };
 
 EventEmitter.decorate(RuntimeScanners);
 
 exports.RuntimeScanners = RuntimeScanners;
 
 /* SCANNERS */
 
-RuntimeScanners.add(ADBScanner);
-
 var WiFiScanner = {
 
   _runtimes: [],
 
   init() {
     this.updateRegistration();
     Services.prefs.addObserver(this.ALLOWED_PREF, this);
   },
--- a/python/mozbuild/mozbuild/action/test_archive.py
+++ b/python/mozbuild/mozbuild/action/test_archive.py
@@ -105,16 +105,17 @@ ARCHIVE_FILES = {
                 'gtest/**',
                 'mochitest/**',
                 'reftest/**',
                 'talos/**',
                 'raptor/**',
                 'awsy/**',
                 'web-platform/**',
                 'xpcshell/**',
+                'updater-dep/**',
             ],
         },
         {
             'source': buildconfig.topobjdir,
             'base': '_tests',
             'pattern': 'modules/**',
         },
         {
@@ -514,16 +515,31 @@ ARCHIVE_FILES = {
         },
         {
             'source': buildconfig.topobjdir,
             'base': 'build',
             'pattern': 'automation.py',
             'dest': 'xpcshell',
         },
     ],
+    'updater-dep': [
+        {
+            'source': buildconfig.topobjdir,
+            'base': '_tests/updater-dep',
+            'pattern': '**',
+            'dest': 'updater-dep',
+        },
+        # Required by the updater on Linux
+        {
+            'source': buildconfig.topobjdir,
+            'base': 'config/external/sqlite',
+            'pattern': 'libmozsqlite3.so',
+            'dest': 'updater-dep',
+        },
+    ],
 }
 
 if buildconfig.substs.get('MOZ_CODE_COVERAGE'):
     ARCHIVE_FILES['common'].append({
         'source': buildconfig.topsrcdir,
         'base': 'python/mozbuild/',
         'patterns': [
             'mozpack/**',
@@ -621,17 +637,17 @@ def find_files(archive):
 
         ignore = list(entry.get('ignore', []))
         ignore.extend([
             '**/.flake8',
             '**/.mkdir.done',
             '**/*.pyc',
         ])
 
-        if archive != 'common' and base.startswith('_tests'):
+        if archive not in ('common', 'updater-dep') and base.startswith('_tests'):
             # We may have generated_harness_files to exclude from this entry.
             for path in generated_harness_files:
                 if path.startswith(base):
                     ignore.append(path[len(base) + 1:])
 
         common_kwargs = {
             'find_dotfiles': True,
             'ignore': ignore,
--- a/python/mozlint/test/conftest.py
+++ b/python/mozlint/test/conftest.py
@@ -49,12 +49,16 @@ def files(filedir, request):
 @pytest.fixture(scope='session')
 def lintdir():
     lintdir = os.path.join(here, 'linters')
     sys.path.insert(0, lintdir)
     return lintdir
 
 
 @pytest.fixture(scope='module')
-def linters(lintdir, request):
-    suffix_filter = getattr(request.module, 'linters', ['.yml'])
-    return [os.path.join(lintdir, p) for p in os.listdir(lintdir)
-            if any(p.endswith(suffix) for suffix in suffix_filter)]
+def linters(lintdir):
+
+    def inner(*names):
+        return [os.path.join(lintdir, p) for p in os.listdir(lintdir)
+                if any(os.path.splitext(p)[0] == name for name in names)
+                if os.path.splitext(p)[1] == '.yml']
+
+    return inner
--- a/python/mozlint/test/python.ini
+++ b/python/mozlint/test/python.ini
@@ -1,10 +1,10 @@
 [DEFAULT]
 subsuite = mozlint, os == "linux"
 skip-if = python == 3
 
 [test_cli.py]
-[test_filterpaths.py]
 [test_formatters.py]
 [test_parser.py]
+[test_pathutils.py]
 [test_roller.py]
 [test_types.py]
rename from python/mozlint/test/test_filterpaths.py
rename to python/mozlint/test/test_pathutils.py
--- a/python/mozlint/test/test_filterpaths.py
+++ b/python/mozlint/test/test_pathutils.py
@@ -93,17 +93,17 @@ TEST_CASES = (
         'include': ['**/*.py'],
         'exclude': ['**/c.py', 'subdir1/subdir3'],
         'expected': ['a.py', 'subdir1/b.py'],
     },
 )
 
 
 @pytest.mark.parametrize('test', TEST_CASES)
-def test_include_exclude(filterpaths, test):
+def test_filterpaths(filterpaths, test):
     expected = test.pop('expected')
 
     paths = filterpaths(**test)
     assert_paths(paths, expected)
 
 
 if __name__ == '__main__':
     mozunit.main()
--- a/python/mozlint/test/test_roller.py
+++ b/python/mozlint/test/test_roller.py
@@ -16,26 +16,23 @@ import pytest
 
 from mozlint.errors import LintersNotConfigured
 from mozlint.result import Issue, ResultSummary
 
 
 here = os.path.abspath(os.path.dirname(__file__))
 
 
-linters = ('string.yml', 'regex.yml', 'external.yml')
-
-
 def test_roll_no_linters_configured(lint, files):
     with pytest.raises(LintersNotConfigured):
         lint.roll(files)
 
 
 def test_roll_successful(lint, linters, files):
-    lint.read(linters)
+    lint.read(linters('string', 'regex', 'external'))
 
     result = lint.roll(files)
     assert len(result.issues) == 1
     assert result.failed == set([])
 
     path = result.issues.keys()[0]
     assert os.path.basename(path) == 'foobar.js'
 
@@ -44,32 +41,35 @@ def test_roll_successful(lint, linters, 
     assert len(errors) == 6
 
     container = errors[0]
     assert isinstance(container, Issue)
     assert container.rule == 'no-foobar'
 
 
 def test_roll_from_subdir(lint, linters):
-    lint.read(linters)
+    lint.read(linters('string', 'regex', 'external'))
 
     oldcwd = os.getcwd()
     try:
         os.chdir(os.path.join(lint.root, 'files'))
 
         # Path relative to cwd works
         result = lint.roll('no_foobar.js')
         assert len(result.issues) == 0
         assert len(result.failed) == 0
         assert result.returncode == 0
 
         # Path relative to root doesn't work
         result = lint.roll(os.path.join('files', 'no_foobar.js'))
         assert len(result.issues) == 0
-        assert len(result.failed) == 3
+        # TODO Only the external linter is failing, the other two
+        # should be failing as well. Not using xfail so we don't
+        # lose coverage from the rest of the test.
+        assert len(result.failed) == 1
         assert result.returncode == 1
 
         # Paths from vcs are always joined to root instead of cwd
         lint.mock_vcs([os.path.join('files', 'no_foobar.js')])
         result = lint.roll(outgoing=True)
         assert len(result.issues) == 0
         assert len(result.failed) == 0
         assert result.returncode == 0
@@ -77,63 +77,63 @@ def test_roll_from_subdir(lint, linters)
         result = lint.roll(workdir=True)
         assert len(result.issues) == 0
         assert len(result.failed) == 0
         assert result.returncode == 0
     finally:
         os.chdir(oldcwd)
 
 
-def test_roll_catch_exception(lint, lintdir, files, capfd):
-    lint.read(os.path.join(lintdir, 'raises.yml'))
+def test_roll_catch_exception(lint, linters, files, capfd):
+    lint.read(linters('raises'))
 
     lint.roll(files)  # assert not raises
     out, err = capfd.readouterr()
     assert 'LintException' in err
 
 
 def test_roll_with_excluded_path(lint, linters, files):
     lint.lintargs.update({'exclude': ['**/foobar.js']})
 
-    lint.read(linters)
+    lint.read(linters('string', 'regex', 'external'))
     result = lint.roll(files)
 
     assert len(result.issues) == 0
     assert result.failed == set([])
 
 
 def test_roll_with_no_files_to_lint(lint, linters, capfd):
-    lint.read(linters)
+    lint.read(linters('string', 'regex', 'external'))
     lint.mock_vcs([])
     result = lint.roll([], workdir=True)
     assert isinstance(result, ResultSummary)
     assert len(result.issues) == 0
     assert len(result.failed) == 0
 
     out, err = capfd.readouterr()
     assert 'warning: no files linted' in out
 
 
-def test_roll_with_invalid_extension(lint, lintdir, filedir):
-    lint.read(os.path.join(lintdir, 'external.yml'))
+def test_roll_with_invalid_extension(lint, linters, filedir):
+    lint.read(linters('external'))
     result = lint.roll(os.path.join(filedir, 'foobar.py'))
     assert len(result.issues) == 0
     assert result.failed == set([])
 
 
-def test_roll_with_failure_code(lint, lintdir, files):
-    lint.read(os.path.join(lintdir, 'badreturncode.yml'))
+def test_roll_with_failure_code(lint, linters, files):
+    lint.read(linters('badreturncode'))
 
     result = lint.roll(files, num_procs=1)
     assert len(result.issues) == 0
     assert result.failed == set(['BadReturnCodeLinter'])
 
 
-def test_roll_warnings(lint, lintdir, files):
-    lint.read(os.path.join(lintdir, 'warning.yml'))
+def test_roll_warnings(lint, linters, files):
+    lint.read(linters('warning'))
     result = lint.roll(files)
     assert len(result.issues) == 0
     assert result.total_issues == 0
     assert len(result.suppressed_warnings) == 1
     assert result.total_suppressed_warnings == 2
 
     lint.lintargs['show_warnings'] = True
     result = lint.roll(files)
@@ -150,16 +150,17 @@ def fake_run_worker(config, paths, **lin
 
 
 @pytest.mark.skipif(platform.system() == 'Windows',
                     reason="monkeypatch issues with multiprocessing on Windows")
 @pytest.mark.parametrize('num_procs', [1, 4, 8, 16])
 def test_number_of_jobs(monkeypatch, lint, linters, files, num_procs):
     monkeypatch.setattr(sys.modules[lint.__module__], '_run_worker', fake_run_worker)
 
+    linters = linters('string', 'regex', 'external')
     lint.read(linters)
     num_jobs = len(lint.roll(files, num_procs=num_procs).issues['count'])
 
     if len(files) >= num_procs:
         assert num_jobs == num_procs * len(linters)
     else:
         assert num_jobs == len(files) * len(linters)
 
@@ -168,17 +169,17 @@ def test_number_of_jobs(monkeypatch, lin
                     reason="monkeypatch issues with multiprocessing on Windows")
 @pytest.mark.parametrize('max_paths,expected_jobs', [(1, 12), (4, 6), (16, 6)])
 def test_max_paths_per_job(monkeypatch, lint, linters, files, max_paths, expected_jobs):
     monkeypatch.setattr(sys.modules[lint.__module__], '_run_worker', fake_run_worker)
 
     files = files[:4]
     assert len(files) == 4
 
-    linters = linters[:3]
+    linters = linters('string', 'regex', 'external')[:3]
     assert len(linters) == 3
 
     lint.MAX_PATHS_PER_JOB = max_paths
     lint.read(linters)
     num_jobs = len(lint.roll(files, num_procs=2).issues['count'])
     assert num_jobs == expected_jobs
 
 
@@ -194,30 +195,30 @@ def test_keyboard_interrupt():
     time.sleep(1)
     proc.send_signal(signal.SIGINT)
 
     out = proc.communicate()[0]
     assert 'warning: not all files were linted' in out
     assert 'Traceback' not in out
 
 
-def test_support_files(lint, lintdir, filedir, monkeypatch):
+def test_support_files(lint, linters, filedir, monkeypatch):
     jobs = []
 
     # Replace the original _generate_jobs with a new one that simply
     # adds jobs to a list (and then doesn't return anything).
     orig_generate_jobs = lint._generate_jobs
 
     def fake_generate_jobs(*args, **kwargs):
         jobs.extend([job[1] for job in orig_generate_jobs(*args, **kwargs)])
         return []
 
     monkeypatch.setattr(lint, '_generate_jobs', fake_generate_jobs)
 
-    linter_path = os.path.join(lintdir, 'support_files.yml')
+    linter_path = linters('support_files')[0]
     lint.read(linter_path)
 
     # Modified support files only lint entire root if --outgoing or --workdir
     # are used.
     path = os.path.join(filedir, 'foobar.js')
     lint.mock_vcs([os.path.join(filedir, 'foobar.py')])
     lint.roll(path)
     assert jobs[0] == [path]
@@ -232,24 +233,21 @@ def test_support_files(lint, lintdir, fi
 
     # Lint config file is implicitly added as a support file
     lint.mock_vcs([linter_path])
     jobs = []
     lint.roll(path, outgoing=True, workdir=True)
     assert jobs[0] == [lint.root]
 
 
-linters = ('setup.yml', 'setupfailed.yml', 'setupraised.yml')
-
-
 def test_setup(lint, linters, filedir, capfd):
     with pytest.raises(LintersNotConfigured):
         lint.setup()
 
-    lint.read(linters)
+    lint.read(linters('setup', 'setupfailed', 'setupraised'))
     lint.setup()
     out, err = capfd.readouterr()
     assert 'setup passed' in out
     assert 'setup failed' in out
     assert 'setup raised' in out
     assert 'error: problem with lint setup, skipping' in out
     assert lint.result.failed_setup == set(['SetupFailedLinter', 'SetupRaisedLinter'])
 
--- a/servo/ports/geckolib/Cargo.toml
+++ b/servo/ports/geckolib/Cargo.toml
@@ -2,17 +2,16 @@
 name = "geckoservo"
 version = "0.0.1"
 authors = ["The Servo Project Developers"]
 license = "MPL-2.0"
 
 [lib]
 name = "geckoservo"
 path = "lib.rs"
-crate-type = ["staticlib", "rlib"]
 
 [features]
 bindgen = ["style/use_bindgen"]
 gecko_debug = ["style/gecko_debug", "nsstring/gecko_debug"]
 
 [dependencies]
 atomic_refcell = "0.1"
 cssparser = "0.24.0"
--- a/taskcluster/scripts/misc/build-clang-7-mingw.sh
+++ b/taskcluster/scripts/misc/build-clang-7-mingw.sh
@@ -26,17 +26,17 @@ UPLOAD_DIR=$HOME/artifacts
 TOOLCHAIN_DIR=$WORKSPACE/moz-toolchain
 INSTALL_DIR=$TOOLCHAIN_DIR/build/stage3/clang
 CROSS_PREFIX_DIR=$INSTALL_DIR/$machine-w64-mingw32
 SRC_DIR=$TOOLCHAIN_DIR/src
 
 CLANG_VERSION=7.0.0
 make_flags="-j$(nproc)"
 
-mingw_version=cb090affef8ebcd8c13ffc271b4500dea3b52f33
+mingw_version=cfd85ebed773810429bf2164c3a985895b7dbfe3
 libunwind_version=86ab23972978242b6f9e27cebc239f3e8428b1af
 
 binutils_version=2.27
 binutils_ext=bz2
 binutils_sha=369737ce51587f92466041a97ab7d2358c6d9e1b6490b3940eb09fb0a9a6ac88
 
 # This is default value of _WIN32_WINNT. Gecko configure script explicitly sets this,
 # so this is not used to build Gecko itself. We default to 0x600, which is Windows Vista.
--- a/testing/testsuite-targets.mk
+++ b/testing/testsuite-targets.mk
@@ -120,16 +120,17 @@ TEST_PKGS_TARGZ := \
   cppunittest \
   mochitest \
   reftest \
   talos \
   raptor \
   awsy \
   xpcshell \
   web-platform \
+  updater-dep \
   $(NULL)
 
 ifdef LINK_GTEST_DURING_COMPILE
 stage-all: stage-gtest
 TEST_PKGS_ZIP += gtest
 endif
 
 PKG_ARG = --$(1) '$(PKG_BASENAME).$(1).tests.$(2)'
--- a/toolkit/components/extensions/parent/ext-privacy.js
+++ b/toolkit/components/extensions/parent/ext-privacy.js
@@ -13,16 +13,17 @@ var {
 
 const cookieSvc = Ci.nsICookieService;
 
 const cookieBehaviorValues = new Map([
   ["allow_all", cookieSvc.BEHAVIOR_ACCEPT],
   ["reject_third_party", cookieSvc.BEHAVIOR_REJECT_FOREIGN],
   ["reject_all", cookieSvc.BEHAVIOR_REJECT],
   ["allow_visited", cookieSvc.BEHAVIOR_LIMIT_FOREIGN],
+  ["reject_trackers", cookieSvc.BEHAVIOR_REJECT_TRACKER],
 ]);
 
 const checkScope = scope => {
   if (scope && scope !== "regular") {
     throw new ExtensionError(
       `Firefox does not support the ${scope} settings scope.`);
   }
 };
--- a/toolkit/components/extensions/schemas/privacy.json
+++ b/toolkit/components/extensions/schemas/privacy.json
@@ -77,17 +77,18 @@
         "properties": {
           "behavior": {
             "type": "string",
             "optional": true,
             "enum": [
               "allow_all",
               "reject_all",
               "reject_third_party",
-              "allow_visited"
+              "allow_visited",
+              "reject_trackers"
             ],
             "description": "The type of cookies to allow."
           },
           "nonPersistentCookies": {
             "type": "boolean",
             "optional": true,
             "default": false,
             "description": "Whether to create all cookies as nonPersistent (i.e., session) cookies."
--- a/toolkit/components/extensions/test/xpcshell/test_ext_privacy.js
+++ b/toolkit/components/extensions/test/xpcshell/test_ext_privacy.js
@@ -242,16 +242,40 @@ add_task(async function test_privacy_oth
       "privacy.firstparty.isolate": true,
     },
     "websites.cookieConfig": {
       "network.cookie.cookieBehavior": cookieSvc.BEHAVIOR_ACCEPT,
       "network.cookie.lifetimePolicy": cookieSvc.ACCEPT_NORMALLY,
     },
   };
 
+  let defaultPrefs = new Preferences({defaultBranch: true});
+  let defaultCookieBehavior = defaultPrefs.get("network.cookie.cookieBehavior");
+  let defaultBehavior;
+  switch (defaultCookieBehavior) {
+    case cookieSvc.BEHAVIOR_ACCEPT:
+      defaultBehavior = "allow_all";
+      break;
+    case cookieSvc.BEHAVIOR_REJECT_FOREIGN:
+      defaultBehavior = "reject_third_party";
+      break;
+    case cookieSvc.BEHAVIOR_REJECT:
+      defaultBehavior = "reject_all";
+      break;
+    case cookieSvc.BEHAVIOR_LIMIT_FOREIGN:
+      defaultBehavior = "allow_visited";
+      break;
+    case cookieSvc.BEHAVIOR_REJECT_TRACKER:
+      defaultBehavior = "reject_trackers";
+      break;
+    default:
+      ok(false, `Unexpected cookie behavior encountered: ${defaultCookieBehavior}`);
+      break;
+  }
+
   async function background() {
     browser.test.onMessage.addListener(async (msg, ...args) => {
       let data = args[0];
       // The second argument is the end of the api name,
       // e.g., "network.webRTCIPHandlingPolicy".
       let apiObj = args[1].split(".").reduce((o, i) => o[i], browser.privacy);
       let settingData;
       switch (msg) {
@@ -422,20 +446,20 @@ add_task(async function test_privacy_oth
     },
     {behavior: "reject_third_party", nonPersistentCookies: false},
   );
   // A missing behavior property should reset the pref.
   await testSetting(
     "websites.cookieConfig",
     {nonPersistentCookies: true},
     {
-      "network.cookie.cookieBehavior": cookieSvc.BEHAVIOR_ACCEPT,
+      "network.cookie.cookieBehavior": defaultCookieBehavior,
       "network.cookie.lifetimePolicy": cookieSvc.ACCEPT_SESSION,
     },
-    {behavior: "allow_all", nonPersistentCookies: true},
+    {behavior: defaultBehavior, nonPersistentCookies: true},
   );
   await testSetting(
     "websites.cookieConfig",
     {behavior: "reject_all"},
     {
       "network.cookie.cookieBehavior": cookieSvc.BEHAVIOR_REJECT,
       "network.cookie.lifetimePolicy": cookieSvc.ACCEPT_NORMALLY,
     },
@@ -458,30 +482,40 @@ add_task(async function test_privacy_oth
       "network.cookie.lifetimePolicy": cookieSvc.ACCEPT_NORMALLY,
     },
     {behavior: "allow_all", nonPersistentCookies: false},
   );
   await testSetting(
     "websites.cookieConfig",
     {nonPersistentCookies: true},
     {
-      "network.cookie.cookieBehavior": cookieSvc.BEHAVIOR_ACCEPT,
+      "network.cookie.cookieBehavior": defaultCookieBehavior,
       "network.cookie.lifetimePolicy": cookieSvc.ACCEPT_SESSION,
     },
-    {behavior: "allow_all", nonPersistentCookies: true},
+    {behavior: defaultBehavior, nonPersistentCookies: true},
   );
   await testSetting(
     "websites.cookieConfig",
     {nonPersistentCookies: false},
     {
-      "network.cookie.cookieBehavior": cookieSvc.BEHAVIOR_ACCEPT,
+      "network.cookie.cookieBehavior": defaultCookieBehavior,
       "network.cookie.lifetimePolicy": cookieSvc.ACCEPT_NORMALLY,
     },
-    {behavior: "allow_all", nonPersistentCookies: false},
+    {behavior: defaultBehavior, nonPersistentCookies: false},
   );
+  await testSetting(
+    "websites.cookieConfig",
+    {behavior: "reject_trackers"},
+    {
+      "network.cookie.cookieBehavior": cookieSvc.BEHAVIOR_REJECT_TRACKER,
+      "network.cookie.lifetimePolicy": cookieSvc.ACCEPT_NORMALLY,
+    },
+    {behavior: "reject_trackers", nonPersistentCookies: false},
+  );
+
 
   await extension.unload();
 
   await promiseShutdownManager();
 });
 
 add_task(async function test_exceptions() {
   async function background() {
--- a/toolkit/mozapps/update/updater/archivereader.cpp
+++ b/toolkit/mozapps/update/updater/archivereader.cpp
@@ -20,16 +20,19 @@
 #define XZ_USE_CRC64
 #include "xz.h"
 
 // These are generated at compile time based on the DER file for the channel
 // being used
 #ifdef MOZ_VERIFY_MAR_SIGNATURE
 #ifdef TEST_UPDATER
 #include "../xpcshellCert.h"
+#elif DEP_UPDATER
+#include "../dep1Cert.h"
+#include "../dep2Cert.h"
 #else
 #include "primaryCert.h"
 #include "secondaryCert.h"
 #endif
 #endif
 
 #define UPDATER_NO_STRING_GLUE_STL
 #include "nsVersionComparator.cpp"
@@ -82,16 +85,21 @@ ArchiveReader::VerifySignature()
     return ARCHIVE_NOT_OPEN;
   }
 
 #ifndef MOZ_VERIFY_MAR_SIGNATURE
   return OK;
 #else
 #ifdef TEST_UPDATER
   int rv = VerifyLoadedCert(mArchive, xpcshellCertData);
+#elif DEP_UPDATER
+  int rv = VerifyLoadedCert(mArchive, dep1CertData);
+  if (rv != OK) {
+    rv = VerifyLoadedCert(mArchive, dep2CertData);
+  }
 #else
   int rv = VerifyLoadedCert(mArchive, primaryCertData);
   if (rv != OK) {
     rv = VerifyLoadedCert(mArchive, secondaryCertData);
   }
 #endif
   return rv;
 #endif
--- a/toolkit/mozapps/update/updater/moz.build
+++ b/toolkit/mozapps/update/updater/moz.build
@@ -6,55 +6,64 @@
 
 if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'cocoa':
     Program('org.mozilla.updater')
 else:
     Program('updater')
 
 updater_rel_path = ''
 include('updater-common.build')
+DIRS += ['updater-dep']
 if CONFIG['ENABLE_TESTS']:
     DIRS += ['updater-xpcshell']
 
 if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'cocoa':
     LDFLAGS += ['-sectcreate',
                 '__TEXT',
                 '__info_plist',
                 TOPOBJDIR + '/dist/bin/Info.plist',
                 '-sectcreate',
                 '__TEXT',
                 '__launchd_plist',
                 SRCDIR + '/Launchd.plist']
 
 GENERATED_FILES = [
+    'dep1Cert.h',
+    'dep2Cert.h',
     'primaryCert.h',
     'secondaryCert.h',
     'xpcshellCert.h',
 ]
 
 primary_cert = GENERATED_FILES['primaryCert.h']
 secondary_cert = GENERATED_FILES['secondaryCert.h']
 
 # This is how the xpcshellCertificate.der file is generated, in case we ever
 # have to regenerate it.
 # ./certutil -L -d modules/libmar/tests/unit/data -n mycert -r > xpcshellCertificate.der
 xpcshell_cert = GENERATED_FILES['xpcshellCert.h']
+dep1_cert = GENERATED_FILES['dep1Cert.h']
+dep2_cert = GENERATED_FILES['dep2Cert.h']
 
 primary_cert.script = 'gen_cert_header.py:create_header'
 secondary_cert.script = 'gen_cert_header.py:create_header'
 xpcshell_cert.script = 'gen_cert_header.py:create_header'
+dep1_cert.script = 'gen_cert_header.py:create_header'
+dep2_cert.script = 'gen_cert_header.py:create_header'
 
 if CONFIG['MOZ_UPDATE_CHANNEL'] in ('beta', 'release', 'esr'):
     primary_cert.inputs += ['release_primary.der']
     secondary_cert.inputs += ['release_secondary.der']
 elif CONFIG['MOZ_UPDATE_CHANNEL'] in ('nightly', 'aurora', 'nightly-elm',
                                       'nightly-profiling', 'nightly-oak',
                                       'nightly-ux'):
     primary_cert.inputs += ['nightly_aurora_level3_primary.der']
     secondary_cert.inputs += ['nightly_aurora_level3_secondary.der']
 else:
     primary_cert.inputs += ['dep1.der']
     secondary_cert.inputs += ['dep2.der']
 
+dep1_cert.inputs += ['dep1.der']
+dep2_cert.inputs += ['dep2.der']
 xpcshell_cert.inputs += ['xpcshellCertificate.der']
 
 if 'gtk' in CONFIG['MOZ_WIDGET_TOOLKIT']:
     FINAL_TARGET_FILES.icons += ['updater.png']
new file mode 100644
--- /dev/null
+++ b/toolkit/mozapps/update/updater/updater-dep/moz.build
@@ -0,0 +1,14 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+FINAL_TARGET = '_tests/updater-dep'
+
+Program('updater-dep')
+
+updater_rel_path = '../'
+DEFINES['DEP_UPDATER'] = True
+include('../updater-common.build')
+
--- a/toolkit/mozapps/update/updater/updater.rc
+++ b/toolkit/mozapps/update/updater/updater.rc
@@ -1,15 +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/. */
 
 // Microsoft Visual C++ generated resource script.
 //
-#ifdef TEST_UPDATER
+#if defined(TEST_UPDATER) || defined(DEP_UPDATER)
 #include "../resource.h"
 #define MANIFEST_PATH "../updater.exe.manifest"
 #define COMCTL32_MANIFEST_PATH "../updater.exe.comctl32.manifest"
 #define ICON_PATH "../updater.ico"
 #else
 #include "resource.h"
 #define MANIFEST_PATH "updater.exe.manifest"
 #define COMCTL32_MANIFEST_PATH "updater.exe.comctl32.manifest"
--- a/toolkit/themes/linux/global/in-content/common.css
+++ b/toolkit/themes/linux/global/in-content/common.css
@@ -38,30 +38,20 @@ xul|menulist {
 }
 
 xul|*.menulist-dropmarker {
   display: -moz-box;
   margin-top: 6px;
   margin-bottom: 6px;
 }
 
-xul|*.checkbox-check,
-xul|*.radio-check {
-  background-image: none;
-}
-
-xul|*.checkbox-check[checked] {
-  fill: -moz-dialogText;
-  stroke: none;
-  background-color: -moz-dialog;
-}
-
+xul|*.checkbox-check[checked],
 xul|*.radio-check[selected] {
-  background-color: -moz-dialog;
-  fill: -moz-dialogText;
+  background-color: -moz-field;
+  fill: -moz-fieldText;
 }
 
 xul|*.radio-label-box {
   -moz-appearance: none;
 }
 
 xul|*.numberbox-input-box {
   -moz-appearance: none;
rename from toolkit/themes/shared/in-content/check-partial.svg
rename to toolkit/themes/shared/icons/check-partial.svg
--- a/toolkit/themes/shared/in-content/check-partial.svg
+++ b/toolkit/themes/shared/icons/check-partial.svg
@@ -1,8 +1,6 @@
 <!-- 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/. -->
-<svg xmlns="http://www.w3.org/2000/svg"
-     width="21" height="21" viewBox="0 0 21 21">
-  <rect fill="context-fill" stroke="context-stroke" stroke-width="0.5" x="3" y="9" width="15" height="3"/>
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="context-fill" fill-opacity="context-fill-opacity" stroke="context-stroke none" stroke-width="0.5">
+  <rect x="2" y="7" width="12" height="2" rx="1"/>
 </svg>
-
old mode 100755
new mode 100644
rename from browser/themes/shared/icons/check.svg
rename to toolkit/themes/shared/icons/check.svg
--- a/browser/themes/shared/icons/check.svg
+++ b/toolkit/themes/shared/icons/check.svg
@@ -1,6 +1,6 @@
 <!-- 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/. -->
 <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
-  <path fill="context-fill" fill-opacity="context-fill-opacity" d="M6 14a1 1 0 0 1-.707-.293l-3-3a1 1 0 0 1 1.414-1.414l2.157 2.157 6.316-9.023a1 1 0 0 1 1.639 1.146l-7 10a1 1 0 0 1-.732.427A.863.863 0 0 1 6 14z"/>
+  <path fill="context-fill" fill-opacity="context-fill-opacity" stroke="context-stroke none" stroke-width="0.5" d="M6 14a1 1 0 0 1-.707-.293l-3-3a1 1 0 0 1 1.414-1.414l2.157 2.157 6.316-9.023a1 1 0 0 1 1.639 1.146l-7 10a1 1 0 0 1-.732.427A.863.863 0 0 1 6 14z"/>
 </svg>
--- a/toolkit/themes/shared/in-content/common.inc.css
+++ b/toolkit/themes/shared/in-content/common.inc.css
@@ -484,46 +484,43 @@ xul|checkbox {
   -moz-appearance: none;
   height: 30px;
   margin: 2px 0;
 }
 
 xul|*.checkbox-check,
 html|input[type="checkbox"] {
   -moz-appearance: none;
-  width: 23px;
-  height: 23px;
+  width: 20px;
+  height: 20px;
+  padding: 1px;
   border: 1px solid var(--in-content-box-border-color);
   border-radius: 2px;
   margin: 0;
   margin-inline-end: 10px;
-  background-color: #f1f1f1;
-  background-image: linear-gradient(#fff, rgba(255,255,255,0.8));
-  background-position: center center;
+  background-color: var(--in-content-box-background);
+  background-position: center;
   background-repeat: no-repeat;
-  box-shadow: 0 1px 1px 0 #fff, inset 0 2px 0 0 rgba(0,0,0,0.03);
 }
 
 xul|checkbox:not([disabled="true"]):hover > xul|*.checkbox-check,
 html|input[type="checkbox"]:not(:disabled):hover {
   border-color: var(--in-content-border-focus);
 }
 
 xul|*.checkbox-check[checked] {
-  list-style-image: url("chrome://global/skin/in-content/check.svg");
-  -moz-context-properties: fill, stroke;
+  list-style-image: url("chrome://global/skin/icons/check.svg");
+  -moz-context-properties: fill;
   fill: #2292d0;
-  stroke: none;
 }
 
 html|input[type="checkbox"]:checked {
-  background-image: url("chrome://global/skin/in-content/check.svg"), linear-gradient(#fff, rgba(255,255,255,0.8));
-  -moz-context-properties: fill, stroke;
+  background-image: url("chrome://global/skin/icons/check.svg");
+  -moz-context-properties: fill;
   fill: #2292d0;
-  stroke: none;
 }
 
 xul|checkbox[disabled="true"] > xul|*.checkbox-check,
 html|input[type="checkbox"]:disabled {
   opacity: 0.5;
 }
 
 xul|richlistitem > xul|*.checkbox-check {
@@ -543,19 +540,17 @@ xul|radio {
 xul|*.radio-check {
   -moz-appearance: none;
   width: 20px;
   height: 20px;
   border: 1px solid var(--in-content-box-border-color);
   border-radius: 50%;
   margin: 0;
   margin-inline-end: 10px;
-  background-color: #f1f1f1;
-  background-image: linear-gradient(#fff, rgba(255,255,255,0.80));
-  box-shadow: 0 1px 1px 0 #fff, inset 0 2px 0 0 rgba(0,0,0,0.03);
+  background-color: var(--in-content-box-background);
 }
 
 xul|radio:not([disabled="true"]):hover > xul|*.radio-check {
   border-color: var(--in-content-border-focus);
 }
 
 xul|*.radio-check[selected] {
   list-style-image: url("chrome://global/skin/in-content/radio.svg");
--- a/toolkit/themes/shared/jar.inc.mn
+++ b/toolkit/themes/shared/jar.inc.mn
@@ -24,16 +24,18 @@ toolkit.jar:
   skin/classic/global/datetimeinputpickers.css             (../../shared/datetimeinputpickers.css)
   skin/classic/global/datetimepopup.css                    (../../shared/datetimepopup.css)
   skin/classic/global/passwordmgr.css                      (../../shared/passwordmgr.css)
   skin/classic/global/icons/autoscroll.svg                 (../../shared/icons/autoscroll.svg)
   skin/classic/global/icons/autoscroll-horizontal.svg      (../../shared/icons/autoscroll-horizontal.svg)
   skin/classic/global/icons/autoscroll-vertical.svg        (../../shared/icons/autoscroll-vertical.svg)
   skin/classic/global/icons/calendar-arrow-left.svg        (../../shared/icons/calendar-arrow-left.svg)
   skin/classic/global/icons/calendar-arrow-right.svg       (../../shared/icons/calendar-arrow-right.svg)
+  skin/classic/global/icons/check.svg                      (../../shared/icons/check.svg)
+  skin/classic/global/icons/check-partial.svg              (../../shared/icons/check-partial.svg)
   skin/classic/global/icons/close.svg                      (../../shared/icons/close.svg)
   skin/classic/global/icons/error.svg                      (../../shared/icons/error.svg)
   skin/classic/global/icons/find-previous-arrow.svg        (../../shared/icons/find-previous-arrow.svg)
   skin/classic/global/icons/find-next-arrow.svg            (../../shared/icons/find-next-arrow.svg)
   skin/classic/global/icons/help.svg                       (../../shared/icons/help.svg)
   skin/classic/global/icons/info.svg                       (../../shared/incontent-icons/info.svg)
   skin/classic/global/icons/loading.png                    (../../shared/icons/loading.png)
   skin/classic/global/icons/loading@2x.png                 (../../shared/icons/loading@2x.png)
@@ -53,18 +55,16 @@ toolkit.jar:
   skin/classic/global/narrate/arrow.svg                    (../../shared/narrate/arrow.svg)
   skin/classic/global/narrate/back.svg                     (../../shared/narrate/back.svg)
   skin/classic/global/narrate/fast.svg                     (../../shared/narrate/fast.svg)
   skin/classic/global/narrate/forward.svg                  (../../shared/narrate/forward.svg)
   skin/classic/global/narrate/slow.svg                     (../../shared/narrate/slow.svg)
   skin/classic/global/narrate/start.svg                    (../../shared/narrate/start.svg)
   skin/classic/global/narrate/stop.svg                     (../../shared/narrate/stop.svg)
   skin/classic/global/narrate/waveform.svg                 (../../shared/narrate/waveform.svg)
-  skin/classic/global/in-content/check.svg                 (../../shared/in-content/check.svg)
-  skin/classic/global/in-content/check-partial.svg         (../../shared/in-content/check-partial.svg)
   skin/classic/global/in-content/dropdown.svg              (../../shared/in-content/dropdown.svg)
   skin/classic/global/in-content/radio.svg                 (../../shared/in-content/radio.svg)
   skin/classic/global/reader/RM-Close-24x24.svg            (../../shared/reader/RM-Close-24x24.svg)
   skin/classic/global/reader/RM-Minus-24x24.svg            (../../shared/reader/RM-Minus-24x24.svg)
   skin/classic/global/reader/RM-Plus-24x24.svg             (../../shared/reader/RM-Plus-24x24.svg)
   skin/classic/global/reader/RM-Type-Controls-24x24.svg    (../../shared/reader/RM-Type-Controls-24x24.svg)
   skin/classic/global/reader/RM-Type-Controls-Arrow.svg    (../../shared/reader/RM-Type-Controls-Arrow.svg)
   skin/classic/global/reader/RM-Content-Width-Minus-42x16.svg            (../../shared/reader/RM-Content-Width-Minus-42x16.svg)
--- a/toolkit/themes/windows/global/in-content/common.css
+++ b/toolkit/themes/windows/global/in-content/common.css
@@ -18,30 +18,20 @@ xul|*.menulist-dropmarker {
 }
 
 xul|checkbox,
 xul|radio {
   padding-inline-start: 0;
 }
 
 @media (-moz-windows-default-theme: 0) {
-  xul|*.checkbox-check,
-  xul|*.radio-check {
-    background-image: none;
-  }
-
-  xul|*.checkbox-check[checked] {
-    fill: -moz-dialogText;
-    stroke: none;
-    background-color: -moz-dialog;
-  }
-
+  xul|*.checkbox-check[checked],
   xul|*.radio-check[selected] {
-    background-color: -moz-dialog;
-    fill: -moz-dialogText;
+    fill: -moz-fieldText;
+    background-color: -moz-field;
   }
 }
 
 /* Never draw a border for the focusring, use outline instead */
 xul|*.menulist-label-box {
   border-style: none;
 }
 
--- a/tools/clang-tidy/config.yaml
+++ b/tools/clang-tidy/config.yaml
@@ -87,11 +87,39 @@ clang_checkers:
   - name: readability-misleading-indentation
   - name: readability-redundant-control-flow
   - name: readability-redundant-smartptr-get
     publish: !!bool no
   - name: readability-redundant-string-cstr
   - name: readability-redundant-string-init
   - name: readability-static-accessed-through-instance
   - name: readability-uniqueptr-delete-release
+  # We don't publish the google checkers since we are interested in only having
+  # a general idea how our code complies with the rules added by these checkers.
+  - name: google-build-explicit-make-pair
+    publish: !!bool no
+  - name: google-build-namespaces
+    publish: !!bool no
+  - name: google-build-using-namespace
+    publish: !!bool no
+  - name: google-default-arguments
+    publish: !!bool no
+  - name: google-explicit-constructor
+    publish: !!bool no
+  - name: google-global-names-in-headers
+    publish: !!bool no
+  - name: google-readability-casting
+    publish: !!bool no
+  - name: google-readability-function-size
+    publish: !!bool no
+  - name: google-readability-namespace-comments
+    publish: !!bool no
+  - name: google-readability-todo
+    publish: !!bool no
+  - name: google-runtime-int
+    publish: !!bool no
+  - name: google-runtime-operator
+    publish: !!bool no
+  - name: google-runtime-references
+    publish: !!bool no
 
 # Third party files from mozilla-central
 third_party: tools/rewriting/ThirdPartyPaths.txt
--- a/xpcom/threads/ThreadDelay.cpp
+++ b/xpcom/threads/ThreadDelay.cpp
@@ -21,16 +21,17 @@ DelayForChaosMode(ChaosFeature aFeature,
   if (!ChaosMode::isActive(aFeature)) {
     return;
   }
 
   MOZ_ASSERT(aMicrosecondLimit <= 1000);
 #if defined(XP_WIN)
   // Windows doesn't support sleeping at less than millisecond resolution.
   // We could spin here, or we could just sleep for one millisecond.
-  ::Sleep(1);
+  // Sleeping for a full millisecond causes heavy delays, so we don't do anything
+  // here for now until we have found a good way to sleep more precisely here.
 #else
   const uint32_t duration = ChaosMode::randomUint32LessThan(aMicrosecondLimit);
   ::usleep(duration);
 #endif
 }
 
 } // namespace mozilla