Merge mozilla-central to mozilla-inbound. CLOSED TREE
authorCsoregi Natalia <ncsoregi@mozilla.com>
Thu, 17 Jan 2019 23:59:29 +0200
changeset 511503 732c870d85fcb67eb1a9e770d6200058332462a0
parent 511502 e74eb5b1a8c24dde5473ae3d5409f5fc08ec4a1e (current diff)
parent 511431 1db2248f441513991df17a73112ffd9cc1846846 (diff)
child 511504 dd74d02dfc11bd73afe4a3e3ae2def4c866fa98f
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)
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 mozilla-inbound. CLOSED TREE
devtools/client/aboutdebugging-new/src/components/shared/ErrorMessage.css
devtools/client/aboutdebugging-new/src/components/shared/ErrorMessage.js
dom/media/eme/DataMutex.h
toolkit/components/sessionstore/nsISessionStoreUtils.idl
toolkit/components/sessionstore/nsSessionStoreUtils.cpp
toolkit/components/sessionstore/nsSessionStoreUtils.h
--- a/browser/app/blocklist.xml
+++ b/browser/app/blocklist.xml
@@ -1,10 +1,10 @@
 <?xml version='1.0' encoding='UTF-8'?>
-<blocklist lastupdate="1547206877909" xmlns="http://www.mozilla.org/2006/addons-blocklist">
+<blocklist lastupdate="1547658828472" xmlns="http://www.mozilla.org/2006/addons-blocklist">
   <emItems>
     <emItem blockID="i334" id="{0F827075-B026-42F3-885D-98981EE7B1AE}">
       <prefs/>
       <versionRange minVersion="0" maxVersion="*" severity="3"/>
     </emItem>
     <emItem blockID="i1211" id="flvto@hotger.com">
       <prefs/>
       <versionRange minVersion="0" maxVersion="*" severity="1"/>
@@ -2479,25 +2479,25 @@
       <infoURL>https://get.adobe.com/shockwave/</infoURL>
       <versionRange maxVersion="12.2.0.162" minVersion="0" severity="0" vulnerabilitystatus="1"/>
     </pluginItem>
     <pluginItem blockID="p1055">
       <match exp="DirectorShockwave\.plugin" name="filename"/>
       <infoURL>https://get.adobe.com/shockwave/</infoURL>
       <versionRange maxVersion="12.2.0.162" minVersion="0" severity="0" vulnerabilitystatus="1"/>
     </pluginItem>
+    <pluginItem blockID="832dc9ff-3314-4df2-abcf-7bd65a645371">
+      <match exp="(NPSWF32.*\.dll)|(NPSWF64.*\.dll)|(Flash\ Player\.plugin)" name="filename"/>
+      <infoURL>https://get.adobe.com/flashplayer/</infoURL>
+      <versionRange maxVersion="31.0.0.153" minVersion="0" severity="0" vulnerabilitystatus="1"/>
+    </pluginItem>
     <pluginItem blockID="49b843cc-a8fc-4ede-be0c-a0da56d0214f" os="Linux">
       <match exp="libflashplayer\.so" name="filename"/>
       <infoURL>https://get.adobe.com/flashplayer/</infoURL>
-      <versionRange maxVersion="30.0.0.113" minVersion="0" severity="0" vulnerabilitystatus="1"/>
-    </pluginItem>
-    <pluginItem blockID="832dc9ff-3314-4df2-abcf-7bd65a645371">
-      <match exp="(NPSWF32.*\.dll)|(NPSWF64.*\.dll)|(Flash\ Player\.plugin)" name="filename"/>
-      <infoURL>https://get.adobe.com/flashplayer/</infoURL>
-      <versionRange maxVersion="30.0.0.113" minVersion="0" severity="0" vulnerabilitystatus="1"/>
+      <versionRange maxVersion="31.0.0.153" minVersion="0" severity="0" vulnerabilitystatus="1"/>
     </pluginItem>
   </pluginItems>
   <gfxItems>
     <gfxBlacklistEntry blockID="g194">
       <os>WINNT 6.2</os>
       <vendor>0x1022</vendor>
       <feature>DIRECT2D</feature>
       <featureStatus>BLOCKED_DRIVER_VERSION</featureStatus>
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -5330,16 +5330,27 @@ var TabsProgressListener = {
       gBrowser.setBrowserSharing(aBrowser, {});
     }
     webrtcUI.forgetStreamsFromBrowser(aBrowser);
 
     gBrowser.getNotificationBox(aBrowser).removeTransientNotifications();
 
     FullZoom.onLocationChange(aLocationURI, false, aBrowser);
   },
+
+  onLinkIconAvailable(browser, dataURI, iconURI) {
+    if (!iconURI) {
+      return;
+    }
+    if (browser == gBrowser.selectedBrowser) {
+      // If the "Add Search Engine" page action is in the urlbar, its image
+      // needs to be set to the new icon, so call updateOpenSearchBadge.
+      BrowserSearch.updateOpenSearchBadge();
+    }
+  },
 };
 
 function nsBrowserAccess() { }
 
 nsBrowserAccess.prototype = {
   QueryInterface: ChromeUtils.generateQI([Ci.nsIBrowserDOMWindow]),
 
   _openURIInNewTab(aURI, aReferrer, aReferrerPolicy, aIsPrivate,
--- a/browser/base/content/tabbrowser.js
+++ b/browser/base/content/tabbrowser.js
@@ -355,16 +355,20 @@ window._gBrowser = {
       tab.setAttribute("usercontextid", userContextId);
       ContextualIdentityService.setTabStyle(tab);
     }
 
     this._tabForBrowser.set(browser, tab);
 
     this._appendStatusPanel();
 
+    // This is the initial browser, so it's usually active; the default is false
+    // so we have to update it:
+    browser.docShellIsActive = this.shouldActivateDocShell(browser);
+
     // Only necessary because of pageloader talos tests which access this.
     // Bug 1508171 covers removing this.
     this.initialBrowser = browser;
 
     let autoScrollPopup = browser._createAutoScrollPopup();
     autoScrollPopup.id = "autoscroller";
     document.getElementById("mainPopupSet").appendChild(autoScrollPopup);
     browser.setAttribute("autoscrollpopup", autoScrollPopup.id);
--- a/browser/base/content/test/webextensions/browser.ini
+++ b/browser/base/content/test/webextensions/browser.ini
@@ -14,17 +14,16 @@ support-files =
   browser_webext_update_perms2.xpi
   browser_webext_update_origins1.xpi
   browser_webext_update_origins2.xpi
   browser_webext_update.json
 
 [browser_extension_sideloading.js]
 [browser_extension_update_background.js]
 [browser_extension_update_background_noprompt.js]
-skip-if = (verify && debug && (os == 'mac')) || (os == 'win') || (os == 'linux') # Bug 1466043
 [browser_permissions_dismiss.js]
 [browser_permissions_installTrigger.js]
 [browser_permissions_local_file.js]
 [browser_permissions_mozAddonManager.js]
 [browser_permissions_optional.js]
 skip-if = !e10s
 [browser_permissions_pointerevent.js]
 [browser_permissions_unsigned.js]
--- a/browser/base/content/test/webextensions/browser_extension_update_background_noprompt.js
+++ b/browser/base/content/test/webextensions/browser_extension_update_background_noprompt.js
@@ -65,17 +65,17 @@ async function testNoPrompt(origUrl, id)
   is(addons.children.length, 0, "Have 0 updates in the PanelUI menu");
   await gCUITestUtils.hideMainMenu();
 
   ok(!sawPopup, "Should not have seen permissions notification");
 
   addon = await AddonManager.getAddonByID(id);
   is(addon.version, "2.0", "Update should have applied");
 
-  addon.uninstall();
+  await addon.uninstall();
   await SpecialPowers.popPrefEnv();
 }
 
 // Test that an update that adds new non-promptable permissions is just
 // applied without showing a notification dialog.
 add_task(() => testNoPrompt(`${BASE}/browser_webext_update_perms1.xpi`,
                             ID_PERMS));
 
--- a/browser/components/sessionstore/ContentRestore.jsm
+++ b/browser/components/sessionstore/ContentRestore.jsm
@@ -12,19 +12,16 @@ ChromeUtils.defineModuleGetter(this, "Fo
   "resource://gre/modules/FormData.jsm");
 ChromeUtils.defineModuleGetter(this, "SessionHistory",
   "resource://gre/modules/sessionstore/SessionHistory.jsm");
 ChromeUtils.defineModuleGetter(this, "SessionStorage",
   "resource:///modules/sessionstore/SessionStorage.jsm");
 ChromeUtils.defineModuleGetter(this, "Utils",
   "resource://gre/modules/sessionstore/Utils.jsm");
 
-const ssu = Cc["@mozilla.org/browser/sessionstore/utils;1"]
-              .getService(Ci.nsISessionStoreUtils);
-
 /**
  * This module implements the content side of session restoration. The chrome
  * side is handled by SessionStore.jsm. The functions in this module are called
  * by content-sessionStore.js based on messages received from SessionStore.jsm
  * (or, in one case, based on a "load" event). Each tab has its own
  * ContentRestore instance, constructed by content-sessionStore.js.
  *
  * In a typical restore, content-sessionStore.js will call the following based
@@ -135,17 +132,18 @@ ContentRestoreInternal.prototype = {
       this.restoreTabContent(null, false, callbacks.onLoadFinished);
     });
 
     webNavigation.sessionHistory.legacySHistory.addSHistoryListener(listener);
     this._historyListener = listener;
 
     // Make sure to reset the capabilities and attributes in case this tab gets
     // reused.
-    ssu.restoreDocShellCapabilities(this.docShell, tabData.disallow);
+    SessionStoreUtils.restoreDocShellCapabilities(this.docShell, tabData.disallow);
+
 
     if (tabData.storage && this.docShell instanceof Ci.nsIDocShell) {
       SessionStorage.restore(this.docShell, tabData.storage);
       delete tabData.storage;
     }
 
     // Add a progress listener to correctly handle browser.loadURI()
     // calls from foreign code.
@@ -299,17 +297,17 @@ ContentRestoreInternal.prototype = {
       // current |frame| and its descendants, if |data.url| is given but
       // doesn't match the loaded document's URL.
       return FormData.restore(frame, data);
     });
 
     // Restore scroll data.
     Utils.restoreFrameTreeData(window, scrollPositions, (frame, data) => {
       if (data.scroll) {
-        ssu.restoreScrollPosition(frame, data.scroll);
+        SessionStoreUtils.restoreScrollPosition(frame, data);
       }
     });
   },
 
   /**
    * Cancel an ongoing restore. This function can be called any time between
    * restoreHistory and restoreDocument.
    *
--- a/browser/components/sessionstore/ContentSessionStore.jsm
+++ b/browser/components/sessionstore/ContentSessionStore.jsm
@@ -9,30 +9,24 @@ var EXPORTED_SYMBOLS = ["ContentSessionS
 ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm", this);
 ChromeUtils.import("resource://gre/modules/Timer.jsm", this);
 ChromeUtils.import("resource://gre/modules/Services.jsm", this);
 
 function debug(msg) {
   Services.console.logStringMessage("SessionStoreContent: " + msg);
 }
 
-ChromeUtils.defineModuleGetter(this, "FormData",
-  "resource://gre/modules/FormData.jsm");
-
 ChromeUtils.defineModuleGetter(this, "ContentRestore",
   "resource:///modules/sessionstore/ContentRestore.jsm");
 ChromeUtils.defineModuleGetter(this, "SessionHistory",
   "resource://gre/modules/sessionstore/SessionHistory.jsm");
 ChromeUtils.defineModuleGetter(this, "SessionStorage",
   "resource:///modules/sessionstore/SessionStorage.jsm");
-
 ChromeUtils.defineModuleGetter(this, "Utils",
   "resource://gre/modules/sessionstore/Utils.jsm");
-const ssu = Cc["@mozilla.org/browser/sessionstore/utils;1"]
-              .getService(Ci.nsISessionStoreUtils);
 
 // A bound to the size of data to store for DOM Storage.
 const DOM_STORAGE_LIMIT_PREF = "browser.sessionstore.dom_storage_limit";
 
 // This pref controls whether or not we send updates to the parent on a timeout
 // or not, and should only be used for tests or debugging.
 const TIMEOUT_DISABLED_PREF = "browser.sessionstore.debug.no_auto_updates";
 
@@ -146,17 +140,17 @@ StateChangeNotifier.prototype.QueryInter
 /**
  * Listens for and handles content events that we need for the
  * session store service to be notified of state changes in content.
  */
 class EventListener extends Handler {
   constructor(store) {
     super(store);
 
-    ssu.addDynamicFrameFilteredListener(this.mm, "load", this, true);
+    SessionStoreUtils.addDynamicFrameFilteredListener(this.mm, "load", this, true);
   }
 
   handleEvent(event) {
     let {content} = this.mm;
 
     // Ignore load events from subframes.
     if (event.target != content.document) {
       return;
@@ -324,35 +318,37 @@ SessionHistoryListener.prototype.QueryIn
  *
  * Example:
  *   {scroll: "100,100", children: [null, null, {scroll: "200,200"}]}
  */
 class ScrollPositionListener extends Handler {
   constructor(store) {
     super(store);
 
-    ssu.addDynamicFrameFilteredListener(this.mm, "mozvisualscroll", this,
-                                        /* capture */ false, /* system group */ true);
+    SessionStoreUtils.addDynamicFrameFilteredListener(
+        this.mm, "mozvisualscroll", this,
+        /* capture */ false, /* system group */ true);
+
     this.stateChangeNotifier.addObserver(this);
   }
 
   handleEvent() {
     this.messageQueue.push("scroll", () => this.collect());
   }
 
   onPageLoadCompleted() {
     this.messageQueue.push("scroll", () => this.collect());
   }
 
   onPageLoadStarted() {
     this.messageQueue.push("scroll", () => null);
   }
 
   collect() {
-    return mapFrameTree(this.mm, ssu.collectScrollPosition.bind(ssu));
+    return mapFrameTree(this.mm, SessionStoreUtils.collectScrollPosition);
   }
 }
 
 /**
  * Listens for changes to input elements. Whenever the value of an input
  * element changes we will re-collect data for the current frame tree and send
  * a message to the parent process.
  *
@@ -367,30 +363,30 @@ class ScrollPositionListener extends Han
  *       {url: "http://sub.mozilla.org/", id: {input_id: "input value 2"}}
  *     ]
  *   }
  */
 class FormDataListener extends Handler {
   constructor(store) {
     super(store);
 
-    ssu.addDynamicFrameFilteredListener(this.mm, "input", this, true);
+    SessionStoreUtils.addDynamicFrameFilteredListener(this.mm, "input", this, true);
     this.stateChangeNotifier.addObserver(this);
   }
 
   handleEvent() {
     this.messageQueue.push("formdata", () => this.collect());
   }
 
   onPageLoadStarted() {
     this.messageQueue.push("formdata", () => null);
   }
 
   collect() {
-    return mapFrameTree(this.mm, FormData.collect);
+    return mapFrameTree(this.mm, SessionStoreUtils.collectFormData);
   }
 }
 
 /**
  * Listens for changes to docShell capabilities. Whenever a new load is started
  * we need to re-check the list of capabilities and send message when it has
  * changed.
  *
@@ -407,17 +403,17 @@ class DocShellCapabilitiesListener exten
      * that have just been collected. If nothing changed we won't send a message.
      */
     this._latestCapabilities = "";
 
     this.stateChangeNotifier.addObserver(this);
   }
 
   onPageLoadStarted() {
-    let caps = ssu.collectDocShellCapabilities(this.mm.docShell);
+    let caps = SessionStoreUtils.collectDocShellCapabilities(this.mm.docShell);
 
     // Send new data only when the capability list changes.
     if (caps != this._latestCapabilities) {
       this._latestCapabilities = caps;
       this.messageQueue.push("disallow", () => caps || null);
     }
   }
 }
@@ -440,46 +436,46 @@ class SessionStorageListener extends Han
     // a "storagechange" event. If however for some reason before we send these
     // changes we have to send over the entire sessions storage data, we just
     // reset these changes.
     this._changes = undefined;
 
     // The event listener waiting for MozSessionStorageChanged events.
     this._listener = null;
 
-    Services.obs.addObserver(this, "browser:purge-domain-data");
+    Services.obs.addObserver(this, "browser:purge-sessionStorage");
     this.stateChangeNotifier.addObserver(this);
     this.resetEventListener();
   }
 
   uninit() {
-    Services.obs.removeObserver(this, "browser:purge-domain-data");
+    Services.obs.removeObserver(this, "browser:purge-sessionStorage");
   }
 
   observe() {
     // Collect data on the next tick so that any other observer
     // that needs to purge data can do its work first.
     setTimeoutWithTarget(() => this.collect(), 0, this.mm.tabEventTarget);
   }
 
   resetChanges() {
     this._changes = undefined;
   }
 
   resetEventListener() {
     if (!this._listener) {
       this._listener =
-        ssu.addDynamicFrameFilteredListener(this.mm, "MozSessionStorageChanged",
-                                            this, true);
+        SessionStoreUtils.addDynamicFrameFilteredListener(this.mm, "MozSessionStorageChanged",
+                                                          this, true);
     }
   }
 
   removeEventListener() {
-    ssu.removeDynamicFrameFilteredListener(this.mm, "MozSessionStorageChanged",
-                                           this._listener, true);
+    SessionStoreUtils.removeDynamicFrameFilteredListener(this.mm, "MozSessionStorageChanged",
+                                                         this._listener, true);
     this._listener = null;
   }
 
   handleEvent(event) {
     if (!this.mm.docShell) {
       return;
     }
 
--- a/browser/components/sessionstore/SessionStorage.jsm
+++ b/browser/components/sessionstore/SessionStorage.jsm
@@ -3,19 +3,16 @@
 * You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 "use strict";
 
 var EXPORTED_SYMBOLS = ["SessionStorage"];
 
 ChromeUtils.import("resource://gre/modules/Services.jsm");
 
-const ssu = Cc["@mozilla.org/browser/sessionstore/utils;1"]
-              .createInstance(Ci.nsISessionStoreUtils);
-
 // A bound to the size of data to store for DOM Storage.
 const DOM_STORAGE_LIMIT_PREF = "browser.sessionstore.dom_storage_limit";
 
 // Returns the principal for a given |frame| contained in a given |docShell|.
 function getPrincipalForFrame(docShell, frame) {
   let ssm = Services.scriptSecurityManager;
   let uri = frame.document.documentURIObject;
   return ssm.getDocShellCodebasePrincipal(uri, docShell);
@@ -51,17 +48,17 @@ var SessionStorage = Object.freeze({
 /**
  * Calls the given callback |cb|, passing |frame| and each of its descendants.
  */
 function forEachNonDynamicChildFrame(frame, cb) {
   // Call for current frame.
   cb(frame);
 
   // Call the callback recursively for each descendant.
-  ssu.forEachNonDynamicChildFrame(frame, subframe => {
+  SessionStoreUtils.forEachNonDynamicChildFrame(frame, subframe => {
     return forEachNonDynamicChildFrame(subframe, cb);
   });
 }
 
 var SessionStorageInternal = {
   /**
    * Reads all session storage data from the given docShell.
    * @param content
--- a/browser/components/sessionstore/SessionStore.jsm
+++ b/browser/components/sessionstore/SessionStore.jsm
@@ -41,17 +41,17 @@ const MAX_CONCURRENT_TAB_RESTORES = 3;
 // pull the window back within the available screen area.
 const SCREEN_EDGE_SLOP = 8;
 
 // global notifications observed
 const OBSERVING = [
   "browser-window-before-show", "domwindowclosed",
   "quit-application-granted", "browser-lastwindow-close-granted",
   "quit-application", "browser:purge-session-history",
-  "browser:purge-domain-data",
+  "browser:purge-session-history-for-domain",
   "idle-daily", "clear-origin-attributes-data",
 ];
 
 // XUL Window properties to (re)store
 // Restored in restoreDimensions()
 const WINDOW_ATTRIBUTES = ["width", "height", "screenX", "screenY", "sizemode"];
 
 // Hideable window features to (re)store
@@ -781,17 +781,17 @@ var SessionStoreInternal = {
         break;
       case "quit-application":
         this.onQuitApplication(aData);
         break;
       case "browser:purge-session-history": // catch sanitization
         this.onPurgeSessionHistory();
         this._notifyOfClosedObjectsChange();
         break;
-      case "browser:purge-domain-data":
+      case "browser:purge-session-history-for-domain":
         this.onPurgeDomainData(aData);
         this._notifyOfClosedObjectsChange();
         break;
       case "nsPref:changed": // catch pref changes
         this.onPrefChange(aData);
         this._notifyOfClosedObjectsChange();
         break;
       case "idle-daily":
--- a/browser/components/sessionstore/test/browser_394759_purge.js
+++ b/browser/components/sessionstore/test/browser_394759_purge.js
@@ -3,21 +3,21 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 let {ForgetAboutSite} = ChromeUtils.import("resource://gre/modules/ForgetAboutSite.jsm", {});
 
 function promiseClearHistory() {
   return new Promise(resolve => {
     let observer = {
       observe(aSubject, aTopic, aData) {
-        Services.obs.removeObserver(this, "browser:purge-domain-data");
+        Services.obs.removeObserver(this, "browser:purge-session-history-for-domain");
         resolve();
       },
     };
-    Services.obs.addObserver(observer, "browser:purge-domain-data");
+    Services.obs.addObserver(observer, "browser:purge-session-history-for-domain");
   });
 }
 
 add_task(async function() {
   // utility functions
   function countClosedTabsByTitle(aClosedTabList, aTitle) {
     return aClosedTabList.filter(aData => aData.title == aTitle).length;
   }
--- a/browser/components/sessionstore/test/browser_464199.js
+++ b/browser/components/sessionstore/test/browser_464199.js
@@ -3,21 +3,21 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 let {ForgetAboutSite} = ChromeUtils.import("resource://gre/modules/ForgetAboutSite.jsm", {});
 
 function promiseClearHistory() {
   return new Promise(resolve => {
     let observer = {
       observe(aSubject, aTopic, aData) {
-        Services.obs.removeObserver(this, "browser:purge-domain-data");
+        Services.obs.removeObserver(this, "browser:purge-session-history-for-domain");
         resolve();
       },
     };
-    Services.obs.addObserver(observer, "browser:purge-domain-data");
+    Services.obs.addObserver(observer, "browser:purge-session-history-for-domain");
   });
 }
 
 add_task(async function() {
   /** Test for Bug 464199 **/
 
   const REMEMBER = Date.now(), FORGET = Math.random();
   let test_state = { windows: [{ "tabs": [{ "entries": [] }], _closedTabs: [
--- a/browser/components/sessionstore/test/browser_closed_objects_changed_notifications_tabs.js
+++ b/browser/components/sessionstore/test/browser_closed_objects_changed_notifications_tabs.js
@@ -93,21 +93,21 @@ add_task(async function test_closedObjec
   await awaitNotification(() => Services.obs.notifyObservers(null, "browser:purge-session-history"));
   assertNotificationCount(6);
 
   info("Opening and closing another tab.");
   await openAndCloseTab(win, "http://example.com/");
   assertNotificationCount(7);
 
   info("Purging domain data with no matches.");
-  Services.obs.notifyObservers(null, "browser:purge-domain-data", "mozilla.com");
+  Services.obs.notifyObservers(null, "browser:purge-session-history-for-domain", "mozilla.com");
   assertNotificationCount(7);
 
   info("Purging domain data with matches.");
-  await awaitNotification(() => Services.obs.notifyObservers(null, "browser:purge-domain-data", "example.com"));
+  await awaitNotification(() => Services.obs.notifyObservers(null, "browser:purge-session-history-for-domain", "example.com"));
   assertNotificationCount(8);
 
   info("Opening and closing another tab.");
   await openAndCloseTab(win, "http://example.com/");
   assertNotificationCount(9);
 
   await closeWindow(win);
   assertNotificationCount(10);
--- a/browser/components/sessionstore/test/browser_formdata.js
+++ b/browser/components/sessionstore/test/browser_formdata.js
@@ -98,18 +98,18 @@ add_task(async function test_url_check()
  */
 add_task(async function test_nested() {
   const URL = "data:text/html;charset=utf-8," +
               "<iframe src='data:text/html;charset=utf-8," +
               "<input autofocus=true>'/>";
 
   const FORM_DATA = {
     children: [{
+      url: "data:text/html;charset=utf-8,<input autofocus=true>",
       xpath: {"/xhtml:html/xhtml:body/xhtml:input": "m"},
-      url: "data:text/html;charset=utf-8,<input autofocus=true>",
     }],
   };
 
   // Create a tab with an iframe containing an input field.
   let tab = gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser, URL);
   let browser = tab.linkedBrowser;
   await promiseBrowserLoaded(browser);
 
--- a/browser/components/sessionstore/test/browser_frametree.js
+++ b/browser/components/sessionstore/test/browser_frametree.js
@@ -98,27 +98,22 @@ add_task(async function test_frametree_d
   is(await enumerateIndexes(browser), "1", "correct index 1");
 
   // Cleanup.
   BrowserTestUtils.removeTab(tab);
 });
 
 async function countNonDynamicFrames(browser) {
   return ContentTask.spawn(browser, null, async () => {
-    const ssu = Cc["@mozilla.org/browser/sessionstore/utils;1"]
-                  .getService(Ci.nsISessionStoreUtils);
-
     let count = 0;
-    ssu.forEachNonDynamicChildFrame(content, () => count++);
+    SessionStoreUtils.forEachNonDynamicChildFrame(content, () => count++);
     return count;
   });
 }
 
 async function enumerateIndexes(browser) {
   return ContentTask.spawn(browser, null, async () => {
-    const ssu = Cc["@mozilla.org/browser/sessionstore/utils;1"]
-                  .getService(Ci.nsISessionStoreUtils);
-
     let indexes = [];
-    ssu.forEachNonDynamicChildFrame(content, (frame, i) => indexes.push(i));
+    SessionStoreUtils.forEachNonDynamicChildFrame(
+        content, (frame, i) => indexes.push(i));
     return indexes.join(",");
   });
 }
--- a/browser/components/sessionstore/test/browser_sessionStorage.js
+++ b/browser/components/sessionstore/test/browser_sessionStorage.js
@@ -195,10 +195,13 @@ add_task(async function respect_privacy_
   [{state: {storage}}] = JSON.parse(ss.getClosedTabData(window));
   is(storage["http://mochi.test:8888"].test, OUTER_VALUE,
     "http sessionStorage data has been saved");
   is(storage["https://example.com"].test, INNER_VALUE,
     "https sessionStorage data has been saved");
 });
 
 function purgeDomainData(browser, domain) {
-  return sendMessage(browser, "ss-test:purgeDomainData", domain);
+  return new Promise(resolve => {
+    Services.clearData.deleteDataFromHost(
+      domain, true, Services.clearData.CLEAR_SESSION_HISTORY, resolve);
+  });
 }
--- a/browser/components/sessionstore/test/content.js
+++ b/browser/components/sessionstore/test/content.js
@@ -49,21 +49,16 @@ if (sessionHistory) {
  * This frame script is only loaded for sessionstore mochitests. It enables us
  * to modify and query docShell data when running with multiple processes.
  */
 
 addEventListener("hashchange", function() {
   sendAsyncMessage("ss-test:hashchange");
 });
 
-addMessageListener("ss-test:purgeDomainData", function({data: domain}) {
-  Services.obs.notifyObservers(null, "browser:purge-domain-data", domain);
-  content.setTimeout(() => sendAsyncMessage("ss-test:purgeDomainData"));
-});
-
 addMessageListener("ss-test:getStyleSheets", function(msg) {
   let sheets = content.document.styleSheets;
   let titles = Array.map(sheets, ss => [ss.title, ss.disabled]);
   sendSyncMessage("ss-test:getStyleSheets", titles);
 });
 
 addMessageListener("ss-test:enableStyleSheetsForSet", function(msg) {
   let sheets = content.document.styleSheets;
--- a/browser/components/urlbar/UrlbarInput.jsm
+++ b/browser/components/urlbar/UrlbarInput.jsm
@@ -343,33 +343,30 @@ class UrlbarInput {
       val = this.window.losslessDecodeURI(uri);
     }
     this.value = val;
   }
 
   /**
    * Starts a query based on the user input.
    *
-   * @param {string} [options.searchString]
-   *   The string the user entered in autocomplete.
    * @param {number} [options.lastKey]
    *   The last key the user entered (as a key code).
    */
   startQuery({
-    searchString = "",
     lastKey = null,
   } = {}) {
     this.controller.startQuery(new QueryContext({
       enableAutofill: UrlbarPrefs.get("autoFill"),
       isPrivate: this.isPrivate,
       lastKey,
       maxResults: UrlbarPrefs.get("maxRichResults"),
       muxer: "UnifiedComplete",
       providers: ["UnifiedComplete"],
-      searchString,
+      searchString: this.textValue,
     }));
   }
 
   typeRestrictToken(char) {
     this.inputField.value = char + " ";
 
     let event = this.document.createEvent("UIEvents");
     event.initUIEvent("input", true, false, this.window, 0);
@@ -660,31 +657,30 @@ class UrlbarInput {
       if (this.view.isOpen) {
         this.view.close();
       } else {
         this.startQuery();
       }
     }
   }
 
-  _on_input(event) {
-    let value = event.target.value;
+  _on_input() {
+    let value = this.textValue;
     this.valueIsTyped = true;
     this._untrimmedValue = value;
     this.window.gBrowser.userTypedValue = value;
 
     if (value) {
       this.setAttribute("usertyping", "true");
     } else {
       this.removeAttribute("usertyping");
     }
 
     // XXX Fill in lastKey, and add anything else we need.
     this.startQuery({
-      searchString: value,
       lastKey: null,
     });
   }
 
   _on_select(event) {
     if (!Services.clipboard.supportsSelectionClipboard()) {
       return;
     }
--- a/browser/components/urlbar/UrlbarProviderUnifiedComplete.jsm
+++ b/browser/components/urlbar/UrlbarProviderUnifiedComplete.jsm
@@ -85,16 +85,18 @@ class ProviderUnifiedComplete extends Ur
     let instance = {};
     this.queries.set(queryContext, instance);
 
     // Supported search params are:
     //  * "enable-actions": default to true.
     //  * "disable-private-actions": set for private windows, if not in permanent
     //    private browsing mode. ()
     //  * "private-window": the search is taking place in a private window.
+    //  * "prohibit-autofill": disable autofill, i.e., the first (heuristic)
+    //    result should never be an autofill result.
     //  * "user-context-id:#": the userContextId to use.
     let params = ["enable-actions"];
     params.push(`max-results:${queryContext.maxResults}`);
     // This is necessary because we insert matches one by one, thus we don't
     // want UnifiedComplete to reuse results.
     params.push(`insert-method:${UrlbarUtils.INSERTMETHOD.APPEND}`);
     // The Quantum Bar has its own telemetry measurement, thus disable old
     // telemetry logged by UnifiedComplete.
@@ -103,16 +105,19 @@ class ProviderUnifiedComplete extends Ur
       params.push("private-window");
       if (!PrivateBrowsingUtils.permanentPrivateBrowsing) {
         params.push("disable-private-actions");
       }
     }
     if (queryContext.userContextId) {
       params.push(`user-context-id:${queryContext.userContextId}}`);
     }
+    if (!queryContext.enableAutofill) {
+      params.push("prohibit-autofill");
+    }
 
     let urls = new Set();
     await new Promise(resolve => {
       let listener = {
         onSearchResult(_, result) {
           let {done, matches} = convertResultToMatches(queryContext, result, urls);
           for (let match of matches) {
             addCallback(UrlbarProviderUnifiedComplete, match);
@@ -174,36 +179,34 @@ function convertResultToMatches(context,
     // nsIAutocompleteResult always contains all of the matches, includes ones
     // we may have added already. This means we'll end up adding things in the
     // wrong order here, but that's a task for the UrlbarMuxer.
     let url = result.getFinalCompleteValueAt(i);
     if (urls.has(url)) {
       continue;
     }
     urls.add(url);
-    // Not used yet: result.getValueAt(i), result.getLabelAt(i)
+    // Not used yet: result.getLabelAt(i)
     let style = result.getStyleAt(i);
     let match = makeUrlbarMatch(context.tokens, {
       url,
       icon: result.getImageAt(i),
       style,
       comment: result.getCommentAt(i),
       firstToken: context.tokens[0],
     });
     // Should not happen, but better safe than sorry.
     if (!match) {
       continue;
     }
     matches.push(match);
-    // Manage autofill and preselected properties for the first match.
+    // Manage autofillValue and preselected properties for the first match.
     if (i == 0) {
-      if (style.includes("autofill") &&
-          result.defaultIndex == 0 &&
-          context.enableAutofill) {
-        context.autofill = true;
+      if (style.includes("autofill") && result.defaultIndex == 0) {
+        context.autofillValue = result.getValueAt(i);
       }
       if (style.includes("heuristic")) {
         context.preselected = true;
       }
     }
   }
   return {matches, done};
 }
--- a/browser/components/urlbar/UrlbarView.jsm
+++ b/browser/components/urlbar/UrlbarView.jsm
@@ -125,16 +125,22 @@ class UrlbarView {
   onQueryResults(queryContext) {
     // XXX For now, clear the results for each set received. We should really
     // be updating the existing list.
     this._rows.textContent = "";
     this._queryContext = queryContext;
     for (let resultIndex in queryContext.results) {
       this._addRow(resultIndex);
     }
+
+    if (queryContext.preselected) {
+      this._selected = this._rows.firstElementChild;
+      this._selected.toggleAttribute("selected", true);
+    }
+
     this._openPanel();
   }
 
   /**
    * Handles removing a result from the view when it is removed from the query,
    * and attempts to select the new result on the same row.
    *
    * This assumes that the result rows are in index order.
@@ -187,19 +193,16 @@ class UrlbarView {
 
     this._alignPanel();
 
     // TODO: Search one off buttons are a stub right now.
     //       We'll need to set them up properly.
     this.oneOffSearchButtons;
 
     this.panel.openPopup(this.input.textbox.closest("toolbar"), "after_end", 0, -1);
-
-    this._selected = this._rows.firstElementChild;
-    this._selected.toggleAttribute("selected", true);
   }
 
   _alignPanel() {
     // Make the panel span the width of the window.
     let documentRect =
       this._getBoundsWithoutFlushing(this.document.documentElement);
     let width = documentRect.right - documentRect.left;
     this.panel.setAttribute("width", width);
--- a/browser/components/urlbar/tests/browser/browser_UrlbarInput_unit.js
+++ b/browser/components/urlbar/tests/browser/browser_UrlbarInput_unit.js
@@ -94,20 +94,19 @@ add_task(async function setup() {
     panel,
     controller: fakeController,
   };
 
   input = new UrlbarInput(inputOptions);
 });
 
 add_task(function test_input_starts_query() {
+  input.inputField.value = "search";
   input.handleEvent({
-    target: {
-      value: "search",
-    },
+    target: input.inputField,
     type: "input",
   });
 
   checkStartQueryCall(fakeController.startQuery, {
     searchString: "search",
     isPrivate: false,
     maxResults: UrlbarPrefs.get("maxRichResults"),
   });
@@ -117,20 +116,19 @@ add_task(function test_input_starts_quer
 
 add_task(function test_input_with_private_browsing() {
   PrivateBrowsingUtils.isWindowPrivate.returns(true);
 
   // Rather than using the global input here, we create a new instance which
   // will use the updated return value of the private browsing stub.
   let privateInput = new UrlbarInput(inputOptions);
 
+  privateInput.inputField.value = "search";
   privateInput.handleEvent({
-    target: {
-      value: "search",
-    },
+    target: privateInput.inputField,
     type: "input",
   });
 
   checkStartQueryCall(fakeController.startQuery, {
     searchString: "search",
     isPrivate: true,
   });
 
--- a/browser/docs/AddressBar.rst
+++ b/browser/docs/AddressBar.rst
@@ -70,17 +70,18 @@ It is augmented as it progresses through
     muxer; // {string} Name of a registered muxer. Muxers can be registered
            // through the UrlbarProvidersManager.
     providers; // {array} List of registered provider names. Providers can be
                // registered through the UrlbarProvidersManager.
     sources; // {array} If provided is the list of sources, as defined by
              // MATCH_SOURCE.*, that can be returned by the model.
 
     // Properties added by the Model.
-    autofill; // {boolean} whether the first match is an autofill match.
+    autofillValue; // {string} the text value that should be autofilled in the
+                   // input, if any.
     preselected; // {boolean} whether the first match should be preselected.
     results; // {array} list of UrlbarMatch objects.
     tokens; // {array} tokens extracted from the searchString, each token is an
             // object in the form {type, value}.
   }
 
 
 The Model
--- a/browser/modules/SiteDataManager.jsm
+++ b/browser/modules/SiteDataManager.jsm
@@ -337,18 +337,19 @@ var SiteDataManager = {
     await this._getQuotaUsage();
     this._updateAppCache();
 
     let unknownHost = "";
     let promises = [];
     for (let host of hosts) {
       let site = this._sites.get(host);
       if (site) {
-        // Clear localstorage.
-        Services.obs.notifyObservers(null, "browser:purge-domain-data", host);
+        // Clear localStorage & sessionStorage
+        Services.obs.notifyObservers(null, "extension:purge-localStorage", host);
+        Services.obs.notifyObservers(null, "extension:purge-sessionStorage", host);
         this._removePermission(site);
         this._removeAppCache(site);
         this._removeCookies(site);
         promises.push(ServiceWorkerCleanUp.removeFromHost(host));
         promises.push(this._removeQuotaUsage(site));
       } else {
         unknownHost = host;
         break;
--- a/build/moz.configure/old.configure
+++ b/build/moz.configure/old.configure
@@ -135,17 +135,17 @@ def prepare_configure(old_configure, moz
             die('Generated old-configure is empty! Check that your autoconf 2.13 program works!')
 
         # Make old-configure append to config.log, where we put our own log.
         # This could be done with a m4 macro, but it's way easier this way
         if config_log:
             path = config_log.baseFilename
         else:
             path = '/dev/null'
-        script = script.replace('>./config.log', '>>%s' % path)
+        script = script.replace('>./config.log', '>>%s' % quote(normsep(path)))
 
         with open(old_configure, 'wb') as fh:
             fh.write(script)
 
     cmd = [shell, old_configure]
     with encoded_open('old-configure.vars', 'w') as out:
         log.debug('Injecting the following to old-configure:')
 
--- a/devtools/client/aboutdebugging-new/aboutdebugging.css
+++ b/devtools/client/aboutdebugging-new/aboutdebugging.css
@@ -17,13 +17,13 @@
 @import "resource://devtools/client/aboutdebugging-new/src/components/connect/ConnectSteps.css";
 @import "resource://devtools/client/aboutdebugging-new/src/components/connect/NetworkLocationsForm.css";
 @import "resource://devtools/client/aboutdebugging-new/src/components/connect/NetworkLocationsList.css";
 @import "resource://devtools/client/aboutdebugging-new/src/components/debugtarget/DebugTargetItem.css";
 @import "resource://devtools/client/aboutdebugging-new/src/components/debugtarget/DebugTargetList.css";
 @import "resource://devtools/client/aboutdebugging-new/src/components/debugtarget/DebugTargetPane.css";
 @import "resource://devtools/client/aboutdebugging-new/src/components/debugtarget/ExtensionDetail.css";
 @import "resource://devtools/client/aboutdebugging-new/src/components/debugtarget/WorkerDetail.css";
-@import "resource://devtools/client/aboutdebugging-new/src/components/shared/ErrorMessage.css";
+@import "resource://devtools/client/aboutdebugging-new/src/components/shared/Message.css";
 @import "resource://devtools/client/aboutdebugging-new/src/components/sidebar/Sidebar.css";
 @import "resource://devtools/client/aboutdebugging-new/src/components/sidebar/SidebarFixedItem.css";
 @import "resource://devtools/client/aboutdebugging-new/src/components/sidebar/SidebarItem.css";
 @import "resource://devtools/client/aboutdebugging-new/src/components/sidebar/SidebarRuntimeItem.css";
--- a/devtools/client/aboutdebugging-new/src/base.css
+++ b/devtools/client/aboutdebugging-new/src/base.css
@@ -25,19 +25,22 @@
 
   --link-color: #0a8dff;
   --link-color-active: #003eaa;
   --link-color-hover: #0060df;
 
   /* Colors from Photon */
   --success-50: #30e60b;
   --warning-50: #ffe900;
+  --warning-90: #3e2800;
   --error-50: #ff0039;
+  --error-60: #d70022;
   --highlight-50: #0a84ff;
   --grey-30: #d7d7db; /* for ui, no special semantic */
+  --white-100: #fff; /* for ui, no special semantic */
 
   /* Global layout vars */
   --page-width: 664px;
   --base-distance: 4px;
 
   /* Global styles */
   --base-font-style: message-box;
   --base-font-size: 15px; /* root font of 11px * 1.36em = 15px */
--- a/devtools/client/aboutdebugging-new/src/components/debugtarget/TemporaryExtensionInstaller.js
+++ b/devtools/client/aboutdebugging-new/src/components/debugtarget/TemporaryExtensionInstaller.js
@@ -6,19 +6,20 @@
 
 const { createFactory, PureComponent } = require("devtools/client/shared/vendor/react");
 const dom = require("devtools/client/shared/vendor/react-dom-factories");
 const PropTypes = require("devtools/client/shared/vendor/react-prop-types");
 
 const FluentReact = require("devtools/client/shared/vendor/fluent-react");
 const Localized = createFactory(FluentReact.Localized);
 
-const ErrorMessage = createFactory(require("../shared/ErrorMessage"));
+const Message = createFactory(require("../shared/Message"));
 
 const Actions = require("../../actions/index");
+const { MESSAGE_LEVEL } = require("../../constants");
 
 /**
  * This component provides an installer for temporary extension.
  */
 class TemporaryExtensionInstaller extends PureComponent {
   static get propTypes() {
     return {
       dispatch: PropTypes.func.isRequired,
@@ -41,24 +42,33 @@ class TemporaryExtensionInstaller extend
         dom.button(
           {
             className: "default-button js-temporary-extension-install-button",
             onClick: e => this.install(),
           },
           "Load Temporary Add-on…"
         )
       ),
-      temporaryInstallError ? ErrorMessage(
+      temporaryInstallError ? Message(
         {
-          errorDescriptionKey: "about-debugging-tmp-extension-install-error",
+          level: MESSAGE_LEVEL.ERROR,
         },
         dom.div(
-          {
-            className: "technical-text",
-          },
-          temporaryInstallError
+          {},
+          Localized(
+            {
+              id: "about-debugging-tmp-extension-install-error",
+            },
+            dom.span({}, "There was an error during the temporary add-on installation")
+          ),
+          dom.div(
+            {
+              className: "technical-text",
+            },
+            temporaryInstallError
+          )
         )
       ) : null
     );
   }
 }
 
 module.exports = TemporaryExtensionInstaller;
rename from devtools/client/aboutdebugging-new/src/components/shared/ErrorMessage.css
rename to devtools/client/aboutdebugging-new/src/components/shared/Message.css
--- a/devtools/client/aboutdebugging-new/src/components/shared/ErrorMessage.css
+++ b/devtools/client/aboutdebugging-new/src/components/shared/Message.css
@@ -1,30 +1,41 @@
 /* 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/. */
 
-.error-message {
-  /* Temporary color chosen to match error background used in about:addons
-   * Pending UX in Bug 1509091 */
-  background-color: #FFE8E9;
+.message--level-error {
+  --message-color: var(--white-100);
+  --message-background-color: var(--error-60);
+}
 
-  /* Temporary color chosen to match chrome://mozapps/skin/extensions/alerticon-error.svg
-   * Pending UX in Bug 1509091 */
-  color: #E62117;
-
-  margin: calc(var(--base-distance) * 2) 0;
-  padding: var(--base-distance) calc(var(--base-distance) * 3);
+.message--level-warning {
+  --message-color: var(--warning-90);
+  --message-background-color: var(--warning-50);
 }
 
+
 /*
- * Layout of the error message header
+ * Layout of the message
  *
- *  +--------+----------------+
- *  | Icon   | Header message |
- *  +--------+----------------+
+ *  +--------+-----------------+
+ *  | Icon   | Message content |
+ *  |        | (several lines) |
+ *  |        | (     ...     ) |
+ *  +--------+-----------------+
  */
-.error-message__header {
-  align-items: center;
+.message {
+  background-color: var(--message-background-color);
+  border-radius: var(--base-distance);
+  color: var(--message-color);
   display: grid;
+  fill: var(--message-color);
+  grid-column-gap: var(--base-distance);
   grid-template-columns: calc(var(--base-distance) * 6) 1fr;
-  font-weight: bold;
+  margin: calc(var(--base-distance) * 2) 0;
+  padding: var(--base-distance);
+
+  -moz-context-properties: fill;
 }
+
+.message__icon {
+  margin: var(--base-distance);
+}
rename from devtools/client/aboutdebugging-new/src/components/shared/ErrorMessage.js
rename to devtools/client/aboutdebugging-new/src/components/shared/Message.js
--- a/devtools/client/aboutdebugging-new/src/components/shared/ErrorMessage.js
+++ b/devtools/client/aboutdebugging-new/src/components/shared/Message.js
@@ -1,56 +1,51 @@
 /* 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 { createFactory, PureComponent } = require("devtools/client/shared/vendor/react");
+const { PureComponent } = require("devtools/client/shared/vendor/react");
 const dom = require("devtools/client/shared/vendor/react-dom-factories");
 const PropTypes = require("devtools/client/shared/vendor/react-prop-types");
 
-const FluentReact = require("devtools/client/shared/vendor/fluent-react");
-const Localized = createFactory(FluentReact.Localized);
+const { MESSAGE_LEVEL } = require("../../constants");
+
+const ICONS = {
+  // Reuse the warning icon for errors. Waiting for the proper icon in Bug 1520191.
+  [MESSAGE_LEVEL.ERROR]: "chrome://global/skin/icons/warning.svg",
+  [MESSAGE_LEVEL.WARNING]: "chrome://global/skin/icons/warning.svg",
+};
 
 /**
- * This component is designed to display an error message. It is composed of a header
- * displaying an error icon followed by a provided localized error description.
- * Children passed to this component will be displayed beflow the message header.
+ * This component is designed to display a photon-style message bar. The component is
+ * responsible for displaying the message container with the appropriate icon. The content
+ * of the message should be passed as the children of this component.
  */
-class ErrorMessage extends PureComponent {
+class Message extends PureComponent {
   static get propTypes() {
     return {
       children: PropTypes.node.isRequired,
-      // Should match a valid localized string key.
-      errorDescriptionKey: PropTypes.string.isRequired,
+      level: PropTypes.oneOf(Object.values(MESSAGE_LEVEL)).isRequired,
     };
   }
 
   render() {
-    return dom.div(
+    const { level } = this.props;
+    const iconSrc = ICONS[level];
+
+    return dom.aside(
       {
-        className: "error-message js-error-message",
+        className: `message message--level-${level} js-message`,
       },
-      dom.div(
+      dom.img(
         {
-          className: "error-message__header",
-        },
-        dom.img(
-          {
-            // Temporary image chosen to match error container in about:addons.
-            // Pending UX in Bug 1509091
-            src: "chrome://mozapps/skin/extensions/alerticon-error.svg",
-          }
-        ),
-        Localized(
-          {
-            id: this.props.errorDescriptionKey,
-          },
-          dom.span({}, this.props.errorDescriptionKey)
-        )
+          className: "message__icon",
+          src: iconSrc,
+        }
       ),
       this.props.children
     );
   }
 }
 
-module.exports = ErrorMessage;
+module.exports = Message;
--- a/devtools/client/aboutdebugging-new/src/components/shared/moz.build
+++ b/devtools/client/aboutdebugging-new/src/components/shared/moz.build
@@ -1,8 +1,8 @@
 # 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/.
 
 DevToolsModules(
-    'ErrorMessage.css',
-    'ErrorMessage.js',
+    'Message.css',
+    'Message.js',
 )
--- a/devtools/client/aboutdebugging-new/src/constants.js
+++ b/devtools/client/aboutdebugging-new/src/constants.js
@@ -64,16 +64,21 @@ const DEBUG_TARGET_PANE = {
   INSTALLED_EXTENSION: "installedExtension",
   OTHER_WORKER: "otherWorker",
   SERVICE_WORKER: "serviceWorker",
   SHARED_WORKER: "sharedWorker",
   TAB: "tab",
   TEMPORARY_EXTENSION: "temporaryExtension",
 };
 
+const MESSAGE_LEVEL = {
+  ERROR: "error",
+  WARNING: "warning",
+};
+
 const PAGE_TYPES = {
   RUNTIME: "runtime",
   CONNECT: "connect",
 };
 
 const PREFERENCES = {
   // Temporary preference without any default value until network locations are enabled.
   NETWORK_ENABLED: "devtools.aboutdebugging.network",
@@ -109,16 +114,17 @@ const USB_STATES = {
   ENABLED_USB: "ENABLED_USB",
   UPDATING_USB: "UPDATING_USB",
 };
 
 // flatten constants
 module.exports = Object.assign({}, {
   DEBUG_TARGETS,
   DEBUG_TARGET_PANE,
+  MESSAGE_LEVEL,
   PAGE_TYPES,
   PREFERENCES,
   RUNTIME_PREFERENCE,
   RUNTIMES,
   SERVICE_WORKER_FETCH_STATES,
   SERVICE_WORKER_STATUSES,
   USB_STATES,
 }, actionTypes);
--- a/devtools/client/aboutdebugging-new/test/browser/browser_aboutdebugging_temporary_addon_install_error.js
+++ b/devtools/client/aboutdebugging-new/test/browser/browser_aboutdebugging_temporary_addon_install_error.js
@@ -19,26 +19,26 @@ add_task(async function() {
   const { document, tab } = await openAboutDebugging();
 
   info("Install a bad extension");
   // Do not use installTemporaryAddon here since the install will fail.
   prepareMockFilePicker(BAD_EXTENSION_PATH);
   document.querySelector(".js-temporary-extension-install-button").click();
 
   info("Wait until the install error message appears");
-  await waitUntil(() => document.querySelector(".js-error-message"));
-  const installError = document.querySelector(".js-error-message");
+  await waitUntil(() => document.querySelector(".js-message"));
+  const installError = document.querySelector(".js-message");
   ok(installError.textContent.includes("JSON.parse: unexpected keyword"),
     "The expected installation error is displayed: " + installError.textContent);
 
   info("Install a valid extension to make the message disappear");
   await installTemporaryExtension(EXTENSION_PATH, EXTENSION_NAME, document);
 
   info("Wait until the error message disappears");
-  await waitUntil(() => !document.querySelector(".js-error-message"));
+  await waitUntil(() => !document.querySelector(".js-message"));
 
   info("Wait for the temporary addon to be displayed as a debug target");
   await waitUntil(() => findDebugTargetByText(EXTENSION_NAME, document));
 
   await removeTemporaryExtension(EXTENSION_NAME, document);
 
   await removeTab(tab);
 });
--- a/devtools/client/inspector/test/head.js
+++ b/devtools/client/inspector/test/head.js
@@ -860,17 +860,17 @@ async function getDisplayedNodeTextConte
  * @param {String} selector
  *        The selector in the rule-view to look for the property in
  * @param {String} property
  *        The name of the property
  * @param {Boolean} show
  *        If true, the shapes highlighter is being shown. If false, it is being hidden
  * @param {Options} options
  *        Config option for the shapes highlighter. Contains:
- *        - {Boolean} transformMode: wether to show the highlighter in transforms mode
+ *        - {Boolean} transformMode: whether to show the highlighter in transforms mode
  */
 async function toggleShapesHighlighter(view, selector, property, show, options = {}) {
   info(`Toggle shapes highlighter ${show ? "on" : "off"} for ${property} on ${selector}`);
   const highlighters = view.highlighters;
   const container = getRuleViewProperty(view, selector, property).valueSpan;
   const shapesToggle = container.querySelector(".ruleview-shapeswatch");
 
   const metaKey = options.transformMode;
--- a/devtools/server/actors/highlighters.css
+++ b/devtools/server/actors/highlighters.css
@@ -62,30 +62,40 @@
 }
 
 :-moz-native-anonymous .highlighter-container.box-model {
   /* Make the box-model container have a z-index other than auto so it always sits above
      other highlighters. */
   z-index: 1;
 }
 
+:-moz-native-anonymous .highlighter-container.flexbox {
+  /* Make the flexbox highlighter have a z-index greater than the box-model so
+     it always sits above it. */
+  z-index: 2;
+}
+
 :-moz-native-anonymous .highlighter-container [hidden] {
   display: none;
 }
 
 :-moz-native-anonymous .highlighter-container [dragging] {
   cursor: grabbing;
 }
 
 /* Box Model Highlighter */
 
 :-moz-native-anonymous .box-model-regions {
   opacity: 0.6;
 }
 
+:-moz-native-anonymous .box-model-regions [half-faded] {
+  opacity: 0.5;
+}
+
 /* Box model regions can be faded (see the onlyRegionArea option in
    highlighters.js) in order to only display certain regions. */
 :-moz-native-anonymous .box-model-regions [faded] {
   display: none;
 }
 
 :-moz-native-anonymous .box-model-content {
   fill: var(--highlighter-content-color);
@@ -140,16 +150,19 @@
 
   border-radius: 3px;
   background: var(--highlighter-bubble-background-color) no-repeat padding-box;
 
   color: var(--highlighter-bubble-text-color);
   text-shadow: none;
 
   border: 1px solid var(--highlighter-bubble-border-color);
+
+  /* The infobar should always be above every other highlighter when it is visible */
+  z-index: 2147483647;
 }
 
 /* Arrows */
 
 :-moz-native-anonymous [class$=infobar-container] > [class$=infobar]:before {
   left: calc(50% - var(--highlighter-bubble-arrow-size));
   border: var(--highlighter-bubble-arrow-size) solid var(--highlighter-bubble-border-color);
 }
--- a/devtools/server/actors/highlighters/accessible.js
+++ b/devtools/server/actors/highlighters/accessible.js
@@ -22,31 +22,30 @@ loader.lazyRequireGetter(this, "Infobar"
  *
  * Usage example:
  *
  * let h = new AccessibleHighlighter(env);
  * h.show(node, { x, y, w, h, [duration] });
  * h.hide();
  * h.destroy();
  *
- * Available options:
- *         - {Number} x
- *           x coordinate of the top left corner of the accessible object
- *         - {Number} y
- *           y coordinate of the top left corner of the accessible object
- *         - {Number} w
- *           width of the the accessible object
- *         - {Number} h
- *           height of the the accessible object
- *         - {Number} duration
- *           Duration of time that the highlighter should be shown.
- *         - {String|null} name
- *           name of the the accessible object
- *         - {String} role
- *           role of the the accessible object
+ * @param {Number} options.x
+ *        X coordinate of the top left corner of the accessible object
+ * @param {Number} options.y
+ *        Y coordinate of the top left corner of the accessible object
+ * @param {Number} options.w
+ *        Width of the the accessible object
+ * @param {Number} options.h
+ *        Height of the the accessible object
+ * @param {Number} options.duration
+ *        Duration of time that the highlighter should be shown.
+ * @param {String|null} options.name
+ *        Name of the the accessible object
+ * @param {String} options.role
+ *        Role of the the accessible object
  *
  * Structure:
  * <div class="highlighter-container" aria-hidden="true">
  *   <div class="accessible-root">
  *     <svg class="accessible-elements" hidden="true">
  *       <path class="accessible-bounds" points="..." />
  *     </svg>
  *     <div class="accessible-infobar-container">
--- a/devtools/server/actors/highlighters/box-model.js
+++ b/devtools/server/actors/highlighters/box-model.js
@@ -10,22 +10,26 @@ const {
   createNode,
   createSVGNode,
   getBindingElementAndPseudo,
   hasPseudoClassLock,
   isNodeValid,
   moveInfobar,
 } = require("./utils/markup");
 const {
+  findFlexOrGridParentContainerForNode,
+  getCurrentZoom,
   setIgnoreLayoutChanges,
-  getCurrentZoom,
  } = require("devtools/shared/layout/utils");
 const { getNodeDisplayName } = require("devtools/server/actors/inspector/utils");
 const nodeConstants = require("devtools/shared/dom-node-constants");
 
+loader.lazyRequireGetter(this, "FlexboxHighlighter",
+  "devtools/server/actors/highlighters/flexbox", true);
+
 // Note that the order of items in this array is important because it is used
 // for drawing the BoxModelHighlighter's path elements correctly.
 const BOX_MODEL_REGIONS = ["margin", "border", "padding", "content"];
 const BOX_MODEL_SIDES = ["top", "right", "bottom", "left"];
 // Width of boxmodelhighlighter guides
 const GUIDE_STROKE_WIDTH = 1;
 // FIXME: add ":visited" and ":link" after bug 713106 is fixed
 const PSEUDO_CLASSES = [":hover", ":active", ":focus", ":focus-within"];
@@ -38,33 +42,31 @@ const PSEUDO_CLASSES = [":hover", ":acti
  *
  * Usage example:
  *
  * let h = new BoxModelHighlighter(env);
  * h.show(node, options);
  * h.hide();
  * h.destroy();
  *
- * Available options:
- * - region {String}
- *   "content", "padding", "border" or "margin"
- *   This specifies the region that the guides should outline.
- *   Defaults to "content"
- * - hideGuides {Boolean}
- *   Defaults to false
- * - hideInfoBar {Boolean}
- *   Defaults to false
- * - showOnly {String}
- *   "content", "padding", "border" or "margin"
- *   If set, only this region will be highlighted. Use with onlyRegionArea to
- *   only highlight the area of the region.
- * - onlyRegionArea {Boolean}
- *   This can be set to true to make each region's box only highlight the area
- *   of the corresponding region rather than the area of nested regions too.
- *   This is useful when used with showOnly.
+ * @param {String} options.region
+ *        Specifies the region that the guides should outline:
+ *          "content" (default), "padding", "border" or "margin".
+ * @param {Boolean} options.hideGuides
+ *        Defaults to false
+ * @param {Boolean} options.hideInfoBar
+ *        Defaults to false
+ * @param {String} options.showOnly
+ *        If set, only this region will be highlighted. Use with onlyRegionArea
+ *        to only highlight the area of the region:
+ *        "content", "padding", "border" or "margin"
+ * @param {Boolean} options.onlyRegionArea
+ *        This can be set to true to make each region's box only highlight the
+ *        area of the corresponding region rather than the area of nested
+ *        regions too. This is useful when used with showOnly.
  *
  * Structure:
  * <div class="highlighter-container">
  *   <div class="box-model-root">
  *     <svg class="box-model-elements" hidden="true">
  *       <g class="box-model-regions">
  *         <path class="box-model-margin" points="..." />
  *         <path class="box-model-border" points="..." />
@@ -269,19 +271,33 @@ class BoxModelHighlighter extends AutoRe
     this.highlighterEnv.off("will-navigate", this.onWillNavigate);
 
     const { pageListenerTarget } = this.highlighterEnv;
     if (pageListenerTarget) {
       pageListenerTarget.removeEventListener("pagehide", this.onPageHide);
     }
 
     this.markup.destroy();
+
+    if (this._flexboxHighlighter) {
+      this._flexboxHighlighter.destroy();
+      this._flexboxHighlighter = null;
+    }
+
     AutoRefreshHighlighter.prototype.destroy.call(this);
   }
 
+  get flexboxHighlighter() {
+    if (!this._flexboxHighlighter) {
+      this._flexboxHighlighter = new FlexboxHighlighter(this.highlighterEnv);
+    }
+
+    return this._flexboxHighlighter;
+  }
+
   getElement(id) {
     return this.markup.getElement(this.ID_CLASS_PREFIX + id);
   }
 
   /**
    * Override the AutoRefreshHighlighter's _isNodeValid method to also return true for
    * text nodes since these can also be highlighted.
    * @param {DOMNode} node
@@ -325,59 +341,152 @@ class BoxModelHighlighter extends AutoRe
   }
 
   /**
    * Update the highlighter on the current highlighted node (the one that was
    * passed as an argument to show(node)).
    * Should be called whenever node size or attributes change
    */
   _update() {
+    const node = this.currentNode;
     let shown = false;
     setIgnoreLayoutChanges(true);
 
+    // We need to set this option before calling _updateBoxModel().
+    this.options.isFlexboxContainer =
+      !!(node && node.getAsFlexContainer && node.getAsFlexContainer());
+
     if (this._updateBoxModel()) {
       // Show the infobar only if configured to do so and the node is an element or a text
       // node.
       if (!this.options.hideInfoBar && (
-          this.currentNode.nodeType === this.currentNode.ELEMENT_NODE ||
-          this.currentNode.nodeType === this.currentNode.TEXT_NODE)) {
+          node.nodeType === node.ELEMENT_NODE ||
+          node.nodeType === node.TEXT_NODE)) {
         this._showInfobar();
       } else {
         this._hideInfobar();
       }
       this._showBoxModel();
       shown = true;
     } else {
       // Nothing to highlight (0px rectangle like a <script> tag for instance)
       this._hide();
     }
 
+    this._updateFlexboxHighlighter();
+
     setIgnoreLayoutChanges(false, this.highlighterEnv.window.document.documentElement);
 
     return shown;
   }
 
+  /**
+   * Update the flexbox highlighter on the current highlighted node. Show it
+   * if the current node is a flexbox container or flexbox item.
+   */
+  _updateFlexboxHighlighter() {
+    this._hideFlexboxHighlighter();
+
+    if (!this.currentNode) {
+      return;
+    }
+
+    const options = {};
+    let node = this.currentNode;
+    let showFlexboxHighlighter = false;
+
+    // If the current node is a flexbox container then remove the box model
+    // content region and make the other regions a little more transparent so
+    // that the flexbox highlighting is emphasized.
+    if (this.options.isFlexboxContainer) {
+      for (const region of BOX_MODEL_REGIONS) {
+        const box = this.getElement(region);
+
+        if (region === "content") {
+          // Hide the content region.
+          box.removeAttribute("d");
+        } else {
+          // Make the non-content regions a little more transparent.
+          box.setAttribute("half-faded", "");
+        }
+      }
+
+      // Stop the flexbox highlighter from showing an outline (the guides do a
+      // great job of that themselves).
+      options.noContainerOutline = true;
+
+      // Toggle the flag to show the flexbox highlighter.
+      showFlexboxHighlighter = true;
+    } else {
+      // The highlighted element is not a flexbox container so we need to check
+      // if it is a flex item.
+      const container = findFlexOrGridParentContainerForNode(node, "flex");
+
+      if (container) {
+        for (const region of BOX_MODEL_REGIONS) {
+          const box = this.getElement(region);
+
+          // Ensure that the box model regions are not faded. The content region
+          // will reappear because it is regenerated by the highlighter.
+          box.setAttribute("half-faded", "");
+        }
+
+        // Hide the guides because we are only interested in the flex item's
+        // box model regions in relation to the flexbox overlay (and to make
+        // things less ugly).
+        this._hideGuides();
+
+        node = container;
+
+        // Toggle the flag to show the flexbox highlighter.
+        showFlexboxHighlighter = true;
+      }
+    }
+
+    if (showFlexboxHighlighter) {
+      // If the flag is set then show the flexbox highlighter.
+      this.flexboxHighlighter.show(node, options);
+    } else {
+      // Otherwise ensure that the box model regions are not faded.
+      for (const region of BOX_MODEL_REGIONS) {
+        const box = this.getElement(region);
+
+        box.removeAttribute("half-faded");
+      }
+    }
+  }
+
   _scrollUpdate() {
     this._moveInfobar();
   }
 
   /**
    * Hide the highlighter, the outline and the infobar.
    */
   _hide() {
     setIgnoreLayoutChanges(true);
 
     this._untrackMutations();
     this._hideBoxModel();
     this._hideInfobar();
+    this._hideFlexboxHighlighter();
 
     setIgnoreLayoutChanges(false, this.highlighterEnv.window.document.documentElement);
   }
 
   /**
+   * Hide the Flexbox highlighter.
+   */
+  _hideFlexboxHighlighter() {
+    if (this._flexboxHighlighter) {
+      this.flexboxHighlighter.hide();
+    }
+  }
+
+  /**
    * Hide the infobar
    */
   _hideInfobar() {
     this.getElement("infobar-container").setAttribute("hidden", "true");
   }
 
   /**
    * Show the infobar
@@ -518,19 +627,21 @@ class BoxModelHighlighter extends AutoRe
     const rootId = this.ID_CLASS_PREFIX + "elements";
     this.markup.scaleRootElement(this.currentNode, rootId);
 
     return true;
   }
 
   _getBoxPathCoordinates(boxQuad, nextBoxQuad) {
     const {p1, p2, p3, p4} = boxQuad;
+    const isFlexboxContainer = this.options.isFlexboxContainer;
 
     let path;
-    if (!nextBoxQuad || !this.options.onlyRegionArea) {
+    if ((isFlexboxContainer && !nextBoxQuad) ||
+        (!isFlexboxContainer && (!nextBoxQuad || !this.options.onlyRegionArea))) {
       // If this is the content box (inner-most box) or if we're not being asked
       // to highlight only region areas, then draw a simple rectangle.
       path = "M" + p1.x + "," + p1.y + " " +
              "L" + p2.x + "," + p2.y + " " +
              "L" + p3.x + "," + p3.y + " " +
              "L" + p4.x + "," + p4.y;
     } else {
       // Otherwise, just draw the region itself, not a filled rectangle.
--- a/devtools/server/actors/highlighters/css-grid.js
+++ b/devtools/server/actors/highlighters/css-grid.js
@@ -129,46 +129,49 @@ const gCachedGridPattern = new Map();
  * display:[inline-]grid elements.
  *
  * Usage example:
  * let h = new CssGridHighlighter(env);
  * h.show(node, options);
  * h.hide();
  * h.destroy();
  *
- * Available Options:
- * - color(colorValue)
- *     @param  {String} colorValue
- *     The color that should be used to draw the highlighter for this grid.
- * - showAllGridAreas(isShown)
- *     @param  {Boolean} isShown
- *     Shows all the grid area highlights for the current grid if isShown is true.
- * - showGridArea(areaName)
- *     @param  {String} areaName
- *     Shows the grid area highlight for the given area name.
- * - showGridAreasOverlay(isShown)
- *     @param  {Boolean} isShown
- *     Displays an overlay of all the grid areas for the current grid container if
- *     isShown is true.
- * - showGridCell({ gridFragmentIndex: Number, rowNumber: Number, columnNumber: Number })
- *     @param  {Object} { gridFragmentIndex: Number, rowNumber: Number,
- *                        columnNumber: Number }
- *     An object containing the grid fragment index, row and column numbers to the
- *     corresponding grid cell to highlight for the current grid.
- * - showGridLineNames({ gridFragmentIndex: Number, lineNumber: Number,
- *                       type: String })
- *     @param  {Object} { gridFragmentIndex: Number, lineNumber: Number }
- *     An object containing the grid fragment index and line number to the
- *     corresponding grid line to highlight for the current grid.
- * - showGridLineNumbers(isShown)
- *     @param  {Boolean} isShown
- *     Displays the grid line numbers on the grid lines if isShown is true.
- * - showInfiniteLines(isShown)
- *     @param  {Boolean} isShown
- *     Displays an infinite line to represent the grid lines if isShown is true.
+ * @param {String} options.color
+ *        The color that should be used to draw the highlighter for this grid.
+ * @param {Boolean} options.showAllGridAreas
+ *        Shows all the grid area highlights for the current grid if isShown is
+ *        true.
+ * @param {String} options.showGridArea
+ *        Shows the grid area highlight for the given area name.
+ * @param {Boolean} options.showGridAreasOverlay
+ *        Displays an overlay of all the grid areas for the current grid
+ *        container if isShown is true.
+ * @param {Object} options.showGridCell
+ *        An object containing the grid fragment index, row and column numbers
+ *        to the corresponding grid cell to highlight for the current grid.
+ * @param {Number} options.showGridCell.gridFragmentIndex
+ *        Index of the grid fragment to render the grid cell highlight.
+ * @param {Number} options.showGridCell.rowNumber
+ *        Row number of the grid cell to highlight.
+ * @param {Number} options.showGridCell.columnNumber
+ *        Column number of the grid cell to highlight.
+ * @param {Object} options.showGridLineNames
+ *        An object containing the grid fragment index and line number to the
+ *        corresponding grid line to highlight for the current grid.
+ * @param {Number} options.showGridLineNames.gridFragmentIndex
+ *        Index of the grid fragment to render the grid line highlight.
+ * @param {Number} options.showGridLineNames.lineNumber
+ *        Line number of the grid line to highlight.
+ * @param {String} options.showGridLineNames.type
+ *        The dimension type of the grid line.
+ * @param {Boolean} options.showGridLineNumbers
+ *        Displays the grid line numbers on the grid lines if isShown is true.
+ * @param {Boolean} options.showInfiniteLines
+ *        Displays an infinite line to represent the grid lines if isShown is
+ *        true.
  *
  * Structure:
  * <div class="highlighter-container">
  *   <canvas id="css-grid-canvas" class="css-grid-canvas">
  *   <svg class="css-grid-elements" hidden="true">
  *     <g class="css-grid-regions">
  *       <path class="css-grid-areas" points="..." />
  *       <path class="css-grid-cells" points="..." />
--- a/devtools/server/actors/highlighters/flexbox.js
+++ b/devtools/server/actors/highlighters/flexbox.js
@@ -54,23 +54,22 @@ const gCachedFlexboxPattern = new Map();
 
 const FLEXBOX = "flexbox";
 const JUSTIFY_CONTENT = "justify-content";
 
 /**
  * The FlexboxHighlighter is the class that overlays a visual canvas on top of
  * display: [inline-]flex elements.
  *
- * Available Options:
- * - color(colorValue)
- *     @param  {String} colorValue
- *     The color that should be used to draw the highlighter for this flexbox.
- * - showAlignment(isShown)
- *     @param  {Boolean} isShown
- *     Shows the alignment in the flexbox highlighter.
+ * @param {String} options.color
+ *        The color that should be used to draw the highlighter for this flexbox.
+ * @param {Boolean} options.showAlignment
+ *        Shows the alignment in the flexbox highlighter.
+ * @param {Boolean} options.noCountainerOutline
+ *        Prevent drawing an outline around the flex container.
  *
  * Structure:
  * <div class="highlighter-container">
  *   <div id="flexbox-root" class="flexbox-root">
  *     <canvas id="flexbox-canvas"
  *             class="flexbox-canvas"
  *             width="4096"
  *             height="4096"
@@ -108,17 +107,17 @@ class FlexboxHighlighter extends AutoRef
     // on a page that has scrolled already.
     updateCanvasPosition(this._canvasPosition, this._scroll, this.win,
       this._winDimensions);
   }
 
   _buildMarkup() {
     const container = createNode(this.win, {
       attributes: {
-        "class": "highlighter-container",
+        "class": "highlighter-container flexbox",
       },
     });
 
     const root = createNode(this.win, {
       parent: container,
       attributes: {
         "id": "root",
         "class": "root",
@@ -416,28 +415,20 @@ class FlexboxHighlighter extends AutoRef
   }
 
   renderAlignItemLine() {
     if (!this.options.showAlignment || !this.flexData ||
         !this.currentQuads.content || !this.currentQuads.content[0]) {
       return;
     }
 
-    const { devicePixelRatio } = this.win;
-    const lineWidth = getDisplayPixelRatio(this.win);
-    const offset = (lineWidth / 2) % 1;
-    const zoom = getCurrentZoom(this.win);
-    const canvasX = Math.round(this._canvasPosition.x * devicePixelRatio * zoom);
-    const canvasY = Math.round(this._canvasPosition.y * devicePixelRatio * zoom);
-
-    this.ctx.save();
-    this.ctx.translate(offset - canvasX, offset - canvasY);
-    this.ctx.setLineDash(FLEXBOX_LINES_PROPERTIES.alignItems.lineDash);
-    this.ctx.lineWidth = lineWidth * 3;
-    this.ctx.strokeStyle = this.color;
+    this.setupCanvas({
+      lineDash: FLEXBOX_LINES_PROPERTIES.alignItems.lineDash,
+      lineWidthMultiplier: 3,
+    });
 
     const { bounds } = this.currentQuads.content[0];
     const isColumn = this.flexDirection.startsWith("column");
     const options = { matrix: this.currentMatrix };
 
     for (const flexLine of this.flexData.lines) {
       const { crossStart, crossSize } = flexLine;
 
@@ -518,30 +509,27 @@ class FlexboxHighlighter extends AutoRef
   }
 
   renderFlexContainer() {
     if (!this.currentQuads.content || !this.currentQuads.content[0]) {
       return;
     }
 
     const { devicePixelRatio } = this.win;
-    const lineWidth = getDisplayPixelRatio(this.win);
-    const offset = (lineWidth / 2) % 1;
-    const zoom = getCurrentZoom(this.win);
-    const canvasX = Math.round(this._canvasPosition.x * devicePixelRatio * zoom);
-    const canvasY = Math.round(this._canvasPosition.y * devicePixelRatio * zoom);
     const containerQuad = getUntransformedQuad(this.currentNode, "content");
     const { width, height } = containerQuad.getBounds();
 
-    this.ctx.save();
-    this.ctx.translate(offset - canvasX, offset - canvasY);
-    this.ctx.setLineDash(FLEXBOX_LINES_PROPERTIES.edge.lineDash);
-    this.ctx.lineWidth = lineWidth * 2;
-    this.ctx.strokeStyle = this.color;
+    this.setupCanvas({
+      lineDash: FLEXBOX_LINES_PROPERTIES.alignItems.lineDash,
+      lineWidthMultiplier: 2,
+    });
+
     this.ctx.fillStyle = this.getFlexContainerPattern(devicePixelRatio);
+    this.ctx.strokeStyle =
+      this.options.noContainerOutline ? "transparent" : this.color;
 
     drawRect(this.ctx, 0, 0, width, height, this.currentMatrix);
 
     // Find current angle of outer flex element by measuring the angle of two arbitrary
     // points, then rotate canvas, so the hash pattern stays 45deg to the boundary.
     const p1 = apply(this.currentMatrix, [0, 0]);
     const p2 = apply(this.currentMatrix, [1, 0]);
     const angleRad = Math.atan2(p2[1] - p1[1], p2[0] - p1[0]);
@@ -552,28 +540,19 @@ class FlexboxHighlighter extends AutoRef
     this.ctx.restore();
   }
 
   renderFlexItems() {
     if (!this.flexData || !this.currentQuads.content || !this.currentQuads.content[0]) {
       return;
     }
 
-    const { devicePixelRatio } = this.win;
-    const lineWidth = getDisplayPixelRatio(this.win);
-    const offset = (lineWidth / 2) % 1;
-    const zoom = getCurrentZoom(this.win);
-    const canvasX = Math.round(this._canvasPosition.x * devicePixelRatio * zoom);
-    const canvasY = Math.round(this._canvasPosition.y * devicePixelRatio * zoom);
-
-    this.ctx.save();
-    this.ctx.translate(offset - canvasX, offset - canvasY);
-    this.ctx.setLineDash(FLEXBOX_LINES_PROPERTIES.item.lineDash);
-    this.ctx.lineWidth = lineWidth;
-    this.ctx.strokeStyle = this.color;
+    this.setupCanvas({
+      lineDash: FLEXBOX_LINES_PROPERTIES.item.lineDash,
+    });
 
     for (const flexLine of this.flexData.lines) {
       for (const flexItem of flexLine.items) {
         const { left, top, right, bottom } = flexItem.rect;
 
         clearRect(this.ctx, left, top, right, bottom, this.currentMatrix);
         drawRect(this.ctx, left, top, right, bottom, this.currentMatrix);
         this.ctx.stroke();
@@ -583,89 +562,83 @@ class FlexboxHighlighter extends AutoRef
     this.ctx.restore();
   }
 
   renderFlexLines() {
     if (!this.flexData || !this.currentQuads.content || !this.currentQuads.content[0]) {
       return;
     }
 
-    const { devicePixelRatio } = this.win;
     const lineWidth = getDisplayPixelRatio(this.win);
-    const offset = (lineWidth / 2) % 1;
-    const zoom = getCurrentZoom(this.win);
-    const canvasX = Math.round(this._canvasPosition.x * devicePixelRatio * zoom);
-    const canvasY = Math.round(this._canvasPosition.y * devicePixelRatio * zoom);
-    const containerQuad = getUntransformedQuad(this.currentNode, "content");
-    const { width, height } = containerQuad.getBounds();
     const options = { matrix: this.currentMatrix };
+    const { width: containerWidth, height: containerHeight } =
+      getUntransformedQuad(this.currentNode, "content").getBounds();
 
-    this.ctx.save();
-    this.ctx.translate(offset - canvasX, offset - canvasY);
-    this.ctx.lineWidth = lineWidth;
-    this.ctx.strokeStyle = this.color;
+    this.setupCanvas({
+      useScrollOffsets: true,
+    });
 
     for (const flexLine of this.flexData.lines) {
       const { crossStart, crossSize } = flexLine;
 
       switch (this.axes) {
         case "horizontal-lr vertical-tb":
         case "horizontal-lr vertical-bt":
         case "horizontal-rl vertical-tb":
         case "horizontal-rl vertical-bt":
-          clearRect(this.ctx, 0, crossStart, width, crossStart + crossSize,
+          clearRect(this.ctx, 0, crossStart, containerWidth, crossStart + crossSize,
             this.currentMatrix);
 
           // Avoid drawing the start flex line when they overlap with the flex container.
           if (crossStart != 0) {
-            drawLine(this.ctx, 0, crossStart, width, crossStart, options);
+            drawLine(this.ctx, 0, crossStart, containerWidth, crossStart, options);
             this.ctx.stroke();
           }
 
           // Avoid drawing the end flex line when they overlap with the flex container.
-          if (crossStart + crossSize < height - lineWidth * 2) {
-            drawLine(this.ctx, 0, crossStart + crossSize, width,
+          if (crossStart + crossSize < containerHeight - lineWidth * 2) {
+            drawLine(this.ctx, 0, crossStart + crossSize, containerWidth,
               crossStart + crossSize, options);
             this.ctx.stroke();
           }
           break;
         case "vertical-tb horizontal-lr":
         case "vertical-bt horizontal-rl":
-          clearRect(this.ctx, crossStart, 0, crossStart + crossSize, height,
+          clearRect(this.ctx, crossStart, 0, crossStart + crossSize, containerHeight,
             this.currentMatrix);
 
           // Avoid drawing the start flex line when they overlap with the flex container.
           if (crossStart != 0) {
-            drawLine(this.ctx, crossStart, 0, crossStart, height, options);
+            drawLine(this.ctx, crossStart, 0, crossStart, containerHeight, options);
             this.ctx.stroke();
           }
 
           // Avoid drawing the end flex line when they overlap with the flex container.
-          if (crossStart + crossSize < width - lineWidth * 2) {
+          if (crossStart + crossSize < containerWidth - lineWidth * 2) {
             drawLine(this.ctx, crossStart + crossSize, 0, crossStart + crossSize,
-              height, options);
+              containerHeight, options);
             this.ctx.stroke();
           }
           break;
         case "vertical-bt horizontal-lr":
         case "vertical-tb horizontal-rl":
-          clearRect(this.ctx, width - crossStart, 0, width - crossStart - crossSize,
-            height, this.currentMatrix);
+          clearRect(this.ctx, containerWidth - crossStart, 0,
+            containerWidth - crossStart - crossSize, containerHeight, this.currentMatrix);
 
           // Avoid drawing the start flex line when they overlap with the flex container.
           if (crossStart != 0) {
-            drawLine(this.ctx, width - crossStart, 0, width - crossStart, height,
-              options);
+            drawLine(this.ctx, containerWidth - crossStart, 0,
+              containerWidth - crossStart, containerHeight, options);
             this.ctx.stroke();
           }
 
           // Avoid drawing the end flex line when they overlap with the flex container.
-          if (crossStart + crossSize < width - lineWidth * 2) {
-            drawLine(this.ctx, width - crossStart - crossSize, 0,
-              width - crossStart - crossSize, height, options);
+          if (crossStart + crossSize < containerWidth - lineWidth * 2) {
+            drawLine(this.ctx, containerWidth - crossStart - crossSize, 0,
+              containerWidth - crossStart - crossSize, containerHeight, options);
             this.ctx.stroke();
           }
           break;
       }
     }
 
     this.ctx.restore();
   }
@@ -673,27 +646,25 @@ class FlexboxHighlighter extends AutoRef
   /**
    * Clear the whole alignment container along the main axis for each flex item.
    */
   renderJustifyContent() {
     if (!this.flexData || !this.currentQuads.content || !this.currentQuads.content[0]) {
       return;
     }
 
-    const containerQuad = getUntransformedQuad(this.currentNode, "content");
-    const containerBounds = containerQuad.getBounds();
-    const { width: containerWidth, height: containerHeight } = containerBounds;
+    const { width: containerWidth, height: containerHeight } =
+      getUntransformedQuad(this.currentNode, "content").getBounds();
 
-    const offset = (getDisplayPixelRatio(this.win) / 2) % 1;
-    const zoom = getCurrentZoom(this.win);
-    const canvasX = Math.round(this._canvasPosition.x * this.win.devicePixelRatio * zoom);
-    const canvasY = Math.round(this._canvasPosition.y * this.win.devicePixelRatio * zoom);
-
-    this.ctx.save();
-    this.ctx.translate(offset - canvasX, offset - canvasY);
+    this.setupCanvas({
+      lineDash: FLEXBOX_LINES_PROPERTIES.alignItems.lineDash,
+      offset: (getDisplayPixelRatio(this.win) / 2) % 1,
+      skipLineAndStroke: true,
+      useScrollOffsets: true,
+    });
 
     for (const flexLine of this.flexData.lines) {
       const { crossStart, crossSize } = flexLine;
       let mainStart = 0;
 
       // In these two situations mainStart goes from right to left so set it's
       // value as appropriate.
       if (this.axes === "horizontal-lr vertical-bt" ||
@@ -751,16 +722,76 @@ class FlexboxHighlighter extends AutoRef
             containerWidth - crossStart, containerHeight);
           break;
       }
     }
 
     this.ctx.restore();
   }
 
+  /**
+   * Set up the canvas with the given options prior to drawing.
+   *
+   * @param {String} [options.lineDash = null]
+   *        An Array of numbers that specify distances to alternately draw a
+   *        line and a gap (in coordinate space units). If the number of
+   *        elements in the array is odd, the elements of the array get copied
+   *        and concatenated. For example, [5, 15, 25] will become
+   *        [5, 15, 25, 5, 15, 25]. If the array is empty, the line dash list is
+   *        cleared and line strokes return to being solid.
+   *
+   *        We use the following constants here:
+   *          FLEXBOX_LINES_PROPERTIES.edge.lineDash,
+   *          FLEXBOX_LINES_PROPERTIES.item.lineDash
+   *          FLEXBOX_LINES_PROPERTIES.alignItems.lineDash
+   * @param {Number} [options.lineWidthMultiplier = 1]
+   *        The width of the line.
+   * @param {Number} [options.offset = `(displayPixelRatio / 2) % 1`]
+   *        The single line width used to obtain a crisp line.
+   * @param {Boolean} [options.skipLineAndStroke = false]
+   *        Skip the setting of lineWidth and strokeStyle.
+   * @param {Boolean} [options.useScrollOffsets = false]
+   *        Take scroll and zoom offsets into account. This is often needed
+   *        when working purely with mainStart, mainSize, crossStart and
+   *        crossSize because they do not take the scroll position into account.
+   */
+  setupCanvas({
+      lineDash = null,
+      lineWidthMultiplier = 1,
+      offset = (getDisplayPixelRatio(this.win) / 2) % 1,
+      skipLineAndStroke = false,
+      useScrollOffsets = false }) {
+    const { devicePixelRatio } = this.win;
+    const lineWidth = getDisplayPixelRatio(this.win);
+    const zoom = getCurrentZoom(this.win);
+
+    let offsetX = this._canvasPosition.x;
+    let offsetY = this._canvasPosition.y;
+
+    if (useScrollOffsets) {
+      offsetX += this.currentNode.scrollLeft / zoom;
+      offsetY += this.currentNode.scrollTop / zoom;
+    }
+
+    const canvasX = Math.round(offsetX * devicePixelRatio * zoom);
+    const canvasY = Math.round(offsetY * devicePixelRatio * zoom);
+
+    this.ctx.save();
+    this.ctx.translate(offset - canvasX, offset - canvasY);
+
+    if (lineDash) {
+      this.ctx.setLineDash(lineDash);
+    }
+
+    if (!skipLineAndStroke) {
+      this.ctx.lineWidth = lineWidth * lineWidthMultiplier;
+      this.ctx.strokeStyle = this.color;
+    }
+  }
+
   _update() {
     setIgnoreLayoutChanges(true);
 
     const root = this.getElement("root");
 
     // Hide the root element and force the reflow in order to get the proper window's
     // dimensions without increasing them.
     root.setAttribute("style", "display: none");
@@ -850,19 +881,26 @@ function getRectFromFlexItemValues(item,
   const rect = item.frameRect;
   const domRect = new DOMRect(rect.x, rect.y, rect.width, rect.height);
   const win = container.ownerGlobal;
   const style = win.getComputedStyle(container);
   const borderLeftWidth = parseInt(style.borderLeftWidth, 10) || 0;
   const borderTopWidth = parseInt(style.borderTopWidth, 10) || 0;
   const paddingLeft = parseInt(style.paddingLeft, 10) || 0;
   const paddingTop = parseInt(style.paddingTop, 10) || 0;
+  const scrollX = container.scrollLeft || 0;
+  const scrollY = container.scrollTop || 0;
 
-  domRect.x -= borderLeftWidth + paddingLeft;
-  domRect.y -= borderTopWidth + paddingTop;
+  domRect.x -= paddingLeft + scrollX;
+  domRect.y -= paddingTop + scrollY;
+
+  if (style.overflow === "visible" || style.overflow === "-moz-hidden-unscrollable") {
+    domRect.x -= borderLeftWidth;
+    domRect.y -= borderTopWidth;
+  }
 
   return domRect;
 }
 
 /**
  * Returns whether or not the flex data has changed.
  *
  * @param  {Flex} oldFlexData
--- a/devtools/server/actors/highlighters/shapes.js
+++ b/devtools/server/actors/highlighters/shapes.js
@@ -61,16 +61,22 @@ const _dragging = Symbol("shapes/draggin
  * the west edge of the shape (from the northwest corner to the southwest corner).
  *
  * Because of rotation, the "north" and "west" edges might not actually be at the
  * top and left of the transformed shape. Imagine that the compass directions are
  * also rotated along with the shape.
  *
  * A refresher for coordinates and change of basis that may be helpful:
  * https://www.math.ubc.ca/~behrend/math221/Coords.pdf
+ *
+ * @param {String} options.hoverPoint
+ *        The point to highlight.
+ * @param {Boolean} options.transformMode
+ *        Whether to show the highlighter in transforms mode.
+ * @param {} options.mode
  */
 class ShapesHighlighter extends AutoRefreshHighlighter {
   constructor(highlighterEnv) {
     super(highlighterEnv);
     EventEmitter.decorate(this);
 
     this.ID_CLASS_PREFIX = "shapes-";
 
--- a/devtools/server/actors/layout.js
+++ b/devtools/server/actors/layout.js
@@ -485,20 +485,16 @@ function findFlexOrGridParentContainerFo
   const treeWalker = walker.getDocumentWalker(node, SHOW_ELEMENT);
   let currentNode = treeWalker.currentNode;
 
   const flexType = type === "flex";
   const gridType = type === "grid";
 
   try {
     while ((currentNode = treeWalker.parentNode())) {
-      if (!currentNode) {
-        break;
-      }
-
       const displayType = walker.getNode(currentNode).displayType;
       if (!displayType) {
         break;
       }
 
       if (flexType && displayType.includes("flex")) {
         if (isNodeAFlexItemInContainer(node, currentNode, walker)) {
           return currentNode;
--- a/devtools/shared/layout/utils.js
+++ b/devtools/shared/layout/utils.js
@@ -901,8 +901,89 @@ function getUntransformedQuad(node, regi
     quad.p4.y += topOffset;
 
     node = node.offsetParent;
   }
 
   return quad;
 }
 exports.getUntransformedQuad = getUntransformedQuad;
+
+/**
+ * If the provided node is a grid of flex item, then return its parent grid or flex
+ * container.
+ *
+ * @param  {DOMNode} node
+ *         The node that is supposedly a grid or flex item.
+ * @param  {String} type
+ *         The type of container/item to look for: "flex" or "grid".
+ * @return {DOMNode|null}
+ *         The parent grid or flex container if found, null otherwise.
+ */
+function findFlexOrGridParentContainerForNode(node, type) {
+  const doc = node.ownerDocument;
+  const win = doc.defaultView;
+  const treeWalker = doc.createTreeWalker(doc.body, NodeFilter.SHOW_ELEMENT);
+  const flexType = type === "flex";
+  const gridType = type === "grid";
+  let currentNode = null;
+
+  treeWalker.currentNode = node;
+
+  try {
+    while ((currentNode = treeWalker.parentNode())) {
+      const displayType = win.getComputedStyle(currentNode).display;
+      if (!displayType) {
+        break;
+      }
+
+      if (flexType && displayType.includes("flex")) {
+        if (isNodeAFlexItemInContainer(node, currentNode)) {
+          return currentNode;
+        }
+      } else if (gridType && displayType.includes("grid")) {
+        return currentNode;
+      } else if (displayType === "contents") {
+        // Continue walking up the tree since the parent node is a content element.
+        continue;
+      }
+
+      break;
+    }
+  } catch (e) {
+    // Getting the parentNode can fail when the supplied node is in shadow DOM.
+  }
+
+  return null;
+}
+exports.findFlexOrGridParentContainerForNode = findFlexOrGridParentContainerForNode;
+
+/**
+ * Returns whether or not the given node is actually considered a flex item by its
+ * container.
+ *
+ * @param  {DOMNode} supposedItem
+ *         The node that might be a flex item of its container.
+ * @param  {DOMNode} container
+ *         The node's container.
+ * @return {Boolean}
+ *         Whether or not the node we are looking at is a flex item of its container.
+ */
+function isNodeAFlexItemInContainer(supposedItem, container) {
+  const doc = container.ownerDocument;
+  const win = doc.defaultView;
+  const containerDisplayType = win.getComputedStyle(container).display;
+
+  if (containerDisplayType.includes("flex")) {
+    const containerFlex = container.getAsFlexContainer();
+
+    for (const line of containerFlex.getLines()) {
+      for (const item of line.getItems()) {
+        if (item.node === supposedItem) {
+          return true;
+        }
+      }
+    }
+  }
+
+  return false;
+}
+exports.isNodeAFlexItemInContainer = isNodeAFlexItemInContainer;
--- a/devtools/shared/webconsole/client.js
+++ b/devtools/shared/webconsole/client.js
@@ -65,24 +65,16 @@ WebConsoleClient.prototype = {
    * @type object
    */
   _networkRequests: null,
 
   getNetworkRequest(actorId) {
     return this._networkRequests.get(actorId);
   },
 
-  hasNetworkRequest(actorId) {
-    return this._networkRequests.has(actorId);
-  },
-
-  removeNetworkRequest(actorId) {
-    this._networkRequests.delete(actorId);
-  },
-
   getNetworkEvents() {
     return this._networkRequests.values();
   },
 
   get actor() {
     return this.actorID;
   },
 
--- a/docshell/base/nsDefaultURIFixup.cpp
+++ b/docshell/base/nsDefaultURIFixup.cpp
@@ -46,18 +46,17 @@ nsDefaultURIFixup::nsDefaultURIFixup() {
 
 nsDefaultURIFixup::~nsDefaultURIFixup() {}
 
 NS_IMETHODIMP
 nsDefaultURIFixup::CreateExposableURI(nsIURI* aURI, nsIURI** aReturn) {
   NS_ENSURE_ARG_POINTER(aURI);
   NS_ENSURE_ARG_POINTER(aReturn);
 
-  bool isWyciwyg = false;
-  aURI->SchemeIs("wyciwyg", &isWyciwyg);
+  bool isWyciwyg = net::SchemeIsWYCIWYG(aURI);
 
   nsAutoCString userPass;
   aURI->GetUserPass(userPass);
 
   // most of the time we can just AddRef and return
   if (!isWyciwyg && userPass.IsEmpty()) {
     *aReturn = aURI;
     NS_ADDREF(*aReturn);
@@ -510,19 +509,17 @@ bool nsDefaultURIFixup::MakeAlternateURI
   if (!Preferences::GetRootBranch()) {
     return false;
   }
   if (!Preferences::GetBool("browser.fixup.alternate.enabled", true)) {
     return false;
   }
 
   // Code only works for http. Not for any other protocol including https!
-  bool isHttp = false;
-  aURI->SchemeIs("http", &isHttp);
-  if (!isHttp) {
+  if (!net::SchemeIsHTTP(aURI)) {
     return false;
   }
 
   // Security - URLs with user / password info should NOT be fixed up
   nsAutoCString userpass;
   aURI->GetUserPass(userpass);
   if (!userpass.IsEmpty()) {
     return false;
--- a/docshell/base/nsDocShell.cpp
+++ b/docshell/base/nsDocShell.cpp
@@ -1042,37 +1042,34 @@ nsDOMNavigationTiming* nsDocShell::GetNa
   bool equal;
   nsresult rv = originDocument->NodePrincipal()->Equals(
       targetDocument->NodePrincipal(), &equal);
   if (NS_SUCCEEDED(rv) && equal) {
     return true;
   }
 
   // Not strictly equal, special case if both are file: uris
-  bool originIsFile = false;
-  bool targetIsFile = false;
   nsCOMPtr<nsIURI> originURI;
   nsCOMPtr<nsIURI> targetURI;
   nsCOMPtr<nsIURI> innerOriginURI;
   nsCOMPtr<nsIURI> innerTargetURI;
 
   rv = originDocument->NodePrincipal()->GetURI(getter_AddRefs(originURI));
   if (NS_SUCCEEDED(rv) && originURI) {
     innerOriginURI = NS_GetInnermostURI(originURI);
   }
 
   rv = targetDocument->NodePrincipal()->GetURI(getter_AddRefs(targetURI));
   if (NS_SUCCEEDED(rv) && targetURI) {
     innerTargetURI = NS_GetInnermostURI(targetURI);
   }
 
   return innerOriginURI && innerTargetURI &&
-         NS_SUCCEEDED(innerOriginURI->SchemeIs("file", &originIsFile)) &&
-         NS_SUCCEEDED(innerTargetURI->SchemeIs("file", &targetIsFile)) &&
-         originIsFile && targetIsFile;
+    SchemeIsFile(innerOriginURI) &&
+    SchemeIsFile(innerTargetURI);
 }
 
 nsPresContext* nsDocShell::GetEldestPresContext() {
   nsIContentViewer* viewer = mContentViewer;
   while (viewer) {
     nsIContentViewer* prevViewer = viewer->GetPreviousViewer();
     if (!prevViewer) {
       return viewer->GetPresContext();
@@ -1227,21 +1224,18 @@ nsDocShell::GatherCharsetMenuTelemetry()
 
   Document* doc = viewer->GetDocument();
   if (!doc || doc->WillIgnoreCharsetOverride()) {
     return NS_OK;
   }
 
   Telemetry::ScalarSet(Telemetry::ScalarID::ENCODING_OVERRIDE_USED, true);
 
-  bool isFileURL = false;
   nsIURI* url = doc->GetOriginalURI();
-  if (url) {
-    url->SchemeIs("file", &isFileURL);
-  }
+  bool isFileURL = url && SchemeIsFile(url);
 
   int32_t charsetSource = doc->GetDocumentCharacterSetSource();
   switch (charsetSource) {
     case kCharsetFromTopLevelDomain:
       // Unlabeled doc on a domain that we map to a fallback encoding
       Telemetry::AccumulateCategorical(
           Telemetry::LABELS_ENCODING_OVERRIDE_SITUATION::RemoteTld);
       break;
@@ -3276,24 +3270,17 @@ nsDocShell::AddChild(nsIDocShellTreeItem
   if (!mContentViewer) {
     return NS_OK;
   }
   Document* doc = mContentViewer->GetDocument();
   if (!doc) {
     return NS_OK;
   }
 
-  bool isWyciwyg = false;
-
-  if (mCurrentURI) {
-    // Check if the url is wyciwyg
-    mCurrentURI->SchemeIs("wyciwyg", &isWyciwyg);
-  }
-
-  if (!isWyciwyg) {
+  if (!(mCurrentURI && SchemeIsWYCIWYG(mCurrentURI))) {
     // If this docshell is loaded from a wyciwyg: URI, don't
     // advertise our charset since it does not in any way reflect
     // the actual source charset, which is what we're trying to
     // expose here.
 
     const Encoding* parentCS = doc->GetDocumentCharacterSet();
     int32_t charsetSource = doc->GetDocumentCharacterSetSource();
     // set the child's parentCharset
@@ -4341,19 +4328,17 @@ nsDocShell::DisplayLoadError(nsresult aE
       CopyUTF8toUTF16(hostport, formatStrs[formatStrCount++]);
     }
 
     nsAutoCString spec;
     rv = NS_ERROR_NOT_AVAILABLE;
     if (aURI) {
       // displaying "file://" is aesthetically unpleasing and could even be
       // confusing to the user
-      bool isFileURI = false;
-      rv = aURI->SchemeIs("file", &isFileURI);
-      if (NS_SUCCEEDED(rv) && isFileURI) {
+      if (SchemeIsFile(aURI)) {
         aURI->GetPathQueryRef(spec);
       } else {
         aURI->GetSpec(spec);
       }
 
       nsCOMPtr<nsITextToSubURI> textToSubURI(
           do_GetService(NS_ITEXTTOSUBURI_CONTRACTID, &rv));
       if (NS_SUCCEEDED(rv)) {
@@ -4378,23 +4363,20 @@ nsDocShell::DisplayLoadError(nsresult aE
                                             formatStrCount, str);
     NS_ENSURE_SUCCESS(rv, rv);
     messageStr.Assign(str.get());
   }
 
   // Display the error as a page or an alert prompt
   NS_ENSURE_FALSE(messageStr.IsEmpty(), NS_ERROR_FAILURE);
 
-  if (NS_ERROR_NET_INTERRUPT == aError || NS_ERROR_NET_RESET == aError) {
-    bool isSecureURI = false;
-    rv = aURI->SchemeIs("https", &isSecureURI);
-    if (NS_SUCCEEDED(rv) && isSecureURI) {
-      // Maybe TLS intolerant. Treat this as an SSL error.
-      error = "nssFailure2";
-    }
+  if ((NS_ERROR_NET_INTERRUPT == aError || NS_ERROR_NET_RESET == aError) &&
+      SchemeIsHTTPS(aURI)) {
+    // Maybe TLS intolerant. Treat this as an SSL error.
+    error = "nssFailure2";
   }
 
   if (UseErrorPages()) {
     // Display an error page
     nsresult loadedPage =
         LoadErrorPage(aURI, aURL, errorPage.get(), error, messageStr.get(),
                       cssClass.get(), aFailedChannel);
     *aDisplayedErrorPage = NS_SUCCEEDED(loadedPage);
@@ -5520,20 +5502,19 @@ nsDocShell::GetAllowMixedContentAndConne
 
   // now get the document from sameTypeRoot
   RefPtr<Document> rootDoc = sameTypeRoot->GetDocument();
   if (rootDoc) {
     nsCOMPtr<nsIPrincipal> rootPrincipal = rootDoc->NodePrincipal();
 
     // For things with system principal (e.g. scratchpad) there is no uri
     // aRootHasSecureConnection should be false.
-    nsCOMPtr<nsIURI> rootUri;
+    nsCOMPtr<nsIURI> rootUri = rootPrincipal->GetURI();
     if (nsContentUtils::IsSystemPrincipal(rootPrincipal) ||
-        NS_FAILED(rootPrincipal->GetURI(getter_AddRefs(rootUri))) || !rootUri ||
-        NS_FAILED(rootUri->SchemeIs("https", aRootHasSecureConnection))) {
+        !rootUri || !SchemeIsHTTPS(rootUri)) {
       *aRootHasSecureConnection = false;
     }
 
     // Check the root doc's channel against the root docShell's
     // mMixedContentChannel to see if they are the same. If they are the same,
     // the user has overriden the block.
     nsCOMPtr<nsIDocShell> rootDocShell = do_QueryInterface(sameTypeRoot);
     nsCOMPtr<nsIChannel> mixedChannel;
@@ -6279,23 +6260,19 @@ nsresult nsDocShell::Embed(nsIContentVie
   // If we are loading a wyciwyg url from history, change the base URI for
   // the document to the original http url that created the document.write().
   // This makes sure that all relative urls in a document.written page loaded
   // via history work properly.
   if (mCurrentURI &&
       (mLoadType & LOAD_CMD_HISTORY || mLoadType == LOAD_RELOAD_NORMAL ||
        mLoadType == LOAD_RELOAD_CHARSET_CHANGE ||
        mLoadType == LOAD_RELOAD_CHARSET_CHANGE_BYPASS_CACHE ||
-       mLoadType == LOAD_RELOAD_CHARSET_CHANGE_BYPASS_PROXY_AND_CACHE)) {
-    bool isWyciwyg = false;
-    // Check if the url is wyciwyg
-    rv = mCurrentURI->SchemeIs("wyciwyg", &isWyciwyg);
-    if (isWyciwyg && NS_SUCCEEDED(rv)) {
-      SetBaseUrlForWyciwyg(aContentViewer);
-    }
+       mLoadType == LOAD_RELOAD_CHARSET_CHANGE_BYPASS_PROXY_AND_CACHE) &&
+      SchemeIsWYCIWYG(mCurrentURI)) {
+    SetBaseUrlForWyciwyg(aContentViewer);
   }
   // XXX What if SetupNewViewer fails?
   if (mLSHE) {
     // Restore the editing state, if it's stored in session history.
     if (mLSHE->HasDetachedEditor()) {
       ReattachEditorToWindow(mLSHE);
     }
     // Set history.state
@@ -8595,28 +8572,22 @@ nsresult nsDocShell::InternalLoad(nsDocS
 
   rv = EnsureScriptEnvironment();
   if (NS_FAILED(rv)) {
     return rv;
   }
 
   // wyciwyg urls can only be loaded through history. Any normal load of
   // wyciwyg through docshell is  illegal. Disallow such loads.
-  if (aLoadState->LoadType() & LOAD_CMD_NORMAL) {
-    bool isWyciwyg = false;
-    rv = aLoadState->URI()->SchemeIs("wyciwyg", &isWyciwyg);
-    if ((isWyciwyg && NS_SUCCEEDED(rv)) || NS_FAILED(rv)) {
-      return NS_ERROR_FAILURE;
-    }
-  }
-
-  bool isJavaScript = false;
-  if (NS_FAILED(aLoadState->URI()->SchemeIs("javascript", &isJavaScript))) {
-    isJavaScript = false;
-  }
+  if ((aLoadState->LoadType() & LOAD_CMD_NORMAL) &&
+      SchemeIsWYCIWYG(aLoadState->URI())) {
+    return NS_ERROR_FAILURE;
+  }
+
+  bool isJavaScript = SchemeIsJavascript(aLoadState->URI());
 
   bool isTargetTopLevelDocShell = false;
   nsCOMPtr<nsIDocShell> targetDocShell;
   if (!aLoadState->Target().IsEmpty()) {
     // Locate the target DocShell.
     nsCOMPtr<nsIDocShellTreeItem> targetItem;
     // Only _self, _parent, and _top are supported in noopener case.  But we
     // have to be careful to not apply that to the noreferrer case.  See bug
@@ -9027,19 +8998,17 @@ nsresult nsDocShell::InternalLoad(nsDocS
   }
 
   bool loadFromExternal = false;
 
   // Before going any further vet loads initiated by external programs.
   if (aLoadState->LoadType() == LOAD_NORMAL_EXTERNAL) {
     loadFromExternal = true;
     // Disallow external chrome: loads targetted at content windows
-    bool isChrome = false;
-    if (NS_SUCCEEDED(aLoadState->URI()->SchemeIs("chrome", &isChrome)) &&
-        isChrome) {
+    if (SchemeIsChrome(aLoadState->URI())) {
       NS_WARNING("blocked external chrome: url -- use '--chrome' option");
       return NS_ERROR_FAILURE;
     }
 
     // clear the decks to prevent context bleed-through (bug 298255)
     rv = CreateAboutBlankContentViewer(nullptr, nullptr);
     if (NS_FAILED(rv)) {
       return NS_ERROR_FAILURE;
@@ -9615,27 +9584,25 @@ static bool IsConsideredSameOriginForUIR
   if (aTriggeringPrincipal->Equals(aResultPrincipal)) {
     return true;
   }
 
   if (!aResultPrincipal->GetIsCodebasePrincipal()) {
     return false;
   }
 
-  nsCOMPtr<nsIURI> resultURI;
-  nsresult rv = aResultPrincipal->GetURI(getter_AddRefs(resultURI));
-  NS_ENSURE_SUCCESS(rv, false);
-
-  nsAutoCString resultScheme;
-  rv = resultURI->GetScheme(resultScheme);
-  NS_ENSURE_SUCCESS(rv, false);
-  if (!resultScheme.EqualsLiteral("http")) {
+  nsCOMPtr<nsIURI> resultURI = aResultPrincipal->GetURI();
+
+  // We know this is a codebase principal, and codebase principals require valid
+  // URIs, so we shouldn't need to check non-null here.
+  if (!SchemeIsHTTP(resultURI)) {
     return false;
   }
 
+  nsresult rv;
   nsAutoCString tmpResultSpec;
   rv = resultURI->GetSpec(tmpResultSpec);
   NS_ENSURE_SUCCESS(rv, false);
   // replace http with https
   tmpResultSpec.ReplaceLiteral(0, 4, "https");
 
   nsCOMPtr<nsIURI> tmpResultURI;
   rv = NS_NewURI(getter_AddRefs(tmpResultURI), tmpResultSpec);
@@ -9705,19 +9672,17 @@ nsresult nsDocShell::DoURILoad(nsDocShel
     // timing attacks to read data from cross-origin iframes. If this widens
     // we should add a protocol flag for whether the scheme is allowed in
     // frames and use something like nsNetUtil::NS_URIChainHasFlags.
     nsCOMPtr<nsIURI> tempURI = aLoadState->URI();
     nsCOMPtr<nsINestedURI> nestedURI = do_QueryInterface(tempURI);
     while (nestedURI) {
       // view-source should always be an nsINestedURI, loop and check the
       // scheme on this and all inner URIs that are also nested URIs.
-      bool isViewSource = false;
-      rv = tempURI->SchemeIs("view-source", &isViewSource);
-      if (NS_FAILED(rv) || isViewSource) {
+      if (SchemeIsViewSource(tempURI)) {
         return NS_ERROR_UNKNOWN_PROTOCOL;
       }
       nestedURI->GetInnerURI(getter_AddRefs(tempURI));
       nestedURI = do_QueryInterface(tempURI);
     }
   } else {
     MOZ_ASSERT(aContentPolicyType == nsIContentPolicy::TYPE_DOCUMENT,
                "DoURILoad thinks this is a document and InternalLoad does not");
@@ -9800,20 +9765,19 @@ nsresult nsDocShell::DoURILoad(nsDocShel
   bool inheritAttrs = false, inheritPrincipal = false;
 
   if (aLoadState->PrincipalToInherit()) {
     inheritAttrs = nsContentUtils::ChannelShouldInheritPrincipal(
         aLoadState->PrincipalToInherit(), aLoadState->URI(),
         true,  // aInheritForAboutBlank
         isSrcdoc);
 
-    bool isData;
     bool isURIUniqueOrigin =
         nsIOService::IsDataURIUniqueOpaqueOrigin() &&
-        NS_SUCCEEDED(aLoadState->URI()->SchemeIs("data", &isData)) && isData;
+        SchemeIsData(aLoadState->URI());
     inheritPrincipal = inheritAttrs && !isURIUniqueOrigin;
   }
 
   nsLoadFlags loadFlags = mDefaultLoadFlags;
   nsSecurityFlags securityFlags =
       nsILoadInfo::SEC_ALLOW_CROSS_ORIGIN_DATA_IS_NULL;
 
   if (aLoadState->FirstParty()) {
@@ -9915,38 +9879,30 @@ nsresult nsDocShell::DoURILoad(nsDocShel
 
     if (baseURI) {
       nsCOMPtr<nsIViewSourceChannel> vsc = do_QueryInterface(channel);
       if (vsc) {
         rv = vsc->SetBaseURI(baseURI);
         MOZ_ASSERT(NS_SUCCEEDED(rv));
       }
     }
+  } else if (SchemeIsViewSource(aLoadState->URI())) {
+    nsViewSourceHandler* vsh = nsViewSourceHandler::GetInstance();
+    NS_ENSURE_TRUE(vsh, NS_ERROR_FAILURE);
+
+    rv = vsh->NewSrcdocChannel(aLoadState->URI(), baseURI, aSrcdoc, loadInfo,
+                               getter_AddRefs(channel));
   } else {
-    nsAutoCString scheme;
-    rv = aLoadState->URI()->GetScheme(scheme);
+    rv = NS_NewInputStreamChannelInternal(
+      getter_AddRefs(channel), aLoadState->URI(), aSrcdoc,
+      NS_LITERAL_CSTRING("text/html"), loadInfo, true);
     NS_ENSURE_SUCCESS(rv, rv);
-    bool isViewSource;
-    aLoadState->URI()->SchemeIs("view-source", &isViewSource);
-
-    if (isViewSource) {
-      nsViewSourceHandler* vsh = nsViewSourceHandler::GetInstance();
-      NS_ENSURE_TRUE(vsh, NS_ERROR_FAILURE);
-
-      rv = vsh->NewSrcdocChannel(aLoadState->URI(), baseURI, aSrcdoc, loadInfo,
-                                 getter_AddRefs(channel));
-    } else {
-      rv = NS_NewInputStreamChannelInternal(
-          getter_AddRefs(channel), aLoadState->URI(), aSrcdoc,
-          NS_LITERAL_CSTRING("text/html"), loadInfo, true);
-      NS_ENSURE_SUCCESS(rv, rv);
-      nsCOMPtr<nsIInputStreamChannel> isc = do_QueryInterface(channel);
-      MOZ_ASSERT(isc);
-      isc->SetBaseURI(baseURI);
-    }
+    nsCOMPtr<nsIInputStreamChannel> isc = do_QueryInterface(channel);
+    MOZ_ASSERT(isc);
+    isc->SetBaseURI(baseURI);
   }
 
   // Navigational requests that are same origin need to be upgraded in case
   // upgrade-insecure-requests is present. Please note that in that case
   // the triggeringPrincipal is holding the CSP that potentially
   // holds upgrade-insecure-requests.
   nsCOMPtr<nsIContentSecurityPolicy> csp;
   aLoadState->TriggeringPrincipal()->GetCsp(getter_AddRefs(csp));
@@ -11479,19 +11435,18 @@ nsresult nsDocShell::LoadHistoryEntry(ns
   nsCOMPtr<nsIPrincipal> triggeringPrincipal = aEntry->GetTriggeringPrincipal();
   nsCOMPtr<nsIPrincipal> principalToInherit = aEntry->GetPrincipalToInherit();
 
   // Calling CreateAboutBlankContentViewer can set mOSHE to null, and if
   // that's the only thing holding a ref to aEntry that will cause aEntry to
   // die while we're loading it.  So hold a strong ref to aEntry here, just
   // in case.
   nsCOMPtr<nsISHEntry> kungFuDeathGrip(aEntry);
-  bool isJS;
-  nsresult rv = uri->SchemeIs("javascript", &isJS);
-  if (NS_FAILED(rv) || isJS) {
+  nsresult rv;
+  if (SchemeIsJavascript(uri)) {
     // We're loading a URL that will execute script from inside asyncOpen.
     // Replace the current document with about:blank now to prevent
     // anything from the current document from leaking into any JavaScript
     // code in the URL.
     // Don't cache the presentation if we're going to just reload the
     // current entry. Caching would lead to trying to save the different
     // content viewers in the same nsISHEntry object.
     rv = CreateAboutBlankContentViewer(principalToInherit, nullptr,
--- a/docshell/base/nsPingListener.cpp
+++ b/docshell/base/nsPingListener.cpp
@@ -276,20 +276,17 @@ static void ForEachPing(nsIContent* aCon
     nsCOMPtr<nsIURI> uri, baseURI = aContent->GetBaseURI();
     ios->NewURI(NS_ConvertUTF16toUTF8(tokenizer.nextToken()), charset.get(),
                 baseURI, getter_AddRefs(uri));
     // if we can't generate a valid URI, then there is nothing to do
     if (!uri) {
       continue;
     }
     // Explicitly not allow loading data: URIs
-    bool isDataScheme =
-        (NS_SUCCEEDED(uri->SchemeIs("data", &isDataScheme)) && isDataScheme);
-
-    if (!isDataScheme) {
+    if (!net::SchemeIsData(uri)) {
       aCallback(aClosure, aContent, uri, ios);
     }
   }
 }
 
 // Spec: http://whatwg.org/specs/web-apps/current-work/#ping
 /*static*/ void nsPingListener::DispatchPings(nsIDocShell* aDocShell,
                                               nsIContent* aContent,
--- a/dom/asmjscache/AsmJSCache.cpp
+++ b/dom/asmjscache/AsmJSCache.cpp
@@ -13,24 +13,26 @@
 #include "jsfriendapi.h"
 #include "mozilla/Assertions.h"
 #include "mozilla/CondVar.h"
 #include "mozilla/CycleCollectedJSRuntime.h"
 #include "mozilla/dom/asmjscache/PAsmJSCacheEntryChild.h"
 #include "mozilla/dom/asmjscache/PAsmJSCacheEntryParent.h"
 #include "mozilla/dom/PermissionMessageUtils.h"
 #include "mozilla/dom/quota/Client.h"
+#include "mozilla/dom/quota/QuotaCommon.h"
 #include "mozilla/dom/quota/QuotaManager.h"
 #include "mozilla/dom/quota/QuotaObject.h"
 #include "mozilla/dom/quota/UsageInfo.h"
 #include "mozilla/HashFunctions.h"
 #include "mozilla/ipc/BackgroundChild.h"
 #include "mozilla/ipc/BackgroundParent.h"
 #include "mozilla/ipc/BackgroundUtils.h"
 #include "mozilla/ipc/PBackgroundChild.h"
+#include "mozilla/Telemetry.h"
 #include "mozilla/Unused.h"
 #include "nsAutoPtr.h"
 #include "nsAtom.h"
 #include "nsIFile.h"
 #include "nsIPrincipal.h"
 #include "nsIRunnable.h"
 #include "nsISimpleEnumerator.h"
 #include "nsIThread.h"
@@ -289,16 +291,23 @@ class Client : public quota::Client {
   void StartIdleMaintenance() override;
 
   void StopIdleMaintenance() override;
 
   void ShutdownWorkThreads() override;
 
  private:
   ~Client() override;
+
+  nsresult GetUsageForOriginInternal(PersistenceType aPersistenceType,
+                                     const nsACString& aGroup,
+                                     const nsACString& aOrigin,
+                                     const AtomicBool& aCanceled,
+                                     UsageInfo* aUsageInfo,
+                                     const bool aInitializing);
 };
 
 // FileDescriptorHolder owns a file descriptor and its memory mapping.
 // FileDescriptorHolder is derived by two runnable classes (that is,
 // (Parent|Child)Runnable.
 class FileDescriptorHolder : public Runnable {
  public:
   FileDescriptorHolder()
@@ -1661,71 +1670,27 @@ Client::Type Client::GetType() { return 
 
 nsresult Client::InitOrigin(PersistenceType aPersistenceType,
                             const nsACString& aGroup, const nsACString& aOrigin,
                             const AtomicBool& aCanceled,
                             UsageInfo* aUsageInfo) {
   if (!aUsageInfo) {
     return NS_OK;
   }
-  return GetUsageForOrigin(aPersistenceType, aGroup, aOrigin, aCanceled,
-                           aUsageInfo);
+  return GetUsageForOriginInternal(aPersistenceType, aGroup, aOrigin, aCanceled,
+                                   aUsageInfo, /* aInitializing */ true);
 }
 
 nsresult Client::GetUsageForOrigin(PersistenceType aPersistenceType,
                                    const nsACString& aGroup,
                                    const nsACString& aOrigin,
                                    const AtomicBool& aCanceled,
                                    UsageInfo* aUsageInfo) {
-  QuotaManager* qm = QuotaManager::Get();
-  MOZ_ASSERT(qm, "We were being called by the QuotaManager");
-
-  nsCOMPtr<nsIFile> directory;
-  nsresult rv = qm->GetDirectoryForOrigin(aPersistenceType, aOrigin,
-                                          getter_AddRefs(directory));
-  if (NS_WARN_IF(NS_FAILED(rv))) {
-    return rv;
-  }
-
-  MOZ_ASSERT(directory, "We're here because the origin directory exists");
-
-  rv = directory->Append(NS_LITERAL_STRING(ASMJSCACHE_DIRECTORY_NAME));
-  if (NS_WARN_IF(NS_FAILED(rv))) {
-    return rv;
-  }
-
-  DebugOnly<bool> exists;
-  MOZ_ASSERT(NS_SUCCEEDED(directory->Exists(&exists)) && exists);
-
-  nsCOMPtr<nsIDirectoryEnumerator> entries;
-  rv = directory->GetDirectoryEntries(getter_AddRefs(entries));
-  if (NS_WARN_IF(NS_FAILED(rv))) {
-    return rv;
-  }
-
-  nsCOMPtr<nsIFile> file;
-  while (NS_SUCCEEDED((rv = entries->GetNextFile(getter_AddRefs(file)))) &&
-         file && !aCanceled) {
-    int64_t fileSize;
-    rv = file->GetFileSize(&fileSize);
-    if (NS_WARN_IF(NS_FAILED(rv))) {
-      return rv;
-    }
-
-    MOZ_ASSERT(fileSize >= 0, "Negative size?!");
-
-    // Since the client is not explicitly storing files, append to database
-    // usage which represents implicit storage allocation.
-    aUsageInfo->AppendToDatabaseUsage(uint64_t(fileSize));
-  }
-  if (NS_WARN_IF(NS_FAILED(rv))) {
-    return rv;
-  }
-
-  return NS_OK;
+  return GetUsageForOriginInternal(aPersistenceType, aGroup, aOrigin, aCanceled,
+                                   aUsageInfo, /* aInitializing */ false);
 }
 
 void Client::OnOriginClearCompleted(PersistenceType aPersistenceType,
                                     const nsACString& aOrigin) {}
 
 void Client::ReleaseIOThreadObjects() {}
 
 void Client::AbortOperations(const nsACString& aOrigin) {}
@@ -1742,16 +1707,82 @@ void Client::ShutdownWorkThreads() {
 
   mShutdownRequested = true;
 
   if (sLiveParentActors) {
     MOZ_ALWAYS_TRUE(SpinEventLoopUntil([&]() { return !sLiveParentActors; }));
   }
 }
 
+nsresult Client::GetUsageForOriginInternal(PersistenceType aPersistenceType,
+                                           const nsACString& aGroup,
+                                           const nsACString& aOrigin,
+                                           const AtomicBool& aCanceled,
+                                           UsageInfo* aUsageInfo,
+                                           const bool aInitializing) {
+  QuotaManager* qm = QuotaManager::Get();
+  MOZ_ASSERT(qm, "We were being called by the QuotaManager");
+#ifndef NIGHTLY_BUILD
+  Unused << aInitializing;
+#endif
+
+  nsCOMPtr<nsIFile> directory;
+  nsresult rv = qm->GetDirectoryForOrigin(aPersistenceType, aOrigin,
+                                          getter_AddRefs(directory));
+  if (NS_WARN_IF(NS_FAILED(rv))) {
+    REPORT_TELEMETRY_ERR_IN_INIT(aInitializing, kExternalError,
+                                 Asm_GetDirForOrigin);
+    return rv;
+  }
+
+  MOZ_ASSERT(directory, "We're here because the origin directory exists");
+
+  rv = directory->Append(NS_LITERAL_STRING(ASMJSCACHE_DIRECTORY_NAME));
+  if (NS_WARN_IF(NS_FAILED(rv))) {
+    REPORT_TELEMETRY_ERR_IN_INIT(aInitializing, kExternalError, Asm_Append);
+    return rv;
+  }
+
+  DebugOnly<bool> exists;
+  MOZ_ASSERT(NS_SUCCEEDED(directory->Exists(&exists)) && exists);
+
+  nsCOMPtr<nsIDirectoryEnumerator> entries;
+  rv = directory->GetDirectoryEntries(getter_AddRefs(entries));
+  if (NS_WARN_IF(NS_FAILED(rv))) {
+    REPORT_TELEMETRY_ERR_IN_INIT(aInitializing, kExternalError,
+                                 Asm_GetDirEntries);
+    return rv;
+  }
+
+  nsCOMPtr<nsIFile> file;
+  while (NS_SUCCEEDED((rv = entries->GetNextFile(getter_AddRefs(file)))) &&
+         file && !aCanceled) {
+    int64_t fileSize;
+    rv = file->GetFileSize(&fileSize);
+    if (NS_WARN_IF(NS_FAILED(rv))) {
+      REPORT_TELEMETRY_ERR_IN_INIT(aInitializing, kExternalError,
+                                   Asm_GetFileSize);
+      return rv;
+    }
+
+    MOZ_ASSERT(fileSize >= 0, "Negative size?!");
+
+    // Since the client is not explicitly storing files, append to database
+    // usage which represents implicit storage allocation.
+    aUsageInfo->AppendToDatabaseUsage(uint64_t(fileSize));
+  }
+  if (NS_WARN_IF(NS_FAILED(rv))) {
+    REPORT_TELEMETRY_ERR_IN_INIT(aInitializing, kExternalError,
+                                 Asm_GetNextFile);
+    return rv;
+  }
+
+  return NS_OK;
+}
+
 quota::Client* CreateClient() { return new Client(); }
 
 }  // namespace asmjscache
 }  // namespace dom
 }  // namespace mozilla
 
 namespace IPC {
 
--- a/dom/cache/QuotaClient.cpp
+++ b/dom/cache/QuotaClient.cpp
@@ -4,19 +4,21 @@
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #include "mozilla/dom/cache/QuotaClient.h"
 
 #include "DBAction.h"
 #include "FileUtils.h"
 #include "mozilla/dom/cache/Manager.h"
+#include "mozilla/dom/quota/QuotaCommon.h"
 #include "mozilla/dom/quota/QuotaManager.h"
 #include "mozilla/dom/quota/UsageInfo.h"
 #include "mozilla/ipc/BackgroundParent.h"
+#include "mozilla/Telemetry.h"
 #include "mozilla/Unused.h"
 #include "nsIFile.h"
 #include "nsISimpleEnumerator.h"
 #include "nsThreadUtils.h"
 
 namespace {
 
 using mozilla::Atomic;
@@ -146,128 +148,29 @@ class CacheQuotaClient final : public Cl
     AssertIsOnIOThread();
 
     // The QuotaManager passes a nullptr UsageInfo if there is no quota being
     // enforced against the origin.
     if (!aUsageInfo) {
       return NS_OK;
     }
 
-    return GetUsageForOrigin(aPersistenceType, aGroup, aOrigin, aCanceled,
-                             aUsageInfo);
+    return GetUsageForOriginInternal(aPersistenceType, aGroup, aOrigin,
+                                     aCanceled, aUsageInfo,
+                                     /* aInitializing*/ true);
   }
 
   virtual nsresult GetUsageForOrigin(PersistenceType aPersistenceType,
                                      const nsACString& aGroup,
                                      const nsACString& aOrigin,
                                      const AtomicBool& aCanceled,
                                      UsageInfo* aUsageInfo) override {
-    AssertIsOnIOThread();
-    MOZ_DIAGNOSTIC_ASSERT(aUsageInfo);
-
-    QuotaManager* qm = QuotaManager::Get();
-    MOZ_DIAGNOSTIC_ASSERT(qm);
-
-    nsCOMPtr<nsIFile> dir;
-    nsresult rv = qm->GetDirectoryForOrigin(aPersistenceType, aOrigin,
-                                            getter_AddRefs(dir));
-    if (NS_WARN_IF(NS_FAILED(rv))) {
-      return rv;
-    }
-
-    rv = dir->Append(NS_LITERAL_STRING(DOMCACHE_DIRECTORY_NAME));
-    if (NS_WARN_IF(NS_FAILED(rv))) {
-      return rv;
-    }
-
-    int64_t paddingSize = 0;
-    {
-      // If the tempoary file still exists after locking, it means the previous
-      // action fails, so restore the padding file.
-      MutexAutoLock lock(mDirPaddingFileMutex);
-
-      if (mozilla::dom::cache::DirectoryPaddingFileExists(
-              dir, DirPaddingFile::TMP_FILE) ||
-          NS_WARN_IF(NS_FAILED(mozilla::dom::cache::LockedDirectoryPaddingGet(
-              dir, &paddingSize)))) {
-        rv = LockedGetPaddingSizeFromDB(dir, aGroup, aOrigin, &paddingSize);
-        if (NS_WARN_IF(NS_FAILED(rv))) {
-          return rv;
-        }
-      }
-    }
-
-    aUsageInfo->AppendToFileUsage(paddingSize);
-
-    nsCOMPtr<nsIDirectoryEnumerator> entries;
-    rv = dir->GetDirectoryEntries(getter_AddRefs(entries));
-    if (NS_WARN_IF(NS_FAILED(rv))) {
-      return rv;
-    }
-
-    nsCOMPtr<nsIFile> file;
-    while (NS_SUCCEEDED(rv = entries->GetNextFile(getter_AddRefs(file))) &&
-           file && !aCanceled) {
-      nsAutoString leafName;
-      rv = file->GetLeafName(leafName);
-      if (NS_WARN_IF(NS_FAILED(rv))) {
-        return rv;
-      }
-
-      bool isDir;
-      rv = file->IsDirectory(&isDir);
-      if (NS_WARN_IF(NS_FAILED(rv))) {
-        return rv;
-      }
-
-      if (isDir) {
-        if (leafName.EqualsLiteral("morgue")) {
-          rv = GetBodyUsage(file, aCanceled, aUsageInfo);
-          if (NS_WARN_IF(NS_FAILED(rv))) {
-            return rv;
-          }
-        } else {
-          NS_WARNING("Unknown Cache directory found!");
-        }
-
-        continue;
-      }
-
-      // Ignore transient sqlite files and marker files
-      if (leafName.EqualsLiteral("caches.sqlite-journal") ||
-          leafName.EqualsLiteral("caches.sqlite-shm") ||
-          leafName.Find(NS_LITERAL_CSTRING("caches.sqlite-mj"), false, 0, 0) ==
-              0 ||
-          leafName.EqualsLiteral("context_open.marker")) {
-        continue;
-      }
-
-      if (leafName.EqualsLiteral("caches.sqlite") ||
-          leafName.EqualsLiteral("caches.sqlite-wal")) {
-        int64_t fileSize;
-        rv = file->GetFileSize(&fileSize);
-        if (NS_WARN_IF(NS_FAILED(rv))) {
-          return rv;
-        }
-        MOZ_DIAGNOSTIC_ASSERT(fileSize >= 0);
-
-        aUsageInfo->AppendToDatabaseUsage(fileSize);
-        continue;
-      }
-
-      // Ignore directory padding file
-      if (leafName.EqualsLiteral(PADDING_FILE_NAME) ||
-          leafName.EqualsLiteral(PADDING_TMP_FILE_NAME)) {
-        continue;
-      }
-
-      NS_WARNING("Unknown Cache file found!");
-    }
-
-    return NS_OK;
+    return GetUsageForOriginInternal(aPersistenceType, aGroup, aOrigin,
+                                     aCanceled, aUsageInfo,
+                                     /* aInitializing*/ false);
   }
 
   virtual void OnOriginClearCompleted(PersistenceType aPersistenceType,
                                       const nsACString& aOrigin) override {
     // Nothing to do here.
   }
 
   virtual void ReleaseIOThreadObjects() override {
@@ -455,16 +358,145 @@ class CacheQuotaClient final : public Cl
  private:
   ~CacheQuotaClient() {
     AssertIsOnBackgroundThread();
     MOZ_DIAGNOSTIC_ASSERT(sInstance == this);
 
     sInstance = nullptr;
   }
 
+  nsresult GetUsageForOriginInternal(PersistenceType aPersistenceType,
+                                     const nsACString& aGroup,
+                                     const nsACString& aOrigin,
+                                     const AtomicBool& aCanceled,
+                                     UsageInfo* aUsageInfo,
+                                     const bool aInitializing) {
+    AssertIsOnIOThread();
+    MOZ_DIAGNOSTIC_ASSERT(aUsageInfo);
+#ifndef NIGHTLY_BUILD
+    Unused << aInitializing;
+#endif
+
+    QuotaManager* qm = QuotaManager::Get();
+    MOZ_DIAGNOSTIC_ASSERT(qm);
+
+    nsCOMPtr<nsIFile> dir;
+    nsresult rv = qm->GetDirectoryForOrigin(aPersistenceType, aOrigin,
+                                            getter_AddRefs(dir));
+    if (NS_WARN_IF(NS_FAILED(rv))) {
+      REPORT_TELEMETRY_ERR_IN_INIT(aInitializing, kExternalError,
+                                   Cache_GetDirForOri);
+      return rv;
+    }
+
+    rv = dir->Append(NS_LITERAL_STRING(DOMCACHE_DIRECTORY_NAME));
+    if (NS_WARN_IF(NS_FAILED(rv))) {
+      REPORT_TELEMETRY_ERR_IN_INIT(aInitializing, kExternalError, Cache_Append);
+      return rv;
+    }
+
+    int64_t paddingSize = 0;
+    {
+      // If the tempoary file still exists after locking, it means the previous
+      // action fails, so restore the padding file.
+      MutexAutoLock lock(mDirPaddingFileMutex);
+
+      if (mozilla::dom::cache::DirectoryPaddingFileExists(
+              dir, DirPaddingFile::TMP_FILE) ||
+          NS_WARN_IF(NS_FAILED(mozilla::dom::cache::LockedDirectoryPaddingGet(
+              dir, &paddingSize)))) {
+        rv = LockedGetPaddingSizeFromDB(dir, aGroup, aOrigin, &paddingSize);
+        if (NS_WARN_IF(NS_FAILED(rv))) {
+          REPORT_TELEMETRY_ERR_IN_INIT(aInitializing, kInternalError,
+                                       Cache_GetPaddingSize);
+          return rv;
+        }
+      }
+    }
+
+    aUsageInfo->AppendToFileUsage(paddingSize);
+
+    nsCOMPtr<nsIDirectoryEnumerator> entries;
+    rv = dir->GetDirectoryEntries(getter_AddRefs(entries));
+    if (NS_WARN_IF(NS_FAILED(rv))) {
+      REPORT_TELEMETRY_ERR_IN_INIT(aInitializing, kExternalError,
+                                   Cache_GetDirEntries);
+      return rv;
+    }
+
+    nsCOMPtr<nsIFile> file;
+    while (NS_SUCCEEDED(rv = entries->GetNextFile(getter_AddRefs(file))) &&
+           file && !aCanceled) {
+      nsAutoString leafName;
+      rv = file->GetLeafName(leafName);
+      if (NS_WARN_IF(NS_FAILED(rv))) {
+        REPORT_TELEMETRY_ERR_IN_INIT(aInitializing, kExternalError,
+                                     Cache_GetLeafName);
+        return rv;
+      }
+
+      bool isDir;
+      rv = file->IsDirectory(&isDir);
+      if (NS_WARN_IF(NS_FAILED(rv))) {
+        REPORT_TELEMETRY_ERR_IN_INIT(aInitializing, kExternalError,
+                                     Cache_IsDirectory);
+        return rv;
+      }
+
+      if (isDir) {
+        if (leafName.EqualsLiteral("morgue")) {
+          rv = GetBodyUsage(file, aCanceled, aUsageInfo);
+          if (NS_WARN_IF(NS_FAILED(rv))) {
+            REPORT_TELEMETRY_ERR_IN_INIT(aInitializing, kExternalError,
+                                         Cache_GetBodyUsage);
+            return rv;
+          }
+        } else {
+          NS_WARNING("Unknown Cache directory found!");
+        }
+
+        continue;
+      }
+
+      // Ignore transient sqlite files and marker files
+      if (leafName.EqualsLiteral("caches.sqlite-journal") ||
+          leafName.EqualsLiteral("caches.sqlite-shm") ||
+          leafName.Find(NS_LITERAL_CSTRING("caches.sqlite-mj"), false, 0, 0) ==
+              0 ||
+          leafName.EqualsLiteral("context_open.marker")) {
+        continue;
+      }
+
+      if (leafName.EqualsLiteral("caches.sqlite") ||
+          leafName.EqualsLiteral("caches.sqlite-wal")) {
+        int64_t fileSize;
+        rv = file->GetFileSize(&fileSize);
+        if (NS_WARN_IF(NS_FAILED(rv))) {
+          REPORT_TELEMETRY_ERR_IN_INIT(aInitializing, kExternalError,
+                                       Cache_GetFileSize);
+          return rv;
+        }
+        MOZ_DIAGNOSTIC_ASSERT(fileSize >= 0);
+
+        aUsageInfo->AppendToDatabaseUsage(fileSize);
+        continue;
+      }
+
+      // Ignore directory padding file
+      if (leafName.EqualsLiteral(PADDING_FILE_NAME) ||
+          leafName.EqualsLiteral(PADDING_TMP_FILE_NAME)) {
+        continue;
+      }
+
+      NS_WARNING("Unknown Cache file found!");
+    }
+
+    return NS_OK;
+  }
+
   NS_INLINE_DECL_THREADSAFE_REFCOUNTING(CacheQuotaClient, override)
 
   // Mutex lock to protect directroy padding files. It should only be acquired
   // in DOM Cache IO threads and Quota IO thread.
   mozilla::Mutex mDirPaddingFileMutex;
 };
 
 // static
new file mode 100644
--- /dev/null
+++ b/dom/chrome-webidl/SessionStoreUtils.webidl
@@ -0,0 +1,141 @@
+/* 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/. */
+
+interface nsIDocShell;
+interface nsISupports;
+
+/**
+ * A callback passed to SessionStoreUtils.forEachNonDynamicChildFrame().
+ */
+callback SessionStoreUtilsFrameCallback = void (WindowProxy frame, unsigned long index);
+
+/**
+ * SessionStore utility functions implemented in C++ for performance reasons.
+ */
+[ChromeOnly, Exposed=Window]
+namespace SessionStoreUtils {
+  /**
+   * Calls the given |callback| once for each non-dynamic child frame of the
+   * given |window|.
+   */
+  [Throws]
+  void forEachNonDynamicChildFrame(WindowProxy window,
+                                   SessionStoreUtilsFrameCallback callback);
+
+  /**
+   * Takes the given listener, wraps it in a filter that filters out events from
+   * dynamic docShells, and adds that filter as a listener for the given event
+   * type on the given event target.  The listener that was added is returned
+   * (as nsISupports) so that it can later be removed via
+   * removeDynamicFrameFilteredListener.
+   *
+   * This is implemented as a native filter, rather than a JS-based one, for
+   * performance reasons.
+   */
+  [Throws]
+  nsISupports? addDynamicFrameFilteredListener(EventTarget target,
+                                               DOMString type,
+                                               any listener,
+                                               boolean useCapture,
+                                               optional boolean mozSystemGroup = false);
+
+  /**
+   * Remove the passed-in filtered listener from the given event target, if it's
+   * currently a listener for the given event type there.  The 'listener'
+   * argument must be something that was returned by
+   * addDynamicFrameFilteredListener.
+   *
+   * This is needed, instead of the normal removeEventListener, because the
+   * caller doesn't actually have something that WebIDL considers an
+   * EventListener.
+   */
+  [Throws]
+  void removeDynamicFrameFilteredListener(EventTarget target,
+                                          DOMString type,
+                                          nsISupports listener,
+                                          boolean useCapture,
+                                          optional boolean mozSystemGroup = false);
+
+  /*
+   * Save the docShell.allow* properties
+   */
+  ByteString collectDocShellCapabilities(nsIDocShell docShell);
+
+  /*
+   * Restore the docShell.allow* properties
+   */
+  void restoreDocShellCapabilities(nsIDocShell docShell,
+                                   ByteString disallowCapabilities);
+
+  /**
+   * Collects scroll position data for any given |frame| in the frame hierarchy.
+   *
+   * @param document (DOMDocument)
+   *
+   * @return {scroll: "x,y"} e.g. {scroll: "100,200"}
+   *         Returns null when there is no scroll data we want to store for the
+   *         given |frame|.
+   */
+  SSScrollPositionDict collectScrollPosition(Document document);
+
+  /**
+   * Restores scroll position data for any given |frame| in the frame hierarchy.
+   *
+   * @param frame (DOMWindow)
+   * @param value (object, see collectScrollPosition())
+   */
+  void restoreScrollPosition(Window frame, optional SSScrollPositionDict data);
+
+  /**
+   * Collect form data for a given |frame| *not* including any subframes.
+   *
+   * The returned object may have an "id", "xpath", or "innerHTML" key or a
+   * combination of those three. Form data stored under "id" is for input
+   * fields with id attributes. Data stored under "xpath" is used for input
+   * fields that don't have a unique id and need to be queried using XPath.
+   * The "innerHTML" key is used for editable documents (designMode=on).
+   *
+   * Example:
+   *   {
+   *     id: {input1: "value1", input3: "value3"},
+   *     xpath: {
+   *       "/xhtml:html/xhtml:body/xhtml:input[@name='input2']" : "value2",
+   *       "/xhtml:html/xhtml:body/xhtml:input[@name='input4']" : "value4"
+   *     }
+   *   }
+   *
+   * @param  doc
+   *         DOMDocument instance to obtain form data for.
+   * @return object
+   *         Form data encoded in an object.
+   */
+  CollectedFormData collectFormData(Document document);
+};
+
+dictionary SSScrollPositionDict {
+  ByteString scroll;
+};
+
+dictionary CollectedFileListValue
+{
+  required DOMString type;
+  required sequence<DOMString> fileList;
+};
+
+dictionary CollectedNonMultipleSelectValue
+{
+  required long selectedIndex;
+  required DOMString value;
+};
+
+// object contains either a CollectedFileListValue or a CollectedNonMultipleSelectValue or Sequence<DOMString>
+typedef (DOMString or boolean or long or object) CollectedFormDataValue;
+
+dictionary CollectedFormData
+{
+  record<DOMString, CollectedFormDataValue> id;
+  record<DOMString, CollectedFormDataValue> xpath;
+  DOMString innerHTML;
+  ByteString url;
+};
--- a/dom/chrome-webidl/moz.build
+++ b/dom/chrome-webidl/moz.build
@@ -45,16 +45,17 @@ WEBIDL_FILES = [
     'MessageManager.webidl',
     'MozDocumentObserver.webidl',
     'MozSharedMap.webidl',
     'MozStorageAsyncStatementParams.webidl',
     'MozStorageStatementParams.webidl',
     'MozStorageStatementRow.webidl',
     'PrecompiledScript.webidl',
     'PromiseDebugging.webidl',
+    'SessionStoreUtils.webidl',
     'StructuredCloneHolder.webidl',
     'TelemetryStopwatch.webidl',
     'WebExtensionContentScript.webidl',
     'WebExtensionPolicy.webidl',
     'WindowGlobalActors.webidl',
     'XULFrameElement.webidl',
     'XULMenuElement.webidl',
     'XULScrollElement.webidl',
--- a/dom/indexedDB/ActorsParent.cpp
+++ b/dom/indexedDB/ActorsParent.cpp
@@ -53,16 +53,17 @@
 #include "mozilla/dom/indexedDB/PBackgroundIDBVersionChangeTransactionParent.h"
 #include "mozilla/dom/indexedDB/PBackgroundIndexedDBUtilsParent.h"
 #include "mozilla/dom/indexedDB/PIndexedDBPermissionRequestParent.h"
 #include "mozilla/dom/IPCBlobUtils.h"
 #include "mozilla/dom/ipc/IPCBlobInputStreamParent.h"
 #include "mozilla/dom/quota/Client.h"
 #include "mozilla/dom/quota/FileStreams.h"
 #include "mozilla/dom/quota/OriginScope.h"
+#include "mozilla/dom/quota/QuotaCommon.h"
 #include "mozilla/dom/quota/QuotaManager.h"
 #include "mozilla/dom/quota/UsageInfo.h"
 #include "mozilla/ipc/BackgroundParent.h"
 #include "mozilla/ipc/BackgroundUtils.h"
 #include "mozilla/ipc/InputStreamParams.h"
 #include "mozilla/ipc/InputStreamUtils.h"
 #include "mozilla/ipc/PBackground.h"
 #include "mozilla/ipc/PBackgroundParent.h"
@@ -15513,125 +15514,139 @@ nsresult QuotaClient::InitOrigin(Persist
                                  const AtomicBool& aCanceled,
                                  UsageInfo* aUsageInfo) {
   AssertIsOnIOThread();
 
   nsCOMPtr<nsIFile> directory;
   nsresult rv =
       GetDirectory(aPersistenceType, aOrigin, getter_AddRefs(directory));
   if (NS_WARN_IF(NS_FAILED(rv))) {
+    REPORT_TELEMETRY_INIT_ERR(kExternalError, IDB_GetDirectory);
     return rv;
   }
 
   // We need to see if there are any files in the directory already. If they
   // are database files then we need to cleanup stored files (if it's needed)
   // and also get the usage.
 
   AutoTArray<nsString, 20> subdirsToProcess;
   nsTHashtable<nsStringHashKey> databaseFilenames(20);
   rv = GetDatabaseFilenames(directory, aCanceled,
                             /* aForUpgrade */ false, subdirsToProcess,
                             databaseFilenames);
   if (NS_WARN_IF(NS_FAILED(rv))) {
+    REPORT_TELEMETRY_INIT_ERR(kExternalError, IDB_GetDBFilenames);
     return rv;
   }
 
   const NS_ConvertASCIItoUTF16 filesSuffix(
       kFileManagerDirectoryNameSuffix,
       LiteralStringLength(kFileManagerDirectoryNameSuffix));
 
   for (uint32_t count = subdirsToProcess.Length(), i = 0; i < count; i++) {
     const nsString& subdirName = subdirsToProcess[i];
 
     // The directory must have the correct suffix.
     nsDependentSubstring subdirNameBase;
     if (NS_WARN_IF(!GetBaseFilename(subdirName, filesSuffix, subdirNameBase))) {
+      REPORT_TELEMETRY_INIT_ERR(kInternalError, IDB_GetBaseFilename);
       return NS_ERROR_UNEXPECTED;
     }
 
     // The directory base must exist in databaseFilenames.
     if (NS_WARN_IF(!databaseFilenames.GetEntry(subdirNameBase))) {
+      REPORT_TELEMETRY_INIT_ERR(kInternalError, IDB_GetEntry);
       return NS_ERROR_UNEXPECTED;
     }
   }
 
   const NS_ConvertASCIItoUTF16 sqliteSuffix(kSQLiteSuffix,
                                             LiteralStringLength(kSQLiteSuffix));
   const NS_ConvertASCIItoUTF16 walSuffix(kSQLiteWALSuffix,
                                          LiteralStringLength(kSQLiteWALSuffix));
 
   for (auto iter = databaseFilenames.ConstIter(); !iter.Done() && !aCanceled;
        iter.Next()) {
     auto& databaseFilename = iter.Get()->GetKey();
 
     nsCOMPtr<nsIFile> fmDirectory;
     rv = directory->Clone(getter_AddRefs(fmDirectory));
     if (NS_WARN_IF(NS_FAILED(rv))) {
+      REPORT_TELEMETRY_INIT_ERR(kExternalError, IDB_Clone);
       return rv;
     }
 
     rv = fmDirectory->Append(databaseFilename + filesSuffix);
     if (NS_WARN_IF(NS_FAILED(rv))) {
+      REPORT_TELEMETRY_INIT_ERR(kExternalError, IDB_Append);
       return rv;
     }
 
     nsCOMPtr<nsIFile> databaseFile;
     rv = directory->Clone(getter_AddRefs(databaseFile));
     if (NS_WARN_IF(NS_FAILED(rv))) {
+      REPORT_TELEMETRY_INIT_ERR(kExternalError, IDB_Clone2);
       return rv;
     }
 
     rv = databaseFile->Append(databaseFilename + sqliteSuffix);
     if (NS_WARN_IF(NS_FAILED(rv))) {
+      REPORT_TELEMETRY_INIT_ERR(kExternalError, IDB_Append2);
       return rv;
     }
 
     nsCOMPtr<nsIFile> walFile;
     if (aUsageInfo) {
       rv = directory->Clone(getter_AddRefs(walFile));
       if (NS_WARN_IF(NS_FAILED(rv))) {
+        REPORT_TELEMETRY_INIT_ERR(kExternalError, IDB_Clone3);
         return rv;
       }
 
       rv = walFile->Append(databaseFilename + walSuffix);
       if (NS_WARN_IF(NS_FAILED(rv))) {
+        REPORT_TELEMETRY_INIT_ERR(kExternalError, IDB_Append3);
         return rv;
       }
     }
 
     rv = FileManager::InitDirectory(fmDirectory, databaseFile, aPersistenceType,
                                     aGroup, aOrigin,
                                     TelemetryIdForFile(databaseFile));
     if (NS_WARN_IF(NS_FAILED(rv))) {
+      REPORT_TELEMETRY_INIT_ERR(kInternalError, IDB_InitDirectory);
       return rv;
     }
 
     if (aUsageInfo) {
       int64_t fileSize;
       rv = databaseFile->GetFileSize(&fileSize);
       if (NS_WARN_IF(NS_FAILED(rv))) {
+        REPORT_TELEMETRY_INIT_ERR(kExternalError, IDB_GetFileSize);
         return rv;
       }
 
       MOZ_ASSERT(fileSize >= 0);
 
       aUsageInfo->AppendToDatabaseUsage(uint64_t(fileSize));
 
       rv = walFile->GetFileSize(&fileSize);
       if (NS_SUCCEEDED(rv)) {
         MOZ_ASSERT(fileSize >= 0);
         aUsageInfo->AppendToDatabaseUsage(uint64_t(fileSize));
       } else if (NS_WARN_IF(rv != NS_ERROR_FILE_NOT_FOUND &&
                             rv != NS_ERROR_FILE_TARGET_DOES_NOT_EXIST)) {
+        REPORT_TELEMETRY_INIT_ERR(kExternalError, IDB_GetWalFileSize);
         return rv;
       }
 
       uint64_t usage;
       rv = FileManager::GetUsage(fmDirectory, &usage);
       if (NS_WARN_IF(NS_FAILED(rv))) {
+        REPORT_TELEMETRY_INIT_ERR(kExternalError, IDB_GetUsage);
         return rv;
       }
 
       aUsageInfo->AppendToFileUsage(usage);
     }
   }
 
   return NS_OK;
--- a/dom/indexedDB/test/helpers.js
+++ b/dom/indexedDB/test/helpers.js
@@ -1,17 +1,20 @@
 /**
  * Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/
  */
 
 // testSteps is expected to be defined by the test using this file.
 /* global testSteps:false */
 
-var testGenerator = testSteps();
+var testGenerator;
+if (testSteps.constructor.name === "GeneratorFunction") {
+  testGenerator = testSteps();
+}
 // The test js is shared between xpcshell (which has no SpecialPowers object)
 // and content mochitests (where the |Components| object is accessible only as
 // SpecialPowers.Components). Expose Components if necessary here to make things
 // work everywhere.
 //
 // Even if the real |Components| doesn't exist, we might shim in a simple JS
 // placebo for compat. An easy way to differentiate this from the real thing
 // is whether the property is read-only or not.
@@ -41,16 +44,22 @@ function clearAllDatabases(callback) {
 var testHarnessGenerator = testHarnessSteps();
 testHarnessGenerator.next();
 
 function* testHarnessSteps() {
   function nextTestHarnessStep(val) {
     testHarnessGenerator.next(val);
   }
 
+  let script = document.createElement("script");
+  script.src = "/tests/SimpleTest/AddTask.js";
+  script.onload = nextTestHarnessStep;
+  document.head.appendChild(script);
+  yield undefined;
+
   let testScriptPath;
   let testScriptFilename;
 
   let scripts = document.getElementsByTagName("script");
   for (let i = 0; i < scripts.length; i++) {
     let src = scripts[i].src;
     let match = src.match(/indexedDB\/test\/unit\/(test_[^\/]+\.js)$/);
     if (match && match.length == 2) {
@@ -94,129 +103,78 @@ function* testHarnessSteps() {
   yield undefined;
 
   info("Clearing old databases");
 
   clearAllDatabases(nextTestHarnessStep);
   yield undefined;
 
   if (testScriptFilename && !window.disableWorkerTest) {
-    info("Running test in a worker");
-
-    let workerScriptBlob =
-      new Blob([ "(" + workerScript.toString() + ")();" ],
-               { type: "text/javascript" });
-    let workerScriptURL = URL.createObjectURL(workerScriptBlob);
-
-    let worker = new Worker(workerScriptURL);
-
-    worker._expectingUncaughtException = false;
-    worker.onerror = function(event) {
-      if (worker._expectingUncaughtException) {
-        ok(true, "Worker had an expected error: " + event.message);
-        worker._expectingUncaughtException = false;
-        event.preventDefault();
-        return;
-      }
-      ok(false, "Worker had an error: " + event.message);
-      worker.terminate();
-      nextTestHarnessStep();
-    };
-
-    worker.onmessage = function(event) {
-      let message = event.data;
-      switch (message.op) {
-        case "ok":
-          SimpleTest.ok(message.condition, `${message.name}: ${message.diag}`);
-          break;
-
-        case "todo":
-          todo(message.condition, message.name, message.diag);
-          break;
-
-        case "info":
-          info(message.msg);
-          break;
-
-        case "ready":
-          worker.postMessage({ op: "load", files: [ testScriptPath ] });
-          break;
+    // For the AsyncFunction, let AddTask.js handle the executing sequece by
+    // add_task(). For the GeneratorFunction, we just handle the sequence
+    // manually.
+    if (testSteps.constructor.name === "AsyncFunction") {
+      add_task(function workerTestSteps() {
+        return executeWorkerTestAndCleanUp(testScriptPath);
+      });
+    } else {
+      ok(testSteps.constructor.name === "GeneratorFunction",
+         "Unsupported function type");
+      executeWorkerTestAndCleanUp(testScriptPath)
+        .then(nextTestHarnessStep);
 
-        case "loaded":
-          worker.postMessage({ op: "start", wasmSupported: isWasmSupported() });
-          break;
-
-        case "done":
-          ok(true, "Worker finished");
-          nextTestHarnessStep();
-          break;
-
-        case "expectUncaughtException":
-          worker._expectingUncaughtException = message.expecting;
-          break;
-
-        case "clearAllDatabases":
-          clearAllDatabases(function() {
-            worker.postMessage({ op: "clearAllDatabasesDone" });
-          });
-          break;
-
-        case "getWasmBinary":
-          worker.postMessage({ op: "getWasmBinaryDone",
-                               wasmBinary: getWasmBinarySync(message.text) });
-          break;
-
-        default:
-          ok(false,
-             "Received a bad message from worker: " + JSON.stringify(message));
-          nextTestHarnessStep();
-      }
-    };
-
-    URL.revokeObjectURL(workerScriptURL);
-
-    yield undefined;
-
-    if (worker._expectingUncaughtException) {
-      ok(false, "expectUncaughtException was called but no uncaught " +
-                "exception was detected!");
+      yield undefined;
     }
-
-    worker.terminate();
-    worker = null;
-
-    clearAllDatabases(nextTestHarnessStep);
-    yield undefined;
   } else if (testScriptFilename) {
     todo(false,
          "Skipping test in a worker because it is explicitly disabled: " +
          window.disableWorkerTest);
   } else {
     todo(false,
          "Skipping test in a worker because it's not structured properly");
   }
 
   info("Running test in main thread");
 
   // Now run the test script in the main thread.
-  testGenerator.next();
+  if (testSteps.constructor.name === "AsyncFunction") {
+    // Register a callback to clean up databases because it's the only way for
+    // add_task() to clean them right before the SimpleTest.FinishTest
+    SimpleTest.registerCleanupFunction(async function() {
+      await new Promise(function(resolve, reject) {
+        clearAllDatabases(function(result) {
+          if (result.resultCode == SpecialPowers.Cr.NS_OK) {
+            resolve(result);
+          } else {
+            reject(result.resultCode);
+          }
+        });
+      });
+    });
 
-  yield undefined;
+    add_task(testSteps);
+  } else {
+    testGenerator.next();
+
+    yield undefined;
+  }
 }
 
 if (!window.runTest) {
   window.runTest = function()
   {
     SimpleTest.waitForExplicitFinish();
     testHarnessGenerator.next();
   };
 }
 
 function finishTest()
 {
+  ok(testSteps.constructor.name === "GeneratorFunction",
+     "Async/await tests shouldn't call finishTest()");
   SimpleTest.executeSoon(function() {
     clearAllDatabases(function() { SimpleTest.finish(); });
   });
 }
 
 function browserRunTest()
 {
   testGenerator.next();
@@ -371,16 +329,48 @@ function getWasmBinary(text) {
     testGenerator.next(binary);
   });
 }
 function getWasmModule(_binary_) {
   let module = new WebAssembly.Module(_binary_);
   return module;
 }
 
+function expectingSuccess(request) {
+  return new Promise(function(resolve, reject) {
+    request.onerror = function(event) {
+      ok(false, "indexedDB error, '" + event.target.error.name + "'");
+      reject(event);
+    };
+    request.onsuccess = function(event) {
+      resolve(event);
+    };
+    request.onupgradeneeded = function(event) {
+      ok(false, "Got upgrade, but did not expect it!");
+      reject(event);
+    };
+  });
+}
+
+function expectingUpgrade(request) {
+  return new Promise(function(resolve, reject) {
+    request.onerror = function(event) {
+      ok(false, "indexedDB error, '" + event.target.error.name + "'");
+      reject(event);
+    };
+    request.onupgradeneeded = function(event) {
+      resolve(event);
+    };
+    request.onsuccess = function(event) {
+      ok(false, "Got success, but did not expect it!");
+      reject(event);
+    };
+  });
+}
+
 function workerScript() {
   "use strict";
 
   self.wasmSupported = false;
 
   self.repr = function(_thing_) {
     if (typeof(_thing_) == "undefined") {
       return "undefined";
@@ -437,19 +427,21 @@ function workerScript() {
 
   self.executeSoon = function(_fun_) {
     var channel = new MessageChannel();
     channel.port1.postMessage("");
     channel.port2.onmessage = function(event) { _fun_(); };
   };
 
   self.finishTest = function() {
+    self.ok(testSteps.constructor.name === "GeneratorFunction",
+            "Async/await tests shouldn't call finishTest()");
     if (self._expectingUncaughtException) {
-      self.ok(false, "expectUncaughtException was called but no uncaught "
-                     + "exception was detected!");
+      self.ok(false, "expectUncaughtException was called but no uncaught " +
+                     "exception was detected!");
     }
     self.postMessage({ op: "done" });
   };
 
   self.grabEventAndContinueHandler = function(_event_) {
     testGenerator.next(_event_);
   };
 
@@ -596,19 +588,30 @@ function workerScript() {
       case "load":
         info("Worker: loading " + JSON.stringify(message.files));
         self.importScripts(message.files);
         self.postMessage({ op: "loaded" });
         break;
 
       case "start":
         self.wasmSupported = message.wasmSupported;
-        executeSoon(function() {
+        executeSoon(async function() {
           info("Worker: starting tests");
-          testGenerator.next();
+          if (testSteps.constructor.name === "AsyncFunction") {
+            await testSteps();
+            if (self._expectingUncaughtException) {
+              self.ok(false, "expectUncaughtException was called but no " +
+                             "uncaught exception was detected!");
+            }
+            self.postMessage({ op: "done" });
+          } else {
+            ok(testSteps.constructor.name === "GeneratorFunction",
+               "Unsupported function type");
+            testGenerator.next();
+          }
         });
         break;
 
       case "clearAllDatabasesDone":
         info("Worker: all databases are cleared");
         if (self._clearAllDatabasesCallback) {
           self._clearAllDatabasesCallback();
         }
@@ -620,10 +623,140 @@ function workerScript() {
         break;
 
       default:
         throw new Error("Received a bad message from parent: " +
                         JSON.stringify(message));
     }
   };
 
+
+  self.expectingSuccess = function(_request_) {
+    return new Promise(function(_resolve_, _reject_) {
+      _request_.onerror = function(_event_) {
+        ok(false, "indexedDB error, '" + _event_.target.error.name + "'");
+        _reject_(_event_);
+      };
+      _request_.onsuccess = function(_event_) {
+        _resolve_(_event_);
+      };
+      _request_.onupgradeneeded = function(_event_) {
+        ok(false, "Got upgrade, but did not expect it!");
+        _reject_(_event_);
+        };
+      });
+  };
+
+  self.expectingUpgrade = function(_request_) {
+    return new Promise(function(_resolve_, _reject_) {
+      _request_.onerror = function(_event_) {
+        ok(false, "indexedDB error, '" + _event_.target.error.name + "'");
+        _reject_(_event_);
+      };
+      _request_.onupgradeneeded = function(_event_) {
+        _resolve_(_event_);
+      };
+      _request_.onsuccess = function(_event_) {
+        ok(false, "Got success, but did not expect it!");
+        _reject_(_event_);
+      };
+    });
+ };
+
   self.postMessage({ op: "ready" });
 }
+
+async function executeWorkerTestAndCleanUp(testScriptPath) {
+  info("Running test in a worker");
+
+  let workerScriptBlob =
+    new Blob([ "(" + workerScript.toString() + ")();" ],
+             { type: "text/javascript" });
+  let workerScriptURL = URL.createObjectURL(workerScriptBlob);
+
+  let worker;
+  try {
+    await new Promise(function(resolve, reject) {
+      worker = new Worker(workerScriptURL);
+
+      worker._expectingUncaughtException = false;
+      worker.onerror = function(event) {
+        if (worker._expectingUncaughtException) {
+          ok(true, "Worker had an expected error: " + event.message);
+          worker._expectingUncaughtException = false;
+          event.preventDefault();
+          return;
+        }
+        ok(false, "Worker had an error: " + event.message);
+        worker.terminate();
+        reject();
+      };
+
+      worker.onmessage = function(event) {
+        let message = event.data;
+        switch (message.op) {
+          case "ok":
+            SimpleTest.ok(message.condition, `${message.name}: ${message.diag}`);
+            break;
+
+          case "todo":
+            todo(message.condition, message.name, message.diag);
+            break;
+
+          case "info":
+            info(message.msg);
+            break;
+
+          case "ready":
+            worker.postMessage({ op: "load", files: [ testScriptPath ] });
+            break;
+
+          case "loaded":
+            worker.postMessage({ op: "start", wasmSupported: isWasmSupported() });
+            break;
+
+          case "done":
+            ok(true, "Worker finished");
+            resolve();
+            break;
+
+          case "expectUncaughtException":
+            worker._expectingUncaughtException = message.expecting;
+            break;
+
+          case "clearAllDatabases":
+            clearAllDatabases(function() {
+              worker.postMessage({ op: "clearAllDatabasesDone" });
+            });
+            break;
+
+          case "getWasmBinary":
+             worker.postMessage({ op: "getWasmBinaryDone",
+                                 wasmBinary: getWasmBinarySync(message.text) });
+             break;
+
+          default:
+            ok(false,
+               "Received a bad message from worker: " + JSON.stringify(message));
+            reject();
+        }
+      };
+    });
+
+    URL.revokeObjectURL(workerScriptURL);
+  } catch (e) {
+    info("Unexpected thing happened: " + e);
+  }
+
+  return new Promise(function(resolve) {
+    info("Cleaning up the databases");
+
+    if (worker._expectingUncaughtException) {
+      ok(false, "expectUncaughtException was called but no uncaught " +
+                "exception was detected!");
+    }
+
+    worker.terminate();
+    worker = null;
+
+    clearAllDatabases(resolve);
+  });
+}
--- a/dom/indexedDB/test/unit/test_constraint_error_messages.js
+++ b/dom/indexedDB/test/unit/test_constraint_error_messages.js
@@ -1,29 +1,24 @@
 /**
  * Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/
  */
 
-var testGenerator = testSteps();
-
-function* testSteps()
+async function testSteps()
 {
   const name = this.window ? window.location.pathname : "Splendid Test";
   const objectStoreName = "foo";
   const indexName = "bar", keyPath = "bar";
 
   info("Opening database");
 
   let request = indexedDB.open(name);
-  request.onerror = errorHandler;
-  request.onupgradeneeded = grabEventAndContinueHandler;
-  request.onsuccess = unexpectedSuccessHandler;
+  let event =  await expectingUpgrade(request);
 
-  let event = yield undefined;
   let db = event.target.result;
 
   info("Creating objectStore");
 
   let objectStore = db.createObjectStore(objectStoreName);
 
   info("Creating a duplicated object store to get an error");
 
@@ -51,14 +46,11 @@ function* testSteps()
     ok(false, "ConstraintError should be thrown if index already exists");
   } catch (e) {
     ok(true, "ConstraintError should be thrown if index already exists");
     is(e.message,
        "Index named '" + indexName + "' already exists at index '0'",
        "Threw with correct error message");
   }
 
-  request.onsuccess = grabEventAndContinueHandler;
-  yield undefined;
+  await expectingSuccess(request);
   db.close();
-
-  finishTest();
 }
--- a/dom/indexedDB/test/unit/xpcshell-head-parent-process.js
+++ b/dom/indexedDB/test/unit/xpcshell-head-parent-process.js
@@ -1,15 +1,17 @@
 /**
  * Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/
  */
 
 // Tests using testGenerator are expected to define it themselves.
-/* global testGenerator */
+// Testing functions are expected to call testSteps and its type should either
+// be GeneratorFunction or AsyncFunction
+/* global testGenerator, testSteps:false */
 
 var { "classes": Cc, "interfaces": Ci, "utils": Cu } = Components;
 
 ChromeUtils.import("resource://gre/modules/Services.jsm");
 
 if (!("self" in this)) {
   this.self = this;
 }
@@ -44,18 +46,38 @@ if (!this.runTest) {
       do_get_profile();
 
       enableTesting();
       enableExperimental();
     }
 
     Cu.importGlobalProperties(["indexedDB"]);
 
-    do_test_pending();
-    testGenerator.next();
+    // In order to support converting tests to using async functions from using
+    // generator functions, we detect async functions by checking the name of
+    // function's constructor.
+    Assert.ok(typeof testSteps === "function",
+              "There should be a testSteps function");
+    if (testSteps.constructor.name === "AsyncFunction") {
+      // Do run our existing cleanup function that would normally be called by
+      // the generator's call to finishTest().
+      registerCleanupFunction(resetTesting);
+
+      add_task(testSteps);
+
+      // Since we defined run_test, we must invoke run_next_test() to start the
+      // async test.
+      run_next_test();
+    } else {
+      Assert.ok(testSteps.constructor.name === "GeneratorFunction",
+                "Unsupported function type");
+
+      do_test_pending();
+      testGenerator.next();
+    }
   };
 }
 
 function finishTest()
 {
   if (SpecialPowers.isMainProcess()) {
     resetExperimental();
     resetTesting();
@@ -529,16 +551,48 @@ function setMaxSerializedMsgSize(aSize)
 }
 
 function getPrincipal(url)
 {
   let uri = Services.io.newURI(url);
   return Services.scriptSecurityManager.createCodebasePrincipal(uri, {});
 }
 
+function expectingSuccess(request) {
+  return new Promise(function(resolve, reject) {
+    request.onerror = function(event) {
+      ok(false, "indexedDB error, '" + event.target.error.name + "'");
+      reject(event);
+    };
+    request.onsuccess = function(event) {
+      resolve(event);
+    };
+    request.onupgradeneeded = function(event) {
+      ok(false, "Got upgrade, but did not expect it!");
+      reject(event);
+    };
+  });
+}
+
+function expectingUpgrade(request) {
+  return new Promise(function(resolve, reject) {
+    request.onerror = function(event) {
+      ok(false, "indexedDB error, '" + event.target.error.name + "'");
+      reject(event);
+    };
+    request.onupgradeneeded = function(event) {
+      resolve(event);
+    };
+    request.onsuccess = function(event) {
+      ok(false, "Got success, but did not expect it!");
+      reject(event);
+    };
+  });
+}
+
 var SpecialPowers = {
   isMainProcess() {
     return Services.appinfo.processType == Ci.nsIXULRuntime.PROCESS_TYPE_DEFAULT;
   },
   notifyObservers(subject, topic, data) {
     Services.obs.notifyObservers(subject, topic, data);
   },
   notifyObserversInParentProcess(subject, topic, data) {
--- a/dom/localstorage/ActorsParent.cpp
+++ b/dom/localstorage/ActorsParent.cpp
@@ -9,27 +9,29 @@
 #include "LocalStorageCommon.h"
 #include "LSObject.h"
 #include "mozIStorageConnection.h"
 #include "mozIStorageFunction.h"
 #include "mozIStorageService.h"
 #include "mozStorageCID.h"
 #include "mozStorageHelper.h"
 #include "mozilla/Preferences.h"
+#include "mozilla/Telemetry.h"
 #include "mozilla/Unused.h"
 #include "mozilla/dom/ContentParent.h"
 #include "mozilla/dom/PBackgroundLSDatabaseParent.h"
 #include "mozilla/dom/PBackgroundLSObserverParent.h"
 #include "mozilla/dom/PBackgroundLSRequestParent.h"
 #include "mozilla/dom/PBackgroundLSSharedTypes.h"
 #include "mozilla/dom/PBackgroundLSSimpleRequestParent.h"
 #include "mozilla/dom/PBackgroundLSSnapshotParent.h"
 #include "mozilla/dom/StorageDBUpdater.h"
 #include "mozilla/dom/StorageUtils.h"
 #include "mozilla/dom/quota/OriginScope.h"
+#include "mozilla/dom/quota/QuotaCommon.h"
 #include "mozilla/dom/quota/QuotaManager.h"
 #include "mozilla/dom/quota/QuotaObject.h"
 #include "mozilla/dom/quota/UsageInfo.h"
 #include "mozilla/ipc/BackgroundParent.h"
 #include "mozilla/ipc/PBackgroundParent.h"
 #include "mozilla/ipc/PBackgroundSharedTypes.h"
 #include "nsClassHashtable.h"
 #include "nsDataHashtable.h"
@@ -7182,206 +7184,231 @@ nsresult QuotaClient::InitOrigin(Persist
 
   QuotaManager* quotaManager = QuotaManager::Get();
   MOZ_ASSERT(quotaManager);
 
   nsCOMPtr<nsIFile> directory;
   nsresult rv = quotaManager->GetDirectoryForOrigin(aPersistenceType, aOrigin,
                                                     getter_AddRefs(directory));
   if (NS_WARN_IF(NS_FAILED(rv))) {
+    REPORT_TELEMETRY_INIT_ERR(kExternalError, LS_GetDirForOrigin);
     return rv;
   }
 
   MOZ_ASSERT(directory);
 
   rv = directory->Append(NS_LITERAL_STRING(LS_DIRECTORY_NAME));
   if (NS_WARN_IF(NS_FAILED(rv))) {
+    REPORT_TELEMETRY_INIT_ERR(kExternalError, LS_Append);
     return rv;
   }
 
 #ifdef DEBUG
   bool exists;
   rv = directory->Exists(&exists);
   if (NS_WARN_IF(NS_FAILED(rv))) {
+    REPORT_TELEMETRY_INIT_ERR(kExternalError, LS_Exists);
     return rv;
   }
 
   MOZ_ASSERT(exists);
 #endif
 
   nsString directoryPath;
   rv = directory->GetPath(directoryPath);
   if (NS_WARN_IF(NS_FAILED(rv))) {
+    REPORT_TELEMETRY_INIT_ERR(kExternalError, LS_GetPath);
     return rv;
   }
 
   nsCOMPtr<nsIFile> usageFile;
   rv = GetUsageFile(directoryPath, getter_AddRefs(usageFile));
   if (NS_WARN_IF(NS_FAILED(rv))) {
+    REPORT_TELEMETRY_INIT_ERR(kExternalError, LS_GetUsageFile);
     return rv;
   }
 
   bool usageFileExists;
 
   bool isDirectory;
   rv = usageFile->IsDirectory(&isDirectory);
   if (rv != NS_ERROR_FILE_NOT_FOUND &&
       rv != NS_ERROR_FILE_TARGET_DOES_NOT_EXIST) {
     if (NS_WARN_IF(NS_FAILED(rv))) {
+      REPORT_TELEMETRY_INIT_ERR(kExternalError, LS_IsDirectory);
       return rv;
     }
 
     if (NS_WARN_IF(isDirectory)) {
+      REPORT_TELEMETRY_INIT_ERR(kInternalError, LS_UnexpectedDir);
       return NS_ERROR_FAILURE;
     }
 
     usageFileExists = true;
   } else {
     usageFileExists = false;
   }
 
   nsCOMPtr<nsIFile> usageJournalFile;
   rv = GetUsageJournalFile(directoryPath, getter_AddRefs(usageJournalFile));
   if (NS_WARN_IF(NS_FAILED(rv))) {
+    REPORT_TELEMETRY_INIT_ERR(kExternalError, LS_GetUsageForJFile);
     return rv;
   }
 
   rv = usageJournalFile->IsDirectory(&isDirectory);
   if (rv != NS_ERROR_FILE_NOT_FOUND &&
       rv != NS_ERROR_FILE_TARGET_DOES_NOT_EXIST) {
     if (NS_WARN_IF(NS_FAILED(rv))) {
+      REPORT_TELEMETRY_INIT_ERR(kExternalError, LS_IsDirectory2);
       return rv;
     }
 
     if (NS_WARN_IF(isDirectory)) {
+      REPORT_TELEMETRY_INIT_ERR(kInternalError, LS_UnexpectedDir2);
       return NS_ERROR_FAILURE;
     }
 
     if (usageFileExists) {
       rv = usageFile->Remove(false);
       if (NS_WARN_IF(NS_FAILED(rv))) {
+        REPORT_TELEMETRY_INIT_ERR(kExternalError, LS_Remove);
         return rv;
       }
 
       usageFileExists = false;
     }
 
     rv = usageJournalFile->Remove(false);
     if (NS_WARN_IF(NS_FAILED(rv))) {
+      REPORT_TELEMETRY_INIT_ERR(kExternalError, LS_Remove2);
       return rv;
     }
   }
 
   nsCOMPtr<nsIFile> file;
   rv = directory->Clone(getter_AddRefs(file));
   if (NS_WARN_IF(NS_FAILED(rv))) {
+    REPORT_TELEMETRY_INIT_ERR(kExternalError, LS_Clone);
     return rv;
   }
 
   rv = file->Append(NS_LITERAL_STRING(DATA_FILE_NAME));
   if (NS_WARN_IF(NS_FAILED(rv))) {
+    REPORT_TELEMETRY_INIT_ERR(kExternalError, LS_Append2);
     return rv;
   }
 
   rv = file->IsDirectory(&isDirectory);
   if (rv != NS_ERROR_FILE_NOT_FOUND &&
       rv != NS_ERROR_FILE_TARGET_DOES_NOT_EXIST) {
     if (NS_WARN_IF(NS_FAILED(rv))) {
+      REPORT_TELEMETRY_INIT_ERR(kExternalError, LS_IsDirectory3);
       return rv;
     }
 
     if (NS_WARN_IF(isDirectory)) {
+      REPORT_TELEMETRY_INIT_ERR(kInternalError, LS_UnexpectedDir3);
       return NS_ERROR_FAILURE;
     }
 
     int64_t usage;
     rv = LoadUsageFile(usageFile, &usage);
     if (NS_WARN_IF(NS_FAILED(rv))) {
       nsCOMPtr<mozIStorageConnection> connection;
       bool dummy;
       rv = CreateStorageConnection(file, usageFile, aOrigin,
                                    getter_AddRefs(connection), &dummy);
       if (NS_WARN_IF(NS_FAILED(rv))) {
+        REPORT_TELEMETRY_INIT_ERR(kExternalError, LS_CreateConnection);
         return rv;
       }
 
       rv = GetUsage(connection, /* aArchivedOriginScope */ nullptr, &usage);
       if (NS_WARN_IF(NS_FAILED(rv))) {
+        REPORT_TELEMETRY_INIT_ERR(kExternalError, LS_GetUsage);
         return rv;
       }
 
       rv = UpdateUsageFile(usageFile, usageJournalFile, usage);
       if (NS_WARN_IF(NS_FAILED(rv))) {
+        REPORT_TELEMETRY_INIT_ERR(kExternalError, LS_UpdateUsageFile);
         return rv;
       }
 
       rv = usageJournalFile->Remove(false);
       if (NS_WARN_IF(NS_FAILED(rv))) {
+        REPORT_TELEMETRY_INIT_ERR(kExternalError, LS_Remove3);
         return rv;
       }
     }
 
     MOZ_ASSERT(usage >= 0);
 
     InitUsageForOrigin(aOrigin, usage);
 
     aUsageInfo->AppendToDatabaseUsage(uint64_t(usage));
   } else if (usageFileExists) {
     rv = usageFile->Remove(false);
     if (NS_WARN_IF(NS_FAILED(rv))) {
+      REPORT_TELEMETRY_INIT_ERR(kExternalError, LS_Remove4);
       return rv;
     }
   }
 
   // Report unknown files in debug builds, but don't fail, just warn.
 
 #ifdef DEBUG
   nsCOMPtr<nsIDirectoryEnumerator> directoryEntries;
   rv = directory->GetDirectoryEntries(getter_AddRefs(directoryEntries));
   if (NS_WARN_IF(NS_FAILED(rv))) {
+    REPORT_TELEMETRY_INIT_ERR(kExternalError, LS_GetDirEntries);
     return rv;
   }
 
   if (!directoryEntries) {
     return NS_OK;
   }
 
   while (true) {
     if (aCanceled) {
       break;
     }
 
     nsCOMPtr<nsIFile> file;
     rv = directoryEntries->GetNextFile(getter_AddRefs(file));
     if (NS_WARN_IF(NS_FAILED(rv))) {
+      REPORT_TELEMETRY_INIT_ERR(kExternalError, LS_GetNextFile);
       return rv;
     }
 
     if (!file) {
       break;
     }
 
     nsString leafName;
     rv = file->GetLeafName(leafName);
     if (NS_WARN_IF(NS_FAILED(rv))) {
+      REPORT_TELEMETRY_INIT_ERR(kExternalError, LS_GetLeafName);
       return rv;
     }
 
     // Don't need to check for USAGE_JOURNAL_FILE_NAME. We removed it above
     // (if there was any).
     if (leafName.EqualsLiteral(DATA_FILE_NAME) ||
         leafName.EqualsLiteral(USAGE_FILE_NAME)) {
       // Don't need to check if it is a directory or file. We did that above.
       continue;
     }
 
     if (leafName.EqualsLiteral(JOURNAL_FILE_NAME)) {
       bool isDirectory;
       rv = file->IsDirectory(&isDirectory);
       if (NS_WARN_IF(NS_FAILED(rv))) {
+        REPORT_TELEMETRY_INIT_ERR(kExternalError, LS_IsDirectory4);
         return rv;
       }
 
       if (!isDirectory) {
         continue;
       }
     }
 
--- a/dom/media/eme/moz.build
+++ b/dom/media/eme/moz.build
@@ -13,17 +13,16 @@ EXPORTS.mozilla.dom += [
     'MediaKeyStatusMap.h',
     'MediaKeySystemAccess.h',
     'MediaKeySystemAccessManager.h',
 ]
 
 EXPORTS.mozilla += [
     'CDMCaps.h',
     'CDMProxy.h',
-    'DataMutex.h',
     'DecryptorProxyCallback.h',
     'DetailedPromise.h',
     'EMEUtils.h',
 ]
 
 UNIFIED_SOURCES += [
     'CDMCaps.cpp',
     'DetailedPromise.cpp',
--- a/dom/quota/ActorsParent.cpp
+++ b/dom/quota/ActorsParent.cpp
@@ -44,16 +44,17 @@
 #include "mozilla/ipc/BackgroundParent.h"
 #include "mozilla/ipc/BackgroundUtils.h"
 #include "mozilla/IntegerRange.h"
 #include "mozilla/Mutex.h"
 #include "mozilla/Preferences.h"
 #include "mozilla/Services.h"
 #include "mozilla/StaticPtr.h"
 #include "mozilla/TextUtils.h"
+#include "mozilla/Telemetry.h"
 #include "mozilla/TypeTraits.h"
 #include "mozilla/Unused.h"
 #include "mozStorageCID.h"
 #include "mozStorageHelper.h"
 #include "nsAppDirectoryServiceDefs.h"
 #include "nsComponentManagerUtils.h"
 #include "nsAboutProtocolUtils.h"
 #include "nsCharSeparatedTokenizer.h"
@@ -3620,28 +3621,34 @@ nsresult QuotaManager::GetDirectoryMetad
   aGroup = group;
   aOrigin = origin;
   return NS_OK;
 }
 
 nsresult QuotaManager::GetDirectoryMetadata2WithRestore(
     nsIFile* aDirectory, bool aPersistent, int64_t* aTimestamp,
     bool* aPersisted, nsACString& aSuffix, nsACString& aGroup,
-    nsACString& aOrigin) {
+    nsACString& aOrigin, const bool aTelemetry) {
   nsresult rv = GetDirectoryMetadata2(aDirectory, aTimestamp, aPersisted,
                                       aSuffix, aGroup, aOrigin);
   if (NS_WARN_IF(NS_FAILED(rv))) {
     rv = RestoreDirectoryMetadata2(aDirectory, aPersistent);
     if (NS_WARN_IF(NS_FAILED(rv))) {
+      if (aTelemetry) {
+        REPORT_TELEMETRY_INIT_ERR(kInternalError, Rep_RestoreDirMeta);
+      }
       return rv;
     }
 
     rv = GetDirectoryMetadata2(aDirectory, aTimestamp, aPersisted, aSuffix,
                                aGroup, aOrigin);
     if (NS_WARN_IF(NS_FAILED(rv))) {
+      if (aTelemetry) {
+        REPORT_TELEMETRY_INIT_ERR(kExternalError, Rep_GetDirMeta);
+      }
       return rv;
     }
   }
 
   return NS_OK;
 }
 
 nsresult QuotaManager::GetDirectoryMetadata2(nsIFile* aDirectory,
@@ -3706,77 +3713,108 @@ nsresult QuotaManager::GetDirectoryMetad
 nsresult QuotaManager::InitializeRepository(PersistenceType aPersistenceType) {
   MOZ_ASSERT(aPersistenceType == PERSISTENCE_TYPE_TEMPORARY ||
              aPersistenceType == PERSISTENCE_TYPE_DEFAULT);
 
   nsCOMPtr<nsIFile> directory;
   nsresult rv = NS_NewLocalFile(GetStoragePath(aPersistenceType), false,
                                 getter_AddRefs(directory));
   if (NS_WARN_IF(NS_FAILED(rv))) {
+    REPORT_TELEMETRY_INIT_ERR(kExternalError, Rep_NewLocalFile);
     return rv;
   }
 
   bool created;
   rv = EnsureDirectory(directory, &created);
   if (NS_WARN_IF(NS_FAILED(rv))) {
+    REPORT_TELEMETRY_INIT_ERR(kExternalError, Rep_EnsureDirectory);
     return rv;
   }
 
   nsCOMPtr<nsIDirectoryEnumerator> entries;
   rv = directory->GetDirectoryEntries(getter_AddRefs(entries));
   if (NS_WARN_IF(NS_FAILED(rv))) {
-    return rv;
-  }
+    REPORT_TELEMETRY_INIT_ERR(kExternalError, Rep_GetDirEntries);
+    return rv;
+  }
+
+  // A keeper to defer the return only in Nightly, so that the telemetry data
+  // for whole profile can be collected
+#ifdef NIGHTLY_BUILD
+  nsresult statusKeeper = NS_OK;
+#endif
 
   nsCOMPtr<nsIFile> childDirectory;
   while (NS_SUCCEEDED(
              (rv = entries->GetNextFile(getter_AddRefs(childDirectory)))) &&
          childDirectory) {
     bool isDirectory;
     rv = childDirectory->IsDirectory(&isDirectory);
     if (NS_WARN_IF(NS_FAILED(rv))) {
-      return rv;
+      REPORT_TELEMETRY_INIT_ERR(kExternalError, Rep_IsDirectory);
+      RECORD_IN_NIGHTLY(statusKeeper, rv);
+      CONTINUE_IN_NIGHTLY_RETURN_IN_OTHERS(rv);
     }
 
     if (!isDirectory) {
       nsString leafName;
       rv = childDirectory->GetLeafName(leafName);
       if (NS_WARN_IF(NS_FAILED(rv))) {
-        return rv;
+        REPORT_TELEMETRY_INIT_ERR(kExternalError, Rep_GetLeafName);
+        RECORD_IN_NIGHTLY(statusKeeper, rv);
+        CONTINUE_IN_NIGHTLY_RETURN_IN_OTHERS(rv);
       }
 
       if (IsOSMetadata(leafName)) {
         continue;
       }
 
       UNKNOWN_FILE_WARNING(leafName);
-      return NS_ERROR_UNEXPECTED;
+
+      REPORT_TELEMETRY_INIT_ERR(kInternalError, Rep_UnexpectedFile);
+      RECORD_IN_NIGHTLY(statusKeeper, NS_ERROR_UNEXPECTED);
+      CONTINUE_IN_NIGHTLY_RETURN_IN_OTHERS(NS_ERROR_UNEXPECTED);
     }
 
     int64_t timestamp;
     bool persisted;
     nsCString suffix;
     nsCString group;
     nsCString origin;
     rv = GetDirectoryMetadata2WithRestore(childDirectory,
                                           /* aPersistent */ false, &timestamp,
-                                          &persisted, suffix, group, origin);
+                                          &persisted, suffix, group, origin,
+                                          /* aTelemetry */ true);
     if (NS_WARN_IF(NS_FAILED(rv))) {
-      return rv;
+      // Error should have reported in GetDirectoryMetadata2WithRestore
+      RECORD_IN_NIGHTLY(statusKeeper, rv);
+      CONTINUE_IN_NIGHTLY_RETURN_IN_OTHERS(rv);
     }
 
     rv = InitializeOrigin(aPersistenceType, group, origin, timestamp, persisted,
                           childDirectory);
     if (NS_WARN_IF(NS_FAILED(rv))) {
-      return rv;
-    }
-  }
-  if (NS_WARN_IF(NS_FAILED(rv))) {
-    return rv;
-  }
+      // Error should have reported in InitializeOrigin
+      RECORD_IN_NIGHTLY(statusKeeper, rv);
+      CONTINUE_IN_NIGHTLY_RETURN_IN_OTHERS(rv);
+    }
+  }
+  if (NS_WARN_IF(NS_FAILED(rv))) {
+    REPORT_TELEMETRY_INIT_ERR(kInternalError, Rep_GetNextFile);
+    RECORD_IN_NIGHTLY(statusKeeper, rv);
+#ifndef NIGHTLY_BUILD
+    return rv;
+#endif
+  }
+
+#ifdef NIGHTLY_BUILD
+  if (NS_FAILED(statusKeeper)) {
+    return statusKeeper;
+  }
+#endif
 
   return NS_OK;
 }
 
 nsresult QuotaManager::InitializeOrigin(PersistenceType aPersistenceType,
                                         const nsACString& aGroup,
                                         const nsACString& aOrigin,
                                         int64_t aAccessTime, bool aPersisted,
@@ -3789,65 +3827,101 @@ nsresult QuotaManager::InitializeOrigin(
 
   // We need to initialize directories of all clients if they exists and also
   // get the total usage to initialize the quota.
   nsAutoPtr<UsageInfo> usageInfo;
   if (trackQuota) {
     usageInfo = new UsageInfo();
   }
 
+  // A keeper to defer the return only in Nightly, so that the telemetry data
+  // for whole profile can be collected
+#ifdef NIGHTLY_BUILD
+  nsresult statusKeeper = NS_OK;
+#endif
+
   nsCOMPtr<nsIDirectoryEnumerator> entries;
   rv = aDirectory->GetDirectoryEntries(getter_AddRefs(entries));
-  NS_ENSURE_SUCCESS(rv, rv);
+  if (NS_WARN_IF(NS_FAILED(rv))) {
+    REPORT_TELEMETRY_INIT_ERR(kExternalError, Ori_GetDirEntries);
+    return rv;
+  }
 
   nsCOMPtr<nsIFile> file;
   while (NS_SUCCEEDED((rv = entries->GetNextFile(getter_AddRefs(file)))) &&
          file) {
     bool isDirectory;
     rv = file->IsDirectory(&isDirectory);
     if (NS_WARN_IF(NS_FAILED(rv))) {
-      return rv;
+      REPORT_TELEMETRY_INIT_ERR(kExternalError, Ori_IsDirectory);
+      RECORD_IN_NIGHTLY(statusKeeper, rv);
+      CONTINUE_IN_NIGHTLY_RETURN_IN_OTHERS(rv);
     }
 
     nsString leafName;
     rv = file->GetLeafName(leafName);
     if (NS_WARN_IF(NS_FAILED(rv))) {
-      return rv;
+      REPORT_TELEMETRY_INIT_ERR(kExternalError, Ori_GetLeafName);
+      RECORD_IN_NIGHTLY(statusKeeper, rv);
+      CONTINUE_IN_NIGHTLY_RETURN_IN_OTHERS(rv);
     }
 
     if (!isDirectory) {
       if (IsOriginMetadata(leafName)) {
         continue;
       }
 
       if (IsTempMetadata(leafName)) {
         rv = file->Remove(/* recursive */ false);
         if (NS_WARN_IF(NS_FAILED(rv))) {
-          return rv;
+          REPORT_TELEMETRY_INIT_ERR(kExternalError, Ori_Remove);
+          RECORD_IN_NIGHTLY(statusKeeper, rv);
+          CONTINUE_IN_NIGHTLY_RETURN_IN_OTHERS(rv);
         }
 
         continue;
       }
 
       UNKNOWN_FILE_WARNING(leafName);
-      return NS_ERROR_UNEXPECTED;
+      REPORT_TELEMETRY_INIT_ERR(kInternalError, Ori_UnexpectedFile);
+      RECORD_IN_NIGHTLY(statusKeeper, NS_ERROR_UNEXPECTED);
+      CONTINUE_IN_NIGHTLY_RETURN_IN_OTHERS(NS_ERROR_UNEXPECTED);
     }
 
     Client::Type clientType;
     rv = Client::TypeFromText(leafName, clientType);
     if (NS_FAILED(rv)) {
       UNKNOWN_FILE_WARNING(leafName);
-      return NS_ERROR_UNEXPECTED;
+      REPORT_TELEMETRY_INIT_ERR(kInternalError, Ori_UnexpectedClient);
+      RECORD_IN_NIGHTLY(statusKeeper, NS_ERROR_UNEXPECTED);
+      CONTINUE_IN_NIGHTLY_RETURN_IN_OTHERS(NS_ERROR_UNEXPECTED);
     }
 
     Atomic<bool> dummy(false);
     rv = mClients[clientType]->InitOrigin(aPersistenceType, aGroup, aOrigin,
                                           /* aCanceled */ dummy, usageInfo);
-    NS_ENSURE_SUCCESS(rv, rv);
-  }
+    if (NS_WARN_IF(NS_FAILED(rv))) {
+      // error should have reported in InitOrigin
+      RECORD_IN_NIGHTLY(statusKeeper, rv);
+      CONTINUE_IN_NIGHTLY_RETURN_IN_OTHERS(rv);
+    }
+  }
+  if (NS_WARN_IF(NS_FAILED(rv))) {
+    REPORT_TELEMETRY_INIT_ERR(kInternalError, Ori_GetNextFile);
+    RECORD_IN_NIGHTLY(statusKeeper, rv);
+#ifndef NIGHTLY_BUILD
+    return rv;
+#endif
+  }
+
+#ifdef NIGHTLY_BUILD
+  if (NS_FAILED(statusKeeper)) {
+    return statusKeeper;
+  }
+#endif
 
   if (trackQuota) {
     InitQuotaForOrigin(aPersistenceType, aGroup, aOrigin,
                        usageInfo->TotalUsage(), aAccessTime, aPersisted);
   }
 
   return NS_OK;
 }
@@ -5007,30 +5081,42 @@ nsresult QuotaManager::EnsureTemporarySt
   MOZ_ASSERT(mStorageInitialized);
 
   if (mTemporaryStorageInitialized) {
     return NS_OK;
   }
 
   TimeStamp startTime = TimeStamp::Now();
 
+  // A keeper to defer the return only in Nightly, so that the telemetry data
+  // for whole profile can be collected
+  nsresult statusKeeper = NS_OK;
+
   nsresult rv = InitializeRepository(PERSISTENCE_TYPE_DEFAULT);
   if (NS_WARN_IF(NS_FAILED(rv))) {
+    RECORD_IN_NIGHTLY(statusKeeper, rv);
+
+#ifndef NIGHTLY_BUILD
     // We have to cleanup partially initialized quota.
     RemoveQuota();
 
     return rv;
+#endif
   }
 
   rv = InitializeRepository(PERSISTENCE_TYPE_TEMPORARY);
-  if (NS_WARN_IF(NS_FAILED(rv))) {
+  if (NS_WARN_IF(NS_FAILED(rv)) || NS_FAILED(statusKeeper)) {
     // We have to cleanup partially initialized quota.
     RemoveQuota();
 
-    return rv;
+#ifdef NIGHTLY_BUILD
+    return NS_FAILED(statusKeeper) ? statusKeeper : rv;
+#else
+    return rv;
+#endif
   }
 
   Telemetry::AccumulateTimeDelta(Telemetry::QM_REPOSITORIES_INITIALIZATION_TIME,
                                  startTime, TimeStamp::Now());
 
   if (gFixedLimitKB >= 0) {
     mTemporaryStorageLimit = static_cast<uint64_t>(gFixedLimitKB) * 1024;
   } else {
--- a/dom/quota/QuotaCommon.h
+++ b/dom/quota/QuotaCommon.h
@@ -27,20 +27,64 @@
 
 #define QM_WARNING(...)                                                      \
   do {                                                                       \
     nsPrintfCString str(__VA_ARGS__);                                        \
     mozilla::dom::quota::ReportInternalError(__FILE__, __LINE__, str.get()); \
     NS_WARNING(str.get());                                                   \
   } while (0)
 
+// Telemetry probes to collect number of failure during the initialization.
+#ifdef NIGHTLY_BUILD
+#define REPORT_TELEMETRY_INIT_ERR(_key, _label)   \
+  mozilla::Telemetry::AccumulateCategoricalKeyed( \
+      mozilla::dom::quota::_key,                  \
+      mozilla::Telemetry::LABELS_QM_INIT_TELEMETRY_ERROR::_label);
+
+#define REPORT_TELEMETRY_ERR_IN_INIT(_initializing, _key, _label) \
+  do {                                                            \
+    if (_initializing) {                                          \
+      REPORT_TELEMETRY_INIT_ERR(_key, _label)                     \
+    }                                                             \
+  } while (0)
+
+#define RECORD_IN_NIGHTLY(_recorder, _status) \
+  do {                                        \
+    if (NS_SUCCEEDED(_recorder)) {            \
+      _recorder = _status;                    \
+    }                                         \
+  } while (0)
+
+#define CONTINUE_IN_NIGHTLY_RETURN_IN_OTHERS(_dummy) continue
+#else
+#define REPORT_TELEMETRY_INIT_ERR(_key, _label) \
+  {}
+
+#define REPORT_TELEMETRY_ERR_IN_INIT(_initializing, _key, _label) \
+  {}
+
+#define RECORD_IN_NIGHTLY(_dummy, _status) \
+  {}
+
+#define CONTINUE_IN_NIGHTLY_RETURN_IN_OTHERS(_rv) return _rv
+#endif
+
 class nsIEventTarget;
 
 BEGIN_QUOTA_NAMESPACE
 
+// Telemetry keys to indicate types of errors.
+#ifdef NIGHTLY_BUILD
+const nsCString kInternalError = NS_LITERAL_CSTRING("internal");
+const nsCString kExternalError = NS_LITERAL_CSTRING("external");
+#else
+const nsCString kInternalError = EmptyCString();
+const nsCString kExternalError = EmptyCString();
+#endif
+
 class BackgroundThreadObject {
  protected:
   nsCOMPtr<nsIEventTarget> mOwningThread;
 
  public:
   void AssertIsOnOwningThread() const
 #ifdef DEBUG
       ;
--- a/dom/quota/QuotaManager.h
+++ b/dom/quota/QuotaManager.h
@@ -180,17 +180,17 @@ class QuotaManager final : public Backgr
 
   nsresult GetDirectoryMetadata2(nsIFile* aDirectory, int64_t* aTimestamp,
                                  bool* aPersisted, nsACString& aSuffix,
                                  nsACString& aGroup, nsACString& aOrigin);
 
   nsresult GetDirectoryMetadata2WithRestore(
       nsIFile* aDirectory, bool aPersistent, int64_t* aTimestamp,
       bool* aPersisted, nsACString& aSuffix, nsACString& aGroup,
-      nsACString& aOrigin);
+      nsACString& aOrigin, const bool aTelemetry = false);
 
   nsresult GetDirectoryMetadata2(nsIFile* aDirectory, int64_t* aTimestamp,
                                  bool* aPersisted);
 
   nsresult GetDirectoryMetadata2WithRestore(nsIFile* aDirectory,
                                             bool aPersistent,
                                             int64_t* aTimestamp,
                                             bool* aPersisted);
--- a/dom/storage/LocalStorageManager.cpp
+++ b/dom/storage/LocalStorageManager.cpp
@@ -390,30 +390,28 @@ nsresult LocalStorageManager::Observe(co
   }
 
   // Clear everything, caches + database
   if (!strcmp(aTopic, "extension:purge-localStorage-caches")) {
     ClearCaches(LocalStorageCache::kUnloadComplete, pattern, aOriginScope);
     return NS_OK;
   }
 
+  if (!strcmp(aTopic, "browser:purge-sessionStorage")) {
+    // This is only meant for SessionStorageManager.
+    return NS_OK;
+  }
+
   // Clear from caches everything that has been stored
   // while in session-only mode
   if (!strcmp(aTopic, "session-only-cleared")) {
     ClearCaches(LocalStorageCache::kUnloadSession, pattern, aOriginScope);
     return NS_OK;
   }
 
-  // Clear everything (including so and pb data) from caches and database
-  // for the gived domain and subdomains.
-  if (!strcmp(aTopic, "domain-data-cleared")) {
-    ClearCaches(LocalStorageCache::kUnloadComplete, pattern, aOriginScope);
-    return NS_OK;
-  }
-
   // Clear all private-browsing caches
   if (!strcmp(aTopic, "private-browsing-data-cleared")) {
     ClearCaches(LocalStorageCache::kUnloadPrivate, pattern, EmptyCString());
     return NS_OK;
   }
 
   // Clear localStorage data beloging to an origin pattern
   if (!strcmp(aTopic, "origin-attr-pattern-cleared")) {
--- a/dom/storage/SessionStorageManager.cpp
+++ b/dom/storage/SessionStorageManager.cpp
@@ -238,18 +238,18 @@ nsresult SessionStorageManager::Observe(
   // Clear from caches everything that has been stored
   // while in session-only mode
   if (!strcmp(aTopic, "session-only-cleared")) {
     ClearStorages(eSessionOnly, pattern, aOriginScope);
     return NS_OK;
   }
 
   // Clear everything (including so and pb data) from caches and database
-  // for the gived domain and subdomains.
-  if (!strcmp(aTopic, "domain-data-cleared")) {
+  // for the given domain and subdomains.
+  if (!strcmp(aTopic, "browser:purge-sessionStorage")) {
     ClearStorages(eAll, pattern, aOriginScope);
     return NS_OK;
   }
 
   if (!strcmp(aTopic, "profile-change")) {
     // For case caches are still referenced - clear them completely
     ClearStorages(eAll, pattern, EmptyCString());
     mOATable.Clear();
--- a/dom/storage/StorageObserver.cpp
+++ b/dom/storage/StorageObserver.cpp
@@ -54,20 +54,20 @@ nsresult StorageObserver::Init() {
 
   sSelf = new StorageObserver();
   NS_ADDREF(sSelf);
 
   // Chrome clear operations.
   obs->AddObserver(sSelf, kStartupTopic, true);
   obs->AddObserver(sSelf, "cookie-changed", true);
   obs->AddObserver(sSelf, "perm-changed", true);
-  obs->AddObserver(sSelf, "browser:purge-domain-data", true);
   obs->AddObserver(sSelf, "last-pb-context-exited", true);
   obs->AddObserver(sSelf, "clear-origin-attributes-data", true);
   obs->AddObserver(sSelf, "extension:purge-localStorage", true);
+  obs->AddObserver(sSelf, "browser:purge-sessionStorage", true);
 
   // Shutdown
   obs->AddObserver(sSelf, "profile-after-change", true);
   if (XRE_IsParentProcess()) {
     obs->AddObserver(sSelf, "profile-before-change", true);
   }
 
   // Testing
@@ -130,18 +130,18 @@ void StorageObserver::Notify(const char*
     sink->Observe(aTopic, aOriginAttributesPattern, aOriginScope);
   }
 }
 
 void StorageObserver::NoteBackgroundThread(nsIEventTarget* aBackgroundThread) {
   mBackgroundThread = aBackgroundThread;
 }
 
-nsresult StorageObserver::ClearMatchingOrigin(const char16_t* aData,
-                                              nsACString& aOriginScope) {
+nsresult StorageObserver::GetOriginScope(const char16_t* aData,
+                                         nsACString& aOriginScope) {
   nsresult rv;
 
   NS_ConvertUTF16toUTF8 domain(aData);
 
   nsAutoCString convertedDomain;
   nsCOMPtr<nsIIDNService> converter = do_GetService(NS_IDNSERVICE_CONTRACTID);
   if (converter) {
     // Convert the domain name to the ACE format
@@ -157,27 +157,16 @@ nsresult StorageObserver::ClearMatchingO
   }
 
   nsCString originScope;
   rv = CreateReversedDomain(convertedDomain, originScope);
   if (NS_WARN_IF(NS_FAILED(rv))) {
     return rv;
   }
 
-  if (!NextGenLocalStorageEnabled()) {
-    if (XRE_IsParentProcess()) {
-      StorageDBChild* storageChild = StorageDBChild::GetOrCreate();
-      if (NS_WARN_IF(!storageChild)) {
-        return NS_ERROR_FAILURE;
-      }
-
-      storageChild->SendClearMatchingOrigin(originScope);
-    }
-  }
-
   aOriginScope = originScope;
   return NS_OK;
 }
 
 NS_IMETHODIMP
 StorageObserver::Observe(nsISupports* aSubject, const char* aTopic,
                          const char16_t* aData) {
   nsresult rv;
@@ -304,21 +293,31 @@ StorageObserver::Observe(nsISupports* aS
     if (NextGenLocalStorageEnabled()) {
       return NS_OK;
     }
 
     const char topic[] = "extension:purge-localStorage-caches";
 
     if (aData) {
       nsCString originScope;
-      rv = ClearMatchingOrigin(aData, originScope);
+
+      rv = GetOriginScope(aData, originScope);
       if (NS_WARN_IF(NS_FAILED(rv))) {
         return rv;
       }
 
+      if (XRE_IsParentProcess()) {
+        StorageDBChild* storageChild = StorageDBChild::GetOrCreate();
+        if (NS_WARN_IF(!storageChild)) {
+          return NS_ERROR_FAILURE;
+        }
+
+        storageChild->SendClearMatchingOrigin(originScope);
+      }
+
       Notify(topic, EmptyString(), originScope);
     } else {
       StorageDBChild* storageChild = StorageDBChild::GetOrCreate();
       if (NS_WARN_IF(!storageChild)) {
         return NS_ERROR_FAILURE;
       }
 
       storageChild->AsyncClearAll();
@@ -328,27 +327,29 @@ StorageObserver::Observe(nsISupports* aS
       }
 
       Notify(topic);
     }
 
     return NS_OK;
   }
 
-  // Clear everything (including so and pb data) from caches and database
-  // for the given domain and subdomains.
-  if (!strcmp(aTopic, "browser:purge-domain-data")) {
-    nsCString originScope;
-    rv = ClearMatchingOrigin(aData, originScope);
-    if (NS_WARN_IF(NS_FAILED(rv))) {
-      return rv;
+  if (!strcmp(aTopic, "browser:purge-sessionStorage")) {
+    if (aData) {
+      nsCString originScope;
+      rv = GetOriginScope(aData, originScope);
+      if (NS_WARN_IF(NS_FAILED(rv))) {
+        return rv;
+      }
+
+      Notify(aTopic, EmptyString(), originScope);
+    } else {
+      Notify(aTopic, EmptyString(), EmptyCString());
     }
 
-    Notify("domain-data-cleared", EmptyString(), originScope);
-
     return NS_OK;
   }
 
   // Clear all private-browsing caches
   if (!strcmp(aTopic, "last-pb-context-exited")) {
     if (NextGenLocalStorageEnabled()) {
       return NS_OK;
     }
--- a/dom/storage/StorageObserver.h
+++ b/dom/storage/StorageObserver.h
@@ -48,17 +48,17 @@ class StorageObserver : public nsIObserv
               const nsAString& aOriginAttributesPattern = EmptyString(),
               const nsACString& aOriginScope = EmptyCString());
 
   void NoteBackgroundThread(nsIEventTarget* aBackgroundThread);
 
  private:
   virtual ~StorageObserver() {}
 
-  nsresult ClearMatchingOrigin(const char16_t* aData, nsACString& aOriginScope);
+  nsresult GetOriginScope(const char16_t* aData, nsACString& aOriginScope);
 
   static void TestingPrefChanged(const char* aPrefName, void* aClosure);
 
   static StorageObserver* sSelf;
 
   nsCOMPtr<nsIEventTarget> mBackgroundThread;
 
   // Weak references
--- a/dom/tests/mochitest/localstorage/localStorageCommon.js
+++ b/dom/tests/mochitest/localstorage/localStorageCommon.js
@@ -97,17 +97,17 @@ function localStorageClearDomain(domain,
     let qms = SpecialPowers.Services.qms;
     let principal = SpecialPowers.wrap(document).nodePrincipal;
     let request = qms.clearStoragesForPrincipal(principal, "default", "ls");
     let cb = SpecialPowers.wrapCallback(callback);
     request.callback = cb;
     return;
   }
 
-  os().notifyObservers(null, "browser:purge-domain-data", domain);
+  os().notifyObservers(null, "extension:purge-localStorage", domain);
   SimpleTest.executeSoon(function () {
     callback();
   });
 }
 
 function os()
 {
   return SpecialPowers.Services.obs;
new file mode 100644
--- /dev/null
+++ b/gfx/tests/reftest/1519754-ref.html
@@ -0,0 +1,5 @@
+<body style="margin-left: 0px">
+<div style="margin-left: 200px; width: 200px; height: 100px; overflow: auto;">
+    <div style="background-color: red; height: 200px;"/>
+</div>
+</body>
new file mode 100644
--- /dev/null
+++ b/gfx/tests/reftest/1519754.html
@@ -0,0 +1,5 @@
+<body>
+<div style="left: 400px; position: fixed; transform: translateX(-200px); width: 200px; height: 100px; overflow: auto;">
+    <div style="background-color: red; height: 200px;"/>
+</div>
+</body>
--- a/gfx/tests/reftest/reftest.list
+++ b/gfx/tests/reftest/reftest.list
@@ -11,8 +11,9 @@ fuzzy(0-100,0-30) == 1149923.html 114992
 == 1424673.html 1424673-ref.html
 == 1429411.html 1429411-ref.html
 == 1435143.html 1435143-ref.html
 == 1444904.html 1444904-ref.html
 == 1451168.html 1451168-ref.html
 == 1461313.html 1461313-ref.html
 fuzzy(5-32,21908-26621) fuzzy-if(webrender,0-1,0-3) == 1463802.html 1463802-ref.html
 fuzzy(0-11,0-4) == 1474722.html 1474722-ref.html
+== 1519754.html 1519754-ref.html
--- a/gfx/webrender_bindings/WebRenderAPI.cpp
+++ b/gfx/webrender_bindings/WebRenderAPI.cpp
@@ -792,20 +792,23 @@ wr::WrSpaceAndClip DisplayListBuilder::D
     const layers::ScrollableLayerGuid::ViewID& aViewId,
     const Maybe<wr::WrSpaceAndClip>& aParent,
     const wr::LayoutRect& aContentRect, const wr::LayoutRect& aClipRect) {
   auto it = mScrollIds.find(aViewId);
   if (it != mScrollIds.end()) {
     return it->second;
   }
 
-  auto rootSpaceAndClip = wr::RootScrollNode();
   // We haven't defined aViewId before, so let's define it now.
+  wr::WrSpaceAndClip defaultParent = wr::RootScrollNode();
+  //Note: we are currently ignoring the clipId on the stack here
+  defaultParent.space = mCurrentSpaceAndClipChain.space;
+
   auto spaceAndClip = wr_dp_define_scroll_layer(
-      mWrState, aViewId, aParent ? aParent.ptr() : &rootSpaceAndClip,
+      mWrState, aViewId, aParent ? aParent.ptr() : &defaultParent,
       aContentRect, aClipRect);
 
   WRDL_LOG("DefineScrollLayer id=%" PRIu64 "/%zu p=%s co=%s cl=%s\n", mWrState,
            aViewId, spaceAndClip.space.id,
            aParent ? Stringify(aParent->space.id).c_str() : "(nil)",
            Stringify(aContentRect).c_str(), Stringify(aClipRect).c_str());
 
   mScrollIds[aViewId] = spaceAndClip;
--- a/js/src/builtin/JSON.cpp
+++ b/js/src/builtin/JSON.cpp
@@ -1,16 +1,17 @@
 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
  * vim: set ts=8 sts=2 et sw=2 tw=80:
  * This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #include "builtin/JSON.h"
 
+#include "mozilla/CheckedInt.h"
 #include "mozilla/FloatingPoint.h"
 #include "mozilla/Range.h"
 #include "mozilla/ScopeExit.h"
 
 #include "jsnum.h"
 #include "jstypes.h"
 #include "jsutil.h"
 
@@ -30,16 +31,17 @@
 
 #include "builtin/Array-inl.h"
 #include "builtin/Boolean-inl.h"
 #include "vm/JSAtom-inl.h"
 #include "vm/NativeObject-inl.h"
 
 using namespace js;
 
+using mozilla::CheckedInt;
 using mozilla::IsFinite;
 using mozilla::Maybe;
 using mozilla::RangedPtr;
 
 using JS::AutoStableStringChars;
 
 const Class js::JSONClass = {js_JSON_str,
                              JSCLASS_HAS_CACHED_PROTO(JSProto_JSON)};
@@ -134,23 +136,30 @@ static MOZ_ALWAYS_INLINE RangedPtr<DstCh
   }
 
   /* Steps 3-4. */
   *dstPtr++ = '"';
   return dstPtr;
 }
 
 template <typename SrcCharT, typename CharVectorT>
-static bool Quote(CharVectorT& sb, JSLinearString* str) {
+static bool Quote(JSContext* cx, CharVectorT& sb, JSLinearString* str) {
   // We resize the backing buffer to the maximum size we could possibly need,
   // write the escaped string into it, and shrink it back to the size we ended
   // up needing.
+
   size_t len = str->length();
+  CheckedInt<size_t> reservedLen = CheckedInt<size_t>(len) * 6 + 2;
+  if (MOZ_UNLIKELY(!reservedLen.isValid())) {
+    ReportAllocationOverflow(cx);
+    return false;
+  }
+
   size_t sbInitialLen = sb.length();
-  if (!sb.growByUninitialized(len * 6 + 2)) {
+  if (!sb.growByUninitialized(reservedLen.value())) {
     return false;
   }
 
   typedef typename CharVectorT::ElementType DstCharT;
 
   JS::AutoCheckCannotGC nogc;
   RangedPtr<const SrcCharT> srcBegin{str->chars<SrcCharT>(nogc), len};
   RangedPtr<DstCharT> dstBegin{sb.begin(), sb.begin(), sb.end()};
@@ -170,22 +179,22 @@ static bool Quote(JSContext* cx, StringB
   // Check if either has non-latin1 before calling ensure, so that the buffer's
   // hasEnsured flag is set if the converstion to twoByte was automatic.
   if (!sb.isUnderlyingBufferLatin1() || linear->hasTwoByteChars()) {
     if (!sb.ensureTwoByteChars()) {
       return false;
     }
   }
   if (linear->hasTwoByteChars()) {
-    return Quote<char16_t>(sb.rawTwoByteBuffer(), linear);
+    return Quote<char16_t>(cx, sb.rawTwoByteBuffer(), linear);
   }
 
   return sb.isUnderlyingBufferLatin1()
-             ? Quote<Latin1Char>(sb.latin1Chars(), linear)
-             : Quote<Latin1Char>(sb.rawTwoByteBuffer(), linear);
+             ? Quote<Latin1Char>(cx, sb.latin1Chars(), linear)
+             : Quote<Latin1Char>(cx, sb.rawTwoByteBuffer(), linear);
 }
 
 namespace {
 
 using ObjectVector = GCVector<JSObject*, 8>;
 
 class StringifyContext {
  public:
--- a/js/src/frontend/ElemOpEmitter.cpp
+++ b/js/src/frontend/ElemOpEmitter.cpp
@@ -220,32 +220,28 @@ bool ElemOpEmitter::emitIncDec() {
 
   if (!emitGet()) {
     //              [stack] ... ELEM
     return false;
   }
 
   MOZ_ASSERT(state_ == State::Get);
 
-  JSOp binOp = isInc() ? JSOP_ADD : JSOP_SUB;
+  JSOp incOp = isInc() ? JSOP_INC : JSOP_DEC;
   if (!bce_->emit1(JSOP_POS)) {
     //              [stack] ... N
     return false;
   }
   if (isPostIncDec()) {
     if (!bce_->emit1(JSOP_DUP)) {
       //            [stack] ... N? N
       return false;
     }
   }
-  if (!bce_->emit1(JSOP_ONE)) {
-    //              [stack] ... N? N 1
-    return false;
-  }
-  if (!bce_->emit1(binOp)) {
+  if (!bce_->emit1(incOp)) {
     //              [stack] ... N? N+1
     return false;
   }
   if (isPostIncDec()) {
     if (isSuper()) {
       //            [stack] THIS KEY OBJ N N+1
 
       if (!bce_->emit2(JSOP_PICK, 4)) {
--- a/js/src/frontend/NameOpEmitter.cpp
+++ b/js/src/frontend/NameOpEmitter.cpp
@@ -347,36 +347,32 @@ bool NameOpEmitter::emitAssignment() {
   state_ = State::Assignment;
 #endif
   return true;
 }
 
 bool NameOpEmitter::emitIncDec() {
   MOZ_ASSERT(state_ == State::Start);
 
-  JSOp binOp = isInc() ? JSOP_ADD : JSOP_SUB;
+  JSOp incOp = isInc() ? JSOP_INC : JSOP_DEC;
   if (!prepareForRhs()) {
     //              [stack] ENV? V
     return false;
   }
   if (!bce_->emit1(JSOP_POS)) {
     //              [stack] ENV? N
     return false;
   }
   if (isPostIncDec()) {
     if (!bce_->emit1(JSOP_DUP)) {
       //            [stack] ENV? N? N
       return false;
     }
   }
-  if (!bce_->emit1(JSOP_ONE)) {
-    //              [stack] ENV? N? N 1
-    return false;
-  }
-  if (!bce_->emit1(binOp)) {
+  if (!bce_->emit1(incOp)) {
     //              [stack] ENV? N? N+1
     return false;
   }
   if (isPostIncDec() && emittedBindOp()) {
     if (!bce_->emit2(JSOP_PICK, 2)) {
       //            [stack] N? N+1 ENV?
       return false;
     }
--- a/js/src/frontend/PropOpEmitter.cpp
+++ b/js/src/frontend/PropOpEmitter.cpp
@@ -203,33 +203,29 @@ bool PropOpEmitter::emitIncDec(JSAtom* p
   MOZ_ASSERT(isIncDec());
 
   if (!emitGet(prop)) {
     return false;
   }
 
   MOZ_ASSERT(state_ == State::Get);
 
-  JSOp binOp = isInc() ? JSOP_ADD : JSOP_SUB;
+  JSOp incOp = isInc() ? JSOP_INC : JSOP_DEC;
 
   if (!bce_->emit1(JSOP_POS)) {
     //              [stack] ... N
     return false;
   }
   if (isPostIncDec()) {
     if (!bce_->emit1(JSOP_DUP)) {
       //            [stack] .. N N
       return false;
     }
   }
-  if (!bce_->emit1(JSOP_ONE)) {
-    //              [stack] ... N? N 1
-    return false;
-  }
-  if (!bce_->emit1(binOp)) {
+  if (!bce_->emit1(incOp)) {
     //              [stack] ... N? N+1
     return false;
   }
   if (isPostIncDec()) {
     if (isSuper()) {
       //            [stack] THIS OBJ N N+1
       if (!bce_->emit2(JSOP_PICK, 3)) {
         //          [stack] OBJ N N+1 THIS
--- a/js/src/jit/BaselineCompiler.cpp
+++ b/js/src/jit/BaselineCompiler.cpp
@@ -2065,16 +2065,26 @@ bool BaselineCodeGen<Handler>::emit_JSOP
 }
 
 template <typename Handler>
 bool BaselineCodeGen<Handler>::emit_JSOP_NEG() {
   return emitUnaryArith();
 }
 
 template <typename Handler>
+bool BaselineCodeGen<Handler>::emit_JSOP_INC() {
+  return emitUnaryArith();
+}
+
+template <typename Handler>
+bool BaselineCodeGen<Handler>::emit_JSOP_DEC() {
+  return emitUnaryArith();
+}
+
+template <typename Handler>
 bool BaselineCodeGen<Handler>::emit_JSOP_LT() {
   return emitCompare();
 }
 
 template <typename Handler>
 bool BaselineCodeGen<Handler>::emit_JSOP_LE() {
   return emitCompare();
 }
--- a/js/src/jit/BaselineCompiler.h
+++ b/js/src/jit/BaselineCompiler.h
@@ -243,17 +243,19 @@ namespace jit {
   _(JSOP_CHECKCLASSHERITAGE)    \
   _(JSOP_INITHOMEOBJECT)        \
   _(JSOP_BUILTINPROTO)          \
   _(JSOP_OBJWITHPROTO)          \
   _(JSOP_FUNWITHPROTO)          \
   _(JSOP_CLASSCONSTRUCTOR)      \
   _(JSOP_DERIVEDCONSTRUCTOR)    \
   _(JSOP_IMPORTMETA)            \
-  _(JSOP_DYNAMIC_IMPORT)
+  _(JSOP_DYNAMIC_IMPORT)        \
+  _(JSOP_INC)                   \
+  _(JSOP_DEC)
 
 // Base class for BaselineCompiler and BaselineInterpreterGenerator. The Handler
 // template is a class storing fields/methods that are interpreter or compiler
 // specific. This can be combined with template specialization of methods in
 // this class to specialize behavior.
 template <typename Handler>
 class BaselineCodeGen {
  protected:
@@ -356,17 +358,17 @@ class BaselineCodeGen {
   MOZ_MUST_USE bool emitWarmUpCounterIncrement();
   MOZ_MUST_USE bool emitTraceLoggerResume(Register script,
                                           AllocatableGeneralRegisterSet& regs);
 
 #define EMIT_OP(op) bool emit_##op();
   OPCODE_LIST(EMIT_OP)
 #undef EMIT_OP
 
-  // JSOP_NEG, JSOP_BITNOT
+  // JSOP_NEG, JSOP_BITNOT, JSOP_INC, JSOP_DEC
   MOZ_MUST_USE bool emitUnaryArith();
 
   // JSOP_BITXOR, JSOP_LSH, JSOP_ADD etc.
   MOZ_MUST_USE bool emitBinaryArith();
 
   // Handles JSOP_LT, JSOP_GT, and friends
   MOZ_MUST_USE bool emitCompare();
 
--- a/js/src/jit/BaselineIC.cpp
+++ b/js/src/jit/BaselineIC.cpp
@@ -163,17 +163,19 @@ void ICEntry::trace(JSTracer* trc) {
       case JSOP_IFNE: {
         ICToBool_Fallback::Compiler stubCompiler(cx);
         if (!addIC(pc, stubCompiler.getStub(&stubSpace))) {
           return nullptr;
         }
         break;
       }
       case JSOP_BITNOT:
-      case JSOP_NEG: {
+      case JSOP_NEG:
+      case JSOP_INC:
+      case JSOP_DEC: {
         ICUnaryArith_Fallback::Compiler stubCompiler(cx);
         if (!addIC(pc, stubCompiler.getStub(&stubSpace))) {
           return nullptr;
         }
         break;
       }
       case JSOP_BITOR:
       case JSOP_BITXOR:
@@ -5742,32 +5744,44 @@ static bool DoUnaryArithFallback(JSConte
                                  MutableHandleValue res) {
   stub->incrementEnteredCount();
 
   RootedScript script(cx, frame->script());
   jsbytecode* pc = stub->icEntry()->pc(script);
   JSOp op = JSOp(*pc);
   FallbackICSpew(cx, stub, "UnaryArith(%s)", CodeName[op]);
 
+  // The unary operations take a copied val because the original value is needed
+  // below.
+  RootedValue valCopy(cx, val);
   switch (op) {
     case JSOP_BITNOT: {
-      RootedValue valCopy(cx, val);
       if (!BitNot(cx, &valCopy, res)) {
         return false;
       }
       break;
     }
     case JSOP_NEG: {
-      // We copy val here because the original value is needed below.
-      RootedValue valCopy(cx, val);
       if (!NegOperation(cx, &valCopy, res)) {
         return false;
       }
       break;
     }
+    case JSOP_INC: {
+      if (!IncOperation(cx, &valCopy, res)) {
+        return false;
+      }
+      break;
+    }
+    case JSOP_DEC: {
+      if (!DecOperation(cx, &valCopy, res)) {
+        return false;
+      }
+      break;
+    }
     default:
       MOZ_CRASH("Unexpected op");
   }
 
   if (res.isDouble()) {
     stub->setSawDoubleResult();
   }
 
--- a/js/src/jit/BaselineIC.h
+++ b/js/src/jit/BaselineIC.h
@@ -2602,16 +2602,18 @@ class ICRest_Fallback : public ICFallbac
       return newStub<ICRest_Fallback>(space, getStubCode(), templateObject);
     }
   };
 };
 
 // UnaryArith
 //     JSOP_BITNOT
 //     JSOP_NEG
+//     JSOP_INC
+//     JSOP_DEC
 
 class ICUnaryArith_Fallback : public ICFallbackStub {
   friend class ICStubSpace;
 
   explicit ICUnaryArith_Fallback(JitCode* stubCode)
       : ICFallbackStub(UnaryArith_Fallback, stubCode) {
     extra_ = 0;
   }
--- a/js/src/jit/BaselineInspector.cpp
+++ b/js/src/jit/BaselineInspector.cpp
@@ -400,29 +400,33 @@ static MIRType ParseCacheIRStub(ICStub* 
     case CacheOp::CallNumberToString:
       return MIRType::String;
     case CacheOp::DoubleAddResult:
     case CacheOp::DoubleSubResult:
     case CacheOp::DoubleMulResult:
     case CacheOp::DoubleDivResult:
     case CacheOp::DoubleModResult:
     case CacheOp::DoubleNegationResult:
+    case CacheOp::DoubleIncResult:
+    case CacheOp::DoubleDecResult:
       return MIRType::Double;
     case CacheOp::Int32AddResult:
     case CacheOp::Int32SubResult:
     case CacheOp::Int32MulResult:
     case CacheOp::Int32DivResult:
     case CacheOp::Int32ModResult:
     case CacheOp::Int32BitOrResult:
     case CacheOp::Int32BitXorResult:
     case CacheOp::Int32BitAndResult:
     case CacheOp::Int32LeftShiftResult:
     case CacheOp::Int32RightShiftResult:
     case CacheOp::Int32NotResult:
     case CacheOp::Int32NegationResult:
+    case CacheOp::Int32IncResult:
+    case CacheOp::Int32DecResult:
       return MIRType::Int32;
     // Int32URightShiftResult may return a double under some
     // circumstances.
     case CacheOp::Int32URightShiftResult:
       reader.skip();  // Skip over lhs
       reader.skip();  // Skip over rhs
       return reader.readByte() == 0 ? MIRType::Int32 : MIRType::Double;
     case CacheOp::LoadValueResult:
--- a/js/src/jit/CacheIR.cpp
+++ b/js/src/jit/CacheIR.cpp
@@ -5819,16 +5819,24 @@ bool UnaryArithIRGenerator::tryAttachInt
     case JSOP_BITNOT:
       writer.int32NotResult(intId);
       trackAttached("UnaryArith.Int32Not");
       break;
     case JSOP_NEG:
       writer.int32NegationResult(intId);
       trackAttached("UnaryArith.Int32Neg");
       break;
+    case JSOP_INC:
+      writer.int32IncResult(intId);
+      trackAttached("UnaryArith.Int32Inc");
+      break;
+    case JSOP_DEC:
+      writer.int32DecResult(intId);
+      trackAttached("UnaryArith.Int32Dec");
+      break;
     default:
       MOZ_CRASH("Unexected OP");
   }
 
   writer.returnFromIC();
   return true;
 }
 
@@ -5845,16 +5853,24 @@ bool UnaryArithIRGenerator::tryAttachNum
       truncatedId = writer.truncateDoubleToUInt32(valId);
       writer.int32NotResult(truncatedId);
       trackAttached("UnaryArith.DoubleNot");
       break;
     case JSOP_NEG:
       writer.doubleNegationResult(valId);
       trackAttached("UnaryArith.DoubleNeg");
       break;
+    case JSOP_INC:
+      writer.doubleIncResult(valId);
+      trackAttached("UnaryArith.DoubleInc");
+      break;
+    case JSOP_DEC:
+      writer.doubleDecResult(valId);
+      trackAttached("UnaryArith.DoubleDec");
+      break;
     default:
       MOZ_CRASH("Unexpected OP");
   }
 
   writer.returnFromIC();
   return true;
 }
 
--- a/js/src/jit/CacheIR.h
+++ b/js/src/jit/CacheIR.h
@@ -309,16 +309,20 @@ extern const char* const CacheKindNames[
   _(Int32BitXorResult)                                                 \
   _(Int32BitAndResult)                                                 \
   _(Int32LeftShiftResult)                                              \
   _(Int32RightShiftResult)                                             \
   _(Int32URightShiftResult)                                            \
   _(Int32NotResult)                                                    \
   _(Int32NegationResult)                                               \
   _(DoubleNegationResult)                                              \
+  _(Int32IncResult)                                                    \
+  _(Int32DecResult)                                                    \
+  _(DoubleIncResult)                                                   \
+  _(DoubleDecResult)                                                   \
   _(LoadInt32TruthyResult)                                             \
   _(LoadDoubleTruthyResult)                                            \
   _(LoadStringTruthyResult)                                            \
   _(LoadObjectTruthyResult)                                            \
   _(LoadValueResult)                                                   \
   _(LoadNewObjectFromTemplateResult)                                   \
                                                                        \
   _(CallStringSplitResult)                                             \
@@ -1172,19 +1176,31 @@ class MOZ_RAII CacheIRWriter : public JS
     buffer_.writeByte(uint32_t(allowDouble));
   }
   void int32NotResult(Int32OperandId id) {
     writeOpWithOperandId(CacheOp::Int32NotResult, id);
   }
   void int32NegationResult(Int32OperandId id) {
     writeOpWithOperandId(CacheOp::Int32NegationResult, id);
   }
+  void int32IncResult(Int32OperandId id) {
+    writeOpWithOperandId(CacheOp::Int32IncResult, id);
+  }
+  void int32DecResult(Int32OperandId id) {
+    writeOpWithOperandId(CacheOp::Int32DecResult, id);
+  }
   void doubleNegationResult(ValOperandId val) {
     writeOpWithOperandId(CacheOp::DoubleNegationResult, val);
   }
+  void doubleIncResult(ValOperandId val) {
+    writeOpWithOperandId(CacheOp::DoubleIncResult, val);
+  }
+  void doubleDecResult(ValOperandId val) {
+    writeOpWithOperandId(CacheOp::DoubleDecResult, val);
+  }
   void loadBooleanResult(bool val) {
     writeOp(CacheOp::LoadBooleanResult);
     buffer_.writeByte(uint32_t(val));
   }
   void loadUndefinedResult() { writeOp(CacheOp::LoadUndefinedResult); }
   void loadStringResult(JSString* str) {
     writeOp(CacheOp::LoadStringResult);
     addStubField(uintptr_t(str), StubField::Type::String);
--- a/js/src/jit/CacheIRCompiler.cpp
+++ b/js/src/jit/CacheIRCompiler.cpp
@@ -2362,16 +2362,50 @@ bool CacheIRCompiler::emitInt32NegationR
   // Guard against 0 and MIN_INT by checking if low 31-bits are all zero.
   // Both of these result in a double.
   masm.branchTest32(Assembler::Zero, val, Imm32(0x7fffffff), failure->label());
   masm.neg32(val);
   masm.tagValue(JSVAL_TYPE_INT32, val, output.valueReg());
   return true;
 }
 
+bool CacheIRCompiler::emitInt32IncResult() {
+  AutoOutputRegister output(*this);
+  Register input = allocator.useRegister(masm, reader.int32OperandId());
+  AutoScratchRegisterMaybeOutput scratch(allocator, masm, output);
+
+  FailurePath* failure;
+  if (!addFailurePath(&failure)) {
+    return false;
+  }
+
+  masm.mov(input, scratch);
+  masm.branchAdd32(Assembler::Overflow, Imm32(1), scratch, failure->label());
+  EmitStoreResult(masm, scratch, JSVAL_TYPE_INT32, output);
+
+  return true;
+}
+
+bool CacheIRCompiler::emitInt32DecResult() {
+  AutoOutputRegister output(*this);
+  Register input = allocator.useRegister(masm, reader.int32OperandId());
+  AutoScratchRegisterMaybeOutput scratch(allocator, masm, output);
+
+  FailurePath* failure;
+  if (!addFailurePath(&failure)) {
+    return false;
+  }
+
+  masm.mov(input, scratch);
+  masm.branchSub32(Assembler::Overflow, Imm32(1), scratch, failure->label());
+  EmitStoreResult(masm, scratch, JSVAL_TYPE_INT32, output);
+
+  return true;
+}
+
 bool CacheIRCompiler::emitInt32NotResult() {
   AutoOutputRegister output(*this);
   Register val = allocator.useRegister(masm, reader.int32OperandId());
   masm.not32(val);
   masm.tagValue(JSVAL_TYPE_INT32, val, output.valueReg());
   return true;
 }
 
@@ -2404,16 +2438,63 @@ bool CacheIRCompiler::emitDoubleNegation
     masm.pop(FloatReg0);
     masm.jump(failure->label());
   }
 
   masm.bind(&done);
   return true;
 }
 
+bool CacheIRCompiler::emitDoubleIncDecResult(bool isInc) {
+  AutoOutputRegister output(*this);
+  ValueOperand val = allocator.useValueRegister(masm, reader.valOperandId());
+
+  FailurePath* failure;
+  if (!addFailurePath(&failure)) {
+    return false;
+  }
+
+  // If we're compiling a Baseline IC, FloatReg0 is always available.
+  Label failurePopReg, done;
+  if (mode_ != Mode::Baseline) {
+    masm.push(FloatReg0);
+  }
+
+  masm.ensureDouble(
+      val, FloatReg0,
+      (mode_ != Mode::Baseline) ? &failurePopReg : failure->label());
+  masm.loadConstantDouble(1.0, ScratchDoubleReg);
+  if (isInc) {
+    masm.addDouble(ScratchDoubleReg, FloatReg0);
+  } else {
+    masm.subDouble(ScratchDoubleReg, FloatReg0);
+  }
+  masm.boxDouble(FloatReg0, output.valueReg(), FloatReg0);
+
+  if (mode_ != Mode::Baseline) {
+    masm.pop(FloatReg0);
+    masm.jump(&done);
+
+    masm.bind(&failurePopReg);
+    masm.pop(FloatReg0);
+    masm.jump(failure->label());
+  }
+
+  masm.bind(&done);
+  return true;
+}
+
+bool CacheIRCompiler::emitDoubleIncResult() {
+  return emitDoubleIncDecResult(true);
+}
+
+bool CacheIRCompiler::emitDoubleDecResult() {
+  return emitDoubleIncDecResult(false);
+}
+
 bool CacheIRCompiler::emitTruncateDoubleToUInt32() {
   ValueOperand val = allocator.useValueRegister(masm, reader.valOperandId());
   Register res = allocator.defineRegister(masm, reader.int32OperandId());
 
   Label int32, done;
   masm.branchTestInt32(Assembler::Equal, val, &int32);
 
   Label doneTruncate, truncateABICall;
--- a/js/src/jit/CacheIRCompiler.h
+++ b/js/src/jit/CacheIRCompiler.h
@@ -78,16 +78,20 @@ namespace jit {
   _(Int32BitOrResult)                     \
   _(Int32BitXorResult)                    \
   _(Int32BitAndResult)                    \
   _(Int32LeftShiftResult)                 \
   _(Int32RightShiftResult)                \
   _(Int32URightShiftResult)               \
   _(Int32NegationResult)                  \
   _(Int32NotResult)                       \
+  _(Int32IncResult)                       \
+  _(Int32DecResult)                       \
+  _(DoubleIncResult)                      \
+  _(DoubleDecResult)                      \
   _(DoubleNegationResult)                 \
   _(TruncateDoubleToUInt32)               \
   _(LoadArgumentsObjectLengthResult)      \
   _(LoadFunctionLengthResult)             \
   _(LoadStringLengthResult)               \
   _(LoadStringCharResult)                 \
   _(LoadArgumentsObjectArgResult)         \
   _(LoadInstanceOfObjectResult)           \
@@ -783,16 +787,18 @@ class MOZ_RAII CacheIRCompiler {
   void emitPostBarrierElement(Register obj, const T& val, Register scratch,
                               Register index) {
     MOZ_ASSERT(index != InvalidReg);
     emitPostBarrierShared(obj, val, scratch, index);
   }
 
   bool emitComparePointerResultShared(bool symbol);
 
+  bool emitDoubleIncDecResult(bool isInc);
+
 #define DEFINE_SHARED_OP(op) MOZ_MUST_USE bool emit##op();
   CACHE_IR_SHARED_OPS(DEFINE_SHARED_OP)
 #undef DEFINE_SHARED_OP
 
   void emitLoadStubField(StubFieldOffset val, Register dest);
   void emitLoadStubFieldConstant(StubFieldOffset val, Register dest);
 
   uintptr_t readStubWord(uint32_t offset, StubField::Type type) {
--- a/js/src/jit/IonBuilder.cpp
+++ b/js/src/jit/IonBuilder.cpp
@@ -714,16 +714,18 @@ AbortReasonOr<Ok> IonBuilder::analyzeNew
           type = MIRType::Symbol;
           break;
         case JSOP_ADD:
         case JSOP_SUB:
         case JSOP_MUL:
         case JSOP_DIV:
         case JSOP_MOD:
         case JSOP_NEG:
+        case JSOP_INC:
+        case JSOP_DEC:
           type = inspector->expectedResultType(last);
           break;
         default:
           break;
       }
       if (type != MIRType::None) {
         if (!phi->addBackedgeType(alloc(), type, nullptr)) {
           return abort(AbortReason::Alloc);
@@ -1906,16 +1908,20 @@ AbortReasonOr<Ok> IonBuilder::inspectOpc
       return jsop_pow();
 
     case JSOP_POS:
       return jsop_pos();
 
     case JSOP_NEG:
       return jsop_neg();
 
+    case JSOP_INC:
+    case JSOP_DEC:
+      return jsop_inc_or_dec(op);
+
     case JSOP_TOSTRING:
       return jsop_tostring();
 
     case JSOP_DEFVAR:
       return jsop_defvar();
 
     case JSOP_DEFLET:
     case JSOP_DEFCONST:
@@ -3649,16 +3655,24 @@ AbortReasonOr<Ok> IonBuilder::arithTryBi
     case JSOP_NEG:
     case JSOP_BITNOT:
       MOZ_ASSERT_IF(op == JSOP_MUL,
                     left->maybeConstantValue() &&
                         left->maybeConstantValue()->toInt32() == -1);
       MOZ_ASSERT_IF(op != JSOP_MUL, !left);
       stub = MUnaryCache::New(alloc(), right);
       break;
+    case JSOP_INC:
+      MOZ_ASSERT(op == JSOP_ADD && right->toConstant()->toInt32() == 1);
+      stub = MUnaryCache::New(alloc(), left);
+      break;
+    case JSOP_DEC:
+      MOZ_ASSERT(op == JSOP_SUB && right->toConstant()->toInt32() == 1);
+      stub = MUnaryCache::New(alloc(), left);
+      break;
     case JSOP_ADD:
     case JSOP_SUB:
     case JSOP_MUL:
     case JSOP_DIV:
     case JSOP_MOD:
       stub = MBinaryCache::New(alloc(), left, right, MIRType::Value);
       break;
     default:
@@ -3785,16 +3799,37 @@ AbortReasonOr<Ok> IonBuilder::jsop_neg()
   MConstant* negator = MConstant::New(alloc(), Int32Value(-1));
   current->add(negator);
 
   MDefinition* right = current->pop();
 
   return jsop_binary_arith(JSOP_MUL, negator, right);
 }
 
+AbortReasonOr<Ok> IonBuilder::jsop_inc_or_dec(JSOp op) {
+  // As above, pass constant without slot traffic.
+  MConstant* one = MConstant::New(alloc(), Int32Value(1));
+  current->add(one);
+
+  MDefinition* value = current->pop();
+
+  switch (op) {
+    case JSOP_INC:
+      op = JSOP_ADD;
+      break;
+    case JSOP_DEC:
+      op = JSOP_SUB;
+      break;
+    default:
+      MOZ_CRASH("jsop_inc_or_dec with bad op");
+  }
+
+  return jsop_binary_arith(op, value, one);
+}
+
 AbortReasonOr<Ok> IonBuilder::jsop_tostring() {
   if (current->peek(-1)->type() == MIRType::String) {
     return Ok();
   }
 
   MDefinition* value = current->pop();
   MToString* ins = MToString::New(alloc(), value);
   current->add(ins);
--- a/js/src/jit/IonBuilder.h
+++ b/js/src/jit/IonBuilder.h
@@ -530,16 +530,17 @@ class IonBuilder : public MIRGenerator,
   AbortReasonOr<Ok> jsop_bitnot();
   AbortReasonOr<Ok> jsop_bitop(JSOp op);
   AbortReasonOr<Ok> jsop_binary_arith(JSOp op);
   AbortReasonOr<Ok> jsop_binary_arith(JSOp op, MDefinition* left,
                                       MDefinition* right);
   AbortReasonOr<Ok> jsop_pow();
   AbortReasonOr<Ok> jsop_pos();
   AbortReasonOr<Ok> jsop_neg();
+  AbortReasonOr<Ok> jsop_inc_or_dec(JSOp op);
   AbortReasonOr<Ok> jsop_tostring();
   AbortReasonOr<Ok> jsop_setarg(uint32_t arg);
   AbortReasonOr<Ok> jsop_defvar();
   AbortReasonOr<Ok> jsop_deflexical();
   AbortReasonOr<Ok> jsop_deffun();
   AbortReasonOr<Ok> jsop_notearg();
   AbortReasonOr<Ok> jsop_throwsetconst();
   AbortReasonOr<Ok> jsop_checklexical();
--- a/js/src/jit/IonIC.cpp
+++ b/js/src/jit/IonIC.cpp
@@ -489,32 +489,44 @@ static void TryAttachIonStub(JSContext* 
                                            HandleScript outerScript,
                                            IonUnaryArithIC* ic, HandleValue val,
                                            MutableHandleValue res) {
   IonScript* ionScript = outerScript->ionScript();
   RootedScript script(cx, ic->script());
   jsbytecode* pc = ic->pc();
   JSOp op = JSOp(*pc);
 
+  // The unary operations take a copied val because the original value is needed
+  // below.
+  RootedValue valCopy(cx, val);
   switch (op) {
     case JSOP_BITNOT: {
-      RootedValue valCopy(cx, val);
       if (!BitNot(cx, &valCopy, res)) {
         return false;
       }
       break;
     }
     case JSOP_NEG: {
-      // We copy val here because the original value is needed below.
-      RootedValue valCopy(cx, val);
       if (!NegOperation(cx, &valCopy, res)) {
         return false;
       }
       break;
     }
+    case JSOP_INC: {
+      if (!IncOperation(cx, &valCopy, res)) {
+        return false;
+      }
+      break;
+    }
+    case JSOP_DEC: {
+      if (!DecOperation(cx, &valCopy, res)) {
+        return false;
+      }
+      break;
+    }
     default:
       MOZ_CRASH("Unexpected op");
   }
 
   TryAttachIonStub<UnaryArithIRGenerator, IonUnaryArithIC>(cx, ic, ionScript,
                                                            op, val, res);
 
   return true;
--- a/js/src/old-configure.in
+++ b/js/src/old-configure.in
@@ -8,17 +8,17 @@ dnl Process this file with autoconf to p
 dnl ========================================================
 AC_PREREQ(2.13)
 AC_INIT(js/src/jsapi.h)
 AC_CONFIG_AUX_DIR(${srcdir}/build/autoconf)
 AC_CANONICAL_SYSTEM
 
 dnl ========================================================
 dnl =
-dnl = Don't change the following two lines.  Doing so breaks:
+dnl = Don't change the following lines.  Doing so breaks:
 dnl =
 dnl = CFLAGS="-foo" ./configure
 dnl =
 dnl ========================================================
 CFLAGS="${CFLAGS=}"
 CPPFLAGS="${CPPFLAGS=}"
 CXXFLAGS="${CXXFLAGS=}"
 LDFLAGS="${LDFLAGS=}"
--- a/js/src/tests/non262/reflect-parse/Match.js
+++ b/js/src/tests/non262/reflect-parse/Match.js
@@ -73,17 +73,18 @@ var Match =
     };
 
     function isAtom(x) {
         return (typeof x === "number") ||
             (typeof x === "string") ||
             (typeof x === "boolean") ||
             (x === null) ||
             (x === undefined) ||
-            (typeof x === "object" && x instanceof RegExp);
+            (typeof x === "object" && x instanceof RegExp) ||
+            (typeof x === "bigint");
     }
 
     function isObject(x) {
         return (x !== null) && (typeof x === "object");
     }
 
     function isFunction(x) {
         return typeof x === "function";
@@ -115,16 +116,17 @@ var Match =
         switch (typeof exp) {
         case "string":
         case "undefined":
             if (act !== exp)
                 throw new MatchError("expected " + quote(exp) + ", got " + quote(act));
             return true;
         case "boolean":
         case "number":
+        case "bigint":
             if (exp !== act)
                 throw new MatchError("expected " + exp + ", got " + quote(act));
             return true;
         }
 
         throw new Error("bad pattern: " + exp.toSource());
     }
 
@@ -180,16 +182,19 @@ var Match =
             return matchAtom(act, exp);
 
         if (isArrayLike(exp))
             return matchArray(act, exp);
 
         if (isFunction(exp))
             return matchFunction(act, exp);
 
-        return matchObject(act, exp);
+        if (isObject(exp))
+            return matchObject(act, exp);
+
+        throw new Error("bad pattern: " + exp.toSource());
     }
 
     return { Pattern: Pattern,
              MatchError: MatchError };
 
 })();
 
--- a/js/src/vm/Interpreter-inl.h
+++ b/js/src/vm/Interpreter-inl.h
@@ -400,16 +400,46 @@ static MOZ_ALWAYS_INLINE bool NegOperati
     return BigInt::neg(cx, val, res);
   }
 #endif
 
   res.setNumber(-val.toNumber());
   return true;
 }
 
+static MOZ_ALWAYS_INLINE bool IncOperation(JSContext* cx,
+                                           MutableHandleValue val,
+                                           MutableHandleValue res) {
+  MOZ_ASSERT(val.isNumber(), "+1 only callable on result of JSOP_TONUMERIC");
+
+  int32_t i;
+  if (val.isInt32() && (i = val.toInt32()) != INT32_MAX) {
+    res.setInt32(i + 1);
+    return true;
+  }
+
+  res.setNumber(val.toNumber() + 1);
+  return true;
+}
+
+static MOZ_ALWAYS_INLINE bool DecOperation(JSContext* cx,
+                                           MutableHandleValue val,
+                                           MutableHandleValue res) {
+  MOZ_ASSERT(val.isNumber(), "-1 only callable on result of JSOP_TONUMERIC");
+
+  int32_t i;
+  if (val.isInt32() && (i = val.toInt32()) != INT32_MIN) {
+    res.setInt32(i - 1);
+    return true;
+  }
+
+  res.setNumber(val.toNumber() - 1);
+  return true;
+}
+
 static MOZ_ALWAYS_INLINE bool ToIdOperation(JSContext* cx, HandleValue idval,
                                             MutableHandleValue res) {
   if (idval.isInt32()) {
     res.set(idval);
     return true;
   }
 
   RootedId id(cx);
--- a/js/src/vm/Interpreter.cpp
+++ b/js/src/vm/Interpreter.cpp
@@ -4335,16 +4335,34 @@ static MOZ_NEVER_INLINE JS_HAZ_JSNATIVE_
       }
 #endif
     }
     END_CASE(JSOP_DEBUGCHECKSELFHOSTED)
 
     CASE(JSOP_IS_CONSTRUCTING) { PUSH_MAGIC(JS_IS_CONSTRUCTING); }
     END_CASE(JSOP_IS_CONSTRUCTING)
 
+    CASE(JSOP_INC) {
+      ReservedRooted<Value> val(&rootValue0, REGS.sp[-1]);
+      MutableHandleValue res = REGS.stackHandleAt(-1);
+      if (!IncOperation(cx, &val, res)) {
+        goto error;
+      }
+    }
+    END_CASE(JSOP_INC)
+
+    CASE(JSOP_DEC) {
+      ReservedRooted<Value> val(&rootValue0, REGS.sp[-1]);
+      MutableHandleValue res = REGS.stackHandleAt(-1);
+      if (!DecOperation(cx, &val, res)) {
+        goto error;
+      }
+    }
+    END_CASE(JSOP_DEC)
+
 #ifdef ENABLE_BIGINT
     CASE(JSOP_BIGINT) {
       PUSH_COPY(script->getConst(GET_UINT32_INDEX(REGS.pc)));
       MOZ_ASSERT(REGS.sp[-1].isBigInt());
     }
     END_CASE(JSOP_BIGINT)
 #endif
 
--- a/js/src/vm/Opcodes.h
+++ b/js/src/vm/Opcodes.h
@@ -2507,33 +2507,49 @@
      *
      *   Category: Variables and Scopes
      *   Type: Modules
      *   Operands:
      *   Stack: arg => rval
      */ \
     MACRO(JSOP_DYNAMIC_IMPORT, 233, "call-import", NULL, 1, 1, 1, JOF_BYTE) \
     /*
+     * Pops the numeric value 'val' from the stack, then pushes 'val + 1'.
+     *
+     *   Category: Operators
+     *   Type: Arithmetic Operators
+     *   Operands:
+     *   Stack: val => (val + 1)
+     */ \
+    MACRO(JSOP_INC, 234, "inc", NULL, 1, 1, 1, JOF_BYTE|JOF_IC) \
+    /*
+     * Pops the numeric value 'val' from the stack, then pushes 'val - 1'.
+     *
+     *   Category: Operators
+     *   Type: Arithmetic Operators
+     *   Operands:
+     *   Stack: val => (val - 1)
+     */ \
+    MACRO(JSOP_DEC, 235, "dec", NULL, 1, 1, 1, JOF_BYTE|JOF_IC) \
+    /*
      * Pushes a BigInt constant onto the stack.
      *   Category: Literals
      *   Type: Constants
      *   Operands: uint32_t constIndex
      *   Stack: => val
      */ \
-    IF_BIGINT(MACRO(JSOP_BIGINT, 234, "bigint", NULL, 5, 0, 1, JOF_BIGINT),)
+    IF_BIGINT(MACRO(JSOP_BIGINT, 236, "bigint", NULL, 5, 0, 1, JOF_BIGINT),)
 // clang-format on
 
 /*
  * In certain circumstances it may be useful to "pad out" the opcode space to
  * a power of two.  Use this macro to do so.
  */
 #define FOR_EACH_TRAILING_UNUSED_OPCODE(MACRO) \
-  IF_BIGINT(, MACRO(234))                      \
-  MACRO(235)                                   \
-  MACRO(236)                                   \
+  IF_BIGINT(, MACRO(236))                      \
   MACRO(237)                                   \
   MACRO(238)                                   \
   MACRO(239)                                   \
   MACRO(240)                                   \
   MACRO(241)                                   \
   MACRO(242)                                   \
   MACRO(243)                                   \
   MACRO(244)                                   \
new file mode 100644
--- /dev/null
+++ b/layout/generic/crashtests/1520798-1.xul
@@ -0,0 +1,10 @@
+<window xmlns:html="http://www.w3.org/1999/xhtml"
+        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+        onload="go()">
+<div id="tweakMe">abc</div>
+<script>
+    function go() {
+      document.getElementById("tweakMe").style.overflowAnchor = "none";
+    }
+</script>
+</window>
--- a/layout/generic/crashtests/crashtests.list
+++ b/layout/generic/crashtests/crashtests.list
@@ -718,8 +718,9 @@ load 1493710.html
 load 1493741.html
 load 1494380.html
 load 1505817.html
 pref(layout.css.column-span.enabled,true) load 1506216.html
 pref(layout.css.column-span.enabled,true) load 1506306.html
 pref(layout.css.column-span.enabled,true) load 1507196.html
 pref(layout.css.column-span.enabled,true) load 1517033.html
 pref(layout.css.column-span.enabled,true) load 1517297.html
+load 1520798-1.xul
--- a/layout/generic/nsFrame.cpp
+++ b/layout/generic/nsFrame.cpp
@@ -1093,17 +1093,20 @@ void nsIFrame::MarkNeedsDisplayItemRebui
       if (oldValue != newValue && !HasProperty(UsedBorderProperty())) {
         AddProperty(UsedBorderProperty(), new nsMargin(oldValue));
       }
     }
 
     const nsStyleDisplay* oldDisp = aOldComputedStyle->PeekStyleDisplay();
     if (oldDisp &&
         (oldDisp->mOverflowAnchor != StyleDisplay()->mOverflowAnchor)) {
-      ScrollAnchorContainer::FindFor(this)->InvalidateAnchor();
+      if (ScrollAnchorContainer* container =
+              ScrollAnchorContainer::FindFor(this)) {
+        container->InvalidateAnchor();
+      }
       if (nsIScrollableFrame* scrollableFrame = do_QueryFrame(this)) {
         scrollableFrame->GetAnchor()->InvalidateAnchor();
       }
     }
 
     if (mInScrollAnchorChain) {
       const nsStylePosition* oldPosition =
           aOldComputedStyle->PeekStylePosition();
--- a/layout/style/RunCbindgen.py
+++ b/layout/style/RunCbindgen.py
@@ -20,17 +20,19 @@ def generate(output, cbindgen_crate_path
         "--lockfile",
         CARGO_LOCK,
         "--crate",
         mozpath.basename(cbindgen_crate_path),
     ], env=env, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
 
     stdout, stderr = p.communicate()
     if p.returncode != 0:
-        raise TypeError("cbindgen failed: %s" % stderr)
+        print(stdout)
+        print(stderr)
+        return p.returncode
 
     output.write(stdout)
 
     deps = set()
     deps.add(CARGO_LOCK)
     deps.add(mozpath.join(cbindgen_crate_path, "cbindgen.toml"))
     for directory in in_tree_dependencies + (cbindgen_crate_path,):
         for path, dirs, files in os.walk(directory):
--- a/media/mtransport/test/transport_unittests.cpp
+++ b/media/mtransport/test/transport_unittests.cpp
@@ -1344,26 +1344,31 @@ TEST_F(TransportTest, TestSrtpErrorClien
   SetupSrtp();
   SetDtlsPeer();
   ConnectSocketExpectFail();
 }
 
 TEST_F(TransportTest, OnlyServerSendsSrtpXtn) {
   p1_->SetupSrtp();
   SetDtlsPeer();
-  ConnectSocketExpectState(TransportLayer::TS_ERROR, TransportLayer::TS_CLOSED);
+  // This should connect, but with no SRTP extension neogtiated.
+  // The client side might negotiate a data channel only.
+  ConnectSocket();
+  ASSERT_NE(TLS_NULL_WITH_NULL_NULL, p1_->cipherSuite());
+  ASSERT_EQ(0, p1_->srtpCipher());
 }
 
 TEST_F(TransportTest, OnlyClientSendsSrtpXtn) {
   p2_->SetupSrtp();
   SetDtlsPeer();
-  // This means that the server won't semd the extension as well.  The server
-  // (p1) thinks that everything is OK.  The client (p2) notices the problem
-  // after connecting and aborts.
-  ConnectSocketExpectState(TransportLayer::TS_CLOSED, TransportLayer::TS_ERROR);
+  // This should connect, but with no SRTP extension neogtiated.
+  // The server side might negotiate a data channel only.
+  ConnectSocket();
+  ASSERT_NE(TLS_NULL_WITH_NULL_NULL, p1_->cipherSuite());
+  ASSERT_EQ(0, p1_->srtpCipher());
 }
 
 class TransportSrtpParameterTest
     : public TransportTest,
       public ::testing::WithParamInterface<uint16_t> {};
 
 INSTANTIATE_TEST_CASE_P(
     SrtpParamInit, TransportSrtpParameterTest,
--- a/media/mtransport/transportlayerdtls.cpp
+++ b/media/mtransport/transportlayerdtls.cpp
@@ -880,22 +880,16 @@ void TransportLayerDtls::Handshake() {
     if (!CheckAlpn()) {
       // Despite connecting, the connection doesn't have a valid ALPN label.
       // Forcibly close the connection so that the peer isn't left hanging
       // (assuming the close_notify isn't dropped).
       ssl_fd_ = nullptr;
       TL_SET_STATE(TS_ERROR);
       return;
     }
-    if (!enabled_srtp_ciphers_.empty() && srtp_cipher_ == 0) {
-      // We enabled SRTP, but got no cipher, this should have failed.
-      ssl_fd_ = nullptr;
-      TL_SET_STATE(TS_ERROR);
-      return;
-    }
 
     TL_SET_STATE(TS_OPEN);
 
     RecordTlsTelemetry();
   } else {
     int32_t err = PR_GetError();
     switch (err) {
       case SSL_ERROR_RX_MALFORMED_HANDSHAKE:
@@ -1588,17 +1582,17 @@ void TransportLayerDtls::RecordTlsTeleme
   }
 
   Telemetry::Accumulate(Telemetry::WEBRTC_DTLS_CIPHER, telemetry_cipher);
 
   uint16_t cipher;
   nsresult rv = GetSrtpCipher(&cipher);
 
   if (NS_FAILED(rv)) {
-    MOZ_MTLOG(ML_ERROR, "Failed to get SRTP cipher suite");
+    MOZ_MTLOG(ML_DEBUG, "No SRTP cipher suite");
     return;
   }
 
   auto cipher_label = mozilla::Telemetry::LABELS_WEBRTC_SRTP_CIPHER::Unknown;
 
   switch (cipher) {
     case kDtlsSrtpAes128CmHmacSha1_80:
       cipher_label = Telemetry::LABELS_WEBRTC_SRTP_CIPHER::Aes128CmHmacSha1_80;
--- a/media/mtransport/transportlayersrtp.cpp
+++ b/media/mtransport/transportlayersrtp.cpp
@@ -107,17 +107,17 @@ TransportResult TransportLayerSrtp::Send
 void TransportLayerSrtp::StateChange(TransportLayer* layer, State state) {
   if (state == TS_OPEN) {
     TransportLayerDtls* dtls = static_cast<TransportLayerDtls*>(layer);
     MOZ_ASSERT(dtls);  // DTLS is mandatory
 
     uint16_t cipher_suite;
     nsresult res = dtls->GetSrtpCipher(&cipher_suite);
     if (NS_FAILED(res)) {
-      MOZ_MTLOG(ML_ERROR, "Failed to negotiate DTLS-SRTP. This is an error");
+      MOZ_MTLOG(ML_DEBUG, "DTLS-SRTP disabled");
       TL_SET_STATE(TS_ERROR);
       return;
     }
 
     unsigned int key_size = SrtpFlow::KeySize(cipher_suite);
     unsigned int salt_size = SrtpFlow::SaltSize(cipher_suite);
     unsigned int master_key_size = key_size + salt_size;
     MOZ_ASSERT(master_key_size <= SRTP_MAX_KEY_LENGTH);
--- a/media/webrtc/signaling/src/peerconnection/MediaTransportHandler.cpp
+++ b/media/webrtc/signaling/src/peerconnection/MediaTransportHandler.cpp
@@ -496,16 +496,18 @@ void MediaTransportHandler::SendPacket(c
   if (layer->SendPacket(aPacket) < 0) {
     CSFLogError(LOGTAG, "%s: Transport flow (%s) failed to send packet",
                 mIceCtx->name().c_str(), aTransportId.c_str());
   }
 }
 
 TransportLayer::State MediaTransportHandler::GetState(
     const std::string& aTransportId, bool aRtcp) const {
+  // TODO Bug 1520692: we should allow Datachannel to connect without
+  // DTLS SRTP keys
   RefPtr<TransportFlow> flow = GetTransportFlow(aTransportId, aRtcp);
   if (flow) {
     return flow->GetLayer(TransportLayerDtls::ID())->state();
   }
   return TransportLayer::TS_NONE;
 }
 
 RefPtr<RTCStatsQueryPromise> MediaTransportHandler::GetIceStats(
--- a/mobile/android/chrome/geckoview/GeckoViewContentChild.js
+++ b/mobile/android/chrome/geckoview/GeckoViewContentChild.js
@@ -10,19 +10,16 @@ XPCOMUtils.defineLazyModuleGetters(this,
   FormData: "resource://gre/modules/FormData.jsm",
   FormLikeFactory: "resource://gre/modules/FormLikeFactory.jsm",
   GeckoViewAutoFill: "resource://gre/modules/GeckoViewAutoFill.jsm",
   PrivacyFilter: "resource://gre/modules/sessionstore/PrivacyFilter.jsm",
   Services: "resource://gre/modules/Services.jsm",
   SessionHistory: "resource://gre/modules/sessionstore/SessionHistory.jsm",
 });
 
-const ssu = Cc["@mozilla.org/browser/sessionstore/utils;1"]
-              .getService(Ci.nsISessionStoreUtils);
-
 class GeckoViewContentChild extends GeckoViewChildModule {
   onInit() {
     debug `onInit`;
 
     // We don't load this in the global namespace because
     // a Utils.jsm in a11y will clobber us.
     XPCOMUtils.defineLazyModuleGetters(this, {
       Utils: "resource://gre/modules/sessionstore/Utils.jsm",
@@ -80,17 +77,19 @@ class GeckoViewContentChild extends Geck
     removeEventListener("MozDOMFullscreen:Exit", this);
     removeEventListener("MozDOMFullscreen:Exited", this);
     removeEventListener("MozDOMFullscreen:Request", this);
     removeEventListener("contextmenu", this, { capture: true });
   }
 
   collectSessionState() {
     let history = SessionHistory.collect(docShell);
-    let [formdata, scrolldata] = this.Utils.mapFrameTree(content, FormData.collect, ssu.collectScrollPosition.bind(ssu));
+    let [formdata, scrolldata] = this.Utils.mapFrameTree(
+        content, SessionStoreUtils.collectFormData,
+        SessionStoreUtils.collectScrollPosition);
 
     // Save the current document resolution.
     let zoom = 1;
     let domWindowUtils = content.windowUtils;
     zoom = domWindowUtils.getResolution();
     scrolldata = scrolldata || {};
     scrolldata.zoom = {};
     scrolldata.zoom.resolution = zoom;
@@ -209,17 +208,17 @@ class GeckoViewContentChild extends Geck
             }
           }, {capture: true, mozSystemGroup: true, once: true});
 
           addEventListener("pageshow", _ => {
             const scrolldata = this._savedState.scrolldata;
             if (scrolldata) {
               this.Utils.restoreFrameTreeData(content, scrolldata, (frame, data) => {
                 if (data.scroll) {
-                  ssu.restoreScrollPosition(frame, data.scroll);
+                  SessionStoreUtils.restoreScrollPosition(frame, data);
                 }
               });
             }
             delete this._savedState;
           }, {capture: true, mozSystemGroup: true, once: true});
 
           if (!this.progressFilter) {
             this.progressFilter =
--- a/mobile/android/components/SessionStore.js
+++ b/mobile/android/components/SessionStore.js
@@ -15,19 +15,16 @@ XPCOMUtils.defineLazyModuleGetters(this,
   PrivateBrowsingUtils: "resource://gre/modules/PrivateBrowsingUtils.jsm",
   SessionHistory: "resource://gre/modules/sessionstore/SessionHistory.jsm",
   SharedPreferences: "resource://gre/modules/SharedPreferences.jsm",
   Utils: "resource://gre/modules/sessionstore/Utils.jsm",
 });
 
 XPCOMUtils.defineLazyModuleGetter(this, "Log", "resource://gre/modules/AndroidLog.jsm", "AndroidLog");
 
-const ssu = Cc["@mozilla.org/browser/sessionstore/utils;1"]
-              .getService(Ci.nsISessionStoreUtils);
-
 function dump(a) {
   Services.console.logStringMessage(a);
 }
 
 let loggingEnabled = false;
 
 function log(a) {
   if (!loggingEnabled) {
@@ -892,17 +889,17 @@ SessionStore.prototype = {
     let data = aBrowser.__SS_data;
     if (!data || data.entries.length == 0) {
       sendEvent(aBrowser, "SSTabInputCaptured");
       return;
     }
 
     // Store the form data.
     let content = aBrowser.contentWindow;
-    let [formdata] = Utils.mapFrameTree(content, FormData.collect);
+    let [formdata] = Utils.mapFrameTree(content, SessionStoreUtils.collectFormData);
     formdata = PrivacyFilter.filterFormData(formdata || {});
 
     // If we found any form data, main content or frames, let's save it
     if (formdata && Object.keys(formdata).length) {
       data.formdata = formdata;
       log("onTabInput() ran for tab " + aWindow.BrowserApp.getTabForBrowser(aBrowser).id);
       this.saveStateDelayed();
     }
@@ -931,17 +928,18 @@ SessionStore.prototype = {
 
     // Neither bother if we're yet to restore the previous scroll position.
     if (aBrowser.__SS_restoreDataOnLoad || aBrowser.__SS_restoreDataOnPageshow) {
       return;
     }
 
     // Save the scroll position itself.
     let content = aBrowser.contentWindow;
-    let [scrolldata] = Utils.mapFrameTree(content, ssu.collectScrollPosition.bind(ssu));
+    let [scrolldata] =
+        Utils.mapFrameTree(content, SessionStoreUtils.collectScrollPosition);
     scrolldata = scrolldata || {};
 
     // Save the current document resolution.
     let zoom = 1;
     zoom = content.windowUtils.getResolution();
     scrolldata.zoom = {};
     scrolldata.zoom.resolution = zoom;
     log("onTabScroll() zoom level: " + zoom);
@@ -1422,17 +1420,17 @@ SessionStore.prototype = {
   /**
   * Takes serialized scroll positions and restores them into the given browser.
   */
   _restoreScrollPosition(aScrollData, aBrowser) {
     if (aScrollData) {
       log("_restoreScrollPosition()");
       Utils.restoreFrameTreeData(aBrowser.contentWindow, aScrollData, (frame, data) => {
         if (data.scroll) {
-          ssu.restoreScrollPosition(frame, data.scroll);
+          SessionStoreUtils.restoreScrollPosition(frame, data);
         }
       });
     }
   },
 
   getBrowserState() {
     return this._getCurrentState();
   },
--- a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoSession.java
+++ b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoSession.java
@@ -102,17 +102,17 @@ public class GeckoSession implements Par
     private SessionFinder mFinder;
 
     private String mId = UUID.randomUUID().toString().replace("-", "");
     /* package */ String getId() { return mId; }
 
     private boolean mShouldPinOnScreen;
 
     // All fields are accessed on UI thread only.
-    private PanZoomController mNPZC;
+    private PanZoomController mPanZoomController = new PanZoomController(this);
     private OverscrollEdgeEffect mOverscroll;
     private DynamicToolbarAnimator mToolbar;
     private CompositorController mController;
 
     private boolean mAttachedCompositor;
     private boolean mCompositorReady;
     private Surface mSurface;
 
@@ -3653,23 +3653,17 @@ public class GeckoSession implements Par
      * Get the PanZoomController instance for this session.
      *
      * @return PanZoomController instance.
      */
     @UiThread
     public @NonNull PanZoomController getPanZoomController() {
         ThreadUtils.assertOnUiThread();
 
-        if (mNPZC == null) {
-            mNPZC = new PanZoomController(this);
-            if (mAttachedCompositor) {
-                mCompositor.attachNPZC(mNPZC);
-            }
-        }
-        return mNPZC;
+        return mPanZoomController;
     }
 
     /**
      * Get the OverscrollEdgeEffect instance for this session.
      *
      * @return OverscrollEdgeEffect instance.
      */
     @UiThread
@@ -4335,20 +4329,17 @@ public class GeckoSession implements Par
     }
 
     /* package */ void onCompositorAttached() {
         if (DEBUG) {
             ThreadUtils.assertOnUiThread();
         }
 
         mAttachedCompositor = true;
-
-        if (mNPZC != null) {
-            mCompositor.attachNPZC(mNPZC);
-        }
+        mCompositor.attachNPZC(mPanZoomController);
 
         if (mSurface != null) {
             // If we have a valid surface, create the compositor now that we're attached.
             // Leave mSurface alone because we'll need it later for onCompositorReady.
             onSurfaceChanged(mSurface, mOffsetX, mOffsetY, mWidth, mHeight);
         }
 
         mCompositor.sendToolbarAnimatorMessage(IS_COMPOSITOR_CONTROLLER_OPEN);
--- a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/SessionAccessibility.java
+++ b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/SessionAccessibility.java
@@ -61,16 +61,17 @@ public class SessionAccessibility {
     @WrapForJNI static final int FLAG_LONG_CLICKABLE = 1 << 10;
     @WrapForJNI static final int FLAG_MULTI_LINE = 1 << 11;
     @WrapForJNI static final int FLAG_PASSWORD = 1 << 12;
     @WrapForJNI static final int FLAG_SCROLLABLE = 1 << 13;
     @WrapForJNI static final int FLAG_SELECTED = 1 << 14;
     @WrapForJNI static final int FLAG_VISIBLE_TO_USER = 1 << 15;
     @WrapForJNI static final int FLAG_SELECTABLE = 1 << 16;
 
+    static final int CLASSNAME_UNKNOWN = -1;
     @WrapForJNI static final int CLASSNAME_VIEW = 0;
     @WrapForJNI static final int CLASSNAME_BUTTON = 1;
     @WrapForJNI static final int CLASSNAME_CHECKBOX = 2;
     @WrapForJNI static final int CLASSNAME_DIALOG = 3;
     @WrapForJNI static final int CLASSNAME_EDITTEXT = 4;
     @WrapForJNI static final int CLASSNAME_GRIDVIEW = 5;
     @WrapForJNI static final int CLASSNAME_IMAGE = 6;
     @WrapForJNI static final int CLASSNAME_LISTVIEW = 7;
@@ -98,17 +99,17 @@ public class SessionAccessibility {
             "android.widget.SeekBar",
             "android.widget.Spinner",
             "android.widget.TabWidget",
             "android.widget.ToggleButton",
             "android.webkit.WebView"
     };
 
     static private String getClassName(final int index) {
-        if (index < CLASSNAMES.length) {
+        if (index >= 0 && index < CLASSNAMES.length) {
             return CLASSNAMES[index];
         }
 
         Log.e(LOGTAG, "Index " + index + " our of CLASSNAME bounds.");
         return "android.view.View"; // Fallback class is View
     }
 
     /* package */ final class NodeProvider extends AccessibilityNodeProvider {
@@ -135,39 +136,36 @@ public class SessionAccessibility {
         }
 
         @Override
         public boolean performAction(final int virtualViewId, int action, Bundle arguments) {
             final GeckoBundle data;
 
             switch (action) {
             case AccessibilityNodeInfo.ACTION_CLEAR_ACCESSIBILITY_FOCUS:
-                sendEvent(AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED, virtualViewId, CLASSNAME_VIEW, null);
+                sendEvent(AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED, virtualViewId, CLASSNAME_UNKNOWN, null);
                 return true;
             case AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS:
                     if (virtualViewId == View.NO_ID) {
                         sendEvent(AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED, View.NO_ID, CLASSNAME_WEBVIEW, null);
                     } else {
-                        final GeckoBundle nodeInfo = nativeProvider.getNodeInfo(virtualViewId);
-                        final int flags = nodeInfo != null ? nodeInfo.getInt("flags") : 0;
-                        if ((flags & FLAG_FOCUSED) != 0) {
+                        if (mFocusedNode == virtualViewId) {
                             mSession.getEventDispatcher().dispatch("GeckoView:AccessibilityCursorToFocused", null);
                         } else {
-                            final int className = nodeInfo != null ? nodeInfo.getInt("className") : CLASSNAME_VIEW;
-                            sendEvent(AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED, virtualViewId, className, null);
+                            sendEvent(AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED, virtualViewId, CLASSNAME_UNKNOWN, null);
                         }
                     }
                 return true;
             case AccessibilityNodeInfo.ACTION_CLICK:
                 nativeProvider.click(virtualViewId);
-                GeckoBundle nodeInfo = nativeProvider.getNodeInfo(virtualViewId);
-                final int flags = nodeInfo != null ? nodeInfo.getInt("flags") : 0;
-                if ((flags & (FLAG_SELECTABLE | FLAG_CHECKABLE)) == 0) {
-                    final int className = nodeInfo != null ? nodeInfo.getInt("className") : CLASSNAME_VIEW;
-                    sendEvent(AccessibilityEvent.TYPE_VIEW_CLICKED, virtualViewId, className, null);
+                GeckoBundle nodeInfo = getMostRecentBundle(virtualViewId);
+                if (nodeInfo != null) {
+                    if ((nodeInfo.getInt("flags") & (FLAG_SELECTABLE | FLAG_CHECKABLE)) == 0) {
+                        sendEvent(AccessibilityEvent.TYPE_VIEW_CLICKED, virtualViewId, nodeInfo.getInt("className"), null);
+                    }
                 }
                 return true;
             case AccessibilityNodeInfo.ACTION_LONG_CLICK:
                 mSession.getEventDispatcher().dispatch("GeckoView:AccessibilityLongPress", null);
                 return true;
             case AccessibilityNodeInfo.ACTION_SCROLL_FORWARD:
                 mSession.getEventDispatcher().dispatch("GeckoView:AccessibilityScrollForward", null);
                 return true;
@@ -661,30 +659,31 @@ public class SessionAccessibility {
 
         if (!Settings.isPlatformEnabled() && (Build.VERSION.SDK_INT < 17 || mView.getDisplay() != null)) {
             // Accessibility could be activated in Gecko via xpcom, for example when using a11y
             // devtools. Here we assure that either Android a11y is *really* enabled, or no
             // display is attached and we must be in a junit test.
             return;
         }
 
-        GeckoBundle cachedBundle = null;
-        if (!mSession.getSettings().getFullAccessibilityTree()) {
-            cachedBundle = getMostRecentBundle(sourceId);
-            // Suppress events from non cached nodes if cache is enabled.
-            if (cachedBundle == null && sourceId != View.NO_ID) {
-                return;
-            }
+        GeckoBundle cachedBundle = getMostRecentBundle(sourceId);
+        if (cachedBundle == null && sourceId != View.NO_ID) {
+            // Suppress events from non cached nodes.
+            return;
         }
 
         final AccessibilityEvent event = AccessibilityEvent.obtain(eventType);
         event.setPackageName(GeckoAppShell.getApplicationContext().getPackageName());
         event.setSource(mView, sourceId);
-        event.setClassName(getClassName(className));
         event.setEnabled(true);
+        if (className == CLASSNAME_UNKNOWN && cachedBundle != null) {
+            event.setClassName(getClassName(cachedBundle.getInt("className")));
+        } else {
+            event.setClassName(getClassName(className));
+        }
 
         if (eventData != null) {
             if (eventData.containsKey("text")) {
                 event.getText().add(eventData.getString("text"));
             }
             event.setContentDescription(eventData.getString("description", ""));
             event.setAddedCount(eventData.getInt("addedCount", -1));
             event.setRemovedCount(eventData.getInt("removedCount", -1));
--- a/old-configure.in
+++ b/old-configure.in
@@ -8,17 +8,17 @@ dnl Process this file with autoconf to p
 dnl ========================================================
 AC_PREREQ(2.13)
 AC_INIT(config/config.mk)
 AC_CONFIG_AUX_DIR(${srcdir}/build/autoconf)
 AC_CANONICAL_SYSTEM
 
 dnl ========================================================
 dnl =
-dnl = Don't change the following two lines.  Doing so breaks:
+dnl = Don't change the following lines.  Doing so breaks:
 dnl =
 dnl = CFLAGS="-foo" ./configure
 dnl =
 dnl ========================================================
 CFLAGS="${CFLAGS=}"
 CPPFLAGS="${CPPFLAGS=}"
 CXXFLAGS="${CXXFLAGS=}"
 LDFLAGS="${LDFLAGS=}"
--- a/python/mozbuild/mozbuild/action/file_generate.py
+++ b/python/mozbuild/mozbuild/action/file_generate.py
@@ -62,17 +62,23 @@ def main(argv):
     if not hasattr(module, method):
         print('Error: script "{0}" is missing a {1} method'.format(script, method),
               file=sys.stderr)
         return 1
 
     ret = 1
     try:
         with FileAvoidWrite(args.output_file, mode='rb') as output:
-            ret = module.__dict__[method](output, *args.additional_arguments, **kwargs)
+            try:
+                ret = module.__dict__[method](output, *args.additional_arguments, **kwargs)
+            except:
+                # Ensure that we don't overwrite the file if the script failed.
+                output.avoid_writing_to_file()
+                raise
+
             # The following values indicate a statement of success:
             #  - a set() (see below)
             #  - 0
             #  - False
             #  - None
             #
             # Everything else is an error (so scripts can conveniently |return
             # 1| or similar). If a set is returned, the elements of the set
@@ -95,16 +101,20 @@ def main(argv):
                 # Add dependencies on any buildconfig items that were accessed
                 # by the script.
                 deps |= set(buildconfig.get_dependencies())
 
                 mk = Makefile()
                 mk.create_rule([args.dep_target]).add_dependencies(deps)
                 with FileAvoidWrite(args.dep_file) as dep_file:
                     mk.dump(dep_file)
+            else:
+                # Ensure that we don't overwrite the file if the script failed.
+                output.avoid_writing_to_file()
+
     except IOError as e:
         print('Error opening file "{0}"'.format(e.filename), file=sys.stderr)
         traceback.print_exc()
         return 1
     return ret
 
 if __name__ == '__main__':
     sys.exit(main(sys.argv[1:]))
--- a/python/mozbuild/mozbuild/util.py
+++ b/python/mozbuild/mozbuild/util.py
@@ -214,25 +214,28 @@ class FileAvoidWrite(BytesIO):
     Additionally, there is dry run mode where the file is not actually written
     out, but reports whether the file was existing and would have been updated
     still occur, as well as diff capture if requested.
     """
     def __init__(self, filename, capture_diff=False, dry_run=False, mode='rU'):
         BytesIO.__init__(self)
         self.name = filename
         self._capture_diff = capture_diff
-        self._dry_run = dry_run
+        self._write_to_file = not dry_run
         self.diff = None
         self.mode = mode
 
     def write(self, buf):
         if isinstance(buf, unicode):
             buf = buf.encode('utf-8')
         BytesIO.write(self, buf)
 
+    def avoid_writing_to_file(self):
+        self._write_to_file = False
+
     def close(self):
         """Stop accepting writes, compare file contents, and rewrite if needed.
 
         Returns a tuple of bools indicating what action was performed:
 
             (file existed, file updated)
 
         If ``capture_diff`` was specified at construction time and the
@@ -254,17 +257,17 @@ class FileAvoidWrite(BytesIO):
                 old_content = existing.read()
                 if old_content == buf:
                     return True, False
             except IOError:
                 pass
             finally:
                 existing.close()
 
-        if not self._dry_run:
+        if self._write_to_file:
             ensureParentDir(self.name)
             # Maintain 'b' if specified.  'U' only applies to modes starting with
             # 'r', so it is dropped.
             writemode = 'w'
             if 'b' in self.mode:
                 writemode += 'b'
             with open(self.name, writemode) as file:
                 file.write(buf)
--- a/security/manager/ssl/StaticHPKPins.h
+++ b/security/manager/ssl/StaticHPKPins.h
@@ -1166,9 +1166,9 @@ static const TransportSecurityPreload kP
   { "za.search.yahoo.com", false, true, false, -1, &kPinset_yahoo },
   { "zh.search.yahoo.com", false, true, false, -1, &kPinset_yahoo },
 };
 
 // Pinning Preload List Length = 488;
 
 static const int32_t kUnknownId = -1;
 
-static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1555935367132000);
+static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1556194618598000);
--- a/security/manager/ssl/nsSTSPreloadList.inc
+++ b/security/manager/ssl/nsSTSPreloadList.inc
@@ -3,17 +3,17 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 /*****************************************************************************/
 /* This is an automatically generated file. If you're not                    */
 /* nsSiteSecurityService.cpp, you shouldn't be #including it.                */
 /*****************************************************************************/
 
 #include <stdint.h>
-const PRTime gPreloadListExpirationTime = INT64_C(1558354561758000);
+const PRTime gPreloadListExpirationTime = INT64_C(1558613812644000);
 %%
 0-1.party, 1
 000books.net, 1
 00100010.net, 1
 0010100.net, 1
 00120012.net, 1
 00130013.net, 1
 00140014.net, 1
@@ -257,16 +257,17 @@ 10840.net, 1
 10gb.io, 1
 10gbit.ovh, 1
 10hz.de, 1
 10og.de, 1
 10ppm.com, 1
 10x.ooo, 1
 1100.so, 1
 110110110.net, 1
+110320.com, 1
 110692.com, 1
 112112112.net, 1
 1126p.com, 1
 112app.nl, 1
 112hz.com, 1
 112it.ro, 1
 1130p.com, 1
 113113113.net, 1
@@ -306,27 +307,29 @@ 127663.com, 1
 127665.com, 1
 1288366.com, 1
 1288fc.com, 1
 12autoankauf-berlin.de, 1
 12thmanrising.com, 1
 12train.com, 1
 12vpn.net, 1
 130.ua, 1
+130032.com, 1
 130212.com, 1
 131934.com, 1
 131954.com, 1
 132kv.ch, 1
 13318522.com, 1
 133294.com, 1
 133492.com, 1
 1359826938.rsc.cdn77.org, 1
 135vv.com, 1
 136774.com, 1
 136814.com, 1
+136924.com, 1
 137724.com, 1
 13826145000.com, 1
 13th-dover.uk, 1
 141145.com, 1
 143533.com, 1
 143633.com, 1
 143733.com, 1
 143933.com, 1
@@ -382,17 +385,16 @@ 1876996.com, 1
 18888msc.com, 1
 1888zr.com, 1
 1889p.com, 1
 188da.com, 1
 188dv.com, 1
 1895media.com, 1
 189dv.com, 1
 189fc.com, 1
-18celebration.com, 1
 18f.gov, 1
 18f.gsa.gov, 0
 1911trust.com, 1
 1912x.com, 1
 192.io, 1
 192168ll.repair, 1
 1921958389.rsc.cdn77.org, 1
 192433.com, 1
@@ -446,16 +448,17 @@ 1r.is, 1
 1rs.nl, 1
 1salland.nl, 1
 1scope.com, 1
 1se.co, 1
 1se2or3.com, 1
 1st-bounce.co.uk, 1
 1st-community.de, 1
 1stchoicefun.co.uk, 1
+1stchoicelandscapingwa.com, 1
 1stclassbouncycastles.co.uk, 1
 1stforfun.co.uk, 1
 1stpeninsulabouncers.co.uk, 1
 1volcano.ru, 1
 1way.faith, 1
 1whw.co.uk, 1
 1wirelog.de, 1
 1wl.uk, 1
@@ -585,17 +588,19 @@ 2rsc.com, 1
 2rsc.net, 1
 2stv.net, 1
 2tuu.com, 1
 2ulcceria.nl, 1
 2wheel.com, 1
 2y.fi, 1
 3-dot-careapp1-146314.appspot.com, 1
 300m.com, 0
+301.technology, 1
 302422.com, 1
+303112.com, 1
 303422.com, 1
 304122.com, 1
 304322.com, 1
 304622.com, 1
 3056999.com, 1
 309422.com, 1
 30hzcollective.com, 1
 310422.com, 1
@@ -697,16 +702,17 @@ 365healthworld.com, 1
 365propertybuyer.co.uk, 1
 365skulls.com, 1
 370422.com, 1
 371422.com, 1
 371cloud.com, 1
 373422.com, 1
 374933.com, 1
 375422.com, 1
+376208.com, 1
 379700.com, 1
 380422.com, 1
 3839.ca, 1
 3880p.com, 1
 38888msc.com, 1
 388da.com, 1
 38sihu.com, 0
 390422.com, 1
@@ -895,16 +901,17 @@ 514622.com, 1
 514922.com, 1
 515422.com, 1
 516422.com, 1
 517vpn.cn, 1
 51877.net, 1
 519422.com, 1
 51acg.eu.org, 1
 51aifuli.com, 1
+51guaq.com, 1
 51tiaojiu.com, 1
 5214889.com, 1
 5214889.net, 1
 5219.ml, 1
 524022.com, 1
 524622.com, 1
 524922.com, 1
 525.info, 1
@@ -952,21 +959,23 @@ 55797.com, 1
 558da.com, 1
 566380.com, 1
 56877.com, 1
 575380.com, 1
 576422.com, 1
 578380.com, 1
 579422.com, 1
 57wilkie.net, 1
+581018.com, 1
 583422.com, 1
 585380.com, 1
 585422.com, 1
 586422.com, 1
 588da.com, 1
+588l.com, 1
 58nav.com, 1
 591380.com, 1
 591422.com, 1
 592380.com, 1
 592422.com, 1
 5930593.com, 1
 593380.com, 1
 594022.com, 1
@@ -1157,21 +1166,21 @@ 738433.com, 1
 739433.com, 1
 73info.com, 1
 740833.com, 1
 741833.com, 1
 742833.com, 1
 743833.com, 1
 74th.jp, 1
 755k3.com, 1
-758global.com, 1
 762.ch, 1
 7717a.com, 1
 7733445.com, 1
 7770b.com, 1
+7770t.com, 1
 7777yh.com, 1
 777coin.com, 1
 77dostavkaroz.ru, 1
 783lab.com, 1
 787k3.com, 1
 7885765.com, 1
 7891553.com, 1
 7891997.com, 1
@@ -1188,16 +1197,17 @@ 7proxies.com, 1
 7qly.com, 1
 7sons.de, 1
 7thcircledesigns.com, 1
 7trade8.com, 1
 7x24servis.com, 1
 8003pay.com, 1
 804322.com, 1
 8080883.com, 1
+8080889.com, 1
 8086.cf, 1
 80883.cc, 1
 80887.cc, 1
 808phone.net, 1
 809422.com, 1
 80993.net, 1
 814022.com, 1
 815jz.com, 1
@@ -1219,16 +1229,17 @@ 850226.com, 1
 8522.com, 1
 8522club.com, 1
 8522hk.com, 1
 8522ph.com, 1
 8522top.com, 1
 8522tw.com, 1
 8522usa.com, 1
 8560.be, 1
+86286286.com, 1
 86499.com, 1
 8649955.com, 1
 8649966.com, 1
 8649977.com, 1
 8688fc.com, 1
 86metro.ru, 1
 8722.am, 1
 8722am.com, 1
@@ -1380,16 +1391,17 @@ 8tuffbeers.com, 1
 8ung.online, 1
 8xx.bet, 1
 8xx.io, 1
 8xx888.com, 1
 8xxbet.net, 1
 8xxxxxxx.com, 1
 8y.network, 1
 8yun.cf, 1
+8yun.ga, 1
 9-11commission.gov, 1
 903422.com, 1
 905422.com, 1
 9090819.com, 1
 90r.jp, 1
 91-freedom.com, 1
 910kj.com, 1
 9118.com, 1
@@ -1522,17 +1534,16 @@ aandkevents.co.uk, 1
 aanmpc.com, 1
 aaomidi.com, 1
 aapar.nl, 1
 aapas.org.ar, 1
 aariefhaafiz.com, 1
 aarklendoia.com, 1
 aarkue.eu, 1
 aaron.xin, 1
-aaronburt.co.uk, 0
 aaronhorler.com, 1
 aaronhorler.com.au, 1
 aaronkimmig.de, 1
 aaronroyle.com, 1
 aaronsilber.me, 1
 aarvinproperties.com, 1
 aatf.us, 1
 aati.be, 1
@@ -1575,16 +1586,17 @@ abecodes.net, 1
 abeestrada.com, 0
 abeilles-idapi.fr, 1
 abenteuer-ahnenforschung.de, 1
 abeontech.com, 1
 aberdeenalmeras.com, 1
 aberdeencastles.co.uk, 1
 aberdeenjudo.co.uk, 1
 abeus.com, 1
+abg.ninja, 1
 abhibhat.com, 1
 abhisharma.me, 1
 abi-2017.tk, 1
 abi-fvs.de, 1
 abiapp.net, 1
 abibruce.co.uk, 1
 abidinginhesed.com, 1
 abigailstark.com, 1
@@ -1735,29 +1747,29 @@ accurateautobodywa.com, 1
 accuritconsulting.com, 1
 accuritpresence.com, 1
 accutint.com, 1
 accwing.com, 1
 ace.media, 1
 ace.one, 1
 acealters.com, 1
 aceanswering.com, 1
-acecerts.co.uk, 1
 acecolleges.edu.au, 1
 acedog.co, 1
 aceinflatables.com, 1
 aceinstituteonline.com, 1
 acelpb.com, 1
 acem.org.au, 1
 acemobileforce.com, 1
 acemypaper.com, 1
 acen.eu, 1
 acerentalandsales.com, 1
 acessoeducacao.com, 1
 acfo.org, 1
+acfun.eu.org, 1
 acg.mn, 1
 acg.sb, 0
 acg.social, 1
 acgaudio.com, 1
 acgmoon.com, 1
 acgmoon.org, 1
 acgpiano.club, 1
 acgtalktw.com, 1
@@ -1818,30 +1830,30 @@ acriticismlab.org, 1
 acrolife.cz, 1
 acroso.me, 1
 across.ml, 1
 acrossgw.com, 1
 acrosstheblvd.com, 1
 acroyoga-nuernberg.de, 1
 acrylbilder-acrylmalerei.de, 1
 acrylicwifi.com, 1
-acs-chantal.com, 1
 acsbbs.org, 1
 acsc.gov.au, 1
 acscbasket.com, 1
 acsemb.org, 1
 acsihostingsolutions.com, 0
 acsports.ca, 1
 actc.org.uk, 1
 actc81.fr, 1
 actgruppe.de, 1
 actheater.com, 1
 actiefgeld.nl, 1
 actilove.ch, 1
 actioncleaningnd.com, 1
+actioncoachignite.co.za, 1
 actionfinancialservices.net, 1
 actionlabs.net, 1
 actionmadagascar.ch, 1
 actionsack.com, 1
 actionselling.com, 1
 actiontowingroundrock.com, 1
 activatemyiphone.com, 1
 activateudid.com, 1
@@ -2088,19 +2100,19 @@ adventurousway.com, 1
 advertis.biz, 1
 advertisemant.com, 1
 advocate-europe.eu, 1
 advocaten-avocats.be, 1
 advocatenalkmaar.org, 1
 advocator.ca, 1
 advocoeurdehaan.nl, 1
 advogatech.com.br, 1
-advokat-romanov.com, 1
 advtran.com, 1
 adware.pl, 1
+adwokatkosterka.pl, 1
 adwokatzdunek.pl, 1
 adws.io, 1
 adxperience.com, 1
 adzie.xyz, 1
 adzuna.at, 1
 adzuna.ca, 1
 adzuna.co.nz, 1
 adzuna.co.za, 1
@@ -2132,27 +2144,27 @@ aegrel.ee, 1
 aehe.us, 1
 aei.co.uk, 1
 aelisya.ch, 1
 aelurus.com, 1
 aenterprise.info, 1
 aeon.co, 1
 aeon.wiki, 1
 aeonct.org, 1
-aep-digital.com, 1
 aeradesign.com, 1
 aerandir.fr, 1
 aereco.com, 1
 aerelon.de, 0
 aergia.eu, 1
 aerisnetwork.com, 1
 aero-pioneer.com, 1
 aerobasegroup.com, 1
 aerobotz.com, 1
 aeronautix.com, 1
+aeronote.net, 1
 aeropole.de, 1
 aeropole.eu, 1
 aerosimexperience.com, 1
 aerospace-schools.com, 1
 aerotechcoatings.com, 1
 aertel.ie, 1
 aestheticdr.org, 1
 aesthetx.com, 1
@@ -2162,16 +2174,17 @@ aeternus.tech, 1
 aetherc0r3.eu, 1
 aethonan.pro, 1
 aetoscg.com, 1
 aetoscg.com.au, 1
 aevpn.org, 1
 aextron.com, 1
 aextron.de, 1
 aextron.org, 1
+af-tech.cz, 1
 afavre.io, 1
 afb24.de, 1
 afbeelding.im, 1
 afbeeldinguploaden.nl, 1
 afcmrs.org, 1
 afcompany.it, 1
 afcurgentcarelyndhurst.com, 1
 aff.moe, 1
@@ -2191,16 +2204,17 @@ affloc.com, 1
 affordableazdivorce.com, 1
 affordableblindsexpress.com, 1
 affordableenvironmental.net, 1
 affordablehealthquotesforyou.com, 1
 affordablekilimanjaro.com, 1
 affordablemudjacking.com, 1
 affordablepapers.com, 1
 affordableracingparts.com.au, 1
+affpass.com, 1
 affping.com, 1
 affvps.net, 1
 afghan.dating, 1
 afgn.com.ua, 1
 afi-business-consulting.com, 1
 aficionados.com.br, 1
 afinadoronline.com.br, 1
 afinaudio.com, 1
@@ -2349,29 +2363,31 @@ ahughes03.com, 1
 ahwah.net, 1
 ahxxm.com, 1
 ai-english.jp, 1
 ai-soft.co.jp, 1
 ai.gov, 1
 ai.je, 1
 ai1989.com, 1
 aia.de, 1
+aianipid.ee, 1
 aiasesoriainmobiliaria.com, 1
 aibaoyou.com, 1
 aibenzi.com, 1
 aibiying.com, 1
 aibsoftware.mx, 1
 aicial.co.uk, 1
 aid-web.ch, 1
 aidanapple.com, 1
 aidanmitchell.co.uk, 1
 aidanmitchell.uk, 1
 aidanmontare.net, 1
 aidanpr.com, 1
 aidanpr.net, 1
+aidarikako.com, 1
 aide-valais.ch, 1
 aiden.link, 1
 aidhan.net, 1
 aidi-ahmi.com, 1
 aids.gov, 1
 aie.de, 1
 aiesecarad.ro, 1
 aiforsocialmedia.com, 1
@@ -2379,35 +2395,39 @@ aifriccampbell.com, 1
 aigcev.org, 1
 aigenpul.se, 1
 aignermunich.com, 1
 aignermunich.de, 1
 aignermunich.jp, 1
 aiho.stream, 1
 aiicy.org, 1
 aiida.se, 1
+aiinsurance.io, 1
+aiinsurance.xyz, 1
 aijsk.com, 1
 aikenorganics.com, 1
 aikenpromotions.com, 1
 aiki.de, 1
 aiki.do, 1
 aiki.tk, 1
 aikido-club-limburg.de, 1
 aikido-kiel.de, 1
 aikido-linz.at, 1
 aikido-wels.at, 1
 ailitonia.com, 1
 ailitonia.xyz, 1
 aimax.com, 1
 aimeeandalec.com, 1
+aimerworld.com, 0
 aimgroup.co.tz, 1
 aimi-salon.com, 1
 aimonline.nl, 1
 aimotive.com, 1
 aimrom.org, 1
+aimstoreglobal.com, 1
 aintevenmad.ch, 1
 ainutrition.co.uk, 1
 ainvest.de, 1
 aioboot.com, 1
 aiois.com, 1
 aipbarcelona.com, 1
 aiphyron.com, 1
 air-craftglass.com, 1
@@ -2602,16 +2622,17 @@ akshi.in, 1
 aktan.com.br, 1
 aktin.cz, 1
 aktin.sk, 1
 aktiv-naturheilmittel.at, 1
 aktiv-naturheilmittel.ch, 1
 aktiv-naturheilmittel.de, 1
 aktivace.eu, 1
 aktivierungscenter.de, 1
+aktuelle-uhrzeit.at, 1
 akuislam.com, 1
 akukas.com, 1
 akul.co.in, 1
 akustik.tech, 1
 akutun.cl, 1
 akvorrat.at, 1
 akyildiz.net, 1
 al-f.net, 1
@@ -2716,16 +2737,17 @@ alexbogovich.com, 1
 alexbresnahan.com, 1
 alexcoman.com, 1
 alexdaniel.org, 1
 alexey-shamara.ru, 1
 alexeykopytko.com, 1
 alexfabian.myftp.org, 1
 alexgaynor.net, 1
 alexgebhard.com, 1
+alexhalderman.com, 1
 alexhd.de, 1
 alexio.ml, 1
 alexisabarca.com, 1
 alexischaussy.xyz, 1
 alexiskoustoulidis.com, 1
 alexismeza.com, 1
 alexismeza.com.mx, 1
 alexismeza.dk, 1
@@ -2893,16 +2915,17 @@ allstarpartyinflatables.co.uk, 1
 allstarquilts.com, 1
 allstorebrasil.com.br, 1
 allsun.online, 1
 allsync.com, 1
 allsync.nl, 1
 allteach.co.uk, 1
 allterrainfence.com, 1
 allthecryptonews.com, 1
+alltherooms.com, 1
 allthethings.co.nz, 1
 allthings.me, 1
 allthingsblogging.com, 1
 allthingsfpl.com, 1
 allthingssquared.com, 1
 allthingswild.co.uk, 1
 alltubedownload.net, 1
 allurebikerental.com, 1
@@ -2967,17 +2990,16 @@ alpinechaletrental.com, 1
 alpinehighlandrealty.com, 1
 alpineplanet.com, 1
 alpinepubliclibrary.org, 1
 alpinestarmassage.com, 1
 alpinetrek.co.uk, 1
 alpiniste.fr, 1
 alpstarentaisetaxi.com, 1
 alpstarentaisetaxi.fr, 1
-alqassam.net, 1
 alquiaga.com, 1
 alrait.com, 1
 alre-outillage.fr, 1
 alroniks.com, 1
 als-japan.com, 1
 alstertouch.com, 1
 alstertouch.de, 1
 alstroemeria.org, 1
@@ -3104,17 +3126,16 @@ amechancez.work, 1
 amedtest.org, 1
 ameego.com, 1
 ameego.it, 1
 ameego.net, 1
 ameego.nl, 1
 ameego.org, 1
 amees.me, 0
 ameho.me, 0
-amelandadventure.nl, 1
 amello.de, 1
 amendine.fr, 1
 america.gov, 1
 americafamilylawcenter.org, 1
 american-school-search.com, 1
 american.dating, 1
 americandetour.com, 1
 americanfoundationbr.com, 1
@@ -3137,16 +3158,17 @@ ameza.io, 1
 ameza.me, 1
 ameza.net, 1
 amf.to, 1
 amg-exterieur.fr, 1
 amg-microwave.com, 1
 amh-entertainments.co.uk, 1
 ami-de-bastanes.fr, 1
 amica-travel.com, 1
+amica.it, 1
 amicalecanyon.ch, 1
 amiciidogrescue.org.uk, 1
 amicimar.it, 1
 amiciperlatesta.it, 1
 amielle.com, 1
 amielucha.com, 1
 amifoundation.net, 1
 amihub.com, 1
@@ -3184,16 +3206,17 @@ amphibo.ly, 1
 ampledesigners.com, 1
 ampleinfographics.com, 1
 ampleroads.com, 1
 ampol-agd.pl, 1
 ampproject.com, 1
 ampproject.org, 1
 amrcaustin.com, 1
 amrcla.com, 1
+ams-web-qa.azurewebsites.net, 1
 ams.co.rs, 1
 amsportuk.com, 1
 amstelland.com, 1
 amsterdamian.com, 1
 amtentertainments.co.uk, 1
 amunoz.org, 1
 amuq.net, 1
 amuraimpianti.it, 1
@@ -3239,16 +3262,17 @@ anassiriphotography.com, 0
 anastasia-shamara.ru, 1
 anatoray.com, 1
 ance.lv, 1
 ancel.io, 1
 ancestramil.fr, 1
 anchev.net, 1
 anchorit.gov, 1
 anchovy.nz, 0
+anciennes-automobiles.fr, 1
 anciens.org, 1
 ancient-gates.de, 1
 ancientcraft.eu, 1
 ancientnorth.com, 1
 ancientnorth.nl, 1
 ancolies-andre.com, 1
 anconaswine.com, 1
 and-stuff.nl, 1
@@ -3315,29 +3339,31 @@ andrewpeng.net, 1
 andrewprokos.com, 1
 andrewrdaws.com, 1
 andrewrgoss.com, 1
 andrewryno.com, 1
 andrewsun.com, 1
 andrewtchin.com, 1
 andrewx.net, 1
 andrezadnik.com, 1
+andrisilberschmidt.ch, 1
 andro2id.com, 1
 andro4all.com, 1
 android, 1
 android.re, 1
 androide.com, 1
 androidhry.cz, 1
 androidkatalog.cz, 1
 androidnovinky.cz, 1
 androidservicetool.com, 1
 androidsis.com, 1
 androidtamer.com, 1
 androidtelefony.cz, 1
 androidzone.me, 1
+andromeda.se, 1
 andromedacenter.com, 1
 andronika.net, 0
 androticsdirect.com, 1
 andruvision.cz, 1
 andsat.org, 1
 andschwa.com, 0
 andso.cn, 1
 anduril.de, 1
@@ -3416,16 +3442,17 @@ anime-tip.com, 1
 anime.my, 0
 anime1.me, 1
 anime1.moe, 1
 anime1.pw, 1
 anime1.top, 1
 animeai.com, 1
 animefluxxx.com, 1
 animeinsights.net, 1
+animeone.me, 1
 animesharp.com, 1
 animetriad.com, 1
 animojis.es, 1
 animorphsfanforum.com, 1
 anipassion.com, 0
 anitaalbersen.nl, 1
 anitube-nocookie.ch, 1
 anitube.ch, 1
@@ -3509,16 +3536,17 @@ ansas.net, 1
 ansdell.net, 1
 anseo.ninja, 1
 ansermet.net, 1
 ansgar-sonntag.de, 1
 ansgar.tk, 1
 ansgarsonntag.de, 1
 anshar.eu, 1
 anshumanbiswas.com, 1
+ansibeast.net, 1
 ansichtssache.at, 1
 ansogning-sg.dk, 1
 anstaskforce.gov, 1
 answers-online.ru, 1
 antama.eu, 1
 antama.nl, 1
 antani.cloud, 1
 antarcti.co, 1
@@ -3664,16 +3692,17 @@ apiary.blog, 1
 apiary.clothing, 1
 apiary.shop, 1
 apiary.store, 1
 apiary.supplies, 1
 apiary.supply, 1
 apila.care, 1
 apila.us, 1
 apiled.io, 1
+apimo.net, 1
 apimon.de, 1
 apination.com, 1
 apio.systems, 1
 apis.blue, 1
 apis.google.com, 1
 apis.moe, 1
 apisyouwonthate.com, 1
 apiu.me, 1
@@ -4102,16 +4131,17 @@ arty.name, 1
 arubasunsetbeach.com, 1
 arunjoshua.com, 1
 arveron.ch, 1
 arvid.io, 1
 arviksa.co.uk, 1
 arvindhariharan.com, 1
 arvindhariharan.me, 1
 arvutiladu.ee, 1
+arweth.com, 1
 arxell.com, 1
 aryabusines.com, 1
 aryalaroca.de, 1
 aryan-nation.com, 1
 aryasenna.net, 1
 arzid.com, 1
 arzinfo.pw, 1
 as200753.com, 1
@@ -4198,16 +4228,17 @@ asm-x.com, 0
 asmbsurvey.com, 1
 asmdz.com, 1
 asmood.net, 1
 asoul.tw, 1
 aspargesgaarden.no, 1
 aspatrimoine.com, 1
 aspcl.ch, 1
 aspectcontext.com, 1
+aspectuw.com.au, 1
 asperti.com, 1
 aspformacion.com, 1
 asphaltfruehling.de, 1
 asphyxia.su, 1
 aspiescentral.com, 1
 aspiradorasbaratas.net, 1
 aspirateur-anti-pollution.fr, 1
 aspires.co.jp, 1
@@ -4240,16 +4271,18 @@ assodigitale.it, 1
 asspinter.me, 1
 assumptionpj.org, 1
 asta-bar.de, 0
 astal.rs, 1
 astaninki.com, 1
 astarbouncycastles.co.uk, 1
 astarforu.com, 1
 astarmathsandphysics.com, 1
+astaxanthin-sport.de, 1
+astaxanthin.de, 1
 astec-informatica.com, 1
 astengox.com, 1
 astenotarili.online, 1
 astenretail.com, 1
 asthon.cn, 1
 astral-imperium.uk, 1
 astral.org.pl, 1
 astrath.net, 1
@@ -4507,16 +4540,17 @@ australiancattle.dog, 1
 australianimmigrationadvisors.com.au, 1
 australiantemporarytattoos.com, 1
 australiantemporarytattoos.com.au, 1
 australien-tipps.info, 1
 austromorph.space, 1
 auszeit-lanzarote.com, 1
 auszeit.bio, 1
 auth.adult, 1
+authenticationhub.io, 1
 authenticwoodcraft.com, 1
 authinfo-bestellen.de, 1
 authinity.com, 1
 authint.com, 1
 authland.com, 0
 author24.biz, 1
 author24.info, 1
 authoritysolutions.com, 1
@@ -4545,16 +4579,18 @@ autodalmacija.com, 1
 autodidactic.ai, 1
 autodidacticstudios.com, 1
 autodidacticstudios.net, 1
 autodidacticstudios.org, 1
 autoecoledumontblanc.com, 1
 autoentrepreneurinfo.com, 1
 autoepc.ro, 1
 autoeshop.eu, 1
+autohaus-snater.de, 1
+autoi.ch, 1
 autoinsurancehavasu.com, 1
 autokeyreplacementsanantonio.com, 1
 autokovrik-diskont.ru, 1
 autoledky.sk, 1
 automaan.nl, 1
 automacity.com, 1
 automatethis.com.au, 1
 automatic.com, 1
@@ -4594,17 +4630,16 @@ autoteplo.org, 1
 autoterminus-used.be, 1
 autoto.hr, 1
 autotransportquoteservices.com, 1
 autoverzekeringafsluiten.com, 1
 autowerkstatt-puchheim.de, 1
 autozane.com, 1
 autres-talents.fr, 1
 autshir.com, 1
-auux.com, 1
 auvernet.org, 1
 aux-arts-de-la-table.com, 1
 auxiliame.com, 1
 auxille.com, 1
 auxquatrevents.ch, 1
 av-yummy.com, 1
 av01.tv, 1
 av0ndale.de, 1
@@ -4749,17 +4784,17 @@ ayesh.win, 1
 aying.love, 1
 ayj.solutions, 1
 aykutcevik.com, 1
 aylak.com, 1
 aylesburycastlehire.co.uk, 1
 aymerick.fr, 1
 aymericlagier.com, 1
 ayon.group, 1
-ayothemes.com, 0
+ayothemes.com, 1
 ayrohq.com, 1
 ayrshirebouncycastlehire.co.uk, 1
 ayumindev.net, 1
 ayurveda-mantry.com, 1
 ayurveda101.com, 0
 az-moga.bg, 1
 az-vinyl-boden.de, 1
 az.search.yahoo.com, 0
@@ -4991,16 +5026,17 @@ badblock.fr, 1
 badboyzclub.de, 1
 badf00d.de, 1
 badgersystems.de, 1
 badges.fedoraproject.org, 1
 badges.stg.fedoraproject.org, 1
 badgesenpatches.nl, 1
 badgirlsbible.com, 1
 badhusky.com, 1
+badkamermarkt.nl, 1
 badlink.org, 1
 badmania.fr, 1
 badmintonbible.com, 1
 badoo.com, 1
 badoo.de, 1
 badoo.eu, 1
 badoo.us, 1
 badpackets.net, 1
@@ -5013,16 +5049,17 @@ baer.space, 1
 bag.bg, 1
 bageez.us, 1
 bagelcraft.net, 1
 bagelsbakery.com, 0
 bageluncle.com, 1
 baggy.me.uk, 1
 bagheera.me.uk, 1
 baglu.com, 1
+bagni-chimici.roma.it, 1
 bagsofbounce.co.uk, 1
 bagspecialist.nl, 1
 bagstage.de, 1
 bah.im, 0
 bahaiprayers.io, 1
 bahnbonus-praemienwelt.de, 1
 bahnenimbild.de, 1
 bahnenimbild.eu, 1
@@ -5168,16 +5205,17 @@ bao-in.net, 1
 baobeiglass.com, 1
 baodan666.com, 1
 baofengtech.com, 1
 baopublishing.it, 1
 baosuckhoedoisong.net, 1
 baptiste-peugnez.fr, 1
 baptistedeleris.fr, 1
 bar-harcourt.com, 1
+bara1.se, 1
 barabrume.fr, 1
 barans2239.com, 1
 baravalle.com, 1
 baraxolka.ru, 1
 barbarabowersrealty.com, 1
 barbarafabbri.com, 1
 barbarafeldman.com, 1
 barbarians.com, 0
@@ -5202,16 +5240,17 @@ baresquare.com, 1
 baripedia.org, 1
 baris-sagdic.com, 1
 bariseau-mottrie.be, 1
 barisi.me, 1
 bariskaragoz.nl, 1
 baristador.com, 1
 bariumoxide.com, 1
 barkerjr.xyz, 1
+barlex.pl, 1
 barlotta.net, 1
 barnabycolby.io, 1
 barnel.com, 1
 barnfotografistockholm.se, 1
 barnrats.com, 1
 barpodsosnami.pl, 1
 barprive.com, 1
 barqo.co, 1
@@ -5272,16 +5311,17 @@ bassresource.com, 1
 bassrider.eu, 1
 bassys.com.co, 1
 bastelzauberwelt.de, 1
 bastianstalder.ch, 1
 bastiv.com, 1
 bastivmobile.com, 1
 bastolino.de, 1
 basw.eu, 1
+baswag.de, 1
 baswetter.photography, 1
 basyspro.net, 1
 bat909.com, 1
 bat909.net, 1
 bat9vip.com, 1
 bat9vip.net, 1
 batcave.tech, 1
 batch.com, 1
@@ -5357,16 +5397,17 @@ bbinsure.com, 1
 bbka.org.uk, 1
 bbkaforum.co.uk, 1
 bbkworldwide.jp, 1
 bbld.de, 1
 bblove.me, 1
 bblsa.ch, 1
 bbnbb.de, 1
 bbnx.net, 1
+bbs8080.net, 1
 bbsec.xyz, 1
 bbswin9.cc, 1
 bbswin9.com, 1
 bbuio.com, 0
 bbw-wrestling.com, 1
 bbw.dating, 1
 bbwcs.co.uk, 1
 bbwfacesitting.us, 1
@@ -5400,17 +5441,16 @@ bcrook.com, 1
 bcswampcabins.com, 1
 bcsytv.com, 0
 bcvps.com, 1
 bcyw56.live, 0
 bd2positivo.com, 1
 bda-boulevarddesairs.com, 1
 bdbxml.net, 1
 bdd.fi, 1
-bdenzer.xyz, 1
 bdikaros-network.net, 1
 bdpachicago.tech, 1
 bdsmxxxpics.com, 1
 bdvg.org, 1
 be-a-password.ninja, 1
 be-ka-tec.de, 1
 be-real.life, 0
 be-up-developpement.com, 1
@@ -5543,17 +5583,16 @@ beeswax-orgone.com, 1
 beetgroup.id, 1
 beethoveninlove.com, 1
 beetman.net, 1
 beeutifulparties.co.uk, 1
 beexfit.com, 1
 beezkneezcastles.co.uk, 1
 beeznest.com, 1
 befoodsafe.gov, 1
-beforesunrise.de, 1
 beforeyoueatoc.com, 1
 beframed.ch, 1
 befreewifi.info, 1
 befundonline.de, 1
 begabungsfoerderung.info, 1
 begbie.com, 1
 beginatzero.com, 1
 beginner.nl, 1
@@ -5610,16 +5649,17 @@ bellthrogh.com, 1
 bellthrough.com, 1
 belly-button-piercings.com, 1
 bellyandbrain.amsterdam, 1
 belmontgoessolar.org, 1
 belos.at, 1
 belouga.org, 1
 belpbleibtbelp.ch, 1
 belt.black, 1
+beltar.nl, 1
 belvoirbouncycastles.co.uk, 1
 belwederczykow.eu, 1
 bely-mishka.by, 1
 belyoung.com.br, 1
 bemcorp.de, 1
 bemindly.com, 1
 bemsoft.pl, 1
 ben-energy.com, 0
@@ -5667,16 +5707,17 @@ benjaminblack.net, 1
 benjamindietrich.com, 1
 benjamindietrich.de, 1
 benjaminjurke.com, 1
 benjaminkopelke.com, 1
 benjaminpiquet.fr, 1
 benjamins.com, 1
 benjaminvasel.de, 1
 benjii.me, 1
+benjijaldoner.nl, 1
 benleemd.com, 1
 benmatthews.com.au, 1
 benmillett.us, 0
 bennettsbouncycastlehire.co.uk, 1
 bennettshire.co.uk, 1
 benni1.eu, 1
 bennierobinson.com, 1
 bennink.me, 1
@@ -5963,22 +6004,22 @@ beyondthecode.io, 1
 beyondtodaymediagroup.com, 1
 beyondweb.net, 1
 beyonic.com, 1
 beyours.be, 1
 bez-energie.de, 1
 bezemkast.nl, 1
 bezoomnyville.com, 1
 bezpecnostsiti.cf, 1
+bezposrednio.net.pl, 1
 bezr.co.uk, 1
 bezzia.com, 1
 bf7088.com, 1
 bf7877.com, 1
 bfam.tv, 1
-bfcgermania88.de, 1
 bfem.gov, 1
 bfgcdn.com, 1
 bflix.tv, 1
 bfob.gg, 1
 bforb.sk, 1
 bfp-mail.de, 1
 bfpg.org, 1
 bfrailwayclub.cf, 1
@@ -6036,16 +6077,17 @@ bibuch.com, 1
 bicecontracting.com, 1
 bicha.net, 1
 bichonfrise.com.br, 1
 bichonmaltes.com.br, 1
 bicifanaticos.com, 1
 bicranial.io, 1
 bicycle-events.com, 1
 bicycleframeiz.com, 1
+bicycleuniverse.com, 1
 biddl.com, 1
 biddle.co, 1
 bidman.cz, 1
 bidman.eu, 1
 bidu.com.br, 1
 bie.edu, 0
 bie08.com, 1
 bie35.com, 1
@@ -6146,33 +6188,31 @@ billpro.com, 0
 billpro.com.au, 1
 billrhodesbakery.com, 1
 billrobinson.io, 1
 billsqualityautocare.com, 1
 billy.pictures, 1
 billyoh.com, 1
 billysbouncycastlehire.co.uk, 1
 billywig.stream, 1
-biloplysninger.dk, 1
 bilsho.com, 1
 biltullen.com, 1
 bimbo.com, 0
 bimbo.com.ar, 0
 bimbobakeriesusa.com, 0
 bimmerlabs.com, 1
 bin95.com, 1
 bina.az, 1
 binam.center, 1
 binans.co, 1
 binans.com, 1
 binans.com.tr, 1
 binans.io, 1
 binans.net, 1
 binans.xyz, 1
-binarization.com, 1
 binarization.net, 1
 binaryabstraction.com, 1
 binaryapparatus.com, 1
 binaryappdev.com, 1
 binarycreations.scot, 1
 binarydream.fi, 1
 binaryevolved.com, 1
 binaryrebel.net, 1
@@ -6195,16 +6235,17 @@ binnenmeer.de, 1
 binsp.net, 1
 bintangsyurga.com, 1
 bintelligence.info, 1
 binti.com, 1
 bintooshoots.com, 1
 bio-disinfestazione.it, 1
 bio-feed.org, 1
 bio24.si, 1
+bioastin.de, 1
 bioatelier.it, 1
 biobuttons.ch, 1
 biocheminee.com, 1
 biocrafting.net, 0
 biodiagnostiki.clinic, 1
 biodieseldata.com, 1
 biodots.at, 1
 biodots.eu, 1
@@ -6230,16 +6271,17 @@ biology-colleges.com, 1
 biomag.it, 1
 biomasscore.com, 1
 biomed-hospital.ch, 1
 biomed.ch, 1
 biometrics.es, 1
 biomin.co.uk, 1
 biomodra.cz, 1
 biopreferred.gov, 1
+biopronut.com, 1
 biopsychiatry.com, 1
 bioresonanz-ibiza.com, 1
 biosafe.ch, 1
 biosbits.org, 1
 bioshine.com.sg, 1
 bioshome.de, 1
 biosignalanalytics.com, 1
 biospeak.solutions, 1
@@ -6478,16 +6520,17 @@ black.host, 1
 black1ce.com, 1
 blackandpony.de, 1
 blackapron.com.br, 1
 blackbag.nl, 1
 blackbase.de, 1
 blackberrycentral.com, 1
 blackbird-whitebird.com, 1
 blackburn.link, 0
+blackbyte.it, 1
 blackcat.ca, 1
 blackcatinformatics.ca, 1
 blackcatinformatics.com, 1
 blackcicada.com, 1
 blackdesertsp.com, 1
 blackdotbrewery.com, 1
 blackdown.de, 1
 blackdragoninc.org, 1
@@ -6533,29 +6576,34 @@ blankersfamily.com, 1
 blanket.technology, 1
 blantik.net, 1
 blantr.com, 1
 blarg.co, 1
 blasorchester-runkel.de, 1
 blastentertainment.com.au, 1
 blastersklan.com, 1
 blastzoneentertainments.co.uk, 1
+blatnice.cf, 1
+blatnice.ga, 1
+blatnice.gq, 1
+blatnice.ml, 1
+blatnice.tk, 1
 blaudev.es, 1
 blauerhunger.de, 1
 blayne.me, 1
 blayneallan.com, 1
 blazeit.io, 1
 blazing.cz, 1
 blazor.nl, 1
 bleaching-tipps.de, 1
 bleche-onlineshop.at, 1
 bleche-onlineshop.de, 1
-blechinger.io, 1
 blechschmidt.saarland, 1
 bleep.zone, 1
+blend.guru, 1
 blenderinsider.com, 1
 blenderrecipereviews.com, 1
 blending.kr, 1
 blendle.com, 1
 blendle.nl, 1
 blendr.com, 1
 blendstudios.com, 1
 blenheimears.com, 1
@@ -6593,16 +6641,17 @@ blivawesome.dk, 1
 blivvektor.dk, 1
 blizhost.com, 1
 blizhost.com.br, 1
 blizora.com, 1
 blkbx.eu, 1
 blm.gov, 1
 blo-melchiorshausen.de, 1
 blobfolio.com, 1
+blocher.ch, 1
 block-this.com, 1
 block65.com, 1
 blockchain.com, 1
 blockchain.info, 1
 blockchainced.com, 1
 blockchaindaigakko.jp, 1
 blockchainwhiz.com, 1
 blockcheck.network, 1
@@ -6618,16 +6667,17 @@ bloemenbesteld.nl, 1
 bloemendal.me, 1
 blog-grupom2.es, 1
 blog.gov.uk, 1
 blog.gparent.org, 1
 blog.linode.com, 0
 blog.lookout.com, 0
 blogabout.ru, 1
 blogaid.net, 1
+bloganchoi.com, 1
 blogarts.net, 1
 blogbooker.com, 1
 blogconcours.net, 1
 blogcuaviet.com, 1
 blogdelosjuguetes.com, 1
 blogdeyugioh.com, 1
 blogdimoda.com, 1
 blogdimotori.it, 1
@@ -6640,16 +6690,17 @@ bloginbeeld.nl, 1
 bloglines.co.za, 1
 bloglogistics.com, 1
 blogom.at, 1
 blogpentrusuflet.ro, 1
 blogreen.org, 1
 blogsdna.com, 1
 blogthedayaway.com, 1
 blogtroterzy.pl, 1
+blok56.nl, 1
 blokmy.com, 1
 blood4pets.tk, 1
 bloodhunt.pl, 1
 bloodsports.org, 1
 bloody.pw, 1
 bloom-avenue.com, 1
 bloom.sh, 0
 bltc.co.uk, 1
@@ -6680,17 +6731,16 @@ blueimp.net, 1
 bluekrypt.com, 1
 blueliquiddesigns.com.au, 1
 bluemeda.web.id, 1
 bluemoonroleplaying.com, 1
 bluemosh.com, 1
 bluemtnrentalmanagement.ca, 1
 bluenote9.com, 1
 blueoakart.com, 1
-blueoceantech.us, 1
 bluepearl.tk, 1
 blueperil.de, 1
 bluepoint.foundation, 1
 bluepoint.institute, 1
 bluepostbox.de, 1
 bluepromocode.com, 1
 bluerootsmarketing.com, 1
 blues-and-pictures.com, 1
@@ -6809,16 +6859,17 @@ bogosity.se, 1
 bohan.co, 1
 bohramt.de, 1
 bohyn.cz, 1
 boimmobilier.ch, 1
 boincstats.com, 1
 boiseonlinemall.com, 1
 boisewaldorf.org, 1
 bokadoktorn-test.net, 1
+bokadoktorn.se, 1
 boke112.com, 1
 bokka.com, 1
 bokkeriders.com, 1
 bokutake.com, 1
 boldmediagroup.com, 1
 boldt-metallbau.de, 1
 bolektro.de, 1
 bolgarnyelv.hu, 1
@@ -7122,16 +7173,17 @@ bownty.dk, 1
 bownty.es, 1
 bownty.fr, 1
 bownty.it, 1
 bownty.nl, 1
 bowntycdn.net, 1
 boxdevigneron.fr, 1
 boxpeg.com, 1
 boxpirates.to, 1
+boxspringbett-160x200.de, 1
 boxvergelijker.nl, 1
 boxview.com, 1
 boyerassoc.com, 1
 boyfriendcookbook.com, 1
 boyhost.cn, 1
 boyinglanguage.com, 1
 boyntonobserver.org, 1
 boypoint.de, 1
@@ -7246,16 +7298,17 @@ brave-foods.com, 1
 brave.com, 1
 bravebaby.com.au, 1
 bravehearts.org.au, 1
 braviskindenjeugd.nl, 1
 bravisziekenhuis.nl, 0
 brazenfol.io, 1
 brazilian.dating, 1
 brazoriabar.org, 1
+brb.city, 0
 brck.nl, 1
 brd.ro, 1
 breadandlife.org, 1
 breadofgod.org, 1
 breakingtech.it, 1
 breakpoint.at, 1
 breakwall.ml, 1
 breaky.de, 1
@@ -7290,16 +7343,17 @@ bressier.fr, 1
 bretcarmichael.com, 1
 brettabel.com, 1
 brettcornwall.com, 1
 brettlawyer.com, 1
 brettw.xyz, 1
 bretzner.fr, 1
 brevboxar.se, 1
 brewsouth.com, 1
+brewvo.com, 1
 breznet.com, 1
 brfvh24.se, 1
 brgins.com, 1
 brian-gordon.name, 1
 brianalaway.com, 1
 brianalawayconsulting.com, 1
 briandwells.com, 1
 brianfoshee.com, 1
@@ -7314,26 +7368,24 @@ briarproject.org, 1
 brickftp.com, 1
 brickheroes.com, 1
 brickstreettrio.com, 1
 brickvortex.com, 1
 brickwerks.io, 1
 bricolajeux.ch, 1
 brid.gy, 0
 bridalshoes.com, 1
-brideandgroomdirect.ie, 1
 bridgedirectoutreach.com, 1
 bridgeglobalmarketing.com, 1
 bridgehomeloans.com, 1
 bridgement.com, 1
 bridgeout.com, 1
 bridgevest.com, 1
 bridgingdirectory.com, 1
 bridltaceng.com, 1
-bridzius.lt, 1
 brie.tech, 1
 briefassistant.com, 1
 briefhansa.de, 1
 briefvorlagen-papierformat.de, 1
 brier.me, 1
 briffoud.fr, 1
 briggsleroux.com, 1
 brighouse-leisure.co.uk, 1
@@ -7367,16 +7419,17 @@ britelocate.com, 1
 britishbeef.com, 1
 britishbookmakers.co.uk, 1
 britishchronicles.com, 1
 britishgroupsg.com, 1
 britishmeat.com, 1
 britishpearl.com, 1
 britishsciencefestival.org, 1
 britishscienceweek.org, 1
+britishsfaward.org, 1
 britishsnoring.co.uk, 1
 britneyclause.com, 1
 brittanyferriesnewsroom.com, 1
 britton-photography.com, 1
 brk.st, 1
 brmascots.com, 1
 brmsalescommunity.com, 1
 brn.by, 1
@@ -7389,16 +7442,17 @@ brockmeyer.net, 1
 brockmeyer.org, 1
 brodowski.cc, 1
 brody.digital, 1
 brody.ninja, 1
 broersma.com, 1
 broerweb.nl, 1
 broeselei.at, 1
 brokenhands.io, 1
+brokernet.ie, 0
 brokervalues.com, 1
 brompton-cocktail.com, 1
 bronevichok.ru, 1
 bronwynlewis.com, 1
 broodbesteld.nl, 1
 brooke-fan.com, 1
 brookehatton.com, 0
 brookframework.org, 1
@@ -7415,16 +7469,17 @@ brownihc.com, 1
 browntowncountryclub.com, 1
 browsedns.net, 1
 browsemycity.com, 1
 browserleaks.com, 1
 brrd.io, 1
 brring.com, 1
 brrr.fr, 1
 bru6.de, 1
+brubank.com, 1
 brubankv1-staging.azurewebsites.net, 1
 brucekovner.com, 1
 brucemartin.net, 1
 brucemobile.de, 0
 bruck.me, 1
 bruckner.li, 1
 brudkista.nu, 1
 brudkista.se, 1
@@ -7444,16 +7499,18 @@ brush.ninja, 1
 brutus2.ga, 1
 bruun.co, 1
 bry.do, 1
 bryancastillo.site, 1
 bryankaplan.com, 1
 bryanquigley.com, 1
 bryansmith.net, 1
 bryansmith.tech, 1
+bryantzheng.com, 1
+bryantzheng.org, 1
 brycecanyon.net, 1
 brycecanyonnationalpark.com, 1
 bryggebladet.dk, 1
 brynnan.nl, 1
 brzy-svoji.cz, 1
 bs-network.net, 1
 bs-security.com, 1
 bs.sb, 1
@@ -7479,16 +7536,17 @@ bserved.de, 1
 bsg.ro, 1
 bsgamanet.ro, 1
 bsidesf.com, 1
 bsidesf.org, 1
 bsidessf.com, 1
 bsimerch.com, 1
 bsktweetup.info, 1
 bslim-e-boutique.com, 1
+bsmomo-api.com, 1
 bso-buitengewoon.nl, 1
 bsociabl.com, 1
 bsp-southpool.com, 1
 bsquared.org, 1
 bst.gg, 1
 bstoked.net, 1
 bsuess.de, 1
 bsuru.xyz, 1
@@ -7589,17 +7647,16 @@ buildmorebuslanes.com, 1
 buildplease.com, 1
 buildrightbuildingservicesltd.co.uk, 1
 buileo.com, 1
 builtory.my, 1
 builtvisible.com, 1
 builtwith.com, 1
 buissonchardin.fr, 1
 buka.jp, 1
-bukai.men, 1
 bukiskola.hu, 1
 bukivallalkozasok.hu, 1
 bukkenfan.jp, 1
 bukpcszerviz.hu, 1
 bul3seas.eu, 1
 bulario.com, 1
 bulario.net, 1
 bulbcompare.com, 1
@@ -7636,16 +7693,17 @@ bunkyo-life.com, 1
 bunny-rabbits.com, 1
 bunnycarenotes.com, 1
 bunnydiamond.de, 1
 bunnyvishal.com, 1
 bunq.love, 1
 bunzy.ca, 1
 bupropion.com, 1
 bupu.ml, 1
+buqi.cc, 1
 buradangonder.com, 1
 burcevo.info, 1
 burfordbedandbreakfast.co.uk, 1
 burg-hohnstein.com, 1
 burgernet.nl, 1
 burgers.io, 1
 burghardt.pl, 1
 buri.be, 0
@@ -7719,16 +7777,17 @@ buttermilk.cf, 1
 buttonline.ch, 1
 buttonrun.com, 1
 buturyu.net, 1
 butzies.ddnss.org, 1
 buurtgenotencollectief.nl, 1
 buurtpreventiefraneker.nl, 1
 buxum-communication.ch, 1
 buy-out.jp, 1
+buy2dollars.com, 1
 buybike.shop, 1
 buycarpet.shop, 1
 buycbd.store, 1
 buycook.shop, 1
 buydissertations.com, 1
 buyebook.xyz, 1
 buyerdocs.com, 1
 buyessay.org, 1
@@ -7752,16 +7811,17 @@ buytheway.co.za, 1
 buywine.shop, 1
 buywood.shop, 1
 buzz.tools, 1
 buzzconf.io, 1
 buzzcontent.com, 1
 buzzprint.it, 1
 bvalle.com, 1
 bvexplained.co.uk, 1
+bvisible.be, 1
 bvl.aero, 1
 bvv-europe.eu, 1
 bw.codes, 1
 bwcscorecard.org, 1
 bwe-seminare.de, 1
 bwf11.com, 1
 bwf55.com, 1
 bwf6.com, 1
@@ -7804,25 +7864,26 @@ bynumlaw.net, 1
 bypass.kr, 1
 bypass.sh, 1
 bypetula.cz, 1
 byr.moe, 1
 byrko.cz, 1
 byrko.sk, 1
 byronkg.us, 1
 byrtz.de, 1
-bysb.net, 0
+bysb.net, 1
 bytanchan.com, 1
 byte-time.com, 1
 byte128.com, 1
 bytearts.net, 0
 bytebucket.org, 1
 bytecode.no, 1
 bytecrafter.com, 1
 bytecrafter.net, 1
+byteflies.com, 1
 bytejail.com, 1
 bytema.cz, 1
 bytema.eu, 1
 bytema.re, 1
 bytema.sk, 1
 bytemix.cloud, 1
 byteowls.com, 0
 bytepark.de, 1
@@ -7897,30 +7958,30 @@ caceis.bank, 1
 cachacacha.com, 1
 cachedview.nl, 1
 cachetagalong.com, 1
 cachethome.com, 1
 cachetur.no, 1
 cackette.com, 1
 cacr.pw, 1
 cad-noerdlingen.de, 1
-cadacoon.com, 1
 cadafamilia.de, 1
 cadams.io, 1
 cadcreations.co.ke, 1
 cadetsge.ch, 1
 cadmail.nl, 1
 cadman.pw, 1
 cadooz.com, 1
 cadorama.fr, 1
 cadoth.net, 1
 cadre.com, 1
 cadsys.net, 1
 cadusilva.com, 1
 caerostris.com, 1
+caerus.ws, 1
 caesarkabalan.com, 1
 cafe-service.ru, 0
 cafechesscourt.com, 1
 cafedupont.be, 1
 cafedupont.co.uk, 1
 cafedupont.de, 1
 cafedupont.nl, 1
 cafeimsueden.de, 1
@@ -7929,16 +7990,17 @@ cafeobscura.nl, 1
 caferagazzi.de, 1
 cafericoy.com, 1
 cafeterasbaratas.net, 1
 caffeinatedcode.com, 1
 cafled.org, 1
 cagalogluyayinevi.com, 0
 caglarcakici.com, 1
 caibi.io, 1
+caijunyi.net, 0
 cainhosting.com, 0
 caipai.fm, 1
 cairnterrier.com.br, 1
 caitcs.com, 1
 caiwenjian.xyz, 1
 caizx.com, 0
 caja-pdf.es, 1
 cajio.ru, 1
@@ -8208,16 +8270,17 @@ carbon12.org, 1
 carbon12.software, 1
 carboneselectricosnettosl.info, 0
 carbonmonoxidelawyer.net, 1
 carbono.uy, 1
 carbontv.com, 1
 carburetorcycleoi.com, 1
 carck.co.uk, 1
 carck.uk, 1
+carcloud.ch, 1
 cardboard.cx, 1
 cardcaptorsakura.jp, 1
 carddreams.be, 1
 carddreams.de, 1
 carddreams.es, 1
 carddreams.nl, 1
 cardelmar.com, 1
 cardelmar.de, 1
@@ -8327,17 +8390,16 @@ carpetandhardwoodflooringpros.com, 1
 carpetcleaningtomball.com, 1
 carrando.com, 1
 carrando.de, 1
 carre-lutz.com, 1
 carriedin.com, 1
 carrierplatform.com, 1
 carringtonrealtygroup.com, 1
 carroattrezzimilanodaluiso.it, 1
-carrollservicecompany.com, 1
 carrouselcompany.fr, 1
 cars4salecy.com, 1
 carseatchecks.ca, 1
 carshippingcarriers.com, 1
 carson-aviation-adventures.com, 1
 carson-matthews.co.uk, 1
 carsoug.com, 1
 carspneu.cz, 1
@@ -8348,45 +8410,48 @@ cartadeviajes.com.ar, 1
 cartadeviajes.com.ve, 1
 cartadeviajes.de, 1
 cartadeviajes.ec, 1
 cartadeviajes.es, 1
 cartadeviajes.fr, 1
 cartadeviajes.mx, 1
 cartadeviajes.pe, 1
 cartadeviajes.uk, 1
+carterdan.net, 1
 carterorland.com, 1
 carterstad.se, 1
 cartertonscouts.org.nz, 1
 cartesentreprises-unicef.fr, 1
 carthedral.com, 1
 cartierplan.ga, 0
 carto.la, 1
 cartongesso.roma.it, 1
 cartooncastles.ie, 1
 cartoonhd.cc, 1
 cartouche-deal.fr, 1
 cartouche24.eu, 1
 cartucce24.it, 1
 cartwrightrealestate.com, 1
 carun.us, 1
 carusorealestate.com, 1
+carwellness-hinkelmann.de, 1
 caryefurd.com, 1
 casa-app.de, 1
 casa-due-pur.com, 1
 casa-due-pur.de, 1
 casa-due.com, 1
 casa-laguna.net, 1
 casa-lunch-break.de, 1
 casa-lunchbreak.de, 1
 casa-mea-inteligenta.ro, 1
 casa-su.casa, 1
 casaanastasia.ro, 1
 casabouquet.com, 1
 casacameo.com, 0
+casacazoleiro.com, 1
 casacochecurro.com, 1
 casadasportasejanelas.com, 1
 casadopulpo.com, 1
 casalborgo.it, 1
 casalindamex.com, 1
 casalunchbreak.de, 1
 casamariposaspi.com, 1
 casasuara.com, 1
@@ -8712,16 +8777,17 @@ certcenter.de, 1
 certcenter.fr, 1
 certchannel.com, 1
 certevia.com, 1
 certfa.com, 1
 certible.com, 1
 certificatedetails.com, 1
 certificatespending.com, 1
 certificatetools.com, 1
+certificazioni-energetiche.it, 1
 certifiedfieldassociate.com, 1
 certifiednurses.org, 1
 certly.io, 1
 certmonitor.com.au, 1
 certmonitor.net, 1
 certnazionale.it, 1
 certspotter.com, 1
 certspotter.org, 1
@@ -8763,16 +8829,17 @@ cg.al, 1
 cg.search.yahoo.com, 0
 cgal.org, 1
 cgan.de, 1
 cgan.pw, 1
 cgbassurances.ch, 1
 cgbilling.com, 1
 cgcookiemarkets.com, 1
 cgf-charcuterie.com, 1
+cglib.xyz, 1
 cgminc.net, 1
 cgnparts.com, 1
 cgpe.com, 1
 cgsmart.com, 1
 cgtx.us, 1
 cgurtner.ch, 1
 ch-laborit.fr, 1
 ch-sc.de, 1
@@ -8784,16 +8851,17 @@ chabert-provence.fr, 1
 chabik.com, 1
 chad.ch, 1
 chadstoneapartments.com.au, 1
 chadtaljaardt.com, 1
 chaffeyconstruction.com, 1
 chaifeng.com, 1
 chainedunion.info, 1
 chaip.org, 1
+chairsgb.com, 1
 chaisystems.net, 1
 chaletdemontagne.org, 1
 chaletmanager.com, 1
 chaletpierrot.ch, 1
 chaleur.com, 1
 chalker.io, 1
 chalkfestival.org, 0
 challengeblog.org, 1
@@ -8929,16 +8997,18 @@ chattergalerie.eu, 1
 chattergallery.com, 1
 chattersworld.nl, 1
 chatu.io, 1
 chatu.me, 1
 chatucomputers.com, 1
 chatxp.com, 1
 chatxsingle.net, 1
 chatxtutti.com, 1
+chatzimanolis.com, 1
+chatzimanolis.gr, 1
 chauffage-budget.fr, 1
 chaurocks.com, 1
 chaussenot.net, 1
 chaverde.org, 1
 chavetaro.com, 1
 chazalet.fr, 1
 chazay.net, 0
 chbk.co, 1
@@ -9145,16 +9215,17 @@ chocolatesandhealth.com, 1
 chocolatier-tristan.ch, 1
 chocolytech.info, 1
 chocotough.nl, 1
 chocoweb.net, 1
 choe.fi, 1
 choiceautoloan.com, 1
 chokladfantasi.net, 1
 chollima.pro, 1
+chomp.life, 1
 chon.io, 1
 chook.as, 1
 choootto.net, 1
 choosemypc.net, 1
 chopperdesign.com, 1
 chopperforums.com, 1
 chorkley.co.uk, 1
 chorkley.com, 1
@@ -9186,16 +9257,17 @@ chrismathys.com, 1
 chrismcclendon.com, 1
 chrismckee.co.uk, 1
 chrismorgan.info, 1
 chrismurrayfilm.com, 1
 chrisnekarda.com, 1
 chrisplankhomes.com, 1
 chrispstreet.com, 1
 chrisshort.net, 0
+chrisspencercreative.com, 1
 chrissx.ga, 1
 christadelphiananswers.org, 1
 christadelphians.eu, 1
 christchurchbouncycastles.co.uk, 1
 christec.net, 1
 christensenplace.us, 1
 christerwaren.fi, 1
 christiaanconover.com, 1
@@ -9213,17 +9285,17 @@ christiangehring.org, 1
 christianhoffmann.info, 1
 christianillies.de, 1
 christianjens.com, 1
 christianliebel.com, 1
 christianlis.org.uk, 1
 christianlis.uk, 1
 christianpeltier.com, 1
 christianpilgrimage.com.au, 1
-christianpusch.de, 0
+christianpusch.de, 1
 christians.dating, 1
 christiansayswords.com, 1
 christianscholz.de, 0
 christiehawkes.com, 1
 christiesantiques.com, 1
 christmascard.be, 1
 christmaspartyhire.co.uk, 1
 christoph-conrads.name, 1
@@ -9310,16 +9382,17 @@ cibercactus.com, 1
 cica.es, 1
 cidbot.com, 1
 ciderclub.com, 1
 cidersus.com.ec, 1
 cie-theatre-montfaucon.ch, 1
 ciel.pro, 1
 cielbleu.org, 1
 cielly.com, 1
+cienciasempresariais.pt, 1
 cierreperimetral.com, 1
 cifop-numerique.fr, 1
 ciftlikesintisi.com, 1
 cig-dem.com, 1
 cigar-cartel.com, 1
 cigarterminal.com, 0
 cigoteket.se, 1
 cihar.com, 1
@@ -9404,29 +9477,31 @@ citizenspact.eu, 1
 citizing.org, 1
 citrusui.me, 1
 cittadesign.com, 0
 city-adm.lviv.ua, 1
 city-walks.info, 1
 citya.com, 1
 citybeat.de, 1
 citycreek.studio, 1
+citydance.ee, 1
 cityextra.com.au, 1
 cityfloorsupply.com, 1
 citylights.eu, 1
 citymoobel.ee, 1
 cityofeastpointemi.gov, 1
 cityoftitans.com, 1
 cityoftitansmmo.com, 1
 cityofwadley-ga.gov, 1
 citysportapp.com, 1
 citywalkr.com, 1
 cityworksonline.com, 1
 ciubotaru.tk, 1
 ciuciucadou.ro, 1
+civicamente.cl, 1
 civicforum.pl, 1
 civicunicorn.com, 1
 civicunicorn.us, 1
 civilbikes.com, 1
 civilg20.org, 1
 civillines.nl, 1
 civiltoday.com, 1
 cj-espace-vert.fr, 1
@@ -9509,18 +9584,18 @@ cleanapproachnw.com, 1
 cleanbrowsing.org, 1
 cleancode.club, 1
 cleandetroit.org, 1
 cleandogsnederland.nl, 1
 cleanfiles.us, 1
 cleanhouse2000.us, 1
 cleaningbyrosie.com, 1
 cleaningservicejulai.com, 1
+cleanplanet.co.jp, 1
 cleansewellness.com, 1
-cleanstar.org, 1
 clearance365.co.uk, 1
 clearblueday.co.uk, 1
 clearbookscdn.uk, 1
 clearbreezesecuritydoors.com.au, 1
 clearchatsandbox.com, 1
 clearer.cloud, 1
 clearip.com, 1
 clearkonjac.com, 1
@@ -9556,26 +9631,26 @@ clien.net, 1
 client.coach, 1
 clientboss.com, 1
 clientsecure.me, 1
 clifflu.net, 1
 climaencusco.com, 1
 climaprecio.es, 1
 climateinteractive.org, 1
 climatestew.com, 1
+climaticarus.ru, 1
 clindoeilmontagne.com, 1
 clingout.com, 1
 clinicaltrials.gov, 1
 clinicasmedicas.com.br, 1
 clinicminds.com, 1
 cliniquecomplementaire.com, 1
 cliniquevethuy.be, 1
 clintonbloodworth.com, 1
 clintonlibrary.gov, 1
-clip.mx, 0
 clipclip.com, 1
 clippings.com, 1
 clive.io, 1
 clmde.de, 1
 clnc.to, 1
 clnnet.ch, 1
 cloaked.ch, 1
 clochix.net, 1
@@ -9630,16 +9705,17 @@ cloudlessdreams.com, 1
 cloudlight.biz, 1
 cloudnote.cc, 1
 cloudns.net, 1
 cloudoptimizedsmb.com, 1
 cloudoptimus.com, 1
 cloudpengu.in, 1
 cloudpipes.com, 1
 cloudse.co.uk, 1
+cloudsec.tk, 1
 cloudsecurityalliance-europe.org, 1
 cloudsecurityalliance.com, 1
 cloudsecurityalliance.net, 1
 cloudsecurityalliance.org, 1
 cloudsecuritycongress.net, 1
 cloudsecuritycongress.org, 1
 cloudservice.io, 1
 cloudservices.nz, 1
@@ -9835,17 +9911,16 @@ codejunkie.de, 0
 codeloop.pw, 1
 codemill.se, 1
 codemonster.eu, 1
 codemperium.com, 1
 codenlife.xyz, 1
 codenode.io, 1
 codeofhonor.tech, 1
 codeofthenorth.com, 1
-codeplay.org, 1
 codepoints.net, 1
 codepref.com, 1
 codepult.com, 1
 codera.co.uk, 1
 codercross.com, 1
 codercy.com, 1
 codereview.appspot.com, 1
 codereview.chromium.org, 1
@@ -9899,16 +9974,17 @@ coffeetime.fun, 1
 cogala.eu, 1
 cogent.cc, 1
 cogilog.com, 1
 cogitoltd.com, 1
 cognicom-gaming.com, 1
 cognitip.com, 1
 cognitivecomputingconsortium.com, 1
 cognitohq.com, 1
+cognixia.us, 1
 cogsquad.house, 1
 cogumelosmagicos.org, 1
 coi-verify.com, 1
 coiffeurschnittstelle.ch, 1
 coigach-assynt.org, 1
 coimmvest.com, 1
 coin-quest.net, 1
 coin.dance, 1
@@ -9973,16 +10049,17 @@ collabora.social, 1
 collabora.uk, 1
 collaboracloudsuite.com, 1
 collaboraoffice.co.uk, 1
 collaboraoffice.com, 1
 collaborativehealthpsychology.com, 1
 collabornation.net, 1
 collaction.hk, 1
 collada.org, 1
+collage.me, 1
 collectdocs.com, 1
 collectfood.com, 1
 collectiblebeans.com, 1
 collectivesupply.com, 1
 collectorknives.net, 1
 collectorsystems.com, 1
 colleencornez.com, 1
 collegeconnexxions.com.au, 1
@@ -10117,16 +10194,17 @@ compassdirectportal.com, 1
 compassfinance.com, 1
 compassintladv.com, 1
 compasslos.com, 1
 compeat.com, 1
 compeuphoria.com, 1
 comphare.nl, 1
 compibus.fr, 1
 compilenix.org, 1
+compitak.com, 1
 compleetondernemen.nl, 1
 completefloorcoverings.com, 1
 completesecurityessex.co.uk, 1
 completesecurityessex.com, 1
 completionist.me, 1
 complex-organization.com, 1
 complexart.ro, 1
 complexorganizations.com, 1
@@ -10243,29 +10321,29 @@ connectmy.car, 1
 connecto-data.com, 1
 connectum.eu, 1
 conner.work, 1
 connexas.eu, 1
 connext.de, 1
 connictro.de, 1
 conniesacademy.com, 1
 connorhatch.com, 1
-connorsmith.co, 1
 connyduck.at, 1
 conociendosalama.com, 1
 conocimientosdigitales.com, 1
 conorboyd.info, 1
 conory.com, 0
 conotoxia.com, 1
 conpath.net, 1
 conpins.nl, 1
 conrad-kostecki.de, 1
 conrad.am, 1
 conradkostecki.de, 1
 conradsautotransmissionrepair.com, 1
+conraid.net, 1
 conrail.blue, 1
 consagracionamariasantisima.org, 1
 consciouschoices.net, 1
 consciousnesschange.com, 1
 consec-systems.de, 1
 consegnafioridomicilio.net, 1
 consejosdenutricion.com, 1
 consensoprivacy.it, 1
@@ -10348,16 +10426,17 @@ cookie4.com, 1
 cookieandkate.com, 1
 cookiecrook.com, 1
 cookielab.io, 1
 cookiesoft.de, 1
 cookiestudies.cf, 1
 cooking-sun.com, 1
 cookingcrusade.com, 1
 cookinglife.nl, 0
+cookingperfected.com, 1
 cookingreporter.com, 1
 cookmedical.com, 0
 cooko.at, 1
 cooksbookscorks.com, 1
 cookwithmanali.com, 1
 cool-parties.co.uk, 1
 cool-wallpapers.jp, 1
 cool.haus, 1
@@ -10445,17 +10524,16 @@ corpfin.net, 1
 corpio.nl, 1
 corpkitnw.com, 1
 corpoepele.com.br, 1
 corpoflow.nl, 1
 corporacioninternacionallideres.org, 1
 corporateclash.net, 1
 corporatecomputingsolutions.com, 1
 corporateinfluencers.com, 1
-corporativoarval.info, 1
 corpsepaint.life, 1
 corpulant.coffee, 1
 corpulantcoffee.com, 1
 corpulent.coffee, 1
 corpulentcoffee.com, 1
 corpuschristisouthriver.org, 1
 corpusslayer.com, 1
 corrbee.com, 1
@@ -10535,16 +10613,17 @@ countyjailinmatesearch.com, 1
 coup-dun-soir.ch, 1
 coupe-bordure.com, 1
 couplay.org, 1
 couponcodesme.com, 1
 cour4g3.me, 1
 couragefound.org, 1
 coursables.com, 1
 course.rs, 1
+courseconfidence.com, 1
 coursera.org, 1
 courses.nl, 1
 courseworkbank.info, 1
 courtlistener.com, 1
 couscous.recipes, 1
 cousincouples.com, 0
 coussinsky.net, 1
 couvreur-hinault.fr, 1
@@ -10554,17 +10633,16 @@ covermytrip.com.au, 1
 covershousing.nl, 1
 covery.ai, 1
 covoiturage.fr, 0
 covve.com, 1
 covybrat.cz, 1
 cowbird.org, 1
 cowboyim.com, 1
 coweo.cz, 1
-cowo.group, 1
 coworking-luzern.ch, 1
 coxcapitalmanagement.com, 1
 coxxs.me, 1
 coxxs.moe, 1
 cozmaadrian.ro, 1
 cozo.me, 1
 cozyeggdesigns.com, 1
 cp-st-martin.be, 1
@@ -10611,17 +10689,16 @@ crackers4cheese.com, 1
 crackle.io, 1
 crackorsquad.in, 1
 crackpfer.de, 1
 crackslut.eu, 1
 crackstation.net, 1
 cradlepointecm.com, 1
 craft-verlag.de, 1
 craftandbuild.de, 1
-craftcommerce.com, 1
 craftination.net, 1
 craftinghand.com, 1
 craftinginredlipstick.com, 1
 craftist.de, 1
 craftngo.hu, 1
 craftsmandruggets.com, 1
 craftsmany.net, 1
 craftwmcp.xyz, 1
@@ -10652,16 +10729,17 @@ crazy-bulks.com, 1
 crazy-cat.net, 1
 crazy-coders.com, 1
 crazybulk.co.uk, 1
 crazybulk.com, 1
 crazybulk.de, 1
 crazybulk.fr, 1
 crazybulksteroids.com, 1
 crazycastles.ie, 1
+crazycraftland.net, 1
 crazydomains.ae, 1
 crazydomains.co.nz, 1
 crazydomains.co.uk, 1
 crazydomains.com.au, 1
 crazydomains.in, 1
 crazymeeshu.com, 1
 crazynoisybizarre.town, 1
 crazypaul.com, 1
@@ -10715,16 +10793,17 @@ creators-design.com, 1
 creators.co, 1
 creators.direct, 1
 creatorswave.com, 1
 creatujoya.com, 1
 credential.eu, 1
 credex.bg, 1
 credigo.se, 1
 crediteo.pl, 1
+creditkarma.com, 1
 creditos-rapidos.com, 1
 creditozen.es, 1
 creditozen.mx, 1
 creditproautos.com, 0
 creditscoretalk.com, 1
 creditta.com, 1
 credittoken.io, 1
 creeks-coworking.com, 1
@@ -10744,16 +10823,17 @@ crestasantos.com, 1
 cretdupuy.com, 1
 creteangle.com, 1
 cretica.no, 1
 creusalp.ch, 1
 crew505.org, 1
 crgalvin.com, 1
 cribcore.com, 1
 crickey.eu, 1
+cricklewood.condos, 1
 criena.com, 1
 criena.net, 1
 crimefreeliving.com, 1
 crimesolutions.gov, 1
 crimevictims.gov, 1
 criminal-attorney.ru, 1
 criminal.enterprises, 1
 crinesdanzantes.be, 1
@@ -11021,19 +11101,19 @@ culturesouthwest.org.uk, 1
 cumberlandrivertales.com, 1
 cumparama.com, 1
 cumplegenial.com, 1
 cunha.be, 1
 cuntflaps.me, 1
 cuoc.org.uk, 1
 cuonic.com, 1
 cup.al, 1
-cupcakesandcrinoline.com, 1
 cupcao.gov, 1
 cupidosshop.com, 1
+cupoane-reducere.net, 1
 cupom.net, 1
 cuppycakes.fi, 1
 cur.by, 1
 curacao-firma.com, 1
 curacao-license.com, 1
 curamail.co.uk, 1
 curareldolordeespalda.com, 1
 curatedgeek.com, 1
@@ -11050,16 +11130,17 @@ currentlystreaming.com, 1
 currentlyusa.com, 1
 currentobserver.com, 1
 currynissanmaparts.com, 1
 cursos-trabajadores.net, 1
 cursos.com, 1
 cursosforex.com, 1
 cursosingles.com, 1
 cursossena.co, 1
+cursosypostgrados.com, 1
 cursuri-de-actorie.ro, 1
 curtacircuitos.com.br, 0
 curtis-smith.me.uk, 1
 curtis-smith.uk, 1
 curtislaw-pllc.com, 1
 curtislinville.net, 1
 curtissmith.me.uk, 1
 curtissmith.uk, 1
@@ -11111,16 +11192,17 @@ cviip.ca, 1
 cviip.com, 1
 cvjd.me, 1
 cvl.ch, 1
 cvlibrary.co.uk, 1
 cvmu.jp, 1
 cvr.dk, 1
 cvtemplatemaster.com, 1
 cvursache.com, 1
+cvutdecin.cz, 1
 cvv.cn, 1
 cw-bw.de, 0
 cw.center, 1
 cwagner.me, 1
 cwbrtrust.ca, 1
 cwc.gov, 1
 cwgaming.co.uk, 1
 cwilson.ga, 1
@@ -11162,16 +11244,17 @@ cyberguerrilla.org, 1
 cyberhipsters.nl, 1
 cyberianhusky.com, 1
 cyberkov.com, 1
 cyberlab.kiev.ua, 0
 cyberlegal.co, 1
 cyberlightapp.com, 1
 cybermeldpunt.nl, 1
 cyberogism.com, 1
+cyberonesol.com, 1
 cyberoptic.de, 1
 cyberpeace.nl, 1
 cyberphaze.com, 1
 cyberpioneer.net, 0
 cyberpubonline.com, 1
 cyberregister.nl, 1
 cyberregister.org, 1
 cybersafesolutions.com, 1
@@ -11250,32 +11333,34 @@ czc.cz, 1
 czechcrystals.co.uk, 1
 czechvirus.cz, 1
 czerno.com, 1
 czk.mk, 1
 czlx.co, 0
 d-20.fr, 1
 d-designerin.de, 1
 d-eisenbahn.com, 1
+d-imitacion.top, 1
 d-loop.de, 1
 d-msg.com, 1
 d-parts.de, 1
 d-parts24.de, 1
 d-quantum.com, 1
 d-toys.com.ua, 1
 d-training.de, 1
 d.nf, 1
 d.nr, 1
 d00d.de, 1
 d0g.cc, 1
 d0m41n.name, 1
 d0xq.com, 1
 d0xq.net, 1
 d2.gg, 1
 d2ph.com, 1
+d2qa61rbluifiq.cloudfront.net, 1
 d2s.uk, 1
 d3lab.net, 1
 d3x.pw, 1
 d3xt3r01.tk, 1
 d3xx3r.de, 1
 d42.no, 1
 d4done.com, 1
 d4rkdeagle.tk, 1
@@ -11414,16 +11499,17 @@ daniel-kulbe.de, 1
 daniel-milnes.uk, 1
 daniel-ruf.de, 1
 daniel-stahl.net, 1
 daniel-wildhaber.ch, 1
 danielalvarez.net, 1
 danielas.boutique, 1
 danielehniss.de, 1
 danielepestilli.com, 1
+danielfeau.com, 1
 danielgorr.de, 1
 danielgray.email, 1
 danielgraziano.ca, 1
 danielheal.net, 1
 danielhinterlechner.eu, 1
 danielhochleitner.de, 1
 danieljamesscott.org, 1
 danieljstevens.com, 1
@@ -11483,16 +11569,17 @@ dansage.co, 1
 danscomp.com, 1
 dansdiscounttools.com, 1
 danselibre.net, 1
 danselibre.org, 1
 danseressen.nl, 1
 dansk-skole.de, 1
 dansk777.dk, 1
 danskoferie.dk, 1
+danskoya.com, 1
 danslan.org, 1
 danstillman.com, 1
 dantelistan.com, 1
 dantransports.fr, 1
 danw.io, 1
 danwin1210.me, 1
 danwolff.se, 1
 danyabanya.com, 1
@@ -11736,16 +11823,18 @@ dawena.de, 1
 dawgs.ga, 1
 dawnbringer.eu, 1
 dawnbringer.net, 1
 dawnofeden.net, 1
 dawnson.is, 1
 dawnsonb.com, 1
 dawoud.org, 1
 dawson-floridavilla.co.uk, 1
+dax.guide, 1
+daxpatterns.com, 1
 daycontactlens.com, 1
 daydream.team, 1
 daylight-dream.ee, 1
 daylightpirates.org, 1
 dayman.net, 1
 daymprove.life, 1
 dayofdays.be, 1
 days.one, 1
@@ -11857,16 +11946,17 @@ dealbanana.fi, 1
 dealbanana.fr, 1
 dealbanana.it, 1
 dealbanana.se, 1
 dealcruiser.nl, 1
 dealerselectric.com, 1
 dealinflatables.co.uk, 1
 dealpass.no, 1
 dealspotr.com, 1
+dealszone.net, 1
 deamuseum.org, 1
 deanbank.com, 1
 deanisa.ninja, 1
 deanjerkovich.com, 1
 deanmorgan.org, 1
 deano-s.co.uk, 1
 deanosplace.net, 1
 deanpearce.net, 1
@@ -11995,16 +12085,17 @@ degeberg.com, 1
 degeberg.dk, 1
 degen-elektrotechnik.de, 1
 degestamptepot.nl, 1
 degoulet.net, 1
 degraafschapdierenartsen.nl, 1
 degracetechnologie.com, 1
 degrasboom.nl, 1
 degressif.com, 1
+degroupage.info, 1
 dehopre.com, 1
 deidee.nl, 1
 dein-trueffel.de, 1
 deinballon.de, 1
 deinewebsite.de, 1
 deinfoto.ch, 1
 deinserverhost.de, 1
 deitti.net, 1
@@ -12017,22 +12108,25 @@ dekasiba.com, 1
 dekeurslagers.nl, 1
 dekka.cz, 1
 dekkercreativedesign.nl, 1
 dekko.io, 1
 dekoh-shouyu.com, 1
 dekonix.ru, 1
 dekulk.nl, 1
 delahrzolder.nl, 1
+delam.site, 1
 delandalucia.com, 1
 delbecqvo.be, 1
+delbrouck.ch, 1
 delcopa.gov, 1
 deleenheir.be, 1
 deleidscheflesch.nl, 1
 delfic.org, 1
+delfino.cr, 1
 delhionlinegifts.com, 1
 deli-tochigi.jp, 1
 deliacreates.com, 1
 deliandiver.org, 1
 deliberatedigital.com, 1
 deliciisanatoase.ro, 1
 deliciousmedia.co.uk, 1
 deliciousmedia.net, 1
@@ -12119,16 +12213,17 @@ denwauranailab.com, 1
 deonlinespecialist.nl, 1
 deontology.com, 1
 depaco.com, 1
 depaddestoeltjes.be, 1
 depannage-traceur.fr, 1
 deparis.me, 1
 depeces.com, 1
 depechemode-live.com, 1
+depedclub.ph, 1
 depedncr.com, 1
 depedshs.com, 1
 depedtalks.com, 1
 depedtambayan.net, 1
 depedtayo.com, 1
 depedtayo.ph, 1
 depicus.com, 1
 depone.net, 1
@@ -12328,16 +12423,17 @@ devkid.net, 1
 devkit.cc, 0
 devklog.net, 1
 devlamvzw.org, 0
 devlatron.net, 1
 devlogr.com, 1
 devnull.zone, 1
 devolution.ws, 1
 devonsawatzky.ca, 1
+devonvintagechina.co.uk, 1
 devopers.com.br, 1
 devops-survey.com, 1
 devops.moe, 1
 devpsy.info, 1
 devragu.com, 1
 devrandom.net, 1
 devries.one, 1
 devsjournal.com, 1
@@ -12347,30 +12443,28 @@ devstroke.io, 1
 devswag.io, 1
 devtestfan1.gov, 1
 devtty.org, 1
 devyn.ca, 0
 devzero.io, 1
 dewaard.de, 1
 dewalch.net, 1
 dewapress.com, 1
-dewebwerf.nl, 1
 dewinter.com, 1
 dex.top, 1
 dexalo.de, 1
 dexigner.com, 1
-dexonrest.azurewebsites.net, 1
 dexonsoftware.com, 1
 deyute.com, 1
 dez-online.de, 1
 dezeregio.nl, 1
 dezet-ev.de, 1
-dezintranet.com, 1
 dezmembrariromania.ro, 1
 dezshop24.de, 1
+dezzoroofing.co.za, 1
 df1paw.de, 1
 dfctaiwan.org, 1
 dfekt.no, 1
 dfektlan.no, 1
 dfixit.com, 1
 dfl.mn, 1
 dflcares.com, 1
 dfmn.berlin, 1
@@ -12541,16 +12635,20 @@ digilicious.com, 1
 digimagical.com, 1
 digimedia.cd, 0
 digioccumss.ddns.net, 1
 digipitch.com, 1
 digired.ro, 1
 digital-coach.it, 0
 digital-compounds.com, 1
 digital-eastside.de, 1
+digital-insurance-engine.com, 1
+digital-insurance-engine.de, 1
+digital-insurance-platform.com, 1
+digital-insurance-platform.de, 1
 digital-liberal.ch, 1
 digital-muscle.com.au, 1
 digital-sculpture.org, 1
 digital.gov, 1
 digital.govt.nz, 1
 digital1st.co.uk, 1
 digital2web.com, 0
 digitalarchitecture.com, 1
@@ -12608,16 +12706,17 @@ dijks.com, 1
 diju.ch, 1
 dildoexperten.se, 1
 diletec.com.br, 1
 dilichen.fr, 1
 diligo.ch, 1
 dillewijnzwapak.nl, 1
 dillonkorman.com, 1
 diluv.com, 1
+dimanet.fr, 1
 dimanss47.net, 1
 dime-staging.com, 1
 dime.io, 1
 dimeshop.nl, 1
 dimez.ru, 1
 dimiskovska.de, 1
 dimitrihomes.com, 1
 dimmersagourahills.com, 1
@@ -12796,16 +12895,17 @@ divedowntown.com, 1
 divegearexpress.com, 1
 divegearexpress.net, 1
 diveidc.com, 1
 diveplan.org, 1
 diversifiedproduct.com, 1
 diversityflags.com, 1
 diversityflags.com.au, 1
 diversityflags.nz, 1
+divewithfrank.com, 1
 divi-experte.de, 1
 dividendz.net, 1
 divinasaiamodas.com.br, 1
 divinegames.studio, 1
 divinemercyparishvld.com, 1
 divinemercyparishvlds.com, 1
 diving.photo, 1
 divingwithnic.com, 1
@@ -12816,30 +12916,32 @@ dixi.fi, 1
 dixibox.com, 1
 dixmag.com, 1
 diybook.at, 1
 diycc.org, 1
 diymediahome.org, 1
 diyosun.com, 1
 diytechguides.com, 1
 diyvideoeditor.com, 1
+dizalty.tv, 1
 dizzythewizard.co.uk, 1
 dj-leszwolle.nl, 1
 dj-x.info, 1
 dj3dub.com, 1
 djangobirthday.com, 1
 djangogolf.com, 1
 djangoproject.com, 1
 djangosnippets.org, 1
 djbbouncycastles.co.uk, 1
 djboekingskantoor.nl, 1
 djc.me, 1
 djcursuszwolle.nl, 1
 djdavid98.hu, 1
 djeung.org, 1
+djiconsulting.com, 1
 djieno.com, 1
 djipanov.com, 1
 djlinux.cz, 1
 djlnetworks.co.uk, 1
 djroynomden.nl, 1
 djsbouncycastlehire.com, 1
 djsk.nl, 1
 djt-vom-chausseehaus.de, 1
@@ -13029,16 +13131,17 @@ dolci-delizie.de, 1
 dolciterapie.com, 1
 doleta.gov, 1
 doli.se, 1
 dolice.net, 1
 dolinathome.com, 1
 dollemore.com, 1
 dollhousetoyo.com, 1
 dolorism.com, 1
+dolphin-cloud.com, 1
 dolphin-hosting.com, 1
 dolphin-it.de, 1
 dom-medicina.ru, 1
 doma.in, 1
 domadillo.com, 1
 domain-ermittlung.de, 1
 domain-swiss.ch, 1
 domain001.info, 1
@@ -13253,16 +13356,17 @@ downloadaja.com, 1
 downloadgamemods.com, 1
 downloadgram.com, 1
 downloadhindimovie.com, 1
 downloadhindimovie.net, 1
 downloadhindimovies.net, 1
 downloads.zdnet.com, 1
 downloadsoftwaregratisan.com, 1
 downrightcute.com, 1
+downthe.pub, 1
 downtimerobot.com, 1
 downtimerobot.nl, 1
 downtownautospecialists.com, 1
 downtownvernon.com, 1
 dox-box.eu, 1
 doxal.ro, 1
 doyoucheck.com, 0
 doyouedc.com, 1
@@ -13397,16 +13501,17 @@ dreamstream.mobi, 1
 dreamstream.network, 1
 dreamstream.nl, 1
 dreamstream.tv, 1
 dreamstream.video, 1
 dreax.win, 1
 dreemurr.com, 1
 drei01.com, 1
 drei01.de, 1
+drei01.technology, 1
 dreid.org, 1
 dreischneidiger.de, 1
 dreiweiden.de, 1
 dreizwosechs.de, 0
 dresden-kaffee-24.de, 1
 dresden-kaffeeroesterei.de, 1
 dresdener-mandelstollen.de, 1
 dresdens-pfefferkuchenprinzessin.de, 1
@@ -13445,20 +13550,22 @@ drillingsupplystore.com, 1
 drillion.net, 1
 drillshackresort.com, 1
 drinkcontrolapp.com, 1
 drinkgas-jihlava.cz, 1
 drinkplanet.eu, 1
 drino.org, 0
 drive.google.com, 1
 drive.xyz, 1
+driveexport.com, 1
 driven2shine.eu, 1
 drivenes.net, 1
 driver.ru, 1
 driver61.com, 1
+drivercopilot.com, 1
 driverless.id, 1
 driverprofiler.co.uk, 1
 driverscollection.com, 1
 driving-lessons.co.uk, 1
 drivinghorror.com, 1
 drivinhors.com, 1
 drivya.com, 1
 drixn.cn, 1
@@ -13690,16 +13797,17 @@ durand.tf, 1
 durangoenergyllc.com, 1
 duranthon.eu, 1
 durbanlocksmiths.co.za, 1
 durchblick-shop.de, 1
 durdle.com, 1
 dureuil.info, 1
 durexwinkel.nl, 1
 durfteparticiperen.nl, 1
+durgatopos.it, 1
 duria.de, 1
 duriaux-dentiste.ch, 1
 duroterm.ro, 1
 durys.be, 1
 dushu.cat, 1
 dusmomente.com, 1
 dusnan.com, 1
 dustplanet.de, 1
@@ -13753,16 +13861,17 @@ dybuster.de, 1
 dybuster.es, 1
 dybuster.it, 1
 dybuster.se, 1
 dyeager.org, 1
 dyktig.as, 1
 dyktig.no, 1
 dylanboudro.com, 1
 dylancl.cf, 1
+dylangattey.com, 1
 dylankatz.com, 1
 dylanknoll.ca, 1
 dylanspcrepairs.com, 1
 dylanwise.net, 1
 dylmye.me, 1
 dym.asia, 1
 dym.bz, 1
 dym2012.com, 1
@@ -13903,17 +14012,16 @@ eagleridgecampground.com, 1
 eaglesecurity.com, 1
 eagletechz.com.br, 1
 eaglewreck.info, 1
 eaglexiang.org, 1
 eagleyecs.com, 1
 eaimty.com, 1
 ealev.de, 1
 eames-clayton.us, 1
-eapestudioweb.com, 1
 earl.org.uk, 1
 earlydocs.com, 1
 earlyyearshub.com, 1
 earmarks.gov, 1
 earn.com, 1
 earth-people.org, 1
 earthsystemprediction.gov, 1
 earticleblog.com, 1
@@ -13924,17 +14032,17 @@ easez.net, 1
 eashwar.com, 1
 eason-yang.com, 1
 east-line.su, 1
 eastarm.net, 1
 eastblue.org, 1
 eastcoastbubbleandbounce.co.uk, 1
 easterncapebirding.co.za, 1
 eastlothianbouncycastles.co.uk, 1
-eastman.space, 0
+eastman.space, 1
 eastmanbusinessinstitute.com, 1
 eastnorschool.co.uk, 1
 eastpeoria-il.gov, 1
 eastplan.co.kr, 1
 eastsidecottages.co.uk, 1
 eastsideroofingcontractor.com, 1
 easy-factures.fr, 1
 easy-rpg.org, 0
@@ -13959,17 +14067,16 @@ easyqr.codes, 1
 easyreal.ru, 1
 easyroad.fr, 1
 easyslide.be, 1
 easyssl.com.cn, 1
 easystore.co, 1
 easytechguides.com, 1
 easytechsecurity.com, 1
 easyweenies.com, 1
-eat-mine.ml, 0
 eat-sleep-code.com, 1
 eat-the-world.ch, 1
 eatery.co.il, 1
 eatfitoutlet.com.br, 1
 eatmebudapest.hu, 1
 eaton-works.com, 1
 eatry.io, 1
 eats.soy, 1
@@ -14090,16 +14197,17 @@ econativa.pt, 1
 economiafinanzas.com, 1
 economias.pt, 1
 economic-sanctions.com, 1
 economicinclusion.gov, 1
 economics-colleges.com, 1
 economiefidu.ch, 1
 economies.ch, 1
 economycarrentalscyprus.com, 1
+econsorzio.com, 1
 econverter.cloud, 1
 ecorp.cc, 1
 ecos-ev.de, 1
 ecoshare.info, 1
 ecoskif.ru, 1
 ecosm.com.au, 1
 ecosoftconsult.com, 1
 ecosound.ch, 1
@@ -14284,16 +14392,17 @@ eganassociates.com.au, 1
 egarden.it, 1
 egb.at, 0
 egbert.net, 1
 egeozcan.com, 1
 egg-ortho.ch, 1
 eggblast.com, 1
 eggert.org, 0
 eggplant.today, 1
+eggqvq.com, 1
 egiftcards.be, 1
 egles.eu, 1
 eglisedenantes.fr, 1
 ego4u.com, 1
 ego4u.de, 1
 egoroof.ru, 1
 egov4.ch, 1
 egovernment-podcast.com, 1
@@ -14329,16 +14438,17 @@ eichel.eu, 1
 eichler.work, 1
 eichornenterprises.com, 1
 eickemeyer.nl, 1
 eickhof.co, 1
 eickhof.us, 1
 eickhofcolumbaria.com, 1
 eidolons.org, 1
 eifel.website, 1
+eifelindex.de, 0
 eigenbubi.de, 1
 eigenpul.se, 1
 eigenpulse.com, 1
 eighty-aid.com, 1
 eightyfour.ca, 1
 eigpropertyauctions.co.uk, 1
 eihaikyo.com, 1
 eika.as, 1
@@ -14469,17 +14579,16 @@ electricdosvientos.com, 1
 electricfencealberton.co.za, 1
 electricfencebenoni.co.za, 1
 electricfencingballito.co.za, 1
 electricgatemotorgermiston.co.za, 1
 electricgatemotorrandburg.co.za, 1
 electricgatemotorskemptonpark.co.za, 1
 electricgatemotorsroodepoort.co.za, 1
 electrichiddenhills.com, 1
-electrician-umhlangaridge.co.za, 1
 electricianagoura.com, 1
 electricianagourahills.com, 1
 electriciancalabasas.com, 1
 electriciancamarillo.com, 1
 electricianconejovalley.com, 1
 electriciandosvientos.com, 1
 electricianhiddenhills.com, 1
 electriciankemptonpark24-7.co.za, 1
@@ -14553,17 +14662,17 @@ elementarywave.com, 1
 elements.guide, 1
 elementshop.co.uk, 1
 elena-baykova.ru, 0
 elenatranslations.nl, 1
 elenorsmadness.org, 1
 elephants.net, 1
 elephpant.cz, 1
 elepover.com, 1
-elerizoentintado.es, 1
+elerizoentintado.es, 0
 eletesstilus.hu, 1
 eletor.com, 1
 eletor.pl, 1
 eletrochape.com.br, 1
 elettricista-roma.it, 1
 elettricista-roma.org, 1
 eleusis-zur-verschwiegenheit.de, 1
 elevateandprosper.com, 1
@@ -14602,16 +14711,17 @@ elinvention.ovh, 1
 eliolita.com, 1
 eliott.be, 0
 elisa.ee, 0
 elisabeth-kostecki.de, 1
 elisabeth-strunz.de, 1
 elisabethkostecki.de, 1
 elisabethrene.com, 1
 elisechristie.com, 1
+elistor6100.xyz, 1
 elite-porno.ru, 1
 elite12.de, 1
 elitebouncingfun.com, 1
 elitegameservers.net, 1
 elitel.nl, 1
 elitenutritionoficial.com, 1
 elixi.re, 1
 elixir.bzh, 1
@@ -14672,17 +14782,16 @@ eltransportquevolem.org, 1
 elucron.com, 1
 eluft.de, 1
 eluhome.de, 1
 eluvio.com, 1
 elvcino.com, 0
 elvidence.com.au, 1
 elviraszabo.com, 1
 elvispresley.net, 1
-elvisripley.com, 1
 elvn.tokyo, 1
 elwave.org, 1
 elwix.com, 1
 elxsi.de, 1
 elyasweb.com, 1
 elysiria.fr, 1
 elysiumware.com, 1
 em-biotek.cz, 1
@@ -14721,27 +14830,29 @@ emdrupholm.dk, 1
 emecew.com, 1
 emeliefalk.se, 1
 ememsei.com, 1
 emeraldcbdshop.com, 0
 emeraldcityswagger.com, 1
 emeraldcoastrideshare.com, 1
 emeraldonion.org, 1
 emergencyessay.com, 1
+emergencyshutoff.com, 1
 emergentvisiontec.com, 1
 emergenzalavoro.com, 1
 emero.de, 1
 emex.ro, 1
 emi-air-comprime.com, 1
 emi.im, 1
 emielraaijmakers.nl, 1
 emil-dein-baecker.com, 1
 emil-dein-baecker.de, 1
 emil-reimann.com, 1
 emil.click, 1
+emil.one, 1
 emilecourriel.com, 1
 emiliendevos.be, 1
 emilio.media, 1
 emilong.com, 1
 emilreimann.de, 1
 emils-1910.de, 1
 emils-chemnitz.de, 1
 emils1910.de, 1
@@ -14805,16 +14916,17 @@ en-booster.jp, 1
 en-crypt.me, 1
 en-maktoob.search.yahoo.com, 0
 en4rab.co.uk, 1
 en4u.org, 1
 enaah.de, 1
 enalean.com, 1
 enamae.net, 1
 enbecom.net, 1
+encens.boutique, 1
 encfs.win, 1
 encircleapp.com, 1
 encnet.de, 1
 encode.host, 1
 encodecloud.net, 1
 encoderx.uk, 1
 encore.io, 0
 encouragemarketing.com, 1
@@ -14905,17 +15017,16 @@ enjin.io, 1
 enjincoin.io, 1
 enjinwallet.io, 1
 enjinx.cn, 1
 enjinx.io, 1
 enjoy-drive.com, 1
 enjoy-israel.ru, 1
 enjoyphoneblog.it, 1
 enlight.no, 1
-enlighten10x.ga, 1
 enlightenedhr.com, 1
 enlightenment.org, 1
 enlnf.link, 1
 enloestatebank.com, 1
 ennea-mediation.fr, 1
 enness.co.uk, 1
 ennori.jp, 1
 enomada.net, 1
@@ -14967,32 +15078,32 @@ enuchi.jp, 1
 envant.co.uk, 1
 enveloppenopmaat.nl, 1
 envescent.com, 1
 enviatufoto.com, 1
 enviaya.com.mx, 1
 enviro-umweltservice.de, 1
 environment.ai, 1
 environmental-colleges.com, 1
-environmentkirklees.org, 1
 enviroprobasements.com, 1
 envirotech.com.au, 1
 envoie.moi, 1
 envoyez.moi, 1
 eocservices.co.uk, 1
 eoitek.com, 1
 eolme.ml, 1
 eonhive.com, 1
 eoonglobalresources.jp, 1
 eopugetsound.org, 0
 eos-classic.io, 1
 eosol.de, 1
 eosol.net, 1
 eosol.services, 1
 epa.com.es, 1
+epasar.my, 1
 epassafe.com, 1
 epave.paris, 1
 epay.bg, 1
 epaygateway.net, 1
 epdeveloperchallenge.com, 1
 ephesusbreeze.com, 1
 epi-lichtblick.de, 1
 epi.one, 1
@@ -15160,17 +15271,16 @@ erudicia.es, 1
 erudicia.fr, 1
 erudicia.it, 1
 erudicia.nl, 1
 erudicia.se, 1
 erudicia.uk, 1
 erudikum.cz, 1
 ervaarjapan.nl, 1
 erverydown.ml, 1
-erwanlepape.com, 1
 erwin.saarland, 1
 erwinpaal.nl, 1
 erwinschmaeh.ch, 1
 erwinwensveen.nl, 1
 erythroxylum-coca.com, 1
 es-geenen.de, 1
 es.search.yahoo.com, 0
 es888.net, 1
@@ -15291,29 +15401,29 @@ esbgood.com, 1
 esbin.net, 1
 esbjon.com, 1
 esbjon.net, 1
 esbm4.net, 1
 esbm5.net, 1
 esc.chat, 1
 esc.gov, 1
 escael.org, 1
+escalesensorielle.com, 1
 escapeplaza.de, 1
 escapetalk.nl, 1
 escargotbistro.com, 1
 escavador.com, 1
 esclear.de, 1
 escolibri.com, 1
 escontact.ch, 1
 escort-fashion.com, 1
 escortdisplay.com, 1
 escortmantra.com, 1
 escritoriodearte.com, 0
 escuelabiblica.com, 1
-escxtra.com, 1
 escyr.top, 1
 esdenera.com, 1
 esdiscuss.org, 1
 eservices-greece.com, 1
 eseth.de, 1
 esg-abi2001.de, 1
 esgen.org, 1
 esgr.in, 1
@@ -15332,16 +15442,17 @@ esmoney.cc, 1
 esmoney.me, 1
 esoa.net, 1
 esoko.eu, 1
 esolcourses.com, 1
 esolitos.com, 1
 esono.de, 1
 esoterik.link, 1
 esoterikerforum.de, 1
+esovita.de, 1
 espace-caen.fr, 1
 espace-gestion.fr, 1
 espace.network, 1
 espacecuisine.ca, 1
 espacetemps.ch, 1
 espacetheosophie.fr, 1
 espacio-cultural.com, 1
 espacioantiguo.com, 1
@@ -15375,17 +15486,16 @@ essayhave.com, 1
 essayjob.com, 1
 essaylib.com, 1
 essaynews.com, 1
 essaypro.net, 1
 essayscam.org, 1
 essayshark.com, 0
 essaytalk.com, 1
 essaywriting.biz, 1
-essca.fr, 1
 essenalablog.de, 1
 essenceofvitalitydetox.com, 1
 essential12.com, 1
 essentialoilsimports.com, 1
 essentiel-physique.com, 1
 esseriumani.com, 1
 essex.cc, 1
 essexcosmeticdentists.co.uk, 0
@@ -15550,16 +15660,17 @@ eurocars2000.es, 1
 eurocenterobuda.hu, 1
 eurocomcompany.cz, 1
 euroconthr.ro, 1
 eurodentaire.com, 1
 euroflora.com, 1
 euroflora.mobi, 1
 eurofrank.eu, 1
 eurolocarno.es, 1
+europalettenkaufen.de, 1
 europapier.at, 0
 europarts-sd.com, 1
 europastudien.de, 1
 european-agency.org, 1
 europeancupinline.eu, 1
 europeanpreppers.com, 1
 europeantimberconnectors.ca, 1
 europeantransportmanagement.com, 1
@@ -15637,16 +15748,17 @@ everettsautorepair.com, 1
 everfine.com.tw, 1
 evergladesrestoration.gov, 1
 evergreenmichigan.com, 1
 everhome.de, 1
 everitoken.io, 1
 everling.lu, 1
 everlong.org, 1
 evermarkstudios.com, 1
+evernaut.com, 1
 everpcpc.com, 1
 evertonarentwe.com, 1
 everwaking.com, 0
 everyarti.st, 1
 everybodyhertz.co.uk, 1
 everyday.eu.org, 1
 everydaygary.com, 1
 everydaywot.com, 1
@@ -15814,17 +15926,16 @@ exploravacations.in, 1
 explorebigideas.com, 1
 exploremonero.com, 1
 exploringenderby.com, 1
 expmind.co.in, 1
 expo-america.ru, 1
 expo-asia.ru, 1
 expo-europe.ru, 1
 expo-larionov.org, 1
-exponentialnews.net, 1
 expoort.co.uk, 1
 expoort.com, 1
 expoort.com.br, 1
 expoort.es, 1
 expoort.fr, 1
 expoort.it, 1
 expopodium.com, 1
 exporta.cz, 1
@@ -15906,16 +16017,17 @@ eytosh.net, 1
 eyyit.com, 0
 eyyubyilmaz.com, 1
 ez3d.eu, 1
 ezakazivanje.rs, 1
 ezdog.press, 1
 ezequiel-garzon.net, 1
 ezesec.com, 1
 ezgif.com, 1
+ezhik-din.ru, 1
 eznfe.com, 1
 ezorgportaal.nl, 1
 ezpzdelivery.com, 1
 eztvtorrent.com, 1
 ezwritingservice.com, 1
 ezzhole.net, 1
 f-be.com, 1
 f-droid.org, 1
@@ -15961,16 +16073,17 @@ fabianackle.ch, 1
 fabianasantiago.com, 1
 fabianbeiner.com, 0
 fabianbeiner.de, 0
 fabianfranke.de, 1
 fabiankoeppen.com, 1
 fabienbaker.com, 1
 fabienne-roux.org, 1
 fabiobier.com, 1
+fabiocicerchia.it, 1
 fabjansisters.eu, 1
 fabled.com, 1
 fableforge.nl, 1
 fabmart.com, 1
 fabrica360.com, 1
 fabriceleroux.com, 1
 fabriziocavaliere.it, 1
 fabriziorocca.com, 1
@@ -16066,16 +16179,17 @@ fairydust.space, 1
 faithcentercogop.net, 1
 faithgrowth.com, 1
 faithindemocracy.eu, 0
 faithleaks.org, 1
 faithmissionaries.com, 1
 faithwatch.org, 1
 fakeapple.nl, 1
 fakeduckpond.com, 1
+fakeemergency.com, 1
 fakerli.com, 1
 fakti.bg, 1
 faktotum.tech, 1
 fakturi.com, 1
 fakturoid.cz, 1
 falaeapp.org, 1
 falaowang.com, 1
 falbros.com, 1
@@ -16118,23 +16232,25 @@ familie-kruithof.nl, 1
 familie-kupschke.de, 1
 familie-leu.ch, 1
 familie-mischak.de, 1
 familie-monka.de, 1
 familie-poeppinghaus.de, 1
 familie-remke.de, 1
 familieholme.de, 1
 familiekiekjes.nl, 1
+familienportal.de, 1
 familiereimann.com, 1
 familjenfrodlund.se, 1
 familjenm.se, 1
 familylawhotline.org, 1
 familyparties.co.uk, 1
 familyreal.ru, 1
 familytreehq.com, 1
+familyworld.gr, 1
 famososnaweb.com, 1
 famousbirthdays.com, 1
 famoushostels.com, 1
 famvangelder.nl, 1
 famvsomeren.nl, 1
 fan.gov, 1
 fanactu.com, 1
 fanatical.com, 1
@@ -16176,31 +16292,35 @@ fanz.pro, 1
 fanzlive.com, 1
 fap.no, 1
 fapplepie.com, 1
 faq.ie, 1
 faq.lookout.com, 0
 fara.gov, 1
 faradji.nu, 1
 faradome.ws, 1
+faradrive.ir, 1
 faraonplay5.com, 1
 faraonplay7.com, 1
 faraonplay8.com, 1
 faraslot8.com, 1
 faraslot8.net, 1
 farcecrew.de, 1
 farces.com, 0
 faretravel.co.uk, 1
 farfetchos.com, 1
 fargtorget.se, 1
 farhadexchange.com, 1
 farhood.org, 1
 farid.is, 1
+farizizhan.com, 1
+farleymetals.com.au, 1
 farm24.co.uk, 1
 farmacia-discreto.com, 1
+farmaciacorvi.it, 1
 farmaciadejaime.es, 1
 farmacialaboratorio.it, 1
 farmer.dating, 1
 farmers.gov, 1
 farmkazuto.com, 1
 farmmaximizer.com, 1
 faroebusinessreport.com, 1
 faroes.net, 1
@@ -16769,16 +16889,17 @@ fish2.me, 1
 fishbattle.io, 1
 fishbattle.net, 1
 fishermailbox.net, 1
 fishermansbend.apartments, 1
 fishermansbendcorporation.com.au, 1
 fishermansbendtownhouses.com.au, 1
 fishexport.eu, 1
 fishgen.no, 1
+fishlanestudios.com, 1
 fishserver.net, 1
 fishtacos.blog, 1
 fisinfomanagerdr.com, 1
 fisiobox.eu, 1
 fiskalnepretor.pl, 1
 fistu.la, 1
 fit-4u.ch, 1
 fit-mit-nina.com, 1
@@ -16935,16 +17056,17 @@ floaternet.com, 1
 flockbox.club, 1
 flocktofedora.org, 1
 floersheimer-openair.de, 1
 floffi.media, 1
 floify.com, 1
 floj.tech, 1
 flokinet.is, 1
 floless.co.uk, 1
+flomeyer.de, 1
 floobits.com, 1
 floogulinc.com, 1
 floorballpoint.cz, 1
 flooringnightmares.com, 1
 flooringsourcetx.com, 1
 floors4lessbay.com, 1
 floort.net, 0
 flopix.net, 0
@@ -17022,17 +17144,16 @@ flyinglocksmiths.com, 1
 flyingpackets.net, 1
 flyingrub.me, 1
 flyingspaghettimonsterdonationsfund.nl, 1
 flymns.fr, 1
 flynn.io, 1
 flyp.me, 1
 flypenge.dk, 1
 flyserver.co.il, 1
-flyshe.co.uk, 1
 flyss.net, 1
 flyssh.net, 1
 flyswoop.com, 1
 flyt.online, 1
 flytoadventures.com, 1
 fm-cdn.de, 1
 fm.ie, 1
 fmapplication.com, 1
@@ -17109,16 +17230,17 @@ fonte-trading.com, 1
 fontein.de, 1
 fontlibrary.org, 1
 fonts4free.net, 1
 foo, 1
 foo.fo, 1
 foo.hamburg, 1
 foodattitude.ch, 1
 foodblogger.club, 1
+foodcare.ml, 1
 foodcowgirls.com, 1
 foodev.de, 1
 foodloader.net, 1
 foodplantengineering.com, 1
 foodsafety.gov, 1
 foodsafetyjobs.gov, 1
 foodsouvenirs.it, 1
 foodtable.at, 1
@@ -17180,16 +17302,17 @@ formacionyestudios.com, 1
 forman.store, 1
 formapi.io, 1
 format-paysage.ch, 1
 formation-assureur.com, 1
 formation-mac.ch, 1
 formationseeker.com, 1
 formbetter.com, 1
 formersessalaries.com, 1
+formforger.com, 1
 formini.dz, 1
 formkiq.com, 1
 formsbyair.com, 1
 formula-ot.ru, 1
 formulacionquimica.com, 1
 formulastudent.de, 1
 fornoreason.net.au, 1
 fornwall.net, 1
@@ -17206,17 +17329,16 @@ forsakringsarkivet.se, 1
 forschbach-janssen.de, 1
 forsec.nl, 1
 forstbetrieb-hennecke.de, 1
 forstprodukte.de, 1
 forsyththeatre.com, 1
 fort.eu, 1
 forteggz.nl, 1
 fortesanshop.it, 1
-fortestecnologia.com.br, 1
 fortknox.cz, 1
 fortnine.ca, 1
 fortnitemagic.ga, 1
 fortoglethorpega.gov, 1
 fortran.io, 1
 fortress.no, 1
 fortress.sk, 1
 fortuna-apotheke-lahnstein.de, 1
@@ -17310,30 +17432,32 @@ fpsclasico.de, 1
 fpt-technojapan.com, 1
 fptravelling.com, 0
 fpvr.org, 1
 fpy.cz, 1
 fr.search.yahoo.com, 0
 fr33tux.org, 1
 frack.nl, 1
 fracreazioni.it, 1
+fraesentest.de, 1
 fragmentspuren.de, 1
 fragrances.bg, 1
 fragstore.net, 1
 fraho.eu, 1
 framapiaf.org, 1
 framboise314.fr, 1
 framedpaws.com, 1
 framezdakkapellen.nl, 1
 fran.cr, 1
 francescopalazzo.com, 1
 francescopandolfibalbi.it, 1
 francetraceur.fr, 1
 franchini.email, 1
 franchini.engineer, 1
+francinebelanger.network, 1
 francis.tokyo, 1
 francisli.net, 0
 franckgirard.net, 1
 franckyz.com, 1
 francois-gaillard.fr, 1
 francois-occasions.be, 1
 francoisbelangerboisclair.com, 1
 francoiscarrier.com, 1
@@ -17736,16 +17860,17 @@ full-race.com, 1
 full-stack.ninja, 1
 fullbundle.com, 1
 fullereno.com, 1
 fullerlife.org.uk, 1
 fullfilez.com, 1
 fullhost.com, 1
 fullhub.ru, 1
 fullmatch.net, 1
+fullnitrous.com, 1
 fullstacknotes.com, 1
 fulltxt.ml, 1
 fumblers.ca, 1
 fumerolles.ch, 1
 fun-bounce.co.uk, 1
 fun-tasia.co.uk, 1
 fun4kidzbouncycastles.co.uk, 1
 fun4tomorrow.com, 1
@@ -17771,17 +17896,16 @@ fundeego.com, 1
 fundort.ch, 1
 funds.ddns.net, 1
 funfactorleeds.co.uk, 1
 funfair.io, 1
 funfoodco.co.uk, 1
 funfunmstdn.tokyo, 1
 fungames.com, 1
 funhouse-inflatables.co.uk, 1
-funi4u.com, 1
 funideas.org, 1
 funinbeds.org.uk, 1
 funken-networks.de, 1
 funkner.ru, 1
 funksteckdosen24.de, 0
 funktionel.co, 1
 funktionsverket.se, 1
 funkygamer1.de, 1
@@ -18061,17 +18185,16 @@ gamepreorders.com, 1
 gamequest.info, 1
 gamer-portal.com, 1
 gamercredo.com, 1
 gamereader.de, 1
 gamerezo.com, 1
 gamerzdot.com, 1
 games4theworld.org, 1
 gamesaviour.com, 1
-gamesdepartment.co.uk, 1
 gameserver-sponsor.me, 1
 gameshowchallenge.ie, 1
 gamesided.com, 1
 gamesplanet.com, 1
 gamesputnik.ru, 1
 gamestats.gg, 1
 gameswitchers.uk, 1
 gametilt.com, 1
@@ -18082,16 +18205,17 @@ gamhealth.net, 1
 gamilab.com, 1
 gamilab.no, 1
 gamingexodus.com, 1
 gamingmedley.com, 1
 gamingrealms.net, 1
 gamingwithcromulent.com, 1
 gamingzoneservers.com, 1
 gamisalya.com, 1
+gamishijabsyari.com, 1
 gamishou.fr, 1
 gamismodernshop.com, 1
 gamismu.com, 1
 gamismurahonline.com, 1
 gamivo.com, 1
 gamoloco.com, 1
 gan.wtf, 1
 ganado.org, 1
@@ -18106,16 +18230,17 @@ ganggalbichler.at, 1
 gangnam-club.com, 1
 gangnamavenue.com, 1
 gangnamcool.com, 1
 gansleit.com, 0
 ganyouxuan.com, 1
 ganztagplus.de, 1
 gao.ci, 1
 gao.rocks, 1
+gaodebo.com, 1
 gaojianli.me, 1
 gaojianli.tk, 1
 gaon.network, 1
 gaos.org, 1
 gapdirect.com, 1
 gapfa.org, 1
 gaphag.ddns.net, 1
 gar-nich.net, 0
@@ -18148,17 +18273,16 @@ garethkirkreviews.com, 1
 garethrhugh.es, 1
 garforthgolfclub.co.uk, 1
 gargazon.net, 1
 garnuchbau.de, 1
 garron.net, 1
 garrowmediallc.com, 1
 garten-diy.de, 1
 gartenbaur.de, 1
-gartenhauszentrum.de, 1
 gartenplanung-brendes.de, 1
 garycarmell.com, 1
 garycwaite.com, 1
 garyjones.co.uk, 1
 garyrh.com, 1
 garystallman.com, 1
 garyswine.com, 1
 garywhittington.com, 1
@@ -18250,17 +18374,16 @@ ge3k.net, 0
 gear-acquisition-syndrome.community, 1
 gear4you.shop, 1
 gearallnews.com, 1
 gearbot.rocks, 1
 gearboxhero.com, 1
 gearev.net, 1
 gearfinder.nl, 1
 gearset.com, 1
-geaskb.nl, 1
 geass.xyz, 1
 geba-online.de, 1
 gebn.co.uk, 1
 gebn.uk, 1
 geboortestoeltje.com, 1
 geborgen-wachsen.de, 1
 gebruikershandleiding.com, 1
 gecem.org, 1
@@ -18283,16 +18406,17 @@ geekeffect.co.uk, 1
 geeklair.net, 1
 geeklan.co.uk, 1
 geekles.net, 1
 geeknik.com, 1
 geekpad.com, 1
 geeks.berlin, 1
 geeks.one, 0
 geekshirts.cz, 1
+geekthis.de, 1
 geektopia.es, 1
 geekwhack.org, 1
 geekwithabudget.com, 1
 geekwu.org, 1
 geekystudios.us, 1
 geekz.sk, 1
 geekzone.co.nz, 1
 geekzone.fr, 1
@@ -18325,18 +18449,20 @@ geldimblick.de, 1
 geldteveel.eu, 1
 geleenbeekdal.nl, 1
 gelis.ch, 1
 gelog-software.de, 0
 gelonghui.com, 1
 geloofindemocratie.nl, 0
 geluidsstudio.com, 1
 geluk.io, 1
+gelukkigehonden.nl, 1
 gem-indonesia.net, 0
 gem-info.fr, 1
+gemails.eu, 1
 gemeinsam-ideen-verwirklichen.de, 1
 gemgroups.in, 1
 gemini.com, 1
 gemquery.com, 1
 genbright.com, 1
 genchev.io, 1
 gencmedya.com, 1
 genderidentiteit.nl, 1
@@ -18344,16 +18470,17 @@ gendrin.com, 1
 gendundrupa.ch, 1
 gene-drive.com, 1
 gene-drives.com, 1
 genealorand.com, 1
 geneau.net, 1
 genehightower.com, 1
 genehome.com.au, 1
 genemesservwparts.com, 1
+genemon.at, 1
 generace-id.org, 1
 generador-electrico.com, 1
 general-anaesthesia.com, 1
 general-anaesthetics.com, 1
 general-anesthesia.com, 1
 general-insurance.tk, 1
 general-plast.com, 1
 generali-worldwide.com, 1
@@ -18408,16 +18535,17 @@ geocompass.at, 1
 geofox.org, 1
 geography-schools.com, 1
 geoinstinct.com, 1
 geoip.fedoraproject.org, 1
 geoip.stg.fedoraproject.org, 1
 geojs.io, 1
 geology-schools.com, 1
 geometra.roma.it, 1
+geometra24.it, 1
 geomex.be, 1
 geomonkeys.com, 1
 geoponika.gr, 1
 geoport.al, 1
 georadar-algerie.com, 1
 george-brighton.co.uk, 1
 george-orwell.com, 1
 georgebrighton.co.uk, 1
@@ -18629,16 +18757,17 @@ giant-tortoise.com, 1
 gianttree.de, 1
 giardinaggio.milano.it, 1
 giardinaggio.napoli.it, 1
 giardiniere.bologna.it, 1
 giardiniere.milano.it, 1
 gibraltar.at, 1
 gichigamigames.com, 1
 gicl.dk, 1
+gidari.shop, 1
 giddyaunt.net, 1
 giebel.it, 1
 gierds.de, 1
 giethoorn.com, 1
 gietvloergarant.nl, 0
 giftcard.net, 1
 giftcardgranny.com, 1
 giftedconsortium.com, 1
@@ -18673,16 +18802,17 @@ gilangcp.com, 0
 gileadpac.com, 1
 gilescountytn.gov, 1
 gilium.com, 1
 gillesdesnoyers.com, 1
 gillesmorelle.com, 1
 gillfamily.de, 1
 gillmanandsoame.co.uk, 1
 gillyscastles.co.uk, 1
+gilme.net, 1
 gilmoreid.com.au, 1
 gilmourluna.com, 1
 gilnet.be, 1
 gimme.money, 1
 gina-architektur.design, 1
 ginabaum.com, 1
 gingersutton.com, 1
 ginionusedcars.be, 1
@@ -18757,17 +18887,16 @@ gixtools.com, 1
 gixtools.net, 1
 gixtools.uk, 1
 gizmo.ovh, 1
 gj-bochum.de, 1
 gjcampbell.co.uk, 1
 gjengset.com, 1
 gjspunk.de, 0
 gjung.com, 0
-gkimanyar.org, 1
 gkoenig-innenausbau.de, 1
 gkralik.eu, 1
 gkvsc.de, 0
 gl.search.yahoo.com, 0
 gla-hyperloop.com, 0
 glabiatoren-kst.de, 1
 glaciernursery.com, 1
 gladwellentertainments.co.uk, 1
@@ -19032,16 +19161,17 @@ gonx.dk, 0
 gonzalesca.gov, 1
 goo.gl, 1
 good-tips.pro, 1
 good588.com, 1
 gooday.life, 1
 gooddomainna.me, 1
 goodfeels.net, 1
 goodhealthtv.com, 1
+goodiesoftware.xyz, 1
 goodquote.gq, 1
 goodryb.top, 1
 goodsex4all.com.br, 1
 goodshepherdmv.com, 1
 goodth.ink, 1
 goodvibesblog.com, 1
 goodyearsotn.co.uk, 1
 google, 1
@@ -19097,17 +19227,17 @@ gostudy.net, 1
 gosu.pro, 1
 gosuland.org, 1
 got-tty.de, 1
 goteborgsklassikern.se, 1
 gotech.com.eg, 0
 gothamlimo.com, 1
 gothic.dating, 1
 gotirupati.com, 0
-gotmalk.org, 1
+gotmalk.org, 0
 goto.google.com, 1
 goto.msk.ru, 1
 goto.world, 1
 goto10.se, 1
 gotomi.info, 1
 gotowned.org, 0
 gotoxy.at, 1
 gotrail.fr, 1
@@ -19125,16 +19255,17 @@ gourmetspalencia.com, 1
 gov.tc, 1
 governmentjobs.gov, 1
 governorhub.com, 1
 govisitcostarica.co.cr, 1
 govisitcostarica.com, 1
 govtjobs.blog, 1
 govtrack.us, 1
 govype.com, 1
+gow220.ru, 1
 gowancommunications.com, 1
 gowe.wang, 0
 gowildrodeo.co.uk, 1
 gowin9.com, 1
 gowin9.net, 1
 gowithflo.de, 1
 gozadentro.com, 1
 gozenhost.com, 1
@@ -19233,16 +19364,17 @@ grapee.jp, 1
 grapeintentions.com, 1
 grapevine.is, 1
 graphcommons.com, 1
 graphene.software, 1
 graphic-schools.com, 1
 graphic-shot.com, 1
 graphire.io, 1
 graphite.org.uk, 1
+graphobyte.com, 1
 grapholio.net, 1
 grasboomamersfoort.nl, 1
 grasboombinnendoor.nl, 1
 grasboomclophaemer.nl, 1
 grasboomderoos.nl, 1
 grasboomleusden.nl, 1
 grasboommax.nl, 1
 grasboommeerbalans.nl, 1
@@ -19387,16 +19519,17 @@ grieg.net, 1
 grieg.no, 1
 grieg.org, 1
 griegfoundation.no, 1
 grieglogistics.no, 1
 griegshipbrokers.com, 1
 griegshipbrokers.no, 1
 griesser2.de, 1
 grillen-darf-nicht-gesund-sein.de, 1
+grillhutsunderland.com, 1
 grillteller42.de, 1
 grimcalc.com, 1
 grimm-gastrobedarf.de, 1
 grimneko.de, 1
 grimstveit.no, 1
 grinnellplans.com, 1
 gripnijmegen.rip, 1
 grippe-impftermin.de, 1
@@ -19549,16 +19682,17 @@ guichet-entreprises.fr, 1
 guichet-qualifications.fr, 1
 guid2steamid.com, 1
 guid2steamid.pw, 1
 guida.org, 1
 guide-peche-cantal.com, 1
 guidebook.co.tz, 1
 guidechecking.com, 1
 guidedselling.net, 1
+guidedsteps.com, 1
 guideline.gov, 0
 guidelines.gov, 0
 guideo.ch, 1
 guidepointsecurity.com, 1
 guides-peche64.com, 1
 guidetoiceland.is, 0
 guildgearscore.cf, 0
 guildofmusicsupervisors.co.uk, 1
@@ -19600,17 +19734,16 @@ gurpusmaximus.com, 1
 guru-naradi.cz, 1
 gurucomi.com, 1
 gurueffect.com, 1
 gurugardener.co.nz, 1
 gururi.com, 1
 gus.host, 1
 gus.moe, 1
 gustaff.de, 1
-gustiaux.com, 1
 gustom.io, 1
 gut8er.com.de, 1
 guthabenkarten-billiger.de, 1
 gutools.co.uk, 1
 guts.me, 1
 guts.moe, 1
 gutschein-spezialist.de, 1
 gutscheingeiz.de, 1
@@ -19714,17 +19847,16 @@ habview.net, 1
 hacc.top, 1
 haccp.bergamo.it, 1
 haccp.milano.it, 1
 haccp.roma.it, 1
 hacertest.com, 1
 hacettepeteknokent.com.tr, 1
 hachre.de, 0
 hack.club, 1
-hack.cz, 1
 hackademix.net, 1
 hackanders.com, 1
 hackattack.com, 1
 hackbarth.guru, 1
 hackbeil.name, 1
 hackbubble.me, 1
 hackcraft.net, 1
 hackdown.me, 1
@@ -19811,17 +19943,17 @@ hak5.org, 1
 hakaru.org, 1
 hakase.io, 1
 hakase.pw, 1
 hakatabijin-mind.com, 1
 hake.me, 1
 hakkasangroup.com, 1
 hakkasannightclub.com, 1
 hakugin.me, 1
-hakurei.moe, 0
+hakurei.moe, 1
 hal-9th.space, 1
 halacs.hu, 1
 halbich.design, 1
 halcyonsbastion.com, 1
 haleo.net, 1
 half-logic.eu.org, 1
 half.host, 1
 halfco.de, 1
@@ -19930,16 +20062,17 @@ haozi.me, 1
 haozijing.com, 1
 hapheemraadssingel.nl, 1
 hapijs.cn, 1
 hapissl.com, 1
 hapivm.com, 1
 happndin.com, 1
 happy-baby.info, 1
 happy-end-shukatsu.com, 1
+happy-life-food.de, 1
 happyagain.de, 1
 happyagain.se, 1
 happyandrelaxeddogs.eu, 1
 happybeerdaytome.com, 1
 happybirthdaywisher.com, 1
 happybounce.co.uk, 1
 happycarb.de, 1
 happycoder.net, 0
@@ -19966,16 +20099,17 @@ hardeman.nu, 1
 hardenize.com, 1
 hardergayporn.com, 1
 hardertimes.com, 1
 hardesec.com, 1
 hardez.de, 0
 hardfalcon.net, 1
 hardforum.com, 1
 hardh.at, 1
+hardhat.io, 1
 hardloopfysio.nl, 1
 hardrain980.com, 1
 hardtfrieden.de, 1
 hardtime.ru, 1
 hardwareschotte.de, 1
 harekaze.info, 1
 haribilalic.com, 1
 harilova.fr, 1
@@ -19984,24 +20118,26 @@ harisht.me, 0
 haritsa.co.id, 1
 harjitbhogal.com, 1
 harlor.de, 1
 harmfarm.nl, 1
 harmoney.co.nz, 1
 harmoney.com, 1
 harmoney.com.au, 1
 harmonyplace.com, 1
+harnov.dk, 1
 haroldsharpe.com, 1
 harp.gov, 1
 harrcostl.com, 1
 harringtonca.com, 1
 harrisonsand.com, 0
 harrisonswebsites.com, 1
 harrisonvillenaz.org, 1
 harry-baker.com, 1
+harrygerritstransport.nl, 1
 harrymclaren.co.uk, 1
 harryphoto.fr, 1
 harrypottereditor.com, 1
 harrypottereditor.net, 1
 harrysgardengamehire.co.uk, 1
 harrysmallbones.co.uk, 1
 harrysqnc.co.uk, 1
 hartie95.de, 1
@@ -20054,16 +20190,17 @@ hatpakha.com, 1
 hatter.ink, 1
 hatul.info, 1
 haucke.xyz, 1
 hauntedhouserecords.co.uk, 1
 haus-garten-test.de, 1
 haus-henne.de, 1
 haus-zeitlos.de, 1
 hausarztpraxis-linn.de, 1
+haushaltsaufloesunghannover.de, 1
 haushenne.de, 1
 hausjugo.de, 1
 haustechnik-breu.de, 1
 hausundhof.com, 1
 hausverbrauch.de, 1
 hautaka.com, 1
 hautarztzentrum.ch, 1
 hauteslatitudes.com, 1
@@ -20088,28 +20225,28 @@ havernbenefits.com, 1
 haverstack.com, 1
 havetherelationshipyouwant.com, 1
 hawaar.com, 1
 hawaiianchoice.com, 1
 hawaya.com, 1
 hawk-la.com, 1
 hawkeyeinsight.com, 1
 hawkinsonkiaparts.com, 1
-hawkofgeorgia.com, 1
 hawkon.dk, 1
 hawksguild.com, 1
 hawksracing.de, 1
 hax.to, 1
 haxdroid.com, 1
 haxo.nl, 0
 hayai.space, 1
 hayashi-rin.net, 1
 haydenjames.io, 1
 haydentomas.com, 1
 hayfordoleary.com, 1
+haynes-davis.com, 1
 hayvid.com, 1
 haz.cat, 1
 haze-productions.com, 1
 haze.productions, 1
 hazeover.com, 1
 hazloconlapix.com, 1
 hazukilab.com, 1
 hb8522.com, 1
@@ -20270,16 +20407,17 @@ heimonen.eu, 1
 heimprofis.de, 1
 heinemann.io, 1
 heinemeier.dk, 1
 heinpost.nl, 0
 heinzelmann.co, 1
 heiraten-gardasee.de, 1
 heiraten-venedig.de, 1
 heisenberg.co, 1
+heissluft-fritteuse.com, 1
 heistheguy.com, 1
 heitepriem.info, 1
 heitland-it.de, 1
 heiwa-valve.co.jp, 0
 hejahanif.se, 1
 hejianpeng.cn, 1
 hejsupport.se, 1
 heka.ai, 1
@@ -20293,16 +20431,17 @@ heleendebruyne.be, 1
 helenaknowledge.com, 1
 helenekurtz.com, 1
 helenelefauconnier.com, 1
 helenkellersimulator.org, 1
 helfordriversc.co.uk, 1
 helgaschultz.de, 1
 helicaldash.com, 1
 helichat.de, 1
+helifreak.club, 1
 helikon.ro, 1
 helioanodyne.eu, 1
 helios4.com, 1
 heliosnet.com, 1
 heliosvoting.org, 1
 helix.am, 1
 hell.sh, 1
 hellenicagora.co.uk, 1
@@ -20323,17 +20462,19 @@ hellsgamers.pw, 1
 hellsh.com, 1
 help.simpletax.ca, 1
 helpantiaging.com, 1
 helpconnect.com.au, 1
 helpekwendenihospital.com, 1
 helpmij.cf, 1
 helprocleaningservices.com, 1
 helpscoutdocs.com, 1
-helptasker.org, 1
+helptasker.com, 1
+helptasker.net, 1
+helptasker.ru, 1
 helpwithmybank.gov, 1
 helserbrothers.com, 1
 helsingfors.guide, 1
 helsinki.dating, 1
 helvella.de, 1
 hematoonkologia.pl, 1
 hemdal.se, 1
 hemnet.se, 1
@@ -20483,16 +20624,17 @@ hflsdev.org, 0
 hfox.org, 1
 hfu.io, 1
 hg.gg, 1
 hg.python.org, 1
 hg71839.com, 1
 hg881.com, 1
 hgbet.com, 1
 hgfa.fi, 1
+hgpowerglue.nl, 1
 hgvnet.de, 1
 hgw168.com, 1
 hh-medic.com, 1
 hh-wolke.dedyn.io, 1
 hhgdo.de, 1
 hhhdb.com, 1
 hhidr.org, 1
 hhmmmm.de, 1
@@ -20662,17 +20804,16 @@ hk.search.yahoo.com, 0
 hkas.org.hk, 1
 hkbsurgery.com, 1
 hkdobrev.com, 1
 hkr.at, 1
 hks-projekt.at, 1
 hks.pw, 1
 hktkl.com, 1
 hkustmbajp.com, 1
-hl7999.com, 1
 hl8999.com, 1
 hlavacek.us, 1
 hlavi.hu, 1
 hledejlevne.cz, 1
 hledejpravnika.cz, 1
 hlfh.space, 1
 hlidacnajemneho.cz, 1
 hlin.cloud, 1
@@ -20808,16 +20949,17 @@ homecarpetcleaning.co.uk, 1
 homecheck.gr, 1
 homecoming.city, 1
 homefacialpro.com, 0
 homegardeningforum.com, 1
 homegardenresort.nl, 1
 homegreenmark.com, 1
 homehuntertoronto.com, 1
 homeimagician.com.au, 1
+homelabquotes.com, 1
 homem-viril.com, 1
 homeodynamics.com, 1
 homeofjones.net, 1
 homeogenium.com, 1
 homeownersinsurancenevada.com, 1
 homeownersinsurancenv.com, 1
 homepage.shiga.jp, 1
 homeporn.stream, 1
@@ -21086,27 +21228,27 @@ hrbl.lc, 1
 hrdns.de, 0
 href.one, 1
 hreflang.info, 1
 hrjfeedstock.org, 1
 hrltech.com.br, 1
 hrndz.io, 1
 hro.to, 1
 hrobert.hu, 1
-hroling.nl, 1
 hroschyk.cz, 1
 hrsa.gov, 1
 hrstapps-dev.com, 1
 hrtech.shop, 1
 hryniewski.net, 1
 hryx.net, 1
 hs-arbeitsschutz.de, 1
 hs-group.net, 1
 hs-umformtechnik.de, 1
 hsappstatic.net, 1
+hschen.top, 0
 hscorp.de, 1
 hsivonen.com, 1
 hsivonen.fi, 1
 hsivonen.iki.fi, 1
 hsmr.cc, 1
 hsn.com, 1
 hsr.gov, 0
 hsts-preload-test.xyz, 1
@@ -21161,16 +21303,17 @@ hu8555.com, 1
 hu8588.com, 1
 hu8777.com, 1
 hu8bet.com, 1
 hu8hu8.com, 1
 hua-in.com, 1
 hua-in.net, 1
 hua-li88.com, 1
 hua-li88.net, 1
+huabianwa.com, 1
 huagati.com, 1
 huahinpropertylisting.com, 1
 hualao.co, 1
 huang.nu, 1
 huangguancq.com, 1
 huangh.com, 1
 huangjia71.com, 1
 huangjia72.com, 1
@@ -21389,16 +21532,17 @@ hype.ru, 1
 hypeitems.pl, 1
 hypemgmt.com, 1
 hyper-matrix.org, 1
 hyper-text.org, 1
 hyperactive.am, 1
 hyperalgesia.com, 1
 hyperautomotive.com.au, 1
 hyperbolic-mayonnaise-interceptor.ovh, 1
+hyperd.sh, 1
 hyperion.io, 1
 hyperreal.biz, 1
 hypersomnia.com, 1
 hyperstack.org, 1
 hyperthymia.com, 1
 hyphen.co.za, 1
 hyphenpda.co.za, 1
 hypotecnicentrum.cz, 1
@@ -21453,17 +21597,16 @@ iaeste.no, 1
 iaeste.or.jp, 1
 iaf.gov, 1
 iahemobile.net, 1
 iainsimms.co.uk, 1
 iainsimms.com, 1
 iainsimms.me, 1
 iaitouzi.com, 1
 ialis.me, 1
-iam.lc, 1
 iam.soy, 1
 iamanewme.com, 1
 iambozboz.co.uk, 1
 iamcryptoki.com, 1
 iamhansen.xyz, 1
 iaminashittymood.today, 1
 iamjoshellis.com, 1
 iamlbk.com, 1
@@ -21507,16 +21650,17 @@ ibodyiq.com, 1
 ibpegasus.tk, 1
 ibps-recruitment.in, 1
 ibpsrecruitment.co.in, 1
 ibrainmedicine.org, 1
 ibrom.eu, 1
 ibron.co, 0
 ibsafrica.co.za, 1
 ibsglobal.co.za, 1
+ibsociety.com, 1
 ibstyle.tk, 1
 ibuki.run, 1
 ibutikk.no, 1
 ibwc.gov, 1
 ibykos.com, 1
 ic-lighting.com.au, 1
 ic-spares.com, 1
 ic3.gov, 1
@@ -21567,16 +21711,17 @@ icsfinomornasco.gov.it, 1
 icsfinomornasco.it, 1
 ict-concept.nl, 0
 ict-crew.nl, 1
 ict-helpteam.nl, 1
 ict-radar.com, 1
 ict-radar.nl, 1
 ictcareer.ch, 1
 ictinforensics.org, 1
+ictoniolopisa.it, 1
 ictradar.com, 1
 icusignature.com, 1
 icyapril.com, 1
 icymint.me, 1
 icynet.eu, 1
 iczc.cz, 1
 id-blog.ch, 1
 id.atlassian.com, 1
@@ -21593,17 +21738,16 @@ idc-business.be, 1
 idc.yn.cn, 1
 idconsult.nl, 1
 idcrane.com, 1
 iddconnect.com, 1
 iddconnect.org, 1
 ideadozz.hu, 1
 idealcontabilidade.net, 1
 idealimplant.com, 1
-idealinflatablehire.co.uk, 1
 idealninajemce.cz, 0
 idealsegurancaeletronica.com.br, 0
 idealtruss.com, 1
 idealtruss.com.tw, 1
 idealwhite.space, 1
 ideaman924.com, 1
 ideasenfoto.com, 1
 ideashop.com, 1
@@ -21649,16 +21793,17 @@ idontplaydarts.com, 1
 idoparadoxon.hu, 1
 idranktoomuch.coffee, 1
 idratherbequilting.com, 1
 idraulico-roma.it, 1
 idraulico-roma.org, 1
 idraulico.roma.it, 1
 idrinktoomuch.coffee, 1
 idrissi.eu, 1
+idroserviceweb.com, 1
 idrycleaningi.com, 1
 idsafe.co.za, 1
 idtechnowizard.com, 1
 idtheft.gov, 1
 idubaj.cz, 1
 idunno.org, 1
 idvl.de, 1
 idxforza.com, 1
@@ -21676,16 +21821,17 @@ iemb.cf, 1
 iemb.tk, 1
 ienakanote.com, 0
 ies-italia.it, 1
 iesonline.co.in, 1
 ieval.ro, 1
 iewar.com, 1
 if0.ru, 1
 ifan.ch, 1
+ifan.ws, 1
 ifangpei.cn, 1
 ifangpei.com.cn, 1
 ifasec.de, 0
 ifcfg.jp, 1
 ifcfg.me, 1
 ifelse.io, 1
 ifengge.cn, 1
 ifengge.me, 1
@@ -21738,19 +21884,19 @@ ignitedmindz.in, 1
 ignitelocal.com, 1
 igorrealestate.com, 1
 igorw.org, 1
 igotoffer.com, 0
 igrarium.com.ua, 1
 igrivi.com, 1
 igsmgmt.com, 1
 iguana.com.ec, 0
+igva.or.kr, 1
 ih8sn0w.com, 1
 iha6.com, 1
-ihacklabs.com, 1
 ihakkitekin.com, 1
 ihatethissh.it, 1
 ihcprofile.com, 1
 iheartmary.org, 1
 ihkk.net, 1
 ihls.stream, 1
 ihls.world, 1
 ihmphila.org, 1
@@ -21931,21 +22077,22 @@ imgbb.com, 1
 imgencrypt.com, 1
 imgg.es, 1
 imgul.net, 1
 imguoguo.com, 1
 imgup.co, 1
 imguploaden.nl, 1
 imhua.com, 1
 imi-rhapsody.eu, 1
-iminshell.com, 1
+iminshell.com, 0
 imirhil.fr, 1
 imitza.com, 1
 imjad.cn, 1
 imjo.in, 1
+imjustcreative.co.uk, 1
 imjustcreative.com, 1
 imkerei-freilinger.de, 0
 imkerverein-moenchswald.de, 1
 imlinan.cn, 1
 imlinan.com, 1
 imlinan.info, 1
 imlinan.net, 1
 immarypoppinsyall.tk, 1
@@ -22007,16 +22154,17 @@ impresa-pulizie.it, 1
 impresadipulizie.roma.it, 1
 impresaedile.roma.it, 1
 impressivebison.eu, 1
 imprimante-3d-store.fr, 1
 improfestival.ee, 1
 improklinikken.dk, 1
 improved-madness.de, 1
 improvingwp.com, 1
+improvision.eu, 1
 impulse-clan.de, 1
 impulsionsa.com, 1
 impyus.com, 1
 imququ.com, 1
 imreh.net, 1
 imrejonk.nl, 1
 imrunner.com, 1
 imrunner.ru, 1
@@ -22084,16 +22232,17 @@ indiaflowermall.com, 1
 indian-elephant.com, 1
 indianaantlersupply.com, 1
 indianaberry.com, 1
 indianaffairs.gov, 0
 indianafoundationpros.com, 1
 indianamoldrepairpros.com, 1
 indianapolislocksmithinc.com, 1
 indianawaterdamagerepairpros.com, 1
+indiansmartpanel.com, 1
 indiatrademarkwatch.com, 1
 indiawise.co.uk, 1
 indiayogastudio.net, 1
 indicateurs-flash.fr, 1
 indie.dog, 1
 indiecongdr.it, 1
 indiegame.space, 1
 indievelopment.nl, 1
@@ -22159,30 +22308,30 @@ infinitybc.se, 1
 infinityengine.org, 1
 infinityepos.co.uk, 1
 infirmiere-canadienne.com, 1
 infirmieredevie.ch, 1
 inflatablehire-scotland.co.uk, 1
 inflatablesny.com, 1
 inflatadays.co.uk, 1
 inflatamania.com, 1
+inflated.cloud, 1
 inflationstation.net, 1
 inflexsys.com, 1
 influencerchampions.com, 0
 influo.com, 1
 influxus.com, 0
 infmed.com, 1
 info-bay.com, 1
 info-beamer.com, 1
 info-d-74.com, 1
 info-screen-usercontent.me, 1
 info-screen.me, 1
 info-screw.com, 1
 infobae.com, 1
-infobalkans.com, 1
 infobrain.net, 1
 infocity-tech.fr, 1
 infocoin.es, 0
 infocommsociety.com, 1
 infocon.org, 1
 infocusvr.net, 1
 infoduv.fr, 1
 infogram.com, 1
@@ -22268,17 +22417,16 @@ infratank.com, 1
 infratask.com, 1
 infrathink.com, 1
 infratrip.com, 1
 infravibe.com, 1
 infravideo.com, 1
 infrazine.com, 1
 infruction.com, 1
 infuzeit.com.au, 1
-ing-buero-junk.de, 1
 ing89.cc, 1
 ing89.com, 1
 ingalabs.hu, 1
 ingalls.run, 1
 ingatlanjogaszok.hu, 1
 ingatlanneked.hu, 1
 ingatlanrobot.hu, 1
 ingber.com, 1
@@ -22800,16 +22948,17 @@ isaaczais.com, 1
 isabelaflores.com, 1
 isabellavandijk.nl, 1
 isabelle-delpech.com, 1
 isabellehogarth.co.uk, 1
 isakssons.com, 1
 isamiok.com, 1
 isara.com, 1
 isarklinikum.de, 1
+isaropiping.fr, 1
 isastylish.com, 1
 isavings.com, 1
 isayoga.de, 1
 isbaseballstillon.com, 1
 isbc-telecom.ru, 1
 isbengrumpy.com, 1
 isc2chapter-cny.org, 1
 iscert.org, 1
@@ -22845,17 +22994,16 @@ isitrest.info, 1
 isitup.org, 1
 iskanderbroere.nl, 1
 iskaron.de, 1
 iskaz.rs, 1
 iskkk.com, 1
 iskkk.net, 1
 iskogen.nu, 1
 islam.si, 1
-islamonline.net, 1
 islandhosting.com, 1
 islandlakeil.gov, 1
 islavolcan.cl, 1
 isletech.net, 1
 isliada.org, 1
 islief.com, 1
 islykaithecutest.cf, 1
 islykaithecutest.ml, 1
@@ -22997,17 +23145,16 @@ itforge.nl, 1
 itgirls.rs, 1
 ithakama.com, 1
 ithakama.cz, 1
 ithenrik.com, 1
 ithinc.net, 1
 ithink.cf, 1
 ithjalpforetag.se, 1
 itikon.com, 1
-itilo.de, 1
 itinthebubble.com, 1
 itis.gov, 1
 itis4u.ch, 1
 itisjustnot.cricket, 1
 itjob.ma, 1
 itkaufmann.at, 1
 itkonsultstockholm.se, 1
 itlitera.com, 1
@@ -23074,17 +23221,16 @@ ivanboi.com, 1
 ivancacic.com, 0
 ivanilla.org, 1
 ivanmeade.com, 1
 ivanpolchenko.com, 1
 ivaoru.org, 1
 ivfausland.de, 1
 ivfmeds.com, 1
 ivi.com.ar, 0
-ivi.es, 0
 ivi.mx, 0
 ivig.com.br, 1
 ivinet.cl, 0
 ivo.co.za, 1
 ivopetkov.com, 1
 ivor.io, 1
 ivor.is, 1
 ivorvanhese.com, 1
@@ -23132,16 +23278,17 @@ ixquick.de, 1
 ixquick.eu, 1
 ixquick.fr, 1
 ixquick.info, 1
 ixquick.nl, 1
 iyassu.com, 1
 iyinolaashafa.com, 1
 iyn.me, 1
 iyouewo.com, 1
+iyoumu.top, 1
 iyuanbao.net, 1
 iz8mbw.net, 1
 izaakbeekman.com, 1
 izanah.com, 1
 izevg.ru, 1
 izhaojie.com, 1
 izodiacsigns.com, 1
 izuba.info, 1
@@ -23167,16 +23314,17 @@ j5lx.eu, 1
 j5lx.io, 1
 ja-dyck.de, 1
 ja-gps.com.au, 1
 jaakkohannikainen.fi, 1
 jaarvistech.com, 1
 jaaxypro.com, 1
 jaba.hosting, 1
 jababu.cz, 1
+jabba.homelinux.org, 1
 jabbari.io, 1
 jabbas.eu, 1
 jabber.at, 1
 jabberfr.org, 1
 jabbers.one, 1
 jabberzac.org, 1
 jaberg-rutschi.ch, 1
 jabergrutschi.ch, 1
@@ -23229,32 +23377,33 @@ jahanaisamu.com, 1
 jahmusic.net, 1
 jahner.xyz, 1
 jahofmann.de, 0
 jailbreakingisnotacrime.org, 1
 jaimechanaga.com, 1
 jaion.ml, 1
 jaion.tech, 1
 jaion.xyz, 1
-jaispirit.com, 0
+jaispirit.com, 1
 jaitnetworking.com, 0
 jajsemjachym.cz, 1
 jak-na-les.cz, 1
 jakarta.dating, 1
 jakdelatseo.cz, 1
 jake.eu.org, 1
 jake.ml, 1
 jake.nom.za, 1
 jakebeardsley.com, 1
 jakecurtis.de, 1
 jakenbake.com, 1
 jakereynolds.co, 1
 jakerullman.com, 1
 jakeslab.tech, 1
 jaketremper.com, 1
+jakewalker.xyz, 1
 jakewestrip.com, 1
 jakincode.army, 1
 jakob-server.tk, 1
 jakobejitblokaci.cz, 1
 jakobkrigovsky.com, 1
 jakobssystems.net, 1
 jakpremyslet.cz, 1
 jaksch.biz, 1
@@ -23468,16 +23617,17 @@ jd-group.co.uk, 1
 jd1.de, 1
 jdassets.com, 1
 jdc.io, 1
 jdcdirectsales.com, 1
 jdcdirectsales.com.ph, 1
 jdcgroup.com.ph, 1
 jdegbau.com, 1
 jdheysupplies.co.uk, 1
+jdieselmusic.com, 1
 jdjohnsonmedia.com, 1
 jdjohnsonwaterproofing.com, 1
 jdm.elk.pl, 1
 jdm.pl, 1
 jdncr.com, 1
 jdoi.pw, 1
 jdoiron.me, 1
 jdpleisure.co.uk, 1
@@ -23641,17 +23791,16 @@ jgwb.de, 1
 jgwb.eu, 1
 jhalderm.com, 1
 jhaveri.net, 1
 jhburton.co.uk, 1
 jhcommunitysports.co.uk, 1
 jhe.li, 1
 jhermsmeier.de, 1
 jhf.io, 1
-jhill.de, 1
 jhollandtranslations.com, 1
 jhservicos.net.br, 1
 jhuang.me, 1
 jhwestover.com, 1
 jiacl.com, 1
 jiahao.codes, 1
 jialinwu.com, 0
 jiangxu.site, 1
@@ -23708,27 +23857,25 @@ jisha.site, 1
 jixun.moe, 1
 jiyue.com, 1
 jiyue.moe, 1
 jiyusu.com, 1
 jiyuu-ni.com, 1
 jiyuu-ni.net, 1
 jjhampton.com, 1
 jjj.blog, 1
-jjjconnection.com, 1
 jjlvk.nl, 1
 jjmarketing.co.uk, 1
 jjspartyhire.co.uk, 1
 jjspartytime.co.uk, 1
 jjsummerboatparty.co.uk, 1
 jjvanoorschot.nl, 1
 jk-entertainment.biz, 1
 jkchocolate.com, 1
 jkest.cc, 1
-jki.io, 1
 jkinteriorspa.com, 1
 jkirsche.com, 1
 jkng.eu, 1
 jkrippen.com, 1
 jkyuan.tk, 1
 jl-dns.eu, 1
 jl-dns.nl, 1
 jl-exchange.nl, 1
@@ -23806,16 +23953,17 @@ jodaniels.photography, 1
 jodbush.com, 1
 jodlajodla.si, 1
 joduska.me, 1
 jodyboucher.com, 0
 joe262.com, 1
 joearodriguez.com, 1
 joecod.es, 1
 joedavison.me, 1
+joedinardo.com, 1
 joedoyle.us, 1
 joedroll.com, 1
 joefixit.co, 1
 joefixit.co.uk, 1
 joehenry.co.uk, 1
 joejohnson.name, 1
 joel.coffee, 1
 joelcoustrain.com, 1
@@ -23830,16 +23978,17 @@ joelmarkhamphotography.com.au, 1
 joelmunch.com, 1
 joelnichols.uk, 1
 joelotu.com, 1
 joemotherfuckingjohnson.com, 1
 joepitt.co.uk, 0
 joergschneider.com, 1
 joerosca.com, 1
 joerss.at, 1
+joeseago.com, 1
 joeskup.com, 1
 joesniderman.com, 1
 joespaintingpgh.com, 1
 joestead.codes, 0
 joetsutj.com, 1
 joetyson.io, 1
 joetyson.me, 1
 joeyfelix.com, 1
@@ -23919,16 +24068,17 @@ jolokia.ch, 1
 jomo.tv, 1
 jomofojo.co, 1
 jomofojo.com, 1
 jonahperez.com, 1
 jonale.net, 1
 jonandnoraswedding.com, 1
 jonas-thelemann.de, 1
 jonas-wenk.de, 0
+jonas.me, 1
 jonaskjodt.com, 1
 jonasled.de, 1
 jonaswitmer.ch, 1
 jonathan-apps.com, 1
 jonathancarter.org, 1
 jonathandupree.com, 1
 jonathanha.as, 1
 jonathanj.nl, 1
@@ -24009,16 +24159,17 @@ josephsniderman.com, 1
 josephsniderman.net, 1
 josephsniderman.org, 1
 josephv.website, 1
 josericaurte.com, 1
 joshgilson.com, 1
 joshgrancell.com, 1
 joshharkema.com, 1
 joshharmon.me, 1
+joshhoffer.com, 1
 joshics.in, 1
 joshlovephotography.co.uk, 1
 joshpanter.com, 0
 joshrickert.com, 1
 joshruppe.com, 1
 joshschmelzle.com, 1
 joshtriplett.org, 1
 joshua-kuepper.de, 1
@@ -24090,16 +24241,17 @@ jsent.co.uk, 1
 jsevilleja.org, 1
 jsjyhzy.cc, 1
 jskier.com, 0
 jskoelliken.ch, 1
 jsmetallerie.fr, 1
 jsnfwlr.com, 1
 jsnfwlr.io, 1
 jsonsinc.com, 1
+jss.moe, 1
 jsteward.moe, 1
 jstore.ch, 1
 jsvr.tk, 0
 jsxc.ch, 1
 jtcat.com, 1
 jtcjewelry.com, 1
 jtconsultancy.sg, 1
 jthackery.com, 0
@@ -24230,17 +24382,16 @@ jurassicbarkharrogate.co.uk, 1
 jurassicgolf.nl, 1
 juridoc.com.br, 1
 jurko.cz, 1
 jurriaan.ninja, 1
 jusos-goettingen.de, 1
 just-a-clanpage.de, 1
 just-pools.co.za, 1
 just-vet-and-drive.fr, 1
-just-webdesign-berlin.de, 1
 justanothercompany.name, 1
 justbelieverecoverypa.com, 1
 justbookexcursions.com, 1
 justbookhotels.com, 1
 justbooktransfers.com, 1
 justboom.co, 1
 justbouncecastles.co.uk, 1
 justchunks.net, 1
@@ -24290,33 +24441,36 @@ jwnotifier.org, 1
 jwod.gov, 1
 jwolt-lx.com, 1
 jwplay.ml, 1
 jwpoore.com, 1
 jwschuepfheim.ch, 1
 jwsoft.nl, 1
 jwz.org, 1
 jxir.de, 1
+jxkangyifu.com, 1
 jxltom.com, 1
 jxm.in, 1
 jydemarked.dk, 1
 jyggen.com, 1
 jym.fit, 1
 jyoti-fairworks.org, 1
+jz585.com, 1
 jzbk.org, 1
 jzcapital.co, 1
 k-bone.com, 1
 k-homes.net, 1
 k-netz.de, 1
 k-pan.com, 1
 k-plant.com, 1
 k-pture.com, 1
 k-system.de, 1
 k-tube.com, 1
 k1024.org, 1
+k1yoshi.com, 1
 k258059.net, 1
 k2mts.org, 1
 k33k00.com, 0
 k3508.com, 1
 k3nny.fr, 1
 k4law.com, 1
 k4r.ru, 1
 k7azx.com, 1
@@ -24394,16 +24548,17 @@ kall.is, 1
 kallies-net.de, 1
 kalmar.com, 1
 kaloix.de, 1
 kalolina.com, 1
 kalombo.ru, 1
 kalsbouncies.com, 1
 kaltenbrunner.it, 1
 kalterersee.ch, 1
+kalugadeti.ru, 1
 kalwestelectric.com, 1
 kalyanmatka.guru, 1
 kam-serwis.pl, 1
 kamalame.co, 1
 kamata-shinkyu-seikotsu.jp, 1
 kameari-za.space, 1
 kamen-master.ru, 1
 kamikaichimaru.com, 0
@@ -24592,16 +24747,17 @@ kay.la, 1
 kayakabovegroundswimmingpools.com, 1
 kaydan.io, 1
 kayipmurekkep.com, 1
 kayleen.net, 1
 kaylyn.ink, 0
 kayo.digital, 1
 kayon.cf, 1
 kayscs.com, 1
+kaysis.gov.tr, 0
 kazakov.lt, 1
 kazanasolutions.de, 1
 kazancci.com, 1
 kazand.lt, 1
 kazandaemon.ru, 1
 kazek.com.pl, 1
 kazekprzewozy.pl, 1
 kazu.click, 1
@@ -24683,16 +24839,17 @@ keithlomax.com, 1
 keithws.net, 1
 kejibot.com, 1
 keke-shop.ch, 1
 kekgame.com, 1
 kekku.li, 1
 keksi.io, 1
 kekz.org, 1
 kela.jp, 1
+kelantanmudah.com, 1
 keldan.fo, 1
 kelderwijnen.nl, 1
 kelgtermans-usedcars.be, 1
 kelheor.space, 1
 kellerlan.org, 1
 kelleymcchesney.us, 1
 kellimacconnell.com, 1
 kellyandantony.com, 1
@@ -24928,16 +25085,17 @@ kimmel.in, 1
 kimono-rental-one.com, 1
 kimoota.net, 0
 kimotodental.com, 1
 kimsufi-jordi.tk, 1
 kimtran.kim, 1
 kin.life, 1
 kin.pet, 1
 kinautas.com, 1
+kinderarzt-berlin-zia.de, 1
 kinderbasar-luhe.de, 1
 kinderchor-bayreuth.de, 1
 kinderjugendfreizeitverein.de, 1
 kinderkleding.news, 1
 kinderpneumologie.ch, 1
 kindertagespflege-rasselbande-halle.de, 1
 kinderzahn-bogenhausen.de, 1
 kindfotografie.nl, 1
@@ -25056,16 +25214,17 @@ kittmedia.com, 1
 kittpress.com, 1
 kittyhacker101.tk, 1
 kivitelezesbiztositas.hu, 1
 kiwi-bird.xyz, 1
 kiwi.com, 1
 kiwi.digital, 1
 kiwi.global, 1
 kiwi.wiki, 1
+kiwihub.org, 1
 kiwipayment.com, 1
 kiwipayments.com, 1
 kiwiplace.com, 1
 kix.moe, 1
 kiyotatsu.com, 1
 kizomba.info, 1
 kizzycode.de, 1
 kj-prince.com, 1
@@ -25098,16 +25257,17 @@ klamathrestoration.gov, 1
 klanggut.at, 1
 klapib.ee, 1
 klares-licht.de, 1
 klarika.com, 1
 klarmobil-empfehlen.de, 1
 klasfauseweh.de, 1
 klausbrinch.dk, 0
 klausen.dk, 1
+klautshop.com, 1
 klaver.it, 1
 klaw.xyz, 1
 klaxon.me, 1
 klcreations.co.uk, 1
 kle.cz, 1
 kleaning.by, 1
 klebeband.eu, 1
 kleberstoff.xyz, 1
@@ -25126,18 +25286,16 @@ kleinestrandburg-heringsdorf.de, 1
 kleinestrandburg-usedom.de, 1
 kleineviecherei.de, 1
 kleinfein.co, 1
 kleinholding.com, 1
 kleinreich.de, 1
 kleinserienproduktion.com, 1
 kleinsys.com, 1
 kleintransporte.net, 1
-klemkow.net, 1
-klemkow.org, 1
 kleppe.co, 1
 kleteckova.cz, 1
 klicke-gemeinsames.de, 1
 klickstdu.com, 1
 kliemann.me, 1
 klif1.nl, 1
 klimaloven.no, 1
 klimapartner.de, 1
@@ -25158,16 +25316,17 @@ kloia.com, 1
 klose.family, 1
 klosko.net, 1
 kloudboy.com, 1
 kls-agency.com.ua, 0
 klseet.com, 1
 klssn.com, 1
 klubxanadu.cz, 1
 kluck.me, 1
+klugemedia.de, 1
 klustermedia.com, 1
 klusweb-merenw