Merge autoland to mozilla-central r=merge a=merge
authorBrindusan Cristian <cbrindusan@mozilla.com>
Thu, 30 Nov 2017 23:51:58 +0200
changeset 394375 ea747bb2ffb77d1fd62b5fa6217cbee15b73d31f
parent 394302 869865ffa26a582eab77555229e379a41bfe9c57 (current diff)
parent 394374 469b5d1b8067988e9ae31768b4c089190f14e08f (diff)
child 394411 fb3b97df05bd2d59a1e932ed1d07400f056832ef
push id33002
push usercbrindusan@mozilla.com
push dateThu, 30 Nov 2017 21:52:33 +0000
treeherdermozilla-central@ea747bb2ffb7 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge, merge
milestone59.0a1
first release with
nightly linux32
ea747bb2ffb7 / 59.0a1 / 20171130220131 / files
nightly linux64
ea747bb2ffb7 / 59.0a1 / 20171130220131 / files
nightly mac
ea747bb2ffb7 / 59.0a1 / 20171130220131 / files
nightly win32
ea747bb2ffb7 / 59.0a1 / 20171130220131 / files
nightly win64
ea747bb2ffb7 / 59.0a1 / 20171130220131 / files
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
releases
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge autoland to mozilla-central r=merge a=merge
testing/web-platform/tests/webdriver/interface/interface.html
testing/web-platform/tests/webdriver/tests/retrieval/__init__.py
testing/web-platform/tests/webdriver/tests/retrieval/find_element.py
testing/web-platform/tests/webdriver/tests/retrieval/find_element_from_element.py
testing/web-platform/tests/webdriver/tests/retrieval/find_element_from_elements.py
testing/web-platform/tests/webdriver/tests/retrieval/find_elements.py
--- a/accessible/ipc/win/HandlerProvider.cpp
+++ b/accessible/ipc/win/HandlerProvider.cpp
@@ -609,21 +609,25 @@ HandlerProvider::GetAllTextInfoMainThrea
     ToWrappedObject(&(*aHyperlinks)[index]);
   }
 
   // Fetch all attribute runs.
   nsTArray<IA2TextSegment> attribRuns;
   long end = 0;
   long length = ::SysStringLen(*aText);
   while (end < length) {
+    long offset = end;
     long start;
     BSTR attribs;
     // The (exclusive) end of the last run is the start of the next run.
-    hr = ht->get_attributes(end, &start, &end, &attribs);
-    if (FAILED(hr)) {
+    hr = ht->get_attributes(offset, &start, &end, &attribs);
+    // Bug 1421873: Gecko can return end <= offset in some rare cases, which
+    // isn't valid. This is perhaps because the text mutated during the loop
+    // for some reason, making this offset invalid.
+    if (FAILED(hr) || end <= offset) {
       break;
     }
     attribRuns.AppendElement(IA2TextSegment({attribs, start, end}));
   }
 
   // Put the attribute runs in a COM array.
   *aNAttribRuns = attribRuns.Length();
   *aAttribRuns = static_cast<IA2TextSegment*>(::CoTaskMemAlloc(
--- a/browser/app/profile/firefox.js
+++ b/browser/app/profile/firefox.js
@@ -1430,16 +1430,18 @@ pref("identity.fxaccounts.settings.devic
 pref("identity.fxaccounts.remote.profile.uri", "https://profile.accounts.firefox.com/v1");
 
 // The remote URL of the FxA OAuth Server
 pref("identity.fxaccounts.remote.oauth.uri", "https://oauth.accounts.firefox.com/v1");
 
 // Token server used by the FxA Sync identity.
 pref("identity.sync.tokenserver.uri", "https://token.services.mozilla.com/1.0/sync/1.5");
 
+// The URL to a page that explains how to connect another device to Sync.
+pref("identity.fxaccounts.remote.connectdevice.uri", "https://accounts.firefox.com/connect_another_device?service=sync&context=fx_desktop_v3");
 // URLs for promo links to mobile browsers. Note that consumers are expected to
 // append a value for utm_campaign.
 pref("identity.mobilepromo.android", "https://www.mozilla.org/firefox/android/?utm_source=firefox-browser&utm_medium=firefox-browser&utm_campaign=");
 pref("identity.mobilepromo.ios", "https://www.mozilla.org/firefox/ios/?utm_source=firefox-browser&utm_medium=firefox-browser&utm_campaign=");
 
 // Migrate any existing Firefox Account data from the default profile to the
 // Developer Edition profile.
 #ifdef MOZ_DEV_EDITION
@@ -1716,17 +1718,17 @@ pref("extensions.formautofill.creditCard
 // 2: saw the doorhanger
 // 3: submitted an autofill'ed credit card form
 pref("extensions.formautofill.creditCards.used", 0);
 pref("extensions.formautofill.firstTimeUse", true);
 pref("extensions.formautofill.heuristics.enabled", true);
 pref("extensions.formautofill.section.enabled", true);
 pref("extensions.formautofill.loglevel", "Warn");
 // Comma separated list of countries Form Autofill supports
-pref("extensions.formautofill.supportedCountries", "US");
+pref("extensions.formautofill.supportedCountries", "US,CA,DE");
 
 // Whether or not to restore a session with lazy-browser tabs.
 pref("browser.sessionstore.restore_tabs_lazily", true);
 
 pref("browser.suppress_first_window_animation", true);
 
 // Preferences for Photon onboarding system extension
 pref("browser.onboarding.enabled", true);
--- a/browser/base/content/browser-sync.js
+++ b/browser/base/content/browser-sync.js
@@ -269,16 +269,22 @@ var gSync = {
   async openDevicesManagementPage(entryPoint) {
     let url = await fxAccounts.promiseAccountsManageDevicesURI(entryPoint);
     switchToTabHavingURI(url, true, {
       replaceQueryString: true,
       triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal(),
     });
   },
 
+  openConnectAnotherDevice(entryPoint) {
+    let url = new URL(Services.prefs.getCharPref("identity.fxaccounts.remote.connectdevice.uri"));
+    url.searchParams.append("entrypoint", entryPoint);
+    openUILinkIn(url.href, "tab");
+  },
+
   openSendToDevicePromo() {
     let url = Services.prefs.getCharPref("app.productInfo.baseURL");
     url += "send-tabs/?utm_source=" + Services.appinfo.name.toLowerCase();
     switchToTabHavingURI(url, true, { replaceQueryString: true });
   },
 
   sendTabToDevice(url, clientId, title) {
     Weave.Service.clientsEngine.sendURIToClientForDisplay(url, clientId, title).catch(e => {
@@ -358,67 +364,68 @@ var gSync = {
       const allDevicesLabel = this.fxaStrings.GetStringFromName("sendToAllDevices.menuitem");
       addTargetDevice("", allDevicesLabel, "");
     }
   },
 
   _appendSendTabSingleDevice(fragment, createDeviceNodeFn) {
     const noDevices = this.fxaStrings.GetStringFromName("sendTabToDevice.singledevice.status");
     const learnMore = this.fxaStrings.GetStringFromName("sendTabToDevice.singledevice");
-    this._appendSendTabInfoItems(fragment, createDeviceNodeFn, noDevices, learnMore, () => {
-      this.openSendToDevicePromo();
-    });
+    const connectDevice = this.fxaStrings.GetStringFromName("sendTabToDevice.connectdevice");
+    const actions = [{label: connectDevice, command: () => this.openConnectAnotherDevice("sendtab")},
+                     {label: learnMore,     command: () => this.openSendToDevicePromo()}];
+    this._appendSendTabInfoItems(fragment, createDeviceNodeFn, noDevices, actions);
   },
 
   _appendSendTabVerify(fragment, createDeviceNodeFn) {
     const notVerified = this.fxaStrings.GetStringFromName("sendTabToDevice.verify.status");
     const verifyAccount = this.fxaStrings.GetStringFromName("sendTabToDevice.verify");
-    this._appendSendTabInfoItems(fragment, createDeviceNodeFn, notVerified, verifyAccount, () => {
-      this.openPrefs("sendtab");
-    });
+    const actions = [{label: verifyAccount, command: () => this.openPrefs("sendtab")}];
+    this._appendSendTabInfoItems(fragment, createDeviceNodeFn, notVerified, actions);
   },
 
   _appendSendTabUnconfigured(fragment, createDeviceNodeFn) {
     const notConnected = this.fxaStrings.GetStringFromName("sendTabToDevice.unconfigured.status");
     const learnMore = this.fxaStrings.GetStringFromName("sendTabToDevice.unconfigured");
-    this._appendSendTabInfoItems(fragment, createDeviceNodeFn, notConnected, learnMore, () => {
-      this.openSendToDevicePromo();
-    });
+    const actions = [{label: learnMore, command: () => this.openSendToDevicePromo()}];
+    this._appendSendTabInfoItems(fragment, createDeviceNodeFn, notConnected, actions);
 
     // Now add a 'sign in to sync' item above the 'learn more' item.
     const signInToSync = this.fxaStrings.GetStringFromName("sendTabToDevice.signintosync");
     let signInItem = createDeviceNodeFn(null, signInToSync, null);
     signInItem.classList.add("sync-menuitem");
     signInItem.setAttribute("label", signInToSync);
     // Show an icon if opened in the page action panel:
     if (signInItem.classList.contains("subviewbutton")) {
       signInItem.classList.add("subviewbutton-iconic", "signintosync");
     }
     signInItem.addEventListener("command", () => {
       this.openPrefs("sendtab");
     });
     fragment.insertBefore(signInItem, fragment.lastChild);
   },
 
-  _appendSendTabInfoItems(fragment, createDeviceNodeFn, statusLabel, actionLabel, actionCommand) {
+  _appendSendTabInfoItems(fragment, createDeviceNodeFn, statusLabel, actions) {
     const status = createDeviceNodeFn(null, statusLabel, null);
     status.setAttribute("label", statusLabel);
     status.setAttribute("disabled", true);
     status.classList.add("sync-menuitem");
     fragment.appendChild(status);
 
     const separator = createDeviceNodeFn(null, null, null);
     separator.classList.add("sync-menuitem");
     fragment.appendChild(separator);
 
-    const actionItem = createDeviceNodeFn(null, actionLabel, null);
-    actionItem.addEventListener("command", actionCommand, true);
-    actionItem.classList.add("sync-menuitem");
-    actionItem.setAttribute("label", actionLabel);
-    fragment.appendChild(actionItem);
+    for (let {label, command} of actions) {
+      const actionItem = createDeviceNodeFn(null, label, null);
+      actionItem.addEventListener("command", command, true);
+      actionItem.classList.add("sync-menuitem");
+      actionItem.setAttribute("label", label);
+      fragment.appendChild(actionItem);
+    }
   },
 
   isSendableURI(aURISpec) {
     if (!aURISpec) {
       return false;
     }
     // Disallow sending tabs with more than 65535 characters.
     if (aURISpec.length > 65535) {
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -205,28 +205,24 @@ XPCOMUtils.defineLazyGetter(this, "Win7F
       }
     };
   }
   return null;
 });
 
 const nsIWebNavigation = Ci.nsIWebNavigation;
 
-var gLastBrowserCharset = null;
 var gLastValidURLStr = "";
 var gInPrintPreviewMode = false;
 var gContextMenu = null; // nsContextMenu instance
 var gMultiProcessBrowser =
   window.QueryInterface(Ci.nsIInterfaceRequestor)
         .getInterface(Ci.nsIWebNavigation)
         .QueryInterface(Ci.nsILoadContext)
         .useRemoteTabs;
-var gAppInfo = Cc["@mozilla.org/xre/app-info;1"]
-                  .getService(Ci.nsIXULAppInfo)
-                  .QueryInterface(Ci.nsIXULRuntime);
 
 if (AppConstants.platform != "macosx") {
   var gEditUIVisible = true;
 }
 
 /* globals gBrowser, gNavToolbox, gURLBar:true, gNavigatorBundle*/
 [
   ["gBrowser",            "content"],
--- a/browser/base/content/test/sync/browser_contextmenu_sendpage.js
+++ b/browser/base/content/test/sync/browser_contextmenu_sendpage.js
@@ -33,16 +33,17 @@ add_task(async function test_page_contex
                                       state: UIState.STATUS_SIGNED_IN, isSendableURI: true });
 
   await openContentContextMenu("#moztext", "context-sendpagetodevice");
   is(document.getElementById("context-sendpagetodevice").hidden, false, "Send tab to device is shown");
   is(document.getElementById("context-sendpagetodevice").disabled, false, "Send tab to device is enabled");
   checkPopup([
     { label: "No Devices Connected", disabled: true },
     "----",
+    { label: "Connect Another Device..." },
     { label: "Learn About Sending Tabs..." }
   ]);
   await hideContentContextMenu();
 
   sandbox.restore();
 });
 
 add_task(async function test_page_contextmenu_sendtab_one_remote_client() {
--- a/browser/base/content/test/urlbar/browser_page_action_menu.js
+++ b/browser/base/content/test/urlbar/browser_page_action_menu.js
@@ -433,16 +433,21 @@ add_task(async function sendToDevice_noD
         attrs: {
           label: "No Devices Connected",
         },
         disabled: true
       },
       null,
       {
         attrs: {
+          label: "Connect Another Device..."
+        }
+      },
+      {
+        attrs: {
           label: "Learn About Sending Tabs..."
         }
       }
     ];
     checkSendToDeviceItems(expectedItems);
 
     // Done, hide the panel.
     let hiddenPromise = promisePageActionPanelHidden();
--- a/browser/components/customizableui/CustomizableWidgets.jsm
+++ b/browser/components/customizableui/CustomizableWidgets.jsm
@@ -262,51 +262,16 @@ const CustomizableWidgets = [
       // (Note the observer sets many attributes, including label and
       // tooltiptext, but we only want the 'syncstatus' attribute for the
       // animation)
       let doc = aNode.ownerDocument;
       let obnode = doc.createElementNS(kNSXUL, "observes");
       obnode.setAttribute("element", "sync-status");
       obnode.setAttribute("attribute", "syncstatus");
       aNode.appendChild(obnode);
-
-      // A somewhat complicated dance to format the mobilepromo label.
-      let bundle = doc.getElementById("bundle_browser");
-      let formatArgs = ["android", "ios"].map(os => {
-        let link = doc.createElement("label");
-        link.textContent = bundle.getString(`appMenuRemoteTabs.mobilePromo.${os}`);
-        link.setAttribute("mobile-promo-os", os);
-        link.className = "text-link remotetabs-promo-link";
-        return link.outerHTML;
-      });
-      let promoParentElt = doc.getElementById("PanelUI-remotetabs-mobile-promo");
-      // Put it all together...
-      let contents = bundle.getFormattedString("appMenuRemoteTabs.mobilePromo.text2", formatArgs);
-      // eslint-disable-next-line no-unsanitized/property
-      promoParentElt.innerHTML = contents;
-      // We manually manage the "click" event to open the promo links because
-      // allowing the "text-link" widget handle it has 2 problems: (1) it only
-      // supports button 0 and (2) it's tricky to intercept when it does the
-      // open and auto-close the panel. (1) can probably be fixed, but (2) is
-      // trickier without hard-coding here the knowledge of exactly what buttons
-      // it does support.
-      // So we allow left and middle clicks to open the link in a new tab and
-      // close the panel; not setting a "href" attribute prevents the text-link
-      // widget handling it, and we build the final URL in the click handler to
-      // make testing easier (ie, so tests can change the pref after the links
-      // were created and have the new pref value used.)
-      promoParentElt.addEventListener("click", e => {
-        let os = e.target.getAttribute("mobile-promo-os");
-        if (!os || e.button > 1) {
-          return;
-        }
-        let link = Services.prefs.getCharPref(`identity.mobilepromo.${os}`) + "synced-tabs";
-        doc.defaultView.openUILinkIn(link, "tab");
-        CustomizableUI.hidePanelForNode(e.target);
-      });
       this._initialized = true;
     },
     onViewShowing(aEvent) {
       this._initialize(aEvent.target);
       let doc = aEvent.target.ownerDocument;
       this._tabsList = doc.getElementById("PanelUI-remotetabs-tabslist");
       Services.obs.addObserver(this, SyncedTabs.TOPIC_TABS_CHANGED);
 
--- a/browser/components/customizableui/content/panelUI.inc.xul
+++ b/browser/components/customizableui/content/panelUI.inc.xul
@@ -433,64 +433,66 @@
             <!-- Sync is ready to Sync but the "tabs" engine isn't enabled-->
             <hbox id="PanelUI-remotetabs-tabsdisabledpane" pack="center" flex="1">
               <vbox class="PanelUI-remotetabs-instruction-box" align="center">
                 <hbox pack="center">
                   <image class="fxaSyncIllustrationIssue"/>
                 </hbox>
                 <label class="PanelUI-remotetabs-instruction-label">&appMenuRemoteTabs.tabsnotsyncing.label;</label>
                 <hbox pack="center">
-                  <toolbarbutton class="PanelUI-remotetabs-prefs-button"
+                  <toolbarbutton class="PanelUI-remotetabs-button"
                                  label="&appMenuRemoteTabs.openprefs.label;"
                                  oncommand="gSync.openPrefs('synced-tabs');"/>
                 </hbox>
               </vbox>
             </hbox>
             <!-- Sync is ready to Sync but we are still fetching the tabs to show -->
             <vbox id="PanelUI-remotetabs-fetching">
               <!-- Show intentionally blank panel, see bug 1239845 -->
             </vbox>
             <!-- Sync has only 1 (ie, this) device connected -->
             <hbox id="PanelUI-remotetabs-nodevicespane" pack="center" flex="1">
               <vbox class="PanelUI-remotetabs-instruction-box">
                 <hbox pack="center">
                   <image class="fxaSyncIllustrationIssue"/>
                 </hbox>
                 <label class="PanelUI-remotetabs-instruction-label">&appMenuRemoteTabs.noclients.subtitle;</label>
-                <!-- The inner HTML for PanelUI-remotetabs-mobile-promo is built at runtime -->
-                <label id="PanelUI-remotetabs-mobile-promo" fxAccountsBrand="&syncBrand.fxAccount.label;"/>
+                <toolbarbutton id="PanelUI-remotetabs-connect-device-button"
+                               class="PanelUI-remotetabs-button"
+                               label="&appMenuRemoteTabs.connectdevice.label;"
+                               oncommand="gSync.openConnectAnotherDevice('synced-tabs');"/>
               </vbox>
             </hbox>
           </deck>
         </vbox>
         <!-- a box to ensure contained boxes are centered horizonally -->
         <hbox pack="center" flex="1">
           <!-- When Sync is not configured -->
           <vbox id="PanelUI-remotetabs-setupsync"
                 flex="1"
                 align="center"
                 class="PanelUI-remotetabs-instruction-box"
                 observes="sync-setup-state">
             <image class="fxaSyncIllustration"/>
             <label class="PanelUI-remotetabs-instruction-label">&appMenuRemoteTabs.notsignedin.label;</label>
-            <toolbarbutton class="PanelUI-remotetabs-prefs-button"
+            <toolbarbutton class="PanelUI-remotetabs-button"
                            label="&appMenuRemoteTabs.signin.label;"
                            oncommand="gSync.openPrefs('synced-tabs');"/>
           </vbox>
           <!-- When Sync needs re-authentication. This uses the exact same messaging
                as "Sync is not configured" but remains a separate box so we get
                the goodness of observing broadcasters to manage the hidden states -->
           <vbox id="PanelUI-remotetabs-reauthsync"
                 flex="1"
                 align="center"
                 class="PanelUI-remotetabs-instruction-box"
                 observes="sync-reauth-state">
             <image class="fxaSyncIllustrationIssue"/>
             <label class="PanelUI-remotetabs-instruction-label">&appMenuRemoteTabs.notsignedin.label;</label>
-            <toolbarbutton class="PanelUI-remotetabs-prefs-button"
+            <toolbarbutton class="PanelUI-remotetabs-button"
                            label="&appMenuRemoteTabs.signin.label;"
                            oncommand="gSync.openPrefs('synced-tabs');"/>
           </vbox>
         </hbox>
       </vbox>
     </panelview>
 
     <panelview id="PanelUI-bookmarks" flex="1" class="PanelUI-subView">
--- a/browser/components/customizableui/test/browser_panelUINotifications_fullscreen_noAutoHideToolbar.js
+++ b/browser/components/customizableui/test/browser_panelUINotifications_fullscreen_noAutoHideToolbar.js
@@ -36,16 +36,17 @@ add_task(async function testFullscreen()
   }
 
   is(PanelUI.notificationPanel.state, "closed", "update-manual doorhanger is closed.");
   let mainActionCalled = false;
   let mainAction = {
     callback: () => { mainActionCalled = true; }
   };
   AppMenuNotifications.showNotification("update-manual", mainAction);
+  await BrowserTestUtils.waitForEvent(PanelUI.notificationPanel, "popupshown");
 
   isnot(PanelUI.notificationPanel.state, "closed", "update-manual doorhanger is showing.");
   let notifications = [...PanelUI.notificationPanel.children].filter(n => !n.hidden);
   is(notifications.length, 1, "PanelUI doorhanger is only displaying one notification.");
   let doorhanger = notifications[0];
   is(doorhanger.id, "appMenu-update-manual-notification", "PanelUI is displaying the update-manual notification.");
 
   let fullscreenPromise = waitForFullscreen();
--- a/browser/components/customizableui/test/browser_synced_tabs_menu.js
+++ b/browser/components/customizableui/test/browser_synced_tabs_menu.js
@@ -82,17 +82,17 @@ async function openPrefsFromMenuPanel(ex
   await Promise.all([tabsUpdatedPromise, viewShownPromise]);
   ok(syncPanel.getAttribute("current"), "Sync Panel is in view");
 
   // Sync is not configured - verify that state is reflected.
   let subpanel = document.getElementById(expectedPanelId);
   ok(!subpanel.hidden, "sync setup element is visible");
 
   // Find and click the "setup" button.
-  let setupButton = subpanel.querySelector(".PanelUI-remotetabs-prefs-button");
+  let setupButton = subpanel.querySelector(".PanelUI-remotetabs-button");
   setupButton.click();
 
   await new Promise(resolve => {
     let handler = async (e) => {
       if (e.originalTarget != gBrowser.selectedBrowser.contentDocument ||
           e.target.location.href == "about:blank") {
         info("Skipping spurious 'load' event for " + e.target.location.href);
         return;
@@ -140,69 +140,48 @@ add_task(async function() {
 add_task(asyncCleanup);
 
 // When Sync is configured in a "needs reauthentication" state.
 add_task(async function() {
   gSync.updateAllUI({ status: UIState.STATUS_LOGIN_FAILED, email: "foo@bar.com" });
   await openPrefsFromMenuPanel("PanelUI-remotetabs-reauthsync", "synced-tabs");
 });
 
-// Test the mobile promo links
+// Test the Connect Another Device button
 add_task(async function() {
-  // change the preferences for the mobile links.
-  Services.prefs.setCharPref("identity.mobilepromo.android", "http://example.com/?os=android&tail=");
-  Services.prefs.setCharPref("identity.mobilepromo.ios", "http://example.com/?os=ios&tail=");
+  Services.prefs.setCharPref("identity.fxaccounts.remote.connectdevice.uri", "http://example.com/connectdevice");
 
   gSync.updateAllUI({ status: UIState.STATUS_SIGNED_IN, email: "foo@bar.com" });
 
-  let syncPanel = document.getElementById("PanelUI-remotetabs");
-  let links = syncPanel.querySelectorAll(".remotetabs-promo-link");
-
-  is(links.length, 2, "found 2 links as expected");
+  let button = document.getElementById("PanelUI-remotetabs-connect-device-button");
+  ok(button, "found the button");
 
-  // test each link and left and middle mouse buttons
-  for (let link of links) {
-    for (let button = 0; button < 2; button++) {
-      await document.getElementById("nav-bar").overflowable.show();
-      EventUtils.sendMouseEvent({ type: "click", button }, link, window);
-      // the panel should have been closed.
-      ok(!isOverflowOpen(), "click closed the panel");
-      // should be a new tab - wait for the load.
-      is(gBrowser.tabs.length, 2, "there's a new tab");
-      await new Promise(resolve => {
-        if (gBrowser.selectedBrowser.currentURI.spec == "about:blank") {
-          gBrowser.selectedBrowser.addEventListener("load", function(e) {
-            resolve();
-          }, {capture: true, once: true});
-          return;
-        }
-        // the new tab has already transitioned away from about:blank so we
-        // are good to go.
+  await document.getElementById("nav-bar").overflowable.show();
+  button.click();
+  // the panel should have been closed.
+  ok(!isOverflowOpen(), "click closed the panel");
+  // should be a new tab - wait for the load.
+  is(gBrowser.tabs.length, 2, "there's a new tab");
+  await new Promise(resolve => {
+    if (gBrowser.selectedBrowser.currentURI.spec == "about:blank") {
+      gBrowser.selectedBrowser.addEventListener("load", function(e) {
         resolve();
-      });
-
-      let os = link.getAttribute("mobile-promo-os");
-      let expectedUrl = `http://example.com/?os=${os}&tail=synced-tabs`;
-      is(gBrowser.selectedBrowser.currentURI.spec, expectedUrl, "correct URL");
-      gBrowser.removeTab(gBrowser.selectedTab);
+      }, {capture: true, once: true});
+      return;
     }
-  }
+    // the new tab has already transitioned away from about:blank so we
+    // are good to go.
+    resolve();
+  });
 
-  // test each link and right mouse button - should be a noop.
-  await document.getElementById("nav-bar").overflowable.show();
-  for (let link of links) {
-    EventUtils.sendMouseEvent({ type: "click", button: 2 }, link, window);
-    // the panel should still be open
-    ok(isOverflowOpen(), "panel remains open after right-click");
-    is(gBrowser.tabs.length, 1, "no new tab was opened");
-  }
-  await hideOverflow();
+  let expectedUrl = `http://example.com/connectdevice?entrypoint=synced-tabs`;
+  is(gBrowser.selectedBrowser.currentURI.spec, expectedUrl, "correct URL");
+  gBrowser.removeTab(gBrowser.selectedTab);
 
-  Services.prefs.clearUserPref("identity.mobilepromo.android");
-  Services.prefs.clearUserPref("identity.mobilepromo.ios");
+  Services.prefs.clearUserPref("identity.fxaccounts.remote.connectdevice.uri");
 });
 
 // Test the "Sync Now" button
 add_task(async function() {
   gSync.updateAllUI({ status: UIState.STATUS_SIGNED_IN, email: "foo@bar.com" });
 
   await document.getElementById("nav-bar").overflowable.show();
   let tabsUpdatedPromise = promiseObserverNotified("synced-tabs-menu:test:tabs-updated");
--- a/browser/components/preferences/blocklists.js
+++ b/browser/components/preferences/blocklists.js
@@ -3,17 +3,16 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 Components.utils.import("resource://gre/modules/Services.jsm");
 const BASE_LIST_ID = "base";
 const CONTENT_LIST_ID = "content";
 const TRACK_SUFFIX = "-track-digest256";
 const TRACKING_TABLE_PREF = "urlclassifier.trackingTable";
 const LISTS_PREF_BRANCH = "browser.safebrowsing.provider.mozilla.lists.";
-const UPDATE_TIME_PREF = "browser.safebrowsing.provider.mozilla.nextupdatetime";
 
 var gBlocklistManager = {
   _type: "",
   _blockLists: [],
   _brandShortName: null,
   _bundle: null,
   _tree: null,
 
@@ -114,17 +113,23 @@ var gBlocklistManager = {
     if (activeList !== selected.id) {
       let trackingTable = Services.prefs.getCharPref(TRACKING_TABLE_PREF);
       if (selected.id != CONTENT_LIST_ID) {
         trackingTable = trackingTable.replace("," + CONTENT_LIST_ID + TRACK_SUFFIX, "");
       } else {
         trackingTable += "," + CONTENT_LIST_ID + TRACK_SUFFIX;
       }
       Services.prefs.setCharPref(TRACKING_TABLE_PREF, trackingTable);
-      Services.prefs.setCharPref(UPDATE_TIME_PREF, 42);
+
+      // Force an update after changing the tracking protection table.
+      let listmanager = Components.classes["@mozilla.org/url-classifier/listmanager;1"]
+                        .getService(Components.interfaces.nsIUrlListManager);
+      if (listmanager) {
+        listmanager.forceUpdates(trackingTable);
+      }
     }
 
     window.close();
   },
 
   _loadBlockLists() {
     this._blockLists = [];
 
--- a/browser/components/preferences/in-content/privacy.js
+++ b/browser/components/preferences/in-content/privacy.js
@@ -1122,16 +1122,23 @@ var gPrivacyPane = {
 
         malware.push("test-unwanted-simple");
       }
 
       // sort alphabetically to keep the pref consistent
       malware.sort();
 
       malwareTable.value = malware.join(",");
+
+      // Force an update after changing the malware table.
+      let listmanager = Components.classes["@mozilla.org/url-classifier/listmanager;1"]
+                        .getService(Components.interfaces.nsIUrlListManager);
+      if (listmanager) {
+        listmanager.forceUpdates(malwareTable.value);
+      }
     });
 
     // set initial values
 
     enableSafeBrowsing.checked = safeBrowsingPhishingPref.value && safeBrowsingMalwarePref.value;
     if (!enableSafeBrowsing.checked) {
       if (blockDownloads) {
         blockDownloads.setAttribute("disabled", "true");
--- a/browser/components/syncedtabs/SyncedTabsDeckComponent.js
+++ b/browser/components/syncedtabs/SyncedTabsDeckComponent.js
@@ -74,18 +74,17 @@ SyncedTabsDeckComponent.prototype = {
     Services.obs.addObserver(this, FxAccountsCommon.ONLOGIN_NOTIFICATION);
     Services.obs.addObserver(this, "weave:service:login:change");
 
     // Go ahead and trigger sync
     this._SyncedTabs.syncTabs()
                     .catch(Cu.reportError);
 
     this._deckView = new this._DeckView(this._window, this.tabListComponent, {
-      onAndroidClick: event => this.openAndroidLink(event),
-      oniOSClick: event => this.openiOSLink(event),
+      onConnectDeviceClick: event => this.openConnectDevice(event),
       onSyncPrefClick: event => this.openSyncPrefs(event)
     });
 
     this._deckStore.on("change", state => this._deckView.render(state));
     // Trigger the initial rendering of the deck view
     // Object.values only in nightly
     this._deckStore.setPanels(Object.keys(this.PANELS).map(k => this.PANELS[k]));
     // Set the initial panel to display
@@ -146,27 +145,17 @@ SyncedTabsDeckComponent.prototype = {
 
   updatePanel() {
     // return promise for tests
     return this.getPanelStatus()
       .then(panelId => this._deckStore.selectPanel(panelId))
       .catch(Cu.reportError);
   },
 
-  openAndroidLink(event) {
-    let href = Services.prefs.getCharPref("identity.mobilepromo.android") + "synced-tabs-sidebar";
-    this._openUrl(href, event);
-  },
-
-  openiOSLink(event) {
-    let href = Services.prefs.getCharPref("identity.mobilepromo.ios") + "synced-tabs-sidebar";
-    this._openUrl(href, event);
+  openSyncPrefs() {
+    this._getChromeWindow(this._window).gSync.openPrefs("tabs-sidebar");
   },
 
-  _openUrl(url, event) {
-    this._window.openUILink(url, event);
+  openConnectDevice() {
+    this._getChromeWindow(this._window).gSync.openConnectAnotherDevice("tabs-sidebar");
   },
-
-  openSyncPrefs() {
-    this._getChromeWindow(this._window).gSync.openPrefs("tabs-sidebar");
-  }
 };
 
--- a/browser/components/syncedtabs/SyncedTabsDeckView.js
+++ b/browser/components/syncedtabs/SyncedTabsDeckView.js
@@ -1,18 +1,16 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 "use strict";
 
 const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components;
 
-let { getChromeWindow } = Cu.import("resource:///modules/syncedtabs/util.js", {});
-
 let log = Cu.import("resource://gre/modules/Log.jsm", {})
             .Log.repository.getLogger("Sync.RemoteTabs");
 
 this.EXPORTED_SYMBOLS = [
   "SyncedTabsDeckView"
 ];
 
 /**
@@ -49,41 +47,20 @@ SyncedTabsDeckView.prototype = {
 
     let tabListWrapper = this._doc.createElement("div");
     tabListWrapper.className = "tabs-container sync-state";
     this._tabListComponent.init();
     tabListWrapper.appendChild(this._tabListComponent.container);
     deck.appendChild(tabListWrapper);
     this.container.appendChild(deck);
 
-    this._generateDevicePromo();
-
     this._attachListeners();
     this.update(state);
   },
 
-  _getBrowserBundle() {
-    return getChromeWindow(this._window).document.getElementById("bundle_browser");
-  },
-
-  _generateDevicePromo() {
-    let bundle = this._getBrowserBundle();
-    let formatArgs = ["android", "ios"].map(os => {
-      let link = this._doc.createElement("a");
-      link.textContent = bundle.getString(`appMenuRemoteTabs.mobilePromo.${os}`);
-      link.className = `${os}-link text-link`;
-      link.setAttribute("href", "#");
-      return link.outerHTML;
-    });
-    // Put it all together...
-    let contents = bundle.getFormattedString("appMenuRemoteTabs.mobilePromo.text2", formatArgs);
-    // eslint-disable-next-line no-unsanitized/property
-    this.container.querySelector(".device-promo").innerHTML = contents;
-  },
-
   destroy() {
     this._tabListComponent.uninit();
     this.container.remove();
   },
 
   update(state) {
     // Note that we may also want to update elements that are outside of the
     // deck, so use the document to find the class names rather than our
@@ -101,17 +78,16 @@ SyncedTabsDeckView.prototype = {
 
   _clearChilden() {
     while (this.container.firstChild) {
       this.container.firstChild.remove();
     }
   },
 
   _attachListeners() {
-    this.container.querySelector(".android-link").addEventListener("click", this.props.onAndroidClick);
-    this.container.querySelector(".ios-link").addEventListener("click", this.props.oniOSClick);
     let syncPrefLinks = this.container.querySelectorAll(".sync-prefs");
     for (let link of syncPrefLinks) {
       link.addEventListener("click", this.props.onSyncPrefClick);
     }
+    this.container.querySelector(".connect-device").addEventListener("click", this.props.onConnectDeviceClick);
   },
 };
 
--- a/browser/components/syncedtabs/sidebar.xhtml
+++ b/browser/components/syncedtabs/sidebar.xhtml
@@ -78,17 +78,17 @@
         <div class="notAuthedInfo sync-state">
           <div class="syncIllustration"></div>
           <p class="instructions">&syncedTabs.sidebar.notsignedin.label;</p>
           <button class="button sync-prefs">&fxaSignIn.label;</button>
         </div>
         <div class="singleDeviceInfo sync-state">
           <div class="syncIllustrationIssue"></div>
           <p class="instructions">&syncedTabs.sidebar.noclients.subtitle;</p>
-          <p class="instructions device-promo" fxAccountsBrand="&syncBrand.fxAccount.label;"></p>
+          <button class="button connect-device">&syncedTabs.sidebar.connectAnotherDevice;</button>
         </div>
         <div class="tabs-disabled sync-state">
           <div class="syncIllustrationIssue"></div>
           <p class="instructions">&syncedTabs.sidebar.tabsnotsyncing.label;</p>
           <button class="button sync-prefs">&syncedTabs.sidebar.openprefs.label;</button>
         </div>
       </div>
     </template>
--- a/browser/components/syncedtabs/test/xpcshell/test_SyncedTabsDeckComponent.js
+++ b/browser/components/syncedtabs/test/xpcshell/test_SyncedTabsDeckComponent.js
@@ -36,20 +36,18 @@ add_task(async function testInitUninit()
   component.init();
 
   Assert.ok(SyncedTabs.syncTabs.called);
   SyncedTabs.syncTabs.restore();
 
   Assert.ok(ViewMock.calledWithNew(), "view is instantiated");
   Assert.equal(ViewMock.args[0][0], mockWindow);
   Assert.equal(ViewMock.args[0][1], listComponent);
-  Assert.ok(ViewMock.args[0][2].onAndroidClick,
-    "view is passed onAndroidClick prop");
-  Assert.ok(ViewMock.args[0][2].oniOSClick,
-    "view is passed oniOSClick prop");
+  Assert.ok(ViewMock.args[0][2].onConnectDeviceClick,
+    "view is passed onConnectDeviceClick prop");
   Assert.ok(ViewMock.args[0][2].onSyncPrefClick,
     "view is passed onSyncPrefClick prop");
 
   Assert.equal(component.container, view.container,
     "component returns view's container");
 
   Assert.ok(deckStore.on.calledOnce, "listener is added to store");
   Assert.equal(deckStore.on.args[0][0], "change");
@@ -198,39 +196,33 @@ add_task(async function testPanelStatus(
 
   sinon.stub(component, "getPanelStatus", () => Promise.resolve("mock-panelId"));
   sinon.spy(deckStore, "selectPanel");
   await component.updatePanel();
   Assert.ok(deckStore.selectPanel.calledWith("mock-panelId"));
 });
 
 add_task(async function testActions() {
-  let windowMock = {
-    openUILink() {},
-  };
+  let windowMock = {};
   let chromeWindowMock = {
     gSync: {
-      openPrefs() {}
+      openPrefs() {},
+      openConnectAnotherDevice() {}
     }
   };
-  sinon.spy(windowMock, "openUILink");
   sinon.spy(chromeWindowMock.gSync, "openPrefs");
+  sinon.spy(chromeWindowMock.gSync, "openConnectAnotherDevice");
 
   let getChromeWindowMock = sinon.stub();
   getChromeWindowMock.returns(chromeWindowMock);
 
   let component = new SyncedTabsDeckComponent({
     window: windowMock,
     getChromeWindowMock
   });
 
-  let href = Services.prefs.getCharPref("identity.mobilepromo.android") + "synced-tabs-sidebar";
-  component.openAndroidLink("mock-event");
-  Assert.ok(windowMock.openUILink.calledWith(href, "mock-event"));
-
-  href = Services.prefs.getCharPref("identity.mobilepromo.ios") + "synced-tabs-sidebar";
-  component.openiOSLink("mock-event");
-  Assert.ok(windowMock.openUILink.calledWith(href, "mock-event"));
+  component.openConnectDevice();
+  Assert.ok(chromeWindowMock.gSync.openConnectAnotherDevice.called);
 
   component.openSyncPrefs();
   Assert.ok(getChromeWindowMock.calledWith(windowMock));
   Assert.ok(chromeWindowMock.gSync.openPrefs.called);
 });
--- a/browser/extensions/formautofill/FormAutofillHandler.jsm
+++ b/browser/extensions/formautofill/FormAutofillHandler.jsm
@@ -637,17 +637,17 @@ class FormAutofillSection {
           // assumed to be default along with a meaningless text to users.
           if (!value || element.selectedOptions.length != 1) {
             // Keep the property and preserve more information for address updating
             data[type].record[detail.fieldName] = "";
             return;
           }
 
           let text = element.selectedOptions[0].text.trim();
-          value = FormAutofillUtils.getAbbreviatedStateName([value, text]) || text;
+          value = FormAutofillUtils.getAbbreviatedSubregionName([value, text]) || text;
         }
 
         if (!value || value.length > FormAutofillUtils.MAX_FIELD_VALUE_LENGTH) {
           // Keep the property and preserve more information for updating
           data[type].record[detail.fieldName] = "";
           return;
         }
 
--- a/browser/extensions/formautofill/FormAutofillUtils.jsm
+++ b/browser/extensions/formautofill/FormAutofillUtils.jsm
@@ -282,25 +282,41 @@ this.FormAutofillUtils = {
     return true;
   },
 
   loadDataFromScript(url, sandbox = {}) {
     Services.scriptloader.loadSubScript(url, sandbox, "utf-8");
     return sandbox;
   },
 
-  // Get country address data and fallback to US if not found.
-  // See AddressDataLoader.getData for more details of addressData structure.
-  getCountryAddressData(country, level1 = null) {
+  /**
+   * Get country address data and fallback to US if not found.
+   * See AddressDataLoader.getData for more details of addressData structure.
+   * @param {string} [country=FormAutofillUtils.DEFAULT_REGION]
+   *        The country code for requesting specific country's metadata. It'll be
+   *        default region if parameter is not set.
+   * @param {string} [level1=null]
+   *        Retrun address level 1/level 2 metadata if parameter is set.
+   * @returns {object}
+   *          Return the metadata of specific region.
+   */
+  getCountryAddressData(country = FormAutofillUtils.DEFAULT_REGION, level1 = null) {
     let metadata = AddressDataLoader.getData(country, level1);
     if (!metadata) {
-      metadata = level1 ? null : AddressDataLoader.getData("US");
+      if (level1) {
+        return null;
+      }
+      // Fallback to default region if we couldn't get data from given country.
+      if (country != FormAutofillUtils.DEFAULT_REGION) {
+        metadata = AddressDataLoader.getData(FormAutofillUtils.DEFAULT_REGION);
+      }
     }
 
-    return metadata;
+    // Fallback to US if we couldn't get data from default region.
+    return metadata || AddressDataLoader.getData("US");
   },
 
   /**
    * Get the collators based on the specified country.
    * @param   {string} country The specified country.
    * @returns {array} An array containing several collator objects.
    */
   getCollators(country) {
@@ -408,23 +424,23 @@ this.FormAutofillUtils = {
     }
     if (this.isCreditCardField(fieldName)) {
       return this.findCreditCardSelectOption(selectEl, record, fieldName);
     }
     return null;
   },
 
   /**
-   * Try to find the abbreviation of the given state name
-   * @param   {string[]} stateValues A list of inferable state values.
-   * @param   {string} country A country name to be identified.
-   * @returns {string} The matching state abbreviation.
+   * Try to find the abbreviation of the given sub-region name
+   * @param   {string[]} subregionValues A list of inferable sub-region values.
+   * @param   {string} [country] A country name to be identified.
+   * @returns {string} The matching sub-region abbreviation.
    */
-  getAbbreviatedStateName(stateValues, country = this.DEFAULT_COUNTRY_CODE) {
-    let values = Array.isArray(stateValues) ? stateValues : [stateValues];
+  getAbbreviatedSubregionName(subregionValues, country) {
+    let values = Array.isArray(subregionValues) ? subregionValues : [subregionValues];
 
     let collators = this.getCollators(country);
     let {sub_keys: subKeys, sub_names: subNames} = this.getCountryAddressData(country);
 
     if (!Array.isArray(subKeys)) {
       subKeys = subKeys.split("~");
     }
     if (!Array.isArray(subNames)) {
@@ -463,19 +479,18 @@ this.FormAutofillUtils = {
    * @returns {DOMElement}
    */
   findAddressSelectOption(selectEl, address, fieldName) {
     let value = address[fieldName];
     if (!value) {
       return null;
     }
 
-    let country = address.country || this.DEFAULT_COUNTRY_CODE;
-    let dataset = this.getCountryAddressData(country);
-    let collators = this.getCollators(country);
+    let dataset = this.getCountryAddressData(address.country);
+    let collators = this.getCollators(address.country);
 
     for (let option of selectEl.options) {
       if (this.strCompare(value, option.value, collators) ||
           this.strCompare(value, option.text, collators)) {
         return option;
       }
     }
 
@@ -662,18 +677,18 @@ this.FormAutofillUtils = {
     let elements = root.querySelectorAll("[data-localization]");
     for (let element of elements) {
       element.textContent = bundle.GetStringFromName(element.getAttribute("data-localization"));
       element.removeAttribute("data-localization");
     }
   },
 };
 
-XPCOMUtils.defineLazyGetter(this.FormAutofillUtils, "DEFAULT_COUNTRY_CODE", () => {
-  return Services.prefs.getCharPref("browser.search.countryCode", "US");
+XPCOMUtils.defineLazyGetter(this.FormAutofillUtils, "DEFAULT_REGION", () => {
+  return Services.prefs.getCharPref("browser.search.region", "US");
 });
 
 this.log = null;
 this.FormAutofillUtils.defineLazyLogGetter(this, this.EXPORTED_SYMBOLS[0]);
 
 XPCOMUtils.defineLazyGetter(FormAutofillUtils, "stringBundle", function() {
   return Services.strings.createBundle("chrome://formautofill/locale/formautofill.properties");
 });
--- a/browser/extensions/formautofill/ProfileStorage.jsm
+++ b/browser/extensions/formautofill/ProfileStorage.jsm
@@ -1272,17 +1272,17 @@ class Addresses extends AutofillRecords 
         address["country-name"] = "";
       }
       hasNewComputedFields = true;
     }
 
     // Compute tel
     if (!("tel-national" in address)) {
       if (address.tel) {
-        let tel = PhoneNumber.Parse(address.tel, address.country || FormAutofillUtils.DEFAULT_COUNTRY_CODE);
+        let tel = PhoneNumber.Parse(address.tel, address.country || FormAutofillUtils.DEFAULT_REGION);
         if (tel) {
           if (tel.countryCode) {
             address["tel-country-code"] = tel.countryCode;
           }
           if (tel.nationalNumber) {
             address["tel-national"] = tel.nationalNumber;
           }
 
@@ -1372,17 +1372,17 @@ class Addresses extends AutofillRecords 
 
     delete address["country-name"];
   }
 
   _normalizeTel(address) {
     if (address.tel || TEL_COMPONENTS.some(c => !!address[c])) {
       FormAutofillUtils.compressTel(address);
 
-      let possibleRegion = address.country || FormAutofillUtils.DEFAULT_COUNTRY_CODE;
+      let possibleRegion = address.country || FormAutofillUtils.DEFAULT_REGION;
       let tel = PhoneNumber.Parse(address.tel, possibleRegion);
 
       if (tel && tel.internationalNumber) {
         // Force to save numbers in E.164 format if parse success.
         address.tel = tel.internationalNumber;
       }
     }
     TEL_COMPONENTS.forEach(c => delete address[c]);
@@ -1654,18 +1654,23 @@ class CreditCards extends AutofillRecord
   getDuplicateGuid(targetCreditCard) {
     let clonedTargetCreditCard = this._clone(targetCreditCard);
     this._normalizeRecord(clonedTargetCreditCard);
     for (let creditCard of this._data) {
       let isDuplicate = this.VALID_FIELDS.every(field => {
         if (!clonedTargetCreditCard[field]) {
           return !creditCard[field];
         }
-        if (field == "cc-number") {
-          return this._getMaskedCCNumber(clonedTargetCreditCard[field]) == creditCard[field];
+        if (field == "cc-number" && creditCard[field]) {
+          if (MasterPassword.isEnabled) {
+            // Compare the masked numbers instead when the master password is
+            // enabled because we don't want to leak the credit card number.
+            return this._getMaskedCCNumber(clonedTargetCreditCard[field]) == creditCard[field];
+          }
+          return clonedTargetCreditCard[field] == MasterPassword.decryptSync(creditCard["cc-number-encrypted"]);
         }
         return clonedTargetCreditCard[field] == creditCard[field];
       });
       if (isDuplicate) {
         return creditCard.guid;
       }
     }
     return null;
--- a/browser/extensions/formautofill/addressmetadata/addressReferences.js
+++ b/browser/extensions/formautofill/addressmetadata/addressReferences.js
@@ -11,10 +11,13 @@
 // https://chromium-i18n.appspot.com/ssl-aggregate-address
 
 // WARNING: DO NOT change any value or add additional properties in addressData.
 // We only accept the metadata of the supported countries that is copied from libaddressinput directly.
 // Please edit addressReferencesExt.js instead if you want to add new property as complement
 // or overwrite the existing properties.
 
 var addressData = {
+  "data/CA": {"lang": "en", "upper": "ACNOSZ", "zipex": "H3Z 2Y7,V8X 3X4,T0L 1K0,T0H 1A0,K1A 0B1", "name": "CANADA", "zip": "[ABCEGHJKLMNPRSTVXY]\\d[ABCEGHJ-NPRSTV-Z] ?\\d[ABCEGHJ-NPRSTV-Z]\\d", "fmt": "%N%n%O%n%A%n%C %S %Z", "id": "data/CA", "languages": "en~fr", "sub_keys": "AB~BC~MB~NB~NL~NT~NS~NU~ON~PE~QC~SK~YT", "key": "CA", "posturl": "https://www.canadapost.ca/cpo/mc/personal/postalcode/fpc.jsf", "require": "ACSZ", "sub_names": "Alberta~British Columbia~Manitoba~New Brunswick~Newfoundland and Labrador~Northwest Territories~Nova Scotia~Nunavut~Ontario~Prince Edward Island~Quebec~Saskatchewan~Yukon", "sub_zips": "T~V~R~E~A~X0E|X0G|X1A~B~X0A|X0B|X0C~K|L|M|N|P~C~G|H|J|K1A~S|R8A~Y"},
+  "data/CA--fr": {"lang": "fr", "upper": "ACNOSZ", "zipex": "H3Z 2Y7,V8X 3X4,T0L 1K0,T0H 1A0,K1A 0B1", "name": "CANADA", "zip": "[ABCEGHJKLMNPRSTVXY]\\d[ABCEGHJ-NPRSTV-Z] ?\\d[ABCEGHJ-NPRSTV-Z]\\d", "fmt": "%N%n%O%n%A%n%C %S %Z", "require": "ACSZ", "sub_keys": "AB~BC~PE~MB~NB~NS~NU~ON~QC~SK~NL~NT~YT", "key": "CA", "posturl": "https://www.canadapost.ca/cpo/mc/personal/postalcode/fpc.jsf", "id": "data/CA--fr", "sub_names": "Alberta~Colombie-Britannique~Île-du-Prince-Édouard~Manitoba~Nouveau-Brunswick~Nouvelle-Écosse~Nunavut~Ontario~Québec~Saskatchewan~Terre-Neuve-et-Labrador~Territoires du Nord-Ouest~Yukon", "sub_zips": "T~V~C~R~E~B~X0A|X0B|X0C~K|L|M|N|P~G|H|J|K1A~S|R8A~A~X0E|X0G|X1A~Y"},
+  "data/DE": {"zipex": "26133,53225", "name": "GERMANY", "zip": "\\d{5}", "fmt": "%N%n%O%n%A%n%Z %C", "id": "data/DE", "key": "DE", "posturl": "http://www.postdirekt.de/plzserver/", "require": "ACZ"},
   "data/US": {"lang": "en", "upper": "CS", "sub_zipexs": "35000,36999~99500,99999~96799~85000,86999~71600,72999~34000,34099~09000,09999~96200,96699~90000,96199~80000,81999~06000,06999~19700,19999~20000,56999~32000,34999~30000,39901~96910,96932~96700,96899~83200,83999~60000,62999~46000,47999~50000,52999~66000,67999~40000,42799~70000,71599~03900,04999~96960,96979~20600,21999~01000,05544~48000,49999~96941,96944~55000,56799~38600,39799~63000,65999~59000,59999~68000,69999~88900,89999~03000,03899~07000,08999~87000,88499~10000,00544~27000,28999~58000,58999~96950,96952~43000,45999~73000,74999~97000,97999~96940~15000,19699~00600,00999~02800,02999~29000,29999~57000,57999~37000,38599~75000,73344~84000,84999~05000,05999~00800,00899~20100,24699~98000,99499~24700,26999~53000,54999~82000,83414", "zipex": "95014,22162-1010", "name": "UNITED STATES", "zip": "(\\d{5})(?:[ \\-](\\d{4}))?", "zip_name_type": "zip", "fmt": "%N%n%O%n%A%n%C, %S %Z", "state_name_type": "state", "id": "data/US", "languages": "en", "sub_keys": "AL~AK~AS~AZ~AR~AA~AE~AP~CA~CO~CT~DE~DC~FL~GA~GU~HI~ID~IL~IN~IA~KS~KY~LA~ME~MH~MD~MA~MI~FM~MN~MS~MO~MT~NE~NV~NH~NJ~NM~NY~NC~ND~MP~OH~OK~OR~PW~PA~PR~RI~SC~SD~TN~TX~UT~VT~VI~VA~WA~WV~WI~WY", "key": "US", "posturl": "https://tools.usps.com/go/ZipLookupAction!input.action", "require": "ACSZ", "sub_names": "Alabama~Alaska~American Samoa~Arizona~Arkansas~Armed Forces (AA)~Armed Forces (AE)~Armed Forces (AP)~California~Colorado~Connecticut~Delaware~District of Columbia~Florida~Georgia~Guam~Hawaii~Idaho~Illinois~Indiana~Iowa~Kansas~Kentucky~Louisiana~Maine~Marshall Islands~Maryland~Massachusetts~Michigan~Micronesia~Minnesota~Mississippi~Missouri~Montana~Nebraska~Nevada~New Hampshire~New Jersey~New Mexico~New York~North Carolina~North Dakota~Northern Mariana Islands~Ohio~Oklahoma~Oregon~Palau~Pennsylvania~Puerto Rico~Rhode Island~South Carolina~South Dakota~Tennessee~Texas~Utah~Vermont~Virgin Islands~Virginia~Washington~West Virginia~Wisconsin~Wyoming", "sub_zips": "3[56]~99[5-9]~96799~8[56]~71[6-9]|72~340~09~96[2-6]~9[0-5]|96[01]~8[01]~06~19[7-9]~20[02-5]|569~3[23]|34[1-9]~3[01]|398|39901~969([1-2]\\d|3[12])~967[0-8]|9679[0-8]|968~83[2-9]~6[0-2]~4[67]~5[0-2]~6[67]~4[01]|42[0-7]~70|71[0-5]~039|04~969[67]~20[6-9]|21~01|02[0-7]|05501|05544~4[89]~9694[1-4]~55|56[0-7]~38[6-9]|39[0-7]~6[3-5]~59~6[89]~889|89~03[0-8]~0[78]~87|88[0-4]~1[0-4]|06390|00501|00544~2[78]~58~9695[0-2]~4[3-5]~7[34]~97~969(39|40)~1[5-8]|19[0-6]~00[679]~02[89]~29~57~37|38[0-5]~7[5-9]|885|73301|73344~84~05~008~201|2[23]|24[0-6]~98|99[0-4]~24[7-9]|2[56]~5[34]~82|83[01]|83414"},
 };
--- a/browser/extensions/formautofill/test/unit/test_addressDataLoader.js
+++ b/browser/extensions/formautofill/test/unit/test_addressDataLoader.js
@@ -1,12 +1,27 @@
 "use strict";
 
 Cu.import("resource://formautofill/FormAutofillUtils.jsm");
 
+const SUPPORT_COUNTRIES_TESTCASES = [
+  {
+    country: "US",
+    properties: ["languages", "alternative_names", "sub_keys", "sub_names"],
+  },
+  {
+    country: "CA",
+    properties: ["languages", "name", "sub_keys", "sub_names"],
+  },
+  {
+    country: "DE",
+    properties: ["name"],
+  },
+];
+
 add_task(async function test_initalState() {
   // addressData should not exist
   Assert.equal(AddressDataLoader._addressData, undefined);
   // Verify _dataLoaded state
   Assert.equal(AddressDataLoader._dataLoaded.country, false);
   Assert.equal(AddressDataLoader._dataLoaded.level1.size, 0);
 });
 
@@ -42,8 +57,17 @@ add_task(async function test_loadDataSta
   AddressDataLoader._loadScripts.reset();
 
   // Load level 1 data again
   undefinedMetadata = FormAutofillUtils.getCountryAddressData("US", "AS");
   Assert.equal(undefinedMetadata, undefined, "metadata should be undefined");
   // _loadScripts should not be called
   sinon.assert.notCalled(AddressDataLoader._loadScripts);
 });
+
+SUPPORT_COUNTRIES_TESTCASES.forEach(testcase => {
+  add_task(async function test_support_country() {
+    do_print("Starting testcase: Check " + testcase.country + " metadata");
+    let metadata = FormAutofillUtils.getCountryAddressData(testcase.country);
+    Assert.ok(testcase.properties.every(key => metadata[key]),
+              "These properties should exist: " + testcase.properties);
+  });
+});
--- a/browser/extensions/formautofill/test/unit/test_creditCardRecords.js
+++ b/browser/extensions/formautofill/test/unit/test_creditCardRecords.js
@@ -515,8 +515,50 @@ add_task(async function test_mergeToStor
   do_check_eq(profileStorage.creditCards.getAll()[0]["cc-name"], "Foo Bar");
   do_check_eq(profileStorage.creditCards.getAll()[0]["cc-exp"], "2000-01");
   do_check_eq(profileStorage.creditCards.getAll()[1]["cc-name"], "Foo Bar");
   do_check_eq(profileStorage.creditCards.getAll()[1]["cc-exp"], "2000-01");
 
   // Empty computed fields shouldn't cause any problem.
   do_check_eq(profileStorage.creditCards.mergeToStorage(TEST_CREDIT_CARD_WITH_EMPTY_COMPUTED_FIELD).length, 0);
 });
+
+add_task(async function test_getDuplicateGuid() {
+  let profileStorage = await initProfileStorage(TEST_STORE_FILE_NAME,
+                                                [TEST_CREDIT_CARD_3],
+                                                "creditCards");
+  let guid = profileStorage.creditCards._data[0].guid;
+
+  // Absolutely a duplicate.
+  do_check_eq(profileStorage.creditCards.getDuplicateGuid(TEST_CREDIT_CARD_3), guid);
+
+  // Absolutely not a duplicate.
+  do_check_eq(profileStorage.creditCards.getDuplicateGuid(TEST_CREDIT_CARD_1), null);
+
+  // Subset shouldn't be treated as a duplicate.
+  let record = Object.assign({}, TEST_CREDIT_CARD_3);
+  delete record["cc-exp-month"];
+  do_check_eq(profileStorage.creditCards.getDuplicateGuid(record), null);
+
+  // Superset shouldn't be treated as a duplicate.
+  record = Object.assign({}, TEST_CREDIT_CARD_3);
+  record["cc-name"] = "John Doe";
+  do_check_eq(profileStorage.creditCards.getDuplicateGuid(record), null);
+
+  // Numbers with the same last 4 digits shouldn't be treated as a duplicate.
+  record = Object.assign({}, TEST_CREDIT_CARD_3);
+  let last4Digits = record["cc-number"].substr(-4);
+  record["cc-number"] = "000000000000" + last4Digits;
+  do_check_eq(profileStorage.creditCards.getDuplicateGuid(record), null);
+
+  // ... However, we treat numbers with the same last 4 digits as a duplicate if
+  // the master password is enabled.
+  let tokendb = Cc["@mozilla.org/security/pk11tokendb;1"].createInstance(Ci.nsIPK11TokenDB);
+  let token = tokendb.getInternalKeyToken();
+  token.reset();
+  token.initPassword("password");
+  do_check_eq(profileStorage.creditCards.getDuplicateGuid(record), guid);
+
+  // ... Even though the master password is enabled and the last 4 digits are the
+  // same, an invalid credit card number should never be treated as a duplicate.
+  record["cc-number"] = "************" + last4Digits;
+  do_check_eq(profileStorage.creditCards.getDuplicateGuid(record), null);
+});
--- a/browser/extensions/formautofill/test/unit/test_transformFields.js
+++ b/browser/extensions/formautofill/test/unit/test_transformFields.js
@@ -406,17 +406,17 @@ const ADDRESS_NORMALIZE_TESTCASES = [
       "country": undefined,
       "country-name": undefined,
     },
   },
   {
     description: "Has unsupported \"country\"",
     address: {
       "given-name": "John", // Make sure it won't be an empty record.
-      "country": "CA",
+      "country": "TV",
     },
     expectedResult: {
       "country": undefined,
       "country-name": undefined,
     },
   },
 
   // Tel
--- a/browser/locales/en-US/chrome/browser/accounts.properties
+++ b/browser/locales/en-US/chrome/browser/accounts.properties
@@ -45,21 +45,25 @@ sendToAllDevices.menuitem = Send to All 
 sendTabToDevice.unconfigured.status = Not Connected to Sync
 sendTabToDevice.unconfigured = Learn About Sending Tabs…
 
 # LOCALIZATION NOTE (sendTabToDevice.signintosync)
 # Displayed in the Send Tabs context menu and the page action panel when sync is not
 # configured. Allows users to immediately sign into sync via the preferences.
 sendTabToDevice.signintosync = Sign in to Sync…
 
-# LOCALIZATION NOTE (sendTabToDevice.singledevice, sendTabToDevice.singledevice.status)
+# LOCALIZATION NOTE (sendTabToDevice.singledevice, sendTabToDevice.connectdevice,
+# sendTabToDevice.singledevice.status)
 # Displayed in the Send Tabs context menu when right clicking a tab, a page or a link
-# and the Sync account has only 1 device. Redirects to a marketing page.
+# and the Sync account has only 1 device. The sendTabToDevice.singledevice link
+# redirects to a marketing page, the sendTabToDevice.connectdevice redirects
+# to an FxAccounts page that tells to you to connect another device.
 sendTabToDevice.singledevice.status = No Devices Connected
 sendTabToDevice.singledevice = Learn About Sending Tabs…
+sendTabToDevice.connectdevice = Connect Another Device…
 
 # LOCALIZATION NOTE (sendTabToDevice.verify, sendTabToDevice.verify.status)
 # Displayed in the Send Tabs context menu when right clicking a tab, a page or a link
 # and the Sync account is unverified. Redirects to the Sync preferences page.
 sendTabToDevice.verify.status = Account Not Verified
 sendTabToDevice.verify = Verify Your Account…
 
 # LOCALIZATION NOTE (tabArrivingNotification.title, tabArrivingNotificationWithDevice.title,
--- a/browser/locales/en-US/chrome/browser/browser.dtd
+++ b/browser/locales/en-US/chrome/browser/browser.dtd
@@ -379,16 +379,17 @@ These should match what Safari and other
      when Sync is configured but this appears to be the only device attached to
      the account. We also show links to download Firefox for android/ios. -->
 <!ENTITY appMenuRemoteTabs.noclients.subtitle "Want to see your tabs from other devices here?">
 <!ENTITY appMenuRemoteTabs.openprefs.label "Sync Preferences">
 <!ENTITY appMenuRemoteTabs.notsignedin.label "Sign in to view a list of tabs from your other devices.">
 <!ENTITY appMenuRemoteTabs.signin.label "Sign in to Sync">
 <!ENTITY appMenuRemoteTabs.managedevices.label "Manage Devices…">
 <!ENTITY appMenuRemoteTabs.sidebar.label "View Synced Tabs Sidebar">
+<!ENTITY appMenuRemoteTabs.connectdevice.label "Connect Another Device">
 
 <!ENTITY appMenuRecentHighlights.label "Recent Highlights">
 
 <!ENTITY customizeMenu.addToToolbar.label "Add to Toolbar">
 <!ENTITY customizeMenu.addToToolbar.accesskey "A">
 <!ENTITY customizeMenu.addToPanel.label "Add to Menu">
 <!ENTITY customizeMenu.addToPanel.accesskey "M">
 <!-- LOCALIZATION NOTE (customizeMenu.addToOverflowMenu.label,
@@ -794,16 +795,17 @@ you can use these alternative items. Oth
 <!ENTITY syncedTabs.sidebar.noclients.subtitle "Want to see your tabs from other devices here?">
 <!ENTITY syncedTabs.sidebar.notsignedin.label  "Sign in to view a list of tabs from your other devices.">
 <!ENTITY syncedTabs.sidebar.notabs.label       "No open tabs">
 <!ENTITY syncedTabs.sidebar.openprefs.label    "Open &syncBrand.shortName.label; Preferences">
 <!-- LOCALIZATION NOTE (syncedTabs.sidebar.tabsnotsyncing.label): This is shown
      when Sync is configured but syncing tabs is disabled. -->
 <!ENTITY syncedTabs.sidebar.tabsnotsyncing.label       "Turn on tab syncing to view a list of tabs from your other devices.">
 <!ENTITY syncedTabs.sidebar.searchPlaceholder  "Search synced tabs">
+<!ENTITY syncedTabs.sidebar.connectAnotherDevice  "Connect Another Device">
 
 <!-- LOCALIZATION NOTE (syncedTabs.context.open.accesskey,
                         syncedTabs.context.openAllInTabs.accesskey):
      These access keys are identical because their associated menu items are
      mutually exclusive -->
 <!ENTITY syncedTabs.context.open.label                       "Open">
 <!ENTITY syncedTabs.context.open.accesskey                   "O">
 <!ENTITY syncedTabs.context.openInNewTab.label               "Open in a New Tab">
--- a/browser/locales/en-US/chrome/browser/browser.properties
+++ b/browser/locales/en-US/chrome/browser/browser.properties
@@ -806,27 +806,16 @@ slowStartup.disableNotificationButton.ac
 # LOCALIZATION NOTE  - %S is brandShortName
 flashHang.message = %S changed some Adobe Flash settings to improve performance.
 flashHang.helpButton.label = Learn More…
 flashHang.helpButton.accesskey = L
 
 # LOCALIZATION NOTE (customizeMode.tabTitle): %S is brandShortName
 customizeMode.tabTitle = Customize %S
 
-# LOCALIZATION NOTE (appMenuRemoteTabs.mobilePromo.text2):
-# %1$S will be replaced with a link, the text of which is
-# appMenuRemoteTabs.mobilePromo.android and the link will be to
-# https://www.mozilla.org/firefox/android/.
-# %2$S will be replaced with a link, the text of which is
-# appMenuRemoteTabs.mobilePromo.ios
-# and the link will be to https://www.mozilla.org/firefox/ios/.
-appMenuRemoteTabs.mobilePromo.text2 = Download %1$S or %2$S and connect them to your Firefox Account.
-appMenuRemoteTabs.mobilePromo.android = Firefox for Android
-appMenuRemoteTabs.mobilePromo.ios = Firefox for iOS
-
 # LOCALIZATION NOTE (e10s.accessibilityNotice.mainMessage,
 #                    e10s.accessibilityNotice.enableAndRestart.label,
 #                    e10s.accessibilityNotice.enableAndRestart.accesskey):
 # These strings are related to the messages we display to offer e10s (Multi-process) to users
 # on the pre-release channels. They won't be used in release but they will likely be used in
 # beta starting from version 41, so it's still useful to have these strings properly localized.
 # %S is brandShortName
 e10s.accessibilityNotice.mainMessage2 = Accessibility support is partially disabled due to compatibility issues with new %S features.
@@ -921,9 +910,9 @@ permissions.remove.tooltip = Clear this 
 # between the Firefox version and the "What's new" link in the About dialog,
 # e.g.: "48.0.2 (32-bit) <What's new>" or "51.0a1 (2016-09-05) (64-bit)".
 aboutDialog.architecture.sixtyFourBit = 64-bit
 aboutDialog.architecture.thirtyTwoBit = 32-bit
 
 # LOCALIZATION NOTE (certImminentDistrust.message):
 # Shown in the browser console when visiting a website that is trusted today,
 # but won't be in the future unless the site operator makes a change.
-certImminentDistrust.message = The security certificate in use on this website will no longer be trusted in a future release. For more information, visit https://wiki.mozilla.org/CA/Upcoming_Distrust_Actions
\ No newline at end of file
+certImminentDistrust.message = The security certificate in use on this website will no longer be trusted in a future release. For more information, visit https://wiki.mozilla.org/CA/Upcoming_Distrust_Actions
--- a/browser/themes/shared/customizableui/customizeMode.inc.css
+++ b/browser/themes/shared/customizableui/customizeMode.inc.css
@@ -660,16 +660,20 @@ toolbarpaletteitem[place=toolbar] > tool
   height: 20px;
 }
 
 #customization-pong-arena[lives="0"] > #wp-ball {
   animation: game-over 4s forwards ease;
 }
 
 @keyframes game-over {
+  0% {
+    transform: scale(1) translateY(0) rotateZ(0);
+    opacity: 1;
+  }
   15% {
     transform: scale(2) translateY(-10px) rotateZ(-90deg);
   }
   35% {
     opacity: 1;
   }
   65% {
     opacity: 0;
--- a/browser/themes/shared/customizableui/panelUI.inc.css
+++ b/browser/themes/shared/customizableui/panelUI.inc.css
@@ -534,16 +534,17 @@ toolbarbutton[constrain-size="true"][cui
   list-style-image: url(chrome://browser/skin/sync.svg);
 }
 
 #appMenu-fxa-label {
   -moz-box-flex: 1;
 }
 
 @keyframes syncRotate {
+  from { transform: rotate(0); }
   to { transform: rotate(360deg); }
 }
 
 #appMenu-fxa-icon[syncstatus="active"] > .toolbarbutton-icon,
 #PanelUI-remotetabs-syncnow[syncstatus="active"] > .toolbarbutton-icon {
   animation: syncRotate 0.8s linear infinite;
   fill: #0a84ff;
 }
@@ -617,18 +618,17 @@ toolbarbutton[constrain-size="true"][cui
   border-inline-start-style: none;
 }
 
 #PanelUI-remotetabs {
   --panel-ui-sync-illustration-height: 157.5px;
 }
 
 .PanelUI-remotetabs-instruction-title,
-.PanelUI-remotetabs-instruction-label,
-#PanelUI-remotetabs-mobile-promo {
+.PanelUI-remotetabs-instruction-label {
   /* If you change the margin here, the min-height of the synced tabs panel
     (e.g. #PanelUI-remotetabs[mainview] #PanelUI-remotetabs-setupsync, etc) may
     need adjusting (see bug 1248506) */
   margin: 15px;
   text-align: center;
   text-shadow: none;
   max-width: 15em;
   color: GrayText;
@@ -643,38 +643,38 @@ toolbarbutton[constrain-size="true"][cui
 .PanelUI-remotetabs-instruction-box {
   /* If you change the padding here, the min-height of the synced tabs panel
     (e.g. #PanelUI-remotetabs[mainview] #PanelUI-remotetabs-setupsync, etc) may
     need adjusting (see bug 1248506) */
   padding-bottom: 30px;
   padding-top: 15px;
 }
 
-.PanelUI-remotetabs-prefs-button {
+.PanelUI-remotetabs-button {
   -moz-appearance: none;
   background-color: #0060df;
   /* !important for the color as an OSX specific rule when a lightweight theme
      is used for buttons in the toolbox overrides. See bug 1238531 for details */
   color: white !important;
   border-radius: 2px;
   /* If you change the margin or padding below, the min-height of the synced tabs
      panel (e.g. #PanelUI-remotetabs[mainview] #PanelUI-remotetabs-setupsync,
      etc) may need adjusting (see bug 1248506) */
   margin-top: 10px;
   margin-bottom: 10px;
   padding: 8px;
   text-shadow: none;
   min-width: 200px;
 }
 
-.PanelUI-remotetabs-prefs-button:hover {
+.PanelUI-remotetabs-button:hover {
   background-color: #003eaa;
 }
 
-.PanelUI-remotetabs-prefs-button:hover:active {
+.PanelUI-remotetabs-button:hover:active {
   background-color: #002275;
 }
 
 .remotetabs-promo-link {
   margin: 0;
 }
 
 .PanelUI-remotetabs-notabsforclient-label {
@@ -698,17 +698,17 @@ toolbarbutton[constrain-size="true"][cui
 .fxaSyncIllustration {
   list-style-image: url(chrome://browser/skin/fxa/sync-illustration.svg);
 }
 
 .fxaSyncIllustrationIssue {
   list-style-image: url(chrome://browser/skin/fxa/sync-illustration-issue.svg);
 }
 
-.PanelUI-remotetabs-prefs-button > .toolbarbutton-text {
+.PanelUI-remotetabs-button > .toolbarbutton-text {
   /* !important to override ".cui-widget-panel toolbarbutton > .toolbarbutton-text" above. */
   text-align: center !important;
   text-shadow: none;
 }
 
 #PanelUI-remotetabs[mainview] { /* panel anchored to toolbar button might be too skinny */
   min-width: 19em;
 }
@@ -716,18 +716,18 @@ toolbarbutton[constrain-size="true"][cui
 /* Work around bug 1224412 - these boxes will cause scrollbars to appear when
    the panel is anchored to a toolbar button.
 */
 #PanelUI-remotetabs[mainview] #PanelUI-remotetabs-setupsync,
 #PanelUI-remotetabs[mainview] #PanelUI-remotetabs-reauthsync,
 #PanelUI-remotetabs[mainview] #PanelUI-remotetabs-nodevicespane,
 #PanelUI-remotetabs[mainview] #PanelUI-remotetabs-tabsdisabledpane {
   min-height: calc(var(--panel-ui-sync-illustration-height) +
-                   20px + /* margin of .PanelUI-remotetabs-prefs-button */
-                   16px + /* padding of .PanelUI-remotetabs-prefs-button */
+                   20px + /* margin of .PanelUI-remotetabs-button */
+                   16px + /* padding of .PanelUI-remotetabs-button */
                    30px + /* margin of .PanelUI-remotetabs-instruction-label */
                    30px + 15px + /* padding of .PanelUI-remotetabs-instruction-box */
                    11em);
 }
 
 #PanelUI-remotetabs-tabslist > label[itemtype="client"] {
   color: GrayText;
 }
--- a/browser/themes/shared/tabs.inc.css
+++ b/browser/themes/shared/tabs.inc.css
@@ -181,20 +181,22 @@ tabbrowser {
   opacity: 0.7;
 }
 
 :root[sessionrestored] .tab-throbber[busy]:-moz-locale-dir(rtl)::before {
   animation-name: tab-throbber-animation-rtl;
 }
 
 @keyframes tab-throbber-animation {
+  0% { transform: translateX(0); }
   100% { transform: translateX(-100%); }
 }
 
 @keyframes tab-throbber-animation-rtl {
+  0% { transform: translateX(0); }
   100% { transform: translateX(100%); }
 }
 
 #TabsToolbar[brighttext] .tab-throbber[busy]:not([selected=true])::before {
   /* Don't change the --tab-loading-fill variable because this should only affect
      tabs that are not visually selected. */
   fill: #717171;
   opacity: 1;
--- a/devtools/client/aboutdebugging/components/Aboutdebugging.js
+++ b/devtools/client/aboutdebugging/components/Aboutdebugging.js
@@ -46,16 +46,17 @@ const panels = [{
 }];
 
 const defaultPanelId = "addons";
 
 class AboutDebuggingApp extends Component {
   static get propTypes() {
     return {
       client: PropTypes.instanceOf(DebuggerClient).isRequired,
+      connect: PropTypes.object.isRequired,
       telemetry: PropTypes.instanceOf(Telemetry).isRequired
     };
   }
 
   constructor(props) {
     super(props);
 
     this.state = {
@@ -84,24 +85,24 @@ class AboutDebuggingApp extends Componen
     });
   }
 
   selectPanel(panelId) {
     window.location.hash = "#" + panelId;
   }
 
   render() {
-    let { client } = this.props;
+    let { client, connect } = this.props;
     let { selectedPanelId } = this.state;
     let selectPanel = this.selectPanel;
     let selectedPanel = panels.find(p => p.id == selectedPanelId);
     let panel;
 
     if (selectedPanel) {
-      panel = selectedPanel.component({ client, id: selectedPanel.id });
+      panel = selectedPanel.component({ client, connect, id: selectedPanel.id });
     } else {
       panel = (
         dom.div({ className: "error-page" },
           dom.h1({ className: "header-name" },
             Strings.GetStringFromName("pageNotFound")
           ),
           dom.h4({ className: "error-page-details" },
             Strings.formatStringFromName("doesNotExist", [selectedPanelId], 1))
--- a/devtools/client/aboutdebugging/components/TargetList.js
+++ b/devtools/client/aboutdebugging/components/TargetList.js
@@ -18,33 +18,43 @@ const Strings = Services.strings.createB
 const LocaleCompare = (a, b) => {
   return a.name.toLowerCase().localeCompare(b.name.toLowerCase());
 };
 
 class TargetList extends Component {
   static get propTypes() {
     return {
       client: PropTypes.instanceOf(DebuggerClient).isRequired,
+      connect: PropTypes.object,
       debugDisabled: PropTypes.bool,
       error: PropTypes.node,
       id: PropTypes.string.isRequired,
       name: PropTypes.string,
       sort: PropTypes.bool,
       targetClass: PropTypes.func.isRequired,
       targets: PropTypes.arrayOf(PropTypes.object).isRequired
     };
   }
 
   render() {
-    let { client, debugDisabled, error, targetClass, targets, sort } = this.props;
+    let {
+      client,
+      connect,
+      debugDisabled,
+      error,
+      targetClass,
+      targets,
+      sort
+    } = this.props;
+
     if (sort) {
       targets = targets.sort(LocaleCompare);
     }
     targets = targets.map(target => {
-      return targetClass({ client, target, debugDisabled });
+      return targetClass({ client, connect, target, debugDisabled });
     });
 
     let content = "";
     if (error) {
       content = error;
     } else if (targets.length > 0) {
       content = dom.ul({ className: "target-list" }, targets);
     } else {
--- a/devtools/client/aboutdebugging/components/addons/Panel.js
+++ b/devtools/client/aboutdebugging/components/addons/Panel.js
@@ -27,16 +27,17 @@ const CHROME_ENABLED_PREF = "devtools.ch
 const REMOTE_ENABLED_PREF = "devtools.debugger.remote-enabled";
 const WEB_EXT_URL = "https://developer.mozilla.org/Add-ons" +
                     "/WebExtensions/Getting_started_with_web-ext";
 
 class AddonsPanel extends Component {
   static get propTypes() {
     return {
       client: PropTypes.instanceOf(DebuggerClient).isRequired,
+      connect: PropTypes.object,
       id: PropTypes.string.isRequired
     };
   }
 
   constructor(props) {
     super(props);
 
     this.state = {
@@ -85,23 +86,25 @@ class AddonsPanel extends Component {
     this.setState({ debugDisabled });
   }
 
   updateAddonsList() {
     this.props.client.listAddons()
       .then(({addons}) => {
         let extensions = addons.filter(addon => addon.debuggable).map(addon => {
           return {
-            name: addon.name,
+            addonActor: addon.actor,
+            addonID: addon.id,
+            // Forward the whole addon actor form for potential remote debugging.
+            form: addon,
             icon: addon.iconURL || ExtensionIcon,
-            addonID: addon.id,
-            addonActor: addon.actor,
+            manifestURL: addon.manifestURL,
+            name: addon.name,
             temporarilyInstalled: addon.temporarilyInstalled,
             url: addon.url,
-            manifestURL: addon.manifestURL,
             warnings: addon.warnings,
           };
         });
 
         this.setState({ extensions });
       }, error => {
         throw new Error("Client error while listing addons: " + error);
       });
@@ -131,17 +134,17 @@ class AddonsPanel extends Component {
   /**
    * Mandatory callback as AddonManager listener.
    */
   onDisabled() {
     this.updateAddonsList();
   }
 
   render() {
-    let { client, id } = this.props;
+    let { client, connect, id } = this.props;
     let { debugDisabled, extensions: targets } = this.state;
     let installedName = Strings.GetStringFromName("extensions");
     let temporaryName = Strings.GetStringFromName("temporaryExtensions");
     let targetClass = AddonTarget;
 
     const installedTargets = targets.filter((target) => !target.temporarilyInstalled);
     const temporaryTargets = targets.filter((target) => target.temporarilyInstalled);
 
@@ -157,16 +160,17 @@ class AddonsPanel extends Component {
     }),
     AddonsControls({ debugDisabled }),
     dom.div({ id: "temporary-addons" },
       TargetList({
         id: "temporary-extensions",
         name: temporaryName,
         targets: temporaryTargets,
         client,
+        connect,
         debugDisabled,
         targetClass,
         sort: true
       }),
       dom.div({ className: "addons-tip"},
         dom.span({
           className: "addons-web-ext-tip",
         }, Strings.GetStringFromName("webExtTip")),
@@ -176,16 +180,17 @@ class AddonsPanel extends Component {
       )
     ),
     dom.div({ id: "addons" },
       TargetList({
         id: "extensions",
         name: installedName,
         targets: installedTargets,
         client,
+        connect,
         debugDisabled,
         targetClass,
         sort: true
       })
     ));
   }
 }
 
--- a/devtools/client/aboutdebugging/components/addons/Target.js
+++ b/devtools/client/aboutdebugging/components/addons/Target.js
@@ -4,17 +4,17 @@
 
 /* eslint-env browser */
 
 "use strict";
 
 const { Component } = require("devtools/client/shared/vendor/react");
 const PropTypes = require("devtools/client/shared/vendor/react-prop-types");
 const dom = require("devtools/client/shared/vendor/react-dom-factories");
-const { debugAddon, isTemporaryID, parseFileUri, uninstallAddon } =
+const { debugLocalAddon, debugRemoteAddon, isTemporaryID, parseFileUri, uninstallAddon } =
   require("../../modules/addon");
 const Services = require("Services");
 
 loader.lazyImporter(this, "BrowserToolboxProcess",
   "resource://devtools/client/framework/ToolboxProcess.jsm");
 
 loader.lazyRequireGetter(this, "DebuggerClient",
   "devtools/shared/client/debugger-client", true);
@@ -122,20 +122,22 @@ function warningMessages(warnings = []) 
       warning);
   });
 }
 
 class AddonTarget extends Component {
   static get propTypes() {
     return {
       client: PropTypes.instanceOf(DebuggerClient).isRequired,
+      connect: PropTypes.object,
       debugDisabled: PropTypes.bool,
       target: PropTypes.shape({
         addonActor: PropTypes.string.isRequired,
         addonID: PropTypes.string.isRequired,
+        form: PropTypes.object.isRequired,
         icon: PropTypes.string,
         name: PropTypes.string.isRequired,
         temporarilyInstalled: PropTypes.bool,
         url: PropTypes.string,
         warnings: PropTypes.array,
       }).isRequired
     };
   }
@@ -143,18 +145,23 @@ class AddonTarget extends Component {
   constructor(props) {
     super(props);
     this.debug = this.debug.bind(this);
     this.uninstall = this.uninstall.bind(this);
     this.reload = this.reload.bind(this);
   }
 
   debug() {
-    let { target } = this.props;
-    debugAddon(target.addonID);
+    let { client, connect, target } = this.props;
+
+    if (connect.type === "REMOTE") {
+      debugRemoteAddon(target.form, client);
+    } else if (connect.type === "LOCAL") {
+      debugLocalAddon(target.addonID);
+    }
   }
 
   uninstall() {
     let { target } = this.props;
     uninstallAddon(target.addonID);
   }
 
   reload() {
--- a/devtools/client/aboutdebugging/components/tabs/Panel.js
+++ b/devtools/client/aboutdebugging/components/tabs/Panel.js
@@ -20,16 +20,17 @@ loader.lazyRequireGetter(this, "Debugger
 
 const Strings = Services.strings.createBundle(
   "chrome://devtools/locale/aboutdebugging.properties");
 
 class TabsPanel extends Component {
   static get propTypes() {
     return {
       client: PropTypes.instanceOf(DebuggerClient).isRequired,
+      connect: PropTypes.object,
       id: PropTypes.string.isRequired
     };
   }
 
   constructor(props) {
     super(props);
 
     this.state = {
@@ -71,32 +72,33 @@ class TabsPanel extends Component {
           tab.icon = "chrome://devtools/skin/images/globe.svg";
         }
       });
       this.setState({ tabs });
     });
   }
 
   render() {
-    let { client, id } = this.props;
+    let { client, connect, id } = this.props;
     let { tabs } = this.state;
 
     return dom.div({
       id: id + "-panel",
       className: "panel",
       role: "tabpanel",
       "aria-labelledby": id + "-header"
     },
     PanelHeader({
       id: id + "-header",
       name: Strings.GetStringFromName("tabs")
     }),
     dom.div({},
       TargetList({
         client,
+        connect,
         id: "tabs",
         name: Strings.GetStringFromName("tabs"),
         sort: false,
         targetClass: TabTarget,
         targets: tabs
       })
     ));
   }
--- a/devtools/client/aboutdebugging/components/tabs/Target.js
+++ b/devtools/client/aboutdebugging/components/tabs/Target.js
@@ -13,33 +13,39 @@ const dom = require("devtools/client/sha
 const Services = require("Services");
 
 const Strings = Services.strings.createBundle(
   "chrome://devtools/locale/aboutdebugging.properties");
 
 class TabTarget extends Component {
   static get propTypes() {
     return {
+      connect: PropTypes.object,
       target: PropTypes.shape({
         icon: PropTypes.string,
         outerWindowID: PropTypes.number.isRequired,
         title: PropTypes.string,
         url: PropTypes.string.isRequired
       }).isRequired
     };
   }
 
   constructor(props) {
     super(props);
     this.debug = this.debug.bind(this);
   }
 
   debug() {
-    let { target } = this.props;
-    window.open("about:devtools-toolbox?type=tab&id=" + target.outerWindowID);
+    let { target, connect } = this.props;
+    let url = "about:devtools-toolbox?type=tab&id=" + target.outerWindowID;
+    if (connect.type == "REMOTE") {
+      let {host, port} = connect.params;
+      url += `&host=${encodeURIComponent(host)}&port=${encodeURIComponent(port)}`;
+    }
+    window.open(url);
   }
 
   render() {
     let { target } = this.props;
 
     return dom.div({ className: "target-container" },
       dom.img({
         className: "target-icon",
--- a/devtools/client/aboutdebugging/initializer.js
+++ b/devtools/client/aboutdebugging/initializer.js
@@ -1,64 +1,55 @@
 /* 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/. */
 
 /* eslint-env browser */
-/* globals DebuggerClient, DebuggerServer, Telemetry */
+/* globals Telemetry */
 
 "use strict";
 
 const { loader } = Components.utils.import(
   "resource://devtools/shared/Loader.jsm", {});
 const { BrowserLoader } = Components.utils.import(
   "resource://devtools/client/shared/browser-loader.js", {});
 const { Services } = Components.utils.import(
   "resource://gre/modules/Services.jsm", {});
 
-loader.lazyRequireGetter(this, "DebuggerClient",
-  "devtools/shared/client/debugger-client", true);
-loader.lazyRequireGetter(this, "DebuggerServer",
-  "devtools/server/main", true);
 loader.lazyRequireGetter(this, "Telemetry",
   "devtools/client/shared/telemetry");
 
 const { require } = BrowserLoader({
   baseURI: "resource://devtools/client/aboutdebugging/",
   window
 });
 
 const { createFactory } = require("devtools/client/shared/vendor/react");
 const { render, unmountComponentAtNode } = require("devtools/client/shared/vendor/react-dom");
 
 const AboutDebuggingApp = createFactory(require("./components/Aboutdebugging"));
+const { createClient } = require("./modules/connect");
 
 var AboutDebugging = {
-  init() {
+  async init() {
     if (!Services.prefs.getBoolPref("devtools.enabled", true)) {
       // If DevTools are disabled, navigate to about:devtools.
       window.location = "about:devtools?reason=AboutDebugging";
       return;
     }
 
-    DebuggerServer.init();
-    DebuggerServer.allowChromeProcess = true;
-    // We want a full featured server for about:debugging. Especially the
-    // "browser actors" like addons.
-    DebuggerServer.registerAllActors();
+    let {connect, client} = await createClient();
 
-    this.client = new DebuggerClient(DebuggerServer.connectPipe());
+    this.client = client;
+    await this.client.connect();
 
-    this.client.connect().then(() => {
-      let client = this.client;
-      let telemetry = new Telemetry();
+    let telemetry = new Telemetry();
 
-      render(AboutDebuggingApp({ client, telemetry }),
-        document.querySelector("#body"));
-    });
+    render(AboutDebuggingApp({ client, connect, telemetry }),
+      document.querySelector("#body"));
   },
 
   destroy() {
     unmountComponentAtNode(document.querySelector("#body"));
 
     if (this.client) {
       this.client.close();
       this.client = null;
--- a/devtools/client/aboutdebugging/modules/addon.js
+++ b/devtools/client/aboutdebugging/modules/addon.js
@@ -4,31 +4,79 @@
 
 "use strict";
 
 loader.lazyImporter(this, "BrowserToolboxProcess",
   "resource://devtools/client/framework/ToolboxProcess.jsm");
 loader.lazyImporter(this, "AddonManager", "resource://gre/modules/AddonManager.jsm");
 loader.lazyImporter(this, "AddonManagerPrivate", "resource://gre/modules/AddonManager.jsm");
 
-let toolbox = null;
+var {TargetFactory} = require("devtools/client/framework/target");
+var {Toolbox} = require("devtools/client/framework/toolbox");
+
+var {gDevTools} = require("devtools/client/framework/devtools");
 
-exports.debugAddon = function (addonID) {
-  if (toolbox) {
-    toolbox.close();
+let browserToolboxProcess = null;
+let remoteAddonToolbox = null;
+function closeToolbox() {
+  if (browserToolboxProcess) {
+    browserToolboxProcess.close();
   }
 
-  toolbox = BrowserToolboxProcess.init({
+  if (remoteAddonToolbox) {
+    remoteAddonToolbox.destroy();
+  }
+}
+
+/**
+ * Start debugging an addon in the current instance of Firefox.
+ *
+ * @param {String} addonID
+ *        String id of the addon to debug.
+ */
+exports.debugLocalAddon = async function (addonID) {
+  // Close previous addon debugging toolbox.
+  closeToolbox();
+
+  browserToolboxProcess = BrowserToolboxProcess.init({
     addonID,
     onClose: () => {
-      toolbox = null;
+      browserToolboxProcess = null;
     }
   });
 };
 
+/**
+ * Start debugging an addon in a remote instance of Firefox.
+ *
+ * @param {Object} addonForm
+ *        Necessary to create an addon debugging target.
+ * @param {DebuggerClient} client
+ *        Required for remote debugging.
+ */
+exports.debugRemoteAddon = async function (addonForm, client) {
+  // Close previous addon debugging toolbox.
+  closeToolbox();
+
+  let options = {
+    form: addonForm,
+    chrome: true,
+    client,
+    isTabActor: addonForm.isWebExtension
+  };
+
+  let target = await TargetFactory.forRemoteTab(options);
+
+  let hostType = Toolbox.HostType.WINDOW;
+  remoteAddonToolbox = await gDevTools.showToolbox(target, null, hostType);
+  remoteAddonToolbox.once("destroy", () => {
+    remoteAddonToolbox = null;
+  });
+};
+
 exports.uninstallAddon = async function (addonID) {
   let addon = await AddonManager.getAddonByID(addonID);
   return addon && addon.uninstall();
 };
 
 exports.isTemporaryID = function (addonID) {
   return AddonManagerPrivate.isTemporaryInstallID(addonID);
 };
new file mode 100644
--- /dev/null
+++ b/devtools/client/aboutdebugging/modules/connect.js
@@ -0,0 +1,75 @@
+/* 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/. */
+
+/* eslint-env browser */
+
+"use strict";
+
+/**
+ * The connect module creates a connection to a debugger server based on the current
+ * context (e.g. URL parameters).
+ */
+
+const { clientFromURL } = require("devtools/client/framework/target-from-url");
+const { DebuggerServer } = require("devtools/server/main");
+
+// Supported connection types
+const TYPE = {
+  // Default, connected to the current instance of Firefox
+  LOCAL: "LOCAL",
+  // Connected to a remote instance of Firefox via host&port settings.
+  REMOTE: "REMOTE",
+};
+
+/**
+ * Create a plain object containing the connection information relevant to aboutdebugging
+ * components.
+ *
+ * @returns {Object}
+ *          - type: {String} from TYPE ("LOCAL", "REMOTE")
+ *          - params: {Object} additional metadata depending on the type.
+ *            - if type === "LOCAL", empty object
+ *            - if type === "REMOTE", {host: {String}, port: {String}}
+ */
+function createDescriptorFromURL(url) {
+  let params = url.searchParams;
+
+  let host = params.get("host");
+  let port = params.get("port");
+
+  let descriptor;
+  if (host && port) {
+    descriptor = {
+      type: TYPE.REMOTE,
+      params: {host, port}
+    };
+  } else {
+    descriptor = {
+      type: TYPE.LOCAL,
+      params: {}
+    };
+  }
+
+  return descriptor;
+}
+
+/**
+ * Returns a promise that resolves after creating a debugger client corresponding to the
+ * provided options.
+ *
+ * @returns Promise that resolves an object with the following properties:
+ *          - client: a DebuggerClient instance
+ *          - connect: a connection descriptor, see doc for createDescriptorFromURL(url).
+ */
+exports.createClient = async function () {
+  let href = window.location.href;
+  let url = new window.URL(href.replace("about:", "http://"));
+
+  let connect = createDescriptorFromURL(url);
+  let client = await clientFromURL(url);
+
+  DebuggerServer.allowChromeProcess = true;
+
+  return {client, connect};
+};
--- a/devtools/client/aboutdebugging/modules/moz.build
+++ b/devtools/client/aboutdebugging/modules/moz.build
@@ -1,8 +1,9 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 DevToolsModules(
     'addon.js',
+    'connect.js',
     'worker.js',
 )
--- a/devtools/client/framework/target-from-url.js
+++ b/devtools/client/framework/target-from-url.js
@@ -2,93 +2,85 @@
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 "use strict";
 
 const { TargetFactory } = require("devtools/client/framework/target");
 const { DebuggerServer } = require("devtools/server/main");
 const { DebuggerClient } = require("devtools/shared/client/debugger-client");
-const { Task } = require("devtools/shared/task");
 
 /**
  * Construct a Target for a given URL object having various query parameters:
  *
- * host:
- *    {String} The hostname or IP address to connect to.
- * port:
- *    {Number} The TCP port to connect to, to use with `host` argument.
- * ws:
- *    {Boolean} If true, connect via websocket instread of regular TCP connection.
+ * - host, port & ws: See the documentation for clientFromURL
  *
- * type: tab, process, window
- *    {String} The type of target to connect to.
+ * - type: tab, process, window
+ *      {String} The type of target to connect to.
  *
  * If type == "tab":
- * id:
- *    {Number} the tab outerWindowID
- * chrome: Optional
- *    {Boolean} Force the creation of a chrome target. Gives more privileges to
- *    the tab actor. Allows chrome execution in the webconsole and see chrome
- *    files in the debugger. (handy when contributing to firefox)
+ * - id:
+ *      {Number} the tab outerWindowID
+ * - chrome: Optional
+ *      {Boolean} Force the creation of a chrome target. Gives more privileges to
+ *      the tab actor. Allows chrome execution in the webconsole and see chrome
+ *      files in the debugger. (handy when contributing to firefox)
  *
  * If type == "process":
- * id:
- *    {Number} the process id to debug. Default to 0, which is the parent
- *    process.
+ * - id:
+ *      {Number} the process id to debug. Default to 0, which is the parent process.
  *
  * If type == "window":
- * id:
- *    {Number} the window outerWindowID
+ * - id:
+ *      {Number} the window outerWindowID
  *
  * @param {URL} url
  *        The url to fetch query params from.
  *
  * @return A target object
  */
-exports.targetFromURL = Task.async(function* (url) {
+exports.targetFromURL = async function targetFromURL(url) {
+  let client = await clientFromURL(url);
+  await client.connect();
+
   let params = url.searchParams;
   let type = params.get("type");
   if (!type) {
     throw new Error("targetFromURL, missing type parameter");
   }
   let id = params.get("id");
   // Allows to spawn a chrome enabled target for any context
   // (handy to debug chrome stuff in a child process)
   let chrome = params.has("chrome");
 
-  let client = yield createClient(params);
-
-  yield client.connect();
-
   let form, isTabActor;
   if (type === "tab") {
     // Fetch target for a remote tab
     id = parseInt(id, 10);
     if (isNaN(id)) {
       throw new Error(`targetFromURL, wrong tab id '${id}', should be a number`);
     }
     try {
-      let response = yield client.getTab({ outerWindowID: id });
+      let response = await client.getTab({ outerWindowID: id });
       form = response.tab;
     } catch (ex) {
       if (ex.error == "noTab") {
         throw new Error(`targetFromURL, tab with outerWindowID '${id}' doesn't exist`);
       }
       throw ex;
     }
   } else if (type == "process") {
     // Fetch target for a remote chrome actor
     DebuggerServer.allowChromeProcess = true;
     try {
       id = parseInt(id, 10);
       if (isNaN(id)) {
         id = 0;
       }
-      let response = yield client.getProcess(id);
+      let response = await client.getProcess(id);
       form = response.form;
       chrome = true;
       if (id != 0) {
         // Child process are not exposing tab actors and only support debugger+console
         isTabActor = false;
       }
     } catch (ex) {
       if (ex.error == "noProcess") {
@@ -99,42 +91,59 @@ exports.targetFromURL = Task.async(funct
   } else if (type == "window") {
     // Fetch target for a remote window actor
     DebuggerServer.allowChromeProcess = true;
     try {
       id = parseInt(id, 10);
       if (isNaN(id)) {
         throw new Error("targetFromURL, window requires id parameter");
       }
-      let response = yield client.mainRoot.getWindow({
+      let response = await client.mainRoot.getWindow({
         outerWindowID: id,
       });
       form = response.window;
       chrome = true;
     } catch (ex) {
       if (ex.error == "notFound") {
         throw new Error(`targetFromURL, window with id '${id}' doesn't exist`);
       }
       throw ex;
     }
   } else {
     throw new Error(`targetFromURL, unsupported type '${type}' parameter`);
   }
 
   return TargetFactory.forRemoteTab({ client, form, chrome, isTabActor });
-});
+};
 
-function* createClient(params) {
+/**
+ * Create a DebuggerClient for a given URL object having various query parameters:
+ *
+ * host:
+ *    {String} The hostname or IP address to connect to.
+ * port:
+ *    {Number} The TCP port to connect to, to use with `host` argument.
+ * ws:
+ *    {Boolean} If true, connect via websocket instead of regular TCP connection.
+ *
+ * @param {URL} url
+ *        The url to fetch query params from.
+ * @return a promise that resolves a DebuggerClient object
+ */
+async function clientFromURL(url) {
+  let params = url.searchParams;
   let host = params.get("host");
   let port = params.get("port");
   let webSocket = !!params.get("ws");
 
   let transport;
   if (port) {
-    transport = yield DebuggerClient.socketConnect({ host, port, webSocket });
+    transport = await DebuggerClient.socketConnect({ host, port, webSocket });
   } else {
     // Setup a server if we don't have one already running
     DebuggerServer.init();
     DebuggerServer.registerAllActors();
     transport = DebuggerServer.connectPipe();
   }
   return new DebuggerClient(transport);
 }
+
+exports.clientFromURL = clientFromURL;
--- a/docshell/base/nsDocShell.cpp
+++ b/docshell/base/nsDocShell.cpp
@@ -10274,17 +10274,21 @@ nsDocShell::InternalLoad(nsIURI* aURI,
         // happen for links.
         MOZ_ASSERT(!aLoadReplace);
         MOZ_ASSERT(aPrincipalToInherit == aTriggeringPrincipal);
         MOZ_ASSERT(aFlags == INTERNAL_LOAD_FLAGS_NO_OPENER ||
                    aFlags == (INTERNAL_LOAD_FLAGS_NO_OPENER |
                               INTERNAL_LOAD_FLAGS_DONT_SEND_REFERRER));
         MOZ_ASSERT(!aPostData);
         MOZ_ASSERT(!aHeadersData);
-        MOZ_ASSERT(aLoadType == LOAD_LINK);
+        // If OnLinkClickSync was invoked inside the onload handler, the load
+        // type would be set to LOAD_NORMAL_REPLACE; otherwise it should be
+        // LOAD_LINK.
+        MOZ_ASSERT(aLoadType == LOAD_LINK ||
+                   aLoadType == LOAD_NORMAL_REPLACE);
         MOZ_ASSERT(!aSHEntry);
         MOZ_ASSERT(aFirstParty); // Windowwatcher will assume this.
 
         nsCOMPtr<nsIDocShellLoadInfo> loadInfo;
         rv = CreateLoadInfo(getter_AddRefs(loadInfo));
         if (NS_FAILED(rv)) {
           return rv;
         }
--- a/dom/media/ChannelMediaDecoder.cpp
+++ b/dom/media/ChannelMediaDecoder.cpp
@@ -435,17 +435,16 @@ ChannelMediaDecoder::GetStatistics()
 
   MediaStatistics result;
   result.mDownloadRate =
     mResource->GetDownloadRate(&result.mDownloadRateReliable);
   result.mDownloadPosition = mResource->GetCachedDataEnd(mDecoderPosition);
   result.mTotalBytes = mResource->GetLength();
   result.mPlaybackRate = mPlaybackBytesPerSecond;
   result.mPlaybackRateReliable = mPlaybackRateReliable;
-  result.mDecoderPosition = mDecoderPosition;
   result.mPlaybackPosition = mPlaybackPosition;
   return result;
 }
 
 bool
 ChannelMediaDecoder::ShouldThrottleDownload()
 {
   // We throttle the download if either the throttle override pref is set
--- a/dom/media/ChannelMediaResource.cpp
+++ b/dom/media/ChannelMediaResource.cpp
@@ -29,28 +29,16 @@ ChannelMediaResource::ChannelMediaResour
                                            nsIURI* aURI,
                                            bool aIsPrivateBrowsing)
   : BaseMediaResource(aCallback, aChannel, aURI)
   , mCacheStream(this, aIsPrivateBrowsing)
   , mSuspendAgent(mCacheStream)
 {
 }
 
-ChannelMediaResource::ChannelMediaResource(
-  MediaResourceCallback* aCallback,
-  nsIChannel* aChannel,
-  nsIURI* aURI,
-  const MediaChannelStatistics& aStatistics)
-  : BaseMediaResource(aCallback, aChannel, aURI)
-  , mCacheStream(this, /* aIsPrivateBrowsing = */ false)
-  , mChannelStatistics(aStatistics)
-  , mSuspendAgent(mCacheStream)
-{
-}
-
 ChannelMediaResource::~ChannelMediaResource()
 {
   MOZ_ASSERT(mClosed);
   MOZ_ASSERT(!mChannel);
   MOZ_ASSERT(!mListener);
 }
 
 // ChannelMediaResource::Listener just observes the channel and
@@ -292,17 +280,16 @@ ChannelMediaResource::OnStartRequest(nsI
 
   // Update principals before OnDataAvailable() putting the data in the cache.
   // This is important, we want to make sure all principals are updated before
   // any consumer can see the new data.
   UpdatePrincipal();
 
   mCacheStream.NotifyDataStarted(mLoadID, startOffset, seekable, length);
   mIsTransportSeekable = seekable;
-  mChannelStatistics.Start();
 
   mSuspendAgent.Delegate(mChannel);
 
   // Fires an initial progress event.
   owner->DownloadProgressed();
 
   nsCOMPtr<nsIThreadRetargetableRequest> retarget;
   if (Preferences::GetBool("media.omt_data_delivery.enabled", false) &&
@@ -373,18 +360,16 @@ ChannelMediaResource::ParseContentRangeH
 nsresult
 ChannelMediaResource::OnStopRequest(nsIRequest* aRequest, nsresult aStatus)
 {
   NS_ASSERTION(mChannel.get() == aRequest, "Wrong channel!");
   NS_ASSERTION(!mSuspendAgent.IsSuspended(),
                "How can OnStopRequest fire while we're suspended?");
   MOZ_DIAGNOSTIC_ASSERT(!mClosed);
 
-  mChannelStatistics.Stop();
-
   // Move this request back into the foreground.  This is necessary for
   // requests owned by video documents to ensure the load group fires
   // OnStopRequest when restoring from session history.
   nsLoadFlags loadFlags;
   DebugOnly<nsresult> rv = mChannel->GetLoadFlags(&loadFlags);
   NS_ASSERTION(NS_SUCCEEDED(rv), "GetLoadFlags() failed!");
 
   if (loadFlags & nsIRequest::LOAD_BACKGROUND) {
@@ -438,28 +423,16 @@ ChannelMediaResource::CopySegmentToCache
 }
 
 nsresult
 ChannelMediaResource::OnDataAvailable(uint32_t aLoadID,
                                       nsIInputStream* aStream,
                                       uint32_t aCount)
 {
   // This might happen off the main thread.
-
-  RefPtr<ChannelMediaResource> self = this;
-  nsCOMPtr<nsIRunnable> r = NS_NewRunnableFunction(
-    "ChannelMediaResource::OnDataAvailable", [self, aCount, aLoadID]() {
-      if (aLoadID != self->mLoadID) {
-        // Ignore data from the old channel.
-        return;
-      }
-      self->mChannelStatistics.AddBytes(aCount);
-    });
-  mCallback->AbstractMainThread()->Dispatch(r.forget());
-
   Closure closure{ aLoadID, this };
   uint32_t count = aCount;
   while (count > 0) {
     uint32_t read;
     nsresult rv =
       aStream->ReadSegments(CopySegmentToCache, &closure, count, &read);
     if (NS_FAILED(rv))
       return rv;
@@ -585,17 +558,17 @@ bool ChannelMediaResource::CanClone()
 
 already_AddRefed<BaseMediaResource>
 ChannelMediaResource::CloneData(MediaResourceCallback* aCallback)
 {
   NS_ASSERTION(NS_IsMainThread(), "Only call on main thread");
   NS_ASSERTION(mCacheStream.IsAvailableForSharing(), "Stream can't be cloned");
 
   RefPtr<ChannelMediaResource> resource =
-    new ChannelMediaResource(aCallback, nullptr, mURI, mChannelStatistics);
+    new ChannelMediaResource(aCallback, nullptr, mURI);
 
   resource->mIsTransportSeekable = mIsTransportSeekable;
 
   // Initially the clone is treated as suspended by the cache, because
   // we don't have a channel. If the cache needs to read data from the clone
   // it will call CacheClientResume (or CacheClientSeek with aResume true)
   // which will recreate the channel. This way, if all of the media data
   // is already in the cache we don't create an unnecessary HTTP channel
@@ -603,27 +576,24 @@ ChannelMediaResource::CloneData(MediaRes
   nsresult rv = resource->mCacheStream.InitAsClone(&mCacheStream);
   if (NS_FAILED(rv)) {
     resource->Close();
     return nullptr;
   }
   // mSuspendAgent.Suspend() accesses mCacheStream which is not ready
   // until InitAsClone() is done.
   resource->mSuspendAgent.Suspend();
-  resource->mChannelStatistics.Stop();
 
   return resource.forget();
 }
 
 void ChannelMediaResource::CloseChannel()
 {
   NS_ASSERTION(NS_IsMainThread(), "Only call on main thread");
 
-  mChannelStatistics.Stop();
-
   if (mChannel) {
     mSuspendAgent.Revoke();
     // The status we use here won't be passed to the decoder, since
     // we've already revoked the listener. It can however be passed
     // to nsDocumentViewer::LoadComplete if our channel is the one
     // that kicked off creation of a video document. We don't want that
     // document load to think there was an error.
     // NS_ERROR_PARSED_DATA_CACHED is the best thing we have for that
@@ -687,17 +657,16 @@ ChannelMediaResource::Suspend(bool aClos
 
   if (mChannel && aCloseImmediately && mIsTransportSeekable) {
     CloseChannel();
     element->DownloadSuspended();
   }
 
   if (mSuspendAgent.Suspend()) {
     if (mChannel) {
-      mChannelStatistics.Stop();
       element->DownloadSuspended();
     }
   }
 }
 
 void
 ChannelMediaResource::Resume()
 {
@@ -711,17 +680,16 @@ ChannelMediaResource::Resume()
   MediaDecoderOwner* owner = mCallback->GetMediaOwner();
   MOZ_DIAGNOSTIC_ASSERT(owner);
   dom::HTMLMediaElement* element = owner->GetMediaElement();
   MOZ_DIAGNOSTIC_ASSERT(element);
 
   if (mSuspendAgent.Resume()) {
     if (mChannel) {
       // Just wake up our existing channel
-      mChannelStatistics.Start();
       element->DownloadResumed();
     } else {
       int64_t totalLength = GetLength();
       // If mOffset is at the end of the stream, then we shouldn't try to
       // seek to it. The seek will fail and be wasted anyway. We can leave
       // the channel dead; if the media cache wants to read some other data
       // in the future, it will call CacheClientSeek itself which will reopen the
       // channel.
@@ -971,18 +939,17 @@ void
 ChannelMediaResource::Unpin()
 {
   mCacheStream.Unpin();
 }
 
 double
 ChannelMediaResource::GetDownloadRate(bool* aIsReliable)
 {
-  MOZ_ASSERT(NS_IsMainThread());
-  return mChannelStatistics.GetRate(aIsReliable);
+  return mCacheStream.GetDownloadRate(aIsReliable);
 }
 
 int64_t
 ChannelMediaResource::GetLength()
 {
   return mCacheStream.GetLength();
 }
 
--- a/dom/media/ChannelMediaResource.h
+++ b/dom/media/ChannelMediaResource.h
@@ -3,17 +3,16 @@
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #ifndef mozilla_dom_media_ChannelMediaResource_h
 #define mozilla_dom_media_ChannelMediaResource_h
 
 #include "BaseMediaResource.h"
 #include "MediaCache.h"
-#include "MediaChannelStatistics.h"
 #include "mozilla/Mutex.h"
 #include "nsIChannelEventSink.h"
 #include "nsIHttpChannel.h"
 #include "nsIInterfaceRequestor.h"
 #include "nsIThreadRetargetableStreamListener.h"
 
 namespace mozilla {
 
@@ -63,21 +62,17 @@ private:
  * thread operations are delegated directly to that object.
  */
 class ChannelMediaResource : public BaseMediaResource
 {
 public:
   ChannelMediaResource(MediaResourceCallback* aDecoder,
                        nsIChannel* aChannel,
                        nsIURI* aURI,
-                       bool aIsPrivateBrowsing);
-  ChannelMediaResource(MediaResourceCallback* aDecoder,
-                       nsIChannel* aChannel,
-                       nsIURI* aURI,
-                       const MediaChannelStatistics& aStatistics);
+                       bool aIsPrivateBrowsing = false);
   ~ChannelMediaResource();
 
   // These are called on the main thread by MediaCache. These must
   // not block or grab locks, because the media cache is holding its lock.
   // Notify that data is available from the cache. This can happen even
   // if this stream didn't read any data, since another stream might have
   // received data for the same resource.
   void CacheClientNotifyDataReceived();
@@ -133,17 +128,16 @@ public:
   int64_t GetNextCachedData(int64_t aOffset) override;
   int64_t GetCachedDataEnd(int64_t aOffset) override;
   bool    IsDataCachedToEndOfResource(int64_t aOffset) override;
   bool    IsTransportSeekable() override;
 
   size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override {
     // Might be useful to track in the future:
     //   - mListener (seems minor)
-    //   - mChannelStatistics (seems minor)
     size_t size = BaseMediaResource::SizeOfExcludingThis(aMallocSizeOf);
     size += mCacheStream.SizeOfExcludingThis(aMallocSizeOf);
 
     return size;
   }
 
   size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override {
     return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
@@ -247,16 +241,15 @@ protected:
   uint32_t mLoadID = 0;
   // Used by the cache to store the offset to seek to when we are resumed.
   // -1 means no seek initiated by the cache is waiting.
   int64_t mPendingSeekOffset = -1;
 
   // Any thread access
   MediaCacheStream mCacheStream;
 
-  MediaChannelStatistics mChannelStatistics;
   ChannelSuspendAgent mSuspendAgent;
 };
 
 
 } // namespace mozilla
 
 #endif // mozilla_dom_media_ChannelMediaResource_h
--- a/dom/media/MediaCache.cpp
+++ b/dom/media/MediaCache.cpp
@@ -2028,16 +2028,18 @@ MediaCacheStream::NotifyDataStartedInter
 
   // Reset mSeekTarget since the seek is completed so MediaCache::Update() will
   // make decisions based on mChannelOffset instead of mSeekTarget.
   mSeekTarget = -1;
 
   // Reset these flags since a new load has begun.
   mChannelEnded = false;
   mDidNotifyDataEnded = false;
+
+  UpdateDownloadStatistics(lock);
 }
 
 void
 MediaCacheStream::UpdatePrincipal(nsIPrincipal* aPrincipal)
 {
   MOZ_ASSERT(NS_IsMainThread());
   MediaCache::ResourceStreamIterator iter(mMediaCache, mResourceID);
   while (MediaCacheStream* stream = iter.Next()) {
@@ -2087,16 +2089,18 @@ MediaCacheStream::NotifyDataReceived(uin
 
   if (mLoadID != aLoadID) {
     // mChannelOffset is updated to a new position when loading a new channel.
     // We should discard the data coming from the old channel so it won't be
     // stored to the wrong positoin.
     return;
   }
 
+  mDownloadStatistics.AddBytes(aCount);
+
   auto source = MakeSpan<const uint8_t>(aData, aCount);
 
   // We process the data one block (or part of a block) at a time
   while (!source.IsEmpty()) {
     // The data we've collected so far in the partial block.
     auto partial = MakeSpan<const uint8_t>(mPartialBlockBuffer.get(),
                                            OffsetInBlock(mChannelOffset));
 
@@ -2175,16 +2179,26 @@ MediaCacheStream::FlushPartialBlockInter
   // that will never come.
   if ((blockOffset > 0 || mChannelOffset == 0) && aNotifyAll) {
     // Wake up readers who may be waiting for this data
     aLock.NotifyAll();
   }
 }
 
 void
+MediaCacheStream::UpdateDownloadStatistics(AutoLock&)
+{
+  if (mChannelEnded || mClientSuspended) {
+    mDownloadStatistics.Stop();
+  } else {
+    mDownloadStatistics.Start();
+  }
+}
+
+void
 MediaCacheStream::NotifyDataEndedInternal(uint32_t aLoadID,
                                           nsresult aStatus,
                                           bool aReopenOnError)
 {
   MOZ_ASSERT(OwnerThread()->IsOnCurrentThread());
   AutoLock lock(mMediaCache->Monitor());
 
   if (mClosed || aLoadID != mLoadID) {
@@ -2231,16 +2245,18 @@ MediaCacheStream::NotifyDataEndedInterna
     // is called from MediaCache::Update().
   }
 
   // It is prudent to update channel/cache status before calling
   // CacheClientNotifyDataEnded() which will read |mChannelEnded|.
   mChannelEnded = true;
   mMediaCache->QueueUpdate(lock);
 
+  UpdateDownloadStatistics(lock);
+
   if (NS_FAILED(aStatus)) {
     // Notify the client about this network error.
     mDidNotifyDataEnded = true;
     mNotifyDataEndedStatus = aStatus;
     mClient->CacheClientNotifyDataEnded(aStatus);
     // Wake up the readers so they can fail gracefully.
     lock.NotifyAll();
     return;
@@ -2287,16 +2303,17 @@ MediaCacheStream::NotifyClientSuspended(
   RefPtr<ChannelMediaResource> client = mClient;
   nsCOMPtr<nsIRunnable> r = NS_NewRunnableFunction(
     "MediaCacheStream::NotifyClientSuspended", [client, this, aSuspended]() {
       AutoLock lock(mMediaCache->Monitor());
       if (!mClosed && mClientSuspended != aSuspended) {
         mClientSuspended = aSuspended;
         // mClientSuspended changes the decision of reading streams.
         mMediaCache->QueueUpdate(lock);
+        UpdateDownloadStatistics(lock);
       }
     });
   OwnerThread()->Dispatch(r.forget());
 }
 
 MediaCacheStream::~MediaCacheStream()
 {
   NS_ASSERTION(NS_IsMainThread(), "Only call on main thread");
@@ -2860,16 +2877,18 @@ MediaCacheStream::InitAsClone(MediaCache
   mMediaCache = aOriginal->mMediaCache;
 
   mResourceID = aOriginal->mResourceID;
 
   // Grab cache blocks from aOriginal as readahead blocks for our stream
   mPrincipal = aOriginal->mPrincipal;
   mStreamLength = aOriginal->mStreamLength;
   mIsTransportSeekable = aOriginal->mIsTransportSeekable;
+  mDownloadStatistics = aOriginal->mDownloadStatistics;
+  mDownloadStatistics.Stop();
 
   // Cloned streams are initially suspended, since there is no channel open
   // initially for a clone.
   mCacheSuspended = true;
   mChannelEnded = true;
 
   if (aOriginal->mDidNotifyDataEnded) {
     mNotifyDataEndedStatus = aOriginal->mNotifyDataEndedStatus;
@@ -2920,16 +2939,24 @@ nsresult MediaCacheStream::GetCachedRang
     aRanges += MediaByteRange(startOffset, endOffset);
     startOffset = GetNextCachedDataInternal(lock, endOffset);
     NS_ASSERTION(startOffset == -1 || startOffset > endOffset,
       "Must have advanced to start of next range, or hit end of stream");
   }
   return NS_OK;
 }
 
+double
+MediaCacheStream::GetDownloadRate(bool* aIsReliable)
+{
+  // TODO: Assert non-main thread.
+  AutoLock lock(mMediaCache->Monitor());
+  return mDownloadStatistics.GetRate(aIsReliable);
+}
+
 nsCString
 MediaCacheStream::GetDebugInfo()
 {
   AutoLock lock(mMediaCache->Monitor());
   return nsPrintfCString("mStreamLength=%" PRId64 " mChannelOffset=%" PRId64
                          " mCacheSuspended=%d mChannelEnded=%d mLoadID=%u",
                          mStreamLength,
                          mChannelOffset,
--- a/dom/media/MediaCache.h
+++ b/dom/media/MediaCache.h
@@ -10,16 +10,18 @@
 #include "Intervals.h"
 #include "mozilla/Result.h"
 #include "mozilla/UniquePtr.h"
 #include "nsCOMPtr.h"
 #include "nsHashKeys.h"
 #include "nsTArray.h"
 #include "nsTHashtable.h"
 
+#include "MediaChannelStatistics.h"
+
 class nsIEventTarget;
 class nsIPrincipal;
 
 namespace mozilla {
 // defined in MediaResource.h
 class ChannelMediaResource;
 typedef media::IntervalSet<int64_t> MediaByteRangeSet;
 class MediaResource;
@@ -310,16 +312,18 @@ public:
   // or -1 if there is no such cached data.
   int64_t GetNextCachedData(int64_t aOffset);
   // Fills aRanges with the ByteRanges representing the data which is currently
   // cached. Locks the media cache while running, to prevent any ranges
   // growing. The stream should be pinned while this runs and while its results
   // are used, to ensure no data is evicted.
   nsresult GetCachedRanges(MediaByteRangeSet& aRanges);
 
+  double GetDownloadRate(bool* aIsReliable);
+
   // Reads from buffered data only. Will fail if not all data to be read is
   // in the cache. Will not mark blocks as read. Can be called from the main
   // thread. It's the caller's responsibility to wrap the call in a pin/unpin,
   // and also to check that the range they want is cached before calling this.
   nsresult ReadFromCache(char* aBuffer, int64_t aOffset, uint32_t aCount);
 
   // IsDataCachedToEndOfStream returns true if all the data from
   // aOffset to the end of the stream (the server-reported end, if the
@@ -457,16 +461,18 @@ private:
                                  int64_t aOffset,
                                  bool aSeekable,
                                  int64_t aLength);
 
   void NotifyDataEndedInternal(uint32_t aLoadID,
                                nsresult aStatus,
                                bool aReopenOnError);
 
+  void UpdateDownloadStatistics(AutoLock&);
+
   // Instance of MediaCache to use with this MediaCacheStream.
   RefPtr<MediaCache> mMediaCache;
 
   ChannelMediaResource* const mClient;
 
   // These fields are main-thread-only.
   nsCOMPtr<nsIPrincipal> mPrincipal;
 
@@ -544,13 +550,15 @@ private:
   const UniquePtr<uint8_t[]> mPartialBlockBuffer =
     MakeUnique<uint8_t[]>(BLOCK_SIZE);
 
   // True if associated with a private browsing window.
   const bool mIsPrivateBrowsing;
 
   // True if the client is suspended. Accessed on the owner thread only.
   bool mClientSuspended = false;
+
+  MediaChannelStatistics mDownloadStatistics;
 };
 
 } // namespace mozilla
 
 #endif
--- a/dom/media/MediaChannelStatistics.h
+++ b/dom/media/MediaChannelStatistics.h
@@ -24,18 +24,18 @@ static const int64_t RELIABLE_DATA_THRES
  * channel is active.
  *
  * All methods take "now" as a parameter so the user of this class can
  * control the timeline used.
  */
 class MediaChannelStatistics {
 public:
   MediaChannelStatistics() = default;
-
   MediaChannelStatistics(const MediaChannelStatistics&) = default;
+  MediaChannelStatistics& operator=(const MediaChannelStatistics&) = default;
 
   void Reset() {
     mLastStartTime = TimeStamp();
     mAccumulatedTime = TimeDuration(0);
     mAccumulatedBytes = 0;
     mIsStarted = false;
   }
   void Start() {
--- a/dom/media/MediaStatistics.h
+++ b/dom/media/MediaStatistics.h
@@ -15,19 +15,16 @@ struct MediaStatistics {
   // Estimate of the current download rate (bytes/second). This
   // ignores time that the channel was paused by Gecko.
   double mDownloadRate;
   // Total length of media stream in bytes; -1 if not known
   int64_t mTotalBytes;
   // Current position of the download, in bytes. This is the offset of
   // the first uncached byte after the decoder position.
   int64_t mDownloadPosition;
-  // Current position of decoding, in bytes (how much of the stream
-  // has been consumed)
-  int64_t mDecoderPosition;
   // Current position of playback, in bytes
   int64_t mPlaybackPosition;
   // If false, then mDownloadRate cannot be considered a reliable
   // estimate (probably because the download has only been running
   // a short time).
   bool mDownloadRateReliable;
   // If false, then mPlaybackRate cannot be considered a reliable
   // estimate (probably because playback has only been running
--- a/dom/webidl/APZTestData.webidl
+++ b/dom/webidl/APZTestData.webidl
@@ -25,20 +25,43 @@ dictionary ScrollFrameData {
 
 // All the scrollable frames associated with a given paint or repaint request.
 // The paint or repaint request is identified by a sequence number.
 dictionary APZBucket {
   unsigned long sequenceNumber;
   sequence<ScrollFrameData> scrollFrames;
 };
 
+[Pref="apz.test.logging_enabled"]
+callback interface APZHitResultFlags {
+  // These constants should be kept in sync with mozilla::gfx::CompositorHitTestInfo
+  const unsigned short INVISIBLE = 0;
+  const unsigned short VISIBLE = 0x0001;
+  const unsigned short DISPATCH_TO_CONTENT = 0x0002;
+  const unsigned short PAN_X_DISABLED = 0x0004;
+  const unsigned short PAN_Y_DISABLED = 0x0008;
+  const unsigned short PINCH_ZOOM_DISABLED = 0x0010;
+  const unsigned short DOUBLE_TAP_ZOOM_DISABLED = 0x0020;
+  const unsigned short SCROLLBAR = 0x0040;
+  const unsigned short SCROLLBAR_THUMB = 0x0080;
+  const unsigned short SCROLLBAR_VERTICAL = 0x0100;
+};
+
+dictionary APZHitResult {
+  float screenX;
+  float screenY;
+  unsigned short hitResult; // combination of the APZHitResultFlags.* flags
+  unsigned long long scrollId;
+};
+
 // All the paints and repaint requests. This is the top-level data structure.
 dictionary APZTestData {
   sequence<APZBucket> paints;
   sequence<APZBucket> repaintRequests;
+  sequence<APZHitResult> hitResults;
 };
 
 // A frame uniformity measurement for every scrollable layer
 dictionary FrameUniformity {
   unsigned long layerAddress;
   float frameUniformity;
 };
 
--- a/editor/libeditor/EditorBase.cpp
+++ b/editor/libeditor/EditorBase.cpp
@@ -4995,22 +4995,22 @@ EditorBase::HandleKeyPressEvent(WidgetKe
       return NS_OK;
   }
   return NS_OK;
 }
 
 nsresult
 EditorBase::HandleInlineSpellCheck(EditAction action,
                                    Selection* aSelection,
-                                   nsIDOMNode* previousSelectedNode,
-                                   int32_t previousSelectedOffset,
-                                   nsIDOMNode* aStartContainer,
-                                   int32_t aStartOffset,
-                                   nsIDOMNode* aEndContainer,
-                                   int32_t aEndOffset)
+                                   nsINode* previousSelectedNode,
+                                   uint32_t previousSelectedOffset,
+                                   nsINode* aStartContainer,
+                                   uint32_t aStartOffset,
+                                   nsINode* aEndContainer,
+                                   uint32_t aEndOffset)
 {
   // Have to cast action here because this method is from an IDL
   return mInlineSpellChecker ? mInlineSpellChecker->SpellCheckAfterEditorChange(
                                  (int32_t)action, aSelection,
                                  previousSelectedNode, previousSelectedOffset,
                                  aStartContainer, aStartOffset, aEndContainer,
                                  aEndOffset)
                              : NS_OK;
--- a/editor/libeditor/EditorBase.h
+++ b/editor/libeditor/EditorBase.h
@@ -1178,22 +1178,22 @@ public:
   virtual nsresult EndUpdateViewBatch();
 
   bool GetShouldTxnSetSelection();
 
   virtual nsresult HandleKeyPressEvent(WidgetKeyboardEvent* aKeyboardEvent);
 
   nsresult HandleInlineSpellCheck(EditAction action,
                                   Selection* aSelection,
-                                  nsIDOMNode* previousSelectedNode,
-                                  int32_t previousSelectedOffset,
-                                  nsIDOMNode* aStartContainer,
-                                  int32_t aStartOffset,
-                                  nsIDOMNode* aEndContainer,
-                                  int32_t aEndOffset);
+                                  nsINode* previousSelectedNode,
+                                  uint32_t previousSelectedOffset,
+                                  nsINode* aStartContainer,
+                                  uint32_t aStartOffset,
+                                  nsINode* aEndContainer,
+                                  uint32_t aEndOffset);
 
   virtual already_AddRefed<dom::EventTarget> GetDOMEventTarget() = 0;
 
   /**
    * Fast non-refcounting editor root element accessor
    */
   Element* GetRoot() const { return mRootElement; }
 
--- a/editor/libeditor/EditorDOMPoint.h
+++ b/editor/libeditor/EditorDOMPoint.h
@@ -107,21 +107,21 @@ public:
    */
   explicit EditorDOMPointBase(nsINode* aPointedNode)
     : mParent(aPointedNode && aPointedNode->IsContent() ?
                 aPointedNode->GetParentNode() : nullptr)
     , mChild(aPointedNode && aPointedNode->IsContent() ?
                 aPointedNode->AsContent() : nullptr)
     , mIsChildInitialized(false)
   {
+    mIsChildInitialized = aPointedNode && mChild;
     NS_WARNING_ASSERTION(IsSet(),
       "The child is nullptr or doesn't have its parent");
     NS_WARNING_ASSERTION(mChild && mChild->GetParentNode() == mParent,
       "Initializing RangeBoundary with invalid value");
-    mIsChildInitialized = aPointedNode && mChild;
   }
 
   EditorDOMPointBase(nsINode* aContainer,
                      nsIContent* aPointedNode,
                      int32_t aOffset)
     : mParent(aContainer)
     , mChild(aPointedNode)
     , mOffset(mozilla::Some(aOffset))
@@ -426,19 +426,25 @@ public:
     //   If mChild isn't initialized and the offset is 0.
     if (NS_WARN_IF(!mParent)) {
       return false;
     }
     if (!mParent->IsContainerNode()) {
       return !mOffset.value();
     }
     if (mIsChildInitialized) {
-      NS_WARNING_ASSERTION(!mOffset.isSome() || !mOffset.value(),
-        "If offset was initialized, mOffset should be 0");
-      return mParent->GetFirstChild() == mChild;
+      if (mParent->GetFirstChild() == mChild) {
+        NS_WARNING_ASSERTION(!mOffset.isSome() || !mOffset.value(),
+          "If mOffset was initialized, it should be 0");
+        return true;
+      }
+      NS_WARNING_ASSERTION(!mOffset.isSome() ||
+                           mParent->GetChildAt(mOffset.value()) == mChild,
+        "If mOffset and mChild are mismatched");
+      return false;
     }
     MOZ_ASSERT(mOffset.isSome());
     return !mOffset.value();
   }
 
   bool
   IsEndOfContainer() const
   {
@@ -447,20 +453,26 @@ public:
     //   length of the container.
     //   If mChild is initialized and it's nullptr.
     //   If mChild isn't initialized and mOffset is same as the length of the
     //   container.
     if (NS_WARN_IF(!mParent)) {
       return false;
     }
     if (mIsChildInitialized) {
+      if (!mChild) {
+        NS_WARNING_ASSERTION(!mOffset.isSome() ||
+                             mOffset.value() == mParent->Length(),
+          "If mOffset was initialized, it should be length of the container");
+        return true;
+      }
       NS_WARNING_ASSERTION(!mOffset.isSome() ||
-                           mOffset.value() == mParent->Length(),
-        "If offset was initialized, mOffset should be length of the container");
-      return !mChild;
+                           mParent->GetChildAt(mOffset.value()) == mChild,
+        "If mOffset and mChild are mismatched");
+      return false;
     }
     MOZ_ASSERT(mOffset.isSome());
     return mOffset.value() == mParent->Length();
   }
 
   // Convenience methods for switching between the two types
   // of EditorDOMPointBase.
   EditorDOMPointBase<nsINode*, nsIContent*>
--- a/editor/libeditor/HTMLEditRules.cpp
+++ b/editor/libeditor/HTMLEditRules.cpp
@@ -560,22 +560,22 @@ HTMLEditRules::AfterEditInner(EditAction
     }
   }
 
   NS_ENSURE_STATE(mHTMLEditor);
 
   nsresult rv =
     mHTMLEditor->HandleInlineSpellCheck(
                    action, selection,
-                   GetAsDOMNode(mRangeItem->mStartContainer),
+                   mRangeItem->mStartContainer,
                    mRangeItem->mStartOffset,
-                   GetAsDOMNode(rangeStartContainer),
-                   static_cast<int32_t>(rangeStartOffset),
-                   GetAsDOMNode(rangeEndContainer),
-                   static_cast<int32_t>(rangeEndOffset));
+                   rangeStartContainer,
+                   rangeStartOffset,
+                   rangeEndContainer,
+                   rangeEndOffset);
   NS_ENSURE_SUCCESS(rv, rv);
 
   // detect empty doc
   rv = CreateBogusNodeIfNeeded(selection);
   NS_ENSURE_SUCCESS(rv, rv);
 
   // adjust selection HINT if needed
   if (!mDidExplicitlySetInterline) {
--- a/editor/libeditor/TextEditRules.cpp
+++ b/editor/libeditor/TextEditRules.cpp
@@ -222,17 +222,17 @@ TextEditRules::AfterEdit(EditAction acti
   if (!--mActionNesting) {
     NS_ENSURE_STATE(mTextEditor);
     RefPtr<Selection> selection = mTextEditor->GetSelection();
     NS_ENSURE_STATE(selection);
 
     NS_ENSURE_STATE(mTextEditor);
     nsresult rv =
       mTextEditor->HandleInlineSpellCheck(action, selection,
-                                          GetAsDOMNode(mCachedSelectionNode),
+                                          mCachedSelectionNode,
                                           mCachedSelectionOffset,
                                           nullptr, 0, nullptr, 0);
     NS_ENSURE_SUCCESS(rv, rv);
 
     // no longer uses mCachedSelectionNode, so release it.
     mCachedSelectionNode = nullptr;
 
     // if only trailing <br> remaining remove it
--- a/editor/libeditor/TextEditRules.h
+++ b/editor/libeditor/TextEditRules.h
@@ -292,17 +292,17 @@ protected:
   // A buffer we use to track the IME composition string.
   nsString mPasswordIMEText;
   uint32_t mPasswordIMEIndex;
   // Magic node acts as placeholder in empty doc.
   nsCOMPtr<nsIContent> mBogusNode;
   // Cached selected node.
   nsCOMPtr<nsINode> mCachedSelectionNode;
   // Cached selected offset.
-  int32_t mCachedSelectionOffset;
+  uint32_t mCachedSelectionOffset;
   uint32_t mActionNesting;
   bool mLockRulesSniffing;
   bool mDidExplicitlySetInterline;
   // In bidirectional text, delete characters not visually adjacent to the
   // caret without moving the caret first.
   bool mDeleteBidiImmediately;
   // The top level editor action.
   EditAction mTheAction;
--- a/editor/libeditor/tests/test_bug520189.html
+++ b/editor/libeditor/tests/test_bug520189.html
@@ -608,14 +608,18 @@ function runTest(test) {
     is(iframes.length, expectedIFrameCount, "Only " + expectedIFrameCount + " iframe should be pasted");
     if (expectedIFrameCount > 0) {
       ok(!iframes[0].hasAttribute("src"), "iframe should not have a src attrib");
     }
   }
 }
 
 SimpleTest.waitForExplicitFinish();
-addLoadEvent(doNextTest);
 
+addLoadEvent(function() {
+  SpecialPowers.pushPrefEnv(
+    { "set": [["layout.css.moz-document.content.enabled", true]]},
+    doNextTest)
+});
 </script>
 </pre>
 </body>
 </html>
--- a/editor/txtsvc/nsIInlineSpellChecker.idl
+++ b/editor/txtsvc/nsIInlineSpellChecker.idl
@@ -5,34 +5,40 @@
 
 #include "nsISupports.idl"
 #include "domstubs.idl"
 
 interface nsISelection;
 interface nsIEditor;
 interface nsIEditorSpellCheck;
 
+%{ C++
+class nsINode;
+%}
+[ptr] native nsINodePtr(nsINode);
+
 [scriptable, uuid(b7b7a77c-40c4-4196-b0b7-b0338243b3fe)]
 interface nsIInlineSpellChecker : nsISupports
 {
   readonly attribute nsIEditorSpellCheck spellChecker;
 
   void init(in nsIEditor aEditor);
   void cleanup(in boolean aDestroyingFrames);
 
   attribute boolean enableRealTimeSpell;
 
-  void spellCheckAfterEditorChange(in long aAction,
-                                   in nsISelection aSelection,
-                                   in nsIDOMNode aPreviousSelectedNode,
-                                   in long aPreviousSelectedOffset,
-                                   in nsIDOMNode aStartNode,
-                                   in long aStartOffset,
-                                   in nsIDOMNode aEndNode,
-                                   in long aEndOffset);
+  [noscript] void spellCheckAfterEditorChange(
+                    in long aAction,
+                    in nsISelection aSelection,
+                    in nsINodePtr aPreviousSelectedNode,
+                    in unsigned long aPreviousSelectedOffset,
+                    in nsINodePtr aStartNode,
+                    in unsigned long aStartOffset,
+                    in nsINodePtr aEndNode,
+                    in unsigned long aEndOffset);
 
   void spellCheckRange(in nsIDOMRange aSelection);
 
   nsIDOMRange getMisspelledWord(in nsIDOMNode aNode, in long aOffset);
   void replaceWord(in nsIDOMNode aNode, in long aOffset, in AString aNewword);
   void addWordToDictionary(in AString aWord);
   void removeWordFromDictionary(in AString aWord);
 
--- a/extensions/spellcheck/src/mozInlineSpellChecker.cpp
+++ b/extensions/spellcheck/src/mozInlineSpellChecker.cpp
@@ -110,96 +110,96 @@ mozInlineSpellStatus::mozInlineSpellStat
 //    This is the most complicated case. For changes, we need to compute the
 //    range of stuff that changed based on the old and new caret positions,
 //    as well as use a range possibly provided by the editor (start and end,
 //    which are usually nullptr) to get a range with the union of these.
 
 nsresult
 mozInlineSpellStatus::InitForEditorChange(
     EditAction aAction,
-    nsIDOMNode* aAnchorNode, int32_t aAnchorOffset,
-    nsIDOMNode* aPreviousNode, int32_t aPreviousOffset,
-    nsIDOMNode* aStartNode, int32_t aStartOffset,
-    nsIDOMNode* aEndNode, int32_t aEndOffset)
+    nsINode* aAnchorNode, uint32_t aAnchorOffset,
+    nsINode* aPreviousNode, uint32_t aPreviousOffset,
+    nsINode* aStartNode, uint32_t aStartOffset,
+    nsINode* aEndNode, uint32_t aEndOffset)
 {
-  nsresult rv;
-
-  nsCOMPtr<nsIDOMDocument> doc;
-  rv = GetDocument(getter_AddRefs(doc));
-  NS_ENSURE_SUCCESS(rv, rv);
+  if (NS_WARN_IF(!aAnchorNode) || NS_WARN_IF(!aPreviousNode)) {
+    return NS_ERROR_FAILURE;
+  }
 
   // save the anchor point as a range so we can find the current word later
-  rv = PositionToCollapsedRange(doc, aAnchorNode, aAnchorOffset,
-                                getter_AddRefs(mAnchorRange));
-  NS_ENSURE_SUCCESS(rv, rv);
-
-  nsCOMPtr<nsINode> prevNode = do_QueryInterface(aPreviousNode);
-  NS_ENSURE_STATE(prevNode);
+  mAnchorRange = PositionToCollapsedRange(aAnchorNode, aAnchorOffset);
+  if (NS_WARN_IF(!mAnchorRange)) {
+    return NS_ERROR_FAILURE;
+  }
 
   bool deleted = aAction == EditAction::deleteSelection;
   if (aAction == EditAction::insertIMEText) {
     // IME may remove the previous node if it cancels composition when
     // there is no text around the composition.
-    deleted = !prevNode->IsInComposedDoc();
+    deleted = !aPreviousNode->IsInComposedDoc();
   }
 
   if (deleted) {
     // Deletes are easy, the range is just the current anchor. We set the range
     // to check to be empty, FinishInitOnEvent will fill in the range to be
     // the current word.
     mOp = eOpChangeDelete;
     mRange = nullptr;
     return NS_OK;
   }
 
   mOp = eOpChange;
 
   // range to check
-  mRange = new nsRange(prevNode);
+  mRange = new nsRange(aPreviousNode);
 
   // ...we need to put the start and end in the correct order
-  int16_t cmpResult;
-  rv = mAnchorRange->ComparePoint(aPreviousNode, aPreviousOffset, &cmpResult);
-  NS_ENSURE_SUCCESS(rv, rv);
+  ErrorResult errorResult;
+  int16_t cmpResult =
+    mAnchorRange->ComparePoint(*aPreviousNode, aPreviousOffset, errorResult);
+  if (NS_WARN_IF(errorResult.Failed())) {
+    return errorResult.StealNSResult();
+  }
+  nsresult rv;
   if (cmpResult < 0) {
     // previous anchor node is before the current anchor
-    nsCOMPtr<nsINode> previousNode = do_QueryInterface(aPreviousNode);
-    nsCOMPtr<nsINode> anchorNode = do_QueryInterface(aAnchorNode);
-    rv = mRange->SetStartAndEnd(previousNode, aPreviousOffset,
-                                anchorNode, aAnchorOffset);
+    rv = mRange->SetStartAndEnd(aPreviousNode, aPreviousOffset,
+                                aAnchorNode, aAnchorOffset);
     if (NS_WARN_IF(NS_FAILED(rv))) {
       return rv;
     }
   } else {
     // previous anchor node is after (or the same as) the current anchor
-    nsCOMPtr<nsINode> previousNode = do_QueryInterface(aPreviousNode);
-    nsCOMPtr<nsINode> anchorNode = do_QueryInterface(aAnchorNode);
-    rv = mRange->SetStartAndEnd(anchorNode, aAnchorOffset,
-                                previousNode, aPreviousOffset);
+    rv = mRange->SetStartAndEnd(aAnchorNode, aAnchorOffset,
+                                aPreviousNode, aPreviousOffset);
     if (NS_WARN_IF(NS_FAILED(rv))) {
       return rv;
     }
   }
 
   // On insert save this range: DoSpellCheck optimizes things in this range.
   // Otherwise, just leave this nullptr.
   if (aAction == EditAction::insertText)
     mCreatedRange = mRange;
 
   // if we were given a range, we need to expand our range to encompass it
   if (aStartNode && aEndNode) {
-    rv = mRange->ComparePoint(aStartNode, aStartOffset, &cmpResult);
-    NS_ENSURE_SUCCESS(rv, rv);
+    cmpResult = mRange->ComparePoint(*aStartNode, aStartOffset, errorResult);
+    if (NS_WARN_IF(errorResult.Failed())) {
+      return errorResult.StealNSResult();
+    }
     if (cmpResult < 0) { // given range starts before
       rv = mRange->SetStart(aStartNode, aStartOffset);
       NS_ENSURE_SUCCESS(rv, rv);
     }
 
-    rv = mRange->ComparePoint(aEndNode, aEndOffset, &cmpResult);
-    NS_ENSURE_SUCCESS(rv, rv);
+    cmpResult = mRange->ComparePoint(*aEndNode, aEndOffset, errorResult);
+    if (NS_WARN_IF(errorResult.Failed())) {
+      return errorResult.StealNSResult();
+    }
     if (cmpResult > 0) { // given range ends after
       rv = mRange->SetEnd(aEndNode, aEndOffset);
       NS_ENSURE_SUCCESS(rv, rv);
     }
   }
 
   return NS_OK;
 }
@@ -209,53 +209,50 @@ mozInlineSpellStatus::InitForEditorChang
 //    For navigation events, we just need to store the new and old positions.
 //
 //    In some cases, we detect that we shouldn't check. If this event should
 //    not be processed, *aContinue will be false.
 
 nsresult
 mozInlineSpellStatus::InitForNavigation(
     bool aForceCheck, int32_t aNewPositionOffset,
-    nsIDOMNode* aOldAnchorNode, int32_t aOldAnchorOffset,
-    nsIDOMNode* aNewAnchorNode, int32_t aNewAnchorOffset,
+    nsINode* aOldAnchorNode, uint32_t aOldAnchorOffset,
+    nsINode* aNewAnchorNode, uint32_t aNewAnchorOffset,
     bool* aContinue)
 {
   mOp = eOpNavigation;
 
   mForceNavigationWordCheck = aForceCheck;
   mNewNavigationPositionOffset = aNewPositionOffset;
 
   // get the root node for checking
   TextEditor* textEditor = mSpellChecker->mTextEditor;
   if (NS_WARN_IF(!textEditor)) {
     return NS_ERROR_FAILURE;
   }
-  nsCOMPtr<nsINode> root = textEditor->GetRoot();
+  Element* root = textEditor->GetRoot();
   if (NS_WARN_IF(!root)) {
     return NS_ERROR_FAILURE;
   }
   // the anchor node might not be in the DOM anymore, check
-  nsresult rv = NS_ERROR_FAILURE;
-  nsCOMPtr<nsINode> currentAnchor = do_QueryInterface(aOldAnchorNode, &rv);
-  NS_ENSURE_SUCCESS(rv, rv);
-  if (root && currentAnchor && ! ContentIsDescendantOf(currentAnchor, root)) {
+  if (root && aOldAnchorNode && ! ContentIsDescendantOf(aOldAnchorNode, root)) {
     *aContinue = false;
     return NS_OK;
   }
 
-  nsCOMPtr<nsIDOMDocument> doc;
-  rv = GetDocument(getter_AddRefs(doc));
-  NS_ENSURE_SUCCESS(rv, rv);
-
-  rv = PositionToCollapsedRange(doc, aOldAnchorNode, aOldAnchorOffset,
-                                getter_AddRefs(mOldNavigationAnchorRange));
-  NS_ENSURE_SUCCESS(rv, rv);
-  rv = PositionToCollapsedRange(doc, aNewAnchorNode, aNewAnchorOffset,
-                                getter_AddRefs(mAnchorRange));
-  NS_ENSURE_SUCCESS(rv, rv);
+  mOldNavigationAnchorRange =
+    PositionToCollapsedRange(aOldAnchorNode, aOldAnchorOffset);
+  if (NS_WARN_IF(!mOldNavigationAnchorRange)) {
+    return NS_ERROR_FAILURE;
+  }
+  mAnchorRange =
+    PositionToCollapsedRange(aNewAnchorNode, aNewAnchorOffset);
+  if (NS_WARN_IF(!mAnchorRange)) {
+    return NS_ERROR_FAILURE;
+  }
 
   *aContinue = true;
   return NS_OK;
 }
 
 // mozInlineSpellStatus::InitForSelection
 //
 //    It is easy for selections since we always re-check the spellcheck
@@ -425,57 +422,49 @@ mozInlineSpellStatus::FillNoCheckRangeFr
                                    getter_AddRefs(mNoCheckRange));
 }
 
 // mozInlineSpellStatus::GetDocument
 //
 //    Returns the nsIDOMDocument object for the document for the
 //    current spellchecker.
 
-nsresult
-mozInlineSpellStatus::GetDocument(nsIDOMDocument** aDocument)
+already_AddRefed<nsIDocument>
+mozInlineSpellStatus::GetDocument()
 {
-  *aDocument = nullptr;
   if (!mSpellChecker->mTextEditor) {
-    return NS_ERROR_UNEXPECTED;
+    return nullptr;
   }
 
-  nsCOMPtr<nsIDOMDocument> domDoc =
-    mSpellChecker->mTextEditor->GetDOMDocument();
-  if (NS_WARN_IF(!domDoc)) {
-    return NS_ERROR_NULL_POINTER;
-  }
-  domDoc.forget(aDocument);
-  return NS_OK;
+  return mSpellChecker->mTextEditor->GetDocument();
 }
 
 // mozInlineSpellStatus::PositionToCollapsedRange
 //
 //    Converts a given DOM position to a collapsed range covering that
 //    position. We use ranges to store DOM positions becuase they stay
 //    updated as the DOM is changed.
 
-nsresult
-mozInlineSpellStatus::PositionToCollapsedRange(nsIDOMDocument* aDocument,
-                                               nsIDOMNode* aNode,
-                                               int32_t aOffset,
-                                               nsRange** aRange)
+already_AddRefed<nsRange>
+mozInlineSpellStatus::PositionToCollapsedRange(nsINode* aNode,
+                                               uint32_t aOffset)
 {
-  *aRange = nullptr;
-  nsCOMPtr<nsINode> documentNode = do_QueryInterface(aDocument);
-  RefPtr<nsRange> range = new nsRange(documentNode);
-
-  nsCOMPtr<nsINode> node = do_QueryInterface(aNode);
-  nsresult rv = range->CollapseTo(node, aOffset);
-  if (NS_WARN_IF(NS_FAILED(rv))) {
-    return rv;
+  nsCOMPtr<nsIDocument> document = GetDocument();
+  if (NS_WARN_IF(!document)) {
+    return nullptr;
   }
 
-  range.swap(*aRange);
-  return NS_OK;
+  RefPtr<nsRange> range = new nsRange(document);
+
+  nsresult rv = range->CollapseTo(aNode, aOffset);
+  if (NS_WARN_IF(NS_FAILED(rv))) {
+    return nullptr;
+  }
+
+  return range.forget();
 }
 
 // mozInlineSpellResume
 
 class mozInlineSpellResume : public Runnable
 {
 public:
   mozInlineSpellResume(UniquePtr<mozInlineSpellStatus>&& aStatus,
@@ -867,40 +856,36 @@ mozInlineSpellChecker::NotifyObservers(c
 //    The start and end positions specify a range for the thing that happened,
 //    but these are usually nullptr, even when you'd think they would be useful
 //    because you want the range (for example, pasting). We ignore them in
 //    this case.
 
 NS_IMETHODIMP
 mozInlineSpellChecker::SpellCheckAfterEditorChange(
     int32_t aAction, nsISelection *aSelection,
-    nsIDOMNode *aPreviousSelectedNode, int32_t aPreviousSelectedOffset,
-    nsIDOMNode *aStartNode, int32_t aStartOffset,
-    nsIDOMNode *aEndNode, int32_t aEndOffset)
+    nsINode *aPreviousSelectedNode, uint32_t aPreviousSelectedOffset,
+    nsINode *aStartNode, uint32_t aStartOffset,
+    nsINode *aEndNode, uint32_t aEndOffset)
 {
   nsresult rv;
   NS_ENSURE_ARG_POINTER(aSelection);
   if (!mSpellCheck)
     return NS_OK; // disabling spell checking is not an error
 
   // this means something has changed, and we never check the current word,
   // therefore, we should spellcheck for subsequent caret navigations
   mNeedsCheckAfterNavigation = true;
 
+  RefPtr<Selection> selection = aSelection->AsSelection();
+
   // the anchor node is the position of the caret
-  nsCOMPtr<nsIDOMNode> anchorNode;
-  rv = aSelection->GetAnchorNode(getter_AddRefs(anchorNode));
-  NS_ENSURE_SUCCESS(rv, rv);
-  int32_t anchorOffset;
-  rv = aSelection->GetAnchorOffset(&anchorOffset);
-  NS_ENSURE_SUCCESS(rv, rv);
-
   auto status = MakeUnique<mozInlineSpellStatus>(this);
   rv = status->InitForEditorChange((EditAction)aAction,
-                                   anchorNode, anchorOffset,
+                                   selection->GetAnchorNode(),
+                                   selection->AnchorOffset(),
                                    aPreviousSelectedNode,
                                    aPreviousSelectedOffset,
                                    aStartNode, aStartOffset,
                                    aEndNode, aEndOffset);
   NS_ENSURE_SUCCESS(rv, rv);
   rv = ScheduleSpellCheck(Move(status));
   NS_ENSURE_SUCCESS(rv, rv);
 
@@ -1835,17 +1820,17 @@ mozInlineSpellChecker::SaveCurrentSelect
   }
 
   // figure out the old caret position based on the current selection
   RefPtr<Selection> selection = mTextEditor->GetSelection();
   if (NS_WARN_IF(!selection)) {
     return NS_ERROR_FAILURE;
   }
 
-  mCurrentSelectionAnchorNode = do_QueryInterface(selection->GetFocusNode());
+  mCurrentSelectionAnchorNode = selection->GetFocusNode();
   mCurrentSelectionOffset = selection->FocusOffset();
 
   return NS_OK;
 }
 
 // This is a copy of nsContentUtils::ContentIsDescendantOf. Another crime
 // for XPCOM's rap sheet
 bool // static
@@ -1885,18 +1870,18 @@ mozInlineSpellChecker::HandleNavigationE
 
   // If we already handled the navigation event and there is no possibility
   // anything has changed since then, we don't have to do anything. This
   // optimization makes a noticeable difference when you hold down a navigation
   // key like Page Down.
   if (! mNeedsCheckAfterNavigation)
     return NS_OK;
 
-  nsCOMPtr<nsIDOMNode> currentAnchorNode = mCurrentSelectionAnchorNode;
-  int32_t currentAnchorOffset = mCurrentSelectionOffset;
+  nsCOMPtr<nsINode> currentAnchorNode = mCurrentSelectionAnchorNode;
+  uint32_t currentAnchorOffset = mCurrentSelectionOffset;
 
   // now remember the new focus position resulting from the event
   rv = SaveCurrentSelectionPosition();
   NS_ENSURE_SUCCESS(rv, rv);
 
   bool shouldPost;
   auto status = MakeUnique<mozInlineSpellStatus>(this);
   rv = status->InitForNavigation(aForceWordSpellCheck, aNewPositionOffset,
--- a/extensions/spellcheck/src/mozInlineSpellChecker.h
+++ b/extensions/spellcheck/src/mozInlineSpellChecker.h
@@ -32,23 +32,23 @@ class UpdateCurrentDictionaryCallback;
 class mozInlineSpellResume;
 
 class mozInlineSpellStatus
 {
 public:
   explicit mozInlineSpellStatus(mozInlineSpellChecker* aSpellChecker);
 
   nsresult InitForEditorChange(EditAction aAction,
-                               nsIDOMNode* aAnchorNode, int32_t aAnchorOffset,
-                               nsIDOMNode* aPreviousNode, int32_t aPreviousOffset,
-                               nsIDOMNode* aStartNode, int32_t aStartOffset,
-                               nsIDOMNode* aEndNode, int32_t aEndOffset);
+                               nsINode* aAnchorNode, uint32_t aAnchorOffset,
+                               nsINode* aPreviousNode, uint32_t aPreviousOffset,
+                               nsINode* aStartNode, uint32_t aStartOffset,
+                               nsINode* aEndNode, uint32_t aEndOffset);
   nsresult InitForNavigation(bool aForceCheck, int32_t aNewPositionOffset,
-                             nsIDOMNode* aOldAnchorNode, int32_t aOldAnchorOffset,
-                             nsIDOMNode* aNewAnchorNode, int32_t aNewAnchorOffset,
+                             nsINode* aOldAnchorNode, uint32_t aOldAnchorOffset,
+                             nsINode* aNewAnchorNode, uint32_t aNewAnchorOffset,
                              bool* aContinue);
   nsresult InitForSelection();
   nsresult InitForRange(nsRange* aRange);
 
   nsresult FinishInitOnEvent(mozInlineSpellWordUtil& aWordUtil);
 
   // Return true if we plan to spell-check everything
   bool IsFullSpellCheck() const {
@@ -104,20 +104,19 @@ public:
   // Contains the offset passed in to HandleNavigationEvent
   int32_t mNewNavigationPositionOffset;
 
 protected:
   nsresult FinishNavigationEvent(mozInlineSpellWordUtil& aWordUtil);
 
   nsresult FillNoCheckRangeFromAnchor(mozInlineSpellWordUtil& aWordUtil);
 
-  nsresult GetDocument(nsIDOMDocument** aDocument);
-  nsresult PositionToCollapsedRange(nsIDOMDocument* aDocument,
-                                    nsIDOMNode* aNode, int32_t aOffset,
-                                    nsRange** aRange);
+  already_AddRefed<nsIDocument> GetDocument();
+  already_AddRefed<nsRange> PositionToCollapsedRange(nsINode* aNode,
+                                                     uint32_t aOffset);
 };
 
 class mozInlineSpellChecker final : public nsIInlineSpellChecker,
                                     public nsIEditActionListener,
                                     public nsIDOMEventListener,
                                     public nsSupportsWeakReference
 {
 private:
@@ -146,18 +145,18 @@ private:
   // total number of misspellings. When you have a large textarea prepopulated
   // with text with many misspellings, we can hit this limit. By making it
   // lower than the total number of misspelled words, new text typed by the
   // user can also have spellchecking in it.
   int32_t mMaxMisspellingsPerCheck;
 
   // we need to keep track of the current text position in the document
   // so we can spell check the old word when the user clicks around the document.
-  nsCOMPtr<nsIDOMNode> mCurrentSelectionAnchorNode;
-  int32_t              mCurrentSelectionOffset;
+  nsCOMPtr<nsINode> mCurrentSelectionAnchorNode;
+  uint32_t mCurrentSelectionOffset;
 
   // Tracks the number of pending spell checks *and* async operations that may
   // lead to spell checks, like updating the current dictionary.  This is
   // necessary so that observers can know when to wait for spell check to
   // complete.
   int32_t mNumPendingSpellChecks;
 
   // The number of calls to UpdateCurrentDictionary that haven't finished yet.
--- a/gfx/ipc/GfxMessageUtils.h
+++ b/gfx/ipc/GfxMessageUtils.h
@@ -15,16 +15,17 @@
 #include "chrome/common/ipc_message_utils.h"
 #include "gfxFeature.h"
 #include "gfxFallback.h"
 #include "gfxPoint.h"
 #include "gfxRect.h"
 #include "gfxTelemetry.h"
 #include "gfxTypes.h"
 #include "ipc/IPCMessageUtils.h"
+#include "mozilla/gfx/CompositorHitTestInfo.h"
 #include "mozilla/gfx/Matrix.h"
 #include "nsRect.h"
 #include "nsRegion.h"
 #include "mozilla/Array.h"
 
 #include <stdint.h>
 
 #ifdef _MSC_VER
@@ -917,12 +918,18 @@ struct ParamTraits<mozilla::Array<T, Len
       if (!ReadParam<T>(aMsg, aIter, &aResult->operator[](i))) {
         return false;
       }
     }
     return true;
   }
 };
 
+template <>
+struct ParamTraits<mozilla::gfx::CompositorHitTestInfo>
+  : public BitFlagsEnumSerializer<mozilla::gfx::CompositorHitTestInfo,
+                                  mozilla::gfx::CompositorHitTestInfo::ALL_BITS>
+{
+};
 
 } /* namespace IPC */
 
 #endif /* __GFXMESSAGEUTILS_H__ */
--- a/gfx/layers/apz/public/IAPZCTreeManager.cpp
+++ b/gfx/layers/apz/public/IAPZCTreeManager.cpp
@@ -19,17 +19,18 @@ namespace mozilla {
 namespace layers {
 
 static bool
 WillHandleMouseEvent(const WidgetMouseEventBase& aEvent)
 {
   return aEvent.mMessage == eMouseMove ||
          aEvent.mMessage == eMouseDown ||
          aEvent.mMessage == eMouseUp ||
-         aEvent.mMessage == eDragEnd;
+         aEvent.mMessage == eDragEnd ||
+         (gfxPrefs::TestEventsAsyncEnabled() && aEvent.mMessage == eMouseHitTest);
 }
 
 /* static */ bool
 IAPZCTreeManager::WillHandleWheelEvent(WidgetWheelEvent* aEvent)
 {
   return EventStateManager::WheelEventIsScrollAction(aEvent) &&
          (aEvent->mDeltaMode == nsIDOMWheelEvent::DOM_DELTA_LINE ||
           aEvent->mDeltaMode == nsIDOMWheelEvent::DOM_DELTA_PIXEL ||
--- a/gfx/layers/apz/src/APZCTreeManager.cpp
+++ b/gfx/layers/apz/src/APZCTreeManager.cpp
@@ -972,17 +972,17 @@ WillHandleInput(const PanGestureOrScroll
 }
 
 void
 APZCTreeManager::FlushApzRepaints(uint64_t aLayersId)
 {
   // Previously, paints were throttled and therefore this method was used to
   // ensure any pending paints were flushed. Now, paints are flushed
   // immediately, so it is safe to simply send a notification now.
-  APZCTM_LOG("Flushing repaints for layers id 0x%" PRIx64, aLayersId);
+  APZCTM_LOG("Flushing repaints for layers id 0x%" PRIx64 "\n", aLayersId);
   const LayerTreeState* state =
     CompositorBridgeParent::GetIndirectShadowTree(aLayersId);
   MOZ_ASSERT(state && state->mController);
   state->mController->DispatchToRepaintThread(
     NewRunnableMethod("layers::GeckoContentController::NotifyFlushComplete",
                       state->mController,
                       &GeckoContentController::NotifyFlushComplete));
 }
@@ -1053,16 +1053,23 @@ APZCTreeManager::ReceiveInputEvent(Input
       { // scope lock
         MutexAutoLock lock(mTreeLock);
         if (!apzc && mRootNode) {
           apzc = mRootNode->GetApzc();
         }
       }
 
       if (apzc) {
+        if (gfxPrefs::APZTestLoggingEnabled() && mouseInput.mType == MouseInput::MOUSE_HITTEST) {
+          ScrollableLayerGuid guid = apzc->GetGuid();
+          if (LayerTreeState* state = CompositorBridgeParent::GetIndirectShadowTree(guid.mLayersId)) {
+            state->mApzTestData.RecordHitResult(mouseInput.mOrigin, hitResult, guid.mScrollId);
+          }
+        }
+
         bool targetConfirmed = (hitResult != CompositorHitTestInfo::eInvisibleToHitTest)
                             && !(hitResult & CompositorHitTestInfo::eDispatchToContent);
         bool apzDragEnabled = gfxPrefs::APZDragEnabled();
         if (apzDragEnabled && hitScrollbar) {
           // If scrollbar dragging is enabled and we hit a scrollbar, wait
           // for the main-thread confirmation because it contains drag metrics
           // that we need.
           targetConfirmed = false;
@@ -2207,40 +2214,20 @@ APZCTreeManager::GetTargetAPZC(const Scr
                                CompositorHitTestInfo* aOutHitResult,
                                RefPtr<HitTestingTreeNode>* aOutScrollbarNode)
 {
   MutexAutoLock lock(mTreeLock);
 
   CompositorHitTestInfo hitResult = CompositorHitTestInfo::eInvisibleToHitTest;
   HitTestingTreeNode* scrollbarNode = nullptr;
   RefPtr<AsyncPanZoomController> target;
-  target = GetAPZCAtPoint(mRootNode, aPoint, &hitResult, &scrollbarNode);
-
   if (gfxPrefs::WebRenderHitTest()) {
-    CompositorHitTestInfo wrHitResult = CompositorHitTestInfo::eInvisibleToHitTest;
-    HitTestingTreeNode* wrScrollbarNode = nullptr;
-    RefPtr<AsyncPanZoomController> wrTarget = GetAPZCAtPointWR(aPoint, &wrHitResult, &wrScrollbarNode);
-    // For now just compare the WR and non-WR results.
-    if (wrHitResult != hitResult) {
-      printf_stderr("WR hit result mismatch at %s: got 0x%x, expected 0x%x\n",
-          Stringify(aPoint).c_str(), (int)wrHitResult, (int)hitResult);
-      // MOZ_RELEASE_ASSERT(false);
-    }
-    if (wrTarget.get() != target.get()) {
-      printf_stderr("WR hit target mismatch at %s: got %s, expected %s\n",
-          Stringify(aPoint).c_str(),
-          wrTarget ? Stringify(wrTarget->GetGuid()).c_str() : "null",
-          target ? Stringify(target->GetGuid()).c_str() : "null");
-      // MOZ_RELEASE_ASSERT(false);
-    }
-    if (wrScrollbarNode != scrollbarNode) {
-      printf_stderr("WR scrollbar node mismatch at %s: got %p, expected %p\n",
-          Stringify(aPoint).c_str(), wrScrollbarNode, scrollbarNode);
-      // MOZ_RELEASE_ASSERT(false);
-    }
+    target = GetAPZCAtPointWR(aPoint, &hitResult, &scrollbarNode);
+  } else {
+    target = GetAPZCAtPoint(mRootNode, aPoint, &hitResult, &scrollbarNode);
   }
 
   if (aOutHitResult) {
     *aOutHitResult = hitResult;
   }
   if (aOutScrollbarNode) {
     *aOutScrollbarNode = scrollbarNode;
   }
new file mode 100644
--- /dev/null
+++ b/gfx/layers/apz/test/mochitest/helper_hittest_basic.html
@@ -0,0 +1,197 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+  <title>Various tests to exercise the APZ hit-testing codepaths</title>
+  <script type="application/javascript" src="apz_test_utils.js"></script>
+  <script type="application/javascript" src="apz_test_native_event_utils.js"></script>
+  <script type="application/javascript" src="/tests/SimpleTest/paint_listener.js"></script>
+  <meta name="viewport" content="width=device-width"/>
+</head>
+<body>
+ <div id="scroller" style="width: 300px; height: 300px; overflow:scroll; margin-top: 100px; margin-left: 50px">
+  <div id="contents" style="width: 500px; height: 500px; background-image: linear-gradient(blue,red)">
+   <div id="apzaware" style="position: relative; width: 100px; height: 100px; top: 300px; background-color: red" onwheel="return false;"></div>
+  </div>
+ </div>
+ <div id="make_root_scrollable" style="height: 5000px"></div>
+</body>
+<script type="application/javascript">
+
+var utils = SpecialPowers.getDOMWindowUtils(window);
+var isWebRender = (utils.layerManagerType == 'WebRender');
+var isWindows = (getPlatform() == 'windows');
+
+function centerOf(element) {
+  var bounds = element.getBoundingClientRect();
+  return { x: bounds.x + (bounds.width / 2), y: bounds.y + (bounds.height / 2) };
+}
+
+function hitTest(point) {
+  dump("Hit-testing point (" + point.x + ", " + point.y + ")\n");
+  utils.sendMouseEvent("MozMouseHittest", point.x, point.y, 0, 0, 0, true, 0, 0, true, true);
+  var data = utils.getCompositorAPZTestData();
+  ok(data.hitResults.length >= 1, "Expected at least one hit result in the APZTestData");
+  var result = data.hitResults[data.hitResults.length - 1];
+  return { hitInfo: result.hitResult, scrollId: result.scrollId };
+}
+
+function* test(testDriver) {
+  var scroller = document.getElementById('scroller');
+  var apzaware = document.getElementById('apzaware');
+
+  var verticalScrollbarWidth = scroller.getBoundingClientRect().width - scroller.clientWidth;
+  var horizontalScrollbarHeight = scroller.getBoundingClientRect().height - scroller.clientHeight;
+
+  // On windows, the scrollbar tracks have buttons on the end. When computing
+  // coordinates for hit-testing we need to account for this. We assume the
+  // buttons are square, and so can use the scrollbar width/height to estimate
+  // the size of the buttons
+  var scrollbarArrowButtonHeight = isWindows ? verticalScrollbarWidth : 0;
+  var scrollbarArrowButtonWidth = isWindows ? horizontalScrollbarHeight : 0;
+
+  // WebRender will hit-test scroll thumbs even inside inactive scrollframes,
+  // because the hit-test is based on display items and we do in fact generate
+  // the display items for the scroll thumb. The user-observed behaviour is
+  // going to be unaffected because the dispatch-to-content flag will also be
+  // set on these thumbs so it's not like APZ will allow async-scrolling them
+  // before the scrollframe has been activated/layerized. In non-WebRender we
+  // do not generate the layers for thumbs on inactive scrollframes, so the
+  // hit test will be accordingly different.
+  var inactiveScrollframeThumbFlag = isWebRender ? APZHitResultFlags.SCROLLBAR_THUMB : 0;
+
+  var {hitInfo, scrollId} = hitTest(centerOf(scroller));
+  is(hitInfo, APZHitResultFlags.VISIBLE | APZHitResultFlags.DISPATCH_TO_CONTENT,
+     "inactive scrollframe hit info");
+  is(scrollId, utils.getViewId(document.scrollingElement),
+     "inactive scrollframe scrollid");
+
+  // The apz-aware div (which has a non-passive wheel listener) is not visible
+  // and so the hit-test should just return the root scrollframe area that's
+  // covering it
+  var {hitInfo, scrollId} = hitTest(centerOf(apzaware));
+  is(hitInfo, APZHitResultFlags.VISIBLE,
+     "inactive scrollframe - apzaware block hit info");
+  is(scrollId, utils.getViewId(document.scrollingElement),
+     "inactive scrollframe - apzaware block scrollid");
+
+  // Hit-test against where the scrollthumbs should be, assuming we don't have
+  // overlay scrollbars with zero dimensions. Note that the scrollframe is still
+  // inactive so the result should just be the same dispatch-to-content area
+  // as before, but because we force layerization of scrollbar tracks the hit
+  // result will have HITTEST_SCROLLBAR set. Unfortunately not forcing the
+  // layerization results in different behaviour on different platforms which
+  // makes testing harder.
+  if (verticalScrollbarWidth > 0) {
+    var verticalScrollbarPoint = {
+        x: scroller.getBoundingClientRect().right - (verticalScrollbarWidth / 2),
+        y: scroller.getBoundingClientRect().y + scrollbarArrowButtonHeight + 5,
+    };
+    var {hitInfo, scrollId} = hitTest(verticalScrollbarPoint);
+    is(hitInfo, APZHitResultFlags.VISIBLE | APZHitResultFlags.DISPATCH_TO_CONTENT
+              | APZHitResultFlags.SCROLLBAR | APZHitResultFlags.SCROLLBAR_VERTICAL
+              | inactiveScrollframeThumbFlag,
+       "inactive scrollframe - vertical scrollbar hit info");
+    is(scrollId, utils.getViewId(document.scrollingElement),
+       "inactive scrollframe - vertical scrollbar scrollid");
+  }
+
+  if (horizontalScrollbarHeight > 0) {
+    var horizontalScrollbarPoint = {
+        x: scroller.getBoundingClientRect().x + scrollbarArrowButtonWidth + 5,
+        y: scroller.getBoundingClientRect().bottom - (horizontalScrollbarHeight / 2),
+    };
+    var {hitInfo, scrollId} = hitTest(horizontalScrollbarPoint);
+    is(hitInfo, APZHitResultFlags.VISIBLE | APZHitResultFlags.DISPATCH_TO_CONTENT
+              | APZHitResultFlags.SCROLLBAR | inactiveScrollframeThumbFlag,
+       "inactive scrollframe - horizontal scrollbar hit info");
+    is(scrollId, utils.getViewId(document.scrollingElement),
+       "inactive scrollframe - horizontal scrollbar scrollid");
+  }
+
+
+  // activate the scrollframe but keep the main-thread scroll position at 0.
+  // also apply a async scroll offset in the y-direction such that the
+  // scrollframe scrolls to the bottom of its range.
+  utils.setDisplayPortForElement(0, 0, 500, 500, scroller, 1);
+  yield waitForAllPaints(testDriver);
+  var scrollY = scroller.scrollTopMax;
+  utils.setAsyncScrollOffset(scroller, 0, scrollY);
+  if (isWebRender) {
+    // Tick the refresh driver once to make sure the compositor has applied the
+    // async scroll offset (for APZ hit-testing this doesn't matter, but for
+    // WebRender hit-testing we need to make sure WR has the latest info).
+    utils.advanceTimeAndRefresh(16);
+    utils.restoreNormalRefresh();
+  }
+
+  // Now we again test the middle of the scrollframe, which is now active
+  var {hitInfo, scrollId} = hitTest(centerOf(scroller));
+  is(hitInfo, APZHitResultFlags.VISIBLE,
+     "active scrollframe hit info");
+  is(scrollId, utils.getViewId(scroller),
+     "active scrollframe scrollid");
+
+  // Test the apz-aware block
+  var apzawarePosition = centerOf(apzaware); // main thread position
+  apzawarePosition.y -= scrollY; // APZ position
+  var {hitInfo, scrollId} = hitTest(apzawarePosition);
+  is(hitInfo, APZHitResultFlags.VISIBLE | APZHitResultFlags.DISPATCH_TO_CONTENT,
+     "active scrollframe - apzaware block hit info");
+  is(scrollId, utils.getViewId(scroller),
+     "active scrollframe - apzaware block scrollid");
+
+  // Test the scrollbars. Note that this time the vertical scrollthumb is
+  // going to be at the bottom of the track. We'll test both the top and the
+  // bottom.
+  if (verticalScrollbarWidth > 0) {
+    // top of scrollbar track
+    var verticalScrollbarPoint = {
+        x: scroller.getBoundingClientRect().right - (verticalScrollbarWidth / 2),
+        y: scroller.getBoundingClientRect().top + scrollbarArrowButtonHeight + 5,
+    };
+    var {hitInfo, scrollId} = hitTest(verticalScrollbarPoint);
+    is(hitInfo, APZHitResultFlags.VISIBLE | APZHitResultFlags.SCROLLBAR
+              | APZHitResultFlags.SCROLLBAR_VERTICAL,
+       "active scrollframe - vertical scrollbar hit info");
+    is(scrollId, utils.getViewId(scroller),
+       "active scrollframe - vertical scrollbar scrollid");
+
+    // bottom of scrollbar track (scrollthumb)
+    verticalScrollbarPoint.y = scroller.getBoundingClientRect().bottom - horizontalScrollbarHeight - scrollbarArrowButtonHeight - 5;
+    var {hitInfo, scrollId} = hitTest(verticalScrollbarPoint);
+    is(hitInfo, APZHitResultFlags.VISIBLE | APZHitResultFlags.DISPATCH_TO_CONTENT
+              | APZHitResultFlags.SCROLLBAR | APZHitResultFlags.SCROLLBAR_THUMB
+              | APZHitResultFlags.SCROLLBAR_VERTICAL,
+       "active scrollframe - vertical scrollthumb hit info");
+    is(scrollId, utils.getViewId(scroller),
+       "active scrollframe - vertical scrollthumb scrollid");
+  }
+  if (horizontalScrollbarHeight > 0) {
+    // left part of scrollbar track (has scrollthumb)
+    var horizontalScrollbarPoint = {
+        x: scroller.getBoundingClientRect().x + scrollbarArrowButtonWidth + 5,
+        y: scroller.getBoundingClientRect().bottom - (horizontalScrollbarHeight / 2),
+    };
+    var {hitInfo, scrollId} = hitTest(horizontalScrollbarPoint);
+    is(hitInfo, APZHitResultFlags.VISIBLE | APZHitResultFlags.DISPATCH_TO_CONTENT
+              | APZHitResultFlags.SCROLLBAR | APZHitResultFlags.SCROLLBAR_THUMB,
+       "active scrollframe - horizontal scrollthumb hit info");
+    is(scrollId, utils.getViewId(scroller),
+       "active scrollframe - horizontal scrollthumb scrollid");
+
+    // right part of scrollbar track
+    horizontalScrollbarPoint.x = scroller.getBoundingClientRect().right - verticalScrollbarWidth - scrollbarArrowButtonWidth - 5;
+    var {hitInfo, scrollId} = hitTest(horizontalScrollbarPoint);
+    is(hitInfo, APZHitResultFlags.VISIBLE | APZHitResultFlags.SCROLLBAR,
+       "active scrollframe - horizontal scrollbar hit info");
+    is(scrollId, utils.getViewId(scroller),
+       "active scrollframe - horizontal scrollbar scrollid");
+  }
+
+  subtestDone();
+}
+
+waitUntilApzStable().then(runContinuation(test));
+
+</script>
+</html>
--- a/gfx/layers/apz/test/mochitest/mochitest.ini
+++ b/gfx/layers/apz/test/mochitest/mochitest.ini
@@ -14,16 +14,17 @@
     helper_bug1346632.html
     helper_click.html
     helper_div_pan.html
     helper_drag_click.html
     helper_drag_scroll.html
     helper_iframe_pan.html
     helper_iframe1.html
     helper_iframe2.html
+    helper_hittest_basic.html
     helper_key_scroll.html
     helper_long_tap.html
     helper_override_root.html
     helper_override_subdoc.html
     helper_scroll_inactive_perspective.html
     helper_scroll_inactive_zindex.html
     helper_scroll_on_position_fixed.html
     helper_scroll_over_scrollbar.html
@@ -71,8 +72,10 @@ skip-if = os == 'win' && os_version == '
 [test_touch_listeners_impacting_wheel.html]
   skip-if = (toolkit == 'android') || (toolkit == 'cocoa') # wheel events not supported on mobile, and synthesized wheel smooth-scrolling not supported on OS X
 [test_wheel_scroll.html]
   skip-if = (os == 'android') # wheel events not supported on mobile
 [test_wheel_transactions.html]
   skip-if = (os == 'android') # wheel events not supported on mobile
 [test_group_overrides.html]
   skip-if = (os == 'android') # wheel events not supported on mobile
+[test_group_hittest.html]
+  skip-if = (toolkit == 'android') # mouse events not supported on mobile
new file mode 100644
--- /dev/null
+++ b/gfx/layers/apz/test/mochitest/test_group_hittest.html
@@ -0,0 +1,45 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>Various hit-testing tests that spawn in new windows</title>
+  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <script type="application/javascript" src="apz_test_utils.js"></script>
+  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+  <script type="application/javascript">
+
+var prefs = [
+  // Turn off displayport expiry so that we don't miss failures where the
+  // displayport is set and then expires before we get around to doing the
+  // hit-test inside the activated scrollframe.
+  ["apz.displayport_expiry_ms", 0],
+  // Always layerize the scrollbar track, so as to get consistent results
+  // across platforms. Eventually we should probably get rid of this and make
+  // the tests more robust in terms of testing all the different cross-platform
+  // variations.
+  ["layout.scrollbars.always-layerize-track", true],
+  // We need this pref to allow the synthetic mouse events to propagate to APZ,
+  // and to allow the MozMouseHittest event in particular to be dispatched to
+  // APZ as a MouseInput so the hit result is recorded.
+  ["test.events.async.enabled", true],
+  // Turns on APZTestData logging which we use to obtain the hit test results.
+  ["apz.test.logging_enabled", true]
+];
+
+var subtests = [
+  {'file': 'helper_hittest_basic.html', 'prefs': prefs},
+];
+
+if (isApzEnabled()) {
+  SimpleTest.waitForExplicitFinish();
+  window.onload = function() {
+    runSubtestsSeriallyInFreshWindows(subtests)
+    .then(SimpleTest.finish);
+  };
+}
+
+  </script>
+</head>
+<body>
+</body>
+</html>
--- a/gfx/layers/apz/testutil/APZTestData.cpp
+++ b/gfx/layers/apz/testutil/APZTestData.cpp
@@ -18,20 +18,31 @@ struct APZTestDataToJSConverter {
                                dom::Sequence<KeyValuePair>& aOutTo,
                                void (*aElementConverter)(const Key&, const Value&, KeyValuePair&)) {
     for (auto it = aFrom.begin(); it != aFrom.end(); ++it) {
       aOutTo.AppendElement(fallible);
       aElementConverter(it->first, it->second, aOutTo.LastElement());
     }
   }
 
+  template <typename Src, typename Target>
+  static void ConvertList(const nsTArray<Src>& aFrom,
+                          dom::Sequence<Target>& aOutTo,
+                          void (*aElementConverter)(const Src&, Target&)) {
+    for (auto it = aFrom.begin(); it != aFrom.end(); ++it) {
+      aOutTo.AppendElement(fallible);
+      aElementConverter(*it, aOutTo.LastElement());
+    }
+  }
+
   static void ConvertAPZTestData(const APZTestData& aFrom,
                                  dom::APZTestData& aOutTo) {
     ConvertMap(aFrom.mPaints, aOutTo.mPaints.Construct(), ConvertBucket);
     ConvertMap(aFrom.mRepaintRequests, aOutTo.mRepaintRequests.Construct(), ConvertBucket);
+    ConvertList(aFrom.mHitResults, aOutTo.mHitResults.Construct(), ConvertHitResult);
   }
 
   static void ConvertBucket(const SequenceNumber& aKey,
                             const APZTestData::Bucket& aValue,
                             dom::APZBucket& aOutKeyValuePair) {
     aOutKeyValuePair.mSequenceNumber.Construct() = aKey;
     ConvertMap(aValue, aOutKeyValuePair.mScrollFrames.Construct(), ConvertScrollFrameData);
   }
@@ -48,16 +59,26 @@ struct APZTestDataToJSConverter {
                            dom::ScrollFrameDataEntry& aOutKeyValuePair) {
     ConvertString(aKey, aOutKeyValuePair.mKey.Construct());
     ConvertString(aValue, aOutKeyValuePair.mValue.Construct());
   }
 
   static void ConvertString(const std::string& aFrom, nsString& aOutTo) {
     aOutTo = NS_ConvertUTF8toUTF16(aFrom.c_str(), aFrom.size());
   }
+
+  static void ConvertHitResult(const APZTestData::HitResult& aResult,
+                               dom::APZHitResult& aOutHitResult) {
+    aOutHitResult.mScreenX.Construct() = aResult.point.x;
+    aOutHitResult.mScreenY.Construct() = aResult.point.y;
+    static_assert(sizeof(aResult.result) == sizeof(uint16_t),
+        "Expected CompositorHitTestInfo to be 16-bit");
+    aOutHitResult.mHitResult.Construct() = static_cast<uint16_t>(aResult.result);
+    aOutHitResult.mScrollId.Construct() = aResult.scrollId;
+  }
 };
 
 bool
 APZTestData::ToJS(JS::MutableHandleValue aOutValue, JSContext* aContext) const
 {
   dom::APZTestData result;
   APZTestDataToJSConverter::ConvertAPZTestData(*this, result);
   return dom::ToJSValue(aContext, result, aOutValue);
--- a/gfx/layers/apz/testutil/APZTestData.h
+++ b/gfx/layers/apz/testutil/APZTestData.h
@@ -7,37 +7,42 @@
 #ifndef mozilla_layers_APZTestData_h
 #define mozilla_layers_APZTestData_h
 
 #include <map>
 
 #include "gfxPrefs.h"
 #include "FrameMetrics.h"
 #include "nsDebug.h"             // for NS_WARNING
+#include "nsTArray.h"
 #include "mozilla/Assertions.h"  // for MOZ_ASSERT
 #include "mozilla/DebugOnly.h"   // for DebugOnly
 #include "mozilla/ToString.h"    // for ToString
+#include "mozilla/gfx/CompositorHitTestInfo.h"
 #include "ipc/IPCMessageUtils.h"
 #include "js/TypeDecls.h"
 
 namespace mozilla {
 namespace layers {
 
 typedef uint32_t SequenceNumber;
 
 /**
  * This structure is used to store information logged by various gecko
  * components for later examination by test code.
- * It consists of a bucket for every paint (initiated on the client side),
+ * It contains a bucket for every paint (initiated on the client side),
  * and every repaint request (initiated on the compositor side by
  * AsyncPanZoomController::RequestContentRepait), which are identified by
  * sequence numbers, and within that, a set of arbitrary string key/value
  * pairs for every scrollable frame, identified by a scroll id.
  * There are two instances of this data structure for every content thread:
  * one on the client side and one of the compositor side.
+ * It also contains a list of hit-test results for MozMouseHittest events
+ * dispatched during testing. This list is only populated on the compositor
+ * instance of this class.
  */
 // TODO(botond):
 //  - Improve warnings/asserts.
 //  - Add ability to associate a repaint request triggered during a layers update
 //    with the sequence number of the paint that caused the layers update.
 class APZTestData {
   typedef FrameMetrics::ViewID ViewID;
   friend struct IPC::ParamTraits<APZTestData>;
@@ -61,31 +66,43 @@ public:
     MOZ_ASSERT(((InsertResultT&)insertResult).second, "Already have a repaint request with this sequence number");
   }
   void LogTestDataForRepaintRequest(SequenceNumber aSequenceNumber,
                                     ViewID aScrollId,
                                     const std::string& aKey,
                                     const std::string& aValue) {
     LogTestDataImpl(mRepaintRequests, aSequenceNumber, aScrollId, aKey, aValue);
   }
+  void RecordHitResult(const ScreenPoint& aPoint,
+                       const mozilla::gfx::CompositorHitTestInfo& aResult,
+                       const ViewID& aScrollId)
+  {
+    mHitResults.AppendElement(HitResult { aPoint, aResult, aScrollId });
+  }
 
   // Convert this object to a JS representation.
   bool ToJS(JS::MutableHandleValue aOutValue, JSContext* aContext) const;
 
   // Use dummy derived structures wrapping the tyepdefs to work around a type
   // name length limit in MSVC.
   typedef std::map<std::string, std::string> ScrollFrameDataBase;
   struct ScrollFrameData : ScrollFrameDataBase {};
   typedef std::map<ViewID, ScrollFrameData> BucketBase;
   struct Bucket : BucketBase {};
   typedef std::map<SequenceNumber, Bucket> DataStoreBase;
   struct DataStore : DataStoreBase {};
+  struct HitResult {
+    ScreenPoint point;
+    mozilla::gfx::CompositorHitTestInfo result;
+    ViewID scrollId;
+  };
 private:
   DataStore mPaints;
   DataStore mRepaintRequests;
+  nsTArray<HitResult> mHitResults;
 
   void LogTestDataImpl(DataStore& aDataStore,
                        SequenceNumber aSequenceNumber,
                        ViewID aScrollId,
                        const std::string& aKey,
                        const std::string& aValue) {
     auto bucketIterator = aDataStore.find(aSequenceNumber);
     if (bucketIterator == aDataStore.end()) {
@@ -139,33 +156,55 @@ template <>
 struct ParamTraits<mozilla::layers::APZTestData>
 {
   typedef mozilla::layers::APZTestData paramType;
 
   static void Write(Message* aMsg, const paramType& aParam)
   {
     WriteParam(aMsg, aParam.mPaints);
     WriteParam(aMsg, aParam.mRepaintRequests);
+    WriteParam(aMsg, aParam.mHitResults);
   }
 
   static bool Read(const Message* aMsg, PickleIterator* aIter, paramType* aResult)
   {
     return (ReadParam(aMsg, aIter, &aResult->mPaints) &&
-            ReadParam(aMsg, aIter, &aResult->mRepaintRequests));
+            ReadParam(aMsg, aIter, &aResult->mRepaintRequests) &&
+            ReadParam(aMsg, aIter, &aResult->mHitResults));
   }
 };
 
 template <>
 struct ParamTraits<mozilla::layers::APZTestData::ScrollFrameData>
   : ParamTraits<mozilla::layers::APZTestData::ScrollFrameDataBase> {};
 
 template <>
 struct ParamTraits<mozilla::layers::APZTestData::Bucket>
   : ParamTraits<mozilla::layers::APZTestData::BucketBase> {};
 
 template <>
 struct ParamTraits<mozilla::layers::APZTestData::DataStore>
   : ParamTraits<mozilla::layers::APZTestData::DataStoreBase> {};
 
+template <>
+struct ParamTraits<mozilla::layers::APZTestData::HitResult>
+{
+  typedef mozilla::layers::APZTestData::HitResult paramType;
+
+  static void Write(Message* aMsg, const paramType& aParam)
+  {
+    WriteParam(aMsg, aParam.point);
+    WriteParam(aMsg, aParam.result);
+    WriteParam(aMsg, aParam.scrollId);
+  }
+
+  static bool Read(const Message* aMsg, PickleIterator* aIter, paramType* aResult)
+  {
+    return (ReadParam(aMsg, aIter, &aResult->point) &&
+            ReadParam(aMsg, aIter, &aResult->result) &&
+            ReadParam(aMsg, aIter, &aResult->scrollId));
+  }
+};
+
 } // namespace IPC
 
 
 #endif /* mozilla_layers_APZTestData_h */
--- a/gfx/layers/wr/WebRenderCommandBuilder.h
+++ b/gfx/layers/wr/WebRenderCommandBuilder.h
@@ -145,31 +145,30 @@ public:
     }
     RefPtr<T> res = static_cast<T*>(data.get());
     return res.forget();
   }
 
   template<class T> already_AddRefed<T>
   GetWebRenderUserData(nsIFrame* aFrame, uint32_t aPerFrameKey)
   {
-    RefPtr<T> result;
     MOZ_ASSERT(aFrame);
     nsIFrame::WebRenderUserDataTable* userDataTable =
       aFrame->GetProperty(nsIFrame::WebRenderUserDataProperty());
     if (!userDataTable) {
+      return nullptr;
+    }
+
+    RefPtr<WebRenderUserData> data = userDataTable->Get(aPerFrameKey);
+    if (data && (data->GetType() == T::Type()) && data->IsDataValid(mManager)) {
+      RefPtr<T> result = static_cast<T*>(data.get());
       return result.forget();
     }
 
-    WebRenderUserData* data = nullptr;
-    if (userDataTable->Get(aPerFrameKey, &data)) {
-      if (data->GetType() == T::Type() && data->IsDataValid(mManager)) {
-        result = static_cast<T*>(data);
-      }
-    }
-    return result.forget();
+    return nullptr;
   }
 
 private:
   WebRenderLayerManager* mManager;
   ScrollingLayersHelper mScrollingHelper;
 
   // These fields are used to save a copy of the display list for
   // empty transactions in layers-free mode.
--- a/gfx/layers/wr/WebRenderLayerManager.cpp
+++ b/gfx/layers/wr/WebRenderLayerManager.cpp
@@ -17,16 +17,20 @@
 #include "mozilla/layers/IpcResourceUpdateQueue.h"
 #include "mozilla/layers/StackingContextHelper.h"
 #include "mozilla/layers/TextureClient.h"
 #include "mozilla/layers/WebRenderBridgeChild.h"
 #include "mozilla/layers/UpdateImageHelper.h"
 #include "nsDisplayList.h"
 #include "WebRenderCanvasRenderer.h"
 
+// Useful for debugging, it dumps the Gecko display list *before* we try to
+// build WR commands from it, and dumps the WR display list after building it.
+#define DUMP_LISTS 0
+
 namespace mozilla {
 
 using namespace gfx;
 
 namespace layers {
 
 WebRenderLayerManager::WebRenderLayerManager(nsIWidget* aWidget)
   : mWidget(aWidget)
@@ -243,20 +247,20 @@ void
 WebRenderLayerManager::EndTransactionWithoutLayer(nsDisplayList* aDisplayList,
                                                   nsDisplayListBuilder* aDisplayListBuilder)
 {
   MOZ_ASSERT(aDisplayList && aDisplayListBuilder);
   WrBridge()->RemoveExpiredFontKeys();
 
   AUTO_PROFILER_TRACING("Paint", "RenderLayers");
 
-#if 0
+#if DUMP_LISTS
   // Useful for debugging, it dumps the display list *before* we try to build
   // WR commands from it
-  nsFrame::PrintDisplayList(aDisplayListBuilder, *aDisplayList);
+  if (XRE_IsContentProcess()) nsFrame::PrintDisplayList(aDisplayListBuilder, *aDisplayList);
 #endif
 
   // Since we don't do repeat transactions right now, just set the time
   mAnimationReadyTime = TimeStamp::Now();
 
   WrBridge()->BeginTransaction();
   DiscardCompositorAnimations();
 
@@ -301,16 +305,20 @@ WebRenderLayerManager::EndTransactionWit
   // device-reset status.
   if (!gfxPlatform::GetPlatform()->DidRenderingDeviceReset()) {
     if (WrBridge()->GetSyncObject() &&
         WrBridge()->GetSyncObject()->IsSyncObjectValid()) {
       WrBridge()->GetSyncObject()->Synchronize();
     }
   }
 
+#if DUMP_LISTS
+  if (XRE_IsContentProcess()) builder.Dump();
+#endif
+
   wr::BuiltDisplayList dl;
   builder.Finalize(contentSize, dl);
   mLastDisplayListSize = dl.dl.inner.capacity;
 
   {
     AUTO_PROFILER_TRACING("Paint", "ForwardDPTransaction");
     WrBridge()->EndTransaction(contentSize, dl, resourceUpdates, size.ToUnknownSize(),
                                mLatestTransactionId, mScrollData, transactionStart);
--- a/gfx/src/CompositorHitTestInfo.h
+++ b/gfx/src/CompositorHitTestInfo.h
@@ -40,16 +40,20 @@ enum class CompositorHitTestInfo : uint1
   eScrollbar = 1 << 6,
   // The frame is a scrollthumb. If this is set then eScrollbar will also be
   // set, unless gecko somehow generates a scroll thumb without a containing
   // scrollbar.
   eScrollbarThumb = 1 << 7,
   // If eScrollbar is set, this flag indicates if the scrollbar is a vertical
   // one (if set) or a horizontal one (if not set)
   eScrollbarVertical = 1 << 8,
+
+  // Used for IPDL serialization. This bitmask should include all the bits
+  // that are defined in the enum.
+  ALL_BITS = (1 << 9) - 1,
 };
 
 MOZ_MAKE_ENUM_CLASS_BITWISE_OPERATORS(CompositorHitTestInfo)
 
 } // namespace gfx
 } // namespace mozilla
 
 #endif /* MOZILLA_GFX_COMPOSITORHITTESTINFO_H_ */
--- a/gfx/thebes/gfxWindowsPlatform.cpp
+++ b/gfx/thebes/gfxWindowsPlatform.cpp
@@ -1567,16 +1567,23 @@ bool
 gfxWindowsPlatform::InitGPUProcessSupport()
 {
   FeatureState& gpuProc = gfxConfig::GetFeature(Feature::GPU_PROCESS);
 
   if (!gpuProc.IsEnabled()) {
     return false;
   }
 
+  nsCString message;
+  nsCString failureId;
+  if (!gfxPlatform::IsGfxInfoStatusOkay(nsIGfxInfo::FEATURE_GPU_PROCESS, &message, failureId)) {
+    gpuProc.Disable(FeatureStatus::Blacklisted, message.get(), failureId);
+    return false;
+  }
+
   if (!gfxConfig::IsEnabled(Feature::D3D11_COMPOSITING)) {
     // Don't use the GPU process if not using D3D11, unless software
     // compositor is allowed
     if (gfxPrefs::GPUProcessAllowSoftware()) {
       return gpuProc.IsEnabled();
     }
     gpuProc.Disable(
       FeatureStatus::Unavailable,
--- a/gfx/vr/ipc/VRManagerParent.cpp
+++ b/gfx/vr/ipc/VRManagerParent.cpp
@@ -244,16 +244,18 @@ VRManagerParent::RecvControllerListenerR
 
 mozilla::ipc::IPCResult
 VRManagerParent::RecvCreateVRTestSystem()
 {
   VRManager* vm = VRManager::Get();
   vm->CreateVRTestSystem();
   mDisplayTestID = 0;
   mControllerTestID = 0;
+  mVRDisplayTests.Clear();
+  mVRControllerTests.Clear();
   return IPC_OK();
 }
 
 mozilla::ipc::IPCResult
 VRManagerParent::RecvCreateVRServiceTestDisplay(const nsCString& aID, const uint32_t& aPromiseID)
 {
   nsTArray<VRDisplayInfo> displayInfoArray;
   impl::VRDisplayPuppet* displayPuppet = nullptr;
--- a/gfx/webrender_bindings/WebRenderAPI.cpp
+++ b/gfx/webrender_bindings/WebRenderAPI.cpp
@@ -685,16 +685,17 @@ DisplayListBuilder::~DisplayListBuilder(
 {
   MOZ_COUNT_DTOR(DisplayListBuilder);
   wr_state_delete(mWrState);
 }
 
 void DisplayListBuilder::Save() { wr_dp_save(mWrState); }
 void DisplayListBuilder::Restore() { wr_dp_restore(mWrState); }
 void DisplayListBuilder::ClearSave() { wr_dp_clear_save(mWrState); }
+void DisplayListBuilder::Dump() { wr_dump_display_list(mWrState); }
 
 void
 DisplayListBuilder::Finalize(wr::LayoutSize& aOutContentSize,
                              BuiltDisplayList& aOutDisplayList)
 {
   wr_api_finalize_builder(mWrState,
                           &aOutContentSize,
                           &aOutDisplayList.dl_desc,
--- a/gfx/webrender_bindings/WebRenderAPI.h
+++ b/gfx/webrender_bindings/WebRenderAPI.h
@@ -223,16 +223,17 @@ public:
                               size_t aCapacity = 0);
   DisplayListBuilder(DisplayListBuilder&&) = default;
 
   ~DisplayListBuilder();
 
   void Save();
   void Restore();
   void ClearSave();
+  void Dump();
 
   void Finalize(wr::LayoutSize& aOutContentSize,
                 wr::BuiltDisplayList& aOutDisplayList);
 
   void PushStackingContext(const wr::LayoutRect& aBounds, // TODO: We should work with strongly typed rects
                            const wr::WrAnimationProperty* aAnimation,
                            const float* aOpacity,
                            const gfx::Matrix4x4* aTransform,
--- a/gfx/webrender_bindings/src/bindings.rs
+++ b/gfx/webrender_bindings/src/bindings.rs
@@ -1933,16 +1933,23 @@ pub extern "C" fn wr_dp_push_box_shadow(
                           color,
                           blur_radius,
                           spread_radius,
                           border_radius,
                           clip_mode);
 }
 
 #[no_mangle]
+pub extern "C" fn wr_dump_display_list(state: &mut WrState) {
+    state.frame_builder
+         .dl_builder
+         .print_display_list();
+}
+
+#[no_mangle]
 pub unsafe extern "C" fn wr_api_finalize_builder(state: &mut WrState,
                                                  content_size: &mut LayoutSize,
                                                  dl_descriptor: &mut BuiltDisplayListDescriptor,
                                                  dl_data: &mut WrVecU8) {
     let frame_builder = mem::replace(&mut state.frame_builder,
                                      WebRenderFrameBuilder::new(state.pipeline_id,
                                                                 LayoutSize::zero()));
     let (_, size, dl) = frame_builder.dl_builder.finalize();
--- a/gfx/webrender_bindings/webrender_ffi_generated.h
+++ b/gfx/webrender_bindings/webrender_ffi_generated.h
@@ -1387,16 +1387,20 @@ WR_INLINE
 void wr_dp_restore(WrState *aState)
 WR_FUNC;
 
 WR_INLINE
 void wr_dp_save(WrState *aState)
 WR_FUNC;
 
 WR_INLINE
+void wr_dump_display_list(WrState *aState)
+WR_FUNC;
+
+WR_INLINE
 void wr_init_external_log_handler(WrLogLevelFilter aLogFilter)
 WR_FUNC;
 
 extern bool wr_moz2d_render_cb(ByteSlice aBlob,
                                uint32_t aWidth,
                                uint32_t aHeight,
                                ImageFormat aFormat,
                                const uint16_t *aTileSize,
--- a/js/src/builtin/Intl.cpp
+++ b/js/src/builtin/Intl.cpp
@@ -791,22 +791,30 @@ ureldatefmt_open(const char* locale, UNu
 void
 ureldatefmt_close(URelativeDateTimeFormatter *reldatefmt)
 {
     MOZ_CRASH("ureldatefmt_close: Intl API disabled");
 }
 
 int32_t
 ureldatefmt_format(const URelativeDateTimeFormatter* reldatefmt, double offset,
-                    URelativeDateTimeUnit unit, UChar* result, int32_t resultCapacity,
-                    UErrorCode* status)
+                   URelativeDateTimeUnit unit, UChar* result, int32_t resultCapacity,
+                   UErrorCode* status)
 {
     MOZ_CRASH("ureldatefmt_format: Intl API disabled");
 }
 
+int32_t
+ureldatefmt_formatNumeric(const URelativeDateTimeFormatter* reldatefmt, double offset,
+                          URelativeDateTimeUnit unit, UChar* result, int32_t resultCapacity,
+                          UErrorCode* status)
+{
+    MOZ_CRASH("ureldatefmt_formatNumeric: Intl API disabled");
+}
+
 #endif
 
 
 /******************** Common to Intl constructors ********************/
 
 static bool
 IntlInitialize(JSContext* cx, HandleObject obj, Handle<PropertyName*> initializer,
                HandleValue locales, HandleValue options)
@@ -4010,16 +4018,29 @@ js::intl_RelativeTimeFormat_availableLoc
     // We're going to use ULocale availableLocales as per ICU recommendation:
     // https://ssl.icu-project.org/trac/ticket/12756
     if (!intl_availableLocales(cx, uloc_countAvailable, uloc_getAvailable, &result))
         return false;
     args.rval().set(result);
     return true;
 }
 
+enum class RelativeTimeType
+{
+    /**
+     * Only strings with numeric components like `1 day ago`.
+     */
+    Numeric,
+    /**
+     * Natural-language strings like `yesterday` when possible,
+     * otherwise strings with numeric components as in `7 months ago`.
+     */
+    Text,
+};
+
 bool
 js::intl_FormatRelativeTime(JSContext* cx, unsigned argc, Value* vp)
 {
     CallArgs args = CallArgsFromVp(argc, vp);
     MOZ_ASSERT(args.length() == 3);
 
     RootedObject relativeTimeFormat(cx, &args[0].toObject());
 
@@ -4051,16 +4072,33 @@ js::intl_FormatRelativeTime(JSContext* c
         } else if (StringEqualsAscii(style, "narrow")) {
             relDateTimeStyle = UDAT_STYLE_NARROW;
         } else {
             MOZ_ASSERT(StringEqualsAscii(style, "long"));
             relDateTimeStyle = UDAT_STYLE_LONG;
         }
     }
 
+    if (!GetProperty(cx, internals, internals, cx->names().type, &value))
+        return false;
+
+    RelativeTimeType relDateTimeType;
+    {
+        JSLinearString* type = value.toString()->ensureLinear(cx);
+        if (!type)
+            return false;
+
+        if (StringEqualsAscii(type, "text")) {
+            relDateTimeType = RelativeTimeType::Text;
+        } else {
+            MOZ_ASSERT(StringEqualsAscii(type, "numeric"));
+            relDateTimeType = RelativeTimeType::Numeric;
+        }
+    }
+
     URelativeDateTimeUnit relDateTimeUnit;
     {
         JSLinearString* unit = args[2].toString()->ensureLinear(cx);
         if (!unit)
             return false;
 
         if (StringEqualsAscii(unit, "second")) {
             relDateTimeUnit = UDAT_REL_UNIT_SECOND;
@@ -4093,18 +4131,21 @@ js::intl_FormatRelativeTime(JSContext* c
                          UDISPCTX_CAPITALIZATION_FOR_STANDALONE, &status);
     if (U_FAILURE(status)) {
         JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_INTERNAL_INTL_ERROR);
         return false;
     }
 
     ScopedICUObject<URelativeDateTimeFormatter, ureldatefmt_close> closeRelativeTimeFormat(rtf);
 
-    JSString* str = Call(cx, [rtf, t, relDateTimeUnit](UChar* chars, int32_t size, UErrorCode* status) {
-        return ureldatefmt_format(rtf, t, relDateTimeUnit, chars, size, status);
+    JSString* str = Call(cx, [rtf, t, relDateTimeUnit, relDateTimeType](UChar* chars, int32_t size, UErrorCode* status) {
+        auto fmt = relDateTimeType == RelativeTimeType::Text
+                   ? ureldatefmt_format
+                   : ureldatefmt_formatNumeric;
+        return fmt(rtf, t, relDateTimeUnit, chars, size, status);
     });
     if (!str)
         return false;
 
     args.rval().setString(str);
     return true;
 }
 
--- a/js/src/builtin/Intl.js
+++ b/js/src/builtin/Intl.js
@@ -3612,16 +3612,17 @@ function resolveRelativeTimeFormatIntern
                             lazyRelativeTimeFormatData.requestedLocales,
                             lazyRelativeTimeFormatData.opt,
                             RelativeTimeFormat.relevantExtensionKeys,
                             RelativeTimeFormat.localeData);
 
     // Step 17.
     internalProps.locale = r.locale;
     internalProps.style = lazyRelativeTimeFormatData.style;
+    internalProps.type = lazyRelativeTimeFormatData.type;
 
     return internalProps;
 }
 
 /**
  * Returns an object containing the RelativeTimeFormat internal properties of |obj|,
  * or throws a TypeError if |obj| isn't RelativeTimeFormat-initialized.
  */
@@ -3658,16 +3659,17 @@ function InitializeRelativeTimeFormat(re
     assert(IsRelativeTimeFormat(relativeTimeFormat),
            "InitializeRelativeTimeFormat called with non-RelativeTimeFormat");
 
     // Lazy RelativeTimeFormat data has the following structure:
     //
     //   {
     //     requestedLocales: List of locales,
     //     style: "long" / "short" / "narrow",
+    //     type: "numeric" / "text",
     //
     //     opt: // opt object computer in InitializeRelativeTimeFormat
     //       {
     //         localeMatcher: "lookup" / "best fit",
     //       }
     //   }
     //
     // Note that lazy data is only installed as a final step of initialization,
@@ -3693,16 +3695,21 @@ function InitializeRelativeTimeFormat(re
     opt.localeMatcher = matcher;
 
     lazyRelativeTimeFormatData.opt = opt;
 
     // Steps 13-14.
     const style = GetOption(options, "style", "string", ["long", "short", "narrow"], "long");
     lazyRelativeTimeFormatData.style = style;
 
+    // This option is in the process of being added to the spec.
+    // See: https://github.com/tc39/proposal-intl-relative-time/issues/9
+    const type = GetOption(options, "type", "string", ["numeric", "text"], "numeric");
+    lazyRelativeTimeFormatData.type = type;
+
     initializeIntlObject(relativeTimeFormat, "RelativeTimeFormat", lazyRelativeTimeFormatData);
 }
 
 /**
  * Returns the subset of the given locale list for which this locale list has a
  * matching (possibly fallback) locale. Locales appear in the same order in the
  * returned list as in the input list.
  *
@@ -3775,16 +3782,17 @@ function Intl_RelativeTimeFormat_resolve
                        "RelativeTimeFormat");
     }
 
     var internals = getRelativeTimeFormatInternals(this, "resolvedOptions");
 
     var result = {
         locale: internals.locale,
         style: internals.style,
+        type: internals.type,
     };
 
     return result;
 }
 
 
 /********** Intl **********/
 
--- a/js/src/tests/Intl/RelativeTimeFormat/format.js
+++ b/js/src/tests/Intl/RelativeTimeFormat/format.js
@@ -4,58 +4,101 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 // Tests the format function with a diverse set of locales and options.
 
 var rtf;
 
 addIntlExtras(Intl);
 
+{
+  // Numeric format
+  rtf = new Intl.RelativeTimeFormat("en-US");
+  assertEq(rtf.format(0, "second"), "in 0 seconds");
+  assertEq(rtf.format(-0, "second"), "in 0 seconds");
+  assertEq(rtf.format(-1, "second"), "1 second ago");
+  assertEq(rtf.format(1, "second"), "in 1 second");
 
-rtf = new Intl.RelativeTimeFormat("en-US");
-assertEq(rtf.format(0, "second"), "now");
-assertEq(rtf.format(-0, "second"), "now");
-assertEq(rtf.format(-1, "second"), "1 second ago");
-assertEq(rtf.format(1, "second"), "in 1 second");
+  assertEq(rtf.format(0, "minute"), "in 0 minutes");
+  assertEq(rtf.format(-0, "minute"), "in 0 minutes");
+  assertEq(rtf.format(-1, "minute"), "1 minute ago");
+  assertEq(rtf.format(1, "minute"), "in 1 minute");
+
+  assertEq(rtf.format(0, "hour"), "in 0 hours");
+  assertEq(rtf.format(-0, "hour"), "in 0 hours");
+  assertEq(rtf.format(-1, "hour"), "1 hour ago");
+  assertEq(rtf.format(1, "hour"), "in 1 hour");
 
-assertEq(rtf.format(0, "minute"), "in 0 minutes");
-assertEq(rtf.format(-0, "minute"), "in 0 minutes");
-assertEq(rtf.format(-1, "minute"), "1 minute ago");
-assertEq(rtf.format(1, "minute"), "in 1 minute");
+  assertEq(rtf.format(0, "day"), "in 0 days");
+  assertEq(rtf.format(-0, "day"), "in 0 days");
+  assertEq(rtf.format(-1, "day"), "1 day ago");
+  assertEq(rtf.format(1, "day"), "in 1 day");
+
+  assertEq(rtf.format(0, "week"), "in 0 weeks");
+  assertEq(rtf.format(-0, "week"), "in 0 weeks");
+  assertEq(rtf.format(-1, "week"), "1 week ago");
+  assertEq(rtf.format(1, "week"), "in 1 week");
 
-assertEq(rtf.format(0, "hour"), "in 0 hours");
-assertEq(rtf.format(-0, "hour"), "in 0 hours");
-assertEq(rtf.format(-1, "hour"), "1 hour ago");
-assertEq(rtf.format(1, "hour"), "in 1 hour");
+  assertEq(rtf.format(0, "month"), "in 0 months");
+  assertEq(rtf.format(-0, "month"), "in 0 months");
+  assertEq(rtf.format(-1, "month"), "1 month ago");
+  assertEq(rtf.format(1, "month"), "in 1 month");
+
+  assertEq(rtf.format(0, "year"), "in 0 years");
+  assertEq(rtf.format(-0, "year"), "in 0 years");
+  assertEq(rtf.format(-1, "year"), "1 year ago");
+  assertEq(rtf.format(1, "year"), "in 1 year");
+}
 
-assertEq(rtf.format(0, "day"), "today");
-assertEq(rtf.format(-0, "day"), "today");
-assertEq(rtf.format(-1, "day"), "yesterday");
-assertEq(rtf.format(1, "day"), "tomorrow");
+{
+  // Text format
+  rtf = new Intl.RelativeTimeFormat("en-US", {
+    type: "text"
+  });
+  assertEq(rtf.format(0, "second"), "now");
+  assertEq(rtf.format(-0, "second"), "now");
+  assertEq(rtf.format(-1, "second"), "1 second ago");
+  assertEq(rtf.format(1, "second"), "in 1 second");
 
-assertEq(rtf.format(0, "week"), "this week");
-assertEq(rtf.format(-0, "week"), "this week");
-assertEq(rtf.format(-1, "week"), "last week");
-assertEq(rtf.format(1, "week"), "next week");
+  assertEq(rtf.format(0, "minute"), "in 0 minutes");
+  assertEq(rtf.format(-0, "minute"), "in 0 minutes");
+  assertEq(rtf.format(-1, "minute"), "1 minute ago");
+  assertEq(rtf.format(1, "minute"), "in 1 minute");
+
+  assertEq(rtf.format(0, "hour"), "in 0 hours");
+  assertEq(rtf.format(-0, "hour"), "in 0 hours");
+  assertEq(rtf.format(-1, "hour"), "1 hour ago");
+  assertEq(rtf.format(1, "hour"), "in 1 hour");
 
-assertEq(rtf.format(0, "month"), "this month");
-assertEq(rtf.format(-0, "month"), "this month");
-assertEq(rtf.format(-1, "month"), "last month");
-assertEq(rtf.format(1, "month"), "next month");
+  assertEq(rtf.format(0, "day"), "today");
+  assertEq(rtf.format(-0, "day"), "today");
+  assertEq(rtf.format(-1, "day"), "yesterday");
+  assertEq(rtf.format(1, "day"), "tomorrow");
+
+  assertEq(rtf.format(0, "week"), "this week");
+  assertEq(rtf.format(-0, "week"), "this week");
+  assertEq(rtf.format(-1, "week"), "last week");
+  assertEq(rtf.format(1, "week"), "next week");
 
-assertEq(rtf.format(0, "year"), "this year");
-assertEq(rtf.format(-0, "year"), "this year");
-assertEq(rtf.format(-1, "year"), "last year");
-assertEq(rtf.format(1, "year"), "next year");
+  assertEq(rtf.format(0, "month"), "this month");
+  assertEq(rtf.format(-0, "month"), "this month");
+  assertEq(rtf.format(-1, "month"), "last month");
+  assertEq(rtf.format(1, "month"), "next month");
 
-rtf = new Intl.RelativeTimeFormat("de");
+  assertEq(rtf.format(0, "year"), "this year");
+  assertEq(rtf.format(-0, "year"), "this year");
+  assertEq(rtf.format(-1, "year"), "last year");
+  assertEq(rtf.format(1, "year"), "next year");
+}
+
+rtf = new Intl.RelativeTimeFormat("de", {type: "text"});
 assertEq(rtf.format(-1, "day"), "gestern");
 assertEq(rtf.format(1, "day"), "morgen");
 
-rtf = new Intl.RelativeTimeFormat("ar");
+rtf = new Intl.RelativeTimeFormat("ar", {type: "text"});
 assertEq(rtf.format(-1, "day"), "أمس");
 assertEq(rtf.format(1, "day"), "غدًا");
 
 
 rtf = new Intl.RelativeTimeFormat("en-US");
 assertEq(rtf.format(Infinity, "year"), "in ∞ years");
 assertEq(rtf.format(-Infinity, "year"), "∞ years ago");
 
--- a/layout/generic/nsFrame.cpp
+++ b/layout/generic/nsFrame.cpp
@@ -2931,16 +2931,18 @@ nsIFrame::BuildDisplayListForStackingCon
 
   nsDisplayListCollection set(aBuilder);
   {
     DisplayListClipState::AutoSaveRestore nestedClipState(aBuilder);
     nsDisplayListBuilder::AutoInTransformSetter
       inTransformSetter(aBuilder, inTransform);
     nsDisplayListBuilder::AutoSaveRestorePerspectiveIndex
       perspectiveIndex(aBuilder, this);
+    nsDisplayListBuilder::AutoFilterASRSetter
+      filterASRSetter(aBuilder, usingFilter);
 
     CheckForApzAwareEventHandlers(aBuilder, this);
 
     Maybe<nsRect> contentClip =
       GetClipPropClipRect(disp, effects, GetSize());
 
     if (usingMask) {
       contentClip = IntersectMaybeRects(contentClip, clipForMask);
--- a/layout/generic/nsGfxScrollFrame.cpp
+++ b/layout/generic/nsGfxScrollFrame.cpp
@@ -1296,16 +1296,22 @@ ScrollFrameHelper::SetZoomableByAPZ(bool
   if (mZoomableByAPZ != aZoomable) {
     // We might be changing the result of WantAsyncScroll() so schedule a
     // paint to make sure we pick up the result of that change.
     mZoomableByAPZ = aZoomable;
     mOuter->SchedulePaint();
   }
 }
 
+void
+ScrollFrameHelper::SetHasOutOfFlowContentInsideFilter()
+{
+  mHasOutOfFlowContentInsideFilter = true;
+}
+
 bool
 ScrollFrameHelper::WantAsyncScroll() const
 {
   // If zooming is allowed, and this is a frame that's allowed to zoom, then
   // we want it to be async-scrollable or zooming will not be permitted.
   if (mZoomableByAPZ) {
     return true;
   }
@@ -2070,16 +2076,17 @@ ScrollFrameHelper::ScrollFrameHelper(nsC
   , mWillBuildScrollableLayer(false)
   , mIsScrollParent(false)
   , mIsScrollableLayerInRootContainer(false)
   , mHasBeenScrolled(false)
   , mIgnoreMomentumScroll(false)
   , mTransformingByAPZ(false)
   , mScrollableByAPZ(false)
   , mZoomableByAPZ(false)
+  , mHasOutOfFlowContentInsideFilter(false)
   , mSuppressScrollbarRepaints(false)
   , mVelocityQueue(aOuter->PresContext())
 {
   if (LookAndFeel::GetInt(LookAndFeel::eIntID_UseOverlayScrollbars) != 0) {
     mScrollbarActivity = new ScrollbarActivity(do_QueryFrame(aOuter));
   }
 
   EnsureFrameVisPrefsCached();
@@ -2874,23 +2881,25 @@ ScrollFrameHelper::ScrollToImpl(nsPoint 
     // that needs to be painted. So even if the final tile-aligned displayport
     // is the same, we force a repaint for these elements. Bug 1254260 tracks
     // fixing this properly.
     nsRect displayPort;
     bool usingDisplayPort =
       nsLayoutUtils::GetHighResolutionDisplayPort(content, &displayPort);
     displayPort.MoveBy(-mScrolledFrame->GetPosition());
 
-    PAINT_SKIP_LOG("New scrollpos %s usingDP %d dpEqual %d scrollableByApz %d plugins %d perspective %d bglocal %d\n",
+    PAINT_SKIP_LOG("New scrollpos %s usingDP %d dpEqual %d scrollableByApz %d plugins"
+        "%d perspective %d bglocal %d filter %d\n",
         Stringify(CSSPoint::FromAppUnits(GetScrollPosition())).c_str(),
         usingDisplayPort, displayPort.IsEqualEdges(oldDisplayPort),
         mScrollableByAPZ, HasPluginFrames(), HasPerspective(),
-        HasBgAttachmentLocal());
+        HasBgAttachmentLocal(), mHasOutOfFlowContentInsideFilter);
     if (usingDisplayPort && displayPort.IsEqualEdges(oldDisplayPort) &&
-        !HasPerspective() && !HasBgAttachmentLocal()) {
+        !HasPerspective() && !HasBgAttachmentLocal() &&
+        !mHasOutOfFlowContentInsideFilter) {
       bool haveScrollLinkedEffects = content->GetComposedDoc()->HasScrollLinkedEffect();
       bool apzDisabled = haveScrollLinkedEffects && gfxPrefs::APZDisableForScrollLinkedEffects();
       if (!apzDisabled && !HasPluginFrames()) {
         if (LastScrollOrigin() == nsGkAtoms::apz) {
           schedulePaint = false;
           PAINT_SKIP_LOG("Skipping due to APZ scroll\n");
         } else if (mScrollableByAPZ) {
           nsIWidget* widget = presContext->GetNearestWidget();
--- a/layout/generic/nsGfxScrollFrame.h
+++ b/layout/generic/nsGfxScrollFrame.h
@@ -421,16 +421,17 @@ public:
       mOuter->SchedulePaint();
     }
   }
   bool IsTransformingByAPZ() const {
     return mTransformingByAPZ;
   }
   void SetScrollableByAPZ(bool aScrollable);
   void SetZoomableByAPZ(bool aZoomable);
+  void SetHasOutOfFlowContentInsideFilter();
 
   bool UsesContainerScrolling() const;
 
   ScrollSnapInfo GetScrollSnapInfo() const;
 
   bool DecideScrollableLayer(nsDisplayListBuilder* aBuilder,
                              nsRect* aVisibleRect,
                              nsRect* aDirtyRect,
@@ -627,16 +628,20 @@ public:
 
   // True if APZ can scroll this frame asynchronously (i.e. it has an APZC
   // set up for this frame and it's not a scrollinfo layer).
   bool mScrollableByAPZ:1;
 
   // True if the APZ is allowed to zoom this scrollframe.
   bool mZoomableByAPZ:1;
 
+  // True if the scroll frame contains out-of-flow content and is inside
+  // a CSS filter.
+  bool mHasOutOfFlowContentInsideFilter:1;
+
   // True if we don't want the scrollbar to repaint itself right now.
   bool mSuppressScrollbarRepaints:1;
 
   mozilla::layout::ScrollVelocityQueue mVelocityQueue;
 
 protected:
   class AutoScrollbarRepaintSuppression;
   friend class AutoScrollbarRepaintSuppression;
@@ -1057,16 +1062,19 @@ public:
     return mHelper.IsTransformingByAPZ();
   }
   void SetScrollableByAPZ(bool aScrollable) override {
     mHelper.SetScrollableByAPZ(aScrollable);
   }
   void SetZoomableByAPZ(bool aZoomable) override {
     mHelper.SetZoomableByAPZ(aZoomable);
   }
+  void SetHasOutOfFlowContentInsideFilter() override {
+    mHelper.SetHasOutOfFlowContentInsideFilter();
+  }
 
   ScrollSnapInfo GetScrollSnapInfo() const override {
     return mHelper.GetScrollSnapInfo();
   }
 
   virtual bool DragScroll(mozilla::WidgetEvent* aEvent) override {
     return mHelper.DragScroll(aEvent);
   }
@@ -1492,16 +1500,19 @@ public:
     return mHelper.IsTransformingByAPZ();
   }
   void SetScrollableByAPZ(bool aScrollable) override {
     mHelper.SetScrollableByAPZ(aScrollable);
   }
   void SetZoomableByAPZ(bool aZoomable) override {
     mHelper.SetZoomableByAPZ(aZoomable);
   }
+  void SetHasOutOfFlowContentInsideFilter() override {
+    mHelper.SetHasOutOfFlowContentInsideFilter();
+  }
   virtual bool DecideScrollableLayer(nsDisplayListBuilder* aBuilder,
                                      nsRect* aVisibleRect,
                                      nsRect* aDirtyRect,
                                      bool aSetBase) override {
     return mHelper.DecideScrollableLayer(aBuilder, aVisibleRect, aDirtyRect, aSetBase);
   }
   virtual void NotifyApproximateFrameVisibilityUpdate(bool aIgnoreDisplayPort) override {
     mHelper.NotifyApproximateFrameVisibilityUpdate(aIgnoreDisplayPort);
--- a/layout/generic/nsIScrollableFrame.h
+++ b/layout/generic/nsIScrollableFrame.h
@@ -444,16 +444,23 @@ public:
   virtual void SetScrollableByAPZ(bool aScrollable) = 0;
 
   /**
    * Notify this scroll frame that it can be zoomed by APZ.
    */
   virtual void SetZoomableByAPZ(bool aZoomable) = 0;
 
   /**
+   * Mark this scroll frame as having out-of-flow content inside a CSS filter.
+   * Such content will move incorrectly during async-scrolling; to mitigate
+   * this, paint skipping is disabled for such scroll frames.
+   */
+  virtual void SetHasOutOfFlowContentInsideFilter() = 0;
+
+  /**
    * Whether or not this frame uses containerful scrolling.
    */
   virtual bool UsesContainerScrolling() const = 0;
 
   /**
    * Determine if we should build a scrollable layer for this scroll frame and
    * return the result. It will also record this result on the scroll frame.
    * Pass the visible rect in aVisibleRect. On return it will be set to the
--- a/layout/painting/nsDisplayList.cpp
+++ b/layout/painting/nsDisplayList.cpp
@@ -878,16 +878,67 @@ nsDisplayListBuilder::MergeItems(nsTArra
     // of the temporary item.
     merged->MergeDisplayListFromItem(this, item);
   }
 
   return merged;
 }
 
 void
+nsDisplayListBuilder::AutoCurrentActiveScrolledRootSetter::SetCurrentActiveScrolledRoot(
+    const ActiveScrolledRoot* aActiveScrolledRoot)
+{
+  MOZ_ASSERT(!mUsed);
+
+  // Set the builder's mCurrentActiveScrolledRoot.
+  mBuilder->mCurrentActiveScrolledRoot = aActiveScrolledRoot;
+
+  // We also need to adjust the builder's mCurrentContainerASR.
+  // mCurrentContainerASR needs to be an ASR that all the container's
+  // contents have finite bounds with respect to. If aActiveScrolledRoot
+  // is an ancestor ASR of mCurrentContainerASR, that means we need to
+  // set mCurrentContainerASR to aActiveScrolledRoot, because otherwise
+  // the items that will be created with aActiveScrolledRoot wouldn't
+  // have finite bounds with respect to mCurrentContainerASR. There's one
+  // exception, in the case where there's a content clip on the builder
+  // that is scrolled by a descendant ASR of aActiveScrolledRoot. This
+  // content clip will clip all items that are created while this
+  // AutoCurrentActiveScrolledRootSetter exists. This means that the items
+  // created during our lifetime will have finite bounds with respect to
+  // the content clip's ASR, even if the items' actual ASR is an ancestor
+  // of that. And it also means that mCurrentContainerASR only needs to be
+  // set to the content clip's ASR and not all the way to aActiveScrolledRoot.
+  // This case is tested by fixed-pos-scrolled-clip-opacity-layerize.html
+  // and fixed-pos-scrolled-clip-opacity-inside-layerize.html.
+
+  // finiteBoundsASR is the leafmost ASR that all items created during
+  // object's lifetime have finite bounds with respect to.
+  const ActiveScrolledRoot* finiteBoundsASR = ActiveScrolledRoot::PickDescendant(
+    mContentClipASR, aActiveScrolledRoot);
+
+  // mCurrentContainerASR is adjusted so that it's still an ancestor of
+  // finiteBoundsASR.
+  mBuilder->mCurrentContainerASR = ActiveScrolledRoot::PickAncestor(
+    mBuilder->mCurrentContainerASR, finiteBoundsASR);
+
+  // If we are entering out-of-flow content inside a CSS filter, mark
+  // scroll frames wrt. which the content is fixed as containing such content.
+  if (mBuilder->mFilterASR &&
+      ActiveScrolledRoot::IsAncestor(aActiveScrolledRoot, mBuilder->mFilterASR)) {
+    for (const ActiveScrolledRoot* asr = mBuilder->mFilterASR;
+         asr && asr != aActiveScrolledRoot;
+         asr = asr->mParent) {
+      asr->mScrollableFrame->SetHasOutOfFlowContentInsideFilter();
+    }
+  }
+
+  mUsed = true;
+}
+
+void
 nsDisplayListBuilder::AutoCurrentActiveScrolledRootSetter::InsertScrollFrame(nsIScrollableFrame* aScrollableFrame)
 {
   MOZ_ASSERT(!mUsed);
   size_t descendantsEndIndex = mBuilder->mActiveScrolledRoots.Length();
   const ActiveScrolledRoot* parentASR = mBuilder->mCurrentActiveScrolledRoot;
   const ActiveScrolledRoot* asr = mBuilder->AllocateActiveScrolledRoot(parentASR, aScrollableFrame);
   mBuilder->mCurrentActiveScrolledRoot = asr;
 
@@ -925,16 +976,17 @@ nsDisplayListBuilder::nsDisplayListBuild
       mScrollInfoItemsForHoisting(nullptr),
       mActiveScrolledRootForRootScrollframe(nullptr),
       mMode(aMode),
       mCurrentScrollParentId(FrameMetrics::NULL_SCROLL_ID),
       mCurrentScrollbarTarget(FrameMetrics::NULL_SCROLL_ID),
       mCurrentScrollbarFlags(nsDisplayOwnLayerFlags::eNone),
       mPerspectiveItemIndex(0),
       mSVGEffectsBuildingDepth(0),
+      mFilterASR(nullptr),
       mContainsBlendMode(false),
       mIsBuildingScrollbar(false),
       mCurrentScrollbarWillHaveLayer(false),
       mBuildCaret(aBuildCaret),
       mRetainingDisplayList(aRetainingDisplayList),
       mPartialUpdate(false),
       mIgnoreSuppression(false),
       mIsAtRootOfPseudoStackingContext(false),
@@ -2149,16 +2201,22 @@ nsDisplayListBuilder::AppendNewScrollInf
   MOZ_ASSERT(ShouldBuildScrollInfoItemsForHoisting());
   MOZ_ASSERT(mScrollInfoItemsForHoisting);
   mScrollInfoItemsForHoisting->AppendNewToTop(aScrollInfoItem);
 }
 
 bool
 nsDisplayListBuilder::IsBuildingLayerEventRegions()
 {
+  if (mBuildCompositorHitTestInfo) {
+    // If we have webrender hit-testing enabled, then we will build the
+    // nsDisplayCompositorHitTestInfo items and use those instead of event
+    // regions, so we don't need to build the event regions.
+    return false;
+  }
   if (IsPaintingToWindow()) {
     // Note: this function and LayerEventRegionsEnabled are the only places
     // that get to query LayoutEventRegionsEnabled 'directly' - other code
     // should call this function.
     return gfxPrefs::LayoutEventRegionsEnabledDoNotUseDirectly() ||
            mAsyncPanZoomEnabled;
   }
   return false;
--- a/layout/painting/nsDisplayList.h
+++ b/layout/painting/nsDisplayList.h
@@ -1120,16 +1120,38 @@ public:
     ~AutoInTransformSetter() {
       mBuilder->mInTransform = mOldValue;
     }
   private:
     nsDisplayListBuilder* mBuilder;
     bool                  mOldValue;
   };
 
+  /**
+   * A helper class to temporarily set the value of mFilterASR.
+   */
+  class AutoFilterASRSetter;
+  friend class AutoFilterASRSetter;
+  class AutoFilterASRSetter {
+  public:
+    AutoFilterASRSetter(nsDisplayListBuilder* aBuilder, bool aUsingFilter)
+      : mBuilder(aBuilder), mOldValue(aBuilder->mFilterASR)
+    {
+      if (!aBuilder->mFilterASR && aUsingFilter) {
+        aBuilder->mFilterASR = aBuilder->CurrentActiveScrolledRoot();
+      }
+    }
+    ~AutoFilterASRSetter() {
+      mBuilder->mFilterASR = mOldValue;
+    }
+  private:
+    nsDisplayListBuilder* mBuilder;
+    const ActiveScrolledRoot* mOldValue;
+  };
+
   class AutoSaveRestorePerspectiveIndex;
   friend class AutoSaveRestorePerspectiveIndex;
   class AutoSaveRestorePerspectiveIndex {
   public:
     AutoSaveRestorePerspectiveIndex(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame)
       : mBuilder(nullptr)
     {
       if (aFrame->ChildrenHavePerspective()) {
@@ -1213,53 +1235,17 @@ public:
     {
     }
 
     ~AutoCurrentActiveScrolledRootSetter()
     {
       mBuilder->mCurrentActiveScrolledRoot = mSavedActiveScrolledRoot;
     }
 
-    void SetCurrentActiveScrolledRoot(const ActiveScrolledRoot* aActiveScrolledRoot)
-    {
-      MOZ_ASSERT(!mUsed);
-
-      // Set the builder's mCurrentActiveScrolledRoot.
-      mBuilder->mCurrentActiveScrolledRoot = aActiveScrolledRoot;
-
-      // We also need to adjust the builder's mCurrentContainerASR.
-      // mCurrentContainerASR needs to be an ASR that all the container's
-      // contents have finite bounds with respect to. If aActiveScrolledRoot
-      // is an ancestor ASR of mCurrentContainerASR, that means we need to
-      // set mCurrentContainerASR to aActiveScrolledRoot, because otherwise
-      // the items that will be created with aActiveScrolledRoot wouldn't
-      // have finite bounds with respect to mCurrentContainerASR. There's one
-      // exception, in the case where there's a content clip on the builder
-      // that is scrolled by a descendant ASR of aActiveScrolledRoot. This
-      // content clip will clip all items that are created while this
-      // AutoCurrentActiveScrolledRootSetter exists. This means that the items
-      // created during our lifetime will have finite bounds with respect to
-      // the content clip's ASR, even if the items' actual ASR is an ancestor
-      // of that. And it also means that mCurrentContainerASR only needs to be
-      // set to the content clip's ASR and not all the way to aActiveScrolledRoot.
-      // This case is tested by fixed-pos-scrolled-clip-opacity-layerize.html
-      // and fixed-pos-scrolled-clip-opacity-inside-layerize.html.
-
-      // finiteBoundsASR is the leafmost ASR that all items created during
-      // object's lifetime have finite bounds with respect to.
-      const ActiveScrolledRoot* finiteBoundsASR = ActiveScrolledRoot::PickDescendant(
-        mContentClipASR, aActiveScrolledRoot);
-
-      // mCurrentContainerASR is adjusted so that it's still an ancestor of
-      // finiteBoundsASR.
-      mBuilder->mCurrentContainerASR = ActiveScrolledRoot::PickAncestor(
-        mBuilder->mCurrentContainerASR, finiteBoundsASR);
-
-      mUsed = true;
-    }
+    void SetCurrentActiveScrolledRoot(const ActiveScrolledRoot* aActiveScrolledRoot);
 
     void EnterScrollFrame(nsIScrollableFrame* aScrollableFrame)
     {
       MOZ_ASSERT(!mUsed);
       ActiveScrolledRoot* asr = mBuilder->AllocateActiveScrolledRoot(
         mBuilder->mCurrentActiveScrolledRoot, aScrollableFrame);
       mBuilder->mCurrentActiveScrolledRoot = asr;
       mUsed = true;
@@ -1802,16 +1788,19 @@ private:
   const ActiveScrolledRoot*      mActiveScrolledRootForRootScrollframe;
   nsDisplayListBuilderMode       mMode;
   ViewID                         mCurrentScrollParentId;
   ViewID                         mCurrentScrollbarTarget;
   nsDisplayOwnLayerFlags         mCurrentScrollbarFlags;
   Preserves3DContext             mPreserves3DCtx;
   uint32_t                       mPerspectiveItemIndex;
   int32_t                        mSVGEffectsBuildingDepth;
+  // When we are inside a filter, the current ASR at the time we entered the
+  // filter. Otherwise nullptr.
+  const ActiveScrolledRoot*      mFilterASR;
   bool                           mContainsBlendMode;
   bool                           mIsBuildingScrollbar;
   bool                           mCurrentScrollbarWillHaveLayer;
   bool                           mBuildCaret;
   bool                           mRetainingDisplayList;
   bool                           mPartialUpdate;
   bool                           mIgnoreSuppression;
   bool                           mIsAtRootOfPseudoStackingContext;
new file mode 100644
--- /dev/null
+++ b/layout/reftests/bugs/1035091-2.html
@@ -0,0 +1,8 @@
+<!doctype html>
+<style>
+div { color: green; }
+@-moz-document url-prefix() {
+  div { color: red; }
+}
+</style>
+<div>Should be green</div>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/bugs/1035091-ref.html
@@ -0,0 +1,2 @@
+<!doctype html>
+<div style="color: green;">Should be green</div>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/bugs/1035091.html
@@ -0,0 +1,7 @@
+<!doctype html>
+<style>
+@-moz-document url-prefix() {
+  div { color: green; }
+}
+</style>
+<div>Should be green</div>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/bugs/1420946-1-ref.html
@@ -0,0 +1,4 @@
+<!-- ~*quirks mode*~ -->
+<div></div>
+<p style="color: green">should be green
+<p>should be unstyled
new file mode 100644
--- /dev/null
+++ b/layout/reftests/bugs/1420946-1.html
@@ -0,0 +1,9 @@
+<!-- ~*quirks mode*~ -->
+<style>
+#lolquirky {
+  color: green;
+}
+</style>
+<div></div>
+<p id="lolQuirky">should be green
+<p>should be unstyled
--- a/layout/reftests/bugs/reftest.list
+++ b/layout/reftests/bugs/reftest.list
@@ -1837,16 +1837,18 @@ pref(layout.css.overflow-clip-box.enable
 == 1021564-1.html 1021564-ref.html
 == 1021564-2.html 1021564-ref.html
 == 1021564-3.html 1021564-ref.html
 == 1021564-4.html 1021564-ref.html
 pref(browser.display.use_document_fonts,0) == 1022481-1.html 1022481-1-ref.html
 fuzzy-if(d2d,1,125200) fuzzy-if(skiaContent,1,126000) == 1022612-1.html 1022612-1-ref.html
 skip-if(styloVsGecko) == 1024473-1.html 1024473-1-ref.html # skip styloVsGecko for imperceptible pixel rounding differences between Stylo and Gecko
 fuzzy-if(skiaContent,1,24000) == 1025914-1.html 1025914-1-ref.html
+pref(layout.css.moz-document.content.enabled,true) == 1035091.html 1035091-ref.html
+pref(layout.css.moz-document.content.enabled,false) == 1035091-2.html 1035091-ref.html
 == 1042104-1.html 1042104-1-ref.html
 == 1043537-1.html 1043537-1-ref.html
 == 1044198-1.html 1044198-1-ref.html
 == 1049499-1.html 1049499-1-ref.html
 == 1050493-1.html 1050493-1-ref.html
 == 1050788-1.html about:blank
 == 1053035-1-flex.html 1053035-1-ref.html
 test-pref(layout.css.grid.enabled,true) == 1053035-1-grid.html 1053035-1-ref.html
@@ -2044,8 +2046,9 @@ needs-focus != 1377447-1.html 1377447-2.
 == 1401992.html 1401992-ref.html
 == 1405878-1.xml 1405878-1-ref.xml
 == 1404057.html 1404057-ref.html
 != 1404057.html 1404057-noref.html
 == 1406183-1.html 1406183-1-ref.html
 == 1410028.html 1410028-ref.html
 test-pref(font.size.systemFontScale,200) == 1412743.html 1412743-ref.html
 == 1419820-1.html 1419820-1-ref.html
+== 1420946-1.html 1420946-1-ref.html
--- a/layout/reftests/scoped-style/reftest.list
+++ b/layout/reftests/scoped-style/reftest.list
@@ -45,15 +45,15 @@ fails-if(styloVsGecko||stylo) == scoped-
 asserts-if(styloVsGecko,0-1) asserts-if(stylo,1) == scoped-style-dynamic-012.svg scoped-style-dynamic-012-ref.svg # bug 1394603: 0-1 styloVsGecko asserts because there are 0 Gecko asserts and 1 Stylo assert.
 fails-if(styloVsGecko) asserts-if(styloVsGecko,1) asserts-if(stylo,1) fails-if(stylo) == scoped-style-dynamic-013.svg scoped-style-dynamic-013-ref.svg # bug 1394603: 0-1 styloVsGecko asserts because there are 0 Gecko asserts and 1 Stylo assert.
 asserts-if(styloVsGecko,0-1) asserts-if(stylo,1) == scoped-style-dynamic-014.svg scoped-style-dynamic-014-ref.svg # bug 1394603: 0-1 styloVsGecko asserts because there are 0 Gecko asserts and 1 Stylo assert.
 fails-if(styloVsGecko) asserts-if(styloVsGecko,0-1) asserts-if(stylo,1) fails-if(stylo) == scoped-style-dynamic-015.svg scoped-style-dynamic-015-ref.svg # bug 1394603: 0-1 styloVsGecko asserts because there are 0 Gecko asserts and 1 Stylo assert.
 fails-if(styloVsGecko||stylo) == scoped-style-import.html scoped-style-import-ref.html
 fails-if(styloVsGecko||stylo) == scoped-style-media.html scoped-style-media-ref.html
 fails-if(styloVsGecko||stylo) == scoped-style-namespace.html scoped-style-namespace-ref.html
 fails-if(styloVsGecko||stylo) == scoped-style-charset.html scoped-style-charset-ref.html
-fails-if(styloVsGecko||stylo) == scoped-style-document.html scoped-style-document-ref.html
+pref(layout.css.moz-document.content.enabled,true) fails-if(styloVsGecko||stylo) == scoped-style-document.html scoped-style-document-ref.html
 fails-if(styloVsGecko||stylo) == scoped-style-font-face.html scoped-style-font-face-ref.html
 fails-if(styloVsGecko||stylo) == scoped-style-keyframes.html scoped-style-keyframes-ref.html
 fails-if(styloVsGecko||stylo) == scoped-style-supports.html scoped-style-supports-ref.html
 pref(layout.css.scope-pseudo.enabled,true) fails-if(styloVsGecko||stylo) == scoped-style-pseudo-001.html scoped-style-pseudo-001-ref.html
 pref(layout.css.scope-pseudo.enabled,true) fails-if(styloVsGecko||stylo) == scoped-style-pseudo-002.html scoped-style-pseudo-002-ref.html
 pref(layout.css.scope-pseudo.enabled,true) == scoped-style-pseudo-003.html scoped-style-pseudo-003-ref.html
--- a/layout/reftests/stylesheet-cloning/reftest.list
+++ b/layout/reftests/stylesheet-cloning/reftest.list
@@ -1,7 +1,7 @@
 == counter-style-rule-clone.html glyphs-ref.html # passes trivially
 # because "Dynamic change on @counter-style not yet supported"
-== document-rule-clone.html shouldbegreen-ref.html
+pref(layout.css.moz-document.content.enabled,true) == document-rule-clone.html shouldbegreen-ref.html
 == media-rule-clone.html shouldbegreen-ref.html
 == insert-after-clone.html shouldbegreen-ref.html
 == style-rule-clone.html shouldbegreen-ref.html
 == supports-rule-clone.html shouldbegreen-ref.html
--- a/layout/reftests/w3c-css/submitted/conditional3/reftest.list
+++ b/layout/reftests/w3c-css/submitted/conditional3/reftest.list
@@ -19,18 +19,18 @@
 == css-supports-019.xht support/pass.xht
 == css-supports-020.xht support/pass.xht
 == css-supports-021.xht support/pass.xht
 == css-supports-022.xht support/pass.xht
 == css-supports-023.xht support/pass.xht
 == css-supports-024.xht support/pass.xht
 == css-supports-025.xht support/pass.xht
 == css-supports-026.xht support/pass.xht
-== css-supports-027.xht support/pass.xht
-== css-supports-028.xht support/pass.xht
+pref(layout.css.moz-document.content.enabled,true) == css-supports-027.xht support/pass.xht
+pref(layout.css.moz-document.content.enabled,true) == css-supports-028.xht support/pass.xht
 == css-supports-029.xht support/pass.xht
 == css-supports-030.xht support/pass.xht
 == css-supports-031.xht support/pass.xht
 == css-supports-032.xht support/pass.xht
 == css-supports-033.xht support/pass.xht
 == css-supports-034.xht support/pass.xht
 == css-supports-035.xht support/pass.xht
 == css-supports-036.xht support/pass.xht
new file mode 100644
--- /dev/null
+++ b/layout/style/Rule.cpp
@@ -0,0 +1,134 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/* base class for all rule types in a CSS style sheet */
+
+#include "Rule.h"
+
+#include "mozilla/css/GroupRule.h"
+#include "nsCCUncollectableMarker.h"
+#include "nsWrapperCacheInlines.h"
+
+using namespace mozilla;
+using namespace mozilla::dom;
+
+namespace mozilla {
+namespace css {
+
+NS_IMPL_CYCLE_COLLECTING_ADDREF(Rule)
+NS_IMPL_CYCLE_COLLECTING_RELEASE(Rule)
+
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(Rule)
+  NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
+  NS_INTERFACE_MAP_ENTRY(nsIDOMCSSRule)
+  NS_INTERFACE_MAP_ENTRY(nsISupports)
+NS_INTERFACE_MAP_END
+
+NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_0(Rule)
+
+bool
+Rule::IsCCLeaf() const
+{
+  return !PreservingWrapper();
+}
+
+bool
+Rule::IsKnownLive() const
+{
+  if (HasKnownLiveWrapper()) {
+    return true;
+  }
+
+  StyleSheet* sheet = GetStyleSheet();
+  if (!sheet) {
+    return false;
+  }
+
+  if (!sheet->IsOwnedByDocument()) {
+    return false;
+  }
+
+  return nsCCUncollectableMarker::InGeneration(
+    sheet->GetAssociatedDocument()->GetMarkedCCGeneration());
+}
+
+NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_BEGIN(Rule)
+  return tmp->IsCCLeaf() || tmp->IsKnownLive();
+NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_END
+
+NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_IN_CC_BEGIN(Rule)
+  // Please see documentation for nsCycleCollectionParticipant::CanSkip* for why
+  // we need to check HasNothingToTrace here but not in the other two CanSkip
+  // methods.
+  return tmp->IsCCLeaf() ||
+    (tmp->IsKnownLive() && tmp->HasNothingToTrace(tmp));
+NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_IN_CC_END
+
+NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_THIS_BEGIN(Rule)
+  return tmp->IsCCLeaf() || tmp->IsKnownLive();
+NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_THIS_END
+
+/* virtual */ void
+Rule::SetStyleSheet(StyleSheet* aSheet)
+{
+  // We don't reference count this up reference. The style sheet
+  // will tell us when it's going away or when we're detached from
+  // it.
+  mSheet = aSheet;
+}
+
+NS_IMETHODIMP
+Rule::GetParentRule(nsIDOMCSSRule** aParentRule)
+{
+  NS_IF_ADDREF(*aParentRule = mParentRule);
+  return NS_OK;
+}
+
+NS_IMETHODIMP
+Rule::GetParentStyleSheet(nsIDOMCSSStyleSheet** aSheet)
+{
+  NS_ENSURE_ARG_POINTER(aSheet);
+
+  NS_IF_ADDREF(*aSheet = GetStyleSheet());
+  return NS_OK;
+}
+
+/* virtual */ css::Rule*
+Rule::GetCSSRule()
+{
+  return this;
+}
+
+NS_IMETHODIMP
+Rule::GetType(uint16_t* aType)
+{
+  *aType = Type();
+  return NS_OK;
+}
+
+NS_IMETHODIMP
+Rule::SetCssText(const nsAString& aCssText)
+{
+  // We used to throw for some rule types, but not all.  Specifically, we did
+  // not throw for StyleRule.  Let's just always not throw.
+  return NS_OK;
+}
+
+NS_IMETHODIMP
+Rule::GetCssText(nsAString& aCssText)
+{
+  GetCssTextImpl(aCssText);
+  return NS_OK;
+}
+
+Rule*
+Rule::GetParentRule() const
+{
+  return mParentRule;
+}
+
+} // namespace css
+} // namespace mozilla
--- a/layout/style/ServoStyleSet.cpp
+++ b/layout/style/ServoStyleSet.cpp
@@ -1021,16 +1021,43 @@ ServoStyleSet::MarkOriginsDirty(OriginFl
 {
   SetStylistStyleSheetsDirty();
   Servo_StyleSet_NoteStyleSheetsChanged(mRawSet.get(),
                                         mAuthorStyleDisabled,
                                         aChangedOrigins);
 }
 
 void
+ServoStyleSet::SetStylistStyleSheetsDirty()
+{
+  mStylistState |= StylistState::StyleSheetsDirty;
+
+  // We need to invalidate cached style in getComputedStyle for undisplayed
+  // elements, since we don't know if any of the style sheet change that we
+  // do would affect undisplayed elements.
+  if (mPresContext) {
+    // XBL sheets don't have a pres context, but invalidating the restyle generation
+    // in that case is handled by SetXBLStyleSheetsDirty in the "master" stylist.
+    mPresContext->RestyleManager()->AsServo()->IncrementUndisplayedRestyleGeneration();
+  }
+}
+
+void
+ServoStyleSet::SetStylistXBLStyleSheetsDirty()
+{
+  mStylistState |= StylistState::XBLStyleSheetsDirty;
+
+  // We need to invalidate cached style in getComputedStyle for undisplayed
+  // elements, since we don't know if any of the style sheet change that we
+  // do would affect undisplayed elements.
+  MOZ_ASSERT(mPresContext);
+  mPresContext->RestyleManager()->AsServo()->IncrementUndisplayedRestyleGeneration();
+}
+
+void
 ServoStyleSet::RecordStyleSheetChange(
     ServoStyleSheet* aSheet,
     StyleSheet::ChangeType aChangeType)
 {
   switch (aChangeType) {
     case StyleSheet::ChangeType::RuleAdded:
     case StyleSheet::ChangeType::RuleRemoved:
     case StyleSheet::ChangeType::RuleChanged:
--- a/layout/style/ServoStyleSet.h
+++ b/layout/style/ServoStyleSet.h
@@ -549,25 +549,19 @@ private:
    * changed since the last.  Calling this will ensure that the Stylist
    * rebuilds its selector maps.
    */
   void MarkOriginsDirty(OriginFlags aChangedOrigins);
 
   /**
    * Note that the stylist needs a style flush due to style sheet changes.
    */
-  void SetStylistStyleSheetsDirty()
-  {
-    mStylistState |= StylistState::StyleSheetsDirty;
-  }
+  void SetStylistStyleSheetsDirty();
 
-  void SetStylistXBLStyleSheetsDirty()
-  {
-    mStylistState |= StylistState::XBLStyleSheetsDirty;
-  }
+  void SetStylistXBLStyleSheetsDirty();
 
   bool StylistNeedsUpdate() const
   {
     return mStylistState != StylistState::NotDirty;
   }
 
   /**
    * Update the stylist as needed to ensure style data is up-to-date.
--- a/layout/style/StylePrefs.cpp
+++ b/layout/style/StylePrefs.cpp
@@ -14,16 +14,17 @@ bool StylePrefs::sFontDisplayEnabled;
 bool StylePrefs::sOpentypeSVGEnabled;
 bool StylePrefs::sWebkitPrefixedAliasesEnabled;
 bool StylePrefs::sWebkitDevicePixelRatioEnabled;
 bool StylePrefs::sMozGradientsEnabled;
 bool StylePrefs::sControlCharVisibility;
 bool StylePrefs::sFramesTimingFunctionEnabled;
 bool StylePrefs::sUnprefixedFullscreenApiEnabled;
 bool StylePrefs::sVisitedLinksEnabled;
+bool StylePrefs::sMozDocumentEnabledInContent;
 
 /* static */ void
 StylePrefs::Init()
 {
   Preferences::AddBoolVarCache(&sFontDisplayEnabled,
                                "layout.css.font-display.enabled");
   Preferences::AddBoolVarCache(&sOpentypeSVGEnabled,
                                "gfx.font_rendering.opentype_svg.enabled");
@@ -36,11 +37,13 @@ StylePrefs::Init()
   Preferences::AddBoolVarCache(&sControlCharVisibility,
                                "layout.css.control-characters.visible");
   Preferences::AddBoolVarCache(&sFramesTimingFunctionEnabled,
                                "layout.css.frames-timing.enabled");
   Preferences::AddBoolVarCache(&sUnprefixedFullscreenApiEnabled,
                                "full-screen-api.unprefix.enabled");
   Preferences::AddBoolVarCache(&sVisitedLinksEnabled,
                                "layout.css.visited_links_enabled");
+  Preferences::AddBoolVarCache(&sMozDocumentEnabledInContent,
+                               "layout.css.moz-document.content.enabled");
 }
 
 } // namespace mozilla
--- a/layout/style/StylePrefs.h
+++ b/layout/style/StylePrefs.h
@@ -17,15 +17,16 @@ struct StylePrefs
   static bool sOpentypeSVGEnabled;
   static bool sWebkitPrefixedAliasesEnabled;
   static bool sWebkitDevicePixelRatioEnabled;
   static bool sMozGradientsEnabled;
   static bool sControlCharVisibility;
   static bool sFramesTimingFunctionEnabled;
   static bool sUnprefixedFullscreenApiEnabled;
   static bool sVisitedLinksEnabled;
+  static bool sMozDocumentEnabledInContent;
 
   static void Init();
 };
 
 } // namespace mozilla
 
 #endif // mozilla_StylePrefs_h
--- a/layout/style/moz.build
+++ b/layout/style/moz.build
@@ -242,16 +242,17 @@ UNIFIED_SOURCES += [
     'nsStyleCoord.cpp',
     'nsStyleSet.cpp',
     'nsStyleStruct.cpp',
     'nsStyleTransformMatrix.cpp',
     'nsStyleUtil.cpp',
     'nsTransitionManager.cpp',
     'PostTraversalTask.cpp',
     'PreloadedStyleSheet.cpp',
+    'Rule.cpp',
     'RuleNodeCacheConditions.cpp',
     'RuleProcessorCache.cpp',
     'ServoBindings.cpp',
     'ServoCSSParser.cpp',
     'ServoCSSRuleList.cpp',
     'ServoDeclarationBlock.cpp',
     'ServoDocumentRule.cpp',
     'ServoElementSnapshot.cpp',
--- a/layout/style/nsCSSParser.cpp
+++ b/layout/style/nsCSSParser.cpp
@@ -3766,16 +3766,21 @@ CSSParserImpl::ParseMediaRule(RuleAppend
 }
 
 // Parse a @-moz-document rule.  This is like an @media rule, but instead
 // of a medium it has a nonempty list of items where each item is either
 // url(), url-prefix(), or domain().
 bool
 CSSParserImpl::ParseMozDocumentRule(RuleAppendFunc aAppendFunc, void* aData)
 {
+  if (mParsingMode == css::eAuthorSheetFeatures &&
+      !StylePrefs::sMozDocumentEnabledInContent) {
+    return false;
+  }
+
   css::DocumentRule::URL *urls = nullptr;
   css::DocumentRule::URL **next = &urls;
 
   uint32_t linenum, colnum;
   if (!GetNextTokenLocation(true, &linenum, &colnum)) {
     return false;
   }
 
--- a/layout/style/nsCSSRules.cpp
+++ b/layout/style/nsCSSRules.cpp
@@ -35,139 +35,25 @@
 #include "mozilla/DeclarationBlockInlines.h"
 #include "nsCSSParser.h"
 #include "nsDOMClassInfoID.h"
 #include "mozilla/dom/CSSStyleDeclarationBinding.h"
 #include "mozilla/dom/CSSFontFeatureValuesRuleBinding.h"
 #include "StyleRule.h"
 #include "nsFont.h"
 #include "nsIURI.h"
-#include "nsCCUncollectableMarker.h"
-#include "nsWrapperCacheInlines.h"
 
 using namespace mozilla;
 using namespace mozilla::dom;
 
 // base class for all rule types in a CSS style sheet
 
 namespace mozilla {
 namespace css {
 
-NS_IMPL_CYCLE_COLLECTING_ADDREF(Rule)
-NS_IMPL_CYCLE_COLLECTING_RELEASE(Rule)
-
-NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(Rule)
-  NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
-  NS_INTERFACE_MAP_ENTRY(nsIDOMCSSRule)
-  NS_INTERFACE_MAP_ENTRY(nsISupports)
-NS_INTERFACE_MAP_END
-
-NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_0(Rule)
-
-bool
-Rule::IsCCLeaf() const
-{
-  return !PreservingWrapper();
-}
-
-bool
-Rule::IsKnownLive() const
-{
-  if (HasKnownLiveWrapper()) {
-    return true;
-  }
-
-  StyleSheet* sheet = GetStyleSheet();
-  if (!sheet) {
-    return false;
-  }
-
-  if (!sheet->IsOwnedByDocument()) {
-    return false;
-  }
-
-  return nsCCUncollectableMarker::InGeneration(
-    sheet->GetAssociatedDocument()->GetMarkedCCGeneration());
-}
-
-NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_BEGIN(Rule)
-  return tmp->IsCCLeaf() || tmp->IsKnownLive();
-NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_END
-
-NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_IN_CC_BEGIN(Rule)
-  // Please see documentation for nsCycleCollectionParticipant::CanSkip* for why
-  // we need to check HasNothingToTrace here but not in the other two CanSkip
-  // methods.
-  return tmp->IsCCLeaf() ||
-    (tmp->IsKnownLive() && tmp->HasNothingToTrace(tmp));
-NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_IN_CC_END
-
-NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_THIS_BEGIN(Rule)
-  return tmp->IsCCLeaf() || tmp->IsKnownLive();
-NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_THIS_END
-
-/* virtual */ void
-Rule::SetStyleSheet(StyleSheet* aSheet)
-{
-  // We don't reference count this up reference. The style sheet
-  // will tell us when it's going away or when we're detached from
-  // it.
-  mSheet = aSheet;
-}
-
-NS_IMETHODIMP
-Rule::GetParentRule(nsIDOMCSSRule** aParentRule)
-{
-  NS_IF_ADDREF(*aParentRule = mParentRule);
-  return NS_OK;
-}
-
-NS_IMETHODIMP
-Rule::GetParentStyleSheet(nsIDOMCSSStyleSheet** aSheet)
-{
-  NS_ENSURE_ARG_POINTER(aSheet);
-
-  NS_IF_ADDREF(*aSheet = GetStyleSheet());
-  return NS_OK;
-}
-
-/* virtual */ css::Rule*
-Rule::GetCSSRule()
-{
-  return this;
-}
-
-NS_IMETHODIMP
-Rule::GetType(uint16_t* aType)
-{
-  *aType = Type();
-  return NS_OK;
-}
-
-NS_IMETHODIMP
-Rule::SetCssText(const nsAString& aCssText)
-{
-  // We used to throw for some rule types, but not all.  Specifically, we did
-  // not throw for StyleRule.  Let's just always not throw.
-  return NS_OK;
-}
-
-NS_IMETHODIMP
-Rule::GetCssText(nsAString& aCssText)
-{
-  GetCssTextImpl(aCssText);
-  return NS_OK;
-}
-
-Rule*
-Rule::GetParentRule() const
-{
-  return mParentRule;
-}
-
 // -------------------------------------------
 // ImportRule
 //
 
 ImportRule::ImportRule(nsMediaList* aMedia, const nsString& aURLSpec,
                        uint32_t aLineNumber, uint32_t aColumnNumber)
   : CSSImportRule(aLineNumber, aColumnNumber)
   , mURLSpec(aURLSpec)
--- a/layout/style/test/test_bug511909.html
+++ b/layout/style/test/test_bug511909.html
@@ -9,150 +9,143 @@
 
 <style type="text/css">
 a {
     font-weight: bold; 
 }
   #pink {
     color: pink;
   }
-  
+
   #green {
     color: green;
   }
-  
+
   #blue {
     color: blue;
   }
 
-
 pre {
    border: 1px solid black;
 }
 </style>
-  
+
 <style type="text/css">
 @-moz-document regexp(".*test_bug511909.*"){
     #d {
       color: pink;
     }
 }
+</style>
 
-</style>
-  
 <style type="text/css">
-    
 @media screen {
    #m {
       color: green;
    }
 }
+</style>
 
-</style>
-  
 <style type="text/css">
-  
 @-moz-document regexp(".*test_bug511909.*"){
   @media screen {
       #dm {
          color: blue;
       }
    }
 }
+</style>
 
-</style>
-  
 <!-- should parse -->
 <style type="text/css">
-
 @media print {
   @-moz-document regexp("not_this_url"),}
     #mx {
         color: pink;
     }
   }
 }
+</style>
 
-</style>
-  
 <!-- should parse -->
 <style type="text/css">
-    
 @-moz-document regexp("not_this_url"){
   @media print ,}
     #mxx {
       color: blue;
     }
   }
 }
+</style>
 
-</style>
-  
-<style type="text/css">  
-  
+<style type="text/css">
 @media screen {
   @-moz-document regexp(".*test_bug511909.*"){
       #md {
          color: green;
       }
    }
 }
+</style>
 
-</style>
-  
 <style type="text/css">
-    
 @media screen {
   @-moz-document regexp(".*test_bug511909.*"){
       @media screen { 
         @-moz-document regexp(".*test_bug511909.*"){
           @media screen {
             #me {
              color: blue; 
             }
           }
         }
      }
    }
 }
-  
 </style>
 </head>
 <body>
   <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=511909">Mozilla Bug 511909</a>
   <p id="display"></p>
   <div id="content" style="display: none">
-    
   </div>
-  
+
   <script class="testbody" type="text/javascript">
+    SimpleTest.waitForExplicitFinish();
 
-    SimpleTest.waitForExplicitFinish();
-    
     addLoadEvent(function() {
-    var pink = getComputedStyle(document.getElementById("pink"), "");
-    var green = getComputedStyle(document.getElementById("green"), "");
-    var blue = getComputedStyle(document.getElementById("blue"), "");
-                 
-    var cs1 = getComputedStyle(document.getElementById("d"), "");
-    var cs2 = getComputedStyle(document.getElementById("m"), "");
-    var cs3 = getComputedStyle(document.getElementById("dm"), "");
-    var cs4 = getComputedStyle(document.getElementById("md"), "");
-    var cs5 = getComputedStyle(document.getElementById("mx"), "");                 
-    var cs6 = getComputedStyle(document.getElementById("mxx"), "");                  
-    var cs7 = getComputedStyle(document.getElementById("me"), "");  
-                 
-    is(cs1.color, pink.color, "@-moz-document applies");
-    is(cs2.color, green.color, "@media applies");
-    is(cs3.color, blue.color, "@media nested in @-moz-document applies");
-    is(cs4.color, green.color, "@-moz-document nested in @media applies");
-    is(cs5.color, pink.color, "broken @media nested in @-moz-document correctly handled");      
-    is(cs6.color, blue.color, "broken @-moz-document nested in @media correctly handled");   
-    is(cs7.color, blue.color, "@media nested in @-moz-document nested in @media applies");
-    SimpleTest.finish();
+      SpecialPowers.pushPrefEnv(
+        { "set": [["layout.css.moz-document.content.enabled", true ]]},
+        function() {
+          // Ensure all the sheets are re-parsed, so that the pref applies.
+          for (const sheet of Array.from(document.querySelectorAll('style'))) {
+            sheet.textContent += "/* dummy */";
+          }
+
+          var pink = getComputedStyle(document.getElementById("pink"), "");
+          var green = getComputedStyle(document.getElementById("green"), "");
+          var blue = getComputedStyle(document.getElementById("blue"), "");
+
+          var cs1 = getComputedStyle(document.getElementById("d"), "");
+          var cs2 = getComputedStyle(document.getElementById("m"), "");
+          var cs3 = getComputedStyle(document.getElementById("dm"), "");
+          var cs4 = getComputedStyle(document.getElementById("md"), "");
+          var cs5 = getComputedStyle(document.getElementById("mx"), "");
+          var cs6 = getComputedStyle(document.getElementById("mxx"), "");
+          var cs7 = getComputedStyle(document.getElementById("me"), "");
+
+          is(cs1.color, pink.color, "@-moz-document applies");
+          is(cs2.color, green.color, "@media applies");
+          is(cs3.color, blue.color, "@media nested in @-moz-document applies");
+          is(cs4.color, green.color, "@-moz-document nested in @media applies");
+          is(cs5.color, pink.color, "broken @media nested in @-moz-document correctly handled");
+          is(cs6.color, blue.color, "broken @-moz-document nested in @media correctly handled");
+          is(cs7.color, blue.color, "@media nested in @-moz-document nested in @media applies");
+          SimpleTest.finish();
+        })
     });
   </script>
 <div>
 <pre>default style
 </pre>
 <a id="pink">This line should be pink</a><br>
   
 <a id="green">This line should be green</a><br>
--- a/layout/style/test/test_computed_style.html
+++ b/layout/style/test/test_computed_style.html
@@ -1,20 +1,20 @@
 <!DOCTYPE HTML>
 <html>
 <head>
   <title>Test for miscellaneous computed style issues</title>
   <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+  <style id="style"></style>
 </head>
 <body>
 <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=">Mozilla Bug </a>
 <p id="display"></p>
 <div id="content" style="display: none">
-  
 </div>
 <pre id="test">
 <script type="application/javascript">
 
 /** Test for miscellaneous computed style issues **/
 
 var frame_container = document.getElementById("display");
 var noframe_container = document.getElementById("content");
@@ -727,12 +727,53 @@ var noframe_container = document.getElem
     p.style.clipPath = test[0];
     is(cs.clipPath, test[1],
        "computed value of clip-path for basic-shapes (" + test[2] + ")");
   }
 
   p.remove();
 })();
 
+(function test_bug_1418433() {
+  // Test that the style data read through getComputedStyle is always up-to-date,
+  // even for non-displayed elements.
+
+  var d = document.createElement("div");
+  d.setAttribute("id", "nonDisplayedDiv");
+  var cs = getComputedStyle(d, null);
+  noframe_container.appendChild(d);
+
+  // Test for stylesheet change, i.e., added/changed/removed
+  var style = document.getElementById("style");
+  is(cs.height, "auto",
+     "computed value of display none element (before testing)");
+  style.textContent = "#nonDisplayedDiv { height: 100px; }";
+  is(cs.height, "100px",
+     "computed value of display none element (sheet added)");
+  style.textContent = "#nonDisplayedDiv { height: 10px; }";
+  is(cs.height, "10px",
+     "computed value of display none element (sheet changed)");
+  style.textContent = "";
+  is(cs.height, "auto",
+     "computed value of display none element (sheet removed)");
+
+  // Test for rule change, i.e., added/changed/removed
+  var styleSheet = style.sheet;
+  is(cs.width, "auto",
+     "computed value of display none element (before testing)");
+  styleSheet.insertRule("#nonDisplayedDiv { width: 100px; }", 0);
+  is(cs.width, "100px",
+     "computed value of display none element (rule added)");
+  styleSheet.deleteRule(0);
+  styleSheet.insertRule("#nonDisplayedDiv { width: 10px; }", 0);
+  is(cs.width, "10px",
+     "computed value of display none element (rule changed)");
+  styleSheet.deleteRule(0);
+  is(cs.width, "auto",
+     "computed value of display none element (rule removed)");
+
+  d.remove();
+})();
+
 </script>
 </pre>
 </body>
 </html>
--- a/layout/style/test/test_condition_text.html
+++ b/layout/style/test/test_condition_text.html
@@ -81,13 +81,15 @@ function runTest()
       is(rule.conditionText, rule.media.mediaText, "rule " + i + " conditionText matches media.mediaText");
     }
   }
 
   SimpleTest.finish();
 }
 
 SimpleTest.waitForExplicitFinish();
-runTest();
+SpecialPowers.pushPrefEnv(
+  { "set": [["layout.css.moz-document.content.enabled", true]]},
+  runTest);
 </script>
 </pre>
 </body>
 </html>
--- a/layout/style/test/test_css_eof_handling.html
+++ b/layout/style/test/test_css_eof_handling.html
@@ -83,17 +83,17 @@ const tests = [
            "iVBORw0KGgoAAAANSUhEUgAAAAQAAAAEAQAAAACBiqPTAAAAEElEQVQI12N4" +
            "wHCBYQNDAQAMuALRrGb97AAAAABJRU5ErkJggg==') }",
       tst: "#t { background-image: url('data:image/png;base64," +
            "iVBORw0KGgoAAAANSUhEUgAAAAQAAAAEAQAAAACBiqPTAAAAEElEQVQI12N4" +
            "wHCBYQNDAQAMuALRrGb97AAAAABJRU5ErkJggg=='",
       prop: "background-image", pseudo: ""
   },
   {
-      name: "url-token 4",	/*Bug 751939*/
+      name: "url-token 4",  /*Bug 751939*/
       ref: "#r { background-image: url( )}",
       tst: "#t { background-image: url(" ,
       prop: "background-image", pseudo: ""
   },
   {
       name: "counter",
       ref: "#r::before { content: counter(tr, upper-alpha) }",
       tst: "#t::before { content: counter(tr, upper-alpha",
@@ -191,88 +191,93 @@ const tests = [
   {
       name: "@-moz-document 2",
       ref: "@-moz-document domain('example.com') { p {} }",
       tst: "@-moz-document domain('example.com') { p {"
   }
 ];
 
 const basestyle = ("table {\n"+
-		   "    border-collapse: collapse;\n"+
-		   "}\n"+
-		   "td {\n"+
-		   "    width: 1.5em;\n"+
-		   "    height: 1.5em;\n"+
-		   "    border: 1px solid black;\n"+
-		   "    text-align: center;\n"+
-		   "    margin: 0;\n"+
-		   "}\n"+
-		   "tr { counter-increment: tr }\n");
+       "    border-collapse: collapse;\n"+
+       "}\n"+
+       "td {\n"+
+       "    width: 1.5em;\n"+
+       "    height: 1.5em;\n"+
+       "    border: 1px solid black;\n"+
+       "    text-align: center;\n"+
+       "    margin: 0;\n"+
+       "}\n"+
+       "tr { counter-increment: tr }\n");
 
 /* This is more complicated than it might look like it needs to be,
    because for each subtest we have to splat stuff into the iframe,
    allow the renderer to run, and only then interrogate the computed
    styles.  */
 
 SimpleTest.waitForExplicitFinish();
- 
+
 window.onload = function() {
-    const frame = document.getElementById("display");
-    var curTest = 0;
+  SpecialPowers.pushPrefEnv(
+    { "set": [["layout.css.moz-document.content.enabled", true]]},
+    function() {
+      const frame = document.getElementById("display");
+      var curTest = 0;
 
-    const prepareTest = function() {
-	var cd = frame.contentDocument;
-	cd.open();
-	cd.write('<!DOCTYPE HTML><html><head>' +
-		 '<style>\n' + basestyle + '</style>\n' +
-		 '<style>\n' + tests[curTest].ref + '</style>\n' +
-		 '<style>\n' + tests[curTest].tst + '</style>\n' +
-		 '</head><body>\n' +
-		 '<table><tr><td id="r"><td id="t"></table>' +
-		 '</body></html>');
-	cd.close();
-    };
+      const prepareTest = function() {
+        var cd = frame.contentDocument;
+        cd.open();
+        cd.write('<!DOCTYPE HTML><html><head>' +
+          '<style>\n' + basestyle + '</style>\n' +
+          '<style>\n' + tests[curTest].ref + '</style>\n' +
+          '<style>\n' + tests[curTest].tst + '</style>\n' +
+          '</head><body>\n' +
+          '<table><tr><td id="r"><td id="t"></table>' +
+          '</body></html>');
+        cd.close();
+      };
 
-    const checkTest = function() {
-	var cd = frame.contentDocument;
-	var _is = tests[curTest].todo ? todo_is : is;
-	var _ok = tests[curTest].todo ? todo : ok;
+      const checkTest = function() {
+        var cd = frame.contentDocument;
+        var _is = tests[curTest].todo ? todo_is : is;
+        var _ok = tests[curTest].todo ? todo : ok;
 
-	if (cd.styleSheets[1].cssRules.length == 1 &&
-	    cd.styleSheets[2].cssRules.length == 1) {
-	    // If we have a .prop for this test, the .cssText of the reference
-	    // and test rules will differ in the selector.  Change #t to #r
-	    // in the test rule.
-	    var ref_canon = cd.styleSheets[1].cssRules[0].cssText;
-	    var tst_canon = cd.styleSheets[2].cssRules[0].cssText;
-	    tst_canon = tst_canon.replace(/(#|%23)t\b/, "$1r");
-	    _is(tst_canon, ref_canon,
-		tests[curTest].name + " (canonicalized rule)");
-	} else {
-	    _ok(false, tests[curTest].name + " (rule missing)");
-	}
-	if (tests[curTest].prop) {
-	    var prop = tests[curTest].prop;
-	    var pseudo = tests[curTest].pseudo;
+        if (cd.styleSheets[1].cssRules.length == 1 &&
+          cd.styleSheets[2].cssRules.length == 1) {
+          // If we have a .prop for this test, the .cssText of the reference
+          // and test rules will differ in the selector.  Change #t to #r
+          // in the test rule.
+          var ref_canon = cd.styleSheets[1].cssRules[0].cssText;
+          var tst_canon = cd.styleSheets[2].cssRules[0].cssText;
+          tst_canon = tst_canon.replace(/(#|%23)t\b/, "$1r");
+          _is(tst_canon, ref_canon,
+              tests[curTest].name + " (canonicalized rule)");
+        } else {
+          _ok(false, tests[curTest].name + " (rule missing)");
+        }
+        if (tests[curTest].prop) {
+          var prop = tests[curTest].prop;
+          var pseudo = tests[curTest].pseudo;
 
-	    var refElt = cd.getElementById("r");
-	    var tstElt = cd.getElementById("t");
-	    var refStyle = cd.defaultView.getComputedStyle(refElt, pseudo);
-	    var tstStyle = cd.defaultView.getComputedStyle(tstElt, pseudo);
-	    _is(tstStyle.getPropertyValue(prop),
-                refStyle.getPropertyValue(prop),
-                tests[curTest].name + " (computed style)");
-	}
-	curTest++;
-	if (curTest < tests.length) {
-	    prepareTest();
-	} else {
-	    SimpleTest.finish();
-	}
-    };
+          var refElt = cd.getElementById("r");
+          var tstElt = cd.getElementById("t");
+          var refStyle = cd.defaultView.getComputedStyle(refElt, pseudo);
+          var tstStyle = cd.defaultView.getComputedStyle(tstElt, pseudo);
+          _is(tstStyle.getPropertyValue(prop),
+              refStyle.getPropertyValue(prop),
+              tests[curTest].name + " (computed style)");
+        }
+        curTest++;
+        if (curTest < tests.length) {
+          prepareTest();
+        } else {
+          SimpleTest.finish();
+        }
+      };
 
-    frame.onload = function(){setTimeout(checkTest, 0);};
-    prepareTest();
+      frame.onload = function(){setTimeout(checkTest, 0);};
+      prepareTest();
+    }
+  )
 };
 </script>
 </pre>
 </body>
 </html>
--- a/layout/style/test/test_rule_insertion.html
+++ b/layout/style/test/test_rule_insertion.html
@@ -229,12 +229,16 @@ function runTest()
       }
     }
   }
 
   SimpleTest.finish();
 }
 
 SimpleTest.waitForExplicitFinish();
-runTest();
+
+SpecialPowers.pushPrefEnv(
+  { "set": [["layout.css.moz-document.content.enabled", true ]]},
+  runTest,
+);
 </script>
 </body>
 </html>
--- a/layout/style/test/test_rule_serialization.html
+++ b/layout/style/test/test_rule_serialization.html
@@ -20,34 +20,44 @@ var rules = [
   { rule: "@-moz-document url-prefix('http://www.example.com/') {}" },
   { rule: '@-moz-document url-prefix("http://www.example.com/") {}' },
   { rule: "@-moz-document domain('example.com') {}" },
   { rule: '@-moz-document domain("example.com") {}' },
   { rule: "@-moz-document regexp('http://www.w3.org/TR/\\d{4}/[^/]*-CSS2-\\d{8}/') {}" },
   { rule: '@-moz-document regexp("http://www.w3.org/TR/\\d{4}/[^/]*-CSS2-\\d{8}/") {}' },
 ];
 
-var style = document.getElementById("style");
-var style_text = document.createTextNode("");
-style.appendChild(style_text);
+SimpleTest.waitForExplicitFinish();
 
-for (var i in rules) {
-  var obj = rules[i];
-  var rule = obj.rule;
+SpecialPowers.pushPrefEnv(
+  { "set": [["layout.css.moz-document.content.enabled", true ]]},
+  function() {
+    var style = document.getElementById("style");
+    var style_text = document.createTextNode("");
+    style.appendChild(style_text);
+
+    for (var i in rules) {
+      var obj = rules[i];
+      var rule = obj.rule;
 
-  style_text.data = rule;
-  is(style.sheet.cssRules.length, 1, "should have one rule");
-  var ser1 = style.sheet.cssRules[0].cssText;
-  if ("is_canonical" in obj) {
-    is(ser1, rule, "rule '" + rule + "' should serialize to itself");
-  }
+      style_text.data = rule;
+      is(style.sheet.cssRules.length, 1, "should have one rule");
+      var ser1 = style.sheet.cssRules[0].cssText;
+      if ("is_canonical" in obj) {
+        is(ser1, rule, "rule '" + rule + "' should serialize to itself");
+      }
 
-  style_text.data = ser1;
-  is(style.sheet.cssRules.length, 1, "should have one rule");
-  var ser2 = style.sheet.cssRules[0].cssText;
-  is(ser2, ser1,
-     "parse+serialize for rule '" + rule + "' should be idempotent");
-}
+      style_text.data = ser1;
+      is(style.sheet.cssRules.length, 1, "should have one rule");
+      var ser2 = style.sheet.cssRules[0].cssText;
+      is(ser2, ser1,
+         "parse+serialize for rule '" + rule + "' should be idempotent");
+    }
+
+    SimpleTest.finish();
+  }
+)
+
 
 </script>
 </pre>
 </body>
 </html>
--- a/mobile/android/base/java/org/mozilla/gecko/firstrun/FirstrunAnimationContainer.java
+++ b/mobile/android/base/java/org/mozilla/gecko/firstrun/FirstrunAnimationContainer.java
@@ -13,16 +13,17 @@ import android.view.View;
 import android.widget.LinearLayout;
 import android.animation.Animator;
 import android.animation.AnimatorListenerAdapter;
 import android.animation.ObjectAnimator;
 import org.mozilla.gecko.R;
 import org.mozilla.gecko.Telemetry;
 import org.mozilla.gecko.TelemetryContract;
 import org.mozilla.gecko.Experiments;
+import org.mozilla.gecko.mma.MmaDelegate;
 import org.mozilla.gecko.preferences.GeckoPreferences;
 
 /**
  * A container for the pager and the entire first run experience.
  * This is used for animation purposes.
  */
 public class FirstrunAnimationContainer extends LinearLayout {
     // See bug 1330714. Need NON_PREF_PREFIX to set from distribution.
@@ -56,16 +57,19 @@ public class FirstrunAnimationContainer 
         });
     }
 
     public boolean isVisible() {
         return visible;
     }
 
     public void hide() {
+
+        MmaDelegate.track(MmaDelegate.DISMISS_ONBOARDING);
+
         visible = false;
         if (onFinishListener != null) {
             onFinishListener.onFinish();
         }
         animateHide();
     }
 
     private void animateHide() {
--- a/mobile/android/base/java/org/mozilla/gecko/mma/MmaDelegate.java
+++ b/mobile/android/base/java/org/mozilla/gecko/mma/MmaDelegate.java
@@ -43,16 +43,17 @@ public class MmaDelegate {
     public static final String SAVED_BOOKMARK = "E_Saved_Bookmark";
     public static final String OPENED_BOOKMARK = "E_Opened_Bookmark";
     public static final String INTERACT_WITH_SEARCH_URL_AREA = "E_Interact_With_Search_URL_Area";
     public static final String SCREENSHOT = "E_Screenshot";
     public static final String SAVED_LOGIN_AND_PASSWORD = "E_Saved_Login_And_Password";
     public static final String LAUNCH_BUT_NOT_DEFAULT_BROWSER = "E_Launch_But_Not_Default_Browser";
     public static final String LAUNCH_BROWSER = "E_Launch_Browser";
     public static final String NEW_TAB = "E_Opened_New_Tab";
+    public static final String DISMISS_ONBOARDING = "E_Dismiss_Onboarding";
 
 
     public static final String USER_ATT_FOCUS_INSTALLED = "Focus Installed";
     public static final String USER_ATT_KLAR_INSTALLED = "Klar Installed";
     public static final String USER_ATT_POCKET_INSTALLED = "Pocket Installed";
     public static final String USER_ATT_DEFAULT_BROWSER = "Default Browser";
     public static final String USER_ATT_SIGNED_IN = "Signed In Sync";
 
--- a/modules/libpref/init/all.js
+++ b/modules/libpref/init/all.js
@@ -2842,16 +2842,23 @@ pref("layout.word_select.stop_at_punctua
 pref("layout.selection.caret_style", 0);
 
 // pref to report CSS errors to the error console
 pref("layout.css.report_errors", true);
 
 // Should the :visited selector ever match (otherwise :link matches instead)?
 pref("layout.css.visited_links_enabled", true);
 
+// Pref to control whether @-moz-document rules are enabled in content pages.
+#ifdef EARLY_BETA_OR_EARLIER
+pref("layout.css.moz-document.content.enabled",  false);
+#else
+pref("layout.css.moz-document.content.enabled",  true);
+#endif
+
 // Override DPI. A value of -1 means use the maximum of 96 and the system DPI.
 // A value of 0 means use the system DPI. A positive value is used as the DPI.
 // This sets the physical size of a device pixel and thus controls the
 // interpretation of physical units such as "pt".
 pref("layout.css.dpi", -1);
 
 // Set the number of device pixels per CSS pixel. A value <= 0 means choose
 // automatically based on user settings for the platform (e.g., "UI scale factor"
--- a/security/apps/AppSignatureVerification.cpp
+++ b/security/apps/AppSignatureVerification.cpp
@@ -11,16 +11,17 @@
 #include "NSSCertDBTrustDomain.h"
 #include "ScopedNSSTypes.h"
 #include "SharedCertVerifier.h"
 #include "certdb.h"
 #include "cms.h"
 #include "mozilla/Base64.h"
 #include "mozilla/Casting.h"
 #include "mozilla/Logging.h"
+#include "mozilla/Preferences.h"
 #include "mozilla/RefPtr.h"
 #include "mozilla/UniquePtr.h"
 #include "mozilla/Unused.h"
 #include "nsCOMPtr.h"
 #include "nsComponentManagerUtils.h"
 #include "nsDependentString.h"
 #include "nsHashKeys.h"
 #include "nsIDirectoryEnumerator.h"
@@ -834,18 +835,25 @@ VerifySignature(AppTrustedRoot trustedRo
     return NS_ERROR_CMS_VERIFY_ERROR_PROCESSING;
   }
 
   return MapSECStatus(
     NSS_CMSSignerInfo_Verify(signerInfo, const_cast<SECItem*>(detachedDigest),
                              &pkcs7DataOid));
 }
 
+// This corresponds to the preference "security.signed_app_signatures.policy".
+enum class SignaturePolicy {
+  PKCS7WithSHA1OrSHA256 = 0,
+  PKCS7WithSHA256 = 1,
+};
+
 nsresult
 OpenSignedAppFile(AppTrustedRoot aTrustedRoot, nsIFile* aJarFile,
+                  SignaturePolicy aPolicy,
                   /*out, optional */ nsIZipReader** aZipReader,
                   /*out, optional */ nsIX509Cert** aSignerCert)
 {
   NS_ENSURE_ARG_POINTER(aJarFile);
 
   if (aZipReader) {
     *aZipReader = nullptr;
   }
@@ -900,16 +908,26 @@ OpenSignedAppFile(AppTrustedRoot aTruste
   UniqueCERTCertList builtChain;
   SECOidTag digestToUse;
   rv = VerifySignature(aTrustedRoot, sigBuffer, sfCalculatedSHA1Digest.get(),
                        sfCalculatedSHA256Digest.get(), digestToUse, builtChain);
   if (NS_FAILED(rv)) {
     return rv;
   }
 
+  switch (aPolicy) {
+    case SignaturePolicy::PKCS7WithSHA256:
+      if (digestToUse != SEC_OID_SHA256) {
+        return NS_ERROR_SIGNED_JAR_WRONG_SIGNATURE;
+      }
+      break;
+    case SignaturePolicy::PKCS7WithSHA1OrSHA256:
+      break;
+  }
+
   nsAutoCString mfDigest;
   rv = ParseSF(BitwiseCast<char*, unsigned char*>(sfBuffer.data), digestToUse,
                mfDigest);
   if (NS_FAILED(rv)) {
     return rv;
   }
 
   // Manifest (MF) file
@@ -1032,59 +1050,82 @@ OpenSignedAppFile(AppTrustedRoot aTruste
 
   return NS_OK;
 }
 
 class OpenSignedAppFileTask final : public CryptoTask
 {
 public:
   OpenSignedAppFileTask(AppTrustedRoot aTrustedRoot, nsIFile* aJarFile,
+                        SignaturePolicy aPolicy,
                         nsIOpenSignedAppFileCallback* aCallback)
     : mTrustedRoot(aTrustedRoot)
     , mJarFile(aJarFile)
+    , mPolicy(aPolicy)
     , mCallback(new nsMainThreadPtrHolder<nsIOpenSignedAppFileCallback>(
         "OpenSignedAppFileTask::mCallback", aCallback))
   {
   }
 
 private:
   virtual nsresult CalculateResult() override
   {
-    return OpenSignedAppFile(mTrustedRoot, mJarFile,
+    return OpenSignedAppFile(mTrustedRoot, mJarFile, mPolicy,
                              getter_AddRefs(mZipReader),
                              getter_AddRefs(mSignerCert));
   }
 
   // nsNSSCertificate implements nsNSSShutdownObject, so there's nothing that
   // needs to be released
   virtual void ReleaseNSSResources() override { }
 
   virtual void CallCallback(nsresult rv) override
   {
     (void) mCallback->OpenSignedAppFileFinished(rv, mZipReader, mSignerCert);
   }
 
   const AppTrustedRoot mTrustedRoot;
   const nsCOMPtr<nsIFile> mJarFile;
+  const SignaturePolicy mPolicy;
   nsMainThreadPtrHandle<nsIOpenSignedAppFileCallback> mCallback;
   nsCOMPtr<nsIZipReader> mZipReader; // out
   nsCOMPtr<nsIX509Cert> mSignerCert; // out
 };
 
+static const SignaturePolicy sDefaultSignaturePolicy =
+  SignaturePolicy::PKCS7WithSHA1OrSHA256;
+
 } // unnamed namespace
 
 NS_IMETHODIMP
 nsNSSCertificateDB::OpenSignedAppFileAsync(
   AppTrustedRoot aTrustedRoot, nsIFile* aJarFile,
   nsIOpenSignedAppFileCallback* aCallback)
 {
   NS_ENSURE_ARG_POINTER(aJarFile);
   NS_ENSURE_ARG_POINTER(aCallback);
+  if (!NS_IsMainThread()) {
+    return NS_ERROR_NOT_SAME_THREAD;
+  }
+  SignaturePolicy policy =
+    static_cast<SignaturePolicy>(
+      Preferences::GetInt("security.signed_app_signatures.policy",
+                          static_cast<int32_t>(sDefaultSignaturePolicy)));
+  switch (policy) {
+    case SignaturePolicy::PKCS7WithSHA1OrSHA256:
+      break;
+    case SignaturePolicy::PKCS7WithSHA256:
+      break;
+    default:
+      policy = sDefaultSignaturePolicy;
+      break;
+  }
   RefPtr<OpenSignedAppFileTask> task(new OpenSignedAppFileTask(aTrustedRoot,
                                                                aJarFile,
+                                                               policy,
                                                                aCallback));
   return task->Dispatch("SignedJAR");
 }
 
 NS_IMETHODIMP
 nsNSSCertificateDB::VerifySignedDirectoryAsync(AppTrustedRoot, nsIFile*,
   nsIVerifySignedDirectoryCallback* aCallback)
 {
--- a/security/manager/ssl/security-prefs.js
+++ b/security/manager/ssl/security-prefs.js
@@ -62,16 +62,22 @@ pref("security.OCSP.timeoutMilliseconds.
 pref("security.OCSP.timeoutMilliseconds.hard", 10000);
 
 pref("security.pki.cert_short_lifetime_in_days", 10);
 // NB: Changes to this pref affect CERT_CHAIN_SHA1_POLICY_STATUS telemetry.
 // See the comment in CertVerifier.cpp.
 // 3 = only allow SHA-1 for certificates issued by an imported root.
 pref("security.pki.sha1_enforcement_level", 3);
 
+// This preference controls what signature algorithms are accepted for signed
+// apps (i.e. add-ons).
+// 0: SHA-1 and/or SHA-256 PKCS#7 allowed
+// 1: SHA-256 PKCS#7 allowed
+pref("security.signed_app_signatures.policy", 0);
+
 // security.pki.name_matching_mode controls how the platform matches hostnames
 // to name information in TLS certificates. The possible values are:
 // 0: always fall back to the subject common name if necessary (as in, if the
 //    subject alternative name extension is either not present or does not
 //    contain any DNS names or IP addresses)
 // 1: fall back to the subject common name for certificates valid before 23
 //    August 2016 if necessary
 // 2: fall back to the subject common name for certificates valid before 23
--- a/security/manager/ssl/tests/unit/test_signed_apps.js
+++ b/security/manager/ssl/tests/unit/test_signed_apps.js
@@ -184,148 +184,188 @@ var hashTestcases = [
   { name: "app_mf-256_sf-1-256_p7-1",
     expectedResult: Cr.NS_ERROR_SIGNED_JAR_MANIFEST_INVALID },
   { name: "app_mf-256_sf-1_p7-1",
     expectedResult: Cr.NS_ERROR_SIGNED_JAR_MANIFEST_INVALID },
   { name: "app_mf-256_sf-256_p7-1",
     expectedResult: Cr.NS_ERROR_SIGNED_JAR_MANIFEST_INVALID },
 ];
 
+// Policy values for the preference "security.signed_app_signatures.policy"
+const PKCS7WithSHA1OrSHA256 = 0;
+const PKCS7WithSHA256 = 1;
+
+function add_signature_test(policy, test) {
+  // First queue up a test to set the desired policy:
+  add_test(function () {
+    Services.prefs.setIntPref("security.signed_app_signatures.policy", policy);
+    run_next_test();
+  });
+  // Then queue up the test itself:
+  add_test(test);
+}
+
 for (let testcase of hashTestcases) {
-  add_test(function () {
+  add_signature_test(PKCS7WithSHA1OrSHA256, function () {
     certdb.openSignedAppFileAsync(
       Ci.nsIX509CertDB.AppXPCShellRoot,
       original_app_path(testcase.name),
       check_open_result(testcase.name, testcase.expectedResult));
   });
 }
 
-add_test(function () {
+add_signature_test(PKCS7WithSHA1OrSHA256, function () {
   certdb.openSignedAppFileAsync(
     Ci.nsIX509CertDB.AppXPCShellRoot,
     original_app_path("empty_signerInfos"),
     check_open_result("the signerInfos in the PKCS#7 signature is empty",
                       Cr.NS_ERROR_CMS_VERIFY_NOT_SIGNED));
 });
 
-add_test(function () {
+add_signature_test(PKCS7WithSHA1OrSHA256, function () {
   certdb.openSignedAppFileAsync(
     Ci.nsIX509CertDB.AppXPCShellRoot, original_app_path("unsigned_app"),
     check_open_result("unsigned", Cr.NS_ERROR_SIGNED_JAR_NOT_SIGNED));
 });
 
-add_test(function () {
+add_signature_test(PKCS7WithSHA1OrSHA256, function () {
   certdb.openSignedAppFileAsync(
     Ci.nsIX509CertDB.AppXPCShellRoot, original_app_path("unknown_issuer_app"),
     check_open_result("unknown_issuer",
                       getXPCOMStatusFromNSS(SEC_ERROR_UNKNOWN_ISSUER)));
 });
 
 // Sanity check to ensure a no-op tampering gives a valid result
-add_test(function () {
+add_signature_test(PKCS7WithSHA1OrSHA256, function () {
   let tampered = tampered_app_path("identity_tampering");
   tamper(original_app_path("app_mf-1_sf-1_p7-1"), tampered, { }, []);
   certdb.openSignedAppFileAsync(
     Ci.nsIX509CertDB.AppXPCShellRoot, original_app_path("app_mf-1_sf-1_p7-1"),
     check_open_result("identity_tampering", Cr.NS_OK));
 });
 
-add_test(function () {
+add_signature_test(PKCS7WithSHA1OrSHA256, function () {
   let tampered = tampered_app_path("missing_rsa");
   tamper(original_app_path("app_mf-1_sf-1_p7-1"), tampered,
          { "META-INF/A.RSA": removeEntry }, []);
   certdb.openSignedAppFileAsync(
     Ci.nsIX509CertDB.AppXPCShellRoot, tampered,
     check_open_result("missing_rsa", Cr.NS_ERROR_SIGNED_JAR_NOT_SIGNED));
 });
 
-add_test(function () {
+add_signature_test(PKCS7WithSHA1OrSHA256, function () {
   let tampered = tampered_app_path("missing_sf");
   tamper(original_app_path("app_mf-1_sf-1_p7-1"), tampered,
          { "META-INF/A.SF": removeEntry }, []);
   certdb.openSignedAppFileAsync(
     Ci.nsIX509CertDB.AppXPCShellRoot, tampered,
     check_open_result("missing_sf", Cr.NS_ERROR_SIGNED_JAR_MANIFEST_INVALID));
 });
 
-add_test(function () {
+add_signature_test(PKCS7WithSHA1OrSHA256, function () {
   let tampered = tampered_app_path("missing_manifest_mf");
   tamper(original_app_path("app_mf-1_sf-1_p7-1"), tampered,
          { "META-INF/MANIFEST.MF": removeEntry }, []);
   certdb.openSignedAppFileAsync(
     Ci.nsIX509CertDB.AppXPCShellRoot, tampered,
     check_open_result("missing_manifest_mf",
                       Cr.NS_ERROR_SIGNED_JAR_MANIFEST_INVALID));
 });
 
-add_test(function () {
+add_signature_test(PKCS7WithSHA1OrSHA256, function () {
   let tampered = tampered_app_path("missing_entry");
   tamper(original_app_path("app_mf-1_sf-1_p7-1"), tampered,
          { "manifest.json": removeEntry }, []);
   certdb.openSignedAppFileAsync(
     Ci.nsIX509CertDB.AppXPCShellRoot, tampered,
     check_open_result("missing_entry", Cr.NS_ERROR_SIGNED_JAR_ENTRY_MISSING));
 });
 
-add_test(function () {
+add_signature_test(PKCS7WithSHA1OrSHA256, function () {
   let tampered = tampered_app_path("truncated_entry");
   tamper(original_app_path("app_mf-1_sf-1_p7-1"), tampered,
          { "manifest.json": truncateEntry }, []);
   certdb.openSignedAppFileAsync(
     Ci.nsIX509CertDB.AppXPCShellRoot, tampered,
     check_open_result("truncated_entry",
                       Cr.NS_ERROR_SIGNED_JAR_MODIFIED_ENTRY));
 });
 
-add_test(function () {
+add_signature_test(PKCS7WithSHA1OrSHA256, function () {
   let tampered = tampered_app_path("truncated_manifestFile");
   tamper(original_app_path("app_mf-1_sf-1_p7-1"), tampered,
          { "META-INF/MANIFEST.MF": truncateEntry }, []);
   certdb.openSignedAppFileAsync(
     Ci.nsIX509CertDB.AppXPCShellRoot, tampered,
     check_open_result("truncated_manifestFile",
                       Cr.NS_ERROR_SIGNED_JAR_MANIFEST_INVALID));
 });
 
-add_test(function () {
+add_signature_test(PKCS7WithSHA1OrSHA256, function () {
   let tampered = tampered_app_path("truncated_signatureFile");
   tamper(original_app_path("app_mf-1_sf-1_p7-1"), tampered,
          { "META-INF/A.SF": truncateEntry }, []);
   certdb.openSignedAppFileAsync(
     Ci.nsIX509CertDB.AppXPCShellRoot, tampered,
     check_open_result("truncated_signatureFile",
                       getXPCOMStatusFromNSS(SEC_ERROR_PKCS7_BAD_SIGNATURE)));
 });
 
-add_test(function () {
+add_signature_test(PKCS7WithSHA1OrSHA256, function () {
   let tampered = tampered_app_path("truncated_pkcs7File");
   tamper(original_app_path("app_mf-1_sf-1_p7-1"), tampered,
          { "META-INF/A.RSA": truncateEntry }, []);
   certdb.openSignedAppFileAsync(
     Ci.nsIX509CertDB.AppXPCShellRoot, tampered,
     check_open_result("truncated_pkcs7File",
                       Cr.NS_ERROR_CMS_VERIFY_NOT_SIGNED));
 });
 
-add_test(function () {
+add_signature_test(PKCS7WithSHA1OrSHA256, function () {
   let tampered = tampered_app_path("unsigned_entry");
   tamper(original_app_path("app_mf-1_sf-1_p7-1"), tampered, {},
     [ { "name": "unsigned.txt", "content": "unsigned content!" } ]);
   certdb.openSignedAppFileAsync(
     Ci.nsIX509CertDB.AppXPCShellRoot, tampered,
     check_open_result("unsigned_entry", Cr.NS_ERROR_SIGNED_JAR_UNSIGNED_ENTRY));
 });
 
-add_test(function () {
+add_signature_test(PKCS7WithSHA1OrSHA256, function () {
   let tampered = tampered_app_path("unsigned_metainf_entry");
   tamper(original_app_path("app_mf-1_sf-1_p7-1"), tampered, {},
     [ { name: "META-INF/unsigned.txt", content: "unsigned content!" } ]);
   certdb.openSignedAppFileAsync(
     Ci.nsIX509CertDB.AppXPCShellRoot, tampered,
     check_open_result("unsigned_metainf_entry",
                       Cr.NS_ERROR_SIGNED_JAR_UNSIGNED_ENTRY));
 });
 
+add_signature_test(PKCS7WithSHA256, function testSHA1Disabled() {
+  certdb.openSignedAppFileAsync(
+    Ci.nsIX509CertDB.AppXPCShellRoot,
+    original_app_path("app_mf-1_sf-1_p7-1"),
+    check_open_result("SHA-1 should not be accepted if disabled by policy",
+                      Cr.NS_ERROR_SIGNED_JAR_WRONG_SIGNATURE));
+});
+
+add_signature_test(PKCS7WithSHA256, function testSHA256WorksWithSHA1Disabled() {
+  certdb.openSignedAppFileAsync(
+    Ci.nsIX509CertDB.AppXPCShellRoot,
+    original_app_path("app_mf-256_sf-256_p7-256"),
+    check_open_result("SHA-256 should work if SHA-1 is disabled by policy",
+                      Cr.NS_OK));
+});
+
+add_signature_test(PKCS7WithSHA256,
+  function testMultipleSignaturesWorkWithSHA1Disabled() {
+    certdb.openSignedAppFileAsync(
+      Ci.nsIX509CertDB.AppXPCShellRoot,
+      original_app_path("app_mf-1-256_sf-1-256_p7-1-256"),
+      check_open_result("Multiple signatures should work if SHA-1 is " +
+                        "disabled by policy (if SHA-256 signature verifies)",
+                        Cr.NS_OK));
+});
+
 // TODO: tampered MF, tampered SF
 // TODO: too-large MF, too-large RSA, too-large SF
 // TODO: MF and SF that end immediately after the last main header
 //       (no CR nor LF)
 // TODO: broken headers to exercise the parser
--- a/services/fxaccounts/FxAccountsConfig.jsm
+++ b/services/fxaccounts/FxAccountsConfig.jsm
@@ -23,16 +23,17 @@ const CONFIG_PREFS = [
   "identity.fxaccounts.remote.profile.uri",
   "identity.sync.tokenserver.uri",
   "identity.fxaccounts.remote.webchannel.uri",
   "identity.fxaccounts.settings.uri",
   "identity.fxaccounts.settings.devices.uri",
   "identity.fxaccounts.remote.signup.uri",
   "identity.fxaccounts.remote.signin.uri",
   "identity.fxaccounts.remote.email.uri",
+  "identity.fxaccounts.remote.connectdevice.uri",
   "identity.fxaccounts.remote.force_auth.uri",
 ];
 
 this.FxAccountsConfig = {
 
   async _getPrefURL(prefName) {
     await this.ensureConfigured();
     let url = Services.urlFormatter.formatURLPref(prefName);
@@ -140,16 +141,17 @@ this.FxAccountsConfig = {
         Services.prefs.getCharPref("identity.fxaccounts.contextParam"));
 
       Services.prefs.setCharPref("identity.fxaccounts.remote.webchannel.uri", rootURL);
       Services.prefs.setCharPref("identity.fxaccounts.settings.uri", rootURL + "/settings?service=sync&context=" + contextParam);
       Services.prefs.setCharPref("identity.fxaccounts.settings.devices.uri", rootURL + "/settings/clients?service=sync&context=" + contextParam);
       Services.prefs.setCharPref("identity.fxaccounts.remote.signup.uri", rootURL + "/signup?service=sync&context=" + contextParam);
       Services.prefs.setCharPref("identity.fxaccounts.remote.signin.uri", rootURL + "/signin?service=sync&context=" + contextParam);
       Services.prefs.setCharPref("identity.fxaccounts.remote.email.uri", rootURL + "/?service=sync&context=" + contextParam + "&action=email");
+      Services.prefs.setCharPref("identity.fxaccounts.remote.connectdevice.uri", rootURL + "/connect_another_device?service=sync&context=" + contextParam);
       Services.prefs.setCharPref("identity.fxaccounts.remote.force_auth.uri", rootURL + "/force_auth?service=sync&context=" + contextParam);
 
       // Ensure the webchannel is pointed at the correct uri
       EnsureFxAccountsWebChannel();
     } catch (e) {
       log.error("Failed to initialize configuration preferences from autoconfig object", e);
       throw e;
     }
--- a/services/sync/modules/service.js
+++ b/services/sync/modules/service.js
@@ -64,17 +64,16 @@ function getEngineModules() {
 
 // A unique identifier for this browser session. Used for logging so
 // we can easily see whether 2 logs are in the same browser session or
 // after the browser restarted.
 XPCOMUtils.defineLazyGetter(this, "browserSessionID", Utils.makeGUID);
 
 function Sync11Service() {
   this._notify = Utils.notify("weave:service:");
-  this.scheduler = new SyncScheduler(this);
 }
 Sync11Service.prototype = {
 
   _lock: Utils.lock,
   _locked: false,
   _loggedIn: false,
 
   infoURL: null,
@@ -288,16 +287,17 @@ Sync11Service.prototype = {
   /**
    * Prepare to initialize the rest of Weave after waiting a little bit
    */
   async onStartup() {
     this.status = Status;
     this.identity = Status._authManager;
     this.collectionKeys = new CollectionKeyManager();
 
+    this.scheduler = new SyncScheduler(this);
     this.errorHandler = new ErrorHandler(this);
 
     this._log = Log.repository.getLogger("Sync.Service");
     this._log.level =
       Log.Level[Svc.Prefs.get("log.logger.service.main")];
 
     this._log.info("Loading Weave " + WEAVE_VERSION);
 
@@ -1079,16 +1079,17 @@ Sync11Service.prototype = {
       return "";
 
     return reason;
   },
 
   async sync({engines, why} = {}) {
     let dateStr = Utils.formatTimestamp(new Date());
     this._log.debug("User-Agent: " + Utils.userAgent);
+    await this.promiseInitialized;
     this._log.info(`Starting sync at ${dateStr} in browser session ${browserSessionID}`);
     return this._catch(async function() {
       // Make sure we're logged in.
       if (this._shouldLogin()) {
         this._log.debug("In sync: should login.");
         if (!(await this.login())) {
           this._log.debug("Not syncing: login returned false.");
           return;
--- a/services/sync/modules/telemetry.js
+++ b/services/sync/modules/telemetry.js
@@ -487,25 +487,26 @@ class SyncTelemetryImpl {
 
   submit(record) {
     if (Services.prefs.prefHasUserValue("identity.sync.tokenserver.uri")) {
       log.trace(`Not sending telemetry ping for self-hosted Sync user`);
       return false;
     }
     // We still call submit() with possibly illegal payloads so that tests can
     // know that the ping was built. We don't end up submitting them, however.
-    if (record.syncs.length) {
-      log.trace(`submitting ${record.syncs.length} sync record(s) to telemetry`);
+    let numEvents = record.events ? record.events.length : 0;
+    if (record.syncs.length || numEvents) {
+      log.trace(`submitting ${record.syncs.length} sync record(s) and ` +
+                `${numEvents} event(s) to telemetry`);
       TelemetryController.submitExternalPing("sync", record);
       return true;
     }
     return false;
   }
 
-
   onSyncStarted(data) {
     const why = data && JSON.parse(data).why;
     if (this.current) {
       log.warn("Observed weave:service:sync:start, but we're already recording a sync!");
       // Just discard the old record, consistent with our handling of engines, above.
       this.current = null;
     }
     this.current = new TelemetryRecord(this.allowedEngines, why);
@@ -589,19 +590,19 @@ class SyncTelemetryImpl {
     let event = [ts, category, method, object];
     // It may have up to 6 elements if |extra| is defined
     if (value) {
       event.push(value);
       if (extra) {
         event.push(extra);
       }
     } else if (extra) {
-        event.push(null); // a null for the empty value.
-        event.push(extra);
-      }
+      event.push(null); // a null for the empty value.
+      event.push(extra);
+    }
     this.events.push(event);
   }
 
   observe(subject, topic, data) {
     log.trace(`observed ${topic} ${data}`);
 
     switch (topic) {
       case "profile-before-change":
--- a/services/sync/tests/tps/test_tabs.js
+++ b/services/sync/tests/tps/test_tabs.js
@@ -12,28 +12,28 @@ var phases = { "phase1": "profile1",
                "phase2": "profile2",
                "phase3": "profile1"};
 
 /*
  * Tab lists.
  */
 
 var tabs1 = [
-  { uri: "http://mozqa.com/data/firefox/layout/mozilla.html",
+  { uri: "https://mozqa.com/data/firefox/layout/mozilla.html",
     title: "Mozilla",
     profile: "profile1"
   },
   { uri: "data:text/html,<html><head><title>Hello</title></head><body>Hello</body></html>",
     title: "Hello",
     profile: "profile1"
   }
 ];
 
 var tabs2 = [
-  { uri: "http://mozqa.com/data/firefox/layout/mozilla_community.html",
+  { uri: "https://mozqa.com/data/firefox/layout/mozilla_community.html",
     title: "Mozilla Community",
     profile: "profile2"
   },
   { uri: "data:text/html,<html><head><title>Bye</title></head><body>Bye</body></html>",
     profile: "profile2"
   }
 ];
 
--- a/services/sync/tests/unit/sync_ping_schema.json
+++ b/services/sync/tests/unit/sync_ping_schema.json
@@ -15,17 +15,17 @@
     },
     "deviceID": {
       "type": "string",
       "pattern": "^[0-9a-f]{64}$"
     },
     "sessionStartDate": { "type": "string" },
     "syncs": {
       "type": "array",
-      "minItems": 1,
+      "minItems": 0,
       "items": { "$ref": "#/definitions/payload" }
     },
     "events": {
       "type": "array",
       "minItems": 1,
       "items": { "$ref": "#/definitions/event" }
     }
   },
--- a/services/sync/tests/unit/test_telemetry.js
+++ b/services/sync/tests/unit/test_telemetry.js
@@ -665,16 +665,24 @@ add_task(async function test_events() {
     equal(ping.events[0].length, 5);
 
     Service.recordTelemetryEvent("object", "method", undefined, { foo: "bar" });
     ping = await wait_for_ping(() => Service.sync(), false, true);
     equal(ping.events.length, 1);
     equal(ping.events[0].length, 6);
     [timestamp, category, method, object, value, extra] = ping.events[0];
     equal(value, null);
+
+    Service.recordTelemetryEvent("object", "method", undefined, { foo: "bar" });
+    let telem = get_sync_test_telemetry();
+    // Fake a submission due to shutdown.
+    ping = await wait_for_ping(() => telem.finish("shutdown"), false, true);
+    equal(ping.syncs.length, 0);
+    equal(ping.events.length, 1);
+    equal(ping.events[0].length, 6);
   } finally {
     await cleanAndGo(engine, server);
     Service.engineManager.unregister(engine);
   }
 });
 
 add_task(async function test_invalid_events() {
   enableValidationPrefs();
--- a/servo/Cargo.lock
+++ b/servo/Cargo.lock
@@ -539,28 +539,28 @@ dependencies = [
 
 [[package]]
 name = "core-graphics"
 version = "0.12.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "bitflags 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-foundation 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "foreign-types 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "core-text"
 version = "8.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "core-foundation 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-graphics 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "foreign-types 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "cssparser"
 version = "0.22.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
@@ -946,22 +946,25 @@ source = "git+https://github.com/servo/f
 dependencies = [
  "cmake 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
  "miniz-sys 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "foreign-types"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "foreign-types"
-version = "0.3.0"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "foreign-types-shared"
+version = "0.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "freetype"
 version = "0.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1285,17 +1288,17 @@ dependencies = [
 
 [[package]]
 name = "hyper-openssl"
 version = "0.2.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "antidote 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "hyper 0.10.13 (registry+https://github.com/rust-lang/crates.io-index)",
- "openssl 0.9.21 (registry+https://github.com/rust-lang/crates.io-index)",
+ "openssl 0.9.22 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "hyper_serde"
 version = "0.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "cookie 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1944,17 +1947,17 @@ dependencies = [
  "ipc-channel 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "lazy_static 0.2.9 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "matches 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "mime 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "mime_guess 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "msg 0.0.1",
  "net_traits 0.0.1",
- "openssl 0.9.21 (registry+https://github.com/rust-lang/crates.io-index)",
+ "openssl 0.9.22 (registry+https://github.com/rust-lang/crates.io-index)",
  "profile_traits 0.0.1",
  "serde 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde_json 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "servo-websocket 0.20.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "servo_config 0.0.1",
  "servo_url 0.0.1",
  "threadpool 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "time 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -2168,29 +2171,29 @@ dependencies = [
 
 [[package]]
 name = "open"
 version = "1.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "openssl"
-version = "0.9.21"
+version = "0.9.22"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "bitflags 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "foreign-types 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "lazy_static 0.2.9 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
- "openssl-sys 0.9.21 (registry+https://github.com/rust-lang/crates.io-index)",
+ "openssl-sys 0.9.22 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "openssl-sys"
-version = "0.9.21"
+version = "0.9.22"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "cc 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
  "pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
  "vcpkg 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
@@ -2905,17 +2908,17 @@ dependencies = [
 name = "servo-websocket"
 version = "0.20.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "bitflags 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "byteorder 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "hyper 0.10.13 (registry+https://github.com/rust-lang/crates.io-index)",
  "net2 0.2.29 (registry+https://github.com/rust-lang/crates.io-index)",
- "openssl 0.9.21 (registry+https://github.com/rust-lang/crates.io-index)",
+ "openssl 0.9.22 (registry+https://github.com/rust-lang/crates.io-index)",
  "rand 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
  "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)",
  "unicase 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "url 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "servo_allocator"
@@ -3835,18 +3838,18 @@ dependencies = [
 "checksum enum_primitive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "be4551092f4d519593039259a9ed8daedf0da12e5109c5280338073eaeb81180"
 "checksum env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3ddf21e73e016298f5cb37d6ef8e8da8e39f91f9ec8b0df44b7deb16a9f8cd5b"
 "checksum error-chain 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d9435d864e017c3c6afeac1654189b06cdb491cf2ff73dbf0d73b0f292f42ff8"
 "checksum euclid 0.15.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f5ed7d77e46f6600f490463ad7b6349c3ebb2d2319af56e679e279e4c66495d9"
 "checksum expat-sys 2.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c470ccb972f2088549b023db8029ed9da9426f5affbf9b62efff7009ab8ed5b1"
 "checksum flate2 0.2.19 (registry+https://github.com/rust-lang/crates.io-index)" = "36df0166e856739905cd3d7e0b210fe818592211a008862599845e012d8d304c"
 "checksum fnv 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "6cc484842f1e2884faf56f529f960cc12ad8c71ce96cc7abba0a067c98fee344"
 "checksum fontsan 0.4.0 (git+https://github.com/servo/fontsan)" = "<none>"
-"checksum foreign-types 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3e4056b9bd47f8ac5ba12be771f77a0dae796d1bbaaf5fd0b9c2d38b69b8a29d"
-"checksum foreign-types 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5ebc04f19019fff1f2d627b5581574ead502f80c48c88900575a46e0840fe5d0"
+"checksum foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1"
+"checksum foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
 "checksum freetype 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "398b8a11884898184d55aca9806f002b3cf68f0e860e0cbb4586f834ee39b0e7"
 "checksum futf 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "51f93f3de6ba1794dcd5810b3546d004600a59a98266487c8407bc4b24e398f3"
 "checksum futures 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "55f0008e13fc853f79ea8fc86e931486860d4c4c156cdffb59fa5f7fa833660a"
 "checksum fxhash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c"
 "checksum gaol 0.0.1 (git+https://github.com/servo/gaol)" = "<none>"
 "checksum gcc 0.3.47 (registry+https://github.com/rust-lang/crates.io-index)" = "5773372df827453bc38d4fd8efe425c7f28b1f54468816183fc8716cfb90bd30"
 "checksum gdi32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0912515a8ff24ba900422ecda800b52f4016a56251922d397c576bf92c690518"
 "checksum gecko-media 0.1.0 (git+https://github.com/servo/gecko-media.git)" = "<none>"
@@ -3922,18 +3925,18 @@ dependencies = [
 "checksum objc 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "877f30f37acef6749b1841cceab289707f211aecfc756553cd63976190e6cc2e"
 "checksum objc-foundation 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9"
 "checksum objc_id 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e4730aa1c64d722db45f7ccc4113a3e2c465d018de6db4d3e7dfe031e8c8a297"
 "checksum odds 0.2.25 (registry+https://github.com/rust-lang/crates.io-index)" = "c3df9b730298cea3a1c3faa90b7e2f9df3a9c400d0936d6015e6165734eefcba"
 "checksum offscreen_gl_context 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9b688b0c4cb779a362244ef5f6a14c87969cf94b0fde487820cac4cc75f851ff"
 "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.21 (registry+https://github.com/rust-lang/crates.io-index)" = "2225c305d8f57001a0d34263e046794aa251695f20773102fbbfeb1e7b189955"
-"checksum openssl-sys 0.9.21 (registry+https://github.com/rust-lang/crates.io-index)" = "92867746af30eea7a89feade385f7f5366776f1c52ec6f0de81360373fa88363"
+"checksum openssl 0.9.22 (registry+https://github.com/rust-lang/crates.io-index)" = "419ef26bb651d72b6c5a603bcc4e4856a362460e62352dfffa53de91d2e81181"
+"checksum openssl-sys 0.9.22 (registry+https://github.com/rust-lang/crates.io-index)" = "5483bdc56756041ba6aa37c9cb59cc2219f012a2a1377d97ad35556ac6676ee7"
 "checksum ordered-float 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "da12c96037889ae0be29dd2bdd260e5a62a7df24e6466d5a15bb8131c1c200a8"
 "checksum osmesa-src 17.3.1-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 peeking_take_while 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099"
--- a/servo/components/style/data.rs
+++ b/servo/components/style/data.rs
@@ -234,17 +234,17 @@ impl ElementData {
     /// Invalidates style for this element, its descendants, and later siblings,
     /// based on the snapshot of the element that we took when attributes or
     /// state changed.
     pub fn invalidate_style_if_needed<'a, E: TElement>(
         &mut self,
         element: E,
         shared_context: &SharedStyleContext,
         stack_limit_checker: Option<&StackLimitChecker>,
-        nth_index_cache: Option<&mut NthIndexCache>,
+        nth_index_cache: &mut NthIndexCache,
     ) -> InvalidationResult {
         // In animation-only restyle we shouldn't touch snapshot at all.
         if shared_context.traversal_flags.for_animation_only() {
             return InvalidationResult::empty();
         }
 
         use invalidation::element::collector::StateAndAttrInvalidationProcessor;
         use invalidation::element::invalidator::TreeStyleInvalidator;
--- a/servo/components/style/gecko/generated/structs.rs
+++ b/servo/components/style/gecko/generated/structs.rs
@@ -405,16 +405,19 @@ pub type ServoStyleContextStrong = ::gec
  # [ link_name = "\u{1}_ZN7mozilla10StylePrefs28sFramesTimingFunctionEnabledE" ] 
  pub static mut  StylePrefs_sFramesTimingFunctionEnabled  :  bool ;
 } extern "C" {
  # [ link_name = "\u{1}_ZN7mozilla10StylePrefs31sUnprefixedFullscreenApiEnabledE" ] 
  pub static mut  StylePrefs_sUnprefixedFullscreenApiEnabled  :  bool ;
 } extern "C" {
  # [ link_name = "\u{1}_ZN7mozilla10StylePrefs20sVisitedLinksEnabledE" ] 
  pub static mut  StylePrefs_sVisitedLinksEnabled  :  bool ;
+} extern "C" {
+ # [ link_name = "\u{1}_ZN7mozilla10StylePrefs20sMozDocumentEnabledInContentE" ] 
+ pub static mut  StylePrefs_sMozDocumentEnabledInContent :  bool ;
 } # [ test ] fn bindgen_test_layout_StylePrefs ( ) { assert_eq ! ( :: std :: mem :: size_of :: < StylePrefs > ( ) , 1usize , concat ! ( "Size of: " , stringify ! ( StylePrefs ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < StylePrefs > ( ) , 1usize , concat ! ( "Alignment of " , stringify ! ( StylePrefs ) ) ) ; } impl Clone for StylePrefs { fn clone ( & self ) -> Self { * self } } # [ repr ( C ) ] # [ derive ( Debug , Copy ) ] pub struct NonOwningAnimationTarget { pub mElement : * mut root :: mozilla :: dom :: Element , pub mPseudoType : root :: mozilla :: CSSPseudoElementType , } # [ test ] fn bindgen_test_layout_NonOwningAnimationTarget ( ) { assert_eq ! ( :: std :: mem :: size_of :: < NonOwningAnimationTarget > ( ) , 16usize , concat ! ( "Size of: " , stringify ! ( NonOwningAnimationTarget ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < NonOwningAnimationTarget > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( NonOwningAnimationTarget ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const NonOwningAnimationTarget ) ) . mElement as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( NonOwningAnimationTarget ) , "::" , stringify ! ( mElement ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const NonOwningAnimationTarget ) ) . mPseudoType as * const _ as usize } , 8usize , concat ! ( "Alignment of field: " , stringify ! ( NonOwningAnimationTarget ) , "::" , stringify ! ( mPseudoType ) ) ) ; } impl Clone for NonOwningAnimationTarget { fn clone ( & self ) -> Self { * self } } # [ repr ( C ) ] pub struct PseudoElementHashEntry { pub _base : root :: PLDHashEntryHdr , pub mElement : root :: RefPtr < root :: mozilla :: dom :: Element > , pub mPseudoType : root :: mozilla :: CSSPseudoElementType , } pub type PseudoElementHashEntry_KeyType = root :: mozilla :: NonOwningAnimationTarget ; pub type PseudoElementHashEntry_KeyTypePointer = * const root :: mozilla :: NonOwningAnimationTarget ; pub const PseudoElementHashEntry_ALLOW_MEMMOVE : root :: mozilla :: PseudoElementHashEntry__bindgen_ty_1 = 1 ; pub type PseudoElementHashEntry__bindgen_ty_1 = :: std :: os :: raw :: c_uint ; # [ test ] fn bindgen_test_layout_PseudoElementHashEntry ( ) { assert_eq ! ( :: std :: mem :: size_of :: < PseudoElementHashEntry > ( ) , 24usize , concat ! ( "Size of: " , stringify ! ( PseudoElementHashEntry ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < PseudoElementHashEntry > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( PseudoElementHashEntry ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const PseudoElementHashEntry ) ) . mElement as * const _ as usize } , 8usize , concat ! ( "Alignment of field: " , stringify ! ( PseudoElementHashEntry ) , "::" , stringify ! ( mElement ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const PseudoElementHashEntry ) ) . mPseudoType as * const _ as usize } , 16usize , concat ! ( "Alignment of field: " , stringify ! ( PseudoElementHashEntry ) , "::" , stringify ! ( mPseudoType ) ) ) ; } # [ repr ( C ) ] # [ derive ( Debug ) ] pub struct EffectCompositor { pub mRefCnt : root :: nsCycleCollectingAutoRefCnt , pub mPresContext : * mut root :: nsPresContext , pub mElementsToRestyle : [ u64 ; 8usize ] , pub mIsInPreTraverse : bool , pub mRuleProcessors : [ u64 ; 2usize ] , } pub type EffectCompositor_HasThreadSafeRefCnt = root :: mozilla :: FalseType ; # [ repr ( C ) ] # [ derive ( Debug , Copy ) ] pub struct EffectCompositor_cycleCollection { pub _base : root :: nsCycleCollectionParticipant , } # [ test ] fn bindgen_test_layout_EffectCompositor_cycleCollection ( ) { assert_eq ! ( :: std :: mem :: size_of :: < EffectCompositor_cycleCollection > ( ) , 16usize , concat ! ( "Size of: " , stringify ! ( EffectCompositor_cycleCollection ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < EffectCompositor_cycleCollection > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( EffectCompositor_cycleCollection ) ) ) ; } impl Clone for EffectCompositor_cycleCollection { fn clone ( & self ) -> Self { * self } } # [ repr ( u32 ) ] # [ derive ( Debug , Copy , Clone , PartialEq , Eq , Hash ) ] pub enum EffectCompositor_CascadeLevel { Animations = 0 , Transitions = 1 , } pub const EffectCompositor_RestyleType_Throttled : root :: mozilla :: EffectCompositor_RestyleType = 0 ; pub const EffectCompositor_RestyleType_Standard : root :: mozilla :: EffectCompositor_RestyleType = 1 ; pub const EffectCompositor_RestyleType_Layer : root :: mozilla :: EffectCompositor_RestyleType = 2 ; pub type EffectCompositor_RestyleType = :: std :: os :: raw :: c_int ; # [ repr ( C ) ] # [ derive ( Debug ) ] pub struct EffectCompositor_AnimationStyleRuleProcessor { pub _base : root :: nsIStyleRuleProcessor , pub mRefCnt : root :: nsAutoRefCnt , pub mCompositor : * mut root :: mozilla :: EffectCompositor , pub mCascadeLevel : root :: mozilla :: EffectCompositor_CascadeLevel , } pub type EffectCompositor_AnimationStyleRuleProcessor_HasThreadSafeRefCnt = root :: mozilla :: FalseType ; # [ test ] fn bindgen_test_layout_EffectCompositor_AnimationStyleRuleProcessor ( ) { assert_eq ! ( :: std :: mem :: size_of :: < EffectCompositor_AnimationStyleRuleProcessor > ( ) , 32usize , concat ! ( "Size of: " , stringify ! ( EffectCompositor_AnimationStyleRuleProcessor ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < EffectCompositor_AnimationStyleRuleProcessor > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( EffectCompositor_AnimationStyleRuleProcessor ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const EffectCompositor_AnimationStyleRuleProcessor ) ) . mRefCnt as * const _ as usize } , 8usize , concat ! ( "Alignment of field: " , stringify ! ( EffectCompositor_AnimationStyleRuleProcessor ) , "::" , stringify ! ( mRefCnt ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const EffectCompositor_AnimationStyleRuleProcessor ) ) . mCompositor as * const _ as usize } , 16usize , concat ! ( "Alignment of field: " , stringify ! ( EffectCompositor_AnimationStyleRuleProcessor ) , "::" , stringify ! ( mCompositor ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const EffectCompositor_AnimationStyleRuleProcessor ) ) . mCascadeLevel as * const _ as usize } , 24usize , concat ! ( "Alignment of field: " , stringify ! ( EffectCompositor_AnimationStyleRuleProcessor ) , "::" , stringify ! ( mCascadeLevel ) ) ) ; } extern "C" {
  # [ link_name = "\u{1}_ZN7mozilla16EffectCompositor21_cycleCollectorGlobalE" ] 
  pub static mut  EffectCompositor__cycleCollectorGlobal  :  root :: mozilla :: EffectCompositor_cycleCollection ;
 } pub const EffectCompositor_kCascadeLevelCount : usize = 2 ; # [ test ] fn bindgen_test_layout_EffectCompositor ( ) { assert_eq ! ( :: std :: mem :: size_of :: < EffectCompositor > ( ) , 104usize , concat ! ( "Size of: " , stringify ! ( EffectCompositor ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < EffectCompositor > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( EffectCompositor ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const EffectCompositor ) ) . mRefCnt as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( EffectCompositor ) , "::" , stringify ! ( mRefCnt ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const EffectCompositor ) ) . mPresContext as * const _ as usize } , 8usize , concat ! ( "Alignment of field: " , stringify ! ( EffectCompositor ) , "::" , stringify ! ( mPresContext ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const EffectCompositor ) ) . mElementsToRestyle as * const _ as usize } , 16usize , concat ! ( "Alignment of field: " , stringify ! ( EffectCompositor ) , "::" , stringify ! ( mElementsToRestyle ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const EffectCompositor ) ) . mIsInPreTraverse as * const _ as usize } , 80usize , concat ! ( "Alignment of field: " , stringify ! ( EffectCompositor ) , "::" , stringify ! ( mIsInPreTraverse ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const EffectCompositor ) ) . mRuleProcessors as * const _ as usize } , 88usize , concat ! ( "Alignment of field: " , stringify ! ( EffectCompositor ) , "::" , stringify ! ( mRuleProcessors ) ) ) ; } pub type CSSPseudoClassTypeBase = u8 ; # [ repr ( u8 ) ] # [ derive ( Debug , Copy , Clone , PartialEq , Eq , Hash ) ] pub enum CSSPseudoClassType { empty = 0 , mozOnlyWhitespace = 1 , lang = 2 , root = 3 , any = 4 , firstChild = 5 , firstNode = 6 , lastChild = 7 , lastNode = 8 , onlyChild = 9 , firstOfType = 10 , lastOfType = 11 , onlyOfType = 12 , nthChild = 13 , nthLastChild = 14 , nthOfType = 15 , nthLastOfType = 16 , mozIsHTML = 17 , unresolved = 18 , mozNativeAnonymous = 19 , mozUseShadowTreeRoot = 20 , mozLocaleDir = 21 , mozLWTheme = 22 , mozLWThemeBrightText = 23 , mozLWThemeDarkText = 24 , mozWindowInactive = 25 , mozTableBorderNonzero = 26 , mozBrowserFrame = 27 , scope = 28 , negation = 29 , dir = 30 , link = 31 , mozAnyLink = 32 , anyLink = 33 , visited = 34 , active = 35 , checked = 36 , disabled = 37 , enabled = 38 , focus = 39 , focusWithin = 40 , hover = 41 , mozDragOver = 42 , target = 43 , indeterminate = 44 , mozDevtoolsHighlighted = 45 , mozStyleeditorTransitioning = 46 , fullscreen = 47 , mozFullScreen = 48 , mozFocusRing = 49 , mozBroken = 50 , mozLoading = 51 , mozUserDisabled = 52 , mozSuppressed = 53 , mozHandlerClickToPlay = 54 , mozHandlerVulnerableUpdatable = 55 , mozHandlerVulnerableNoUpdate = 56 , mozHandlerDisabled = 57 , mozHandlerBlocked = 58 , mozHandlerCrashed = 59 , mozMathIncrementScriptLevel = 60 , mozHasDirAttr = 61 , mozDirAttrLTR = 62 , mozDirAttrRTL = 63 , mozDirAttrLikeAuto = 64 , mozAutofill = 65 , mozAutofillPreview = 66 , required = 67 , optional = 68 , valid = 69 , invalid = 70 , inRange = 71 , outOfRange = 72 , defaultPseudo = 73 , placeholderShown = 74 , mozReadOnly = 75 , mozReadWrite = 76 , mozSubmitInvalid = 77 , mozUIInvalid = 78 , mozUIValid = 79 , mozMeterOptimum = 80 , mozMeterSubOptimum = 81 , mozMeterSubSubOptimum = 82 , mozPlaceholder = 83 , Count = 84 , NotPseudo = 85 , MAX = 86 , } # [ repr ( C ) ] pub struct GeckoFont { pub gecko : root :: nsStyleFont , } # [ test ] fn bindgen_test_layout_GeckoFont ( ) { assert_eq ! ( :: std :: mem :: size_of :: < GeckoFont > ( ) , 136usize , concat ! ( "Size of: " , stringify ! ( GeckoFont ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < GeckoFont > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( GeckoFont ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const GeckoFont ) ) . gecko as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( GeckoFont ) , "::" , stringify ! ( gecko ) ) ) ; } # [ repr ( C ) ] # [ derive ( Debug ) ] pub struct GeckoColor { pub gecko : root :: nsStyleColor , } # [ test ] fn bindgen_test_layout_GeckoColor ( ) { assert_eq ! ( :: std :: mem :: size_of :: < GeckoColor > ( ) , 4usize , concat ! ( "Size of: " , stringify ! ( GeckoColor ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < GeckoColor > ( ) , 4usize , concat ! ( "Alignment of " , stringify ! ( GeckoColor ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const GeckoColor ) ) . gecko as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( GeckoColor ) , "::" , stringify ! ( gecko ) ) ) ; } # [ repr ( C ) ] # [ derive ( Debug ) ] pub struct GeckoList { pub gecko : root :: nsStyleList , } # [ test ] fn bindgen_test_layout_GeckoList ( ) { assert_eq ! ( :: std :: mem :: size_of :: < GeckoList > ( ) , 48usize , concat ! ( "Size of: " , stringify ! ( GeckoList ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < GeckoList > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( GeckoList ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const GeckoList ) ) . gecko as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( GeckoList ) , "::" , stringify ! ( gecko ) ) ) ; } # [ repr ( C ) ] pub struct GeckoText { pub gecko : root :: nsStyleText , } # [ test ] fn bindgen_test_layout_GeckoText ( ) { assert_eq ! ( :: std :: mem :: size_of :: < GeckoText > ( ) , 160usize , concat ! ( "Size of: " , stringify ! ( GeckoText ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < GeckoText > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( GeckoText ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const GeckoText ) ) . gecko as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( GeckoText ) , "::" , stringify ! ( gecko ) ) ) ; } # [ repr ( C ) ] # [ derive ( Debug ) ] pub struct GeckoVisibility { pub gecko : root :: nsStyleVisibility , } # [ test ] fn bindgen_test_layout_GeckoVisibility ( ) { assert_eq ! ( :: std :: mem :: size_of :: < GeckoVisibility > ( ) , 7usize , concat ! ( "Size of: " , stringify ! ( GeckoVisibility ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < GeckoVisibility > ( ) , 1usize , concat ! ( "Alignment of " , stringify ! ( GeckoVisibility ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const GeckoVisibility ) ) . gecko as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( GeckoVisibility ) , "::" , stringify ! ( gecko ) ) ) ; } # [ repr ( C ) ] # [ derive ( Debug ) ] pub struct GeckoUserInterface { pub gecko : root :: nsStyleUserInterface , } # [ test ] fn bindgen_test_layout_GeckoUserInterface ( ) { assert_eq ! ( :: std :: mem :: size_of :: < GeckoUserInterface > ( ) , 24usize , concat ! ( "Size of: " , stringify ! ( GeckoUserInterface ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < GeckoUserInterface > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( GeckoUserInterface ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const GeckoUserInterface ) ) . gecko as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( GeckoUserInterface ) , "::" , stringify ! ( gecko ) ) ) ; } # [ repr ( C ) ] # [ derive ( Debug ) ] pub struct GeckoTableBorder { pub gecko : root :: nsStyleTableBorder , } # [ test ] fn bindgen_test_layout_GeckoTableBorder ( ) { assert_eq ! ( :: std :: mem :: size_of :: < GeckoTableBorder > ( ) , 12usize , concat ! ( "Size of: " , stringify ! ( GeckoTableBorder ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < GeckoTableBorder > ( ) , 4usize , concat ! ( "Alignment of " , stringify ! ( GeckoTableBorder ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const GeckoTableBorder ) ) . gecko as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( GeckoTableBorder ) , "::" , stringify ! ( gecko ) ) ) ; } # [ repr ( C ) ] # [ derive ( Debug ) ] pub struct GeckoSVG { pub gecko : root :: nsStyleSVG , } # [ test ] fn bindgen_test_layout_GeckoSVG ( ) { assert_eq ! ( :: std :: mem :: size_of :: < GeckoSVG > ( ) , 128usize , concat ! ( "Size of: " , stringify ! ( GeckoSVG ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < GeckoSVG > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( GeckoSVG ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const GeckoSVG ) ) . gecko as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( GeckoSVG ) , "::" , stringify ! ( gecko ) ) ) ; } # [ repr ( C ) ] # [ derive ( Debug ) ] pub struct GeckoBackground { pub gecko : root :: nsStyleBackground , } # [ test ] fn bindgen_test_layout_GeckoBackground ( ) { assert_eq ! ( :: std :: mem :: size_of :: < GeckoBackground > ( ) , 160usize , concat ! ( "Size of: " , stringify ! ( GeckoBackground ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < GeckoBackground > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( GeckoBackground ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const GeckoBackground ) ) . gecko as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( GeckoBackground ) , "::" , stringify ! ( gecko ) ) ) ; } # [ repr ( C ) ] pub struct GeckoPosition { pub gecko : root :: nsStylePosition , } # [ test ] fn bindgen_test_layout_GeckoPosition ( ) { assert_eq ! ( :: std :: mem :: size_of :: < GeckoPosition > ( ) , 440usize , concat ! ( "Size of: " , stringify ! ( GeckoPosition ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < GeckoPosition > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( GeckoPosition ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const GeckoPosition ) ) . gecko as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( GeckoPosition ) , "::" , stringify ! ( gecko ) ) ) ; } # [ repr ( C ) ] pub struct GeckoTextReset { pub gecko : root :: nsStyleTextReset , } # [ test ] fn bindgen_test_layout_GeckoTextReset ( ) { assert_eq ! ( :: std :: mem :: size_of :: < GeckoTextReset > ( ) , 80usize , concat ! ( "Size of: " , stringify ! ( GeckoTextReset ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < GeckoTextReset > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( GeckoTextReset ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const GeckoTextReset ) ) . gecko as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( GeckoTextReset ) , "::" , stringify ! ( gecko ) ) ) ; } # [ repr ( C ) ] # [ derive ( Debug ) ] pub struct GeckoDisplay { pub gecko : root :: nsStyleDisplay , } # [ test ] fn bindgen_test_layout_GeckoDisplay ( ) { assert_eq ! ( :: std :: mem :: size_of :: < GeckoDisplay > ( ) , 416usize , concat ! ( "Size of: " , stringify ! ( GeckoDisplay ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < GeckoDisplay > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( GeckoDisplay ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const GeckoDisplay ) ) . gecko as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( GeckoDisplay ) , "::" , stringify ! ( gecko ) ) ) ; } # [ repr ( C ) ] pub struct GeckoContent { pub gecko : root :: nsStyleContent , } # [ test ] fn bindgen_test_layout_GeckoContent ( ) { assert_eq ! ( :: std :: mem :: size_of :: < GeckoContent > ( ) , 24usize , concat ! ( "Size of: " , stringify ! ( GeckoContent ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < GeckoContent > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( GeckoContent ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const GeckoContent ) ) . gecko as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( GeckoContent ) , "::" , stringify ! ( gecko ) ) ) ; } # [ repr ( C ) ] # [ derive ( Debug ) ] pub struct GeckoUIReset { pub gecko : root :: nsStyleUIReset , } # [ test ] fn bindgen_test_layout_GeckoUIReset ( ) { assert_eq ! ( :: std :: mem :: size_of :: < GeckoUIReset > ( ) , 56usize , concat ! ( "Size of: " , stringify ! ( GeckoUIReset ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < GeckoUIReset > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( GeckoUIReset ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const GeckoUIReset ) ) . gecko as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( GeckoUIReset ) , "::" , stringify ! ( gecko ) ) ) ; } # [ repr ( C ) ] # [ derive ( Debug ) ] pub struct GeckoTable { pub gecko : root :: nsStyleTable , } # [ test ] fn bindgen_test_layout_GeckoTable ( ) { assert_eq ! ( :: std :: mem :: size_of :: < GeckoTable > ( ) , 8usize , concat ! ( "Size of: " , stringify ! ( GeckoTable ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < GeckoTable > ( ) , 4usize , concat ! ( "Alignment of " , stringify ! ( GeckoTable ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const GeckoTable ) ) . gecko as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( GeckoTable ) , "::" , stringify ! ( gecko ) ) ) ; } # [ repr ( C ) ] # [ derive ( Debug ) ] pub struct GeckoMargin { pub gecko : root :: nsStyleMargin , } # [ test ] fn bindgen_test_layout_GeckoMargin ( ) { assert_eq ! ( :: std :: mem :: size_of :: < GeckoMargin > ( ) , 40usize , concat ! ( "Size of: " , stringify ! ( GeckoMargin ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < GeckoMargin > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( GeckoMargin ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const GeckoMargin ) ) . gecko as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( GeckoMargin ) , "::" , stringify ! ( gecko ) ) ) ; } # [ repr ( C ) ] # [ derive ( Debug ) ] pub struct GeckoPadding { pub gecko : root :: nsStylePadding , } # [ test ] fn bindgen_test_layout_GeckoPadding ( ) { assert_eq ! ( :: std :: mem :: size_of :: < GeckoPadding > ( ) , 40usize , concat ! ( "Size of: " , stringify ! ( GeckoPadding ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < GeckoPadding > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( GeckoPadding ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const GeckoPadding ) ) . gecko as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( GeckoPadding ) , "::" , stringify ! ( gecko ) ) ) ; } # [ repr ( C ) ] # [ derive ( Debug ) ] pub struct GeckoBorder { pub gecko : root :: nsStyleBorder , } # [ test ] fn bindgen_test_layout_GeckoBorder ( ) { assert_eq ! ( :: std :: mem :: size_of :: < GeckoBorder > ( ) , 312usize , concat ! ( "Size of: " , stringify ! ( GeckoBorder ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < GeckoBorder > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( GeckoBorder ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const GeckoBorder ) ) . gecko as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( GeckoBorder ) , "::" , stringify ! ( gecko ) ) ) ; } # [ repr ( C ) ] # [ derive ( Debug ) ] pub struct GeckoOutline { pub gecko : root :: nsStyleOutline , } # [ test ] fn bindgen_test_layout_GeckoOutline ( ) { assert_eq ! ( :: std :: mem :: size_of :: < GeckoOutline > ( ) , 104usize , concat ! ( "Size of: " , stringify ! ( GeckoOutline ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < GeckoOutline > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( GeckoOutline ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const GeckoOutline ) ) . gecko as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( GeckoOutline ) , "::" , stringify ! ( gecko ) ) ) ; } # [ repr ( C ) ] # [ derive ( Debug ) ] pub struct GeckoXUL { pub gecko : root :: nsStyleXUL , } # [ test ] fn bindgen_test_layout_GeckoXUL ( ) { assert_eq ! ( :: std :: mem :: size_of :: < GeckoXUL > ( ) , 16usize , concat ! ( "Size of: " , stringify ! ( GeckoXUL ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < GeckoXUL > ( ) , 4usize , concat ! ( "Alignment of " , stringify ! ( GeckoXUL ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const GeckoXUL ) ) . gecko as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( GeckoXUL ) , "::" , stringify ! ( gecko ) ) ) ; } # [ repr ( C ) ] # [ derive ( Debug ) ] pub struct GeckoSVGReset { pub gecko : root :: nsStyleSVGReset , } # [ test ] fn bindgen_test_layout_GeckoSVGReset ( ) { assert_eq ! ( :: std :: mem :: size_of :: < GeckoSVGReset > ( ) , 200usize , concat ! ( "Size of: " , stringify ! ( GeckoSVGReset ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < GeckoSVGReset > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( GeckoSVGReset ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const GeckoSVGReset ) ) . gecko as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( GeckoSVGReset ) , "::" , stringify ! ( gecko ) ) ) ; } # [ repr ( C ) ] # [ derive ( Debug ) ] pub struct GeckoColumn { pub gecko : root :: nsStyleColumn , } # [ test ] fn bindgen_test_layout_GeckoColumn ( ) { assert_eq ! ( :: std :: mem :: size_of :: < GeckoColumn > ( ) , 64usize , concat ! ( "Size of: " , stringify ! ( GeckoColumn ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < GeckoColumn > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( GeckoColumn ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const GeckoColumn ) ) . gecko as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( GeckoColumn ) , "::" , stringify ! ( gecko ) ) ) ; } # [ repr ( C ) ] # [ derive ( Debug ) ] pub struct GeckoEffects { pub gecko : root :: nsStyleEffects , } # [ test ] fn bindgen_test_layout_GeckoEffects ( ) { assert_eq ! ( :: std :: mem :: size_of :: < GeckoEffects > ( ) , 40usize , concat ! ( "Size of: " , stringify ! ( GeckoEffects ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < GeckoEffects > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( GeckoEffects ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const GeckoEffects ) ) . gecko as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( GeckoEffects ) , "::" , stringify ! ( gecko ) ) ) ; } # [ repr ( C ) ] # [ derive ( Debug ) ] pub struct ServoMediaList { pub _base : root :: mozilla :: dom :: MediaList , pub mRawList : root :: RefPtr < root :: RawServoMediaList > , } # [ test ] fn bindgen_test_layout_ServoMediaList ( ) { assert_eq ! ( :: std :: mem :: size_of :: < ServoMediaList > ( ) , 56usize , concat ! ( "Size of: " , stringify ! ( ServoMediaList ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < ServoMediaList > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( ServoMediaList ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const ServoMediaList ) ) . mRawList as * const _ as usize } , 48usize , concat ! ( "Alignment of field: " , stringify ! ( ServoMediaList ) , "::" , stringify ! ( mRawList ) ) ) ; } 
  /// A PostTraversalTask is a task to be performed immediately after a Servo
         /// traversal.  There are just a few tasks we need to perform, so we use this
         /// class rather than Runnables, to avoid virtual calls and some allocations.
         ///
@@ -867,17 +870,17 @@ pub type ServoStyleContextStrong = ::gec
     /// will be "external-resource-document-created", and the data will be null.
     /// If document creation fails for some reason, observers will still be
     /// notified, with a null document pointer. 
  # [ repr ( C ) ] # [ derive ( Debug ) ] pub struct nsIDocument_ExternalResourceLoad { pub _base : root :: nsISupports , pub mObservers : [ u64 ; 10usize ] , } # [ test ] fn bindgen_test_layout_nsIDocument_ExternalResourceLoad ( ) { assert_eq ! ( :: std :: mem :: size_of :: < nsIDocument_ExternalResourceLoad > ( ) , 88usize , concat ! ( "Size of: " , stringify ! ( nsIDocument_ExternalResourceLoad ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < nsIDocument_ExternalResourceLoad > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( nsIDocument_ExternalResourceLoad ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsIDocument_ExternalResourceLoad ) ) . mObservers as * const _ as usize } , 8usize , concat ! ( "Alignment of field: " , stringify ! ( nsIDocument_ExternalResourceLoad ) , "::" , stringify ! ( mObservers ) ) ) ; } pub type nsIDocument_ActivityObserverEnumerator = :: std :: option :: Option < unsafe extern "C" fn ( arg1 : * mut root :: nsISupports , arg2 : * mut :: std :: os :: raw :: c_void ) > ; # [ repr ( u32 ) ] # [ derive ( Debug , Copy , Clone , PartialEq , Eq , Hash ) ] pub enum nsIDocument_DocumentTheme { Doc_Theme_Uninitialized = 0 , Doc_Theme_None = 1 , Doc_Theme_Neutral = 2 , Doc_Theme_Dark = 3 , Doc_Theme_Bright = 4 , } pub type nsIDocument_FrameRequestCallbackList = root :: nsTArray < root :: RefPtr < root :: mozilla :: dom :: FrameRequestCallback > > ; pub const nsIDocument_DeprecatedOperations_eEnablePrivilege : root :: nsIDocument_DeprecatedOperations = 0 ; pub const nsIDocument_DeprecatedOperations_eDOMExceptionCode : root :: nsIDocument_DeprecatedOperations = 1 ; pub const nsIDocument_DeprecatedOperations_eMutationEvent : root :: nsIDocument_DeprecatedOperations = 2 ; pub const nsIDocument_DeprecatedOperations_eComponents : root :: nsIDocument_DeprecatedOperations = 3 ; pub const nsIDocument_DeprecatedOperations_ePrefixedVisibilityAPI : root :: nsIDocument_DeprecatedOperations = 4 ; pub const nsIDocument_DeprecatedOperations_eNodeIteratorDetach : root :: nsIDocument_DeprecatedOperations = 5 ; pub const nsIDocument_DeprecatedOperations_eLenientThis : root :: nsIDocument_DeprecatedOperations = 6 ; pub const nsIDocument_DeprecatedOperations_eGetPreventDefault : root :: nsIDocument_DeprecatedOperations = 7 ; pub const nsIDocument_DeprecatedOperations_eGetSetUserData : root :: nsIDocument_DeprecatedOperations = 8 ; pub const nsIDocument_DeprecatedOperations_eMozGetAsFile : root :: nsIDocument_DeprecatedOperations = 9 ; pub const nsIDocument_DeprecatedOperations_eUseOfCaptureEvents : root :: nsIDocument_DeprecatedOperations = 10 ; pub const nsIDocument_DeprecatedOperations_eUseOfReleaseEvents : root :: nsIDocument_DeprecatedOperations = 11 ; pub const nsIDocument_DeprecatedOperations_eUseOfDOM3LoadMethod : root :: nsIDocument_DeprecatedOperations = 12 ; pub const nsIDocument_DeprecatedOperations_eChromeUseOfDOM3LoadMethod : root :: nsIDocument_DeprecatedOperations = 13 ; pub const nsIDocument_DeprecatedOperations_eShowModalDialog : root :: nsIDocument_DeprecatedOperations = 14 ; pub const nsIDocument_DeprecatedOperations_eSyncXMLHttpRequest : root :: nsIDocument_DeprecatedOperations = 15 ; pub const nsIDocument_DeprecatedOperations_eWindow_Cc_ontrollers : root :: nsIDocument_DeprecatedOperations = 16 ; pub const nsIDocument_DeprecatedOperations_eImportXULIntoContent : root :: nsIDocument_DeprecatedOperations = 17 ; pub const nsIDocument_DeprecatedOperations_ePannerNodeDoppler : root :: nsIDocument_DeprecatedOperations = 18 ; pub const nsIDocument_DeprecatedOperations_eNavigatorGetUserMedia : root :: nsIDocument_DeprecatedOperations = 19 ; pub const nsIDocument_DeprecatedOperations_eWebrtcDeprecatedPrefix : root :: nsIDocument_DeprecatedOperations = 20 ; pub const nsIDocument_DeprecatedOperations_eRTCPeerConnectionGetStreams : root :: nsIDocument_DeprecatedOperations = 21 ; pub const nsIDocument_DeprecatedOperations_eAppCache : root :: nsIDocument_DeprecatedOperations = 22 ; pub const nsIDocument_DeprecatedOperations_ePrefixedImageSmoothingEnabled : root :: nsIDocument_DeprecatedOperations = 23 ; pub const nsIDocument_DeprecatedOperations_ePrefixedFullscreenAPI : root :: nsIDocument_DeprecatedOperations = 24 ; pub const nsIDocument_DeprecatedOperations_eLenientSetter : root :: nsIDocument_DeprecatedOperations = 25 ; pub const nsIDocument_DeprecatedOperations_eFileLastModifiedDate : root :: nsIDocument_DeprecatedOperations = 26 ; pub const nsIDocument_DeprecatedOperations_eImageBitmapRenderingContext_TransferImageBitmap : root :: nsIDocument_DeprecatedOperations = 27 ; pub const nsIDocument_DeprecatedOperations_eURLCreateObjectURL_MediaStream : root :: nsIDocument_DeprecatedOperations = 28 ; pub const nsIDocument_DeprecatedOperations_eXMLBaseAttribute : root :: nsIDocument_DeprecatedOperations = 29 ; pub const nsIDocument_DeprecatedOperations_eWindowContentUntrusted : root :: nsIDocument_DeprecatedOperations = 30 ; pub const nsIDocument_DeprecatedOperations_eDeprecatedOperationCount : root :: nsIDocument_DeprecatedOperations = 31 ; pub type nsIDocument_DeprecatedOperations = :: std :: os :: raw :: c_uint ; pub const nsIDocument_DocumentWarnings_eIgnoringWillChangeOverBudget : root :: nsIDocument_DocumentWarnings = 0 ; pub const nsIDocument_DocumentWarnings_ePreventDefaultFromPassiveListener : root :: nsIDocument_DocumentWarnings = 1 ; pub const nsIDocument_DocumentWarnings_eSVGRefLoop : root :: nsIDocument_DocumentWarnings = 2 ; pub const nsIDocument_DocumentWarnings_eSVGRefChainLengthExceeded : root :: nsIDocument_DocumentWarnings = 3 ; pub const nsIDocument_DocumentWarnings_eDocumentWarningCount : root :: nsIDocument_DocumentWarnings = 4 ; pub type nsIDocument_DocumentWarnings = :: std :: os :: raw :: c_uint ; pub const nsIDocument_ElementCallbackType_eConnected : root :: nsIDocument_ElementCallbackType = 0 ; pub const nsIDocument_ElementCallbackType_eDisconnected : root :: nsIDocument_ElementCallbackType = 1 ; pub const nsIDocument_ElementCallbackType_eAdopted : root :: nsIDocument_ElementCallbackType = 2 ; pub const nsIDocument_ElementCallbackType_eAttributeChanged : root :: nsIDocument_ElementCallbackType = 3 ; pub type nsIDocument_ElementCallbackType = :: std :: os :: raw :: c_uint ; pub const nsIDocument_eScopedStyle_Unknown : root :: nsIDocument__bindgen_ty_1 = 0 ; pub const nsIDocument_eScopedStyle_Disabled : root :: nsIDocument__bindgen_ty_1 = 1 ; pub const nsIDocument_eScopedStyle_Enabled : root :: nsIDocument__bindgen_ty_1 = 2 ; pub type nsIDocument__bindgen_ty_1 = :: std :: os :: raw :: c_uint ; # [ repr ( u32 ) ] # [ derive ( Debug , Copy , Clone , PartialEq , Eq , Hash ) ] pub enum nsIDocument_Type { eUnknown = 0 , eHTML = 1 , eXHTML = 2 , eGenericXML = 3 , eSVG = 4 , eXUL = 5 , } pub const nsIDocument_Tri_eTriUnset : root :: nsIDocument_Tri = 0 ; pub const nsIDocument_Tri_eTriFalse : root :: nsIDocument_Tri = 1 ; pub const nsIDocument_Tri_eTriTrue : root :: nsIDocument_Tri = 2 ; pub type nsIDocument_Tri = :: std :: os :: raw :: c_uint ; # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct nsIDocument_FrameRequest { _unused : [ u8 ; 0 ] } pub const nsIDocument_kSegmentSize : usize = 128 ; # [ test ] fn bindgen_test_layout_nsIDocument ( ) { assert_eq ! ( :: std :: mem :: size_of :: < nsIDocument > ( ) , 896usize , concat ! ( "Size of: " , stringify ! ( nsIDocument ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < nsIDocument > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( nsIDocument ) ) ) ; } impl nsIDocument { # [ inline ] pub fn mBidiEnabled ( & self ) -> bool { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x1 as u64 ; let val = ( unit_field_val & mask ) >> 0usize ; unsafe { :: std :: mem :: transmute ( val as u8 ) } } # [ inline ] pub fn set_mBidiEnabled ( & mut self , val : bool ) { let mask = 0x1 as u64 ; let val = val as u8 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 0usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mMathMLEnabled ( & self ) -> bool { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x2 as u64 ; let val = ( unit_field_val & mask ) >> 1usize ; unsafe { :: std :: mem :: transmute ( val as u8 ) } } # [ inline ] pub fn set_mMathMLEnabled ( & mut self , val : bool ) { let mask = 0x2 as u64 ; let val = val as u8 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 1usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mIsInitialDocumentInWindow ( & self ) -> bool { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x4 as u64 ; let val = ( unit_field_val & mask ) >> 2usize ; unsafe { :: std :: mem :: transmute ( val as u8 ) } } # [ inline ] pub fn set_mIsInitialDocumentInWindow ( & mut self , val : bool ) { let mask = 0x4 as u64 ; let val = val as u8 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 2usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mIgnoreDocGroupMismatches ( & self ) -> bool { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x8 as u64 ; let val = ( unit_field_val & mask ) >> 3usize ; unsafe { :: std :: mem :: transmute ( val as u8 ) } } # [ inline ] pub fn set_mIgnoreDocGroupMismatches ( & mut self , val : bool ) { let mask = 0x8 as u64 ; let val = val as u8 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 3usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mLoadedAsData ( & self ) -> bool { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x10 as u64 ; let val = ( unit_field_val & mask ) >> 4usize ; unsafe { :: std :: mem :: transmute ( val as u8 ) } } # [ inline ] pub fn set_mLoadedAsData ( & mut self , val : bool ) { let mask = 0x10 as u64 ; let val = val as u8 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 4usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mLoadedAsInteractiveData ( & self ) -> bool { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x20 as u64 ; let val = ( unit_field_val & mask ) >> 5usize ; unsafe { :: std :: mem :: transmute ( val as u8 ) } } # [ inline ] pub fn set_mLoadedAsInteractiveData ( & mut self , val : bool ) { let mask = 0x20 as u64 ; let val = val as u8 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 5usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mMayStartLayout ( & self ) -> bool { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x40 as u64 ; let val = ( unit_field_val & mask ) >> 6usize ; unsafe { :: std :: mem :: transmute ( val as u8 ) } } # [ inline ] pub fn set_mMayStartLayout ( & mut self , val : bool ) { let mask = 0x40 as u64 ; let val = val as u8 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 6usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mHaveFiredTitleChange ( & self ) -> bool { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x80 as u64 ; let val = ( unit_field_val & mask ) >> 7usize ; unsafe { :: std :: mem :: transmute ( val as u8 ) } } # [ inline ] pub fn set_mHaveFiredTitleChange ( & mut self , val : bool ) { let mask = 0x80 as u64 ; let val = val as u8 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 7usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mIsShowing ( & self ) -> bool { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x100 as u64 ; let val = ( unit_field_val & mask ) >> 8usize ; unsafe { :: std :: mem :: transmute ( val as u8 ) } } # [ inline ] pub fn set_mIsShowing ( & mut self , val : bool ) { let mask = 0x100 as u64 ; let val = val as u8 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 8usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mVisible ( & self ) -> bool { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x200 as u64 ; let val = ( unit_field_val & mask ) >> 9usize ; unsafe { :: std :: mem :: transmute ( val as u8 ) } } # [ inline ] pub fn set_mVisible ( & mut self , val : bool ) { let mask = 0x200 as u64 ; let val = val as u8 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 9usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mHasReferrerPolicyCSP ( & self ) -> bool { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x400 as u64 ; let val = ( unit_field_val & mask ) >> 10usize ; unsafe { :: std :: mem :: transmute ( val as u8 ) } } # [ inline ] pub fn set_mHasReferrerPolicyCSP ( & mut self , val : bool ) { let mask = 0x400 as u64 ; let val = val as u8 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 10usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mRemovedFromDocShell ( & self ) -> bool { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x800 as u64 ; let val = ( unit_field_val & mask ) >> 11usize ; unsafe { :: std :: mem :: transmute ( val as u8 ) } } # [ inline ] pub fn set_mRemovedFromDocShell ( & mut self , val : bool ) { let mask = 0x800 as u64 ; let val = val as u8 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 11usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mAllowDNSPrefetch ( & self ) -> bool { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x1000 as u64 ; let val = ( unit_field_val & mask ) >> 12usize ; unsafe { :: std :: mem :: transmute ( val as u8 ) } } # [ inline ] pub fn set_mAllowDNSPrefetch ( & mut self , val : bool ) { let mask = 0x1000 as u64 ; let val = val as u8 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 12usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mIsStaticDocument ( & self ) -> bool { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x2000 as u64 ; let val = ( unit_field_val & mask ) >> 13usize ; unsafe { :: std :: mem :: transmute ( val as u8 ) } } # [ inline ] pub fn set_mIsStaticDocument ( & mut self , val : bool ) { let mask = 0x2000 as u64 ; let val = val as u8 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 13usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mCreatingStaticClone ( & self ) -> bool { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x4000 as u64 ; let val = ( unit_field_val & mask ) >> 14usize ; unsafe { :: std :: mem :: transmute ( val as u8 ) } } # [ inline ] pub fn set_mCreatingStaticClone ( & mut self , val : bool ) { let mask = 0x4000 as u64 ; let val = val as u8 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 14usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mInUnlinkOrDeletion ( & self ) -> bool { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x8000 as u64 ; let val = ( unit_field_val & mask ) >> 15usize ; unsafe { :: std :: mem :: transmute ( val as u8 ) } } # [ inline ] pub fn set_mInUnlinkOrDeletion ( & mut self , val : bool ) { let mask = 0x8000 as u64 ; let val = val as u8 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 15usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mHasHadScriptHandlingObject ( & self ) -> bool { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x10000 as u64 ; let val = ( unit_field_val & mask ) >> 16usize ; unsafe { :: std :: mem :: transmute ( val as u8 ) } } # [ inline ] pub fn set_mHasHadScriptHandlingObject ( & mut self , val : bool ) { let mask = 0x10000 as u64 ; let val = val as u8 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 16usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mIsBeingUsedAsImage ( & self ) -> bool { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x20000 as u64 ; let val = ( unit_field_val & mask ) >> 17usize ; unsafe { :: std :: mem :: transmute ( val as u8 ) } } # [ inline ] pub fn set_mIsBeingUsedAsImage ( & mut self , val : bool ) { let mask = 0x20000 as u64 ; let val = val as u8 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 17usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mIsSyntheticDocument ( & self ) -> bool { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x40000 as u64 ; let val = ( unit_field_val & mask ) >> 18usize ; unsafe { :: std :: mem :: transmute ( val as u8 ) } } # [ inline ] pub fn set_mIsSyntheticDocument ( & mut self , val : bool ) { let mask = 0x40000 as u64 ; let val = val as u8 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 18usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mHasLinksToUpdate ( & self ) -> bool { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x80000 as u64 ; let val = ( unit_field_val & mask ) >> 19usize ; unsafe { :: std :: mem :: transmute ( val as u8 ) } } # [ inline ] pub fn set_mHasLinksToUpdate ( & mut self , val : bool ) { let mask = 0x80000 as u64 ; let val = val as u8 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 19usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mHasLinksToUpdateRunnable ( & self ) -> bool { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x100000 as u64 ; let val = ( unit_field_val & mask ) >> 20usize ; unsafe { :: std :: mem :: transmute ( val as u8 ) } } # [ inline ] pub fn set_mHasLinksToUpdateRunnable ( & mut self , val : bool ) { let mask = 0x100000 as u64 ; let val = val as u8 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 20usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mMayHaveDOMMutationObservers ( & self ) -> bool { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x200000 as u64 ; let val = ( unit_field_val & mask ) >> 21usize ; unsafe { :: std :: mem :: transmute ( val as u8 ) } } # [ inline ] pub fn set_mMayHaveDOMMutationObservers ( & mut self , val : bool ) { let mask = 0x200000 as u64 ; let val = val as u8 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 21usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mMayHaveAnimationObservers ( & self ) -> bool { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x400000 as u64 ; let val = ( unit_field_val & mask ) >> 22usize ; unsafe { :: std :: mem :: transmute ( val as u8 ) } } # [ inline ] pub fn set_mMayHaveAnimationObservers ( & mut self , val : bool ) { let mask = 0x400000 as u64 ; let val = val as u8 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 22usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mHasMixedActiveContentLoaded ( & self ) -> bool { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x800000 as u64 ; let val = ( unit_field_val & mask ) >> 23usize ; unsafe { :: std :: mem :: transmute ( val as u8 ) } } # [ inline ] pub fn set_mHasMixedActiveContentLoaded ( & mut self , val : bool ) { let mask = 0x800000 as u64 ; let val = val as u8 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 23usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mHasMixedActiveContentBlocked ( & self ) -> bool { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x1000000 as u64 ; let val = ( unit_field_val & mask ) >> 24usize ; unsafe { :: std :: mem :: transmute ( val as u8 ) } } # [ inline ] pub fn set_mHasMixedActiveContentBlocked ( & mut self , val : bool ) { let mask = 0x1000000 as u64 ; let val = val as u8 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 24usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mHasMixedDisplayContentLoaded ( & self ) -> bool { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x2000000 as u64 ; let val = ( unit_field_val & mask ) >> 25usize ; unsafe { :: std :: mem :: transmute ( val as u8 ) } } # [ inline ] pub fn set_mHasMixedDisplayContentLoaded ( & mut self , val : bool ) { let mask = 0x2000000 as u64 ; let val = val as u8 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 25usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mHasMixedDisplayContentBlocked ( & self ) -> bool { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x4000000 as u64 ; let val = ( unit_field_val & mask ) >> 26usize ; unsafe { :: std :: mem :: transmute ( val as u8 ) } } # [ inline ] pub fn set_mHasMixedDisplayContentBlocked ( & mut self , val : bool ) { let mask = 0x4000000 as u64 ; let val = val as u8 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 26usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mHasMixedContentObjectSubrequest ( & self ) -> bool { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x8000000 as u64 ; let val = ( unit_field_val & mask ) >> 27usize ; unsafe { :: std :: mem :: transmute ( val as u8 ) } } # [ inline ] pub fn set_mHasMixedContentObjectSubrequest ( & mut self , val : bool ) { let mask = 0x8000000 as u64 ; let val = val as u8 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 27usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mHasCSP ( & self ) -> bool { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x10000000 as u64 ; let val = ( unit_field_val & mask ) >> 28usize ; unsafe { :: std :: mem :: transmute ( val as u8 ) } } # [ inline ] pub fn set_mHasCSP ( & mut self , val : bool ) { let mask = 0x10000000 as u64 ; let val = val as u8 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 28usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mHasUnsafeEvalCSP ( & self ) -> bool { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x20000000 as u64 ; let val = ( unit_field_val & mask ) >> 29usize ; unsafe { :: std :: mem :: transmute ( val as u8 ) } } # [ inline ] pub fn set_mHasUnsafeEvalCSP ( & mut self , val : bool ) { let mask = 0x20000000 as u64 ; let val = val as u8 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 29usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mHasUnsafeInlineCSP ( & self ) -> bool { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x40000000 as u64 ; let val = ( unit_field_val & mask ) >> 30usize ; unsafe { :: std :: mem :: transmute ( val as u8 ) } } # [ inline ] pub fn set_mHasUnsafeInlineCSP ( & mut self , val : bool ) { let mask = 0x40000000 as u64 ; let val = val as u8 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 30usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mHasTrackingContentBlocked ( & self ) -> bool { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x80000000 as u64 ; let val = ( unit_field_val & mask ) >> 31usize ; unsafe { :: std :: mem :: transmute ( val as u8 ) } } # [ inline ] pub fn set_mHasTrackingContentBlocked ( & mut self , val : bool ) { let mask = 0x80000000 as u64 ; let val = val as u8 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 31usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mHasTrackingContentLoaded ( & self ) -> bool { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x100000000 as u64 ; let val = ( unit_field_val & mask ) >> 32usize ; unsafe { :: std :: mem :: transmute ( val as u8 ) } } # [ inline ] pub fn set_mHasTrackingContentLoaded ( & mut self , val : bool ) { let mask = 0x100000000 as u64 ; let val = val as u8 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 32usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mBFCacheDisallowed ( & self ) -> bool { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x200000000 as u64 ; let val = ( unit_field_val & mask ) >> 33usize ; unsafe { :: std :: mem :: transmute ( val as u8 ) } } # [ inline ] pub fn set_mBFCacheDisallowed ( & mut self , val : bool ) { let mask = 0x200000000 as u64 ; let val = val as u8 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 33usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mHasHadDefaultView ( & self ) -> bool { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x400000000 as u64 ; let val = ( unit_field_val & mask ) >> 34usize ; unsafe { :: std :: mem :: transmute ( val as u8 ) } } # [ inline ] pub fn set_mHasHadDefaultView ( & mut self , val : bool ) { let mask = 0x400000000 as u64 ; let val = val as u8 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 34usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mStyleSheetChangeEventsEnabled ( & self ) -> bool { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x800000000 as u64 ; let val = ( unit_field_val & mask ) >> 35usize ; unsafe { :: std :: mem :: transmute ( val as u8 ) } } # [ inline ] pub fn set_mStyleSheetChangeEventsEnabled ( & mut self , val : bool ) { let mask = 0x800000000 as u64 ; let val = val as u8 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 35usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mIsSrcdocDocument ( & self ) -> bool { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x1000000000 as u64 ; let val = ( unit_field_val & mask ) >> 36usize ; unsafe { :: std :: mem :: transmute ( val as u8 ) } } # [ inline ] pub fn set_mIsSrcdocDocument ( & mut self , val : bool ) { let mask = 0x1000000000 as u64 ; let val = val as u8 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 36usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mDidDocumentOpen ( & self ) -> bool { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x2000000000 as u64 ; let val = ( unit_field_val & mask ) >> 37usize ; unsafe { :: std :: mem :: transmute ( val as u8 ) } } # [ inline ] pub fn set_mDidDocumentOpen ( & mut self , val : bool ) { let mask = 0x2000000000 as u64 ; let val = val as u8 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 37usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mHasDisplayDocument ( & self ) -> bool { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x4000000000 as u64 ; let val = ( unit_field_val & mask ) >> 38usize ; unsafe { :: std :: mem :: transmute ( val as u8 ) } } # [ inline ] pub fn set_mHasDisplayDocument ( & mut self , val : bool ) { let mask = 0x4000000000 as u64 ; let val = val as u8 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 38usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mFontFaceSetDirty ( & self ) -> bool { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x8000000000 as u64 ; let val = ( unit_field_val & mask ) >> 39usize ; unsafe { :: std :: mem :: transmute ( val as u8 ) } } # [ inline ] pub fn set_mFontFaceSetDirty ( & mut self , val : bool ) { let mask = 0x8000000000 as u64 ; let val = val as u8 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 39usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mGetUserFontSetCalled ( & self ) -> bool { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x10000000000 as u64 ; let val = ( unit_field_val & mask ) >> 40usize ; unsafe { :: std :: mem :: transmute ( val as u8 ) } } # [ inline ] pub fn set_mGetUserFontSetCalled ( & mut self , val : bool ) { let mask = 0x10000000000 as u64 ; let val = val as u8 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 40usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mPostedFlushUserFontSet ( & self ) -> bool { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x20000000000 as u64 ; let val = ( unit_field_val & mask ) >> 41usize ; unsafe { :: std :: mem :: transmute ( val as u8 ) } } # [ inline ] pub fn set_mPostedFlushUserFontSet ( & mut self , val : bool ) { let mask = 0x20000000000 as u64 ; let val = val as u8 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 41usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mDidFireDOMContentLoaded ( & self ) -> bool { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x40000000000 as u64 ; let val = ( unit_field_val & mask ) >> 42usize ; unsafe { :: std :: mem :: transmute ( val as u8 ) } } # [ inline ] pub fn set_mDidFireDOMContentLoaded ( & mut self , val : bool ) { let mask = 0x40000000000 as u64 ; let val = val as u8 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 42usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mHasScrollLinkedEffect ( & self ) -> bool { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x80000000000 as u64 ; let val = ( unit_field_val & mask ) >> 43usize ; unsafe { :: std :: mem :: transmute ( val as u8 ) } } # [ inline ] pub fn set_mHasScrollLinkedEffect ( & mut self , val : bool ) { let mask = 0x80000000000 as u64 ; let val = val as u8 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 43usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mFrameRequestCallbacksScheduled ( & self ) -> bool { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x100000000000 as u64 ; let val = ( unit_field_val & mask ) >> 44usize ; unsafe { :: std :: mem :: transmute ( val as u8 ) } } # [ inline ] pub fn set_mFrameRequestCallbacksScheduled ( & mut self , val : bool ) { let mask = 0x100000000000 as u64 ; let val = val as u8 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 44usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mIsTopLevelContentDocument ( & self ) -> bool { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x200000000000 as u64 ; let val = ( unit_field_val & mask ) >> 45usize ; unsafe { :: std :: mem :: transmute ( val as u8 ) } } # [ inline ] pub fn set_mIsTopLevelContentDocument ( & mut self , val : bool ) { let mask = 0x200000000000 as u64 ; let val = val as u8 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 45usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mIsContentDocument ( & self ) -> bool { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x400000000000 as u64 ; let val = ( unit_field_val & mask ) >> 46usize ; unsafe { :: std :: mem :: transmute ( val as u8 ) } } # [ inline ] pub fn set_mIsContentDocument ( & mut self , val : bool ) { let mask = 0x400000000000 as u64 ; let val = val as u8 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 46usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mDidCallBeginLoad ( & self ) -> bool { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x800000000000 as u64 ; let val = ( unit_field_val & mask ) >> 47usize ; unsafe { :: std :: mem :: transmute ( val as u8 ) } } # [ inline ] pub fn set_mDidCallBeginLoad ( & mut self , val : bool ) { let mask = 0x800000000000 as u64 ; let val = val as u8 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 47usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mBufferingCSPViolations ( & self ) -> bool { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x1000000000000 as u64 ; let val = ( unit_field_val & mask ) >> 48usize ; unsafe { :: std :: mem :: transmute ( val as u8 ) } } # [ inline ] pub fn set_mBufferingCSPViolations ( & mut self , val : bool ) { let mask = 0x1000000000000 as u64 ; let val = val as u8 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 48usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mAllowPaymentRequest ( & self ) -> bool { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x2000000000000 as u64 ; let val = ( unit_field_val & mask ) >> 49usize ; unsafe { :: std :: mem :: transmute ( val as u8 ) } } # [ inline ] pub fn set_mAllowPaymentRequest ( & mut self , val : bool ) { let mask = 0x2000000000000 as u64 ; let val = val as u8 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 49usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mEncodingMenuDisabled ( & self ) -> bool { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x4000000000000 as u64 ; let val = ( unit_field_val & mask ) >> 50usize ; unsafe { :: std :: mem :: transmute ( val as u8 ) } } # [ inline ] pub fn set_mEncodingMenuDisabled ( & mut self , val : bool ) { let mask = 0x4000000000000 as u64 ; let val = val as u8 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 50usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mIsScopedStyleEnabled ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x18000000000000 as u64 ; let val = ( unit_field_val & mask ) >> 51usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mIsScopedStyleEnabled ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x18000000000000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 51usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn new_bitfield_1 ( mBidiEnabled : bool , mMathMLEnabled : bool , mIsInitialDocumentInWindow : bool , mIgnoreDocGroupMismatches : bool , mLoadedAsData : bool , mLoadedAsInteractiveData : bool , mMayStartLayout : bool , mHaveFiredTitleChange : bool , mIsShowing : bool , mVisible : bool , mHasReferrerPolicyCSP : bool , mRemovedFromDocShell : bool , mAllowDNSPrefetch : bool , mIsStaticDocument : bool , mCreatingStaticClone : bool , mInUnlinkOrDeletion : bool , mHasHadScriptHandlingObject : bool , mIsBeingUsedAsImage : bool , mIsSyntheticDocument : bool , mHasLinksToUpdate : bool , mHasLinksToUpdateRunnable : bool , mMayHaveDOMMutationObservers : bool , mMayHaveAnimationObservers : bool , mHasMixedActiveContentLoaded : bool , mHasMixedActiveContentBlocked : bool , mHasMixedDisplayContentLoaded : bool , mHasMixedDisplayContentBlocked : bool , mHasMixedContentObjectSubrequest : bool , mHasCSP : bool , mHasUnsafeEvalCSP : bool , mHasUnsafeInlineCSP : bool , mHasTrackingContentBlocked : bool , mHasTrackingContentLoaded : bool , mBFCacheDisallowed : bool , mHasHadDefaultView : bool , mStyleSheetChangeEventsEnabled : bool , mIsSrcdocDocument : bool , mDidDocumentOpen : bool , mHasDisplayDocument : bool , mFontFaceSetDirty : bool , mGetUserFontSetCalled : bool , mPostedFlushUserFontSet : bool , mDidFireDOMContentLoaded : bool , mHasScrollLinkedEffect : bool , mFrameRequestCallbacksScheduled : bool , mIsTopLevelContentDocument : bool , mIsContentDocument : bool , mDidCallBeginLoad : bool , mBufferingCSPViolations : bool , mAllowPaymentRequest : bool , mEncodingMenuDisabled : bool , mIsScopedStyleEnabled : :: std :: os :: raw :: c_uint ) -> u64 { ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( 0 | ( ( mBidiEnabled as u8 as u64 ) << 0usize ) & ( 0x1 as u64 ) ) | ( ( mMathMLEnabled as u8 as u64 ) << 1usize ) & ( 0x2 as u64 ) ) | ( ( mIsInitialDocumentInWindow as u8 as u64 ) << 2usize ) & ( 0x4 as u64 ) ) | ( ( mIgnoreDocGroupMismatches as u8 as u64 ) << 3usize ) & ( 0x8 as u64 ) ) | ( ( mLoadedAsData as u8 as u64 ) << 4usize ) & ( 0x10 as u64 ) ) | ( ( mLoadedAsInteractiveData as u8 as u64 ) << 5usize ) & ( 0x20 as u64 ) ) | ( ( mMayStartLayout as u8 as u64 ) << 6usize ) & ( 0x40 as u64 ) ) | ( ( mHaveFiredTitleChange as u8 as u64 ) << 7usize ) & ( 0x80 as u64 ) ) | ( ( mIsShowing as u8 as u64 ) << 8usize ) & ( 0x100 as u64 ) ) | ( ( mVisible as u8 as u64 ) << 9usize ) & ( 0x200 as u64 ) ) | ( ( mHasReferrerPolicyCSP as u8 as u64 ) << 10usize ) & ( 0x400 as u64 ) ) | ( ( mRemovedFromDocShell as u8 as u64 ) << 11usize ) & ( 0x800 as u64 ) ) | ( ( mAllowDNSPrefetch as u8 as u64 ) << 12usize ) & ( 0x1000 as u64 ) ) | ( ( mIsStaticDocument as u8 as u64 ) << 13usize ) & ( 0x2000 as u64 ) ) | ( ( mCreatingStaticClone as u8 as u64 ) << 14usize ) & ( 0x4000 as u64 ) ) | ( ( mInUnlinkOrDeletion as u8 as u64 ) << 15usize ) & ( 0x8000 as u64 ) ) | ( ( mHasHadScriptHandlingObject as u8 as u64 ) << 16usize ) & ( 0x10000 as u64 ) ) | ( ( mIsBeingUsedAsImage as u8 as u64 ) << 17usize ) & ( 0x20000 as u64 ) ) | ( ( mIsSyntheticDocument as u8 as u64 ) << 18usize ) & ( 0x40000 as u64 ) ) | ( ( mHasLinksToUpdate as u8 as u64 ) << 19usize ) & ( 0x80000 as u64 ) ) | ( ( mHasLinksToUpdateRunnable as u8 as u64 ) << 20usize ) & ( 0x100000 as u64 ) ) | ( ( mMayHaveDOMMutationObservers as u8 as u64 ) << 21usize ) & ( 0x200000 as u64 ) ) | ( ( mMayHaveAnimationObservers as u8 as u64 ) << 22usize ) & ( 0x400000 as u64 ) ) | ( ( mHasMixedActiveContentLoaded as u8 as u64 ) << 23usize ) & ( 0x800000 as u64 ) ) | ( ( mHasMixedActiveContentBlocked as u8 as u64 ) << 24usize ) & ( 0x1000000 as u64 ) ) | ( ( mHasMixedDisplayContentLoaded as u8 as u64 ) << 25usize ) & ( 0x2000000 as u64 ) ) | ( ( mHasMixedDisplayContentBlocked as u8 as u64 ) << 26usize ) & ( 0x4000000 as u64 ) ) | ( ( mHasMixedContentObjectSubrequest as u8 as u64 ) << 27usize ) & ( 0x8000000 as u64 ) ) | ( ( mHasCSP as u8 as u64 ) << 28usize ) & ( 0x10000000 as u64 ) ) | ( ( mHasUnsafeEvalCSP as u8 as u64 ) << 29usize ) & ( 0x20000000 as u64 ) ) | ( ( mHasUnsafeInlineCSP as u8 as u64 ) << 30usize ) & ( 0x40000000 as u64 ) ) | ( ( mHasTrackingContentBlocked as u8 as u64 ) << 31usize ) & ( 0x80000000 as u64 ) ) | ( ( mHasTrackingContentLoaded as u8 as u64 ) << 32usize ) & ( 0x100000000 as u64 ) ) | ( ( mBFCacheDisallowed as u8 as u64 ) << 33usize ) & ( 0x200000000 as u64 ) ) | ( ( mHasHadDefaultView as u8 as u64 ) << 34usize ) & ( 0x400000000 as u64 ) ) | ( ( mStyleSheetChangeEventsEnabled as u8 as u64 ) << 35usize ) & ( 0x800000000 as u64 ) ) | ( ( mIsSrcdocDocument as u8 as u64 ) << 36usize ) & ( 0x1000000000 as u64 ) ) | ( ( mDidDocumentOpen as u8 as u64 ) << 37usize ) & ( 0x2000000000 as u64 ) ) | ( ( mHasDisplayDocument as u8 as u64 ) << 38usize ) & ( 0x4000000000 as u64 ) ) | ( ( mFontFaceSetDirty as u8 as u64 ) << 39usize ) & ( 0x8000000000 as u64 ) ) | ( ( mGetUserFontSetCalled as u8 as u64 ) << 40usize ) & ( 0x10000000000 as u64 ) ) | ( ( mPostedFlushUserFontSet as u8 as u64 ) << 41usize ) & ( 0x20000000000 as u64 ) ) | ( ( mDidFireDOMContentLoaded as u8 as u64 ) << 42usize ) & ( 0x40000000000 as u64 ) ) | ( ( mHasScrollLinkedEffect as u8 as u64 ) << 43usize ) & ( 0x80000000000 as u64 ) ) | ( ( mFrameRequestCallbacksScheduled as u8 as u64 ) << 44usize ) & ( 0x100000000000 as u64 ) ) | ( ( mIsTopLevelContentDocument as u8 as u64 ) << 45usize ) & ( 0x200000000000 as u64 ) ) | ( ( mIsContentDocument as u8 as u64 ) << 46usize ) & ( 0x400000000000 as u64 ) ) | ( ( mDidCallBeginLoad as u8 as u64 ) << 47usize ) & ( 0x800000000000 as u64 ) ) | ( ( mBufferingCSPViolations as u8 as u64 ) << 48usize ) & ( 0x1000000000000 as u64 ) ) | ( ( mAllowPaymentRequest as u8 as u64 ) << 49usize ) & ( 0x2000000000000 as u64 ) ) | ( ( mEncodingMenuDisabled as u8 as u64 ) << 50usize ) & ( 0x4000000000000 as u64 ) ) | ( ( mIsScopedStyleEnabled as u32 as u64 ) << 51usize ) & ( 0x18000000000000 as u64 ) ) } } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct nsBidi { _unused : [ u8 ; 0 ] } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct nsIPrintSettings { _unused : [ u8 ; 0 ] } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct nsITheme { _unused : [ u8 ; 0 ] } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct gfxTextPerfMetrics { _unused : [ u8 ; 0 ] } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct nsTransitionManager { _unused : [ u8 ; 0 ] } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct nsAnimationManager { _unused : [ u8 ; 0 ] } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct nsDeviceContext { _unused : [ u8 ; 0 ] } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct gfxMissingFontRecorder { _unused : [ u8 ; 0 ] } pub const kPresContext_DefaultVariableFont_ID : u8 = 0 ; pub const kPresContext_DefaultFixedFont_ID : u8 = 1 ; # [ repr ( C ) ] pub struct nsPresContext { pub _base : root :: nsISupports , pub _base_1 : u64 , pub mRefCnt : root :: nsCycleCollectingAutoRefCnt , pub mType : root :: nsPresContext_nsPresContextType , pub mShell : * mut root :: nsIPresShell , pub mDocument : root :: nsCOMPtr , pub mDeviceContext : root :: RefPtr < root :: nsDeviceContext > , pub mEventManager : root :: RefPtr < root :: mozilla :: EventStateManager > , pub mRefreshDriver : root :: RefPtr < root :: nsRefreshDriver > , pub mEffectCompositor : root :: RefPtr < root :: mozilla :: EffectCompositor > , pub mTransitionManager : root :: RefPtr < root :: nsTransitionManager > , pub mAnimationManager : root :: RefPtr < root :: nsAnimationManager > , pub mRestyleManager : root :: RefPtr < root :: mozilla :: RestyleManager > , pub mCounterStyleManager : root :: RefPtr < root :: mozilla :: CounterStyleManager > , pub mMedium : * mut root :: nsAtom , pub mMediaEmulated : root :: RefPtr < root :: nsAtom > , pub mFontFeatureValuesLookup : root :: RefPtr < root :: gfxFontFeatureValueSet > , pub mLinkHandler : * mut root :: nsILinkHandler , pub mLanguage : root :: RefPtr < root :: nsAtom > , pub mInflationDisabledForShrinkWrap : bool , pub mContainer : u64 , pub mBaseMinFontSize : i32 , pub mSystemFontScale : f32 , pub mTextZoom : f32 , pub mEffectiveTextZoom : f32 , pub mFullZoom : f32 , pub mOverrideDPPX : f32 , pub mLastFontInflationScreenSize : root :: gfxSize , pub mCurAppUnitsPerDevPixel : i32 , pub mAutoQualityMinFontSizePixelsPref : i32 , pub mTheme : root :: nsCOMPtr , pub mLangService : * mut root :: nsLanguageAtomService , pub mPrintSettings : root :: nsCOMPtr , pub mPrefChangedTimer : root :: nsCOMPtr , pub mBidiEngine : root :: mozilla :: UniquePtr < root :: nsBidi > , pub mTransactions : [ u64 ; 10usize ] , pub mTextPerf : root :: nsAutoPtr < root :: gfxTextPerfMetrics > , pub mMissingFonts : root :: nsAutoPtr < root :: gfxMissingFontRecorder > , pub mVisibleArea : root :: nsRect , pub mLastResizeEventVisibleArea : root :: nsRect , pub mPageSize : root :: nsSize , pub mPageScale : f32 , pub mPPScale : f32 , pub mDefaultColor : root :: nscolor , pub mBackgroundColor : root :: nscolor , pub mLinkColor : root :: nscolor , pub mActiveLinkColor : root :: nscolor , pub mVisitedLinkColor : root :: nscolor , pub mFocusBackgroundColor : root :: nscolor , pub mFocusTextColor : root :: nscolor , pub mBodyTextColor : root :: nscolor , pub mViewportScrollbarOverrideElement : * mut root :: mozilla :: dom :: Element , pub mViewportStyleScrollbar : root :: nsPresContext_ScrollbarStyles , pub mFocusRingWidth : u8 , pub mExistThrottledUpdates : bool , pub mImageAnimationMode : u16 , pub mImageAnimationModePref : u16 , pub mLangGroupFontPrefs : root :: nsPresContext_LangGroupFontPrefs , pub mFontGroupCacheDirty : bool , pub mLanguagesUsed : [ u64 ; 4usize ] , pub mBorderWidthTable : [ root :: nscoord ; 3usize ] , pub mInterruptChecksToSkip : u32 , pub mElementsRestyled : u64 , pub mFramesConstructed : u64 , pub mFramesReflowed : u64 , pub mReflowStartTime : root :: mozilla :: TimeStamp , pub mFirstNonBlankPaintTime : root :: mozilla :: TimeStamp , pub mFirstClickTime : root :: mozilla :: TimeStamp , pub mFirstKeyTime : root :: mozilla :: TimeStamp , pub mFirstMouseMoveTime : root :: mozilla :: TimeStamp , pub mFirstScrollTime : root :: mozilla :: TimeStamp , pub mInteractionTimeEnabled : bool , pub mLastStyleUpdateForAllAnimations : root :: mozilla :: TimeStamp , pub mTelemetryScrollLastY : root :: nscoord , pub mTelemetryScrollMaxY : root :: nscoord , pub mTelemetryScrollTotalY : root :: nscoord , pub _bitfield_1 : [ u8 ; 6usize ] , pub __bindgen_padding_0 : [ u16 ; 3usize ] , } pub type nsPresContext_Encoding = root :: mozilla :: Encoding ; pub type nsPresContext_NotNull < T > = root :: mozilla :: NotNull < T > ; pub type nsPresContext_LangGroupFontPrefs = root :: mozilla :: LangGroupFontPrefs ; pub type nsPresContext_ScrollbarStyles = root :: mozilla :: ScrollbarStyles ; pub type nsPresContext_StaticPresData = root :: mozilla :: StaticPresData ; pub type nsPresContext_HasThreadSafeRefCnt = root :: mozilla :: FalseType ; # [ repr ( C ) ] # [ derive ( Debug , Copy ) ] pub struct nsPresContext_cycleCollection { pub _base : root :: nsXPCOMCycleCollectionParticipant , } # [ test ] fn bindgen_test_layout_nsPresContext_cycleCollection ( ) { assert_eq ! ( :: std :: mem :: size_of :: < nsPresContext_cycleCollection > ( ) , 16usize , concat ! ( "Size of: " , stringify ! ( nsPresContext_cycleCollection ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < nsPresContext_cycleCollection > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( nsPresContext_cycleCollection ) ) ) ; } impl Clone for nsPresContext_cycleCollection { fn clone ( & self ) -> Self { * self } } pub const nsPresContext_nsPresContextType_eContext_Galley : root :: nsPresContext_nsPresContextType = 0 ; pub const nsPresContext_nsPresContextType_eContext_PrintPreview : root :: nsPresContext_nsPresContextType = 1 ; pub const nsPresContext_nsPresContextType_eContext_Print : root :: nsPresContext_nsPresContextType = 2 ; pub const nsPresContext_nsPresContextType_eContext_PageLayout : root :: nsPresContext_nsPresContextType = 3 ; pub type nsPresContext_nsPresContextType = :: std :: os :: raw :: c_uint ; pub const nsPresContext_InteractionType_eClickInteraction : root :: nsPresContext_InteractionType = 0 ; pub const nsPresContext_InteractionType_eKeyInteraction : root :: nsPresContext_InteractionType = 1 ; pub const nsPresContext_InteractionType_eMouseMoveInteraction : root :: nsPresContext_InteractionType = 2 ; pub const nsPresContext_InteractionType_eScrollInteraction : root :: nsPresContext_InteractionType = 3 ; pub type nsPresContext_InteractionType = u32 ; 
  /// A class that can be used to temporarily disable reflow interruption. 
  # [ repr ( C ) ] # [ derive ( Debug ) ] pub struct nsPresContext_InterruptPreventer { pub mCtx : * mut root :: nsPresContext , pub mInterruptsEnabled : bool , pub mHasPendingInterrupt : bool , } # [ test ] fn bindgen_test_layout_nsPresContext_InterruptPreventer ( ) { assert_eq ! ( :: std :: mem :: size_of :: < nsPresContext_InterruptPreventer > ( ) , 16usize , concat ! ( "Size of: " , stringify ! ( nsPresContext_InterruptPreventer ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < nsPresContext_InterruptPreventer > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( nsPresContext_InterruptPreventer ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext_InterruptPreventer ) ) . mCtx as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext_InterruptPreventer ) , "::" , stringify ! ( mCtx ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext_InterruptPreventer ) ) . mInterruptsEnabled as * const _ as usize } , 8usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext_InterruptPreventer ) , "::" , stringify ! ( mInterruptsEnabled ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext_InterruptPreventer ) ) . mHasPendingInterrupt as * const _ as usize } , 9usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext_InterruptPreventer ) , "::" , stringify ! ( mHasPendingInterrupt ) ) ) ; } # [ repr ( C ) ] # [ derive ( Debug ) ] pub struct nsPresContext_TransactionInvalidations { pub mTransactionId : u64 , pub mInvalidations : root :: nsTArray < root :: nsRect > , } # [ test ] fn bindgen_test_layout_nsPresContext_TransactionInvalidations ( ) { assert_eq ! ( :: std :: mem :: size_of :: < nsPresContext_TransactionInvalidations > ( ) , 16usize , concat ! ( "Size of: " , stringify ! ( nsPresContext_TransactionInvalidations ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < nsPresContext_TransactionInvalidations > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( nsPresContext_TransactionInvalidations ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext_TransactionInvalidations ) ) . mTransactionId as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext_TransactionInvalidations ) , "::" , stringify ! ( mTransactionId ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext_TransactionInvalidations ) ) . mInvalidations as * const _ as usize } , 8usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext_TransactionInvalidations ) , "::" , stringify ! ( mInvalidations ) ) ) ; } extern "C" {
  # [ link_name = "\u{1}_ZN13nsPresContext21_cycleCollectorGlobalE" ] 
  pub static mut  nsPresContext__cycleCollectorGlobal  :  root :: nsPresContext_cycleCollection ;
-} # [ test ] fn bindgen_test_layout_nsPresContext ( ) { assert_eq ! ( :: std :: mem :: size_of :: < nsPresContext > ( ) , 1376usize , concat ! ( "Size of: " , stringify ! ( nsPresContext ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < nsPresContext > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( nsPresContext ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mRefCnt as * const _ as usize } , 16usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mRefCnt ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mType as * const _ as usize } , 24usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mType ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mShell as * const _ as usize } , 32usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mShell ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mDocument as * const _ as usize } , 40usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mDocument ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mDeviceContext as * const _ as usize } , 48usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mDeviceContext ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mEventManager as * const _ as usize } , 56usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mEventManager ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mRefreshDriver as * const _ as usize } , 64usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mRefreshDriver ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mEffectCompositor as * const _ as usize } , 72usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mEffectCompositor ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mTransitionManager as * const _ as usize } , 80usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mTransitionManager ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mAnimationManager as * const _ as usize } , 88usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mAnimationManager ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mRestyleManager as * const _ as usize } , 96usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mRestyleManager ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mCounterStyleManager as * const _ as usize } , 104usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mCounterStyleManager ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mMedium as * const _ as usize } , 112usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mMedium ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mMediaEmulated as * const _ as usize } , 120usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mMediaEmulated ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mFontFeatureValuesLookup as * const _ as usize } , 128usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mFontFeatureValuesLookup ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mLinkHandler as * const _ as usize } , 136usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mLinkHandler ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mLanguage as * const _ as usize } , 144usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mLanguage ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mInflationDisabledForShrinkWrap as * const _ as usize } , 152usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mInflationDisabledForShrinkWrap ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mContainer as * const _ as usize } , 160usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mContainer ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mBaseMinFontSize as * const _ as usize } , 168usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mBaseMinFontSize ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mSystemFontScale as * const _ as usize } , 172usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mSystemFontScale ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mTextZoom as * const _ as usize } , 176usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mTextZoom ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mEffectiveTextZoom as * const _ as usize } , 180usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mEffectiveTextZoom ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mFullZoom as * const _ as usize } , 184usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mFullZoom ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mOverrideDPPX as * const _ as usize } , 188usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mOverrideDPPX ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mLastFontInflationScreenSize as * const _ as usize } , 192usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mLastFontInflationScreenSize ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mCurAppUnitsPerDevPixel as * const _ as usize } , 208usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mCurAppUnitsPerDevPixel ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mAutoQualityMinFontSizePixelsPref as * const _ as usize } , 212usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mAutoQualityMinFontSizePixelsPref ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mTheme as * const _ as usize } , 216usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mTheme ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mLangService as * const _ as usize } , 224usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mLangService ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mPrintSettings as * const _ as usize } , 232usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mPrintSettings ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mPrefChangedTimer as * const _ as usize } , 240usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mPrefChangedTimer ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mBidiEngine as * const _ as usize } , 248usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mBidiEngine ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mTransactions as * const _ as usize } , 256usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mTransactions ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mTextPerf as * const _ as usize } , 336usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mTextPerf ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mMissingFonts as * const _ as usize } , 344usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mMissingFonts ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mVisibleArea as * const _ as usize } , 352usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mVisibleArea ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mLastResizeEventVisibleArea as * const _ as usize } , 368usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mLastResizeEventVisibleArea ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mPageSize as * const _ as usize } , 384usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mPageSize ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mPageScale as * const _ as usize } , 392usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mPageScale ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mPPScale as * const _ as usize } , 396usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mPPScale ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mDefaultColor as * const _ as usize } , 400usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mDefaultColor ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mBackgroundColor as * const _ as usize } , 404usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mBackgroundColor ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mLinkColor as * const _ as usize } , 408usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mLinkColor ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mActiveLinkColor as * const _ as usize } , 412usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mActiveLinkColor ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mVisitedLinkColor as * const _ as usize } , 416usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mVisitedLinkColor ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mFocusBackgroundColor as * const _ as usize } , 420usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mFocusBackgroundColor ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mFocusTextColor as * const _ as usize } , 424usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mFocusTextColor ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mBodyTextColor as * const _ as usize } , 428usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mBodyTextColor ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mViewportScrollbarOverrideElement as * const _ as usize } , 432usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mViewportScrollbarOverrideElement ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mViewportStyleScrollbar as * const _ as usize } , 440usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mViewportStyleScrollbar ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mFocusRingWidth as * const _ as usize } , 504usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mFocusRingWidth ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mExistThrottledUpdates as * const _ as usize } , 505usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mExistThrottledUpdates ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mImageAnimationMode as * const _ as usize } , 506usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mImageAnimationMode ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mImageAnimationModePref as * const _ as usize } , 508usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mImageAnimationModePref ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mLangGroupFontPrefs as * const _ as usize } , 512usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mLangGroupFontPrefs ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mFontGroupCacheDirty as * const _ as usize } , 1208usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mFontGroupCacheDirty ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mLanguagesUsed as * const _ as usize } , 1216usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mLanguagesUsed ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mBorderWidthTable as * const _ as usize } , 1248usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mBorderWidthTable ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mInterruptChecksToSkip as * const _ as usize } , 1260usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mInterruptChecksToSkip ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mElementsRestyled as * const _ as usize } , 1264usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mElementsRestyled ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mFramesConstructed as * const _ as usize } , 1272usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mFramesConstructed ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mFramesReflowed as * const _ as usize } , 1280usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mFramesReflowed ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mReflowStartTime as * const _ as usize } , 1288usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mReflowStartTime ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mFirstNonBlankPaintTime as * const _ as usize } , 1296usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mFirstNonBlankPaintTime ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mFirstClickTime as * const _ as usize } , 1304usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mFirstClickTime ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mFirstKeyTime as * const _ as usize } , 1312usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mFirstKeyTime ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mFirstMouseMoveTime as * const _ as usize } , 1320usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mFirstMouseMoveTime ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mFirstScrollTime as * const _ as usize } , 1328usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mFirstScrollTime ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mInteractionTimeEnabled as * const _ as usize } , 1336usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mInteractionTimeEnabled ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mLastStyleUpdateForAllAnimations as * const _ as usize } , 1344usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mLastStyleUpdateForAllAnimations ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mTelemetryScrollLastY as * const _ as usize } , 1352usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mTelemetryScrollLastY ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mTelemetryScrollMaxY as * const _ as usize } , 1356usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mTelemetryScrollMaxY ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mTelemetryScrollTotalY as * const _ as usize } , 1360usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mTelemetryScrollTotalY ) ) ) ; } impl nsPresContext { # [ inline ] pub fn mHasPendingInterrupt ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x1 as u64 ; let val = ( unit_field_val & mask ) >> 0usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mHasPendingInterrupt ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x1 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 0usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mPendingInterruptFromTest ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x2 as u64 ; let val = ( unit_field_val & mask ) >> 1usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mPendingInterruptFromTest ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x2 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 1usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mInterruptsEnabled ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x4 as u64 ; let val = ( unit_field_val & mask ) >> 2usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mInterruptsEnabled ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x4 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 2usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mUseDocumentFonts ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x8 as u64 ; let val = ( unit_field_val & mask ) >> 3usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mUseDocumentFonts ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x8 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 3usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mUseDocumentColors ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x10 as u64 ; let val = ( unit_field_val & mask ) >> 4usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mUseDocumentColors ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x10 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 4usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mUnderlineLinks ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x20 as u64 ; let val = ( unit_field_val & mask ) >> 5usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mUnderlineLinks ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x20 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 5usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mSendAfterPaintToContent ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x40 as u64 ; let val = ( unit_field_val & mask ) >> 6usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mSendAfterPaintToContent ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x40 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 6usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mUseFocusColors ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x80 as u64 ; let val = ( unit_field_val & mask ) >> 7usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mUseFocusColors ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x80 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 7usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mFocusRingOnAnything ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x100 as u64 ; let val = ( unit_field_val & mask ) >> 8usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mFocusRingOnAnything ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x100 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 8usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mFocusRingStyle ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x200 as u64 ; let val = ( unit_field_val & mask ) >> 9usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mFocusRingStyle ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x200 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 9usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mDrawImageBackground ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x400 as u64 ; let val = ( unit_field_val & mask ) >> 10usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mDrawImageBackground ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x400 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 10usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mDrawColorBackground ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x800 as u64 ; let val = ( unit_field_val & mask ) >> 11usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mDrawColorBackground ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x800 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 11usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mNeverAnimate ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x1000 as u64 ; let val = ( unit_field_val & mask ) >> 12usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mNeverAnimate ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x1000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 12usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mIsRenderingOnlySelection ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x2000 as u64 ; let val = ( unit_field_val & mask ) >> 13usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mIsRenderingOnlySelection ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x2000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 13usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mPaginated ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x4000 as u64 ; let val = ( unit_field_val & mask ) >> 14usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mPaginated ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x4000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 14usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mCanPaginatedScroll ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x8000 as u64 ; let val = ( unit_field_val & mask ) >> 15usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mCanPaginatedScroll ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x8000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 15usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mDoScaledTwips ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x10000 as u64 ; let val = ( unit_field_val & mask ) >> 16usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mDoScaledTwips ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x10000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 16usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mIsRootPaginatedDocument ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x20000 as u64 ; let val = ( unit_field_val & mask ) >> 17usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mIsRootPaginatedDocument ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x20000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 17usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mPrefBidiDirection ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x40000 as u64 ; let val = ( unit_field_val & mask ) >> 18usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mPrefBidiDirection ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x40000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 18usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mPrefScrollbarSide ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x180000 as u64 ; let val = ( unit_field_val & mask ) >> 19usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mPrefScrollbarSide ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x180000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 19usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mPendingSysColorChanged ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x200000 as u64 ; let val = ( unit_field_val & mask ) >> 21usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mPendingSysColorChanged ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x200000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 21usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mPendingThemeChanged ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x400000 as u64 ; let val = ( unit_field_val & mask ) >> 22usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mPendingThemeChanged ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x400000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 22usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mPendingUIResolutionChanged ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x800000 as u64 ; let val = ( unit_field_val & mask ) >> 23usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mPendingUIResolutionChanged ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x800000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 23usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mPendingMediaFeatureValuesChanged ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x1000000 as u64 ; let val = ( unit_field_val & mask ) >> 24usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mPendingMediaFeatureValuesChanged ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x1000000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 24usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mPrefChangePendingNeedsReflow ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x2000000 as u64 ; let val = ( unit_field_val & mask ) >> 25usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mPrefChangePendingNeedsReflow ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x2000000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 25usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mIsEmulatingMedia ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x4000000 as u64 ; let val = ( unit_field_val & mask ) >> 26usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mIsEmulatingMedia ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x4000000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 26usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mIsGlyph ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x8000000 as u64 ; let val = ( unit_field_val & mask ) >> 27usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mIsGlyph ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x8000000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 27usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mUsesRootEMUnits ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x10000000 as u64 ; let val = ( unit_field_val & mask ) >> 28usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mUsesRootEMUnits ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x10000000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 28usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mUsesExChUnits ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x20000000 as u64 ; let val = ( unit_field_val & mask ) >> 29usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mUsesExChUnits ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x20000000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 29usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mPendingViewportChange ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x40000000 as u64 ; let val = ( unit_field_val & mask ) >> 30usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mPendingViewportChange ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x40000000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 30usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mCounterStylesDirty ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x80000000 as u64 ; let val = ( unit_field_val & mask ) >> 31usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mCounterStylesDirty ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x80000000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 31usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mPostedFlushCounterStyles ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x100000000 as u64 ; let val = ( unit_field_val & mask ) >> 32usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mPostedFlushCounterStyles ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x100000000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 32usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mFontFeatureValuesDirty ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x200000000 as u64 ; let val = ( unit_field_val & mask ) >> 33usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mFontFeatureValuesDirty ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x200000000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 33usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mPostedFlushFontFeatureValues ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x400000000 as u64 ; let val = ( unit_field_val & mask ) >> 34usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mPostedFlushFontFeatureValues ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x400000000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 34usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mSuppressResizeReflow ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x800000000 as u64 ; let val = ( unit_field_val & mask ) >> 35usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mSuppressResizeReflow ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x800000000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 35usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mIsVisual ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x1000000000 as u64 ; let val = ( unit_field_val & mask ) >> 36usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mIsVisual ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x1000000000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 36usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mFireAfterPaintEvents ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x2000000000 as u64 ; let val = ( unit_field_val & mask ) >> 37usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mFireAfterPaintEvents ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x2000000000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 37usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mIsChrome ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x4000000000 as u64 ; let val = ( unit_field_val & mask ) >> 38usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mIsChrome ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x4000000000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 38usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mIsChromeOriginImage ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x8000000000 as u64 ; let val = ( unit_field_val & mask ) >> 39usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mIsChromeOriginImage ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x8000000000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 39usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mPaintFlashing ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x10000000000 as u64 ; let val = ( unit_field_val & mask ) >> 40usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mPaintFlashing ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x10000000000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 40usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mPaintFlashingInitialized ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x20000000000 as u64 ; let val = ( unit_field_val & mask ) >> 41usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mPaintFlashingInitialized ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x20000000000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 41usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mHasWarnedAboutPositionedTableParts ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x40000000000 as u64 ; let val = ( unit_field_val & mask ) >> 42usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mHasWarnedAboutPositionedTableParts ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x40000000000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 42usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mHasWarnedAboutTooLargeDashedOrDottedRadius ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x80000000000 as u64 ; let val = ( unit_field_val & mask ) >> 43usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mHasWarnedAboutTooLargeDashedOrDottedRadius ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x80000000000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 43usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mQuirkSheetAdded ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x100000000000 as u64 ; let val = ( unit_field_val & mask ) >> 44usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mQuirkSheetAdded ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x100000000000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 44usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mNeedsPrefUpdate ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x200000000000 as u64 ; let val = ( unit_field_val & mask ) >> 45usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mNeedsPrefUpdate ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x200000000000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 45usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mHadNonBlankPaint ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x400000000000 as u64 ; let val = ( unit_field_val & mask ) >> 46usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mHadNonBlankPaint ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x400000000000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 46usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn new_bitfield_1 ( mHasPendingInterrupt : :: std :: os :: raw :: c_uint , mPendingInterruptFromTest : :: std :: os :: raw :: c_uint , mInterruptsEnabled : :: std :: os :: raw :: c_uint , mUseDocumentFonts : :: std :: os :: raw :: c_uint , mUseDocumentColors : :: std :: os :: raw :: c_uint , mUnderlineLinks : :: std :: os :: raw :: c_uint , mSendAfterPaintToContent : :: std :: os :: raw :: c_uint , mUseFocusColors : :: std :: os :: raw :: c_uint , mFocusRingOnAnything : :: std :: os :: raw :: c_uint , mFocusRingStyle : :: std :: os :: raw :: c_uint , mDrawImageBackground : :: std :: os :: raw :: c_uint , mDrawColorBackground : :: std :: os :: raw :: c_uint , mNeverAnimate : :: std :: os :: raw :: c_uint , mIsRenderingOnlySelection : :: std :: os :: raw :: c_uint , mPaginated : :: std :: os :: raw :: c_uint , mCanPaginatedScroll : :: std :: os :: raw :: c_uint , mDoScaledTwips : :: std :: os :: raw :: c_uint , mIsRootPaginatedDocument : :: std :: os :: raw :: c_uint , mPrefBidiDirection : :: std :: os :: raw :: c_uint , mPrefScrollbarSide : :: std :: os :: raw :: c_uint , mPendingSysColorChanged : :: std :: os :: raw :: c_uint , mPendingThemeChanged : :: std :: os :: raw :: c_uint , mPendingUIResolutionChanged : :: std :: os :: raw :: c_uint , mPendingMediaFeatureValuesChanged : :: std :: os :: raw :: c_uint , mPrefChangePendingNeedsReflow : :: std :: os :: raw :: c_uint , mIsEmulatingMedia : :: std :: os :: raw :: c_uint , mIsGlyph : :: std :: os :: raw :: c_uint , mUsesRootEMUnits : :: std :: os :: raw :: c_uint , mUsesExChUnits : :: std :: os :: raw :: c_uint , mPendingViewportChange : :: std :: os :: raw :: c_uint , mCounterStylesDirty : :: std :: os :: raw :: c_uint , mPostedFlushCounterStyles : :: std :: os :: raw :: c_uint , mFontFeatureValuesDirty : :: std :: os :: raw :: c_uint , mPostedFlushFontFeatureValues : :: std :: os :: raw :: c_uint , mSuppressResizeReflow : :: std :: os :: raw :: c_uint , mIsVisual : :: std :: os :: raw :: c_uint , mFireAfterPaintEvents : :: std :: os :: raw :: c_uint , mIsChrome : :: std :: os :: raw :: c_uint , mIsChromeOriginImage : :: std :: os :: raw :: c_uint , mPaintFlashing : :: std :: os :: raw :: c_uint , mPaintFlashingInitialized : :: std :: os :: raw :: c_uint , mHasWarnedAboutPositionedTableParts : :: std :: os :: raw :: c_uint , mHasWarnedAboutTooLargeDashedOrDottedRadius : :: std :: os :: raw :: c_uint , mQuirkSheetAdded : :: std :: os :: raw :: c_uint , mNeedsPrefUpdate : :: std :: os :: raw :: c_uint , mHadNonBlankPaint : :: std :: os :: raw :: c_uint ) -> u64 { ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( 0 | ( ( mHasPendingInterrupt as u32 as u64 ) << 0usize ) & ( 0x1 as u64 ) ) | ( ( mPendingInterruptFromTest as u32 as u64 ) << 1usize ) & ( 0x2 as u64 ) ) | ( ( mInterruptsEnabled as u32 as u64 ) << 2usize ) & ( 0x4 as u64 ) ) | ( ( mUseDocumentFonts as u32 as u64 ) << 3usize ) & ( 0x8 as u64 ) ) | ( ( mUseDocumentColors as u32 as u64 ) << 4usize ) & ( 0x10 as u64 ) ) | ( ( mUnderlineLinks as u32 as u64 ) << 5usize ) & ( 0x20 as u64 ) ) | ( ( mSendAfterPaintToContent as u32 as u64 ) << 6usize ) & ( 0x40 as u64 ) ) | ( ( mUseFocusColors as u32 as u64 ) << 7usize ) & ( 0x80 as u64 ) ) | ( ( mFocusRingOnAnything as u32 as u64 ) << 8usize ) & ( 0x100 as u64 ) ) | ( ( mFocusRingStyle as u32 as u64 ) << 9usize ) & ( 0x200 as u64 ) ) | ( ( mDrawImageBackground as u32 as u64 ) << 10usize ) & ( 0x400 as u64 ) ) | ( ( mDrawColorBackground as u32 as u64 ) << 11usize ) & ( 0x800 as u64 ) ) | ( ( mNeverAnimate as u32 as u64 ) << 12usize ) & ( 0x1000 as u64 ) ) | ( ( mIsRenderingOnlySelection as u32 as u64 ) << 13usize ) & ( 0x2000 as u64 ) ) | ( ( mPaginated as u32 as u64 ) << 14usize ) & ( 0x4000 as u64 ) ) | ( ( mCanPaginatedScroll as u32 as u64 ) << 15usize ) & ( 0x8000 as u64 ) ) | ( ( mDoScaledTwips as u32 as u64 ) << 16usize ) & ( 0x10000 as u64 ) ) | ( ( mIsRootPaginatedDocument as u32 as u64 ) << 17usize ) & ( 0x20000 as u64 ) ) | ( ( mPrefBidiDirection as u32 as u64 ) << 18usize ) & ( 0x40000 as u64 ) ) | ( ( mPrefScrollbarSide as u32 as u64 ) << 19usize ) & ( 0x180000 as u64 ) ) | ( ( mPendingSysColorChanged as u32 as u64 ) << 21usize ) & ( 0x200000 as u64 ) ) | ( ( mPendingThemeChanged as u32 as u64 ) << 22usize ) & ( 0x400000 as u64 ) ) | ( ( mPendingUIResolutionChanged as u32 as u64 ) << 23usize ) & ( 0x800000 as u64 ) ) | ( ( mPendingMediaFeatureValuesChanged as u32 as u64 ) << 24usize ) & ( 0x1000000 as u64 ) ) | ( ( mPrefChangePendingNeedsReflow as u32 as u64 ) << 25usize ) & ( 0x2000000 as u64 ) ) | ( ( mIsEmulatingMedia as u32 as u64 ) << 26usize ) & ( 0x4000000 as u64 ) ) | ( ( mIsGlyph as u32 as u64 ) << 27usize ) & ( 0x8000000 as u64 ) ) | ( ( mUsesRootEMUnits as u32 as u64 ) << 28usize ) & ( 0x10000000 as u64 ) ) | ( ( mUsesExChUnits as u32 as u64 ) << 29usize ) & ( 0x20000000 as u64 ) ) | ( ( mPendingViewportChange as u32 as u64 ) << 30usize ) & ( 0x40000000 as u64 ) ) | ( ( mCounterStylesDirty as u32 as u64 ) << 31usize ) & ( 0x80000000 as u64 ) ) | ( ( mPostedFlushCounterStyles as u32 as u64 ) << 32usize ) & ( 0x100000000 as u64 ) ) | ( ( mFontFeatureValuesDirty as u32 as u64 ) << 33usize ) & ( 0x200000000 as u64 ) ) | ( ( mPostedFlushFontFeatureValues as u32 as u64 ) << 34usize ) & ( 0x400000000 as u64 ) ) | ( ( mSuppressResizeReflow as u32 as u64 ) << 35usize ) & ( 0x800000000 as u64 ) ) | ( ( mIsVisual as u32 as u64 ) << 36usize ) & ( 0x1000000000 as u64 ) ) | ( ( mFireAfterPaintEvents as u32 as u64 ) << 37usize ) & ( 0x2000000000 as u64 ) ) | ( ( mIsChrome as u32 as u64 ) << 38usize ) & ( 0x4000000000 as u64 ) ) | ( ( mIsChromeOriginImage as u32 as u64 ) << 39usize ) & ( 0x8000000000 as u64 ) ) | ( ( mPaintFlashing as u32 as u64 ) << 40usize ) & ( 0x10000000000 as u64 ) ) | ( ( mPaintFlashingInitialized as u32 as u64 ) << 41usize ) & ( 0x20000000000 as u64 ) ) | ( ( mHasWarnedAboutPositionedTableParts as u32 as u64 ) << 42usize ) & ( 0x40000000000 as u64 ) ) | ( ( mHasWarnedAboutTooLargeDashedOrDottedRadius as u32 as u64 ) << 43usize ) & ( 0x80000000000 as u64 ) ) | ( ( mQuirkSheetAdded as u32 as u64 ) << 44usize ) & ( 0x100000000000 as u64 ) ) | ( ( mNeedsPrefUpdate as u32 as u64 ) << 45usize ) & ( 0x200000000000 as u64 ) ) | ( ( mHadNonBlankPaint as u32 as u64 ) << 46usize ) & ( 0x400000000000 as u64 ) ) } } # [ repr ( i16 ) ] # [ derive ( Debug , Copy , Clone , PartialEq , Eq , Hash ) ] pub enum nsCSSKeyword { eCSSKeyword_UNKNOWN = -1 , eCSSKeyword__moz_activehyperlinktext = 0 , eCSSKeyword__moz_all = 1 , eCSSKeyword__moz_alt_content = 2 , eCSSKeyword__moz_available = 3 , eCSSKeyword__moz_box = 4 , eCSSKeyword__moz_button = 5 , eCSSKeyword__moz_buttondefault = 6 , eCSSKeyword__moz_buttonhoverface = 7 , eCSSKeyword__moz_buttonhovertext = 8 , eCSSKeyword__moz_cellhighlight = 9 , eCSSKeyword__moz_cellhighlighttext = 10 , eCSSKeyword__moz_center = 11 , eCSSKeyword__moz_combobox = 12 , eCSSKeyword__moz_comboboxtext = 13 , eCSSKeyword__moz_context_properties = 14 , eCSSKeyword__moz_block_height = 15 , eCSSKeyword__moz_deck = 16 , eCSSKeyword__moz_default_background_color = 17 , eCSSKeyword__moz_default_color = 18 , eCSSKeyword__moz_desktop = 19 , eCSSKeyword__moz_dialog = 20 , eCSSKeyword__moz_dialogtext = 21 , eCSSKeyword__moz_document = 22 , eCSSKeyword__moz_dragtargetzone = 23 , eCSSKeyword__moz_element = 24 , eCSSKeyword__moz_eventreerow = 25 , eCSSKeyword__moz_field = 26 , eCSSKeyword__moz_fieldtext = 27 , eCSSKeyword__moz_fit_content = 28 , eCSSKeyword__moz_fixed = 29 , eCSSKeyword__moz_grabbing = 30 , eCSSKeyword__moz_grab = 31 , eCSSKeyword__moz_grid_group = 32 , eCSSKeyword__moz_grid_line = 33 , eCSSKeyword__moz_grid = 34 , eCSSKeyword__moz_groupbox = 35 , eCSSKeyword__moz_gtk_info_bar = 36 , eCSSKeyword__moz_gtk_info_bar_text = 37 , eCSSKeyword__moz_hidden_unscrollable = 38 , eCSSKeyword__moz_hyperlinktext = 39 , eCSSKeyword__moz_html_cellhighlight = 40 , eCSSKeyword__moz_html_cellhighlighttext = 41 , eCSSKeyword__moz_image_rect = 42 , eCSSKeyword__moz_info = 43 , eCSSKeyword__moz_inline_box = 44 , eCSSKeyword__moz_inline_grid = 45 , eCSSKeyword__moz_inline_stack = 46 , eCSSKeyword__moz_left = 47 , eCSSKeyword__moz_list = 48 , eCSSKeyword__moz_mac_buttonactivetext = 49 , eCSSKeyword__moz_mac_chrome_active = 50 , eCSSKeyword__moz_mac_chrome_inactive = 51 , eCSSKeyword__moz_mac_defaultbuttontext = 52 , eCSSKeyword__moz_mac_focusring = 53 , eCSSKeyword__moz_mac_fullscreen_button = 54 , eCSSKeyword__moz_mac_menuselect = 55 , eCSSKeyword__moz_mac_menushadow = 56 , eCSSKeyword__moz_mac_menutextdisable = 57 , eCSSKeyword__moz_mac_menutextselect = 58 , eCSSKeyword__moz_mac_disabledtoolbartext = 59 , eCSSKeyword__moz_mac_secondaryhighlight = 60 , eCSSKeyword__moz_mac_menuitem = 61 , eCSSKeyword__moz_mac_active_menuitem = 62 , eCSSKeyword__moz_mac_menupopup = 63 , eCSSKeyword__moz_mac_tooltip = 64 , eCSSKeyword__moz_max_content = 65 , eCSSKeyword__moz_menuhover = 66 , eCSSKeyword__moz_menuhovertext = 67 , eCSSKeyword__moz_menubartext = 68 , eCSSKeyword__moz_menubarhovertext = 69 , eCSSKeyword__moz_middle_with_baseline = 70 , eCSSKeyword__moz_min_content = 71 , eCSSKeyword__moz_nativehyperlinktext = 72 , eCSSKeyword__moz_none = 73 , eCSSKeyword__moz_oddtreerow = 74 , eCSSKeyword__moz_popup = 75 , eCSSKeyword__moz_pre_space = 76 , eCSSKeyword__moz_pull_down_menu = 77 , eCSSKeyword__moz_right = 78 , eCSSKeyword__moz_scrollbars_horizontal = 79 , eCSSKeyword__moz_scrollbars_none = 80 , eCSSKeyword__moz_scrollbars_vertical = 81 , eCSSKeyword__moz_stack = 82 , eCSSKeyword__moz_text = 83 , eCSSKeyword__moz_use_system_font = 84 , eCSSKeyword__moz_visitedhyperlinktext = 85 , eCSSKeyword__moz_window = 86 , eCSSKeyword__moz_workspace = 87 , eCSSKeyword__moz_zoom_in = 88 , eCSSKeyword__moz_zoom_out = 89 , eCSSKeyword__webkit_box = 90 , eCSSKeyword__webkit_flex = 91 , eCSSKeyword__webkit_inline_box = 92 , eCSSKeyword__webkit_inline_flex = 93 , eCSSKeyword_absolute = 94 , eCSSKeyword_active = 95 , eCSSKeyword_activeborder = 96 , eCSSKeyword_activecaption = 97 , eCSSKeyword_add = 98 , eCSSKeyword_additive = 99 , eCSSKeyword_alias = 100 , eCSSKeyword_all = 101 , eCSSKeyword_all_petite_caps = 102 , eCSSKeyword_all_scroll = 103 , eCSSKeyword_all_small_caps = 104 , eCSSKeyword_alpha = 105 , eCSSKeyword_alternate = 106 , eCSSKeyword_alternate_reverse = 107 , eCSSKeyword_always = 108 , eCSSKeyword_annotation = 109 , eCSSKeyword_appworkspace = 110 , eCSSKeyword_auto = 111 , eCSSKeyword_auto_fill = 112 , eCSSKeyword_auto_fit = 113 , eCSSKeyword_auto_flow = 114 , eCSSKeyword_avoid = 115 , eCSSKeyword_background = 116 , eCSSKeyword_backwards = 117 , eCSSKeyword_balance = 118 , eCSSKeyword_baseline = 119 , eCSSKeyword_bidi_override = 120 , eCSSKeyword_blink = 121 , eCSSKeyword_block = 122 , eCSSKeyword_block_axis = 123 , eCSSKeyword_blur = 124 , eCSSKeyword_bold = 125 , eCSSKeyword_bold_fraktur = 126 , eCSSKeyword_bold_italic = 127 , eCSSKeyword_bold_sans_serif = 128 , eCSSKeyword_bold_script = 129 , eCSSKeyword_bolder = 130 , eCSSKeyword_border_box = 131 , eCSSKeyword_both = 132 , eCSSKeyword_bottom = 133 , eCSSKeyword_bottom_outside = 134 , eCSSKeyword_break_all = 135 , eCSSKeyword_break_word = 136 , eCSSKeyword_brightness = 137 , eCSSKeyword_browser = 138 , eCSSKeyword_bullets = 139 , eCSSKeyword_button = 140 , eCSSKeyword_buttonface = 141 , eCSSKeyword_buttonhighlight = 142 , eCSSKeyword_buttonshadow = 143 , eCSSKeyword_buttontext = 144 , eCSSKeyword_capitalize = 145 , eCSSKeyword_caption = 146 , eCSSKeyword_captiontext = 147 , eCSSKeyword_cell = 148 , eCSSKeyword_center = 149 , eCSSKeyword_ch = 150 , eCSSKeyword_character_variant = 151 , eCSSKeyword_circle = 152 , eCSSKeyword_cjk_decimal = 153 , eCSSKeyword_clip = 154 , eCSSKeyword_clone = 155 , eCSSKeyword_close_quote = 156 , eCSSKeyword_closest_corner = 157 , eCSSKeyword_closest_side = 158 , eCSSKeyword_cm = 159 , eCSSKeyword_col_resize = 160 , eCSSKeyword_collapse = 161 , eCSSKeyword_color = 162 , eCSSKeyword_color_burn = 163 , eCSSKeyword_color_dodge = 164 , eCSSKeyword_common_ligatures = 165 , eCSSKeyword_column = 166 , eCSSKeyword_column_reverse = 167 , eCSSKeyword_condensed = 168 , eCSSKeyword_contain = 169 , eCSSKeyword_content_box = 170 , eCSSKeyword_contents = 171 , eCSSKeyword_context_fill = 172 , eCSSKeyword_context_fill_opacity = 173 , eCSSKeyword_context_menu = 174 , eCSSKeyword_context_stroke = 175 , eCSSKeyword_context_stroke_opacity = 176 , eCSSKeyword_context_value = 177 , eCSSKeyword_continuous = 178 , eCSSKeyword_contrast = 179 , eCSSKeyword_copy = 180 , eCSSKeyword_contextual = 181 , eCSSKeyword_cover = 182 , eCSSKeyword_crop = 183 , eCSSKeyword_cross = 184 , eCSSKeyword_crosshair = 185 , eCSSKeyword_currentcolor = 186 , eCSSKeyword_cursive = 187 , eCSSKeyword_cyclic = 188 , eCSSKeyword_darken = 189 , eCSSKeyword_dashed = 190 , eCSSKeyword_dense = 191 , eCSSKeyword_decimal = 192 , eCSSKeyword_default = 193 , eCSSKeyword_deg = 194 , eCSSKeyword_diagonal_fractions = 195 , eCSSKeyword_dialog = 196 , eCSSKeyword_difference = 197 , eCSSKeyword_digits = 198 , eCSSKeyword_disabled = 199 , eCSSKeyword_disc = 200 , eCSSKeyword_discretionary_ligatures = 201 , eCSSKeyword_distribute = 202 , eCSSKeyword_dot = 203 , eCSSKeyword_dotted = 204 , eCSSKeyword_double = 205 , eCSSKeyword_double_circle = 206 , eCSSKeyword_double_struck = 207 , eCSSKeyword_drag = 208 , eCSSKeyword_drop_shadow = 209 , eCSSKeyword_e_resize = 210 , eCSSKeyword_ease = 211 , eCSSKeyword_ease_in = 212 , eCSSKeyword_ease_in_out = 213 , eCSSKeyword_ease_out = 214 , eCSSKeyword_economy = 215 , eCSSKeyword_element = 216 , eCSSKeyword_elements = 217 , eCSSKeyword_ellipse = 218 , eCSSKeyword_ellipsis = 219 , eCSSKeyword_em = 220 , eCSSKeyword_embed = 221 , eCSSKeyword_enabled = 222 , eCSSKeyword_end = 223 , eCSSKeyword_ex = 224 , eCSSKeyword_exact = 225 , eCSSKeyword_exclude = 226 , eCSSKeyword_exclusion = 227 , eCSSKeyword_expanded = 228 , eCSSKeyword_extends = 229 , eCSSKeyword_extra_condensed = 230 , eCSSKeyword_extra_expanded = 231 , eCSSKeyword_ew_resize = 232 , eCSSKeyword_fallback = 233 , eCSSKeyword_fantasy = 234 , eCSSKeyword_farthest_side = 235 , eCSSKeyword_farthest_corner = 236 , eCSSKeyword_fill = 237 , eCSSKeyword_filled = 238 , eCSSKeyword_fill_box = 239 , eCSSKeyword_first = 240 , eCSSKeyword_fit_content = 241 , eCSSKeyword_fixed = 242 , eCSSKeyword_flat = 243 , eCSSKeyword_flex = 244 , eCSSKeyword_flex_end = 245 , eCSSKeyword_flex_start = 246 , eCSSKeyword_flip = 247 , eCSSKeyword_flow_root = 248 , eCSSKeyword_forwards = 249 , eCSSKeyword_fraktur = 250 , eCSSKeyword_frames = 251 , eCSSKeyword_from_image = 252 , eCSSKeyword_full_width = 253 , eCSSKeyword_fullscreen = 254 , eCSSKeyword_grab = 255 , eCSSKeyword_grabbing = 256 , eCSSKeyword_grad = 257 , eCSSKeyword_grayscale = 258 , eCSSKeyword_graytext = 259 , eCSSKeyword_grid = 260 , eCSSKeyword_groove = 261 , eCSSKeyword_hard_light = 262 , eCSSKeyword_help = 263 , eCSSKeyword_hidden = 264 , eCSSKeyword_hide = 265 , eCSSKeyword_highlight = 266 , eCSSKeyword_highlighttext = 267 , eCSSKeyword_historical_forms = 268 , eCSSKeyword_historical_ligatures = 269 , eCSSKeyword_horizontal = 270 , eCSSKeyword_horizontal_tb = 271 , eCSSKeyword_hue = 272 , eCSSKeyword_hue_rotate = 273 , eCSSKeyword_hz = 274 , eCSSKeyword_icon = 275 , eCSSKeyword_ignore = 276 , eCSSKeyword_ignore_horizontal = 277 , eCSSKeyword_ignore_vertical = 278 , eCSSKeyword_in = 279 , eCSSKeyword_interlace = 280 , eCSSKeyword_inactive = 281 , eCSSKeyword_inactiveborder = 282 , eCSSKeyword_inactivecaption = 283 , eCSSKeyword_inactivecaptiontext = 284 , eCSSKeyword_infinite = 285 , eCSSKeyword_infobackground = 286 , eCSSKeyword_infotext = 287 , eCSSKeyword_inherit = 288 , eCSSKeyword_initial = 289 , eCSSKeyword_inline = 290 , eCSSKeyword_inline_axis = 291 , eCSSKeyword_inline_block = 292 , eCSSKeyword_inline_end = 293 , eCSSKeyword_inline_flex = 294 , eCSSKeyword_inline_grid = 295 , eCSSKeyword_inline_start = 296 , eCSSKeyword_inline_table = 297 , eCSSKeyword_inset = 298 , eCSSKeyword_inside = 299 , eCSSKeyword_inter_character = 300 , eCSSKeyword_inter_word = 301 , eCSSKeyword_interpolatematrix = 302 , eCSSKeyword_accumulatematrix = 303 , eCSSKeyword_intersect = 304 , eCSSKeyword_isolate = 305 , eCSSKeyword_isolate_override = 306 , eCSSKeyword_invert = 307 , eCSSKeyword_italic = 308 , eCSSKeyword_jis78 = 309 , eCSSKeyword_jis83 = 310 , eCSSKeyword_jis90 = 311 , eCSSKeyword_jis04 = 312 , eCSSKeyword_justify = 313 , eCSSKeyword_keep_all = 314 , eCSSKeyword_khz = 315 , eCSSKeyword_landscape = 316 , eCSSKeyword_large = 317 , eCSSKeyword_larger = 318 , eCSSKeyword_last = 319 , eCSSKeyword_last_baseline = 320 , eCSSKeyword_layout = 321 , eCSSKeyword_left = 322 , eCSSKeyword_legacy = 323 , eCSSKeyword_lighten = 324 , eCSSKeyword_lighter = 325 , eCSSKeyword_line_through = 326 , eCSSKeyword_linear = 327 , eCSSKeyword_lining_nums = 328 , eCSSKeyword_list_item = 329 , eCSSKeyword_local = 330 , eCSSKeyword_logical = 331 , eCSSKeyword_looped = 332 , eCSSKeyword_lowercase = 333 , eCSSKeyword_lr = 334 , eCSSKeyword_lr_tb = 335 , eCSSKeyword_ltr = 336 , eCSSKeyword_luminance = 337 , eCSSKeyword_luminosity = 338 , eCSSKeyword_mandatory = 339 , eCSSKeyword_manipulation = 340 , eCSSKeyword_manual = 341 , eCSSKeyword_margin_box = 342 , eCSSKeyword_markers = 343 , eCSSKeyword_match_parent = 344 , eCSSKeyword_match_source = 345 , eCSSKeyword_matrix = 346 , eCSSKeyword_matrix3d = 347 , eCSSKeyword_max_content = 348 , eCSSKeyword_medium = 349 , eCSSKeyword_menu = 350 , eCSSKeyword_menutext = 351 , eCSSKeyword_message_box = 352 , eCSSKeyword_middle = 353 , eCSSKeyword_min_content = 354 , eCSSKeyword_minmax = 355 , eCSSKeyword_mix = 356 , eCSSKeyword_mixed = 357 , eCSSKeyword_mm = 358 , eCSSKeyword_monospace = 359 , eCSSKeyword_move = 360 , eCSSKeyword_ms = 361 , eCSSKeyword_multiply = 362 , eCSSKeyword_n_resize = 363 , eCSSKeyword_narrower = 364 , eCSSKeyword_ne_resize = 365 , eCSSKeyword_nesw_resize = 366 , eCSSKeyword_no_clip = 367 , eCSSKeyword_no_close_quote = 368 , eCSSKeyword_no_common_ligatures = 369 , eCSSKeyword_no_contextual = 370 , eCSSKeyword_no_discretionary_ligatures = 371 , eCSSKeyword_no_drag = 372 , eCSSKeyword_no_drop = 373 , eCSSKeyword_no_historical_ligatures = 374 , eCSSKeyword_no_open_quote = 375 , eCSSKeyword_no_repeat = 376 , eCSSKeyword_none = 377 , eCSSKeyword_normal = 378 , eCSSKeyword_not_allowed = 379 , eCSSKeyword_nowrap = 380 , eCSSKeyword_numeric = 381 , eCSSKeyword_ns_resize = 382 , eCSSKeyword_nw_resize = 383 , eCSSKeyword_nwse_resize = 384 , eCSSKeyword_oblique = 385 , eCSSKeyword_oldstyle_nums = 386 , eCSSKeyword_opacity = 387 , eCSSKeyword_open = 388 , eCSSKeyword_open_quote = 389 , eCSSKeyword_optional = 390 , eCSSKeyword_ordinal = 391 , eCSSKeyword_ornaments = 392 , eCSSKeyword_outset = 393 , eCSSKeyword_outside = 394 , eCSSKeyword_over = 395 , eCSSKeyword_overlay = 396 , eCSSKeyword_overline = 397 , eCSSKeyword_paint = 398 , eCSSKeyword_padding_box = 399 , eCSSKeyword_painted = 400 , eCSSKeyword_pan_x = 401 , eCSSKeyword_pan_y = 402 , eCSSKeyword_paused = 403 , eCSSKeyword_pc = 404 , eCSSKeyword_perspective = 405 , eCSSKeyword_petite_caps = 406 , eCSSKeyword_physical = 407 , eCSSKeyword_plaintext = 408 , eCSSKeyword_pointer = 409 , eCSSKeyword_polygon = 410 , eCSSKeyword_portrait = 411 , eCSSKeyword_pre = 412 , eCSSKeyword_pre_wrap = 413 , eCSSKeyword_pre_line = 414 , eCSSKeyword_preserve_3d = 415 , eCSSKeyword_progress = 416 , eCSSKeyword_progressive = 417 , eCSSKeyword_proportional_nums = 418 , eCSSKeyword_proportional_width = 419 , eCSSKeyword_proximity = 420 , eCSSKeyword_pt = 421 , eCSSKeyword_px = 422 , eCSSKeyword_rad = 423 , eCSSKeyword_read_only = 424 , eCSSKeyword_read_write = 425 , eCSSKeyword_relative = 426 , eCSSKeyword_repeat = 427 , eCSSKeyword_repeat_x = 428 , eCSSKeyword_repeat_y = 429 , eCSSKeyword_reverse = 430 , eCSSKeyword_ridge = 431 , eCSSKeyword_right = 432 , eCSSKeyword_rl = 433 , eCSSKeyword_rl_tb = 434 , eCSSKeyword_rotate = 435 , eCSSKeyword_rotate3d = 436 , eCSSKeyword_rotatex = 437 , eCSSKeyword_rotatey = 438 , eCSSKeyword_rotatez = 439 , eCSSKeyword_round = 440 , eCSSKeyword_row = 441 , eCSSKeyword_row_resize = 442 , eCSSKeyword_row_reverse = 443 , eCSSKeyword_rtl = 444 , eCSSKeyword_ruby = 445 , eCSSKeyword_ruby_base = 446 , eCSSKeyword_ruby_base_container = 447 , eCSSKeyword_ruby_text = 448 , eCSSKeyword_ruby_text_container = 449 , eCSSKeyword_running = 450 , eCSSKeyword_s = 451 , eCSSKeyword_s_resize = 452 , eCSSKeyword_safe = 453 , eCSSKeyword_saturate = 454 , eCSSKeyword_saturation = 455 , eCSSKeyword_scale = 456 , eCSSKeyword_scale_down = 457 , eCSSKeyword_scale3d = 458 , eCSSKeyword_scalex = 459 , eCSSKeyword_scaley = 460 , eCSSKeyword_scalez = 461 , eCSSKeyword_screen = 462 , eCSSKeyword_script = 463 , eCSSKeyword_scroll = 464 , eCSSKeyword_scrollbar = 465 , eCSSKeyword_scrollbar_small = 466 , eCSSKeyword_scrollbar_horizontal = 467 , eCSSKeyword_scrollbar_vertical = 468 , eCSSKeyword_se_resize = 469 , eCSSKeyword_select_after = 470 , eCSSKeyword_select_all = 471 , eCSSKeyword_select_before = 472 , eCSSKeyword_select_menu = 473 , eCSSKeyword_select_same = 474 , eCSSKeyword_self_end = 475 , eCSSKeyword_self_start = 476 , eCSSKeyword_semi_condensed = 477 , eCSSKeyword_semi_expanded = 478 , eCSSKeyword_separate = 479 , eCSSKeyword_sepia = 480 , eCSSKeyword_serif = 481 , eCSSKeyword_sesame = 482 , eCSSKeyword_show = 483 , eCSSKeyword_sideways = 484 , eCSSKeyword_sideways_lr = 485 , eCSSKeyword_sideways_right = 486 , eCSSKeyword_sideways_rl = 487 , eCSSKeyword_simplified = 488 , eCSSKeyword_skew = 489 , eCSSKeyword_skewx = 490 , eCSSKeyword_skewy = 491 , eCSSKeyword_slashed_zero = 492 , eCSSKeyword_slice = 493 , eCSSKeyword_small = 494 , eCSSKeyword_small_caps = 495 , eCSSKeyword_small_caption = 496 , eCSSKeyword_smaller = 497 , eCSSKeyword_smooth = 498 , eCSSKeyword_soft = 499 , eCSSKeyword_soft_light = 500 , eCSSKeyword_solid = 501 , eCSSKeyword_space_around = 502 , eCSSKeyword_space_between = 503 , eCSSKeyword_space_evenly = 504 , eCSSKeyword_span = 505 , eCSSKeyword_spell_out = 506 , eCSSKeyword_square = 507 , eCSSKeyword_stacked_fractions = 508 , eCSSKeyword_start = 509 , eCSSKeyword_static = 510 , eCSSKeyword_standalone = 511 , eCSSKeyword_status_bar = 512 , eCSSKeyword_step_end = 513 , eCSSKeyword_step_start = 514 , eCSSKeyword_sticky = 515 , eCSSKeyword_stretch = 516 , eCSSKeyword_stretch_to_fit = 517 , eCSSKeyword_stretched = 518 , eCSSKeyword_strict = 519 , eCSSKeyword_stroke = 520 , eCSSKeyword_stroke_box = 521 , eCSSKeyword_style = 522 , eCSSKeyword_styleset = 523 , eCSSKeyword_stylistic = 524 , eCSSKeyword_sub = 525 , eCSSKeyword_subgrid = 526 , eCSSKeyword_subtract = 527 , eCSSKeyword_super = 528 , eCSSKeyword_sw_resize = 529 , eCSSKeyword_swash = 530 , eCSSKeyword_swap = 531 , eCSSKeyword_table = 532 , eCSSKeyword_table_caption = 533 , eCSSKeyword_table_cell = 534 , eCSSKeyword_table_column = 535 , eCSSKeyword_table_column_group = 536 , eCSSKeyword_table_footer_group = 537 , eCSSKeyword_table_header_group = 538 , eCSSKeyword_table_row = 539 , eCSSKeyword_table_row_group = 540 , eCSSKeyword_tabular_nums = 541 , eCSSKeyword_tailed = 542 , eCSSKeyword_tb = 543 , eCSSKeyword_tb_rl = 544 , eCSSKeyword_text = 545 , eCSSKeyword_text_bottom = 546 , eCSSKeyword_text_top = 547 , eCSSKeyword_thick = 548 , eCSSKeyword_thin = 549 , eCSSKeyword_threeddarkshadow = 550 , eCSSKeyword_threedface = 551 , eCSSKeyword_threedhighlight = 552 , eCSSKeyword_threedlightshadow = 553 , eCSSKeyword_threedshadow = 554 , eCSSKeyword_titling_caps = 555 , eCSSKeyword_toggle = 556 , eCSSKeyword_top = 557 , eCSSKeyword_top_outside = 558 , eCSSKeyword_traditional = 559 , eCSSKeyword_translate = 560 , eCSSKeyword_translate3d = 561 , eCSSKeyword_translatex = 562 , eCSSKeyword_translatey = 563 , eCSSKeyword_translatez = 564 , eCSSKeyword_transparent = 565 , eCSSKeyword_triangle = 566 , eCSSKeyword_tri_state = 567 , eCSSKeyword_ultra_condensed = 568 , eCSSKeyword_ultra_expanded = 569 , eCSSKeyword_under = 570 , eCSSKeyword_underline = 571 , eCSSKeyword_unicase = 572 , eCSSKeyword_unsafe = 573 , eCSSKeyword_unset = 574 , eCSSKeyword_uppercase = 575 , eCSSKeyword_upright = 576 , eCSSKeyword_vertical = 577 , eCSSKeyword_vertical_lr = 578 , eCSSKeyword_vertical_rl = 579 , eCSSKeyword_vertical_text = 580 , eCSSKeyword_view_box = 581 , eCSSKeyword_visible = 582 , eCSSKeyword_visiblefill = 583 , eCSSKeyword_visiblepainted = 584 , eCSSKeyword_visiblestroke = 585 , eCSSKeyword_w_resize = 586 , eCSSKeyword_wait = 587 , eCSSKeyword_wavy = 588 , eCSSKeyword_weight = 589 , eCSSKeyword_wider = 590 , eCSSKeyword_window = 591 , eCSSKeyword_windowframe = 592 , eCSSKeyword_windowtext = 593 , eCSSKeyword_words = 594 , eCSSKeyword_wrap = 595 , eCSSKeyword_wrap_reverse = 596 , eCSSKeyword_write_only = 597 , eCSSKeyword_x_large = 598 , eCSSKeyword_x_small = 599 , eCSSKeyword_xx_large = 600 , eCSSKeyword_xx_small = 601 , eCSSKeyword_zoom_in = 602 , eCSSKeyword_zoom_out = 603 , eCSSKeyword_radio = 604 , eCSSKeyword_checkbox = 605 , eCSSKeyword_button_bevel = 606 , eCSSKeyword_toolbox = 607 , eCSSKeyword_toolbar = 608 , eCSSKeyword_toolbarbutton = 609 , eCSSKeyword_toolbargripper = 610 , eCSSKeyword_dualbutton = 611 , eCSSKeyword_toolbarbutton_dropdown = 612 , eCSSKeyword_button_arrow_up = 613 , eCSSKeyword_button_arrow_down = 614 , eCSSKeyword_button_arrow_next = 615 , eCSSKeyword_button_arrow_previous = 616 , eCSSKeyword_separator = 617 , eCSSKeyword_splitter = 618 , eCSSKeyword_statusbar = 619 , eCSSKeyword_statusbarpanel = 620 , eCSSKeyword_resizerpanel = 621 , eCSSKeyword_resizer = 622 , eCSSKeyword_listbox = 623 , eCSSKeyword_listitem = 624 , eCSSKeyword_numbers = 625 , eCSSKeyword_number_input = 626 , eCSSKeyword_treeview = 627 , eCSSKeyword_treeitem = 628 , eCSSKeyword_treetwisty = 629 , eCSSKeyword_treetwistyopen = 630 , eCSSKeyword_treeline = 631 , eCSSKeyword_treeheader = 632 , eCSSKeyword_treeheadercell = 633 , eCSSKeyword_treeheadersortarrow = 634 , eCSSKeyword_progressbar = 635 , eCSSKeyword_progressbar_vertical = 636 , eCSSKeyword_progresschunk = 637 , eCSSKeyword_progresschunk_vertical = 638 , eCSSKeyword_tab = 639 , eCSSKeyword_tabpanels = 640 , eCSSKeyword_tabpanel = 641 , eCSSKeyword_tab_scroll_arrow_back = 642 , eCSSKeyword_tab_scroll_arrow_forward = 643 , eCSSKeyword_tooltip = 644 , eCSSKeyword_spinner = 645 , eCSSKeyword_spinner_upbutton = 646 , eCSSKeyword_spinner_downbutton = 647 , eCSSKeyword_spinner_textfield = 648 , eCSSKeyword_scrollbarbutton_up = 649 , eCSSKeyword_scrollbarbutton_down = 650 , eCSSKeyword_scrollbarbutton_left = 651 , eCSSKeyword_scrollbarbutton_right = 652 , eCSSKeyword_scrollbartrack_horizontal = 653 , eCSSKeyword_scrollbartrack_vertical = 654 , eCSSKeyword_scrollbarthumb_horizontal = 655 , eCSSKeyword_scrollbarthumb_vertical = 656 , eCSSKeyword_sheet = 657 , eCSSKeyword_textfield = 658 , eCSSKeyword_textfield_multiline = 659 , eCSSKeyword_caret = 660 , eCSSKeyword_searchfield = 661 , eCSSKeyword_menubar = 662 , eCSSKeyword_menupopup = 663 , eCSSKeyword_menuitem = 664 , eCSSKeyword_checkmenuitem = 665 , eCSSKeyword_radiomenuitem = 666 , eCSSKeyword_menucheckbox = 667 , eCSSKeyword_menuradio = 668 , eCSSKeyword_menuseparator = 669 , eCSSKeyword_menuarrow = 670 , eCSSKeyword_menuimage = 671 , eCSSKeyword_menuitemtext = 672 , eCSSKeyword_menulist = 673 , eCSSKeyword_menulist_button = 674 , eCSSKeyword_menulist_text = 675 , eCSSKeyword_menulist_textfield = 676 , eCSSKeyword_meterbar = 677 , eCSSKeyword_meterchunk = 678 , eCSSKeyword_minimal_ui = 679 , eCSSKeyword_range = 680 , eCSSKeyword_range_thumb = 681 , eCSSKeyword_sans_serif = 682 , eCSSKeyword_sans_serif_bold_italic = 683 , eCSSKeyword_sans_serif_italic = 684 , eCSSKeyword_scale_horizontal = 685 , eCSSKeyword_scale_vertical = 686 , eCSSKeyword_scalethumb_horizontal = 687 , eCSSKeyword_scalethumb_vertical = 688 , eCSSKeyword_scalethumbstart = 689 , eCSSKeyword_scalethumbend = 690 , eCSSKeyword_scalethumbtick = 691 , eCSSKeyword_groupbox = 692 , eCSSKeyword_checkbox_container = 693 , eCSSKeyword_radio_container = 694 , eCSSKeyword_checkbox_label = 695 , eCSSKeyword_radio_label = 696 , eCSSKeyword_button_focus = 697 , eCSSKeyword__moz_win_media_toolbox = 698 , eCSSKeyword__moz_win_communications_toolbox = 699 , eCSSKeyword__moz_win_browsertabbar_toolbox = 700 , eCSSKeyword__moz_win_accentcolor = 701 , eCSSKeyword__moz_win_accentcolortext = 702 , eCSSKeyword__moz_win_mediatext = 703 , eCSSKeyword__moz_win_communicationstext = 704 , eCSSKeyword__moz_win_glass = 705 , eCSSKeyword__moz_win_borderless_glass = 706 , eCSSKeyword__moz_window_titlebar = 707 , eCSSKeyword__moz_window_titlebar_maximized = 708 , eCSSKeyword__moz_window_frame_left = 709 , eCSSKeyword__moz_window_frame_right = 710 , eCSSKeyword__moz_window_frame_bottom = 711 , eCSSKeyword__moz_window_button_close = 712 , eCSSKeyword__moz_window_button_minimize = 713 , eCSSKeyword__moz_window_button_maximize = 714 , eCSSKeyword__moz_window_button_restore = 715 , eCSSKeyword__moz_window_button_box = 716 , eCSSKeyword__moz_window_button_box_maximized = 717 , eCSSKeyword__moz_mac_help_button = 718 , eCSSKeyword__moz_win_exclude_glass = 719 , eCSSKeyword__moz_mac_vibrancy_light = 720 , eCSSKeyword__moz_mac_vibrancy_dark = 721 , eCSSKeyword__moz_mac_vibrant_titlebar_light = 722 , eCSSKeyword__moz_mac_vibrant_titlebar_dark = 723 , eCSSKeyword__moz_mac_disclosure_button_closed = 724 , eCSSKeyword__moz_mac_disclosure_button_open = 725 , eCSSKeyword__moz_mac_source_list = 726 , eCSSKeyword__moz_mac_source_list_selection = 727 , eCSSKeyword__moz_mac_active_source_list_selection = 728 , eCSSKeyword_alphabetic = 729 , eCSSKeyword_bevel = 730 , eCSSKeyword_butt = 731 , eCSSKeyword_central = 732 , eCSSKeyword_crispedges = 733 , eCSSKeyword_evenodd = 734 , eCSSKeyword_geometricprecision = 735 , eCSSKeyword_hanging = 736 , eCSSKeyword_ideographic = 737 , eCSSKeyword_linearrgb = 738 , eCSSKeyword_mathematical = 739 , eCSSKeyword_miter = 740 , eCSSKeyword_no_change = 741 , eCSSKeyword_non_scaling_stroke = 742 , eCSSKeyword_nonzero = 743 , eCSSKeyword_optimizelegibility = 744 , eCSSKeyword_optimizequality = 745 , eCSSKeyword_optimizespeed = 746 , eCSSKeyword_reset_size = 747 , eCSSKeyword_srgb = 748 , eCSSKeyword_symbolic = 749 , eCSSKeyword_symbols = 750 , eCSSKeyword_text_after_edge = 751 , eCSSKeyword_text_before_edge = 752 , eCSSKeyword_use_script = 753 , eCSSKeyword__moz_crisp_edges = 754 , eCSSKeyword_space = 755 , eCSSKeyword_COUNT = 756 , } pub const nsStyleStructID_nsStyleStructID_None : root :: nsStyleStructID = -1 ; pub const nsStyleStructID_nsStyleStructID_Inherited_Start : root :: nsStyleStructID = 0 ; pub const nsStyleStructID_nsStyleStructID_DUMMY1 : root :: nsStyleStructID = -1 ; pub const nsStyleStructID_eStyleStruct_Font : root :: nsStyleStructID = 0 ; pub const nsStyleStructID_eStyleStruct_Color : root :: nsStyleStructID = 1 ; pub const nsStyleStructID_eStyleStruct_List : root :: nsStyleStructID = 2 ; pub const nsStyleStructID_eStyleStruct_Text : root :: nsStyleStructID = 3 ; pub const nsStyleStructID_eStyleStruct_Visibility : root :: nsStyleStructID = 4 ; pub const nsStyleStructID_eStyleStruct_UserInterface : root :: nsStyleStructID = 5 ; pub const nsStyleStructID_eStyleStruct_TableBorder : root :: nsStyleStructID = 6 ; pub const nsStyleStructID_eStyleStruct_SVG : root :: nsStyleStructID = 7 ; pub const nsStyleStructID_eStyleStruct_Variables : root :: nsStyleStructID = 8 ; pub const nsStyleStructID_nsStyleStructID_Reset_Start : root :: nsStyleStructID = 9 ; pub const nsStyleStructID_nsStyleStructID_DUMMY2 : root :: nsStyleStructID = 8 ; pub const nsStyleStructID_eStyleStruct_Background : root :: nsStyleStructID = 9 ; pub const nsStyleStructID_eStyleStruct_Position : root :: nsStyleStructID = 10 ; pub const nsStyleStructID_eStyleStruct_TextReset : root :: nsStyleStructID = 11 ; pub const nsStyleStructID_eStyleStruct_Display : root :: nsStyleStructID = 12 ; pub const nsStyleStructID_eStyleStruct_Content : root :: nsStyleStructID = 13 ; pub const nsStyleStructID_eStyleStruct_UIReset : root :: nsStyleStructID = 14 ; pub const nsStyleStructID_eStyleStruct_Table : root :: nsStyleStructID = 15 ; pub const nsStyleStructID_eStyleStruct_Margin : root :: nsStyleStructID = 16 ; pub const nsStyleStructID_eStyleStruct_Padding : root :: nsStyleStructID = 17 ; pub const nsStyleStructID_eStyleStruct_Border : root :: nsStyleStructID = 18 ; pub const nsStyleStructID_eStyleStruct_Outline : root :: nsStyleStructID = 19 ; pub const nsStyleStructID_eStyleStruct_XUL : root :: nsStyleStructID = 20 ; pub const nsStyleStructID_eStyleStruct_SVGReset : root :: nsStyleStructID = 21 ; pub const nsStyleStructID_eStyleStruct_Column : root :: nsStyleStructID = 22 ; pub const nsStyleStructID_eStyleStruct_Effects : root :: nsStyleStructID = 23 ; pub const nsStyleStructID_nsStyleStructID_Length : root :: nsStyleStructID = 24 ; pub const nsStyleStructID_nsStyleStructID_Inherited_Count : root :: nsStyleStructID = 9 ; pub const nsStyleStructID_nsStyleStructID_Reset_Count : root :: nsStyleStructID = 15 ; pub type nsStyleStructID = :: std :: os :: raw :: c_int ; pub const nsStyleAnimType_eStyleAnimType_Custom : root :: nsStyleAnimType = 0 ; pub const nsStyleAnimType_eStyleAnimType_Coord : root :: nsStyleAnimType = 1 ; pub const nsStyleAnimType_eStyleAnimType_Sides_Top : root :: nsStyleAnimType = 2 ; pub const nsStyleAnimType_eStyleAnimType_Sides_Right : root :: nsStyleAnimType = 3 ; pub const nsStyleAnimType_eStyleAnimType_Sides_Bottom : root :: nsStyleAnimType = 4 ; pub const nsStyleAnimType_eStyleAnimType_Sides_Left : root :: nsStyleAnimType = 5 ; pub const nsStyleAnimType_eStyleAnimType_Corner_TopLeft : root :: nsStyleAnimType = 6 ; pub const nsStyleAnimType_eStyleAnimType_Corner_TopRight : root :: nsStyleAnimType = 7 ; pub const nsStyleAnimType_eStyleAnimType_Corner_BottomRight : root :: nsStyleAnimType = 8 ; pub const nsStyleAnimType_eStyleAnimType_Corner_BottomLeft : root :: nsStyleAnimType = 9 ; pub const nsStyleAnimType_eStyleAnimType_nscoord : root :: nsStyleAnimType = 10 ; pub const nsStyleAnimType_eStyleAnimType_float : root :: nsStyleAnimType = 11 ; pub const nsStyleAnimType_eStyleAnimType_Color : root :: nsStyleAnimType = 12 ; pub const nsStyleAnimType_eStyleAnimType_ComplexColor : root :: nsStyleAnimType = 13 ; pub const nsStyleAnimType_eStyleAnimType_PaintServer : root :: nsStyleAnimType = 14 ; pub const nsStyleAnimType_eStyleAnimType_Shadow : root :: nsStyleAnimType = 15 ; pub const nsStyleAnimType_eStyleAnimType_Discrete : root :: nsStyleAnimType = 16 ; pub const nsStyleAnimType_eStyleAnimType_None : root :: nsStyleAnimType = 17 ; pub type nsStyleAnimType = :: std :: os :: raw :: c_uint ; # [ repr ( C ) ] # [ derive ( Debug , Copy ) ] pub struct nsCSSProps { pub _address : u8 , } pub use self :: super :: root :: mozilla :: CSSEnabledState as nsCSSProps_EnabledState ; # [ repr ( C ) ] # [ derive ( Debug , Copy ) ] pub struct nsCSSProps_KTableEntry { pub mKeyword : root :: nsCSSKeyword , pub mValue : i16 , } # [ test ] fn bindgen_test_layout_nsCSSProps_KTableEntry ( ) { assert_eq ! ( :: std :: mem :: size_of :: < nsCSSProps_KTableEntry > ( ) , 4usize , concat ! ( "Size of: " , stringify ! ( nsCSSProps_KTableEntry ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < nsCSSProps_KTableEntry > ( ) , 2usize , concat ! ( "Alignment of " , stringify ! ( nsCSSProps_KTableEntry ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsCSSProps_KTableEntry ) ) . mKeyword as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( nsCSSProps_KTableEntry ) , "::" , stringify ! ( mKeyword ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsCSSProps_KTableEntry ) ) . mValue as * const _ as usize } , 2usize , concat ! ( "Alignment of field: " , stringify ! ( nsCSSProps_KTableEntry ) , "::" , stringify ! ( mValue ) ) ) ; } impl Clone for nsCSSProps_KTableEntry { fn clone ( & self ) -> Self { * self } } extern "C" {
+} # [ test ] fn bindgen_test_layout_nsPresContext ( ) { assert_eq ! ( :: std :: mem :: size_of :: < nsPresContext > ( ) , 1376usize , concat ! ( "Size of: " , stringify ! ( nsPresContext ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < nsPresContext > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( nsPresContext ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mRefCnt as * const _ as usize } , 16usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mRefCnt ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mType as * const _ as usize } , 24usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mType ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mShell as * const _ as usize } , 32usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mShell ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mDocument as * const _ as usize } , 40usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mDocument ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mDeviceContext as * const _ as usize } , 48usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mDeviceContext ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mEventManager as * const _ as usize } , 56usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mEventManager ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mRefreshDriver as * const _ as usize } , 64usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mRefreshDriver ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mEffectCompositor as * const _ as usize } , 72usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mEffectCompositor ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mTransitionManager as * const _ as usize } , 80usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mTransitionManager ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mAnimationManager as * const _ as usize } , 88usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mAnimationManager ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mRestyleManager as * const _ as usize } , 96usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mRestyleManager ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mCounterStyleManager as * const _ as usize } , 104usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mCounterStyleManager ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mMedium as * const _ as usize } , 112usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mMedium ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mMediaEmulated as * const _ as usize } , 120usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mMediaEmulated ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mFontFeatureValuesLookup as * const _ as usize } , 128usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mFontFeatureValuesLookup ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mLinkHandler as * const _ as usize } , 136usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mLinkHandler ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mLanguage as * const _ as usize } , 144usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mLanguage ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mInflationDisabledForShrinkWrap as * const _ as usize } , 152usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mInflationDisabledForShrinkWrap ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mContainer as * const _ as usize } , 160usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mContainer ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mBaseMinFontSize as * const _ as usize } , 168usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mBaseMinFontSize ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mSystemFontScale as * const _ as usize } , 172usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mSystemFontScale ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mTextZoom as * const _ as usize } , 176usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mTextZoom ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mEffectiveTextZoom as * const _ as usize } , 180usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mEffectiveTextZoom ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mFullZoom as * const _ as usize } , 184usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mFullZoom ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mOverrideDPPX as * const _ as usize } , 188usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mOverrideDPPX ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mLastFontInflationScreenSize as * const _ as usize } , 192usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mLastFontInflationScreenSize ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mCurAppUnitsPerDevPixel as * const _ as usize } , 208usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mCurAppUnitsPerDevPixel ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mAutoQualityMinFontSizePixelsPref as * const _ as usize } , 212usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mAutoQualityMinFontSizePixelsPref ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mTheme as * const _ as usize } , 216usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mTheme ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mLangService as * const _ as usize } , 224usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mLangService ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mPrintSettings as * const _ as usize } , 232usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mPrintSettings ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mPrefChangedTimer as * const _ as usize } , 240usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mPrefChangedTimer ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mBidiEngine as * const _ as usize } , 248usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mBidiEngine ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mTransactions as * const _ as usize } , 256usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mTransactions ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mTextPerf as * const _ as usize } , 336usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mTextPerf ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mMissingFonts as * const _ as usize } , 344usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mMissingFonts ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mVisibleArea as * const _ as usize } , 352usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mVisibleArea ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mLastResizeEventVisibleArea as * const _ as usize } , 368usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mLastResizeEventVisibleArea ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mPageSize as * const _ as usize } , 384usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mPageSize ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mPageScale as * const _ as usize } , 392usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mPageScale ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mPPScale as * const _ as usize } , 396usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mPPScale ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mDefaultColor as * const _ as usize } , 400usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mDefaultColor ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mBackgroundColor as * const _ as usize } , 404usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mBackgroundColor ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mLinkColor as * const _ as usize } , 408usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mLinkColor ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mActiveLinkColor as * const _ as usize } , 412usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mActiveLinkColor ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mVisitedLinkColor as * const _ as usize } , 416usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mVisitedLinkColor ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mFocusBackgroundColor as * const _ as usize } , 420usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mFocusBackgroundColor ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mFocusTextColor as * const _ as usize } , 424usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mFocusTextColor ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mBodyTextColor as * const _ as usize } , 428usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mBodyTextColor ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mViewportScrollbarOverrideElement as * const _ as usize } , 432usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mViewportScrollbarOverrideElement ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mViewportStyleScrollbar as * const _ as usize } , 440usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mViewportStyleScrollbar ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mFocusRingWidth as * const _ as usize } , 504usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mFocusRingWidth ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mExistThrottledUpdates as * const _ as usize } , 505usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mExistThrottledUpdates ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mImageAnimationMode as * const _ as usize } , 506usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mImageAnimationMode ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mImageAnimationModePref as * const _ as usize } , 508usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mImageAnimationModePref ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mLangGroupFontPrefs as * const _ as usize } , 512usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mLangGroupFontPrefs ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mFontGroupCacheDirty as * const _ as usize } , 1208usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mFontGroupCacheDirty ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mLanguagesUsed as * const _ as usize } , 1216usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mLanguagesUsed ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mBorderWidthTable as * const _ as usize } , 1248usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mBorderWidthTable ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mInterruptChecksToSkip as * const _ as usize } , 1260usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mInterruptChecksToSkip ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mElementsRestyled as * const _ as usize } , 1264usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mElementsRestyled ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mFramesConstructed as * const _ as usize } , 1272usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mFramesConstructed ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mFramesReflowed as * const _ as usize } , 1280usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mFramesReflowed ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mReflowStartTime as * const _ as usize } , 1288usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mReflowStartTime ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mFirstNonBlankPaintTime as * const _ as usize } , 1296usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mFirstNonBlankPaintTime ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mFirstClickTime as * const _ as usize } , 1304usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mFirstClickTime ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mFirstKeyTime as * const _ as usize } , 1312usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mFirstKeyTime ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mFirstMouseMoveTime as * const _ as usize } , 1320usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mFirstMouseMoveTime ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mFirstScrollTime as * const _ as usize } , 1328usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mFirstScrollTime ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mInteractionTimeEnabled as * const _ as usize } , 1336usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mInteractionTimeEnabled ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mLastStyleUpdateForAllAnimations as * const _ as usize } , 1344usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mLastStyleUpdateForAllAnimations ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mTelemetryScrollLastY as * const _ as usize } , 1352usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mTelemetryScrollLastY ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mTelemetryScrollMaxY as * const _ as usize } , 1356usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mTelemetryScrollMaxY ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPresContext ) ) . mTelemetryScrollTotalY as * const _ as usize } , 1360usize , concat ! ( "Alignment of field: " , stringify ! ( nsPresContext ) , "::" , stringify ! ( mTelemetryScrollTotalY ) ) ) ; } impl nsPresContext { # [ inline ] pub fn mHasPendingInterrupt ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x1 as u64 ; let val = ( unit_field_val & mask ) >> 0usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mHasPendingInterrupt ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x1 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 0usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mPendingInterruptFromTest ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x2 as u64 ; let val = ( unit_field_val & mask ) >> 1usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mPendingInterruptFromTest ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x2 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 1usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mInterruptsEnabled ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x4 as u64 ; let val = ( unit_field_val & mask ) >> 2usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mInterruptsEnabled ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x4 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 2usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mUseDocumentFonts ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x8 as u64 ; let val = ( unit_field_val & mask ) >> 3usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mUseDocumentFonts ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x8 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 3usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mUseDocumentColors ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x10 as u64 ; let val = ( unit_field_val & mask ) >> 4usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mUseDocumentColors ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x10 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 4usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mUnderlineLinks ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x20 as u64 ; let val = ( unit_field_val & mask ) >> 5usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mUnderlineLinks ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x20 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 5usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mSendAfterPaintToContent ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x40 as u64 ; let val = ( unit_field_val & mask ) >> 6usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mSendAfterPaintToContent ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x40 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 6usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mUseFocusColors ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x80 as u64 ; let val = ( unit_field_val & mask ) >> 7usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mUseFocusColors ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x80 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 7usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mFocusRingOnAnything ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x100 as u64 ; let val = ( unit_field_val & mask ) >> 8usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mFocusRingOnAnything ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x100 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 8usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mFocusRingStyle ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x200 as u64 ; let val = ( unit_field_val & mask ) >> 9usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mFocusRingStyle ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x200 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 9usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mDrawImageBackground ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x400 as u64 ; let val = ( unit_field_val & mask ) >> 10usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mDrawImageBackground ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x400 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 10usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mDrawColorBackground ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x800 as u64 ; let val = ( unit_field_val & mask ) >> 11usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mDrawColorBackground ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x800 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 11usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mNeverAnimate ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x1000 as u64 ; let val = ( unit_field_val & mask ) >> 12usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mNeverAnimate ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x1000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 12usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mIsRenderingOnlySelection ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x2000 as u64 ; let val = ( unit_field_val & mask ) >> 13usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mIsRenderingOnlySelection ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x2000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 13usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mPaginated ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x4000 as u64 ; let val = ( unit_field_val & mask ) >> 14usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mPaginated ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x4000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 14usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mCanPaginatedScroll ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x8000 as u64 ; let val = ( unit_field_val & mask ) >> 15usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mCanPaginatedScroll ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x8000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 15usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mDoScaledTwips ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x10000 as u64 ; let val = ( unit_field_val & mask ) >> 16usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mDoScaledTwips ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x10000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 16usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mIsRootPaginatedDocument ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x20000 as u64 ; let val = ( unit_field_val & mask ) >> 17usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mIsRootPaginatedDocument ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x20000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 17usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mPrefBidiDirection ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x40000 as u64 ; let val = ( unit_field_val & mask ) >> 18usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mPrefBidiDirection ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x40000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 18usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mPrefScrollbarSide ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x180000 as u64 ; let val = ( unit_field_val & mask ) >> 19usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mPrefScrollbarSide ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x180000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 19usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mPendingSysColorChanged ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x200000 as u64 ; let val = ( unit_field_val & mask ) >> 21usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mPendingSysColorChanged ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x200000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 21usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mPendingThemeChanged ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x400000 as u64 ; let val = ( unit_field_val & mask ) >> 22usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mPendingThemeChanged ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x400000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 22usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mPendingUIResolutionChanged ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x800000 as u64 ; let val = ( unit_field_val & mask ) >> 23usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mPendingUIResolutionChanged ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x800000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 23usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mPendingMediaFeatureValuesChanged ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x1000000 as u64 ; let val = ( unit_field_val & mask ) >> 24usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mPendingMediaFeatureValuesChanged ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x1000000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 24usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mPrefChangePendingNeedsReflow ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x2000000 as u64 ; let val = ( unit_field_val & mask ) >> 25usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mPrefChangePendingNeedsReflow ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x2000000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 25usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mIsEmulatingMedia ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x4000000 as u64 ; let val = ( unit_field_val & mask ) >> 26usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mIsEmulatingMedia ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x4000000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 26usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mIsGlyph ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x8000000 as u64 ; let val = ( unit_field_val & mask ) >> 27usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mIsGlyph ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x8000000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 27usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mUsesRootEMUnits ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x10000000 as u64 ; let val = ( unit_field_val & mask ) >> 28usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mUsesRootEMUnits ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x10000000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 28usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mUsesExChUnits ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x20000000 as u64 ; let val = ( unit_field_val & mask ) >> 29usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mUsesExChUnits ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x20000000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 29usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mPendingViewportChange ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x40000000 as u64 ; let val = ( unit_field_val & mask ) >> 30usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mPendingViewportChange ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x40000000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 30usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mCounterStylesDirty ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x80000000 as u64 ; let val = ( unit_field_val & mask ) >> 31usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mCounterStylesDirty ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x80000000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 31usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mPostedFlushCounterStyles ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x100000000 as u64 ; let val = ( unit_field_val & mask ) >> 32usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mPostedFlushCounterStyles ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x100000000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 32usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mFontFeatureValuesDirty ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x200000000 as u64 ; let val = ( unit_field_val & mask ) >> 33usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mFontFeatureValuesDirty ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x200000000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 33usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mPostedFlushFontFeatureValues ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x400000000 as u64 ; let val = ( unit_field_val & mask ) >> 34usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mPostedFlushFontFeatureValues ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x400000000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 34usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mSuppressResizeReflow ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x800000000 as u64 ; let val = ( unit_field_val & mask ) >> 35usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mSuppressResizeReflow ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x800000000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 35usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mIsVisual ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x1000000000 as u64 ; let val = ( unit_field_val & mask ) >> 36usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mIsVisual ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x1000000000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 36usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mFireAfterPaintEvents ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x2000000000 as u64 ; let val = ( unit_field_val & mask ) >> 37usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mFireAfterPaintEvents ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x2000000000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 37usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mIsChrome ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x4000000000 as u64 ; let val = ( unit_field_val & mask ) >> 38usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mIsChrome ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x4000000000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; unit_field_val &= ! mask ; unit_field_val |= ( val << 38usize ) & mask ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & unit_field_val as * const _ as * const u8 , & mut self . _bitfield_1 as * mut _ as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) ; } } # [ inline ] pub fn mIsChromeOriginImage ( & self ) -> :: std :: os :: raw :: c_uint { let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonoverlapping ( & self . _bitfield_1 as * const _ as * const u8 , & mut unit_field_val as * mut u64 as * mut u8 , :: std :: mem :: size_of :: < u64 > ( ) , ) } ; let mask = 0x8000000000 as u64 ; let val = ( unit_field_val & mask ) >> 39usize ; unsafe { :: std :: mem :: transmute ( val as u32 ) } } # [ inline ] pub fn set_mIsChromeOriginImage ( & mut self , val : :: std :: os :: raw :: c_uint ) { let mask = 0x8000000000 as u64 ; let val = val as u32 as u64 ; let mut unit_field_val : u64 = unsafe { :: std :: mem :: uninitialized ( ) } ; unsafe { :: std :: ptr :: copy_nonover