Merge mozilla-central to autoland. a=merge on a CLOSED TREE
authorRazvan Maries <rmaries@mozilla.com>
Mon, 24 Dec 2018 23:57:43 +0200
changeset 508994 147895cc0f258768adf296d04e48e0c4ba88c379
parent 508993 54d643b4b99b1aa576342ad9a7ba79fdd9882ce5 (current diff)
parent 508985 b243a5a3fc646329ca5b5d169f7fe2f16dfb56eb (diff)
child 508995 9fcd338ab3516ba22c495e3cb2ecc52010580fb0
push id10547
push userffxbld-merge
push dateMon, 21 Jan 2019 13:03:58 +0000
treeherdermozilla-beta@24ec1916bffe [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone66.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 autoland. a=merge on a CLOSED TREE
--- a/browser/app/profile/firefox.js
+++ b/browser/app/profile/firefox.js
@@ -1510,18 +1510,21 @@ pref("toolkit.telemetry.hybridContent.en
 pref("browser.ping-centre.telemetry", true);
 pref("browser.ping-centre.log", false);
 pref("browser.ping-centre.staging.endpoint", "https://onyx_tiles.stage.mozaws.net/v3/links/ping-centre");
 pref("browser.ping-centre.production.endpoint", "https://tiles.services.mozilla.com/v3/links/ping-centre");
 
 // Enable GMP support in the addon manager.
 pref("media.gmp-provider.enabled", true);
 
-// Enable blocking access to storage from tracking resources by default
+// Enable blocking access to storage from tracking resources only in nightly
+// and early beta. By default the value is 0: BEHAVIOR_ACCEPT
+#ifdef EARLY_BETA_OR_EARLIER
 pref("network.cookie.cookieBehavior", 4 /* BEHAVIOR_REJECT_TRACKER */);
+#endif
 
 pref("browser.contentblocking.allowlist.storage.enabled", true);
 
 pref("dom.storage_access.enabled", true);
 
 pref("dom.storage_access.auto_grants", true);
 pref("dom.storage_access.max_concurrent_auto_grants", 5);
 
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -809,48 +809,17 @@ var gPopupBlockerObserver = {
       for (let i = 0; i < popups.length; i++) {
         if (popups[i].popupWindowURIspec)
           aBrowser.unblockPopup(i);
       }
     }, null);
   },
 
   editPopupSettings() {
-    let prefillValue = "";
-    try {
-      // We use contentPrincipal rather than currentURI to get the right
-      // value in case this is a data: URI that's inherited off something else.
-      // Some principals don't have URIs, so fall back in case URI is not present.
-      let principalURI = gBrowser.contentPrincipal.URI || gBrowser.currentURI;
-      if (principalURI) {
-        // asciiHost conveniently doesn't throw.
-        if (principalURI.asciiHost) {
-          prefillValue = principalURI.prePath;
-        } else {
-          // For host-less URIs like file://, prePath would effectively allow
-          // popups everywhere on file://. Use the full spec:
-          prefillValue = principalURI.spec;
-        }
-      }
-    } catch (e) { }
-
-    var params = { blockVisible: false,
-                   sessionVisible: false,
-                   allowVisible: true,
-                   prefilledHost: prefillValue,
-                   permissionType: "popup",
-    };
-
-    var existingWindow = Services.wm.getMostRecentWindow("Browser:Permissions");
-    if (existingWindow) {
-      existingWindow.initWithParams(params);
-      existingWindow.focus();
-    } else
-      window.openDialog("chrome://browser/content/preferences/permissions.xul",
-                        "_blank", "resizable,dialog=no,centerscreen", params);
+    openPreferences("privacy-permissions-block-popups");
   },
 
   dontShowMessage() {
     var showMessage = Services.prefs.getBoolPref("privacy.popups.showBrowserMessage");
     Services.prefs.setBoolPref("privacy.popups.showBrowserMessage", !showMessage);
     gBrowser.getNotificationBox().removeCurrentNotification();
   },
 };
