Merge autoland to mozilla-central r=merge a=merge
authorGurzau Raul <rgurzau@mozilla.com>
Wed, 10 Jan 2018 11:57:17 +0200
changeset 450245 78bb2af7c912124443ee144e967a301a68680211
parent 450167 ecb9935ce22318354a8edd4393533c4d01a60f10 (current diff)
parent 450244 1599fb3b361022c56638a1570272068dc69eb268 (diff)
child 450276 d5f42a23909eb181274731b07e4984bfbd18557d
push id8527
push userCallek@gmail.com
push dateThu, 11 Jan 2018 21:05:50 +0000
treeherdermozilla-beta@95342d212a7a [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge, merge
milestone59.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge autoland to mozilla-central r=merge a=merge
build/compare-mozconfig/compare-mozconfigs-wrapper.py
build/release/info.py
build/release/sanity.py
build/util/hg.py
dom/media/webrtc/AudioOutputObserver.h
toolkit/content/tests/chrome/test_datepicker.xul
toolkit/content/tests/chrome/test_timepicker.xul
toolkit/content/widgets/datetimepicker.xml
toolkit/locales/en-US/chrome/global/datetimepicker.dtd
toolkit/themes/osx/global/arrow/arrow-lft-hov.gif
toolkit/themes/osx/global/arrow/arrow-lft.gif
toolkit/themes/osx/global/arrow/arrow-rit-hov.gif
toolkit/themes/osx/global/datetimepicker.css
toolkit/themes/windows/global/datetimepicker.css
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -7479,21 +7479,21 @@ var gIdentityHandler = {
         tooltip = gNavigatorBundle.getFormattedString("identity.identified.verifier",
                                                       [iData.caOrg]);
         icon_label = iData.subjectOrg;
         if (iData.country)
           icon_country_label = "(" + iData.country + ")";
 
         // If the organization name starts with an RTL character, then
         // swap the positions of the organization and country code labels.
-        // The Unicode ranges reflect the definition of the UCS2_CHAR_IS_BIDI
+        // The Unicode ranges reflect the definition of the UTF16_CODE_UNIT_IS_BIDI
         // macro in intl/unicharutil/util/nsBidiUtils.h. When bug 218823 gets
         // fixed, this test should be replaced by one adhering to the
         // Unicode Bidirectional Algorithm proper (at the paragraph level).
-        icon_labels_dir = /^[\u0590-\u08ff\ufb1d-\ufdff\ufe70-\ufefc]/.test(icon_label) ?
+        icon_labels_dir = /^[\u0590-\u08ff\ufb1d-\ufdff\ufe70-\ufefc\ud802\ud803\ud83a\ud83b]/.test(icon_label) ?
                           "rtl" : "ltr";
       }
     } else if (this._pageExtensionPolicy) {
       this._identityBox.className = "extensionPage";
       let extensionName = this._pageExtensionPolicy.name;
       icon_label = gNavigatorBundle.getFormattedString(
         "identity.extension.label", [extensionName]);
     } else if (this._uriHasHost && this._isSecure) {
--- a/browser/components/extensions/test/browser/browser_ext_devtools_panel.js
+++ b/browser/components/extensions/test/browser/browser_ext_devtools_panel.js
@@ -35,16 +35,45 @@ async function testThemeSwitching(extens
          `The onThemeChanged event listener fired for the ${location}.`);
       is(await extension.awaitMessage(`current_theme_${location}`),
          newTheme,
          `The current theme is reported as expected for the ${location}.`);
     }
   }
 }
 
+add_task(async function setup_blank_panel() {
+  // Create a blank custom tool so that we don't need to wait the webconsole
+  // to be fully loaded/unloaded to prevent intermittent failures (related
+  // to a webconsole that is still loading when the test has been completed).
+  const testBlankPanel = {
+    id: "testBlankPanel",
+    url: "about:blank",
+    label: "Blank Tool",
+    isTargetSupported() {
+      return true;
+    },
+    build(iframeWindow, toolbox) {
+      return Promise.resolve({
+        target: toolbox.target,
+        toolbox: toolbox,
+        isReady: true,
+        panelDoc: iframeWindow.document,
+        destroy() {},
+      });
+    },
+  };
+
+  registerCleanupFunction(() => {
+    gDevTools.unregisterTool(testBlankPanel.id);
+  });
+
+  gDevTools.registerTool(testBlankPanel);
+});
+
 add_task(async function test_theme_name_no_panel() {
   let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, "http://mochi.test:8888/");
 
   async function devtools_page() {
     browser.devtools.panels.onThemeChanged.addListener(themeName => {
       browser.test.sendMessage("devtools_theme_changed_page", themeName);
       browser.test.sendMessage("current_theme_page", browser.devtools.panels.themeName);
     });
@@ -71,17 +100,17 @@ add_task(async function test_theme_name_
   });
 
   // Ensure that the initial value of the devtools theme is "light".
   await SpecialPowers.pushPrefEnv({set: [[DEVTOOLS_THEME_PREF, "light"]]});
 
   await extension.startup();
 
   let target = gDevTools.getTargetForTab(tab);
-  await gDevTools.showToolbox(target, "webconsole");
+  await gDevTools.showToolbox(target, "testBlankPanel");
   info("developer toolbox opened");
 
   is(await extension.awaitMessage("initial_theme"),
      "light",
      "The initial theme is reported as expected.");
 
   await testThemeSwitching(extension);
 
@@ -191,17 +220,17 @@ add_task(async function test_devtools_pa
 
   // Ensure that the initial value of the devtools theme is "light".
   Preferences.set(DEVTOOLS_THEME_PREF, "light");
 
   await extension.startup();
 
   let target = gDevTools.getTargetForTab(tab);
 
-  const toolbox = await gDevTools.showToolbox(target, "webconsole");
+  const toolbox = await gDevTools.showToolbox(target, "testBlankPanel");
   info("developer toolbox opened");
 
   await extension.awaitMessage("devtools_panel_created");
   is(await extension.awaitMessage("initial_theme_page"),
      "light",
      "The initial theme is reported as expected from a devtools page.");
 
   const toolboxAdditionalTools = toolbox.getAdditionalTools();
@@ -221,29 +250,29 @@ add_task(async function test_devtools_pa
      "Got the same devtools.inspectedWindow.tabId from devtools page and panel");
   is(await extension.awaitMessage("initial_theme_panel"),
      "light",
      "The initial theme is reported as expected from a devtools panel.");
   info("Addon Devtools Panel shown");
 
   await testThemeSwitching(extension, ["page", "panel"]);
 
-  await gDevTools.showToolbox(target, "webconsole");
+  await gDevTools.showToolbox(target, "testBlankPanel");
   const results = await extension.awaitMessage("devtools_panel_hidden");
   info("Addon Devtools Panel hidden");
 
   is(results.panelCreated, 1, "devtools.panel.create callback has been called once");
   is(results.panelShown, 1, "panel.onShown listener has been called once");
   is(results.panelHidden, 1, "panel.onHidden listener has been called once");
 
   await gDevTools.showToolbox(target, panelId);
   await extension.awaitMessage("devtools_panel_shown");
   info("Addon Devtools Panel shown - second cycle");
 
-  await gDevTools.showToolbox(target, "webconsole");
+  await gDevTools.showToolbox(target, "testBlankPanel");
   const secondCycleResults = await extension.awaitMessage("devtools_panel_hidden");
   info("Addon Devtools Panel hidden - second cycle");
 
   is(secondCycleResults.panelCreated, 1, "devtools.panel.create callback has been called once");
   is(secondCycleResults.panelShown, 2, "panel.onShown listener has been called twice");
   is(secondCycleResults.panelHidden, 2, "panel.onHidden listener has been called twice");
 
   // Turn off the addon devtools panel using the visibilityswitch.
@@ -286,17 +315,17 @@ add_task(async function test_devtools_pa
      "The initial theme is reported as expected from a devtools panel.");
   info("Addon Devtools Panel shown - after visibilityswitch toggled");
 
   info("Wait until the Addon Devtools Panel has been loaded - after visibilityswitch toggled");
   const panelTabIdAfterToggle = await extension.awaitMessage("devtools_panel_inspectedWindow_tabId");
   is(panelTabIdAfterToggle, devtoolsPageTabId,
      "Got the same devtools.inspectedWindow.tabId from devtools panel after visibility toggled");
 
-  await gDevTools.showToolbox(target, "webconsole");
+  await gDevTools.showToolbox(target, "testBlankPanel");
   const toolToggledResults = await extension.awaitMessage("devtools_panel_hidden");
   info("Addon Devtools Panel hidden - after visibilityswitch toggled");
 
   is(toolToggledResults.panelCreated, 1, "devtools.panel.create callback has been called once");
   is(toolToggledResults.panelShown, 3, "panel.onShown listener has been called three times");
   is(toolToggledResults.panelHidden, 3, "panel.onHidden listener has been called three times");
 
   await gDevTools.closeToolbox(target);
@@ -364,17 +393,17 @@ add_task(async function test_devtools_pa
     },
   });
 
   await extension.startup();
 
 
   let target = gDevTools.getTargetForTab(tab);
 
-  const toolbox = await gDevTools.showToolbox(target, "webconsole");
+  const toolbox = await gDevTools.showToolbox(target, "testBlankPanel");
   info("developer toolbox opened");
 
   await extension.awaitMessage("devtools_panel_created");
 
   const toolboxAdditionalTools = toolbox.getAdditionalTools();
 
   is(toolboxAdditionalTools.length, 1,
      "Got the expected number of toolbox specific panel registered.");
@@ -433,32 +462,38 @@ add_task(async function test_devtools_pa
 
 add_task(async function test_devtools_page_invalid_panel_urls() {
   let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, "http://mochi.test:8888/");
 
   async function devtools_page() {
     const matchInvalidPanelURL = /must be a relative URL/;
     const matchInvalidIconURL = /be one of \[""\], or match the format "strictRelativeUrl"/;
 
-    const test_cases = [
-      // Invalid panel urls (validated by the schema wrappers, throws on invalid urls).
+    // Invalid panel urls (validated by the schema wrappers, throws on invalid urls).
+    const invalid_panels = [
       {panel: "about:about", icon: "icon.png", expectError: matchInvalidPanelURL},
       {panel: "about:addons", icon: "icon.png", expectError: matchInvalidPanelURL},
       {panel: "http://mochi.test:8888", icon: "icon.png", expectError: matchInvalidPanelURL},
       // Invalid icon urls (validated inside the API method because of the empty icon string
       // which have to be resolved to the default icon, reject the returned promise).
       {panel: "panel.html", icon: "about:about", expectError: matchInvalidIconURL},
       {panel: "panel.html", icon: "http://mochi.test:8888", expectError: matchInvalidIconURL},
-      // Valid panel urls
+    ];
+
+    const valid_panels = [
       {panel: "panel.html", icon: "icon.png"},
       {panel: "./panel.html", icon: "icon.png"},
       {panel: "/panel.html", icon: "icon.png"},
       {panel: "/panel.html", icon: ""},
     ];
 
+    let valid_panels_length = valid_panels.length;
+
+    const test_cases = [].concat(invalid_panels, valid_panels);
+
     browser.test.onMessage.addListener(async msg => {
       if (msg !== "start_test_panel_create") {
         return;
       }
 
       for (let {panel, icon, expectError} of test_cases) {
         browser.test.log(`Testing devtools.panels.create for ${JSON.stringify({panel, icon})}`);
 
@@ -471,32 +506,36 @@ add_task(async function test_devtools_pa
             `panel url ${panel} and icon ${icon}`
           );
         } else {
           // Verify that with valid panel and icon urls the panel is created and loaded
           // as expected.
           try {
             const pane = await browser.devtools.panels.create("Test Panel", icon, panel);
 
+            valid_panels_length--;
+
             // Wait the panel to be loaded.
             const oncePanelLoaded = new Promise(resolve => {
               pane.onShown.addListener(paneWin => {
                 browser.test.assertTrue(
                   paneWin.location.href.endsWith("/panel.html"),
                   `The panel has loaded the expected extension URL with ${panel}`);
                 resolve();
               });
             });
 
             // Ask the privileged code to select the last created panel.
-            browser.test.sendMessage("select-devtools-panel");
+            const done = valid_panels_length === 0;
+            browser.test.sendMessage("select-devtools-panel", done);
             await oncePanelLoaded;
           } catch (err) {
             browser.test.fail("Unexpected failure on creating a devtools panel with " +
                               `panel url ${panel} and icon ${icon}`);
+            throw err;
           }
         }
       }
 
       browser.test.sendMessage("test_invalid_devtools_panel_urls_done");
     });
 
     browser.test.sendMessage("devtools_page_ready");
@@ -533,31 +572,37 @@ add_task(async function test_devtools_pa
       "default-icon.png": imageBuffer,
     },
   });
 
   await extension.startup();
 
   let target = gDevTools.getTargetForTab(tab);
 
-  let toolbox = await gDevTools.showToolbox(target, "webconsole");
-
-  extension.onMessage("select-devtools-panel", () => {
-    const toolboxAdditionalTools = toolbox.getAdditionalTools();
-    const lastTool = toolboxAdditionalTools[toolboxAdditionalTools.length - 1];
-
-    gDevTools.showToolbox(target, lastTool.id);
-  });
+  let toolbox = await gDevTools.showToolbox(target, "testBlankPanel");
 
   info("developer toolbox opened");
 
   await extension.awaitMessage("devtools_page_ready");
 
   extension.sendMessage("start_test_panel_create");
 
+  let done = false;
+
+  while (!done) {
+    info("Waiting test extension request to select the last created panel");
+    done = await extension.awaitMessage("select-devtools-panel");
+
+    const toolboxAdditionalTools = toolbox.getAdditionalTools();
+    const lastTool = toolboxAdditionalTools[toolboxAdditionalTools.length - 1];
+
+    gDevTools.showToolbox(target, lastTool.id);
+    info("Last created panel selected");
+  }
+
   await extension.awaitMessage("test_invalid_devtools_panel_urls_done");
 
   await gDevTools.closeToolbox(target);
   await target.destroy();
 
   await extension.unload();
 
   await BrowserTestUtils.removeTab(tab);
--- a/browser/components/preferences/sitePermissions.css
+++ b/browser/components/preferences/sitePermissions.css
@@ -17,23 +17,18 @@
   min-height: 35px;
 }
 
 .website-status {
   margin: 1px;
   margin-inline-end: 5px;
 }
 
-#permissionsDisableLabel {
-  padding-top: 14px;
-  font-weight: bold;
-}
-
 #permissionsDisableDescription {
-  margin-inline-start: 37px;
+  margin-inline-start: 32px;
   color: #737373;
   line-height: 110%;
 }
 
 #permissionsDisableCheckbox {
   margin-inline-start: 4px;
   padding-top: 10px;
 }
--- a/browser/components/preferences/sitePermissions.js
+++ b/browser/components/preferences/sitePermissions.js
@@ -50,34 +50,31 @@ var gSitePermissionsManager = {
     this._searchBox = document.getElementById("searchBox");
     this._checkbox = document.getElementById("permissionsDisableCheckbox");
 
     let permissionsText = document.getElementById("permissionsText");
     while (permissionsText.hasChildNodes())
       permissionsText.firstChild.remove();
     permissionsText.appendChild(document.createTextNode(params.introText));
 
-    let permissionsDisableLabel = document.getElementById("permissionsDisableLabel");
-    permissionsDisableLabel.value = params.disablePermissionsLabel;
-
+    this._checkbox.setAttribute("label", params.disablePermissionsLabel);
     let permissionsDisableDescription = document.getElementById("permissionsDisableDescription");
     permissionsDisableDescription.appendChild(document.createTextNode(params.disablePermissionsDescription));
 
     document.title = params.windowTitle;
 
     // Initialize the checkbox state.
     this._defaultPermissionStatePrefName = "permissions.default." + this._type;
     let pref = Services.prefs.getPrefType(this._defaultPermissionStatePrefName);
     if (pref != Services.prefs.PREF_INVALID) {
       this._currentDefaultPermissionsState = Services.prefs.getIntPref(this._defaultPermissionStatePrefName);
     }
 
     if (this._currentDefaultPermissionsState === null) {
       this._checkbox.setAttribute("hidden", true);
-      permissionsDisableLabel.setAttribute("hidden", true);
       permissionsDisableDescription.setAttribute("hidden", true);
     } else if (this._currentDefaultPermissionsState == SitePermissions.BLOCK) {
       this._checkbox.checked = true;
     } else {
       this._checkbox.checked = false;
     }
 
     this._loadPermissions();
--- a/browser/components/preferences/sitePermissions.xul
+++ b/browser/components/preferences/sitePermissions.xul
@@ -57,23 +57,18 @@
               icon="remove" label="&removepermission2.label;"
               oncommand="gSitePermissionsManager.onPermissionDelete();"/>
       <button id="removeAllPermissions"
               icon="clear" label="&removeallpermissions2.label;"
               accesskey="&removeallpermissions2.accesskey;"
               oncommand="gSitePermissionsManager.onAllPermissionsDelete();"/>
     </hbox>
     <spacer flex="1"/>
-    <vbox align="start">
-      <hbox align="start">
-        <checkbox id="permissionsDisableCheckbox"/>
-        <label for="permissionsDisableCheckbox" id="permissionsDisableLabel"/>
-      </hbox>
-      <description id="permissionsDisableDescription"/>
-    </vbox>
+    <checkbox id="permissionsDisableCheckbox"/>
+    <description id="permissionsDisableDescription"/>
     <spacer flex="1"/>
     <hbox class="actionButtons" align="right" flex="1">
       <button oncommand="close();" icon="close" id="cancel"
               label="&button.cancel.label;" accesskey="&button.cancel.accesskey;" />
       <button id="btnApplyChanges" oncommand="gSitePermissionsManager.onApplyChanges();" icon="save"
               label="&button.ok.label;" accesskey="&button.ok.accesskey;"/>
     </hbox>
   </vbox>
--- a/browser/config/mozconfigs/linux32/nightly
+++ b/browser/config/mozconfigs/linux32/nightly
@@ -1,8 +1,7 @@
 . "$topsrcdir/browser/config/mozconfigs/linux32/common-opt"
 
-ac_add_options --enable-profiling
 ac_add_options --enable-verify-mar
 
 ac_add_options --with-branding=browser/branding/nightly
 
 . "$topsrcdir/build/mozconfig.common.override"
--- a/browser/config/mozconfigs/linux64/nightly
+++ b/browser/config/mozconfigs/linux64/nightly
@@ -1,8 +1,7 @@
 . "$topsrcdir/browser/config/mozconfigs/linux64/common-opt"
 
-ac_add_options --enable-profiling
 ac_add_options --enable-verify-mar
 
 ac_add_options --with-branding=browser/branding/nightly
 
 . "$topsrcdir/build/mozconfig.common.override"
--- a/browser/config/mozconfigs/macosx64/nightly
+++ b/browser/config/mozconfigs/macosx64/nightly
@@ -1,13 +1,12 @@
 . "$topsrcdir/browser/config/mozconfigs/macosx64/common-opt"
 
 ac_add_options --disable-install-strip
 ac_add_options --enable-verify-mar
-ac_add_options --enable-profiling
 ac_add_options --enable-instruments
 
 # Cross-compiled builds fail when dtrace is enabled
 if test `uname -s` != Linux; then
   ac_add_options --enable-dtrace
 fi
 
 ac_add_options --with-branding=browser/branding/nightly
--- a/browser/config/mozconfigs/whitelist
+++ b/browser/config/mozconfigs/whitelist
@@ -5,17 +5,16 @@ whitelist = {
     'nightly': {},
     }
 
 all_platforms = ['win64', 'win32', 'linux32', 'linux64', 'macosx64']
 
 for platform in all_platforms:
     whitelist['nightly'][platform] = [
         'ac_add_options --with-branding=browser/branding/nightly',
-        'ac_add_options --enable-profiling',
     ]
 
 whitelist['nightly']['macosx64'] += [
     'ac_add_options --disable-install-strip',
     'ac_add_options --enable-instruments',
     'ac_add_options --enable-dtrace',
     'if test `uname -s` != Linux; then',
 ]
--- a/browser/config/mozconfigs/win32/nightly
+++ b/browser/config/mozconfigs/win32/nightly
@@ -1,9 +1,8 @@
 . "$topsrcdir/build/mozconfig.win-common"
 . "$topsrcdir/browser/config/mozconfigs/win32/common-opt"
 
-ac_add_options --enable-profiling
 ac_add_options --enable-verify-mar
 
 ac_add_options --with-branding=browser/branding/nightly
 
 . "$topsrcdir/build/mozconfig.common.override"
--- a/browser/config/mozconfigs/win64/nightly
+++ b/browser/config/mozconfigs/win64/nightly
@@ -1,10 +1,9 @@
 . "$topsrcdir/build/mozconfig.win-common"
 . "$topsrcdir/browser/config/mozconfigs/win64/common-win64"
 . "$topsrcdir/browser/config/mozconfigs/win64/common-opt"
 
-ac_add_options --enable-profiling
 ac_add_options --enable-verify-mar
 
 ac_add_options --with-branding=browser/branding/nightly
 
 . "$topsrcdir/build/mozconfig.common.override"
--- a/build/annotationProcessors/SDKProcessor.java
+++ b/build/annotationProcessors/SDKProcessor.java
@@ -328,17 +328,29 @@ public class SDKProcessor {
             throw new IllegalArgumentException("expected member to be Method, Constructor, or Field");
         }
     }
 
     private static Member[] sortAndFilterMembers(Class<?> cls, Member[] members) {
         Arrays.sort(members, new Comparator<Member>() {
             @Override
             public int compare(Member a, Member b) {
-                return a.getName().compareTo(b.getName());
+                int result = a.getName().compareTo(b.getName());
+                if (result == 0) {
+                    if (a instanceof Constructor && b instanceof Constructor) {
+                        String sa = Arrays.toString(((Constructor) a).getParameterTypes());
+                        String sb = Arrays.toString(((Constructor) b).getParameterTypes());
+                        result = sa.compareTo(sb);
+                    } else if (a instanceof Method && b instanceof Method) {
+                        String sa = Arrays.toString(((Method) a).getParameterTypes());
+                        String sb = Arrays.toString(((Method) b).getParameterTypes());
+                        result = sa.compareTo(sb);
+                    }
+                }
+                return result;
             }
         });
 
         ArrayList<Member> list = new ArrayList<>();
         for (final Member m : members) {
             if (m.getDeclaringClass() == Object.class) {
                 // Skip methods from Object.
                 continue;
--- a/build/autoconf/android.m4
+++ b/build/autoconf/android.m4
@@ -267,23 +267,19 @@ case "$target" in
         AC_MSG_RESULT([$android_tools])
     else
         AC_MSG_ERROR([You must install the Android tools.  Try |mach bootstrap|.  (Looked for $android_tools)])
     fi
 
     dnl Android Tools 26 changes emulator path.
     dnl Although android_sdk_root/tools still has emulator command,
     dnl it doesn't work correctly
-    MOZ_PATH_PROG(EMULATOR, emulator, :, [$android_sdk_root/emulator])
+    MOZ_PATH_PROG(EMULATOR, emulator, :, [$android_sdk_root/emulator:$android_tools])
     if test -z "$EMULATOR" -o "$EMULATOR" = ":"; then
-        dnl old emulator path until Android Tools 25.x
-        MOZ_PATH_PROG(EMULATOR, emulator, :, [$android_tools])
-        if test -z "$EMULATOR" -o "$EMULATOR" = ":"; then
-            AC_MSG_ERROR([The program emulator was not found.  Try |mach bootstrap|.])
-        fi
+        AC_MSG_ERROR([The program emulator was not found.  Try |mach bootstrap|.])
     fi
 
     # `compileSdkVersion ANDROID_COMPILE_SDK_VERSION` is Gradle-only,
     # so there's no associated configure check.
     ANDROID_COMPILE_SDK_VERSION=$1
     ANDROID_TARGET_SDK="${android_target_sdk}"
     ANDROID_SDK="${android_sdk}"
     ANDROID_SDK_ROOT="${android_sdk_root}"
deleted file mode 100644
--- a/build/compare-mozconfig/compare-mozconfigs-wrapper.py
+++ /dev/null
@@ -1,34 +0,0 @@
-#!/usr/bin/python
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-from __future__ import unicode_literals
-
-import logging
-import mozunit
-import os
-import subprocess
-import unittest
-
-from buildconfig import substs
-
-log = logging.getLogger(__name__)
-
-
-class TestCompareMozconfigs(unittest.TestCase):
-    def test_compare_mozconfigs(self):
-        topsrcdir = substs['top_srcdir']
-
-        ret = subprocess.call([
-            substs['PYTHON'],
-            os.path.join(topsrcdir, 'build', 'compare-mozconfig',
-                         'compare-mozconfigs.py'),
-            topsrcdir
-        ])
-
-        self.assertEqual(0, ret)
-
-
-if __name__ == '__main__':
-    mozunit.main()
--- a/build/compare-mozconfig/compare-mozconfigs.py
+++ b/build/compare-mozconfig/compare-mozconfigs.py
@@ -4,18 +4,21 @@
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 # originally from https://hg.mozilla.org/build/tools/file/4ab9c1a4e05b/scripts/release/compare-mozconfigs.py
 
 from __future__ import unicode_literals
 
 import logging
 import os
-import sys
 import difflib
+import unittest
+
+import buildconfig
+import mozunit
 
 FAILURE_CODE = 1
 SUCCESS_CODE = 0
 
 PLATFORMS = (
     'linux32',
     'linux64',
     'macosx64',
@@ -150,20 +153,17 @@ def compare(topsrcdir):
                                    platform,
                                    whitelist)
         if not passed:
             success = False
 
     return success
 
 
-if __name__ == '__main__':
-    import argparse
-
-    parser = argparse.ArgumentParser()
-    parser.add_argument('topsrcdir', help='Path to root of source checkout')
+class TestCompareMozconfigs(unittest.TestCase):
+    def test_compare_mozconfigs(self):
+        topsrcdir = buildconfig.substs['top_srcdir']
+        self.assertTrue(compare(topsrcdir))
 
-    args = parser.parse_args()
 
+if __name__ == '__main__':
     logging.basicConfig(level=logging.INFO)
-
-    if not compare(args.topsrcdir):
-        sys.exit(1)
+    mozunit.main()
--- a/build/compare-mozconfig/python.ini
+++ b/build/compare-mozconfig/python.ini
@@ -1,1 +1,1 @@
-[compare-mozconfigs-wrapper.py]
+[compare-mozconfigs.py]
new file mode 100644
--- /dev/null
+++ b/build/docs/gn.rst
@@ -0,0 +1,52 @@
+.. _gn:
+
+==============================
+GN support in the build system
+==============================
+
+:abbr:`GN (Generated Ninja)` is a third-party build tool used by chromium and
+some related projects that are vendored in mozilla-central. Rather than
+requiring ``GN`` to build or writing our own build definitions for these projects,
+we have support in the build system for translating GN configuration
+files into moz.build files. In most cases these moz.build files will be like any
+others in the tree (except that they shouldn't be modified by hand), however
+those updating vendored code or building on platforms not supported by
+Mozilla automation may need to re-generate these files. This is a two-step
+process, described below.
+
+Generating GN configs as JSON
+=============================
+
+The first step must take place on a machine with access to the ``GN`` tool, which
+is specified in a mozconfig with::
+
+    export GN=<path/to/gn>
+
+With this specified, and the tree configured, run::
+
+    $ ./mach build-backend -b GnConfigGen
+
+This will run ``gn gen`` on projects found in ``GN_DIRS`` specified in moz.build
+files, injecting variables from the current build configuration and specifying
+the result be written to a JSON file in ``$objdir/gn-output``. The file will
+have a name derived from the arguments passed to ``gn gen``, for instance
+``x64_False_x64_linux.json``.
+
+If updating upstream sources or vendoring a new project, this step must be
+performed for each supported build configuration. If adding support for a
+specific configuration, the generated configuration may be added to existing
+configs before re-generating the ``moz.build`` files, which should be found under
+the ``gn-configs`` directory under the vendored project's top-level directory.
+
+Generating moz.build files from GN JSON configs
+===============================================
+
+Once the relevant JSON configs are present under a project's ``gn-configs``
+directory, run::
+
+    $ ./mach build-backend -b GnMozbuildWriter
+
+This will combine the configuration files present into a set of moz.build files
+that will build the given project. Once the result is verified, the resulting
+moz.build files should be checked in and should build like any other part of
+mozilla-central.
--- a/build/docs/index.rst
+++ b/build/docs/index.rst
@@ -23,16 +23,17 @@ Important Concepts
    mozinfo
    preprocessor
    jar-manifests
    defining-binaries
    toolchains
    locales
    rust
    sparse
+   Support for projects building with GN <gn>
 
 integrated development environment (IDE)
 ========================================
 .. toctree::
    :maxdepth: 1
 
    androideclipse
    cppeclipse
deleted file mode 100644
--- a/build/release/info.py
+++ /dev/null
@@ -1,218 +0,0 @@
-from datetime import datetime
-import os
-from os import path
-import re
-import shutil
-import sys
-from urllib2 import urlopen
-
-from release.paths import makeCandidatesDir
-
-import logging
-log = logging.getLogger(__name__)
-
-# If version has two parts with no trailing specifiers like "rc", we
-# consider it a "final" release for which we only create a _RELEASE tag.
-FINAL_RELEASE_REGEX = "^\d+\.\d+$"
-
-
-class ConfigError(Exception):
-    pass
-
-
-def getBuildID(platform, product, version, buildNumber, nightlyDir='nightly',
-               server='stage.mozilla.org'):
-    infoTxt = makeCandidatesDir(product, version, buildNumber, nightlyDir,
-                                protocol='http', server=server) + \
-        '%s_info.txt' % platform
-    try:
-        buildInfo = urlopen(infoTxt).read()
-    except:
-        log.error("Failed to retrieve %s" % infoTxt)
-        raise
-
-    for line in buildInfo.splitlines():
-        key, value = line.rstrip().split('=', 1)
-        if key == 'buildID':
-            return value
-
-
-def findOldBuildIDs(product, version, buildNumber, platforms,
-                    nightlyDir='nightly', server='stage.mozilla.org'):
-    ids = {}
-    if buildNumber <= 1:
-        return ids
-    for n in range(1, buildNumber):
-        for platform in platforms:
-            if platform not in ids:
-                ids[platform] = []
-            try:
-                id = getBuildID(platform, product, version, n, nightlyDir,
-                                server)
-                ids[platform].append(id)
-            except Exception, e:
-                log.error("Hit exception: %s" % e)
-    return ids
-
-
-def getReleaseConfigName(product, branch, version=None, staging=False):
-    # XXX: Horrible hack for bug 842741. Because Thunderbird release
-    # and esr both build out of esr17 repositories we'll bump the wrong
-    # config for release without this.
-    if product == 'thunderbird' and 'esr17' in branch and version and 'esr' not in version:
-        cfg = 'release-thunderbird-comm-release.py'
-    else:
-        cfg = 'release-%s-%s.py' % (product, branch)
-    if staging:
-        cfg = 'staging_%s' % cfg
-    return cfg
-
-
-def readReleaseConfig(configfile, required=[]):
-    return readConfig(configfile, keys=['releaseConfig'], required=required)
-
-
-def readBranchConfig(dir, localconfig, branch, required=[]):
-    shutil.copy(localconfig, path.join(dir, "localconfig.py"))
-    oldcwd = os.getcwd()
-    os.chdir(dir)
-    sys.path.append(".")
-    try:
-        return readConfig("config.py", keys=['BRANCHES', branch],
-                          required=required)
-    finally:
-        os.chdir(oldcwd)
-        sys.path.remove(".")
-
-
-def readConfig(configfile, keys=[], required=[]):
-    c = {}
-    execfile(configfile, c)
-    for k in keys:
-        c = c[k]
-    items = c.keys()
-    err = False
-    for key in required:
-        if key not in items:
-            err = True
-            log.error("Required item `%s' missing from %s" % (key, c))
-    if err:
-        raise ConfigError("Missing at least one item in config, see above")
-    return c
-
-
-def isFinalRelease(version):
-    return bool(re.match(FINAL_RELEASE_REGEX, version))
-
-
-def getBaseTag(product, version):
-    product = product.upper()
-    version = version.replace('.', '_')
-    return '%s_%s' % (product, version)
-
-
-def getTags(baseTag, buildNumber, buildTag=True):
-    t = ['%s_RELEASE' % baseTag]
-    if buildTag:
-        t.append('%s_BUILD%d' % (baseTag, int(buildNumber)))
-    return t
-
-
-def getRuntimeTag(tag):
-    return "%s_RUNTIME" % tag
-
-
-def getReleaseTag(tag):
-    return "%s_RELEASE" % tag
-
-
-def generateRelbranchName(version, prefix='GECKO'):
-    return '%s%s_%s_RELBRANCH' % (
-        prefix, version.replace('.', ''),
-        datetime.now().strftime('%Y%m%d%H'))
-
-
-def getReleaseName(product, version, buildNumber):
-    return '%s-%s-build%s' % (product.title(), version, str(buildNumber))
-
-
-def getRepoMatchingBranch(branch, sourceRepositories):
-    for sr in sourceRepositories.values():
-        if branch in sr['path']:
-            return sr
-    return None
-
-
-def fileInfo(filepath, product):
-    """Extract information about a release file.  Returns a dictionary with the
-    following keys set:
-    'product', 'version', 'locale', 'platform', 'contents', 'format',
-    'pathstyle'
-
-    'contents' is one of 'complete', 'installer'
-    'format' is one of 'mar' or 'exe'
-    'pathstyle' is either 'short' or 'long', and refers to if files are all in
-        one directory, with the locale as part of the filename ('short' paths,
-        firefox 3.0 style filenames), or if the locale names are part of the
-        directory structure, but not the file name itself ('long' paths,
-        firefox 3.5+ style filenames)
-    """
-    try:
-        # Mozilla 1.9.0 style (aka 'short') paths
-        # e.g. firefox-3.0.12.en-US.win32.complete.mar
-        filename = os.path.basename(filepath)
-        m = re.match("^(%s)-([0-9.]+)\.([-a-zA-Z]+)\.(win32)\.(complete|installer)\.(mar|exe)$" % product, filename)
-        if not m:
-            raise ValueError("Could not parse: %s" % filename)
-        return {'product': m.group(1),
-                'version': m.group(2),
-                'locale': m.group(3),
-                'platform': m.group(4),
-                'contents': m.group(5),
-                'format': m.group(6),
-                'pathstyle': 'short',
-                'leading_path': '',
-                }
-    except:
-        # Mozilla 1.9.1 and on style (aka 'long') paths
-        # e.g. update/win32/en-US/firefox-3.5.1.complete.mar
-        #      win32/en-US/Firefox Setup 3.5.1.exe
-        ret = {'pathstyle': 'long'}
-        if filepath.endswith('.mar'):
-            ret['format'] = 'mar'
-            m = re.search("update/(win32|linux-i686|linux-x86_64|mac|mac64)/([-a-zA-Z]+)/(%s)-(\d+\.\d+(?:\.\d+)?(?:\w+(?:\d+)?)?)\.(complete)\.mar" % product, filepath)
-            if not m:
-                raise ValueError("Could not parse: %s" % filepath)
-            ret['platform'] = m.group(1)
-            ret['locale'] = m.group(2)
-            ret['product'] = m.group(3)
-            ret['version'] = m.group(4)
-            ret['contents'] = m.group(5)
-            ret['leading_path'] = ''
-        elif filepath.endswith('.exe'):
-            ret['format'] = 'exe'
-            ret['contents'] = 'installer'
-            # EUballot builds use a different enough style of path than others
-            # that we can't catch them in the same regexp
-            if filepath.find('win32-EUballot') != -1:
-                ret['platform'] = 'win32'
-                m = re.search("(win32-EUballot/)([-a-zA-Z]+)/((?i)%s) Setup (\d+\.\d+(?:\.\d+)?(?:\w+\d+)?(?:\ \w+\ \d+)?)\.exe" % product, filepath)
-                if not m:
-                    raise ValueError("Could not parse: %s" % filepath)
-                ret['leading_path'] = m.group(1)
-                ret['locale'] = m.group(2)
-                ret['product'] = m.group(3).lower()
-                ret['version'] = m.group(4)
-            else:
-                m = re.search("(partner-repacks/[-a-zA-Z0-9_]+/|)(win32|mac|linux-i686)/([-a-zA-Z]+)/((?i)%s) Setup (\d+\.\d+(?:\.\d+)?(?:\w+(?:\d+)?)?(?:\ \w+\ \d+)?)\.exe" % product, filepath)
-                if not m:
-                    raise ValueError("Could not parse: %s" % filepath)
-                ret['leading_path'] = m.group(1)
-                ret['platform'] = m.group(2)
-                ret['locale'] = m.group(3)
-                ret['product'] = m.group(4).lower()
-                ret['version'] = m.group(5)
-        else:
-            raise ValueError("Unknown filetype for %s" % filepath)
-
-        return ret
deleted file mode 100644
--- a/build/release/sanity.py
+++ /dev/null
@@ -1,124 +0,0 @@
-import difflib
-import logging
-import re
-import urllib2
-from util.commands import run_cmd, get_output
-from util.hg import get_repo_name, make_hg_url
-from subprocess import CalledProcessError
-
-log = logging.getLogger(__name__)
-
-
-def check_buildbot():
-    """check if buildbot command works"""
-    try:
-        run_cmd(['buildbot', '--version'])
-    except CalledProcessError:
-        log.error("FAIL: buildbot command doesn't work", exc_info=True)
-        raise
-
-
-def find_version(contents, versionNumber):
-    """Given an open readable file-handle look for the occurrence
-       of the version # in the file"""
-    ret = re.search(re.compile(re.escape(versionNumber), re.DOTALL), contents)
-    return ret
-
-
-def locale_diff(locales1, locales2):
-    """ accepts two lists and diffs them both ways, returns any differences
-    found """
-    diff_list = [locale for locale in locales1 if not locale in locales2]
-    diff_list.extend(locale for locale in locales2 if not locale in locales1)
-    return diff_list
-
-
-def get_buildbot_username_param():
-    cmd = ['buildbot', 'sendchange', '--help']
-    output = get_output(cmd)
-    if "-W, --who=" in output:
-        return "--who"
-    else:
-        return "--username"
-
-
-def sendchange(branch, revision, username, master, products):
-    """Send the change to buildbot to kick off the release automation"""
-    if isinstance(products, basestring):
-        products = [products]
-    cmd = [
-        'buildbot',
-        'sendchange',
-        get_buildbot_username_param(),
-        username,
-        '--master',
-        master,
-        '--branch',
-        branch,
-        '-p',
-        'products:%s' % ','.join(products),
-        '-p',
-        'script_repo_revision:%s' % revision,
-        'release_or_beta'
-    ]
-    logging.info("Executing: %s" % cmd)
-    run_cmd(cmd)
-
-
-def verify_mozconfigs(mozconfig_pair, nightly_mozconfig_pair, platform,
-                      mozconfigWhitelist={}):
-    """Compares mozconfig to nightly_mozconfig and compare to an optional
-    whitelist of known differences. mozconfig_pair and nightly_mozconfig_pair
-    are pairs containing the mozconfig's identifier and the list of lines in
-    the mozconfig."""
-
-    # unpack the pairs to get the names, the names are just for
-    # identifying the mozconfigs when logging the error messages
-    mozconfig_name, mozconfig_lines = mozconfig_pair
-    nightly_mozconfig_name, nightly_mozconfig_lines = nightly_mozconfig_pair
-
-    missing_args = mozconfig_lines == [] or nightly_mozconfig_lines == []
-    if missing_args:
-        log.info("Missing mozconfigs to compare for %s" % platform)
-        return False
-
-    success = True
-
-    diffInstance = difflib.Differ()
-    diff_result = diffInstance.compare(mozconfig_lines, nightly_mozconfig_lines)
-    diffList = list(diff_result)
-
-    for line in diffList:
-        clean_line = line[1:].strip()
-        if (line[0] == '-' or line[0] == '+') and len(clean_line) > 1:
-            # skip comment lines
-            if clean_line.startswith('#'):
-                continue
-            # compare to whitelist
-            message = ""
-            if line[0] == '-':
-                if platform in mozconfigWhitelist.get('release', {}):
-                    if clean_line in \
-                            mozconfigWhitelist['release'][platform]:
-                        continue
-            elif line[0] == '+':
-                if platform in mozconfigWhitelist.get('nightly', {}):
-                    if clean_line in \
-                            mozconfigWhitelist['nightly'][platform]:
-                        continue
-                    else:
-                        log.warning("%s not in %s %s!" % (
-                            clean_line, platform,
-                            mozconfigWhitelist['nightly'][platform]))
-            else:
-                log.error("Skipping line %s!" % line)
-                continue
-            message = "found in %s but not in %s: %s"
-            if line[0] == '-':
-                log.error(message % (mozconfig_name,
-                                     nightly_mozconfig_name, clean_line))
-            else:
-                log.error(message % (nightly_mozconfig_name,
-                                     mozconfig_name, clean_line))
-            success = False
-    return success
deleted file mode 100644
--- a/build/util/hg.py
+++ /dev/null
@@ -1,611 +0,0 @@
-"""Functions for interacting with hg"""
-import os
-import re
-import subprocess
-from urlparse import urlsplit
-from ConfigParser import RawConfigParser
-
-from util.commands import run_cmd, get_output, remove_path
-from util.retry import retry
-
-import logging
-log = logging.getLogger(__name__)
-
-
-class DefaultShareBase:
-    pass
-DefaultShareBase = DefaultShareBase()
-
-
-class HgUtilError(Exception):
-    pass
-
-
-def _make_absolute(repo):
-    if repo.startswith("file://"):
-        path = repo[len("file://"):]
-        repo = "file://%s" % os.path.abspath(path)
-    elif "://" not in repo:
-        repo = os.path.abspath(repo)
-    return repo
-
-
-def make_hg_url(hgHost, repoPath, protocol='https', revision=None,
-                filename=None):
-    """construct a valid hg url from a base hg url (hg.mozilla.org),
-    repoPath, revision and possible filename"""
-    base = '%s://%s' % (protocol, hgHost)
-    repo = '/'.join(p.strip('/') for p in [base, repoPath])
-    if not filename:
-        if not revision:
-            return repo
-        else:
-            return '/'.join([p.strip('/') for p in [repo, 'rev', revision]])
-    else:
-        assert revision
-        return '/'.join([p.strip('/') for p in [repo, 'raw-file', revision, filename]])
-
-
-def get_repo_name(repo):
-    return repo.rstrip('/').split('/')[-1]
-
-
-def get_repo_path(repo):
-    repo = _make_absolute(repo)
-    if repo.startswith("/"):
-        return repo.lstrip("/")
-    else:
-        return urlsplit(repo).path.lstrip("/")
-
-
-def get_revision(path):
-    """Returns which revision directory `path` currently has checked out."""
-    return get_output(['hg', 'parent', '--template', '{node|short}'], cwd=path)
-
-
-def get_branch(path):
-    return get_output(['hg', 'branch'], cwd=path).strip()
-
-
-def get_branches(path):
-    branches = []
-    for line in get_output(['hg', 'branches', '-c'], cwd=path).splitlines():
-        branches.append(line.split()[0])
-    return branches
-
-
-def is_hg_cset(rev):
-    """Retruns True if passed revision represents a valid HG revision
-    (long or short(er) 40 bit hex)"""
-    try:
-        int(rev, 16)
-        return True
-    except (TypeError, ValueError):
-        return False
-
-
-def hg_ver():
-    """Returns the current version of hg, as a tuple of
-    (major, minor, build)"""
-    ver_string = get_output(['hg', '-q', 'version'])
-    match = re.search("\(version ([0-9.]+)\)", ver_string)
-    if match:
-        bits = match.group(1).split(".")
-        if len(bits) < 3:
-            bits += (0,)
-        ver = tuple(int(b) for b in bits)
-    else:
-        ver = (0, 0, 0)
-    log.debug("Running hg version %s", ver)
-    return ver
-
-
-def purge(dest):
-    """Purge the repository of all untracked and ignored files."""
-    try:
-        run_cmd(['hg', '--config', 'extensions.purge=', 'purge',
-                 '-a', '--all', dest], cwd=dest)
-    except subprocess.CalledProcessError, e:
-        log.debug('purge failed: %s' % e)
-        raise
-
-
-def update(dest, branch=None, revision=None):
-    """Updates working copy `dest` to `branch` or `revision`.  If neither is
-    set then the working copy will be updated to the latest revision on the
-    current branch.  Local changes will be discarded."""
-    # If we have a revision, switch to that
-    if revision is not None:
-        cmd = ['hg', 'update', '-C', '-r', revision]
-        run_cmd(cmd, cwd=dest)
-    else:
-        # Check & switch branch
-        local_branch = get_output(['hg', 'branch'], cwd=dest).strip()
-
-        cmd = ['hg', 'update', '-C']
-
-        # If this is different, checkout the other branch
-        if branch and branch != local_branch:
-            cmd.append(branch)
-
-        run_cmd(cmd, cwd=dest)
-    return get_revision(dest)
-
-
-def clone(repo, dest, branch=None, revision=None, update_dest=True,
-          clone_by_rev=False, mirrors=None, bundles=None):
-    """Clones hg repo and places it at `dest`, replacing whatever else is
-    there.  The working copy will be empty.
-
-    If `revision` is set, only the specified revision and its ancestors will
-    be cloned.
-
-    If `update_dest` is set, then `dest` will be updated to `revision` if
-    set, otherwise to `branch`, otherwise to the head of default.
-
-    If `mirrors` is set, will try and clone from the mirrors before
-    cloning from `repo`.
-
-    If `bundles` is set, will try and download the bundle first and
-    unbundle it. If successful, will pull in new revisions from mirrors or
-    the master repo. If unbundling fails, will fall back to doing a regular
-    clone from mirrors or the master repo.
-
-    Regardless of how the repository ends up being cloned, the 'default' path
-    will point to `repo`.
-    """
-    if os.path.exists(dest):
-        remove_path(dest)
-
-    if bundles:
-        log.info("Attempting to initialize clone with bundles")
-        for bundle in bundles:
-            if os.path.exists(dest):
-                remove_path(dest)
-            init(dest)
-            log.info("Trying to use bundle %s", bundle)
-            try:
-                if not unbundle(bundle, dest):
-                    remove_path(dest)
-                    continue
-                adjust_paths(dest, default=repo)
-                # Now pull / update
-                return pull(repo, dest, update_dest=update_dest,
-                            mirrors=mirrors, revision=revision, branch=branch)
-            except Exception:
-                remove_path(dest)
-                log.exception("Problem unbundling/pulling from %s", bundle)
-                continue
-        else:
-            log.info("Using bundles failed; falling back to clone")
-
-    if mirrors:
-        log.info("Attempting to clone from mirrors")
-        for mirror in mirrors:
-            log.info("Cloning from %s", mirror)
-            try:
-                retval = clone(mirror, dest, branch, revision,
-                               update_dest=update_dest, clone_by_rev=clone_by_rev)
-                adjust_paths(dest, default=repo)
-                return retval
-            except:
-                log.exception("Problem cloning from mirror %s", mirror)
-                continue
-        else:
-            log.info("Pulling from mirrors failed; falling back to %s", repo)
-            # We may have a partial repo here; mercurial() copes with that
-            # We need to make sure our paths are correct though
-            if os.path.exists(os.path.join(dest, '.hg')):
-                adjust_paths(dest, default=repo)
-            return mercurial(repo, dest, branch, revision, autoPurge=True,
-                             update_dest=update_dest, clone_by_rev=clone_by_rev)
-
-    cmd = ['hg', 'clone']
-    if not update_dest:
-        cmd.append('-U')
-
-    if clone_by_rev:
-        if revision:
-            cmd.extend(['-r', revision])
-        elif branch:
-            # hg >= 1.6 supports -b branch for cloning
-            ver = hg_ver()
-            if ver >= (1, 6, 0):
-                cmd.extend(['-b', branch])
-
-    cmd.extend([repo, dest])
-    run_cmd(cmd)
-
-    if update_dest:
-        return update(dest, branch, revision)
-
-
-def common_args(revision=None, branch=None, ssh_username=None, ssh_key=None):
-    """Fill in common hg arguments, encapsulating logic checks that depend on
-       mercurial versions and provided arguments"""
-    args = []
-    if ssh_username or ssh_key:
-        opt = ['-e', 'ssh']
-        if ssh_username:
-            opt[1] += ' -l %s' % ssh_username
-        if ssh_key:
-            opt[1] += ' -i %s' % ssh_key
-        args.extend(opt)
-    if revision:
-        args.extend(['-r', revision])
-    elif branch:
-        if hg_ver() >= (1, 6, 0):
-            args.extend(['-b', branch])
-    return args
-
-
-def pull(repo, dest, update_dest=True, mirrors=None, **kwargs):
-    """Pulls changes from hg repo and places it in `dest`.
-
-    If `update_dest` is set, then `dest` will be updated to `revision` if
-    set, otherwise to `branch`, otherwise to the head of default.
-
-    If `mirrors` is set, will try and pull from the mirrors first before
-    `repo`."""
-
-    if mirrors:
-        for mirror in mirrors:
-            try:
-                return pull(mirror, dest, update_dest=update_dest, **kwargs)
-            except:
-                log.exception("Problem pulling from mirror %s", mirror)
-                continue
-        else:
-            log.info("Pulling from mirrors failed; falling back to %s", repo)
-
-    # Convert repo to an absolute path if it's a local repository
-    repo = _make_absolute(repo)
-    cmd = ['hg', 'pull']
-    # Don't pass -r to "hg pull", except when it's a valid HG revision.
-    # Pulling using tag names is dangerous: it uses the local .hgtags, so if
-    # the tag has moved on the remote side you won't pull the new revision the
-    # remote tag refers to.
-    pull_kwargs = kwargs.copy()
-    if 'revision' in pull_kwargs and \
-       not is_hg_cset(pull_kwargs['revision']):
-        del pull_kwargs['revision']
-
-    cmd.extend(common_args(**pull_kwargs))
-
-    cmd.append(repo)
-    run_cmd(cmd, cwd=dest)
-
-    if update_dest:
-        branch = None
-        if 'branch' in kwargs and kwargs['branch']:
-            branch = kwargs['branch']
-        revision = None
-        if 'revision' in kwargs and kwargs['revision']:
-            revision = kwargs['revision']
-        return update(dest, branch=branch, revision=revision)
-
-# Defines the places of attributes in the tuples returned by `out'
-REVISION, BRANCH = 0, 1
-
-
-def out(src, remote, **kwargs):
-    """Check for outgoing changesets present in a repo"""
-    cmd = ['hg', '-q', 'out', '--template', '{node} {branches}\n']
-    cmd.extend(common_args(**kwargs))
-    cmd.append(remote)
-    if os.path.exists(src):
-        try:
-            revs = []
-            for line in get_output(cmd, cwd=src).rstrip().split("\n"):
-                try:
-                    rev, branch = line.split()
-                # Mercurial displays no branch at all if the revision is on
-                # "default"
-                except ValueError:
-                    rev = line.rstrip()
-                    branch = "default"
-                revs.append((rev, branch))
-            return revs
-        except subprocess.CalledProcessError, inst:
-            # In some situations, some versions of Mercurial return "1"
-            # if no changes are found, so we need to ignore this return code
-            if inst.returncode == 1:
-                return []
-            raise
-
-
-def push(src, remote, push_new_branches=True, force=False, **kwargs):
-    cmd = ['hg', 'push']
-    cmd.extend(common_args(**kwargs))
-    if force:
-        cmd.append('-f')
-    if push_new_branches:
-        cmd.append('--new-branch')
-    cmd.append(remote)
-    run_cmd(cmd, cwd=src)
-
-
-def mercurial(repo, dest, branch=None, revision=None, update_dest=True,
-              shareBase=DefaultShareBase, allowUnsharedLocalClones=False,
-              clone_by_rev=False, mirrors=None, bundles=None, autoPurge=False):
-    """Makes sure that `dest` is has `revision` or `branch` checked out from
-    `repo`.
-
-    Do what it takes to make that happen, including possibly clobbering
-    dest.
-
-    If allowUnsharedLocalClones is True and we're trying to use the share
-    extension but fail, then we will be able to clone from the shared repo to
-    our destination.  If this is False, the default, then if we don't have the
-    share extension we will just clone from the remote repository.
-
-    If `clone_by_rev` is True, use 'hg clone -r <rev>' instead of 'hg clone'.
-    This is slower, but useful when cloning repos with lots of heads.
-
-    If `mirrors` is set, will try and use the mirrors before `repo`.
-
-    If `bundles` is set, will try and download the bundle first and
-    unbundle it instead of doing a full clone. If successful, will pull in
-    new revisions from mirrors or the master repo. If unbundling fails, will
-    fall back to doing a regular clone from mirrors or the master repo.
-    """
-    dest = os.path.abspath(dest)
-    if shareBase is DefaultShareBase:
-        shareBase = os.environ.get("HG_SHARE_BASE_DIR", None)
-
-    log.info("Reporting hg version in use")
-    cmd = ['hg', '-q', 'version']
-    run_cmd(cmd, cwd='.')
-
-    if shareBase:
-        # Check that 'hg share' works
-        try:
-            log.info("Checking if share extension works")
-            output = get_output(['hg', 'help', 'share'], dont_log=True)
-            if 'no commands defined' in output:
-                # Share extension is enabled, but not functional
-                log.info("Disabling sharing since share extension doesn't seem to work (1)")
-                shareBase = None
-            elif 'unknown command' in output:
-                # Share extension is disabled
-                log.info("Disabling sharing since share extension doesn't seem to work (2)")
-                shareBase = None
-        except subprocess.CalledProcessError:
-            # The command failed, so disable sharing
-            log.info("Disabling sharing since share extension doesn't seem to work (3)")
-            shareBase = None
-
-    # Check that our default path is correct
-    if os.path.exists(os.path.join(dest, '.hg')):
-        hgpath = path(dest, "default")
-
-        # Make sure that our default path is correct
-        if hgpath != _make_absolute(repo):
-            log.info("hg path isn't correct (%s should be %s); clobbering",
-                     hgpath, _make_absolute(repo))
-            remove_path(dest)
-
-    # If the working directory already exists and isn't using share we update
-    # the working directory directly from the repo, ignoring the sharing
-    # settings
-    if os.path.exists(dest):
-        if not os.path.exists(os.path.join(dest, ".hg")):
-            log.warning("%s doesn't appear to be a valid hg directory; clobbering", dest)
-            remove_path(dest)
-        elif not os.path.exists(os.path.join(dest, ".hg", "sharedpath")):
-            try:
-                if autoPurge:
-                    purge(dest)
-                return pull(repo, dest, update_dest=update_dest, branch=branch,
-                            revision=revision,
-                            mirrors=mirrors)
-            except subprocess.CalledProcessError:
-                log.warning("Error pulling changes into %s from %s; clobbering", dest, repo)
-                log.debug("Exception:", exc_info=True)
-                remove_path(dest)
-
-    # If that fails for any reason, and sharing is requested, we'll try to
-    # update the shared repository, and then update the working directory from
-    # that.
-    if shareBase:
-        sharedRepo = os.path.join(shareBase, get_repo_path(repo))
-        dest_sharedPath = os.path.join(dest, '.hg', 'sharedpath')
-
-        if os.path.exists(sharedRepo):
-            hgpath = path(sharedRepo, "default")
-
-            # Make sure that our default path is correct
-            if hgpath != _make_absolute(repo):
-                log.info("hg path isn't correct (%s should be %s); clobbering",
-                         hgpath, _make_absolute(repo))
-                # we need to clobber both the shared checkout and the dest,
-                # since hgrc needs to be in both places
-                remove_path(sharedRepo)
-                remove_path(dest)
-
-        if os.path.exists(dest_sharedPath):
-            # Make sure that the sharedpath points to sharedRepo
-            dest_sharedPath_data = os.path.normpath(
-                open(dest_sharedPath).read())
-            norm_sharedRepo = os.path.normpath(os.path.join(sharedRepo, '.hg'))
-            if dest_sharedPath_data != norm_sharedRepo:
-                # Clobber!
-                log.info("We're currently shared from %s, but are being requested to pull from %s (%s); clobbering",
-                         dest_sharedPath_data, repo, norm_sharedRepo)
-                remove_path(dest)
-
-        try:
-            log.info("Updating shared repo")
-            mercurial(repo, sharedRepo, branch=branch, revision=revision,
-                      update_dest=False, shareBase=None, clone_by_rev=clone_by_rev,
-                      mirrors=mirrors, bundles=bundles, autoPurge=False)
-            if os.path.exists(dest):
-                if autoPurge:
-                    purge(dest)
-                return update(dest, branch=branch, revision=revision)
-
-            try:
-                log.info("Trying to share %s to %s", sharedRepo, dest)
-                return share(sharedRepo, dest, branch=branch, revision=revision)
-            except subprocess.CalledProcessError:
-                if not allowUnsharedLocalClones:
-                    # Re-raise the exception so it gets caught below.
-                    # We'll then clobber dest, and clone from original repo
-                    raise
-
-                log.warning("Error calling hg share from %s to %s;"
-                            "falling back to normal clone from shared repo",
-                            sharedRepo, dest)
-                # Do a full local clone first, and then update to the
-                # revision we want
-                # This lets us use hardlinks for the local clone if the OS
-                # supports it
-                clone(sharedRepo, dest, update_dest=False,
-                      mirrors=mirrors, bundles=bundles)
-                return update(dest, branch=branch, revision=revision)
-        except subprocess.CalledProcessError:
-            log.warning(
-                "Error updating %s from sharedRepo (%s): ", dest, sharedRepo)
-            log.debug("Exception:", exc_info=True)
-            remove_path(dest)
-    # end if shareBase
-
-    if not os.path.exists(os.path.dirname(dest)):
-        os.makedirs(os.path.dirname(dest))
-
-    # Share isn't available or has failed, clone directly from the source
-    return clone(repo, dest, branch, revision,
-                 update_dest=update_dest, mirrors=mirrors,
-                 bundles=bundles, clone_by_rev=clone_by_rev)
-
-
-def apply_and_push(localrepo, remote, changer, max_attempts=10,
-                   ssh_username=None, ssh_key=None, force=False):
-    """This function calls `changer' to make changes to the repo, and tries
-       its hardest to get them to the origin repo. `changer' must be a
-       callable object that receives two arguments: the directory of the local
-       repository, and the attempt number. This function will push ALL
-       changesets missing from remote."""
-    assert callable(changer)
-    branch = get_branch(localrepo)
-    changer(localrepo, 1)
-    for n in range(1, max_attempts + 1):
-        new_revs = []
-        try:
-            new_revs = out(src=localrepo, remote=remote,
-                           ssh_username=ssh_username,
-                           ssh_key=ssh_key)
-            if len(new_revs) < 1:
-                raise HgUtilError("No revs to push")
-            push(src=localrepo, remote=remote, ssh_username=ssh_username,
-                 ssh_key=ssh_key, force=force)
-            return
-        except subprocess.CalledProcessError, e:
-            log.debug("Hit error when trying to push: %s" % str(e))
-            if n == max_attempts:
-                log.debug("Tried %d times, giving up" % max_attempts)
-                for r in reversed(new_revs):
-                    run_cmd(['hg', '--config', 'extensions.mq=', 'strip', '-n',
-                             r[REVISION]], cwd=localrepo)
-                raise HgUtilError("Failed to push")
-            pull(remote, localrepo, update_dest=False,
-                 ssh_username=ssh_username, ssh_key=ssh_key)
-            # After we successfully rebase or strip away heads the push is
-            # is attempted again at the start of the loop
-            try:
-                run_cmd(['hg', '--config', 'ui.merge=internal:merge',
-                         'rebase'], cwd=localrepo)
-            except subprocess.CalledProcessError, e:
-                log.debug("Failed to rebase: %s" % str(e))
-                update(localrepo, branch=branch)
-                for r in reversed(new_revs):
-                    run_cmd(['hg', '--config', 'extensions.mq=', 'strip', '-n',
-                             r[REVISION]], cwd=localrepo)
-                changer(localrepo, n + 1)
-
-
-def share(source, dest, branch=None, revision=None):
-    """Creates a new working directory in "dest" that shares history with
-       "source" using Mercurial's share extension"""
-    run_cmd(['hg', 'share', '-U', source, dest])
-    return update(dest, branch=branch, revision=revision)
-
-
-def cleanOutgoingRevs(reponame, remote, username, sshKey):
-    outgoingRevs = retry(out, kwargs=dict(src=reponame, remote=remote,
-                                          ssh_username=username,
-                                          ssh_key=sshKey))
-    for r in reversed(outgoingRevs):
-        run_cmd(['hg', '--config', 'extensions.mq=', 'strip', '-n',
-                 r[REVISION]], cwd=reponame)
-
-
-def path(src, name='default'):
-    """Returns the remote path associated with "name" """
-    try:
-        return get_output(['hg', 'path', name], cwd=src).strip()
-    except subprocess.CalledProcessError:
-        return None
-
-
-def init(dest):
-    """Initializes an empty repo in `dest`"""
-    run_cmd(['hg', 'init', dest])
-
-
-def unbundle(bundle, dest):
-    """Unbundles the bundle located at `bundle` into `dest`.
-
-    `bundle` can be a local file or remote url."""
-    try:
-        get_output(['hg', 'unbundle', bundle], cwd=dest, include_stderr=True)
-        return True
-    except subprocess.CalledProcessError:
-        return False
-
-
-def adjust_paths(dest, **paths):
-    """Adjusts paths in `dest`/.hg/hgrc so that names in `paths` are set to
-    paths[name].
-
-    Note that any comments in the hgrc will be lost if changes are made to the
-    file."""
-    hgrc = os.path.join(dest, '.hg', 'hgrc')
-    config = RawConfigParser()
-    config.read(hgrc)
-
-    if not config.has_section('paths'):
-        config.add_section('paths')
-
-    changed = False
-    for path_name, path_value in paths.items():
-        if (not config.has_option('paths', path_name) or
-                config.get('paths', path_name) != path_value):
-            changed = True
-            config.set('paths', path_name, path_value)
-
-    if changed:
-        config.write(open(hgrc, 'w'))
-
-
-def commit(dest, msg, user=None):
-    cmd = ['hg', 'commit', '-m', msg]
-    if user:
-        cmd.extend(['-u', user])
-    run_cmd(cmd, cwd=dest)
-    return get_revision(dest)
-
-
-def tag(dest, tags, user=None, msg=None, rev=None, force=None):
-    cmd = ['hg', 'tag']
-    if user:
-        cmd.extend(['-u', user])
-    if msg:
-        cmd.extend(['-m', msg])
-    if rev:
-        cmd.extend(['-r', rev])
-    if force:
-        cmd.append('-f')
-    cmd.extend(tags)
-    run_cmd(cmd, cwd=dest)
-    return get_revision(dest)
--- a/devtools/client/inspector/rules/models/element-style.js
+++ b/devtools/client/inspector/rules/models/element-style.js
@@ -133,16 +133,36 @@ ElementStyle.prototype = {
       }
       return promiseWarn(e);
     });
     this.populated = populated;
     return this.populated;
   },
 
   /**
+   * Get the font families in use by the element.
+   *
+   * Returns a promise that will be resolved to a list of CSS family
+   * names.  The list might have duplicates.
+   */
+  getUsedFontFamilies: function () {
+    return new Promise((resolve, reject) => {
+      this.ruleView.styleWindow.requestIdleCallback(async () => {
+        try {
+          let fonts = await this.pageStyle.getUsedFontFaces(
+            this.element, { includePreviews: false });
+          resolve(fonts.map(font => font.CSSFamilyName));
+        } catch (e) {
+          reject(e);
+        }
+      });
+    });
+  },
+
+  /**
    * Put pseudo elements in front of others.
    */
   _sortRulesForPseudoElement: function () {
     this.rules = this.rules.sort((a, b) => {
       return (a.pseudoElement || "z") > (b.pseudoElement || "z");
     });
   },
 
--- a/devtools/client/inspector/rules/test/browser.ini
+++ b/devtools/client/inspector/rules/test/browser.ini
@@ -172,16 +172,17 @@ skip-if = (os == "win" && debug) # bug 9
 [browser_rules_grid-highlighter-on-reload.js]
 [browser_rules_grid-highlighter-restored-after-reload.js]
 [browser_rules_grid-toggle_01.js]
 [browser_rules_grid-toggle_01b.js]
 [browser_rules_grid-toggle_02.js]
 [browser_rules_grid-toggle_03.js]
 [browser_rules_grid-toggle_04.js]
 [browser_rules_guessIndentation.js]
+[browser_rules_highlight-used-fonts.js]
 [browser_rules_inherited-properties_01.js]
 [browser_rules_inherited-properties_02.js]
 [browser_rules_inherited-properties_03.js]
 [browser_rules_inherited-properties_04.js]
 [browser_rules_inline-source-map.js]
 [browser_rules_invalid.js]
 [browser_rules_invalid-source-map.js]
 [browser_rules_keybindings.js]
--- a/devtools/client/inspector/rules/test/browser_rules_eyedropper.js
+++ b/devtools/client/inspector/rules/test/browser_rules_eyedropper.js
@@ -29,20 +29,41 @@ const TEST_URI = `
   <body><div id="div1"></div><div id="div2"></div></body>
 `;
 
 // #f09
 const ORIGINAL_COLOR = "rgb(255, 0, 153)";
 // #ff5
 const EXPECTED_COLOR = "rgb(255, 255, 85)";
 
+registerCleanupFunction(() => {
+  // Restore the default Toolbox host position after the test.
+  Services.prefs.clearUserPref("devtools.toolbox.host");
+});
+
 add_task(function* () {
   info("Add the test tab, open the rule-view and select the test node");
-  yield addTab("data:text/html;charset=utf-8," + encodeURIComponent(TEST_URI));
-  let {testActor, inspector, view} = yield openRuleView();
+
+  let url = "data:text/html;charset=utf-8," + encodeURIComponent(TEST_URI);
+  yield addTab(url);
+
+  let {testActor, inspector, view, toolbox} = yield openRuleView();
+
+  yield runTest(testActor, inspector, view);
+
+  info("Reload the page to restore the initial state");
+  yield navigateTo(inspector, url);
+
+  info("Change toolbox host to WINDOW");
+  yield toolbox.switchHost("window");
+
+  yield runTest(testActor, inspector, view);
+});
+
+function* runTest(testActor, inspector, view) {
   yield selectNode("#div2", inspector);
 
   info("Get the background-color property from the rule-view");
   let property = getRuleViewProperty(view, "#div2", "background-color");
   let swatch = property.valueSpan.querySelector(".ruleview-colorswatch");
   ok(swatch, "Color swatch is displayed for the bg-color property");
 
   info("Open the eyedropper from the colorpicker tooltip");
@@ -61,17 +82,17 @@ add_task(function* () {
   yield testSelect(view, swatch, inspector, testActor);
 
   let onHidden = tooltip.once("hidden");
   tooltip.hide();
   yield onHidden;
   ok(!tooltip.isVisible(), "color picker tooltip is closed");
 
   yield waitForTick();
-});
+}
 
 function* testESC(swatch, inspector, testActor) {
   info("Press escape");
   let onCanceled = new Promise(resolve => {
     inspector.inspector.once("color-pick-canceled", resolve);
   });
   yield testActor.synthesizeKey({key: "VK_ESCAPE", options: {}});
   yield onCanceled;
new file mode 100644
--- /dev/null
+++ b/devtools/client/inspector/rules/test/browser_rules_highlight-used-fonts.js
@@ -0,0 +1,73 @@
+/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+// Tests that a used font-family is highlighted in the rule-view.
+
+const TEST_URI = `
+  <style type="text/css">
+    #id1 {
+      font-family: foo, bar, sans-serif;
+    }
+    #id2 {
+      font-family: serif;
+    }
+    #id3 {
+      font-family: foo, monospace, monospace, serif;
+    }
+    #id4 {
+      font-family: foo, bar;
+    }
+    #id5 {
+      font-family: "monospace";
+    }
+  </style>
+  <div id="id1">Text</div>
+  <div id="id2">Text</div>
+  <div id="id3">Text</div>
+  <div id="id4">Text</div>
+  <div id="id5">Text</div>
+`;
+
+// Tests that font-family properties in the rule-view correctly
+// indicates which font is in use.
+// Each entry in the test array should contain:
+// {
+//   selector: the rule-view selector to look for font-family in
+//   nb: the number of fonts this property should have
+//   used: the index of the font that should be highlighted, or
+//         -1 if none should be highlighted
+// }
+const TESTS = [
+  {selector: "#id1", nb: 3, used: 2}, // sans-serif
+  {selector: "#id2", nb: 1, used: 0}, // serif
+  {selector: "#id3", nb: 4, used: 1}, // monospace
+  {selector: "#id4", nb: 2, used: -1},
+  {selector: "#id5", nb: 1, used: 0}, // monospace
+];
+
+add_task(function* () {
+  yield addTab("data:text/html;charset=utf-8," + encodeURIComponent(TEST_URI));
+  let {inspector, view} = yield openRuleView();
+
+  for (let {selector, nb, used} of TESTS) {
+    let onFontHighlighted = view.once("font-highlighted");
+    yield selectNode(selector, inspector);
+    yield onFontHighlighted;
+
+    info("Looking for fonts in font-family property in selector " + selector);
+
+    let prop = getRuleViewProperty(view, selector, "font-family").valueSpan;
+    let fonts = prop.querySelectorAll(".ruleview-font-family");
+
+    ok(fonts.length, "Fonts found in the property");
+    is(fonts.length, nb, "Correct number of fonts found in the property");
+
+    const highlighted = [...fonts].filter(span => span.classList.contains("used-font"));
+
+    ok(highlighted.length <= 1, "No more than one font highlighted");
+    is([...fonts].findIndex(f => f === highlighted[0]), used, "Correct font highlighted");
+  }
+});
--- a/devtools/client/inspector/rules/views/text-property-editor.js
+++ b/devtools/client/inspector/rules/views/text-property-editor.js
@@ -23,29 +23,45 @@ const Services = require("Services");
 const HTML_NS = "http://www.w3.org/1999/xhtml";
 
 const SHARED_SWATCH_CLASS = "ruleview-swatch";
 const COLOR_SWATCH_CLASS = "ruleview-colorswatch";
 const BEZIER_SWATCH_CLASS = "ruleview-bezierswatch";
 const FILTER_SWATCH_CLASS = "ruleview-filterswatch";
 const ANGLE_SWATCH_CLASS = "ruleview-angleswatch";
 const INSET_POINT_TYPES = ["top", "right", "bottom", "left"];
+const FONT_FAMILY_CLASS = "ruleview-font-family";
 
 /*
  * An actionable element is an element which on click triggers a specific action
  * (e.g. shows a color tooltip, opens a link, …).
  */
 const ACTIONABLE_ELEMENTS_SELECTORS = [
   `.${COLOR_SWATCH_CLASS}`,
   `.${BEZIER_SWATCH_CLASS}`,
   `.${FILTER_SWATCH_CLASS}`,
   `.${ANGLE_SWATCH_CLASS}`,
   "a"
 ];
 
+// In order to highlight the used fonts in font-family properties, we
+// retrieve the list of used fonts from the server. That always
+// returns the actually used font family name(s). If the property's
+// authored value is sans-serif for instance, the used font might be
+// arial instead.  So we need the list of all generic font family
+// names to underline those when we find them.
+const GENERIC_FONT_FAMILIES = [
+  "serif",
+  "sans-serif",
+  "cursive",
+  "fantasy",
+  "monospace",
+  "system-ui"
+];
+
 /**
  * TextPropertyEditor is responsible for the following:
  *   Owns a TextProperty object.
  *   Manages changes to the TextProperty.
  *   Can be expanded to display computed properties.
  *   Can mark a property disabled or enabled.
  *
  * @param {RuleEditor} ruleEditor
@@ -360,27 +376,61 @@ TextPropertyEditor.prototype = {
       colorSwatchClass: SHARED_SWATCH_CLASS + " " + COLOR_SWATCH_CLASS,
       filterClass: "ruleview-filter",
       filterSwatchClass: SHARED_SWATCH_CLASS + " " + FILTER_SWATCH_CLASS,
       flexClass: "ruleview-flex",
       gridClass: "ruleview-grid",
       shapeClass: "ruleview-shape",
       defaultColorType: !propDirty,
       urlClass: "theme-link",
+      fontFamilyClass: FONT_FAMILY_CLASS,
       baseURI: this.sheetHref,
       unmatchedVariableClass: "ruleview-unmatched-variable",
       matchedVariableClass: "ruleview-variable",
       isVariableInUse: varName => this.rule.elementStyle.getVariable(varName),
     };
     let frag = outputParser.parseCssProperty(name, val, parserOptions);
     this.valueSpan.innerHTML = "";
     this.valueSpan.appendChild(frag);
 
     this.ruleView.emit("property-value-updated", this.valueSpan);
 
+    // Highlight the currently used font in font-family properties.
+    // If we cannot find a match, highlight the first generic family instead.
+    let fontFamilySpans = this.valueSpan.querySelectorAll("." + FONT_FAMILY_CLASS);
+    if (fontFamilySpans.length && this.prop.enabled && !this.prop.overridden) {
+      this.rule.elementStyle.getUsedFontFamilies().then(families => {
+        const usedFontFamilies = families.map(font => font.toLowerCase());
+        let foundMatchingFamily = false;
+        let firstGenericSpan = null;
+
+        for (let span of fontFamilySpans) {
+          const authoredFont = span.textContent.toLowerCase();
+
+          if (!firstGenericSpan && GENERIC_FONT_FAMILIES.includes(authoredFont)) {
+            firstGenericSpan = span;
+          }
+
+          if (usedFontFamilies.includes(authoredFont)) {
+            span.classList.add("used-font");
+            foundMatchingFamily = true;
+            // We found the span to style, no need to continue with
+            // the remaining ones
+            break;
+          }
+        }
+
+        if (!foundMatchingFamily && firstGenericSpan) {
+          firstGenericSpan.classList.add("used-font");
+        }
+
+        this.ruleView.emit("font-highlighted", this.valueSpan);
+      }).catch(e => console.error("Could not get the list of font families", e));
+    }
+
     // Attach the color picker tooltip to the color swatches
     this._colorSwatchSpans =
       this.valueSpan.querySelectorAll("." + COLOR_SWATCH_CLASS);
     if (this.ruleEditor.isEditable) {
       for (let span of this._colorSwatchSpans) {
         // Adding this swatch to the list of swatches our colorpicker
         // knows about
         this.ruleView.tooltips.getTooltip("colorPicker").addSwatch(span, {
--- a/devtools/client/responsive.html/manager.js
+++ b/devtools/client/responsive.html/manager.js
@@ -368,71 +368,84 @@ ResponsiveUI.prototype = {
    * Close RDM and restore page content back into a regular tab.
    *
    * @param object
    *        Destroy options, which currently includes a `reason` string.
    * @return boolean
    *         Whether this call is actually destroying.  False means destruction
    *         was already in progress.
    */
-  destroy: Task.async(function* (options) {
+  async destroy(options) {
     if (this.destroying) {
       return false;
     }
     this.destroying = true;
 
     // If our tab is about to be closed, there's not enough time to exit
     // gracefully, but that shouldn't be a problem since the tab will go away.
     // So, skip any yielding when we're about to close the tab.
     let isWindowClosing = options && options.reason === "unload";
     let isTabContentDestroying =
       isWindowClosing || (options && (options.reason === "TabClose" ||
                                       options.reason === "BeforeTabRemotenessChange"));
 
     // Ensure init has finished before starting destroy
     if (!isTabContentDestroying) {
-      yield this.inited;
+      await this.inited;
     }
 
     this.tab.removeEventListener("TabClose", this);
     this.tab.removeEventListener("BeforeTabRemotenessChange", this);
     this.browserWindow.removeEventListener("unload", this);
     this.toolWindow.removeEventListener("message", this);
 
     if (!isTabContentDestroying) {
       // Notify the inner browser to stop the frame script
-      yield message.request(this.toolWindow, "stop-frame-script");
+      await message.request(this.toolWindow, "stop-frame-script");
+    }
+
+    // Ensure the tab is reloaded if required when exiting RDM so that no emulated
+    // settings are left in a customized state.
+    if (!isTabContentDestroying) {
+      let reloadNeeded = false;
+      reloadNeeded |= await this.updateDPPX();
+      reloadNeeded |= await this.updateNetworkThrottling();
+      reloadNeeded |= await this.updateUserAgent();
+      reloadNeeded |= await this.updateTouchSimulation();
+      if (reloadNeeded) {
+        this.getViewportBrowser().reload();
+      }
     }
 
     // Destroy local state
     let swap = this.swap;
     this.browserWindow = null;
     this.tab = null;
     this.inited = null;
     this.toolWindow = null;
     this.swap = null;
 
     // Close the debugger client used to speak with emulation actor.
     // The actor handles clearing any overrides itself, so it's not necessary to clear
     // anything on shutdown client side.
     let clientClosed = this.client.close();
     if (!isTabContentDestroying) {
-      yield clientClosed;
+      await clientClosed;
     }
     this.client = this.emulationFront = null;
 
     if (!isWindowClosing) {
       // Undo the swap and return the content back to a normal tab
       swap.stop();
     }
 
     this.destroyed = true;
 
     return true;
-  }),
+  },
 
   connectToServer: Task.async(function* () {
     DebuggerServer.init();
     DebuggerServer.registerAllActors();
     this.client = new DebuggerClient(DebuggerServer.connectPipe());
     yield this.client.connect();
     let { tab } = yield this.client.getTab();
     this.emulationFront = EmulationFront(this.client, tab);
@@ -482,38 +495,45 @@ ResponsiveUI.prototype = {
       case "remove-device-association":
         this.onRemoveDeviceAssociation(event);
         break;
     }
   },
 
   onChangeDevice: Task.async(function* (event) {
     let { userAgent, pixelRatio, touch } = event.data.device;
+    // Bug 1428799: Should we reload on UA change as well?
     yield this.updateUserAgent(userAgent);
     yield this.updateDPPX(pixelRatio);
-    yield this.updateTouchSimulation(touch);
+    let reloadNeeded = yield this.updateTouchSimulation(touch);
+    if (reloadNeeded) {
+      this.getViewportBrowser().reload();
+    }
     // Used by tests
     this.emit("device-changed");
   }),
 
   onChangeNetworkThrottling: Task.async(function* (event) {
     let { enabled, profile } = event.data;
     yield this.updateNetworkThrottling(enabled, profile);
     // Used by tests
     this.emit("network-throttling-changed");
   }),
 
   onChangePixelRatio(event) {
     let { pixelRatio } = event.data;
     this.updateDPPX(pixelRatio);
   },
 
-  onChangeTouchSimulation(event) {
+  async onChangeTouchSimulation(event) {
     let { enabled } = event.data;
-    this.updateTouchSimulation(enabled);
+    let reloadNeeded = await this.updateTouchSimulation(enabled);
+    if (reloadNeeded) {
+      this.getViewportBrowser().reload();
+    }
     // Used by tests
     this.emit("touch-simulation-changed");
   },
 
   onContentResize(event) {
     let { width, height } = event.data;
     this.emit("content-resize", {
       width,
@@ -522,66 +542,92 @@ ResponsiveUI.prototype = {
   },
 
   onExit() {
     let { browserWindow, tab } = this;
     ResponsiveUIManager.closeIfNeeded(browserWindow, tab);
   },
 
   onRemoveDeviceAssociation: Task.async(function* (event) {
+    // Bug 1428799: Should we reload on UA change as well?
     yield this.updateUserAgent();
     yield this.updateDPPX();
-    yield this.updateTouchSimulation();
+    let reloadNeeded = yield this.updateTouchSimulation();
+    if (reloadNeeded) {
+      this.getViewportBrowser().reload();
+    }
     // Used by tests
     this.emit("device-association-removed");
   }),
 
+  /**
+   * Set or clear the emulated device pixel ratio.
+   *
+   * @return boolean
+   *         Whether a reload is needed to apply the change.
+   *         (This is always immediate, so it's always false.)
+   */
   updateDPPX: Task.async(function* (dppx) {
     if (!dppx) {
       yield this.emulationFront.clearDPPXOverride();
-      return;
+      return false;
     }
     yield this.emulationFront.setDPPXOverride(dppx);
+    return false;
   }),
 
+  /**
+   * Set or clear network throttling.
+   *
+   * @return boolean
+   *         Whether a reload is needed to apply the change.
+   *         (This is always immediate, so it's always false.)
+   */
   updateNetworkThrottling: Task.async(function* (enabled, profile) {
     if (!enabled) {
       yield this.emulationFront.clearNetworkThrottling();
-      return;
+      return false;
     }
     let data = throttlingProfiles.find(({ id }) => id == profile);
     let { download, upload, latency } = data;
     yield this.emulationFront.setNetworkThrottling({
       downloadThroughput: download,
       uploadThroughput: upload,
       latency,
     });
-  }),
-
-  updateUserAgent: Task.async(function* (userAgent) {
-    if (!userAgent) {
-      yield this.emulationFront.clearUserAgentOverride();
-      return;
-    }
-    yield this.emulationFront.setUserAgentOverride(userAgent);
+    return false;
   }),
 
-  updateTouchSimulation: Task.async(function* (enabled) {
-    let reloadNeeded;
-    if (enabled) {
-      reloadNeeded = yield this.emulationFront.setTouchEventsOverride(
-        Ci.nsIDocShell.TOUCHEVENTS_OVERRIDE_ENABLED
-      );
-    } else {
-      reloadNeeded = yield this.emulationFront.clearTouchEventsOverride();
+  /**
+   * Set or clear the emulated user agent.
+   *
+   * @return boolean
+   *         Whether a reload is needed to apply the change.
+   */
+  updateUserAgent(userAgent) {
+    if (!userAgent) {
+      return this.emulationFront.clearUserAgentOverride();
     }
-    if (reloadNeeded) {
-      this.getViewportBrowser().reload();
+    return this.emulationFront.setUserAgentOverride(userAgent);
+  },
+
+  /**
+   * Set or clear touch simulation.
+   *
+   * @return boolean
+   *         Whether a reload is needed to apply the change.
+   */
+  updateTouchSimulation(enabled) {
+    if (!enabled) {
+      return this.emulationFront.clearTouchEventsOverride();
     }
-  }),
+    return this.emulationFront.setTouchEventsOverride(
+      Ci.nsIDocShell.TOUCHEVENTS_OVERRIDE_ENABLED
+    );
+  },
 
   /**
    * Helper for tests. Assumes a single viewport for now.
    */
   getViewportSize() {
     return this.toolWindow.getViewportSize();
   },
 
--- a/devtools/client/responsive.html/test/browser/browser_device_change.js
+++ b/devtools/client/responsive.html/test/browser/browser_device_change.js
@@ -1,15 +1,15 @@
 /* Any copyright is dedicated to the Public Domain.
 http://creativecommons.org/publicdomain/zero/1.0/ */
 
 "use strict";
 
-// Tests changing viewport device
-const TEST_URL = "data:text/html;charset=utf-8,Device list test";
+// Tests changing viewport device (need HTTP load for proper UA testing)
+const TEST_URL = `${URL_ROOT}doc_page_state.html`;
 
 const DEFAULT_DPPX = window.devicePixelRatio;
 const DEFAULT_UA = Cc["@mozilla.org/network/protocol;1?name=http"]
   .getService(Ci.nsIHttpProtocolHandler)
   .userAgent;
 
 const Types = require("devtools/client/responsive.html/types");
 
@@ -23,55 +23,92 @@ const testDevice = {
   "firefoxOS": true,
   "os": "custom",
   "featured": true,
 };
 
 // Add the new device to the list
 addDeviceForTest(testDevice);
 
-addRDMTask(TEST_URL, function* ({ ui, manager }) {
+addRDMTask(TEST_URL, function* ({ ui }) {
   let { store } = ui.toolWindow;
 
   // Wait until the viewport has been added and the device list has been loaded
   yield waitUntilState(store, state => state.viewports.length == 1
     && state.devices.listState == Types.deviceListState.LOADED);
 
   // Test defaults
   testViewportDimensions(ui, 320, 480);
+  info("Should have default UA at the start of the test");
   yield testUserAgent(ui, DEFAULT_UA);
   yield testDevicePixelRatio(ui, DEFAULT_DPPX);
   yield testTouchEventsOverride(ui, false);
   testViewportDeviceSelectLabel(ui, "no device selected");
 
   // Test device with custom properties
+  let reloaded = waitForViewportLoad(ui);
   yield selectDevice(ui, "Fake Phone RDM Test");
+  yield reloaded;
   yield waitForViewportResizeTo(ui, testDevice.width, testDevice.height);
+  info("Should have device UA now that device is applied");
   yield testUserAgent(ui, testDevice.userAgent);
   yield testDevicePixelRatio(ui, testDevice.pixelRatio);
   yield testTouchEventsOverride(ui, true);
 
   // Test resetting device when resizing viewport
   let deviceRemoved = once(ui, "device-association-removed");
+  reloaded = waitForViewportLoad(ui);
   yield testViewportResize(ui, ".viewport-vertical-resize-handle",
     [-10, -10], [testDevice.width, testDevice.height - 10], [0, -10], ui);
-  yield deviceRemoved;
+  yield Promise.all([ deviceRemoved, reloaded ]);
+  info("Should have default UA after resizing viewport");
   yield testUserAgent(ui, DEFAULT_UA);
   yield testDevicePixelRatio(ui, DEFAULT_DPPX);
   yield testTouchEventsOverride(ui, false);
   testViewportDeviceSelectLabel(ui, "no device selected");
 
   // Test device with generic properties
   yield selectDevice(ui, "Laptop (1366 x 768)");
   yield waitForViewportResizeTo(ui, 1366, 768);
+  info("Should have default UA when using device without specific UA");
   yield testUserAgent(ui, DEFAULT_UA);
   yield testDevicePixelRatio(ui, 1);
   yield testTouchEventsOverride(ui, false);
 });
 
+add_task(async function () {
+  const tab = await addTab(TEST_URL);
+  const { ui } = await openRDM(tab);
+
+  let { store } = ui.toolWindow;
+
+  // Wait until the viewport has been added and the device list has been loaded
+  await waitUntilState(store, state => state.viewports.length == 1
+    && state.devices.listState == Types.deviceListState.LOADED);
+
+  // Select device with custom UA
+  let reloaded = waitForViewportLoad(ui);
+  await selectDevice(ui, "Fake Phone RDM Test");
+  await reloaded;
+  await waitForViewportResizeTo(ui, testDevice.width, testDevice.height);
+  info("Should have device UA now that device is applied");
+  await testUserAgent(ui, testDevice.userAgent);
+
+  // Browser will reload to clear the UA on RDM close
+  reloaded = waitForViewportLoad(ui);
+  await closeRDM(tab);
+  await reloaded;
+
+  // Ensure UA is reset to default after closing RDM
+  info("Should have default UA after closing RDM");
+  await testUserAgentFromBrowser(tab.linkedBrowser, DEFAULT_UA);
+
+  await removeTab(tab);
+});
+
 function testViewportDimensions(ui, w, h) {
   let viewport = ui.toolWindow.document.querySelector(".viewport-content");
 
   is(ui.toolWindow.getComputedStyle(viewport).getPropertyValue("width"),
      `${w}px`, `Viewport should have width of ${w}px`);
   is(ui.toolWindow.getComputedStyle(viewport).getPropertyValue("height"),
      `${h}px`, `Viewport should have height of ${h}px`);
 }
--- a/devtools/client/responsive.html/test/browser/head.js
+++ b/devtools/client/responsive.html/test/browser/head.js
@@ -296,22 +296,17 @@ function waitForPageShow(browser) {
       mm.removeMessageListener("PageVisibility:Show", onShow);
       resolve();
     };
     mm.addMessageListener("PageVisibility:Show", onShow);
   });
 }
 
 function waitForViewportLoad(ui) {
-  return new Promise(resolve => {
-    let browser = ui.getViewportBrowser();
-    browser.addEventListener("mozbrowserloadend", () => {
-      resolve();
-    }, { once: true });
-  });
+  return BrowserTestUtils.waitForContentEvent(ui.getViewportBrowser(), "load", true);
 }
 
 function load(browser, url) {
   let loaded = BrowserTestUtils.browserLoaded(browser, false, url);
   browser.loadURI(url, null, null);
   return loaded;
 }
 
@@ -366,18 +361,22 @@ function* toggleTouchSimulation(ui) {
   let { document } = ui.toolWindow;
   let touchButton = document.querySelector("#global-touch-simulation-button");
   let changed = once(ui, "touch-simulation-changed");
   let loaded = waitForViewportLoad(ui);
   touchButton.click();
   yield Promise.all([ changed, loaded ]);
 }
 
-function* testUserAgent(ui, expected) {
-  let ua = yield ContentTask.spawn(ui.getViewportBrowser(), {}, function* () {
+function testUserAgent(ui, expected) {
+  testUserAgentFromBrowser(ui.getViewportBrowser(), expected);
+}
+
+async function testUserAgentFromBrowser(browser, expected) {
+  let ua = await ContentTask.spawn(browser, {}, function* () {
     return content.navigator.userAgent;
   });
   is(ua, expected, `UA should be set to ${expected}`);
 }
 
 /**
  * Assuming the device modal is open and the device adder form is shown, this helper
  * function adds `device` via the form, saves it, and waits for it to appear in the store.
--- a/devtools/client/scratchpad/scratchpad.js
+++ b/devtools/client/scratchpad/scratchpad.js
@@ -1727,16 +1727,19 @@ var Scratchpad = {
                                                       document.querySelector("#scratchpad-notificationbox"),
                                                       msg, okstring);
       editorElement.addEventListener("paste", this._onPaste, true);
       editorElement.addEventListener("drop", this._onPaste);
       this.editor.on("saveRequested", () => this.saveFile());
       this.editor.focus();
       this.editor.setCursor({ line: lines.length, ch: lines.pop().length });
 
+      // Add the commands controller for the source-editor.
+      this.editor.insertCommandsController();
+
       if (state)
         this.dirty = !state.saved;
 
       this.initialized = true;
       this._triggerObservers("Ready");
       this.populateRecentFilesMenu();
       PreferenceObserver.init();
       CloseObserver.init();
--- a/devtools/client/shared/output-parser.js
+++ b/devtools/client/shared/output-parser.js
@@ -88,16 +88,17 @@ OutputParser.prototype = {
     options = this._mergeOptions(options);
 
     options.expectCubicBezier = this.supportsType(name, CSS_TYPES.TIMING_FUNCTION);
     options.expectDisplay = name === "display";
     options.expectFilter = name === "filter";
     options.expectShape = name === "clip-path" ||
                           (name === "shape-outside"
                            && Services.prefs.getBoolPref(CSS_SHAPE_OUTSIDE_ENABLED_PREF));
+    options.expectFont = name === "font-family";
     options.supportsColor = this.supportsType(name, CSS_TYPES.COLOR) ||
                             this.supportsType(name, CSS_TYPES.GRADIENT);
 
     // The filter property is special in that we want to show the
     // swatch even if the value is invalid, because this way the user
     // can easily use the editor to fix it.
     if (options.expectFilter || this._cssPropertySupportsValue(name, value)) {
       return this._parse(value, options);
@@ -280,16 +281,17 @@ OutputParser.prototype = {
    * @param  {Boolean} stopAtCloseParen
    *         If true, stop at an umatched close paren.
    * @return {DocumentFragment}
    *         A document fragment.
    */
   _doParse: function (text, options, tokenStream, stopAtCloseParen) {
     let parenDepth = stopAtCloseParen ? 1 : 0;
     let outerMostFunctionTakesColor = false;
+    let fontFamilyNameParts = [];
 
     let colorOK = function () {
       return options.supportsColor ||
         (options.expectFilter && parenDepth === 1 &&
          outerMostFunctionTakesColor);
     };
 
     let angleOK = function (angle) {
@@ -297,16 +299,19 @@ OutputParser.prototype = {
     };
 
     let spaceNeeded = false;
     let done = false;
 
     while (!done) {
       let token = tokenStream.nextToken();
       if (!token) {
+        if (options.expectFont && fontFamilyNameParts.length !== 0) {
+          this._appendFontFamily(fontFamilyNameParts.join(""), options);
+        }
         break;
       }
 
       if (token.tokenType === "comment") {
         // This doesn't change spaceNeeded, because we didn't emit
         // anything to the output.
         continue;
       }
@@ -378,16 +383,18 @@ OutputParser.prototype = {
             this._appendHighlighterToggle(token.text, options.flexClass);
           } else if (this._isDisplayGrid(text, token, options)) {
             this._appendHighlighterToggle(token.text, options.gridClass);
           } else if (colorOK() &&
                      colorUtils.isValidCSSColor(token.text, this.cssColor4)) {
             this._appendColor(token.text, options);
           } else if (angleOK(token.text)) {
             this._appendAngle(token.text, options);
+          } else if (options.expectFont) {
+            fontFamilyNameParts.push(token.text);
           } else {
             this._appendTextNode(text.substring(token.startOffset,
                                                 token.endOffset));
           }
           break;
 
         case "id":
         case "hash": {
@@ -413,30 +420,52 @@ OutputParser.prototype = {
           }
           break;
         case "url":
         case "bad_url":
           this._appendURL(text.substring(token.startOffset, token.endOffset),
                           token.text, options);
           break;
 
+        case "string":
+          if (options.expectFont) {
+            fontFamilyNameParts.push(text.substring(token.startOffset, token.endOffset));
+          } else {
+            this._appendTextNode(
+              text.substring(token.startOffset, token.endOffset));
+          }
+          break;
+
+        case "whitespace":
+          if (options.expectFont) {
+            fontFamilyNameParts.push(" ");
+          } else {
+            this._appendTextNode(
+              text.substring(token.startOffset, token.endOffset));
+          }
+          break;
+
         case "symbol":
           if (token.text === "(") {
             ++parenDepth;
           } else if (token.text === ")") {
             --parenDepth;
 
             if (stopAtCloseParen && parenDepth === 0) {
               done = true;
               break;
             }
 
             if (parenDepth === 0) {
               outerMostFunctionTakesColor = false;
             }
+          } else if (token.text === "," &&
+                     options.expectFont && fontFamilyNameParts.length !== 0) {
+            this._appendFontFamily(fontFamilyNameParts.join(""), options);
+            fontFamilyNameParts = [];
           }
           // falls through
         default:
           this._appendTextNode(
             text.substring(token.startOffset, token.endOffset));
           break;
       }
 
@@ -1325,16 +1354,68 @@ OutputParser.prototype = {
 
       this._appendTextNode(trailer);
     } else {
       this._appendTextNode(match);
     }
   },
 
   /**
+   * Append a font family to the output.
+   *
+   * @param  {String} fontFamily
+   *         Font family to append
+   * @param  {Object} options
+   *         Options object. For valid options and default values see
+   *         _mergeOptions().
+   */
+  _appendFontFamily: function (fontFamily, options) {
+    let spanContents = fontFamily;
+    let quoteChar = null;
+    let trailingWhitespace = false;
+
+    // Before appending the actual font-family span, we need to trim
+    // down the actual contents by removing any whitespace before and
+    // after, and any quotation characters in the passed string.  Any
+    // such characters are preserved in the actual output, but just
+    // not inside the span element.
+
+    if (spanContents[0] === " ") {
+      this._appendTextNode(" ");
+      spanContents = spanContents.slice(1);
+    }
+
+    if (spanContents[spanContents.length - 1] === " ") {
+      spanContents = spanContents.slice(0, -1);
+      trailingWhitespace = true;
+    }
+
+    if (spanContents[0] === "'" || spanContents[0] === "\"") {
+      quoteChar = spanContents[0];
+    }
+
+    if (quoteChar) {
+      this._appendTextNode(quoteChar);
+      spanContents = spanContents.slice(1, -1);
+    }
+
+    this._appendNode("span", {
+      class: options.fontFamilyClass
+    }, spanContents);
+
+    if (quoteChar) {
+      this._appendTextNode(quoteChar);
+    }
+
+    if (trailingWhitespace) {
+      this._appendTextNode(" ");
+    }
+  },
+
+  /**
    * Create a node.
    *
    * @param  {String} tagName
    *         Tag type e.g. "div"
    * @param  {Object} attributes
    *         e.g. {class: "someClass", style: "cursor:pointer"};
    * @param  {String} [value]
    *         If a value is included it will be appended as a text node inside
@@ -1435,16 +1516,17 @@ OutputParser.prototype = {
    *                                    // parser to skip the call to
    *                                    // _wrapFilter.  Used only for
    *                                    // previewing with the filter swatch.
    *           - flexClass: ""          // The class to use for the flex icon.
    *           - gridClass: ""          // The class to use for the grid icon.
    *           - shapeClass: ""         // The class to use for the shape icon.
    *           - supportsColor: false   // Does the CSS property support colors?
    *           - urlClass: ""           // The class to be used for url() links.
+   *           - fontFamilyClass: ""    // The class to be used for font families.
    *           - baseURI: undefined     // A string used to resolve
    *                                    // relative links.
    *           - isVariableInUse        // A function taking a single
    *                                    // argument, the name of a variable.
    *                                    // This should return the variable's
    *                                    // value, if it is in use; or null.
    *           - unmatchedVariableClass: ""
    *                                    // The class to use for a component
@@ -1463,16 +1545,17 @@ OutputParser.prototype = {
       colorClass: "",
       colorSwatchClass: "",
       filterSwatch: false,
       flexClass: "",
       gridClass: "",
       shapeClass: "",
       supportsColor: false,
       urlClass: "",
+      fontFamilyClass: "",
       baseURI: undefined,
       isVariableInUse: null,
       unmatchedVariableClass: null,
     };
 
     for (let item in overrides) {
       defaults[item] = overrides[item];
     }
--- a/devtools/client/shared/test/browser_outputparser.js
+++ b/devtools/client/shared/test/browser_outputparser.js
@@ -25,16 +25,17 @@ function* performTest() {
   let parser = new OutputParser(doc, cssProperties);
   testParseCssProperty(doc, parser);
   testParseCssVar(doc, parser);
   testParseURL(doc, parser);
   testParseFilter(doc, parser);
   testParseAngle(doc, parser);
   testParseShape(doc, parser);
   testParseVariable(doc, parser);
+  testParseFontFamily(doc, parser);
 
   host.destroy();
 }
 
 // Class name used in color swatch.
 var COLOR_TEST_CLASS = "test-class";
 
 // Create a new CSS color-parsing test.  |name| is the name of the CSS
@@ -76,17 +77,18 @@ function testParseCssProperty(doc, parse
 
     makeColorTest("background-image",
       "linear-gradient(to right, #F60 10%, rgba(0,0,0,1))",
       ["linear-gradient(to right, ", {name: "#F60"},
        " 10%, ", {name: "rgba(0,0,0,1)"},
        ")"]),
 
     // In "arial black", "black" is a font, not a color.
-    makeColorTest("font-family", "arial black", ["arial black"]),
+    // (The font-family parser creates a span)
+    makeColorTest("font-family", "arial black", ["<span>arial black</span>"]),
 
     makeColorTest("box-shadow", "0 0 1em red",
                   ["0 0 1em ", {name: "red"}]),
 
     makeColorTest("box-shadow",
       "0 0 1em red, 2px 2px 0 0 rgba(0,0,0,.5)",
       ["0 0 1em ", {name: "red"},
        ", 2px 2px 0 0 ",
@@ -458,8 +460,92 @@ function testParseVariable(doc, parser) 
 
     let target = doc.querySelector("div");
     target.appendChild(frag);
 
     is(target.innerHTML, test.expected, test.text);
     target.innerHTML = "";
   }
 }
+
+function testParseFontFamily(doc, parser) {
+  info("Test font-family parsing");
+  const tests = [
+    {
+      desc: "No fonts",
+      definition: "",
+      families: []
+    },
+    {
+      desc: "List of fonts",
+      definition: "Arial,Helvetica,sans-serif",
+      families: ["Arial", "Helvetica", "sans-serif"]
+    },
+    {
+      desc: "Fonts with spaces",
+      definition: "Open Sans",
+      families: ["Open Sans"]
+    },
+    {
+      desc: "Quoted fonts",
+      definition: "\"Arial\",'Open Sans'",
+      families: ["Arial", "Open Sans"]
+    },
+    {
+      desc: "Fonts with extra whitespace",
+      definition: " Open  Sans  ",
+      families: ["Open Sans"]
+    }
+  ];
+
+  const textContentTests = [
+    {
+      desc: "No whitespace between fonts",
+      definition: "Arial,Helvetica,sans-serif",
+      output: "Arial,Helvetica,sans-serif",
+    },
+    {
+      desc: "Whitespace between fonts",
+      definition: "Arial ,  Helvetica,   sans-serif",
+      output: "Arial , Helvetica, sans-serif",
+    },
+    {
+      desc: "Whitespace before first font trimmed",
+      definition: "  Arial,Helvetica,sans-serif",
+      output: "Arial,Helvetica,sans-serif",
+    },
+    {
+      desc: "Whitespace after last font trimmed",
+      definition: "Arial,Helvetica,sans-serif  ",
+      output: "Arial,Helvetica,sans-serif",
+    },
+    {
+      desc: "Whitespace between quoted fonts",
+      definition: "'Arial' ,  \"Helvetica\" ",
+      output: "'Arial' , \"Helvetica\"",
+    },
+    {
+      desc: "Whitespace within font preserved",
+      definition: "'  Ari al '",
+      output: "'  Ari al '",
+    }
+  ];
+
+  for (let {desc, definition, families} of tests) {
+    info(desc);
+    let frag = parser.parseCssProperty("font-family", definition, {
+      fontFamilyClass: "ruleview-font-family"
+    });
+    let spans = frag.querySelectorAll(".ruleview-font-family");
+
+    is(spans.length, families.length, desc + " span count");
+    for (let i = 0; i < spans.length; i++) {
+      is(spans[i].textContent, families[i], desc + " span contents");
+    }
+  }
+
+  info("Test font-family text content");
+  for (let {desc, definition, output} of textContentTests) {
+    info(desc);
+    let frag = parser.parseCssProperty("font-family", definition, {});
+    is(frag.textContent, output, desc + " text content matches");
+  }
+}
--- a/devtools/client/shared/widgets/tooltip/SwatchBasedEditorTooltip.js
+++ b/devtools/client/shared/widgets/tooltip/SwatchBasedEditorTooltip.js
@@ -104,38 +104,42 @@ class SwatchBasedEditorTooltip {
    */
   show() {
     let tooltipAnchor = this.useInline ?
       this.activeSwatch.closest(`.${INLINE_TOOLTIP_CLASS}`) :
       this.activeSwatch;
 
     if (tooltipAnchor) {
       let onShown = this.tooltip.once("shown");
+
       this.tooltip.show(tooltipAnchor, "topcenter bottomleft");
-
-      // When the tooltip is closed by clicking outside the panel we want to
-      // commit any changes.
-      this.tooltip.once("hidden", () => {
-        if (!this._reverted && !this.eyedropperOpen) {
-          this.commit();
-        }
-        this._reverted = false;
-
-        // Once the tooltip is hidden we need to clean up any remaining objects.
-        if (!this.eyedropperOpen) {
-          this.activeSwatch = null;
-        }
-      });
+      this.tooltip.once("hidden", () => this.onTooltipHidden());
 
       return onShown;
     }
 
     return Promise.resolve();
   }
 
+  /**
+   * Can be overridden by subclasses if implementation specific behavior is needed on
+   * tooltip hidden.
+   */
+  onTooltipHidden() {
+    // When the tooltip is closed by clicking outside the panel we want to commit any
+    // changes.
+    if (!this._reverted) {
+      this.commit();
+    }
+    this._reverted = false;
+
+    // Once the tooltip is hidden we need to clean up any remaining objects.
+    this.activeSwatch = null;
+  }
+
   hide() {
     this.tooltip.hide();
   }
 
   /**
    * Add a new swatch DOM element to the list of swatch elements this editor
    * tooltip knows about. That means from now on, clicking on that swatch will
    * toggle the editor.
--- a/devtools/client/shared/widgets/tooltip/SwatchColorPickerTooltip.js
+++ b/devtools/client/shared/widgets/tooltip/SwatchColorPickerTooltip.js
@@ -152,26 +152,42 @@ class SwatchColorPickerTooltip extends S
       this.preview(color);
 
       if (this.eyedropperOpen) {
         this.commit();
       }
     }
   }
 
+  /**
+   * Override the implementation from SwatchBasedEditorTooltip.
+   */
+  onTooltipHidden() {
+    // If the tooltip is hidden while the eyedropper is being used, we should not commit
+    // the changes.
+    if (this.eyedropperOpen) {
+      return;
+    }
+
+    super.onTooltipHidden();
+  }
+
   _openEyeDropper() {
     let {inspector, toolbox, telemetry} = this.inspector;
     telemetry.toolOpened("pickereyedropper");
 
     // cancelling picker(if it is already selected) on opening eye-dropper
     toolbox.highlighterUtils.cancelPicker();
 
+    // pickColorFromPage will focus the content document. If the devtools are in a
+    // separate window, the colorpicker tooltip will be closed before pickColorFromPage
+    // resolves. Flip the flag early to avoid issues with onTooltipHidden().
+    this.eyedropperOpen = true;
+
     inspector.pickColorFromPage(toolbox, {copyOnSelect: false}).then(() => {
-      this.eyedropperOpen = true;
-
       // close the colorpicker tooltip so that only the eyedropper is open.
       this.hide();
 
       this.tooltip.emit("eyedropper-opened");
     }, console.error);
 
     inspector.once("color-picked", color => {
       toolbox.win.focus();
new file mode 100644
--- /dev/null
+++ b/devtools/client/sourceeditor/editor-commands-controller.js
@@ -0,0 +1,97 @@
+/* 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";
+
+/**
+ * The source editor exposes XUL commands that can be used when embedded in a XUL
+ * document. This controller drives the availability and behavior of the commands. When
+ * the editor input field is focused, this controller will update the matching menu item
+ * entries found in application menus or context menus.
+ */
+
+/**
+ * Returns a controller object that can be used for editor-specific commands:
+ * - find
+ * - find again
+ * - go to line
+ * - undo
+ * - redo
+ * - delete
+ * - select all
+ */
+function createController(ed) {
+  return {
+    supportsCommand: function (cmd) {
+      switch (cmd) {
+        case "cmd_find":
+        case "cmd_findAgain":
+        case "cmd_gotoLine":
+        case "cmd_undo":
+        case "cmd_redo":
+        case "cmd_delete":
+        case "cmd_selectAll":
+          return true;
+      }
+
+      return false;
+    },
+
+    isCommandEnabled: function (cmd) {
+      let cm = ed.codeMirror;
+
+      switch (cmd) {
+        case "cmd_find":
+        case "cmd_gotoLine":
+        case "cmd_selectAll":
+          return true;
+        case "cmd_findAgain":
+          return cm.state.search != null && cm.state.search.query != null;
+        case "cmd_undo":
+          return ed.canUndo();
+        case "cmd_redo":
+          return ed.canRedo();
+        case "cmd_delete":
+          return ed.somethingSelected();
+      }
+
+      return false;
+    },
+
+    doCommand: function (cmd) {
+      let cm = ed.codeMirror;
+
+      let map = {
+        "cmd_selectAll": "selectAll",
+        "cmd_find": "find",
+        "cmd_undo": "undo",
+        "cmd_redo": "redo",
+        "cmd_delete": "delCharAfter",
+        "cmd_findAgain": "findNext"
+      };
+
+      if (map[cmd]) {
+        cm.execCommand(map[cmd]);
+        return;
+      }
+
+      if (cmd == "cmd_gotoLine") {
+        ed.jumpToLine();
+      }
+    },
+
+    onEvent: function () {}
+  };
+}
+
+/**
+ * Create and insert a commands controller for the provided SourceEditor instance.
+ */
+function insertCommandsController(sourceEditor) {
+  let input = sourceEditor.codeMirror.getInputField();
+  let controller = createController(sourceEditor);
+  input.controllers.insertControllerAt(0, controller);
+}
+
+module.exports = { insertCommandsController };
--- a/devtools/client/sourceeditor/editor.js
+++ b/devtools/client/sourceeditor/editor.js
@@ -479,16 +479,26 @@ Editor.prototype = {
     // turn it off and back on again so the proper mode can be used.
     if (this.config.autocomplete) {
       this.setOption("autocomplete", false);
       this.setOption("autocomplete", true);
     }
   },
 
   /**
+   * The source editor can expose several commands linked from system and context menus.
+   * Kept for backward compatibility with scratchpad and styleeditor.
+   */
+  insertCommandsController: function () {
+    const { insertCommandsController } =
+      require("devtools/client/sourceeditor/editor-commands-controller");
+    insertCommandsController(this);
+  },
+
+  /**
    * Returns text from the text area. If line argument is provided
    * the method returns only that line.
    */
   getText: function (line) {
     let cm = editors.get(this);
 
     if (line == null) {
       return cm.getValue();
--- a/devtools/client/sourceeditor/moz.build
+++ b/devtools/client/sourceeditor/moz.build
@@ -7,16 +7,17 @@
 DIRS += [
     'tern',
 ]
 
 DevToolsModules(
     'autocomplete.js',
     'css-autocompleter.js',
     'debugger.js',
+    'editor-commands-controller.js',
     'editor.js',
     'wasm.js'
 )
 
 BROWSER_CHROME_MANIFESTS += ['test/browser.ini']
 
-with Files('**'):
-    BUG_COMPONENT = ('Firefox', 'Developer Tools: Source Editor')
+with Files('**'):
+    BUG_COMPONENT = ('Firefox', 'Developer Tools: Source Editor')
--- a/devtools/client/styleeditor/StyleSheetEditor.jsm
+++ b/devtools/client/styleeditor/StyleSheetEditor.jsm
@@ -464,16 +464,19 @@ StyleSheetEditor.prototype = {
 
       sourceEditor.setSelection(this._state.selection.start,
                                 this._state.selection.end);
 
       if (this.highlighter && this.walker) {
         sourceEditor.container.addEventListener("mousemove", this._onMouseMove);
       }
 
+      // Add the commands controller for the source-editor.
+      sourceEditor.insertCommandsController();
+
       this.emit("source-editor-load");
     });
   },
 
   /**
    * Get the source editor for this editor.
    *
    * @return {Promise}
--- a/devtools/client/themes/rules.css
+++ b/devtools/client/themes/rules.css
@@ -536,16 +536,20 @@
 .ruleview-overridden {
   text-decoration: line-through;
 }
 
 .theme-light .ruleview-overridden {
   text-decoration-color: var(--theme-content-color3);
 }
 
+.ruleview-font-family.used-font {
+  text-decoration: underline;
+}
+
 .styleinspector-propertyeditor {
   border: 1px solid #CCC;
   padding: 0;
   margin: -1px -3px -1px -1px;
 }
 
 .theme-firebug .styleinspector-propertyeditor {
   border: 1px solid var(--theme-splitter-color);
--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
@@ -361,17 +361,16 @@ skip-if = true #	Bug 1405641
 skip-if = true # Bug 1406841
 #old console skip-if = e10s # Bug 1042253 - webconsole tests disabled with e10s
 [browser_webconsole_prune_scroll.js]
 skip-if = true #	Bug 1404832
 [browser_webconsole_reflow.js]
 skip-if = true #	Bug 1406022
 [browser_webconsole_reopen_closed_tab.js]
 [browser_webconsole_repeat_different_objects.js]
-skip-if = true #	Bug 1401953
 [browser_webconsole_repeated_messages_accuracy.js]
 skip-if = true #	Bug 1403450
 [browser_webconsole_sandbox_update_after_navigation.js]
 [browser_webconsole_script_errordoc_urls.js]
 skip-if = true #	Bug 1403454
 # old console skip-if = e10s # Bug 1042253 - webconsole tests disabled with e10s
 [browser_webconsole_scroll.js]
 [browser_webconsole_select_all.js]
--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_network_messages_expand.js
+++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_network_messages_expand.js
@@ -5,16 +5,18 @@
 
 const TEST_FILE = "test-network-request.html";
 const TEST_PATH = "http://example.com/browser/devtools/client/webconsole/new-console-output/test/mochitest/";
 const TEST_URI = TEST_PATH + TEST_FILE;
 
 const NET_PREF = "devtools.webconsole.filter.net";
 const XHR_PREF = "devtools.webconsole.filter.netxhr";
 
+requestLongerTimeout(2);
+
 Services.prefs.setBoolPref(NET_PREF, false);
 Services.prefs.setBoolPref(XHR_PREF, true);
 registerCleanupFunction(() => {
   Services.prefs.clearUserPref(NET_PREF);
   Services.prefs.clearUserPref(XHR_PREF);
 });
 
 let tabs = [{
--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_repeat_different_objects.js
+++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_repeat_different_objects.js
@@ -4,60 +4,30 @@
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 // Test that makes sure messages are not considered repeated when console.log()
 // is invoked with different objects, see bug 865288.
 
 "use strict";
 
 const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
-                 "test/test-repeated-messages.html";
+                 "new-console-output/test/mochitest/test-repeated-messages.html";
 
-add_task(function* () {
-  yield loadTab(TEST_URI);
-  let hud = yield openConsole();
-
-  info("waiting for 3 console.log objects");
-
-  hud.jsterm.clearOutput(true);
-  hud.jsterm.execute("window.testConsoleObjects()");
+add_task(async function () {
+  let hud = await openNewTabAndConsole(TEST_URI);
+  hud.jsterm.clearOutput();
 
-  let [result] = yield waitForMessages({
-    webconsole: hud,
-    messages: [{
-      name: "3 console.log messages",
-      text: "abba",
-      category: CATEGORY_WEBDEV,
-      severity: SEVERITY_LOG,
-      count: 3,
-      repeats: 1,
-      objects: true,
-    }],
+  let onMessages = waitForMessages({
+    hud,
+    messages: [
+      { text: "abba" },
+      { text: "abba" },
+      { text: "abba" },
+    ],
   });
 
-  let msgs = [...result.matched];
-  is(msgs.length, 3, "3 message elements");
-
-  for (let i = 0; i < msgs.length; i++) {
-    info("test message element #" + i);
-
-    let msg = msgs[i];
-    let clickable = msg.querySelector(".message-body a");
-    ok(clickable, "clickable object #" + i);
-
-    msg.scrollIntoView(false);
-    yield clickObject(clickable, i);
-  }
+  hud.jsterm.execute("window.testConsoleObjects()");
 
-  function* clickObject(obj, i) {
-    executeSoon(() => {
-      EventUtils.synthesizeMouse(obj, 2, 2, {}, hud.iframeWindow);
-    });
+  info("waiting for 3 console.log objects, with the exact same text content");
+  let messages = await onMessages;
 
-    let varView = yield hud.jsterm.once("variablesview-fetched");
-    ok(varView, "variables view fetched #" + i);
-
-    yield findVariableViewProperties(varView, [
-      { name: "id", value: "abba" + i },
-    ], { webconsole: hud });
-  }
+  is(messages.length, 3, "3 message elements");
 });
-
--- a/devtools/client/webconsole/new-console-output/test/mochitest/test-repeated-messages.html
+++ b/devtools/client/webconsole/new-console-output/test/mochitest/test-repeated-messages.html
@@ -9,17 +9,17 @@
         for(var i = 0; i < 2; i++) {
           console.log("foo repeat");
         }
         console.log("foo repeat");
         console.error("foo repeat");
       }
       function testConsoleObjects() {
         for (var i = 0; i < 3; i++) {
-          var o = { id: "abba" + i };
+          var o = { id: "abba" };
           console.log("abba", o);
         }
       }
       function testConsoleFalsyValues(){
         [NaN, undefined, null].forEach(function(item, index){
           console.log(item);
         });
         [NaN, NaN].forEach(function(item, index){
--- a/dom/base/nsContentUtils.cpp
+++ b/dom/base/nsContentUtils.cpp
@@ -7475,40 +7475,16 @@ nsContentUtils::GetHTMLEditor(nsPresCont
       NS_FAILED(docShell->GetEditable(&isEditable)) || !isEditable)
     return nullptr;
 
   return docShell->GetHTMLEditor();
 }
 
 // static
 bool
-nsContentUtils::HasDistributedChildren(nsIContent* aContent)
-{
-  if (!aContent || !nsDocument::IsWebComponentsEnabled(aContent)) {
-    return false;
-  }
-
-  if (aContent->GetShadowRoot()) {
-    // Children of a shadow root host are distributed
-    // to content insertion points in the shadow root.
-    return true;
-  }
-
-  HTMLSlotElement* slotEl = HTMLSlotElement::FromContent(aContent);
-  if (slotEl && slotEl->GetContainingShadow()) {
-    // Children of a slot are rendered if the slot does not have any assigned
-    // nodes (fallback content).
-    return slotEl->AssignedNodes().IsEmpty();
-  }
-
-  return false;
-}
-
-// static
-bool
 nsContentUtils::IsForbiddenRequestHeader(const nsACString& aHeader)
 {
   if (IsForbiddenSystemRequestHeader(aHeader)) {
     return true;
   }
 
   return StringBeginsWith(aHeader, NS_LITERAL_CSTRING("proxy-"),
                           nsCaseInsensitiveCStringComparator()) ||
--- a/dom/base/nsContentUtils.h
+++ b/dom/base/nsContentUtils.h
@@ -2695,22 +2695,16 @@ public:
   /**
    * Returns a LogModule that dump calls from content script are logged to.
    * This can be enabled with the 'Dump' module, and is useful for synchronizing
    * content JS to other logging modules.
    */
   static mozilla::LogModule* DOMDumpLog();
 
   /**
-   * Returns whether the children of the provided content are
-   * nodes that are distributed to Shadow DOM insertion points.
-   */
-  static bool HasDistributedChildren(nsIContent* aContent);
-
-  /**
    * Returns whether a given header is forbidden for an XHR or fetch
    * request.
    */
   static bool IsForbiddenRequestHeader(const nsACString& aHeader);
 
   /**
    * Returns whether a given header is forbidden for a system XHR
    * request.
--- a/dom/base/nsGlobalWindowInner.cpp
+++ b/dom/base/nsGlobalWindowInner.cpp
@@ -2113,16 +2113,20 @@ nsGlobalWindowInner::PostHandleEvent(Eve
       // Most of the time we could get a pres context to pass in here,
       // but not always (i.e. if this window is not shown there won't
       // be a pres context available). Since we're not firing a GUI
       // event we don't need a pres context anyway so we just pass
       // null as the pres context all the time here.
       EventDispatcher::Dispatch(element, nullptr, &event, nullptr, &status);
     }
 
+    if (mVREventObserver) {
+      mVREventObserver->NotifyAfterLoad();
+    }
+
     uint32_t autoActivateVRDisplayID = 0;
     nsGlobalWindowOuter* outer = GetOuterWindowInternal();
     if (outer) {
       autoActivateVRDisplayID = outer->GetAutoActivateVRDisplayID();
     }
     if (autoActivateVRDisplayID) {
       DispatchVRDisplayActivate(autoActivateVRDisplayID,
                                 VRDisplayEventReason::Navigation);
@@ -7014,16 +7018,19 @@ nsGlobalWindowInner::NotifyActiveVRDispl
     mNavigator->NotifyActiveVRDisplaysChanged();
   }
 }
 
 void
 nsGlobalWindowInner::DispatchVRDisplayActivate(uint32_t aDisplayID,
                                                mozilla::dom::VRDisplayEventReason aReason)
 {
+  // Ensure that our list of displays is up to date
+  VRDisplay::UpdateVRDisplays(mVRDisplays, this);
+
   // Search for the display identified with aDisplayID and fire the
   // event if found.
   for (const auto& display : mVRDisplays) {
     if (display->DisplayId() == aDisplayID) {
       if (aReason != VRDisplayEventReason::Navigation &&
           display->IsAnyPresenting(gfx::kVRGroupContent)) {
         // We only want to trigger this event if nobody is presenting to the
         // display already or when a page is loaded by navigating away
@@ -7058,16 +7065,19 @@ nsGlobalWindowInner::DispatchVRDisplayAc
     }
   }
 }
 
 void
 nsGlobalWindowInner::DispatchVRDisplayDeactivate(uint32_t aDisplayID,
                                                  mozilla::dom::VRDisplayEventReason aReason)
 {
+  // Ensure that our list of displays is up to date
+  VRDisplay::UpdateVRDisplays(mVRDisplays, this);
+
   // Search for the display identified with aDisplayID and fire the
   // event if found.
   for (const auto& display : mVRDisplays) {
     if (display->DisplayId() == aDisplayID && display->IsPresenting()) {
       // We only want to trigger this event to content that is presenting to
       // the display already.
 
       VRDisplayEventInit init;
@@ -7088,16 +7098,19 @@ nsGlobalWindowInner::DispatchVRDisplayDe
       return;
     }
   }
 }
 
 void
 nsGlobalWindowInner::DispatchVRDisplayConnect(uint32_t aDisplayID)
 {
+  // Ensure that our list of displays is up to date
+  VRDisplay::UpdateVRDisplays(mVRDisplays, this);
+
   // Search for the display identified with aDisplayID and fire the
   // event if found.
   for (const auto& display : mVRDisplays) {
     if (display->DisplayId() == aDisplayID) {
       // Fire event even if not presenting to the display.
       VRDisplayEventInit init;
       init.mBubbles = false;
       init.mCancelable = false;
@@ -7116,16 +7129,19 @@ nsGlobalWindowInner::DispatchVRDisplayCo
       return;
     }
   }
 }
 
 void
 nsGlobalWindowInner::DispatchVRDisplayDisconnect(uint32_t aDisplayID)
 {
+  // Ensure that our list of displays is up to date
+  VRDisplay::UpdateVRDisplays(mVRDisplays, this);
+
   // Search for the display identified with aDisplayID and fire the
   // event if found.
   for (const auto& display : mVRDisplays) {
     if (display->DisplayId() == aDisplayID) {
       // Fire event even if not presenting to the display.
       VRDisplayEventInit init;
       init.mBubbles = false;
       init.mCancelable = false;
@@ -7144,16 +7160,19 @@ nsGlobalWindowInner::DispatchVRDisplayDi
       return;
     }
   }
 }
 
 void
 nsGlobalWindowInner::DispatchVRDisplayPresentChange(uint32_t aDisplayID)
 {
+  // Ensure that our list of displays is up to date
+  VRDisplay::UpdateVRDisplays(mVRDisplays, this);
+
   // Search for the display identified with aDisplayID and fire the
   // event if found.
   for (const auto& display : mVRDisplays) {
     if (display->DisplayId() == aDisplayID) {
       // Fire event even if not presenting to the display.
       VRDisplayEventInit init;
       init.mBubbles = false;
       init.mCancelable = false;
--- a/dom/base/nsMappedAttributes.cpp
+++ b/dom/base/nsMappedAttributes.cpp
@@ -355,19 +355,19 @@ nsMappedAttributes::SizeOfIncludingThis(
   size_t n = aMallocSizeOf(this);
   for (uint16_t i = 0; i < mAttrCount; ++i) {
     n += Attrs()[i].mValue.SizeOfExcludingThis(aMallocSizeOf);
   }
   return n;
 }
 
 void
-nsMappedAttributes::LazilyResolveServoDeclaration(nsPresContext* aContext)
+nsMappedAttributes::LazilyResolveServoDeclaration(nsIDocument* aDoc)
 {
 
   MOZ_ASSERT(!mServoStyle,
              "LazilyResolveServoDeclaration should not be called if mServoStyle is already set");
   if (mRuleMapper) {
     mServoStyle = Servo_DeclarationBlock_CreateEmpty().Consume();
-    ServoSpecifiedValues servo = ServoSpecifiedValues(aContext, mServoStyle.get());
+    ServoSpecifiedValues servo = ServoSpecifiedValues(aDoc, mServoStyle.get());
     (*mRuleMapper)(this, &servo);
   }
 }
--- a/dom/base/nsMappedAttributes.h
+++ b/dom/base/nsMappedAttributes.h
@@ -70,17 +70,17 @@ public:
   // Remove the attr at position aPos.  The value of the attr is placed in
   // aValue; any value that was already in aValue is destroyed.
   void RemoveAttrAt(uint32_t aPos, nsAttrValue& aValue);
   const nsAttrName* GetExistingAttrNameFromQName(const nsAString& aName) const;
   int32_t IndexOfAttr(nsAtom* aLocalName) const;
 
   // Apply the contained mapper to the contained set of servo rules,
   // unless the servo rules have already been initialized.
-  void LazilyResolveServoDeclaration(nsPresContext* aPresContext);
+  void LazilyResolveServoDeclaration(nsIDocument* aDocument);
 
   // Obtain the contained servo declaration block
   // May return null if called before the inner block
   // has been (lazily) resolved
   const RefPtr<RawServoDeclarationBlock>& GetServoStyle() const
   {
     return mServoStyle;
   }
--- a/dom/html/HTMLBodyElement.cpp
+++ b/dom/html/HTMLBodyElement.cpp
@@ -162,17 +162,17 @@ HTMLBodyElement::MapAttributesIntoRule(c
         }
         aData->SetPixelValueIfUnset(eCSSProperty_margin_right, (float)bodyRightMargin);
       }
     }
 
     // if marginwidth or marginheight is set in the <frame> and not set in the <body>
     // reflect them as margin in the <body>
     if (bodyMarginWidth == -1 || bodyMarginHeight == -1) {
-      nsCOMPtr<nsIDocShell> docShell(aData->mPresContext->GetDocShell());
+      nsCOMPtr<nsIDocShell> docShell(aData->Document()->GetDocShell());
       if (docShell) {
         nscoord frameMarginWidth=-1;  // default value
         nscoord frameMarginHeight=-1; // default value
         docShell->GetMarginWidth(&frameMarginWidth); // -1 indicates not set
         docShell->GetMarginHeight(&frameMarginHeight);
 
         if (bodyMarginWidth == -1 && frameMarginWidth >= 0) {
           if (bodyLeftMargin == -1) {
@@ -192,51 +192,45 @@ HTMLBodyElement::MapAttributesIntoRule(c
           }
         }
       }
     }
   }
 
   if (aData->ShouldComputeStyleStruct(NS_STYLE_INHERIT_BIT(Display))) {
     // When display if first asked for, go ahead and get our colors set up.
-    nsIPresShell *presShell = aData->PresContext()->GetPresShell();
-    if (presShell) {
-      nsIDocument *doc = presShell->GetDocument();
-      if (doc) {
-        nsHTMLStyleSheet* styleSheet = doc->GetAttributeStyleSheet();
-        if (styleSheet) {
-          const nsAttrValue* value;
-          nscolor color;
-          value = aAttributes->GetAttr(nsGkAtoms::link);
-          if (value && value->GetColorValue(color)) {
-            styleSheet->SetLinkColor(color);
-          }
+    if (nsHTMLStyleSheet* styleSheet = aData->Document()->GetAttributeStyleSheet()) {
+      const nsAttrValue* value;
+      nscolor color;
+      value = aAttributes->GetAttr(nsGkAtoms::link);
+      if (value && value->GetColorValue(color)) {
+        styleSheet->SetLinkColor(color);
+      }
 
-          value = aAttributes->GetAttr(nsGkAtoms::alink);
-          if (value && value->GetColorValue(color)) {
-            styleSheet->SetActiveLinkColor(color);
-          }
+      value = aAttributes->GetAttr(nsGkAtoms::alink);
+      if (value && value->GetColorValue(color)) {
+        styleSheet->SetActiveLinkColor(color);
+      }
 
-          value = aAttributes->GetAttr(nsGkAtoms::vlink);
-          if (value && value->GetColorValue(color)) {
-            styleSheet->SetVisitedLinkColor(color);
-          }
-        }
+      value = aAttributes->GetAttr(nsGkAtoms::vlink);
+      if (value && value->GetColorValue(color)) {
+        styleSheet->SetVisitedLinkColor(color);
       }
     }
   }
 
   if (aData->ShouldComputeStyleStruct(NS_STYLE_INHERIT_BIT(Color))) {
     if (!aData->PropertyIsSet(eCSSProperty_color) &&
-        aData->PresContext()->UseDocumentColors()) {
+        !aData->ShouldIgnoreColors()) {
       // color: color
       nscolor color;
       const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::text);
-      if (value && value->GetColorValue(color))
+      if (value && value->GetColorValue(color)) {
         aData->SetColorValue(eCSSProperty_color, color);
+      }
     }
   }
 
   nsGenericHTMLElement::MapBackgroundAttributesInto(aAttributes, aData);
   nsGenericHTMLElement::MapCommonAttributesInto(aAttributes, aData);
 }
 
 nsMapRuleToAttributesFunc
--- a/dom/html/HTMLFontElement.cpp
+++ b/dom/html/HTMLFontElement.cpp
@@ -71,27 +71,27 @@ HTMLFontElement::MapAttributesIntoRule(c
     if (!aData->PropertyIsSet(eCSSProperty_font_size)) {
       const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::size);
       if (value && value->Type() == nsAttrValue::eInteger)
         aData->SetKeywordValue(eCSSProperty_font_size, value->GetIntegerValue());
     }
   }
   if (aData->ShouldComputeStyleStruct(NS_STYLE_INHERIT_BIT(Color))) {
     if (!aData->PropertyIsSet(eCSSProperty_color) &&
-        aData->PresContext()->UseDocumentColors()) {
+        !aData->ShouldIgnoreColors()) {
       // color: color
       const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::color);
       nscolor color;
       if (value && value->GetColorValue(color)) {
         aData->SetColorValue(eCSSProperty_color, color);
       }
     }
   }
   if (aData->ShouldComputeStyleStruct(NS_STYLE_INHERIT_BIT(TextReset)) &&
-      aData->PresContext()->CompatibilityMode() == eCompatibility_NavQuirks) {
+      aData->Document()->GetCompatibilityMode() == eCompatibility_NavQuirks) {
     // Make <a><font color="red">text</font></a> give the text a red underline
     // in quirks mode.  The NS_STYLE_TEXT_DECORATION_LINE_OVERRIDE_ALL flag only
     // affects quirks mode rendering.
     const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::color);
     nscolor color;
     if (value && value->GetColorValue(color)) {
       aData->SetTextDecorationColorOverride();
     }
--- a/dom/html/HTMLHRElement.cpp
+++ b/dom/html/HTMLHRElement.cpp
@@ -164,18 +164,17 @@ HTMLHRElement::MapAttributesIntoRule(con
            *props != eCSSProperty_UNKNOWN; ++props) {
         aData->SetPixelValueIfUnset(*props, 10000.0f);
       }
     }
   }
   if (aData->ShouldComputeStyleStruct(NS_STYLE_INHERIT_BIT(Color))) {
     // color: a color
     // (we got the color attribute earlier)
-    if (colorIsSet &&
-        aData->PresContext()->UseDocumentColors()) {
+    if (colorIsSet && !aData->ShouldIgnoreColors()) {
       aData->SetColorValueIfUnset(eCSSProperty_color, color);
     }
   }
 
   nsGenericHTMLElement::MapWidthAttributeInto(aAttributes, aData);
   nsGenericHTMLElement::MapCommonAttributesInto(aAttributes, aData);
 }
 
--- a/dom/html/HTMLTableCellElement.cpp
+++ b/dom/html/HTMLTableCellElement.cpp
@@ -232,17 +232,17 @@ HTMLTableCellElement::MapAttributesIntoR
     }
   }
   if (aData->ShouldComputeStyleStruct(NS_STYLE_INHERIT_BIT(Text))) {
     if (!aData->PropertyIsSet(eCSSProperty_white_space)) {
       // nowrap: enum
       if (aAttributes->GetAttr(nsGkAtoms::nowrap)) {
         // See if our width is not a nonzero integer width.
         const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::width);
-        nsCompatibility mode = aData->PresContext()->CompatibilityMode();
+        nsCompatibility mode = aData->Document()->GetCompatibilityMode();
         if (!value || value->Type() != nsAttrValue::eInteger ||
             value->GetIntegerValue() == 0 ||
             eCompatibility_NavQuirks != mode) {
           aData->SetKeywordValue(eCSSProperty_white_space, StyleWhiteSpace::Nowrap);
         }
       }
     }
   }
--- a/dom/html/HTMLTableElement.cpp
+++ b/dom/html/HTMLTableElement.cpp
@@ -947,18 +947,17 @@ HTMLTableElement::MapAttributesIntoRule(
   // table cells.  (nsHTMLTableCellElement overrides
   // WalkContentStyleRules so that this happens.)  This violates the
   // nsIStyleRule contract, since it's the same style rule object doing
   // the mapping in two different ways.  It's also incorrect since it's
   // testing the display type of the style context rather than checking
   // which *element* it's matching (style rules should not stop matching
   // when the display type is changed).
 
-  nsPresContext* presContext = aData->PresContext();
-  nsCompatibility mode = presContext->CompatibilityMode();
+  nsCompatibility mode = aData->Document()->GetCompatibilityMode();
 
   if (aData->ShouldComputeStyleStruct(NS_STYLE_INHERIT_BIT(TableBorder))) {
     // cellspacing
     const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::cellspacing);
     if (value && value->Type() == nsAttrValue::eInteger &&
         !aData->PropertyIsSet(eCSSProperty_border_spacing)) {
       aData->SetPixelValue(eCSSProperty_border_spacing, float(value->GetIntegerValue()));
     }
@@ -994,18 +993,17 @@ HTMLTableElement::MapAttributesIntoRule(
         aData->SetPixelValueIfUnset(eCSSProperty_margin_bottom, (float)value->GetIntegerValue());
       }
     }
   }
   if (aData->ShouldComputeStyleStruct(NS_STYLE_INHERIT_BIT(Border))) {
     // bordercolor
     const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::bordercolor);
     nscolor color;
-    if (value && presContext->UseDocumentColors() &&
-        value->GetColorValue(color)) {
+    if (value && !aData->ShouldIgnoreColors() && value->GetColorValue(color)) {
       aData->SetColorValueIfUnset(eCSSProperty_border_top_color, color);
       aData->SetColorValueIfUnset(eCSSProperty_border_left_color, color);
       aData->SetColorValueIfUnset(eCSSProperty_border_bottom_color, color);
       aData->SetColorValueIfUnset(eCSSProperty_border_right_color, color);
     }
 
     // border
     const nsAttrValue* borderValue = aAttributes->GetAttr(nsGkAtoms::border);
--- a/dom/html/nsGenericHTMLElement.cpp
+++ b/dom/html/nsGenericHTMLElement.cpp
@@ -1539,17 +1539,17 @@ void
 nsGenericHTMLElement::MapBackgroundInto(const nsMappedAttributes* aAttributes,
                                         GenericSpecifiedValues* aData)
 {
 
   if (!aData->ShouldComputeStyleStruct(NS_STYLE_INHERIT_BIT(Background)))
     return;
 
   if (!aData->PropertyIsSet(eCSSProperty_background_image) &&
-      aData->PresContext()->UseDocumentColors()) {
+      !aData->ShouldIgnoreColors()) {
     // background
     nsAttrValue* value =
       const_cast<nsAttrValue*>(aAttributes->GetAttr(nsGkAtoms::background));
     if (value) {
       aData->SetBackgroundImage(*value);
     }
   }
 }
@@ -1557,17 +1557,17 @@ nsGenericHTMLElement::MapBackgroundInto(
 void
 nsGenericHTMLElement::MapBGColorInto(const nsMappedAttributes* aAttributes,
                                      GenericSpecifiedValues* aData)
 {
   if (!aData->ShouldComputeStyleStruct(NS_STYLE_INHERIT_BIT(Background)))
     return;
 
   if (!aData->PropertyIsSet(eCSSProperty_background_color) &&
-      aData->PresContext()->UseDocumentColors()) {
+      !aData->ShouldIgnoreColors()) {
     const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::bgcolor);
     nscolor color;
     if (value && value->GetColorValue(color)) {
       aData->SetColorValue(eCSSProperty_background_color, color);
     }
   }
 }
 
--- a/dom/mathml/nsMathMLElement.cpp
+++ b/dom/mathml/nsMathMLElement.cpp
@@ -523,17 +523,17 @@ nsMathMLElement::MapMathMLAttributesInto
         nsresult errorCode;
         float floatValue = str.ToFloat(&errorCode);
         // Negative scriptsizemultipliers are not parsed
         if (NS_SUCCEEDED(errorCode) && floatValue >= 0.0f) {
           aData->SetNumberValue(eCSSProperty__moz_script_size_multiplier, floatValue);
         } else {
           ReportParseErrorNoTag(str,
                                 nsGkAtoms::scriptsizemultiplier_,
-                                aData->mPresContext->Document());
+                                aData->Document());
         }
       }
     }
 
     // scriptminsize
     //
     // "Specifies the minimum font size allowed due to changes in scriptlevel.
     // Note that this does not limit the font size due to changes to mathsize."
@@ -545,17 +545,17 @@ nsMathMLElement::MapMathMLAttributesInto
     // Unitless and percent values give a multiple of the default value.
     //
     value = aAttributes->GetAttr(nsGkAtoms::scriptminsize_);
     if (value && value->Type() == nsAttrValue::eString &&
         !aData->PropertyIsSet(eCSSProperty__moz_script_min_size)) {
       nsCSSValue scriptMinSize;
       ParseNumericValue(value->GetStringValue(), scriptMinSize,
                         PARSE_ALLOW_UNITLESS | CONVERT_UNITLESS_TO_PERCENT,
-                        aData->mPresContext->Document());
+                        aData->Document());
 
       if (scriptMinSize.GetUnit() == eCSSUnit_Percent) {
         scriptMinSize.SetFloatValue(8.0 * scriptMinSize.GetPercentValue(),
                                      eCSSUnit_Point);
       }
       if (scriptMinSize.GetUnit() != eCSSUnit_Null) {
         aData->SetLengthValue(eCSSProperty__moz_script_min_size, scriptMinSize);
       }
@@ -589,17 +589,17 @@ nsMathMLElement::MapMathMLAttributesInto
           if (ch == '+' || ch == '-') {
             aData->SetIntValue(eCSSProperty__moz_script_level, intValue);
           } else {
             aData->SetNumberValue(eCSSProperty__moz_script_level, intValue);
           }
         } else {
           ReportParseErrorNoTag(str,
                                 nsGkAtoms::scriptlevel_,
-                                aData->mPresContext->Document());
+                                aData->Document());
         }
       }
     }
 
     // mathsize
     //
     // "Specifies the size to display the token content. The values 'small' and
     // 'big' choose a size smaller or larger than the current font size, but
@@ -623,17 +623,17 @@ nsMathMLElement::MapMathMLAttributesInto
     bool parseSizeKeywords = true;
     value = aAttributes->GetAttr(nsGkAtoms::mathsize_);
     if (!value) {
       parseSizeKeywords = false;
       value = aAttributes->GetAttr(nsGkAtoms::fontsize_);
       if (value) {
         WarnDeprecated(nsGkAtoms::fontsize_->GetUTF16String(),
                        nsGkAtoms::mathsize_->GetUTF16String(),
-                       aData->mPresContext->Document());
+                       aData->Document());
       }
     }
     if (value && value->Type() == nsAttrValue::eString &&
         !aData->PropertyIsSet(eCSSProperty_font_size)) {
       nsAutoString str(value->GetStringValue());
       nsCSSValue fontSize;
       if (!ParseNumericValue(str, fontSize, PARSE_SUPPRESS_WARNINGS |
                              PARSE_ALLOW_UNITLESS | CONVERT_UNITLESS_TO_PERCENT,
@@ -666,17 +666,17 @@ nsMathMLElement::MapMathMLAttributesInto
     // CSS for more information. Deprecated in favor of mathvariant."
     //
     // values: string
     //
     value = aAttributes->GetAttr(nsGkAtoms::fontfamily_);
     if (value) {
       WarnDeprecated(nsGkAtoms::fontfamily_->GetUTF16String(),
                      nsGkAtoms::mathvariant_->GetUTF16String(),
-                     aData->mPresContext->Document());
+                     aData->Document());
     }
     if (value && value->Type() == nsAttrValue::eString &&
         !aData->PropertyIsSet(eCSSProperty_font_family)) {
       aData->SetFontFamily(value->GetStringValue());
     }
 
     // fontstyle
     //
@@ -687,17 +687,17 @@ nsMathMLElement::MapMathMLAttributesInto
     // default:	normal (except on <mi>)
     //
     // Note that the font-style property is reset in layout/style/ when
     // -moz-math-variant is specified.
     value = aAttributes->GetAttr(nsGkAtoms::fontstyle_);
     if (value) {
       WarnDeprecated(nsGkAtoms::fontstyle_->GetUTF16String(),
                        nsGkAtoms::mathvariant_->GetUTF16String(),
-                       aData->mPresContext->Document());
+                       aData->Document());
       if (value->Type() == nsAttrValue::eString &&
           !aData->PropertyIsSet(eCSSProperty_font_style)) {
         nsAutoString str(value->GetStringValue());
         str.CompressWhitespace();
         if (str.EqualsASCII("normal")) {
           aData->SetKeywordValue(eCSSProperty_font_style,
                                  NS_STYLE_FONT_STYLE_NORMAL);
         } else if (str.EqualsASCII("italic")) {
@@ -716,17 +716,17 @@ nsMathMLElement::MapMathMLAttributesInto
     // default: normal
     //
     // Note that the font-weight property is reset in layout/style/ when
     // -moz-math-variant is specified.
     value = aAttributes->GetAttr(nsGkAtoms::fontweight_);
     if (value) {
       WarnDeprecated(nsGkAtoms::fontweight_->GetUTF16String(),
                        nsGkAtoms::mathvariant_->GetUTF16String(),
-                       aData->mPresContext->Document());
+                       aData->Document());
       if (value->Type() == nsAttrValue::eString &&
           !aData->PropertyIsSet(eCSSProperty_font_weight)) {
         nsAutoString str(value->GetStringValue());
         str.CompressWhitespace();
         if (str.EqualsASCII("normal")) {
           aData->SetKeywordValue(eCSSProperty_font_weight,
                                  NS_STYLE_FONT_WEIGHT_NORMAL);
         } else if (str.EqualsASCII("bold")) {
@@ -801,17 +801,17 @@ nsMathMLElement::MapMathMLAttributesInto
   if (aData->mSIDs & NS_STYLE_INHERIT_BIT(Background)) {
     const nsAttrValue* value =
       aAttributes->GetAttr(nsGkAtoms::mathbackground_);
     if (!value) {
       value = aAttributes->GetAttr(nsGkAtoms::background);
       if (value) {
         WarnDeprecated(nsGkAtoms::background->GetUTF16String(),
                        nsGkAtoms::mathbackground_->GetUTF16String(),
-                       aData->mPresContext->Document());
+                       aData->Document());
       }
     }
     if (value) {
       nscolor color;
       if (value->GetColorValue(color)) {
         aData->SetColorValueIfUnset(eCSSProperty_background_color, color);
       }
     }
@@ -836,17 +836,17 @@ nsMathMLElement::MapMathMLAttributesInto
   //
   if (aData->mSIDs & NS_STYLE_INHERIT_BIT(Color)) {
     const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::mathcolor_);
     if (!value) {
       value = aAttributes->GetAttr(nsGkAtoms::color);
       if (value) {
         WarnDeprecated(nsGkAtoms::color->GetUTF16String(),
                        nsGkAtoms::mathcolor_->GetUTF16String(),
-                       aData->mPresContext->Document());
+                       aData->Document());
       }
     }
     nscolor color;
     if (value && value->GetColorValue(color)) {
       aData->SetColorValueIfUnset(eCSSProperty_color, color);
     }
   }
 
@@ -863,18 +863,17 @@ nsMathMLElement::MapMathMLAttributesInto
     // values: "auto" | length
     // default: auto
     //
     if (!aData->PropertyIsSet(eCSSProperty_width)) {
       const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::width);
       nsCSSValue width;
       // This does not handle auto and unitless values
       if (value && value->Type() == nsAttrValue::eString) {
-        ParseNumericValue(value->GetStringValue(), width, 0,
-                          aData->mPresContext->Document());
+        ParseNumericValue(value->GetStringValue(), width, 0, aData->Document());
         if (width.GetUnit() == eCSSUnit_Percent) {
           aData->SetPercentValue(eCSSProperty_width,
                                  width.GetPercentValue());
         } else if (width.GetUnit() != eCSSUnit_Null) {
           aData->SetLengthValue(eCSSProperty_width, width);
         }
       }
     }
--- a/dom/media/MediaCache.cpp
+++ b/dom/media/MediaCache.cpp
@@ -467,16 +467,26 @@ protected:
   // A list of resource IDs to notify about the change in suspended status.
   nsTArray<int64_t> mSuspendedStatusToNotify;
   // The thread on which we will run data callbacks from the channels.
   // Note this thread is shared among all MediaCache instances.
   static StaticRefPtr<nsIThread> sThread;
   // True if we've tried to init sThread. Note we try once only so it is safe
   // to access sThread on all threads.
   static bool sThreadInit;
+
+private:
+  // Used by MediaCacheStream::GetDebugInfo() only for debugging.
+  // Don't add new callers to this function.
+  friend nsCString MediaCacheStream::GetDebugInfo();
+  mozilla::Monitor& GetMonitorOnTheMainThread()
+  {
+    MOZ_DIAGNOSTIC_ASSERT(NS_IsMainThread());
+    return mMonitor;
+  }
 };
 
 // Initialized to nullptr by non-local static initialization.
 /* static */ MediaCache* MediaCache::gMediaCache;
 
 /* static */ StaticRefPtr<nsIThread> MediaCache::sThread;
 /* static */ bool MediaCache::sThreadInit = false;
 
@@ -2979,17 +2989,17 @@ MediaCacheStream::GetDownloadRate(bool* 
   MOZ_ASSERT(!NS_IsMainThread());
   AutoLock lock(mMediaCache->Monitor());
   return mDownloadStatistics.GetRate(aIsReliable);
 }
 
 nsCString
 MediaCacheStream::GetDebugInfo()
 {
-  AutoLock lock(mMediaCache->Monitor());
+  AutoLock lock(mMediaCache->GetMonitorOnTheMainThread());
   return nsPrintfCString("mStreamLength=%" PRId64 " mChannelOffset=%" PRId64
                          " mCacheSuspended=%d mChannelEnded=%d mLoadID=%u",
                          mStreamLength,
                          mChannelOffset,
                          mCacheSuspended,
                          mChannelEnded,
                          mLoadID);
 }
--- a/dom/media/MediaStreamGraph.cpp
+++ b/dom/media/MediaStreamGraph.cpp
@@ -25,19 +25,16 @@
 #include "MediaStreamVideoSink.h"
 #include "mozilla/dom/BaseAudioContextBinding.h"
 #include "mozilla/media/MediaUtils.h"
 #include <algorithm>
 #include "GeckoProfiler.h"
 #include "VideoFrameContainer.h"
 #include "mozilla/AbstractThread.h"
 #include "mozilla/Unused.h"
-#ifdef MOZ_WEBRTC
-#include "AudioOutputObserver.h"
-#endif
 #include "mtransport/runnable_utils.h"
 #include "VideoUtils.h"
 
 #include "webaudio/blink/DenormalDisabler.h"
 #include "webaudio/blink/HRTFDatabaseLoader.h"
 
 using namespace mozilla::layers;
 using namespace mozilla::dom;
@@ -3564,19 +3561,16 @@ MediaStreamGraphImpl::MediaStreamGraphIm
   , mDetectedNotRunning(false)
   , mPostedRunInStableState(false)
   , mRealtime(aDriverRequested != OFFLINE_THREAD_DRIVER)
   , mNonRealtimeProcessing(false)
   , mStreamOrderDirty(false)
   , mLatencyLog(AsyncLatencyLogger::Get())
   , mAbstractMainThread(aMainThread)
   , mThreadPool(GetMediaThreadPool(MediaThreadType::MSG_CONTROL))
-#ifdef MOZ_WEBRTC
-  , mFarendObserverRef(nullptr)
-#endif
   , mSelfRef(this)
   , mOutputChannels(std::min<uint32_t>(8, CubebUtils::MaxNumberOfChannels()))
 #ifdef DEBUG
   , mCanRunMessagesSynchronously(false)
 #endif
 {
   if (mRealtime) {
     if (aDriverRequested == AUDIO_THREAD_DRIVER) {
--- a/dom/media/MediaStreamGraphImpl.h
+++ b/dom/media/MediaStreamGraphImpl.h
@@ -27,19 +27,16 @@
 namespace mozilla {
 
 namespace media {
 class ShutdownTicket;
 }
 
 template <typename T>
 class LinkedList;
-#ifdef MOZ_WEBRTC
-class AudioOutputObserver;
-#endif
 
 /**
  * A per-stream update message passed from the media graph thread to the
  * main thread.
  */
 struct StreamUpdate
 {
   RefPtr<MediaStream> mStream;
@@ -813,19 +810,16 @@ public:
   bool mStreamOrderDirty;
   /**
    * Hold a ref to the Latency logger
    */
   RefPtr<AsyncLatencyLogger> mLatencyLog;
   AudioMixer mMixer;
   const RefPtr<AbstractThread> mAbstractMainThread;
   RefPtr<SharedThreadPool> mThreadPool;
-#ifdef MOZ_WEBRTC
-  RefPtr<AudioOutputObserver> mFarendObserverRef;
-#endif
 
   // used to limit graph shutdown time
   // Only accessed on the main thread.
   nsCOMPtr<nsITimer> mShutdownTimer;
 
 private:
   virtual ~MediaStreamGraphImpl();
 
--- a/dom/media/TrackUnionStream.cpp
+++ b/dom/media/TrackUnionStream.cpp
@@ -1,9 +1,8 @@
-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this file,
  * You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #include "MediaStreamGraphImpl.h"
 #include "MediaStreamListener.h"
 #include "mozilla/MathAlgorithms.h"
 #include "mozilla/Unused.h"
@@ -24,19 +23,16 @@
 #include "AudioChannelService.h"
 #include "AudioNodeEngine.h"
 #include "AudioNodeStream.h"
 #include "AudioNodeExternalInputStream.h"
 #include "webaudio/MediaStreamAudioDestinationNode.h"
 #include <algorithm>
 #include "DOMMediaStream.h"
 #include "GeckoProfiler.h"
-#ifdef MOZ_WEBRTC
-#include "AudioOutputObserver.h"
-#endif
 
 using namespace mozilla::layers;
 using namespace mozilla::dom;
 using namespace mozilla::gfx;
 
 namespace mozilla {
 
 #ifdef STREAM_LOG
--- a/dom/media/test/mochitest.ini
+++ b/dom/media/test/mochitest.ini
@@ -858,17 +858,17 @@ skip-if = android_version == '17' # andr
 tags=msg
 [test_mediarecorder_fires_start_event_once_when_erroring.html]
 skip-if = android_version == '17' # android(bug 1232305)
 tags=msg
 [test_mediarecorder_getencodeddata.html]
 skip-if = android_version == '17' # android(bug 1232305)
 tags=msg
 [test_mediarecorder_pause_resume_video.html]
-skip-if = toolkit == 'android' || debug # android(bug 1232305), debug Bug 1403307
+skip-if = toolkit == 'android' || debug || (os == 'linux' && bits == 64) # android(bug 1232305), debug/linux Bug 1403307
 [test_mediarecorder_playback_can_repeat.html]
 skip-if = android_version == '17' || android_version == '22' # android(bug 1232305, bug 1372457)
 tags=msg
 [test_mediarecorder_principals.html]
 skip-if = (os == 'linux' && bits == 64) || toolkit == 'android' # See bug 1266345, android(bug 1232305)
 tags=msg
 [test_mediarecorder_record_4ch_audiocontext.html]
 skip-if = android_version == '17' # android(bug 1232305)
deleted file mode 100644
--- a/dom/media/webrtc/AudioOutputObserver.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/* 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/. */
-
-#ifndef AUDIOOUTPUTOBSERVER_H_
-#define AUDIOOUTPUTOBSERVER_H_
-
-#include "mozilla/StaticPtr.h"
-#include "nsAutoPtr.h"
-#include "AudioMixer.h"
-#include "MediaData.h"
-
-namespace webrtc {
-class SingleRwFifo;
-}
-
-namespace mozilla {
-
-typedef struct FarEndAudioChunk_ {
-  size_t mSamples;
-  bool mOverrun;
-  AudioDataValue mData[1]; // variable-length
-} FarEndAudioChunk;
-
-// This class is used to packetize and send the mixed audio from an MSG, in
-// float, to the AEC module of WebRTC.org.
-class AudioOutputObserver
-{
-public:
-  AudioOutputObserver();
-
-  NS_INLINE_DECL_THREADSAFE_REFCOUNTING(AudioOutputObserver);
-
-  void Clear();
-  void InsertFarEnd(const AudioDataValue *aBuffer, uint32_t aFrames, bool aOverran,
-                    int aFreq, int aChannels);
-  uint32_t PlayoutFrequency() { return mPlayoutFreq; }
-  uint32_t PlayoutChannels() { return mPlayoutChannels; }
-
-  FarEndAudioChunk *Pop();
-  uint32_t Size();
-
-private:
-  virtual ~AudioOutputObserver();
-  uint32_t mPlayoutFreq;
-  uint32_t mPlayoutChannels;
-
-  nsAutoPtr<webrtc::SingleRwFifo> mPlayoutFifo;
-  uint32_t mChunkSize;
-
-  // chunking to 10ms support
-  FarEndAudioChunk *mSaved; // can't be nsAutoPtr since we need to use free(), not delete
-  uint32_t mSamplesSaved;
-  AlignedAudioBuffer mDownmixBuffer;
-};
-
-extern StaticRefPtr<AudioOutputObserver> gFarendObserver;
-
-}
-
-#endif
--- a/dom/media/webrtc/MediaEngineWebRTC.h
+++ b/dom/media/webrtc/MediaEngineWebRTC.h
@@ -54,17 +54,16 @@
 // Video Engine
 // conflicts with #include of scoped_ptr.h
 #undef FF
 
 // WebRTC imports
 #include "webrtc/modules/video_capture/video_capture_defines.h"
 
 #include "NullTransport.h"
-#include "AudioOutputObserver.h"
 
 namespace mozilla {
 
 class MediaEngineWebRTCAudioCaptureSource : public MediaEngineAudioSource
 {
 public:
   NS_DECL_THREADSAFE_ISUPPORTS
 
@@ -517,21 +516,20 @@ private:
 
   RefPtr<mozilla::AudioInput> mAudioInput;
   RefPtr<WebRTCAudioDataListener> mListener;
 
   // Note: shared across all microphone sources
   static int sChannelsOpen;
 
   const UniquePtr<webrtc::AudioProcessing> mAudioProcessing;
-  const RefPtr<AudioOutputObserver> mAudioOutputObserver;
 
-  // accessed from the GraphDriver thread except for deletion
-  nsAutoPtr<AudioPacketizer<AudioDataValue, float>> mPacketizer;
-  ScopedCustomReleasePtr<webrtc::VoEExternalMedia> mVoERenderListener;
+  // accessed from the GraphDriver thread except for deletion.
+  nsAutoPtr<AudioPacketizer<AudioDataValue, float>> mPacketizerInput;
+  nsAutoPtr<AudioPacketizer<AudioDataValue, float>> mPacketizerOutput;
 
   // mMonitor protects mSources[] and mPrinicpalIds[] access/changes, and
   // transitions of mState from kStarted to kStopped (which are combined with
   // EndTrack()). mSources[] and mPrincipalHandles[] are accessed from webrtc
   // threads.
   Monitor mMonitor;
   nsTArray<RefPtr<SourceMediaStream>> mSources;
   nsTArray<PrincipalHandle> mPrincipalHandles; // Maps to mSources.
@@ -553,19 +551,22 @@ private:
   // because of prefs or constraints. This allows simply copying the audio into
   // the MSG, skipping resampling and the whole webrtc.org code.
   // This is read and written to only on the MSG thread.
   bool mSkipProcessing;
 
   // To only update microphone when needed, we keep track of previous settings.
   MediaEnginePrefs mLastPrefs;
 
+  // Stores the mixed audio output for the reverse-stream of the AEC.
+  AlignedFloatBuffer mOutputBuffer;
+
   AlignedFloatBuffer mInputBuffer;
   AlignedFloatBuffer mDeinterleavedBuffer;
-  AlignedAudioBuffer mInputDownmixBuffer;
+  AlignedFloatBuffer mInputDownmixBuffer;
 };
 
 class MediaEngineWebRTC : public MediaEngine
 {
   typedef MediaEngine Super;
 public:
   explicit MediaEngineWebRTC(MediaEnginePrefs& aPrefs);
 
--- a/dom/media/webrtc/MediaEngineWebRTCAudio.cpp
+++ b/dom/media/webrtc/MediaEngineWebRTCAudio.cpp
@@ -1,8 +1,9 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this file,
  * You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #include "MediaEngineWebRTC.h"
 #include <stdio.h>
 #include <algorithm>
 #include "mozilla/Assertions.h"
@@ -48,155 +49,26 @@ LogModule* AudioLogModule() {
 /**
  * Webrtc microphone source source.
  */
 NS_IMPL_ISUPPORTS0(MediaEngineWebRTCMicrophoneSource)
 NS_IMPL_ISUPPORTS0(MediaEngineWebRTCAudioCaptureSource)
 
 int MediaEngineWebRTCMicrophoneSource::sChannelsOpen = 0;
 
-AudioOutputObserver::AudioOutputObserver()
-  : mPlayoutFreq(0)
-  , mPlayoutChannels(0)
-  , mChunkSize(0)
-  , mSaved(nullptr)
-  , mSamplesSaved(0)
-  , mDownmixBuffer(MAX_SAMPLING_FREQ * MAX_CHANNELS / 100)
-{
-  // Buffers of 10ms chunks
-  mPlayoutFifo = new SingleRwFifo(MAX_AEC_FIFO_DEPTH/10);
-}
-
-AudioOutputObserver::~AudioOutputObserver()
-{
-  Clear();
-  free(mSaved);
-  mSaved = nullptr;
-}
-
-void
-AudioOutputObserver::Clear()
-{
-  while (mPlayoutFifo->size() > 0) {
-    free(mPlayoutFifo->Pop());
-  }
-  // we'd like to touch mSaved here, but we can't if we might still be getting callbacks
-}
-
-FarEndAudioChunk *
-AudioOutputObserver::Pop()
-{
-  return (FarEndAudioChunk *) mPlayoutFifo->Pop();
-}
-
-uint32_t
-AudioOutputObserver::Size()
-{
-  return mPlayoutFifo->size();
-}
-
-// static
-void
-AudioOutputObserver::InsertFarEnd(const AudioDataValue *aBuffer, uint32_t aFrames, bool aOverran,
-                                  int aFreq, int aChannels)
-{
-  // Prepare for downmix if needed
-  int channels = aChannels;
-  if (aChannels > MAX_CHANNELS) {
-    channels = MAX_CHANNELS;
-  }
-
-  if (mPlayoutChannels != 0) {
-    if (mPlayoutChannels != static_cast<uint32_t>(channels)) {
-      MOZ_CRASH();
-    }
-  } else {
-    MOZ_ASSERT(channels <= MAX_CHANNELS);
-    mPlayoutChannels = static_cast<uint32_t>(channels);
-  }
-  if (mPlayoutFreq != 0) {
-    if (mPlayoutFreq != static_cast<uint32_t>(aFreq)) {
-      MOZ_CRASH();
-    }
-  } else {
-    MOZ_ASSERT(aFreq <= MAX_SAMPLING_FREQ);
-    MOZ_ASSERT(!(aFreq % 100), "Sampling rate for far end data should be multiple of 100.");
-    mPlayoutFreq = aFreq;
-    mChunkSize = aFreq/100; // 10ms
-  }
-
-#ifdef LOG_FAREND_INSERTION
-  static FILE *fp = fopen("insertfarend.pcm","wb");
-#endif
-
-  if (mSaved) {
-    // flag overrun as soon as possible, and only once
-    mSaved->mOverrun = aOverran;
-    aOverran = false;
-  }
-  // Rechunk to 10ms.
-  // The AnalyzeReverseStream() and WebRtcAec_BufferFarend() functions insist on 10ms
-  // samples per call.  Annoying...
-  while (aFrames) {
-    if (!mSaved) {
-      mSaved = (FarEndAudioChunk *) moz_xmalloc(sizeof(FarEndAudioChunk) +
-                                                (mChunkSize * channels - 1)*sizeof(AudioDataValue));
-      mSaved->mSamples = mChunkSize;
-      mSaved->mOverrun = aOverran;
-      aOverran = false;
-    }
-    uint32_t to_copy = mChunkSize - mSamplesSaved;
-    if (to_copy > aFrames) {
-      to_copy = aFrames;
-    }
-
-    AudioDataValue* dest = &(mSaved->mData[mSamplesSaved * channels]);
-    if (aChannels > MAX_CHANNELS) {
-      AudioConverter converter(AudioConfig(aChannels, 0), AudioConfig(channels, 0));
-      converter.Process(mDownmixBuffer, aBuffer, to_copy);
-      ConvertAudioSamples(mDownmixBuffer.Data(), dest, to_copy * channels);
-    } else {
-      ConvertAudioSamples(aBuffer, dest, to_copy * channels);
-    }
-
-#ifdef LOG_FAREND_INSERTION
-    if (fp) {
-      fwrite(&(mSaved->mData[mSamplesSaved * aChannels]), to_copy * aChannels, sizeof(AudioDataValue), fp);
-    }
-#endif
-    aFrames -= to_copy;
-    mSamplesSaved += to_copy;
-    aBuffer += to_copy * aChannels;
-
-    if (mSamplesSaved >= mChunkSize) {
-      int free_slots = mPlayoutFifo->capacity() - mPlayoutFifo->size();
-      if (free_slots <= 0) {
-        // XXX We should flag an overrun for the reader.  We can't drop data from it due to
-        // thread safety issues.
-        break;
-      } else {
-        mPlayoutFifo->Push((int8_t *) mSaved); // takes ownership
-        mSaved = nullptr;
-        mSamplesSaved = 0;
-      }
-    }
-  }
-}
-
 MediaEngineWebRTCMicrophoneSource::MediaEngineWebRTCMicrophoneSource(
     mozilla::AudioInput* aAudioInput,
     int aIndex,
     const char* name,
     const char* uuid,
     bool aDelayAgnostic,
     bool aExtendedFilter)
   : MediaEngineAudioSource(kReleased)
   , mAudioInput(aAudioInput)
   , mAudioProcessing(AudioProcessing::Create())
-  , mAudioOutputObserver(new AudioOutputObserver())
   , mMonitor("WebRTCMic.Monitor")
   , mCapIndex(aIndex)
   , mDelayAgnostic(aDelayAgnostic)
   , mExtendedFilter(aExtendedFilter)
   , mTrackID(TRACK_NONE)
   , mStarted(false)
   , mSampleFrequency(MediaEngine::USE_GRAPH_RATE)
   , mTotalFrames(0)
@@ -628,18 +500,16 @@ MediaEngineWebRTCMicrophoneSource::Start
     return NS_OK;
   }
   mState = kStarted;
   mTrackID = aID;
 
   // Make sure logger starts before capture
   AsyncLatencyLogger::Get(true);
 
-  mAudioOutputObserver->Clear();
-
   mAudioInput->StartRecording(aStream, mListener);
 
   return NS_OK;
 }
 
 nsresult
 MediaEngineWebRTCMicrophoneSource::Stop(SourceMediaStream *aSource, TrackID aID)
 {
@@ -692,185 +562,181 @@ MediaEngineWebRTCMicrophoneSource::Notif
 
 void
 MediaEngineWebRTCMicrophoneSource::NotifyOutputData(MediaStreamGraph* aGraph,
                                                     AudioDataValue* aBuffer,
                                                     size_t aFrames,
                                                     TrackRate aRate,
                                                     uint32_t aChannels)
 {
-  if (!PassThrough()) {
-    mAudioOutputObserver->InsertFarEnd(aBuffer, aFrames, false,
-                                       aRate, aChannels);
+  if (!mPacketizerOutput ||
+      mPacketizerOutput->PacketSize() != aRate/100u ||
+      mPacketizerOutput->Channels() != aChannels) {
+    // It's ok to drop the audio still in the packetizer here: if this changes,
+    // we changed devices or something.
+    mPacketizerOutput =
+      new AudioPacketizer<AudioDataValue, float>(aRate/100, aChannels);
+  }
+
+  mPacketizerOutput->Input(aBuffer, aFrames);
+
+  while (mPacketizerOutput->PacketsAvailable()) {
+    uint32_t samplesPerPacket = mPacketizerOutput->PacketSize() *
+                                mPacketizerOutput->Channels();
+    if (mOutputBuffer.Length() < samplesPerPacket) {
+      mOutputBuffer.SetLength(samplesPerPacket);
+    }
+    if (mDeinterleavedBuffer.Length() < samplesPerPacket) {
+      mDeinterleavedBuffer.SetLength(samplesPerPacket);
+    }
+    float* packet = mOutputBuffer.Data();
+    mPacketizerOutput->Output(packet);
+
+    AutoTArray<float*, MAX_CHANNELS> deinterleavedPacketDataChannelPointers;
+    float* interleavedFarend = nullptr;
+    uint32_t channelCountFarend = 0;
+    uint32_t framesPerPacketFarend = 0;
+
+    // Downmix from aChannels to MAX_CHANNELS if needed. We always have floats
+    // here, the packetized performed the conversion.
+    if (aChannels > MAX_CHANNELS) {
+      AudioConverter converter(AudioConfig(aChannels, 0, AudioConfig::FORMAT_FLT),
+                               AudioConfig(MAX_CHANNELS, 0, AudioConfig::FORMAT_FLT));
+      framesPerPacketFarend = mPacketizerOutput->PacketSize();
+      framesPerPacketFarend =
+        converter.Process(mInputDownmixBuffer,
+                          packet,
+                          framesPerPacketFarend);
+      interleavedFarend = mInputDownmixBuffer.Data();
+      channelCountFarend = MAX_CHANNELS;
+      deinterleavedPacketDataChannelPointers.SetLength(MAX_CHANNELS);
+    } else {
+      interleavedFarend = packet;
+      channelCountFarend = aChannels;
+      framesPerPacketFarend = mPacketizerOutput->PacketSize();
+      deinterleavedPacketDataChannelPointers.SetLength(aChannels);
+    }
+
+    MOZ_ASSERT(interleavedFarend &&
+               (channelCountFarend == 1 || channelCountFarend == 2) &&
+               framesPerPacketFarend);
+
+    if (mInputBuffer.Length() < framesPerPacketFarend * channelCountFarend) {
+      mInputBuffer.SetLength(framesPerPacketFarend * channelCountFarend);
+    }
+
+    size_t offset = 0;
+    for (size_t i = 0; i < deinterleavedPacketDataChannelPointers.Length(); ++i) {
+      deinterleavedPacketDataChannelPointers[i] = mInputBuffer.Data() + offset;
+      offset += framesPerPacketFarend;
+    }
+
+    // Deinterleave, prepare a channel pointers array, with enough storage for
+    // the frames.
+    DeinterleaveAndConvertBuffer(interleavedFarend,
+                                 framesPerPacketFarend,
+                                 channelCountFarend,
+                                 deinterleavedPacketDataChannelPointers.Elements());
+
+    // Having the same config for input and output means we potentially save
+    // some CPU.
+    StreamConfig inputConfig(aRate, channelCountFarend, false);
+    StreamConfig outputConfig = inputConfig;
+
+    // Passing the same pointers here saves a copy inside this function.
+    DebugOnly<int> err =
+      mAudioProcessing->ProcessReverseStream(deinterleavedPacketDataChannelPointers.Elements(),
+                                             inputConfig,
+                                             outputConfig,
+                                             deinterleavedPacketDataChannelPointers.Elements());
+
+    MOZ_ASSERT(!err, "Could not process the reverse stream.");
   }
 }
 
 // Only called if we're not in passthrough mode
 void
 MediaEngineWebRTCMicrophoneSource::PacketizeAndProcess(MediaStreamGraph* aGraph,
                                                        const AudioDataValue* aBuffer,
                                                        size_t aFrames,
                                                        TrackRate aRate,
                                                        uint32_t aChannels)
 {
   MOZ_ASSERT(!PassThrough(), "This should be bypassed when in PassThrough mode.");
   size_t offset = 0;
 
-  if (!mPacketizer ||
-      mPacketizer->PacketSize() != aRate/100u ||
-      mPacketizer->Channels() != aChannels) {
+  if (!mPacketizerInput ||
+      mPacketizerInput->PacketSize() != aRate/100u ||
+      mPacketizerInput->Channels() != aChannels) {
     // It's ok to drop the audio still in the packetizer here.
-    mPacketizer =
+    mPacketizerInput =
       new AudioPacketizer<AudioDataValue, float>(aRate/100, aChannels);
   }
 
-  // On initial capture, throw away all far-end data except the most recent sample
-  // since it's already irrelevant and we want to keep avoid confusing the AEC far-end
-  // input code with "old" audio.
+  // On initial capture, throw away all far-end data except the most recent
+  // sample since it's already irrelevant and we want to avoid confusing the AEC
+  // far-end input code with "old" audio.
   if (!mStarted) {
     mStarted  = true;
-    while (mAudioOutputObserver->Size() > 1) {
-      free(mAudioOutputObserver->Pop()); // only call if size() > 0
-    }
-  }
-
-  // Feed the far-end audio data (speakers) to the feedback input of the AEC.
-  while (mAudioOutputObserver->Size() > 0) {
-    // Bug 1414837: This will call `free()`, and we should remove it.
-    // Pop gives ownership.
-    nsAutoPtr<FarEndAudioChunk> buffer(mAudioOutputObserver->Pop()); // only call if size() > 0
-    if (!buffer) {
-      continue;
-    }
-    AudioDataValue* packetDataPointer = buffer->mData;
-    AutoTArray<float*, MAX_CHANNELS> deinterleavedPacketDataChannelPointers;
-    AudioDataValue* interleavedFarend = nullptr;
-    uint32_t channelCountFarend = 0;
-    uint32_t framesPerPacketFarend = 0;
-
-    // Downmix from aChannels to MAX_CHANNELS if needed
-    if (mAudioOutputObserver->PlayoutChannels() > MAX_CHANNELS) {
-      AudioConverter converter(AudioConfig(aChannels, 0, AudioConfig::FORMAT_DEFAULT),
-                               AudioConfig(MAX_CHANNELS, 0, AudioConfig::FORMAT_DEFAULT));
-      framesPerPacketFarend =
-        buffer->mSamples;
-      framesPerPacketFarend =
-        converter.Process(mInputDownmixBuffer,
-                          packetDataPointer,
-                          framesPerPacketFarend);
-      interleavedFarend = mInputDownmixBuffer.Data();
-      channelCountFarend = MAX_CHANNELS;
-      deinterleavedPacketDataChannelPointers.SetLength(MAX_CHANNELS);
-    } else {
-      uint32_t outputChannels = mAudioOutputObserver->PlayoutChannels();
-      interleavedFarend = packetDataPointer;
-      channelCountFarend = outputChannels;
-      framesPerPacketFarend = buffer->mSamples;
-      deinterleavedPacketDataChannelPointers.SetLength(outputChannels);
-    }
-
-    MOZ_ASSERT(interleavedFarend &&
-               (channelCountFarend == 1 || channelCountFarend == 2) &&
-               framesPerPacketFarend);
-
-    if (mInputBuffer.Length() < framesPerPacketFarend * channelCountFarend) {
-      mInputBuffer.SetLength(framesPerPacketFarend * channelCountFarend);
-    }
-
-    offset = 0;
-    for (size_t i = 0; i < deinterleavedPacketDataChannelPointers.Length(); ++i) {
-      deinterleavedPacketDataChannelPointers[i] = mInputBuffer.Data() + offset;
-      offset += framesPerPacketFarend;
-    }
-
-    // Deinterleave, prepare a channel pointers array, with enough storage for
-    // the frames.
-    //
-    // If this is a platform that uses s16 for audio input and output,
-    // convert to floats, the APM API we use only accepts floats.
-    DeinterleaveAndConvertBuffer(interleavedFarend,
-                                 framesPerPacketFarend,
-                                 channelCountFarend,
-                                 deinterleavedPacketDataChannelPointers.Elements());
-
-    // Having the same config for input and output means we potentially save
-    // some CPU.
-    StreamConfig inputConfig(mAudioOutputObserver->PlayoutFrequency(),
-                             channelCountFarend,
-                             false /* we don't use typing detection*/);
-    StreamConfig outputConfig = inputConfig;
-
-    // Passing the same pointers here saves a copy inside this function.
-    int err =
-      mAudioProcessing->ProcessReverseStream(deinterleavedPacketDataChannelPointers.Elements(),
-                                             inputConfig,
-                                             outputConfig,
-                                             deinterleavedPacketDataChannelPointers.Elements());
-
-    if (err) {
-      MOZ_LOG(GetMediaManagerLog(), LogLevel::Error,
-          ("error in audio ProcessReverseStream(): %d", err));
-      return;
-    }
   }
 
   // Packetize our input data into 10ms chunks, deinterleave into planar channel
   // buffers, process, and append to the right MediaStreamTrack.
-  mPacketizer->Input(aBuffer, static_cast<uint32_t>(aFrames));
+  mPacketizerInput->Input(aBuffer, static_cast<uint32_t>(aFrames));
 
-  while (mPacketizer->PacketsAvailable()) {
-    uint32_t samplesPerPacket = mPacketizer->PacketSize() *
-      mPacketizer->Channels();
+  while (mPacketizerInput->PacketsAvailable()) {
+    uint32_t samplesPerPacket = mPacketizerInput->PacketSize() *
+      mPacketizerInput->Channels();
     if (mInputBuffer.Length() < samplesPerPacket) {
       mInputBuffer.SetLength(samplesPerPacket);
     }
     if (mDeinterleavedBuffer.Length() < samplesPerPacket) {
       mDeinterleavedBuffer.SetLength(samplesPerPacket);
     }
     float* packet = mInputBuffer.Data();
-    mPacketizer->Output(packet);
+    mPacketizerInput->Output(packet);
 
     // Deinterleave the input data
     // Prepare an array pointing to deinterleaved channels.
     AutoTArray<float*, 8> deinterleavedPacketizedInputDataChannelPointers;
     deinterleavedPacketizedInputDataChannelPointers.SetLength(aChannels);
     offset = 0;
     for (size_t i = 0; i < deinterleavedPacketizedInputDataChannelPointers.Length(); ++i) {
       deinterleavedPacketizedInputDataChannelPointers[i] = mDeinterleavedBuffer.Data() + offset;
-      offset += mPacketizer->PacketSize();
+      offset += mPacketizerInput->PacketSize();
     }
 
     // Deinterleave to mInputBuffer, pointed to by inputBufferChannelPointers.
-    Deinterleave(packet, mPacketizer->PacketSize(), aChannels,
+    Deinterleave(packet, mPacketizerInput->PacketSize(), aChannels,
         deinterleavedPacketizedInputDataChannelPointers.Elements());
 
     StreamConfig inputConfig(aRate,
                              aChannels,
                              false /* we don't use typing detection*/);
     StreamConfig outputConfig = inputConfig;
 
     // Bug 1404965: Get the right delay here, it saves some work down the line.
     mAudioProcessing->set_stream_delay_ms(0);
 
     // Bug 1414837: find a way to not allocate here.
     RefPtr<SharedBuffer> buffer =
-      SharedBuffer::Create(mPacketizer->PacketSize() * aChannels * sizeof(float));
+      SharedBuffer::Create(mPacketizerInput->PacketSize() * aChannels * sizeof(float));
     AudioSegment segment;
 
     // Prepare channel pointers to the SharedBuffer created above.
     AutoTArray<float*, 8> processedOutputChannelPointers;
     AutoTArray<const float*, 8> processedOutputChannelPointersConst;
     processedOutputChannelPointers.SetLength(aChannels);
     processedOutputChannelPointersConst.SetLength(aChannels);
 
     offset = 0;
     for (size_t i = 0; i < processedOutputChannelPointers.Length(); ++i) {
       processedOutputChannelPointers[i] = static_cast<float*>(buffer->Data()) + offset;
       processedOutputChannelPointersConst[i] = static_cast<float*>(buffer->Data()) + offset;
-      offset += mPacketizer->PacketSize();
+      offset += mPacketizerInput->PacketSize();
     }
 
     mAudioProcessing->ProcessStream(deinterleavedPacketizedInputDataChannelPointers.Elements(),
                                     inputConfig,
                                     outputConfig,
                                     processedOutputChannelPointers.Elements());
     MonitorAutoLock lock(mMonitor);
     if (mState != kStarted)
@@ -882,17 +748,17 @@ MediaEngineWebRTCMicrophoneSource::Packe
       }
 
       // We already have planar audio data of the right format. Insert into the
       // MSG.
       MOZ_ASSERT(processedOutputChannelPointers.Length() == aChannels);
       RefPtr<SharedBuffer> other = buffer;
       segment.AppendFrames(other.forget(),
                            processedOutputChannelPointersConst,
-                           mPacketizer->PacketSize(),
+                           mPacketizerInput->PacketSize(),
                            mPrincipalHandles[i]);
       mSources[i]->AppendToTrack(mTrackID, &segment);
     }
   }
 }
 
 template<typename T>
 void
--- a/dom/media/webrtc/moz.build
+++ b/dom/media/webrtc/moz.build
@@ -17,18 +17,17 @@ EXPORTS += [
     'MediaEngine.h',
     'MediaEngineCameraVideoSource.h',
     'MediaEngineDefault.h',
     'MediaTrackConstraints.h',
     'SineWaveGenerator.h',
 ]
 
 if CONFIG['MOZ_WEBRTC']:
-    EXPORTS += ['AudioOutputObserver.h',
-                'MediaEngineRemoteVideoSource.h',
+    EXPORTS += ['MediaEngineRemoteVideoSource.h',
                 'MediaEngineWebRTC.h']
     EXPORTS.mozilla.dom += [ 'RTCIdentityProviderRegistrar.h' ]
     UNIFIED_SOURCES += [
         'MediaEngineCameraVideoSource.cpp',
         'MediaEngineRemoteVideoSource.cpp',
         'MediaEngineTabVideoSource.cpp',
         'MediaEngineWebRTCAudio.cpp',
         'RTCCertificate.cpp',
--- a/dom/vr/VRDisplay.cpp
+++ b/dom/vr/VRDisplay.cpp
@@ -95,17 +95,17 @@ VRDisplay::UpdateVRDisplays(nsTArray<Ref
 
   gfx::VRManagerChild* vm = gfx::VRManagerChild::Get();
   nsTArray<RefPtr<gfx::VRDisplayClient>> updatedDisplays;
   if (vm && vm->GetVRDisplays(updatedDisplays)) {
     for (size_t i = 0; i < updatedDisplays.Length(); i++) {
       RefPtr<gfx::VRDisplayClient> display = updatedDisplays[i];
       bool isNewDisplay = true;
       for (size_t j = 0; j < aDisplays.Length(); j++) {
-        if (aDisplays[j]->GetClient()->GetDisplayInfo() == display->GetDisplayInfo()) {
+        if (aDisplays[j]->GetClient()->GetDisplayInfo().GetDisplayID() == display->GetDisplayInfo().GetDisplayID()) {
           displays.AppendElement(aDisplays[j]);
           isNewDisplay = false;
         }
       }
 
       if (isNewDisplay) {
         displays.AppendElement(new VRDisplay(aWindow, display));
       }
--- a/dom/vr/VREventObserver.cpp
+++ b/dom/vr/VREventObserver.cpp
@@ -73,16 +73,25 @@ VREventObserver::UpdateSpentTimeIn2DTele
     mHasReset = false;
   } else if (!aUpdate) {
     mSpendTimeIn2DView = TimeStamp::Now();
     mHasReset = true;
   }
 }
 
 void
+VREventObserver::NotifyAfterLoad()
+{
+  if (VRManagerChild::IsCreated()) {
+    VRManagerChild* vmc = VRManagerChild::Get();
+    vmc->FireDOMVRDisplayConnectEventsForLoad(this);
+  }
+}
+
+void
 VREventObserver::NotifyVRDisplayMounted(uint32_t aDisplayID)
 {
   if (mWindow && mWindow->AsInner()->IsCurrentInnerWindow()) {
     MOZ_ASSERT(nsContentUtils::IsSafeToRunScript());
     mWindow->DispatchVRDisplayActivate(aDisplayID,
                                        VRDisplayEventReason::Mounted);
   }
 }
--- a/dom/vr/VREventObserver.h
+++ b/dom/vr/VREventObserver.h
@@ -16,16 +16,17 @@ namespace mozilla {
 namespace dom {
 
 class VREventObserver final
 {
 public:
   NS_INLINE_DECL_REFCOUNTING(VREventObserver)
   explicit VREventObserver(nsGlobalWindowInner* aGlobalWindow);
 
+  void NotifyAfterLoad();
   void NotifyVRDisplayMounted(uint32_t aDisplayID);
   void NotifyVRDisplayUnmounted(uint32_t aDisplayID);
   void NotifyVRDisplayNavigation(uint32_t aDisplayID);
   void NotifyVRDisplayRequested(uint32_t aDisplayID);
   void NotifyVRDisplayConnect(uint32_t aDisplayID);
   void NotifyVRDisplayDisconnect(uint32_t aDisplayID);
   void NotifyVRDisplayPresentChange(uint32_t aDisplayID);
 
--- a/dom/vr/test/mochitest/mochitest.ini
+++ b/dom/vr/test/mochitest/mochitest.ini
@@ -11,12 +11,14 @@ support-files =
 skip-if = (os != "win" && release_or_beta) || (os == "android")
 [test_vrDisplay_canvas2d.html]
 skip-if = (os != "win" && release_or_beta) # Enable Linux after Bug 1310655
 [test_vrDisplay_exitPresent.html]
 skip-if = (os != "win" && release_or_beta) # Enable Linux after Bug 1310655
 [test_vrDisplay_getFrameData.html]
 # Enable Linux after Bug 1310655, enable Android after Bug 1348246
 skip-if = (os != "win" && release_or_beta) || (os == "android")
+[test_vrDisplay_onvrdisplayconnect.html]
+skip-if = true
 [test_vrDisplay_onvrdisplaydeactivate_crosscontent.html]
 skip-if = true
 [test_vrDisplay_requestPresent.html]
 skip-if = true
new file mode 100644
--- /dev/null
+++ b/dom/vr/test/mochitest/test_vrDisplay_onvrdisplayconnect.html
@@ -0,0 +1,43 @@
+<html>
+  <head>
+    <title>VRDisplay onvrdisplayconnect test</title>
+    <meta name="timeout" content="long"/>
+    <meta http-equiv="Content-type" content="text/html;charset=UTF-8">
+    <script src="/resources/testharness.js"></script>
+    <script src="/resources/testharnessreport.js"></script>
+    <script src="VRSimulationDriver.js"></script>
+    <script src="WebVRHelpers.js"></script>
+    <script src="requestPresent.js"></script>
+    <script src="runVRTest.js"></script>
+  </head>
+  <body>
+    <script>
+
+      function eventAfterConnectedTest() {
+        async_test(function (test) {
+          window.addEventListener("vrdisplayconnect", () => {
+            test.done();
+          });
+        }, "vrdisplayconnect should fire as soon as content listens for it, \
+            even if the VR display was already connected.");
+      }
+
+      function startTest() {
+        promise_test((test) => {
+          return attachVRDisplay(test).then(() => {
+            return promise_test((test) => {
+              return setupVRDisplay(test).then(() => {
+                VRSimulationDriver.UpdateVRDisplay();
+                eventAfterConnectedTest();
+                VRSimulationDriver.UpdateVRDisplay();
+              });
+            });
+          });
+        });
+      }
+
+      runVRTest(startTest);
+    </script>
+    <iframe id="iframe1"></iframe>
+  </body>
+</html>
\ No newline at end of file
--- a/dom/xbl/nsBindingManager.cpp
+++ b/dom/xbl/nsBindingManager.cpp
@@ -1092,54 +1092,16 @@ nsBindingManager::HandleChildInsertion(n
     if (newParent == parent) {
       break;
     }
 
     parent = newParent;
   }
 }
 
-
-nsIContent*
-nsBindingManager::FindNestedInsertionPoint(nsIContent* aContainer,
-                                           nsIContent* aChild)
-{
-  NS_PRECONDITION(aChild->GetParent() == aContainer,
-                  "Wrong container");
-
-  nsIContent* parent = aContainer;
-  if (aContainer->IsActiveChildrenElement()) {
-    if (static_cast<XBLChildrenElement*>(aContainer)->
-          HasInsertedChildren()) {
-      return nullptr;
-    }
-    parent = aContainer->GetParent();
-  }
-
-  while (parent) {
-    nsXBLBinding* binding = GetBindingWithContent(parent);
-    if (!binding) {
-      break;
-    }
-
-    XBLChildrenElement* point = binding->FindInsertionPointFor(aChild);
-    if (!point) {
-      return nullptr;
-    }
-
-    nsIContent* newParent = point->GetParent();
-    if (newParent == parent) {
-      break;
-    }
-    parent = newParent;
-  }
-
-  return parent;
-}
-
 nsIContent*
 nsBindingManager::FindNestedSingleInsertionPoint(nsIContent* aContainer,
                                                  bool* aMulti)
 {
   *aMulti = false;
 
   nsIContent* parent = aContainer;
   if (aContainer->IsActiveChildrenElement()) {
--- a/dom/xbl/nsBindingManager.h
+++ b/dom/xbl/nsBindingManager.h
@@ -166,19 +166,16 @@ public:
 
   // When removing an insertion point or a parent of one, clear the insertion
   // points and their insertion parents.
   void ClearInsertionPointsRecursively(nsIContent* aContent);
 
   // Called when the document is going away
   void DropDocumentReference();
 
-  nsIContent* FindNestedInsertionPoint(nsIContent* aContainer,
-                                       nsIContent* aChild);
-
   nsIContent* FindNestedSingleInsertionPoint(nsIContent* aContainer, bool* aMulti);
 
   bool AnyBindingHasDocumentStateDependency(mozilla::EventStates aStateMask);
 
 protected:
   nsIXPConnectWrappedJS* GetWrappedJS(nsIContent* aContent);
   nsresult SetWrappedJS(nsIContent* aContent, nsIXPConnectWrappedJS* aResult);
 
--- a/gfx/2d/BaseRect.h
+++ b/gfx/2d/BaseRect.h
@@ -437,32 +437,28 @@ struct BaseRect {
       case eSideBottom: return YMost();
       case eSideLeft: return X();
     }
     MOZ_CRASH("GFX: Incomplete switch");
   }
 
   // Moves one edge of the rect without moving the opposite edge.
   void SetLeftEdge(T aX) {
-    MOZ_ASSERT(aX <= XMost());
     width = XMost() - aX;
     x = aX;
   }
-  void SetRightEdge(T aXMost) { 
-    MOZ_ASSERT(aXMost >= x);
-    width = aXMost - x; 
+  void SetRightEdge(T aXMost) {
+    width = aXMost - x;
   }
   void SetTopEdge(T aY) {
-    MOZ_ASSERT(aY <= YMost());
     height = YMost() - aY;
     y = aY;
   }
-  void SetBottomEdge(T aYMost) { 
-    MOZ_ASSERT(aYMost >= y);
-    height = aYMost - y; 
+  void SetBottomEdge(T aYMost) {
+    height = aYMost - y;
   }
   void Swap() {
     std::swap(x, y);
     std::swap(width, height);
   }
 
   // Round the rectangle edges to integer coordinates, such that the rounded
   // rectangle has the same set of pixel centers as the original rectangle.
--- a/gfx/vr/ipc/VRManagerChild.cpp
+++ b/gfx/vr/ipc/VRManagerChild.cpp
@@ -537,16 +537,43 @@ VRManagerChild::FireDOMVRDisplayPresentC
   nsTArray<RefPtr<dom::VREventObserver>> listeners;
   listeners = mListeners;
   for (auto& listener : listeners) {
     listener->NotifyVRDisplayPresentChange(aDisplayID);
   }
 }
 
 void
+VRManagerChild::FireDOMVRDisplayConnectEventsForLoadInternal(uint32_t aDisplayID,
+                                                            dom::VREventObserver* aObserver)
+{
+  aObserver->NotifyVRDisplayConnect(aDisplayID);
+}
+
+void
+VRManagerChild::FireDOMVRDisplayConnectEventsForLoad(dom::VREventObserver* aObserver)
+{
+  // We need to fire the VRDisplayConnect event when a page is loaded
+  // for each VR Display that has already been enumerated
+  nsTArray<RefPtr<VRDisplayClient>> displays;
+  displays = mDisplays;
+  for (auto& display : displays) {
+    const VRDisplayInfo& info = display->GetDisplayInfo();
+    if (info.GetIsConnected()) {
+        nsContentUtils::AddScriptRunner(NewRunnableMethod<uint32_t, RefPtr<dom::VREventObserver>>(
+      "gfx::VRManagerChild::FireDOMVRDisplayConnectEventsForLoadInternal",
+      this,
+      &VRManagerChild::FireDOMVRDisplayConnectEventsForLoadInternal,
+      info.GetDisplayID(),
+      aObserver));
+    }
+  }
+}
+
+void
 VRManagerChild::AddListener(dom::VREventObserver* aObserver)
 {
   MOZ_ASSERT(aObserver);
 
   if (mListeners.IndexOf(aObserver) != kNoIndex) {
     return; // already exists
   }
 
--- a/gfx/vr/ipc/VRManagerChild.h
+++ b/gfx/vr/ipc/VRManagerChild.h
@@ -71,16 +71,17 @@ public:
   void RunFrameRequestCallbacks();
 
   void UpdateDisplayInfo(nsTArray<VRDisplayInfo>& aDisplayUpdates);
   void FireDOMVRDisplayMountedEvent(uint32_t aDisplayID);
   void FireDOMVRDisplayUnmountedEvent(uint32_t aDisplayID);
   void FireDOMVRDisplayConnectEvent(uint32_t aDisplayID);
   void FireDOMVRDisplayDisconnectEvent(uint32_t aDisplayID);
   void FireDOMVRDisplayPresentChangeEvent(uint32_t aDisplayID);
+  void FireDOMVRDisplayConnectEventsForLoad(dom::VREventObserver* aObserver);
 
   virtual void HandleFatalError(const char* aName, const char* aMsg) const override;
 
 protected:
   explicit VRManagerChild();
   ~VRManagerChild();
   void Destroy();
   static void DeferredDestroy(RefPtr<VRManagerChild> aVRManagerChild);
@@ -107,16 +108,18 @@ protected:
   }
 private:
 
   void FireDOMVRDisplayMountedEventInternal(uint32_t aDisplayID);
   void FireDOMVRDisplayUnmountedEventInternal(uint32_t aDisplayID);
   void FireDOMVRDisplayConnectEventInternal(uint32_t aDisplayID);
   void FireDOMVRDisplayDisconnectEventInternal(uint32_t aDisplayID);
   void FireDOMVRDisplayPresentChangeEventInternal(uint32_t aDisplayID);
+  void FireDOMVRDisplayConnectEventsForLoadInternal(uint32_t aDisplayID,
+                                                    dom::VREventObserver* aObserver);
 
   nsTArray<RefPtr<VRDisplayClient> > mDisplays;
   bool mDisplaysInitialized;
   nsTArray<uint64_t> mNavigatorCallbacks;
 
   MessageLoop* mMessageLoop;
 
   struct FrameRequest;
--- a/intl/locale/PluralForm.jsm
+++ b/intl/locale/PluralForm.jsm
@@ -71,16 +71,18 @@ var gFunctions = [
   // 14: Unused
   [3, (n) => n%10==1?0:n%10==2?1:2],
   // 15: Icelandic, Macedonian
   [2, (n) => n%10==1&&n%100!=11?0:1],
   // 16: Breton
   [5, (n) => n%10==1&&n%100!=11&&n%100!=71&&n%100!=91?0:n%10==2&&n%100!=12&&n%100!=72&&n%100!=92?1:(n%10==3||n%10==4||n%10==9)&&n%100!=13&&n%100!=14&&n%100!=19&&n%100!=73&&n%100!=74&&n%100!=79&&n%100!=93&&n%100!=94&&n%100!=99?2:n%1000000==0&&n!=0?3:4],
   // 17: Shuar
   [2, (n) => n!=0?1:0],
+  // 18: Welsh
+  [6, (n) => n==0?0:n==1?1:n==2?2:n==3?3:n==6?4:5],
 ];
 
 this.PluralForm = {
   /**
    * Get the correct plural form of a word based on the number
    *
    * @param aNum
    *        The number to decide which plural form to use
--- a/intl/locale/tests/unit/test_pluralForm.js
+++ b/intl/locale/tests/unit/test_pluralForm.js
@@ -618,16 +618,50 @@ function run_test()
     2,2,2,2,2,2,2,2,2,2,
     2,2,2,2,2,2,2,2,2,2,
     2,2,2,2,2,2,2,2,2,2,
     2,2,2,2,2,2,2,2,2,2,
     2,2,2,2,2,2,2,2,2,2,
     2,2,2,2,2,2,2,2,2,2,
     2,2,2,2,2,2,2,2,2,2,
     2,2,2,2,2,2,2,2,2,2,
+  ], [
+    // 18: Welsh 0-9, 10-19, ..., 90-99
+    1,2,3,4,6,6,5,6,6,6,
+    6,6,6,6,6,6,6,6,6,6,
+    6,6,6,6,6,6,6,6,6,6,
+    6,6,6,6,6,6,6,6,6,6,
+    6,6,6,6,6,6,6,6,6,6,
+    6,6,6,6,6,6,6,6,6,6,
+    6,6,6,6,6,6,6,6,6,6,
+    6,6,6,6,6,6,6,6,6,6,
+    6,6,6,6,6,6,6,6,6,6,
+    6,6,6,6,6,6,6,6,6,6,
+    // 100-109, 110-119, ..., 190-199
+    6,6,6,6,6,6,6,6,6,6,
+    6,6,6,6,6,6,6,6,6,6,
+    6,6,6,6,6,6,6,6,6,6,
+    6,6,6,6,6,6,6,6,6,6,
+    6,6,6,6,6,6,6,6,6,6,
+    6,6,6,6,6,6,6,6,6,6,
+    6,6,6,6,6,6,6,6,6,6,
+    6,6,6,6,6,6,6,6,6,6,
+    6,6,6,6,6,6,6,6,6,6,
+    6,6,6,6,6,6,6,6,6,6,
+    // 200-209, 210-219, ..., 290-299
+    6,6,6,6,6,6,6,6,6,6,
+    6,6,6,6,6,6,6,6,6,6,
+    6,6,6,6,6,6,6,6,6,6,
+    6,6,6,6,6,6,6,6,6,6,
+    6,6,6,6,6,6,6,6,6,6,
+    6,6,6,6,6,6,6,6,6,6,
+    6,6,6,6,6,6,6,6,6,6,
+    6,6,6,6,6,6,6,6,6,6,
+    6,6,6,6,6,6,6,6,6,6,
+    6,6,6,6,6,6,6,6,6,6,
   ]];
 
   for (let [rule, expect] of allExpect.entries()) {
     print("\nTesting rule #" + rule);
 
     let [get, numForms] = PluralForm.makeGetter(rule);
 
     // Make sure the largest value expected matches the number of plural forms
--- a/intl/unicharutil/util/nsBidiUtils.h
+++ b/intl/unicharutil/util/nsBidiUtils.h
@@ -258,15 +258,23 @@ typedef enum nsCharType nsCharType;
  *  http://www.unicode.org/roadmaps/
  */
 
 #define IS_IN_BMP_RTL_BLOCK(c) ((0x590 <= (c)) && ((c) <= 0x8ff))
 #define IS_RTL_PRESENTATION_FORM(c) (((0xfb1d <= (c)) && ((c) <= 0xfdff)) || \
                                      ((0xfe70 <= (c)) && ((c) <= 0xfefc)))
 #define IS_IN_SMP_RTL_BLOCK(c) (((0x10800 <= (c)) && ((c) <= 0x10fff)) || \
                                 ((0x1e800 <= (c)) && ((c) <= 0x1eFFF)))
-#define UCS2_CHAR_IS_BIDI(c) ((IS_IN_BMP_RTL_BLOCK(c)) || \
-                              (IS_RTL_PRESENTATION_FORM(c)) || \
-                              (c) == 0xD802 || (c) == 0xD803)
+// Due to the supplementary-plane RTL blocks being identifiable from the
+// high surrogate without examining the low surrogate, it is correct to
+// use this by-code-unit check on potentially astral text without doing
+// the math to decode surrogate pairs into code points. However, unpaired
+// high surrogates that are RTL high surrogates then count as RTL even
+// though, if replaced by the REPLACEMENT CHARACTER, it would not be
+// RTL.
+#define UTF16_CODE_UNIT_IS_BIDI(c) ((IS_IN_BMP_RTL_BLOCK(c)) || \
+                                    (IS_RTL_PRESENTATION_FORM(c)) || \
+                                    (c) == 0xD802 || (c) == 0xD803 || \
+                                    (c) == 0xD83A || (c) == 0xD83B)
 #define UTF32_CHAR_IS_BIDI(c)  ((IS_IN_BMP_RTL_BLOCK(c)) || \
                                (IS_RTL_PRESENTATION_FORM(c)) || \
                                (IS_IN_SMP_RTL_BLOCK(c)))
 #endif  /* nsBidiUtils_h__ */
--- a/layout/base/PresShell.cpp
+++ b/layout/base/PresShell.cpp
@@ -6900,22 +6900,20 @@ PresShell::HandleEvent(nsIFrame* aFrame,
       type = SourceEventType::Key;
     }
     taskTracerEvent.emplace(type);
   }
 #endif
 
   NS_ASSERTION(aFrame, "aFrame should be not null");
 
-  // Update the latest focus sequence number with this new sequence number
+  // Update the latest focus sequence number with this new sequence number;
+  // the next transasction that gets sent to the compositor will carry this over
   if (mAPZFocusSequenceNumber < aEvent->mFocusSequenceNumber) {
     mAPZFocusSequenceNumber = aEvent->mFocusSequenceNumber;
-
-    // Schedule an empty transaction to transmit this focus update
-    aFrame->SchedulePaint(nsIFrame::PAINT_COMPOSITE_ONLY, false);
   }
 
   if (mIsDestroying ||
       (sDisableNonTestMouseEvents && !aEvent->mFlags.mIsSynthesizedForTests &&
        aEvent->HasMouseEventMessage())) {
     return NS_OK;
   }
 
--- a/layout/base/nsCSSFrameConstructor.cpp
+++ b/layout/base/nsCSSFrameConstructor.cpp
@@ -7407,44 +7407,73 @@ nsCSSFrameConstructor::IssueSingleInsert
                 !GetDisplayContentsStyleFor(child)));
 
     // Call ContentRangeInserted with this node.
     ContentRangeInserted(aContainer, child, child->GetNextSibling(),
                          mTempFrameTreeState, InsertionKind::Sync, nullptr);
   }
 }
 
+bool
+nsCSSFrameConstructor::InsertionPoint::IsMultiple() const
+{
+  if (!mParentFrame) {
+    return false;
+  }
+
+  // Fieldset frames have multiple normal flow child frame lists so handle it
+  // the same as if it had multiple content insertion points.
+  if (mParentFrame->IsFieldSetFrame()) {
+    return true;
+  }
+
+  // A details frame moves the first summary frame to be its first child, so we
+  // treat it as if it has multiple content insertion points.
+  if (mParentFrame->IsDetailsFrame()) {
+    return true;
+  }
+
+  return false;
+}
+
 nsCSSFrameConstructor::InsertionPoint
 nsCSSFrameConstructor::GetRangeInsertionPoint(nsIContent* aContainer,
                                               nsIContent* aStartChild,
                                               nsIContent* aEndChild)
 {
-  // See if we have an XBL insertion point. If so, then that's our
-  // real parent frame; if not, then the frame hasn't been built yet
-  // and we just bail.
-  InsertionPoint insertionPoint = GetInsertionPoint(aContainer, nullptr);
-  if (!insertionPoint.mParentFrame && !insertionPoint.mMultiple) {
-    return insertionPoint; // Don't build the frames.
-  }
-
-  if (insertionPoint.mMultiple || aStartChild->GetXBLInsertionPoint()) {
-    // If we have multiple insertion points or if we have an insertion point
-    // and the operation is not a true append or if the insertion point already
-    // has explicit children, then we must fall back.
-    if (insertionPoint.mMultiple || aEndChild ||
-        insertionPoint.mParentFrame->GetContent()->HasChildren()) {
-      // Now comes the fun part.  For each inserted child, make a
-      // ContentInserted call as if it had just gotten inserted and
-      // let ContentInserted handle the mess.
-      IssueSingleInsertNofications(aContainer, aStartChild, aEndChild);
-      insertionPoint.mParentFrame = nullptr;
-    }
-  }
-
-  return insertionPoint;
+  MOZ_ASSERT(aStartChild);
+
+  // If the children of the container may be distributed to different insertion
+  // points, insert them separately and bail out, letting ContentInserted handle
+  // the mess.
+  if (aContainer->GetShadowRoot() || aContainer->GetXBLBinding()) {
+    IssueSingleInsertNofications(aContainer, aStartChild, aEndChild);
+    return { };
+  }
+
+#ifdef DEBUG
+  {
+    nsIContent* expectedParent = aStartChild->GetFlattenedTreeParent();
+    for (nsIContent* child = aStartChild->GetNextSibling(); child;
+         child = child->GetNextSibling()) {
+      MOZ_ASSERT(child->GetFlattenedTreeParent() == expectedParent);
+    }
+  }
+#endif
+
+  // Now the flattened tree parent of all the siblings is the same, just use the
+  // same insertion point and take the fast path, unless it's a multiple
+  // insertion point.
+  InsertionPoint ip = GetInsertionPoint(aStartChild);
+  if (ip.IsMultiple()) {
+    IssueSingleInsertNofications(aContainer, aStartChild, aEndChild);
+    return { };
+  }
+
+  return ip;
 }
 
 bool
 nsCSSFrameConstructor::MaybeRecreateForFrameset(nsIFrame* aParentFrame,
                                                 nsIContent* aStartChild,
                                                 nsIContent* aEndChild)
 {
   if (aParentFrame->IsFrameSetFrame()) {
@@ -8075,17 +8104,17 @@ nsCSSFrameConstructor::ContentRangeInser
   // if needed.
   styleNewChildRangeEagerly();
 
   InsertionPoint insertion;
   if (isSingleInsert) {
     // See if we have an XBL insertion point. If so, then that's our
     // real parent frame; if not, then the frame hasn't been built yet
     // and we just bail.
-    insertion = GetInsertionPoint(aContainer, aStartChild);
+    insertion = GetInsertionPoint(aStartChild);
   } else {
     // Get our insertion point. If we need to issue single ContentInserted's
     // GetRangeInsertionPoint will take care of that for us.
     LAYOUT_PHASE_TEMP_EXIT();
     insertion = GetRangeInsertionPoint(aContainer, aStartChild, aEndChild);
     LAYOUT_PHASE_TEMP_REENTER();
   }
 
@@ -9362,88 +9391,27 @@ nsCSSFrameConstructor::ReplicateFixedFra
   // broken auto-positioning. Oh, well.
   NS_ASSERTION(!canvasFrame->PrincipalChildList().FirstChild(),
                "leaking frames; doc root continuation must be empty");
   canvasFrame->SetInitialChildList(kPrincipalList, fixedPlaceholders);
   return NS_OK;
 }
 
 nsCSSFrameConstructor::InsertionPoint
-nsCSSFrameConstructor::GetInsertionPoint(nsIContent* aContainer,
-                                         nsIContent* aChild)
-{
-  nsBindingManager* bindingManager = mDocument->BindingManager();
-
-  nsIContent* insertionElement;
-  if (aChild) {
-    // We've got an explicit insertion child. Check to see if it's
-    // anonymous.
-    if (aChild->GetBindingParent() == aContainer) {
-      // This child content is anonymous. Don't use the insertion
-      // point, since that's only for the explicit kids.
-      return InsertionPoint(GetContentInsertionFrameFor(aContainer), aContainer);
-    }
-
-    if (nsContentUtils::HasDistributedChildren(aContainer) ||
-        aContainer->IsShadowRoot()) {
-      // The container distributes nodes or is a shadow root, use the frame of
-      // the flattened tree parent.
-      //
-      // It may be the case that the node is distributed but not matched to any
-      // insertion points, so there is no flattened parent.
-      //
-      // FIXME(emilio): We should be able to use this path all the time.
-      nsIContent* flattenedParent = aChild->GetFlattenedTreeParent();
-      if (flattenedParent) {
-        return InsertionPoint(GetContentInsertionFrameFor(flattenedParent),
-                              flattenedParent);
-      }
-      return InsertionPoint();
-    }
-
-    insertionElement = bindingManager->FindNestedInsertionPoint(aContainer, aChild);
-  } else {
-    if (nsContentUtils::HasDistributedChildren(aContainer)) {
-      // The container distributes nodes to shadow DOM insertion points.
-      // Return with aMultiple set to true to induce callers to insert children
-      // individually into the node's flattened tree parent.
-      return InsertionPoint(nullptr, nullptr, true);
-    }
-
-    bool multiple;
-    insertionElement = bindingManager->FindNestedSingleInsertionPoint(aContainer, &multiple);
-    if (multiple) {
-      return InsertionPoint(nullptr, nullptr, true);
-    }
-  }
-
+nsCSSFrameConstructor::GetInsertionPoint(nsIContent* aChild)
+{
+  MOZ_ASSERT(aChild);
+  nsIContent* insertionElement = aChild->GetFlattenedTreeParent();
   if (!insertionElement) {
-    // The FindNested{,Single}InsertionPoint methods return null in the case
-    // that there is a binding with anonymous content but no insertion point.
-    // In that case the element doesn't belong in the flattened tree, and we
-    // don't want to render it.
-    return InsertionPoint();
-  }
-
-  InsertionPoint insertion(GetContentInsertionFrameFor(insertionElement),
-                           insertionElement);
-
-  // Fieldset frames have multiple normal flow child frame lists so handle it
-  // the same as if it had multiple content insertion points.
-  if (insertion.mParentFrame && insertion.mParentFrame->IsFieldSetFrame()) {
-    insertion.mMultiple = true;
-  }
-
-  // A details frame moves the first summary frame to be its first child, so we
-  // treat it as if it has multiple content insertion points.
-  if (insertion.mParentFrame && insertion.mParentFrame->IsDetailsFrame()) {
-    insertion.mMultiple = true;
-  }
-
-  return insertion;
+    // The element doesn't belong in the flattened tree, and thus we don't want
+    // to render it.
+    return { };
+  }
+
+  return { GetContentInsertionFrameFor(insertionElement), insertionElement };
 }
 
 // Capture state for the frame tree rooted at the frame associated with the
 // content object, aContent
 void
 nsCSSFrameConstructor::CaptureStateForFramesOf(nsIContent* aContent,
                                                nsILayoutHistoryState* aHistoryState)
 {
@@ -11139,17 +11107,17 @@ nsCSSFrameConstructor::ProcessChildren(n
       // for default content). Push the children element as an ancestor here because
       // it does not have a frame and would not otherwise be pushed as an ancestor.
       insertion.mContainer = aContent;
       nsIContent* parent = child->GetParent();
       MOZ_ASSERT(parent, "Parent must be non-null because we are iterating children.");
       TreeMatchContext::AutoAncestorPusher ancestorPusher(aState.mTreeMatchContext);
       if (parent != aContent && parent->IsElement()) {
         insertion.mContainer = child->GetFlattenedTreeParent();
-        MOZ_ASSERT(insertion.mContainer == GetInsertionPoint(parent, child).mContainer);
+        MOZ_ASSERT(insertion.mContainer == GetInsertionPoint(child).mContainer);
         if (aState.HasAncestorFilter()) {
           ancestorPusher.PushAncestorAndStyleScope(parent->AsElement());
         } else {
           ancestorPusher.PushStyleScope(parent->AsElement());
         }
       }
 
       // Frame construction item construction should not post
--- a/layout/base/nsCSSFrameConstructor.h
+++ b/layout/base/nsCSSFrameConstructor.h
@@ -136,41 +136,47 @@ private:
                                     nsIContent* aEndChild);
 
   /**
    * Data that represents an insertion point for some child content.
    */
   struct InsertionPoint
   {
     InsertionPoint()
-      : mParentFrame(nullptr), mContainer(nullptr), mMultiple(false) {}
-    InsertionPoint(nsContainerFrame* aParentFrame, nsIContent* aContainer,
-                   bool aMultiple = false)
-      : mParentFrame(aParentFrame), mContainer(aContainer),
-        mMultiple(aMultiple) {}
+      : mParentFrame(nullptr)
+      , mContainer(nullptr)
+    {}
+
+    InsertionPoint(nsContainerFrame* aParentFrame, nsIContent* aContainer)
+      : mParentFrame(aParentFrame)
+      , mContainer(aContainer)
+    {}
+
     /**
      * The parent frame to use if the inserted children needs to create
      * frame(s).  May be null, which signals that  we shouldn't try to
      * create frames for the inserted children; either because there are
      * no parent frame or because there are multiple insertion points and
      * we will call IssueSingleInsertNofications for each child instead.
      * mContainer should not be used when mParentFrame is null.
      */
     nsContainerFrame* mParentFrame;
     /**
      * The flattened tree parent for the inserted children.
      * It's undefined if mParentFrame is null.
      */
     nsIContent* mContainer;
+
     /**
-     * If true then there are multiple insertion points, which means consumers
-     * should insert children individually into the node's flattened tree parent.
+     * Whether it is required to insert children one-by-one instead of as a
+     * range.
      */
-    bool mMultiple;
+    bool IsMultiple() const;
   };
+
   /**
    * Checks if the children of aContainer in the range [aStartChild, aEndChild)
    * can be inserted/appended to one insertion point together. If so, returns
    * that insertion point. If not, returns with InsertionPoint.mFrame == nullptr
    * and issues single ContentInserted calls for each child.
    * aEndChild = nullptr indicates that we are dealing with an append.
    */
   InsertionPoint GetRangeInsertionPoint(nsIContent* aContainer,
@@ -352,19 +358,25 @@ public:
                                   nsIFrame*         aFrame,
                                   nsContainerFrame* aParentFrame,
                                   bool              aIsFluid = true);
 
   // Copy over fixed frames from aParentFrame's prev-in-flow
   nsresult ReplicateFixedFrames(nsPageContentFrame* aParentFrame);
 
   /**
-   * Get the XBL insertion point for aChild in aContainer.
+   * Get the insertion point for aChild.
    */
-  InsertionPoint GetInsertionPoint(nsIContent* aContainer, nsIContent* aChild);
+  InsertionPoint GetInsertionPoint(nsIContent* aChild);
+
+  /**
+   * Return the insertion frame of the primary frame of aContent, or its nearest
+   * ancestor that isn't display:contents.
+   */
+  nsContainerFrame* GetContentInsertionFrameFor(nsIContent* aContent);
 
   void CreateListBoxContent(nsContainerFrame* aParentFrame,
                             nsIFrame*         aPrevFrame,
                             nsIContent*       aChild,
                             nsIFrame**        aResult,
                             bool              aIsAppend);
 
   // GetInitialContainingBlock() is deprecated in favor of GetRootElementFrame();
@@ -2175,22 +2187,16 @@ private:
   // insertion points.
   nsIFrame* GetInsertionPrevSibling(InsertionPoint* aInsertion, // inout
                                     nsIContent* aChild,
                                     bool* aIsAppend,
                                     bool* aIsRangeInsertSafe,
                                     nsIContent* aStartSkipChild = nullptr,
                                     nsIContent *aEndSkipChild = nullptr);
 
-  /**
-   * Return the insertion frame of the primary frame of aContent, or its nearest
-   * ancestor that isn't display:contents.
-   */
-  nsContainerFrame* GetContentInsertionFrameFor(nsIContent* aContent);
-
   // see if aContent and aSibling are legitimate siblings due to restrictions
   // imposed by table columns
   // XXXbz this code is generally wrong, since the frame for aContent
   // may be constructed based on tag, not based on aDisplay!
   bool IsValidSibling(nsIFrame*              aSibling,
                       nsIContent*            aContent,
                       mozilla::StyleDisplay& aDisplay);
 
--- a/layout/base/nsLayoutUtils.cpp
+++ b/layout/base/nsLayoutUtils.cpp
@@ -1703,17 +1703,17 @@ nsLayoutUtils::GetRealPrimaryFrameFor(co
 }
 
 nsIFrame*
 nsLayoutUtils::GetFloatFromPlaceholder(nsIFrame* aFrame) {
   NS_ASSERTION(aFrame->IsPlaceholderFrame(), "Must have a placeholder here");
   if (aFrame->GetStateBits() & PLACEHOLDER_FOR_FLOAT) {
     nsIFrame *outOfFlowFrame =
       nsPlaceholderFrame::GetRealFrameForPlaceholder(aFrame);
-    NS_ASSERTION(outOfFlowFrame->IsFloating(),
+    NS_ASSERTION(outOfFlowFrame && outOfFlowFrame->IsFloating(),
                  "How did that happen?");
     return outOfFlowFrame;
   }
 
   return nullptr;
 }
 
 // static
--- a/layout/painting/DisplayItemClipChain.cpp
+++ b/layout/painting/DisplayItemClipChain.cpp
@@ -23,19 +23,23 @@ DisplayItemClipChain::Equal(const Displa
   if (aClip1 == aClip2) {
     return true;
   }
 
   if (!aClip1 || !aClip2) {
     return false;
   }
 
-  return aClip1->mASR == aClip2->mASR &&
+  bool ret = aClip1->mASR == aClip2->mASR &&
          aClip1->mClip == aClip2->mClip &&
          Equal(aClip1->mParent, aClip2->mParent);
+  // Sanity check: if two clip chains are equal they must hash to the same
+  // thing too, or Bad Things (TM) will happen.
+  MOZ_ASSERT(!ret || (Hash(aClip1) == Hash(aClip2)));
+  return ret;
 }
 
 uint32_t
 DisplayItemClipChain::Hash(const DisplayItemClipChain* aClip)
 {
   if (!aClip) {
     return 0;
   }
@@ -43,17 +47,22 @@ DisplayItemClipChain::Hash(const Display
   // We include the number of rounded rects in the hash but not their contents.
   // This is to keep the hash fast, because most clips will not have rounded
   // rects and including them will slow down the hash in the common case. Note
   // that the ::Equal check still checks the rounded rect contents, so in case
   // of hash collisions the clip chains can still be distinguished using that.
   uint32_t hash = HashGeneric(aClip->mASR, aClip->mClip.GetRoundedRectCount());
   if (aClip->mClip.HasClip()) {
     const nsRect& rect = aClip->mClip.GetClipRect();
-    hash = AddToHash(hash, rect.x, rect.y, rect.width, rect.height);
+    // empty rects are considered equal in DisplayItemClipChain::Equal, even
+    // though they may have different x and y coordinates. So make sure they
+    // hash to the same thing in those cases too.
+    if (!rect.IsEmpty()) {
+      hash = AddToHash(hash, rect.x, rect.y, rect.width, rect.height);
+    }
   }
 
   return hash;
 }
 
 /* static */ nsCString
 DisplayItemClipChain::ToString(const DisplayItemClipChain* aClipChain)
 {
--- a/layout/printing/DrawEventRecorder.h
+++ b/layout/printing/DrawEventRecorder.h
@@ -19,22 +19,24 @@ namespace layout {
 class PRFileDescStream : public mozilla::gfx::EventStream {
   // Most writes, as seen in the print IPC use case, are very small (<32 bytes),
   // with a small number of very large (>40KB) writes. Writes larger than this
   // value are not buffered.
   static const size_t kBufferSize = 1024;
 public:
   PRFileDescStream() : mFd(nullptr), mBuffer(nullptr), mBufferPos(0),
                        mGood(true) {}
+  PRFileDescStream(const PRFileDescStream& other) = delete;
+  ~PRFileDescStream() { Close(); }
 
   void OpenFD(PRFileDesc* aFd)
   {
     MOZ_ASSERT(!IsOpen());
     mFd = aFd;
-    mGood = true;
+    mGood = !!mFd;
     mBuffer.reset(new uint8_t[kBufferSize]);
     mBufferPos = 0;
   }
 
   void Close() {
     // We need to be API compatible with std::ostream, and so we silently handle
     // closes on a closed FD.
     if (IsOpen()) {
@@ -48,55 +50,67 @@ public:
 
   bool IsOpen() {
     return mFd != nullptr;
   }
 
   void Flush() {
     // See comment in Close().
     if (IsOpen() && mBufferPos > 0) {
-      PR_Write(mFd, static_cast<const void*>(mBuffer.get()), mBufferPos);
+      PRInt32 length =
+        PR_Write(mFd, static_cast<const void*>(mBuffer.get()), mBufferPos);
+      mGood = length >= 0 && static_cast<size_t>(length) == mBufferPos;
       mBufferPos = 0;
     }
   }
 
-  void Seek(PRInt32 aOffset, PRSeekWhence aWhence) {
+  void Seek(PRInt64 aOffset, PRSeekWhence aWhence)
+  {
     Flush();
-    PR_Seek(mFd, aOffset, aWhence);
+    PRInt64 pos = PR_Seek64(mFd, aOffset, aWhence);
+    mGood = pos != -1;
   }
 
   void write(const char* aData, size_t aSize) {
+    if (!good()) {
+      return;
+    }
+
     // See comment in Close().
     if (IsOpen()) {
       // If we're writing more data than could ever fit in our buffer, flush the
       // buffer and write directly.
       if (aSize > kBufferSize) {
         Flush();
-        PR_Write(mFd, static_cast<const void*>(aData), aSize);
-      // If our write could fit in our buffer, but doesn't because the buffer is
-      // partially full, write to the buffer, flush the buffer, and then write
-      // the rest of the data to the buffer.
+        PRInt32 length = PR_Write(mFd, static_cast<const void*>(aData), aSize);
+        mGood = length >= 0 && static_cast<size_t>(length) == aSize;
+      // If our write could fit in our buffer, but doesn't because the buffer
+      // is partially full, write to the buffer, flush the buffer, and then
+      // write the rest of the data to the buffer.
       } else if (aSize > AvailableBufferSpace()) {
         size_t length = AvailableBufferSpace();
         WriteToBuffer(aData, length);
         Flush();
 
-        MOZ_ASSERT(aSize <= kBufferSize);
         WriteToBuffer(aData + length, aSize - length);
       // Write fits in the buffer.
       } else {
         WriteToBuffer(aData, aSize);
       }
     }
   }
 
   void read(char* aOut, size_t aSize) {
+    if (!good()) {
+      return;
+    }
+
     Flush();
     PRInt32 res = PR_Read(mFd, static_cast<void*>(aOut), aSize);
-    mGood = res >= 0 && ((size_t)res == aSize);
+    mGood = res >= 0 && (static_cast<size_t>(res) == aSize);
   }
 
   bool good() {
     return mGood;
   }
 
 private:
   size_t AvailableBufferSpace() {
--- a/layout/style/GenericSpecifiedValues.h
+++ b/layout/style/GenericSpecifiedValues.h
@@ -11,53 +11,60 @@
  */
 
 #ifndef mozilla_GenericSpecifiedValues_h
 #define mozilla_GenericSpecifiedValues_h
 
 #include "mozilla/ServoUtils.h"
 #include "nsCSSProps.h"
 #include "nsCSSValue.h"
-#include "nsPresContext.h"
+#include "StyleBackendType.h"
 
+class nsAttrValue;
 struct nsRuleData;
 
 namespace mozilla {
 
 class ServoSpecifiedValues;
 
-// This provides a common interface for attribute mappers (MapAttributesIntoRule)
-// to use regardless of the style backend. If the style backend is Gecko,
-// this will contain an nsRuleData. If it is Servo, it will be a PropertyDeclarationBlock.
+// This provides a common interface for attribute mappers
+// (MapAttributesIntoRule) to use regardless of the style backend. If the style
+// backend is Gecko, this will contain an nsRuleData. If it is Servo, it will be
+// a PropertyDeclarationBlock.
 class GenericSpecifiedValues
 {
 protected:
-  explicit GenericSpecifiedValues(StyleBackendType aType,
-                                  nsPresContext* aPresContext,
-                                  uint32_t aSIDs)
+  explicit GenericSpecifiedValues(StyleBackendType aType, nsIDocument* aDoc, uint32_t aSIDs)
     : mType(aType)
-    , mPresContext(aPresContext)
+    , mDocument(aDoc)
     , mSIDs(aSIDs)
   {}
 
 public:
   MOZ_DECL_STYLO_METHODS(nsRuleData, ServoSpecifiedValues)
 
+  nsIDocument* Document()
+  {
+    return mDocument;
+  }
+
+  // Whether we should ignore document colors.
+  inline bool ShouldIgnoreColors() const;
+
   // Check if we already contain a certain longhand
   inline bool PropertyIsSet(nsCSSPropertyID aId);
+
   // Check if we are able to hold longhands from a given
   // style struct. Pass the result of NS_STYLE_INHERIT_BIT to this
   // function. Can accept multiple inherit bits or'd together.
   inline bool ShouldComputeStyleStruct(uint64_t aInheritBits)
   {
     return aInheritBits & mSIDs;
   }
 
-  inline nsPresContext* PresContext() { return mPresContext; }
-
   // Set a property to an identifier (string)
   inline void SetIdentStringValue(nsCSSPropertyID aId, const nsString& aValue);
   inline void SetIdentStringValueIfUnset(nsCSSPropertyID aId,
                                          const nsString& aValue);
 
   inline void SetIdentAtomValue(nsCSSPropertyID aId, nsAtom* aValue);
   inline void SetIdentAtomValueIfUnset(nsCSSPropertyID aId, nsAtom* aValue);
 
@@ -111,15 +118,15 @@ public:
 
   // Set font-family to a string
   inline void SetFontFamily(const nsString& aValue);
   // Add a quirks-mode override to the decoration color of elements nested in <a>
   inline void SetTextDecorationColorOverride();
   inline void SetBackgroundImage(nsAttrValue& value);
 
   const mozilla::StyleBackendType mType;
-  nsPresContext* const mPresContext;
+  nsIDocument* const mDocument;
   const uint32_t mSIDs;
 };
 
 } // namespace mozilla
 
 #endif // mozilla_GenericSpecifiedValues_h
--- a/layout/style/GenericSpecifiedValuesInlines.h
+++ b/layout/style/GenericSpecifiedValuesInlines.h
@@ -20,16 +20,29 @@
 
 namespace mozilla {
 
 MOZ_DEFINE_STYLO_METHODS(GenericSpecifiedValues,
                          nsRuleData,
                          ServoSpecifiedValues)
 
 bool
+GenericSpecifiedValues::ShouldIgnoreColors() const
+{
+  if (IsServo()) {
+    // Servo handles this during cascading.
+    //
+    // FIXME(emilio): We should eventually move it to the document though.
+    return false;
+  }
+
+  return !AsGecko()->mPresContext->UseDocumentColors();
+}
+
+bool
 GenericSpecifiedValues::PropertyIsSet(nsCSSPropertyID aId)
 {
   MOZ_STYLO_FORWARD(PropertyIsSet, (aId))
 }
 
 void
 GenericSpecifiedValues::SetIdentStringValue(nsCSSPropertyID aId,
                                             const nsString& aValue)
--- a/layout/style/ServoBindings.toml
+++ b/layout/style/ServoBindings.toml
@@ -51,16 +51,17 @@ headers = [
     "nsStyleStruct.h",
     "mozilla/ServoPropPrefList.h",
     "mozilla/StyleAnimationValue.h",
     "gfxFontConstants.h",
     "gfxFontFeatures.h",
     "nsThemeConstants.h",
     "mozilla/css/Loader.h",
     "mozilla/dom/AnimationEffectReadOnlyBinding.h",
+    "mozilla/dom/HTMLSlotElement.h",
     "mozilla/dom/KeyframeEffectBinding.h",
     "mozilla/AnimationPropertySegment.h",
     "mozilla/ComputedTiming.h",
     "mozilla/ComputedTimingFunction.h",
     "mozilla/Keyframe.h",
     "mozilla/ServoElementSnapshot.h",
     "mozilla/ServoElementSnapshotTable.h",
     "mozilla/css/ErrorReporter.h",
--- a/layout/style/ServoSpecifiedValues.cpp
+++ b/layout/style/ServoSpecifiedValues.cpp
@@ -2,35 +2,18 @@
 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #include "mozilla/ServoBindings.h"
 #include "mozilla/ServoSpecifiedValues.h"
 
-namespace {
-
-#define STYLE_STRUCT(name, checkdata_cb) | NS_STYLE_INHERIT_BIT(name)
-const uint64_t ALL_SIDS = 0
-#include "nsStyleStructList.h"
-  ;
-#undef STYLE_STRUCT
-
-} // anonymous namespace
-
 using namespace mozilla;
 
-ServoSpecifiedValues::ServoSpecifiedValues(nsPresContext* aContext,
-                                           RawServoDeclarationBlock* aDecl)
-
-  : GenericSpecifiedValues(StyleBackendType::Servo, aContext, ALL_SIDS)
-  , mDecl(aDecl)
-{}
-
 bool
 ServoSpecifiedValues::PropertyIsSet(nsCSSPropertyID aId)
 {
   return Servo_DeclarationBlock_PropertyIsSet(mDecl, aId);
 }
 
 void
 ServoSpecifiedValues::SetIdentStringValue(nsCSSPropertyID aId,
@@ -40,19 +23,27 @@ ServoSpecifiedValues::SetIdentStringValu
   SetIdentAtomValue(aId, atom);
 }
 
 void
 ServoSpecifiedValues::SetIdentAtomValue(nsCSSPropertyID aId, nsAtom* aValue)
 {
   Servo_DeclarationBlock_SetIdentStringValue(mDecl, aId, aValue);
   if (aId == eCSSProperty__x_lang) {
-    // This forces the lang prefs result to be cached
-    // so that we can access them off main thread during traversal
-    mPresContext->ForceCacheLang(aValue);
+    // This forces the lang prefs result to be cached so that we can access them
+    // off main thread during traversal.
+    //
+    // FIXME(emilio): Can we move mapped attribute declarations across
+    // documents? Isn't this wrong in that case? This is pretty out of place
+    // anyway.
+    if (nsIPresShell* shell = mDocument->GetShell()) {
+      if (nsPresContext* pc = shell->GetPresContext()) {
+        pc->ForceCacheLang(aValue);
+      }
+    }
   }
 }
 
 void
 ServoSpecifiedValues::SetKeywordValue(nsCSSPropertyID aId, int32_t aValue)
 {
   Servo_DeclarationBlock_SetKeywordValue(mDecl, aId, aValue);
 }
@@ -124,10 +115,10 @@ ServoSpecifiedValues::SetBackgroundImage
 {
   if (aValue.Type() != nsAttrValue::eURL &&
       aValue.Type() != nsAttrValue::eImage) {
     return;
   }
   nsAutoString str;
   aValue.ToString(str);
   Servo_DeclarationBlock_SetBackgroundImage(
-    mDecl, str, mPresContext->Document()->DefaultStyleAttrURLData());
+    mDecl, str, mDocument->DefaultStyleAttrURLData());
 }
--- a/layout/style/ServoSpecifiedValues.h
+++ b/layout/style/ServoSpecifiedValues.h
@@ -9,24 +9,27 @@
  * attributes
  */
 
 #ifndef mozilla_ServoSpecifiedValues_h
 #define mozilla_ServoSpecifiedValues_h
 
 #include "mozilla/GenericSpecifiedValues.h"
 #include "mozilla/ServoBindingTypes.h"
+#include "nsStyleStruct.h"
 
 namespace mozilla {
 
 class ServoSpecifiedValues final : public GenericSpecifiedValues
 {
 public:
-  ServoSpecifiedValues(nsPresContext* aContext,
-                       RawServoDeclarationBlock* aDecl);
+  ServoSpecifiedValues(nsIDocument* aDocument, RawServoDeclarationBlock* aDecl)
+    : GenericSpecifiedValues(StyleBackendType::Servo, aDocument, NS_STYLE_INHERIT_MASK)
+    , mDecl(aDecl)
+  {}
 
   // GenericSpecifiedValues overrides
   bool PropertyIsSet(nsCSSPropertyID aId);
 
   void SetIdentStringValue(nsCSSPropertyID aId, const nsString& aValue);
 
   void SetIdentAtomValue(nsCSSPropertyID aId, nsAtom* aValue);
 
--- a/layout/style/ServoStyleSet.cpp
+++ b/layout/style/ServoStyleSet.cpp
@@ -348,17 +348,17 @@ ServoStyleSet::Snapshots()
 {
   return mPresContext->RestyleManager()->AsServo()->Snapshots();
 }
 
 void
 ServoStyleSet::ResolveMappedAttrDeclarationBlocks()
 {
   if (nsHTMLStyleSheet* sheet = mPresContext->Document()->GetAttributeStyleSheet()) {
-    sheet->CalculateMappedServoDeclarations(mPresContext);
+    sheet->CalculateMappedServoDeclarations();
   }
 
   mPresContext->Document()->ResolveScheduledSVGPresAttrs();
 }
 
 void
 ServoStyleSet::PreTraverseSync()
 {
--- a/layout/style/nsHTMLStyleSheet.cpp
+++ b/layout/style/nsHTMLStyleSheet.cpp
@@ -562,28 +562,25 @@ nsHTMLStyleSheet::DropMappedAttributes(n
 #endif
 
   mMappedAttrTable.Remove(aMapped);
 
   NS_ASSERTION(entryCount == mMappedAttrTable.EntryCount(), "not removed");
 }
 
 void
-nsHTMLStyleSheet::CalculateMappedServoDeclarations(nsPresContext* aPresContext)
+nsHTMLStyleSheet::CalculateMappedServoDeclarations()
 {
-  MOZ_ASSERT(!mDocument->GetShell() ||
-             mDocument->GetShell()->GetPresContext() == aPresContext);
-
   for (auto iter = mMappedAttrTable.Iter(); !iter.Done(); iter.Next()) {
     MappedAttrTableEntry* attr = static_cast<MappedAttrTableEntry*>(iter.Get());
     if (attr->mAttributes->GetServoStyle()) {
       // Only handle cases which haven't been filled in already
       continue;
     }
-    attr->mAttributes->LazilyResolveServoDeclaration(aPresContext);
+    attr->mAttributes->LazilyResolveServoDeclaration(mDocument);
   }
 }
 
 nsIStyleRule*
 nsHTMLStyleSheet::LangRuleFor(const nsAtom* aLanguage)
 {
   auto entry =
     static_cast<LangRuleTableEntry*>(mLangRuleTable.Add(aLanguage, fallible));
--- a/layout/style/nsHTMLStyleSheet.h
+++ b/layout/style/nsHTMLStyleSheet.h
@@ -72,17 +72,17 @@ public:
 
   // Mapped Attribute management methods
   already_AddRefed<nsMappedAttributes>
     UniqueMappedAttributes(nsMappedAttributes* aMapped);
   void DropMappedAttributes(nsMappedAttributes* aMapped);
   // For each mapped presentation attribute in the cache, resolve
   // the attached ServoDeclarationBlock by running the mapping
   // and converting the ruledata to Servo specified values.
-  void CalculateMappedServoDeclarations(nsPresContext* aPresContext);
+  void CalculateMappedServoDeclarations();
 
   nsIStyleRule* LangRuleFor(const nsAtom* aLanguage);
 
 private:
   nsHTMLStyleSheet(const nsHTMLStyleSheet& aCopy) = delete;
   nsHTMLStyleSheet& operator=(const nsHTMLStyleSheet& aCopy) = delete;
 
   ~nsHTMLStyleSheet() {}
--- a/layout/style/nsRuleData.cpp
+++ b/layout/style/nsRuleData.cpp
@@ -3,16 +3,18 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #include "nsRuleData.h"
 
 #include "nsAttrValueInlines.h"
 #include "nsCSSParser.h"
+#include "nsPresContext.h"
+#include "mozilla/GeckoStyleContext.h"
 #include "mozilla/Poison.h"
 #include <stdint.h>
 
 using namespace mozilla;
 
 inline size_t
 nsRuleData::GetPoisonOffset()
 {
@@ -26,20 +28,20 @@ nsRuleData::GetPoisonOffset()
   static_assert(size_t(-1) > size_t(0), "expect size_t to be unsigned");
   uintptr_t framePoisonValue = mozPoisonValue();
   return size_t(framePoisonValue - uintptr_t(mValueStorage)) /
          sizeof(nsCSSValue);
 }
 
 nsRuleData::nsRuleData(uint32_t aSIDs,
                        nsCSSValue* aValueStorage,
-                       nsPresContext* aContext,
                        GeckoStyleContext* aStyleContext)
-  : GenericSpecifiedValues(StyleBackendType::Gecko, aContext, aSIDs)
+  : GenericSpecifiedValues(StyleBackendType::Gecko, aStyleContext->PresContext()->Document(), aSIDs)
   , mStyleContext(aStyleContext)
+  , mPresContext(aStyleContext->PresContext())
   , mValueStorage(aValueStorage)
 {
 #ifndef MOZ_VALGRIND
   size_t framePoisonOffset = GetPoisonOffset();
   for (size_t i = 0; i < nsStyleStructID_Length; ++i) {
     mValueOffsets[i] = framePoisonOffset;
   }
 #endif
@@ -66,17 +68,17 @@ nsRuleData::SetTextDecorationColorOverri
 
 void
 nsRuleData::SetBackgroundImage(nsAttrValue& aValue)
 {
   nsCSSValue* backImage = ValueForBackgroundImage();
   // If the value is an image, or it is a URL and we attempted a load,
   // put it in the style tree.
   if (aValue.Type() == nsAttrValue::eURL) {
-    aValue.LoadImage(mPresContext->Document());
+    aValue.LoadImage(mDocument);
   }
   if (aValue.Type() == nsAttrValue::eImage) {
     nsCSSValueList* list = backImage->SetListValue();
     list->mValue.SetImageValue(aValue.GetImageValue());
   }
 }
 
 #ifdef DEBUG
--- a/layout/style/nsRuleData.h
+++ b/layout/style/nsRuleData.h
@@ -31,16 +31,17 @@ class GeckoStyleContext;
 typedef void (*nsPostResolveFunc)(void* aStyleStruct, nsRuleData* aData);
 
 struct nsRuleData final : mozilla::GenericSpecifiedValues
 {
   mozilla::RuleNodeCacheConditions mConditions;
   bool mIsImportantRule;
   mozilla::SheetType mLevel;
   mozilla::GeckoStyleContext* const mStyleContext;
+  nsPresContext* const mPresContext;
 
   // We store nsCSSValues needed to compute the data for one or more
   // style structs (specified by the bitfield mSIDs).  These are stored
   // in a single array allocation (which our caller allocates; see
   // AutoCSSValueArray)   The offset of each property |prop| in
   // mValueStorage is the sum of
   // mValueOffsets[nsCSSProps::kSIDTable[prop]] and
   // nsCSSProps::PropertyIndexInStruct(prop).  The only place we gather
@@ -50,17 +51,16 @@ struct nsRuleData final : mozilla::Gener
   // mValueOffsets for the one struct in mSIDs is zero.
   nsCSSValue* const mValueStorage; // our user owns this array
   size_t mValueOffsets[nsStyleStructID_Length];
 
   nsAutoPtr<mozilla::CSSVariableDeclarations> mVariables;
 
   nsRuleData(uint32_t aSIDs,
              nsCSSValue* aValueStorage,
-             nsPresContext* aContext,
              mozilla::GeckoStyleContext* aStyleContext);
 
 #ifdef DEBUG
   ~nsRuleData();
 #else
   ~nsRuleData() {}
 #endif
 
--- a/layout/style/nsRuleNode.cpp
+++ b/layout/style/nsRuleNode.cpp
@@ -2469,17 +2469,17 @@ nsRuleNode::WalkRuleTree(const nsStyleSt
   // use placement new[] on the result of alloca() to allocate a
   // variable-sized stack array, including execution of constructors,
   // and use an RAII class to run the destructors too.
   size_t nprops = nsCSSProps::PropertyCountInStruct(aSID);
   void* dataStorage = alloca(nprops * sizeof(nsCSSValue));
   AutoCSSValueArray dataArray(dataStorage, nprops);
 
   nsRuleData ruleData(nsCachedStyleData::GetBitForSID(aSID),
-                      dataArray.get(), mPresContext, aContext);
+                      dataArray.get(), aContext);
   ruleData.mValueOffsets[aSID] = 0;
 
   // We start at the most specific rule in the tree.
   void* startStruct = nullptr;
 
   nsRuleNode* ruleNode = this;
   nsRuleNode* highestNode = nullptr; // The highest node in the rule tree
                                     // that has the same properties
@@ -4079,18 +4079,17 @@ nsRuleNode::SetGenericFont(nsPresContext
   // and use an RAII class to run the destructors too.
   size_t nprops = nsCSSProps::PropertyCountInStruct(eStyleStruct_Font);
   void* dataStorage = alloca(nprops * sizeof(nsCSSValue));
 
   for (int32_t i = contextPath.Length() - 1; i >= 0; --i) {
     GeckoStyleContext* context = contextPath[i];
     AutoCSSValueArray dataArray(dataStorage, nprops);
 
-    nsRuleData ruleData(NS_STYLE_INHERIT_BIT(Font), dataArray.get(),
-                        aPresContext, context);
+    nsRuleData ruleData(NS_STYLE_INHERIT_BIT(Font), dataArray.get(), context);
     ruleData.mValueOffsets[eStyleStruct_Font] = 0;
 
     // Trimmed down version of ::WalkRuleTree() to re-apply the style rules
     // Note that we *do* need to do this for our own data, since what is
     // in |fontData| in ComputeFontData is only for the rules below
     // aStartStruct.
     for (nsRuleNode* ruleNode = context->RuleNode(); ruleNode;
          ruleNode = ruleNode->GetParent()) {
@@ -10188,18 +10187,17 @@ nsRuleNode::HasAuthorSpecifiedRules(Geck
     paddingOffset = nprops;
     nprops += nsCSSProps::PropertyCountInStruct(eStyleStruct_Padding);
   }
 
   void* dataStorage = alloca(nprops * sizeof(nsCSSValue));
   AutoCSSValueArray dataArray(dataStorage, nprops);
 
   /* We're relying on the use of |styleContext| not mutating it! */
-  nsRuleData ruleData(inheritBits, dataArray.get(),
-                      styleContext->PresContext(), styleContext);
+  nsRuleData ruleData(inheritBits, dataArray.get(), styleContext);
 
   if (ruleTypeMask & NS_AUTHOR_SPECIFIED_BACKGROUND) {
     ruleData.mValueOffsets[eStyleStruct_Background] = backgroundOffset;
   }
 
   if (ruleTypeMask & NS_AUTHOR_SPECIFIED_BORDER) {
     ruleData.mValueOffsets[eStyleStruct_Border] = borderOffset;
   }
@@ -10382,18 +10380,17 @@ nsRuleNode::ComputePropertiesOverridingA
       nprops += nsCSSProps::PropertyCountInStruct(sid);
     }
   }
 
   void* dataStorage = alloca(nprops * sizeof(nsCSSValue));
   AutoCSSValueArray dataArray(dataStorage, nprops);
 
   // We're relying on the use of |aStyleContext| not mutating it!
-  nsRuleData ruleData(structBits, dataArray.get(),
-                      aStyleContext->PresContext(), aStyleContext);
+  nsRuleData ruleData(structBits, dataArray.get(), aStyleContext);
   for (nsStyleStructID sid = nsStyleStructID(0);
        sid < nsStyleStructID_Length; sid = nsStyleStructID(sid + 1)) {
     if (structBits & nsCachedStyleData::GetBitForSID(sid)) {
       ruleData.mValueOffsets[sid] = offsets[sid];
     }
   }
 
   /*
--- a/layout/xul/nsMenuBarFrame.cpp
+++ b/layout/xul/nsMenuBarFrame.cpp
@@ -157,21 +157,18 @@ nsMenuBarFrame::FindMenuWithShortcut(nsI
   }
   if (accessKeys.IsEmpty() && charCode)
     accessKeys.AppendElement(charCode);
 
   if (accessKeys.IsEmpty())
     return nullptr; // no character was pressed so just return
 
   // Enumerate over our list of frames.
-  auto insertion = PresShell()->FrameConstructor()->
-    GetInsertionPoint(GetContent(), nullptr);
-  nsContainerFrame* immediateParent = insertion.mParentFrame;
-  if (!immediateParent)
-    immediateParent = this;
+  nsContainerFrame* immediateParent =
+    nsXULPopupManager::ImmediateParentFrame(this);
 
   // Find a most preferred accesskey which should be returned.
   nsIFrame* foundMenu = nullptr;
   size_t foundIndex = accessKeys.NoIndex;
   nsIFrame* currFrame = immediateParent->PrincipalChildList().FirstChild();
 
   while (currFrame) {
     nsIContent* current = currFrame->GetContent();
--- a/layout/xul/nsMenuPopupFrame.cpp
+++ b/layout/xul/nsMenuPopupFrame.cpp
@@ -2085,22 +2085,18 @@ nsMenuPopupFrame::FindMenuWithShortcut(n
 {
   uint32_t charCode, keyCode;
   aKeyEvent->GetCharCode(&charCode);
   aKeyEvent->GetKeyCode(&keyCode);
 
   doAction = false;
 
   // Enumerate over our list of frames.
-  auto insertion = PresShell()->
-    FrameConstructor()->GetInsertionPoint(GetContent(), nullptr);
-  nsContainerFrame* immediateParent = insertion.mParentFrame;
-  if (!immediateParent)
-    immediateParent = this;
-
+  nsContainerFrame* immediateParent =
+    nsXULPopupManager::ImmediateParentFrame(this);
   uint32_t matchCount = 0, matchShortcutCount = 0;
   bool foundActive = false;
   nsMenuFrame* frameBefore = nullptr;
   nsMenuFrame* frameAfter = nullptr;
   nsMenuFrame* frameShortcut = nullptr;
 
   nsIContent* parentContent = mContent->GetParent();
 
--- a/layout/xul/nsTextBoxFrame.cpp
+++ b/layout/xul/nsTextBoxFrame.cpp
@@ -696,17 +696,17 @@ nsTextBoxFrame::CalculateTitleForWidth(g
                 ptrdiff_t length = nextPos - pos;
                 charWidth = nsLayoutUtils::AppUnitWidthOfString(pos, length,
                                                                 *fm,
                                                                 drawTarget);
                 if (totalWidth + charWidth > aWidth) {
                     break;
                 }
 
-                if (UCS2_CHAR_IS_BIDI(*pos)) {
+                if (UTF16_CODE_UNIT_IS_BIDI(*pos)) {
                     AddStateBits(NS_FRAME_IS_BIDI);
                 }
                 pos = nextPos;
                 totalWidth += charWidth;
             }
 
             if (pos == dataBegin) {
                 return titleWidth;
@@ -733,17 +733,17 @@ nsTextBoxFrame::CalculateTitleForWidth(g
                 ptrdiff_t length = prevPos - pos;
                 charWidth = nsLayoutUtils::AppUnitWidthOfString(pos, length,
                                                                 *fm,
                                                                 drawTarget);
                 if (totalWidth + charWidth > aWidth) {
                     break;
                 }
 
-                if (UCS2_CHAR_IS_BIDI(*pos)) {
+                if (UTF16_CODE_UNIT_IS_BIDI(*pos)) {
                     AddStateBits(NS_FRAME_IS_BIDI);
                 }
                 prevPos = pos;
                 totalWidth += charWidth;
             }
 
             if (prevPos == dataEnd) {
                 return titleWidth;
@@ -785,17 +785,17 @@ nsTextBoxFrame::CalculateTitleForWidth(g
                 length = pos - leftPos;
                 charWidth = nsLayoutUtils::AppUnitWidthOfString(leftPos, length,
                                                                 *fm,
                                                                 drawTarget);
                 if (totalWidth + charWidth > aWidth) {
                     break;
                 }
 
-                if (UCS2_CHAR_IS_BIDI(*leftPos)) {
+                if (UTF16_CODE_UNIT_IS_BIDI(*leftPos)) {
                     AddStateBits(NS_FRAME_IS_BIDI);
                 }
 
                 leftString.Append(leftPos, length);
                 leftPos = pos;
                 totalWidth += charWidth;
 
                 if (leftPos >= rightPos) {
@@ -807,17 +807,17 @@ nsTextBoxFrame::CalculateTitleForWidth(g
                 length = rightPos - pos;
                 charWidth = nsLayoutUtils::AppUnitWidthOfString(pos, length,
                                                                 *fm,
                                                                 drawTarget);
                 if (totalWidth + charWidth > aWidth) {
                     break;
                 }
 
-                if (UCS2_CHAR_IS_BIDI(*pos)) {
+                if (UTF16_CODE_UNIT_IS_BIDI(*pos)) {
                     AddStateBits(NS_FRAME_IS_BIDI);
                 }
 
                 rightString.Insert(pos, 0, length);
                 rightPos = pos;
                 totalWidth += charWidth;
             }
 
--- a/layout/xul/nsXULPopupManager.cpp
+++ b/layout/xul/nsXULPopupManager.cpp
@@ -2428,29 +2428,42 @@ nsXULPopupManager::HandleKeyboardEventWi
   if (consume) {
     aKeyEvent->AsEvent()->StopPropagation();
     aKeyEvent->AsEvent()->StopCrossProcessForwarding();
     aKeyEvent->AsEvent()->PreventDefault();
   }
   return true;
 }
 
+nsContainerFrame*
+nsXULPopupManager::ImmediateParentFrame(nsContainerFrame* aFrame)
+{
+  MOZ_ASSERT(aFrame && aFrame->GetContent());
+
+  bool multiple = false; // Unused
+  nsIContent* insertionPoint =
+    aFrame->GetContent()->OwnerDoc()->BindingManager()->
+      FindNestedSingleInsertionPoint(aFrame->GetContent(), &multiple);
+
+  nsCSSFrameConstructor* fc = aFrame->PresContext()->FrameConstructor();
+  nsContainerFrame* insertionFrame =
+    insertionPoint
+      ? fc->GetContentInsertionFrameFor(insertionPoint)
+      : nullptr;
+
+  return insertionFrame ? insertionFrame : aFrame;
+}
+
 nsMenuFrame*
 nsXULPopupManager::GetNextMenuItem(nsContainerFrame* aParent,
                                    nsMenuFrame* aStart,
                                    bool aIsPopup,
                                    bool aWrap)
 {
-  nsPresContext* presContext = aParent->PresContext();
-  auto insertion = presContext->PresShell()->
-    FrameConstructor()->GetInsertionPoint(aParent->GetContent(), nullptr);
-  nsContainerFrame* immediateParent = insertion.mParentFrame;
-  if (!immediateParent)
-    immediateParent = aParent;
-
+  nsContainerFrame* immediateParent = ImmediateParentFrame(aParent);
   nsIFrame* currFrame = nullptr;
   if (aStart) {
     if (aStart->GetNextSibling())
       currFrame = aStart->GetNextSibling();
     else if (aStart->GetParent()->GetContent()->IsXULElement(nsGkAtoms::menugroup))
       currFrame = aStart->GetParent()->GetNextSibling();
   }
   else
@@ -2500,23 +2513,17 @@ nsXULPopupManager::GetNextMenuItem(nsCon
 }
 
 nsMenuFrame*
 nsXULPopupManager::GetPreviousMenuItem(nsContainerFrame* aParent,
                                        nsMenuFrame* aStart,
                                        bool aIsPopup,
                                        bool aWrap)
 {
-  nsPresContext* presContext = aParent->PresContext();
-  auto insertion = presContext->PresShell()->
-    FrameConstructor()->GetInsertionPoint(aParent->GetContent(), nullptr);
-  nsContainerFrame* immediateParent = insertion.mParentFrame;
-  if (!immediateParent)
-    immediateParent = aParent;
-
+  nsContainerFrame* immediateParent = ImmediateParentFrame(aParent);
   const nsFrameList& frames(immediateParent->PrincipalChildList());
 
   nsIFrame* currFrame = nullptr;
   if (aStart) {
     if (aStart->GetPrevSibling())
       currFrame = aStart->GetPrevSibling();
     else if (aStart->GetParent()->GetContent()->IsXULElement(nsGkAtoms::menugroup))
       currFrame = aStart->GetParent()->GetPrevSibling();
--- a/layout/xul/nsXULPopupManager.h
+++ b/layout/xul/nsXULPopupManager.h
@@ -358,16 +358,23 @@ public:
   // initialize and shutdown methods called by nsLayoutStatics
   static nsresult Init();
   static void Shutdown();
 
   // returns a weak reference to the popup manager instance, could return null
   // if a popup manager could not be allocated
   static nsXULPopupManager* GetInstance();
 
+  // Returns the immediate parent frame of inserted children of aFrame's
+  // content.
+  //
+  // FIXME(emilio): Or something like that, because this is kind of broken in a
+  // variety of situations like multiple insertion points.
+  static nsContainerFrame* ImmediateParentFrame(nsContainerFrame* aFrame);
+
   // This should be called when a window is moved or resized to adjust the
   // popups accordingly.
   void AdjustPopupsOnWindowChange(nsPIDOMWindowOuter* aWindow);
   void AdjustPopupsOnWindowChange(nsIPresShell* aPresShell);
 
   // given a menu frame, find the prevous or next menu frame. If aPopup is
   // true then navigate a menupopup, from one item on the menu to the previous
   // or next one. This is used for cursor navigation between items in a popup
--- a/mobile/android/config/mozconfigs/android-aarch64/nightly
+++ b/mobile/android/config/mozconfigs/android-aarch64/nightly
@@ -1,12 +1,10 @@
 . "$topsrcdir/mobile/android/config/mozconfigs/common"
 
-ac_add_options --enable-profiling
-
 # Android
 ac_add_options --with-android-min-sdk=21
 ac_add_options --target=aarch64-linux-android
 
 ac_add_options --with-branding=mobile/android/branding/nightly
 
 export MOZILLA_OFFICIAL=1
 export MOZ_TELEMETRY_REPORTING=1
--- a/mobile/android/config/mozconfigs/android-api-16-frontend/nightly
+++ b/mobile/android/config/mozconfigs/android-api-16-frontend/nightly
@@ -14,18 +14,16 @@ NO_NDK=1
 . "$topsrcdir/mobile/android/config/mozconfigs/common"
 
 . "$topsrcdir/build/mozconfig.no-compile"
 
 ac_add_options --disable-tests
 
 # From here on, like ../android-api-16/nightly.
 
-ac_add_options --enable-profiling
-
 # Android
 # Warning: Before increasing the with-android-min-sdk value, please note several places in and out
 # of tree have to be changed. Otherwise, places like Treeherder or archive.mozilla.org will
 # advertise a bad API level. This may confuse people. As an example, please look at bug 1384482.
 # If you think you can't handle the whole set of changes, please reach out to the Release
 # Engineering team.
 ac_add_options --with-android-min-sdk=16
 ac_add_options --target=arm-linux-androideabi
--- a/mobile/android/config/mozconfigs/android-api-16-gradle-dependencies/nightly
+++ b/mobile/android/config/mozconfigs/android-api-16-gradle-dependencies/nightly
@@ -19,18 +19,16 @@ ac_add_options --with-gradle
 export GRADLE_MAVEN_REPOSITORIES="http://localhost:8081/nexus/content/repositories/jcenter/","http://localhost:8081/nexus/content/repositories/google/"
 
 # From here on, just like ../android-api-16-frontend/nightly.
 
 . "$topsrcdir/build/mozconfig.no-compile"
 
 ac_add_options --disable-tests
 
-ac_add_options --enable-profiling
-
 # Android
 # Warning: Before increasing the with-android-min-sdk value, please note several places in and out
 # of tree have to be changed. Otherwise, places like Treeherder or archive.mozilla.org will
 # advertise a bad API level. This may confuse people. As an example, please look at bug 1384482.
 # If you think you can't handle the whole set of changes, please reach out to the Release
 # Engineering team.
 ac_add_options --with-android-min-sdk=16
 ac_add_options --target=arm-linux-androideabi
--- a/mobile/android/config/mozconfigs/android-api-16/nightly
+++ b/mobile/android/config/mozconfigs/android-api-16/nightly
@@ -1,12 +1,10 @@
 . "$topsrcdir/mobile/android/config/mozconfigs/common"
 
-ac_add_options --enable-profiling
-
 # Android
 # Warning: Before increasing the with-android-min-sdk value, please note several places in and out
 # of tree have to be changed. Otherwise, places like Treeherder or archive.mozilla.org will
 # advertise a bad API level. This may confuse people. As an example, please look at bug 1384482.
 # If you think you can't handle the whole set of changes, please reach out to the Release
 # Engineering team.
 ac_add_options --with-android-min-sdk=16
 ac_add_options --target=arm-linux-androideabi
--- a/mobile/android/config/mozconfigs/android-x86/nightly
+++ b/mobile/android/config/mozconfigs/android-x86/nightly
@@ -3,17 +3,15 @@
 # Warning: Before increasing the with-android-min-sdk value, please note several places in and out
 # of tree have to be changed. Otherwise, places like Treeherder or archive.mozilla.org will
 # advertise a bad API level. This may confuse people. As an example, please look at bug 1384482.
 # If you think you can't handle the whole set of changes, please reach out to the Release
 # Engineering team.
 ac_add_options --target=i386-linux-android
 ac_add_options --with-android-min-sdk=16
 
-ac_add_options --enable-profiling
-
 ac_add_options --with-branding=mobile/android/branding/nightly
 
 export MOZILLA_OFFICIAL=1
 export MOZ_TELEMETRY_REPORTING=1
 export MOZ_ANDROID_POCKET=1
 
 . "$topsrcdir/mobile/android/config/mozconfigs/common.override"
--- a/modules/libpref/init/all.js
+++ b/modules/libpref/init/all.js
@@ -3089,21 +3089,17 @@ pref("layout.css.control-characters.visi
 
 // Is support for column-span enabled?
 pref("layout.css.column-span.enabled", false);
 
 // Are inter-character ruby annotations enabled?
 pref("layout.css.ruby.intercharacter.enabled", false);
 
 // Is support for overscroll-behavior enabled?
-#ifdef RELEASE_OR_BETA
-pref("layout.css.overscroll-behavior.enabled", false);
-#else
 pref("layout.css.overscroll-behavior.enabled", true);
-#endif
 
 // pref for which side vertical scrollbars should be on
 // 0 = end-side in UI direction
 // 1 = end-side in document/content direction
 // 2 = right
 // 3 = left
 pref("layout.scrollbar.side", 0);
 
--- a/python/mach_commands.py
+++ b/python/mach_commands.py
@@ -57,17 +57,17 @@ class MachCommands(MachCommandBase):
 
         return self.run_process([python_path] + args,
                                 pass_thru=True,  # Allow user to run Python interactively.
                                 ensure_exit_code=False,  # Don't throw on non-zero exit code.
                                 append_env=append_env)
 
     @Command('python-test', category='testing',
              description='Run Python unit tests with an appropriate test runner.')
-    @CommandArgument('--verbose',
+    @CommandArgument('-v', '--verbose',
                      default=False,
                      action='store_true',
                      help='Verbose output.')
     @CommandArgument('--stop',
                      default=False,
                      action='store_true',
                      help='Stop running tests after the first error or failure.')
     @CommandArgument('-j', '--jobs',
--- a/python/mozbuild/mozbuild/action/test_archive.py
+++ b/python/mozbuild/mozbuild/action/test_archive.py
@@ -222,16 +222,22 @@ ARCHIVE_FILES = {
         },
         {
             'source': buildconfig.topsrcdir,
             'base': 'python/mozterm',
             'pattern': '**',
             'dest': 'tools/mozterm',
         },
         {
+            'source': buildconfig.topsrcdir,
+            'base': 'third_party/python/six',
+            'pattern': '**',
+            'dest': 'tools/six',
+        },
+        {
             'source': buildconfig.topobjdir,
             'base': '',
             'pattern': 'mozinfo.json',
         },
         {
             'source': buildconfig.topobjdir,
             'base': 'dist/bin',
             'patterns': [
--- a/servo/.travis.yml
+++ b/servo/.travis.yml
@@ -15,31 +15,33 @@ matrix:
       before_install:
         - sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y
         - sudo add-apt-repository 'deb http://apt.llvm.org/precise/ llvm-toolchain-precise-3.9 main' -y
         - sudo apt-get update -q
         - sudo apt-get install clang-3.9 llvm-3.9 llvm-3.9-runtime -y
         - export LLVM_CONFIG=/usr/lib/llvm-3.9/bin/llvm-config
         - export CC=gcc-5 CXX=g++-5
       script:
-         - RUSTFLAGS='-D warnings' ./mach build -d --verbose
-         - RUSTFLAGS='-D warnings' ./mach test-unit
+         - ./mach build -d --verbose
+         - ./mach test-unit
          - ./mach clean
-         - RUSTFLAGS='-D warnings' ./mach build-geckolib
-         - RUSTFLAGS='-D warnings' ./mach test-stylo
+         - ./mach build-geckolib
+         - ./mach test-stylo
          - bash etc/ci/lockfile_changed.sh
       cache:
         directories:
           - .cargo
           - .servo
           - $HOME/.ccache
       before_cache:
         - ./mach clean-nightlies --keep 2 --force
         - ./mach clean-cargo-cache --keep 2 --force
-      env: CCACHE=/usr/bin/ccache
+      env:
+        CCACHE=/usr/bin/ccache
+        RUSTFLAGS=-Dwarnings
       addons:
         apt:
           sources:
             - ubuntu-toolchain-r-test
             - sourceline: 'ppa:jonathonf/ffmpeg-3'
           packages:
             - cmake
             - dbus-x11
--- a/servo/Cargo.lock
+++ b/servo/Cargo.lock
@@ -1241,17 +1241,17 @@ dependencies = [
 
 [[package]]
 name = "html5ever"
 version = "0.22.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "mac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "markup5ever 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "markup5ever 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
  "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "httparse"
 version = "1.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1716,17 +1716,17 @@ name = "malloc_size_of_tests"
 version = "0.0.1"
 dependencies = [
  "malloc_size_of 0.0.1",
  "servo_arc 0.0.1",
 ]
 
 [[package]]
 name = "markup5ever"
-version = "0.7.0"
+version = "0.7.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "phf 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)",
  "phf_codegen 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde_json 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "string_cache 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -3562,17 +3562,17 @@ dependencies = [
  "url 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "uuid 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "webdriver 0.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "webrender"
 version = "0.56.1"
-source = "git+https://github.com/servo/webrender#a21197eb1e427730c7bec6eec07bc6cc352d452e"
+source = "git+https://github.com/servo/webrender#007c61df33081caec1163db17305ccc191da7d99"
 dependencies = [
  "app_units 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "bincode 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "bitflags 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-foundation 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-graphics 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-text 8.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -3590,17 +3590,17 @@ dependencies = [
  "thread_profiler 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "time 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)",
  "webrender_api 0.56.1 (git+https://github.com/servo/webrender)",
 ]
 
 [[package]]
 name = "webrender_api"
 version = "0.56.1"
-source = "git+https://github.com/servo/webrender#a21197eb1e427730c7bec6eec07bc6cc352d452e"
+source = "git+https://github.com/servo/webrender#007c61df33081caec1163db17305ccc191da7d99"
 dependencies = [
  "app_units 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "bincode 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "bitflags 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-foundation 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-graphics 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "dwrote 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -3735,17 +3735,17 @@ dependencies = [
 
 [[package]]
 name = "xml5ever"
 version = "0.12.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "mac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "markup5ever 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "markup5ever 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "time 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [metadata]
 "checksum adler32 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3ff33fe13a08dbce05bcefa2c68eea4844941437e33d6f808240b54d7157b9cd"
 "checksum aho-corasick 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "500909c4f87a9e52355b26626d890833e9e1d53ac566db76c36faa984b889699"
 "checksum alloc-no-stdlib 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b21f6ad9c9957eb5d70c3dee16d31c092b3cab339628f821766b05e6833d72b8"
 "checksum android_glue 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d8289e9637439939cc92b1995b0972117905be88bc28116c86b64d6e589bcd38"
@@ -3880,17 +3880,17 @@ dependencies = [
 "checksum leaky-cow 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "40a8225d44241fd324a8af2806ba635fc7c8a7e9a7de4d5cf3ef54e71f5926fc"
 "checksum libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "5ba3df4dcb460b9dfbd070d41c94c19209620c191b0340b929ce748a2bcd42d2"
 "checksum libloading 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "be99f814beb3e9503a786a592c909692bb6d4fc5a695f6ed7987223acfbd5194"
 "checksum libz-sys 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)" = "87f737ad6cc6fd6eefe3d9dc5412f1573865bded441300904d2f42269e140f16"
 "checksum log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "880f77541efa6e5cc74e76910c9884d9859683118839d6a1dc3b11e63512565b"
 "checksum lzw 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7d947cbb889ed21c2a84be6ffbaebf5b4e0f4340638cba0444907e38b56be084"
 "checksum mac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4"
 "checksum malloc_buf 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb"
-"checksum markup5ever 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7bccd18e4fab95f4410dc4d714163c2e88dd80e39a2a013998e345f337a569ab"
+"checksum markup5ever 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c220b3a3d75543b76e5c1fcab6635a8430ab5f9bfa011d003c3787ae0abf4ffa"
 "checksum matches 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "efd7622e3022e1a6eaa602c4cea8912254e5582c9c692e9167714182244801b1"
 "checksum memchr 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1dbccc0e46f1ea47b9f17e6d67c5a96bd27030519c519c9c91327e31275a47b4"
 "checksum metadeps 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "73b122901b3a675fac8cecf68dcb2f0d3036193bc861d1ac0e1c337f7d5254c2"
 "checksum mime 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "9d69889cdc6336ed56b174514ce876c4c3dc564cc23dd872e7bca589bb2a36c8"
 "checksum mime 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e2e00e17be181010a91dbfefb01660b17311059dc8c7f48b9017677721e732bd"
 "checksum mime_guess 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "76da6df85047af8c0edfa53f48eb1073012ce1cc95c8fedc0a374f659a89dd65"
 "checksum miniz-sys 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "28eaee17666671fa872e567547e8428e83308ebe5808cdf6a0e28397dbe2c726"
 "checksum mio 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)" = "9e965267d4d58496fc4f740e9861118367f13570cadf66316ed2c3f2f14d87c7"
--- a/servo/README.md
+++ b/servo/README.md
@@ -110,17 +110,17 @@ sudo zypper install libX11-devel libexpa
 sudo pacman -S --needed base-devel git python2 python2-virtualenv python2-pip mesa cmake bzip2 libxmu glu pkg-config clang
 ```
 #### On Gentoo Linux
 
 ```sh
 sudo emerge net-misc/curl media-libs/freeglut \
     media-libs/freetype media-libs/mesa dev-util/gperf \
     dev-python/virtualenv dev-python/pip dev-libs/openssl \
-    x11-libs/libXmu media-libs/glu x11-base/xorg-server
+    x11-libs/libXmu media-libs/glu x11-base/xorg-server sys-devel/clang
 ```
 #### On Windows (MSVC)
 
 1. Install Python for Windows (https://www.python.org/downloads/release/python-2714/). The Windows x86-64 MSI installer is fine.
 You should change the installation to install the "Add python.exe to Path" feature.
 
 2. Install virtualenv.
 
--- a/servo/appveyor.yml
+++ b/servo/appveyor.yml
@@ -1,13 +1,14 @@
 version: 1.0.{build}
 
 environment:
   CCACHE_DIR: "%APPVEYOR_BUILD_FOLDER%\\.ccache"
   RUST_BACKTRACE: 1
+  RUSTFLAGS: -Dwarnings
   # The appveyor image we use has a pretty huge set of things installed... we make the
   # initial PATH something sane so we know what to expect
   PATH: "C:\\windows\\system32;\
     C:\\windows;\
     C:\\windows\\System32\\Wbem;\
     C:\\windows\\System32\\WindowsPowerShell\\v1.0;\
     C:\\ProgramData\\chocolatey\\bin;\
     C:\\Python27;\
@@ -43,13 +44,12 @@ cache:
 # Uncomment these lines to expose RDP access information to the build machine in the build log.
 #init:
 #  - ps: iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
 #
 #on_finish:
 #  - ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
 
 build_script:
-  - set RUSTFLAGS=-D warnings
   - mach build -d -v
   - mach test-unit
 
 test: off
--- a/servo/components/layout_thread/dom_wrapper.rs
+++ b/servo/components/layout_thread/dom_wrapper.rs
@@ -358,16 +358,20 @@ impl<'le> TElement for ServoLayoutElemen
     fn as_node(&self) -> ServoLayoutNode<'le> {
         ServoLayoutNode::from_layout_js(self.element.upcast())
     }
 
     fn traversal_children(&self) -> LayoutIterator<Self::TraversalChildrenIterator> {
         LayoutIterator(self.as_node().dom_children())
     }
 
+    fn is_html_element(&self) -> bool {
+        unsafe { self.element.is_html_element() }
+    }
+
     fn style_attribute(&self) -> Option<ArcBorrow<StyleLocked<PropertyDeclarationBlock>>> {
         unsafe {
             (*self.element.style_attribute()).as_ref().map(|x| x.borrow_arc())
         }
     }
 
     fn get_state(&self) -> ElementState {
         self.element.get_state_for_layout()
--- a/servo/components/selectors/builder.rs
+++ b/servo/components/selectors/builder.rs
@@ -93,23 +93,31 @@ impl<Impl: SelectorImpl> SelectorBuilder
     /// Returns true if combinators have ever been pushed to this builder.
     #[inline(always)]
     pub fn has_combinators(&self) -> bool {
         !self.combinators.is_empty()
     }
 
     /// Consumes the builder, producing a Selector.
     #[inline(always)]
-    pub fn build(&mut self, parsed_pseudo: bool) -> ThinArc<SpecificityAndFlags, Component<Impl>> {
+    pub fn build(
+        &mut self,
+        parsed_pseudo: bool,
+        parsed_slotted: bool,
+    ) -> ThinArc<SpecificityAndFlags, Component<Impl>> {
         // Compute the specificity and flags.
         let mut spec = SpecificityAndFlags(specificity(self.simple_selectors.iter()));
         if parsed_pseudo {
             spec.0 |= HAS_PSEUDO_BIT;
         }
 
+        if parsed_slotted {
+            spec.0 |= HAS_SLOTTED_BIT;
+        }
+
         self.build_with_specificity_and_flags(spec)
     }
 
 
     /// Builds with an explicit SpecificityAndFlags. This is separated from build() so
     /// that unit tests can pass an explicit specificity.
     #[inline(always)]
     pub fn build_with_specificity_and_flags(&mut self, spec: SpecificityAndFlags)
@@ -183,28 +191,38 @@ impl<'a, Impl: SelectorImpl> Iterator fo
     }
 }
 
 fn split_from_end<T>(s: &[T], at: usize) -> (&[T], &[T]) {
     s.split_at(s.len() - at)
 }
 
 pub const HAS_PSEUDO_BIT: u32 = 1 << 30;
+pub const HAS_SLOTTED_BIT: u32 = 1 << 31;
 
+/// We use ten bits for each specificity kind (id, class, element), and the two
+/// high bits for the pseudo and slotted flags.
 #[derive(Clone, Copy, Debug, Eq, PartialEq)]
 pub struct SpecificityAndFlags(pub u32);
 
 impl SpecificityAndFlags {
+    #[inline]
     pub fn specificity(&self) -> u32 {
-        self.0 & !HAS_PSEUDO_BIT
+        self.0 & !(HAS_PSEUDO_BIT | HAS_SLOTTED_BIT)
     }
 
+    #[inline]
     pub fn has_pseudo_element(&self) -> bool {
         (self.0 & HAS_PSEUDO_BIT) != 0
     }
+
+    #[inline]
+    pub fn is_slotted(&self) -> bool {
+        (self.0 & HAS_SLOTTED_BIT) != 0
+    }
 }
 
 const MAX_10BIT: u32 = (1u32 << 10) - 1;
 
 #[derive(Clone, Copy, Eq, Ord, PartialEq, PartialOrd)]
 struct Specificity {
     id_selectors: u32,
     class_like_selectors: u32,
--- a/servo/components/selectors/parser.rs
+++ b/servo/components/selectors/parser.rs
@@ -440,24 +440,32 @@ pub fn namespace_empty_string<Impl: Sele
 /// pseudo-classes on the right, it's faster to start matching on the left.
 ///
 /// This reordering doesn't change the semantics of selector matching, and we
 /// handle it in to_css to make it invisible to serialization.
 #[derive(Clone, Eq, PartialEq)]
 pub struct Selector<Impl: SelectorImpl>(ThinArc<SpecificityAndFlags, Component<Impl>>);
 
 impl<Impl: SelectorImpl> Selector<Impl> {
+    #[inline]
     pub fn specificity(&self) -> u32 {
         self.0.header.header.specificity()
     }
 
+    #[inline]
     pub fn has_pseudo_element(&self) -> bool {
         self.0.header.header.has_pseudo_element()
     }
 
+    #[inline]
+    pub fn is_slotted(&self) -> bool {
+        self.0.header.header.is_slotted()
+    }
+
+    #[inline]
     pub fn pseudo_element(&self) -> Option<&Impl::PseudoElement> {
         if !self.has_pseudo_element() {
             return None
         }
 
         for component in self.iter() {
             if let Component::PseudoElement(ref pseudo) = *component {
                 return Some(pseudo)
@@ -1214,17 +1222,17 @@ where
                         break 'outer_loop
                     }
                 }
             }
         }
         builder.push_combinator(combinator);
     }
 
-    Ok(Selector(builder.build(has_pseudo_element)))
+    Ok(Selector(builder.build(has_pseudo_element, slotted)))
 }
 
 impl<Impl: SelectorImpl> Selector<Impl> {
     /// Parse a selector, without any pseudo-element.
     pub fn parse<'i, 't, P>(
         parser: &P,
         input: &mut CssParser<'i, 't>,
     ) -> Result<Self, ParseError<'i, P::Error>>
--- a/servo/components/style/data.rs
+++ b/servo/components/style/data.rs
@@ -258,17 +258,19 @@ impl ElementData {
                 element.implemented_pseudo_element());
 
         if !element.has_snapshot() || element.handled_snapshot() {
             return InvalidationResult::empty();
         }
 
         let mut xbl_stylists = SmallVec::<[_; 3]>::new();
         let cut_off_inheritance =
-            element.each_xbl_stylist(|s| xbl_stylists.push(s));
+            element.each_applicable_non_document_style_rule_data(|data, quirks_mode| {
+                xbl_stylists.push((data, quirks_mode))
+            });
 
         let mut processor = StateAndAttrInvalidationProcessor::new(
             shared_context,
             &xbl_stylists,
             cut_off_inheritance,
             element,
             self,
             nth_index_cache,
--- a/servo/components/style/dom.rs
+++ b/servo/components/style/dom.rs
@@ -26,17 +26,17 @@ use selectors::matching::{ElementSelecto
 use selectors::sink::Push;
 use servo_arc::{Arc, ArcBorrow};
 use shared_lock::Locked;
 use std::fmt;
 #[cfg(feature = "gecko")] use hash::FnvHashMap;
 use std::fmt::Debug;
 use std::hash::Hash;
 use std::ops::Deref;
-use stylist::Stylist;
+use stylist::{StyleRuleCascadeData, Stylist};
 use traversal_flags::TraversalFlags;
 
 /// An opaque handle to a node, which, unlike UnsafeNode, cannot be transformed
 /// back into a non-opaque representation. The only safe operation that can be
 /// performed on this node is to compare it to another opaque handle or to another
 /// OpaqueNode.
 ///
 /// Layout and Graphics use this to safely represent nodes for comparison purposes.
@@ -411,16 +411,30 @@ pub trait TElement
 
     /// Execute `f` for each anonymous content child (apart from ::before and
     /// ::after) whose originating element is `self`.
     fn each_anonymous_content_child<F>(&self, _f: F)
     where
         F: FnMut(Self),
     {}
 
+    /// Return whether this element is an element in the HTML namespace.
+    fn is_html_element(&self) -> bool;
+
+    /// Returns whether this element is a <html:slot> element.
+    fn is_html_slot_element(&self) -> bool {
+        self.get_local_name() == &*local_name!("slot") &&
+        self.is_html_element()
+    }
+
+    /// Return the list of slotted nodes of this node.
+    fn slotted_nodes(&self) -> &[Self::ConcreteNode] {
+        &[]
+    }
+
     /// For a given NAC element, return the closest non-NAC ancestor, which is
     /// guaranteed to exist.
     fn closest_non_native_anonymous_ancestor(&self) -> Option<Self> {
         unreachable!("Servo doesn't know about NAC");
     }
 
     /// Get this element's style attribute.
     fn style_attribute(&self) -> Option<ArcBorrow<Locked<PropertyDeclarationBlock>>>;
@@ -755,16 +769,51 @@ pub trait TElement
     fn each_xbl_stylist<'a, F>(&self, _: F) -> bool
     where
         Self: 'a,
         F: FnMut(AtomicRef<'a, Stylist>),
     {
         false
     }
 
+    /// Executes the callback for each applicable style rule data which isn't
+    /// the main document's data (which stores UA / author rules).
+    ///
+    /// Returns whether normal document author rules should apply.
+    fn each_applicable_non_document_style_rule_data<'a, F>(&self, mut f: F) -> bool
+    where
+        Self: 'a,
+        F: FnMut(AtomicRef<'a, StyleRuleCascadeData>, QuirksMode),
+    {
+        let cut_off_inheritance = self.each_xbl_stylist(|stylist| {
+            let quirks_mode = stylist.quirks_mode();
+            f(
+                AtomicRef::map(stylist, |stylist| stylist.normal_author_cascade_data()),
+                quirks_mode,
+            )
+        });
+
+        let mut current = self.assigned_slot();
+        while let Some(slot) = current {
+            slot.each_xbl_stylist(|stylist| {
+                let quirks_mode = stylist.quirks_mode();
+                if stylist.slotted_author_cascade_data().is_some() {
+                    f(
+                        AtomicRef::map(stylist, |stylist| stylist.slotted_author_cascade_data().unwrap()),
+                        quirks_mode,
+                    )
+                }
+            });
+
+            current = slot.assigned_slot();
+        }
+
+        cut_off_inheritance
+    }
+
     /// Gets the current existing CSS transitions, by |property, end value| pairs in a FnvHashMap.
     #[cfg(feature = "gecko")]
     fn get_css_transitions_info(&self)
                                 -> FnvHashMap<LonghandId, Arc<AnimationValue>>;
 
     /// Does a rough (and cheap) check for whether or not transitions might need to be updated that
     /// will quickly return false for the common case of no transitions specified or running. If
     /// this returns false, we definitely don't need to update transitions but if it returns true
--- a/servo/components/style/dom_apis.rs
+++ b/servo/components/style/dom_apis.rs
@@ -3,17 +3,18 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 //! Generic implementations of some DOM APIs so they can be shared between Servo
 //! and Gecko.
 
 use Atom;
 use context::QuirksMode;
 use dom::{TDocument, TElement, TNode};
-use invalidation::element::invalidator::{Invalidation, InvalidationProcessor, InvalidationVector};
+use invalidation::element::invalidator::{DescendantInvalidationLists, Invalidation};
+use invalidation::element::invalidator::{InvalidationProcessor, InvalidationVector};
 use selectors::{Element, NthIndexCache, SelectorList};
 use selectors::attr::CaseSensitivity;
 use selectors::matching::{self, MatchingContext, MatchingMode};
 use selectors::parser::{Combinator, Component, LocalName};
 use smallvec::SmallVec;
 use std::borrow::Borrow;
 
 /// <https://dom.spec.whatwg.org/#dom-element-matches>
@@ -138,17 +139,17 @@ where
     Q::Output: 'a,
 {
     fn light_tree_only(&self) -> bool { true }
 
     fn collect_invalidations(
         &mut self,
         element: E,
         self_invalidations: &mut InvalidationVector<'a>,
-        descendant_invalidations: &mut InvalidationVector<'a>,
+        descendant_invalidations: &mut DescendantInvalidationLists<'a>,
         _sibling_invalidations: &mut InvalidationVector<'a>,
     ) -> bool {
         // TODO(emilio): If the element is not a root element, and
         // selector_list has any descendant combinator, we need to do extra work
         // in order to handle properly things like:
         //
         //   <div id="a">
         //     <div id="b">
@@ -158,17 +159,17 @@ where
         //
         // b.querySelector('#a div'); // Should return "c".
         //
         // For now, assert it's a root element.
         debug_assert!(element.parent_element().is_none());
 
         let target_vector =
             if self.matching_context.scope_element.is_some() {
-                descendant_invalidations
+                &mut descendant_invalidations.dom_descendants
             } else {
                 self_invalidations
             };
 
         for selector in self.selector_list.0.iter() {
             target_vector.push(Invalidation::new(selector, 0))
         }
 
--- a/servo/components/style/gecko/generated/atom_macro.rs
+++ b/servo/components/style/gecko/generated/atom_macro.rs
@@ -2271,18 +2271,16 @@ cfg_if! {
             #[link_name = "_ZN9nsGkAtoms5rangeE"]
             pub static nsGkAtoms_range: *mut nsStaticAtom;
             #[link_name = "_ZN9nsGkAtoms8readonlyE"]
             pub static nsGkAtoms_readonly: *mut nsStaticAtom;
             #[link_name = "_ZN9nsGkAtoms4rectE"]
             pub static nsGkAtoms_rect: *mut nsStaticAtom;
             #[link_name = "_ZN9nsGkAtoms9rectangleE"]
             pub static nsGkAtoms_rectangle: *mut nsStaticAtom;
-            #[link_name = "_ZN9nsGkAtoms3refE"]
-            pub static nsGkAtoms_ref: *mut nsStaticAtom;
             #[link_name = "_ZN9nsGkAtoms7refreshE"]
             pub static nsGkAtoms_refresh: *mut nsStaticAtom;
             #[link_name = "_ZN9nsGkAtoms3relE"]
             pub static nsGkAtoms_rel: *mut nsStaticAtom;
             #[link_name = "_ZN9nsGkAtoms12onreloadpageE"]
             pub static nsGkAtoms_onreloadpage: *mut nsStaticAtom;
             #[link_name = "_ZN9nsGkAtoms3remE"]
             pub static nsGkAtoms_rem: *mut nsStaticAtom;
@@ -2307,18 +2305,16 @@ cfg_if! {
             #[link_name = "_ZN9nsGkAtoms11resizeafterE"]
             pub static nsGkAtoms_resizeafter: *mut nsStaticAtom;
             #[link_name = "_ZN9nsGkAtoms12resizebeforeE"]
             pub static nsGkAtoms_resizebefore: *mut nsStaticAtom;
             #[link_name = "_ZN9nsGkAtoms7resizerE"]
             pub static nsGkAtoms_resizer: *mut nsStaticAtom;
             #[link_name = "_ZN9nsGkAtoms10resolutionE"]
             pub static nsGkAtoms_resolution: *mut nsStaticAtom;
-            #[link_name = "_ZN9nsGkAtoms8resourceE"]
-            pub static nsGkAtoms_resource: *mut nsStaticAtom;
             #[link_name = "_ZN9nsGkAtoms9resourcesE"]
             pub static nsGkAtoms_resources: *mut nsStaticAtom;
             #[link_name = "_ZN9nsGkAtoms6resultE"]
             pub static nsGkAtoms_result: *mut nsStaticAtom;
             #[link_name = "_ZN9nsGkAtoms12resultPrefixE"]
             pub static nsGkAtoms_resultPrefix: *mut nsStaticAtom;
             #[link_name = "_ZN9nsGkAtoms21retargetdocumentfocusE"]
             pub static nsGkAtoms_retargetdocumentfocus: *mut nsStaticAtom;
@@ -2481,24 +2477,16 @@ cfg_if! {
             #[link_name = "_ZN9nsGkAtoms13sortDirectionE"]
             pub static nsGkAtoms_sortDirection: *mut nsStaticAtom;
             #[link_name = "_ZN9nsGkAtoms6sortedE"]
             pub static nsGkAtoms_sorted: *mut nsStaticAtom;
             #[link_name = "_ZN9nsGkAtoms9sorthintsE"]
             pub static nsGkAtoms_sorthints: *mut nsStaticAtom;
             #[link_name = "_ZN9nsGkAtoms10sortLockedE"]
             pub static nsGkAtoms_sortLocked: *mut nsStaticAtom;
-            #[link_name = "_ZN9nsGkAtoms12sortResourceE"]
-            pub static nsGkAtoms_sortResource: *mut nsStaticAtom;
-            #[link_name = "_ZN9nsGkAtoms13sortResource2E"]
-            pub static nsGkAtoms_sortResource2: *mut nsStaticAtom;
-            #[link_name = "_ZN9nsGkAtoms14sortSeparatorsE"]
-            pub static nsGkAtoms_sortSeparators: *mut nsStaticAtom;
-            #[link_name = "_ZN9nsGkAtoms15sortStaticsLastE"]
-            pub static nsGkAtoms_sortStaticsLast: *mut nsStaticAtom;
             #[link_name = "_ZN9nsGkAtoms6sourceE"]
             pub static nsGkAtoms_source: *mut nsStaticAtom;
             #[link_name = "_ZN9nsGkAtoms5spaceE"]
             pub static nsGkAtoms_space: *mut nsStaticAtom;
             #[link_name = "_ZN9nsGkAtoms6spacerE"]
             pub static nsGkAtoms_spacer: *mut nsStaticAtom;
             #[link_name = "_ZN9nsGkAtoms4spanE"]
             pub static nsGkAtoms_span: *mut nsStaticAtom;
@@ -4369,18 +4357,18 @@ cfg_if! {
             #[link_name = "_ZN9nsGkAtoms18DisplayPortMarginsE"]
             pub static nsGkAtoms_DisplayPortMargins: *mut nsStaticAtom;
             #[link_name = "_ZN9nsGkAtoms15DisplayPortBaseE"]
             pub static nsGkAtoms_DisplayPortBase: *mut nsStaticAtom;
             #[link_name = "_ZN9nsGkAtoms30AsyncScrollLayerCreationFailedE"]
             pub static nsGkAtoms_AsyncScrollLayerCreationFailed: *mut nsStaticAtom;
             #[link_name = "_ZN9nsGkAtoms19forcemessagemanagerE"]
             pub static nsGkAtoms_forcemessagemanager: *mut nsStaticAtom;
-            #[link_name = "_ZN9nsGkAtoms16isPreloadBrowserE"]
-            pub static nsGkAtoms_isPreloadBrowser: *mut nsStaticAtom;
+            #[link_name = "_ZN9nsGkAtoms14preloadedStateE"]
+            pub static nsGkAtoms_preloadedState: *mut nsStaticAtom;
             #[link_name = "_ZN9nsGkAtoms24scrollbar_start_backwardE"]
             pub static nsGkAtoms_scrollbar_start_backward: *mut nsStaticAtom;
             #[link_name = "_ZN9nsGkAtoms23scrollbar_start_forwardE"]
             pub static nsGkAtoms_scrollbar_start_forward: *mut nsStaticAtom;
             #[link_name = "_ZN9nsGkAtoms22scrollbar_end_backwardE"]
             pub static nsGkAtoms_scrollbar_end_backward: *mut nsStaticAtom;
             #[link_name = "_ZN9nsGkAtoms21scrollbar_end_forwardE"]
             pub static nsGkAtoms_scrollbar_end_forward: *mut nsStaticAtom;
@@ -7458,18 +7446,16 @@ cfg_if! {
             #[link_name = "?range@nsGkAtoms@@2PEAVnsStaticAtom@@EA"]
             pub static nsGkAtoms_range: *mut nsStaticAtom;
             #[link_name = "?readonly@nsGkAtoms@@2PEAVnsStaticAtom@@EA"]
             pub static nsGkAtoms_readonly: *mut nsStaticAtom;
             #[link_name = "?rect@nsGkAtoms@@2PEAVnsStaticAtom@@EA"]
             pub static nsGkAtoms_rect: *mut nsStaticAtom;
             #[link_name = "?rectangle@nsGkAtoms@@2PEAVnsStaticAtom@@EA"]
             pub static nsGkAtoms_rectangle: *mut nsStaticAtom;
-            #[link_name = "?ref@nsGkAtoms@@2PEAVnsStaticAtom@@EA"]
-            pub static nsGkAtoms_ref: *mut nsStaticAtom;
             #[link_name = "?refresh@nsGkAtoms@@2PEAVnsStaticAtom@@EA"]
             pub static nsGkAtoms_refresh: *mut nsStaticAtom;
             #[link_name = "?rel@nsGkAtoms@@2PEAVnsStaticAtom@@EA"]
             pub static nsGkAtoms_rel: *mut nsStaticAtom;
             #[link_name = "?onreloadpage@nsGkAtoms@@2PEAVnsStaticAtom@@EA"]
             pub static nsGkAtoms_onreloadpage: *mut nsStaticAtom;
             #[link_name = "?rem@nsGkAtoms@@2PEAVnsStaticAtom@@EA"]
             pub static nsGkAtoms_rem: *mut nsStaticAtom;
@@ -7494,18 +7480,16 @@ cfg_if! {
             #[link_name = "?resizeafter@nsGkAtoms@@2PEAVnsStaticAtom@@EA"]
             pub static nsGkAtoms_resizeafter: *mut nsStaticAtom;
             #[link_name = "?resizebefore@nsGkAtoms@@2PEAVnsStaticAtom@@EA"]
             pub static nsGkAtoms_resizebefore: *mut nsStaticAtom;
             #[link_name = "?resizer@nsGkAtoms@@2PEAVnsStaticAtom@@EA"]
             pub static nsGkAtoms_resizer: *mut nsStaticAtom;
             #[link_name = "?resolution@nsGkAtoms@@2PEAVnsStaticAtom@@EA"]
             pub static nsGkAtoms_resolution: *mut nsStaticAtom;
-            #[link_name = "?resource@nsGkAtoms@@2PEAVnsStaticAtom@@EA"]
-            pub static nsGkAtoms_resource: *mut nsStaticAtom;
             #[link_name = "?resources@nsGkAtoms@@2PEAVnsStaticAtom@@EA"]
             pub static nsGkAtoms_resources: *mut nsStaticAtom;
             #[link_name = "?result@nsGkAtoms@@2PEAVnsStaticAtom@@EA"]
             pub static nsGkAtoms_result: *mut nsStaticAtom;
             #[link_name = "?resultPrefix@nsGkAtoms@@2PEAVnsStaticAtom@@EA"]
             pub static nsGkAtoms_resultPrefix: *mut nsStaticAtom;
             #[link_name = "?retargetdocumentfocus@nsGkAtoms@@2PEAVnsStaticAtom@@EA"]
             pub static nsGkAtoms_retargetdocumentfocus: *mut nsStaticAtom;
@@ -7668,24 +7652,16 @@ cfg_if! {
             #[link_name = "?sortDirection@nsGkAtoms@@2PEAVnsStaticAtom@@EA"]
             pub static nsGkAtoms_sortDirection: *mut nsStaticAtom;
             #[link_name = "?sorted@nsGkAtoms@@2PEAVnsStaticAtom@@EA"]
             pub static nsGkAtoms_sorted: *mut nsStaticAtom;
             #[link_name = "?sorthints@nsGkAtoms@@2PEAVnsStaticAtom@@EA"]
             pub static nsGkAtoms_sorthints: *mut nsStaticAtom;
             #[link_name = "?sortLocked@nsGkAtoms@@2PEAVnsStaticAtom@@EA"]
             pub static nsGkAtoms_sortLocked: *mut nsStaticAtom;
-            #[link_name = "?sortResource@nsGkAtoms@@2PEAVnsStaticAtom@@EA"]
-            pub static nsGkAtoms_sortResource: *mut nsStaticAtom;
-            #[link_name = "?sortResource2@nsGkAtoms@@2PEAVnsStaticAtom@@EA"]
-            pub static nsGkAtoms_sortResource2: *mut nsStaticAtom;
-            #[link_name = "?sortSeparators@nsGkAtoms@@2PEAVnsStaticAtom@@EA"]
-            pub static nsGkAtoms_sortSeparators: *mut nsStaticAtom;
-            #[link_name = "?sortStaticsLast@nsGkAtoms@@2PEAVnsStaticAtom@@EA"]
-            pub static nsGkAtoms_sortStaticsLast: *mut nsStaticAtom;
             #[link_name = "?source@nsGkAtoms@@2PEAVnsStaticAtom@@EA"]
             pub static nsGkAtoms_source: *mut nsStaticAtom;
             #[link_name = "?space@nsGkAtoms@@2PEAVnsStaticAtom@@EA"]
             pub static nsGkAtoms_space: *mut nsStaticAtom;
             #[link_name = "?spacer@nsGkAtoms@@2PEAVnsStaticAtom@@EA"]
             pub static nsGkAtoms_spacer: *mut nsStaticAtom;
             #[link_name = "?span@nsGkAtoms@@2PEAVnsStaticAtom@@EA"]
             pub static nsGkAtoms_span: *mut nsStaticAtom;
@@ -9556,18 +9532,18 @@ cfg_if! {
             #[link_name = "?DisplayPortMargins@nsGkAtoms@@2PEAVnsStaticAtom@@EA"]
             pub static nsGkAtoms_DisplayPortMargins: *mut nsStaticAtom;
             #[link_name = "?DisplayPortBase@nsGkAtoms@@2PEAVnsStaticAtom@@EA"]
             pub static nsGkAtoms_DisplayPortBase: *mut nsStaticAtom;
             #[link_name = "?AsyncScrollLayerCreationFailed@nsGkAtoms@@2PEAVnsStaticAtom@@EA"]
             pub static nsGkAtoms_AsyncScrollLayerCreationFailed: *mut nsStaticAtom;
             #[link_name = "?forcemessagemanager@nsGkAtoms@@2PEAVnsStaticAtom@@EA"]
             pub static nsGkAtoms_forcemessagemanager: *mut nsStaticAtom;
-            #[link_name = "?isPreloadBrowser@nsGkAtoms@@2PEAVnsStaticAtom@@EA"]
-            pub static nsGkAtoms_isPreloadBrowser: *mut nsStaticAtom;
+            #[link_name = "?preloadedState@nsGkAtoms@@2PEAVnsStaticAtom@@EA"]
+            pub static nsGkAtoms_preloadedState: *mut nsStaticAtom;
             #[link_name = "?scrollbar_start_backward@nsGkAtoms@@2PEAVnsStaticAtom@@EA"]
             pub static nsGkAtoms_scrollbar_start_backward: *mut nsStaticAtom;
             #[link_name = "?scrollbar_start_forward@nsGkAtoms@@2PEAVnsStaticAtom@@EA"]
             pub static nsGkAtoms_scrollbar_start_forward: *mut nsStaticAtom;
             #[link_name = "?scrollbar_end_backward@nsGkAtoms@@2PEAVnsStaticAtom@@EA"]
             pub static nsGkAtoms_scrollbar_end_backward: *mut nsStaticAtom;
             #[link_name = "?scrollbar_end_forward@nsGkAtoms@@2PEAVnsStaticAtom@@EA"]
             pub static nsGkAtoms_scrollbar_end_forward: *mut nsStaticAtom;
@@ -12645,18 +12621,16 @@ cfg_if! {
             #[link_name = "\x01?range@nsGkAtoms@@2PAVnsStaticAtom@@A"]
             pub static nsGkAtoms_range: *mut nsStaticAtom;
             #[link_name = "\x01?readonly@nsGkAtoms@@2PAVnsStaticAtom@@A"]
             pub static nsGkAtoms_readonly: *mut nsStaticAtom;
             #[link_name = "\x01?rect@nsGkAtoms@@2PAVnsStaticAtom@@A"]
             pub static nsGkAtoms_rect: *mut nsStaticAtom;
             #[link_name = "\x01?rectangle@nsGkAtoms@@2PAVnsStaticAtom@@A"]
             pub static nsGkAtoms_rectangle: *mut nsStaticAtom;
-            #[link_name = "\x01?ref@nsGkAtoms@@2PAVnsStaticAtom@@A"]
-            pub static nsGkAtoms_ref: *mut nsStaticAtom;
             #[link_name = "\x01?refresh@nsGkAtoms@@2PAVnsStaticAtom@@A"]
             pub static nsGkAtoms_refresh: *mut nsStaticAtom;
             #[link_name = "\x01?rel@nsGkAtoms@@2PAVnsStaticAtom@@A"]
             pub static nsGkAtoms_rel: *mut nsStaticAtom;
             #[link_name = "\x01?onreloadpage@nsGkAtoms@@2PAVnsStaticAtom@@A"]
             pub static nsGkAtoms_onreloadpage: *mut nsStaticAtom;
             #[link_name = "\x01?rem@nsGkAtoms@@2PAVnsStaticAtom@@A"]
             pub static nsGkAtoms_rem: *mut nsStaticAtom;
@@ -12681,18 +12655,16 @@ cfg_if! {
             #[link_name = "\x01?resizeafter@nsGkAtoms@@2PAVnsStaticAtom@@A"]
             pub static nsGkAtoms_resizeafter: *mut nsStaticAtom;
             #[link_name = "\x01?resizebefore@nsGkAtoms@@2PAVnsStaticAtom@@A"]
             pub static nsGkAtoms_resizebefore: *mut nsStaticAtom;
             #[link_name = "\x01?resizer@nsGkAtoms@@2PAVnsStaticAtom@@A"]
             pub static nsGkAtoms_resizer: *mut nsStaticAtom;
             #[link_name = "\x01?resolution@nsGkAtoms@@2PAVnsStaticAtom@@A"]
             pub static nsGkAtoms_resolution: *mut nsStaticAtom;
-            #[link_name = "\x01?resource@nsGkAtoms@@2PAVnsStaticAtom@@A"]
-            pub static nsGkAtoms_resource: *mut nsStaticAtom;
             #[link_name = "\x01?resources@nsGkAtoms@@2PAVnsStaticAtom@@A"]
             pub static nsGkAtoms_resources: *mut nsStaticAtom;
             #[link_name = "\x01?result@nsGkAtoms@@2PAVnsStaticAtom@@A"]
             pub static nsGkAtoms_result: *mut nsStaticAtom;
             #[link_name = "\x01?resultPrefix@nsGkAtoms@@2PAVnsStaticAtom@@A"]
             pub static nsGkAtoms_resultPrefix: *mut nsStaticAtom;
             #[link_name = "\x01?retargetdocumentfocus@nsGkAtoms@@2PAVnsStaticAtom@@A"]
             pub static nsGkAtoms_retargetdocumentfocus: *mut nsStaticAtom;
@@ -12855,24 +12827,16 @@ cfg_if! {
             #[link_name = "\x01?sortDirection@nsGkAtoms@@2PAVnsStaticAtom@@A"]
             pub static nsGkAtoms_sortDirection: *mut nsStaticAtom;
             #[link_name = "\x01?sorted@nsGkAtoms@@2PAVnsStaticAtom@@A"]
             pub static nsGkAtoms_sorted: *mut nsStaticAtom;
             #[link_name = "\x01?sorthints@nsGkAtoms@@2PAVnsStaticAtom@@A"]
             pub static nsGkAtoms_sorthints: *mut nsStaticAtom;
             #[link_name = "\x01?sortLocked@nsGkAtoms@@2PAVnsStaticAtom@@A"]
             pub static nsGkAtoms_sortLocked: *mut nsStaticAtom;
-            #[link_name = "\x01?sortResource@nsGkAtoms@@2PAVnsStaticAtom@@A"]
-            pub static nsGkAtoms_sortResource: *mut nsStaticAtom;
-            #[link_name = "\x01?sortResource2@nsGkAtoms@@2PAVnsStaticAtom@@A"]
-            pub static nsGkAtoms_sortResource2: *mut nsStaticAtom;
-            #[link_name = "\x01?sortSeparators@nsGkAtoms@@2PAVnsStaticAtom@@A"]
-            pub static nsGkAtoms_sortSeparators: *mut nsStaticAtom;
-            #[link_name = "\x01?sortStaticsLast@nsGkAtoms@@2PAVnsStaticAtom@@A"]
-            pub static nsGkAtoms_sortStaticsLast: *mut nsStaticAtom;
             #[link_name = "\x01?source@nsGkAtoms@@2PAVnsStaticAtom@@A"]
             pub static nsGkAtoms_source: *mut nsStaticAtom;
             #[link_name = "\x01?space@nsGkAtoms@@2PAVnsStaticAtom@@A"]
             pub static nsGkAtoms_space: *mut nsStaticAtom;
             #[link_name = "\x01?spacer@nsGkAtoms@@2PAVnsStaticAtom@@A"]
             pub static nsGkAtoms_spacer: *mut nsStaticAtom;
             #[link_name = "\x01?span@nsGkAtoms@@2PAVnsStaticAtom@@A"]
             pub static nsGkAtoms_span: *mut nsStaticAtom;
@@ -14743,18 +14707,18 @@ cfg_if! {
             #[link_name = "\x01?DisplayPortMargins@nsGkAtoms@@2PAVnsStaticAtom@@A"]
             pub static nsGkAtoms_DisplayPortMargins: *mut nsStaticAtom;
             #[link_name = "\x01?DisplayPortBase@nsGkAtoms@@2PAVnsStaticAtom@@A"]
             pub static nsGkAtoms_DisplayPortBase: *mut nsStaticAtom;
             #[link_name = "\x01?AsyncScrollLayerCreationFailed@nsGkAtoms@@2PAVnsStaticAtom@@A"]
             pub static nsGkAtoms_AsyncScrollLayerCreationFailed: *mut nsStaticAtom;
             #[link_name = "\x01?forcemessagemanager@nsGkAtoms@@2PAVnsStaticAtom@@A"]
             pub static nsGkAtoms_forcemessagemanager: *mut nsStaticAtom;
-            #[link_name = "\x01?isPreloadBrowser@nsGkAtoms@@2PAVnsStaticAtom@@A"]
-            pub static nsGkAtoms_isPreloadBrowser: *mut nsStaticAtom;
+            #[link_name = "\x01?preloadedState@nsGkAtoms@@2PAVnsStaticAtom@@A"]
+            pub static nsGkAtoms_preloadedState: *mut nsStaticAtom;
             #[link_name = "\x01?scrollbar_start_backward@nsGkAtoms@@2PAVnsStaticAtom@@A"]
             pub static nsGkAtoms_scrollbar_start_backward: *mut nsStaticAtom;
             #[link_name = "\x01?scrollbar_start_forward@nsGkAtoms@@2PAVnsStaticAtom@@A"]
             pub static nsGkAtoms_scrollbar_start_forward: *mut nsStaticAtom;
             #[link_name = "\x01?scrollbar_end_backward@nsGkAtoms@@2PAVnsStaticAtom@@A"]
             pub static nsGkAtoms_scrollbar_end_backward: *mut nsStaticAtom;
             #[link_name = "\x01?scrollbar_end_forward@nsGkAtoms@@2PAVnsStaticAtom@@A"]
             pub static nsGkAtoms_scrollbar_end_forward: *mut nsStaticAtom;
@@ -17835,18 +17799,16 @@ macro_rules! atom {
 ("range") =>
   {{ #[allow(unsafe_code)] #[allow(unused_unsafe)]unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_range as *mut _) } }};
 ("readonly") =>
   {{ #[allow(unsafe_code)] #[allow(unused_unsafe)]unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_readonly as *mut _) } }};
 ("rect") =>
   {{ #[allow(unsafe_code)] #[allow(unused_unsafe)]unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_rect as *mut _) } }};
 ("rectangle") =>
   {{ #[allow(unsafe_code)] #[allow(unused_unsafe)]unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_rectangle as *mut _) } }};
-("ref") =>
-  {{ #[allow(unsafe_code)] #[allow(unused_unsafe)]unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_ref as *mut _) } }};
 ("refresh") =>
   {{ #[allow(unsafe_code)] #[allow(unused_unsafe)]unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_refresh as *mut _) } }};
 ("rel") =>
   {{ #[allow(unsafe_code)] #[allow(unused_unsafe)]unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_rel as *mut _) } }};
 ("onreloadpage") =>
   {{ #[allow(unsafe_code)] #[allow(unused_unsafe)]unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_onreloadpage as *mut _) } }};
 ("rem") =>
   {{ #[allow(unsafe_code)] #[allow(unused_unsafe)]unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_rem as *mut _) } }};
@@ -17871,18 +17833,16 @@ macro_rules! atom {
 ("resizeafter") =>
   {{ #[allow(unsafe_code)] #[allow(unused_unsafe)]unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_resizeafter as *mut _) } }};
 ("resizebefore") =>
   {{ #[allow(unsafe_code)] #[allow(unused_unsafe)]unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_resizebefore as *mut _) } }};
 ("resizer") =>
   {{ #[allow(unsafe_code)] #[allow(unused_unsafe)]unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_resizer as *mut _) } }};
 ("resolution") =>
   {{ #[allow(unsafe_code)] #[allow(unused_unsafe)]unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_resolution as *mut _) } }};
-("resource") =>
-  {{ #[allow(unsafe_code)] #[allow(unused_unsafe)]unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_resource as *mut _) } }};
 ("resources") =>
   {{ #[allow(unsafe_code)] #[allow(unused_unsafe)]unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_resources as *mut _) } }};
 ("result") =>
   {{ #[allow(unsafe_code)] #[allow(unused_unsafe)]unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_result as *mut _) } }};
 ("result-prefix") =>
   {{ #[allow(unsafe_code)] #[allow(unused_unsafe)]unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_resultPrefix as *mut _) } }};
 ("retargetdocumentfocus") =>
   {{ #[allow(unsafe_code)] #[allow(unused_unsafe)]unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_retargetdocumentfocus as *mut _) } }};
@@ -18045,24 +18005,16 @@ macro_rules! atom {
 ("sortDirection") =>
   {{ #[allow(unsafe_code)] #[allow(unused_unsafe)]unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_sortDirection as *mut _) } }};
 ("sorted") =>
   {{ #[allow(unsafe_code)] #[allow(unused_unsafe)]unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_sorted as *mut _) } }};
 ("sorthints") =>
   {{ #[allow(unsafe_code)] #[allow(unused_unsafe)]unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_sorthints as *mut _) } }};
 ("sortLocked") =>
   {{ #[allow(unsafe_code)] #[allow(unused_unsafe)]unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_sortLocked as *mut _) } }};
-("sortResource") =>
-  {{ #[allow(unsafe_code)] #[allow(unused_unsafe)]unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_sortResource as *mut _) } }};
-("sortResource2") =>
-  {{ #[allow(unsafe_code)] #[allow(unused_unsafe)]unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_sortResource2 as *mut _) } }};
-("sortSeparators") =>
-  {{ #[allow(unsafe_code)] #[allow(unused_unsafe)]unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_sortSeparators as *mut _) } }};
-("sortStaticsLast") =>
-  {{ #[allow(unsafe_code)] #[allow(unused_unsafe)]unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_sortStaticsLast as *mut _) } }};
 ("source") =>
   {{ #[allow(unsafe_code)] #[allow(unused_unsafe)]unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_source as *mut _) } }};
 ("space") =>
   {{ #[allow(unsafe_code)] #[allow(unused_unsafe)]unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_space as *mut _) } }};
 ("spacer") =>
   {{ #[allow(unsafe_code)] #[allow(unused_unsafe)]unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_spacer as *mut _) } }};
 ("span") =>
   {{ #[allow(unsafe_code)] #[allow(unused_unsafe)]unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_span as *mut _) } }};
@@ -19933,18 +19885,18 @@ macro_rules! atom {
 ("_displayportmargins") =>
   {{ #[allow(unsafe_code)] #[allow(unused_unsafe)]unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_DisplayPortMargins as *mut _) } }};
 ("_displayportbase") =>
   {{ #[allow(unsafe_code)] #[allow(unused_unsafe)]unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_DisplayPortBase as *mut _) } }};
 ("_asyncscrolllayercreationfailed") =>
   {{ #[allow(unsafe_code)] #[allow(unused_unsafe)]unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_AsyncScrollLayerCreationFailed as *mut _) } }};
 ("forcemessagemanager") =>
   {{ #[allow(unsafe_code)] #[allow(unused_unsafe)]unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_forcemessagemanager as *mut _) } }};
-("isPreloadBrowser") =>
-  {{ #[allow(unsafe_code)] #[allow(unused_unsafe)]unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_isPreloadBrowser as *mut _) } }};
+("preloadedState") =>
+  {{ #[allow(unsafe_code)] #[allow(unused_unsafe)]unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_preloadedState as *mut _) } }};
 ("scrollbar-start-backward") =>
   {{ #[allow(unsafe_code)] #[allow(unused_unsafe)]unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_scrollbar_start_backward as *mut _) } }};
 ("scrollbar-start-forward") =>
   {{ #[allow(unsafe_code)] #[allow(unused_unsafe)]unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_scrollbar_start_forward as *mut _) } }};
 ("scrollbar-end-backward") =>
   {{ #[allow(unsafe_code)] #[allow(unused_unsafe)]unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_scrollbar_end_backward as *mut _) } }};
 ("scrollbar-end-forward") =>
   {{ #[allow(unsafe_code)] #[allow(unused_unsafe)]unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_scrollbar_end_forward as *mut _) } }};
--- a/servo/components/style/gecko/generated/bindings.rs
+++ b/servo/components/style/gecko/generated/bindings.rs
@@ -1592,9 +1592,9 @@ extern "C" {
 } extern "C" {
  pub fn Gecko_ReportUnexpectedCSSError ( reporter : * mut ErrorReporter , message : * const :: std :: os :: raw :: c_char , param : * const :: std :: os :: raw :: c_char , paramLen : u32 , prefix : * const :: std :: os :: raw :: c_char , prefixParam : * const :: std :: os :: raw :: c_char , prefixParamLen : u32 , suffix : * const :: std :: os :: raw :: c_char , source : * const :: std :: os :: raw :: c_char , sourceLen : u32 , lineNumber : u32 , colNumber : u32 , ) ; 
 } extern "C" {
  pub fn Gecko_ContentList_AppendAll ( aContentList : * mut nsSimpleContentList , aElements : * mut * const RawGeckoElement , aLength : usize , ) ; 
 } extern "C" {
  pub fn Gecko_GetElementsWithId ( aDocument : * const nsIDocument , aId : * mut nsAtom , ) -> * const nsTArray < * mut Element > ; 
 } extern "C" {
  pub fn Gecko_GetBoolPrefValue ( pref_name : * const :: std :: os :: raw :: c_char , ) -> bool ; 
-}
+}
\ No newline at end of file
--- a/servo/components/style/gecko/generated/structs.rs
+++ b/servo/components/style/gecko/generated/structs.rs
@@ -80,23 +80,23 @@ pub type ServoStyleContextStrong = ::gec
             /// be null or both be non-null.
             ///
             /// Note that, just as the pointers returned by GetAttrNameAt, the pointers that
             /// this struct hold are only valid until the element or its attributes are
             /// mutated (directly or via script). 
  # [ repr ( C ) ] # [ derive ( Debug , Copy ) ] pub struct BorrowedAttrInfo { pub mName : * const root :: nsAttrName , pub mValue : * const root :: nsAttrValue , } # [ test ] fn bindgen_test_layout_BorrowedAttrInfo ( ) { assert_eq ! ( :: std :: mem :: size_of :: < BorrowedAttrInfo > ( ) , 16usize , concat ! ( "Size of: " , stringify ! ( BorrowedAttrInfo ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < BorrowedAttrInfo > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( BorrowedAttrInfo ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const BorrowedAttrInfo ) ) . mName as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( BorrowedAttrInfo ) , "::" , stringify ! ( mName ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const BorrowedAttrInfo ) ) . mValue as * const _ as usize } , 8usize , concat ! ( "Alignment of field: " , stringify ! ( BorrowedAttrInfo ) , "::" , stringify ! ( mValue ) ) ) ; } impl Clone for BorrowedAttrInfo { fn clone ( & self ) -> Self { * self } } # [ repr ( C ) ] pub struct NodeInfo { pub mRefCnt : root :: nsCycleCollectingAutoRefCnt , pub mDocument : * mut root :: nsIDocument , pub mInner : root :: mozilla :: dom :: NodeInfo_NodeInfoInner , pub mOwnerManager : root :: RefPtr < root :: nsNodeInfoManager > , pub mQualifiedName : ::nsstring::nsStringRepr , pub mNodeName : ::nsstring::nsStringRepr , pub mLocalName : ::nsstring::nsStringRepr , } pub type NodeInfo_HasThreadSafeRefCnt = root :: mozilla :: FalseType ; # [ repr ( C ) ] # [ derive ( Debug , Copy ) ] pub struct NodeInfo_cycleCollection { pub _base : root :: nsCycleCollectionParticipant , } # [ test ] fn bindgen_test_layout_NodeInfo_cycleCollection ( ) { assert_eq ! ( :: std :: mem :: size_of :: < NodeInfo_cycleCollection > ( ) , 16usize , concat ! ( "Size of: " , stringify ! ( NodeInfo_cycleCollection ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < NodeInfo_cycleCollection > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( NodeInfo_cycleCollection ) ) ) ; } impl Clone for NodeInfo_cycleCollection { fn clone ( & self ) -> Self { * self } } # [ repr ( C ) ] # [ derive ( Debug , Copy ) ] pub struct NodeInfo_NodeInfoInner { pub mName : * const root :: nsAtom , pub mPrefix : * mut root :: nsAtom , pub mNamespaceID : i32 , pub mNodeType : u16 , pub mNameString : * const root :: nsAString , pub mExtraName : * mut root :: nsAtom , pub mHash : root :: PLHashNumber , pub mHashInitialized : bool , } # [ test ] fn bindgen_test_layout_NodeInfo_NodeInfoInner ( ) { assert_eq ! ( :: std :: mem :: size_of :: < NodeInfo_NodeInfoInner > ( ) , 48usize , concat ! ( "Size of: " , stringify ! ( NodeInfo_NodeInfoInner ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < NodeInfo_NodeInfoInner > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( NodeInfo_NodeInfoInner ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const NodeInfo_NodeInfoInner ) ) . mName as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( NodeInfo_NodeInfoInner ) , "::" , stringify ! ( mName ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const NodeInfo_NodeInfoInner ) ) . mPrefix as * const _ as usize } , 8usize , concat ! ( "Alignment of field: " , stringify ! ( NodeInfo_NodeInfoInner ) , "::" , stringify ! ( mPrefix ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const NodeInfo_NodeInfoInner ) ) . mNamespaceID as * const _ as usize } , 16usize , concat ! ( "Alignment of field: " , stringify ! ( NodeInfo_NodeInfoInner ) , "::" , stringify ! ( mNamespaceID ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const NodeInfo_NodeInfoInner ) ) . mNodeType as * const _ as usize } , 20usize , concat ! ( "Alignment of field: " , stringify ! ( NodeInfo_NodeInfoInner ) , "::" , stringify ! ( mNodeType ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const NodeInfo_NodeInfoInner ) ) . mNameString as * const _ as usize } , 24usize , concat ! ( "Alignment of field: " , stringify ! ( NodeInfo_NodeInfoInner ) , "::" , stringify ! ( mNameString ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const NodeInfo_NodeInfoInner ) ) . mExtraName as * const _ as usize } , 32usize , concat ! ( "Alignment of field: " , stringify ! ( NodeInfo_NodeInfoInner ) , "::" , stringify ! ( mExtraName ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const NodeInfo_NodeInfoInner ) ) . mHash as * const _ as usize } , 40usize , concat ! ( "Alignment of field: " , stringify ! ( NodeInfo_NodeInfoInner ) , "::" , stringify ! ( mHash ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const NodeInfo_NodeInfoInner ) ) . mHashInitialized as * const _ as usize } , 44usize , concat ! ( "Alignment of field: " , stringify ! ( NodeInfo_NodeInfoInner ) , "::" , stringify ! ( mHashInitialized ) ) ) ; } impl Clone for NodeInfo_NodeInfoInner { fn clone ( & self ) -> Self { * self } } extern "C" {
  # [ link_name = "\u{1}_ZN7mozilla3dom8NodeInfo21_cycleCollectorGlobalE" ] 
  pub static mut  NodeInfo__cycleCollectorGlobal  :  root :: mozilla :: dom :: NodeInfo_cycleCollection ;
-} # [ test ] fn bindgen_test_layout_NodeInfo ( ) { assert_eq ! ( :: std :: mem :: size_of :: < NodeInfo > ( ) , 120usize , concat ! ( "Size of: " , stringify ! ( NodeInfo ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < NodeInfo > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( NodeInfo ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const NodeInfo ) ) . mRefCnt as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( NodeInfo ) , "::" , stringify ! ( mRefCnt ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const NodeInfo ) ) . mDocument as * const _ as usize } , 8usize , concat ! ( "Alignment of field: " , stringify ! ( NodeInfo ) , "::" , stringify ! ( mDocument ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const NodeInfo ) ) . mInner as * const _ as usize } , 16usize , concat ! ( "Alignment of field: " , stringify ! ( NodeInfo ) , "::" , stringify ! ( mInner ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const NodeInfo ) ) . mOwnerManager as * const _ as usize } , 64usize , concat ! ( "Alignment of field: " , stringify ! ( NodeInfo ) , "::" , stringify ! ( mOwnerManager ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const NodeInfo ) ) . mQualifiedName as * const _ as usize } , 72usize , concat ! ( "Alignment of field: " , stringify ! ( NodeInfo ) , "::" , stringify ! ( mQualifiedName ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const NodeInfo ) ) . mNodeName as * const _ as usize } , 88usize , concat ! ( "Alignment of field: " , stringify ! ( NodeInfo ) , "::" , stringify ! ( mNodeName ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const NodeInfo ) ) . mLocalName as * const _ as usize } , 104usize , concat ! ( "Alignment of field: " , stringify ! ( NodeInfo ) , "::" , stringify ! ( mLocalName ) ) ) ; } # [ repr ( C ) ] # [ derive ( Debug ) ] pub struct EventTarget { pub _base : root :: nsIDOMEventTarget , pub _base_1 : root :: nsWrapperCache , } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct EventTarget_COMTypeInfo { pub _address : u8 , } # [ test ] fn bindgen_test_layout_EventTarget ( ) { assert_eq ! ( :: std :: mem :: size_of :: < EventTarget > ( ) , 32usize , concat ! ( "Size of: " , stringify ! ( EventTarget ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < EventTarget > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( EventTarget ) ) ) ; } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct BoxQuadOptions { _unused : [ u8 ; 0 ] } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct ConvertCoordinateOptions { _unused : [ u8 ; 0 ] } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct DocGroup { _unused : [ u8 ; 0 ] } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct DOMPoint { _unused : [ u8 ; 0 ] } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct DOMQuad { _unused : [ u8 ; 0 ] } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct TextOrElementOrDocument { _unused : [ u8 ; 0 ] } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct DOMPointInit { _unused : [ u8 ; 0 ] } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct HTMLSlotElement { _unused : [ u8 ; 0 ] } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct TabGroup { _unused : [ u8 ; 0 ] } # [ repr ( C ) ] pub struct DispatcherTrait__bindgen_vtable ( :: std :: os :: raw :: c_void ) ; # [ repr ( C ) ] # [ derive ( Debug , Copy ) ] pub struct DispatcherTrait { pub vtable_ : * const DispatcherTrait__bindgen_vtable , } # [ test ] fn bindgen_test_layout_DispatcherTrait ( ) { assert_eq ! ( :: std :: mem :: size_of :: < DispatcherTrait > ( ) , 8usize , concat ! ( "Size of: " , stringify ! ( DispatcherTrait ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < DispatcherTrait > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( DispatcherTrait ) ) ) ; } impl Clone for DispatcherTrait { fn clone ( & self ) -> Self { * self } } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct AudioContext { _unused : [ u8 ; 0 ] } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct Performance { _unused : [ u8 ; 0 ] } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct ServiceWorkerRegistration { _unused : [ u8 ; 0 ] } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct TimeoutManager { _unused : [ u8 ; 0 ] } pub const LargeAllocStatus_NONE : root :: mozilla :: dom :: LargeAllocStatus = 0 ; pub const LargeAllocStatus_SUCCESS : root :: mozilla :: dom :: LargeAllocStatus = 1 ; pub const LargeAllocStatus_NON_GET : root :: mozilla :: dom :: LargeAllocStatus = 2 ; pub const LargeAllocStatus_NON_E10S : root :: mozilla :: dom :: LargeAllocStatus = 3 ; pub const LargeAllocStatus_NOT_ONLY_TOPLEVEL_IN_TABGROUP : root :: mozilla :: dom :: LargeAllocStatus = 4 ; pub const LargeAllocStatus_NON_WIN32 : root :: mozilla :: dom :: LargeAllocStatus = 5 ; pub type LargeAllocStatus = u8 ; pub mod prototypes { # [ allow ( unused_imports ) ] use self :: super :: super :: super :: super :: root ; } pub mod constructors { # [ allow ( unused_imports ) ] use self :: super :: super :: super :: super :: root ; } pub mod namedpropertiesobjects { # [ allow ( unused_imports ) ] use self :: super :: super :: super :: super :: root ; } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct StyleSheetList { _unused : [ u8 ; 0 ] } 
+} # [ test ] fn bindgen_test_layout_NodeInfo ( ) { assert_eq ! ( :: std :: mem :: size_of :: < NodeInfo > ( ) , 120usize , concat ! ( "Size of: " , stringify ! ( NodeInfo ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < NodeInfo > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( NodeInfo ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const NodeInfo ) ) . mRefCnt as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( NodeInfo ) , "::" , stringify ! ( mRefCnt ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const NodeInfo ) ) . mDocument as * const _ as usize } , 8usize , concat ! ( "Alignment of field: " , stringify ! ( NodeInfo ) , "::" , stringify ! ( mDocument ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const NodeInfo ) ) . mInner as * const _ as usize } , 16usize , concat ! ( "Alignment of field: " , stringify ! ( NodeInfo ) , "::" , stringify ! ( mInner ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const NodeInfo ) ) . mOwnerManager as * const _ as usize } , 64usize , concat ! ( "Alignment of field: " , stringify ! ( NodeInfo ) , "::" , stringify ! ( mOwnerManager ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const NodeInfo ) ) . mQualifiedName as * const _ as usize } , 72usize , concat ! ( "Alignment of field: " , stringify ! ( NodeInfo ) , "::" , stringify ! ( mQualifiedName ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const NodeInfo ) ) . mNodeName as * const _ as usize } , 88usize , concat ! ( "Alignment of field: " , stringify ! ( NodeInfo ) , "::" , stringify ! ( mNodeName ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const NodeInfo ) ) . mLocalName as * const _ as usize } , 104usize , concat ! ( "Alignment of field: " , stringify ! ( NodeInfo ) , "::" , stringify ! ( mLocalName ) ) ) ; } # [ repr ( C ) ] # [ derive ( Debug ) ] pub struct EventTarget { pub _base : root :: nsIDOMEventTarget , pub _base_1 : root :: nsWrapperCache , } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct EventTarget_COMTypeInfo { pub _address : u8 , } # [ test ] fn bindgen_test_layout_EventTarget ( ) { assert_eq ! ( :: std :: mem :: size_of :: < EventTarget > ( ) , 32usize , concat ! ( "Size of: " , stringify ! ( EventTarget ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < EventTarget > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( EventTarget ) ) ) ; } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct BoxQuadOptions { _unused : [ u8 ; 0 ] } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct ConvertCoordinateOptions { _unused : [ u8 ; 0 ] } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct DocGroup { _unused : [ u8 ; 0 ] } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct DOMPoint { _unused : [ u8 ; 0 ] } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct DOMQuad { _unused : [ u8 ; 0 ] } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct TextOrElementOrDocument { _unused : [ u8 ; 0 ] } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct DOMPointInit { _unused : [ u8 ; 0 ] } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct TabGroup { _unused : [ u8 ; 0 ] } # [ repr ( C ) ] pub struct DispatcherTrait__bindgen_vtable ( :: std :: os :: raw :: c_void ) ; # [ repr ( C ) ] # [ derive ( Debug , Copy ) ] pub struct DispatcherTrait { pub vtable_ : * const DispatcherTrait__bindgen_vtable , } # [ test ] fn bindgen_test_layout_DispatcherTrait ( ) { assert_eq ! ( :: std :: mem :: size_of :: < DispatcherTrait > ( ) , 8usize , concat ! ( "Size of: " , stringify ! ( DispatcherTrait ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < DispatcherTrait > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( DispatcherTrait ) ) ) ; } impl Clone for DispatcherTrait { fn clone ( & self ) -> Self { * self } } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct AudioContext { _unused : [ u8 ; 0 ] } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct Performance { _unused : [ u8 ; 0 ] } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct ServiceWorkerRegistration { _unused : [ u8 ; 0 ] } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct TimeoutManager { _unused : [ u8 ; 0 ] } pub const LargeAllocStatus_NONE : root :: mozilla :: dom :: LargeAllocStatus = 0 ; pub const LargeAllocStatus_SUCCESS : root :: mozilla :: dom :: LargeAllocStatus = 1 ; pub const LargeAllocStatus_NON_GET : root :: mozilla :: dom :: LargeAllocStatus = 2 ; pub const LargeAllocStatus_NON_E10S : root :: mozilla :: dom :: LargeAllocStatus = 3 ; pub const LargeAllocStatus_NOT_ONLY_TOPLEVEL_IN_TABGROUP : root :: mozilla :: dom :: LargeAllocStatus = 4 ; pub const LargeAllocStatus_NON_WIN32 : root :: mozilla :: dom :: LargeAllocStatus = 5 ; pub type LargeAllocStatus = u8 ; pub mod prototypes { # [ allow ( unused_imports ) ] use self :: super :: super :: super :: super :: root ; } pub mod constructors { # [ allow ( unused_imports ) ] use self :: super :: super :: super :: super :: root ; } pub mod namedpropertiesobjects { # [ allow ( unused_imports ) ] use self :: super :: super :: super :: super :: root ; } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct StyleSheetList { _unused : [ u8 ; 0 ] } 
  /// A class meant to be shared by ShadowRoot and Document, that holds a list of
             /// stylesheets.
             ///
             /// TODO(emilio, bug 1418159): In the future this should hold most of the
             /// relevant style state, this should allow us to fix bug 548397. 
- # [ repr ( C ) ] pub struct DocumentOrShadowRoot { pub mStyleSheets : root :: nsTArray < root :: RefPtr < root :: mozilla :: StyleSheet > > , pub mDOMStyleSheets : root :: RefPtr < root :: mozilla :: dom :: StyleSheetList > , pub mIdentifierMap : [ u64 ; 4usize ] , pub mAsNode : * mut root :: nsINode , pub mKind : root :: mozilla :: dom :: DocumentOrShadowRoot_Kind , } pub const DocumentOrShadowRoot_Kind_Document : root :: mozilla :: dom :: DocumentOrShadowRoot_Kind = 0 ; pub const DocumentOrShadowRoot_Kind_ShadowRoot : root :: mozilla :: dom :: DocumentOrShadowRoot_Kind = 1 ; pub type DocumentOrShadowRoot_Kind = :: std :: os :: raw :: c_int ; # [ test ] fn bindgen_test_layout_DocumentOrShadowRoot ( ) { assert_eq ! ( :: std :: mem :: size_of :: < DocumentOrShadowRoot > ( ) , 64usize , concat ! ( "Size of: " , stringify ! ( DocumentOrShadowRoot ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < DocumentOrShadowRoot > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( DocumentOrShadowRoot ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const DocumentOrShadowRoot ) ) . mStyleSheets as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( DocumentOrShadowRoot ) , "::" , stringify ! ( mStyleSheets ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const DocumentOrShadowRoot ) ) . mDOMStyleSheets as * const _ as usize } , 8usize , concat ! ( "Alignment of field: " , stringify ! ( DocumentOrShadowRoot ) , "::" , stringify ! ( mDOMStyleSheets ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const DocumentOrShadowRoot ) ) . mIdentifierMap as * const _ as usize } , 16usize , concat ! ( "Alignment of field: " , stringify ! ( DocumentOrShadowRoot ) , "::" , stringify ! ( mIdentifierMap ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const DocumentOrShadowRoot ) ) . mAsNode as * const _ as usize } , 48usize , concat ! ( "Alignment of field: " , stringify ! ( DocumentOrShadowRoot ) , "::" , stringify ! ( mAsNode ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const DocumentOrShadowRoot ) ) . mKind as * const _ as usize } , 56usize , concat ! ( "Alignment of field: " , stringify ! ( DocumentOrShadowRoot ) , "::" , stringify ! ( mKind ) ) ) ; } pub const VisibilityState_Hidden : root :: mozilla :: dom :: VisibilityState = 0 ; pub const VisibilityState_Visible : root :: mozilla :: dom :: VisibilityState = 1 ; pub const VisibilityState_Prerender : root :: mozilla :: dom :: VisibilityState = 2 ; pub const VisibilityState_EndGuard_ : root :: mozilla :: dom :: VisibilityState = 3 ; pub type VisibilityState = u8 ; # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct AnonymousContent { _unused : [ u8 ; 0 ] } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct FontFaceSet { _unused : [ u8 ; 0 ] } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct FullscreenRequest { _unused : [ u8 ; 0 ] } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct ImageTracker { _unused : [ u8 ; 0 ] } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct Link { _unused : [ u8 ; 0 ] } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct MediaQueryList { _unused : [ u8 ; 0 ] } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct XPathEvaluator { _unused : [ u8 ; 0 ] } # [ repr ( C ) ] # [ derive ( Debug , Copy ) ] pub struct FrameRequestCallback { pub _bindgen_opaque_blob : [ u64 ; 6usize ] , } # [ test ] fn bindgen_test_layout_FrameRequestCallback ( ) { assert_eq ! ( :: std :: mem :: size_of :: < FrameRequestCallback > ( ) , 48usize , concat ! ( "Size of: " , stringify ! ( FrameRequestCallback ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < FrameRequestCallback > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( FrameRequestCallback ) ) ) ; } impl Clone for FrameRequestCallback { fn clone ( & self ) -> Self { * self } } # [ repr ( C ) ] pub struct URLParams { pub mParams : root :: nsTArray < root :: mozilla :: dom :: URLParams_Param > , } # [ repr ( C ) ] pub struct URLParams_ForEachIterator__bindgen_vtable ( :: std :: os :: raw :: c_void ) ; # [ repr ( C ) ] # [ derive ( Debug , Copy ) ] pub struct URLParams_ForEachIterator { pub vtable_ : * const URLParams_ForEachIterator__bindgen_vtable , } # [ test ] fn bindgen_test_layout_URLParams_ForEachIterator ( ) { assert_eq ! ( :: std :: mem :: size_of :: < URLParams_ForEachIterator > ( ) , 8usize , concat ! ( "Size of: " , stringify ! ( URLParams_ForEachIterator ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < URLParams_ForEachIterator > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( URLParams_ForEachIterator ) ) ) ; } impl Clone for URLParams_ForEachIterator { fn clone ( & self ) -> Self { * self } } # [ repr ( C ) ] pub struct URLParams_Param { pub mKey : ::nsstring::nsStringRepr , pub mValue : ::nsstring::nsStringRepr , } # [ test ] fn bindgen_test_layout_URLParams_Param ( ) { assert_eq ! ( :: std :: mem :: size_of :: < URLParams_Param > ( ) , 32usize , concat ! ( "Size of: " , stringify ! ( URLParams_Param ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < URLParams_Param > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( URLParams_Param ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const URLParams_Param ) ) . mKey as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( URLParams_Param ) , "::" , stringify ! ( mKey ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const URLParams_Param ) ) . mValue as * const _ as usize } , 16usize , concat ! ( "Alignment of field: " , stringify ! ( URLParams_Param ) , "::" , stringify ! ( mValue ) ) ) ; } # [ test ] fn bindgen_test_layout_URLParams ( ) { assert_eq ! ( :: std :: mem :: size_of :: < URLParams > ( ) , 8usize , concat ! ( "Size of: " , stringify ! ( URLParams ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < URLParams > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( URLParams ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const URLParams ) ) . mParams as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( URLParams ) , "::" , stringify ! ( mParams ) ) ) ; } # [ repr ( C ) ] pub struct SRIMetadata { pub mHashes : root :: nsTArray < root :: nsCString > , pub mIntegrityString : ::nsstring::nsStringRepr , pub mAlgorithm : root :: nsCString , pub mAlgorithmType : i8 , pub mEmpty : bool , } pub const SRIMetadata_MAX_ALTERNATE_HASHES : u32 = 256 ; pub const SRIMetadata_UNKNOWN_ALGORITHM : i8 = -1 ; # [ test ] fn bindgen_test_layout_SRIMetadata ( ) { assert_eq ! ( :: std :: mem :: size_of :: < SRIMetadata > ( ) , 48usize , concat ! ( "Size of: " , stringify ! ( SRIMetadata ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < SRIMetadata > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( SRIMetadata ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const SRIMetadata ) ) . mHashes as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( SRIMetadata ) , "::" , stringify ! ( mHashes ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const SRIMetadata ) ) . mIntegrityString as * const _ as usize } , 8usize , concat ! ( "Alignment of field: " , stringify ! ( SRIMetadata ) , "::" , stringify ! ( mIntegrityString ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const SRIMetadata ) ) . mAlgorithm as * const _ as usize } , 24usize , concat ! ( "Alignment of field: " , stringify ! ( SRIMetadata ) , "::" , stringify ! ( mAlgorithm ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const SRIMetadata ) ) . mAlgorithmType as * const _ as usize } , 40usize , concat ! ( "Alignment of field: " , stringify ! ( SRIMetadata ) , "::" , stringify ! ( mAlgorithmType ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const SRIMetadata ) ) . mEmpty as * const _ as usize } , 41usize , concat ! ( "Alignment of field: " , stringify ! ( SRIMetadata ) , "::" , stringify ! ( mEmpty ) ) ) ; } # [ repr ( C ) ] # [ derive ( Debug ) ] pub struct OwningNodeOrString { pub mType : root :: mozilla :: dom :: OwningNodeOrString_Type , pub mValue : root :: mozilla :: dom :: OwningNodeOrString_Value , } pub const OwningNodeOrString_Type_eUninitialized : root :: mozilla :: dom :: OwningNodeOrString_Type = 0 ; pub const OwningNodeOrString_Type_eNode : root :: mozilla :: dom :: OwningNodeOrString_Type = 1 ; pub const OwningNodeOrString_Type_eString : root :: mozilla :: dom :: OwningNodeOrString_Type = 2 ; pub type OwningNodeOrString_Type = :: std :: os :: raw :: c_uint ; # [ repr ( C ) ] # [ derive ( Debug , Copy ) ] pub struct OwningNodeOrString_Value { pub _bindgen_opaque_blob : [ u64 ; 2usize ] , } # [ test ] fn bindgen_test_layout_OwningNodeOrString_Value ( ) { assert_eq ! ( :: std :: mem :: size_of :: < OwningNodeOrString_Value > ( ) , 16usize , concat ! ( "Size of: " , stringify ! ( OwningNodeOrString_Value ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < OwningNodeOrString_Value > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( OwningNodeOrString_Value ) ) ) ; } impl Clone for OwningNodeOrString_Value { fn clone ( & self ) -> Self { * self } } # [ test ] fn bindgen_test_layout_OwningNodeOrString ( ) { assert_eq ! ( :: std :: mem :: size_of :: < OwningNodeOrString > ( ) , 24usize , concat ! ( "Size of: " , stringify ! ( OwningNodeOrString ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < OwningNodeOrString > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( OwningNodeOrString ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const OwningNodeOrString ) ) . mType as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( OwningNodeOrString ) , "::" , stringify ! ( mType ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const OwningNodeOrString ) ) . mValue as * const _ as usize } , 8usize , concat ! ( "Alignment of field: " , stringify ! ( OwningNodeOrString ) , "::" , stringify ! ( mValue ) ) ) ; } # [ repr ( u8 ) ] # [ derive ( Debug , Copy , Clone , PartialEq , Eq , Hash ) ] pub enum FillMode { None = 0 , Forwards = 1 , Backwards = 2 , Both = 3 , Auto = 4 , EndGuard_ = 5 , } # [ repr ( u8 ) ] # [ derive ( Debug , Copy , Clone , PartialEq , Eq , Hash ) ] pub enum PlaybackDirection { Normal = 0 , Reverse = 1 , Alternate = 2 , Alternate_reverse = 3 , EndGuard_ = 4 , } # [ repr ( u8 ) ] # [ derive ( Debug , Copy , Clone , PartialEq , Eq , Hash ) ] pub enum CompositeOperation { Replace = 0 , Add = 1 , Accumulate = 2 , EndGuard_ = 3 , } # [ repr ( u8 ) ] # [ derive ( Debug , Copy , Clone , PartialEq , Eq , Hash ) ] pub enum IterationCompositeOperation { Replace = 0 , Accumulate = 1 , EndGuard_ = 2 , } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct XBLChildrenElement { _unused : [ u8 ; 0 ] } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct CustomElementData { _unused : [ u8 ; 0 ] } # [ repr ( C ) ] pub struct FragmentOrElement { pub _base : root :: nsIContent , pub mRefCnt : root :: nsCycleCollectingAutoRefCnt , 
+ # [ repr ( C ) ] pub struct DocumentOrShadowRoot { pub mStyleSheets : root :: nsTArray < root :: RefPtr < root :: mozilla :: StyleSheet > > , pub mDOMStyleSheets : root :: RefPtr < root :: mozilla :: dom :: StyleSheetList > , pub mIdentifierMap : [ u64 ; 4usize ] , pub mAsNode : * mut root :: nsINode , pub mKind : root :: mozilla :: dom :: DocumentOrShadowRoot_Kind , } pub const DocumentOrShadowRoot_Kind_Document : root :: mozilla :: dom :: DocumentOrShadowRoot_Kind = 0 ; pub const DocumentOrShadowRoot_Kind_ShadowRoot : root :: mozilla :: dom :: DocumentOrShadowRoot_Kind = 1 ; pub type DocumentOrShadowRoot_Kind = :: std :: os :: raw :: c_int ; # [ test ] fn bindgen_test_layout_DocumentOrShadowRoot ( ) { assert_eq ! ( :: std :: mem :: size_of :: < DocumentOrShadowRoot > ( ) , 64usize , concat ! ( "Size of: " , stringify ! ( DocumentOrShadowRoot ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < DocumentOrShadowRoot > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( DocumentOrShadowRoot ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const DocumentOrShadowRoot ) ) . mStyleSheets as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( DocumentOrShadowRoot ) , "::" , stringify ! ( mStyleSheets ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const DocumentOrShadowRoot ) ) . mDOMStyleSheets as * const _ as usize } , 8usize , concat ! ( "Alignment of field: " , stringify ! ( DocumentOrShadowRoot ) , "::" , stringify ! ( mDOMStyleSheets ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const DocumentOrShadowRoot ) ) . mIdentifierMap as * const _ as usize } , 16usize , concat ! ( "Alignment of field: " , stringify ! ( DocumentOrShadowRoot ) , "::" , stringify ! ( mIdentifierMap ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const DocumentOrShadowRoot ) ) . mAsNode as * const _ as usize } , 48usize , concat ! ( "Alignment of field: " , stringify ! ( DocumentOrShadowRoot ) , "::" , stringify ! ( mAsNode ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const DocumentOrShadowRoot ) ) . mKind as * const _ as usize } , 56usize , concat ! ( "Alignment of field: " , stringify ! ( DocumentOrShadowRoot ) , "::" , stringify ! ( mKind ) ) ) ; } pub const VisibilityState_Hidden : root :: mozilla :: dom :: VisibilityState = 0 ; pub const VisibilityState_Visible : root :: mozilla :: dom :: VisibilityState = 1 ; pub const VisibilityState_Prerender : root :: mozilla :: dom :: VisibilityState = 2 ; pub const VisibilityState_EndGuard_ : root :: mozilla :: dom :: VisibilityState = 3 ; pub type VisibilityState = u8 ; # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct AnonymousContent { _unused : [ u8 ; 0 ] } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct FontFaceSet { _unused : [ u8 ; 0 ] } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct FullscreenRequest { _unused : [ u8 ; 0 ] } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct ImageTracker { _unused : [ u8 ; 0 ] } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct Link { _unused : [ u8 ; 0 ] } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct MediaQueryList { _unused : [ u8 ; 0 ] } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct XPathEvaluator { _unused : [ u8 ; 0 ] } # [ repr ( C ) ] # [ derive ( Debug , Copy ) ] pub struct FrameRequestCallback { pub _bindgen_opaque_blob : [ u64 ; 6usize ] , } # [ test ] fn bindgen_test_layout_FrameRequestCallback ( ) { assert_eq ! ( :: std :: mem :: size_of :: < FrameRequestCallback > ( ) , 48usize , concat ! ( "Size of: " , stringify ! ( FrameRequestCallback ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < FrameRequestCallback > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( FrameRequestCallback ) ) ) ; } impl Clone for FrameRequestCallback { fn clone ( & self ) -> Self { * self } } # [ repr ( C ) ] pub struct URLParams { pub mParams : root :: nsTArray < root :: mozilla :: dom :: URLParams_Param > , } # [ repr ( C ) ] pub struct URLParams_ForEachIterator__bindgen_vtable ( :: std :: os :: raw :: c_void ) ; # [ repr ( C ) ] # [ derive ( Debug , Copy ) ] pub struct URLParams_ForEachIterator { pub vtable_ : * const URLParams_ForEachIterator__bindgen_vtable , } # [ test ] fn bindgen_test_layout_URLParams_ForEachIterator ( ) { assert_eq ! ( :: std :: mem :: size_of :: < URLParams_ForEachIterator > ( ) , 8usize , concat ! ( "Size of: " , stringify ! ( URLParams_ForEachIterator ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < URLParams_ForEachIterator > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( URLParams_ForEachIterator ) ) ) ; } impl Clone for URLParams_ForEachIterator { fn clone ( & self ) -> Self { * self } } # [ repr ( C ) ] pub struct URLParams_Param { pub mKey : ::nsstring::nsStringRepr , pub mValue : ::nsstring::nsStringRepr , } # [ test ] fn bindgen_test_layout_URLParams_Param ( ) { assert_eq ! ( :: std :: mem :: size_of :: < URLParams_Param > ( ) , 32usize , concat ! ( "Size of: " , stringify ! ( URLParams_Param ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < URLParams_Param > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( URLParams_Param ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const URLParams_Param ) ) . mKey as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( URLParams_Param ) , "::" , stringify ! ( mKey ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const URLParams_Param ) ) . mValue as * const _ as usize } , 16usize , concat ! ( "Alignment of field: " , stringify ! ( URLParams_Param ) , "::" , stringify ! ( mValue ) ) ) ; } # [ test ] fn bindgen_test_layout_URLParams ( ) { assert_eq ! ( :: std :: mem :: size_of :: < URLParams > ( ) , 8usize , concat ! ( "Size of: " , stringify ! ( URLParams ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < URLParams > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( URLParams ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const URLParams ) ) . mParams as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( URLParams ) , "::" , stringify ! ( mParams ) ) ) ; } # [ repr ( C ) ] pub struct SRIMetadata { pub mHashes : root :: nsTArray < root :: nsCString > , pub mIntegrityString : ::nsstring::nsStringRepr , pub mAlgorithm : root :: nsCString , pub mAlgorithmType : i8 , pub mEmpty : bool , } pub const SRIMetadata_MAX_ALTERNATE_HASHES : u32 = 256 ; pub const SRIMetadata_UNKNOWN_ALGORITHM : i8 = -1 ; # [ test ] fn bindgen_test_layout_SRIMetadata ( ) { assert_eq ! ( :: std :: mem :: size_of :: < SRIMetadata > ( ) , 48usize , concat ! ( "Size of: " , stringify ! ( SRIMetadata ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < SRIMetadata > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( SRIMetadata ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const SRIMetadata ) ) . mHashes as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( SRIMetadata ) , "::" , stringify ! ( mHashes ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const SRIMetadata ) ) . mIntegrityString as * const _ as usize } , 8usize , concat ! ( "Alignment of field: " , stringify ! ( SRIMetadata ) , "::" , stringify ! ( mIntegrityString ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const SRIMetadata ) ) . mAlgorithm as * const _ as usize } , 24usize , concat ! ( "Alignment of field: " , stringify ! ( SRIMetadata ) , "::" , stringify ! ( mAlgorithm ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const SRIMetadata ) ) . mAlgorithmType as * const _ as usize } , 40usize , concat ! ( "Alignment of field: " , stringify ! ( SRIMetadata ) , "::" , stringify ! ( mAlgorithmType ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const SRIMetadata ) ) . mEmpty as * const _ as usize } , 41usize , concat ! ( "Alignment of field: " , stringify ! ( SRIMetadata ) , "::" , stringify ! ( mEmpty ) ) ) ; } # [ repr ( C ) ] # [ derive ( Debug ) ] pub struct OwningNodeOrString { pub mType : root :: mozilla :: dom :: OwningNodeOrString_Type , pub mValue : root :: mozilla :: dom :: OwningNodeOrString_Value , } pub const OwningNodeOrString_Type_eUninitialized : root :: mozilla :: dom :: OwningNodeOrString_Type = 0 ; pub const OwningNodeOrString_Type_eNode : root :: mozilla :: dom :: OwningNodeOrString_Type = 1 ; pub const OwningNodeOrString_Type_eString : root :: mozilla :: dom :: OwningNodeOrString_Type = 2 ; pub type OwningNodeOrString_Type = :: std :: os :: raw :: c_uint ; # [ repr ( C ) ] # [ derive ( Debug , Copy ) ] pub struct OwningNodeOrString_Value { pub _bindgen_opaque_blob : [ u64 ; 2usize ] , } # [ test ] fn bindgen_test_layout_OwningNodeOrString_Value ( ) { assert_eq ! ( :: std :: mem :: size_of :: < OwningNodeOrString_Value > ( ) , 16usize , concat ! ( "Size of: " , stringify ! ( OwningNodeOrString_Value ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < OwningNodeOrString_Value > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( OwningNodeOrString_Value ) ) ) ; } impl Clone for OwningNodeOrString_Value { fn clone ( & self ) -> Self { * self } } # [ test ] fn bindgen_test_layout_OwningNodeOrString ( ) { assert_eq ! ( :: std :: mem :: size_of :: < OwningNodeOrString > ( ) , 24usize , concat ! ( "Size of: " , stringify ! ( OwningNodeOrString ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < OwningNodeOrString > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( OwningNodeOrString ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const OwningNodeOrString ) ) . mType as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( OwningNodeOrString ) , "::" , stringify ! ( mType ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const OwningNodeOrString ) ) . mValue as * const _ as usize } , 8usize , concat ! ( "Alignment of field: " , stringify ! ( OwningNodeOrString ) , "::" , stringify ! ( mValue ) ) ) ; } # [ repr ( u8 ) ] # [ derive ( Debug , Copy , Clone , PartialEq , Eq , Hash ) ] pub enum FillMode { None = 0 , Forwards = 1 , Backwards = 2 , Both = 3 , Auto = 4 , EndGuard_ = 5 , } # [ repr ( u8 ) ] # [ derive ( Debug , Copy , Clone , PartialEq , Eq , Hash ) ] pub enum PlaybackDirection { Normal = 0 , Reverse = 1 , Alternate = 2 , Alternate_reverse = 3 , EndGuard_ = 4 , } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct XBLChildrenElement { _unused : [ u8 ; 0 ] } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct CustomElementData { _unused : [ u8 ; 0 ] } # [ repr ( C ) ] pub struct FragmentOrElement { pub _base : root :: nsIContent , pub mRefCnt : root :: nsCycleCollectingAutoRefCnt , 
  /// Array containing all attributes and children for this element 
  pub mAttrsAndChildren : root :: nsAttrAndChildArray , } pub type FragmentOrElement_HasThreadSafeRefCnt = root :: mozilla :: FalseType ; # [ repr ( C ) ] # [ derive ( Debug , Copy ) ] pub struct FragmentOrElement_cycleCollection { pub _base : root :: nsXPCOMCycleCollectionParticipant , } # [ test ] fn bindgen_test_layout_FragmentOrElement_cycleCollection ( ) { assert_eq ! ( :: std :: mem :: size_of :: < FragmentOrElement_cycleCollection > ( ) , 16usize , concat ! ( "Size of: " , stringify ! ( FragmentOrElement_cycleCollection ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < FragmentOrElement_cycleCollection > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( FragmentOrElement_cycleCollection ) ) ) ; } impl Clone for FragmentOrElement_cycleCollection { fn clone ( & self ) -> Self { * self } } 
  /// There are a set of DOM- and scripting-specific instance variables
             /// that may only be instantiated when a content object is accessed
             /// through the DOM. Rather than burn actual slots in the content
             /// objects for each of these instance variables, we put them off
             /// in a side structure that's only allocated when the content is
             /// accessed through the DOM. 
@@ -160,17 +160,20 @@ pub type ServoStyleContextStrong = ::gec
             /// against.
             /// @param aCaseSensitive Whether to do a case-sensitive compare on the values.
             /// @return ATTR_MISSING, ATTR_VALUE_NO_MATCH or the non-negative index
             /// indicating the first value of aValues that matched 
  pub type Element_AttrValuesArray = * const * const root :: nsStaticAtom ; # [ repr ( C ) ] # [ derive ( Debug , Copy ) ] pub struct Element_MappedAttributeEntry { pub attribute : * mut * mut root :: nsStaticAtom , } # [ test ] fn bindgen_test_layout_Element_MappedAttributeEntry ( ) { assert_eq ! ( :: std :: mem :: size_of :: < Element_MappedAttributeEntry > ( ) , 8usize , concat ! ( "Size of: " , stringify ! ( Element_MappedAttributeEntry ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < Element_MappedAttributeEntry > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( Element_MappedAttributeEntry ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const Element_MappedAttributeEntry ) ) . attribute as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( Element_MappedAttributeEntry ) , "::" , stringify ! ( attribute ) ) ) ; } impl Clone for Element_MappedAttributeEntry { fn clone ( & self ) -> Self { * self } } 
  /// Define a general matching function that can be passed to
             /// GetElementsByMatching(). Each Element being considered is
             /// passed in. 
- pub type Element_nsElementMatchFunc = :: std :: option :: Option < unsafe extern "C" fn ( aElement : * mut root :: mozilla :: dom :: Element ) -> bool > ; pub const Element_kAllServoDescendantBits : u32 = 25296896 ; pub const Element_kFireMutationEvent : bool = true ; pub const Element_kDontFireMutationEvent : bool = false ; pub const Element_kNotifyDocumentObservers : bool = true ; pub const Element_kDontNotifyDocumentObservers : bool = false ; pub const Element_kCallAfterSetAttr : bool = true ; pub const Element_kDontCallAfterSetAttr : bool = false ; # [ test ] fn bindgen_test_layout_Element ( ) { assert_eq ! ( :: std :: mem :: size_of :: < Element > ( ) , 120usize , concat ! ( "Size of: " , stringify ! ( Element ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < Element > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( Element ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const Element ) ) . mState as * const _ as usize } , 104usize , concat ! ( "Alignment of field: " , stringify ! ( Element ) , "::" , stringify ! ( mState ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const Element ) ) . mServoData as * const _ as usize } , 112usize , concat ! ( "Alignment of field: " , stringify ! ( Element ) , "::" , stringify ! ( mServoData ) ) ) ; } # [ repr ( C ) ] # [ derive ( Debug , Copy ) ] pub struct ExplicitChildIterator { pub mParent : * const root :: nsIContent , pub mParentAsSlot : * const root :: mozilla :: dom :: HTMLSlotElement , pub mChild : * mut root :: nsIContent , pub mDefaultChild : * mut root :: nsIContent , pub mIsFirst : bool , pub mIndexInInserted : u32 , } # [ test ] fn bindgen_test_layout_ExplicitChildIterator ( ) { assert_eq ! ( :: std :: mem :: size_of :: < ExplicitChildIterator > ( ) , 40usize , concat ! ( "Size of: " , stringify ! ( ExplicitChildIterator ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < ExplicitChildIterator > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( ExplicitChildIterator ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const ExplicitChildIterator ) ) . mParent as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( ExplicitChildIterator ) , "::" , stringify ! ( mParent ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const ExplicitChildIterator ) ) . mParentAsSlot as * const _ as usize } , 8usize , concat ! ( "Alignment of field: " , stringify ! ( ExplicitChildIterator ) , "::" , stringify ! ( mParentAsSlot ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const ExplicitChildIterator ) ) . mChild as * const _ as usize } , 16usize , concat ! ( "Alignment of field: " , stringify ! ( ExplicitChildIterator ) , "::" , stringify ! ( mChild ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const ExplicitChildIterator ) ) . mDefaultChild as * const _ as usize } , 24usize , concat ! ( "Alignment of field: " , stringify ! ( ExplicitChildIterator ) , "::" , stringify ! ( mDefaultChild ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const ExplicitChildIterator ) ) . mIsFirst as * const _ as usize } , 32usize , concat ! ( "Alignment of field: " , stringify ! ( ExplicitChildIterator ) , "::" , stringify ! ( mIsFirst ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const ExplicitChildIterator ) ) . mIndexInInserted as * const _ as usize } , 36usize , concat ! ( "Alignment of field: " , stringify ! ( ExplicitChildIterator ) , "::" , stringify ! ( mIndexInInserted ) ) ) ; } impl Clone for ExplicitChildIterator { fn clone ( & self ) -> Self { * self } } # [ repr ( C ) ] # [ derive ( Debug , Copy ) ] pub struct FlattenedChildIterator { pub _base : root :: mozilla :: dom :: ExplicitChildIterator , pub mXBLInvolved : bool , pub mOriginalContent : * const root :: nsIContent , } # [ test ] fn bindgen_test_layout_FlattenedChildIterator ( ) { assert_eq ! ( :: std :: mem :: size_of :: < FlattenedChildIterator > ( ) , 56usize , concat ! ( "Size of: " , stringify ! ( FlattenedChildIterator ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < FlattenedChildIterator > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( FlattenedChildIterator ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const FlattenedChildIterator ) ) . mXBLInvolved as * const _ as usize } , 40usize , concat ! ( "Alignment of field: " , stringify ! ( FlattenedChildIterator ) , "::" , stringify ! ( mXBLInvolved ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const FlattenedChildIterator ) ) . mOriginalContent as * const _ as usize } , 48usize , concat ! ( "Alignment of field: " , stringify ! ( FlattenedChildIterator ) , "::" , stringify ! ( mOriginalContent ) ) ) ; } impl Clone for FlattenedChildIterator { fn clone ( & self ) -> Self { * self } } 
+ pub type Element_nsElementMatchFunc = :: std :: option :: Option < unsafe extern "C" fn ( aElement : * mut root :: mozilla :: dom :: Element ) -> bool > ; pub const Element_kAllServoDescendantBits : u32 = 25296896 ; pub const Element_kFireMutationEvent : bool = true ; pub const Element_kDontFireMutationEvent : bool = false ; pub const Element_kNotifyDocumentObservers : bool = true ; pub const Element_kDontNotifyDocumentObservers : bool = false ; pub const Element_kCallAfterSetAttr : bool = true ; pub const Element_kDontCallAfterSetAttr : bool = false ; # [ test ] fn bindgen_test_layout_Element ( ) { assert_eq ! ( :: std :: mem :: size_of :: < Element > ( ) , 120usize , concat ! ( "Size of: " , stringify ! ( Element ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < Element > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( Element ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const Element ) ) . mState as * const _ as usize } , 104usize , concat ! ( "Alignment of field: " , stringify ! ( Element ) , "::" , stringify ! ( mState ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const Element ) ) . mServoData as * const _ as usize } , 112usize , concat ! ( "Alignment of field: " , stringify ! ( Element ) , "::" , stringify ! ( mServoData ) ) ) ; } # [ repr ( C ) ] pub struct HTMLSlotElement { pub _base : root :: nsGenericHTMLElement , pub mAssignedNodes : root :: nsTArray < root :: RefPtr < root :: nsINode > > , } # [ repr ( C ) ] # [ derive ( Debug , Copy ) ] pub struct HTMLSlotElement_cycleCollection { pub _base : root :: mozilla :: dom :: FragmentOrElement_cycleCollection , } # [ test ] fn bindgen_test_layout_HTMLSlotElement_cycleCollection ( ) { assert_eq ! ( :: std :: mem :: size_of :: < HTMLSlotElement_cycleCollection > ( ) , 16usize , concat ! ( "Size of: " , stringify ! ( HTMLSlotElement_cycleCollection ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < HTMLSlotElement_cycleCollection > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( HTMLSlotElement_cycleCollection ) ) ) ; } impl Clone for HTMLSlotElement_cycleCollection { fn clone ( & self ) -> Self { * self } } extern "C" {
+ # [ link_name = "\u{1}_ZN7mozilla3dom15HTMLSlotElement21_cycleCollectorGlobalE" ] 
+ pub static mut  HTMLSlotElement__cycleCollectorGlobal  :  root :: mozilla :: dom :: HTMLSlotElement_cycleCollection ;
+} # [ test ] fn bindgen_test_layout_HTMLSlotElement ( ) { assert_eq ! ( :: std :: mem :: size_of :: < HTMLSlotElement > ( ) , 136usize , concat ! ( "Size of: " , stringify ! ( HTMLSlotElement ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < HTMLSlotElement > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( HTMLSlotElement ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const HTMLSlotElement ) ) . mAssignedNodes as * const _ as usize } , 128usize , concat ! ( "Alignment of field: " , stringify ! ( HTMLSlotElement ) , "::" , stringify ! ( mAssignedNodes ) ) ) ; } # [ repr ( u8 ) ] # [ derive ( Debug , Copy , Clone , PartialEq , Eq , Hash ) ] pub enum CompositeOperation { Replace = 0 , Add = 1 , Accumulate = 2 , EndGuard_ = 3 , } # [ repr ( u8 ) ] # [ derive ( Debug , Copy , Clone , PartialEq , Eq , Hash ) ] pub enum IterationCompositeOperation { Replace = 0 , Accumulate = 1 , EndGuard_ = 2 , } # [ repr ( C ) ] # [ derive ( Debug , Copy ) ] pub struct ExplicitChildIterator { pub mParent : * const root :: nsIContent , pub mParentAsSlot : * const root :: mozilla :: dom :: HTMLSlotElement , pub mChild : * mut root :: nsIContent , pub mDefaultChild : * mut root :: nsIContent , pub mIsFirst : bool , pub mIndexInInserted : u32 , } # [ test ] fn bindgen_test_layout_ExplicitChildIterator ( ) { assert_eq ! ( :: std :: mem :: size_of :: < ExplicitChildIterator > ( ) , 40usize , concat ! ( "Size of: " , stringify ! ( ExplicitChildIterator ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < ExplicitChildIterator > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( ExplicitChildIterator ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const ExplicitChildIterator ) ) . mParent as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( ExplicitChildIterator ) , "::" , stringify ! ( mParent ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const ExplicitChildIterator ) ) . mParentAsSlot as * const _ as usize } , 8usize , concat ! ( "Alignment of field: " , stringify ! ( ExplicitChildIterator ) , "::" , stringify ! ( mParentAsSlot ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const ExplicitChildIterator ) ) . mChild as * const _ as usize } , 16usize , concat ! ( "Alignment of field: " , stringify ! ( ExplicitChildIterator ) , "::" , stringify ! ( mChild ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const ExplicitChildIterator ) ) . mDefaultChild as * const _ as usize } , 24usize , concat ! ( "Alignment of field: " , stringify ! ( ExplicitChildIterator ) , "::" , stringify ! ( mDefaultChild ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const ExplicitChildIterator ) ) . mIsFirst as * const _ as usize } , 32usize , concat ! ( "Alignment of field: " , stringify ! ( ExplicitChildIterator ) , "::" , stringify ! ( mIsFirst ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const ExplicitChildIterator ) ) . mIndexInInserted as * const _ as usize } , 36usize , concat ! ( "Alignment of field: " , stringify ! ( ExplicitChildIterator ) , "::" , stringify ! ( mIndexInInserted ) ) ) ; } impl Clone for ExplicitChildIterator { fn clone ( & self ) -> Self { * self } } # [ repr ( C ) ] # [ derive ( Debug , Copy ) ] pub struct FlattenedChildIterator { pub _base : root :: mozilla :: dom :: ExplicitChildIterator , pub mXBLInvolved : bool , pub mOriginalContent : * const root :: nsIContent , } # [ test ] fn bindgen_test_layout_FlattenedChildIterator ( ) { assert_eq ! ( :: std :: mem :: size_of :: < FlattenedChildIterator > ( ) , 56usize , concat ! ( "Size of: " , stringify ! ( FlattenedChildIterator ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < FlattenedChildIterator > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( FlattenedChildIterator ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const FlattenedChildIterator ) ) . mXBLInvolved as * const _ as usize } , 40usize , concat ! ( "Alignment of field: " , stringify ! ( FlattenedChildIterator ) , "::" , stringify ! ( mXBLInvolved ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const FlattenedChildIterator ) ) . mOriginalContent as * const _ as usize } , 48usize , concat ! ( "Alignment of field: " , stringify ! ( FlattenedChildIterator ) , "::" , stringify ! ( mOriginalContent ) ) ) ; } impl Clone for FlattenedChildIterator { fn clone ( & self ) -> Self { * self } } 
  /// AllChildrenIterator traverses the children of an element including before /
             /// after content and optionally XBL children.  The iterator can be initialized
             /// to start at the end by providing false for aStartAtBeginning in order to
             /// start iterating in reverse from the last child.
             ///
             /// Note: it assumes that no mutation of the DOM or frame tree takes place during
             /// iteration, and will break horribly if that is not true. 
  # [ repr ( C ) ] # [ derive ( Debug ) ] pub struct AllChildrenIterator { pub _base : root :: mozilla :: dom :: FlattenedChildIterator , pub mAnonKids : root :: nsTArray < * mut root :: nsIContent > , pub mAnonKidsIdx : u32 , pub mFlags : u32 , pub mPhase : root :: mozilla :: dom :: AllChildrenIterator_IteratorPhase , } pub const AllChildrenIterator_IteratorPhase_eAtBegin : root :: mozilla :: dom :: AllChildrenIterator_IteratorPhase = 0 ; pub const AllChildrenIterator_IteratorPhase_eAtBeforeKid : root :: mozilla :: dom :: AllChildrenIterator_IteratorPhase = 1 ; pub const AllChildrenIterator_IteratorPhase_eAtExplicitKids : root :: mozilla :: dom :: AllChildrenIterator_IteratorPhase = 2 ; pub const AllChildrenIterator_IteratorPhase_eAtAnonKids : root :: mozilla :: dom :: AllChildrenIterator_IteratorPhase = 3 ; pub const AllChildrenIterator_IteratorPhase_eAtAfterKid : root :: mozilla :: dom :: AllChildrenIterator_IteratorPhase = 4 ; pub const AllChildrenIterator_IteratorPhase_eAtEnd : root :: mozilla :: dom :: AllChildrenIterator_IteratorPhase = 5 ; pub type AllChildrenIterator_IteratorPhase = :: std :: os :: raw :: c_uint ; # [ test ] fn bindgen_test_layout_AllChildrenIterator ( ) { assert_eq ! ( :: std :: mem :: size_of :: < AllChildrenIterator > ( ) , 80usize , concat ! ( "Size of: " , stringify ! ( AllChildrenIterator ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < AllChildrenIterator > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( AllChildrenIterator ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const AllChildrenIterator ) ) . mAnonKids as * const _ as usize } , 56usize , concat ! ( "Alignment of field: " , stringify ! ( AllChildrenIterator ) , "::" , stringify ! ( mAnonKids ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const AllChildrenIterator ) ) . mAnonKidsIdx as * const _ as usize } , 64usize , concat ! ( "Alignment of field: " , stringify ! ( AllChildrenIterator ) , "::" , stringify ! ( mAnonKidsIdx ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const AllChildrenIterator ) ) . mFlags as * const _ as usize } , 68usize , concat ! ( "Alignment of field: " , stringify ! ( AllChildrenIterator ) , "::" , stringify ! ( mFlags ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const AllChildrenIterator ) ) . mPhase as * const _ as usize } , 72usize , concat ! ( "Alignment of field: " , stringify ! ( AllChildrenIterator ) , "::" , stringify ! ( mPhase ) ) ) ; } 
@@ -319,17 +322,17 @@ pub type ServoStyleContextStrong = ::gec
         /// A pleasant side-effect of these additional Check() calls is that crash
         /// signatures may become more regular, as crashes will ideally occur
         /// consolidated at the point of a Check(), rather than scattered about at
         /// various uses of the corrupted memory. 
  # [ repr ( C ) ] # [ derive ( Debug ) ] pub struct CorruptionCanary { pub mValue : usize , } pub const CorruptionCanary_kCanarySet : usize = 252382987 ; # [ test ] fn bindgen_test_layout_CorruptionCanary ( ) { assert_eq ! ( :: std :: mem :: size_of :: < CorruptionCanary > ( ) , 8usize , concat ! ( "Size of: " , stringify ! ( CorruptionCanary ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < CorruptionCanary > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( CorruptionCanary ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const CorruptionCanary ) ) . mValue as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( CorruptionCanary ) , "::" , stringify ! ( mValue ) ) ) ; } # [ repr ( C ) ] # [ derive ( Debug , Copy ) ] pub struct ArenaAllocator_ArenaHeader { 
  /// The location in memory of the data portion of the arena. 
  pub offset : usize , 
  /// The location in memory of the end of the data portion of the arena. 
- pub tail : usize , } impl Clone for ArenaAllocator_ArenaHeader { fn clone ( & self ) -> Self { * self } } # [ repr ( C ) ] # [ derive ( Debug ) ] pub struct ArenaAllocator_ArenaChunk { pub canary : root :: mozilla :: CorruptionCanary , pub header : root :: mozilla :: ArenaAllocator_ArenaHeader , pub next : * mut root :: mozilla :: ArenaAllocator_ArenaChunk , } pub type LayoutDeviceIntPoint = [ u32 ; 2usize ] ; # [ repr ( C ) ] # [ derive ( Debug , Copy ) ] pub struct LayoutDevicePixel { pub _address : u8 , } # [ test ] fn bindgen_test_layout_LayoutDevicePixel ( ) { assert_eq ! ( :: std :: mem :: size_of :: < LayoutDevicePixel > ( ) , 1usize , concat ! ( "Size of: " , stringify ! ( LayoutDevicePixel ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < LayoutDevicePixel > ( ) , 1usize , concat ! ( "Alignment of " , stringify ! ( LayoutDevicePixel ) ) ) ; } impl Clone for LayoutDevicePixel { fn clone ( & self ) -> Self { * self } } pub mod a11y { # [ allow ( unused_imports ) ] use self :: super :: super :: super :: root ; # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct DocAccessible { _unused : [ u8 ; 0 ] } } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct Encoding { _unused : [ u8 ; 0 ] } # [ repr ( C ) ] # [ derive ( Debug ) ] pub struct Runnable { pub _base : root :: nsIRunnable , pub _base_1 : root :: nsINamed , pub mRefCnt : root :: mozilla :: ThreadSafeAutoRefCnt , pub mName : * const :: std :: os :: raw :: c_char , } pub type Runnable_HasThreadSafeRefCnt = root :: mozilla :: TrueType ; # [ test ] fn bindgen_test_layout_Runnable ( ) { assert_eq ! ( :: std :: mem :: size_of :: < Runnable > ( ) , 32usize , concat ! ( "Size of: " , stringify ! ( Runnable ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < Runnable > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( Runnable ) ) ) ; } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct SegmentedVector_SegmentImpl_Storage { pub mBuf : root :: __BindgenUnionField < * mut :: std :: os :: raw :: c_char > , pub mAlign : root :: __BindgenUnionField < u8 > , pub bindgen_union_field : u64 , } pub type SegmentedVector_Segment = u8 ; # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct SegmentedVector_IterImpl { pub mSegment : * mut root :: mozilla :: SegmentedVector_Segment , pub mIndex : usize , } pub const UseCounter_eUseCounter_UNKNOWN : root :: mozilla :: UseCounter = -1 ; pub const UseCounter_eUseCounter_SVGSVGElement_getElementById : root :: mozilla :: UseCounter = 0 ; pub const UseCounter_eUseCounter_SVGSVGElement_currentScale_getter : root :: mozilla :: UseCounter = 1 ; pub const UseCounter_eUseCounter_SVGSVGElement_currentScale_setter : root :: mozilla :: UseCounter = 2 ; pub const UseCounter_eUseCounter_property_Fill : root :: mozilla :: UseCounter = 3 ; pub const UseCounter_eUseCounter_property_FillOpacity : root :: mozilla :: UseCounter = 4 ; pub const UseCounter_eUseCounter_XMLDocument_async_getter : root :: mozilla :: UseCounter = 5 ; pub const UseCounter_eUseCounter_XMLDocument_async_setter : root :: mozilla :: UseCounter = 6 ; pub const UseCounter_eUseCounter_DOMError_name_getter : root :: mozilla :: UseCounter = 7 ; pub const UseCounter_eUseCounter_DOMError_name_setter : root :: mozilla :: UseCounter = 8 ; pub const UseCounter_eUseCounter_DOMError_message_getter : root :: mozilla :: UseCounter = 9 ; pub const UseCounter_eUseCounter_DOMError_message_setter : root :: mozilla :: UseCounter = 10 ; pub const UseCounter_eUseCounter_custom_DOMErrorConstructor : root :: mozilla :: UseCounter = 11 ; pub const UseCounter_eUseCounter_PushManager_subscribe : root :: mozilla :: UseCounter = 12 ; pub const UseCounter_eUseCounter_PushSubscription_unsubscribe : root :: mozilla :: UseCounter = 13 ; pub const UseCounter_eUseCounter_Window_sidebar_getter : root :: mozilla :: UseCounter = 14 ; pub const UseCounter_eUseCounter_Window_sidebar_setter : root :: mozilla :: UseCounter = 15 ; pub const UseCounter_eUseCounter_External_addSearchEngine : root :: mozilla :: UseCounter = 16 ; pub const UseCounter_eUseCounter_OfflineResourceList_swapCache : root :: mozilla :: UseCounter = 17 ; pub const UseCounter_eUseCounter_OfflineResourceList_update : root :: mozilla :: UseCounter = 18 ; pub const UseCounter_eUseCounter_OfflineResourceList_status_getter : root :: mozilla :: UseCounter = 19 ; pub const UseCounter_eUseCounter_OfflineResourceList_status_setter : root :: mozilla :: UseCounter = 20 ; pub const UseCounter_eUseCounter_OfflineResourceList_onchecking_getter : root :: mozilla :: UseCounter = 21 ; pub const UseCounter_eUseCounter_OfflineResourceList_onchecking_setter : root :: mozilla :: UseCounter = 22 ; pub const UseCounter_eUseCounter_OfflineResourceList_onerror_getter : root :: mozilla :: UseCounter = 23 ; pub const UseCounter_eUseCounter_OfflineResourceList_onerror_setter : root :: mozilla :: UseCounter = 24 ; pub const UseCounter_eUseCounter_OfflineResourceList_onnoupdate_getter : root :: mozilla :: UseCounter = 25 ; pub const UseCounter_eUseCounter_OfflineResourceList_onnoupdate_setter : root :: mozilla :: UseCounter = 26 ; pub const UseCounter_eUseCounter_OfflineResourceList_ondownloading_getter : root :: mozilla :: UseCounter = 27 ; pub const UseCounter_eUseCounter_OfflineResourceList_ondownloading_setter : root :: mozilla :: UseCounter = 28 ; pub const UseCounter_eUseCounter_OfflineResourceList_onprogress_getter : root :: mozilla :: UseCounter = 29 ; pub const UseCounter_eUseCounter_OfflineResourceList_onprogress_setter : root :: mozilla :: UseCounter = 30 ; pub const UseCounter_eUseCounter_OfflineResourceList_onupdateready_getter : root :: mozilla :: UseCounter = 31 ; pub const UseCounter_eUseCounter_OfflineResourceList_onupdateready_setter : root :: mozilla :: UseCounter = 32 ; pub const UseCounter_eUseCounter_OfflineResourceList_oncached_getter : root :: mozilla :: UseCounter = 33 ; pub const UseCounter_eUseCounter_OfflineResourceList_oncached_setter : root :: mozilla :: UseCounter = 34 ; pub const UseCounter_eUseCounter_OfflineResourceList_onobsolete_getter : root :: mozilla :: UseCounter = 35 ; pub const UseCounter_eUseCounter_OfflineResourceList_onobsolete_setter : root :: mozilla :: UseCounter = 36 ; pub const UseCounter_eUseCounter_IDBDatabase_createMutableFile : root :: mozilla :: UseCounter = 37 ; pub const UseCounter_eUseCounter_IDBDatabase_mozCreateFileHandle : root :: mozilla :: UseCounter = 38 ; pub const UseCounter_eUseCounter_IDBMutableFile_open : root :: mozilla :: UseCounter = 39 ; pub const UseCounter_eUseCounter_IDBMutableFile_getFile : root :: mozilla :: UseCounter = 40 ; pub const UseCounter_eUseCounter_DataTransfer_addElement : root :: mozilla :: UseCounter = 41 ; pub const UseCounter_eUseCounter_DataTransfer_mozItemCount_getter : root :: mozilla :: UseCounter = 42 ; pub const UseCounter_eUseCounter_DataTransfer_mozItemCount_setter : root :: mozilla :: UseCounter = 43 ; pub const UseCounter_eUseCounter_DataTransfer_mozCursor_getter : root :: mozilla :: UseCounter = 44 ; pub const UseCounter_eUseCounter_DataTransfer_mozCursor_setter : root :: mozilla :: UseCounter = 45 ; pub const UseCounter_eUseCounter_DataTransfer_mozTypesAt : root :: mozilla :: UseCounter = 46 ; pub const UseCounter_eUseCounter_DataTransfer_mozClearDataAt : root :: mozilla :: UseCounter = 47 ; pub const UseCounter_eUseCounter_DataTransfer_mozSetDataAt : root :: mozilla :: UseCounter = 48 ; pub const UseCounter_eUseCounter_DataTransfer_mozGetDataAt : root :: mozilla :: UseCounter = 49 ; pub const UseCounter_eUseCounter_DataTransfer_mozUserCancelled_getter : root :: mozilla :: UseCounter = 50 ; pub const UseCounter_eUseCounter_DataTransfer_mozUserCancelled_setter : root :: mozilla :: UseCounter = 51 ; pub const UseCounter_eUseCounter_DataTransfer_mozSourceNode_getter : root :: mozilla :: UseCounter = 52 ; pub const UseCounter_eUseCounter_DataTransfer_mozSourceNode_setter : root :: mozilla :: UseCounter = 53 ; pub const UseCounter_eUseCounter_custom_JS_asmjs : root :: mozilla :: UseCounter = 54 ; pub const UseCounter_eUseCounter_custom_JS_wasm : root :: mozilla :: UseCounter = 55 ; pub const UseCounter_eUseCounter_EnablePrivilege : root :: mozilla :: UseCounter = 56 ; pub const UseCounter_eUseCounter_DOMExceptionCode : root :: mozilla :: UseCounter = 57 ; pub const UseCounter_eUseCounter_MutationEvent : root :: mozilla :: UseCounter = 58 ; pub const UseCounter_eUseCounter_Components : root :: mozilla :: UseCounter = 59 ; pub const UseCounter_eUseCounter_PrefixedVisibilityAPI : root :: mozilla :: UseCounter = 60 ; pub const UseCounter_eUseCounter_NodeIteratorDetach : root :: mozilla :: UseCounter = 61 ; pub const UseCounter_eUseCounter_LenientThis : root :: mozilla :: UseCounter = 62 ; pub const UseCounter_eUseCounter_GetPreventDefault : root :: mozilla :: UseCounter = 63 ; pub const UseCounter_eUseCounter_GetSetUserData : root :: mozilla :: UseCounter = 64 ; pub const UseCounter_eUseCounter_MozGetAsFile : root :: mozilla :: UseCounter = 65 ; pub const UseCounter_eUseCounter_UseOfCaptureEvents : root :: mozilla :: UseCounter = 66 ; pub const UseCounter_eUseCounter_UseOfReleaseEvents : root :: mozilla :: UseCounter = 67 ; pub const UseCounter_eUseCounter_UseOfDOM3LoadMethod : root :: mozilla :: UseCounter = 68 ; pub const UseCounter_eUseCounter_ChromeUseOfDOM3LoadMethod : root :: mozilla :: UseCounter = 69 ; pub const UseCounter_eUseCounter_ShowModalDialog : root :: mozilla :: UseCounter = 70 ; pub const UseCounter_eUseCounter_SyncXMLHttpRequest : root :: mozilla :: UseCounter = 71 ; pub const UseCounter_eUseCounter_Window_Cc_ontrollers : root :: mozilla :: UseCounter = 72 ; pub const UseCounter_eUseCounter_ImportXULIntoContent : root :: mozilla :: UseCounter = 73 ; pub const UseCounter_eUseCounter_PannerNodeDoppler : root :: mozilla :: UseCounter = 74 ; pub const UseCounter_eUseCounter_NavigatorGetUserMedia : root :: mozilla :: UseCounter = 75 ; pub const UseCounter_eUseCounter_WebrtcDeprecatedPrefix : root :: mozilla :: UseCounter = 76 ; pub const UseCounter_eUseCounter_RTCPeerConnectionGetStreams : root :: mozilla :: UseCounter = 77 ; pub const UseCounter_eUseCounter_AppCache : root :: mozilla :: UseCounter = 78 ; pub const UseCounter_eUseCounter_PrefixedImageSmoothingEnabled : root :: mozilla :: UseCounter = 79 ; pub const UseCounter_eUseCounter_PrefixedFullscreenAPI : root :: mozilla :: UseCounter = 80 ; pub const UseCounter_eUseCounter_LenientSetter : root :: mozilla :: UseCounter = 81 ; pub const UseCounter_eUseCounter_FileLastModifiedDate : root :: mozilla :: UseCounter = 82 ; pub const UseCounter_eUseCounter_ImageBitmapRenderingContext_TransferImageBitmap : root :: mozilla :: UseCounter = 83 ; pub const UseCounter_eUseCounter_URLCreateObjectURL_MediaStream : root :: mozilla :: UseCounter = 84 ; pub const UseCounter_eUseCounter_XMLBaseAttribute : root :: mozilla :: UseCounter = 85 ; pub const UseCounter_eUseCounter_WindowContentUntrusted : root :: mozilla :: UseCounter = 86 ; pub const UseCounter_eUseCounter_Count : root :: mozilla :: UseCounter = 87 ; pub type UseCounter = i16 ; pub const LogLevel_Disabled : root :: mozilla :: LogLevel = 0 ; pub const LogLevel_Error : root :: mozilla :: LogLevel = 1 ; pub const LogLevel_Warning : root :: mozilla :: LogLevel = 2 ; pub const LogLevel_Info : root :: mozilla :: LogLevel = 3 ; pub const LogLevel_Debug : root :: mozilla :: LogLevel = 4 ; pub const LogLevel_Verbose : root :: mozilla :: LogLevel = 5 ; pub type LogLevel = :: std :: os :: raw :: c_int ; # [ repr ( C ) ] # [ derive ( Debug ) ] pub struct LogModule { pub mName : * mut :: std :: os :: raw :: c_char , pub mLevel : u32 , } # [ test ] fn bindgen_test_layout_LogModule ( ) { assert_eq ! ( :: std :: mem :: size_of :: < LogModule > ( ) , 16usize , concat ! ( "Size of: " , stringify ! ( LogModule ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < LogModule > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( LogModule ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const LogModule ) ) . mName as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( LogModule ) , "::" , stringify ! ( mName ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const LogModule ) ) . mLevel as * const _ as usize } , 8usize , concat ! ( "Alignment of field: " , stringify ! ( LogModule ) , "::" , stringify ! ( mLevel ) ) ) ; } 
+ pub tail : usize , } impl Clone for ArenaAllocator_ArenaHeader { fn clone ( & self ) -> Self { * self } } # [ repr ( C ) ] # [ derive ( Debug ) ] pub struct ArenaAllocator_ArenaChunk { pub canary : root :: mozilla :: CorruptionCanary , pub header : root :: mozilla :: ArenaAllocator_ArenaHeader , pub next : * mut root :: mozilla :: ArenaAllocator_ArenaChunk , } pub type LayoutDeviceIntPoint = [ u32 ; 2usize ] ; # [ repr ( C ) ] # [ derive ( Debug , Copy ) ] pub struct LayoutDevicePixel { pub _address : u8 , } # [ test ] fn bindgen_test_layout_LayoutDevicePixel ( ) { assert_eq ! ( :: std :: mem :: size_of :: < LayoutDevicePixel > ( ) , 1usize , concat ! ( "Size of: " , stringify ! ( LayoutDevicePixel ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < LayoutDevicePixel > ( ) , 1usize , concat ! ( "Alignment of " , stringify ! ( LayoutDevicePixel ) ) ) ; } impl Clone for LayoutDevicePixel { fn clone ( & self ) -> Self { * self } } pub mod a11y { # [ allow ( unused_imports ) ] use self :: super :: super :: super :: root ; # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct DocAccessible { _unused : [ u8 ; 0 ] } } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct Encoding { _unused : [ u8 ; 0 ] } # [ repr ( C ) ] # [ derive ( Debug ) ] pub struct Runnable { pub _base : root :: nsIRunnable , pub _base_1 : root :: nsINamed , pub mRefCnt : root :: mozilla :: ThreadSafeAutoRefCnt , pub mName : * const :: std :: os :: raw :: c_char , } pub type Runnable_HasThreadSafeRefCnt = root :: mozilla :: TrueType ; # [ test ] fn bindgen_test_layout_Runnable ( ) { assert_eq ! ( :: std :: mem :: size_of :: < Runnable > ( ) , 32usize , concat ! ( "Size of: " , stringify ! ( Runnable ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < Runnable > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( Runnable ) ) ) ; } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct SegmentedVector_SegmentImpl_Storage { pub mBuf : root :: __BindgenUnionField < * mut :: std :: os :: raw :: c_char > , pub mAlign : root :: __BindgenUnionField < u8 > , pub bindgen_union_field : u64 , } pub type SegmentedVector_Segment = u8 ; # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct SegmentedVector_IterImpl { pub mSegment : * mut root :: mozilla :: SegmentedVector_Segment , pub mIndex : usize , } pub const UseCounter_eUseCounter_UNKNOWN : root :: mozilla :: UseCounter = -1 ; pub const UseCounter_eUseCounter_SVGSVGElement_getElementById : root :: mozilla :: UseCounter = 0 ; pub const UseCounter_eUseCounter_SVGSVGElement_currentScale_getter : root :: mozilla :: UseCounter = 1 ; pub const UseCounter_eUseCounter_SVGSVGElement_currentScale_setter : root :: mozilla :: UseCounter = 2 ; pub const UseCounter_eUseCounter_property_Fill : root :: mozilla :: UseCounter = 3 ; pub const UseCounter_eUseCounter_property_FillOpacity : root :: mozilla :: UseCounter = 4 ; pub const UseCounter_eUseCounter_XMLDocument_async_getter : root :: mozilla :: UseCounter = 5 ; pub const UseCounter_eUseCounter_XMLDocument_async_setter : root :: mozilla :: UseCounter = 6 ; pub const UseCounter_eUseCounter_DOMError_name_getter : root :: mozilla :: UseCounter = 7 ; pub const UseCounter_eUseCounter_DOMError_name_setter : root :: mozilla :: UseCounter = 8 ; pub const UseCounter_eUseCounter_DOMError_message_getter : root :: mozilla :: UseCounter = 9 ; pub const UseCounter_eUseCounter_DOMError_message_setter : root :: mozilla :: UseCounter = 10 ; pub const UseCounter_eUseCounter_custom_DOMErrorConstructor : root :: mozilla :: UseCounter = 11 ; pub const UseCounter_eUseCounter_PushManager_subscribe : root :: mozilla :: UseCounter = 12 ; pub const UseCounter_eUseCounter_PushSubscription_unsubscribe : root :: mozilla :: UseCounter = 13 ; pub const UseCounter_eUseCounter_Window_sidebar_getter : root :: mozilla :: UseCounter = 14 ; pub const UseCounter_eUseCounter_Window_sidebar_setter : root :: mozilla :: UseCounter = 15 ; pub const UseCounter_eUseCounter_OfflineResourceList_swapCache : root :: mozilla :: UseCounter = 16 ; pub const UseCounter_eUseCounter_OfflineResourceList_update : root :: mozilla :: UseCounter = 17 ; pub const UseCounter_eUseCounter_OfflineResourceList_status_getter : root :: mozilla :: UseCounter = 18 ; pub const UseCounter_eUseCounter_OfflineResourceList_status_setter : root :: mozilla :: UseCounter = 19 ; pub const UseCounter_eUseCounter_OfflineResourceList_onchecking_getter : root :: mozilla :: UseCounter = 20 ; pub const UseCounter_eUseCounter_OfflineResourceList_onchecking_setter : root :: mozilla :: UseCounter = 21 ; pub const UseCounter_eUseCounter_OfflineResourceList_onerror_getter : root :: mozilla :: UseCounter = 22 ; pub const UseCounter_eUseCounter_OfflineResourceList_onerror_setter : root :: mozilla :: UseCounter = 23 ; pub const UseCounter_eUseCounter_OfflineResourceList_onnoupdate_getter : root :: mozilla :: UseCounter = 24 ; pub const UseCounter_eUseCounter_OfflineResourceList_onnoupdate_setter : root :: mozilla :: UseCounter = 25 ; pub const UseCounter_eUseCounter_OfflineResourceList_ondownloading_getter : root :: mozilla :: UseCounter = 26 ; pub const UseCounter_eUseCounter_OfflineResourceList_ondownloading_setter : root :: mozilla :: UseCounter = 27 ; pub const UseCounter_eUseCounter_OfflineResourceList_onprogress_getter : root :: mozilla :: UseCounter = 28 ; pub const UseCounter_eUseCounter_OfflineResourceList_onprogress_setter : root :: mozilla :: UseCounter = 29 ; pub const UseCounter_eUseCounter_OfflineResourceList_onupdateready_getter : root :: mozilla :: UseCounter = 30 ; pub const UseCounter_eUseCounter_OfflineResourceList_onupdateready_setter : root :: mozilla :: UseCounter = 31 ; pub const UseCounter_eUseCounter_OfflineResourceList_oncached_getter : root :: mozilla :: UseCounter = 32 ; pub const UseCounter_eUseCounter_OfflineResourceList_oncached_setter : root :: mozilla :: UseCounter = 33 ; pub const UseCounter_eUseCounter_OfflineResourceList_onobsolete_getter : root :: mozilla :: UseCounter = 34 ; pub const UseCounter_eUseCounter_OfflineResourceList_onobsolete_setter : root :: mozilla :: UseCounter = 35 ; pub const UseCounter_eUseCounter_IDBDatabase_createMutableFile : root :: mozilla :: UseCounter = 36 ; pub const UseCounter_eUseCounter_IDBDatabase_mozCreateFileHandle : root :: mozilla :: UseCounter = 37 ; pub const UseCounter_eUseCounter_IDBMutableFile_open : root :: mozilla :: UseCounter = 38 ; pub const UseCounter_eUseCounter_IDBMutableFile_getFile : root :: mozilla :: UseCounter = 39 ; pub const UseCounter_eUseCounter_DataTransfer_addElement : root :: mozilla :: UseCounter = 40 ; pub const UseCounter_eUseCounter_DataTransfer_mozItemCount_getter : root :: mozilla :: UseCounter = 41 ; pub const UseCounter_eUseCounter_DataTransfer_mozItemCount_setter : root :: mozilla :: UseCounter = 42 ; pub const UseCounter_eUseCounter_DataTransfer_mozCursor_getter : root :: mozilla :: UseCounter = 43 ; pub const UseCounter_eUseCounter_DataTransfer_mozCursor_setter : root :: mozilla :: UseCounter = 44 ; pub const UseCounter_eUseCounter_DataTransfer_mozTypesAt : root :: mozilla :: UseCounter = 45 ; pub const UseCounter_eUseCounter_DataTransfer_mozClearDataAt : root :: mozilla :: UseCounter = 46 ; pub const UseCounter_eUseCounter_DataTransfer_mozSetDataAt : root :: mozilla :: UseCounter = 47 ; pub const UseCounter_eUseCounter_DataTransfer_mozGetDataAt : root :: mozilla :: UseCounter = 48 ; pub const UseCounter_eUseCounter_DataTransfer_mozUserCancelled_getter : root :: mozilla :: UseCounter = 49 ; pub const UseCounter_eUseCounter_DataTransfer_mozUserCancelled_setter : root :: mozilla :: UseCounter = 50 ; pub const UseCounter_eUseCounter_DataTransfer_mozSourceNode_getter : root :: mozilla :: UseCounter = 51 ; pub const UseCounter_eUseCounter_DataTransfer_mozSourceNode_setter : root :: mozilla :: UseCounter = 52 ; pub const UseCounter_eUseCounter_custom_JS_asmjs : root :: mozilla :: UseCounter = 53 ; pub const UseCounter_eUseCounter_custom_JS_wasm : root :: mozilla :: UseCounter = 54 ; pub const UseCounter_eUseCounter_EnablePrivilege : root :: mozilla :: UseCounter = 55 ; pub const UseCounter_eUseCounter_DOMExceptionCode : root :: mozilla :: UseCounter = 56 ; pub const UseCounter_eUseCounter_MutationEvent : root :: mozilla :: UseCounter = 57 ; pub const UseCounter_eUseCounter_Components : root :: mozilla :: UseCounter = 58 ; pub const UseCounter_eUseCounter_PrefixedVisibilityAPI : root :: mozilla :: UseCounter = 59 ; pub const UseCounter_eUseCounter_NodeIteratorDetach : root :: mozilla :: UseCounter = 60 ; pub const UseCounter_eUseCounter_LenientThis : root :: mozilla :: UseCounter = 61 ; pub const UseCounter_eUseCounter_GetPreventDefault : root :: mozilla :: UseCounter = 62 ; pub const UseCounter_eUseCounter_GetSetUserData : root :: mozilla :: UseCounter = 63 ; pub const UseCounter_eUseCounter_MozGetAsFile : root :: mozilla :: UseCounter = 64 ; pub const UseCounter_eUseCounter_UseOfCaptureEvents : root :: mozilla :: UseCounter = 65 ; pub const UseCounter_eUseCounter_UseOfReleaseEvents : root :: mozilla :: UseCounter = 66 ; pub const UseCounter_eUseCounter_UseOfDOM3LoadMethod : root :: mozilla :: UseCounter = 67 ; pub const UseCounter_eUseCounter_ChromeUseOfDOM3LoadMethod : root :: mozilla :: UseCounter = 68 ; pub const UseCounter_eUseCounter_ShowModalDialog : root :: mozilla :: UseCounter = 69 ; pub const UseCounter_eUseCounter_SyncXMLHttpRequest : root :: mozilla :: UseCounter = 70 ; pub const UseCounter_eUseCounter_Window_Cc_ontrollers : root :: mozilla :: UseCounter = 71 ; pub const UseCounter_eUseCounter_ImportXULIntoContent : root :: mozilla :: UseCounter = 72 ; pub const UseCounter_eUseCounter_PannerNodeDoppler : root :: mozilla :: UseCounter = 73 ; pub const UseCounter_eUseCounter_NavigatorGetUserMedia : root :: mozilla :: UseCounter = 74 ; pub const UseCounter_eUseCounter_WebrtcDeprecatedPrefix : root :: mozilla :: UseCounter = 75 ; pub const UseCounter_eUseCounter_RTCPeerConnectionGetStreams : root :: mozilla :: UseCounter = 76 ; pub const UseCounter_eUseCounter_AppCache : root :: mozilla :: UseCounter = 77 ; pub const UseCounter_eUseCounter_PrefixedImageSmoothingEnabled : root :: mozilla :: UseCounter = 78 ; pub const UseCounter_eUseCounter_PrefixedFullscreenAPI : root :: mozilla :: UseCounter = 79 ; pub const UseCounter_eUseCounter_LenientSetter : root :: mozilla :: UseCounter = 80 ; pub const UseCounter_eUseCounter_FileLastModifiedDate : root :: mozilla :: UseCounter = 81 ; pub const UseCounter_eUseCounter_ImageBitmapRenderingContext_TransferImageBitmap : root :: mozilla :: UseCounter = 82 ; pub const UseCounter_eUseCounter_URLCreateObjectURL_MediaStream : root :: mozilla :: UseCounter = 83 ; pub const UseCounter_eUseCounter_XMLBaseAttribute : root :: mozilla :: UseCounter = 84 ; pub const UseCounter_eUseCounter_WindowContentUntrusted : root :: mozilla :: UseCounter = 85 ; pub const UseCounter_eUseCounter_Count : root :: mozilla :: UseCounter = 86 ; pub type UseCounter = i16 ; pub const LogLevel_Disabled : root :: mozilla :: LogLevel = 0 ; pub const LogLevel_Error : root :: mozilla :: LogLevel = 1 ; pub const LogLevel_Warning : root :: mozilla :: LogLevel = 2 ; pub const LogLevel_Info : root :: mozilla :: LogLevel = 3 ; pub const LogLevel_Debug : root :: mozilla :: LogLevel = 4 ; pub const LogLevel_Verbose : root :: mozilla :: LogLevel = 5 ; pub type LogLevel = :: std :: os :: raw :: c_int ; # [ repr ( C ) ] # [ derive ( Debug ) ] pub struct LogModule { pub mName : * mut :: std :: os :: raw :: c_char , pub mLevel : u32 , } # [ test ] fn bindgen_test_layout_LogModule ( ) { assert_eq ! ( :: std :: mem :: size_of :: < LogModule > ( ) , 16usize , concat ! ( "Size of: " , stringify ! ( LogModule ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < LogModule > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( LogModule ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const LogModule ) ) . mName as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( LogModule ) , "::" , stringify ! ( mName ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const LogModule ) ) . mLevel as * const _ as usize } , 8usize , concat ! ( "Alignment of field: " , stringify ! ( LogModule ) , "::" , stringify ! ( mLevel ) ) ) ; } 
  /// Helper class that lazy loads the given log module. This is safe to use for
         /// declaring static references to log modules and can be used as a replacement
         /// for accessing a LogModule directly.
         ///
         /// Example usage:
         /// static LazyLogModule sLayoutLog("layout");
         ///
         /// void Foo() {
@@ -769,17 +772,17 @@ pub type ServoStyleContextStrong = ::gec
     /// codebase. Include nsWrapperCacheInlines.h if you need to call those methods. 
  # [ repr ( C ) ] # [ derive ( Debug ) ] pub struct nsWrapperCache { pub vtable_ : * const nsWrapperCache__bindgen_vtable , pub mWrapper : * mut root :: JSObject , pub mFlags : root :: nsWrapperCache_FlagsType , pub mBoolFlags : u32 , } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct nsWrapperCache_COMTypeInfo { pub _address : u8 , } pub type nsWrapperCache_FlagsType = u32 ; pub const nsWrapperCache_WRAPPER_BIT_PRESERVED : root :: nsWrapperCache__bindgen_ty_1 = 1 ; pub type nsWrapperCache__bindgen_ty_1 = :: std :: os :: raw :: c_uint ; pub const nsWrapperCache_WRAPPER_IS_NOT_DOM_BINDING : root :: nsWrapperCache__bindgen_ty_2 = 2 ; pub type nsWrapperCache__bindgen_ty_2 = :: std :: os :: raw :: c_uint ; pub const nsWrapperCache_kWrapperFlagsMask : root :: nsWrapperCache__bindgen_ty_3 = 3 ; pub type nsWrapperCache__bindgen_ty_3 = :: std :: os :: raw :: c_uint ; # [ test ] fn bindgen_test_layout_nsWrapperCache ( ) { assert_eq ! ( :: std :: mem :: size_of :: < nsWrapperCache > ( ) , 24usize , concat ! ( "Size of: " , stringify ! ( nsWrapperCache ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < nsWrapperCache > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( nsWrapperCache ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsWrapperCache ) ) . mWrapper as * const _ as usize } , 8usize , concat ! ( "Alignment of field: " , stringify ! ( nsWrapperCache ) , "::" , stringify ! ( mWrapper ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsWrapperCache ) ) . mFlags as * const _ as usize } , 16usize , concat ! ( "Alignment of field: " , stringify ! ( nsWrapperCache ) , "::" , stringify ! ( mFlags ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsWrapperCache ) ) . mBoolFlags as * const _ as usize } , 20usize , concat ! ( "Alignment of field: " , stringify ! ( nsWrapperCache ) , "::" , stringify ! ( mBoolFlags ) ) ) ; } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct ProfilerBacktrace { _unused : [ u8 ; 0 ] } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct ProfilerMarkerPayload { _unused : [ u8 ; 0 ] } # [ repr ( C ) ] # [ derive ( Debug , Copy ) ] pub struct ProfilerBacktraceDestructor { pub _address : u8 , } # [ test ] fn bindgen_test_layout_ProfilerBacktraceDestructor ( ) { assert_eq ! ( :: std :: mem :: size_of :: < ProfilerBacktraceDestructor > ( ) , 1usize , concat ! ( "Size of: " , stringify ! ( ProfilerBacktraceDestructor ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < ProfilerBacktraceDestructor > ( ) , 1usize , concat ! ( "Alignment of " , stringify ! ( ProfilerBacktraceDestructor ) ) ) ; } impl Clone for ProfilerBacktraceDestructor { fn clone ( & self ) -> Self { * self } } pub type UniqueProfilerBacktrace = root :: mozilla :: UniquePtr < root :: ProfilerBacktrace > ; pub type gfxSize = [ u64 ; 2usize ] ; # [ repr ( C ) ] # [ derive ( Debug , Copy ) ] pub struct nsIDOMNode { pub _base : root :: nsISupports , } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct nsIDOMNode_COMTypeInfo { pub _address : u8 , } pub const nsIDOMNode_ELEMENT_NODE : root :: nsIDOMNode__bindgen_ty_1 = 1 ; pub const nsIDOMNode_ATTRIBUTE_NODE : root :: nsIDOMNode__bindgen_ty_1 = 2 ; pub const nsIDOMNode_TEXT_NODE : root :: nsIDOMNode__bindgen_ty_1 = 3 ; pub const nsIDOMNode_CDATA_SECTION_NODE : root :: nsIDOMNode__bindgen_ty_1 = 4 ; pub const nsIDOMNode_ENTITY_REFERENCE_NODE : root :: nsIDOMNode__bindgen_ty_1 = 5 ; pub const nsIDOMNode_ENTITY_NODE : root :: nsIDOMNode__bindgen_ty_1 = 6 ; pub const nsIDOMNode_PROCESSING_INSTRUCTION_NODE : root :: nsIDOMNode__bindgen_ty_1 = 7 ; pub const nsIDOMNode_COMMENT_NODE : root :: nsIDOMNode__bindgen_ty_1 = 8 ; pub const nsIDOMNode_DOCUMENT_NODE : root :: nsIDOMNode__bindgen_ty_1 = 9 ; pub const nsIDOMNode_DOCUMENT_TYPE_NODE : root :: nsIDOMNode__bindgen_ty_1 = 10 ; pub const nsIDOMNode_DOCUMENT_FRAGMENT_NODE : root :: nsIDOMNode__bindgen_ty_1 = 11 ; pub const nsIDOMNode_NOTATION_NODE : root :: nsIDOMNode__bindgen_ty_1 = 12 ; pub type nsIDOMNode__bindgen_ty_1 = :: std :: os :: raw :: c_uint ; pub const nsIDOMNode_DOCUMENT_POSITION_DISCONNECTED : root :: nsIDOMNode__bindgen_ty_2 = 1 ; pub const nsIDOMNode_DOCUMENT_POSITION_PRECEDING : root :: nsIDOMNode__bindgen_ty_2 = 2 ; pub const nsIDOMNode_DOCUMENT_POSITION_FOLLOWING : root :: nsIDOMNode__bindgen_ty_2 = 4 ; pub const nsIDOMNode_DOCUMENT_POSITION_CONTAINS : root :: nsIDOMNode__bindgen_ty_2 = 8 ; pub const nsIDOMNode_DOCUMENT_POSITION_CONTAINED_BY : root :: nsIDOMNode__bindgen_ty_2 = 16 ; pub const nsIDOMNode_DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC : root :: nsIDOMNode__bindgen_ty_2 = 32 ; pub type nsIDOMNode__bindgen_ty_2 = :: std :: os :: raw :: c_uint ; # [ test ] fn bindgen_test_layout_nsIDOMNode ( ) { assert_eq ! ( :: std :: mem :: size_of :: < nsIDOMNode > ( ) , 8usize , concat ! ( "Size of: " , stringify ! ( nsIDOMNode ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < nsIDOMNode > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( nsIDOMNode ) ) ) ; } impl Clone for nsIDOMNode { fn clone ( & self ) -> Self { * self } } pub const kNameSpaceID_None : i32 = 0 ; pub type PLHashNumber = root :: PRUint32 ; pub type PLHashFunction = :: std :: option :: Option < unsafe extern "C" fn ( key : * const :: std :: os :: raw :: c_void ) -> root :: PLHashNumber > ; pub type PLHashComparator = :: std :: option :: Option < unsafe extern "C" fn ( v1 : * const :: std :: os :: raw :: c_void , v2 : * const :: std :: os :: raw :: c_void ) -> root :: PRIntn > ; # [ repr ( C ) ] # [ derive ( Debug , Copy ) ] pub struct PLHashAllocOps { pub allocTable : :: std :: option :: Option < unsafe extern "C" fn ( pool : * mut :: std :: os :: raw :: c_void , size : root :: PRSize ) -> * mut :: std :: os :: raw :: c_void > , pub freeTable : :: std :: option :: Option < unsafe extern "C" fn ( pool : * mut :: std :: os :: raw :: c_void , item : * mut :: std :: os :: raw :: c_void ) > , pub allocEntry : :: std :: option :: Option < unsafe extern "C" fn ( pool : * mut :: std :: os :: raw :: c_void , key : * const :: std :: os :: raw :: c_void ) -> * mut root :: PLHashEntry > , pub freeEntry : :: std :: option :: Option < unsafe extern "C" fn ( pool : * mut :: std :: os :: raw :: c_void , he : * mut root :: PLHashEntry , flag : root :: PRUintn ) > , } # [ test ] fn bindgen_test_layout_PLHashAllocOps ( ) { assert_eq ! ( :: std :: mem :: size_of :: < PLHashAllocOps > ( ) , 32usize , concat ! ( "Size of: " , stringify ! ( PLHashAllocOps ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < PLHashAllocOps > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( PLHashAllocOps ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const PLHashAllocOps ) ) . allocTable as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( PLHashAllocOps ) , "::" , stringify ! ( allocTable ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const PLHashAllocOps ) ) . freeTable as * const _ as usize } , 8usize , concat ! ( "Alignment of field: " , stringify ! ( PLHashAllocOps ) , "::" , stringify ! ( freeTable ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const PLHashAllocOps ) ) . allocEntry as * const _ as usize } , 16usize , concat ! ( "Alignment of field: " , stringify ! ( PLHashAllocOps ) , "::" , stringify ! ( allocEntry ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const PLHashAllocOps ) ) . freeEntry as * const _ as usize } , 24usize , concat ! ( "Alignment of field: " , stringify ! ( PLHashAllocOps ) , "::" , stringify ! ( freeEntry ) ) ) ; } impl Clone for PLHashAllocOps { fn clone ( & self ) -> Self { * self } } # [ repr ( C ) ] # [ derive ( Debug , Copy ) ] pub struct PLHashEntry { pub next : * mut root :: PLHashEntry , pub keyHash : root :: PLHashNumber , pub key : * const :: std :: os :: raw :: c_void , pub value : * mut :: std :: os :: raw :: c_void , } # [ test ] fn bindgen_test_layout_PLHashEntry ( ) { assert_eq ! ( :: std :: mem :: size_of :: < PLHashEntry > ( ) , 32usize , concat ! ( "Size of: " , stringify ! ( PLHashEntry ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < PLHashEntry > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( PLHashEntry ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const PLHashEntry ) ) . next as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( PLHashEntry ) , "::" , stringify ! ( next ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const PLHashEntry ) ) . keyHash as * const _ as usize } , 8usize , concat ! ( "Alignment of field: " , stringify ! ( PLHashEntry ) , "::" , stringify ! ( keyHash ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const PLHashEntry ) ) . key as * const _ as usize } , 16usize , concat ! ( "Alignment of field: " , stringify ! ( PLHashEntry ) , "::" , stringify ! ( key ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const PLHashEntry ) ) . value as * const _ as usize } , 24usize , concat ! ( "Alignment of field: " , stringify ! ( PLHashEntry ) , "::" , stringify ! ( value ) ) ) ; } impl Clone for PLHashEntry { fn clone ( & self ) -> Self { * self } } # [ repr ( C ) ] # [ derive ( Debug , Copy ) ] pub struct PLHashTable { pub buckets : * mut * mut root :: PLHashEntry , pub nentries : root :: PRUint32 , pub shift : root :: PRUint32 , pub keyHash : root :: PLHashFunction , pub keyCompare : root :: PLHashComparator , pub valueCompare : root :: PLHashComparator , pub allocOps : * const root :: PLHashAllocOps , pub allocPriv : * mut :: std :: os :: raw :: c_void , } # [ test ] fn bindgen_test_layout_PLHashTable ( ) { assert_eq ! ( :: std :: mem :: size_of :: < PLHashTable > ( ) , 56usize , concat ! ( "Size of: " , stringify ! ( PLHashTable ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < PLHashTable > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( PLHashTable ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const PLHashTable ) ) . buckets as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( PLHashTable ) , "::" , stringify ! ( buckets ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const PLHashTable ) ) . nentries as * const _ as usize } , 8usize , concat ! ( "Alignment of field: " , stringify ! ( PLHashTable ) , "::" , stringify ! ( nentries ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const PLHashTable ) ) . shift as * const _ as usize } , 12usize , concat ! ( "Alignment of field: " , stringify ! ( PLHashTable ) , "::" , stringify ! ( shift ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const PLHashTable ) ) . keyHash as * const _ as usize } , 16usize , concat ! ( "Alignment of field: " , stringify ! ( PLHashTable ) , "::" , stringify ! ( keyHash ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const PLHashTable ) ) . keyCompare as * const _ as usize } , 24usize , concat ! ( "Alignment of field: " , stringify ! ( PLHashTable ) , "::" , stringify ! ( keyCompare ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const PLHashTable ) ) . valueCompare as * const _ as usize } , 32usize , concat ! ( "Alignment of field: " , stringify ! ( PLHashTable ) , "::" , stringify ! ( valueCompare ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const PLHashTable ) ) . allocOps as * const _ as usize } , 40usize , concat ! ( "Alignment of field: " , stringify ! ( PLHashTable ) , "::" , stringify ! ( allocOps ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const PLHashTable ) ) . allocPriv as * const _ as usize } , 48usize , concat ! ( "Alignment of field: " , stringify ! ( PLHashTable ) , "::" , stringify ! ( allocPriv ) ) ) ; } impl Clone for PLHashTable { fn clone ( & self ) -> Self { * self } } # [ repr ( C ) ] # [ derive ( Debug , Copy ) ] pub struct nsIVariant { pub _base : root :: nsISupports , } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct nsIVariant_COMTypeInfo { pub _address : u8 , } # [ test ] fn bindgen_test_layout_nsIVariant ( ) { assert_eq ! ( :: std :: mem :: size_of :: < nsIVariant > ( ) , 8usize , concat ! ( "Size of: " , stringify ! ( nsIVariant ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < nsIVariant > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( nsIVariant ) ) ) ; } impl Clone for nsIVariant { fn clone ( & self ) -> Self { * self } } # [ repr ( C ) ] pub struct nsNodeInfoManager { pub mRefCnt : root :: nsCycleCollectingAutoRefCnt , pub mNodeInfoHash : * mut root :: PLHashTable , pub mDocument : * mut root :: nsIDocument , pub mNonDocumentNodeInfos : u32 , pub mPrincipal : root :: nsCOMPtr , pub mDefaultPrincipal : root :: nsCOMPtr , pub mTextNodeInfo : * mut root :: mozilla :: dom :: NodeInfo , pub mCommentNodeInfo : * mut root :: mozilla :: dom :: NodeInfo , pub mDocumentNodeInfo : * mut root :: mozilla :: dom :: NodeInfo , pub mBindingManager : root :: RefPtr < root :: nsBindingManager > , pub mRecentlyUsedNodeInfos : [ * mut root :: mozilla :: dom :: NodeInfo ; 31usize ] , pub mSVGEnabled : root :: nsNodeInfoManager_Tri , pub mMathMLEnabled : root :: nsNodeInfoManager_Tri , } # [ repr ( C ) ] # [ derive ( Debug , Copy ) ] pub struct nsNodeInfoManager_cycleCollection { pub _base : root :: nsCycleCollectionParticipant , } # [ test ] fn bindgen_test_layout_nsNodeInfoManager_cycleCollection ( ) { assert_eq ! ( :: std :: mem :: size_of :: < nsNodeInfoManager_cycleCollection > ( ) , 16usize , concat ! ( "Size of: " , stringify ! ( nsNodeInfoManager_cycleCollection ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < nsNodeInfoManager_cycleCollection > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( nsNodeInfoManager_cycleCollection ) ) ) ; } impl Clone for nsNodeInfoManager_cycleCollection { fn clone ( & self ) -> Self { * self } } pub type nsNodeInfoManager_HasThreadSafeRefCnt = root :: mozilla :: FalseType ; pub const nsNodeInfoManager_Tri_eTriUnset : root :: nsNodeInfoManager_Tri = 0 ; pub const nsNodeInfoManager_Tri_eTriFalse : root :: nsNodeInfoManager_Tri = 1 ; pub const nsNodeInfoManager_Tri_eTriTrue : root :: nsNodeInfoManager_Tri = 2 ; pub type nsNodeInfoManager_Tri = :: std :: os :: raw :: c_uint ; extern "C" {
  # [ link_name = "\u{1}_ZN17nsNodeInfoManager21_cycleCollectorGlobalE" ] 
  pub static mut  nsNodeInfoManager__cycleCollectorGlobal  :  root :: nsNodeInfoManager_cycleCollection ;
 } # [ test ] fn bindgen_test_layout_nsNodeInfoManager ( ) { assert_eq ! ( :: std :: mem :: size_of :: < nsNodeInfoManager > ( ) , 336usize , concat ! ( "Size of: " , stringify ! ( nsNodeInfoManager ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < nsNodeInfoManager > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( nsNodeInfoManager ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsNodeInfoManager ) ) . mRefCnt as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( nsNodeInfoManager ) , "::" , stringify ! ( mRefCnt ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsNodeInfoManager ) ) . mNodeInfoHash as * const _ as usize } , 8usize , concat ! ( "Alignment of field: " , stringify ! ( nsNodeInfoManager ) , "::" , stringify ! ( mNodeInfoHash ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsNodeInfoManager ) ) . mDocument as * const _ as usize } , 16usize , concat ! ( "Alignment of field: " , stringify ! ( nsNodeInfoManager ) , "::" , stringify ! ( mDocument ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsNodeInfoManager ) ) . mNonDocumentNodeInfos as * const _ as usize } , 24usize , concat ! ( "Alignment of field: " , stringify ! ( nsNodeInfoManager ) , "::" , stringify ! ( mNonDocumentNodeInfos ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsNodeInfoManager ) ) . mPrincipal as * const _ as usize } , 32usize , concat ! ( "Alignment of field: " , stringify ! ( nsNodeInfoManager ) , "::" , stringify ! ( mPrincipal ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsNodeInfoManager ) ) . mDefaultPrincipal as * const _ as usize } , 40usize , concat ! ( "Alignment of field: " , stringify ! ( nsNodeInfoManager ) , "::" , stringify ! ( mDefaultPrincipal ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsNodeInfoManager ) ) . mTextNodeInfo as * const _ as usize } , 48usize , concat ! ( "Alignment of field: " , stringify ! ( nsNodeInfoManager ) , "::" , stringify ! ( mTextNodeInfo ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsNodeInfoManager ) ) . mCommentNodeInfo as * const _ as usize } , 56usize , concat ! ( "Alignment of field: " , stringify ! ( nsNodeInfoManager ) , "::" , stringify ! ( mCommentNodeInfo ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsNodeInfoManager ) ) . mDocumentNodeInfo as * const _ as usize } , 64usize , concat ! ( "Alignment of field: " , stringify ! ( nsNodeInfoManager ) , "::" , stringify ! ( mDocumentNodeInfo ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsNodeInfoManager ) ) . mBindingManager as * const _ as usize } , 72usize , concat ! ( "Alignment of field: " , stringify ! ( nsNodeInfoManager ) , "::" , stringify ! ( mBindingManager ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsNodeInfoManager ) ) . mRecentlyUsedNodeInfos as * const _ as usize } , 80usize , concat ! ( "Alignment of field: " , stringify ! ( nsNodeInfoManager ) , "::" , stringify ! ( mRecentlyUsedNodeInfos ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsNodeInfoManager ) ) . mSVGEnabled as * const _ as usize } , 328usize , concat ! ( "Alignment of field: " , stringify ! ( nsNodeInfoManager ) , "::" , stringify ! ( mSVGEnabled ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsNodeInfoManager ) ) . mMathMLEnabled as * const _ as usize } , 332usize , concat ! ( "Alignment of field: " , stringify ! ( nsNodeInfoManager ) , "::" , stringify ! ( mMathMLEnabled ) ) ) ; } # [ repr ( C ) ] # [ derive ( Debug ) ] pub struct nsPropertyTable { pub mPropertyList : * mut root :: nsPropertyTable_PropertyList , } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct nsPropertyTable_PropertyList { _unused : [ u8 ; 0 ] } # [ test ] fn bindgen_test_layout_nsPropertyTable ( ) { assert_eq ! ( :: std :: mem :: size_of :: < nsPropertyTable > ( ) , 8usize , concat ! ( "Size of: " , stringify ! ( nsPropertyTable ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < nsPropertyTable > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( nsPropertyTable ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsPropertyTable ) ) . mPropertyList as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( nsPropertyTable ) , "::" , stringify ! ( mPropertyList ) ) ) ; } pub type nsTObserverArray_base_index_type = usize ; pub type nsTObserverArray_base_size_type = usize ; # [ repr ( C ) ] # [ derive ( Debug , Copy ) ] pub struct nsTObserverArray_base_Iterator_base { pub mPosition : root :: nsTObserverArray_base_index_type , pub mNext : * mut root :: nsTObserverArray_base_Iterator_base , } # [ test ] fn bindgen_test_layout_nsTObserverArray_base_Iterator_base ( ) { assert_eq ! ( :: std :: mem :: size_of :: < nsTObserverArray_base_Iterator_base > ( ) , 16usize , concat ! ( "Size of: " , stringify ! ( nsTObserverArray_base_Iterator_base ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < nsTObserverArray_base_Iterator_base > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( nsTObserverArray_base_Iterator_base ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsTObserverArray_base_Iterator_base ) ) . mPosition as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( nsTObserverArray_base_Iterator_base ) , "::" , stringify ! ( mPosition ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsTObserverArray_base_Iterator_base ) ) . mNext as * const _ as usize } , 8usize , concat ! ( "Alignment of field: " , stringify ! ( nsTObserverArray_base_Iterator_base ) , "::" , stringify ! ( mNext ) ) ) ; } impl Clone for nsTObserverArray_base_Iterator_base { fn clone ( & self ) -> Self { * self } } pub type nsAutoTObserverArray_elem_type < T > = T ; pub type nsAutoTObserverArray_array_type < T > = root :: nsTArray < T > ; # [ repr ( C ) ] # [ derive ( Debug ) ] pub struct nsAutoTObserverArray_Iterator { pub _base : root :: nsTObserverArray_base_Iterator_base , pub mArray : * mut root :: nsAutoTObserverArray_Iterator_array_type , } pub type nsAutoTObserverArray_Iterator_array_type = u8 ; # [ repr ( C ) ] # [ derive ( Debug ) ] pub struct nsAutoTObserverArray_ForwardIterator { pub _base : root :: nsAutoTObserverArray_Iterator , } pub type nsAutoTObserverArray_ForwardIterator_array_type = u8 ; pub type nsAutoTObserverArray_ForwardIterator_base_type = root :: nsAutoTObserverArray_Iterator ; # [ repr ( C ) ] # [ derive ( Debug ) ] pub struct nsAutoTObserverArray_EndLimitedIterator { pub _base : root :: nsAutoTObserverArray_ForwardIterator , pub mEnd : root :: nsAutoTObserverArray_ForwardIterator , } pub type nsAutoTObserverArray_EndLimitedIterator_array_type = u8 ; pub type nsAutoTObserverArray_EndLimitedIterator_base_type = root :: nsAutoTObserverArray_Iterator ; # [ repr ( C ) ] # [ derive ( Debug ) ] pub struct nsAutoTObserverArray_BackwardIterator { pub _base : root :: nsAutoTObserverArray_Iterator , } pub type nsAutoTObserverArray_BackwardIterator_array_type = u8 ; pub type nsAutoTObserverArray_BackwardIterator_base_type = root :: nsAutoTObserverArray_Iterator ; # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct nsTObserverArray { pub _address : u8 , } pub type nsTObserverArray_base_type = u8 ; pub type nsTObserverArray_size_type = root :: nsTObserverArray_base_size_type ; # [ repr ( C ) ] # [ derive ( Debug , Copy ) ] pub struct nsIDOMEventTarget { pub _base : root :: nsISupports , } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct nsIDOMEventTarget_COMTypeInfo { pub _address : u8 , } # [ test ] fn bindgen_test_layout_nsIDOMEventTarget ( ) { assert_eq ! ( :: std :: mem :: size_of :: < nsIDOMEventTarget > ( ) , 8usize , concat ! ( "Size of: " , stringify ! ( nsIDOMEventTarget ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < nsIDOMEventTarget > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( nsIDOMEventTarget ) ) ) ; } impl Clone for nsIDOMEventTarget { fn clone ( & self ) -> Self { * self } } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct nsAttrChildContentList { _unused : [ u8 ; 0 ] } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct nsCSSSelectorList { _unused : [ u8 ; 0 ] } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct nsRange { _unused : [ u8 ; 0 ] } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct RawServoSelectorList { _unused : [ u8 ; 0 ] } pub const NODE_HAS_LISTENERMANAGER : root :: _bindgen_ty_77 = 4 ; pub const NODE_HAS_PROPERTIES : root :: _bindgen_ty_77 = 8 ; pub const NODE_IS_ANONYMOUS_ROOT : root :: _bindgen_ty_77 = 16 ; pub const NODE_IS_IN_NATIVE_ANONYMOUS_SUBTREE : root :: _bindgen_ty_77 = 32 ; pub const NODE_IS_NATIVE_ANONYMOUS_ROOT : root :: _bindgen_ty_77 = 64 ; pub const NODE_FORCE_XBL_BINDINGS : root :: _bindgen_ty_77 = 128 ; pub const NODE_MAY_BE_IN_BINDING_MNGR : root :: _bindgen_ty_77 = 256 ; pub const NODE_IS_EDITABLE : root :: _bindgen_ty_77 = 512 ; pub const NODE_IS_NATIVE_ANONYMOUS : root :: _bindgen_ty_77 = 1024 ; pub const NODE_IS_IN_SHADOW_TREE : root :: _bindgen_ty_77 = 2048 ; pub const NODE_HAS_EMPTY_SELECTOR : root :: _bindgen_ty_77 = 4096 ; pub const NODE_HAS_SLOW_SELECTOR : root :: _bindgen_ty_77 = 8192 ; pub const NODE_HAS_EDGE_CHILD_SELECTOR : root :: _bindgen_ty_77 = 16384 ; pub const NODE_HAS_SLOW_SELECTOR_LATER_SIBLINGS : root :: _bindgen_ty_77 = 32768 ; pub const NODE_ALL_SELECTOR_FLAGS : root :: _bindgen_ty_77 = 61440 ; pub const NODE_NEEDS_FRAME : root :: _bindgen_ty_77 = 65536 ; pub const NODE_DESCENDANTS_NEED_FRAMES : root :: _bindgen_ty_77 = 131072 ; pub const NODE_HAS_ACCESSKEY : root :: _bindgen_ty_77 = 262144 ; pub const NODE_HAS_DIRECTION_RTL : root :: _bindgen_ty_77 = 524288 ; pub const NODE_HAS_DIRECTION_LTR : root :: _bindgen_ty_77 = 1048576 ; pub const NODE_ALL_DIRECTION_FLAGS : root :: _bindgen_ty_77 = 1572864 ; pub const NODE_CHROME_ONLY_ACCESS : root :: _bindgen_ty_77 = 2097152 ; pub const NODE_IS_ROOT_OF_CHROME_ONLY_ACCESS : root :: _bindgen_ty_77 = 4194304 ; pub const NODE_TYPE_SPECIFIC_BITS_OFFSET : root :: _bindgen_ty_77 = 21 ; pub type _bindgen_ty_77 = :: std :: os :: raw :: c_uint ; 
  /// An internal interface that abstracts some DOMNode-related parts that both
     /// nsIContent and nsIDocument share.  An instance of this interface has a list
     /// of nsIContent children and provides access to them. 
- # [ repr ( C ) ] pub struct nsINode { pub _base : root :: mozilla :: dom :: EventTarget , pub mNodeInfo : root :: RefPtr < root :: mozilla :: dom :: NodeInfo > , pub mParent : * mut root :: nsINode , pub mNextSibling : * mut root :: nsIContent , pub mPreviousSibling : * mut root :: nsIContent , pub mFirstChild : * mut root :: nsIContent , pub __bindgen_anon_1 : root :: nsINode__bindgen_ty_1 , pub mSlots : * mut root :: nsINode_nsSlots , } pub type nsINode_BoxQuadOptions = root :: mozilla :: dom :: BoxQuadOptions ; pub type nsINode_ConvertCoordinateOptions = root :: mozilla :: dom :: ConvertCoordinateOptions ; pub type nsINode_DocGroup = root :: mozilla :: dom :: DocGroup ; pub type nsINode_DOMPoint = root :: mozilla :: dom :: DOMPoint ; pub type nsINode_DOMPointInit = root :: mozilla :: dom :: DOMPointInit ; pub type nsINode_DOMQuad = root :: mozilla :: dom :: DOMQuad ; pub type nsINode_DOMRectReadOnly = root :: mozilla :: dom :: DOMRectReadOnly ; pub type nsINode_OwningNodeOrString = root :: mozilla :: dom :: OwningNodeOrString ; pub type nsINode_TextOrElementOrDocument = root :: mozilla :: dom :: TextOrElementOrDocument ; pub use self :: super :: root :: mozilla :: dom :: CallerType as nsINode_CallerType ; pub type nsINode_Sequence = u8 ; # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct nsINode_COMTypeInfo { pub _address : u8 , } pub const nsINode_eDOCUMENT : root :: nsINode__bindgen_ty_2 = 2 ; pub const nsINode_eATTRIBUTE : root :: nsINode__bindgen_ty_2 = 4 ; pub const nsINode_eTEXT : root :: nsINode__bindgen_ty_2 = 8 ; pub const nsINode_ePROCESSING_INSTRUCTION : root :: nsINode__bindgen_ty_2 = 16 ; pub const nsINode_eCOMMENT : root :: nsINode__bindgen_ty_2 = 32 ; pub const nsINode_eHTML_FORM_CONTROL : root :: nsINode__bindgen_ty_2 = 64 ; pub const nsINode_eDOCUMENT_FRAGMENT : root :: nsINode__bindgen_ty_2 = 128 ; pub const nsINode_eDATA_NODE : root :: nsINode__bindgen_ty_2 = 256 ; pub const nsINode_eMEDIA : root :: nsINode__bindgen_ty_2 = 512 ; pub const nsINode_eANIMATION : root :: nsINode__bindgen_ty_2 = 1024 ; pub const nsINode_eFILTER : root :: nsINode__bindgen_ty_2 = 2048 ; pub type nsINode__bindgen_ty_2 = :: std :: os :: raw :: c_uint ; # [ repr ( C ) ] pub struct nsINode_nsSlots__bindgen_vtable ( :: std :: os :: raw :: c_void ) ; # [ repr ( C ) ] # [ derive ( Debug ) ] pub struct nsINode_nsSlots { pub vtable_ : * const nsINode_nsSlots__bindgen_vtable , 
+ # [ repr ( C ) ] pub struct nsINode { pub _base : root :: mozilla :: dom :: EventTarget , pub mNodeInfo : root :: RefPtr < root :: mozilla :: dom :: NodeInfo > , pub mParent : * mut root :: nsINode , pub mNextSibling : * mut root :: nsIContent , pub mPreviousSibling : * mut root :: nsIContent , pub mFirstChild : * mut root :: nsIContent , pub __bindgen_anon_1 : root :: nsINode__bindgen_ty_1 , pub mSlots : * mut root :: nsINode_nsSlots , } pub type nsINode_BoxQuadOptions = root :: mozilla :: dom :: BoxQuadOptions ; pub type nsINode_ConvertCoordinateOptions = root :: mozilla :: dom :: ConvertCoordinateOptions ; pub type nsINode_DocGroup = root :: mozilla :: dom :: DocGroup ; pub type nsINode_DOMPoint = root :: mozilla :: dom :: DOMPoint ; pub type nsINode_DOMPointInit = root :: mozilla :: dom :: DOMPointInit ; pub type nsINode_DOMQuad = root :: mozilla :: dom :: DOMQuad ; pub type nsINode_DOMRectReadOnly = root :: mozilla :: dom :: DOMRectReadOnly ; pub type nsINode_OwningNodeOrString = root :: mozilla :: dom :: OwningNodeOrString ; pub type nsINode_TextOrElementOrDocument = root :: mozilla :: dom :: TextOrElementOrDocument ; pub use self :: super :: root :: mozilla :: dom :: CallerType as nsINode_CallerType ; pub type nsINode_Sequence = u8 ; # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct nsINode_COMTypeInfo { pub _address : u8 , } pub const nsINode_eDOCUMENT : root :: nsINode__bindgen_ty_2 = 2 ; pub const nsINode_eATTRIBUTE : root :: nsINode__bindgen_ty_2 = 4 ; pub const nsINode_eTEXT : root :: nsINode__bindgen_ty_2 = 8 ; pub const nsINode_ePROCESSING_INSTRUCTION : root :: nsINode__bindgen_ty_2 = 16 ; pub const nsINode_eCOMMENT : root :: nsINode__bindgen_ty_2 = 32 ; pub const nsINode_eHTML_FORM_CONTROL : root :: nsINode__bindgen_ty_2 = 64 ; pub const nsINode_eDOCUMENT_FRAGMENT : root :: nsINode__bindgen_ty_2 = 128 ; pub const nsINode_eDATA_NODE : root :: nsINode__bindgen_ty_2 = 256 ; pub const nsINode_eMEDIA : root :: nsINode__bindgen_ty_2 = 512 ; pub const nsINode_eANIMATION : root :: nsINode__bindgen_ty_2 = 1024 ; pub const nsINode_eFILTER : root :: nsINode__bindgen_ty_2 = 2048 ; pub type nsINode__bindgen_ty_2 = :: std :: os :: raw :: c_uint ; pub const nsINode_FlattenedParentType_eNotForStyle : root :: nsINode_FlattenedParentType = 0 ; pub const nsINode_FlattenedParentType_eForStyle : root :: nsINode_FlattenedParentType = 1 ; pub type nsINode_FlattenedParentType = :: std :: os :: raw :: c_uint ; # [ repr ( C ) ] pub struct nsINode_nsSlots__bindgen_vtable ( :: std :: os :: raw :: c_void ) ; # [ repr ( C ) ] # [ derive ( Debug ) ] pub struct nsINode_nsSlots { pub vtable_ : * const nsINode_nsSlots__bindgen_vtable , 
  /// A list of mutation observers 
  pub mMutationObservers : [ u64 ; 4usize ] , 
  /// An object implementing nsIDOMNodeList for this content (childNodes)
         /// @see nsIDOMNodeList
         /// @see nsGenericHTMLElement::GetChildNodes 
  pub mChildNodes : root :: RefPtr < root :: nsAttrChildContentList > , 
  /// Weak reference to this node.  This is cleared by the destructor of
         /// nsNodeWeakReference. 
@@ -789,19 +792,19 @@ pub type ServoStyleContextStrong = ::gec
         /// LinkedList, because that prevents us from pushing DOMSlots up to the next
         /// allocation bucket size, at the cost of some complexity. 
  pub mCommonAncestorRanges : root :: mozilla :: UniquePtr < root :: mozilla :: LinkedList > , 
  /// Number of descendant nodes in the uncomposed document that have been
         /// explicitly set as editable. 
  pub mEditableDescendantCount : u32 , } # [ test ] fn bindgen_test_layout_nsINode_nsSlots ( ) { assert_eq ! ( :: std :: mem :: size_of :: < nsINode_nsSlots > ( ) , 72usize , concat ! ( "Size of: " , stringify ! ( nsINode_nsSlots ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < nsINode_nsSlots > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( nsINode_nsSlots ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsINode_nsSlots ) ) . mMutationObservers as * const _ as usize } , 8usize , concat ! ( "Alignment of field: " , stringify ! ( nsINode_nsSlots ) , "::" , stringify ! ( mMutationObservers ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsINode_nsSlots ) ) . mChildNodes as * const _ as usize } , 40usize , concat ! ( "Alignment of field: " , stringify ! ( nsINode_nsSlots ) , "::" , stringify ! ( mChildNodes ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsINode_nsSlots ) ) . mWeakReference as * const _ as usize } , 48usize , concat ! ( "Alignment of field: " , stringify ! ( nsINode_nsSlots ) , "::" , stringify ! ( mWeakReference ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsINode_nsSlots ) ) . mCommonAncestorRanges as * const _ as usize } , 56usize , concat ! ( "Alignment of field: " , stringify ! ( nsINode_nsSlots ) , "::" , stringify ! ( mCommonAncestorRanges ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsINode_nsSlots ) ) . mEditableDescendantCount as * const _ as usize } , 64usize , concat ! ( "Alignment of field: " , stringify ! ( nsINode_nsSlots ) , "::" , stringify ! ( mEditableDescendantCount ) ) ) ; } # [ repr ( u32 ) ] 
  /// Boolean flags 
  # [ derive ( Debug , Copy , Clone , PartialEq , Eq , Hash ) ] pub enum nsINode_BooleanFlag { NodeHasRenderingObservers = 0 , IsInDocument = 1 , ParentIsContent = 2 , NodeIsElement = 3 , ElementHasID = 4 , ElementMayHaveClass = 5 , ElementMayHaveStyle = 6 , ElementHasName = 7 , ElementMayHaveContentEditableAttr = 8 , NodeIsCommonAncestorForRangeInSelection = 9 , NodeIsDescendantOfCommonAncestorForRangeInSelection = 10 , NodeIsCCMarkedRoot = 11 , NodeIsCCBlackTree = 12 , NodeIsPurpleRoot = 13 , ElementHasLockedStyleStates = 14 , ElementHasPointerLock = 15 , NodeMayHaveDOMMutationObserver = 16 , NodeIsContent = 17 , ElementHasAnimations = 18 , NodeHasValidDirAttribute = 19 , NodeHasDirAutoSet = 20 , NodeHasTextNodeDirectionalityMap = 21 , NodeAncestorHasDirAuto = 22 , ElementIsInStyleScope = 23 , ElementIsScopedStyleRoot = 24 , NodeHandlingClick = 25 , NodeHasRelevantHoverRules = 26 , ElementHasWeirdParserInsertionMode = 27 , ParserHasNotified = 28 , MayBeApzAware = 29 , ElementMayHaveAnonymousChildren = 30 , NodeMayHaveChildrenWithLayoutBoxesDisabled = 31 , BooleanFlagCount = 32 , } # [ repr ( C ) ] # [ derive ( Debug , Copy ) ] pub struct nsINode__bindgen_ty_1 { pub mPrimaryFrame : root :: __BindgenUnionField < * mut root :: nsIFrame > , pub mSubtreeRoot : root :: __BindgenUnionField < * mut root :: nsINode > , pub bindgen_union_field : u64 , } # [ test ] fn bindgen_test_layout_nsINode__bindgen_ty_1 ( ) { assert_eq ! ( :: std :: mem :: size_of :: < nsINode__bindgen_ty_1 > ( ) , 8usize , concat ! ( "Size of: " , stringify ! ( nsINode__bindgen_ty_1 ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < nsINode__bindgen_ty_1 > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( nsINode__bindgen_ty_1 ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsINode__bindgen_ty_1 ) ) . mPrimaryFrame as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( nsINode__bindgen_ty_1 ) , "::" , stringify ! ( mPrimaryFrame ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsINode__bindgen_ty_1 ) ) . mSubtreeRoot as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( nsINode__bindgen_ty_1 ) , "::" , stringify ! ( mSubtreeRoot ) ) ) ; } impl Clone for nsINode__bindgen_ty_1 { fn clone ( & self ) -> Self { * self } } # [ test ] fn bindgen_test_layout_nsINode ( ) { assert_eq ! ( :: std :: mem :: size_of :: < nsINode > ( ) , 88usize , concat ! ( "Size of: " , stringify ! ( nsINode ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < nsINode > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( nsINode ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsINode ) ) . mNodeInfo as * const _ as usize } , 32usize , concat ! ( "Alignment of field: " , stringify ! ( nsINode ) , "::" , stringify ! ( mNodeInfo ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsINode ) ) . mParent as * const _ as usize } , 40usize , concat ! ( "Alignment of field: " , stringify ! ( nsINode ) , "::" , stringify ! ( mParent ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsINode ) ) . mNextSibling as * const _ as usize } , 48usize , concat ! ( "Alignment of field: " , stringify ! ( nsINode ) , "::" , stringify ! ( mNextSibling ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsINode ) ) . mPreviousSibling as * const _ as usize } , 56usize , concat ! ( "Alignment of field: " , stringify ! ( nsINode ) , "::" , stringify ! ( mPreviousSibling ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsINode ) ) . mFirstChild as * const _ as usize } , 64usize , concat ! ( "Alignment of field: " , stringify ! ( nsINode ) , "::" , stringify ! ( mFirstChild ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsINode ) ) . mSlots as * const _ as usize } , 80usize , concat ! ( "Alignment of field: " , stringify ! ( nsINode ) , "::" , stringify ! ( mSlots ) ) ) ; } 
- /// A node of content in a document's content model. This interface
-    /// is supported by all content objects. 
- # [ repr ( C ) ] pub struct nsIContent { pub _base : root :: nsINode , } pub type nsIContent_IMEState = root :: mozilla :: widget :: IMEState ; # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct nsIContent_COMTypeInfo { pub _address : u8 , } pub const nsIContent_eAllChildren : root :: nsIContent__bindgen_ty_1 = 0 ; pub const nsIContent_eAllButXBL : root :: nsIContent__bindgen_ty_1 = 1 ; pub const nsIContent_eSkipPlaceholderContent : root :: nsIContent__bindgen_ty_1 = 2 ; pub const nsIContent_eSkipDocumentLevelNativeAnonymousContent : root :: nsIContent__bindgen_ty_1 = 4 ; pub type nsIContent__bindgen_ty_1 = :: std :: os :: raw :: c_uint ; pub const nsIContent_FlattenedParentType_eNotForStyle : root :: nsIContent_FlattenedParentType = 0 ; pub const nsIContent_FlattenedParentType_eForStyle : root :: nsIContent_FlattenedParentType = 1 ; pub type nsIContent_FlattenedParentType = :: std :: os :: raw :: c_uint ; # [ repr ( C ) ] pub struct nsIContent_nsExtendedContentSlots__bindgen_vtable ( :: std :: os :: raw :: c_void ) ; 
+ /// Functions to create content, to be used only inside Gecko
+    /// (mozilla/content and mozilla/layout). 
+ # [ repr ( C ) ] pub struct nsIContent { pub _base : root :: nsINode , } pub type nsIContent_IMEState = root :: mozilla :: widget :: IMEState ; # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct nsIContent_COMTypeInfo { pub _address : u8 , } pub const nsIContent_eAllChildren : root :: nsIContent__bindgen_ty_1 = 0 ; pub const nsIContent_eAllButXBL : root :: nsIContent__bindgen_ty_1 = 1 ; pub const nsIContent_eSkipPlaceholderContent : root :: nsIContent__bindgen_ty_1 = 2 ; pub const nsIContent_eSkipDocumentLevelNativeAnonymousContent : root :: nsIContent__bindgen_ty_1 = 4 ; pub type nsIContent__bindgen_ty_1 = :: std :: os :: raw :: c_uint ; # [ repr ( C ) ] pub struct nsIContent_nsExtendedContentSlots__bindgen_vtable ( :: std :: os :: raw :: c_void ) ; 
  /// Lazily allocated extended slots to avoid
     /// that may only be instantiated when a content object is accessed
     /// through the DOM. Rather than burn actual slots in the content
     /// objects for each of these instance variables, we put them off
     /// in a side structure that's only allocated when the content is
     /// accessed through the DOM. 
  # [ repr ( C ) ] pub struct nsIContent_nsExtendedContentSlots { pub vtable_ : * const nsIContent_nsExtendedContentSlots__bindgen_vtable , 
  /// The nearest enclosing content node with a binding that created us.
@@ -1635,22 +1638,17 @@ pub type ServoStyleContextStrong = ::gec
  # [ repr ( C ) ] # [ derive ( Debug , Copy ) ] pub struct nsRect { pub x : root :: nscoord , pub y : root :: nscoord , pub width : root :: nscoord , pub height : root :: nscoord , } # [ test ] fn bindgen_test_layout_nsRect ( ) { assert_eq ! ( :: std :: mem :: size_of :: < nsRect > ( ) , 16usize , concat ! ( "Size of: " , stringify ! ( nsRect ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < nsRect > ( ) , 4usize , concat ! ( "Alignment of " , stringify ! ( nsRect ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsRect ) ) . x as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( nsRect ) , "::" , stringify ! ( x ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsRect ) ) . y as * const _ as usize } , 4usize , concat ! ( "Alignment of field: " , stringify ! ( nsRect ) , "::" , stringify ! ( y ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsRect ) ) . width as * const _ as usize } , 8usize , concat ! ( "Alignment of field: " , stringify ! ( nsRect ) , "::" , stringify ! ( width ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsRect ) ) . height as * const _ as usize } , 12usize , concat ! ( "Alignment of field: " , stringify ! ( nsRect ) , "::" , stringify ! ( height ) ) ) ; } impl Clone for nsRect { fn clone ( & self ) -> Self { * self } } 
  /// <div rustbindgen="true" replaces="nsSize"> 
  # [ repr ( C ) ] # [ derive ( Debug , Copy ) ] pub struct nsSize { pub width : root :: nscoord , pub height : root :: nscoord , } # [ test ] fn bindgen_test_layout_nsSize ( ) { assert_eq ! ( :: std :: mem :: size_of :: < nsSize > ( ) , 8usize , concat ! ( "Size of: " , stringify ! ( nsSize ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < nsSize > ( ) , 4usize , concat ! ( "Alignment of " , stringify ! ( nsSize ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsSize ) ) . width as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( nsSize ) , "::" , stringify ! ( width ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsSize ) ) . height as * const _ as usize } , 4usize , concat ! ( "Alignment of field: " , stringify ! ( nsSize ) , "::" , stringify ! ( height ) ) ) ; } impl Clone for nsSize { fn clone ( & self ) -> Self { * self } } 
  /// <div rustbindgen replaces="nsTArray"></div> 
  # [ repr ( C ) ] # [ derive ( Debug ) ] pub struct nsTArray < T > { pub mBuffer : * mut T , pub _phantom_0 : :: std :: marker :: PhantomData < :: std :: cell :: UnsafeCell < T > > , } 
  /// <div rustbindgen replaces="nsCOMArray"></div>
     ///
     /// mozilla::ArrayIterator doesn't work well with bindgen. 
- # [ repr ( C ) ] # [ derive ( Debug ) ] pub struct nsCOMArray { pub mBuffer : root :: nsTArray < * mut root :: nsISupports > , } pub const ThemeWidgetType_NS_THEME_NONE : root :: ThemeWidgetType = 0 ; pub const ThemeWidgetType_NS_THEME_BUTTON : root :: ThemeWidgetType = 1 ; pub const ThemeWidgetType_NS_THEME_RADIO : root :: ThemeWidgetType = 2 ; pub const ThemeWidgetType_NS_THEME_CHECKBOX : root :: ThemeWidgetType = 3 ; pub const ThemeWidgetType_NS_THEME_BUTTON_BEVEL : root :: ThemeWidgetType = 4 ; pub const ThemeWidgetType_NS_THEME_FOCUS_OUTLINE : root :: ThemeWidgetType = 5 ; pub const ThemeWidgetType_NS_THEME_TOOLBOX : root :: ThemeWidgetType = 6 ; pub const ThemeWidgetType_NS_THEME_TOOLBAR : root :: ThemeWidgetType = 7 ; pub const ThemeWidgetType_NS_THEME_TOOLBARBUTTON : root :: ThemeWidgetType = 8 ; pub const ThemeWidgetType_NS_THEME_DUALBUTTON : root :: ThemeWidgetType = 9 ; pub const ThemeWidgetType_NS_THEME_TOOLBARBUTTON_DROPDOWN : root :: ThemeWidgetType = 10 ; pub const ThemeWidgetType_NS_THEME_BUTTON_ARROW_UP : root :: ThemeWidgetType = 11 ; pub const ThemeWidgetType_NS_THEME_BUTTON_ARROW_DOWN : root :: ThemeWidgetType = 12 ; pub const ThemeWidgetType_NS_THEME_BUTTON_ARROW_NEXT : root :: ThemeWidgetType = 13 ; pub const ThemeWidgetType_NS_THEME_BUTTON_ARROW_PREVIOUS : root :: ThemeWidgetType = 14 ; pub const ThemeWidgetType_NS_THEME_SEPARATOR : root :: ThemeWidgetType = 15 ; pub const ThemeWidgetType_NS_THEME_TOOLBARGRIPPER : root :: ThemeWidgetType = 16 ; pub const ThemeWidgetType_NS_THEME_SPLITTER : root :: ThemeWidgetType = 17 ; pub const ThemeWidgetType_NS_THEME_STATUSBAR : root :: ThemeWidgetType = 18 ; pub const ThemeWidgetType_NS_THEME_STATUSBARPANEL : root :: ThemeWidgetType = 19 ; pub const ThemeWidgetType_NS_THEME_RESIZERPANEL : root :: ThemeWidgetType = 20 ; pub const ThemeWidgetType_NS_THEME_RESIZER : root :: ThemeWidgetType = 21 ; pub const ThemeWidgetType_NS_THEME_LISTBOX : root :: ThemeWidgetType = 22 ; pub const ThemeWidgetType_NS_THEME_LISTITEM : root :: ThemeWidgetType = 23 ; pub const ThemeWidgetType_NS_THEME_TREEVIEW : root :: ThemeWidgetType = 24 ; pub const ThemeWidgetType_NS_THEME_TREEITEM : root :: ThemeWidgetType = 25 ; pub const ThemeWidgetType_NS_THEME_TREETWISTY : root :: ThemeWidgetType = 26 ; pub const ThemeWidgetType_NS_THEME_TREELINE : root :: ThemeWidgetType = 27 ; pub const ThemeWidgetType_NS_THEME_TREEHEADER : root :: ThemeWidgetType = 28 ; pub const ThemeWidgetType_NS_THEME_TREEHEADERCELL : root :: ThemeWidgetType = 29 ; pub const ThemeWidgetType_NS_THEME_TREEHEADERSORTARROW : root :: ThemeWidgetType = 30 ; pub const ThemeWidgetType_NS_THEME_TREETWISTYOPEN : root :: ThemeWidgetType = 31 ; pub const ThemeWidgetType_NS_THEME_PROGRESSBAR : root :: ThemeWidgetType = 32 ; pub const ThemeWidgetType_NS_THEME_PROGRESSCHUNK : root :: ThemeWidgetType = 33 ; pub const ThemeWidgetType_NS_THEME_PROGRESSBAR_VERTICAL : root :: ThemeWidgetType = 34 ; pub const ThemeWidgetType_NS_THEME_PROGRESSCHUNK_VERTICAL : root :: ThemeWidgetType = 35 ; pub const ThemeWidgetType_NS_THEME_METERBAR : root :: ThemeWidgetType = 36 ; pub const ThemeWidgetType_NS_THEME_METERCHUNK : root :: ThemeWidgetType = 37 ; pub const ThemeWidgetType_NS_THEME_TAB : root :: ThemeWidgetType = 38 ; pub const ThemeWidgetType_NS_THEME_TABPANEL : root :: ThemeWidgetType = 39 ; pub const ThemeWidgetType_NS_THEME_TABPANELS : root :: ThemeWidgetType = 40 ; pub const ThemeWidgetType_NS_THEME_TAB_SCROLL_ARROW_BACK : root :: ThemeWidgetType = 41 ; pub const ThemeWidgetType_NS_THEME_TAB_SCROLL_ARROW_FORWARD : root :: ThemeWidgetType = 42 ; pub const ThemeWidgetType_NS_THEME_TOOLTIP : root :: ThemeWidgetType = 43 ; pub const ThemeWidgetType_NS_THEME_INNER_SPIN_BUTTON : root :: ThemeWidgetType = 44 ; pub const ThemeWidgetType_NS_THEME_SPINNER : root :: ThemeWidgetType = 45 ; pub const ThemeWidgetType_NS_THEME_SPINNER_UPBUTTON : root :: ThemeWidgetType = 46 ; pub const ThemeWidgetType_NS_THEME_SPINNER_DOWNBUTTON : root :: ThemeWidgetType = 47 ; pub const ThemeWidgetType_NS_THEME_SPINNER_TEXTFIELD : root :: ThemeWidgetType = 48 ; pub const ThemeWidgetType_NS_THEME_NUMBER_INPUT : root :: ThemeWidgetType = 49 ; pub const ThemeWidgetType_NS_THEME_SCROLLBAR : root :: ThemeWidgetType = 50 ; pub const ThemeWidgetType_NS_THEME_SCROLLBAR_SMALL : root :: ThemeWidgetType = 51 ; pub const ThemeWidgetType_NS_THEME_SCROLLBAR_HORIZONTAL : root :: ThemeWidgetType = 52 ; pub const ThemeWidgetType_NS_THEME_SCROLLBAR_VERTICAL : root :: ThemeWidgetType = 53 ; pub const ThemeWidgetType_NS_THEME_SCROLLBARBUTTON_UP : root :: ThemeWidgetType = 54 ; pub const ThemeWidgetType_NS_THEME_SCROLLBARBUTTON_DOWN : root :: ThemeWidgetType = 55 ; pub const ThemeWidgetType_NS_THEME_SCROLLBARBUTTON_LEFT : root :: ThemeWidgetType = 56 ; pub const ThemeWidgetType_NS_THEME_SCROLLBARBUTTON_RIGHT : root :: ThemeWidgetType = 57 ; pub const ThemeWidgetType_NS_THEME_SCROLLBARTRACK_HORIZONTAL : root :: ThemeWidgetType = 58 ; pub const ThemeWidgetType_NS_THEME_SCROLLBARTRACK_VERTICAL : root :: ThemeWidgetType = 59 ; pub const ThemeWidgetType_NS_THEME_SCROLLBARTHUMB_HORIZONTAL : root :: ThemeWidgetType = 60 ; pub const ThemeWidgetType_NS_THEME_SCROLLBARTHUMB_VERTICAL : root :: ThemeWidgetType = 61 ; pub const ThemeWidgetType_NS_THEME_SCROLLBAR_NON_DISAPPEARING : root :: ThemeWidgetType = 62 ; pub const ThemeWidgetType_NS_THEME_TEXTFIELD : root :: ThemeWidgetType = 63 ; pub const ThemeWidgetType_NS_THEME_CARET : root :: ThemeWidgetType = 64 ; pub const ThemeWidgetType_NS_THEME_TEXTFIELD_MULTILINE : root :: ThemeWidgetType = 65 ; pub const ThemeWidgetType_NS_THEME_SEARCHFIELD : root :: ThemeWidgetType = 66 ; pub const ThemeWidgetType_NS_THEME_MENULIST : root :: ThemeWidgetType = 67 ; pub const ThemeWidgetType_NS_THEME_MENULIST_BUTTON : root :: ThemeWidgetType = 68 ; pub const ThemeWidgetType_NS_THEME_MENULIST_TEXT : root :: ThemeWidgetType = 69 ; pub const ThemeWidgetType_NS_THEME_MENULIST_TEXTFIELD : root :: ThemeWidgetType = 70 ; pub const ThemeWidgetType_NS_THEME_SCALE_HORIZONTAL : root :: ThemeWidgetType = 71 ; pub const ThemeWidgetType_NS_THEME_SCALE_VERTICAL : root :: ThemeWidgetType = 72 ; pub const ThemeWidgetType_NS_THEME_SCALETHUMB_HORIZONTAL : root :: ThemeWidgetType = 73 ; pub const ThemeWidgetType_NS_THEME_SCALETHUMB_VERTICAL : root :: ThemeWidgetType = 74 ; pub const ThemeWidgetType_NS_THEME_SCALETHUMBSTART : root :: ThemeWidgetType = 75 ; pub const ThemeWidgetType_NS_THEME_SCALETHUMBEND : root :: ThemeWidgetType = 76 ; pub const ThemeWidgetType_NS_THEME_SCALETHUMBTICK : root :: ThemeWidgetType = 77 ; pub const ThemeWidgetType_NS_THEME_RANGE : root :: ThemeWidgetType = 78 ; pub const ThemeWidgetType_NS_THEME_RANGE_THUMB : root :: ThemeWidgetType = 79 ; pub const ThemeWidgetType_NS_THEME_GROUPBOX : root :: ThemeWidgetType = 80 ; pub const ThemeWidgetType_NS_THEME_CHECKBOX_CONTAINER : root :: ThemeWidgetType = 81 ; pub const ThemeWidgetType_NS_THEME_RADIO_CONTAINER : root :: ThemeWidgetType = 82 ; pub const ThemeWidgetType_NS_THEME_CHECKBOX_LABEL : root :: ThemeWidgetType = 83 ; pub const ThemeWidgetType_NS_THEME_RADIO_LABEL : root :: ThemeWidgetType = 84 ; pub const ThemeWidgetType_NS_THEME_BUTTON_FOCUS : root :: ThemeWidgetType = 85 ; pub const ThemeWidgetType_NS_THEME_WINDOW : root :: ThemeWidgetType = 86 ; pub const ThemeWidgetType_NS_THEME_DIALOG : root :: ThemeWidgetType = 87 ; pub const ThemeWidgetType_NS_THEME_MENUBAR : root :: ThemeWidgetType = 88 ; pub const ThemeWidgetType_NS_THEME_MENUPOPUP : root :: ThemeWidgetType = 89 ; pub const ThemeWidgetType_NS_THEME_MENUITEM : root :: ThemeWidgetType = 90 ; pub const ThemeWidgetType_NS_THEME_CHECKMENUITEM : root :: ThemeWidgetType = 91 ; pub const ThemeWidgetType_NS_THEME_RADIOMENUITEM : root :: ThemeWidgetType = 92 ; pub const ThemeWidgetType_NS_THEME_MENUCHECKBOX : root :: ThemeWidgetType = 93 ; pub const ThemeWidgetType_NS_THEME_MENURADIO : root :: ThemeWidgetType = 94 ; pub const ThemeWidgetType_NS_THEME_MENUSEPARATOR : root :: ThemeWidgetType = 95 ; pub const ThemeWidgetType_NS_THEME_MENUARROW : root :: ThemeWidgetType = 96 ; pub const ThemeWidgetType_NS_THEME_MENUIMAGE : root :: ThemeWidgetType = 97 ; pub const ThemeWidgetType_NS_THEME_MENUITEMTEXT : root :: ThemeWidgetType = 98 ; pub const ThemeWidgetType_NS_THEME_WIN_COMMUNICATIONS_TOOLBOX : root :: ThemeWidgetType = 99 ; pub const ThemeWidgetType_NS_THEME_WIN_MEDIA_TOOLBOX : root :: ThemeWidgetType = 100 ; pub const ThemeWidgetType_NS_THEME_WIN_BROWSERTABBAR_TOOLBOX : root :: ThemeWidgetType = 101 ; pub const ThemeWidgetType_NS_THEME_MAC_FULLSCREEN_BUTTON : root :: ThemeWidgetType = 102 ; pub const ThemeWidgetType_NS_THEME_MAC_HELP_BUTTON : root :: ThemeWidgetType = 103 ; pub const ThemeWidgetType_NS_THEME_WIN_BORDERLESS_GLASS : root :: ThemeWidgetType = 104 ; pub const ThemeWidgetType_NS_THEME_WIN_GLASS : root :: ThemeWidgetType = 105 ; pub const ThemeWidgetType_NS_THEME_WINDOW_TITLEBAR : root :: ThemeWidgetType = 106 ; pub const ThemeWidgetType_NS_THEME_WINDOW_TITLEBAR_MAXIMIZED : root :: ThemeWidgetType = 107 ; pub const ThemeWidgetType_NS_THEME_WINDOW_FRAME_LEFT : root :: ThemeWidgetType = 108 ; pub const ThemeWidgetType_NS_THEME_WINDOW_FRAME_RIGHT : root :: ThemeWidgetType = 109 ; pub const ThemeWidgetType_NS_THEME_WINDOW_FRAME_BOTTOM : root :: ThemeWidgetType = 110 ; pub const ThemeWidgetType_NS_THEME_WINDOW_BUTTON_CLOSE : root :: ThemeWidgetType = 111 ; pub const ThemeWidgetType_NS_THEME_WINDOW_BUTTON_MINIMIZE : root :: ThemeWidgetType = 112 ; pub const ThemeWidgetType_NS_THEME_WINDOW_BUTTON_MAXIMIZE : root :: ThemeWidgetType = 113 ; pub const ThemeWidgetType_NS_THEME_WINDOW_BUTTON_RESTORE : root :: ThemeWidgetType = 114 ; pub const ThemeWidgetType_NS_THEME_WINDOW_BUTTON_BOX : root :: ThemeWidgetType = 115 ; pub const ThemeWidgetType_NS_THEME_WINDOW_BUTTON_BOX_MAXIMIZED : root :: ThemeWidgetType = 116 ; pub const ThemeWidgetType_NS_THEME_WIN_EXCLUDE_GLASS : root :: ThemeWidgetType = 117 ; pub const ThemeWidgetType_NS_THEME_MAC_VIBRANCY_LIGHT : root :: ThemeWidgetType = 118 ; pub const ThemeWidgetType_NS_THEME_MAC_VIBRANCY_DARK : root :: ThemeWidgetType = 119 ; pub const ThemeWidgetType_NS_THEME_MAC_VIBRANT_TITLEBAR_LIGHT : root :: ThemeWidgetType = 120 ; pub const ThemeWidgetType_NS_THEME_MAC_VIBRANT_TITLEBAR_DARK : root :: ThemeWidgetType = 121 ; pub const ThemeWidgetType_NS_THEME_MAC_DISCLOSURE_BUTTON_OPEN : root :: ThemeWidgetType = 122 ; pub const ThemeWidgetType_NS_THEME_MAC_DISCLOSURE_BUTTON_CLOSED : root :: ThemeWidgetType = 123 ; pub const ThemeWidgetType_NS_THEME_GTK_INFO_BAR : root :: ThemeWidgetType = 124 ; pub const ThemeWidgetType_NS_THEME_MAC_SOURCE_LIST : root :: ThemeWidgetType = 125 ; pub const ThemeWidgetType_NS_THEME_MAC_SOURCE_LIST_SELECTION : root :: ThemeWidgetType = 126 ; pub const ThemeWidgetType_NS_THEME_MAC_ACTIVE_SOURCE_LIST_SELECTION : root :: ThemeWidgetType = 127 ; pub const ThemeWidgetType_ThemeWidgetType_COUNT : root :: ThemeWidgetType = 128 ; pub type ThemeWidgetType = u8 ; # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct nsIConsoleReportCollector { _unused : [ u8 ; 0 ] } 
- /// Utility class to provide scaling defined in a keySplines element. 
- # [ repr ( C ) ] # [ derive ( Debug , Copy ) ] pub struct nsSMILKeySpline { pub mX1 : f64 , pub mY1 : f64 , pub mX2 : f64 , pub mY2 : f64 , pub mSampleValues : [ f64 ; 11usize ] , } pub const nsSMILKeySpline_kSplineTableSize : root :: nsSMILKeySpline__bindgen_ty_1 = 11 ; pub type nsSMILKeySpline__bindgen_ty_1 = :: std :: os :: raw :: c_uint ; extern "C" {
- # [ link_name = "\u{1}_ZN15nsSMILKeySpline15kSampleStepSizeE" ] 
- pub static mut  nsSMILKeySpline_kSampleStepSize  :  f64 ;
-} # [ test ] fn bindgen_test_layout_nsSMILKeySpline ( ) { assert_eq ! ( :: std :: mem :: size_of :: < nsSMILKeySpline > ( ) , 120usize , concat ! ( "Size of: " , stringify ! ( nsSMILKeySpline ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < nsSMILKeySpline > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( nsSMILKeySpline ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsSMILKeySpline ) ) . mX1 as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( nsSMILKeySpline ) , "::" , stringify ! ( mX1 ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsSMILKeySpline ) ) . mY1 as * const _ as usize } , 8usize , concat ! ( "Alignment of field: " , stringify ! ( nsSMILKeySpline ) , "::" , stringify ! ( mY1 ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsSMILKeySpline ) ) . mX2 as * const _ as usize } , 16usize , concat ! ( "Alignment of field: " , stringify ! ( nsSMILKeySpline ) , "::" , stringify ! ( mX2 ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsSMILKeySpline ) ) . mY2 as * const _ as usize } , 24usize , concat ! ( "Alignment of field: " , stringify ! ( nsSMILKeySpline ) , "::" , stringify ! ( mY2 ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsSMILKeySpline ) ) . mSampleValues as * const _ as usize } , 32usize , concat ! ( "Alignment of field: " , stringify ! ( nsSMILKeySpline ) , "::" , stringify ! ( mSampleValues ) ) ) ; } impl Clone for nsSMILKeySpline { fn clone ( & self ) -> Self { * self } } # [ repr ( C ) ] # [ derive ( Debug ) ] pub struct nsAttrName { pub mBits : usize , } # [ test ] fn bindgen_test_layout_nsAttrName ( ) { assert_eq ! ( :: std :: mem :: size_of :: < nsAttrName > ( ) , 8usize , concat ! ( "Size of: " , stringify ! ( nsAttrName ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < nsAttrName > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( nsAttrName ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsAttrName ) ) . mBits as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( nsAttrName ) , "::" , stringify ! ( mBits ) ) ) ; } # [ repr ( C ) ] # [ derive ( Debug ) ] pub struct nsAttrValue { pub mBits : usize , } pub const nsAttrValue_ValueType_eString : root :: nsAttrValue_ValueType = 0 ; pub const nsAttrValue_ValueType_eAtom : root :: nsAttrValue_ValueType = 2 ; pub const nsAttrValue_ValueType_eInteger : root :: nsAttrValue_ValueType = 3 ; pub const nsAttrValue_ValueType_eColor : root :: nsAttrValue_ValueType = 7 ; pub const nsAttrValue_ValueType_eEnum : root :: nsAttrValue_ValueType = 11 ; pub const nsAttrValue_ValueType_ePercent : root :: nsAttrValue_ValueType = 15 ; pub const nsAttrValue_ValueType_eCSSDeclaration : root :: nsAttrValue_ValueType = 16 ; pub const nsAttrValue_ValueType_eURL : root :: nsAttrValue_ValueType = 17 ; pub const nsAttrValue_ValueType_eImage : root :: nsAttrValue_ValueType = 18 ; pub const nsAttrValue_ValueType_eAtomArray : root :: nsAttrValue_ValueType = 19 ; pub const nsAttrValue_ValueType_eDoubleValue : root :: nsAttrValue_ValueType = 20 ; pub const nsAttrValue_ValueType_eIntMarginValue : root :: nsAttrValue_ValueType = 21 ; pub const nsAttrValue_ValueType_eSVGAngle : root :: nsAttrValue_ValueType = 22 ; pub const nsAttrValue_ValueType_eSVGTypesBegin : root :: nsAttrValue_ValueType = 22 ; pub const nsAttrValue_ValueType_eSVGIntegerPair : root :: nsAttrValue_ValueType = 23 ; pub const nsAttrValue_ValueType_eSVGLength : root :: nsAttrValue_ValueType = 24 ; pub const nsAttrValue_ValueType_eSVGLengthList : root :: nsAttrValue_ValueType = 25 ; pub const nsAttrValue_ValueType_eSVGNumberList : root :: nsAttrValue_ValueType = 26 ; pub const nsAttrValue_ValueType_eSVGNumberPair : root :: nsAttrValue_ValueType = 27 ; pub const nsAttrValue_ValueType_eSVGPathData : root :: nsAttrValue_ValueType = 28 ; pub const nsAttrValue_ValueType_eSVGPointList : root :: nsAttrValue_ValueType = 29 ; pub const nsAttrValue_ValueType_eSVGPreserveAspectRatio : root :: nsAttrValue_ValueType = 30 ; pub const nsAttrValue_ValueType_eSVGStringList : root :: nsAttrValue_ValueType = 31 ; pub const nsAttrValue_ValueType_eSVGTransformList : root :: nsAttrValue_ValueType = 32 ; pub const nsAttrValue_ValueType_eSVGViewBox : root :: nsAttrValue_ValueType = 33 ; pub const nsAttrValue_ValueType_eSVGTypesEnd : root :: nsAttrValue_ValueType = 33 ; pub type nsAttrValue_ValueType = :: std :: os :: raw :: c_uint ; 
+ # [ repr ( C ) ] # [ derive ( Debug ) ] pub struct nsCOMArray { pub mBuffer : root :: nsTArray < * mut root :: nsISupports > , } pub const ThemeWidgetType_NS_THEME_NONE : root :: ThemeWidgetType = 0 ; pub const ThemeWidgetType_NS_THEME_BUTTON : root :: ThemeWidgetType = 1 ; pub const ThemeWidgetType_NS_THEME_RADIO : root :: ThemeWidgetType = 2 ; pub const ThemeWidgetType_NS_THEME_CHECKBOX : root :: ThemeWidgetType = 3 ; pub const ThemeWidgetType_NS_THEME_BUTTON_BEVEL : root :: ThemeWidgetType = 4 ; pub const ThemeWidgetType_NS_THEME_FOCUS_OUTLINE : root :: ThemeWidgetType = 5 ; pub const ThemeWidgetType_NS_THEME_TOOLBOX : root :: ThemeWidgetType = 6 ; pub const ThemeWidgetType_NS_THEME_TOOLBAR : root :: ThemeWidgetType = 7 ; pub const ThemeWidgetType_NS_THEME_TOOLBARBUTTON : root :: ThemeWidgetType = 8 ; pub const ThemeWidgetType_NS_THEME_DUALBUTTON : root :: ThemeWidgetType = 9 ; pub const ThemeWidgetType_NS_THEME_TOOLBARBUTTON_DROPDOWN : root :: ThemeWidgetType = 10 ; pub const ThemeWidgetType_NS_THEME_BUTTON_ARROW_UP : root :: ThemeWidgetType = 11 ; pub const ThemeWidgetType_NS_THEME_BUTTON_ARROW_DOWN : root :: ThemeWidgetType = 12 ; pub const ThemeWidgetType_NS_THEME_BUTTON_ARROW_NEXT : root :: ThemeWidgetType = 13 ; pub const ThemeWidgetType_NS_THEME_BUTTON_ARROW_PREVIOUS : root :: ThemeWidgetType = 14 ; pub const ThemeWidgetType_NS_THEME_SEPARATOR : root :: ThemeWidgetType = 15 ; pub const ThemeWidgetType_NS_THEME_TOOLBARGRIPPER : root :: ThemeWidgetType = 16 ; pub const ThemeWidgetType_NS_THEME_SPLITTER : root :: ThemeWidgetType = 17 ; pub const ThemeWidgetType_NS_THEME_STATUSBAR : root :: ThemeWidgetType = 18 ; pub const ThemeWidgetType_NS_THEME_STATUSBARPANEL : root :: ThemeWidgetType = 19 ; pub const ThemeWidgetType_NS_THEME_RESIZERPANEL : root :: ThemeWidgetType = 20 ; pub const ThemeWidgetType_NS_THEME_RESIZER : root :: ThemeWidgetType = 21 ; pub const ThemeWidgetType_NS_THEME_LISTBOX : root :: ThemeWidgetType = 22 ; pub const ThemeWidgetType_NS_THEME_LISTITEM : root :: ThemeWidgetType = 23 ; pub const ThemeWidgetType_NS_THEME_TREEVIEW : root :: ThemeWidgetType = 24 ; pub const ThemeWidgetType_NS_THEME_TREEITEM : root :: ThemeWidgetType = 25 ; pub const ThemeWidgetType_NS_THEME_TREETWISTY : root :: ThemeWidgetType = 26 ; pub const ThemeWidgetType_NS_THEME_TREELINE : root :: ThemeWidgetType = 27 ; pub const ThemeWidgetType_NS_THEME_TREEHEADER : root :: ThemeWidgetType = 28 ; pub const ThemeWidgetType_NS_THEME_TREEHEADERCELL : root :: ThemeWidgetType = 29 ; pub const ThemeWidgetType_NS_THEME_TREEHEADERSORTARROW : root :: ThemeWidgetType = 30 ; pub const ThemeWidgetType_NS_THEME_TREETWISTYOPEN : root :: ThemeWidgetType = 31 ; pub const ThemeWidgetType_NS_THEME_PROGRESSBAR : root :: ThemeWidgetType = 32 ; pub const ThemeWidgetType_NS_THEME_PROGRESSCHUNK : root :: ThemeWidgetType = 33 ; pub const ThemeWidgetType_NS_THEME_PROGRESSBAR_VERTICAL : root :: ThemeWidgetType = 34 ; pub const ThemeWidgetType_NS_THEME_PROGRESSCHUNK_VERTICAL : root :: ThemeWidgetType = 35 ; pub const ThemeWidgetType_NS_THEME_METERBAR : root :: ThemeWidgetType = 36 ; pub const ThemeWidgetType_NS_THEME_METERCHUNK : root :: ThemeWidgetType = 37 ; pub const ThemeWidgetType_NS_THEME_TAB : root :: ThemeWidgetType = 38 ; pub const ThemeWidgetType_NS_THEME_TABPANEL : root :: ThemeWidgetType = 39 ; pub const ThemeWidgetType_NS_THEME_TABPANELS : root :: ThemeWidgetType = 40 ; pub const ThemeWidgetType_NS_THEME_TAB_SCROLL_ARROW_BACK : root :: ThemeWidgetType = 41 ; pub const ThemeWidgetType_NS_THEME_TAB_SCROLL_ARROW_FORWARD : root :: ThemeWidgetType = 42 ; pub const ThemeWidgetType_NS_THEME_TOOLTIP : root :: ThemeWidgetType = 43 ; pub const ThemeWidgetType_NS_THEME_INNER_SPIN_BUTTON : root :: ThemeWidgetType = 44 ; pub const ThemeWidgetType_NS_THEME_SPINNER : root :: ThemeWidgetType = 45 ; pub const ThemeWidgetType_NS_THEME_SPINNER_UPBUTTON : root :: ThemeWidgetType = 46 ; pub const ThemeWidgetType_NS_THEME_SPINNER_DOWNBUTTON : root :: ThemeWidgetType = 47 ; pub const ThemeWidgetType_NS_THEME_SPINNER_TEXTFIELD : root :: ThemeWidgetType = 48 ; pub const ThemeWidgetType_NS_THEME_NUMBER_INPUT : root :: ThemeWidgetType = 49 ; pub const ThemeWidgetType_NS_THEME_SCROLLBAR : root :: ThemeWidgetType = 50 ; pub const ThemeWidgetType_NS_THEME_SCROLLBAR_SMALL : root :: ThemeWidgetType = 51 ; pub const ThemeWidgetType_NS_THEME_SCROLLBAR_HORIZONTAL : root :: ThemeWidgetType = 52 ; pub const ThemeWidgetType_NS_THEME_SCROLLBAR_VERTICAL : root :: ThemeWidgetType = 53 ; pub const ThemeWidgetType_NS_THEME_SCROLLBARBUTTON_UP : root :: ThemeWidgetType = 54 ; pub const ThemeWidgetType_NS_THEME_SCROLLBARBUTTON_DOWN : root :: ThemeWidgetType = 55 ; pub const ThemeWidgetType_NS_THEME_SCROLLBARBUTTON_LEFT : root :: ThemeWidgetType = 56 ; pub const ThemeWidgetType_NS_THEME_SCROLLBARBUTTON_RIGHT : root :: ThemeWidgetType = 57 ; pub const ThemeWidgetType_NS_THEME_SCROLLBARTRACK_HORIZONTAL : root :: ThemeWidgetType = 58 ; pub const ThemeWidgetType_NS_THEME_SCROLLBARTRACK_VERTICAL : root :: ThemeWidgetType = 59 ; pub const ThemeWidgetType_NS_THEME_SCROLLBARTHUMB_HORIZONTAL : root :: ThemeWidgetType = 60 ; pub const ThemeWidgetType_NS_THEME_SCROLLBARTHUMB_VERTICAL : root :: ThemeWidgetType = 61 ; pub const ThemeWidgetType_NS_THEME_SCROLLBAR_NON_DISAPPEARING : root :: ThemeWidgetType = 62 ; pub const ThemeWidgetType_NS_THEME_TEXTFIELD : root :: ThemeWidgetType = 63 ; pub const ThemeWidgetType_NS_THEME_CARET : root :: ThemeWidgetType = 64 ; pub const ThemeWidgetType_NS_THEME_TEXTFIELD_MULTILINE : root :: ThemeWidgetType = 65 ; pub const ThemeWidgetType_NS_THEME_SEARCHFIELD : root :: ThemeWidgetType = 66 ; pub const ThemeWidgetType_NS_THEME_MENULIST : root :: ThemeWidgetType = 67 ; pub const ThemeWidgetType_NS_THEME_MENULIST_BUTTON : root :: ThemeWidgetType = 68 ; pub const ThemeWidgetType_NS_THEME_MENULIST_TEXT : root :: ThemeWidgetType = 69 ; pub const ThemeWidgetType_NS_THEME_MENULIST_TEXTFIELD : root :: ThemeWidgetType = 70 ; pub const ThemeWidgetType_NS_THEME_SCALE_HORIZONTAL : root :: ThemeWidgetType = 71 ; pub const ThemeWidgetType_NS_THEME_SCALE_VERTICAL : root :: ThemeWidgetType = 72 ; pub const ThemeWidgetType_NS_THEME_SCALETHUMB_HORIZONTAL : root :: ThemeWidgetType = 73 ; pub const ThemeWidgetType_NS_THEME_SCALETHUMB_VERTICAL : root :: ThemeWidgetType = 74 ; pub const ThemeWidgetType_NS_THEME_SCALETHUMBSTART : root :: ThemeWidgetType = 75 ; pub const ThemeWidgetType_NS_THEME_SCALETHUMBEND : root :: ThemeWidgetType = 76 ; pub const ThemeWidgetType_NS_THEME_SCALETHUMBTICK : root :: ThemeWidgetType = 77 ; pub const ThemeWidgetType_NS_THEME_RANGE : root :: ThemeWidgetType = 78 ; pub const ThemeWidgetType_NS_THEME_RANGE_THUMB : root :: ThemeWidgetType = 79 ; pub const ThemeWidgetType_NS_THEME_GROUPBOX : root :: ThemeWidgetType = 80 ; pub const ThemeWidgetType_NS_THEME_CHECKBOX_CONTAINER : root :: ThemeWidgetType = 81 ; pub const ThemeWidgetType_NS_THEME_RADIO_CONTAINER : root :: ThemeWidgetType = 82 ; pub const ThemeWidgetType_NS_THEME_CHECKBOX_LABEL : root :: ThemeWidgetType = 83 ; pub const ThemeWidgetType_NS_THEME_RADIO_LABEL : root :: ThemeWidgetType = 84 ; pub const ThemeWidgetType_NS_THEME_BUTTON_FOCUS : root :: ThemeWidgetType = 85 ; pub const ThemeWidgetType_NS_THEME_WINDOW : root :: ThemeWidgetType = 86 ; pub const ThemeWidgetType_NS_THEME_DIALOG : root :: ThemeWidgetType = 87 ; pub const ThemeWidgetType_NS_THEME_MENUBAR : root :: ThemeWidgetType = 88 ; pub const ThemeWidgetType_NS_THEME_MENUPOPUP : root :: ThemeWidgetType = 89 ; pub const ThemeWidgetType_NS_THEME_MENUITEM : root :: ThemeWidgetType = 90 ; pub const ThemeWidgetType_NS_THEME_CHECKMENUITEM : root :: ThemeWidgetType = 91 ; pub const ThemeWidgetType_NS_THEME_RADIOMENUITEM : root :: ThemeWidgetType = 92 ; pub const ThemeWidgetType_NS_THEME_MENUCHECKBOX : root :: ThemeWidgetType = 93 ; pub const ThemeWidgetType_NS_THEME_MENURADIO : root :: ThemeWidgetType = 94 ; pub const ThemeWidgetType_NS_THEME_MENUSEPARATOR : root :: ThemeWidgetType = 95 ; pub const ThemeWidgetType_NS_THEME_MENUARROW : root :: ThemeWidgetType = 96 ; pub const ThemeWidgetType_NS_THEME_MENUIMAGE : root :: ThemeWidgetType = 97 ; pub const ThemeWidgetType_NS_THEME_MENUITEMTEXT : root :: ThemeWidgetType = 98 ; pub const ThemeWidgetType_NS_THEME_WIN_COMMUNICATIONS_TOOLBOX : root :: ThemeWidgetType = 99 ; pub const ThemeWidgetType_NS_THEME_WIN_MEDIA_TOOLBOX : root :: ThemeWidgetType = 100 ; pub const ThemeWidgetType_NS_THEME_WIN_BROWSERTABBAR_TOOLBOX : root :: ThemeWidgetType = 101 ; pub const ThemeWidgetType_NS_THEME_MAC_FULLSCREEN_BUTTON : root :: ThemeWidgetType = 102 ; pub const ThemeWidgetType_NS_THEME_MAC_HELP_BUTTON : root :: ThemeWidgetType = 103 ; pub const ThemeWidgetType_NS_THEME_WIN_BORDERLESS_GLASS : root :: ThemeWidgetType = 104 ; pub const ThemeWidgetType_NS_THEME_WIN_GLASS : root :: ThemeWidgetType = 105 ; pub const ThemeWidgetType_NS_THEME_WINDOW_TITLEBAR : root :: ThemeWidgetType = 106 ; pub const ThemeWidgetType_NS_THEME_WINDOW_TITLEBAR_MAXIMIZED : root :: ThemeWidgetType = 107 ; pub const ThemeWidgetType_NS_THEME_WINDOW_FRAME_LEFT : root :: ThemeWidgetType = 108 ; pub const ThemeWidgetType_NS_THEME_WINDOW_FRAME_RIGHT : root :: ThemeWidgetType = 109 ; pub const ThemeWidgetType_NS_THEME_WINDOW_FRAME_BOTTOM : root :: ThemeWidgetType = 110 ; pub const ThemeWidgetType_NS_THEME_WINDOW_BUTTON_CLOSE : root :: ThemeWidgetType = 111 ; pub const ThemeWidgetType_NS_THEME_WINDOW_BUTTON_MINIMIZE : root :: ThemeWidgetType = 112 ; pub const ThemeWidgetType_NS_THEME_WINDOW_BUTTON_MAXIMIZE : root :: ThemeWidgetType = 113 ; pub const ThemeWidgetType_NS_THEME_WINDOW_BUTTON_RESTORE : root :: ThemeWidgetType = 114 ; pub const ThemeWidgetType_NS_THEME_WINDOW_BUTTON_BOX : root :: ThemeWidgetType = 115 ; pub const ThemeWidgetType_NS_THEME_WINDOW_BUTTON_BOX_MAXIMIZED : root :: ThemeWidgetType = 116 ; pub const ThemeWidgetType_NS_THEME_WIN_EXCLUDE_GLASS : root :: ThemeWidgetType = 117 ; pub const ThemeWidgetType_NS_THEME_MAC_VIBRANCY_LIGHT : root :: ThemeWidgetType = 118 ; pub const ThemeWidgetType_NS_THEME_MAC_VIBRANCY_DARK : root :: ThemeWidgetType = 119 ; pub const ThemeWidgetType_NS_THEME_MAC_VIBRANT_TITLEBAR_LIGHT : root :: ThemeWidgetType = 120 ; pub const ThemeWidgetType_NS_THEME_MAC_VIBRANT_TITLEBAR_DARK : root :: ThemeWidgetType = 121 ; pub const ThemeWidgetType_NS_THEME_MAC_DISCLOSURE_BUTTON_OPEN : root :: ThemeWidgetType = 122 ; pub const ThemeWidgetType_NS_THEME_MAC_DISCLOSURE_BUTTON_CLOSED : root :: ThemeWidgetType = 123 ; pub const ThemeWidgetType_NS_THEME_GTK_INFO_BAR : root :: ThemeWidgetType = 124 ; pub const ThemeWidgetType_NS_THEME_MAC_SOURCE_LIST : root :: ThemeWidgetType = 125 ; pub const ThemeWidgetType_NS_THEME_MAC_SOURCE_LIST_SELECTION : root :: ThemeWidgetType = 126 ; pub const ThemeWidgetType_NS_THEME_MAC_ACTIVE_SOURCE_LIST_SELECTION : root :: ThemeWidgetType = 127 ; pub const ThemeWidgetType_ThemeWidgetType_COUNT : root :: ThemeWidgetType = 128 ; pub type ThemeWidgetType = u8 ; # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct nsIConsoleReportCollector { _unused : [ u8 ; 0 ] } # [ repr ( C ) ] # [ derive ( Debug , Copy ) ] pub struct nsIDOMElement { pub _base : root :: nsIDOMNode , } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct nsIDOMElement_COMTypeInfo { pub _address : u8 , } # [ test ] fn bindgen_test_layout_nsIDOMElement ( ) { assert_eq ! ( :: std :: mem :: size_of :: < nsIDOMElement > ( ) , 8usize , concat ! ( "Size of: " , stringify ! ( nsIDOMElement ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < nsIDOMElement > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( nsIDOMElement ) ) ) ; } impl Clone for nsIDOMElement { fn clone ( & self ) -> Self { * self } } # [ repr ( C ) ] # [ derive ( Debug , Copy ) ] pub struct nsIDOMHTMLElement { pub _base : root :: nsIDOMElement , } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct nsIDOMHTMLElement_COMTypeInfo { pub _address : u8 , } # [ test ] fn bindgen_test_layout_nsIDOMHTMLElement ( ) { assert_eq ! ( :: std :: mem :: size_of :: < nsIDOMHTMLElement > ( ) , 8usize , concat ! ( "Size of: " , stringify ! ( nsIDOMHTMLElement ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < nsIDOMHTMLElement > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( nsIDOMHTMLElement ) ) ) ; } impl Clone for nsIDOMHTMLElement { fn clone ( & self ) -> Self { * self } } # [ repr ( C ) ] # [ derive ( Debug ) ] pub struct nsAttrName { pub mBits : usize , } # [ test ] fn bindgen_test_layout_nsAttrName ( ) { assert_eq ! ( :: std :: mem :: size_of :: < nsAttrName > ( ) , 8usize , concat ! ( "Size of: " , stringify ! ( nsAttrName ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < nsAttrName > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( nsAttrName ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsAttrName ) ) . mBits as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( nsAttrName ) , "::" , stringify ! ( mBits ) ) ) ; } # [ repr ( C ) ] # [ derive ( Debug ) ] pub struct nsAttrValue { pub mBits : usize , } pub const nsAttrValue_ValueType_eString : root :: nsAttrValue_ValueType = 0 ; pub const nsAttrValue_ValueType_eAtom : root :: nsAttrValue_ValueType = 2 ; pub const nsAttrValue_ValueType_eInteger : root :: nsAttrValue_ValueType = 3 ; pub const nsAttrValue_ValueType_eColor : root :: nsAttrValue_ValueType = 7 ; pub const nsAttrValue_ValueType_eEnum : root :: nsAttrValue_ValueType = 11 ; pub const nsAttrValue_ValueType_ePercent : root :: nsAttrValue_ValueType = 15 ; pub const nsAttrValue_ValueType_eCSSDeclaration : root :: nsAttrValue_ValueType = 16 ; pub const nsAttrValue_ValueType_eURL : root :: nsAttrValue_ValueType = 17 ; pub const nsAttrValue_ValueType_eImage : root :: nsAttrValue_ValueType = 18 ; pub const nsAttrValue_ValueType_eAtomArray : root :: nsAttrValue_ValueType = 19 ; pub const nsAttrValue_ValueType_eDoubleValue : root :: nsAttrValue_ValueType = 20 ; pub const nsAttrValue_ValueType_eIntMarginValue : root :: nsAttrValue_ValueType = 21 ; pub const nsAttrValue_ValueType_eSVGAngle : root :: nsAttrValue_ValueType = 22 ; pub const nsAttrValue_ValueType_eSVGTypesBegin : root :: nsAttrValue_ValueType = 22 ; pub const nsAttrValue_ValueType_eSVGIntegerPair : root :: nsAttrValue_ValueType = 23 ; pub const nsAttrValue_ValueType_eSVGLength : root :: nsAttrValue_ValueType = 24 ; pub const nsAttrValue_ValueType_eSVGLengthList : root :: nsAttrValue_ValueType = 25 ; pub const nsAttrValue_ValueType_eSVGNumberList : root :: nsAttrValue_ValueType = 26 ; pub const nsAttrValue_ValueType_eSVGNumberPair : root :: nsAttrValue_ValueType = 27 ; pub const nsAttrValue_ValueType_eSVGPathData : root :: nsAttrValue_ValueType = 28 ; pub const nsAttrValue_ValueType_eSVGPointList : root :: nsAttrValue_ValueType = 29 ; pub const nsAttrValue_ValueType_eSVGPreserveAspectRatio : root :: nsAttrValue_ValueType = 30 ; pub const nsAttrValue_ValueType_eSVGStringList : root :: nsAttrValue_ValueType = 31 ; pub const nsAttrValue_ValueType_eSVGTransformList : root :: nsAttrValue_ValueType = 32 ; pub const nsAttrValue_ValueType_eSVGViewBox : root :: nsAttrValue_ValueType = 33 ; pub const nsAttrValue_ValueType_eSVGTypesEnd : root :: nsAttrValue_ValueType = 33 ; pub type nsAttrValue_ValueType = :: std :: os :: raw :: c_uint ; 
  /// Structure for a mapping from int (enum) values to strings.  When you use
     /// it you generally create an array of them.
     /// Instantiate like this:
     /// EnumTable myTable[] = {
     /// { "string1", 1 },
     /// { "string2", 2 },
     /// { nullptr, 0 }
     /// } 
@@ -1711,17 +1709,60 @@ pub type ServoStyleContextStrong = ::gec
     /// -moz-appearance value ("widget type") of the frame because the widget may
     /// want to treat different frames with the same -moz-appearance differently
     /// based on other properties of the frame. So we give the theme a first look
     /// at the frame in nsITheme::ThemeGeometryTypeForWidget and pass the
     /// returned ThemeGeometryType along to the widget.
     /// Each theme backend defines the ThemeGeometryType values it needs in its
     /// own nsITheme subclass. eThemeGeometryTypeUnknown is the only value that's
     /// shared between backends. 
- pub type nsITheme_ThemeGeometryType = u8 ; pub const nsITheme_eThemeGeometryTypeUnknown : root :: nsITheme__bindgen_ty_1 = 0 ; pub type nsITheme__bindgen_ty_1 = :: std :: os :: raw :: c_uint ; # [ test ] fn bindgen_test_layout_nsITheme ( ) { assert_eq ! ( :: std :: mem :: size_of :: < nsITheme > ( ) , 8usize , concat ! ( "Size of: " , stringify ! ( nsITheme ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < nsITheme > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( nsITheme ) ) ) ; } impl Clone for nsITheme { fn clone ( & self ) -> Self { * self } } pub type nsIWidget_LayoutDeviceIntPoint = root :: mozilla :: LayoutDeviceIntPoint ; # [ repr ( C ) ] # [ derive ( Debug ) ] pub struct nsIWidget_LongTapInfo { pub mPointerId : i32 , pub mPosition : root :: nsIWidget_LayoutDeviceIntPoint , pub mDuration : root :: mozilla :: TimeDuration , pub mObserver : root :: nsCOMPtr , pub mStamp : root :: mozilla :: TimeStamp , } # [ test ] fn bindgen_test_layout_nsIWidget_LongTapInfo ( ) { assert_eq ! ( :: std :: mem :: size_of :: < nsIWidget_LongTapInfo > ( ) , 40usize , concat ! ( "Size of: " , stringify ! ( nsIWidget_LongTapInfo ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < nsIWidget_LongTapInfo > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( nsIWidget_LongTapInfo ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsIWidget_LongTapInfo ) ) . mPointerId as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( nsIWidget_LongTapInfo ) , "::" , stringify ! ( mPointerId ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsIWidget_LongTapInfo ) ) . mPosition as * const _ as usize } , 4usize , concat ! ( "Alignment of field: " , stringify ! ( nsIWidget_LongTapInfo ) , "::" , stringify ! ( mPosition ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsIWidget_LongTapInfo ) ) . mDuration as * const _ as usize } , 16usize , concat ! ( "Alignment of field: " , stringify ! ( nsIWidget_LongTapInfo ) , "::" , stringify ! ( mDuration ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsIWidget_LongTapInfo ) ) . mObserver as * const _ as usize } , 24usize , concat ! ( "Alignment of field: " , stringify ! ( nsIWidget_LongTapInfo ) , "::" , stringify ! ( mObserver ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsIWidget_LongTapInfo ) ) . mStamp as * const _ as usize } , 32usize , concat ! ( "Alignment of field: " , stringify ! ( nsIWidget_LongTapInfo ) , "::" , stringify ! ( mStamp ) ) ) ; } pub const ELEMENT_SHARED_RESTYLE_BIT_1 : root :: _bindgen_ty_79 = 8388608 ; pub const ELEMENT_SHARED_RESTYLE_BIT_2 : root :: _bindgen_ty_79 = 16777216 ; pub const ELEMENT_SHARED_RESTYLE_BIT_3 : root :: _bindgen_ty_79 = 33554432 ; pub const ELEMENT_SHARED_RESTYLE_BIT_4 : root :: _bindgen_ty_79 = 67108864 ; pub const ELEMENT_SHARED_RESTYLE_BITS : root :: _bindgen_ty_79 = 125829120 ; pub const ELEMENT_HAS_DIRTY_DESCENDANTS_FOR_SERVO : root :: _bindgen_ty_79 = 8388608 ; pub const ELEMENT_HAS_ANIMATION_ONLY_DIRTY_DESCENDANTS_FOR_SERVO : root :: _bindgen_ty_79 = 16777216 ; pub const ELEMENT_HAS_SNAPSHOT : root :: _bindgen_ty_79 = 33554432 ; pub const ELEMENT_HANDLED_SNAPSHOT : root :: _bindgen_ty_79 = 67108864 ; pub const ELEMENT_HAS_PENDING_RESTYLE : root :: _bindgen_ty_79 = 8388608 ; pub const ELEMENT_IS_POTENTIAL_RESTYLE_ROOT : root :: _bindgen_ty_79 = 16777216 ; pub const ELEMENT_HAS_PENDING_ANIMATION_ONLY_RESTYLE : root :: _bindgen_ty_79 = 33554432 ; pub const ELEMENT_IS_POTENTIAL_ANIMATION_ONLY_RESTYLE_ROOT : root :: _bindgen_ty_79 = 67108864 ; pub const ELEMENT_IS_CONDITIONAL_RESTYLE_ANCESTOR : root :: _bindgen_ty_79 = 134217728 ; pub const ELEMENT_HAS_CHILD_WITH_LATER_SIBLINGS_HINT : root :: _bindgen_ty_79 = 268435456 ; pub const ELEMENT_PENDING_RESTYLE_FLAGS : root :: _bindgen_ty_79 = 41943040 ; pub const ELEMENT_POTENTIAL_RESTYLE_ROOT_FLAGS : root :: _bindgen_ty_79 = 83886080 ; pub const ELEMENT_ALL_RESTYLE_FLAGS : root :: _bindgen_ty_79 = 260046848 ; pub const ELEMENT_TYPE_SPECIFIC_BITS_OFFSET : root :: _bindgen_ty_79 = 27 ; pub type _bindgen_ty_79 = :: std :: os :: raw :: c_uint ; pub const GECKO_IS_NIGHTLY : bool = true ; # [ repr ( C ) ] # [ derive ( Debug , Copy ) ] pub struct ServoBundledURI { pub mURLString : * const u8 , pub mURLStringLength : u32 , pub mExtraData : * mut root :: mozilla :: URLExtraData , } # [ test ] fn bindgen_test_layout_ServoBundledURI ( ) { assert_eq ! ( :: std :: mem :: size_of :: < ServoBundledURI > ( ) , 24usize , concat ! ( "Size of: " , stringify ! ( ServoBundledURI ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < ServoBundledURI > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( ServoBundledURI ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const ServoBundledURI ) ) . mURLString as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( ServoBundledURI ) , "::" , stringify ! ( mURLString ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const ServoBundledURI ) ) . mURLStringLength as * const _ as usize } , 8usize , concat ! ( "Alignment of field: " , stringify ! ( ServoBundledURI ) , "::" , stringify ! ( mURLStringLength ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const ServoBundledURI ) ) . mExtraData as * const _ as usize } , 16usize , concat ! ( "Alignment of field: " , stringify ! ( ServoBundledURI ) , "::" , stringify ! ( mExtraData ) ) ) ; } impl Clone for ServoBundledURI { fn clone ( & self ) -> Self { * self } } # [ repr ( C ) ] # [ derive ( Debug , Copy ) ] pub struct FontSizePrefs { pub mDefaultVariableSize : root :: nscoord , pub mDefaultFixedSize : root :: nscoord , pub mDefaultSerifSize : root :: nscoord , pub mDefaultSansSerifSize : root :: nscoord , pub mDefaultMonospaceSize : root :: nscoord , pub mDefaultCursiveSize : root :: nscoord , pub mDefaultFantasySize : root :: nscoord , } # [ test ] fn bindgen_test_layout_FontSizePrefs ( ) { assert_eq ! ( :: std :: mem :: size_of :: < FontSizePrefs > ( ) , 28usize , concat ! ( "Size of: " , stringify ! ( FontSizePrefs ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < FontSizePrefs > ( ) , 4usize , concat ! ( "Alignment of " , stringify ! ( FontSizePrefs ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const FontSizePrefs ) ) . mDefaultVariableSize as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( FontSizePrefs ) , "::" , stringify ! ( mDefaultVariableSize ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const FontSizePrefs ) ) . mDefaultFixedSize as * const _ as usize } , 4usize , concat ! ( "Alignment of field: " , stringify ! ( FontSizePrefs ) , "::" , stringify ! ( mDefaultFixedSize ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const FontSizePrefs ) ) . mDefaultSerifSize as * const _ as usize } , 8usize , concat ! ( "Alignment of field: " , stringify ! ( FontSizePrefs ) , "::" , stringify ! ( mDefaultSerifSize ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const FontSizePrefs ) ) . mDefaultSansSerifSize as * const _ as usize } , 12usize , concat ! ( "Alignment of field: " , stringify ! ( FontSizePrefs ) , "::" , stringify ! ( mDefaultSansSerifSize ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const FontSizePrefs ) ) . mDefaultMonospaceSize as * const _ as usize } , 16usize , concat ! ( "Alignment of field: " , stringify ! ( FontSizePrefs ) , "::" , stringify ! ( mDefaultMonospaceSize ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const FontSizePrefs ) ) . mDefaultCursiveSize as * const _ as usize } , 20usize , concat ! ( "Alignment of field: " , stringify ! ( FontSizePrefs ) , "::" , stringify ! ( mDefaultCursiveSize ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const FontSizePrefs ) ) . mDefaultFantasySize as * const _ as usize } , 24usize , concat ! ( "Alignment of field: " , stringify ! ( FontSizePrefs ) , "::" , stringify ! ( mDefaultFantasySize ) ) ) ; } impl Clone for FontSizePrefs { fn clone ( & self ) -> Self { * self } } # [ repr ( C ) ] # [ derive ( Debug , Copy ) ] pub struct GeckoFontMetrics { pub mChSize : root :: nscoord , pub mXSize : root :: nscoord , } # [ test ] fn bindgen_test_layout_GeckoFontMetrics ( ) { assert_eq ! ( :: std :: mem :: size_of :: < GeckoFontMetrics > ( ) , 8usize , concat ! ( "Size of: " , stringify ! ( GeckoFontMetrics ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < GeckoFontMetrics > ( ) , 4usize , concat ! ( "Alignment of " , stringify ! ( GeckoFontMetrics ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const GeckoFontMetrics ) ) . mChSize as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( GeckoFontMetrics ) , "::" , stringify ! ( mChSize ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const GeckoFontMetrics ) ) . mXSize as * const _ as usize } , 4usize , concat ! ( "Alignment of field: " , stringify ! ( GeckoFontMetrics ) , "::" , stringify ! ( mXSize ) ) ) ; } impl Clone for GeckoFontMetrics { fn clone ( & self ) -> Self { * self } } pub const SERVO_CSS_PSEUDO_ELEMENT_FLAGS_after : u32 = 65 ; pub const SERVO_CSS_PSEUDO_ELEMENT_FLAGS_before : u32 = 65 ; pub const SERVO_CSS_PSEUDO_ELEMENT_FLAGS_backdrop : u32 = 0 ; pub const SERVO_CSS_PSEUDO_ELEMENT_FLAGS_cue : u32 = 36 ; pub const SERVO_CSS_PSEUDO_ELEMENT_FLAGS_firstLetter : u32 = 3 ; pub const SERVO_CSS_PSEUDO_ELEMENT_FLAGS_firstLine : u32 = 3 ; pub const SERVO_CSS_PSEUDO_ELEMENT_FLAGS_mozSelection : u32 = 2 ; pub const SERVO_CSS_PSEUDO_ELEMENT_FLAGS_mozFocusInner : u32 = 0 ; pub const SERVO_CSS_PSEUDO_ELEMENT_FLAGS_mozFocusOuter : u32 = 0 ; pub const SERVO_CSS_PSEUDO_ELEMENT_FLAGS_mozListBullet : u32 = 0 ; pub const SERVO_CSS_PSEUDO_ELEMENT_FLAGS_mozListNumber : u32 = 0 ; pub const SERVO_CSS_PSEUDO_ELEMENT_FLAGS_mozMathAnonymous : u32 = 0 ; pub const SERVO_CSS_PSEUDO_ELEMENT_FLAGS_mozNumberWrapper : u32 = 24 ; pub const SERVO_CSS_PSEUDO_ELEMENT_FLAGS_mozNumberText : u32 = 24 ; pub const SERVO_CSS_PSEUDO_ELEMENT_FLAGS_mozNumberSpinBox : u32 = 24 ; pub const SERVO_CSS_PSEUDO_ELEMENT_FLAGS_mozNumberSpinUp : u32 = 24 ; pub const SERVO_CSS_PSEUDO_ELEMENT_FLAGS_mozNumberSpinDown : u32 = 24 ; pub const SERVO_CSS_PSEUDO_ELEMENT_FLAGS_mozProgressBar : u32 = 8 ; pub const SERVO_CSS_PSEUDO_ELEMENT_FLAGS_mozRangeTrack : u32 = 8 ; pub const SERVO_CSS_PSEUDO_ELEMENT_FLAGS_mozRangeProgress : u32 = 8 ; pub const SERVO_CSS_PSEUDO_ELEMENT_FLAGS_mozRangeThumb : u32 = 8 ; pub const SERVO_CSS_PSEUDO_ELEMENT_FLAGS_mozMeterBar : u32 = 8 ; pub const SERVO_CSS_PSEUDO_ELEMENT_FLAGS_mozPlaceholder : u32 = 8 ; pub const SERVO_CSS_PSEUDO_ELEMENT_FLAGS_placeholder : u32 = 8 ; pub const SERVO_CSS_PSEUDO_ELEMENT_FLAGS_mozColorSwatch : u32 = 12 ; # [ repr ( C ) ] # [ derive ( Debug , Copy ) ] pub struct nsIDOMMediaList { pub _base : root :: nsISupports , } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct nsIDOMMediaList_COMTypeInfo { pub _address : u8 , } # [ test ] fn bindgen_test_layout_nsIDOMMediaList ( ) { assert_eq ! ( :: std :: mem :: size_of :: < nsIDOMMediaList > ( ) , 8usize , concat ! ( "Size of: " , stringify ! ( nsIDOMMediaList ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < nsIDOMMediaList > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( nsIDOMMediaList ) ) ) ; } impl Clone for nsIDOMMediaList { fn clone ( & self ) -> Self { * self } } pub type nsCSSAnonBoxes_NonInheritingBase = u8 ; pub const nsCSSAnonBoxes_NonInheriting_oofPlaceholder : root :: nsCSSAnonBoxes_NonInheriting = 0 ; pub const nsCSSAnonBoxes_NonInheriting_horizontalFramesetBorder : root :: nsCSSAnonBoxes_NonInheriting = 1 ; pub const nsCSSAnonBoxes_NonInheriting_verticalFramesetBorder : root :: nsCSSAnonBoxes_NonInheriting = 2 ; pub const nsCSSAnonBoxes_NonInheriting_framesetBlank : root :: nsCSSAnonBoxes_NonInheriting = 3 ; pub const nsCSSAnonBoxes_NonInheriting_tableColGroup : root :: nsCSSAnonBoxes_NonInheriting = 4 ; pub const nsCSSAnonBoxes_NonInheriting_tableCol : root :: nsCSSAnonBoxes_NonInheriting = 5 ; pub const nsCSSAnonBoxes_NonInheriting_pageBreak : root :: nsCSSAnonBoxes_NonInheriting = 6 ; pub const nsCSSAnonBoxes_NonInheriting__Count : root :: nsCSSAnonBoxes_NonInheriting = 7 ; pub type nsCSSAnonBoxes_NonInheriting = root :: nsCSSAnonBoxes_NonInheritingBase ; 
+ pub type nsITheme_ThemeGeometryType = u8 ; pub const nsITheme_eThemeGeometryTypeUnknown : root :: nsITheme__bindgen_ty_1 = 0 ; pub type nsITheme__bindgen_ty_1 = :: std :: os :: raw :: c_uint ; # [ test ] fn bindgen_test_layout_nsITheme ( ) { assert_eq ! ( :: std :: mem :: size_of :: < nsITheme > ( ) , 8usize , concat ! ( "Size of: " , stringify ! ( nsITheme ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < nsITheme > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( nsITheme ) ) ) ; } impl Clone for nsITheme { fn clone ( & self ) -> Self { * self } } pub type nsIWidget_LayoutDeviceIntPoint = root :: mozilla :: LayoutDeviceIntPoint ; # [ repr ( C ) ] # [ derive ( Debug ) ] pub struct nsIWidget_LongTapInfo { pub mPointerId : i32 , pub mPosition : root :: nsIWidget_LayoutDeviceIntPoint , pub mDuration : root :: mozilla :: TimeDuration , pub mObserver : root :: nsCOMPtr , pub mStamp : root :: mozilla :: TimeStamp , } # [ test ] fn bindgen_test_layout_nsIWidget_LongTapInfo ( ) { assert_eq ! ( :: std :: mem :: size_of :: < nsIWidget_LongTapInfo > ( ) , 40usize , concat ! ( "Size of: " , stringify ! ( nsIWidget_LongTapInfo ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < nsIWidget_LongTapInfo > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( nsIWidget_LongTapInfo ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsIWidget_LongTapInfo ) ) . mPointerId as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( nsIWidget_LongTapInfo ) , "::" , stringify ! ( mPointerId ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsIWidget_LongTapInfo ) ) . mPosition as * const _ as usize } , 4usize , concat ! ( "Alignment of field: " , stringify ! ( nsIWidget_LongTapInfo ) , "::" , stringify ! ( mPosition ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsIWidget_LongTapInfo ) ) . mDuration as * const _ as usize } , 16usize , concat ! ( "Alignment of field: " , stringify ! ( nsIWidget_LongTapInfo ) , "::" , stringify ! ( mDuration ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsIWidget_LongTapInfo ) ) . mObserver as * const _ as usize } , 24usize , concat ! ( "Alignment of field: " , stringify ! ( nsIWidget_LongTapInfo ) , "::" , stringify ! ( mObserver ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsIWidget_LongTapInfo ) ) . mStamp as * const _ as usize } , 32usize , concat ! ( "Alignment of field: " , stringify ! ( nsIWidget_LongTapInfo ) , "::" , stringify ! ( mStamp ) ) ) ; } pub const ELEMENT_SHARED_RESTYLE_BIT_1 : root :: _bindgen_ty_79 = 8388608 ; pub const ELEMENT_SHARED_RESTYLE_BIT_2 : root :: _bindgen_ty_79 = 16777216 ; pub const ELEMENT_SHARED_RESTYLE_BIT_3 : root :: _bindgen_ty_79 = 33554432 ; pub const ELEMENT_SHARED_RESTYLE_BIT_4 : root :: _bindgen_ty_79 = 67108864 ; pub const ELEMENT_SHARED_RESTYLE_BITS : root :: _bindgen_ty_79 = 125829120 ; pub const ELEMENT_HAS_DIRTY_DESCENDANTS_FOR_SERVO : root :: _bindgen_ty_79 = 8388608 ; pub const ELEMENT_HAS_ANIMATION_ONLY_DIRTY_DESCENDANTS_FOR_SERVO : root :: _bindgen_ty_79 = 16777216 ; pub const ELEMENT_HAS_SNAPSHOT : root :: _bindgen_ty_79 = 33554432 ; pub const ELEMENT_HANDLED_SNAPSHOT : root :: _bindgen_ty_79 = 67108864 ; pub const ELEMENT_HAS_PENDING_RESTYLE : root :: _bindgen_ty_79 = 8388608 ; pub const ELEMENT_IS_POTENTIAL_RESTYLE_ROOT : root :: _bindgen_ty_79 = 16777216 ; pub const ELEMENT_HAS_PENDING_ANIMATION_ONLY_RESTYLE : root :: _bindgen_ty_79 = 33554432 ; pub const ELEMENT_IS_POTENTIAL_ANIMATION_ONLY_RESTYLE_ROOT : root :: _bindgen_ty_79 = 67108864 ; pub const ELEMENT_IS_CONDITIONAL_RESTYLE_ANCESTOR : root :: _bindgen_ty_79 = 134217728 ; pub const ELEMENT_HAS_CHILD_WITH_LATER_SIBLINGS_HINT : root :: _bindgen_ty_79 = 268435456 ; pub const ELEMENT_PENDING_RESTYLE_FLAGS : root :: _bindgen_ty_79 = 41943040 ; pub const ELEMENT_POTENTIAL_RESTYLE_ROOT_FLAGS : root :: _bindgen_ty_79 = 83886080 ; pub const ELEMENT_ALL_RESTYLE_FLAGS : root :: _bindgen_ty_79 = 260046848 ; pub const ELEMENT_TYPE_SPECIFIC_BITS_OFFSET : root :: _bindgen_ty_79 = 27 ; pub type _bindgen_ty_79 = :: std :: os :: raw :: c_uint ; pub type nsStyledElementBase = root :: mozilla :: dom :: Element ; # [ repr ( C ) ] pub struct nsStyledElement { pub _base : root :: nsStyledElementBase , } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct nsStyledElement_COMTypeInfo { pub _address : u8 , } # [ test ] fn bindgen_test_layout_nsStyledElement ( ) { assert_eq ! ( :: std :: mem :: size_of :: < nsStyledElement > ( ) , 120usize , concat ! ( "Size of: " , stringify ! ( nsStyledElement ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < nsStyledElement > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( nsStyledElement ) ) ) ; } pub type nsMappedAttributeElementBase = root :: nsStyledElement ; # [ repr ( C ) ] pub struct nsMappedAttributeElement { pub _base : root :: nsMappedAttributeElementBase , } # [ test ] fn bindgen_test_layout_nsMappedAttributeElement ( ) { assert_eq ! ( :: std :: mem :: size_of :: < nsMappedAttributeElement > ( ) , 120usize , concat ! ( "Size of: " , stringify ! ( nsMappedAttributeElement ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < nsMappedAttributeElement > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( nsMappedAttributeElement ) ) ) ; } 
+ /// The Name Space Manager tracks the association between a NameSpace
+    /// URI and the int32_t runtime id. Mappings between NameSpaces and
+    /// NameSpace prefixes are managed by nsINameSpaces.
+    ///
+    /// All NameSpace URIs are stored in a global table so that IDs are
+    /// consistent accross the app. NameSpace IDs are only consistent at runtime
+    /// ie: they are not guaranteed to be consistent accross app sessions.
+    ///
+    /// The nsNameSpaceManager needs to have a live reference for as long as
+    /// the NameSpace IDs are needed.
+    /// 
+ # [ repr ( C ) ] # [ derive ( Debug ) ] pub struct nsNameSpaceManager { pub _base : root :: nsIObserver , pub mRefCnt : root :: nsAutoRefCnt , pub mMathMLDisabled : bool , pub mSVGDisabled : bool , pub mURIToIDTable : [ u64 ; 4usize ] , pub mDisabledURIToIDTable : [ u64 ; 4usize ] , pub mURIArray : root :: nsTArray < root :: RefPtr < root :: nsAtom > > , } pub type nsNameSpaceManager_HasThreadSafeRefCnt = root :: mozilla :: FalseType ; extern "C" {
+ # [ link_name = "\u{1}_ZN18nsNameSpaceManager9sInstanceE" ] 
+ pub static mut  nsNameSpaceManager_sInstance  :  root :: mozilla :: StaticRefPtr < root :: nsNameSpaceManager > ;
+} # [ test ] fn bindgen_test_layout_nsNameSpaceManager ( ) { assert_eq ! ( :: std :: mem :: size_of :: < nsNameSpaceManager > ( ) , 96usize , concat ! ( "Size of: " , stringify ! ( nsNameSpaceManager ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < nsNameSpaceManager > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( nsNameSpaceManager ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsNameSpaceManager ) ) . mRefCnt as * const _ as usize } , 8usize , concat ! ( "Alignment of field: " , stringify ! ( nsNameSpaceManager ) , "::" , stringify ! ( mRefCnt ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsNameSpaceManager ) ) . mMathMLDisabled as * const _ as usize } , 16usize , concat ! ( "Alignment of field: " , stringify ! ( nsNameSpaceManager ) , "::" , stringify ! ( mMathMLDisabled ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsNameSpaceManager ) ) . mSVGDisabled as * const _ as usize } , 17usize , concat ! ( "Alignment of field: " , stringify ! ( nsNameSpaceManager ) , "::" , stringify ! ( mSVGDisabled ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsNameSpaceManager ) ) . mURIToIDTable as * const _ as usize } , 24usize , concat ! ( "Alignment of field: " , stringify ! ( nsNameSpaceManager ) , "::" , stringify ! ( mURIToIDTable ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsNameSpaceManager ) ) . mDisabledURIToIDTable as * const _ as usize } , 56usize , concat ! ( "Alignment of field: " , stringify ! ( nsNameSpaceManager ) , "::" , stringify ! ( mDisabledURIToIDTable ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsNameSpaceManager ) ) . mURIArray as * const _ as usize } , 88usize , concat ! ( "Alignment of field: " , stringify ! ( nsNameSpaceManager ) , "::" , stringify ! ( mURIArray ) ) ) ; } pub type nsGenericHTMLElementBase = root :: nsMappedAttributeElement ; 
+ /// A common superclass for HTML elements 
+ # [ repr ( C ) ] pub struct nsGenericHTMLElement { pub _base : root :: nsGenericHTMLElementBase , pub _base_1 : root :: nsIDOMHTMLElement , } pub type nsGenericHTMLElement_Element = root :: mozilla :: dom :: Element ; pub const nsGenericHTMLElement_PresContextFor_eForComposedDoc : root :: nsGenericHTMLElement_PresContextFor = 0 ; pub const nsGenericHTMLElement_PresContextFor_eForUncomposedDoc : root :: nsGenericHTMLElement_PresContextFor = 1 ; pub type nsGenericHTMLElement_PresContextFor = :: std :: os :: raw :: c_uint ; pub const nsGenericHTMLElement_ContentEditableTristate_eInherit : root :: nsGenericHTMLElement_ContentEditableTristate = -1 ; pub const nsGenericHTMLElement_ContentEditableTristate_eFalse : root :: nsGenericHTMLElement_ContentEditableTristate = 0 ; pub const nsGenericHTMLElement_ContentEditableTristate_eTrue : root :: nsGenericHTMLElement_ContentEditableTristate = 1 ; pub type nsGenericHTMLElement_ContentEditableTristate = :: std :: os :: raw :: c_int ; extern "C" {
+ # [ link_name = "\u{1}_ZN20nsGenericHTMLElement19sCommonAttributeMapE" ] 
+ pub static mut  nsGenericHTMLElement_sCommonAttributeMap  :  [ root :: mozilla :: dom :: Element_MappedAttributeEntry ; 0usize ] ;
+} extern "C" {
+ # [ link_name = "\u{1}_ZN20nsGenericHTMLElement28sImageMarginSizeAttributeMapE" ] 
+ pub static mut  nsGenericHTMLElement_sImageMarginSizeAttributeMap  :  [ root :: mozilla :: dom :: Element_MappedAttributeEntry ; 0usize ] ;
+} extern "C" {
+ # [ link_name = "\u{1}_ZN20nsGenericHTMLElement24sImageBorderAttributeMapE" ] 
+ pub static mut  nsGenericHTMLElement_sImageBorderAttributeMap  :  [ root :: mozilla :: dom :: Element_MappedAttributeEntry ; 0usize ] ;
+} extern "C" {
+ # [ link_name = "\u{1}_ZN20nsGenericHTMLElement23sImageAlignAttributeMapE" ] 
+ pub static mut  nsGenericHTMLElement_sImageAlignAttributeMap  :  [ root :: mozilla :: dom :: Element_MappedAttributeEntry ; 0usize ] ;
+} extern "C" {
+ # [ link_name = "\u{1}_ZN20nsGenericHTMLElement21sDivAlignAttributeMapE" ] 
+ pub static mut  nsGenericHTMLElement_sDivAlignAttributeMap  :  [ root :: mozilla :: dom :: Element_MappedAttributeEntry ; 0usize ] ;
+} extern "C" {
+ # [ link_name = "\u{1}_ZN20nsGenericHTMLElement23sBackgroundAttributeMapE" ] 
+ pub static mut  nsGenericHTMLElement_sBackgroundAttributeMap  :  [ root :: mozilla :: dom :: Element_MappedAttributeEntry ; 0usize ] ;
+} extern "C" {
+ # [ link_name = "\u{1}_ZN20nsGenericHTMLElement28sBackgroundColorAttributeMapE" ] 
+ pub static mut  nsGenericHTMLElement_sBackgroundColorAttributeMap  :  [ root :: mozilla :: dom :: Element_MappedAttributeEntry ; 0usize ] ;
+} # [ test ] fn bindgen_test_layout_nsGenericHTMLElement ( ) { assert_eq ! ( :: std :: mem :: size_of :: < nsGenericHTMLElement > ( ) , 128usize , concat ! ( "Size of: " , stringify ! ( nsGenericHTMLElement ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < nsGenericHTMLElement > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( nsGenericHTMLElement ) ) ) ; } 
+ /// Utility class to provide scaling defined in a keySplines element. 
+ # [ repr ( C ) ] # [ derive ( Debug , Copy ) ] pub struct nsSMILKeySpline { pub mX1 : f64 , pub mY1 : f64 , pub mX2 : f64 , pub mY2 : f64 , pub mSampleValues : [ f64 ; 11usize ] , } pub const nsSMILKeySpline_kSplineTableSize : root :: nsSMILKeySpline__bindgen_ty_1 = 11 ; pub type nsSMILKeySpline__bindgen_ty_1 = :: std :: os :: raw :: c_uint ; extern "C" {
+ # [ link_name = "\u{1}_ZN15nsSMILKeySpline15kSampleStepSizeE" ] 
+ pub static mut  nsSMILKeySpline_kSampleStepSize  :  f64 ;
+} # [ test ] fn bindgen_test_layout_nsSMILKeySpline ( ) { assert_eq ! ( :: std :: mem :: size_of :: < nsSMILKeySpline > ( ) , 120usize , concat ! ( "Size of: " , stringify ! ( nsSMILKeySpline ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < nsSMILKeySpline > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( nsSMILKeySpline ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsSMILKeySpline ) ) . mX1 as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( nsSMILKeySpline ) , "::" , stringify ! ( mX1 ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsSMILKeySpline ) ) . mY1 as * const _ as usize } , 8usize , concat ! ( "Alignment of field: " , stringify ! ( nsSMILKeySpline ) , "::" , stringify ! ( mY1 ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsSMILKeySpline ) ) . mX2 as * const _ as usize } , 16usize , concat ! ( "Alignment of field: " , stringify ! ( nsSMILKeySpline ) , "::" , stringify ! ( mX2 ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsSMILKeySpline ) ) . mY2 as * const _ as usize } , 24usize , concat ! ( "Alignment of field: " , stringify ! ( nsSMILKeySpline ) , "::" , stringify ! ( mY2 ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsSMILKeySpline ) ) . mSampleValues as * const _ as usize } , 32usize , concat ! ( "Alignment of field: " , stringify ! ( nsSMILKeySpline ) , "::" , stringify ! ( mSampleValues ) ) ) ; } impl Clone for nsSMILKeySpline { fn clone ( & self ) -> Self { * self } } pub const GECKO_IS_NIGHTLY : bool = true ; # [ repr ( C ) ] # [ derive ( Debug , Copy ) ] pub struct ServoBundledURI { pub mURLString : * const u8 , pub mURLStringLength : u32 , pub mExtraData : * mut root :: mozilla :: URLExtraData , } # [ test ] fn bindgen_test_layout_ServoBundledURI ( ) { assert_eq ! ( :: std :: mem :: size_of :: < ServoBundledURI > ( ) , 24usize , concat ! ( "Size of: " , stringify ! ( ServoBundledURI ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < ServoBundledURI > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( ServoBundledURI ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const ServoBundledURI ) ) . mURLString as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( ServoBundledURI ) , "::" , stringify ! ( mURLString ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const ServoBundledURI ) ) . mURLStringLength as * const _ as usize } , 8usize , concat ! ( "Alignment of field: " , stringify ! ( ServoBundledURI ) , "::" , stringify ! ( mURLStringLength ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const ServoBundledURI ) ) . mExtraData as * const _ as usize } , 16usize , concat ! ( "Alignment of field: " , stringify ! ( ServoBundledURI ) , "::" , stringify ! ( mExtraData ) ) ) ; } impl Clone for ServoBundledURI { fn clone ( & self ) -> Self { * self } } # [ repr ( C ) ] # [ derive ( Debug , Copy ) ] pub struct FontSizePrefs { pub mDefaultVariableSize : root :: nscoord , pub mDefaultFixedSize : root :: nscoord , pub mDefaultSerifSize : root :: nscoord , pub mDefaultSansSerifSize : root :: nscoord , pub mDefaultMonospaceSize : root :: nscoord , pub mDefaultCursiveSize : root :: nscoord , pub mDefaultFantasySize : root :: nscoord , } # [ test ] fn bindgen_test_layout_FontSizePrefs ( ) { assert_eq ! ( :: std :: mem :: size_of :: < FontSizePrefs > ( ) , 28usize , concat ! ( "Size of: " , stringify ! ( FontSizePrefs ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < FontSizePrefs > ( ) , 4usize , concat ! ( "Alignment of " , stringify ! ( FontSizePrefs ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const FontSizePrefs ) ) . mDefaultVariableSize as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( FontSizePrefs ) , "::" , stringify ! ( mDefaultVariableSize ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const FontSizePrefs ) ) . mDefaultFixedSize as * const _ as usize } , 4usize , concat ! ( "Alignment of field: " , stringify ! ( FontSizePrefs ) , "::" , stringify ! ( mDefaultFixedSize ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const FontSizePrefs ) ) . mDefaultSerifSize as * const _ as usize } , 8usize , concat ! ( "Alignment of field: " , stringify ! ( FontSizePrefs ) , "::" , stringify ! ( mDefaultSerifSize ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const FontSizePrefs ) ) . mDefaultSansSerifSize as * const _ as usize } , 12usize , concat ! ( "Alignment of field: " , stringify ! ( FontSizePrefs ) , "::" , stringify ! ( mDefaultSansSerifSize ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const FontSizePrefs ) ) . mDefaultMonospaceSize as * const _ as usize } , 16usize , concat ! ( "Alignment of field: " , stringify ! ( FontSizePrefs ) , "::" , stringify ! ( mDefaultMonospaceSize ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const FontSizePrefs ) ) . mDefaultCursiveSize as * const _ as usize } , 20usize , concat ! ( "Alignment of field: " , stringify ! ( FontSizePrefs ) , "::" , stringify ! ( mDefaultCursiveSize ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const FontSizePrefs ) ) . mDefaultFantasySize as * const _ as usize } , 24usize , concat ! ( "Alignment of field: " , stringify ! ( FontSizePrefs ) , "::" , stringify ! ( mDefaultFantasySize ) ) ) ; } impl Clone for FontSizePrefs { fn clone ( & self ) -> Self { * self } } # [ repr ( C ) ] # [ derive ( Debug , Copy ) ] pub struct GeckoFontMetrics { pub mChSize : root :: nscoord , pub mXSize : root :: nscoord , } # [ test ] fn bindgen_test_layout_GeckoFontMetrics ( ) { assert_eq ! ( :: std :: mem :: size_of :: < GeckoFontMetrics > ( ) , 8usize , concat ! ( "Size of: " , stringify ! ( GeckoFontMetrics ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < GeckoFontMetrics > ( ) , 4usize , concat ! ( "Alignment of " , stringify ! ( GeckoFontMetrics ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const GeckoFontMetrics ) ) . mChSize as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( GeckoFontMetrics ) , "::" , stringify ! ( mChSize ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const GeckoFontMetrics ) ) . mXSize as * const _ as usize } , 4usize , concat ! ( "Alignment of field: " , stringify ! ( GeckoFontMetrics ) , "::" , stringify ! ( mXSize ) ) ) ; } impl Clone for GeckoFontMetrics { fn clone ( & self ) -> Self { * self } } pub const SERVO_CSS_PSEUDO_ELEMENT_FLAGS_after : u32 = 65 ; pub const SERVO_CSS_PSEUDO_ELEMENT_FLAGS_before : u32 = 65 ; pub const SERVO_CSS_PSEUDO_ELEMENT_FLAGS_backdrop : u32 = 0 ; pub const SERVO_CSS_PSEUDO_ELEMENT_FLAGS_cue : u32 = 36 ; pub const SERVO_CSS_PSEUDO_ELEMENT_FLAGS_firstLetter : u32 = 3 ; pub const SERVO_CSS_PSEUDO_ELEMENT_FLAGS_firstLine : u32 = 3 ; pub const SERVO_CSS_PSEUDO_ELEMENT_FLAGS_mozSelection : u32 = 2 ; pub const SERVO_CSS_PSEUDO_ELEMENT_FLAGS_mozFocusInner : u32 = 0 ; pub const SERVO_CSS_PSEUDO_ELEMENT_FLAGS_mozFocusOuter : u32 = 0 ; pub const SERVO_CSS_PSEUDO_ELEMENT_FLAGS_mozListBullet : u32 = 0 ; pub const SERVO_CSS_PSEUDO_ELEMENT_FLAGS_mozListNumber : u32 = 0 ; pub const SERVO_CSS_PSEUDO_ELEMENT_FLAGS_mozMathAnonymous : u32 = 0 ; pub const SERVO_CSS_PSEUDO_ELEMENT_FLAGS_mozNumberWrapper : u32 = 24 ; pub const SERVO_CSS_PSEUDO_ELEMENT_FLAGS_mozNumberText : u32 = 24 ; pub const SERVO_CSS_PSEUDO_ELEMENT_FLAGS_mozNumberSpinBox : u32 = 24 ; pub const SERVO_CSS_PSEUDO_ELEMENT_FLAGS_mozNumberSpinUp : u32 = 24 ; pub const SERVO_CSS_PSEUDO_ELEMENT_FLAGS_mozNumberSpinDown : u32 = 24 ; pub const SERVO_CSS_PSEUDO_ELEMENT_FLAGS_mozProgressBar : u32 = 8 ; pub const SERVO_CSS_PSEUDO_ELEMENT_FLAGS_mozRangeTrack : u32 = 8 ; pub const SERVO_CSS_PSEUDO_ELEMENT_FLAGS_mozRangeProgress : u32 = 8 ; pub const SERVO_CSS_PSEUDO_ELEMENT_FLAGS_mozRangeThumb : u32 = 8 ; pub const SERVO_CSS_PSEUDO_ELEMENT_FLAGS_mozMeterBar : u32 = 8 ; pub const SERVO_CSS_PSEUDO_ELEMENT_FLAGS_mozPlaceholder : u32 = 8 ; pub const SERVO_CSS_PSEUDO_ELEMENT_FLAGS_placeholder : u32 = 8 ; pub const SERVO_CSS_PSEUDO_ELEMENT_FLAGS_mozColorSwatch : u32 = 12 ; # [ repr ( C ) ] # [ derive ( Debug , Copy ) ] pub struct nsIDOMMediaList { pub _base : root :: nsISupports , } # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct nsIDOMMediaList_COMTypeInfo { pub _address : u8 , } # [ test ] fn bindgen_test_layout_nsIDOMMediaList ( ) { assert_eq ! ( :: std :: mem :: size_of :: < nsIDOMMediaList > ( ) , 8usize , concat ! ( "Size of: " , stringify ! ( nsIDOMMediaList ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < nsIDOMMediaList > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( nsIDOMMediaList ) ) ) ; } impl Clone for nsIDOMMediaList { fn clone ( & self ) -> Self { * self } } pub type nsCSSAnonBoxes_NonInheritingBase = u8 ; pub const nsCSSAnonBoxes_NonInheriting_oofPlaceholder : root :: nsCSSAnonBoxes_NonInheriting = 0 ; pub const nsCSSAnonBoxes_NonInheriting_horizontalFramesetBorder : root :: nsCSSAnonBoxes_NonInheriting = 1 ; pub const nsCSSAnonBoxes_NonInheriting_verticalFramesetBorder : root :: nsCSSAnonBoxes_NonInheriting = 2 ; pub const nsCSSAnonBoxes_NonInheriting_framesetBlank : root :: nsCSSAnonBoxes_NonInheriting = 3 ; pub const nsCSSAnonBoxes_NonInheriting_tableColGroup : root :: nsCSSAnonBoxes_NonInheriting = 4 ; pub const nsCSSAnonBoxes_NonInheriting_tableCol : root :: nsCSSAnonBoxes_NonInheriting = 5 ; pub const nsCSSAnonBoxes_NonInheriting_pageBreak : root :: nsCSSAnonBoxes_NonInheriting = 6 ; pub const nsCSSAnonBoxes_NonInheriting__Count : root :: nsCSSAnonBoxes_NonInheriting = 7 ; pub type nsCSSAnonBoxes_NonInheriting = root :: nsCSSAnonBoxes_NonInheritingBase ; 
  /// templated hashtable class maps keys to interface pointers.
     /// See nsBaseHashtable for complete declaration.
     /// @param KeyClass a wrapper-class for the hashtable key, see nsHashKeys.h
     /// for a complete specification.
     /// @param Interface the interface-type being wrapped
     /// @see nsDataHashtable, nsClassHashtable 
  # [ repr ( C ) ] # [ derive ( Debug , Copy , Clone ) ] pub struct nsInterfaceHashtable { pub _address : u8 , } pub type nsInterfaceHashtable_KeyType = [ u8 ; 0usize ] ; pub type nsInterfaceHashtable_UserDataType < Interface > = * mut Interface ; pub type nsInterfaceHashtable_base_type = u8 ; pub type nsBindingList = root :: nsTArray < root :: RefPtr < root :: nsXBLBinding > > ; # [ repr ( C ) ] pub struct nsBindingManager { pub _base : root :: nsStubMutationObserver , pub mRefCnt : root :: nsCycleCollectingAutoRefCnt , pub mBoundContentSet : u64 , pub mWrapperTable : root :: nsAutoPtr < root :: nsBindingManager_WrapperHashtable > , pub mDocumentTable : u64 , pub mLoadingDocTable : u64 , pub mAttachedStack : root :: nsBindingList , pub mProcessingAttachedStack : bool , pub mDestroyed : bool , pub mAttachedStackSizeOnOutermost : u32 , pub mProcessAttachedQueueEvent : u64 , pub mDocument : * mut root :: nsIDocument , } pub type nsBindingManager_HasThreadSafeRefCnt = root :: mozilla :: FalseType ; pub const nsBindingManager_DestructorHandling_eRunDtor : root :: nsBindingManager_DestructorHandling = 0 ; pub const nsBindingManager_DestructorHandling_eDoNotRunDtor : root :: nsBindingManager_DestructorHandling = 1 ; pub type nsBindingManager_DestructorHandling = :: std :: os :: raw :: c_uint ; # [ repr ( C ) ] # [ derive ( Debug , Copy ) ] pub struct nsBindingManager_cycleCollection { pub _base : root :: nsXPCOMCycleCollectionParticipant , } # [ test ] fn bindgen_test_layout_nsBindingManager_cycleCollection ( ) { assert_eq ! ( :: std :: mem :: size_of :: < nsBindingManager_cycleCollection > ( ) , 16usize , concat ! ( "Size of: " , stringify ! ( nsBindingManager_cycleCollection ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < nsBindingManager_cycleCollection > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( nsBindingManager_cycleCollection ) ) ) ; } impl Clone for nsBindingManager_cycleCollection { fn clone ( & self ) -> Self { * self } } pub type nsBindingManager_BoundContentBindingCallback = root :: std :: function ; pub type nsBindingManager_WrapperHashtable = u8 ; extern "C" {
  # [ link_name = "\u{1}_ZN16nsBindingManager21_cycleCollectorGlobalE" ] 
@@ -1985,27 +2026,12 @@ pub type ServoStyleContextStrong = ::gec
  # [ link_name = "\u{1}_ZN14nsContentUtils18sPopupControlStateE" ] 
  pub static mut  nsContentUtils_sPopupControlState  :  root :: PopupControlState ;
 } extern "C" {
  # [ link_name = "\u{1}_ZN14nsContentUtils24sInnerOrOuterWindowCountE" ] 
  pub static mut  nsContentUtils_sInnerOrOuterWindowCount  :  i32 ;
 } extern "C" {
  # [ link_name = "\u{1}_ZN14nsContentUtils32sInnerOrOuterWindowSerialCounterE" ] 
  pub static mut  nsContentUtils_sInnerOrOuterWindowSerialCounter  :  u32 ;
-} 
- /// The Name Space Manager tracks the association between a NameSpace
-    /// URI and the int32_t runtime id. Mappings between NameSpaces and
-    /// NameSpace prefixes are managed by nsINameSpaces.
-    ///
-    /// All NameSpace URIs are stored in a global table so that IDs are
-    /// consistent accross the app. NameSpace IDs are only consistent at runtime
-    /// ie: they are not guaranteed to be consistent accross app sessions.
-    ///
-    /// The nsNameSpaceManager needs to have a live reference for as long as
-    /// the NameSpace IDs are needed.
-    /// 
- # [ repr ( C ) ] # [ derive ( Debug ) ] pub struct nsNameSpaceManager { pub _base : root :: nsIObserver , pub mRefCnt : root :: nsAutoRefCnt , pub mMathMLDisabled : bool , pub mSVGDisabled : bool , pub mURIToIDTable : [ u64 ; 4usize ] , pub mDisabledURIToIDTable : [ u64 ; 4usize ] , pub mURIArray : root :: nsTArray < root :: RefPtr < root :: nsAtom > > , } pub type nsNameSpaceManager_HasThreadSafeRefCnt = root :: mozilla :: FalseType ; extern "C" {
- # [ link_name = "\u{1}_ZN18nsNameSpaceManager9sInstanceE" ] 
- pub static mut  nsNameSpaceManager_sInstance  :  root :: mozilla :: StaticRefPtr < root :: nsNameSpaceManager > ;
-} # [ test ] fn bindgen_test_layout_nsNameSpaceManager ( ) { assert_eq ! ( :: std :: mem :: size_of :: < nsNameSpaceManager > ( ) , 96usize , concat ! ( "Size of: " , stringify ! ( nsNameSpaceManager ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < nsNameSpaceManager > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( nsNameSpaceManager ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsNameSpaceManager ) ) . mRefCnt as * const _ as usize } , 8usize , concat ! ( "Alignment of field: " , stringify ! ( nsNameSpaceManager ) , "::" , stringify ! ( mRefCnt ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsNameSpaceManager ) ) . mMathMLDisabled as * const _ as usize } , 16usize , concat ! ( "Alignment of field: " , stringify ! ( nsNameSpaceManager ) , "::" , stringify ! ( mMathMLDisabled ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsNameSpaceManager ) ) . mSVGDisabled as * const _ as usize } , 17usize , concat ! ( "Alignment of field: " , stringify ! ( nsNameSpaceManager ) , "::" , stringify ! ( mSVGDisabled ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsNameSpaceManager ) ) . mURIToIDTable as * const _ as usize } , 24usize , concat ! ( "Alignment of field: " , stringify ! ( nsNameSpaceManager ) , "::" , stringify ! ( mURIToIDTable ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsNameSpaceManager ) ) . mDisabledURIToIDTable as * const _ as usize } , 56usize , concat ! ( "Alignment of field: " , stringify ! ( nsNameSpaceManager ) , "::" , stringify ! ( mDisabledURIToIDTable ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsNameSpaceManager ) ) . mURIArray as * const _ as usize } , 88usize , concat ! ( "Alignment of field: " , stringify ! ( nsNameSpaceManager ) , "::" , stringify ! ( mURIArray ) ) ) ; } pub type nsMediaFeatureValueGetter = :: std :: option :: Option < unsafe extern "C" fn ( aPresContext : * mut root :: nsPresContext , aFeature : * const root :: nsMediaFeature , aResult : * mut root :: nsCSSValue ) > ; # [ repr ( C ) ] # [ derive ( Debug , Copy ) ] pub struct nsMediaFeature { pub mName : * mut * mut root :: nsStaticAtom , pub mRangeType : root :: nsMediaFeature_RangeType , pub mValueType : root :: nsMediaFeature_ValueType , pub mReqFlags : u8 , pub mData : root :: nsMediaFeature__bindgen_ty_1 , pub mGetter : root :: nsMediaFeatureValueGetter , } # [ repr ( u32 ) ] # [ derive ( Debug , Copy , Clone , PartialEq , Eq , Hash ) ] pub enum nsMediaFeature_RangeType { eMinMaxAllowed = 0 , eMinMaxNotAllowed = 1 , } # [ repr ( u32 ) ] # [ derive ( Debug , Copy , Clone , PartialEq , Eq , Hash ) ] pub enum nsMediaFeature_ValueType { eLength = 0 , eInteger = 1 , eFloat = 2 , eBoolInteger = 3 , eIntRatio = 4 , eResolution = 5 , eEnumerated = 6 , eIdent = 7 , } pub const nsMediaFeature_RequirementFlags_eNoRequirements : root :: nsMediaFeature_RequirementFlags = 0 ; pub const nsMediaFeature_RequirementFlags_eHasWebkitPrefix : root :: nsMediaFeature_RequirementFlags = 1 ; pub const nsMediaFeature_RequirementFlags_eWebkitDevicePixelRatioPrefEnabled : root :: nsMediaFeature_RequirementFlags = 2 ; pub const nsMediaFeature_RequirementFlags_eUserAgentAndChromeOnly : root :: nsMediaFeature_RequirementFlags = 4 ; pub type nsMediaFeature_RequirementFlags = u8 ; # [ repr ( C ) ] # [ derive ( Debug , Copy ) ] pub struct nsMediaFeature__bindgen_ty_1 { pub mInitializer_ : root :: __BindgenUnionField < * const :: std :: os :: raw :: c_void > , pub mKeywordTable : root :: __BindgenUnionField < * const root :: nsCSSProps_KTableEntry > , pub mMetric : root :: __BindgenUnionField < * const * const root :: nsAtom > , pub bindgen_union_field : u64 , } # [ test ] fn bindgen_test_layout_nsMediaFeature__bindgen_ty_1 ( ) { assert_eq ! ( :: std :: mem :: size_of :: < nsMediaFeature__bindgen_ty_1 > ( ) , 8usize , concat ! ( "Size of: " , stringify ! ( nsMediaFeature__bindgen_ty_1 ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < nsMediaFeature__bindgen_ty_1 > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( nsMediaFeature__bindgen_ty_1 ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsMediaFeature__bindgen_ty_1 ) ) . mInitializer_ as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( nsMediaFeature__bindgen_ty_1 ) , "::" , stringify ! ( mInitializer_ ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsMediaFeature__bindgen_ty_1 ) ) . mKeywordTable as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( nsMediaFeature__bindgen_ty_1 ) , "::" , stringify ! ( mKeywordTable ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsMediaFeature__bindgen_ty_1 ) ) . mMetric as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( nsMediaFeature__bindgen_ty_1 ) , "::" , stringify ! ( mMetric ) ) ) ; } impl Clone for nsMediaFeature__bindgen_ty_1 { fn clone ( & self ) -> Self { * self } } # [ test ] fn bindgen_test_layout_nsMediaFeature ( ) { assert_eq ! ( :: std :: mem :: size_of :: < nsMediaFeature > ( ) , 40usize , concat ! ( "Size of: " , stringify ! ( nsMediaFeature ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < nsMediaFeature > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( nsMediaFeature ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsMediaFeature ) ) . mName as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( nsMediaFeature ) , "::" , stringify ! ( mName ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsMediaFeature ) ) . mRangeType as * const _ as usize } , 8usize , concat ! ( "Alignment of field: " , stringify ! ( nsMediaFeature ) , "::" , stringify ! ( mRangeType ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsMediaFeature ) ) . mValueType as * const _ as usize } , 12usize , concat ! ( "Alignment of field: " , stringify ! ( nsMediaFeature ) , "::" , stringify ! ( mValueType ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsMediaFeature ) ) . mReqFlags as * const _ as usize } , 16usize , concat ! ( "Alignment of field: " , stringify ! ( nsMediaFeature ) , "::" , stringify ! ( mReqFlags ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsMediaFeature ) ) . mData as * const _ as usize } , 24usize , concat ! ( "Alignment of field: " , stringify ! ( nsMediaFeature ) , "::" , stringify ! ( mData ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsMediaFeature ) ) . mGetter as * const _ as usize } , 32usize , concat ! ( "Alignment of field: " , stringify ! ( nsMediaFeature ) , "::" , stringify ! ( mGetter ) ) ) ; } impl Clone for nsMediaFeature { fn clone ( & self ) -> Self { * self } } # [ repr ( C ) ] # [ derive ( Debug , Copy ) ] pub struct nsMediaFeatures { pub _address : u8 , } extern "C" {
+} pub type nsMediaFeatureValueGetter = :: std :: option :: Option < unsafe extern "C" fn ( aPresContext : * mut root :: nsPresContext , aFeature : * const root :: nsMediaFeature , aResult : * mut root :: nsCSSValue ) > ; # [ repr ( C ) ] # [ derive ( Debug , Copy ) ] pub struct nsMediaFeature { pub mName : * mut * mut root :: nsStaticAtom , pub mRangeType : root :: nsMediaFeature_RangeType , pub mValueType : root :: nsMediaFeature_ValueType , pub mReqFlags : u8 , pub mData : root :: nsMediaFeature__bindgen_ty_1 , pub mGetter : root :: nsMediaFeatureValueGetter , } # [ repr ( u32 ) ] # [ derive ( Debug , Copy , Clone , PartialEq , Eq , Hash ) ] pub enum nsMediaFeature_RangeType { eMinMaxAllowed = 0 , eMinMaxNotAllowed = 1 , } # [ repr ( u32 ) ] # [ derive ( Debug , Copy , Clone , PartialEq , Eq , Hash ) ] pub enum nsMediaFeature_ValueType { eLength = 0 , eInteger = 1 , eFloat = 2 , eBoolInteger = 3 , eIntRatio = 4 , eResolution = 5 , eEnumerated = 6 , eIdent = 7 , } pub const nsMediaFeature_RequirementFlags_eNoRequirements : root :: nsMediaFeature_RequirementFlags = 0 ; pub const nsMediaFeature_RequirementFlags_eHasWebkitPrefix : root :: nsMediaFeature_RequirementFlags = 1 ; pub const nsMediaFeature_RequirementFlags_eWebkitDevicePixelRatioPrefEnabled : root :: nsMediaFeature_RequirementFlags = 2 ; pub const nsMediaFeature_RequirementFlags_eUserAgentAndChromeOnly : root :: nsMediaFeature_RequirementFlags = 4 ; pub type nsMediaFeature_RequirementFlags = u8 ; # [ repr ( C ) ] # [ derive ( Debug , Copy ) ] pub struct nsMediaFeature__bindgen_ty_1 { pub mInitializer_ : root :: __BindgenUnionField < * const :: std :: os :: raw :: c_void > , pub mKeywordTable : root :: __BindgenUnionField < * const root :: nsCSSProps_KTableEntry > , pub mMetric : root :: __BindgenUnionField < * const * const root :: nsAtom > , pub bindgen_union_field : u64 , } # [ test ] fn bindgen_test_layout_nsMediaFeature__bindgen_ty_1 ( ) { assert_eq ! ( :: std :: mem :: size_of :: < nsMediaFeature__bindgen_ty_1 > ( ) , 8usize , concat ! ( "Size of: " , stringify ! ( nsMediaFeature__bindgen_ty_1 ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < nsMediaFeature__bindgen_ty_1 > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( nsMediaFeature__bindgen_ty_1 ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsMediaFeature__bindgen_ty_1 ) ) . mInitializer_ as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( nsMediaFeature__bindgen_ty_1 ) , "::" , stringify ! ( mInitializer_ ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsMediaFeature__bindgen_ty_1 ) ) . mKeywordTable as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( nsMediaFeature__bindgen_ty_1 ) , "::" , stringify ! ( mKeywordTable ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsMediaFeature__bindgen_ty_1 ) ) . mMetric as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( nsMediaFeature__bindgen_ty_1 ) , "::" , stringify ! ( mMetric ) ) ) ; } impl Clone for nsMediaFeature__bindgen_ty_1 { fn clone ( & self ) -> Self { * self } } # [ test ] fn bindgen_test_layout_nsMediaFeature ( ) { assert_eq ! ( :: std :: mem :: size_of :: < nsMediaFeature > ( ) , 40usize , concat ! ( "Size of: " , stringify ! ( nsMediaFeature ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < nsMediaFeature > ( ) , 8usize , concat ! ( "Alignment of " , stringify ! ( nsMediaFeature ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsMediaFeature ) ) . mName as * const _ as usize } , 0usize , concat ! ( "Alignment of field: " , stringify ! ( nsMediaFeature ) , "::" , stringify ! ( mName ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsMediaFeature ) ) . mRangeType as * const _ as usize } , 8usize , concat ! ( "Alignment of field: " , stringify ! ( nsMediaFeature ) , "::" , stringify ! ( mRangeType ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsMediaFeature ) ) . mValueType as * const _ as usize } , 12usize , concat ! ( "Alignment of field: " , stringify ! ( nsMediaFeature ) , "::" , stringify ! ( mValueType ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsMediaFeature ) ) . mReqFlags as * const _ as usize } , 16usize , concat ! ( "Alignment of field: " , stringify ! ( nsMediaFeature ) , "::" , stringify ! ( mReqFlags ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsMediaFeature ) ) . mData as * const _ as usize } , 24usize , concat ! ( "Alignment of field: " , stringify ! ( nsMediaFeature ) , "::" , stringify ! ( mData ) ) ) ; assert_eq ! ( unsafe { & ( * ( 0 as * const nsMediaFeature ) ) . mGetter as * const _ as usize } , 32usize , concat ! ( "Alignment of field: " , stringify ! ( nsMediaFeature ) , "::" , stringify ! ( mGetter ) ) ) ; } impl Clone for nsMediaFeature { fn clone ( & self ) -> Self { * self } } # [ repr ( C ) ] # [ derive ( Debug , Copy ) ] pub struct nsMediaFeatures { pub _address : u8 , } extern "C" {
  # [ link_name = "\u{1}_ZN15nsMediaFeatures8featuresE" ] 
  pub static mut  nsMediaFeatures_features  :  [ root :: nsMediaFeature ; 0usize ] ;
-} # [ test ] fn bindgen_test_layout_nsMediaFeatures ( ) { assert_eq ! ( :: std :: mem :: size_of :: < nsMediaFeatures > ( ) , 1usize , concat ! ( "Size of: " , stringify ! ( nsMediaFeatures ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < nsMediaFeatures > ( ) , 1usize , concat ! ( "Alignment of " , stringify ! ( nsMediaFeatures ) ) ) ; } impl Clone for nsMediaFeatures { fn clone ( & self ) -> Self { * self } } # [ test ] fn __bindgen_test_layout_nsTSubstring_open0_char16_t_close0_instantiation ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: nsTSubstring < u16 > > ( ) , 16usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: nsTSubstring < u16 > ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: nsTSubstring < u16 > > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: nsTSubstring < u16 > ) ) ) ; } # [ test ] fn __bindgen_test_layout_nsTString_open0_char16_t_close0_instantiation ( ) { assert_eq ! ( :: std :: mem :: size_of :: < ::nsstring::nsStringRepr > ( ) , 16usize , concat ! ( "Size of template specialization: " , stringify ! ( ::nsstring::nsStringRepr ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < ::nsstring::nsStringRepr > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( ::nsstring::nsStringRepr ) ) ) ; } # [ test ] fn __bindgen_test_layout_nsTSubstring_open0_char_close0_instantiation ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: nsTSubstring < :: std :: os :: raw :: c_char > > ( ) , 16usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: nsTSubstring < :: std :: os :: raw :: c_char > ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: nsTSubstring < :: std :: os :: raw :: c_char > > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: nsTSubstring < :: std :: os :: raw :: c_char > ) ) ) ; } # [ test ] fn __bindgen_test_layout_nsTString_open0_char_close0_instantiation ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: nsTString < :: std :: os :: raw :: c_char > > ( ) , 16usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: nsTString < :: std :: os :: raw :: c_char > ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: nsTString < :: std :: os :: raw :: c_char > > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: nsTString < :: std :: os :: raw :: c_char > ) ) ) ; } # [ test ] fn __bindgen_test_layout_nsCOMPtr_open0_nsISupports_close0_instantiation ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: nsCOMPtr > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: nsCOMPtr ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: nsCOMPtr > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: nsCOMPtr ) ) ) ; } # [ test ] fn __bindgen_test_layout_nsTArray_open0_CSSVariableValues_Variable_close0_instantiation ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: nsTArray < root :: mozilla :: CSSVariableValues_Variable > > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: nsTArray < root :: mozilla :: CSSVariableValues_Variable > ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: nsTArray < root :: mozilla :: CSSVariableValues_Variable > > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: nsTArray < root :: mozilla :: CSSVariableValues_Variable > ) ) ) ; } # [ test ] fn __bindgen_test_layout_nsTArray_open0_FontFamilyName_close0_instantiation ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: nsTArray < root :: mozilla :: FontFamilyName > > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: nsTArray < root :: mozilla :: FontFamilyName > ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: nsTArray < root :: mozilla :: FontFamilyName > > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: nsTArray < root :: mozilla :: FontFamilyName > ) ) ) ; } # [ test ] fn __bindgen_test_layout_NotNull_open0_RefPtr_open1_SharedFontList_close1_close0_instantiation ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: mozilla :: NotNull < root :: RefPtr < root :: mozilla :: SharedFontList > > > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: mozilla :: NotNull < root :: RefPtr < root :: mozilla :: SharedFontList > > ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: mozilla :: NotNull < root :: RefPtr < root :: mozilla :: SharedFontList > > > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: mozilla :: NotNull < root :: RefPtr < root :: mozilla :: SharedFontList > > ) ) ) ; } # [ test ] fn __bindgen_test_layout_RefPtr_open0_SharedFontList_close0_instantiation ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: RefPtr < root :: mozilla :: SharedFontList > > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: RefPtr < root :: mozilla :: SharedFontList > ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: RefPtr < root :: mozilla :: SharedFontList > > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: RefPtr < root :: mozilla :: SharedFontList > ) ) ) ; } # [ test ] fn __bindgen_test_layout_nsTArray_open0_uint32_t_close0_instantiation ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: nsTArray < u32 > > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: nsTArray < u32 > ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: nsTArray < u32 > > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: nsTArray < u32 > ) ) ) ; } # [ test ] fn __bindgen_test_layout_nsTArray_open0_gfxFontFeatureValueSet_ValueList_close0_instantiation ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: nsTArray < root :: gfxFontFeatureValueSet_ValueList > > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: nsTArray < root :: gfxFontFeatureValueSet_ValueList > ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: nsTArray < root :: gfxFontFeatureValueSet_ValueList > > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: nsTArray < root :: gfxFontFeatureValueSet_ValueList > ) ) ) ; } # [ test ] fn __bindgen_test_layout_nsTArray_open0_uint32_t_close0_instantiation_1 ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: nsTArray < u32 > > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: nsTArray < u32 > ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: nsTArray < u32 > > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: nsTArray < u32 > ) ) ) ; } # [ test ] fn __bindgen_test_layout_nsTArray_open0_gfxAlternateValue_close0_instantiation ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: nsTArray < root :: gfxAlternateValue > > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: nsTArray < root :: gfxAlternateValue > ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: nsTArray < root :: gfxAlternateValue > > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: nsTArray < root :: gfxAlternateValue > ) ) ) ; } # [ test ] fn __bindgen_test_layout_RefPtr_open0_gfxFontFeatureValueSet_close0_instantiation ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: RefPtr < root :: gfxFontFeatureValueSet > > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: RefPtr < root :: gfxFontFeatureValueSet > ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: RefPtr < root :: gfxFontFeatureValueSet > > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: RefPtr < root :: gfxFontFeatureValueSet > ) ) ) ; } # [ test ] fn __bindgen_test_layout_nsTArray_open0_gfxFontFeature_close0_instantiation ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: nsTArray < root :: gfxFontFeature > > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: nsTArray < root :: gfxFontFeature > ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: nsTArray < root :: gfxFontFeature > > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: nsTArray < root :: gfxFontFeature > ) ) ) ; } # [ test ] fn __bindgen_test_layout_nsTArray_open0_gfxFontVariation_close0_instantiation ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: nsTArray < root :: gfxFontVariation > > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: nsTArray < root :: gfxFontVariation > ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: nsTArray < root :: gfxFontVariation > > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: nsTArray < root :: gfxFontVariation > ) ) ) ; } # [ test ] fn __bindgen_test_layout_nsTArray_open0_RefPtr_open1_nsAtom_close1_close0_instantiation ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: nsTArray < root :: RefPtr < root :: nsAtom > > > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: nsTArray < root :: RefPtr < root :: nsAtom > > ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: nsTArray < root :: RefPtr < root :: nsAtom > > > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: nsTArray < root :: RefPtr < root :: nsAtom > > ) ) ) ; } # [ test ] fn __bindgen_test_layout_RefPtr_open0_nsAtom_close0_instantiation ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: RefPtr < root :: nsAtom > > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: RefPtr < root :: nsAtom > ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: RefPtr < root :: nsAtom > > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: RefPtr < root :: nsAtom > ) ) ) ; } # [ test ] fn __bindgen_test_layout_BaseTimeDuration_open0_TimeDurationValueCalculator_close0_instantiation ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: mozilla :: BaseTimeDuration > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: mozilla :: BaseTimeDuration ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: mozilla :: BaseTimeDuration > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: mozilla :: BaseTimeDuration ) ) ) ; } # [ test ] fn __bindgen_test_layout_UniquePtr_open0_JSErrorNotes_Note_DeletePolicy_open1_JSErrorNotes_Note_close1_close0_instantiation ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: mozilla :: UniquePtr < root :: JSErrorNotes_Note > > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: mozilla :: UniquePtr < root :: JSErrorNotes_Note > ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: mozilla :: UniquePtr < root :: JSErrorNotes_Note > > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: mozilla :: UniquePtr < root :: JSErrorNotes_Note > ) ) ) ; } # [ test ] fn __bindgen_test_layout_DeletePolicy_open0_JSErrorNotes_Note_close0_instantiation ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: JS :: DeletePolicy > ( ) , 1usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: JS :: DeletePolicy ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: JS :: DeletePolicy > ( ) , 1usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: JS :: DeletePolicy ) ) ) ; } # [ test ] fn __bindgen_test_layout_UniquePtr_open0_JSErrorNotes_DeletePolicy_open1_JSErrorNotes_close1_close0_instantiation ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: mozilla :: UniquePtr < root :: JSErrorNotes > > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: mozilla :: UniquePtr < root :: JSErrorNotes > ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: mozilla :: UniquePtr < root :: JSErrorNotes > > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: mozilla :: UniquePtr < root :: JSErrorNotes > ) ) ) ; } # [ test ] fn __bindgen_test_layout_DeletePolicy_open0_JSErrorNotes_close0_instantiation ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: JS :: DeletePolicy > ( ) , 1usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: JS :: DeletePolicy ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: JS :: DeletePolicy > ( ) , 1usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: JS :: DeletePolicy ) ) ) ; } # [ test ] fn __bindgen_test_layout_iterator_open0_input_iterator_tag_UniquePtr_open1_JSErrorNotes_Note_DeletePolicy_open2_JSErrorNotes_Note_close2_close1_long_ptr_UniquePtr_ref_UniquePtr_close0_instantiation ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: std :: iterator > ( ) , 1usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: std :: iterator ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: std :: iterator > ( ) , 1usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: std :: iterator ) ) ) ; } # [ test ] fn __bindgen_test_layout_UniquePtr_open0_JSErrorNotes_Note_DeletePolicy_open1_JSErrorNotes_Note_close1_close0_instantiation_1 ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: mozilla :: UniquePtr < root :: JSErrorNotes_Note > > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: mozilla :: UniquePtr < root :: JSErrorNotes_Note > ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: mozilla :: UniquePtr < root :: JSErrorNotes_Note > > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: mozilla :: UniquePtr < root :: JSErrorNotes_Note > ) ) ) ; } # [ test ] fn __bindgen_test_layout_DeletePolicy_open0_JSErrorNotes_Note_close0_instantiation_1 ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: JS :: DeletePolicy > ( ) , 1usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: JS :: DeletePolicy ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: JS :: DeletePolicy > ( ) , 1usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: JS :: DeletePolicy ) ) ) ; } # [ test ] fn __bindgen_test_layout_UniquePtr_open0_JSErrorNotes_Note_DeletePolicy_open1_JSErrorNotes_Note_close1_close0_instantiation_2 ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: mozilla :: UniquePtr < root :: JSErrorNotes_Note > > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: mozilla :: UniquePtr < root :: JSErrorNotes_Note > ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: mozilla :: UniquePtr < root :: JSErrorNotes_Note > > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: mozilla :: UniquePtr < root :: JSErrorNotes_Note > ) ) ) ; } # [ test ] fn __bindgen_test_layout_DeletePolicy_open0_JSErrorNotes_Note_close0_instantiation_2 ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: JS :: DeletePolicy > ( ) , 1usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: JS :: DeletePolicy ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: JS :: DeletePolicy > ( ) , 1usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: JS :: DeletePolicy ) ) ) ; } # [ test ] fn __bindgen_test_layout_UniquePtr_open0_JSErrorNotes_Note_DeletePolicy_open1_JSErrorNotes_Note_close1_close0_instantiation_3 ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: mozilla :: UniquePtr < root :: JSErrorNotes_Note > > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: mozilla :: UniquePtr < root :: JSErrorNotes_Note > ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: mozilla :: UniquePtr < root :: JSErrorNotes_Note > > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: mozilla :: UniquePtr < root :: JSErrorNotes_Note > ) ) ) ; } # [ test ] fn __bindgen_test_layout_DeletePolicy_open0_JSErrorNotes_Note_close0_instantiation_3 ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: JS :: DeletePolicy > ( ) , 1usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: JS :: DeletePolicy ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: JS :: DeletePolicy > ( ) , 1usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: JS :: DeletePolicy ) ) ) ; } # [ test ] fn __bindgen_test_layout_UniquePtr_open0_JSErrorNotes_Note_DeletePolicy_open1_JSErrorNotes_Note_close1_close0_instantiation_4 ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: mozilla :: UniquePtr < root :: JSErrorNotes_Note > > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: mozilla :: UniquePtr < root :: JSErrorNotes_Note > ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: mozilla :: UniquePtr < root :: JSErrorNotes_Note > > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: mozilla :: UniquePtr < root :: JSErrorNotes_Note > ) ) ) ; } # [ test ] fn __bindgen_test_layout_DeletePolicy_open0_JSErrorNotes_Note_close0_instantiation_4 ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: JS :: DeletePolicy > ( ) , 1usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: JS :: DeletePolicy ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: JS :: DeletePolicy > ( ) , 1usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: JS :: DeletePolicy ) ) ) ; } # [ test ] fn __bindgen_test_layout_UniquePtr_open0_JSErrorNotes_Note_DeletePolicy_open1_JSErrorNotes_Note_close1_close0_instantiation_5 ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: mozilla :: UniquePtr < root :: JSErrorNotes_Note > > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: mozilla :: UniquePtr < root :: JSErrorNotes_Note > ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: mozilla :: UniquePtr < root :: JSErrorNotes_Note > > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: mozilla :: UniquePtr < root :: JSErrorNotes_Note > ) ) ) ; } # [ test ] fn __bindgen_test_layout_DeletePolicy_open0_JSErrorNotes_Note_close0_instantiation_5 ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: JS :: DeletePolicy > ( ) , 1usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: JS :: DeletePolicy ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: JS :: DeletePolicy > ( ) , 1usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: JS :: DeletePolicy ) ) ) ; } # [ test ] fn __bindgen_test_layout_UniquePtr_open0_JSErrorNotes_DeletePolicy_open1_JSErrorNotes_close1_close0_instantiation_1 ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: mozilla :: UniquePtr < root :: JSErrorNotes > > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: mozilla :: UniquePtr < root :: JSErrorNotes > ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: mozilla :: UniquePtr < root :: JSErrorNotes > > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: mozilla :: UniquePtr < root :: JSErrorNotes > ) ) ) ; } # [ test ] fn __bindgen_test_layout_DeletePolicy_open0_JSErrorNotes_close0_instantiation_1 ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: JS :: DeletePolicy > ( ) , 1usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: JS :: DeletePolicy ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: JS :: DeletePolicy > ( ) , 1usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: JS :: DeletePolicy ) ) ) ; } # [ test ] fn __bindgen_test_layout_RefPtr_open0_StyleSheet_close0_instantiation ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: RefPtr < root :: mozilla :: StyleSheet > > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: RefPtr < root :: mozilla :: StyleSheet > ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: RefPtr < root :: mozilla :: StyleSheet > > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: RefPtr < root :: mozilla :: StyleSheet > ) ) ) ; } # [ test ] fn __bindgen_test_layout_RefPtr_open0_MediaList_close0_instantiation ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: RefPtr < root :: mozilla :: dom :: MediaList > > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: RefPtr < root :: mozilla :: dom :: MediaList > ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: RefPtr < root :: mozilla :: dom :: MediaList > > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: RefPtr < root :: mozilla :: dom :: MediaList > ) ) ) ; } # [ test ] fn __bindgen_test_layout_RefPtr_open0_StyleSheet_close0_instantiation_1 ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: RefPtr < root :: mozilla :: StyleSheet > > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: RefPtr < root :: mozilla :: StyleSheet > ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: RefPtr < root :: mozilla :: StyleSheet > > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: RefPtr < root :: mozilla :: StyleSheet > ) ) ) ; } # [ test ] fn __bindgen_test_layout_nsTArray_open0_StyleSetHandle_close0_instantiation ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: nsTArray < root :: mozilla :: StyleSetHandle > > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: nsTArray < root :: mozilla :: StyleSetHandle > ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: nsTArray < root :: mozilla :: StyleSetHandle > > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: nsTArray < root :: mozilla :: StyleSetHandle > ) ) ) ; } # [ test ] fn __bindgen_test_layout_UniquePtr_open0_ProfilerBacktrace_ProfilerBacktraceDestructor_close0_instantiation ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: mozilla :: UniquePtr < root :: ProfilerBacktrace > > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: mozilla :: UniquePtr < root :: ProfilerBacktrace > ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: mozilla :: UniquePtr < root :: ProfilerBacktrace > > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: mozilla :: UniquePtr < root :: ProfilerBacktrace > ) ) ) ; } # [ test ] fn __bindgen_test_layout_RefPtr_open0_nsNodeInfoManager_close0_instantiation ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: RefPtr < root :: nsNodeInfoManager > > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: RefPtr < root :: nsNodeInfoManager > ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: RefPtr < root :: nsNodeInfoManager > > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: RefPtr < root :: nsNodeInfoManager > ) ) ) ; } # [ test ] fn __bindgen_test_layout_nsCOMPtr_open0_nsIPrincipal_close0_instantiation ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: nsCOMPtr > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: nsCOMPtr ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: nsCOMPtr > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: nsCOMPtr ) ) ) ; } # [ test ] fn __bindgen_test_layout_nsCOMPtr_open0_nsIPrincipal_close0_instantiation_1 ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: nsCOMPtr > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: nsCOMPtr ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: nsCOMPtr > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: nsCOMPtr ) ) ) ; } # [ test ] fn __bindgen_test_layout_RefPtr_open0_nsBindingManager_close0_instantiation ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: RefPtr < root :: nsBindingManager > > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: RefPtr < root :: nsBindingManager > ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: RefPtr < root :: nsBindingManager > > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: RefPtr < root :: nsBindingManager > ) ) ) ; } # [ test ] fn __bindgen_test_layout_RefPtr_open0_nsAttrChildContentList_close0_instantiation ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: RefPtr < root :: nsAttrChildContentList > > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: RefPtr < root :: nsAttrChildContentList > ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: RefPtr < root :: nsAttrChildContentList > > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: RefPtr < root :: nsAttrChildContentList > ) ) ) ; } # [ test ] fn __bindgen_test_layout_UniquePtr_open0_LinkedList_open1_nsRange_close1_DefaultDelete_open1_LinkedList_open2_nsRange_close2_close1_close0_instantiation ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: mozilla :: UniquePtr < root :: mozilla :: LinkedList > > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: mozilla :: UniquePtr < root :: mozilla :: LinkedList > ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: mozilla :: UniquePtr < root :: mozilla :: LinkedList > > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: mozilla :: UniquePtr < root :: mozilla :: LinkedList > ) ) ) ; } # [ test ] fn __bindgen_test_layout_DefaultDelete_open0_LinkedList_open1_nsRange_close1_close0_instantiation ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: mozilla :: DefaultDelete > ( ) , 1usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: mozilla :: DefaultDelete ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: mozilla :: DefaultDelete > ( ) , 1usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: mozilla :: DefaultDelete ) ) ) ; } # [ test ] fn __bindgen_test_layout_UniquePtr_open0_LinkedList_open1_nsRange_close1_DefaultDelete_open1_LinkedList_open2_nsRange_close2_close1_close0_instantiation_1 ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: mozilla :: UniquePtr < root :: mozilla :: LinkedList > > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: mozilla :: UniquePtr < root :: mozilla :: LinkedList > ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: mozilla :: UniquePtr < root :: mozilla :: LinkedList > > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: mozilla :: UniquePtr < root :: mozilla :: LinkedList > ) ) ) ; } # [ test ] fn __bindgen_test_layout_DefaultDelete_open0_LinkedList_open1_nsRange_close1_close0_instantiation_1 ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: mozilla :: DefaultDelete > ( ) , 1usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: mozilla :: DefaultDelete ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: mozilla :: DefaultDelete > ( ) , 1usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: mozilla :: DefaultDelete ) ) ) ; } # [ test ] fn __bindgen_test_layout_RefPtr_open0_NodeInfo_close0_instantiation ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: RefPtr < root :: mozilla :: dom :: NodeInfo > > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: RefPtr < root :: mozilla :: dom :: NodeInfo > ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: RefPtr < root :: mozilla :: dom :: NodeInfo > > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: RefPtr < root :: mozilla :: dom :: NodeInfo > ) ) ) ; } # [ test ] fn __bindgen_test_layout_nsCOMPtr_open0_nsIContent_close0_instantiation ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: nsCOMPtr > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: nsCOMPtr ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: nsCOMPtr > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: nsCOMPtr ) ) ) ; } # [ test ] fn __bindgen_test_layout_RefPtr_open0_ShadowRoot_close0_instantiation ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: RefPtr < root :: mozilla :: dom :: ShadowRoot > > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: RefPtr < root :: mozilla :: dom :: ShadowRoot > ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: RefPtr < root :: mozilla :: dom :: ShadowRoot > > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: RefPtr < root :: mozilla :: dom :: ShadowRoot > ) ) ) ; } # [ test ] fn __bindgen_test_layout_RefPtr_open0_HTMLSlotElement_close0_instantiation ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: RefPtr < root :: mozilla :: dom :: HTMLSlotElement > > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: RefPtr < root :: mozilla :: dom :: HTMLSlotElement > ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: RefPtr < root :: mozilla :: dom :: HTMLSlotElement > > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: RefPtr < root :: mozilla :: dom :: HTMLSlotElement > ) ) ) ; } # [ test ] fn __bindgen_test_layout_UniquePtr_open0_nsIContent_nsExtendedContentSlots_DefaultDelete_open1_nsIContent_nsExtendedContentSlots_close1_close0_instantiation ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: mozilla :: UniquePtr < root :: nsIContent_nsExtendedContentSlots > > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: mozilla :: UniquePtr < root :: nsIContent_nsExtendedContentSlots > ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: mozilla :: UniquePtr < root :: nsIContent_nsExtendedContentSlots > > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: mozilla :: UniquePtr < root :: nsIContent_nsExtendedContentSlots > ) ) ) ; } # [ test ] fn __bindgen_test_layout_DefaultDelete_open0_nsIContent_nsExtendedContentSlots_close0_instantiation ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: mozilla :: DefaultDelete > ( ) , 1usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: mozilla :: DefaultDelete ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: mozilla :: DefaultDelete > ( ) , 1usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: mozilla :: DefaultDelete ) ) ) ; } # [ test ] fn __bindgen_test_layout_nsCOMPtr_open0_nsIWeakReference_close0_instantiation ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: nsCOMPtr > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: nsCOMPtr ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: nsCOMPtr > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: nsCOMPtr ) ) ) ; } # [ test ] fn __bindgen_test_layout_nsTArray_open0_ptr_void_close0_instantiation ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: nsTArray < * mut :: std :: os :: raw :: c_void > > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: nsTArray < * mut :: std :: os :: raw :: c_void > ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: nsTArray < * mut :: std :: os :: raw :: c_void > > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: nsTArray < * mut :: std :: os :: raw :: c_void > ) ) ) ; } # [ test ] fn __bindgen_test_layout_nsPtrHashKey_open0_void_close0_instantiation ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: nsPtrHashKey < :: std :: os :: raw :: c_void > > ( ) , 16usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: nsPtrHashKey < :: std :: os :: raw :: c_void > ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: nsPtrHashKey < :: std :: os :: raw :: c_void > > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: nsPtrHashKey < :: std :: os :: raw :: c_void > ) ) ) ; } # [ test ] fn __bindgen_test_layout_StaticRefPtr_open0_nsIContent_close0_instantiation ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: mozilla :: StaticRefPtr < root :: nsIContent > > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: mozilla :: StaticRefPtr < root :: nsIContent > ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: mozilla :: StaticRefPtr < root :: nsIContent > > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: mozilla :: StaticRefPtr < root :: nsIContent > ) ) ) ; } # [ test ] fn __bindgen_test_layout_nsCOMPtr_open0_nsIDocument_close0_instantiation ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: nsCOMPtr > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: nsCOMPtr ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: nsCOMPtr > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: nsCOMPtr ) ) ) ; } # [ test ] fn __bindgen_test_layout_RefPtr_open0_nsPresContext_close0_instantiation ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: RefPtr < root :: nsPresContext > > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: RefPtr < root :: nsPresContext > ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: RefPtr < root :: nsPresContext > > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: RefPtr < root :: nsPresContext > ) ) ) ; } # [ test ] fn __bindgen_test_layout_RefPtr_open0_nsFrameSelection_close0_instantiation ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: RefPtr < root :: nsFrameSelection > > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: RefPtr < root :: nsFrameSelection > ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: RefPtr < root :: nsFrameSelection > > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: RefPtr < root :: nsFrameSelection > ) ) ) ; } # [ test ] fn __bindgen_test_layout_nsCOMPtr_open0_nsITimer_close0_instantiation ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: nsCOMPtr > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: nsCOMPtr ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: nsCOMPtr > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: nsCOMPtr ) ) ) ; } # [ test ] fn __bindgen_test_layout_nsPtrHashKey_open0_WeakFrame_close0_instantiation ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: nsPtrHashKey < root :: WeakFrame > > ( ) , 16usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: nsPtrHashKey < root :: WeakFrame > ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: nsPtrHashKey < root :: WeakFrame > > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: nsPtrHashKey < root :: WeakFrame > ) ) ) ; } # [ test ] fn __bindgen_test_layout_nsRefPtrHashKey_open0_nsAtom_close0_instantiation ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: nsRefPtrHashKey < root :: nsAtom > > ( ) , 16usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: nsRefPtrHashKey < root :: nsAtom > ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: nsRefPtrHashKey < root :: nsAtom > > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: nsRefPtrHashKey < root :: nsAtom > ) ) ) ; } # [ test ] fn __bindgen_test_layout_RefPtr_open0_nsAtom_close0_instantiation_1 ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: RefPtr < root :: nsAtom > > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: RefPtr < root :: nsAtom > ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: RefPtr < root :: nsAtom > > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: RefPtr < root :: nsAtom > ) ) ) ; } # [ test ] fn __bindgen_test_layout_nsTArray_open0_nsCString_close0_instantiation ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: nsTArray < root :: nsCString > > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: nsTArray < root :: nsCString > ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: nsTArray < root :: nsCString > > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: nsTArray < root :: nsCString > ) ) ) ; } # [ test ] fn __bindgen_test_layout_nsCOMPtr_open0_EventTarget_close0_instantiation ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: nsCOMPtr > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: nsCOMPtr ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: nsCOMPtr > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: nsCOMPtr ) ) ) ; } # [ test ] fn __bindgen_test_layout_nsCOMPtr_open0_nsIDocument_close0_instantiation_1 ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: nsCOMPtr > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: nsCOMPtr ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: nsCOMPtr > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: nsCOMPtr ) ) ) ; } # [ test ] fn __bindgen_test_layout_nsCOMPtr_open0_nsIURI_close0_instantiation ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: nsCOMPtr > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: nsCOMPtr ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: nsCOMPtr > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: nsCOMPtr ) ) ) ; } # [ test ] fn __bindgen_test_layout_nsCOMPtr_open0_nsIURI_close0_instantiation_1 ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: nsCOMPtr > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: nsCOMPtr ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: nsCOMPtr > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: nsCOMPtr ) ) ) ; } # [ test ] fn __bindgen_test_layout_nsCOMPtr_open0_EventTarget_close0_instantiation_1 ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: nsCOMPtr > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: nsCOMPtr ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: nsCOMPtr > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: nsCOMPtr ) ) ) ; } # [ test ] fn __bindgen_test_layout_RefPtr_open0_Performance_close0_instantiation ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: RefPtr < root :: mozilla :: dom :: Performance > > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: RefPtr < root :: mozilla :: dom :: Performance > ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: RefPtr < root :: mozilla :: dom :: Performance > > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: RefPtr < root :: mozilla :: dom :: Performance > ) ) ) ; } # [ test ] fn __bindgen_test_layout_UniquePtr_open0_TimeoutManager_DefaultDelete_open1_TimeoutManager_close1_close0_instantiation ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: mozilla :: UniquePtr < root :: mozilla :: dom :: TimeoutManager > > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: mozilla :: UniquePtr < root :: mozilla :: dom :: TimeoutManager > ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: mozilla :: UniquePtr < root :: mozilla :: dom :: TimeoutManager > > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: mozilla :: UniquePtr < root :: mozilla :: dom :: TimeoutManager > ) ) ) ; } # [ test ] fn __bindgen_test_layout_DefaultDelete_open0_TimeoutManager_close0_instantiation ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: mozilla :: DefaultDelete > ( ) , 1usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: mozilla :: DefaultDelete ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: mozilla :: DefaultDelete > ( ) , 1usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: mozilla :: DefaultDelete ) ) ) ; } # [ test ] fn __bindgen_test_layout_nsCOMPtr_open0_nsPIDOMWindowOuter_close0_instantiation ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: nsCOMPtr > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: nsCOMPtr ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: nsCOMPtr > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: nsCOMPtr ) ) ) ; } # [ test ] fn __bindgen_test_layout_nsCOMPtr_open0_nsIContent_close0_instantiation_1 ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: nsCOMPtr > ( ) , 8usize , concat ! ( "Size of template specialization: " , stringify ! ( root :: nsCOMPtr ) ) ) ; assert_eq ! ( :: std :: mem :: align_of :: < root :: nsCOMPtr > ( ) , 8usize , concat ! ( "Alignment of template specialization: " , stringify ! ( root :: nsCOMPtr ) ) ) ; } # [ test ] fn __bindgen_test_layout_nsTArray_open0_ptr_AudioContext_close0_instantiation ( ) { assert_eq ! ( :: std :: mem :: size_of :: < root :: nsTArray < * mut root :: mozilla :: dom :: Audi