merge mozilla-central to mozilla-inbound. r=merge a=merge
authorSebastian Hengst <archaeopteryx@coole-files.de>
Sun, 15 Oct 2017 23:45:26 +0200
changeset 437070 414400dccb126eab4d8b66603535040771809a24
parent 437069 237acf2879f6222bc4b076c377bf026d18a6ebef (current diff)
parent 437059 2ba9ba4fa63b942d8d9401f6ff6e40f5730adcd1 (diff)
child 437071 994ea93958587c927e5daa729c9393056f655a9b
push id8114
push userjlorenzo@mozilla.com
push dateThu, 02 Nov 2017 16:33:21 +0000
treeherdermozilla-beta@73e0d89a540f [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge, merge
milestone58.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. r=merge a=merge
--- a/browser/tools/mozscreenshots/mozscreenshots/extension/configurations/AppMenu.jsm
+++ b/browser/tools/mozscreenshots/mozscreenshots/extension/configurations/AppMenu.jsm
@@ -11,32 +11,35 @@ const {classes: Cc, interfaces: Ci, util
 Cu.import("resource://gre/modules/Services.jsm");
 
 this.AppMenu = {
 
   init(libDir) {},
 
   configurations: {
     appMenuClosed: {
+      selectors: ["#appMenu-popup"],
       async applyConfig() {
         let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
         browserWindow.PanelUI.hide();
       },
     },
 
     appMenuMainView: {
+      selectors: ["#appMenu-popup"],
       applyConfig() {
         let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
         let promise = browserWindow.PanelUI.show();
         browserWindow.PanelUI.showMainView();
         return promise;
       },
     },
 
     appMenuHistorySubview: {
+      selectors: ["#appMenu-popup"],
       applyConfig() {
         // History has a footer
         if (isCustomizing()) {
           return Promise.reject("Can't show subviews while customizing");
         }
         let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
         let promise = browserWindow.PanelUI.show();
         return promise.then(() => {
@@ -44,16 +47,17 @@ this.AppMenu = {
           browserWindow.document.getElementById("history-panelmenu").click();
         });
       },
 
       verifyConfig: verifyConfigHelper,
     },
 
     appMenuHelpSubview: {
+      selectors: ["#appMenu-popup"],
       applyConfig() {
         if (isCustomizing()) {
           return Promise.reject("Can't show subviews while customizing");
         }
         let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
         let promise = browserWindow.PanelUI.show();
         return promise.then(() => {
           browserWindow.PanelUI.showMainView();
--- a/browser/tools/mozscreenshots/mozscreenshots/extension/configurations/Buttons.jsm
+++ b/browser/tools/mozscreenshots/mozscreenshots/extension/configurations/Buttons.jsm
@@ -14,42 +14,46 @@ Cu.import("resource://gre/modules/Servic
 this.Buttons = {
 
   init(libDir) {
     createWidget();
   },
 
   configurations: {
     navBarButtons: {
+      selectors: ["#nav-bar"],
       applyConfig: async () => {
         CustomizableUI.addWidgetToArea("screenshot-widget", CustomizableUI.AREA_NAVBAR);
       },
     },
 
     tabsToolbarButtons: {
+      selectors: ["#TabsToolbar"],
       applyConfig: async () => {
         CustomizableUI.addWidgetToArea("screenshot-widget", CustomizableUI.AREA_TABSTRIP);
       },
     },
 
     menuPanelButtons: {
+      selectors: ["#widget-overflow"],
       applyConfig: async () => {
-        CustomizableUI.addWidgetToArea("screenshot-widget", CustomizableUI.AREA_PANEL);
+        CustomizableUI.addWidgetToArea("screenshot-widget", CustomizableUI.AREA_FIXED_OVERFLOW_PANEL);
       },
 
       verifyConfig() {
         let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
         if (browserWindow.PanelUI.panel.state == "closed") {
           return Promise.reject("The button isn't shown when the panel isn't open.");
         }
         return Promise.resolve("menuPanelButtons.verifyConfig");
       },
     },
 
     custPaletteButtons: {
+      selectors: ["#customization-palette"],
       applyConfig: async () => {
         CustomizableUI.removeWidgetFromArea("screenshot-widget");
       },
 
       verifyConfig() {
         let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
         if (browserWindow.document.documentElement.getAttribute("customizing") != "true") {
           return Promise.reject("The button isn't shown when we're not in customize mode.");
--- a/browser/tools/mozscreenshots/mozscreenshots/extension/configurations/ControlCenter.jsm
+++ b/browser/tools/mozscreenshots/mozscreenshots/extension/configurations/ControlCenter.jsm
@@ -26,23 +26,25 @@ const MIXED_ACTIVE_CONTENT_URL = `https:
 const MIXED_PASSIVE_CONTENT_URL = `https://example.com/${RESOURCE_PATH}/mixed_passive.html`;
 const TRACKING_PAGE = `http://tracking.example.org/${RESOURCE_PATH}/tracking.html`;
 
 this.ControlCenter = {
   init(libDir) { },
 
   configurations: {
     about: {
+      selectors: ["#identity-popup"],
       async applyConfig() {
         await loadPage("about:home");
         await openIdentityPopup();
       },
     },
 
     localFile: {
+      selectors: ["#identity-popup"],
       async applyConfig() {
         let channel = NetUtil.newChannel({
             uri: "chrome://mozscreenshots/content/lib/mozscreenshots.html",
             loadUsingSystemPrincipal: true
         });
         channel = channel.QueryInterface(Ci.nsIFileChannel);
         let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
         let gBrowser = browserWindow.gBrowser;
@@ -52,167 +54,186 @@ this.ControlCenter = {
       },
 
       async verifyConfig() {
         return Promise.reject("Bug 1373563: intermittent controlCenter_localFile on Taskcluster");
       },
     },
 
     http: {
+      selectors: ["#identity-popup"],
       async applyConfig() {
         await loadPage(HTTP_PAGE);
         await openIdentityPopup();
       },
     },
 
     httpSubView: {
+      selectors: ["#identity-popup"],
       async applyConfig() {
         await loadPage(HTTP_PAGE);
         await openIdentityPopup(true);
       },
     },
 
     https: {
+      selectors: ["#identity-popup"],
       async applyConfig() {
         await loadPage(HTTPS_PAGE);
         await openIdentityPopup();
       },
     },
 
     httpsSubView: {
+      selectors: ["#identity-popup"],
       async applyConfig() {
         await loadPage(HTTPS_PAGE);
         await openIdentityPopup(true);
       },
     },
 
     singlePermission: {
+      selectors: ["#identity-popup"],
       async applyConfig() {
         let uri = Services.io.newURI(PERMISSIONS_PAGE);
         SitePermissions.set(uri, "camera", SitePermissions.ALLOW);
 
         await loadPage(PERMISSIONS_PAGE);
         await openIdentityPopup();
       },
     },
 
     allPermissions: {
+      selectors: ["#identity-popup"],
       async applyConfig() {
         // TODO: (Bug 1330601) Rewrite this to consider temporary (TAB) permission states.
         // There are 2 possible non-default permission states, so we alternate between them.
         let states = [SitePermissions.ALLOW, SitePermissions.BLOCK];
         let uri = Services.io.newURI(PERMISSIONS_PAGE);
         SitePermissions.listPermissions().forEach(function(permission, index) {
           SitePermissions.set(uri, permission, states[index % 2]);
         });
 
         await loadPage(PERMISSIONS_PAGE);
         await openIdentityPopup();
       },
     },
 
     mixed: {
+      selectors: ["#identity-popup"],
       async applyConfig() {
         await loadPage(MIXED_CONTENT_URL);
         await openIdentityPopup();
       },
     },
 
     mixedSubView: {
+      selectors: ["#identity-popup"],
       async applyConfig() {
         await loadPage(MIXED_CONTENT_URL);
         await openIdentityPopup(true);
       },
     },
 
     mixedPassive: {
+      selectors: ["#identity-popup"],
       async applyConfig() {
         await loadPage(MIXED_PASSIVE_CONTENT_URL);
         await openIdentityPopup();
       },
     },
 
     mixedPassiveSubView: {
+      selectors: ["#identity-popup"],
       async applyConfig() {
         await loadPage(MIXED_PASSIVE_CONTENT_URL);
         await openIdentityPopup(true);
       },
     },
 
     mixedActive: {
+      selectors: ["#identity-popup"],
       async applyConfig() {
         await loadPage(MIXED_ACTIVE_CONTENT_URL);
         await openIdentityPopup();
       },
     },
 
     mixedActiveSubView: {
+      selectors: ["#identity-popup"],
       async applyConfig() {
         await loadPage(MIXED_ACTIVE_CONTENT_URL);
         await openIdentityPopup(true);
       },
     },
 
     mixedActiveUnblocked: {
+      selectors: ["#identity-popup"],
       async applyConfig() {
         let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
         let gBrowser = browserWindow.gBrowser;
         await loadPage(MIXED_ACTIVE_CONTENT_URL);
         gBrowser.ownerGlobal.gIdentityHandler.disableMixedContentProtection();
         await BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser, false, MIXED_ACTIVE_CONTENT_URL);
         await openIdentityPopup();
       },
     },
 
     mixedActiveUnblockedSubView: {
+      selectors: ["#identity-popup"],
       async applyConfig() {
         let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
         let gBrowser = browserWindow.gBrowser;
         await loadPage(MIXED_ACTIVE_CONTENT_URL);
         gBrowser.ownerGlobal.gIdentityHandler.disableMixedContentProtection();
         await BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser, false, MIXED_ACTIVE_CONTENT_URL);
         await openIdentityPopup(true);
       },
     },
 
     httpPassword: {
+      selectors: ["#identity-popup"],
       async applyConfig() {
         await loadPage(HTTP_PASSWORD_PAGE);
         await openIdentityPopup();
       },
     },
 
     httpPasswordSubView: {
+      selectors: ["#identity-popup"],
       async applyConfig() {
         await loadPage(HTTP_PASSWORD_PAGE);
         await openIdentityPopup(true);
       },
     },
 
     trackingProtectionNoElements: {
+      selectors: ["#identity-popup"],
       async applyConfig() {
         Services.prefs.setBoolPref("privacy.trackingprotection.enabled", true);
 
         await loadPage(HTTP_PAGE);
         await openIdentityPopup();
       },
     },
 
     trackingProtectionEnabled: {
+      selectors: ["#identity-popup"],
       async applyConfig() {
         Services.prefs.setBoolPref("privacy.trackingprotection.enabled", true);
         Services.prefs.setIntPref("privacy.trackingprotection.introCount", 20);
         await UrlClassifierTestUtils.addTestTrackers();
 
         await loadPage(TRACKING_PAGE);
         await openIdentityPopup();
       },
     },
 
     trackingProtectionDisabled: {
+      selectors: ["#identity-popup"],
       async applyConfig() {
         let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
         let gBrowser = browserWindow.gBrowser;
         Services.prefs.setBoolPref("privacy.trackingprotection.enabled", true);
         Services.prefs.setIntPref("privacy.trackingprotection.introCount", 20);
         await UrlClassifierTestUtils.addTestTrackers();
 
         await loadPage(TRACKING_PAGE);
--- a/browser/tools/mozscreenshots/mozscreenshots/extension/configurations/CustomizeMode.jsm
+++ b/browser/tools/mozscreenshots/mozscreenshots/extension/configurations/CustomizeMode.jsm
@@ -12,16 +12,17 @@ Cu.import("resource://gre/modules/Servic
 Cu.import("resource://gre/modules/Timer.jsm");
 
 this.CustomizeMode = {
 
   init(libDir) {},
 
   configurations: {
     notCustomizing: {
+      selectors: ["#navigator-toolbox"],
       applyConfig() {
         return new Promise((resolve) => {
           let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
           if (!browserWindow.document.documentElement.hasAttribute("customizing")) {
             resolve("notCustomizing: already not customizing");
             return;
           }
           function onCustomizationEnds() {
@@ -33,16 +34,17 @@ this.CustomizeMode = {
           browserWindow.gNavToolbox.addEventListener("aftercustomization",
                                                      onCustomizationEnds);
           browserWindow.gCustomizeMode.exit();
         });
       },
     },
 
     customizing: {
+      selectors: ["#navigator-toolbox", "#customization-container"],
       applyConfig() {
         return new Promise((resolve) => {
           let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
           if (browserWindow.document.documentElement.hasAttribute("customizing")) {
             resolve("customizing: already customizing");
             return;
           }
           function onCustomizing() {
--- a/browser/tools/mozscreenshots/mozscreenshots/extension/configurations/DevTools.jsm
+++ b/browser/tools/mozscreenshots/mozscreenshots/extension/configurations/DevTools.jsm
@@ -23,36 +23,41 @@ function getTargetForSelectedTab() {
 
 this.DevTools = {
   init(libDir) {
     let panels = ["options", "webconsole", "jsdebugger", "styleeditor",
                   "performance", "netmonitor"];
 
     panels.forEach(panel => {
       this.configurations[panel] = {};
+      this.configurations[panel].selectors = ["#toolbox-container"];
       this.configurations[panel].applyConfig = async function() {
         await gDevTools.showToolbox(getTargetForSelectedTab(), panel, "bottom");
         await new Promise(resolve => setTimeout(resolve, 500));
       };
     });
   },
 
   configurations: {
     bottomToolbox: {
+      selectors: ["#toolbox-container"],
       async applyConfig() {
         await gDevTools.showToolbox(getTargetForSelectedTab(), "inspector", "bottom");
         await new Promise(resolve => setTimeout(resolve, 1000));
       },
     },
     sideToolbox: {
+      selectors: ["#toolbox-container"],
       async applyConfig() {
         await gDevTools.showToolbox(getTargetForSelectedTab(), "inspector", "side");
         await new Promise(resolve => setTimeout(resolve, 500));
       },
     },
     undockedToolbox: {
+      selectors: ["#toolbox-container"],
+      windowType: "devtools:toolbox",
       async applyConfig() {
         await gDevTools.showToolbox(getTargetForSelectedTab(), "inspector", "window");
         await new Promise(resolve => setTimeout(resolve, 500));
       },
     }
   },
 };
--- a/browser/tools/mozscreenshots/mozscreenshots/extension/configurations/LightweightThemes.jsm
+++ b/browser/tools/mozscreenshots/mozscreenshots/extension/configurations/LightweightThemes.jsm
@@ -22,22 +22,24 @@ this.LightweightThemes = {
     // convert -size 3000x200 canvas:#eee white_theme.png
     let whiteImage = libDir.clone();
     whiteImage.append("white_theme.png");
     this._whiteImageURL = Services.io.newFileURI(whiteImage).spec;
   },
 
   configurations: {
     noLWT: {
+      selectors: ["#navigator-toolbox"],
       async applyConfig() {
         LightweightThemeManager.currentTheme = null;
       },
     },
 
     darkLWT: {
+      selectors: ["#navigator-toolbox"],
       applyConfig() {
         LightweightThemeManager.setLocalTheme({
           id:          "black",
           name:        "black",
           headerURL:   LightweightThemes._blackImageURL,
           textcolor:   "#eeeeee",
           accentcolor: "#111111",
         });
@@ -47,16 +49,17 @@ this.LightweightThemes = {
           setTimeout(() => {
             resolve("darkLWT");
           }, 500);
         });
       },
     },
 
     lightLWT: {
+      selectors: ["#navigator-toolbox"],
       applyConfig() {
         LightweightThemeManager.setLocalTheme({
           id:          "white",
           name:        "white",
           headerURL:   LightweightThemes._whiteImageURL,
           textcolor:   "#111111",
           accentcolor: "#eeeeee",
         });
--- a/browser/tools/mozscreenshots/mozscreenshots/extension/configurations/PermissionPrompts.jsm
+++ b/browser/tools/mozscreenshots/mozscreenshots/extension/configurations/PermissionPrompts.jsm
@@ -23,81 +23,91 @@ this.PermissionPrompts = {
     Services.prefs.setCharPref("media.getusermedia.screensharing.allowed_domains",
                                "test1.example.com");
     Services.prefs.setBoolPref("extensions.install.requireBuiltInCerts", false);
     Services.prefs.setBoolPref("signon.rememberSignons", true);
   },
 
   configurations: {
     shareDevices: {
+      selectors: ["#notification-popup"],
       async applyConfig() {
         await closeLastTab();
         await clickOn("#webRTC-shareDevices");
       },
     },
 
     shareMicrophone: {
+      selectors: ["#notification-popup"],
       async applyConfig() {
         await closeLastTab();
         await clickOn("#webRTC-shareMicrophone");
       },
     },
 
     shareVideoAndMicrophone: {
+      selectors: ["#notification-popup"],
       async applyConfig() {
         await closeLastTab();
         await clickOn("#webRTC-shareDevices2");
       },
     },
 
     shareScreen: {
+      selectors: ["#notification-popup"],
       async applyConfig() {
         await closeLastTab();
         await clickOn("#webRTC-shareScreen");
       },
     },
 
     geo: {
+      selectors: ["#notification-popup"],
       async applyConfig() {
         await closeLastTab();
         await clickOn("#geo");
       },
     },
 
     persistentStorage: {
+      selectors: ["#notification-popup"],
       async applyConfig() {
         await closeLastTab();
         await clickOn("#persistent-storage");
       },
     },
 
     loginCapture: {
+      selectors: ["#notification-popup"],
       async applyConfig() {
         await closeLastTab();
         await clickOn("#login-capture");
       },
     },
 
     notifications: {
+      selectors: ["#notification-popup"],
       async applyConfig() {
         await closeLastTab();
         await clickOn("#web-notifications");
       },
     },
 
     addons: {
+      selectors: ["#notification-popup"],
       async applyConfig() {
         Services.prefs.setBoolPref("xpinstall.whitelist.required", true);
 
         await closeLastTab();
         await clickOn("#addons");
       },
     },
 
     addonsNoWhitelist: {
+      selectors: ["#notification-popup"],
       async applyConfig() {
         Services.prefs.setBoolPref("xpinstall.whitelist.required", false);
 
         let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
         let notification = browserWindow.document.getElementById("addon-install-confirmation-notification");
 
         await closeLastTab();
         await clickOn("#addons");
--- a/browser/tools/mozscreenshots/mozscreenshots/extension/configurations/Preferences.jsm
+++ b/browser/tools/mozscreenshots/mozscreenshots/extension/configurations/Preferences.jsm
@@ -30,16 +30,17 @@ this.Preferences = {
     ];
 
     for (let [primary, customFn] of panes) {
       let configName = primary.replace(/^pane/, "prefs");
       if (customFn) {
         configName += "-" + customFn.name;
       }
       this.configurations[configName] = {};
+      this.configurations[configName].selectors = ["#browser"];
       this.configurations[configName].applyConfig = prefHelper.bind(null, primary, customFn);
     }
   },
 
   configurations: {},
 };
 
 let prefHelper = async function(primary, customFn = null) {
--- a/browser/tools/mozscreenshots/mozscreenshots/extension/configurations/Tabs.jsm
+++ b/browser/tools/mozscreenshots/mozscreenshots/extension/configurations/Tabs.jsm
@@ -16,27 +16,29 @@ const DEFAULT_FAVICON_TAB = `data:text/h
 Cu.import("resource://gre/modules/Services.jsm");
 Cu.import("resource://gre/modules/Timer.jsm");
 
 this.Tabs = {
   init(libDir) {},
 
   configurations: {
     fiveTabs: {
+      selectors: ["#tabbrowser-tabs"],
       async applyConfig() {
         fiveTabsHelper();
         let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
         hoverTab(browserWindow.gBrowser.tabs[3]);
         await new Promise((resolve, reject) => {
           setTimeout(resolve, 3000);
         });
       },
     },
 
     fourPinned: {
+      selectors: ["#tabbrowser-tabs"],
       async applyConfig() {
         fiveTabsHelper();
         let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
         let tab = browserWindow.gBrowser.addTab(PREFS_TAB);
         browserWindow.gBrowser.pinTab(tab);
         tab = browserWindow.gBrowser.addTab(CUST_TAB);
         browserWindow.gBrowser.pinTab(tab);
         tab = browserWindow.gBrowser.addTab("about:privatebrowsing");
@@ -53,16 +55,17 @@ this.Tabs = {
                       setAttribute("beforehovered", true);
         await new Promise((resolve, reject) => {
           setTimeout(resolve, 3000);
         });
       },
     },
 
     twoPinnedWithOverflow: {
+      selectors: ["#tabbrowser-tabs"],
       async applyConfig() {
         fiveTabsHelper();
 
         let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
         browserWindow.gBrowser.loadTabs([
           PREFS_TAB,
           CUST_TAB,
           "about:home",
--- a/browser/tools/mozscreenshots/mozscreenshots/extension/configurations/TabsInTitlebar.jsm
+++ b/browser/tools/mozscreenshots/mozscreenshots/extension/configurations/TabsInTitlebar.jsm
@@ -13,25 +13,27 @@ const PREF_TABS_IN_TITLEBAR = "browser.t
 Cu.import("resource://gre/modules/Services.jsm");
 
 this.TabsInTitlebar = {
 
   init(libDir) {},
 
   configurations: {
     tabsInTitlebar: {
+      selectors: ["#navigator-toolbox"],
       async applyConfig() {
         if (Services.appinfo.OS == "Linux") {
           return Promise.reject("TabsInTitlebar isn't supported on Linux");
         }
         Services.prefs.setBoolPref(PREF_TABS_IN_TITLEBAR, true);
         return undefined;
       },
     },
 
     tabsOutsideTitlebar: {
+      selectors: ["#navigator-toolbox", "#titlebar"],
       async applyConfig() {
         Services.prefs.setBoolPref(PREF_TABS_IN_TITLEBAR, false);
       },
     },
 
   },
 };
--- a/browser/tools/mozscreenshots/mozscreenshots/extension/configurations/Toolbars.jsm
+++ b/browser/tools/mozscreenshots/mozscreenshots/extension/configurations/Toolbars.jsm
@@ -10,25 +10,27 @@ const {classes: Cc, interfaces: Ci, util
 
 Cu.import("resource://gre/modules/Services.jsm");
 
 this.Toolbars = {
   init(libDir) {},
 
   configurations: {
     onlyNavBar: {
+      selectors: ["#navigator-toolbox"],
       async applyConfig() {
         let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
         let personalToolbar = browserWindow.document.getElementById("PersonalToolbar");
         browserWindow.setToolbarVisibility(personalToolbar, false);
         toggleMenubarIfNecessary(false);
       },
     },
 
     allToolbars: {
+      selectors: ["#navigator-toolbox"],
       async applyConfig() { // Boookmarks and menubar
         let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
         let personalToolbar = browserWindow.document.getElementById("PersonalToolbar");
         browserWindow.setToolbarVisibility(personalToolbar, true);
         toggleMenubarIfNecessary(true);
       },
 
       async verifyConfig() {
--- a/browser/tools/mozscreenshots/mozscreenshots/extension/configurations/WindowSize.jsm
+++ b/browser/tools/mozscreenshots/mozscreenshots/extension/configurations/WindowSize.jsm
@@ -15,43 +15,46 @@ Cu.import("resource://testing-common/Bro
 this.WindowSize = {
 
   init(libDir) {
     Services.prefs.setBoolPref("browser.fullscreen.autohide", false);
   },
 
   configurations: {
     maximized: {
+      selectors: [":root"],
       async applyConfig() {
         let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
         await toggleFullScreen(browserWindow, false);
 
         // Wait for the Lion fullscreen transition to end as there doesn't seem to be an event
         // and trying to maximize while still leaving fullscreen doesn't work.
         await new Promise((resolve, reject) => {
           setTimeout(function waitToLeaveFS() {
             browserWindow.maximize();
             resolve();
           }, 5000);
         });
       },
     },
 
     normal: {
+      selectors: [":root"],
       async applyConfig() {
         let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
         await toggleFullScreen(browserWindow, false);
         browserWindow.restore();
         await new Promise((resolve, reject) => {
           setTimeout(resolve, 5000);
         });
       },
     },
 
     fullScreen: {
+      selectors: [":root"],
       async applyConfig() {
         let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
         await toggleFullScreen(browserWindow, true);
         // OS X Lion fullscreen transition takes a while
         await new Promise((resolve, reject) => {
           setTimeout(resolve, 5000);
         });
       },
--- a/layout/generic/nsFrame.cpp
+++ b/layout/generic/nsFrame.cpp
@@ -1360,17 +1360,23 @@ nsIFrame::HasOpacityInternal(float aThre
   MOZ_ASSERT(0.0 <= aThreshold && aThreshold <= 1.0, "Invalid argument");
   if (StyleEffects()->mOpacity < aThreshold ||
       (StyleDisplay()->mWillChangeBitField & NS_STYLE_WILL_CHANGE_OPACITY)) {
     return true;
   }
 
   EffectSet* effects =
     aEffectSet ? aEffectSet : EffectSet::GetEffectSet(this);
-  return (IsPrimaryFrame() &&
+  if (!effects) {
+    return false;
+  }
+
+  return ((IsPrimaryFrame() ||
+           nsLayoutUtils::FirstContinuationOrIBSplitSibling(this)->
+             IsPrimaryFrame()) &&
           nsLayoutUtils::HasAnimationOfProperty(effects, eCSSProperty_opacity));
 }
 
 bool
 nsIFrame::IsSVGTransformed(gfx::Matrix *aOwnTransforms,
                            gfx::Matrix *aFromParentTransforms) const
 {
   return false;
new file mode 100644
--- /dev/null
+++ b/layout/reftests/css-animations/continuation-opacity-ref.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<title>Multiline inline animated opacity test</title>
+<style>
+blink {
+  opacity: 0;
+}
+
+p {
+  max-width: 15em;
+}
+</style>
+<p>
+  <blink>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</blink>
+</p>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/css-animations/continuation-opacity.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html class="reftest-wait reftest-no-flush">
+<title>Multiline inline animated opacity test</title>
+<style>
+@keyframes blink {
+  from { opacity: 0; }
+  to { opacity: 1; }
+}
+
+blink {
+  animation: blink 100s step-end reverse;
+}
+
+p {
+  max-width: 15em;
+}
+</style>
+<p>
+  <blink>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</blink>
+</p>
+<script>
+document.addEventListener('MozReftestInvalidate', () => {
+  requestAnimationFrame(() => {
+    requestAnimationFrame(() => {
+      document.documentElement.classList.remove('reftest-wait');
+    });
+  });
+}, false);
+</script>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/css-animations/ib-split-sibling-opacity-ref.html
@@ -0,0 +1,3 @@
+<!DOCTYPE html>
+<title>Opacity animation on ib-split-sibling</title>
+<span style="visibility:hidden;">A <span style="display:block;visibility:visible">B</span> C</span>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/css-animations/ib-split-sibling-opacity.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html class="reftest-wait reftest-no-flush">
+<title>Opacity animation on ib-split-sibling</title>
+<style>
+@keyframes anim {
+  from { opacity: 0; }
+  to { opacity: 1; }
+}
+</style>
+<span id="animating">A <span style="display:block"></span> C</span>
+<script>
+window.addEventListener("load", () => {
+  animating.style.animation = 'anim 100s step-end reverse';
+  window.addEventListener("MozAfterPaint", () => {
+    requestAnimationFrame(() => {
+      document.documentElement.classList.remove('reftest-wait');
+    });
+  }, {once: true});
+});
+</script>
--- a/layout/reftests/css-animations/reftest.list
+++ b/layout/reftests/css-animations/reftest.list
@@ -56,8 +56,11 @@ fails-if(layerChecksEnabled) == backgrou
 == updating-animation-on-pseudo-element.html updating-animation-on-pseudo-element-ref.html
 == content-on-pseudo-element-at-beginning.html content-on-pseudo-element-ref.html
 == content-on-pseudo-element-at-half.html content-on-pseudo-element-ref.html
 == reframe-and-animation-starts-at-the-same-time.html reframe-and-animation-starts-at-the-same-time-ref.html
 == change-animation-name-to-none-in-rule.html change-animation-name-in-rule-ref.html
 == change-animation-name-to-other-in-rule.html change-animation-name-in-rule-ref.html
 == change-animation-name-to-non-existent-in-rule.html change-animation-name-in-rule-ref.html
 == no-style-sharing-with-animations.html no-style-sharing-with-animations-ref.html
+
+== continuation-opacity.html continuation-opacity-ref.html
+== ib-split-sibling-opacity.html about:blank
--- a/netwerk/protocol/ftp/FTPChannelParent.cpp
+++ b/netwerk/protocol/ftp/FTPChannelParent.cpp
@@ -479,18 +479,17 @@ FTPChannelParent::OnStartRequest(nsIRequ
 
   PRTime lastModified = 0;
   nsCOMPtr<nsIFTPChannel> ftpChan = do_QueryInterface(aRequest);
   if (ftpChan) {
     ftpChan->GetLastModifiedTime(&lastModified);
   }
   nsCOMPtr<nsIHttpChannelInternal> httpChan = do_QueryInterface(aRequest);
   if (httpChan) {
-    DebugOnly<nsresult> rv = httpChan->GetLastModifiedTime(&lastModified);
-    MOZ_ASSERT(NS_SUCCEEDED(rv));
+    Unused << httpChan->GetLastModifiedTime(&lastModified);
   }
 
   URIParams uriparam;
   nsCOMPtr<nsIURI> uri;
   chan->GetURI(getter_AddRefs(uri));
   SerializeURI(uri, uriparam);
 
   if (mIPCClosed || !SendOnStartRequest(mStatus, contentLength, contentType,
new file mode 100644
--- /dev/null
+++ b/netwerk/test/crashtests/1399467-1.html
@@ -0,0 +1,1 @@
+<script src='ftp:%'>
--- a/netwerk/test/crashtests/crashtests.list
+++ b/netwerk/test/crashtests/crashtests.list
@@ -1,4 +1,5 @@
 load 785753-1.html
 load 785753-2.html
 load 1274044-1.html
 skip-if(Android) pref(privacy.firstparty.isolate,true) load 1334468-1.html
+load 1399467-1.html
--- a/security/manager/ssl/StaticHPKPins.h
+++ b/security/manager/ssl/StaticHPKPins.h
@@ -1153,9 +1153,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 = 480;
 
 static const int32_t kUnknownId = -1;
 
-static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1516514192347000);
+static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1516555936123000);
--- a/security/manager/ssl/nsSTSPreloadList.errors
+++ b/security/manager/ssl/nsSTSPreloadList.errors
@@ -1,100 +1,97 @@
 0day.su: could not connect to host
 0i0.nl: could not connect to host
 0xaa55.me: could not connect to host
 360live.fr: could not connect to host
 47tech.com: could not connect to host
 4d2.xyz: could not connect to host
 4loc.us: could not connect to host
-4winds.pt: could not connect to host
 4x4.lk: could not connect to host
 68277.me: could not connect to host
 724go.com: could not connect to host
+7trade8.com: could not connect to host
 8560.be: could not connect to host
 87577.com: could not connect to host
 8887999.com: could not connect to host
 8ack.de: could not connect to host
 8t88.biz: could not connect to host
 91-freedom.com: could not connect to host
+9ss6.com: could not connect to host
 abolition.co: could not connect to host
 accwing.com: could not connect to host
 acrossgw.com: could not connect to host
 aerotheque.fr: could not connect to host
 aevpn.org: could not connect to host
 agowa.eu: could not connect to host
 agowa338.de: could not connect to host
 aivd.lol: could not connect to host
 akiba-server.info: could not connect to host
 akoww.de: could not connect to host
 akul.co.in: could not connect to host
 alexmol.tk: could not connect to host
 alrait.com: could not connect to host
 altahrim.net: could not connect to host
+ameho.me: could not connect to host
 amua.fr: could not connect to host
 anoneko.com: could not connect to host
 arent.kz: could not connect to host
 arksan.com.tr: could not connect to host
 artisense.de: could not connect to host
 askmagicconch.com: could not connect to host
 assdecoeur.org: could not connect to host
+asta-bar.de: could not connect to host
 astral.gq: could not connect to host
 autostop-occasions.be: could not connect to host
+auvernet.org: could not connect to host
 avi9526.pp.ua: could not connect to host
-aviv.nyc: could not connect to host
 awan.tech: could not connect to host
 awf0.xyz: could not connect to host
-axrec.de: could not connect to host
 azabani.com: could not connect to host
 baitulongbaycruises.com: could not connect to host
 balonmano.co: could not connect to host
 bbdos.ru: could not connect to host
+bbimarketing.com: could not connect to host
 beasel.biz: could not connect to host
 bellavistaoutdoor.com: could not connect to host
 bencorby.com: could not connect to host
 benjamin-horvath.com: could not connect to host
 berna.fr: could not connect to host
-billaud.eu.org: could not connect to host
 bip.gov.sa: could not connect to host
 blumen-garage.de: could not connect to host
 blumiges-fischbachtal.de: could not connect to host
-bmros.com.ar: could not connect to host
 bodrumfarm.com: could not connect to host
 bowlsheet.com: could not connect to host
-brecknell.biz: could not connect to host
-brecknell.com: could not connect to host
 brettabel.com: could not connect to host
-btcycle.org: could not connect to host
 businessfurs.info: could not connect to host
 buyshoe.org: could not connect to host
 by1898.com: could not connect to host
 cais.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 119"  data: no]
 cajio.ru: could not connect to host
 cake-time.co.uk: could not connect to host
 calculatoaresecondhand.xyz: could not connect to host
 callabs.net: could not connect to host
 cannarobotics.com: could not connect to host
 capekeen.com: could not connect to host
-capellidipremoli.com: could not connect to host
 carloshmm.stream: could not connect to host
 casperpanel.com: could not connect to host
 catsmagic.pp.ua: could not connect to host
-cbdev.de: could not connect to host
 ceml.ch: could not connect to host
 centos.pub: could not connect to host
 challengeskins.com: could not connect to host
 charr.xyz: could not connect to host
 charuru.moe: could not connect to host
 checkmateshoes.com: could not connect to host
 childrendeservebetter.org: could not connect to host
+chimeratool.com: could not connect to host
 china-line.org: could not connect to host
 chloehorler.com: could not connect to host
 chonghe.org: could not connect to host
+christiangaetano.com: could not connect to host
 christina-quast.de: could not connect to host
-chua.family: could not connect to host
 cielly.com: could not connect to host
 clearviewwealthprojector.com.au: could not connect to host
 closelinksecurity.co.uk: could not connect to host
 cloudbleed.info: could not connect to host
 cmacacias.ch: could not connect to host
 cmcressy.ch: could not connect to host
 cmlachapelle.ch: could not connect to host
 cmlancy.ch: could not connect to host
@@ -114,67 +111,71 @@ crapouill.es: could not connect to host
 creative-wave.fr: could not connect to host
 crescent.gr.jp: could not connect to host
 crestasantos.com: could not connect to host
 criticalaim.com: could not connect to host
 cryptopartyutah.org: could not connect to host
 cselzer.com: could not connect to host
 csgo77.com: could not connect to host
 cuentasmutualamr.org.ar: could not connect to host
-cyber-computer.club: could not connect to host
 cyber-konzept.de: could not connect to host
 cypherpunk.ws: could not connect to host
 d-bood.site: could not connect to host
 dahlberg.cologne: could not connect to host
 dannyrohde.de: could not connect to host
 dataprotectionadvisors.com: could not connect to host
 datorb.com: could not connect to host
 dawnsonb.com: could not connect to host
+dcc.moe: could not connect to host
 dclaisse.fr: could not connect to host
 de-servers.de: could not connect to host
+decoboutique.com: could not connect to host
 decoyrouting.com: could not connect to host
 derchris.me: could not connect to host
 derivativeshub.pro: could not connect to host
 derrickemery.com: could not connect to host
 dev-talk.eu: could not connect to host
+devkid.net: could not connect to host
 devops.moe: could not connect to host
 diagnocentro.cl: could not connect to host
 dick.red: could not connect to host
 digioccumss.ddns.net: could not connect to host
 digitalcloud.ovh: could not connect to host
 dijks.com: could not connect to host
 dingcc.org: could not connect to host
 dingcc.xyz: could not connect to host
 disadattamentolavorativo.it: could not connect to host
 disco-crazy-world.de: could not connect to host
 djangogolf.com: could not connect to host
-dkravchenko.su: could not connect to host
 dlld.com: could not connect to host
 dredgepress.com: could not connect to host
 dreizwosechs.de: could not connect to host
 drkmtrx.xyz: could not connect to host
 droomhuis-in-zuid-holland-kopen.nl: could not connect to host
 duch.cloud: could not connect to host
 duelsow.eu: could not connect to host
 duo.money: could not connect to host
 dynts.pro: could not connect to host
 edit.yahoo.com: could not connect to host
 educatoys.com.br: could not connect to host
 eeb98.com: could not connect to host
 egg-ortho.ch: could not connect to host
 ehuber.info: could not connect to host
 endlessdiy.ca: could not connect to host
+enginx.net: could not connect to host
 erinaceinae.com: could not connect to host
+esibun.net: could not connect to host
 estan.cn: could not connect to host
 eurostrategy.vn.ua: could not connect to host
+eveshaiwu.com: could not connect to host
 exceed.global: could not connect to host
 expatads.com: could not connect to host
-exploit.cz: could not connect to host
 ezhik-din.ru: could not connect to host
 farm24.co.uk: could not connect to host
+fc.media: could not connect to host
 filhomes.ph: could not connect to host
 firebaseio.com: could not connect to host
 firexarxa.de: could not connect to host
 first-time-offender.com: could not connect to host
 fixate.ru: could not connect to host
 fixmyglitch.com: could not connect to host
 flagshop.jp: could not connect to host
 fmapplication.com: could not connect to host
@@ -189,17 +190,19 @@ fsf.moe: could not connect to host
 fukuko.biz: could not connect to host
 fukuko.xyz: could not connect to host
 funfunmstdn.tokyo: could not connect to host
 funideas.org: could not connect to host
 funksteckdosen24.de: could not connect to host
 fyol.pw: could not connect to host
 g4w.co: could not connect to host
 gam3rs.de: could not connect to host
+ganhonet.com.br: could not connect to host
 gasbarkenora.com: could not connect to host
+gasnews.net: could not connect to host
 gautham.it: could not connect to host
 gautham.pro: could not connect to host
 gayforgenji.com: could not connect to host
 gaygeeks.de: could not connect to host
 gchq.wtf: could not connect to host
 gdhzcgs.com: could not connect to host
 geeks.berlin: could not connect to host
 geneve.guide: could not connect to host
@@ -220,57 +223,58 @@ gritte.net: could not connect to host
 gtdgo.com: could not connect to host
 gvt2.com: could not connect to host
 gvt3.com: could not connect to host
 heijblok.com: could not connect to host
 hejahanif.se: could not connect to host
 helsingfors.guide: could not connect to host
 here.ml: could not connect to host
 hg881.com: could not connect to host
+hloe0xff.ru: could not connect to host
 hoodoo.io: could not connect to host
 hoodoo.tech: could not connect to host
 hundter.com: could not connect to host
 ictinforensics.org: could not connect to host
 idexxpublicationportal.com: could not connect to host
 ifxnet.com: could not connect to host
 ileat.com: could not connect to host
 imrejonk.nl: could not connect to host
 industreiler.com: could not connect to host
 industreiler.com.br: could not connect to host
 inexpensivecomputers.net: could not connect to host
-injust.me: could not connect to host
 installgentoo.net: could not connect to host
 integraelchen.de: could not connect to host
-ipty.de: could not connect to host
 ipv6.watch: could not connect to host
 islief.com: could not connect to host
 issuesofconcern.in: could not connect to host
 itochan.jp: could not connect to host
-its-future.com: could not connect to host
 ixio.cz: could not connect to host
+jardins-utopie.net: could not connect to host
 jaredfraser.com: could not connect to host
 javascriptlab.fr: could not connect to host
 jeffreymagee.com: could not connect to host
 jhburton.co.uk: could not connect to host
 jie.dance: could not connect to host
 johnblackbourn.com: could not connect to host
+jonathansanchez.pro: could not connect to host
 jonpads.com: could not connect to host
 jstelecom.com.br: could not connect to host
 just-pools.co.za: could not connect to host
 justmy.website: could not connect to host
 k-wallet.com: could not connect to host
+kabus.org: could not connect to host
 kamikaichimaru.com: could not connect to host
 kapo.info: could not connect to host
 karanlyons.com: could not connect to host
 kayleen.net: could not connect to host
 kenrogers.co: could not connect to host
 kenvix.com: could not connect to host
-kevinmeijer.nl: could not connect to host
 kieranweightman.me: could not connect to host
 kinepolis-studio.ga: could not connect to host
+kingdomcrc.org: could not connect to host
 knownsec.cf: could not connect to host
 kollawat.me: could not connect to host
 kousaku.jp: could not connect to host
 kozmik.co: could not connect to host
 kteen.info: could not connect to host
 lacasa.fr: could not connect to host
 lachawoj.de: could not connect to host
 lathamlabs.com: could not connect to host
@@ -291,57 +295,52 @@ livrariacoad.com.br: could not connect t
 loancompare.co.za: could not connect to host
 lobosdomain.no-ip.info: could not connect to host
 logcat.info: could not connect to host
 logimagine.com: could not connect to host
 lovelytimes.net: could not connect to host
 luav.org: could not connect to host
 luenwarneke.com: could not connect to host
 lunix.io: could not connect to host
-lustin.fr: could not connect to host
 maartenterpstra.xyz: could not connect to host
 macedopesca.com.br: could not connect to host
 mail4geek.com: could not connect to host
+manjaro.ru: could not connect to host
 mare92.cz: could not connect to host
 markprof.ru: could not connect to host
 markus-ullmann.de: could not connect to host
 martin-mattel.com: could not connect to host
 martinrogalla.com: could not connect to host
 mastd.me: could not connect to host
 mc-team.org: could not connect to host
 mcdanieldevelopmentservices.com: could not connect to host
 mcea-hld.jp: could not connect to host
 mchopkins.net: could not connect to host
 meanevo.com: could not connect to host
 metachris.com: could not connect to host
 mingy.ddns.net: could not connect to host
 modded-minecraft-server-list.com: could not connect to host
+modernapprenticeships.org: could not connect to host
 moe-max.jp: could not connect to host
-moevenpick-cafe.com: could not connect to host
 mosaique-lachenaie.fr: could not connect to host
 moskva.guide: could not connect to host
 mowalls.net: could not connect to host
 mrliu.me: could not connect to host
 ms-alternativ.de: could not connect to host
-mstdn.onl: could not connect to host
-muahahahaha.co.uk: could not connect to host
 muj-svet.cz: could not connect to host
 munduch.cz: could not connect to host
-my-pawnshop.com.ua: could not connect to host
-mybeautyjobs.de: could not connect to host
 narodsovety.ru: could not connect to host
 navdeep.ca: could not connect to host
 ncdesigns-studio.com: could not connect to host
 nedcf.org.uk: could not connect to host
 negai.moe: could not connect to host
 netica.fr: could not connect to host
-nevolution.me: could not connect to host
+nexuscorporation.in: could not connect to host
 nikolasbradshaw.com: could not connect to host
 niva.synology.me: could not connect to host
-nkautoservice.nl: could not connect to host
 nkb.in.th: could not connect to host
 nnote.net: could not connect to host
 norrkemi.se: could not connect to host
 nostraspace.com: could not connect to host
 notesforpebble.com: could not connect to host
 nsa.lol: could not connect to host
 nsa.wtf: could not connect to host
 nsbfalconacademy.org: could not connect to host
@@ -357,165 +356,172 @@ oscsdp.cz: could not connect to host
 osterkraenzchen.de: could not connect to host
 oxygaming.com: could not connect to host
 oxymc.com: could not connect to host
 paragon.edu: could not connect to host
 pascalchristen.ch: could not connect to host
 pbytes.com: could not connect to host
 pe-bank.co.jp: could not connect to host
 pengisatelier.net: could not connect to host
+pennylane.me.uk: could not connect to host
 perkbrian.com: could not connect to host
 persjrp.ca: could not connect to host
 persoform.ch: could not connect to host
 philippa.cool: could not connect to host
 phra.gs: could not connect to host
 picallo.es: could not connect to host
 pkautodesign.com: could not connect to host
 pkov.cz: could not connect to host
 plaasprodukte.com: could not connect to host
 plussizereviews.com: could not connect to host
 pointagri.com: could not connect to host
 polit.im: could not connect to host
 poolinstallers.co.za: could not connect to host
 pouets.ovh: could not connect to host
-pro-netz.de: could not connect to host
+pozytywnyplan.pl: could not connect to host
 projectasterk.com: could not connect to host
 proxydesk.eu: could not connect to host
 proxyweb.us: could not connect to host
 pythia.nz: could not connect to host
 qoqo.us: could not connect to host
 qto.net: could not connect to host
 rainbin.com: could not connect to host
 real-compare.com: could not connect to host
 reignsphere.net: could not connect to host
 reinaertvandecruys.me: could not connect to host
 reykjavik.guide: could not connect to host
+rideaudiscount.com: could not connect to host
 rofrank.space: could not connect to host
 roguesignal.net: could not connect to host
 rolodato.com: could not connect to host
 roolevoi.ru: could not connect to host
 rubyist.today: could not connect to host
 s1mplescripts.de: could not connect to host
 saferedirectlink.com: could not connect to host
 sallysubs.com: could not connect to host
 sanatrans.com: could not connect to host
 sanchez.adv.br: could not connect to host
 sarndipity.com: could not connect to host
 securitymap.wiki: could not connect to host
 sellmoretires.com: could not connect to host
 semantheme.fr: could not connect to host
+seproco.com: could not connect to host
 servecrypt.net: could not connect to host
 shadowplus.net: could not connect to host
 shadowrocket.net: could not connect to host
+shagi29.ru: could not connect to host
 sharevari.com: could not connect to host
 shavingks.com: could not connect to host
 sheratan.web.id: could not connect to host
 shirakaba-cc.com: could not connect to host
 shoemuse.com: could not connect to host
 shopifycloud.com: could not connect to host
 simbolo.co.uk: could not connect to host
+simnovo.net: could not connect to host
 simplerses.com: could not connect to host
 siqi.wang: could not connect to host
 sky-aroma.com: could not connect to host
-sl1pkn07.wtf: could not connect to host
 socialworkout.com: could not connect to host
 socialworkout.net: could not connect to host
 socialworkout.org: could not connect to host
 socialworkout.tv: could not connect to host
 solos.im: could not connect to host
 somali-derp.com: could not connect to host
 soontm.de: could not connect to host
-soubriquet.org: could not connect to host
 soulema.com: could not connect to host
 sowingseasons.com: could not connect to host
 spicywombat.com: could not connect to host
 spitefultowel.com: could not connect to host
 spom.net: could not connect to host
 sputnik1net.org: could not connect to host
 stamonicatourandtravel.com: could not connect to host
 standards.gov: could not connect to host
 statgram.me: could not connect to host
 stitthappens.com: could not connect to host
 stpip.com: could not connect to host
 stytt.com: could not connect to host
 sufix.cz: could not connect to host
-surdam.casa: could not connect to host
 sussexwebdesigns.com: could not connect to host
 sviz.pro: could not connect to host
 tenispopular.com: could not connect to host
 terminalvelocity.co.nz: could not connect to host
+tetsai.com: could not connect to host
 texasllcpros.com: could not connect to host
 theprivacysolution.com: could not connect to host
 thesehighsandlows.com: could not connect to host
 thesteins.org: could not connect to host
 thinkcash.nl: could not connect to host
 tiliaze.info: could not connect to host
 tiliaze.net: could not connect to host
-tipiakers.club: could not connect to host
 tokage.me: could not connect to host
 totch.de: could not connect to host
 totot.net: could not connect to host
 transcendmotor.sg: could not connect to host
+tucidi.net: could not connect to host
 turn-sticks.com: could not connect to host
 tusb.ml: could not connect to host
 twiri.net: could not connect to host
+twotube.ie: could not connect to host
 tyil.nl: could not connect to host
 tyil.work: could not connect to host
-underskatten.tk: could not connect to host
+umsapi.com: could not connect to host
 vadik.me: could not connect to host
 varta.io: could not connect to host
 vcelin-na-doliku.cz: could not connect to host
 venmos.com: could not connect to host
-vidister.de: could not connect to host
 viditut.com: could not connect to host
+villenavedornon.fr: could not connect to host
 vilog.me: could not connect to host
 vitapingu.de: could not connect to host
 vmgirls.com: could not connect to host
 vmug.pl: could not connect to host
 wachter.biz: could not connect to host
-warlions.info: could not connect to host
+wantshow.com.br: could not connect to host
+wasi-net.de: could not connect to host
+wasielewski.com.de: could not connect to host
 watchweasel.com: could not connect to host
 weareincognito.org: could not connect to host
 webart-factory.de: could not connect to host
 webduck.nl: could not connect to host
 webthings.com.br: could not connect to host
 weicn.org: could not connect to host
 welby.cat: could not connect to host
 werhatunsverraten.eu: could not connect to host
 werkinc.de: could not connect to host
 whilsttraveling.com: could not connect to host
 wm-talk.net: could not connect to host
 wnnc.co.uk: could not connect to host
+wofford-ecs.org: could not connect to host
 wolfemg.com: could not connect to host
 wolfwings.us: could not connect to host
 wordpresspro.cl: could not connect to host
 wtf.ninja: could not connect to host
 www-8887999.com: could not connect to host
 www.re: could not connect to host
 www.sb: could not connect to host
 www.simbolo.co.uk: could not connect to host
 xecureit.com: could not connect to host
 xia100.xyz: could not connect to host
 xiangqiushi.com: could not connect to host
 xing.ml: could not connect to host
 xtremenutrition.com.br: could not connect to host
+yffengshi.ml: could not connect to host
 yoitsu.moe: could not connect to host
 yux.fr: could not connect to host
 zaoext.com: could not connect to host
 zenfusion.fr: could not connect to host
-zenghx.tk: could not connect to host
 zulu7.com: could not connect to host
 zuviel.space: could not connect to host
 zzw.ca: could not connect to host
 0-1.party: did not receive HSTS header
 0005.com: could not connect to host
 0005aa.com: could not connect to host
 007sascha.de: did not receive HSTS header
 020wifi.nl: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 119"  data: no]
-0222aa.com: could not connect to host
+0222aa.com: did not receive HSTS header
 048.ag: could not connect to host
 050508.com: could not connect to host
 0f.io: could not connect to host
 0g.org.uk: could not connect to host
 0o0.ooo: could not connect to host
 0p.no: did not receive HSTS header
 0w0.vc: could not connect to host
 0x0a.net: could not connect to host
@@ -546,17 +552,17 @@ 12vpn.org: could not connect to host
 12vpnchina.com: could not connect to host
 1391kj.com: did not receive HSTS header
 1396.net: could not connect to host
 1536.cf: could not connect to host
 163pwd.com: could not connect to host
 166166.com: could not connect to host
 16deza.com: did not receive HSTS header
 16packets.com: could not connect to host
-173vpn.cn: did not receive HSTS header
+173vpn.cn: could not connect to host
 173vpns.com: did not receive HSTS header
 188betwarriors.co.uk: could not connect to host
 188trafalgar.ca: did not receive HSTS header
 1921958389.rsc.cdn77.org: did not receive HSTS header
 195gm.com: could not connect to host
 1a-jva.de: could not connect to host
 1atic.com: could not connect to host
 1co-jp.net: did not receive HSTS header
@@ -582,34 +588,35 @@ 2bizi.ru: could not connect to host
 2brokegirls.org: could not connect to host
 2carpros.com: did not receive HSTS header
 2intermediate.co.uk: did not receive HSTS header
 2or3.tk: could not connect to host
 2smart4food.com: did not receive HSTS header
 2ss.jp: could not connect to host
 300651.ru: did not receive HSTS header
 300m.com: did not receive HSTS header
-300mbmovie24.com: could not connect to host
+300mbmovie24.com: did not receive HSTS header
 300mbmovies4u.cc: could not connect to host
 301.website: could not connect to host
 302.nyc: could not connect to host
 314166.com: did not receive HSTS header
 32ph.com: could not connect to host
 33338522.com: could not connect to host
 3338522.com: could not connect to host
 33drugstore.com: did not receive HSTS header
-341.mg: did not receive HSTS header
+341.mg: could not connect to host
 3555aa.com: could not connect to host
 35792.de: could not connect to host
 360gradus.com: did not receive HSTS header
 365.or.jp: could not connect to host
 368mibn.com: could not connect to host
 3778xl.com: did not receive HSTS header
 38sihu.com: could not connect to host
 39sihu.com: could not connect to host
+3ags.de: did not receive HSTS header
 3chit.cf: could not connect to host
 3click-loan.com: could not connect to host
 3d-bastler.de: could not connect to host
 3dcart.com: did not receive HSTS header
 3delivered.com: could not connect to host
 3dproteinimaging.com: did not receive HSTS header
 3sreporting.com: did not receive HSTS header
 404.sh: could not connect to host
@@ -618,17 +625,17 @@ 420dongstorm.com: could not connect to h
 42ms.org: could not connect to host
 44448522.com: could not connect to host
 4448522.com: could not connect to host
 4455software.com: did not receive HSTS header
 44957.com: could not connect to host
 4679.space: could not connect to host
 4azino777.ru: did not receive HSTS header
 4cclothing.com: could not connect to host
-4elements.com: did not receive HSTS header
+4elements.com: could not connect to host
 4eyes.ch: did not receive HSTS header
 4miners.net: could not connect to host
 4ourty2.org: did not receive HSTS header
 4sqsu.eu: could not connect to host
 4w-performers.link: could not connect to host
 50millionablaze.org: could not connect to host
 513vpn.net: did not receive HSTS header
 517vpn.cn: could not connect to host
@@ -884,17 +891,17 @@ alethearose.com: did not receive HSTS he
 alexandre.sh: did not receive HSTS header
 alexbaker.org: did not receive HSTS header
 alexdodge.ca: could not connect to host
 alexvetter.de: could not connect to host
 alfa24.pro: could not connect to host
 alfredxing.com: did not receive HSTS header
 alittlebitcheeky.com: did not receive HSTS header
 aljmz.com: could not connect to host
-alkami.com: did not receive HSTS header
+alkami.com: could not connect to host
 all-subtitles.com: could not connect to host
 all.tf: could not connect to host
 alldaymonitoring.com: could not connect to host
 allemobieleproviders.nl: did not receive HSTS header
 allinnote.com: could not connect to host
 allmbw.com: could not connect to host
 allmystery.de: did not receive HSTS header
 allo-symo.fr: did not receive HSTS header
@@ -1845,17 +1852,16 @@ chriskyrouac.com: could not connect to h
 chrisopperwall.com: did not receive HSTS header
 christiaandruif.nl: could not connect to host
 christianbro.gq: could not connect to host
 christophercolumbusfoundation.gov: could not connect to host
 christophersole.com: could not connect to host
 christophheich.me: could not connect to host
 chrisupjohn.com: could not connect to host
 chrisvicmall.com: did not receive HSTS header
-chromaryu.net: did not receive HSTS header
 chrome: could not connect to host
 chrome-devtools-frontend.appspot.com: did not receive HSTS header (error ignored - included regardless)
 chrome.google.com: did not receive HSTS header (error ignored - included regardless)
 chrst.ph: could not connect to host
 chua.cf: could not connect to host
 chulado.com: did not receive HSTS header
 churchux.co: did not receive HSTS header
 churrasqueirafacil.com.br: could not connect to host
@@ -2005,16 +2011,17 @@ comparamejor.com: did not receive HSTS h
 compareinsurance.com.au: did not receive HSTS header
 comparejewelleryprices.co.uk: could not connect to host
 comparetravelinsurance.com.au: did not receive HSTS header
 compassionate-biology.com: could not connect to host
 compiledworks.com: could not connect to host
 completionist.audio: could not connect to host
 complymd.com: did not receive HSTS header
 compraneta.com: did not receive HSTS header
+compubench.com: did not receive HSTS header
 compucorner.com.mx: could not connect to host
 computeremergency.com.au: did not receive HSTS header
 computersystems.guru: did not receive HSTS header
 computertal.de: could not connect to host
 conception.sk: could not connect to host
 concord-group.co.jp: did not receive HSTS header
 confirm365.com: could not connect to host
 conformal.com: could not connect to host
@@ -2270,16 +2277,17 @@ davidreinhardt.de: could not connect to 
 davidscherzer.at: could not connect to host
 daylightcompany.com: did not receive HSTS header
 days.one: could not connect to host
 daytonaseaside.com: did not receive HSTS header
 db.gy: could not connect to host
 dbcom.ru: did not receive HSTS header
 dbx.ovh: could not connect to host
 dcaracing.nl: could not connect to host
+dcc.cat: did not receive HSTS header
 dccode.gov: could not connect to host
 dccraft.net: could not connect to host
 dcl.re: did not receive HSTS header
 dcuofriends.net: could not connect to host
 dcurt.is: did not receive HSTS header
 dcw.io: did not receive HSTS header
 ddatsh.com: did not receive HSTS header
 debank.tv: did not receive HSTS header
@@ -2376,17 +2384,16 @@ dhpcs.com: did not receive HSTS header
 dhpiggott.net: did not receive HSTS header
 diablotine.rocks: could not connect to host
 diagnosia.com: did not receive HSTS header
 dianlujitao.com: did not receive HSTS header
 diannaobos.com: did not receive HSTS header
 dicando.com: max-age too low: 2592000
 dicelab.co.uk: could not connect to host
 dicionariofinanceiro.com: did not receive HSTS header
-die-borts.ch: could not connect to host
 dieb.photo: could not connect to host
 dierenkruiden.nl: could not connect to host
 diewebstube.de: could not connect to host
 diezel.com: could not connect to host
 diferenca.com: did not receive HSTS header
 digired.xyz: could not connect to host
 digitalbank.kz: could not connect to host
 digitaldaddy.net: could not connect to host
@@ -2494,16 +2501,17 @@ dosenbierrepublik.com: did not receive H
 dot42.no: could not connect to host
 dotadata.me: could not connect to host
 dotspaperie.com: could not connect to host
 dougferris.id.au: could not connect to host
 doujin.nagoya: could not connect to host
 dovecotadmin.org: could not connect to host
 doveholesband.co.uk: did not receive HSTS header
 dovetailnow.com: could not connect to host
+dowc.org: did not receive HSTS header
 download.jitsi.org: did not receive HSTS header
 downsouthweddings.com.au: could not connect to host
 doxcelerate.com: max-age too low: 69
 doyoucheck.com: did not receive HSTS header
 drach.xyz: did not receive HSTS header
 dragonisles.net: could not connect to host
 dragons-of-highlands.cz: could not connect to host
 dragonsmoke.cloud: could not connect to host
@@ -2546,17 +2554,17 @@ drycreekapiary.com: could not connect to
 ds-christiansen.de: could not connect to host
 dshiv.io: could not connect to host
 dtub.co: could not connect to host
 dualias.xyz: could not connect to host
 dubik.su: did not receive HSTS header
 duelysthub.com: could not connect to host
 duerls.de: did not receive HSTS header
 dukec.me: could not connect to host
-dullsir.com: could not connect to host
+dullsir.com: did not receive HSTS header
 dungi.org: could not connect to host
 duongpho.com: did not receive HSTS header
 duskopy.top: could not connect to host
 dutchessuganda.com: did not receive HSTS header
 dutchrank.com: did not receive HSTS header
 duuu.ch: could not connect to host
 dycontrol.de: could not connect to host
 dylanscott.com.au: did not receive HSTS header
@@ -2728,16 +2736,17 @@ encrypted.google.com: did not receive HS
 encryptio.com: could not connect to host
 end.pp.ua: could not connect to host
 endlessdark.net: max-age too low: 600
 endlesshorizon.net: could not connect to host
 endlesstone.com: could not connect to host
 endohaus.ca: could not connect to host
 endohaus.com: could not connect to host
 endohaus.eu: could not connect to host
+enecoshop.nl: did not receive HSTS header
 enefan.jp: could not connect to host
 engelwerbung.com: did not receive HSTS header
 enginsight.com: did not receive HSTS header
 englishyamal.ru: did not receive HSTS header
 enigmacpt.com: did not receive HSTS header
 enigmail.net: did not receive HSTS header
 enjen.net: did not receive HSTS header
 enjoymayfield.com: max-age too low: 0
@@ -2911,20 +2920,20 @@ falkhusemann.de: did not receive HSTS he
 falkp.no: did not receive HSTS header
 fallenangelspirits.uk: could not connect to host
 faluninfo.ba: did not receive HSTS header
 fam-weyer.de: did not receive HSTS header
 fame-agency.net: could not connect to host
 familie-sprink.de: could not connect to host
 familie-zimmermann.at: could not connect to host
 famio.cn: could not connect to host
+fantasyescortsbirmingham.co.uk: did not receive HSTS header
 fantasyfootballpundit.com: did not receive HSTS header
 fanyl.cn: could not connect to host
 farces.com: did not receive HSTS header
-farhadexchange.com: did not receive HSTS header
 fashion.net: did not receive HSTS header
 fashioncare.cz: did not receive HSTS header
 fashionholic.my: did not receive HSTS header
 fasset.jp: could not connect to host
 fastcomcorp.com: did not receive HSTS header
 fastcomcorp.net: did not receive HSTS header
 fastograph.com: could not connect to host
 fastopen.ml: could not connect to host
@@ -3100,16 +3109,17 @@ frankwei.xyz: did not receive HSTS heade
 franta.biz: did not receive HSTS header
 franta.email: did not receive HSTS header
 franzt.de: could not connect to host
 frasesdeamizade.pt: could not connect to host
 frasesytarjetas.com: did not receive HSTS header
 frasys.io: could not connect to host
 frau-inge.de: could not connect to host
 fraudempire.com: could not connect to host
+frederik-braun.com: did not receive HSTS header
 freeflow.tv: could not connect to host
 freelanced.co.za: could not connect to host
 freelo.cz: did not receive HSTS header
 freematthale.net: did not receive HSTS header
 freesoftwaredriver.com: did not receive HSTS header
 freethought.org.au: could not connect to host
 freeutopia.org: did not receive HSTS header
 freqlabs.com: did not receive HSTS header
@@ -3247,17 +3257,16 @@ genyhitch.com: did not receive HSTS head
 geoffdev.com: could not connect to host
 geopals.net: did not receive HSTS header
 george-brighton.co.uk: could not connect to host
 georgebrighton.co.uk: could not connect to host
 georgesonarthurs.com.au: did not receive HSTS header
 gereja.ga: did not receive HSTS header
 gerencianet.com.br: did not receive HSTS header
 gereon.ch: could not connect to host
-gerum.dynv6.net: could not connect to host
 gesiwista.net: could not connect to host
 gesunde-smoothies.de: did not receive HSTS header
 get-cctv.com: could not connect to host
 get.zenpayroll.com: did not receive HSTS header
 getable.com: did not receive HSTS header
 getblys.com.au: did not receive HSTS header
 getbooks.co.il: did not receive HSTS header
 getcarefirst.com: did not receive HSTS header
@@ -3277,16 +3286,17 @@ getpake.com: could not connect to host
 getremembrall.com: could not connect to host
 getronics.care: could not connect to host
 getsello.com: could not connect to host
 getspeaker.com: did not receive HSTS header
 getwashdaddy.com: could not connect to host
 gfm.tech: could not connect to host
 gfournier.ca: could not connect to host
 gfwsb.ml: could not connect to host
+gfxbench.com: did not receive HSTS header
 ggss.ml: could not connect to host
 gh16.com.ar: could not connect to host
 gheorghe-sarcov.ga: could not connect to host
 gheorghesarcov.ga: could not connect to host
 gheorghesarcov.tk: could not connect to host
 ghkim.net: could not connect to host
 ghostcir.com: could not connect to host
 giakki.eu: could not connect to host
@@ -3299,17 +3309,16 @@ giftservices.nl: could not connect to ho
 gigacloud.org: max-age too low: 0
 gigacog.com: could not connect to host
 gilcloud.com: could not connect to host
 gilgaz.com: did not receive HSTS header
 gillet-cros.fr: could not connect to host
 gilly.berlin: did not receive HSTS header
 gingali.de: did not receive HSTS header
 ginijony.com: did not receive HSTS header
-ginniemae.gov: could not connect to host
 gintenreiter-photography.com: did not receive HSTS header
 giogadesign.com: did not receive HSTS header
 gipsamsfashion.com: could not connect to host
 gipsic.com: did not receive HSTS header
 gis3m.org: did not receive HSTS header
 gistfy.com: could not connect to host
 git-stuff.tk: could not connect to host
 github.party: did not receive HSTS header
@@ -3350,17 +3359,16 @@ goben.ch: could not connect to host
 goblins.net: did not receive HSTS header
 goedeke.ml: could not connect to host
 goerner.me: did not receive HSTS header
 goge.site: could not connect to host
 gogenenglish.com: could not connect to host
 gogetssl.com: did not receive HSTS header
 goggs.eu: could not connect to host
 gogold-g.com: could not connect to host
-gokhankesici.com: did not receive HSTS header
 gold24.in: did not receive HSTS header
 goldegg-training.com: did not receive HSTS header
 goldendata.io: could not connect to host
 goldminer.ga: could not connect to host
 goldpros.com: did not receive HSTS header
 golocal-media.de: could not connect to host
 gong8.win: could not connect to host
 gonzalosanchez.mx: did not receive HSTS header
@@ -3820,30 +3828,32 @@ ideation-inc.co.jp: could not connect to
 idedr.com: could not connect to host
 identitylabs.uk: could not connect to host
 identitysandbox.gov: could not connect to host
 idgsupply.com: did not receive HSTS header
 idisplay.es: did not receive HSTS header
 idlekernel.com: could not connect to host
 idontexist.me: did not receive HSTS header
 ie.search.yahoo.com: did not receive HSTS header
+iemb.cf: did not receive HSTS header
 ierna.com: did not receive HSTS header
 ies-italia.it: did not receive HSTS header
 ies.id.lv: could not connect to host
 ievgenialehner.com: did not receive HSTS header
 ifad.org: did not receive HSTS header
 ifastuniversity.com: did not receive HSTS header
 ifengge.me: did not receive HSTS header
 ifleurs.com: could not connect to host
 ifx.ee: could not connect to host
 igforums.com: could not connect to host
 igiftcards.nl: did not receive HSTS header
 ignatisd.gr: did not receive HSTS header
 ignatovich.by: could not connect to host
 ignatovich.me: could not connect to host
+iguana.com.ec: did not receive HSTS header
 igule.net: could not connect to host
 ihrlotto.de: could not connect to host
 ihrnationalrat.ch: could not connect to host
 ihsbsd.me: could not connect to host
 ihsbsd.tk: could not connect to host
 iispeed.com: did not receive HSTS header
 ijn-dd.nl: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 119"  data: no]
 ikon.name: did not receive HSTS header
@@ -3879,19 +3889,18 @@ immunicity.today: did not receive HSTS h
 immunicity.top: could not connect to host
 immunicity.win: could not connect to host
 immunicity.works: did not receive HSTS header
 immunicity.world: did not receive HSTS header
 imolug.org: did not receive HSTS header
 imoni-blog.net: could not connect to host
 imoto.me: could not connect to host
 imouto.my: max-age too low: 5184000
-imouyang.com: did not receive HSTS header
 imperialwebsolutions.com: did not receive HSTS header
-imu.li: did not receive HSTS header
+imu.li: could not connect to host
 imusic.dk: did not receive HSTS header
 inb4.us: could not connect to host
 inbox.li: did not receive HSTS header
 incendiary-arts.com: could not connect to host
 inche-ali.com: did not receive HSTS header
 inchomatic.com: did not receive HSTS header
 indiecert.net: could not connect to host
 indien.guide: could not connect to host
@@ -4079,17 +4088,16 @@ jackfahnestock.com: could not connect to
 jacobparry.ca: did not receive HSTS header
 jagido.de: did not receive HSTS header
 jahliveradio.com: could not connect to host
 jamanji.com.ng: could not connect to host
 james-parker.com: did not receive HSTS header
 james.je: could not connect to host
 jamesachambers.com: could not connect to host
 jamesandpame.la: could not connect to host
-jamesbillingham.com: did not receive HSTS header
 jamesburton.london: could not connect to host
 jamesbywater.co.uk: could not connect to host
 jamesbywater.com: could not connect to host
 jamesbywater.me: could not connect to host
 jamesbywater.me.uk: could not connect to host
 jamesbywater.uk: could not connect to host
 jamesconroyfinn.com: did not receive HSTS header
 jamesdoell.com: could not connect to host
@@ -4100,17 +4108,17 @@ jameshale.me: did not receive HSTS heade
 jamesmaurer.com: did not receive HSTS header
 jamourtney.com: could not connect to host
 jan-daniels.de: did not receive HSTS header
 jan-roenspies.de: could not connect to host
 jan27.org: did not receive HSTS header
 janario.me: could not connect to host
 janbrodda.de: max-age too low: 2592000
 jangho.me: could not connect to host
-janking.de: could not connect to host
+janking.de: did not receive HSTS header
 jannyrijneveld.nl: did not receive HSTS header
 janus-engineering.de: did not receive HSTS header
 japaripark.com: could not connect to host
 japlex.com: could not connect to host
 jaqen.ch: could not connect to host
 jaroslavtrsek.cz: did not receive HSTS header
 jarsater.com: could not connect to host
 jartza.org: could not connect to host
@@ -4148,17 +4156,17 @@ jensenbanden.no: could not connect to ho
 jeremiahbenes.com: did not receive HSTS header
 jeremye77.com: did not receive HSTS header
 jeroenseegers.com: could not connect to host
 jesorsenville.com: did not receive HSTS header
 jessicabenedictus.nl: could not connect to host
 jessicah.org: could not connect to host
 jesuisformidable.nl: could not connect to host
 jet-code.com: could not connect to host
-jetaprices.com: could not connect to host
+jetaprices.com: max-age too low: 0
 jetlagphotography.com: could not connect to host
 jetsetcharge.com: could not connect to host
 jetsetpay.com: could not connect to host
 jettshome.org: could not connect to host
 jeugdkans.nl: did not receive HSTS header
 jewellerydesignstore.com: could not connect to host
 jfmel.com: did not receive HSTS header
 jfx.space: did not receive HSTS header
@@ -4177,21 +4185,22 @@ jimmycai.org: could not connect to host
 jingyuesi.com: could not connect to host
 jinmaguoji.com: could not connect to host
 jinshavip.com: did not receive HSTS header
 jirav.io: could not connect to host
 jitsi.org: did not receive HSTS header
 jiyue.com: did not receive HSTS header
 jkb.pics: could not connect to host
 jkbuster.com: could not connect to host
-jkng.eu: could not connect to host
+jkng.eu: did not receive HSTS header
 jko.works: could not connect to host
 jm06.com: did not receive HSTS header
 jm22.com: could not connect to host
 jmdekker.it: could not connect to host
+jn1.me: did not receive HSTS header
 joakimalgroy.com: could not connect to host
 jobflyapp.com: could not connect to host
 jobshq.com: did not receive HSTS header
 jobss.co.uk: did not receive HSTS header
 joedavison.me: did not receive HSTS header
 johannes-sprink.de: could not connect to host
 johnbrownphotography.ch: did not receive HSTS header
 johncardell.com: did not receive HSTS header
@@ -4264,16 +4273,17 @@ juwairen.cn: could not connect to host
 jvoice.net: could not connect to host
 jwilsson.me: could not connect to host
 jxm.in: could not connect to host
 jznet.org: could not connect to host
 k-dev.de: could not connect to host
 k-rickroll-g.pw: could not connect to host
 k1cp.com: could not connect to host
 ka-clan.com: could not connect to host
+kabat-fans.cz: did not receive HSTS header
 kabinapp.com: could not connect to host
 kabuabc.com: could not connect to host
 kackscharf.de: could not connect to host
 kadioglumakina.com.tr: did not receive HSTS header
 kaela.design: could not connect to host
 kahopoon.net: could not connect to host
 kaisers.de: did not receive HSTS header
 kaiyuewu.com: could not connect to host
@@ -4525,16 +4535,17 @@ lampl.info: could not connect to host
 lana.swedbank.se: did not receive HSTS header
 lanauzedesigns.com: did not receive HSTS header
 lanboll.com: could not connect to host
 lancehoteis.com: did not receive HSTS header
 lancehoteis.com.br: did not receive HSTS header
 land-links.org: did not receive HSTS header
 landgoedverkopen.nl: could not connect to host
 landhuisverkopen.nl: could not connect to host
+landofelves.net: did not receive HSTS header
 landscape.canonical.com: max-age too low: 2592000
 landscapingmedic.com: could not connect to host
 langenbach.rocks: could not connect to host
 langendries.eu: could not connect to host
 langhun.me: did not receive HSTS header
 laniakean.com: did not receive HSTS header
 lanzainc.xyz: did not receive HSTS header
 laobox.fr: could not connect to host
@@ -4644,17 +4655,16 @@ lifecoachproviders.com: did not receive 
 lifeguard.aecom.com: did not receive HSTS header
 lifeinitsownway.com: could not connect to host
 lifeskillsdirect.com: did not receive HSTS header
 lifetimemoneymachine.com: did not receive HSTS header
 lightarmory.com: could not connect to host
 lightning-ashe.com: did not receive HSTS header
 lightpaste.com: could not connect to host
 lightworx.io: did not receive HSTS header
-likc.me: could not connect to host
 lila.pink: did not receive HSTS header
 lillepuu.com: did not receive HSTS header
 lillpopp.eu: max-age too low: 10
 lilpwny.com: could not connect to host
 lilycms.com: could not connect to host
 lim-light.com: did not receive HSTS header
 limalama.eu: max-age too low: 1
 limeyeti.com: could not connect to host
@@ -4689,16 +4699,17 @@ lisgade.dk: did not receive HSTS header
 listafirmelor.com: could not connect to host
 listage.ovh: did not receive HSTS header
 litespeed.io: could not connect to host
 little.pw: did not receive HSTS header
 littlefreelibrary.org: did not receive HSTS header
 littleqiu.net: could not connect to host
 liujunyang.com: did not receive HSTS header
 livedemo.io: could not connect to host
+liveflightapp.com: did not receive HSTS header
 livej.am: could not connect to host
 liverewrite.com: could not connect to host
 livi.co: did not receive HSTS header
 liviababynet.com.br: did not receive HSTS header
 lixiang.one: could not connect to host
 lixingcong.com: could not connect to host
 lkp111138.me: could not connect to host
 llamasweet.tech: could not connect to host
@@ -4821,17 +4832,16 @@ m3-gmbh.de: did not receive HSTS header
 m82labs.com: did not receive HSTS header
 maarten.nyc: could not connect to host
 mac-torrents.me: did not receive HSTS header
 macbolo.com: could not connect to host
 macchaberrycream.com: could not connect to host
 macchedil.com: did not receive HSTS header
 macdj.tk: could not connect to host
 macgeneral.de: did not receive HSTS header
-machbach.net: could not connect to host
 macsandcheesedreams.com: could not connect to host
 madars.org: did not receive HSTS header
 maddin.ga: could not connect to host
 madebyfalcon.co.uk: did not receive HSTS header
 madebymagnitude.com: did not receive HSTS header
 maderwin.com: did not receive HSTS header
 madesoftware.com.br: did not receive HSTS header
 mafamane.com: could not connect to host
@@ -4918,16 +4928,17 @@ markorszulak.com: did not receive HSTS h
 markrobin.de: did not receive HSTS header
 marksill.com: could not connect to host
 marktboten.de: did not receive HSTS header
 marktissink.nl: did not receive HSTS header
 markus-dev.com: did not receive HSTS header
 marleyresort.com: did not receive HSTS header
 marriottvetcareers.com: could not connect to host
 marshut.net: could not connect to host
+martensen.me: max-age too low: 0
 martensson.io: did not receive HSTS header
 martialc.be: could not connect to host
 martiert.com: could not connect to host
 martijnvhoof.nl: could not connect to host
 martinec.co.uk: could not connect to host
 martinestyle.com: could not connect to host
 martineve.com: did not receive HSTS header
 martinp.no: could not connect to host
@@ -5425,17 +5436,16 @@ nanto.eu: could not connect to host
 narada.com.ua: did not receive HSTS header
 narodniki.com: did not receive HSTS header
 nashira.cz: did not receive HSTS header
 nasralmabrooka.com: did not receive HSTS header
 natalia-fadeeva.ru: could not connect to host
 natalia.io: could not connect to host
 natalieandjoshua.com: could not connect to host
 natalt.org: did not receive HSTS header
-nathanmfarrugia.com: did not receive HSTS header
 nationwidevehiclecontracts.co.uk: did not receive HSTS header
 natural-progesterone.net: could not connect to host
 naturecoaster.com: did not receive HSTS header
 natuurbehangnederland.nl: could not connect to host
 naudles.me: could not connect to host
 nav.jobs: could not connect to host
 naval.tf: could not connect to host
 navenlle.com: did not receive HSTS header
@@ -5500,17 +5510,16 @@ newhdmovies.io: could not connect to hos
 newkaliningrad.ru: did not receive HSTS header
 newlooknow.com: did not receive HSTS header
 newmelalife.com: did not receive HSTS header
 newparadigmventures.net: did not receive HSTS header
 newportpropertygroup.com: could not connect to host
 newstarnootropics.com: max-age too low: 7776000
 newtonwarp.com: could not connect to host
 next176.sk: did not receive HSTS header
-next24.io: did not receive HSTS header
 next47.com: did not receive HSTS header
 nextcloud.org: could not connect to host
 nexth.de: could not connect to host
 nexth.net: could not connect to host
 nexth.us: could not connect to host
 nextpages.de: could not connect to host
 nextproject.us: could not connect to host
 nfluence.org: could not connect to host
@@ -5543,16 +5552,17 @@ ninchisho-online.com: did not receive HS
 ninhs.org: could not connect to host
 ninjaspiders.com: did not receive HSTS header
 nippler.org: did not receive HSTS header
 nippombashi.net: did not receive HSTS header
 nipponcareers.com: did not receive HSTS header
 nitropanel.com: did not receive HSTS header
 nixien.fr: could not connect to host
 nixmag.net: could not connect to host
+nkautoservice.nl: did not receive HSTS header
 nll.fi: could not connect to host
 nmadda.com: could not connect to host
 nmctest.net: could not connect to host
 nmueller.at: could not connect to host
 nnya.cat: could not connect to host
 no-ip.cz: did not receive HSTS header
 no17sifangjie.cc: could not connect to host
 nocallaghan.com: could not connect to host
@@ -5566,17 +5576,16 @@ nodi.at: did not receive HSTS header
 noexpect.org: could not connect to host
 noima.com: did not receive HSTS header
 noisebridge.social: could not connect to host
 nolberg.net: did not receive HSTS header
 nolimitsbook.de: did not receive HSTS header
 nolte.work: could not connect to host
 nomorebytes.de: could not connect to host
 noodlesandwich.com: did not receive HSTS header
-nootropicsource.com: did not receive HSTS header
 nope.website: could not connect to host
 nopex.no: could not connect to host
 nopol.de: could not connect to host
 norandom.com: could not connect to host
 norb.at: could not connect to host
 nordlicht.photography: did not receive HSTS header
 norge.guide: could not connect to host
 northcutt.com: did not receive HSTS header
@@ -5762,16 +5771,17 @@ ooooush.co.uk: could not connect to host
 oopsmycase.com: could not connect to host
 oopsorup.com: could not connect to host
 oost.io: could not connect to host
 open-mx.de: could not connect to host
 open-to-repair.fr: did not receive HSTS header
 openas.org: could not connect to host
 opendesk.cc: did not receive HSTS header
 opengateway.fr: did not receive HSTS header
+openitforum.pl: did not receive HSTS header
 openmind-shop.de: did not receive HSTS header
 openmtbmap.org: did not receive HSTS header
 openpriv.pw: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 119"  data: no]
 openprovider.nl: did not receive HSTS header
 openrtv.com: could not connect to host
 openshift.redhat.com: did not receive HSTS header
 opensourcehouse.net: could not connect to host
 opensrd.com: could not connect to host
@@ -5976,17 +5986,17 @@ performous.org: could not connect to hos
 perfumista.vn: did not receive HSTS header
 periscopeliveweb.com: could not connect to host
 perlwork.nl: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 119"  data: no]
 pernatie.ru: could not connect to host
 perplex.nl: did not receive HSTS header
 perroud.pro: did not receive HSTS header
 personalcommunicationsecurity.com: could not connect to host
 personaldatabasen.no: could not connect to host
-personalinjurylist.com: could not connect to host
+personalinjurylist.com: did not receive HSTS header
 personalizedtouch.co: could not connect to host
 perthdevicelab.com: did not receive HSTS header
 pet-life.top: could not connect to host
 pet-nsk.ru: could not connect to host
 petchart.net: could not connect to host
 peterkshultz.com: did not receive HSTS header
 petersmark.com: could not connect to host
 pethub.com: did not receive HSTS header
@@ -6120,16 +6130,17 @@ pointpro.de: did not receive HSTS header
 pokeduel.me: did not receive HSTS header
 pol.in.th: could not connect to host
 polarityschule.com: did not receive HSTS header
 pole.net.nz: could not connect to host
 polen.guide: could not connect to host
 policeiwitness.sg: could not connect to host
 polimat.org: could not connect to host
 politically-incorrect.xyz: could not connect to host
+politiewervingshop.nl: did not receive HSTS header
 politologos.org: did not receive HSTS header
 polycoise.com: could not connect to host
 polycrypt.us: could not connect to host
 polypho.nyc: could not connect to host
 pompefunebrilariviera.it: could not connect to host
 pompompoes.com: could not connect to host
 pontokay.com.br: could not connect to host
 pontualcomp.com: could not connect to host
@@ -6228,16 +6239,17 @@ projectdp.net: could not connect to host
 projectherogames.xyz: did not receive HSTS header
 projectmercury.space: could not connect to host
 projetoresecia.com: did not receive HSTS header
 promecon-gmbh.de: did not receive HSTS header
 prontocleaners.co.uk: could not connect to host
 prontolight.com: did not receive HSTS header
 prontomovers.co.uk: could not connect to host
 propactrading.com: could not connect to host
+proposalonline.com: did not receive HSTS header
 prosocialmachines.com: could not connect to host
 prosoft.sk: did not receive HSTS header
 prosperident.com: did not receive HSTS header
 protoyou.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 119"  data: no]
 providerlijst.com: did not receive HSTS header
 providerlijst.nl: did not receive HSTS header
 prowhisky.de: did not receive HSTS header
 proximato.com: could not connect to host
@@ -6510,16 +6522,17 @@ rhering.de: could not connect to host
 rhodosdreef.nl: could not connect to host
 riaucybersolution.net: did not receive HSTS header
 ribopierre.fr: could not connect to host
 richiemail.net: did not receive HSTS header
 richmondsunlight.com: did not receive HSTS header
 richmtdriver.com: could not connect to host
 richsiciliano.com: could not connect to host
 richterphilipp.com: could not connect to host
+rickmartensen.nl: max-age too low: 0
 rid-wan.com: could not connect to host
 rideforwade.com: could not connect to host
 rideforwade.net: could not connect to host
 rideforwade.org: could not connect to host
 rideworks.com: did not receive HSTS header
 ridwan.co: did not receive HSTS header
 right-to-love.name: did not receive HSTS header
 right2.org: could not connect to host
@@ -6750,17 +6763,17 @@ scrambler.in: could not connect to host
 scrapings.net: could not connect to host
 screencaster.io: did not receive HSTS header
 screenresolution.space: could not connect to host
 screensaversplanet.com: did not receive HSTS header
 scribbleserver.com: could not connect to host
 scribe.systems: could not connect to host
 scrion.com: could not connect to host
 script.google.com: did not receive HSTS header (error ignored - included regardless)
-scriptenforcer.net: could not connect to host
+scriptenforcer.net: did not receive HSTS header
 scriptict.nl: could not connect to host
 scrollstory.com: did not receive HSTS header
 sdhmanagementgroup.com: could not connect to host
 sdia.ru: could not connect to host
 sdmoscow.ru: could not connect to host
 sdrobs.com: did not receive HSTS header
 sdsl-speedtest.de: could not connect to host
 seans.cc: did not receive HSTS header
@@ -6834,17 +6847,17 @@ semps.de: did not receive HSTS header
 sendash.com: could not connect to host
 sendc.at: could not connect to host
 sendcat.com: could not connect to host
 sendmeback.de: did not receive HSTS header
 senedirect.com: could not connect to host
 senseofnumber.co.uk: did not receive HSTS header
 sensiblemn.org: could not connect to host
 sensibus.com: did not receive HSTS header
-seo-lagniappe.com: could not connect to host
+seo-lagniappe.com: did not receive HSTS header
 seobot.com.au: could not connect to host
 seomobo.com: could not connect to host
 seosanantonioinc.com: did not receive HSTS header
 seowarp.net: did not receive HSTS header
 seq.tf: did not receive HSTS header
 serathius.ovh: could not connect to host
 serbien.guide: could not connect to host
 serenitycreams.com: did not receive HSTS header
@@ -7009,17 +7022,16 @@ skyoy.com: did not receive HSTS header
 skyrunners.ch: could not connect to host
 slanterns.net: could not connect to host
 slash-dev.de: did not receive HSTS header
 slashand.co: did not receive HSTS header
 slashdesign.it: did not receive HSTS header
 slashem.me: did not receive HSTS header
 slattery.co: could not connect to host
 slauber.de: did not receive HSTS header
-sleeklounge.com: did not receive HSTS header
 sleep10.com: could not connect to host
 sleepstar.com.mt: did not receive HSTS header
 slicketl.com: did not receive HSTS header
 slightfuture.click: could not connect to host
 slightfuture.com: did not receive HSTS header
 slix.io: could not connect to host
 slope.haus: could not connect to host
 slotboss.co.uk: did not receive HSTS header
@@ -7130,16 +7142,17 @@ sparelib.com: max-age too low: 3650
 spark.team: could not connect to host
 sparklingsparklers.com: did not receive HSTS header
 sparsa.army: could not connect to host
 sparta-trade.com: could not connect to host
 spauted.com: could not connect to host
 spdysync.com: could not connect to host
 specialedesigns.com: could not connect to host
 speculor.net: could not connect to host
+spedition-transport-umzug.de: did not receive HSTS header
 speed-mailer.com: could not connect to host
 speedcounter.net: did not receive HSTS header
 speedy.lt: max-age too low: 0
 speedyprep.com: did not receive HSTS header
 speidel.com.tr: did not receive HSTS header
 spencerbaer.com: could not connect to host
 sperohub.io: could not connect to host
 spiegels.nl: could not connect to host
@@ -7298,17 +7311,16 @@ sugarcitycon.com: could not connect to h
 suian.or.jp: max-age too low: 86400
 suite73.org: could not connect to host
 sujoydhar.in: did not receive HSTS header
 summitbankofkc.com: did not receive HSTS header
 sumoatm.com: did not receive HSTS header
 sumoscout.de: could not connect to host
 suncountrymarine.com: did not receive HSTS header
 sundanceusa.com: did not receive HSTS header
-sunflyer.cn: did not receive HSTS header
 sunlandsg.vn: did not receive HSTS header
 sunnyfruit.ru: could not connect to host
 sunshinepress.org: could not connect to host
 sunyanzi.tk: could not connect to host
 suos.io: could not connect to host
 supcro.com: could not connect to host
 super-erotica.ru: could not connect to host
 super-garciniaslim.com: could not connect to host
@@ -7516,17 +7528,16 @@ tentins.com: could not connect to host
 teos.online: could not connect to host
 terra.by: did not receive HSTS header
 terrax.berlin: could not connect to host
 terrax.info: could not connect to host
 testandroid.xyz: could not connect to host
 tetramax.eu: could not connect to host
 teufelsystem.de: could not connect to host
 teulon.eu: could not connect to host
-text-shirt.com: did not receive HSTS header
 texte-zur-taufe.de: did not receive HSTS header
 textoplano.xyz: could not connect to host
 textracer.dk: could not connect to host
 tf2stadium.com: did not receive HSTS header
 tfcoms-sp-tracker-client.azurewebsites.net: could not connect to host
 tffans.com: could not connect to host
 tfl.lu: did not receive HSTS header
 tgr.re: could not connect to host
@@ -7658,17 +7669,17 @@ tierrarp.com: could not connect to host
 tightlineproductions.com: did not receive HSTS header
 tikutiku.pl: could not connect to host
 tildebot.com: could not connect to host
 tiliaze.be: could not connect to host
 tiliaze.biz: could not connect to host
 tiliaze.eu: did not receive HSTS header
 tilient.eu: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 119"  data: no]
 tilikum.io: did not receive HSTS header
-tilkah.com.au: could not connect to host
+tilkah.com.au: did not receive HSTS header
 tillcraft.com: could not connect to host
 timbeilby.com: could not connect to host
 timbuktutimber.com: did not receive HSTS header
 timcamara.com: could not connect to host
 time-river.xyz: could not connect to host
 timesavingplugins.com: could not connect to host
 timesavingplugins.net: could not connect to host
 timeserver0.de: could not connect to host
@@ -7696,17 +7707,16 @@ titouan.co: did not receive HSTS header
 tittarpuls.se: could not connect to host
 titties.ml: could not connect to host
 tjc.host: did not receive HSTS header
 tjc.wiki: could not connect to host
 tjeckien.guide: could not connect to host
 tjullrich.de: could not connect to host
 tkappertjedemetamorfose.nl: could not connect to host
 tkonstantopoulos.tk: could not connect to host
-tlach.cz: did not receive HSTS header
 tlcdn.net: could not connect to host
 tlo.hosting: could not connect to host
 tlo.link: could not connect to host
 tlo.network: could not connect to host
 tls.li: could not connect to host
 tlsbv.nl: did not receive HSTS header
 tlshost.net: could not connect to host
 tm-solutions.eu: did not receive HSTS header
@@ -7814,16 +7824,17 @@ travel-kuban.ru: did not receive HSTS he
 travelinsightswriter.com: could not connect to host
 travelinsurance.co.nz: did not receive HSTS header
 trazosdearte.com: did not receive HSTS header
 treatprostatewithhifu.com: could not connect to host
 treeby.net: could not connect to host
 treeremovaljohannesburg.co.za: could not connect to host
 treino.blog.br: could not connect to host
 trell.co.in: did not receive HSTS header
+tremoureux.fr: did not receive HSTS header
 trendberry.ru: could not connect to host
 trileg.net: could not connect to host
 trinityaffirmations.com: max-age too low: 0
 trinitycore.org: max-age too low: 2592000
 tripdelta.com: did not receive HSTS header
 tripinsider.club: did not receive HSTS header
 trixies-wish.nz: could not connect to host
 troi.de: did not receive HSTS header
@@ -7856,17 +7867,17 @@ tunai.id: could not connect to host
 tunca.it: did not receive HSTS header
 tunebitfm.de: could not connect to host
 turkrock.com: did not receive HSTS header
 turnik-67.ru: could not connect to host
 turniker.ru: could not connect to host
 turnsticks.com: could not connect to host
 turtlementors.com: could not connect to host
 tussengelegenwoningverkopen.nl: could not connect to host
-tuturulianda.com: did not receive HSTS header
+tuturulianda.com: could not connect to host
 tuvalie.com: could not connect to host
 tuxcall.de: could not connect to host
 tuxz.net: did not receive HSTS header
 tv.search.yahoo.com: could not connect to host
 tvtubeflix.com: did not receive HSTS header
 tvz-materijali.com: could not connect to host
 tw2-tools.ga: could not connect to host
 twarog.cc: could not connect to host
@@ -7949,17 +7960,17 @@ unart.info: could not connect to host
 unbanthe.net: could not connect to host
 unblockat.tk: could not connect to host
 unblocked-networks.org: could not connect to host
 unblocked.date: could not connect to host
 unblocked.faith: could not connect to host
 unblocked.host: could not connect to host
 unblocked.party: could not connect to host
 unblocked.today: did not receive HSTS header
-unblocked.win: could not connect to host
+unblocked.win: did not receive HSTS header
 unblocked.works: did not receive HSTS header
 unblocked.world: did not receive HSTS header
 unblockedall.site: could not connect to host
 unblockerproxy.site: could not connect to host
 unblockerproxy.top: could not connect to host
 unblockmy.party: could not connect to host
 unblockmy.tech: did not receive HSTS header
 unblockmy.xyz: did not receive HSTS header
@@ -8256,16 +8267,17 @@ warped.com: did not receive HSTS header
 warrencreative.com: did not receive HSTS header
 warsentech.com: could not connect to host
 warsh.moe: did not receive HSTS header
 watchium.com: did not receive HSTS header
 waterforlife.net.au: did not receive HSTS header
 waterpoint.com.br: did not receive HSTS header
 watersportmarkt.net: did not receive HSTS header
 watsonhall.uk: could not connect to host
+wattechweb.com: did not receive HSTS header
 wave.is: could not connect to host
 wavefloatrooms.com: did not receive HSTS header
 wavefrontsystemstech.com: could not connect to host
 we-bb.com: could not connect to host
 wear2work.nl: did not receive HSTS header
 weaverhairextensions.nl: could not connect to host
 web-industry.fr: could not connect to host
 web-insider.net: could not connect to host
@@ -8457,30 +8469,30 @@ wubocong.com: could not connect to host
 wubthecaptain.eu: could not connect to host
 wuetix.de: max-age too low: 0
 wufu.org: did not receive HSTS header
 wuhengmin.com: could not connect to host
 wundtherapie-schulung.de: could not connect to host
 wurzelzwerg.net: could not connect to host
 wusx.club: could not connect to host
 wvr-law.de: did not receive HSTS header
-ww2onlineshop.com: could not connect to host
+ww2onlineshop.com: did not receive HSTS header
 www-001133.com: could not connect to host
 www-0385.com: could not connect to host
 www-1116.com: did not receive HSTS header
 www-1117.com: could not connect to host
 www-39988.com: did not receive HSTS header
 www-507.net: did not receive HSTS header
 www-746.com: could not connect to host
 www-771122.com: did not receive HSTS header
 www-8003.com: did not receive HSTS header
 www-88599.com: did not receive HSTS header
 www-9995.com: did not receive HSTS header
 www-djbet.com: did not receive HSTS header
-www-jinshavip.com: could not connect to host
+www-jinshavip.com: did not receive HSTS header
 www.braintreepayments.com: did not receive HSTS header
 www.calyxinstitute.org: max-age too low: 500
 www.cueup.com: could not connect to host
 www.cyveillance.com: did not receive HSTS header
 www.developer.mydigipass.com: could not connect to host
 www.elanex.biz: did not receive HSTS header
 www.gamesdepartment.co.uk: did not receive HSTS header
 www.gmail.com: did not receive HSTS header (error ignored - included regardless)
@@ -8691,16 +8703,17 @@ zahyantechnologies.com: could not connec
 zakoncontrol.com: did not receive HSTS header
 zamorano.edu: could not connect to host
 zamos.ru: max-age too low: 0
 zaneweb.org: could not connect to host
 zao.fi: could not connect to host
 zaoshanghao-dajia.rhcloud.com: did not receive HSTS header
 zap.yt: did not receive HSTS header
 zarooba.com: could not connect to host
+zary.me: did not receive HSTS header
 zavca.com: did not receive HSTS header
 zbigniewgalucki.eu: did not receive HSTS header
 zcon.nl: could not connect to host
 zdravotnickasluzba.eu: could not connect to host
 zebrababy.cn: could not connect to host
 zebry.nl: could not connect to host
 zecrypto.com: could not connect to host
 zeedroom.be: did not receive HSTS header
@@ -8755,16 +8768,17 @@ zjutv.com: could not connect to host
 zk.gd: did not receive HSTS header
 zkillboard.com: did not receive HSTS header
 zking.ga: could not connect to host
 zmsastro.co.za: could not connect to host
 zmy.im: did not receive HSTS header
 zocken.com: did not receive HSTS header
 zoe.vc: could not connect to host
 zohar.link: could not connect to host
+zolotoy-standart.com.ua: did not receive HSTS header
 zomiac.pp.ua: could not connect to host
 zoneminder.com: did not receive HSTS header
 zoners.si: could not connect to host
 zonky.io: could not connect to host
 zoo24.de: did not receive HSTS header
 zoofaeth.de: did not receive HSTS header
 zoomingin.net: max-age too low: 5184000
 zoommailing.com: did not receive HSTS header
--- 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(1518933382273000);
+const PRTime gPreloadListExpirationTime = INT64_C(1518975126211000);
 %%
 0.me.uk, 1
 00001.am, 1
 00002.am, 1
 0005pay.com, 1
 0010100.net, 1
 00220022.net, 1
 007-preisvergleich.de, 1
@@ -253,17 +253,16 @@ 365beautyworld.com, 1
 365healthworld.com, 1
 365maya.com, 1
 365skulls.com, 1
 3778vip.com, 1
 379700.com, 1
 38888msc.com, 1
 393335.ml, 1
 398.info, 1
-3ags.de, 1
 3bakayottu.com, 1
 3bigking.com, 1
 3c-d.de, 1
 3chat.org, 1
 3circlefunding.ch, 1
 3cs.ch, 1
 3dm.audio, 1
 3dmedium.de, 1
@@ -4840,16 +4839,17 @@ christopherpritchard.co.uk, 1
 christophertruncer.com, 1
 christophkreileder.com, 1
 christophsackl.de, 1
 chrisu3050.at, 1
 chrisupjohn.xyz, 1
 chriswarrick.com, 1
 chriswbarry.com, 1
 chriswells.io, 1
+chromaryu.net, 0
 chromaxa.com, 1
 chrome-devtools-frontend.appspot.com, 1
 chrome.com, 0
 chrome.google.com, 1
 chromebookchart.com, 1
 chromebooksforwork.com, 1
 chromiumbugs.appspot.com, 1
 chromiumcodereview.appspot.com, 0
@@ -5407,17 +5407,16 @@ compliance-systeme.de, 1
 compliancedictionary.com, 1
 complt.xyz, 1
 compostatebien.com.ar, 1
 compreautomacao.com.br, 1
 compredietlight.com.br, 1
 comprefitasadere.com.br, 1
 comprehensiveihc.com, 1
 compsmag.com, 1
-compubench.com, 1
 compucastell.ch, 1
 compucorner.mx, 1
 compuplast.cz, 1
 computehealth.com, 1
 computer-acquisti.com, 1
 computeracademy.co.za, 1
 computerassistance.co.uk, 1
 computerbase.de, 1
@@ -6393,17 +6392,16 @@ dbpkg.com, 1
 dbpmedia.se, 1
 dbq.com, 1
 dbtsai.com, 1
 dbyz.co.uk, 1
 dc-occasies.be, 1
 dc562.org, 1
 dc585.info, 1
 dcautomacao.com.br, 1
-dcc.cat, 1
 dcc.moe, 1
 dccoffeeproducts.com, 1
 dcepler.net, 1
 dchatelain.ch, 1
 dchest.org, 1
 dckd.nl, 1
 dclaisse.fr, 1
 dcmt.co, 1
@@ -6832,16 +6830,17 @@ dick.red, 1
 dickieslife.com, 1
 dicoding.com, 1
 didacte.com, 1
 didche.net, 1
 diddens.de, 1
 didierlaumen.be, 1
 die-besten-weisheiten.de, 1
 die-blahuts.de, 1
+die-borts.ch, 1
 die-gruenen-teufel.de, 1
 die-partei-reutlingen.de, 1
 die-sinlosen.de, 1
 die-speisekammer-reutlingen.de, 1
 diedrich.co, 0
 diedrich.me, 1
 diegelernten.de, 1
 diegerbers.de, 1
@@ -6985,17 +6984,17 @@ discha.net, 1
 disciples.io, 1
 discipul.nl, 1
 disclosure.io, 1
 disco-crazy-world.de, 1
 discofitta.com, 1
 disconformity.net, 1
 discord-chan.net, 1
 discordapp.com, 1
-discotek.club, 1
+discotek.club, 0
 discount24.de, 1
 discountmania.eu, 1
 discountmetaux.fr, 1
 discountplush.com, 1
 discover-mercure.com, 1
 discoverhealthage.com, 0
 discoveringdocker.com, 1
 discoverrsv.com, 1
@@ -7299,17 +7298,16 @@ doublethink.online, 1
 doubleup.com.au, 1
 doubleyummy.uk, 1
 doucheba.gs, 1
 doujinshi.info, 1
 dounats.com, 1
 douzer.de, 1
 dovenzorgmalawi.nl, 1
 dovro.de, 1
-dowc.org, 1
 downloadaja.com, 1
 downloadgamemods.com, 1
 downloadgram.com, 1
 downloadsoftwaregratisan.com, 1
 downtimerobot.com, 1
 downtimerobot.nl, 1
 downtownvernon.com, 1
 doyouedc.com, 1
@@ -8152,17 +8150,16 @@ ender.co.at, 1
 endingthedocumentgame.gov, 1
 endlessdiy.ca, 1
 endlessvideo.com, 1
 endofnet.org, 1
 endoftennancycleaning.co.uk, 1
 endohaus.us, 1
 enduranceday.be, 1
 endzeit-architekten.com, 0
-enecoshop.nl, 1
 enemiesoflight.de, 1
 energie-sante.ch, 1
 energiekeurplus.nl, 1
 energisammenslutningen.dk, 1
 energy-drink-magazin.de, 1
 energy-in-balance.eu, 1
 energy-infra.nl, 1
 energy.eu, 1
@@ -8884,17 +8881,16 @@ fanflow.com, 1
 fangs.ink, 1
 fanjoe.be, 1
 fant.dk, 0
 fantasiapainter.com, 1
 fantasticcleaners.com.au, 1
 fantasticgardenersmelbourne.com.au, 1
 fantastichandymanmelbourne.com.au, 1
 fantasticpestcontrolmelbourne.com.au, 1
-fantasyescortsbirmingham.co.uk, 1
 fantasyspectrum.com, 1
 fantopia.club, 1
 fanvoice.com, 1
 fanyue123.tk, 1
 fanz.pro, 1
 fanzlive.com, 1
 fap.no, 1
 faq.ie, 1
@@ -8902,16 +8898,17 @@ faq.lookout.com, 0
 fara.gov, 1
 faraslot8.com, 1
 faraslot8.net, 1
 farcecrew.de, 1
 faretravel.co.uk, 1
 farfallapets.com.br, 1
 farfetchos.com, 1
 fargtorget.se, 1
+farhadexchange.com, 1
 farhood.org, 1
 farid.is, 1
 farkas.bz, 1
 farm24.co.uk, 1
 farmacia.pt, 1
 farmaciaformula.com.br, 1
 farmacialaboratorio.it, 1
 farmer.dating, 1
@@ -9653,17 +9650,16 @@ frauenarzt-zinke.de, 1
 fraurichter.net, 1
 fraye.net, 1
 frbracch.it, 1
 frdl.ch, 1
 freaksites.dk, 1
 frebi.org, 1
 frebib.net, 1
 freddythechick.uk, 1
-frederik-braun.com, 1
 frederikschoell.de, 0
 fredliang.cn, 1
 fredloya.com, 1
 fredtec.ru, 1
 fredvoyage.fr, 1
 free-your-pc.com, 1
 free.com.tw, 1
 free8.xyz, 1
@@ -9875,17 +9871,17 @@ functions-online.com, 1
 fundacionfranciscofiasco.org, 1
 fundays.nl, 1
 fundchan.com, 1
 fundeego.com, 1
 funderburg.me, 1
 fundingempire.com, 1
 fundort.ch, 1
 funfunmstdn.tokyo, 1
-fungame.eu, 1
+fungame.eu, 0
 funi4u.com, 1
 funideas.org, 1
 funken-networks.de, 1
 funkes-ferien.de, 1
 funksteckdosen24.de, 0
 funktionel.co, 1
 funniestclip.com, 1
 funny-joke-pictures.com, 1
@@ -10280,16 +10276,17 @@ geri.be, 1
 germandarknes.net, 1
 germansoldiers.net, 1
 germanssky.de, 1
 germanticz.de, 1
 gernert-server.de, 1
 gero.io, 1
 gerritcodereview.com, 1
 gers-authentique.com, 1
+gerum.dynv6.net, 1
 gerwinvanderkamp.nl, 1
 ges-bo.de, 1
 geschenkly.de, 1
 geschmacksache.online, 1
 geschwinder.net, 1
 gestormensajeria.com, 1
 get-asterisk.ru, 1
 get-erp.ru, 1
@@ -10359,17 +10356,16 @@ geyduschek.be, 1
 gfast.ru, 1
 gfhgiro.nl, 0
 gfk-kunststoff-luebben.de, 1
 gflame.de, 1
 gflclan.ru, 1
 gforce.ninja, 1
 gfoss.eu, 1
 gfoss.gr, 1
-gfxbench.com, 1
 ggdcpt.com, 1
 gginin.today, 1
 ggl-luzern.ch, 1
 gglks.com, 1
 ggmmontascale.it, 1
 ggp2.com, 1
 ggrks-asano.com, 1
 ggs-marschallstrasse.de, 1
@@ -10420,16 +10416,17 @@ gilmoreid.com.au, 1
 gilnet.be, 1
 gilroywestwood.org, 1
 gina-architektur.design, 1
 gincher.net, 1
 ginionusedcars.be, 1
 ginja.co.th, 1
 ginkel.com, 1
 ginnegappen.nl, 1
+ginniemae.gov, 1
 ginzadelunch.jp, 1
 giochi-online.ws, 1
 giochistem.it, 1
 gioielleriamolena.com, 1
 gip-carif-idf.net, 1
 gip-carif-idf.org, 1
 giraffes.org, 1
 giri.co, 1
@@ -10583,16 +10580,17 @@ gogleapis.com, 1
 gogoodyear.eu, 1
 gogrow.com, 1
 gogsat.com, 1
 goguel.org, 1
 gohon.org, 1
 gohongi-katakori.com, 1
 goiaspropaganda.com.br, 1
 goingreen.com.au, 1
+gokhankesici.com, 1
 gokmenguresci.com, 1
 gold24.ru, 1
 goldcoasthypnotherapyhypnosis.com.au, 1
 goldenbadger.de, 1
 goldendawnapersonalaffair.com, 1
 goldenhillsoftware.com, 1
 goldenhost.ca, 1
 goldenplate.com.sg, 1
@@ -12196,17 +12194,16 @@ idtheft.gov, 1
 idubaj.cz, 1
 idvl.de, 1
 iec.pe, 1
 ieeesb.nl, 1
 ieeesbe.nl, 1
 ieeespmb.org, 1
 ieji.de, 0
 iemas.azurewebsites.net, 1
-iemb.cf, 1
 iemb.tk, 1
 ieval.ro, 1
 iewar.com, 1
 ifamily.top, 1
 ifan.ch, 1
 ifasec.de, 0
 ifcfg.me, 1
 ifconfig.co, 1
@@ -12239,17 +12236,16 @@ igimusic.com, 1
 igm-be.ch, 1
 ignace72.eu, 1
 ignat.by, 1
 ignitedmindz.in, 1
 igorw.org, 1
 igotoffer.com, 0
 igrivi.com, 1
 igsmgmt.com, 1
-iguana.com.ec, 0
 ih8sn0w.com, 1
 ihacklabs.com, 1
 ihatethissh.it, 1
 ihc.im, 1
 ihkk.net, 1
 ihollaback.org, 1
 ihopeit.works, 1
 ihostup.net, 1
@@ -12372,16 +12368,17 @@ immobilien-badlippspringe.de, 1
 immobilien-wallat.de, 1
 immobilier-nice.fr, 1
 immobilier92.net, 1
 immobiza.com, 1
 immortal.run, 1
 imokuri123.com, 1
 imoner.com, 1
 imoner.ga, 1
+imouyang.com, 1
 impact.health.nz, 1
 impacter.eu, 1
 impactfestival.be, 1
 impactpub.ch, 1
 impakho.com, 1
 imperdin.com, 1
 imperdintechnologies.com, 1
 imperial-legrand.com, 1
@@ -13131,16 +13128,17 @@ jakub-boucek.cz, 1
 jakubboucek.cz, 1
 jakubtopic.cz, 1
 jakubvrba.cz, 1
 jamaat.hk, 1
 jamberrynails.co.uk, 1
 james-bell.co.uk, 1
 james-loewen.com, 1
 jamesaimonetti.com, 1
+jamesbillingham.com, 1
 jamesbradach.com, 0
 jamescostian.com, 1
 jamesevans.is, 1
 jamesforman.co.nz, 1
 jamesheald.com, 1
 jameshemmings.co.uk, 1
 jameshost.net, 1
 jameshunt.us, 0
@@ -13417,17 +13415,16 @@ jmk.hu, 1
 jmoreau.ddns.net, 1
 jmotion.co.uk, 1
 jmpb.hu, 1
 jmpmotorsport.co.uk, 1
 jmsolodesigns.com, 1
 jmssg.jp, 1
 jmvbmx.ch, 1
 jmvdigital.com, 1
-jn1.me, 1
 jncde.de, 1
 jncie.de, 1
 jncie.eu, 1
 jncip.de, 1
 jnjdj.com, 1
 jnm-art.com, 1
 joa-ebert.com, 1
 joaosampaio.com.br, 1
@@ -13765,17 +13762,16 @@ k9swx.com, 1
 kaamoscreations.com, 1
 kaanduman.com, 1
 kaangenc.me, 1
 kaasbijwijn.nl, 1
 kaashosting.nl, 1
 kaatha-kamrater.se, 1
 kab-s.de, 1
 kabashop.com.br, 1
-kabat-fans.cz, 0
 kabeltv.co.nz, 1
 kabeuchi.com, 1
 kaboom.pw, 1
 kabu-abc.com, 1
 kabus.org, 1
 kachlikova2.cz, 1
 kack.website, 1
 kadmec.com, 1
@@ -14785,17 +14781,16 @@ lanbyte.se, 1
 lancejames.com, 1
 lancelafontaine.com, 1
 lanceyip.com, 1
 lancork.net, 1
 lancyvbc.ch, 1
 land.nrw, 0
 landbetweenthelakes.us, 1
 landflair-magazin.de, 1
-landofelves.net, 1
 lanetix.com, 1
 langatang.com, 1
 langbein.org, 1
 langguth.io, 1
 langkahteduh.com, 1
 langly.fr, 0
 languageterminal.com, 1
 langworth.com, 1
@@ -15290,16 +15285,17 @@ lightpics.net, 1
 lights.co.uk, 1
 lightspeed.com, 0
 lighttp.com, 1
 lightworkerandempathsupport.com, 1
 lignoma.com, 1
 ligonier.com, 1
 lihaul.dnsalias.net, 1
 lijero.co, 1
+likc.me, 1
 likeablehub.com, 1
 likeabox.de, 1
 likeaross.com, 0
 likegeeks.com, 1
 likehifi.de, 1
 likemovies.de, 1
 likenewhearing.com.au, 1
 likenosis.com, 1
@@ -15447,17 +15443,16 @@ liud.im, 1
 liudon.org, 1
 liukang.tech, 1
 liul.in, 1
 liushuyu.tk, 1
 liv3ly.com, 1
 livecards.co.uk, 1
 livedesign.at, 1
 livedesign24.de, 1
-liveflightapp.com, 1
 liveforspeed.se, 1
 livejasmin.dk, 1
 livekaarten.be, 1
 livekaarten.nl, 1
 livekort.com, 1
 livekort.dk, 1
 livekort.no, 1
 livekort.se, 1
@@ -15909,16 +15904,17 @@ macaw.nl, 1
 macaws.org, 1
 macedopesca.com.br, 1
 maceinturecuir.com, 1
 maces-net.de, 1
 mach-politik.ch, 1
 mach1club.com, 1
 macha.cloud, 1
 machbach.com, 1
+machbach.net, 1
 machikka.com, 0
 macht-elektro.de, 1
 machtweb.de, 1
 macinyasha.net, 1
 macker.io, 1
 mackey7.net, 1
 maclemon.at, 1
 macleod.io, 1
@@ -16295,17 +16291,16 @@ marqueswines.co.uk, 1
 marrai.de, 1
 marriage-shrine.jp, 1
 marrickvilleapartments.com.au, 1
 marsanvet.com, 1
 marsatapp.com, 1
 marsble.com, 1
 marshmallow.co, 1
 martelange.ovh, 1
-martensen.me, 0
 martensmxservice.nl, 1
 marti201.ga, 1
 martiestrimsalon.nl, 1
 martin-arend.de, 1
 martin-mattel.com, 1
 martin-smith.info, 1
 martine.nu, 1
 martingansler.de, 1
@@ -18034,16 +18029,17 @@ natatorium.org, 1
 natecraun.net, 1
 natenom.com, 1
 natenom.de, 1
 natenom.name, 1
 nathaliebaron.ch, 1
 nathaliebaroncoaching.ch, 1
 nathan.io, 1
 nathankonopinski.com, 1
+nathanmfarrugia.com, 1
 nathansmetana.com, 1
 nathumarket.com.br, 1
 nationalcentereg.org, 1
 nationalcrimecheck.com.au, 1
 nationalmap.gov, 1
 nationalpriorities.org, 1
 nationaltaxprep.com, 1
 natives-team.ch, 1
@@ -18393,16 +18389,17 @@ newtnote.com, 1
 newtonhaus.com, 1
 newtrackon.com, 1
 nex.sx, 1
 nexgeneration-solutions.com, 1
 nexicafiles.com, 1
 nexlab.org, 1
 next-log.ru, 0
 next-taxi.ru, 1
+next24.io, 1
 nextads.ch, 1
 nextcairn.com, 1
 nextcloud.com, 1
 nextcloud.li, 1
 nextend.net, 1
 nextend.org, 1
 nextgen.sk, 1
 nextgencel.com, 1
@@ -18587,17 +18584,16 @@ niu.moe, 1
 niva.synology.me, 1
 nivi.ca, 1
 nix.org.ua, 0
 nixonlibrary.gov, 1
 niyawe.de, 1
 nja.id.au, 1
 njpjanssen.nl, 1
 nkadvertising.online, 1
-nkautoservice.nl, 1
 nkb.in.th, 1
 nkinka.de, 1
 nkp-media.de, 1
 nl-ix.net, 1
 nl.search.yahoo.com, 0
 nlap.ca, 1
 nlbewustgezond.nl, 1
 nlegall.fr, 1
@@ -18668,16 +18664,17 @@ noob-box.net, 0
 noobunbox.net, 1
 noodles.net.nz, 1
 noodplan.co.za, 1
 noodweer.be, 1
 noop.ch, 1
 noordsee.de, 1
 noorsolidarity.com, 1
 nootropic.com, 1
+nootropicsource.com, 1
 nopaste.xyz, 1
 nord-sud.be, 1
 nordakademie.de, 1
 nordic-survival.de, 1
 nordiccasinocommunity.com, 1
 nordinfo.fi, 1
 nordmoregatebilklubb.com, 1
 nordnetz-hamburg.de, 1
@@ -19241,17 +19238,16 @@ openconnect.com.au, 1
 opendataincubator.eu, 1
 openevic.info, 1
 openfir.st, 1
 openfitapi-falke.azurewebsites.net, 1
 opengg.me, 1
 openings.ninja, 1
 openintelligence.uk, 1
 openiocdb.com, 1
-openitforum.pl, 1
 openkim.org, 1
 openkvk.nl, 1
 openmirrors.cf, 1
 opennippon.com, 1
 opennippon.ru, 1
 openpictures.ch, 1
 openquery.com.au, 1
 openrainbow.com, 1
@@ -20509,17 +20505,16 @@ poleartschool.com, 0
 poles4pilots.com, 1
 policedriver.com, 1
 polis.or.at, 1
 polis.to, 0
 polish.directory, 1
 polit.im, 1
 politeiaudesa.org, 1
 politic.org.ua, 1
-politiewervingshop.nl, 1
 politik-bei-uns.de, 1
 polizeiwallis.ch, 1
 polkam.go.id, 1
 pollet-ghijs.be, 1
 pollet-ghys.be, 1
 polletmera.com, 1
 pollingplace.uk, 1
 pollpodium.nl, 1
@@ -20922,17 +20917,16 @@ propepper.net, 1
 propershave.com, 1
 properticons.com, 1
 property-catalogue.eu, 1
 propertygroup.pl, 1
 propertyone.mk, 1
 propipesystem.com, 1
 proplan.co.il, 1
 propmag.co, 1
-proposalonline.com, 1
 propr.no, 1
 propseller.com, 1
 proslimdiets.com, 1
 prospanek.cz, 1
 prospo.co, 1
 prostohobby.ru, 1
 prostye-recepty.com, 1
 prot.ch, 1
@@ -21898,17 +21892,16 @@ richardson.engineering, 1
 richardson.pictures, 1
 richardson.software, 1
 richardson.systems, 1
 richardwarrender.com, 1
 richeza.com, 1
 richonrails.com, 1
 ricketyspace.net, 1
 ricki-z.com, 1
-rickmartensen.nl, 1
 ricknox.com, 1
 rickrongen.nl, 1
 rickweijers.nl, 1
 rickyromero.com, 1
 rico-brase.de, 0
 ricochet.im, 1
 ricozienke.de, 1
 riddims.co, 1
@@ -23867,16 +23860,17 @@ slangbellor.com, 1
 slapen17.nl, 1
 slaps.be, 1
 slash64.co.uk, 1
 slash64.com, 1
 slash64.uk, 1
 slashbits.no, 1
 slaughterhouse.fr, 1
 slaws.io, 1
+sleeklounge.com, 1
 sleeplessbeastie.eu, 1
 sleepmap.de, 1
 sleepstar.co.uk, 1
 sleepstar.de, 1
 sleio.com, 1
 slever.cz, 1
 slevermann.de, 1
 slevomat.cz, 1
@@ -24312,17 +24306,16 @@ spawn.cz, 1
 spaysy.com, 1
 spaziobenedetti.com.br, 1
 spaziopervoi.com.br, 1
 spdepartamentos.com.br, 1
 spdf.net, 1
 spearfishingmx.com, 1
 speciesism.com, 1
 spectrosoftware.de, 1
-spedition-transport-umzug.de, 1
 spedplus.com.br, 0
 speech-balloon.com, 1
 speechmate.com, 1
 speechndraw.com, 1
 speeddate.it, 0
 speedracer.ca, 1
 speeds.vip, 1
 speedsportofhull.co.uk, 1
@@ -24955,16 +24948,17 @@ summer.ga, 1
 summercampthailand.com, 1
 summitmasters.net, 1
 sumthing.com, 1
 sunbritetv.com, 1
 sundaycooks.com, 1
 sundayfundayjapan.com, 1
 suneilpatel.com, 1
 sunfireshop.com.br, 1
+sunflyer.cn, 0
 sunfox.cz, 1
 sunfulong.me, 1
 sungo.wtf, 1
 sunjaydhama.com, 1
 sunn.ie, 1
 sunsetwx.com, 1
 sunshinesf.org, 1
 sunsmartresorts.com, 1
@@ -25646,16 +25640,17 @@ tetsumaki.net, 1
 teuniz.nl, 1
 teunstuinposters.nl, 0
 teva-li.com, 1
 tewarilab.co.uk, 1
 texasllcpros.com, 1
 texastwostepdivorce.com, 1
 texby.com, 1
 texhnolyze.net, 1
+text-shirt.com, 1
 textburst.com, 1
 texter-linz.at, 1
 texter.at, 1
 texterseo.at, 1
 texterseo.de, 1
 textpedia.org, 1
 textualapp.com, 1
 texture.net.au, 1
@@ -26181,16 +26176,17 @@ tkarstens.de, 0
 tkat.ch, 1
 tkgpm.com, 1
 tkjg.fi, 1
 tkn.me, 1
 tkn.tokyo, 1
 tkts.cl, 1
 tkusano.jp, 1
 tkw01536.de, 1
+tlach.cz, 1
 tlca.org, 1
 tlcnet.info, 1
 tlehseasyads.com, 1
 tlo.xyz, 1
 tloxygen.com, 1
 tls.builders, 1
 tls.care, 1
 tls1914.org, 1
@@ -26649,17 +26645,16 @@ trefcon.cz, 1
 trefpuntdemeent.nl, 1
 treinaweb.com.br, 1
 treinonerd.com, 1
 trek-planet.ru, 1
 treker.us, 1
 trekfriend.com, 1
 tremlor.com, 1
 tremolosoftware.com, 1
-tremoureux.fr, 1
 trendingpulse.com, 1
 trendisland.de, 1
 trendkraft.de, 1
 trendydips.com, 1
 trenta.io, 1
 trentmaydew.com, 1
 tresorit.com, 1
 tresorsecurity.com, 1
@@ -28048,17 +28043,16 @@ watchinventory.com, 1
 watchstyle.com, 1
 watchtv-online.pw, 1
 watchweasel.com, 1
 waterfedpole.com, 1
 watermonitor.gov, 1
 watersb.org, 1
 watertrails.io, 1
 watsonwork.me, 1
-wattechweb.com, 1
 wave-ola.es, 1
 wavesboardshop.com, 1
 wavesoftime.com, 1
 wawak.pl, 1
 waxdramatic.com, 1
 waylaydesign.com, 1
 wayne.cloud, 0
 wayohoo.com, 1
@@ -29557,17 +29551,16 @@ zamow.co, 1
 zandcell.com, 1
 zanthra.com, 1
 zaoext.com, 1
 zapier.com, 1
 zappbuildapps.com, 1
 zaratan.fr, 1
 zarmarket.org, 1
 zarpo.com.br, 1
-zary.me, 1
 zaufanatrzeciastrona.pl, 1
 zavec.com.ec, 1
 zavetaji.lv, 1
 zawo-electric.de, 1
 zbasenem.pl, 1
 zbchen.com, 1
 zberger.com, 1
 zbetcheck.in, 1
@@ -29717,17 +29710,16 @@ zodiacohouses.com, 1
 zoeller.me, 1
 zohar.shop, 1
 zohar.wang, 0
 zoigl.club, 1
 zojadravai.com, 1
 zoki.art, 1
 zokster.net, 1
 zolokar.xyz, 1
-zolotoy-standart.com.ua, 1
 zombiesecured.com, 1
 zomerschoen.nl, 1
 zone-produkte.de, 1
 zone39.com, 1
 zonecb.com, 1
 zonemaster.fr, 1
 zonemaster.net, 1
 zonesec.org, 1
--- a/servo/Cargo.lock
+++ b/servo/Cargo.lock
@@ -1183,17 +1183,17 @@ dependencies = [
  "compositing 0.0.1",
  "euclid 0.15.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "gdi32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "gleam 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "libservo 0.0.1",
  "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "msg 0.0.1",
  "net_traits 0.0.1",
- "osmesa-src 17.2.0-devel (git+https://github.com/servo/osmesa-src)",
+ "osmesa-src 17.3.0-devel (git+https://github.com/servo/osmesa-src)",
  "osmesa-sys 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "script_traits 0.0.1",
  "servo-egl 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "servo-glutin 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "servo_config 0.0.1",
  "servo_geometry 0.0.1",
  "servo_url 0.0.1",
  "style_traits 0.0.1",
@@ -2207,18 +2207,18 @@ version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "num-traits 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)",
  "unreachable 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "osmesa-src"
-version = "17.2.0-devel"
-source = "git+https://github.com/servo/osmesa-src#206464252f31583c2338393f8b6da99780a1ebdf"
+version = "17.3.0-devel"
+source = "git+https://github.com/servo/osmesa-src#100789c549a5716773a74a5db0a2e929470e2c9f"
 
 [[package]]
 name = "osmesa-sys"
 version = "0.1.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "shared_library 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
@@ -3933,17 +3933,17 @@ dependencies = [
 "checksum odds 0.2.25 (registry+https://github.com/rust-lang/crates.io-index)" = "c3df9b730298cea3a1c3faa90b7e2f9df3a9c400d0936d6015e6165734eefcba"
 "checksum offscreen_gl_context 0.11.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ee0b17158af8e1fb6c8f8df048bd3f1c4b78bebbf4883f189e2a83ce853ce9bd"
 "checksum ogg 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7137bf02687385302f4c0aecd77cfce052b69f5b4ee937be778e125c62f67e30"
 "checksum ogg_metadata 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fc665717454399cba557c55ad226148996e9266ee291f8a37a98bb2cded0a490"
 "checksum open 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3478ed1686bd1300c8a981a940abc92b06fac9cbef747f4c668d4e032ff7b842"
 "checksum openssl 0.9.12 (registry+https://github.com/rust-lang/crates.io-index)" = "bb5d1663b73d10c6a3eda53e2e9d0346f822394e7b858d7257718f65f61dfbe2"
 "checksum openssl-sys 0.9.12 (registry+https://github.com/rust-lang/crates.io-index)" = "3a5886d87d3e2a0d890bf62dc8944f5e3769a405f7e1e9ef6e517e47fd7a0897"
 "checksum ordered-float 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "da12c96037889ae0be29dd2bdd260e5a62a7df24e6466d5a15bb8131c1c200a8"
-"checksum osmesa-src 17.2.0-devel (git+https://github.com/servo/osmesa-src)" = "<none>"
+"checksum osmesa-src 17.3.0-devel (git+https://github.com/servo/osmesa-src)" = "<none>"
 "checksum osmesa-sys 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "88cfece6e95d2e717e0872a7f53a8684712ad13822a7979bc760b9c77ec0013b"
 "checksum ovr-mobile-sys 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b7b5f9389b2015f8340f0566c488f3e96735e2e8fd7b85d571832cd274ac2998"
 "checksum owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cdf84f41639e037b484f93433aa3897863b561ed65c6e59c7073d7c561710f37"
 "checksum parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "149d8f5b97f3c1133e3cfcd8886449959e856b557ff281e292b733d7c69e005e"
 "checksum parking_lot_core 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "4f610cb9664da38e417ea3225f23051f589851999535290e077939838ab7a595"
 "checksum parse-hosts 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f3842db828281691db6e6f1709ed6a73025747c0cd15cc10346a5cb021e2bc28"
 "checksum pdqsort 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ceca1642c89148ca05611cc775a0c383abef355fc4907c4e95f49f7b09d6287c"
 "checksum peeking_take_while 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099"
--- a/servo/components/layout_thread/dom_wrapper.rs
+++ b/servo/components/layout_thread/dom_wrapper.rs
@@ -46,17 +46,17 @@ use script::layout_exports::{LayoutChara
 use script::layout_exports::{LayoutElementHelpers, LayoutNodeHelpers, RawLayoutElementHelpers};
 use script::layout_exports::LayoutDom;
 use script::layout_exports::PendingRestyle;
 use script_layout_interface::{HTMLCanvasData, LayoutNodeType, SVGSVGData, TrustedNodeAddress};
 use script_layout_interface::{OpaqueStyleAndLayoutData, StyleData};
 use script_layout_interface::wrapper_traits::{DangerousThreadSafeLayoutNode, GetLayoutData, LayoutNode};
 use script_layout_interface::wrapper_traits::{PseudoElementType, ThreadSafeLayoutElement, ThreadSafeLayoutNode};
 use selectors::attr::{AttrSelectorOperation, NamespaceConstraint, CaseSensitivity};
-use selectors::matching::{ElementSelectorFlags, LocalMatchingContext, MatchingContext, RelevantLinkStatus};
+use selectors::matching::{ElementSelectorFlags, MatchingContext, RelevantLinkStatus};
 use selectors::matching::VisitedHandlingMode;
 use selectors::sink::Push;
 use servo_arc::{Arc, ArcBorrow};
 use servo_atoms::Atom;
 use servo_url::ServoUrl;
 use std::fmt;
 use std::fmt::Debug;
 use std::hash::{Hash, Hasher};
@@ -715,17 +715,17 @@ impl<'le> ::selectors::Element for Servo
                             _context: &mut MatchingContext)
                             -> bool
     {
         false
     }
 
     fn match_non_ts_pseudo_class<F>(&self,
                                     pseudo_class: &NonTSPseudoClass,
-                                    _: &mut LocalMatchingContext<Self::Impl>,
+                                    _: &mut MatchingContext,
                                     _: &RelevantLinkStatus,
                                     _: &mut F)
                                     -> bool
         where F: FnMut(&Self, ElementSelectorFlags),
     {
         match *pseudo_class {
             // https://github.com/servo/servo/issues/8718
             NonTSPseudoClass::Link |
@@ -1235,17 +1235,17 @@ impl<'le> ::selectors::Element for Servo
                 };
                 values.iter().any(|v| v.eval_selector(operation))
             }
         }
     }
 
     fn match_non_ts_pseudo_class<F>(&self,
                                     _: &NonTSPseudoClass,
-                                    _: &mut LocalMatchingContext<Self::Impl>,
+                                    _: &mut MatchingContext,
                                     _: &RelevantLinkStatus,
                                     _: &mut F)
                                     -> bool
         where F: FnMut(&Self, ElementSelectorFlags),
     {
         // NB: This could maybe be implemented
         warn!("ServoThreadSafeLayoutElement::match_non_ts_pseudo_class called");
         false
--- a/servo/components/script/dom/element.rs
+++ b/servo/components/script/dom/element.rs
@@ -84,17 +84,17 @@ use html5ever::serialize::TraversalScope
 use js::jsapi::Heap;
 use js::jsval::JSVal;
 use net_traits::request::CorsSettings;
 use ref_filter_map::ref_filter_map;
 use script_layout_interface::message::ReflowGoal;
 use script_thread::ScriptThread;
 use selectors::Element as SelectorsElement;
 use selectors::attr::{AttrSelectorOperation, NamespaceConstraint, CaseSensitivity};
-use selectors::matching::{ElementSelectorFlags, LocalMatchingContext, MatchingContext, RelevantLinkStatus};
+use selectors::matching::{ElementSelectorFlags, MatchingContext, MatchingMode, RelevantLinkStatus};
 use selectors::matching::{HAS_EDGE_CHILD_SELECTOR, HAS_SLOW_SELECTOR, HAS_SLOW_SELECTOR_LATER_SIBLINGS};
 use selectors::sink::Push;
 use servo_arc::Arc;
 use servo_atoms::Atom;
 use std::ascii::AsciiExt;
 use std::borrow::Cow;
 use std::cell::{Cell, Ref};
 use std::default::Default;
@@ -1301,44 +1301,32 @@ impl Element {
     }
 
     pub fn get_url_attribute(&self, local_name: &LocalName) -> DOMString {
         assert!(*local_name == local_name.to_ascii_lowercase());
         let attr = match self.get_attribute(&ns!(), local_name) {
             Some(attr) => attr,
             None => return DOMString::new(),
         };
-        let value = attr.value();
-        match *value {
-            AttrValue::Url(ref value, _) => {
-                // XXXManishearth this doesn't handle `javascript:` urls properly
-                let base = document_from_node(self).base_url();
-                let value = base.join(value)
-                    .map(|parsed| parsed.into_string())
-                    .unwrap_or_else(|_| value.clone());
-                DOMString::from(value)
-            },
-            _ => panic!("attribute value should be AttrValue::Url(..)"),
-        }
-    }
-
-    pub fn set_url_attribute(&self, local_name: &LocalName, value: DOMString) {
-        let value = AttrValue::from_url(
-            document_from_node(self).base_url(),
-            value.into(),
-        );
-        self.set_attribute(local_name, value);
+        let value = &**attr.value();
+        // XXXManishearth this doesn't handle `javascript:` urls properly
+        let base = document_from_node(self).base_url();
+        let value = base.join(value)
+            .map(|parsed| parsed.into_string())
+            .unwrap_or_else(|_| value.to_owned());
+        DOMString::from(value)
     }
 
     pub fn get_string_attribute(&self, local_name: &LocalName) -> DOMString {
         match self.get_attribute(&ns!(), local_name) {
             Some(x) => x.Value(),
             None => DOMString::new(),
         }
     }
+
     pub fn set_string_attribute(&self, local_name: &LocalName, value: DOMString) {
         assert!(*local_name == local_name.to_ascii_lowercase());
         self.set_attribute(local_name, AttrValue::String(value.into()));
     }
 
     pub fn get_tokenlist_attribute(&self, local_name: &LocalName) -> Vec<Atom> {
         self.get_attribute(&ns!(), local_name).map(|attr| {
             attr.value()
@@ -2578,17 +2566,17 @@ impl<'a> SelectorsElement for DomRoot<El
     }
 
     fn get_namespace(&self) -> &Namespace {
         self.namespace()
     }
 
     fn match_non_ts_pseudo_class<F>(&self,
                                     pseudo_class: &NonTSPseudoClass,
-                                    _: &mut LocalMatchingContext<Self::Impl>,
+                                    _: &mut MatchingContext,
                                     _: &RelevantLinkStatus,
                                     _: &mut F)
                                     -> bool
         where F: FnMut(&Self, ElementSelectorFlags),
     {
         match *pseudo_class {
             // https://github.com/servo/servo/issues/8718
             NonTSPseudoClass::Link |
--- a/servo/components/script/dom/htmlbodyelement.rs
+++ b/servo/components/script/dom/htmlbodyelement.rs
@@ -1,15 +1,14 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 use cssparser::RGBA;
 use dom::attr::Attr;
-use dom::bindings::codegen::Bindings::AttrBinding::AttrBinding::AttrMethods;
 use dom::bindings::codegen::Bindings::HTMLBodyElementBinding::{self, HTMLBodyElementMethods};
 use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods;
 use dom::bindings::inheritance::Castable;
 use dom::bindings::root::{LayoutDom, DomRoot};
 use dom::bindings::str::DOMString;
 use dom::document::Document;
 use dom::element::{AttributeMutation, Element, RawLayoutElementHelpers};
 use dom::eventtarget::EventTarget;
@@ -69,25 +68,26 @@ impl HTMLBodyElementMethods for HTMLBody
 
     // https://html.spec.whatwg.org/multipage/#dom-body-text
     make_getter!(Text, "text");
 
     // https://html.spec.whatwg.org/multipage/#dom-body-text
     make_legacy_color_setter!(SetText, "text");
 
     // https://html.spec.whatwg.org/multipage/#dom-body-background
-    fn Background(&self) -> DOMString {
-        self.upcast::<Element>()
-            .get_attribute(&ns!(), &local_name!("background"))
-            .map(|attr| attr.Value())
-            .unwrap_or_default()
-    }
+    make_getter!(Background, "background");
 
     // https://html.spec.whatwg.org/multipage/#dom-body-background
-    make_url_setter!(SetBackground, "background");
+    fn SetBackground(&self, input: DOMString) {
+        let value = AttrValue::from_resolved_url(
+            &document_from_node(self).base_url(),
+            input.into(),
+        );
+        self.upcast::<Element>().set_attribute(&local_name!("background"), value);
+    }
 
     // https://html.spec.whatwg.org/multipage/#windoweventhandlers
     window_event_handlers!(ForwardToWindow);
 }
 
 pub trait HTMLBodyElementLayoutHelpers {
     fn get_background_color(&self) -> Option<RGBA>;
     fn get_color(&self) -> Option<RGBA>;
@@ -115,17 +115,17 @@ impl HTMLBodyElementLayoutHelpers for La
         }
     }
 
     #[allow(unsafe_code)]
     fn get_background(&self) -> Option<ServoUrl> {
         unsafe {
             (*self.upcast::<Element>().unsafe_get())
                 .get_attr_for_layout(&ns!(), &local_name!("background"))
-                .and_then(AttrValue::as_url)
+                .and_then(AttrValue::as_resolved_url)
                 .cloned()
         }
     }
 }
 
 impl VirtualMethods for HTMLBodyElement {
     fn super_type(&self) -> Option<&VirtualMethods> {
         Some(self.upcast::<HTMLElement>() as &VirtualMethods)
@@ -155,17 +155,20 @@ impl VirtualMethods for HTMLBodyElement 
         window.upcast::<GlobalScope>().script_to_constellation_chan().send(event).unwrap();
     }
 
     fn parse_plain_attribute(&self, name: &LocalName, value: DOMString) -> AttrValue {
         match *name {
             local_name!("bgcolor") |
             local_name!("text") => AttrValue::from_legacy_color(value.into()),
             local_name!("background") => {
-                AttrValue::from_url(document_from_node(self).base_url(), value.into())
+                AttrValue::from_resolved_url(
+                    &document_from_node(self).base_url(),
+                    value.into(),
+                )
             },
             _ => self.super_type().unwrap().parse_plain_attribute(name, value),
         }
     }
 
     fn attribute_mutated(&self, attr: &Attr, mutation: AttributeMutation) {
         let do_super_mutate = match (attr.local_name(), mutation) {
             (name, AttributeMutation::Set(_)) if name.starts_with("on") => {
--- a/servo/components/script/dom/htmliframeelement.rs
+++ b/servo/components/script/dom/htmliframeelement.rs
@@ -566,17 +566,17 @@ pub fn Navigate(iframe: &HTMLIFrameEleme
     Err(Error::NotSupported)
 }
 
 impl HTMLIFrameElementMethods for HTMLIFrameElement {
     // https://html.spec.whatwg.org/multipage/#dom-iframe-src
     make_url_getter!(Src, "src");
 
     // https://html.spec.whatwg.org/multipage/#dom-iframe-src
-    make_url_setter!(SetSrc, "src");
+    make_setter!(SetSrc, "src");
 
     // https://html.spec.whatwg.org/multipage/#dom-iframe-sandbox
     fn Sandbox(&self) -> DomRoot<DOMTokenList> {
         self.sandbox.or_init(|| DOMTokenList::new(self.upcast::<Element>(), &local_name!("sandbox")))
     }
 
     // https://html.spec.whatwg.org/multipage/#dom-iframe-contentwindow
     fn GetContentWindow(&self) -> Option<DomRoot<WindowProxy>> {
@@ -756,17 +756,16 @@ impl VirtualMethods for HTMLIFrameElemen
                 }
             },
             _ => {},
         }
     }
 
     fn parse_plain_attribute(&self, name: &LocalName, value: DOMString) -> AttrValue {
         match name {
-            &local_name!("src") => AttrValue::from_url(document_from_node(self).base_url(), value.into()),
             &local_name!("sandbox") => AttrValue::from_serialized_tokenlist(value.into()),
             &local_name!("width") => AttrValue::from_dimension(value.into()),
             &local_name!("height") => AttrValue::from_dimension(value.into()),
             _ => self.super_type().unwrap().parse_plain_attribute(name, value),
         }
     }
 
     fn bind_to_tree(&self, tree_in_doc: bool) {
--- a/servo/components/script/dom/htmlimageelement.rs
+++ b/servo/components/script/dom/htmlimageelement.rs
@@ -821,17 +821,17 @@ impl HTMLImageElementMethods for HTMLIma
     make_getter!(Alt, "alt");
     // https://html.spec.whatwg.org/multipage/#dom-img-alt
     make_setter!(SetAlt, "alt");
 
     // https://html.spec.whatwg.org/multipage/#dom-img-src
     make_url_getter!(Src, "src");
 
     // https://html.spec.whatwg.org/multipage/#dom-img-src
-    make_url_setter!(SetSrc, "src");
+    make_setter!(SetSrc, "src");
 
     // https://html.spec.whatwg.org/multipage/#dom-img-crossOrigin
     fn GetCrossOrigin(&self) -> Option<DOMString> {
         reflect_cross_origin_attribute(self.upcast::<Element>())
     }
 
     // https://html.spec.whatwg.org/multipage/#dom-img-crossOrigin
     fn SetCrossOrigin(&self, value: Option<DOMString>) {
@@ -976,17 +976,16 @@ impl VirtualMethods for HTMLImageElement
         match attr.local_name() {
             &local_name!("src") => self.update_the_image_data(),
             _ => {},
         }
     }
 
     fn parse_plain_attribute(&self, name: &LocalName, value: DOMString) -> AttrValue {
         match name {
-            &local_name!("src") => AttrValue::from_url(document_from_node(self).base_url(), value.into()),
             &local_name!("name") => AttrValue::from_atomic(value.into()),
             &local_name!("width") | &local_name!("height") => AttrValue::from_dimension(value.into()),
             &local_name!("hspace") | &local_name!("vspace") => AttrValue::from_u32(value.into(), 0),
             _ => self.super_type().unwrap().parse_plain_attribute(name, value),
         }
     }
 
     fn handle_event(&self, event: &Event) {
--- a/servo/components/script/dom/htmlinputelement.rs
+++ b/servo/components/script/dom/htmlinputelement.rs
@@ -525,17 +525,17 @@ impl HTMLInputElementMethods for HTMLInp
 
     // https://html.spec.whatwg.org/multipage/#dom-input-required
     make_bool_setter!(SetRequired, "required");
 
     // https://html.spec.whatwg.org/multipage/#dom-input-src
     make_url_getter!(Src, "src");
 
     // https://html.spec.whatwg.org/multipage/#dom-input-src
-    make_url_setter!(SetSrc, "src");
+    make_setter!(SetSrc, "src");
 
     // https://html.spec.whatwg.org/multipage/#dom-input-step
     make_getter!(Step, "step");
 
     // https://html.spec.whatwg.org/multipage/#dom-input-step
     make_setter!(SetStep, "step");
 
     // https://html.spec.whatwg.org/multipage/#dom-input-indeterminate
@@ -1051,17 +1051,16 @@ impl VirtualMethods for HTMLInputElement
                 self.form_attribute_mutated(mutation);
             },
             _ => {},
         }
     }
 
     fn parse_plain_attribute(&self, name: &LocalName, value: DOMString) -> AttrValue {
         match name {
-            &local_name!("src") => AttrValue::from_url(document_from_node(self).base_url(), value.into()),
             &local_name!("accept") => AttrValue::from_comma_separated_tokenlist(value.into()),
             &local_name!("name") => AttrValue::from_atomic(value.into()),
             &local_name!("size") => AttrValue::from_limited_u32(value.into(), DEFAULT_INPUT_SIZE),
             &local_name!("type") => AttrValue::from_atomic(value.into()),
             &local_name!("maxlength") => AttrValue::from_limited_i32(value.into(), DEFAULT_MAX_LENGTH),
             &local_name!("minlength") => AttrValue::from_limited_i32(value.into(), DEFAULT_MIN_LENGTH),
             _ => self.super_type().unwrap().parse_plain_attribute(name, value),
         }
--- a/servo/components/script/dom/htmllinkelement.rs
+++ b/servo/components/script/dom/htmllinkelement.rs
@@ -203,17 +203,16 @@ impl VirtualMethods for HTMLLinkElement 
                 }
             },
             _ => {},
         }
     }
 
     fn parse_plain_attribute(&self, name: &LocalName, value: DOMString) -> AttrValue {
         match name {
-            &local_name!("href") => AttrValue::from_url(document_from_node(self).base_url(), value.into()),
             &local_name!("rel") => AttrValue::from_serialized_tokenlist(value.into()),
             _ => self.super_type().unwrap().parse_plain_attribute(name, value),
         }
     }
 
     fn bind_to_tree(&self, tree_in_doc: bool) {
         if let Some(ref s) = self.super_type() {
             s.bind_to_tree(tree_in_doc);
@@ -369,17 +368,17 @@ impl StylesheetOwner for HTMLLinkElement
     }
 }
 
 impl HTMLLinkElementMethods for HTMLLinkElement {
     // https://html.spec.whatwg.org/multipage/#dom-link-href
     make_url_getter!(Href, "href");
 
     // https://html.spec.whatwg.org/multipage/#dom-link-href
-    make_url_setter!(SetHref, "href");
+    make_setter!(SetHref, "href");
 
     // https://html.spec.whatwg.org/multipage/#dom-link-rel
     make_getter!(Rel, "rel");
 
     // https://html.spec.whatwg.org/multipage/#dom-link-rel
     fn SetRel(&self, rel: DOMString) {
         self.upcast::<Element>().set_tokenlist_attribute(&local_name!("rel"), rel);
     }
--- a/servo/components/script/dom/htmlmediaelement.rs
+++ b/servo/components/script/dom/htmlmediaelement.rs
@@ -41,17 +41,16 @@ use net_traits::request::{CredentialsMod
 use network_listener::{NetworkListener, PreInvoke};
 use script_thread::ScriptThread;
 use servo_url::ServoUrl;
 use std::cell::Cell;
 use std::collections::VecDeque;
 use std::mem;
 use std::rc::Rc;
 use std::sync::{Arc, Mutex};
-use style::attr::AttrValue;
 use task_source::TaskSource;
 use time::{self, Timespec, Duration};
 
 #[dom_struct]
 // FIXME(nox): A lot of tasks queued for this element should probably be in the
 // media element event task source.
 pub struct HTMLMediaElement {
     htmlelement: HTMLElement,
@@ -835,17 +834,17 @@ impl HTMLMediaElementMethods for HTMLMed
     make_bool_getter!(Autoplay, "autoplay");
     // https://html.spec.whatwg.org/multipage/#dom-media-autoplay
     make_bool_setter!(SetAutoplay, "autoplay");
 
     // https://html.spec.whatwg.org/multipage/#dom-media-src
     make_url_getter!(Src, "src");
 
     // https://html.spec.whatwg.org/multipage/#dom-media-src
-    make_url_setter!(SetSrc, "src");
+    make_setter!(SetSrc, "src");
 
     // https://html.spec.whatwg.org/multipage/#dom-media-srcobject
     fn GetSrcObject(&self) -> Option<DomRoot<Blob>> {
         self.src_object.get()
     }
 
     // https://html.spec.whatwg.org/multipage/#dom-media-srcobject
     fn SetSrcObject(&self, value: Option<&Blob>) {
@@ -910,23 +909,16 @@ impl HTMLMediaElementMethods for HTMLMed
     }
 }
 
 impl VirtualMethods for HTMLMediaElement {
     fn super_type(&self) -> Option<&VirtualMethods> {
         Some(self.upcast::<HTMLElement>() as &VirtualMethods)
     }
 
-    fn parse_plain_attribute(&self, name: &LocalName, value: DOMString) -> AttrValue {
-        match name {
-            &local_name!("src") => AttrValue::from_url(document_from_node(self).base_url(), value.into()),
-            _ => self.super_type().unwrap().parse_plain_attribute(name, value),
-        }
-    }
-
     fn attribute_mutated(&self, attr: &Attr, mutation: AttributeMutation) {
         self.super_type().unwrap().attribute_mutated(attr, mutation);
 
         match attr.local_name() {
             &local_name!("src") => {
                 if mutation.new_value(attr).is_some() {
                     self.media_element_load_algorithm();
                 }
--- a/servo/components/script/dom/htmlscriptelement.rs
+++ b/servo/components/script/dom/htmlscriptelement.rs
@@ -37,17 +37,16 @@ use servo_config::opts;
 use servo_url::ServoUrl;
 use std::ascii::AsciiExt;
 use std::cell::Cell;
 use std::fs::File;
 use std::io::{Read, Write};
 use std::path::PathBuf;
 use std::process::{Command, Stdio};
 use std::sync::{Arc, Mutex};
-use style::attr::AttrValue;
 use style::str::{HTML_SPACE_CHARACTERS, StaticStringVec};
 use uuid::Uuid;
 
 #[dom_struct]
 pub struct HTMLScriptElement {
     htmlelement: HTMLElement,
 
     /// https://html.spec.whatwg.org/multipage/#already-started
@@ -649,23 +648,16 @@ impl HTMLScriptElement {
     }
 }
 
 impl VirtualMethods for HTMLScriptElement {
     fn super_type(&self) -> Option<&VirtualMethods> {
         Some(self.upcast::<HTMLElement>() as &VirtualMethods)
     }
 
-    fn parse_plain_attribute(&self, name: &LocalName, value: DOMString) -> AttrValue {
-        match name {
-            &local_name!("src") => AttrValue::from_url(document_from_node(self).base_url(), value.into()),
-            _ => self.super_type().unwrap().parse_plain_attribute(name, value),
-        }
-    }
-
     fn attribute_mutated(&self, attr: &Attr, mutation: AttributeMutation) {
         self.super_type().unwrap().attribute_mutated(attr, mutation);
         match *attr.local_name() {
             local_name!("src") => {
                 if let AttributeMutation::Set(_) = mutation {
                     if !self.parser_inserted.get() && self.upcast::<Node>().is_in_doc() {
                         self.prepare();
                     }
@@ -707,17 +699,17 @@ impl VirtualMethods for HTMLScriptElemen
     }
 }
 
 impl HTMLScriptElementMethods for HTMLScriptElement {
     // https://html.spec.whatwg.org/multipage/#dom-script-src
     make_url_getter!(Src, "src");
 
     // https://html.spec.whatwg.org/multipage/#dom-script-src
-    make_url_setter!(SetSrc, "src");
+    make_setter!(SetSrc, "src");
 
     // https://html.spec.whatwg.org/multipage/#dom-script-type
     make_getter!(Type, "type");
     // https://html.spec.whatwg.org/multipage/#dom-script-type
     make_setter!(SetType, "type");
 
     // https://html.spec.whatwg.org/multipage/#dom-script-charset
     make_getter!(Charset, "charset");
--- a/servo/components/selectors/context.rs
+++ b/servo/components/selectors/context.rs
@@ -97,16 +97,19 @@ pub struct MatchingContext<'a> {
     /// scoping element is not relevant anymore, so we use a single field for
     /// them.
     ///
     /// When this is None, :scope will match the root element.
     ///
     /// See https://drafts.csswg.org/selectors-4/#scope-pseudo
     pub scope_element: Option<OpaqueElement>,
 
+    /// The current nesting level of selectors that we're matching.
+    pub nesting_level: usize,
+
     quirks_mode: QuirksMode,
     classes_and_ids_case_sensitivity: CaseSensitivity,
 }
 
 impl<'a> MatchingContext<'a> {
     /// Constructs a new `MatchingContext`.
     pub fn new(
         matching_mode: MatchingMode,
@@ -135,16 +138,17 @@ impl<'a> MatchingContext<'a> {
             matching_mode,
             bloom_filter,
             visited_handling,
             nth_index_cache,
             quirks_mode,
             relevant_link_found: false,
             classes_and_ids_case_sensitivity: quirks_mode.classes_and_ids_case_sensitivity(),
             scope_element: None,
+            nesting_level: 0,
         }
     }
 
     /// The quirks mode of the document.
     #[inline]
     pub fn quirks_mode(&self) -> QuirksMode {
         self.quirks_mode
     }
--- a/servo/components/selectors/matching.rs
+++ b/servo/components/selectors/matching.rs
@@ -49,142 +49,44 @@ impl ElementSelectorFlags {
     }
 
     /// Returns the subset of flags that apply to the parent.
     pub fn for_parent(self) -> ElementSelectorFlags {
         self & (HAS_SLOW_SELECTOR | HAS_SLOW_SELECTOR_LATER_SIBLINGS | HAS_EDGE_CHILD_SELECTOR)
     }
 }
 
-/// Holds per-selector data alongside a pointer to MatchingContext.
-pub struct LocalMatchingContext<'a, 'b: 'a, Impl: SelectorImpl> {
-    /// Shared `MatchingContext`.
-    pub shared: &'a mut MatchingContext<'b>,
-    /// A reference to the base selector we're matching against.
-    pub selector: &'a Selector<Impl>,
-    /// The offset of the current compound selector being matched, kept up to
-    /// date by the callees when the iterator is advanced. This, in conjunction
-    /// with the selector reference above, allows callees to synthesize an
-    /// iterator for the current compound selector on-demand. This is necessary
-    /// because the primary iterator may already have been advanced partway
-    /// through the current compound selector, and the callee may need the whole
-    /// thing.
-    offset: usize,
-    /// The level of nesting for the selector being matched.
-    pub nesting_level: usize,
-    /// Holds a bool flag to see whether :active and :hover quirk should try to
-    /// match or not. This flag can only be true in the case PseudoElements are
-    /// encountered when matching mode is ForStatelessPseudoElement.
-    pub hover_active_quirk_disabled: bool,
+/// Holds per-compound-selector data.
+struct LocalMatchingContext<'a, 'b: 'a> {
+    shared: &'a mut MatchingContext<'b>,
+    matches_hover_and_active_quirk: bool,
 }
 
-impl<'a, 'b, Impl> LocalMatchingContext<'a, 'b, Impl>
-    where Impl: SelectorImpl
-{
-    /// Constructs a new `LocalMatchingContext`.
-    pub fn new(shared: &'a mut MatchingContext<'b>,
-               selector: &'a Selector<Impl>) -> Self {
-        Self {
-            shared: shared,
-            selector: selector,
-            offset: 0,
-            nesting_level: 0,
-            // We flip this off once third sequence is reached.
-            hover_active_quirk_disabled: selector.has_pseudo_element(),
-        }
-    }
-
-    /// Updates offset of Selector to show new compound selector.
-    /// To be able to correctly re-synthesize main SelectorIter.
-    fn note_position(&mut self, selector_iter: &SelectorIter<Impl>) {
-        if let QuirksMode::Quirks = self.shared.quirks_mode() {
-            if self.selector.has_pseudo_element() && self.offset != 0 {
-                // This is the _second_ call to note_position,
-                // which means we've moved past the compound
-                // selector adjacent to the pseudo-element.
-                self.hover_active_quirk_disabled = false;
-            }
-
-            self.offset = self.selector.len() - selector_iter.selector_length();
-        }
-    }
-
-    /// Returns true if current compound selector matches :active and :hover quirk.
-    /// https://quirks.spec.whatwg.org/#the-active-and-hover-quirk
-    pub fn active_hover_quirk_matches(&self) -> bool {
-        if self.shared.quirks_mode() != QuirksMode::Quirks {
-            return false;
-        }
-
-        // Don't allow it in recursive selectors such as :not and :-moz-any.
-        if self.nesting_level != 0 {
-            return false;
-        }
-
-        if self.hover_active_quirk_disabled {
-            return false;
-        }
-
-        let mut iter = if self.offset == 0 {
-            self.selector.iter()
-        } else {
-            self.selector.iter_from(self.offset)
-        };
-
-        return iter.all(|simple| {
-            match *simple {
-                Component::LocalName(_) |
-                Component::AttributeInNoNamespaceExists { .. } |
-                Component::AttributeInNoNamespace { .. } |
-                Component::AttributeOther(_) |
-                Component::ID(_) |
-                Component::Class(_) |
-                Component::PseudoElement(_) |
-                Component::Negation(_) |
-                Component::FirstChild |
-                Component::LastChild |
-                Component::OnlyChild |
-                Component::Empty |
-                Component::NthChild(_, _) |
-                Component::NthLastChild(_, _) |
-                Component::NthOfType(_, _) |
-                Component::NthLastOfType(_, _) |
-                Component::FirstOfType |
-                Component::LastOfType |
-                Component::OnlyOfType => false,
-                Component::NonTSPseudoClass(ref pseudo_class) => {
-                    Impl::is_active_or_hover(pseudo_class)
-                },
-                _ => true,
-            }
-        });
-    }
-}
-
-pub fn matches_selector_list<E>(selector_list: &SelectorList<E::Impl>,
-                                element: &E,
-                                context: &mut MatchingContext)
-                                -> bool
-    where E: Element
+pub fn matches_selector_list<E>(
+    selector_list: &SelectorList<E::Impl>,
+    element: &E,
+    context: &mut MatchingContext,
+) -> bool
+where
+    E: Element
 {
     selector_list.0.iter().any(|selector| {
         matches_selector(selector,
                          0,
                          None,
                          element,
                          context,
                          &mut |_, _| {})
     })
 }
 
 #[inline(always)]
-fn may_match<E>(hashes: &AncestorHashes,
-                bf: &BloomFilter)
-                -> bool
-    where E: Element,
+fn may_match<E>(hashes: &AncestorHashes, bf: &BloomFilter) -> bool
+where
+    E: Element,
 {
     // Check the first three hashes. Note that we can check for zero before
     // masking off the high bits, since if any of the first three hashes is
     // zero the fourth will be as well. We also take care to avoid the
     // special-case complexity of the fourth hash until we actually reach it,
     // because we usually don't.
     //
     // To be clear: this is all extremely hot.
@@ -365,42 +267,38 @@ enum SelectorMatchingResult {
 ///
 /// We accept an offset to allow consumers to represent and match against
 /// partial selectors (indexed from the right). We use this API design, rather
 /// than having the callers pass a SelectorIter, because creating a SelectorIter
 /// requires dereferencing the selector to get the length, which adds an
 /// unncessary cache miss for cases when we can fast-reject with AncestorHashes
 /// (which the caller can store inline with the selector pointer).
 #[inline(always)]
-pub fn matches_selector<E, F>(selector: &Selector<E::Impl>,
-                              offset: usize,
-                              hashes: Option<&AncestorHashes>,
-                              element: &E,
-                              context: &mut MatchingContext,
-                              flags_setter: &mut F)
-                              -> bool
-    where E: Element,
-          F: FnMut(&E, ElementSelectorFlags),
+pub fn matches_selector<E, F>(
+    selector: &Selector<E::Impl>,
+    offset: usize,
+    hashes: Option<&AncestorHashes>,
+    element: &E,
+    context: &mut MatchingContext,
+    flags_setter: &mut F,
+) -> bool
+where
+    E: Element,
+    F: FnMut(&E, ElementSelectorFlags),
 {
     // Use the bloom filter to fast-reject.
     if let Some(hashes) = hashes {
         if let Some(filter) = context.bloom_filter {
             if !may_match::<E>(hashes, filter) {
                 return false;
             }
         }
     }
 
-    let mut local_context = LocalMatchingContext::new(context, selector);
-    let iter = if offset == 0 {
-        selector.iter()
-    } else {
-        selector.iter_from(offset)
-    };
-    matches_complex_selector(iter, element, &mut local_context, flags_setter)
+    matches_complex_selector(selector.iter_from(offset), element, context, flags_setter)
 }
 
 /// Whether a compound selector matched, and whether it was the rightmost
 /// selector inside the complex selector.
 pub enum CompoundSelectorMatchingResult {
     /// The compound selector matched, and the next combinator offset is
     /// `next_combinator_offset`.
     ///
@@ -426,17 +324,21 @@ pub fn matches_compound_selector<E>(
 ) -> CompoundSelectorMatchingResult
 where
     E: Element
 {
     if cfg!(debug_assertions) {
         selector.combinator_at(from_offset); // This asserts.
     }
 
-    let mut local_context = LocalMatchingContext::new(context, selector);
+    let mut local_context = LocalMatchingContext {
+        shared: context,
+        matches_hover_and_active_quirk: false,
+    };
+
     for component in selector.iter_raw_parse_order_from(from_offset - 1) {
         if matches!(*component, Component::Combinator(..)) {
             return CompoundSelectorMatchingResult::Matched {
                 next_combinator_offset: from_offset - 1,
             }
         }
 
         if !matches_simple_selector(
@@ -452,85 +354,156 @@ where
     }
 
     return CompoundSelectorMatchingResult::Matched {
         next_combinator_offset: 0,
     }
 }
 
 /// Matches a complex selector.
-pub fn matches_complex_selector<E, F>(mut iter: SelectorIter<E::Impl>,
-                                      element: &E,
-                                      context: &mut LocalMatchingContext<E::Impl>,
-                                      flags_setter: &mut F)
-                                      -> bool
-    where E: Element,
-          F: FnMut(&E, ElementSelectorFlags),
+pub fn matches_complex_selector<E, F>(
+    mut iter: SelectorIter<E::Impl>,
+    element: &E,
+    context: &mut MatchingContext,
+    flags_setter: &mut F,
+) -> bool
+where
+    E: Element,
+    F: FnMut(&E, ElementSelectorFlags),
 {
-    if cfg!(debug_assertions) {
-        if context.nesting_level == 0 &&
-            context.shared.matching_mode == MatchingMode::ForStatelessPseudoElement {
-            assert!(iter.clone().any(|c| {
-                matches!(*c, Component::PseudoElement(..))
-            }));
-        }
-    }
-
     // If this is the special pseudo-element mode, consume the ::pseudo-element
     // before proceeding, since the caller has already handled that part.
     if context.nesting_level == 0 &&
-        context.shared.matching_mode == MatchingMode::ForStatelessPseudoElement {
+        context.matching_mode == MatchingMode::ForStatelessPseudoElement {
         // Consume the pseudo.
         let pseudo = iter.next().unwrap();
         debug_assert!(matches!(*pseudo, Component::PseudoElement(..)),
                       "Used MatchingMode::ForStatelessPseudoElement in a non-pseudo selector");
 
         // The only other parser-allowed Component in this sequence is a state
         // class. We just don't match in that case.
         if let Some(s) = iter.next() {
             debug_assert!(matches!(*s, Component::NonTSPseudoClass(..)),
                           "Someone messed up pseudo-element parsing");
             return false;
         }
 
-        // Advance to the non-pseudo-element part of the selector, and inform
-        // the context.
+        // Advance to the non-pseudo-element part of the selector, but let the
+        // context note that .
         if iter.next_sequence().is_none() {
             return true;
         }
-        context.note_position(&iter);
     }
 
-    match matches_complex_selector_internal(iter,
-                                            element,
-                                            context,
-                                            &mut RelevantLinkStatus::Looking,
-                                            flags_setter) {
+    let result = matches_complex_selector_internal(
+        iter,
+        element,
+        context,
+        &mut RelevantLinkStatus::Looking,
+        flags_setter,
+        Rightmost::Yes,
+    );
+
+    match result {
         SelectorMatchingResult::Matched => true,
         _ => false
     }
 }
 
-fn matches_complex_selector_internal<E, F>(mut selector_iter: SelectorIter<E::Impl>,
-                                           element: &E,
-                                           context: &mut LocalMatchingContext<E::Impl>,
-                                           relevant_link: &mut RelevantLinkStatus,
-                                           flags_setter: &mut F)
-                                           -> SelectorMatchingResult
-     where E: Element,
-           F: FnMut(&E, ElementSelectorFlags),
+#[inline]
+fn matches_hover_and_active_quirk<Impl: SelectorImpl>(
+    selector_iter: &SelectorIter<Impl>,
+    context: &MatchingContext,
+    rightmost: Rightmost,
+) -> bool {
+    if context.quirks_mode() != QuirksMode::Quirks {
+        return false;
+    }
+
+    if context.nesting_level != 0 {
+        return false;
+    }
+
+    // This compound selector had a pseudo-element to the right that we
+    // intentionally skipped.
+    if matches!(rightmost, Rightmost::Yes) &&
+        context.matching_mode == MatchingMode::ForStatelessPseudoElement {
+        return false;
+    }
+
+    selector_iter.clone().all(|simple| {
+        match *simple {
+            Component::LocalName(_) |
+            Component::AttributeInNoNamespaceExists { .. } |
+            Component::AttributeInNoNamespace { .. } |
+            Component::AttributeOther(_) |
+            Component::ID(_) |
+            Component::Class(_) |
+            Component::PseudoElement(_) |
+            Component::Negation(_) |
+            Component::FirstChild |
+            Component::LastChild |
+            Component::OnlyChild |
+            Component::Empty |
+            Component::NthChild(_, _) |
+            Component::NthLastChild(_, _) |
+            Component::NthOfType(_, _) |
+            Component::NthLastOfType(_, _) |
+            Component::FirstOfType |
+            Component::LastOfType |
+            Component::OnlyOfType => false,
+            Component::NonTSPseudoClass(ref pseudo_class) => {
+                Impl::is_active_or_hover(pseudo_class)
+            },
+            _ => true,
+        }
+    })
+}
+
+enum Rightmost {
+    Yes,
+    No,
+}
+
+fn matches_complex_selector_internal<E, F>(
+    mut selector_iter: SelectorIter<E::Impl>,
+    element: &E,
+    context: &mut MatchingContext,
+    relevant_link: &mut RelevantLinkStatus,
+    flags_setter: &mut F,
+    rightmost: Rightmost,
+) -> SelectorMatchingResult
+where
+    E: Element,
+    F: FnMut(&E, ElementSelectorFlags),
 {
-    *relevant_link = relevant_link.examine_potential_link(element, &mut context.shared);
+    *relevant_link = relevant_link.examine_potential_link(element, context);
 
     debug!("Matching complex selector {:?} for {:?}, relevant link {:?}",
            selector_iter, element, relevant_link);
 
-    let matches_all_simple_selectors = selector_iter.all(|simple| {
-        matches_simple_selector(simple, element, context, &relevant_link, flags_setter)
-    });
+
+    let matches_all_simple_selectors = {
+        let matches_hover_and_active_quirk =
+            matches_hover_and_active_quirk(&selector_iter, context, rightmost);
+        let mut local_context =
+            LocalMatchingContext {
+                shared: context,
+                matches_hover_and_active_quirk,
+            };
+        selector_iter.all(|simple| {
+            matches_simple_selector(
+                simple,
+                element,
+                &mut local_context,
+                &relevant_link,
+                flags_setter,
+            )
+        })
+    };
 
     let combinator = selector_iter.next_sequence();
     let siblings = combinator.map_or(false, |c| c.is_sibling());
     if siblings {
         flags_setter(element, HAS_SLOW_SELECTOR_LATER_SIBLINGS);
     }
 
     if !matches_all_simple_selectors {
@@ -562,23 +535,24 @@ fn matches_complex_selector_internal<E, 
                 }
             };
 
             loop {
                 let element = match next_element {
                     None => return candidate_not_found,
                     Some(next_element) => next_element,
                 };
-                // Note in which compound selector are we currently.
-                context.note_position(&selector_iter);
-                let result = matches_complex_selector_internal(selector_iter.clone(),
-                                                               &element,
-                                                               context,
-                                                               relevant_link,
-                                                               flags_setter);
+                let result = matches_complex_selector_internal(
+                    selector_iter.clone(),
+                    &element,
+                    context,
+                    relevant_link,
+                    flags_setter,
+                    Rightmost::No,
+                );
                 match (result, c) {
                     // Return the status immediately.
                     (SelectorMatchingResult::Matched, _) => return result,
                     (SelectorMatchingResult::NotMatchedGlobally, _) => return result,
 
                     // Upgrade the failure status to
                     // NotMatchedAndRestartFromClosestDescendant.
                     (_, Combinator::PseudoElement) |
@@ -609,24 +583,25 @@ fn matches_complex_selector_internal<E, 
             }
         }
     }
 }
 
 /// Determines whether the given element matches the given single selector.
 #[inline]
 fn matches_simple_selector<E, F>(
-        selector: &Component<E::Impl>,
-        element: &E,
-        context: &mut LocalMatchingContext<E::Impl>,
-        relevant_link: &RelevantLinkStatus,
-        flags_setter: &mut F)
-        -> bool
-    where E: Element,
-          F: FnMut(&E, ElementSelectorFlags),
+    selector: &Component<E::Impl>,
+    element: &E,
+    context: &mut LocalMatchingContext,
+    relevant_link: &RelevantLinkStatus,
+    flags_setter: &mut F,
+) -> bool
+where
+    E: Element,
+    F: FnMut(&E, ElementSelectorFlags),
 {
     match *selector {
         Component::Combinator(_) => unreachable!(),
         Component::PseudoElement(ref pseudo) => {
             element.match_pseudo_element(pseudo, context.shared)
         }
         Component::LocalName(LocalName { ref name, ref lower_name }) => {
             let is_html = element.is_html_element_in_html_document();
@@ -700,17 +675,24 @@ fn matches_simple_selector<E, F>(
                             case_sensitivity: case_sensitivity.to_unconditional(is_html),
                             expected_value: expected_value,
                         }
                     }
                 }
             )
         }
         Component::NonTSPseudoClass(ref pc) => {
-            element.match_non_ts_pseudo_class(pc, context, relevant_link, flags_setter)
+            if context.matches_hover_and_active_quirk &&
+               context.shared.nesting_level == 0 &&
+               E::Impl::is_active_or_hover(pc) &&
+               !element.is_link() {
+                return false;
+            }
+
+            element.match_non_ts_pseudo_class(pc, &mut context.shared, relevant_link, flags_setter)
         }
         Component::FirstChild => {
             matches_first_child(element, flags_setter)
         }
         Component::LastChild => {
             matches_last_child(element, flags_setter)
         }
         Component::OnlyChild => {
@@ -748,46 +730,53 @@ fn matches_simple_selector<E, F>(
         Component::LastOfType => {
             matches_generic_nth_child(element, context, 0, 1, true, true, flags_setter)
         }
         Component::OnlyOfType => {
             matches_generic_nth_child(element, context, 0, 1, true, false, flags_setter) &&
             matches_generic_nth_child(element, context, 0, 1, true, true, flags_setter)
         }
         Component::Negation(ref negated) => {
-            context.nesting_level += 1;
+            context.shared.nesting_level += 1;
             let result = !negated.iter().all(|ss| {
-                matches_simple_selector(ss, element, context,
-                                        relevant_link, flags_setter)
+                matches_simple_selector(
+                    ss,
+                    element,
+                    context,
+                    relevant_link,
+                    flags_setter,
+                )
             });
-            context.nesting_level -= 1;
+            context.shared.nesting_level -= 1;
             result
         }
     }
 }
 
 fn select_name<'a, T>(is_html: bool, local_name: &'a T, local_name_lower: &'a T) -> &'a T {
     if is_html {
         local_name_lower
     } else {
         local_name
     }
 }
 
 #[inline]
-fn matches_generic_nth_child<E, F>(element: &E,
-                                   context: &mut LocalMatchingContext<E::Impl>,
-                                   a: i32,
-                                   b: i32,
-                                   is_of_type: bool,
-                                   is_from_end: bool,
-                                   flags_setter: &mut F)
-                                   -> bool
-    where E: Element,
-          F: FnMut(&E, ElementSelectorFlags),
+fn matches_generic_nth_child<E, F>(
+    element: &E,
+    context: &mut LocalMatchingContext,
+    a: i32,
+    b: i32,
+    is_of_type: bool,
+    is_from_end: bool,
+    flags_setter: &mut F,
+) -> bool
+where
+    E: Element,
+    F: FnMut(&E, ElementSelectorFlags),
 {
     if element.ignores_nth_child_selectors() {
         return false;
     }
 
     flags_setter(element, if is_from_end {
         HAS_SLOW_SELECTOR
     } else {
@@ -875,23 +864,25 @@ where
         }
     }
 
     index
 }
 
 #[inline]
 fn matches_first_child<E, F>(element: &E, flags_setter: &mut F) -> bool
-    where E: Element,
-          F: FnMut(&E, ElementSelectorFlags),
+where
+    E: Element,
+    F: FnMut(&E, ElementSelectorFlags),
 {
     flags_setter(element, HAS_EDGE_CHILD_SELECTOR);
     element.prev_sibling_element().is_none()
 }
 
 #[inline]
 fn matches_last_child<E, F>(element: &E, flags_setter: &mut F) -> bool
-    where E: Element,
-          F: FnMut(&E, ElementSelectorFlags),
+where
+    E: Element,
+    F: FnMut(&E, ElementSelectorFlags),
 {
     flags_setter(element, HAS_EDGE_CHILD_SELECTOR);
     element.next_sibling_element().is_none()
 }
--- a/servo/components/selectors/tree.rs
+++ b/servo/components/selectors/tree.rs
@@ -1,17 +1,17 @@
 /* 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/. */
 
 //! Traits that nodes must implement. Breaks the otherwise-cyclic dependency
 //! between layout and style.
 
 use attr::{AttrSelectorOperation, NamespaceConstraint, CaseSensitivity};
-use matching::{ElementSelectorFlags, LocalMatchingContext, MatchingContext, RelevantLinkStatus};
+use matching::{ElementSelectorFlags, MatchingContext, RelevantLinkStatus};
 use parser::SelectorImpl;
 use servo_arc::NonZeroPtrMut;
 use std::fmt::Debug;
 
 /// Opaque representation of an Element, for identity comparisons. We use
 /// NonZeroPtrMut to get the NonZero optimization.
 #[derive(Clone, Debug, Eq, Hash, PartialEq)]
 pub struct OpaqueElement(pub NonZeroPtrMut<()>);
@@ -59,22 +59,25 @@ pub trait Element: Sized + Clone + Debug
     fn get_namespace(&self) -> &<Self::Impl as SelectorImpl>::BorrowedNamespaceUrl;
 
     fn attr_matches(&self,
                     ns: &NamespaceConstraint<&<Self::Impl as SelectorImpl>::NamespaceUrl>,
                     local_name: &<Self::Impl as SelectorImpl>::LocalName,
                     operation: &AttrSelectorOperation<&<Self::Impl as SelectorImpl>::AttrValue>)
                     -> bool;
 
-    fn match_non_ts_pseudo_class<F>(&self,
-                                    pc: &<Self::Impl as SelectorImpl>::NonTSPseudoClass,
-                                    context: &mut LocalMatchingContext<Self::Impl>,
-                                    relevant_link: &RelevantLinkStatus,
-                                    flags_setter: &mut F) -> bool
-        where F: FnMut(&Self, ElementSelectorFlags);
+    fn match_non_ts_pseudo_class<F>(
+        &self,
+        pc: &<Self::Impl as SelectorImpl>::NonTSPseudoClass,
+        context: &mut MatchingContext,
+        relevant_link: &RelevantLinkStatus,
+        flags_setter: &mut F,
+    ) -> bool
+    where
+        F: FnMut(&Self, ElementSelectorFlags);
 
     fn match_pseudo_element(&self,
                             pe: &<Self::Impl as SelectorImpl>::PseudoElement,
                             context: &mut MatchingContext)
                             -> bool;
 
     /// Whether this element is a `link`.
     fn is_link(&self) -> bool;
--- a/servo/components/style/attr.rs
+++ b/servo/components/style/attr.rs
@@ -41,17 +41,22 @@ pub enum AttrValue {
     TokenList(String, Vec<Atom>),
     UInt(String, u32),
     Int(String, i32),
     Double(String, f64),
     Atom(Atom),
     Length(String, Option<Length>),
     Color(String, Option<RGBA>),
     Dimension(String, LengthOrPercentageOrAuto),
-    Url(String, Option<ServoUrl>),
+
+    /// Stores a URL, computed from the input string and a document's base URL.
+    ///
+    /// The URL is resolved at setting-time, so this kind of attribute value is
+    /// not actually suitable for most URL-reflecting IDL attributes.
+    ResolvedUrl(String, Option<ServoUrl>),
 
     /// Note that this variant is only used transitively as a fast path to set
     /// the property declaration block relevant to the style of an element when
     /// set from the inline declaration of that element (that is,
     /// `element.style`).
     ///
     /// This can, as of this writing, only correspond to the value of the
     /// `style` element, and is set from its relevant CSSInlineStyleDeclaration,
@@ -222,19 +227,19 @@ impl AttrValue {
         AttrValue::UInt(string, result)
     }
 
     pub fn from_atomic(string: String) -> AttrValue {
         let value = Atom::from(string);
         AttrValue::Atom(value)
     }
 
-    pub fn from_url(base: ServoUrl, url: String) -> AttrValue {
+    pub fn from_resolved_url(base: &ServoUrl, url: String) -> AttrValue {
         let joined = base.join(&url).ok();
-        AttrValue::Url(url, joined)
+        AttrValue::ResolvedUrl(url, joined)
     }
 
     pub fn from_legacy_color(string: String) -> AttrValue {
         let parsed = parse_legacy_color(&string).ok();
         AttrValue::Color(string, parsed)
     }
 
     pub fn from_dimension(string: String) -> AttrValue {
@@ -302,24 +307,24 @@ impl AttrValue {
     /// Panics if the `AttrValue` is not a `Dimension`
     pub fn as_dimension(&self) -> &LengthOrPercentageOrAuto {
         match *self {
             AttrValue::Dimension(_, ref l) => l,
             _ => panic!("Dimension not found"),
         }
     }
 
-    /// Assumes the `AttrValue` is a `Url` and returns its value
+    /// Assumes the `AttrValue` is a `ResolvedUrl` and returns its value.
     ///
     /// ## Panics
     ///
-    /// Panics if the `AttrValue` is not a `Url`
-    pub fn as_url(&self) -> Option<&ServoUrl> {
+    /// Panics if the `AttrValue` is not a `ResolvedUrl`
+    pub fn as_resolved_url(&self) -> Option<&ServoUrl> {
         match *self {
-            AttrValue::Url(_, ref url) => url.as_ref(),
+            AttrValue::ResolvedUrl(_, ref url) => url.as_ref(),
             _ => panic!("Url not found"),
         }
     }
 
     /// Return the AttrValue as its integer representation, if any.
     /// This corresponds to attribute values returned as `AttrValue::UInt(_)`
     /// by `VirtualMethods::parse_plain_attribute()`.
     ///
@@ -360,25 +365,25 @@ impl AttrValue {
 }
 
 impl ::std::ops::Deref for AttrValue {
     type Target = str;
 
     fn deref(&self) -> &str {
         match *self {
             AttrValue::String(ref value) |
-                AttrValue::TokenList(ref value, _) |
-                AttrValue::UInt(ref value, _) |
-                AttrValue::Double(ref value, _) |
-                AttrValue::Length(ref value, _) |
-                AttrValue::Color(ref value, _) |
-                AttrValue::Int(ref value, _) |
-                AttrValue::Url(ref value, _) |
-                AttrValue::Declaration(ref value, _) |
-                AttrValue::Dimension(ref value, _) => &value,
+            AttrValue::TokenList(ref value, _) |
+            AttrValue::UInt(ref value, _) |
+            AttrValue::Double(ref value, _) |
+            AttrValue::Length(ref value, _) |
+            AttrValue::Color(ref value, _) |
+            AttrValue::Int(ref value, _) |
+            AttrValue::ResolvedUrl(ref value, _) |
+            AttrValue::Declaration(ref value, _) |
+            AttrValue::Dimension(ref value, _) => &value,
             AttrValue::Atom(ref value) => &value,
         }
     }
 }
 
 impl PartialEq<Atom> for AttrValue {
     fn eq(&self, other: &Atom) -> bool {
         match *self {
--- a/servo/components/style/gecko/wrapper.rs
+++ b/servo/components/style/gecko/wrapper.rs
@@ -73,17 +73,17 @@ use properties::{ComputedValues, Longhan
 use properties::{Importance, PropertyDeclaration, PropertyDeclarationBlock};
 use properties::animated_properties::{AnimationValue, AnimationValueMap};
 use properties::animated_properties::TransitionProperty;
 use properties::style_structs::Font;
 use rule_tree::CascadeLevel as ServoCascadeLevel;
 use selector_parser::{AttrValue, ElementExt, PseudoClassStringArg};
 use selectors::{Element, OpaqueElement};
 use selectors::attr::{AttrSelectorOperation, AttrSelectorOperator, CaseSensitivity, NamespaceConstraint};
-use selectors::matching::{ElementSelectorFlags, LocalMatchingContext, MatchingContext};
+use selectors::matching::{ElementSelectorFlags, MatchingContext};
 use selectors::matching::{RelevantLinkStatus, VisitedHandlingMode};
 use selectors::sink::Push;
 use servo_arc::{Arc, ArcBorrow, RawOffsetArc};
 use shared_lock::Locked;
 use std::cell::RefCell;
 use std::fmt;
 use std::hash::{Hash, Hasher};
 use std::mem;
@@ -1839,17 +1839,17 @@ impl<'le> ::selectors::Element for Gecko
         unsafe {
             WeakNamespace::new(Gecko_Namespace(self.0))
         }
     }
 
     fn match_non_ts_pseudo_class<F>(
         &self,
         pseudo_class: &NonTSPseudoClass,
-        context: &mut LocalMatchingContext<Self::Impl>,
+        context: &mut MatchingContext,
         relevant_link: &RelevantLinkStatus,
         flags_setter: &mut F,
     ) -> bool
     where
         F: FnMut(&Self, ElementSelectorFlags),
     {
         use selectors::matching::*;
         match *pseudo_class {
@@ -1894,30 +1894,24 @@ impl<'le> ::selectors::Element for Gecko
             NonTSPseudoClass::MozMeterOptimum |
             NonTSPseudoClass::MozMeterSubOptimum |
             NonTSPseudoClass::MozMeterSubSubOptimum |
             NonTSPseudoClass::MozHasDirAttr |
             NonTSPseudoClass::MozDirAttrLTR |
             NonTSPseudoClass::MozDirAttrRTL |
             NonTSPseudoClass::MozDirAttrLikeAuto |
             NonTSPseudoClass::MozAutofill |
+            NonTSPseudoClass::Active |
+            NonTSPseudoClass::Hover |
             NonTSPseudoClass::MozAutofillPreview => {
                 self.get_state().intersects(pseudo_class.state_flag())
             },
             NonTSPseudoClass::AnyLink => self.is_link(),
-            NonTSPseudoClass::Link => relevant_link.is_unvisited(self, context.shared),
-            NonTSPseudoClass::Visited => relevant_link.is_visited(self, context.shared),
-            NonTSPseudoClass::Active |
-            NonTSPseudoClass::Hover => {
-                if context.active_hover_quirk_matches() && !self.is_link() {
-                    false
-                } else {
-                    self.get_state().contains(pseudo_class.state_flag())
-                }
-            },
+            NonTSPseudoClass::Link => relevant_link.is_unvisited(self, context),
+            NonTSPseudoClass::Visited => relevant_link.is_visited(self, context),
             NonTSPseudoClass::MozFirstNode => {
                 flags_setter(self, HAS_EDGE_CHILD_SELECTOR);
                 let mut elem = self.as_node();
                 while let Some(prev) = elem.prev_sibling() {
                     if prev.contains_non_whitespace_content() {
                         return false
                     }
                     elem = prev;
--- a/servo/components/style/invalidation/element/element_wrapper.rs
+++ b/servo/components/style/invalidation/element/element_wrapper.rs
@@ -6,17 +6,17 @@
 //! against a past state of the element.
 
 use {Atom, CaseSensitivityExt, LocalName, Namespace};
 use dom::TElement;
 use element_state::ElementState;
 use selector_parser::{NonTSPseudoClass, PseudoElement, SelectorImpl, Snapshot, SnapshotMap, AttrValue};
 use selectors::{Element, OpaqueElement};
 use selectors::attr::{AttrSelectorOperation, CaseSensitivity, NamespaceConstraint};
-use selectors::matching::{ElementSelectorFlags, LocalMatchingContext, MatchingContext};
+use selectors::matching::{ElementSelectorFlags, MatchingContext};
 use selectors::matching::RelevantLinkStatus;
 use std::cell::Cell;
 use std::fmt;
 
 /// In order to compute restyle hints, we perform a selector match against a
 /// list of partial selectors whose rightmost simple selector may be sensitive
 /// to the thing being changed. We do this matching twice, once for the element
 /// as it exists now and once for the element as it existed at the time of the
@@ -144,33 +144,38 @@ impl<'a, E> fmt::Debug for ElementWrappe
     }
 }
 
 impl<'a, E> Element for ElementWrapper<'a, E>
     where E: TElement,
 {
     type Impl = SelectorImpl;
 
-    fn match_non_ts_pseudo_class<F>(&self,
-                                    pseudo_class: &NonTSPseudoClass,
-                                    context: &mut LocalMatchingContext<Self::Impl>,
-                                    relevant_link: &RelevantLinkStatus,
-                                    _setter: &mut F)
-                                    -> bool
-        where F: FnMut(&Self, ElementSelectorFlags),
+    fn match_non_ts_pseudo_class<F>(
+        &self,
+        pseudo_class: &NonTSPseudoClass,
+        context: &mut MatchingContext,
+        relevant_link: &RelevantLinkStatus,
+        _setter: &mut F,
+    ) -> bool
+    where
+         F: FnMut(&Self, ElementSelectorFlags),
     {
         // Some pseudo-classes need special handling to evaluate them against
         // the snapshot.
         match *pseudo_class {
             #[cfg(feature = "gecko")]
             NonTSPseudoClass::MozAny(ref selectors) => {
                 use selectors::matching::matches_complex_selector;
-                return selectors.iter().any(|s| {
+                context.nesting_level += 1;
+                let result = selectors.iter().any(|s| {
                     matches_complex_selector(s.iter(), self, context, _setter)
-                })
+                });
+                context.nesting_level -= 1;
+                return result
             }
 
             // :dir is implemented in terms of state flags, but which state flag
             // it maps to depends on the argument to :dir.  That means we can't
             // just add its state flags to the NonTSPseudoClass, because if we
             // added all of them there, and tested via intersects() here, we'd
             // get incorrect behavior for :not(:dir()) cases.
             //
@@ -190,20 +195,20 @@ impl<'a, E> Element for ElementWrapper<'
                 };
                 return state.contains(selector_flag);
             }
 
             // For :link and :visited, we don't actually want to test the element
             // state directly.  Instead, we use the `relevant_link` to determine if
             // they match.
             NonTSPseudoClass::Link => {
-                return relevant_link.is_unvisited(self, context.shared);
+                return relevant_link.is_unvisited(self, context);
             }
             NonTSPseudoClass::Visited => {
-                return relevant_link.is_visited(self, context.shared);
+                return relevant_link.is_visited(self, context);
             }
 
             #[cfg(feature = "gecko")]
             NonTSPseudoClass::MozTableBorderNonzero => {
                 if let Some(snapshot) = self.snapshot() {
                     if snapshot.has_other_pseudo_class_state() {
                         return snapshot.mIsTableBorderNonzero();
                     }
@@ -225,37 +230,41 @@ impl<'a, E> Element for ElementWrapper<'
                 return self.element.match_element_lang(Some(self.get_lang()), lang_arg);
             }
 
             _ => {}
         }
 
         let flag = pseudo_class.state_flag();
         if flag.is_empty() {
-            return self.element.match_non_ts_pseudo_class(pseudo_class,
-                                                          context,
-                                                          relevant_link,
-                                                          &mut |_, _| {})
+            return self.element.match_non_ts_pseudo_class(
+                pseudo_class,
+                context,
+                relevant_link,
+                &mut |_, _| {},
+            )
         }
         match self.snapshot().and_then(|s| s.state()) {
             Some(snapshot_state) => snapshot_state.intersects(flag),
             None => {
-                self.element.match_non_ts_pseudo_class(pseudo_class,
-                                                       context,
-                                                       relevant_link,
-                                                       &mut |_, _| {})
+                self.element.match_non_ts_pseudo_class(
+                    pseudo_class,
+                    context,
+                    relevant_link,
+                    &mut |_, _| {},
+                )
             }
         }
     }
 
-    fn match_pseudo_element(&self,
-                            pseudo_element: &PseudoElement,
-                            context: &mut MatchingContext)
-                            -> bool
-    {
+    fn match_pseudo_element(
+        &self,
+        pseudo_element: &PseudoElement,
+        context: &mut MatchingContext,
+    ) -> bool {
         self.element.match_pseudo_element(pseudo_element, context)
     }
 
     fn is_link(&self) -> bool {
         self.element.is_link()
     }
 
     fn opaque(&self) -> OpaqueElement {
--- a/servo/components/style/stylist.rs
+++ b/servo/components/style/stylist.rs
@@ -2304,22 +2304,22 @@ impl Rule {
             source,
             self.source_order,
             level,
             self.specificity()
         )
     }
 
     /// Creates a new Rule.
-    pub fn new(selector: Selector<SelectorImpl>,
-               hashes: AncestorHashes,
-               style_rule: Arc<Locked<StyleRule>>,
-               source_order: u32)
-               -> Self
-    {
+    pub fn new(
+        selector: Selector<SelectorImpl>,
+        hashes: AncestorHashes,
+        style_rule: Arc<Locked<StyleRule>>,
+        source_order: u32,
+    ) -> Self {
         Rule {
             selector: selector,
             hashes: hashes,
             style_rule: style_rule,
             source_order: source_order,
         }
     }
 }
--- a/servo/ports/cef/Cargo.toml
+++ b/servo/ports/cef/Cargo.toml
@@ -11,16 +11,19 @@ crate-type = ["dylib"]
 [profile.release]
 opt-level = 3
 # Uncomment to profile on Linux:
 # debug = true
 # lto = false
 
 [features]
 debugmozjs = ["libservo/debugmozjs"]
+default = ["unstable", "default-except-unstable"]
+default-except-unstable = []
+unstable = ["libservo/unstable"]
 
 [dependencies]
 compositing = {path = "../../components/compositing"}
 devtools = {path = "../../components/devtools"}
 euclid = "0.15"
 gleam = "0.4"
 glutin_app = {path = "../glutin"}
 libc = "0.2"
--- a/servo/rust-stable-version
+++ b/servo/rust-stable-version
@@ -1,1 +1,1 @@
-1.19.0
+1.20.0