--- a/browser/components/enterprisepolicies/content/aboutPolicies.js
+++ b/browser/components/enterprisepolicies/content/aboutPolicies.js
@@ -281,20 +281,19 @@ function init() {
 
   let data = Services.policies.getActivePolicies();
   generateActivePolicies(data);
   generateErrors();
   generateDocumentation();
 
   // Event delegation on #categories element
   let menu = document.getElementById("categories");
-  menu.addEventListener("click", function click(e) {
-    if (e.target && e.target.parentNode == menu)
-      show(e.target);
-  });
+  for (let category of menu.children) {
+    category.addEventListener("click", () => show(category));
+  }
 
   if (location.hash) {
     let sectionButton = document.getElementById("category-" + location.hash.substring(1));
     if (sectionButton) {
       sectionButton.click();
     }
   }
 
@@ -318,17 +317,17 @@ function show(button) {
   content.classList.add("active");
   content.hidden = false;
 
   let current_button = document.querySelector("[selected=true]");
   current_button.removeAttribute("selected");
   button.setAttribute("selected", "true");
 
   let title = document.getElementById("sectionTitle");
-  title.textContent = button.children[0].textContent;
+  title.textContent = button.children[1].textContent;
   location.hash = category;
   restoreScrollPosition(category);
 }
 
 const scrollPositions = {};
 function saveScrollPosition(category) {
   const mainContent = document.querySelector(".main-content");
   scrollPositions[category] = mainContent.scrollTop;
--- a/browser/components/enterprisepolicies/content/aboutPolicies.xhtml
+++ b/browser/components/enterprisepolicies/content/aboutPolicies.xhtml
@@ -14,23 +14,26 @@
         <link rel="localization" href="browser/branding/sync-brand.ftl"/>
         <link rel="localization" href="browser/aboutPolicies.ftl"/>
         <link rel="localization" href="browser/policies/policies-descriptions.ftl"/>
         <script type="application/javascript" src="chrome://browser/content/policies/aboutPolicies.js" />
     </head>
     <body id="body" onload="init()">
         <div id="categories">
             <div class="category" selected="true" id="category-active">
-                <span class="category-name" data-l10n-id="active-policies-tab"/>
+                <img class="category-icon" src="chrome://browser/content/policies/policies-active.svg"></img>
+                <label class="category-name" data-l10n-id="active-policies-tab"></label>
             </div>
             <div class="category" id="category-documentation">
-                <span class="category-name" data-l10n-id="documentation-tab"/>
+                <img class="category-icon" src="chrome://browser/content/policies/policies-documentation.svg"></img>
+                <label class="category-name" data-l10n-id="documentation-tab"></label>
             </div>
             <div class="category" id="category-errors">
-                <span class="category-name" data-l10n-id="errors-tab"/>
+                <img class="category-icon" src="chrome://browser/content/policies/policies-error.svg"></img>
+                <label class="category-name" data-l10n-id="errors-tab"></label>
             </div>
         </div>
         <div class="main-content">
             <div class="header">
                 <div id="sectionTitle" class="header-name" data-l10n-id="active-policies-tab"/>
             </div>
 
             <div id="active" class="tab active">
new file mode 100644
--- /dev/null
+++ b/browser/components/enterprisepolicies/content/policies-active.svg
@@ -0,0 +1,3 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg">
+    <path fill="context-fill" fill-opacity="context-fill-opacity" d="m11 10c-.5522847 0-1-.44771525-1-1v-4h-7v8c0 .5522847.44771525 1 1 1h2c.55228475 0 1 .4477153 1 1s-.44771525 1-1 1h-3c-1.1045695 0-2-.8954305-2-2v-10c0-1.1045695.8954305-2 2-2h1.05c.23659623-1.16516199 1.26105919-2.00250628 2.45-2.00250628s2.21340377.83734429 2.45 2.00250628h1.05c1.1045695 0 2 .8954305 2 2v5c0 .55228475-.4477153 1-1 1zm-1-6v-1h-1.051c-.47526862.000097-.88494628-.33433375-.98-.8-.14293517-.69793844-.7570756-1.19905191-1.4695-1.19905191s-1.32656483.50111347-1.4695 1.19905191c-.09505372.46566625-.50473138.800097-.98.8h-1.05v1zm-3.5-2c.27614237 0 .5.22385763.5.5s-.22385763.5-.5.5-.5-.22385763-.5-.5.22385763-.5.5-.5zm-2 5c-.27614237 0-.5-.22385763-.5-.5s.22385763-.5.5-.5h4c.27614237 0 .5.22385763.5.5s-.22385763.5-.5.5zm0 2c-.27614237 0-.5-.22385763-.5-.5s.22385763-.5.5-.5h2c.27614237 0 .5.22385763.5.5s-.22385763.5-.5.5zm0 2c-.27614237 0-.5-.2238576-.5-.5s.22385763-.5.5-.5h3c.27614237 0 .5.2238576.5.5s-.22385763.5-.5.5zm5.16250363 4.9969649c-.17706448-.0000378-.34686306-.070407-.47204764-.1956294l-2.00303103-2.003031c-.25303103-.2619823-.24941233-.6784164.00813326-.935962s.67397967-.2611643.93596203-.0081333l1.44017931 1.4401793 4.21704794-6.02444961c.2127301-.29815587.6259441-.36927468.9261129-.15939456.3001689.20988012.3752209.62239779.1682098.92455241l-4.6737391 6.67677006c-.1126024.1627768-.29162177.2672048-.48873957.2850981-.01935032.0009766-.03873758.0009766-.0580879 0z"/>
+</svg>
new file mode 100644
--- /dev/null
+++ b/browser/components/enterprisepolicies/content/policies-documentation.svg
@@ -0,0 +1,3 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg">
+    <path fill="context-fill" fill-opacity="context-fill-opacity" d="m11 7.00250628c-.5522847 0-1-.44771525-1-1v-1h-7v8.00000002c0 .5522847.44771525 1 1 1h2c.55228475 0 1 .4477152 1 1 0 .5522847-.44771525 1-1 1h-3c-1.1045695 0-2-.8954305-2-2v-10.00000002c0-1.1045695.8954305-2 2-2h1.05c.23659623-1.16516199 1.26105919-2.00250628 2.45-2.00250628s2.21340377.83734429 2.45 2.00250628h1.05c1.1045695 0 2 .8954305 2 2v2c0 .55228475-.4477153 1-1 1zm-1-3v-1h-1.051c-.47526862.000097-.88494628-.33433374-.98-.8-.14293517-.69793844-.7570756-1.19905191-1.4695-1.19905191s-1.32656483.50111347-1.4695 1.19905191c-.09505372.46566626-.50473138.800097-.98.8h-1.05v1zm-3.5-2c.27614237 0 .5.22385763.5.5 0 .27614238-.22385763.5-.5.5s-.5-.22385762-.5-.5c0-.27614237.22385763-.5.5-.5zm-2 5c-.27614237 0-.5-.22385762-.5-.5 0-.27614237.22385763-.5.5-.5h4c.27614237 0 .5.22385763.5.5 0 .27614238-.22385763.5-.5.5zm0 2c-.27614237 0-.5-.22385762-.5-.5 0-.27614237.22385763-.5.5-.5h2c.27614237 0 .5.22385763.5.5 0 .27614238-.22385763.5-.5.5zm0 2.00000002c-.27614237 0-.5-.2238576-.5-.5s.22385763-.5.5-.5h1c.27614237 0 .5.2238576.5.5s-.22385763.5-.5.5zm6.5 4.9974937c-2.2092 0-4-1.7908-4-4s1.7908-4 4-4 4 1.7908 4 4-1.7908 4-4 4zm.46-2c0-.254051-.205949-.46-.46-.46s-.46.205949-.46.46.205949.46.46.46.46-.205949.46-.46zm-1.06-3c0-.3056.2464-.6.6-.6s.6.2944.6.6c0 .1244-.0576.254-.1632.3896-.0796.1016-.1544.172-.228.24-.0308.0288-.0612.0572-.092.0876-.0062816.0061251-.0126828.0121262-.0192.018-.052.0468-.1864.168-.2792.3028-.1304.1896-.2184.434-.2184.762 0 .2209139.1790861.4.4.4s.4-.1790861.4-.4c0-.1724.0424-.258.0776-.3088.0204-.0296.0456-.0576.0788-.09.016-.0156.032-.03.0516-.048l.0012-.0008.0036-.0032c.02-.018.0456-.0416.07-.0664l.0344-.032c.1262825-.1138504.2434416-.2374293.3504-.3696.16-.2048.3324-.5056.3324-.8812 0-.6944-.5536-1.4-1.4-1.4s-1.4.7056-1.4 1.4c0 .2209139.1790861.4.4.4s.4-.1790861.4-.4z"/>
+</svg>
new file mode 100644
--- /dev/null
+++ b/browser/components/enterprisepolicies/content/policies-error.svg
@@ -0,0 +1,3 @@
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg">
+    <path fill="context-fill" fill-opacity="context-fill-opacity" d="m11 7.00250628c-.5522847 0-1-.44771525-1-1v-1h-7v8.00000002c0 .5522847.44771525 1 1 1h1c.55228475 0 1 .4477152 1 1 0 .5522847-.44771525 1-1 1h-2c-1.1045695 0-2-.8954305-2-2v-10.00000002c0-1.1045695.8954305-2 2-2h1.05c.23659623-1.16516199 1.26105919-2.00250628 2.45-2.00250628s2.21340377.83734429 2.45 2.00250628h1.05c1.1045695 0 2 .8954305 2 2v2c0 .55228475-.4477153 1-1 1zm-1-3v-1h-1.051c-.47526862.000097-.88494628-.33433374-.98-.8-.14293517-.69793844-.7570756-1.19905191-1.4695-1.19905191s-1.32656483.50111347-1.4695 1.19905191c-.09505372.46566626-.50473138.800097-.98.8h-1.05v1zm-3.5-2c.27614237 0 .5.22385763.5.5 0 .27614238-.22385763.5-.5.5s-.5-.22385762-.5-.5c0-.27614237.22385763-.5.5-.5zm-2 5c-.27614237 0-.5-.22385762-.5-.5 0-.27614237.22385763-.5.5-.5h4c.27614237 0 .5.22385763.5.5 0 .27614238-.22385763.5-.5.5zm0 2c-.27614237 0-.5-.22385762-.5-.5 0-.27614237.22385763-.5.5-.5h3c.27614237 0 .5.22385763.5.5 0 .27614238-.22385763.5-.5.5zm0 2.00000002c-.27614237 0-.5-.2238576-.5-.5s.22385763-.5.5-.5h2c.27614237 0 .5.2238576.5.5s-.22385763.5-.5.5zm10.4094737 3.3385315c.1818196.3660605.1556801.8011195-.0686611 1.1427768-.2243412.3416572-.6131685.5385659-1.0213389.5172232h-5.70000002c-.39222659-.0104155-.75207561-.2200879-.95454083-.5561802-.20246523-.3360923-.21960272-.7522174-.04545917-1.1038198l2.85-5.69999999c.19423612-.39115456.59327402-.63853153 1.03000002-.63853153.4367259 0 .8357638.24737697 1.03.63853153zm-4.45-3.78v1.73c.0381214.2884432.2840486.5040066.575.5040066s.5368786-.2155634.575-.5040066v-1.73c.0295426-.2235324-.0731401-.4439283-.2632845-.56510838-.1901445-.12118005-.4332866-.12118005-.623431 0-.1901445.12118008-.2928271.34157598-.2632845.56510838zm.57 4.13c.3755536 0 .68-.3044464.68-.68 0-.2750343-.1656767-.522987-.4197753-.6282381s-.5465787-.0470731-.7410573.1474055c-.1944787.1944786-.2526566.4869588-.1474055.7410573.1052511.2540986.3532038.4197753.6282381.4197753z"/>
+</svg>
--- a/browser/components/enterprisepolicies/jar.mn
+++ b/browser/components/enterprisepolicies/jar.mn
@@ -1,8 +1,11 @@
 # 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/.
 
 browser.jar:
     content/browser/policies/aboutPolicies.css              (content/aboutPolicies.css)
     content/browser/policies/aboutPolicies.xhtml            (content/aboutPolicies.xhtml)
     content/browser/policies/aboutPolicies.js               (content/aboutPolicies.js)
+    content/browser/policies/policies-active.svg            (content/policies-active.svg)
+    content/browser/policies/policies-documentation.svg     (content/policies-documentation.svg)
+    content/browser/policies/policies-error.svg             (content/policies-error.svg)
--- a/browser/components/preferences/containers.xul
+++ b/browser/components/preferences/containers.xul
@@ -3,17 +3,16 @@
 <!-- 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/. -->
 
 <?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
 <?xml-stylesheet href="chrome://browser/skin/preferences/containers.css" type="text/css"?>
 
 <window id="ContainersDialog"
-        windowtype="Browser:Permissions"
         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
         data-l10n-attrs="title, style"
         onload="gContainersManager.onLoad();"
         onunload="gContainersManager.uninit();"
         persist="screenX screenY width height"
         onkeypress="gContainersManager.onWindowKeyPress(event);">
 
   <linkset>
--- a/browser/components/preferences/in-content/privacy.xul
+++ b/browser/components/preferences/in-content/privacy.xul
@@ -571,17 +571,17 @@
                                permissions-button-cancel.label,
                                permissions-button-ok.label,
                                permissions-exceptions-autoplay-media-window2.title,
                                permissions-exceptions-autoplay-media-desc2
                                " />
     </hbox>
   </hbox>
 
-  <hbox>
+  <hbox data-subcategory="permissions-block-popups">
     <checkbox id="popupPolicy" preference="dom.disable_open_during_load"
               data-l10n-id="permissions-block-popups"
               onsyncfrompreference="return gPrivacyPane.updateButtons('popupPolicyButton',
                                          'dom.disable_open_during_load');"
               flex="1" />
     <!-- Please don't remove the wrapping hbox/vbox/box for these elements. It's used to properly compute the search tooltip position. -->
     <hbox>
       <button id="popupPolicyButton"
--- a/browser/components/preferences/in-content/tests/browser_contentblocking.js
+++ b/browser/components/preferences/in-content/tests/browser_contentblocking.js
@@ -1,10 +1,13 @@
 /* eslint-env webextensions */
 
+ChromeUtils.defineModuleGetter(this, "Preferences",
+                               "resource://gre/modules/Preferences.jsm");
+
 const TP_PREF = "privacy.trackingprotection.enabled";
 const TP_PBM_PREF = "privacy.trackingprotection.pbmode.enabled";
 const TP_LIST_PREF = "urlclassifier.trackingTable";
 const NCB_PREF = "network.cookie.cookieBehavior";
 const CAT_PREF = "browser.contentblocking.category";
 
 requestLongerTimeout(2);
 
@@ -202,16 +205,17 @@ add_task(async function testContentBlock
 add_task(async function testContentBlockingCustomCategory() {
   let prefs = [TP_LIST_PREF, TP_PREF, TP_PBM_PREF, NCB_PREF];
 
   await openPreferencesViaOpenPreferencesAPI("privacy", {leaveOpen: true});
   let doc = gBrowser.contentDocument;
   let strictRadioOption = doc.getElementById("strictRadio");
   let standardRadioOption = doc.getElementById("standardRadio");
   let customRadioOption = doc.getElementById("customRadio");
+  let defaults = new Preferences({defaultBranch: true});
 
   standardRadioOption.click();
   await TestUtils.waitForCondition(() => !Services.prefs.prefHasUserValue(TP_PREF));
 
   customRadioOption.click();
   await TestUtils.waitForCondition(() => Services.prefs.getStringPref(CAT_PREF) == "custom");
   // The custom option does not force changes of any prefs, other than CAT_PREF, all other TP prefs should remain as they were for standard.
   for (let pref of prefs) {
@@ -226,17 +230,30 @@ add_task(async function testContentBlock
   Services.prefs.setBoolPref(TP_PREF, false);
   await TestUtils.waitForCondition(() => !Services.prefs.prefHasUserValue(TP_PREF));
   is(Services.prefs.getStringPref(CAT_PREF), "custom", `${CAT_PREF} has been set to custom`);
 
   strictRadioOption.click();
   await TestUtils.waitForCondition(() => Services.prefs.getStringPref(CAT_PREF) == "strict");
 
   // Changing the NCB_PREF should necessarily set CAT_PREF to "custom"
-  Services.prefs.setIntPref(NCB_PREF, Ci.nsICookieService.BEHAVIOR_ACCEPT);
+  let defaultNCB = defaults.get(NCB_PREF);
+  let nonDefaultNCB;
+  switch (defaultNCB) {
+  case Ci.nsICookieService.BEHAVIOR_ACCEPT:
+    nonDefaultNCB = Ci.nsICookieService.BEHAVIOR_REJECT;
+    break;
+  case Ci.nsICookieService.BEHAVIOR_REJECT_TRACKER:
+    nonDefaultNCB = Ci.nsICookieService.BEHAVIOR_ACCEPT;
+    break;
+  default:
+    ok(false, "Unexpected default value found for " + NCB_PREF + ": " + defaultNCB);
+    break;
+  }
+  Services.prefs.setIntPref(NCB_PREF, nonDefaultNCB);
   await TestUtils.waitForCondition(() => Services.prefs.prefHasUserValue(NCB_PREF));
   is(Services.prefs.getStringPref(CAT_PREF), "custom", `${CAT_PREF} has been set to custom`);
 
   gBrowser.removeCurrentTab();
 });
 
 function checkControlState(doc, controls, enabled) {
   for (let selector of controls) {
--- a/browser/components/preferences/in-content/tests/browser_spotlight.js
+++ b/browser/components/preferences/in-content/tests/browser_spotlight.js
@@ -1,67 +1,38 @@
-
-add_task(async function test_reports_section() {
-  let prefs = await openPreferencesViaOpenPreferencesAPI("privacy-reports", {leaveOpen: true});
-  is(prefs.selectedPane, "panePrivacy", "Privacy pane is selected by default");
-  let doc = gBrowser.contentDocument;
-  is(doc.location.hash, "#privacy", "The subcategory should be removed from the URI");
-  await TestUtils.waitForCondition(() => doc.querySelector(".spotlight"),
-    "Wait for the reports section is spotlighted.");
-  is(doc.querySelector(".spotlight").getAttribute("data-subcategory"), "reports",
-    "The reports section is spotlighted.");
-  BrowserTestUtils.removeTab(gBrowser.selectedTab);
-});
+add_task(async function test_openPreferences_spotlight() {
+  for (let [arg, expectedPane, expectedHash, expectedSubcategory] of [
+    ["privacy-reports",
+     "panePrivacy", "#privacy", "reports"],
+    ["privacy-address-autofill",
+     "panePrivacy", "#privacy", "address-autofill"],
+    ["privacy-credit-card-autofill",
+     "panePrivacy", "#privacy", "credit-card-autofill"],
+    ["privacy-form-autofill",
+     "panePrivacy", "#privacy", "form-autofill"],
+    ["privacy-trackingprotection",
+     "panePrivacy", "#privacy", "trackingprotection"],
+    ["privacy-permissions-block-popups",
+     "panePrivacy", "#privacy", "permissions-block-popups"],
+  ]) {
+    if (arg == "privacy-credit-card-autofill" &&
+        !Services.prefs.getBoolPref("extensions.formautofill.creditCards.available")) {
+      continue;
+    }
 
-add_task(async function test_address_autofill_section() {
-  let prefs = await openPreferencesViaOpenPreferencesAPI("privacy-address-autofill", {leaveOpen: true});
-  is(prefs.selectedPane, "panePrivacy", "Privacy pane is selected by default");
-  let doc = gBrowser.contentDocument;
-  is(doc.location.hash, "#privacy", "The subcategory should be removed from the URI");
-  await TestUtils.waitForCondition(() => doc.querySelector(".spotlight"),
-    "Wait for the address-autofill section is spotlighted.");
-  is(doc.querySelector(".spotlight").getAttribute("data-subcategory"), "address-autofill",
-    "The address-autofill section is spotlighted.");
-  BrowserTestUtils.removeTab(gBrowser.selectedTab);
-});
+    let prefs =
+        await openPreferencesViaOpenPreferencesAPI(arg, { leaveOpen: true });
+    is(prefs.selectedPane, expectedPane, "The right pane is selected");
+    let doc = gBrowser.contentDocument;
+    is(doc.location.hash, expectedHash,
+       "The subcategory should be removed from the URI");
+    await TestUtils.waitForCondition(() => doc.querySelector(".spotlight"),
+                                     "Wait for the spotlight");
+    is(doc.querySelector(".spotlight").getAttribute("data-subcategory"),
+       expectedSubcategory, "The right subcategory is spotlighted");
 
-add_task(async function test_credit_card_autofill_section() {
-  if (!Services.prefs.getBoolPref("extensions.formautofill.creditCards.available")) {
-    return;
+    doc.defaultView.spotlight(null);
+    is(doc.querySelector(".spotlight"), null,
+       "The spotlighted section is cleared");
+
+    BrowserTestUtils.removeTab(gBrowser.selectedTab);
   }
-  let prefs = await openPreferencesViaOpenPreferencesAPI("privacy-credit-card-autofill", {leaveOpen: true});
-  is(prefs.selectedPane, "panePrivacy", "Privacy pane is selected by default");
-  let doc = gBrowser.contentDocument;
-  is(doc.location.hash, "#privacy", "The subcategory should be removed from the URI");
-  await TestUtils.waitForCondition(() => doc.querySelector(".spotlight"),
-    "Wait for the credit-card-autofill section is spotlighted.");
-  is(doc.querySelector(".spotlight").getAttribute("data-subcategory"), "credit-card-autofill",
-    "The credit-card-autofill section is spotlighted.");
-  BrowserTestUtils.removeTab(gBrowser.selectedTab);
 });
-
-add_task(async function test_form_autofill_section() {
-  let prefs = await openPreferencesViaOpenPreferencesAPI("privacy-form-autofill", {leaveOpen: true});
-  is(prefs.selectedPane, "panePrivacy", "Privacy pane is selected by default");
-  let doc = gBrowser.contentDocument;
-  is(doc.location.hash, "#privacy", "The subcategory should be removed from the URI");
-  await TestUtils.waitForCondition(() => doc.querySelector(".spotlight"),
-    "Wait for the form-autofill section is spotlighted.");
-  is(doc.querySelector(".spotlight").getAttribute("data-subcategory"), "form-autofill",
-    "The form-autofill section is spotlighted.");
-  BrowserTestUtils.removeTab(gBrowser.selectedTab);
-});
-
-add_task(async function test_change_cookie_settings() {
-  let prefs = await openPreferencesViaOpenPreferencesAPI("privacy-trackingprotection", {leaveOpen: true});
-  is(prefs.selectedPane, "panePrivacy", "Privacy pane is selected by default");
-  let doc = gBrowser.contentDocument;
-  is(doc.location.hash, "#privacy", "The subcategory should be removed from the URI");
-  await TestUtils.waitForCondition(() => doc.querySelector(".spotlight"),
-    "Wait for the content-blocking section to be spotlighted.");
-  is(doc.querySelector(".spotlight").getAttribute("data-subcategory"), "trackingprotection",
-    "The tracking-protection section is spotlighted.");
-  doc.defaultView.spotlight(null);
-  is(doc.querySelector(".spotlight"), null,
-    "The spotlighted section is cleared.");
-
-  BrowserTestUtils.removeTab(gBrowser.selectedTab);
-});
--- a/browser/components/preferences/permissions.js
+++ b/browser/components/preferences/permissions.js
@@ -435,12 +435,8 @@ var gPermissionManager = {
       c.removeAttribute("data-isCurrentSortCol");
       c.removeAttribute("sortDirection");
     });
     column.setAttribute("data-isCurrentSortCol", "true");
     column.setAttribute("sortDirection", sortDirection);
     column.setAttribute("data-last-sortDirection", sortDirection);
   },
 };
-
-function initWithParams(params) {
-  gPermissionManager.init(params);
-}
--- a/browser/components/preferences/permissions.xul
+++ b/browser/components/preferences/permissions.xul
@@ -4,17 +4,16 @@
    - 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/. -->
 
 <?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
 <?xml-stylesheet href="chrome://browser/content/preferences/sitePermissions.css" type="text/css"?>
 <?xml-stylesheet href="chrome://browser/skin/preferences/preferences.css" type="text/css"?>
 
 <window id="PermissionsDialog"
-        windowtype="Browser:Permissions"
         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
         data-l10n-id="permissions-window"
         data-l10n-attrs="title, style"
         onload="gPermissionManager.onLoad();"
         onunload="gPermissionManager.uninit();"
         persist="screenX screenY width height"
         onkeypress="gPermissionManager.onWindowKeyPress(event);">
 
--- a/devtools/client/inspector/grids/test/browser.ini
+++ b/devtools/client/inspector/grids/test/browser.ini
@@ -27,17 +27,17 @@ skip-if = (verify && (os == 'win' || os 
 [browser_grids_grid-list-on-mutation-element-removed.js]
 [browser_grids_grid-list-toggle-grids_01.js]
 [browser_grids_grid-list-toggle-grids_02.js]
 [browser_grids_grid-list-toggle-multiple-grids.js]
 [browser_grids_grid-outline-cannot-show-outline.js]
 [browser_grids_grid-outline-highlight-area.js]
 skip-if = (verify && (os == 'win')) || (os == "win" && os_version == "10.0" && !debug) #Bug 1501760
 [browser_grids_grid-outline-highlight-cell.js]
-skip-if = (verify && (os == 'win'))
+skip-if = (verify && (os == 'win')) || (os == "win" && os_version == "10.0" && asan) #Bug 1501317
 [browser_grids_grid-outline-multiple-grids.js]
 [browser_grids_grid-outline-selected-grid.js]
 [browser_grids_grid-outline-updates-on-grid-change.js]
 [browser_grids_grid-outline-writing-mode.js]
 skip-if = (verify && (os == 'win'))
 [browser_grids_highlighter-setting-rules-grid-toggle.js]
 [browser_grids_highlighter-toggle-telemetry.js]
 [browser_grids_number-of-css-grids-telemetry.js]
--- a/js/xpconnect/src/XPCConvert.cpp
+++ b/js/xpconnect/src/XPCConvert.cpp
@@ -1136,17 +1136,17 @@ bool XPCConvert::JSObject2NativeInterfac
   // attach it to the wrapper. Note that we allow a maximum of one
   // aggregated native for a given XPCWrappedJS.
   if (aOuter) {
     wrapper->SetAggregatedNativeObject(aOuter);
   }
 
   // We need to go through the QueryInterface logic to make this return
   // the right thing for the various 'special' interfaces; e.g.
-  // nsIPropertyBag. We must use AggregatedQueryInterface in cases where
+  // nsISimpleEnumerator. We must use AggregatedQueryInterface in cases where
   // there is an outer to avoid nasty recursion.
   rv = aOuter ? wrapper->AggregatedQueryInterface(*iid, dest)
               : wrapper->QueryInterface(*iid, dest);
   if (pErr) {
     *pErr = rv;
   }
   return NS_SUCCEEDED(rv);
 }
--- a/js/xpconnect/src/XPCForwards.h
+++ b/js/xpconnect/src/XPCForwards.h
@@ -48,11 +48,9 @@ class nsXPCComponents_Classes;
 class nsXPCComponents_Results;
 class nsXPCComponents_ID;
 class nsXPCComponents_Exception;
 class nsXPCComponents_Constructor;
 class nsXPCComponents_Utils;
 
 class AutoMarkingPtr;
 
-class xpcProperty;
-
 #endif /* xpcforwards_h___ */
--- a/js/xpconnect/src/XPCWrappedJS.cpp
+++ b/js/xpconnect/src/XPCWrappedJS.cpp
@@ -661,44 +661,16 @@ size_t nsXPCWrappedJS::SizeOfIncludingTh
   }
 
   return n;
 }
 
 /***************************************************************************/
 
 NS_IMETHODIMP
-nsXPCWrappedJS::GetEnumerator(nsISimpleEnumerator** aEnumerate) {
-  AutoJSContext cx;
-  XPCCallContext ccx(cx);
-  if (!ccx.IsValid()) {
-    return NS_ERROR_UNEXPECTED;
-  }
-
-  RootedObject scope(cx, GetJSObjectGlobal());
-  return nsXPCWrappedJSClass::BuildPropertyEnumerator(ccx, GetJSObject(), scope,
-                                                      aEnumerate);
-}
-
-NS_IMETHODIMP
-nsXPCWrappedJS::GetProperty(const nsAString& name, nsIVariant** _retval) {
-  AutoJSContext cx;
-  XPCCallContext ccx(cx);
-  if (!ccx.IsValid()) {
-    return NS_ERROR_UNEXPECTED;
-  }
-
-  RootedObject scope(cx, GetJSObjectGlobal());
-  return nsXPCWrappedJSClass::GetNamedPropertyAsVariant(ccx, GetJSObject(),
-                                                        scope, name, _retval);
-}
-
-/***************************************************************************/
-
-NS_IMETHODIMP
 nsXPCWrappedJS::DebugDump(int16_t depth) {
 #ifdef DEBUG
   XPC_LOG_ALWAYS(
       ("nsXPCWrappedJS @ %p with mRefCnt = %" PRIuPTR, this, mRefCnt.get()));
   XPC_LOG_INDENT();
 
   XPC_LOG_ALWAYS(("%s wrapper around JSObject @ %p",
                   IsRootWrapper() ? "ROOT" : "non-root", mJSObj.get()));
--- a/js/xpconnect/src/XPCWrappedJSClass.cpp
+++ b/js/xpconnect/src/XPCWrappedJSClass.cpp
@@ -256,146 +256,16 @@ JSObject* nsXPCWrappedJSClass::CallQuery
 
   if (success) success = JS_ValueToObject(cx, retval, &retObj);
 
   return success ? retObj.get() : nullptr;
 }
 
 /***************************************************************************/
 
-static bool GetNamedPropertyAsVariantRaw(XPCCallContext& ccx,
-                                         HandleObject aJSObj, HandleId aName,
-                                         nsIVariant** aResult, nsresult* pErr) {
-  nsXPTType type = {TD_INTERFACE_TYPE};
-  RootedValue val(ccx);
-
-  return JS_GetPropertyById(ccx, aJSObj, aName, &val) &&
-         XPCConvert::JSData2Native(ccx, aResult, val, type,
-                                   &NS_GET_IID(nsIVariant), 0, pErr);
-}
-
-// static
-nsresult nsXPCWrappedJSClass::GetNamedPropertyAsVariant(XPCCallContext& ccx,
-                                                        JSObject* aJSObjArg,
-                                                        HandleObject scope,
-                                                        const nsAString& aName,
-                                                        nsIVariant** aResult) {
-  JSContext* cx = ccx.GetJSContext();
-  RootedObject aJSObj(cx, aJSObjArg);
-
-  AutoScriptEvaluate scriptEval(cx);
-  if (!scriptEval.StartEvaluating(scope)) {
-    return NS_ERROR_FAILURE;
-  }
-
-  // Wrap the string in a Value after the AutoScriptEvaluate, so that the
-  // resulting value ends up in the correct compartment.
-  nsStringBuffer* buf;
-  RootedValue value(cx);
-  if (!XPCStringConvert::ReadableToJSVal(ccx, aName, &buf, &value)) {
-    return NS_ERROR_OUT_OF_MEMORY;
-  }
-  if (buf) {
-    buf->AddRef();
-  }
-
-  RootedId id(cx);
-  nsresult rv = NS_OK;
-  if (!JS_ValueToId(cx, value, &id) ||
-      !GetNamedPropertyAsVariantRaw(ccx, aJSObj, id, aResult, &rv)) {
-    if (NS_FAILED(rv)) {
-      return rv;
-    }
-    return NS_ERROR_FAILURE;
-  }
-  return NS_OK;
-}
-
-/***************************************************************************/
-
-// static
-nsresult nsXPCWrappedJSClass::BuildPropertyEnumerator(
-    XPCCallContext& ccx, JSObject* aJSObjArg, HandleObject scope,
-    nsISimpleEnumerator** aEnumerate) {
-  JSContext* cx = ccx.GetJSContext();
-  RootedObject aJSObj(cx, aJSObjArg);
-
-  AutoScriptEvaluate scriptEval(cx);
-  if (!scriptEval.StartEvaluating(aJSObj)) {
-    return NS_ERROR_FAILURE;
-  }
-
-  Rooted<IdVector> idArray(cx, IdVector(cx));
-  if (!JS_Enumerate(cx, aJSObj, &idArray)) {
-    return NS_ERROR_FAILURE;
-  }
-
-  nsCOMArray<nsIProperty> propertyArray(idArray.length());
-  RootedId idName(cx);
-  for (size_t i = 0; i < idArray.length(); i++) {
-    idName = idArray[i];
-
-    nsCOMPtr<nsIVariant> value;
-    nsresult rv;
-    if (!GetNamedPropertyAsVariantRaw(ccx, aJSObj, idName,
-                                      getter_AddRefs(value), &rv)) {
-      if (NS_FAILED(rv)) {
-        return rv;
-      }
-      return NS_ERROR_FAILURE;
-    }
-
-    RootedValue jsvalName(cx);
-    if (!JS_IdToValue(cx, idName, &jsvalName)) {
-      return NS_ERROR_FAILURE;
-    }
-
-    JSString* name = ToString(cx, jsvalName);
-    if (!name) {
-      return NS_ERROR_FAILURE;
-    }
-
-    nsAutoJSString autoStr;
-    if (!autoStr.init(cx, name)) {
-      return NS_ERROR_FAILURE;
-    }
-
-    nsCOMPtr<nsIProperty> property =
-        new xpcProperty(autoStr.get(), (uint32_t)autoStr.Length(), value);
-
-    if (!propertyArray.AppendObject(property)) {
-      return NS_ERROR_FAILURE;
-    }
-  }
-
-  return NS_NewArrayEnumerator(aEnumerate, propertyArray,
-                               NS_GET_IID(nsIProperty));
-}
-
-/***************************************************************************/
-
-NS_IMPL_ISUPPORTS(xpcProperty, nsIProperty)
-
-xpcProperty::xpcProperty(const char16_t* aName, uint32_t aNameLen,
-                         nsIVariant* aValue)
-    : mName(aName, aNameLen), mValue(aValue) {}
-
-NS_IMETHODIMP xpcProperty::GetName(nsAString& aName) {
-  aName.Assign(mName);
-  return NS_OK;
-}
-
-NS_IMETHODIMP xpcProperty::GetValue(nsIVariant** aValue) {
-  nsCOMPtr<nsIVariant> rval = mValue;
-  rval.forget(aValue);
-  return NS_OK;
-}
-
-/***************************************************************************/
-
 namespace {
 
 class WrappedJSNamed final : public nsINamed {
   nsCString mName;
 
   ~WrappedJSNamed() {}
 
  public:
@@ -484,30 +354,16 @@ nsXPCWrappedJSClass::DelegatedQueryInter
                                              REFNSIID aIID,
                                              void** aInstancePtr) {
   if (aIID.Equals(NS_GET_IID(nsIXPConnectJSObjectHolder))) {
     NS_ADDREF(self);
     *aInstancePtr = (void*)static_cast<nsIXPConnectJSObjectHolder*>(self);
     return NS_OK;
   }
 
-  if (aIID.Equals(NS_GET_IID(nsIPropertyBag))) {
-    // We only want to expose one implementation from our aggregate.
-    nsXPCWrappedJS* root = self->GetRootWrapper();
-
-    if (!root->IsValid()) {
-      *aInstancePtr = nullptr;
-      return NS_NOINTERFACE;
-    }
-
-    NS_ADDREF(root);
-    *aInstancePtr = (void*)static_cast<nsIPropertyBag*>(root);
-    return NS_OK;
-  }
-
   // We can't have a cached wrapper.
   if (aIID.Equals(NS_GET_IID(nsWrapperCache))) {
     *aInstancePtr = nullptr;
     return NS_NOINTERFACE;
   }
 
   // QI on an XPCWrappedJS can run script, so we need an AutoEntryScript.
   // This is inherently Gecko-specific.
@@ -619,17 +475,17 @@ nsXPCWrappedJSClass::DelegatedQueryInter
     // XPConvert::JSObject2NativeInterface() here to make sure we
     // get a new (or used) nsXPCWrappedJS.
     RefPtr<nsXPCWrappedJS> wrapper;
     nsresult rv =
         nsXPCWrappedJS::GetNewOrUsed(ccx, jsobj, aIID, getter_AddRefs(wrapper));
     if (NS_SUCCEEDED(rv) && wrapper) {
       // We need to go through the QueryInterface logic to make
       // this return the right thing for the various 'special'
-      // interfaces; e.g.  nsIPropertyBag.
+      // interfaces; e.g.  nsISimpleEnumerator.
       rv = wrapper->QueryInterface(aIID, aInstancePtr);
       return rv;
     }
   }
 
   // If we're asked to QI to nsINamed, we pretend that this is possible. We'll
   // try to return a name that makes sense for the wrapped JS value.
   if (aIID.Equals(NS_GET_IID(nsINamed))) {
--- a/js/xpconnect/src/XPCWrappedNative.cpp
+++ b/js/xpconnect/src/XPCWrappedNative.cpp
@@ -982,19 +982,16 @@ nsresult XPCWrappedNative::InitTearOff(X
   // JSObject and our XPCWrappedNativeProto's JSObject. If we let this
   // set mutation happen then the interface's methods will be added to
   // our JSObject, but calls on those methods will get routed up to
   // native code and into the wrappedJS - which will do a method lookup
   // on *our* JSObject and find the same method and make another call
   // into an infinite loop.
   // see: http://bugzilla.mozilla.org/show_bug.cgi?id=96725
 
-  // The code in this block also does a check for the double wrapped
-  // nsIPropertyBag case.
-
   nsCOMPtr<nsIXPConnectWrappedJS> wrappedJS(do_QueryInterface(qiResult));
   if (wrappedJS) {
     RootedObject jso(cx, wrappedJS->GetJSObject());
     if (jso == mFlatJSObject) {
       // The implementing JSObject is the same as ours! Just say OK
       // without actually extending the set.
       //
       // XXX It is a little cheesy to have FindTearOff return an
@@ -1004,42 +1001,16 @@ nsresult XPCWrappedNative::InitTearOff(X
       // actual tearoff returned. The only callers that do use the
       // returned tearoff make sure to check for either a non-null
       // JSObject or a matching Interface before proceeding.
       // I think we can get away with this bit of ugliness.
 
       aTearOff->SetInterface(nullptr);
       return NS_OK;
     }
-
-    // Decide whether or not to expose nsIPropertyBag to calling
-    // JS code in the double wrapped case.
-    //
-    // Our rule here is that when JSObjects are double wrapped and
-    // exposed to other JSObjects then the nsIPropertyBag interface
-    // is only exposed on an 'opt-in' basis; i.e. if the underlying
-    // JSObject wants other JSObjects to be able to see this interface
-    // then it must implement QueryInterface and not throw an exception
-    // when asked for nsIPropertyBag. It need not actually *implement*
-    // nsIPropertyBag - xpconnect will do that work.
-
-    if (iid->Equals(NS_GET_IID(nsIPropertyBag)) && jso) {
-      RootedObject jsoGlobal(cx, wrappedJS->GetJSObjectGlobal());
-      RefPtr<nsXPCWrappedJSClass> clasp =
-          nsXPCWrappedJSClass::GetNewOrUsed(cx, *iid);
-      if (clasp) {
-        RootedObject answer(
-            cx, clasp->CallQueryInterfaceOnJSObject(cx, jso, jsoGlobal, *iid));
-
-        if (!answer) {
-          aTearOff->SetInterface(nullptr);
-          return NS_ERROR_NO_INTERFACE;
-        }
-      }
-    }
   }
 
   if (NS_FAILED(nsXPConnect::SecurityManager()->CanCreateWrapper(
           cx, *iid, identity, GetClassInfo()))) {
     // the security manager vetoed. It should have set an exception.
     aTearOff->SetInterface(nullptr);
     return NS_ERROR_XPC_SECURITY_MANAGER_VETO;
   }
--- a/js/xpconnect/src/xpcprivate.h
+++ b/js/xpconnect/src/xpcprivate.h
@@ -125,17 +125,16 @@
 #include "nsString.h"
 #include "nsReadableUtils.h"
 
 #include "MainThreadUtils.h"
 
 #include "nsIConsoleService.h"
 
 #include "nsVariant.h"
-#include "nsIPropertyBag.h"
 #include "nsIProperty.h"
 #include "nsCOMArray.h"
 #include "nsTArray.h"
 #include "nsBaseHashtable.h"
 #include "nsHashKeys.h"
 #include "nsWrapperCache.h"
 #include "nsStringBuffer.h"
 #include "nsDataHashtable.h"
@@ -1648,26 +1647,16 @@ class nsXPCWrappedJSClass final : public
   JSObject* GetRootJSObject(JSContext* cx, JSObject* aJSObj);
 
   NS_IMETHOD CallMethod(nsXPCWrappedJS* wrapper, uint16_t methodIndex,
                         const nsXPTMethodInfo* info, nsXPTCMiniVariant* params);
 
   JSObject* CallQueryInterfaceOnJSObject(JSContext* cx, JSObject* jsobj,
                                          JS::HandleObject scope, REFNSIID aIID);
 
-  static nsresult BuildPropertyEnumerator(XPCCallContext& ccx, JSObject* aJSObj,
-                                          JS::HandleObject scope,
-                                          nsISimpleEnumerator** aEnumerate);
-
-  static nsresult GetNamedPropertyAsVariant(XPCCallContext& ccx,
-                                            JSObject* aJSObj,
-                                            JS::HandleObject scope,
-                                            const nsAString& aName,
-                                            nsIVariant** aResult);
-
  private:
   // aObj is the nsXPCWrappedJS's object. We used this as the callee (or |this|
   // if getter or setter).
   // aSyntheticException, if not null, is the exception we should be using.
   // If null, look for an exception on the JSContext hanging off the
   // XPCCallContext.
   static nsresult CheckForException(
       XPCCallContext& ccx, mozilla::dom::AutoEntryScript& aes,
@@ -1712,25 +1701,23 @@ class nsXPCWrappedJSClass final : public
 /*************************/
 // nsXPCWrappedJS is a wrapper for a single JSObject for use from native code.
 // nsXPCWrappedJS objects are chained together to represent the various
 // interface on the single underlying (possibly aggregate) JSObject.
 
 class nsXPCWrappedJS final : protected nsAutoXPTCStub,
                              public nsIXPConnectWrappedJSUnmarkGray,
                              public nsSupportsWeakReference,
-                             public nsIPropertyBag,
                              public XPCRootSetElem {
  public:
   NS_DECL_CYCLE_COLLECTING_ISUPPORTS
   NS_DECL_NSIXPCONNECTJSOBJECTHOLDER
   NS_DECL_NSIXPCONNECTWRAPPEDJS
   NS_DECL_NSIXPCONNECTWRAPPEDJSUNMARKGRAY
   NS_DECL_NSISUPPORTSWEAKREFERENCE
-  NS_DECL_NSIPROPERTYBAG
 
   NS_DECL_CYCLE_COLLECTION_SKIPPABLE_CLASS_AMBIGUOUS(nsXPCWrappedJS,
                                                      nsIXPConnectWrappedJS)
 
   NS_IMETHOD CallMethod(uint16_t methodIndex, const nsXPTMethodInfo* info,
                         nsXPTCMiniVariant* params) override;
 
   /*
@@ -1833,30 +1820,16 @@ class nsXPCWrappedJS final : protected n
 /***************************************************************************
 ****************************************************************************
 *
 * All manner of utility classes follow...
 *
 ****************************************************************************
 ***************************************************************************/
 
-class xpcProperty : public nsIProperty {
- public:
-  NS_DECL_ISUPPORTS
-  NS_DECL_NSIPROPERTY
-
-  xpcProperty(const char16_t* aName, uint32_t aNameLen, nsIVariant* aValue);
-
- private:
-  virtual ~xpcProperty() {}
-
-  nsString mName;
-  nsCOMPtr<nsIVariant> mValue;
-};
-
 namespace xpc {
 
 // A wrapper around JS iterators which presents an equivalent
 // nsISimpleEnumerator interface for their contents.
 class XPCWrappedJSIterator final : public nsISimpleEnumerator {
  public:
   NS_DECL_CYCLE_COLLECTION_CLASS(XPCWrappedJSIterator)
   NS_DECL_CYCLE_COLLECTING_ISUPPORTS
--- a/modules/libpref/init/all.js
+++ b/modules/libpref/init/all.js
@@ -1281,17 +1281,17 @@ pref("dom.popup_allowed_events", "change
 
 pref("dom.disable_open_click_delay", 1000);
 pref("dom.serviceWorkers.disable_open_click_delay", 1000);
 
 pref("dom.storage.enabled", true);
 // Whether or not LSNG (Next Generation Local Storage) is enabled.
 // See bug 1510410 for enabling this on Nightly.
 #ifdef NIGHTLY_BUILD
-pref("dom.storage.next_gen", true);
+pref("dom.storage.next_gen", false);
 #else
 pref("dom.storage.next_gen", false);
 #endif
 pref("dom.storage.default_quota",      5120);
 pref("dom.storage.shadow_writes", true);
 pref("dom.storage.snapshot_prefill", 16384);
 pref("dom.storage.snapshot_reusing", true);
 pref("dom.storage.testing", false);
--- a/netwerk/protocol/http/nsHttpConnectionMgr.cpp
+++ b/netwerk/protocol/http/nsHttpConnectionMgr.cpp
@@ -30,17 +30,17 @@
 #include "nsITransport.h"
 #include "nsInterfaceRequestorAgg.h"
 #include "nsIRequestContext.h"
 #include "nsISocketTransportService.h"
 #include <algorithm>
 #include "mozilla/ChaosMode.h"
 #include "mozilla/Unused.h"
 #include "nsIURI.h"
-#include "nsIPropertyBag.h"
+#include "nsIXPConnect.h"
 
 #include "mozilla/Move.h"
 #include "mozilla/Telemetry.h"
 
 namespace mozilla {
 namespace net {
 
 //-----------------------------------------------------------------------------
@@ -536,18 +536,17 @@ class nsCompleteUpgradeData : public ARe
 
  private:
   virtual ~nsCompleteUpgradeData() = default;
 };
 
 nsresult nsHttpConnectionMgr::CompleteUpgrade(
     nsAHttpConnection *aConn, nsIHttpUpgradeListener *aUpgradeListener) {
   // test if aUpgradeListener is a wrapped JsObject
-  // bit of a HACK
-  nsCOMPtr<nsIPropertyBag> wrapper = do_QueryInterface(aUpgradeListener);
+  nsCOMPtr<nsIXPConnectWrappedJS> wrapper = do_QueryInterface(aUpgradeListener);
 
   bool wrapped = !!wrapper;
 
   RefPtr<nsCompleteUpgradeData> data =
       new nsCompleteUpgradeData(aConn, aUpgradeListener, wrapped);
   return PostEvent(&nsHttpConnectionMgr::OnMsgCompleteUpgrade, 0, data);
 }