Bug 1304913 - Have Servo manage node data directly without FFI calls. v1 draft
authorBobby Holley <bobbyholley@gmail.com>
Wed, 21 Sep 2016 15:42:45 -0700
changeset 416738 7b31841c805e32373911ec9a342b8993bb5407c4
parent 416737 52c026862d8ee30ed73c56a8ea6d5b55e8e2213f
child 531944 b671a24cd9f5492a484a2b50d6ca2dc562eb9600
push id30240
push userbmo:bobbyholley@gmail.com
push dateFri, 23 Sep 2016 00:05:34 +0000
bugs1304913
milestone51.0a1
Bug 1304913 - Have Servo manage node data directly without FFI calls. v1
dom/base/Element.cpp
dom/base/nsGenericDOMDataNode.cpp
dom/base/nsINode.cpp
dom/base/nsINode.h
layout/base/ServoRestyleManager.cpp
layout/base/nsCSSFrameConstructor.cpp
layout/style/ServoBindingList.h
layout/style/ServoBindings.cpp
layout/style/ServoBindings.h
layout/style/ServoTypes.h
layout/style/moz.build
layout/style/nsStyleStruct.h
servo/ports/geckolib/binding_tools/regen.py
servo/ports/geckolib/gecko_bindings/bindings.rs
servo/ports/geckolib/gecko_bindings/structs_debug.rs
servo/ports/geckolib/gecko_bindings/structs_release.rs
servo/ports/geckolib/glue.rs
servo/ports/geckolib/wrapper.rs
--- a/dom/base/Element.cpp
+++ b/dom/base/Element.cpp
@@ -1737,17 +1737,17 @@ Element::BindToTree(nsIDocument* aDocume
   // It would be cleanest to mark nodes as dirty when (a) they're created and
   // (b) they're unbound from a tree. However, we can't easily do (a) right now,
   // because IsStyledByServo() is not always easy to check at node creation time,
   // and the bits have different meaning in the non-IsStyledByServo case.
   //
   // So for now, we just mark nodes as dirty when they're inserted into a
   // document or shadow tree.
   if (IsStyledByServo() && IsInComposedDoc()) {
-    MOZ_ASSERT(!ServoData().get());
+    MOZ_ASSERT(!HasServoData());
     SetIsDirtyForServo();
   }
 
   // XXXbz script execution during binding can trigger some of these
   // postcondition asserts....  But we do want that, since things will
   // generally be quite broken when that happens.
   NS_POSTCONDITION(aDocument == GetUncomposedDoc(), "Bound to wrong document");
   NS_POSTCONDITION(aParent == GetParent(), "Bound to wrong parent");
@@ -1852,20 +1852,20 @@ Element::UnbindFromTree(bool aDeep, bool
     DeleteProperty(nsGkAtoms::animationsProperty);
   }
 
   ClearInDocument();
 
   // Computed styled data isn't useful for detached nodes, and we'll need to
   // recomputed it anyway if we ever insert the nodes back into a document.
   if (IsStyledByServo()) {
-    ServoData().reset();
+    ClearServoData();
   } else {
 #ifdef MOZ_STYLO
-    MOZ_ASSERT(!ServoData());
+    MOZ_ASSERT(!HasServoData());
 #endif
   }
 
   // Editable descendant count only counts descendants that
   // are in the uncomposed document.
   ResetEditableDescendantCount();
 
   if (aNullParent || !mParent->IsInShadowTree()) {
--- a/dom/base/nsGenericDOMDataNode.cpp
+++ b/dom/base/nsGenericDOMDataNode.cpp
@@ -562,17 +562,17 @@ nsGenericDOMDataNode::BindToTree(nsIDocu
   // It would be cleanest to mark nodes as dirty when (a) they're created and
   // (b) they're unbound from a tree. However, we can't easily do (a) right now,
   // because IsStyledByServo() is not always easy to check at node creation time,
   // and the bits have different meaning in the non-IsStyledByServo case.
   //
   // So for now, we just mark nodes as dirty when they're inserted into a
   // document or shadow tree.
   if (IsStyledByServo() && IsInComposedDoc()) {
-    MOZ_ASSERT(!ServoData().get());
+    MOZ_ASSERT(!HasServoData());
     SetIsDirtyForServo();
   }
 
   NS_POSTCONDITION(aDocument == GetUncomposedDoc(), "Bound to wrong document");
   NS_POSTCONDITION(aParent == GetParent(), "Bound to wrong parent");
   NS_POSTCONDITION(aBindingParent == GetBindingParent(),
                    "Bound to wrong binding parent");
 
@@ -600,20 +600,20 @@ nsGenericDOMDataNode::UnbindFromTree(boo
     }
     SetParentIsContent(false);
   }
   ClearInDocument();
 
   // Computed styled data isn't useful for detached nodes, and we'll need to
   // recomputed it anyway if we ever insert the nodes back into a document.
   if (IsStyledByServo()) {
-    ServoData().reset();
+    ClearServoData();
   } else {
 #ifdef MOZ_STYLO
-    MOZ_ASSERT(!ServoData());
+    MOZ_ASSERT(!HasServoData());
 #endif
   }
 
   if (aNullParent || !mParent->IsInShadowTree()) {
     UnsetFlags(NODE_IS_IN_SHADOW_TREE);
 
     // Begin keeping track of our subtree root.
     SetSubtreeRootPointer(aNullParent ? this : mParent->SubtreeRoot());
--- a/dom/base/nsINode.cpp
+++ b/dom/base/nsINode.cpp
@@ -147,16 +147,17 @@ nsINode::nsSlots::Unlink()
 }
 
 //----------------------------------------------------------------------
 
 nsINode::~nsINode()
 {
   MOZ_ASSERT(!HasSlots(), "nsNodeUtils::LastRelease was not called?");
   MOZ_ASSERT(mSubtreeRoot == this, "Didn't restore state properly?");
+  ClearServoData();
 }
 
 void*
 nsINode::GetProperty(uint16_t aCategory, nsIAtom *aPropertyName,
                      nsresult *aStatus) const
 {
   return OwnerDoc()->PropertyTable(aCategory)->GetProperty(this, aPropertyName,
                                                            aStatus);
--- a/dom/base/nsINode.h
+++ b/dom/base/nsINode.h
@@ -3,16 +3,17 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #ifndef nsINode_h___
 #define nsINode_h___
 
 #include "mozilla/Likely.h"
+#include "mozilla/ServoTypes.h"
 #include "mozilla/UniquePtr.h"
 #include "nsCOMPtr.h"               // for member, local
 #include "nsGkAtoms.h"              // for nsGkAtoms::baseURIProperty
 #include "nsIDOMNode.h"
 #include "mozilla/dom/NodeInfo.h"            // member (in nsCOMPtr)
 #include "nsIVariant.h"             // for use in GetUserData()
 #include "nsNodeInfoManager.h"      // for use in NodePrincipal()
 #include "nsPropertyTable.h"        // for typedefs
@@ -48,31 +49,17 @@ class nsINode;
 class nsINodeList;
 class nsIPresShell;
 class nsIPrincipal;
 class nsIURI;
 class nsNodeSupportsWeakRefTearoff;
 class nsNodeWeakReference;
 class nsDOMMutationObserver;
 
-// We declare the bare minimum infrastructure here to allow us to have a
-// UniquePtr<ServoNodeData> on nsINode.
-struct ServoNodeData;
-extern "C" void Servo_NodeData_Drop(ServoNodeData*);
-namespace mozilla {
-template<>
-class DefaultDelete<ServoNodeData>
-{
-public:
-  void operator()(ServoNodeData* aPtr) const
-  {
-    Servo_NodeData_Drop(aPtr);
-  }
-};
-} // namespace mozilla
+extern "C" void Servo_Node_ClearNodeData(nsINode*);
 
 namespace mozilla {
 class EventListenerManager;
 namespace dom {
 /**
  * @return true if aChar is what the DOM spec defines as 'space character'.
  * http://dom.spec.whatwg.org/#space-character
  */
@@ -2085,19 +2072,27 @@ public:
   void SetOn##name_(mozilla::dom::EventHandlerNonNull* listener);
 #define TOUCH_EVENT EVENT
 #define DOCUMENT_ONLY_EVENT EVENT
 #include "mozilla/EventNameList.h"
 #undef DOCUMENT_ONLY_EVENT
 #undef TOUCH_EVENT
 #undef EVENT
 
-  mozilla::UniquePtr<ServoNodeData>& ServoData() {
+  bool HasServoData() {
 #ifdef MOZ_STYLO
-    return mServoNodeData;
+    return !!mServoData.Get();
+#else
+    MOZ_CRASH("Accessing servo node data in non-stylo build");
+#endif
+  }
+
+  void ClearServoData() {
+#ifdef MOZ_STYLO
+    Servo_Node_ClearNodeData(this);
 #else
     MOZ_CRASH("Accessing servo node data in non-stylo build");
 #endif
   }
 
 protected:
   static bool Traverse(nsINode *tmp, nsCycleCollectionTraversalCallback &cb);
   static void Unlink(nsINode *tmp);
@@ -2132,18 +2127,18 @@ protected:
     // object itself, or is reset by ClearSubtreeRootPointer.
     nsINode* MOZ_NON_OWNING_REF mSubtreeRoot;
   };
 
   // Storage for more members that are usually not needed; allocated lazily.
   nsSlots* mSlots;
 
 #ifdef MOZ_STYLO
-  // Layout data managed by Servo.
-  mozilla::UniquePtr<ServoNodeData> mServoNodeData;
+  // Per-node data managed by Servo.
+  mozilla::ServoCell<ServoNodeData*> mServoData;
 #endif
 };
 
 inline nsIDOMNode* GetAsDOMNode(nsINode* aNode)
 {
   return aNode ? aNode->AsDOMNode() : nullptr;
 }
 
--- a/layout/base/ServoRestyleManager.cpp
+++ b/layout/base/ServoRestyleManager.cpp
@@ -381,17 +381,17 @@ ServoRestyleManager::ContentInserted(nsI
     //
     // Either way the whole tree is dirty, so we should style the document.
     MOZ_ASSERT(aChild == aChild->OwnerDoc()->GetRootElement());
     MOZ_ASSERT(aChild->IsDirtyForServo());
     StyleSet()->StyleDocument(/* aLeaveDirtyBits = */ false);
     return;
   }
 
-  if (!aContainer->ServoData().get()) {
+  if (!aContainer->HasServoData()) {
     // This can happen with display:none. Bug 1297249 tracks more investigation
     // and assertions here.
     return;
   }
 
   // Style the new subtree because we will most likely need it during subsequent
   // frame construction. Bug 1298281 tracks deferring this work in the lazy
   // frame construction case.
@@ -412,17 +412,17 @@ ServoRestyleManager::RestyleForAppend(ns
   // Bug 1297899 tracks this work.
   //
 }
 
 void
 ServoRestyleManager::ContentAppended(nsIContent* aContainer,
                                      nsIContent* aFirstNewContent)
 {
-  if (!aContainer->ServoData().get()) {
+  if (!aContainer->HasServoData()) {
     // This can happen with display:none. Bug 1297249 tracks more investigation
     // and assertions here.
     return;
   }
 
   // Style the new subtree because we will most likely need it during subsequent
   // frame construction. Bug 1298281 tracks deferring this work in the lazy
   // frame construction case.
--- a/layout/base/nsCSSFrameConstructor.cpp
+++ b/layout/base/nsCSSFrameConstructor.cpp
@@ -10588,23 +10588,23 @@ nsCSSFrameConstructor::AddFCItemsForAnon
       parentDisplayBasedStyleFixupSkipper(aState.mTreeMatchContext);
     if (aAnonymousItems[i].mStyleContext) {
       // If we have an explicit style context, that means that the anonymous
       // content creator had its own plan for the style, and doesn't need the
       // computed style obtained by cascading this content as a normal node.
       // This happens when a native anonymous node is used to implement a
       // pseudo-element. Allowing Servo to traverse these nodes would be wasted
       // work, so assert that we didn't do that.
-      MOZ_ASSERT_IF(content->IsStyledByServo(), !content->ServoData());
+      MOZ_ASSERT_IF(content->IsStyledByServo(), !content->HasServoData());
       styleContext = aAnonymousItems[i].mStyleContext.forget();
     } else {
       // If we don't have an explicit style context, that means we need the
       // ordinary computed values. Make sure we eagerly cascaded them when the
       // anonymous nodes were created.
-      MOZ_ASSERT_IF(content->IsStyledByServo(), !!content->ServoData());
+      MOZ_ASSERT_IF(content->IsStyledByServo(), content->HasServoData());
       styleContext = ResolveStyleContext(aFrame, content, &aState);
     }
 
     nsTArray<nsIAnonymousContentCreator::ContentInfo>* anonChildren = nullptr;
     if (!aAnonymousItems[i].mChildren.IsEmpty()) {
       anonChildren = &aAnonymousItems[i].mChildren;
     }
 
--- a/layout/style/ServoBindingList.h
+++ b/layout/style/ServoBindingList.h
@@ -14,17 +14,17 @@
  * and the parameter list of the function.
  *
  * Users of this list should define a macro
  * SERVO_BINDING_FUNC(name_, return_, ...)
  * before including this file.
  */
 
 // Node data
-SERVO_BINDING_FUNC(Servo_NodeData_Drop, void, ServoNodeDataOwned data)
+SERVO_BINDING_FUNC(Servo_Node_ClearNodeData, void, RawGeckoNode* node)
 
 // Styleset and Stylesheet management
 SERVO_BINDING_FUNC(Servo_StyleSheet_FromUTF8Bytes, RawServoStyleSheetStrong,
                    const uint8_t* bytes, uint32_t length,
                    mozilla::css::SheetParsingMode parsing_mode,
                    const uint8_t* base_bytes, uint32_t base_length,
                    ThreadSafeURIHolder* base,
                    ThreadSafeURIHolder* referrer,
--- a/layout/style/ServoBindings.cpp
+++ b/layout/style/ServoBindings.cpp
@@ -564,29 +564,16 @@ ClassOrClassList(Implementor* aElement, 
     return ClassOrClassList(aElement, aClass, aClassList);                     \
   }
 
 SERVO_IMPL_ELEMENT_ATTR_MATCHING_FUNCTIONS(Gecko_, RawGeckoElementBorrowed)
 SERVO_IMPL_ELEMENT_ATTR_MATCHING_FUNCTIONS(Gecko_Snapshot, ServoElementSnapshot*)
 
 #undef SERVO_IMPL_ELEMENT_ATTR_MATCHING_FUNCTIONS
 
-ServoNodeDataBorrowedOrNull
-Gecko_GetNodeData(RawGeckoNodeBorrowed aNode)
-{
-  return aNode->ServoData().get();
-}
-
-void
-Gecko_SetNodeData(RawGeckoNodeBorrowed aNode, ServoNodeDataOwned aData)
-{
-  MOZ_ASSERT(!aNode->ServoData());
-  aNode->ServoData().reset(aData);
-}
-
 nsIAtom*
 Gecko_Atomize(const char* aString, uint32_t aLength)
 {
   return NS_Atomize(nsDependentCSubstring(aString, aLength)).take();
 }
 
 void
 Gecko_AddRefAtom(nsIAtom* aAtom)
--- a/layout/style/ServoBindings.h
+++ b/layout/style/ServoBindings.h
@@ -2,52 +2,49 @@
 /* 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/. */
 
 #ifndef mozilla_ServoBindings_h
 #define mozilla_ServoBindings_h
 
+#include "mozilla/ServoTypes.h"
 #include "mozilla/ServoElementSnapshot.h"
 #include "mozilla/css/SheetParsingMode.h"
+#include "mozilla/dom/Element.h"
+#include "nsIDocument.h"
+#include "nsINode.h"
 #include "nsChangeHint.h"
 #include "nsColor.h"
 #include "nsProxyRelease.h"
 #include "nsStyleCoord.h"
 #include "nsStyleStruct.h"
 #include "stdint.h"
 
 /*
  * API for Servo to access Gecko data structures. This file must compile as valid
  * C code in order for the binding generator to parse it.
  *
  * Functions beginning with Gecko_ are implemented in Gecko and invoked from Servo.
  * Functions beginning with Servo_ are implemented in Servo and invoked from Gecko.
  */
 
 class nsIAtom;
-class nsINode;
-typedef nsINode RawGeckoNode;
 class nsIPrincipal;
 class nsIURI;
 struct nsFont;
 namespace mozilla {
   class FontFamilyList;
   enum FontFamilyType : uint32_t;
-  namespace dom { class Element; }
 }
 using mozilla::FontFamilyList;
 using mozilla::FontFamilyType;
 using mozilla::dom::Element;
 using mozilla::ServoElementSnapshot;
-typedef mozilla::dom::Element RawGeckoElement;
-class nsIDocument;
-typedef nsIDocument RawGeckoDocument;
-struct ServoNodeData;
 struct ServoComputedValues;
 struct RawServoStyleSheet;
 struct RawServoStyleSet;
 class nsHTMLCSSStyleSheet;
 struct nsStyleList;
 struct nsStyleImage;
 struct nsStyleGradientStop;
 class nsStyleGradient;
@@ -102,18 +99,16 @@ using mozilla::dom::StyleChildrenIterato
   DECL_NULLABLE_BORROWED_REF_TYPE_FOR(type_)       \
   DECL_NULLABLE_BORROWED_MUT_REF_TYPE_FOR(type_)
 
 DECL_ARC_REF_TYPE_FOR(ServoComputedValues)
 DECL_ARC_REF_TYPE_FOR(RawServoStyleSheet)
 DECL_ARC_REF_TYPE_FOR(ServoDeclarationBlock)
 
 DECL_OWNED_REF_TYPE_FOR(RawServoStyleSet)
-DECL_NULLABLE_OWNED_REF_TYPE_FOR(ServoNodeData)
-DECL_OWNED_REF_TYPE_FOR(ServoNodeData)
 DECL_NULLABLE_OWNED_REF_TYPE_FOR(StyleChildrenIterator)
 DECL_OWNED_REF_TYPE_FOR(StyleChildrenIterator)
 
 // We don't use BorrowedMut because the nodes may alias
 // Servo itself doesn't directly read or mutate these;
 // it only asks Gecko to do so. In case we wish to in
 // the future, we should ensure that things being mutated
 // are protected from noalias violations by a cell type
@@ -218,20 +213,16 @@ SERVO_DECLARE_ELEMENT_ATTR_MATCHING_FUNC
 SERVO_DECLARE_ELEMENT_ATTR_MATCHING_FUNCTIONS(Gecko_Snapshot,
                                               ServoElementSnapshot*)
 
 #undef SERVO_DECLARE_ELEMENT_ATTR_MATCHING_FUNCTIONS
 
 // Style attributes.
 ServoDeclarationBlockBorrowedOrNull Gecko_GetServoDeclarationBlock(RawGeckoElementBorrowed element);
 
-// Node data.
-ServoNodeDataBorrowedOrNull Gecko_GetNodeData(RawGeckoNodeBorrowed node);
-void Gecko_SetNodeData(RawGeckoNodeBorrowed node, ServoNodeDataOwned data);
-
 // Atoms.
 nsIAtom* Gecko_Atomize(const char* aString, uint32_t aLength);
 void Gecko_AddRefAtom(nsIAtom* aAtom);
 void Gecko_ReleaseAtom(nsIAtom* aAtom);
 const uint16_t* Gecko_GetAtomAsUTF16(nsIAtom* aAtom, uint32_t* aLength);
 bool Gecko_AtomEqualsUTF8(nsIAtom* aAtom, const char* aString, uint32_t aLength);
 bool Gecko_AtomEqualsUTF8IgnoreCase(nsIAtom* aAtom, const char* aString, uint32_t aLength);
 
new file mode 100644
--- /dev/null
+++ b/layout/style/ServoTypes.h
@@ -0,0 +1,40 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_ServoTypes_h
+#define mozilla_ServoTypes_h
+
+/*
+ * Type definitions used to interact with Servo. This gets included by nsINode,
+ * so don't add significant include dependencies to this file.
+ */
+
+struct ServoNodeData;
+namespace mozilla {
+
+/*
+ * Replaced types. These get mapped to associated Servo types in bindgen.
+ */
+
+template<typename T>
+struct ServoUnsafeCell {
+  T value;
+
+  // Ensure that primitive types (i.e. pointers) get zero-initialized.
+  ServoUnsafeCell() : value() {};
+};
+
+template<typename T>
+struct ServoCell {
+  ServoUnsafeCell<T> value;
+  T Get() const { return value.value; }
+  void Set(T arg) { value.value = arg; }
+  ServoCell() : value() {};
+};
+
+} // namespace mozilla
+
+#endif // mozilla_ServoTypes_h
--- a/layout/style/moz.build
+++ b/layout/style/moz.build
@@ -92,16 +92,17 @@ EXPORTS.mozilla += [
     'RuleNodeCacheConditions.h',
     'RuleProcessorCache.h',
     'ServoBindingHelpers.h',
     'ServoBindingList.h',
     'ServoBindings.h',
     'ServoElementSnapshot.h',
     'ServoStyleSet.h',
     'ServoStyleSheet.h',
+    'ServoTypes.h',
     'SheetType.h',
     'StyleAnimationValue.h',
     'StyleBackendType.h',
     'StyleContextSource.h',
     'StyleSetHandle.h',
     'StyleSetHandleInlines.h',
     'StyleSheet.h',
     'StyleSheetHandle.h',
--- a/layout/style/nsStyleStruct.h
+++ b/layout/style/nsStyleStruct.h
@@ -41,16 +41,21 @@
 
 class nsIFrame;
 class nsIURI;
 class nsStyleContext;
 class nsTextFrame;
 class imgIContainer;
 struct nsStyleVisibility;
 
+typedef nsINode RawGeckoNode;
+typedef mozilla::dom::Element RawGeckoElement;
+typedef nsIDocument RawGeckoDocument;
+struct ServoNodeData;
+
 // Includes nsStyleStructID.
 #include "nsStyleStructFwd.h"
 
 // Bits for each struct.
 // NS_STYLE_INHERIT_BIT defined in nsStyleStructFwd.h
 #define NS_STYLE_INHERIT_MASK              0x000ffffff
 
 // Bits for inherited structs.
--- a/servo/ports/geckolib/binding_tools/regen.py
+++ b/servo/ports/geckolib/binding_tools/regen.py
@@ -61,27 +61,34 @@ COMPILATION_TARGETS = {
                 "clang_flags": [
                     "-DDEBUG=1",
                     "-DJS_DEBUG=1",
                 ]
             },
             "release": {
             }
         },
+        "raw_lines": [
+            # We can get rid of this when the bindings move into the style crate.
+            "pub enum OpaqueStyleData {}",
+        ],
         "whitelist_vars": [
             "NS_THEME_.*",
             "NODE_.*",
             "NS_FONT_STYLE_.*",
             "NS_STYLE_.*",
             "NS_CORNER_.*",
             "NS_RADIUS_.*",
             "BORDER_COLOR_.*",
             "BORDER_STYLE_.*"
         ],
         "whitelist": [
+            "RawGeckoNode",
+            "RawGeckoElement",
+            "RawGeckoDocument",
             "Element",
             "Side",
             "nsTArrayHeader",
             "nsCSSValueGradient",
             "nsCSSValueList_heap",
             "FrameRequestCallback",
             "nsCSSValueTriplet_heap",
             "nsCSSRect_heap",
@@ -163,16 +170,27 @@ COMPILATION_TARGETS = {
             "SupportsWeakPtr",
             "Maybe",  # <- AlignedStorage, which means templated union, which
                       #    means impossible to represent in stable rust as of
                       #    right now.
             "gfxSize",  # <- Same, union { struct { T width; T height; }; T components[2] };
             "gfxSize_Super",  # Ditto.
             "atomic___base", # stdlib implementation detail on mac.
         ],
+        "servo_mapped_generic_types": [
+            { "generic": True,
+              "gecko": "ServoUnsafeCell",
+              "servo": "::std::cell::UnsafeCell" },
+            { "generic": True,
+              "gecko": "ServoCell",
+              "servo": "::std::cell::Cell" },
+            { "generic": False,
+              "gecko": "ServoNodeData",
+              "servo": "OpaqueStyleData" }
+        ],
     },
     # Generation of the ffi bindings.
     "bindings": {
         "target_dir": "../gecko_bindings",
         "raw_lines": [
             "use heapsize::HeapSizeOf;",
         ],
         "flags": [
@@ -201,24 +219,25 @@ COMPILATION_TARGETS = {
             "nsStyleImageLayers_Layer", "nsStyleImageLayers_LayerType",
             "nsStyleUnit", "nsStyleUnion", "nsStyleCoord_CalcValue",
             "nsStyleCoord_Calc", "nsRestyleHint", "ServoElementSnapshot",
             "nsChangeHint", "SheetParsingMode", "nsMainThreadPtrHandle",
             "nsMainThreadPtrHolder", "nscolor", "nsFont", "FontFamilyList",
             "FontFamilyType", "nsIAtom", "nsStyleContext", "StyleClipPath",
             "StyleBasicShapeType", "StyleBasicShape", "nsCSSShadowArray",
             "nsINode", "nsIDocument", "nsIPrincipal", "nsIURI",
+            "RawGeckoNode", "RawGeckoElement", "RawGeckoDocument",
+            "ServoNodeData",
         ],
         "servo_nullable_arc_types": [
             "ServoComputedValues", "RawServoStyleSheet",
             "ServoDeclarationBlock"
         ],
         "servo_owned_types": [
             "RawServoStyleSet",
-            "ServoNodeData",
             "StyleChildrenIterator",
         ],
         "servo_immutable_borrow_types": [
             "RawGeckoNode",
             "RawGeckoElement",
             "RawGeckoDocument",
         ],
         "whitelist_functions": [
@@ -425,17 +444,27 @@ def build(objdir, target_name, debug, de
             flags.append("--blacklist-type")
             flags.append("{}Borrowed".format(ty))
             flags.append("--raw-line")
             flags.append("pub type {0}Borrowed<'a> = &'a {0};".format(ty))
             flags.append("--blacklist-type")
             flags.append("{}BorrowedOrNull".format(ty))
             flags.append("--raw-line")
             flags.append("pub type {0}BorrowedOrNull<'a> = ::sugar::ownership::Borrowed<'a, {0}>;".format(ty))
-            zero_size_type(ty, flags)
+            # Right now the only immutable borrow types are ones which we import
+            # from the |structs| module. As such, we don't need to create an opaque
+            # type with zero_size_type. If we ever introduce immutable borrow types
+            # which _do_ need to be opaque, we'll need a separate mode.
+
+    if "servo_mapped_generic_types" in current_target:
+        for ty in current_target["servo_mapped_generic_types"]:
+            flags.append("--blacklist-type")
+            flags.append("{}".format(ty["gecko"]))
+            flags.append("--raw-line")
+            flags.append("pub type {0}{2} = {1}{2};".format(ty["gecko"], ty["servo"], "<T>" if ty["generic"] else ""))
 
     if "servo_owned_types" in current_target:
         for ty in current_target["servo_owned_types"]:
             flags.append("--blacklist-type")
             flags.append("{}Borrowed".format(ty))
             flags.append("--raw-line")
             flags.append("pub type {0}Borrowed<'a> = &'a {0};".format(ty))
             flags.append("--blacklist-type")
--- a/servo/ports/geckolib/gecko_bindings/bindings.rs
+++ b/servo/ports/geckolib/gecko_bindings/bindings.rs
@@ -13,42 +13,28 @@ enum RawServoStyleSheetVoid{ }
 pub struct RawServoStyleSheet(RawServoStyleSheetVoid);
 pub type ServoDeclarationBlockStrong = ::sugar::ownership::Strong<ServoDeclarationBlock>;
 pub type ServoDeclarationBlockBorrowedOrNull<'a> = ::sugar::ownership::Borrowed<'a, ServoDeclarationBlock>;
 pub type ServoDeclarationBlockBorrowed<'a> = &'a ServoDeclarationBlock;
 enum ServoDeclarationBlockVoid{ }
 pub struct ServoDeclarationBlock(ServoDeclarationBlockVoid);
 pub type RawGeckoNodeBorrowed<'a> = &'a RawGeckoNode;
 pub type RawGeckoNodeBorrowedOrNull<'a> = ::sugar::ownership::Borrowed<'a, RawGeckoNode>;
-enum RawGeckoNodeVoid{ }
-pub struct RawGeckoNode(RawGeckoNodeVoid);
 pub type RawGeckoElementBorrowed<'a> = &'a RawGeckoElement;
 pub type RawGeckoElementBorrowedOrNull<'a> = ::sugar::ownership::Borrowed<'a, RawGeckoElement>;
-enum RawGeckoElementVoid{ }
-pub struct RawGeckoElement(RawGeckoElementVoid);
 pub type RawGeckoDocumentBorrowed<'a> = &'a RawGeckoDocument;
 pub type RawGeckoDocumentBorrowedOrNull<'a> = ::sugar::ownership::Borrowed<'a, RawGeckoDocument>;
-enum RawGeckoDocumentVoid{ }
-pub struct RawGeckoDocument(RawGeckoDocumentVoid);
 pub type RawServoStyleSetBorrowed<'a> = &'a RawServoStyleSet;
 pub type RawServoStyleSetBorrowedMut<'a> = &'a mut RawServoStyleSet;
 pub type RawServoStyleSetOwned = ::sugar::ownership::Owned<RawServoStyleSet>;
 pub type RawServoStyleSetBorrowedOrNull<'a> = ::sugar::ownership::Borrowed<'a, RawServoStyleSet>;
 pub type RawServoStyleSetBorrowedMutOrNull<'a> = ::sugar::ownership::BorrowedMut<'a, RawServoStyleSet>;
 pub type RawServoStyleSetOwnedOrNull = ::sugar::ownership::OwnedOrNull<RawServoStyleSet>;
 enum RawServoStyleSetVoid{ }
 pub struct RawServoStyleSet(RawServoStyleSetVoid);
-pub type ServoNodeDataBorrowed<'a> = &'a ServoNodeData;
-pub type ServoNodeDataBorrowedMut<'a> = &'a mut ServoNodeData;
-pub type ServoNodeDataOwned = ::sugar::ownership::Owned<ServoNodeData>;
-pub type ServoNodeDataBorrowedOrNull<'a> = ::sugar::ownership::Borrowed<'a, ServoNodeData>;
-pub type ServoNodeDataBorrowedMutOrNull<'a> = ::sugar::ownership::BorrowedMut<'a, ServoNodeData>;
-pub type ServoNodeDataOwnedOrNull = ::sugar::ownership::OwnedOrNull<ServoNodeData>;
-enum ServoNodeDataVoid{ }
-pub struct ServoNodeData(ServoNodeDataVoid);
 pub type StyleChildrenIteratorBorrowed<'a> = &'a StyleChildrenIterator;
 pub type StyleChildrenIteratorBorrowedMut<'a> = &'a mut StyleChildrenIterator;
 pub type StyleChildrenIteratorOwned = ::sugar::ownership::Owned<StyleChildrenIterator>;
 pub type StyleChildrenIteratorBorrowedOrNull<'a> = ::sugar::ownership::Borrowed<'a, StyleChildrenIterator>;
 pub type StyleChildrenIteratorBorrowedMutOrNull<'a> = ::sugar::ownership::BorrowedMut<'a, StyleChildrenIterator>;
 pub type StyleChildrenIteratorOwnedOrNull = ::sugar::ownership::OwnedOrNull<StyleChildrenIterator>;
 enum StyleChildrenIteratorVoid{ }
 pub struct StyleChildrenIterator(StyleChildrenIteratorVoid);
@@ -174,27 +160,31 @@ unsafe impl Sync for nsStyleContext {}
 use structs::StyleClipPath;
 use structs::StyleBasicShapeType;
 use structs::StyleBasicShape;
 use structs::nsCSSShadowArray;
 use structs::nsINode;
 use structs::nsIDocument;
 use structs::nsIPrincipal;
 use structs::nsIURI;
+use structs::RawGeckoNode;
+use structs::RawGeckoElement;
+use structs::RawGeckoDocument;
+use structs::ServoNodeData;
 
 extern "C" {
     pub fn Gecko_EnsureTArrayCapacity(aArray: *mut ::std::os::raw::c_void,
                                       aCapacity: usize, aElementSize: usize);
 }
 extern "C" {
     pub fn Gecko_ClearPODTArray(aArray: *mut ::std::os::raw::c_void,
                                 aElementSize: usize, aElementAlign: usize);
 }
 extern "C" {
-    pub fn Servo_NodeData_Drop(arg1: *mut ServoNodeData);
+    pub fn Servo_Node_ClearNodeData(arg1: *mut nsINode);
 }
 #[repr(C)]
 #[derive(Debug, Copy)]
 pub struct nsHTMLCSSStyleSheet {
     pub _address: u8,
 }
 impl Clone for nsHTMLCSSStyleSheet {
     fn clone(&self) -> Self { *self }
@@ -383,24 +373,16 @@ extern "C" {
                                           classList: *mut *mut *mut nsIAtom)
      -> u32;
 }
 extern "C" {
     pub fn Gecko_GetServoDeclarationBlock(element: RawGeckoElementBorrowed)
      -> ServoDeclarationBlockBorrowedOrNull;
 }
 extern "C" {
-    pub fn Gecko_GetNodeData(node: RawGeckoNodeBorrowed)
-     -> ServoNodeDataBorrowedOrNull;
-}
-extern "C" {
-    pub fn Gecko_SetNodeData(node: RawGeckoNodeBorrowed,
-                             data: ServoNodeDataOwned);
-}
-extern "C" {
     pub fn Gecko_Atomize(aString: *const ::std::os::raw::c_char, aLength: u32)
      -> *mut nsIAtom;
 }
 extern "C" {
     pub fn Gecko_AddRefAtom(aAtom: *mut nsIAtom);
 }
 extern "C" {
     pub fn Gecko_ReleaseAtom(aAtom: *mut nsIAtom);
--- a/servo/ports/geckolib/gecko_bindings/structs_debug.rs
+++ b/servo/ports/geckolib/gecko_bindings/structs_debug.rs
@@ -1,10 +1,15 @@
 /* automatically generated by rust-bindgen */
 
+pub enum OpaqueStyleData {}
+pub type ServoUnsafeCell<T> = ::std::cell::UnsafeCell<T>;
+pub type ServoCell<T> = ::std::cell::Cell<T>;
+pub type ServoNodeData = OpaqueStyleData;
+
 #[derive(Debug)]
 #[repr(C)]
 pub struct __BindgenUnionField<T>(::std::marker::PhantomData<T>);
 impl <T> __BindgenUnionField<T> {
     #[inline]
     pub fn new() -> Self { __BindgenUnionField(::std::marker::PhantomData) }
     #[inline]
     pub unsafe fn as_ref(&self) -> &T { ::std::mem::transmute(self) }
@@ -1491,40 +1496,40 @@ pub enum JSWhyMagic {
     JS_UNINITIALIZED_LEXICAL = 15,
     JS_GENERIC_MAGIC = 16,
     JS_WHY_MAGIC_COUNT = 17,
 }
 #[repr(C)]
 #[derive(Debug, Copy)]
 pub struct jsval_layout {
     pub asBits: __BindgenUnionField<u64>,
-    pub debugView: __BindgenUnionField<jsval_layout__bindgen_ty_bindgen_id_61680>,
-    pub s: __BindgenUnionField<jsval_layout__bindgen_ty_bindgen_id_61687>,
+    pub debugView: __BindgenUnionField<jsval_layout__bindgen_ty_bindgen_id_61683>,
+    pub s: __BindgenUnionField<jsval_layout__bindgen_ty_bindgen_id_61690>,
     pub asDouble: __BindgenUnionField<f64>,
     pub asPtr: __BindgenUnionField<*mut ::std::os::raw::c_void>,
     pub asWord: __BindgenUnionField<usize>,
     pub asUIntPtr: __BindgenUnionField<usize>,
     pub bindgen_union_field: u64,
 }
 #[repr(C)]
 #[derive(Debug, Copy)]
-pub struct jsval_layout__bindgen_ty_bindgen_id_61680 {
+pub struct jsval_layout__bindgen_ty_bindgen_id_61683 {
     pub _bitfield_1: u64,
 }
 #[test]
-fn bindgen_test_layout_jsval_layout__bindgen_ty_bindgen_id_61680() {
-    assert_eq!(::std::mem::size_of::<jsval_layout__bindgen_ty_bindgen_id_61680>()
+fn bindgen_test_layout_jsval_layout__bindgen_ty_bindgen_id_61683() {
+    assert_eq!(::std::mem::size_of::<jsval_layout__bindgen_ty_bindgen_id_61683>()
                , 8usize);
-    assert_eq!(::std::mem::align_of::<jsval_layout__bindgen_ty_bindgen_id_61680>()
+    assert_eq!(::std::mem::align_of::<jsval_layout__bindgen_ty_bindgen_id_61683>()
                , 8usize);
 }
-impl Clone for jsval_layout__bindgen_ty_bindgen_id_61680 {
-    fn clone(&self) -> Self { *self }
-}
-impl jsval_layout__bindgen_ty_bindgen_id_61680 {
+impl Clone for jsval_layout__bindgen_ty_bindgen_id_61683 {
+    fn clone(&self) -> Self { *self }
+}
+impl jsval_layout__bindgen_ty_bindgen_id_61683 {
     #[inline]
     pub fn payload47(&self) -> u64 {
         unsafe {
             ::std::mem::transmute(((self._bitfield_1 &
                                         (140737488355327usize as u64)) >>
                                        0u32) as u64)
         }
     }
@@ -1547,46 +1552,46 @@ impl jsval_layout__bindgen_ty_bindgen_id
         self._bitfield_1 &= !(18446603336221196288usize as u64);
         self._bitfield_1 |=
             ((val as u32 as u64) << 47u32) &
                 (18446603336221196288usize as u64);
     }
 }
 #[repr(C)]
 #[derive(Debug, Copy)]
-pub struct jsval_layout__bindgen_ty_bindgen_id_61687 {
-    pub payload: jsval_layout__bindgen_ty_bindgen_id_61687__bindgen_ty_bindgen_id_61688,
-}
-#[repr(C)]
-#[derive(Debug, Copy)]
-pub struct jsval_layout__bindgen_ty_bindgen_id_61687__bindgen_ty_bindgen_id_61688 {
+pub struct jsval_layout__bindgen_ty_bindgen_id_61690 {
+    pub payload: jsval_layout__bindgen_ty_bindgen_id_61690__bindgen_ty_bindgen_id_61691,
+}
+#[repr(C)]
+#[derive(Debug, Copy)]
+pub struct jsval_layout__bindgen_ty_bindgen_id_61690__bindgen_ty_bindgen_id_61691 {
     pub i32: __BindgenUnionField<i32>,
     pub u32: __BindgenUnionField<u32>,
     pub why: __BindgenUnionField<JSWhyMagic>,
     pub bindgen_union_field: u32,
 }
 #[test]
-fn bindgen_test_layout_jsval_layout__bindgen_ty_bindgen_id_61687__bindgen_ty_bindgen_id_61688() {
-    assert_eq!(::std::mem::size_of::<jsval_layout__bindgen_ty_bindgen_id_61687__bindgen_ty_bindgen_id_61688>()
+fn bindgen_test_layout_jsval_layout__bindgen_ty_bindgen_id_61690__bindgen_ty_bindgen_id_61691() {
+    assert_eq!(::std::mem::size_of::<jsval_layout__bindgen_ty_bindgen_id_61690__bindgen_ty_bindgen_id_61691>()
                , 4usize);
-    assert_eq!(::std::mem::align_of::<jsval_layout__bindgen_ty_bindgen_id_61687__bindgen_ty_bindgen_id_61688>()
+    assert_eq!(::std::mem::align_of::<jsval_layout__bindgen_ty_bindgen_id_61690__bindgen_ty_bindgen_id_61691>()
                , 4usize);
 }
 impl Clone for
- jsval_layout__bindgen_ty_bindgen_id_61687__bindgen_ty_bindgen_id_61688 {
-    fn clone(&self) -> Self { *self }
-}
-#[test]
-fn bindgen_test_layout_jsval_layout__bindgen_ty_bindgen_id_61687() {
-    assert_eq!(::std::mem::size_of::<jsval_layout__bindgen_ty_bindgen_id_61687>()
+ jsval_layout__bindgen_ty_bindgen_id_61690__bindgen_ty_bindgen_id_61691 {
+    fn clone(&self) -> Self { *self }
+}
+#[test]
+fn bindgen_test_layout_jsval_layout__bindgen_ty_bindgen_id_61690() {
+    assert_eq!(::std::mem::size_of::<jsval_layout__bindgen_ty_bindgen_id_61690>()
                , 4usize);
-    assert_eq!(::std::mem::align_of::<jsval_layout__bindgen_ty_bindgen_id_61687>()
+    assert_eq!(::std::mem::align_of::<jsval_layout__bindgen_ty_bindgen_id_61690>()
                , 4usize);
 }
-impl Clone for jsval_layout__bindgen_ty_bindgen_id_61687 {
+impl Clone for jsval_layout__bindgen_ty_bindgen_id_61690 {
     fn clone(&self) -> Self { *self }
 }
 impl Clone for jsval_layout {
     fn clone(&self) -> Self { *self }
 }
 #[repr(C)]
 #[derive(Debug)]
 pub struct nsAString_internal {
@@ -1610,17 +1615,17 @@ pub type nsAString_internal_iterator = n
 pub type nsAString_internal_comparator_type = nsStringComparator;
 pub type nsAString_internal_char_iterator = *mut nsAString_internal_char_type;
 pub type nsAString_internal_const_char_iterator =
     *const nsAString_internal_char_type;
 pub type nsAString_internal_size_type = u32;
 pub type nsAString_internal_index_type = u32;
 #[repr(u32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum nsAString_internal__bindgen_ty_bindgen_id_63525 {
+pub enum nsAString_internal__bindgen_ty_bindgen_id_63528 {
     F_NONE = 0,
     F_TERMINATED = 1,
     F_VOIDED = 2,
     F_SHARED = 4,
     F_OWNED = 8,
     F_FIXED = 16,
     F_LITERAL = 32,
     F_CLASS_FIXED = 65536,
@@ -1672,22 +1677,22 @@ impl Clone for nsString_Segment {
     fn clone(&self) -> Self { *self }
 }
 #[test]
 fn bindgen_test_layout_nsString() {
     assert_eq!(::std::mem::size_of::<nsString>() , 16usize);
     assert_eq!(::std::mem::align_of::<nsString>() , 8usize);
 }
 #[repr(C)]
-pub struct bindgen_vtable__bindgen_id_64135 {
+pub struct bindgen_vtable__bindgen_id_64138 {
 }
 #[repr(C)]
 #[derive(Debug, Copy)]
 pub struct nsStringComparator {
-    pub vtable_: *const bindgen_vtable__bindgen_id_64135,
+    pub vtable_: *const bindgen_vtable__bindgen_id_64138,
 }
 pub type nsStringComparator_char_type = u16;
 #[test]
 fn bindgen_test_layout_nsStringComparator() {
     assert_eq!(::std::mem::size_of::<nsStringComparator>() , 8usize);
     assert_eq!(::std::mem::align_of::<nsStringComparator>() , 8usize);
 }
 impl Clone for nsStringComparator {
@@ -1719,17 +1724,17 @@ pub type nsACString_internal_comparator_
 pub type nsACString_internal_char_iterator =
     *mut nsACString_internal_char_type;
 pub type nsACString_internal_const_char_iterator =
     *const nsACString_internal_char_type;
 pub type nsACString_internal_size_type = u32;
 pub type nsACString_internal_index_type = u32;
 #[repr(u32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum nsACString_internal__bindgen_ty_bindgen_id_65365 {
+pub enum nsACString_internal__bindgen_ty_bindgen_id_65368 {
     F_NONE = 0,
     F_TERMINATED = 1,
     F_VOIDED = 2,
     F_SHARED = 4,
     F_OWNED = 8,
     F_FIXED = 16,
     F_LITERAL = 32,
     F_CLASS_FIXED = 65536,
@@ -1781,45 +1786,45 @@ impl Clone for nsCString_Segment {
     fn clone(&self) -> Self { *self }
 }
 #[test]
 fn bindgen_test_layout_nsCString() {
     assert_eq!(::std::mem::size_of::<nsCString>() , 16usize);
     assert_eq!(::std::mem::align_of::<nsCString>() , 8usize);
 }
 #[repr(C)]
-pub struct bindgen_vtable__bindgen_id_65917 {
+pub struct bindgen_vtable__bindgen_id_65920 {
 }
 #[repr(C)]
 #[derive(Debug, Copy)]
 pub struct nsCStringComparator {
-    pub vtable_: *const bindgen_vtable__bindgen_id_65917,
+    pub vtable_: *const bindgen_vtable__bindgen_id_65920,
 }
 pub type nsCStringComparator_char_type = ::std::os::raw::c_char;
 #[test]
 fn bindgen_test_layout_nsCStringComparator() {
     assert_eq!(::std::mem::size_of::<nsCStringComparator>() , 8usize);
     assert_eq!(::std::mem::align_of::<nsCStringComparator>() , 8usize);
 }
 impl Clone for nsCStringComparator {
     fn clone(&self) -> Self { *self }
 }
 #[repr(C)]
-pub struct bindgen_vtable__bindgen_id_65961 {
+pub struct bindgen_vtable__bindgen_id_65964 {
 }
 /**
  * Basic component object model interface. Objects which implement
  * this interface support runtime interface discovery (QueryInterface)
  * and a reference counted memory model (AddRef/Release). This is
  * modelled after the win32 IUnknown API.
  */
 #[repr(C)]
 #[derive(Debug, Copy)]
 pub struct nsISupports {
-    pub vtable_: *const bindgen_vtable__bindgen_id_65961,
+    pub vtable_: *const bindgen_vtable__bindgen_id_65964,
 }
 #[repr(C)]
 #[derive(Debug, Copy, Clone)]
 pub struct nsISupports_COMTypeInfo<T, U> {
     pub _address: u8,
     pub _phantom_0: ::std::marker::PhantomData<T>,
     pub _phantom_1: ::std::marker::PhantomData<U>,
 }
@@ -1827,25 +1832,25 @@ pub struct nsISupports_COMTypeInfo<T, U>
 fn bindgen_test_layout_nsISupports() {
     assert_eq!(::std::mem::size_of::<nsISupports>() , 8usize);
     assert_eq!(::std::mem::align_of::<nsISupports>() , 8usize);
 }
 impl Clone for nsISupports {
     fn clone(&self) -> Self { *self }
 }
 #[repr(C)]
-pub struct bindgen_vtable__bindgen_id_66244 {
+pub struct bindgen_vtable__bindgen_id_66247 {
 }
 /**
  * Participant implementation classes
  */
 #[repr(C)]
 #[derive(Debug, Copy)]
 pub struct nsCycleCollectionParticipant {
-    pub vtable_: *const bindgen_vtable__bindgen_id_66244,
+    pub vtable_: *const bindgen_vtable__bindgen_id_66247,
     pub mMightSkip: bool,
 }
 #[test]
 fn bindgen_test_layout_nsCycleCollectionParticipant() {
     assert_eq!(::std::mem::size_of::<nsCycleCollectionParticipant>() ,
                16usize);
     assert_eq!(::std::mem::align_of::<nsCycleCollectionParticipant>() ,
                8usize);
@@ -2144,17 +2149,17 @@ fn bindgen_test_layout_ErrorResult() {
  * A cleanup policy consists of two booleans: whether to assert that we've been
  * reported or suppressed, and whether to then go ahead and suppress the
  * exception.
  */
 #[repr(C)]
 #[derive(Debug)]
 pub struct TErrorResult<CleanupPolicy> {
     pub mResult: nsresult,
-    pub __bindgen_anon_1: TErrorResult__bindgen_ty_bindgen_id_73746<CleanupPolicy>,
+    pub __bindgen_anon_1: TErrorResult__bindgen_ty_bindgen_id_73749<CleanupPolicy>,
     pub mMightHaveUnreportedJSException: bool,
     pub mUnionState: TErrorResult_UnionState,
     pub _mOwningThread: nsAutoOwningThread,
     pub _phantom_0: ::std::marker::PhantomData<CleanupPolicy>,
 }
 pub const TErrorResult_UnionState_HasDOMExceptionInfo: TErrorResult_UnionState
           =
     TErrorResult_UnionState::HasMessage;
@@ -2174,17 +2179,17 @@ pub struct TErrorResult_Message<CleanupP
 #[repr(C)]
 #[derive(Debug, Copy, Clone)]
 pub struct TErrorResult_DOMExceptionInfo<CleanupPolicy> {
     pub _address: u8,
     pub _phantom_0: ::std::marker::PhantomData<CleanupPolicy>,
 }
 #[repr(C)]
 #[derive(Debug, Copy, Clone)]
-pub struct TErrorResult__bindgen_ty_bindgen_id_73746<CleanupPolicy> {
+pub struct TErrorResult__bindgen_ty_bindgen_id_73749<CleanupPolicy> {
     pub mMessage: __BindgenUnionField<*mut TErrorResult_Message<CleanupPolicy>>,
     pub mJSException: __BindgenUnionField<Value>,
     pub mDOMExceptionInfo: __BindgenUnionField<*mut TErrorResult_DOMExceptionInfo<CleanupPolicy>>,
     pub bindgen_union_field: u64,
     pub _phantom_0: ::std::marker::PhantomData<CleanupPolicy>,
 }
 #[repr(C)]
 #[derive(Debug, Copy)]
@@ -2321,17 +2326,17 @@ impl nsIAtom {
     #[inline]
     pub fn set_mIsStatic(&mut self, val: u32) {
         self._bitfield_1 &= !(2147483648usize as u32);
         self._bitfield_1 |=
             ((val as u32 as u32) << 31u32) & (2147483648usize as u32);
     }
 }
 #[repr(C)]
-pub struct bindgen_vtable__bindgen_id_74733 {
+pub struct bindgen_vtable__bindgen_id_74736 {
 }
 /**
  * Class to store the wrapper for an object. This can only be used with objects
  * that only have one non-security wrapper at a time (for an XPCWrappedNative
  * this is usually ensured by setting an explicit parent in the PreCreate hook
  * for the class).
  *
  * An instance of nsWrapperCache can be gotten from an object that implements
@@ -2363,17 +2368,17 @@ pub struct bindgen_vtable__bindgen_id_74
  *
  * A number of the methods are implemented in nsWrapperCacheInlines.h because we
  * have to include some JS headers that don't play nicely with the rest of the
  * codebase. Include nsWrapperCacheInlines.h if you need to call those methods.
  */
 #[repr(C)]
 #[derive(Debug)]
 pub struct nsWrapperCache {
-    pub vtable_: *const bindgen_vtable__bindgen_id_74733,
+    pub vtable_: *const bindgen_vtable__bindgen_id_74736,
     pub mWrapper: *mut JSObject,
     pub mFlags: nsWrapperCache_FlagsType,
 }
 #[repr(C)]
 #[derive(Debug, Copy, Clone)]
 pub struct nsWrapperCache_COMTypeInfo<T, U> {
     pub _address: u8,
     pub _phantom_0: ::std::marker::PhantomData<T>,
@@ -2388,31 +2393,31 @@ pub type nsWrapperCache_FlagsType = u32;
    * causes between the native object and the JS object, so it is important that
    * any native object that supports preserving of its wrapper
    * traces/traverses/unlinks the cached JS object (see
    * NS_IMPL_CYCLE_COLLECTION_TRACE_PRESERVED_WRAPPER,
    * NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS and
    * NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER).
    */
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum nsWrapperCache__bindgen_ty_bindgen_id_74940 {
+pub enum nsWrapperCache__bindgen_ty_bindgen_id_74943 {
     WRAPPER_BIT_PRESERVED = 1,
 }
 #[repr(u32)]
 /**
    * If this bit is set then the wrapper for the native object is not a DOM
    * binding.
    */
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum nsWrapperCache__bindgen_ty_bindgen_id_74943 {
+pub enum nsWrapperCache__bindgen_ty_bindgen_id_74946 {
     WRAPPER_IS_NOT_DOM_BINDING = 2,
 }
 #[repr(u32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum nsWrapperCache__bindgen_ty_bindgen_id_74946 {
+pub enum nsWrapperCache__bindgen_ty_bindgen_id_74949 {
     kWrapperFlagsMask = 3,
 }
 #[test]
 fn bindgen_test_layout_nsWrapperCache() {
     assert_eq!(::std::mem::size_of::<nsWrapperCache>() , 24usize);
     assert_eq!(::std::mem::align_of::<nsWrapperCache>() , 8usize);
 }
 #[repr(C)]
@@ -2511,33 +2516,33 @@ impl Clone for bidirectional_iterator_ta
 #[derive(Debug, Copy)]
 pub struct random_access_iterator_tag {
     pub _address: u8,
 }
 impl Clone for random_access_iterator_tag {
     fn clone(&self) -> Self { *self }
 }
 #[repr(C)]
-pub struct bindgen_vtable__bindgen_id_94562 {
+pub struct bindgen_vtable__bindgen_id_94565 {
 }
 /**
  * A class of objects that return source code on demand.
  *
  * When code is compiled with setSourceIsLazy(true), SpiderMonkey doesn't
  * retain the source code (and doesn't do lazy bytecode generation). If we ever
  * need the source code, say, in response to a call to Function.prototype.
  * toSource or Debugger.Source.prototype.text, then we call the 'load' member
  * function of the instance of this class that has hopefully been registered
  * with the runtime, passing the code's URL, and hope that it will be able to
  * find the source.
  */
 #[repr(C)]
 #[derive(Debug)]
 pub struct SourceHook {
-    pub vtable_: *const bindgen_vtable__bindgen_id_94562,
+    pub vtable_: *const bindgen_vtable__bindgen_id_94565,
 }
 #[test]
 fn bindgen_test_layout_SourceHook() {
     assert_eq!(::std::mem::size_of::<SourceHook>() , 8usize);
     assert_eq!(::std::mem::align_of::<SourceHook>() , 8usize);
 }
 #[repr(C)]
 #[derive(Debug, Copy)]
@@ -2548,17 +2553,17 @@ pub struct nsIPrincipal {
 #[derive(Debug, Copy, Clone)]
 pub struct nsIPrincipal_COMTypeInfo<T, U> {
     pub _address: u8,
     pub _phantom_0: ::std::marker::PhantomData<T>,
     pub _phantom_1: ::std::marker::PhantomData<U>,
 }
 #[repr(u32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum nsIPrincipal__bindgen_ty_bindgen_id_100010 {
+pub enum nsIPrincipal__bindgen_ty_bindgen_id_100013 {
     APP_STATUS_NOT_INSTALLED = 0,
     APP_STATUS_INSTALLED = 1,
     APP_STATUS_PRIVILEGED = 2,
     APP_STATUS_CERTIFIED = 3,
 }
 #[test]
 fn bindgen_test_layout_nsIPrincipal() {
     assert_eq!(::std::mem::size_of::<nsIPrincipal>() , 8usize);
@@ -2871,17 +2876,17 @@ pub enum nsIDocument_DocumentTheme {
     Doc_Theme_Neutral = 2,
     Doc_Theme_Dark = 3,
     Doc_Theme_Bright = 4,
 }
 pub type nsIDocument_FrameRequestCallbackList =
     nsTArray<RefPtr<FrameRequestCallback>>;
 #[repr(u32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum nsIDocument__bindgen_ty_bindgen_id_108720 { REQUEST_DISCARD = 1, }
+pub enum nsIDocument__bindgen_ty_bindgen_id_108729 { REQUEST_DISCARD = 1, }
 #[repr(u32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
 pub enum nsIDocument_DeprecatedOperations {
     eGetAttributeNode = 0,
     eSetAttributeNode = 1,
     eGetAttributeNodeNS = 2,
     eSetAttributeNodeNS = 3,
     eRemoveAttributeNode = 4,
@@ -3562,20 +3567,19 @@ impl nsIDocument {
 pub struct nsINode {
     pub _base: EventTarget,
     pub mNodeInfo: RefPtr<NodeInfo>,
     pub mParent: *mut nsINode,
     pub mBoolFlags: u32,
     pub mNextSibling: *mut nsIContent,
     pub mPreviousSibling: *mut nsIContent,
     pub mFirstChild: *mut nsIContent,
-    pub __bindgen_anon_1: nsINode__bindgen_ty_bindgen_id_105423,
+    pub __bindgen_anon_1: nsINode__bindgen_ty_bindgen_id_105432,
     pub mSlots: *mut nsINode_nsSlots,
-    pub mServoNodeData: UniquePtr<ServoNodeData,
-                                  DefaultDelete<ServoNodeData>>,
+    pub mServoData: ServoCell<*mut ServoNodeData>,
 }
 pub type nsINode_BoxQuadOptions = BoxQuadOptions;
 pub type nsINode_ConvertCoordinateOptions = ConvertCoordinateOptions;
 pub type nsINode_DOMPoint = DOMPoint;
 pub type nsINode_DOMPointInit = DOMPointInit;
 pub type nsINode_DOMQuad = DOMQuad;
 pub type nsINode_DOMRectReadOnly = DOMRectReadOnly;
 pub type nsINode_OwningNodeOrString = OwningNodeOrString;
@@ -3588,37 +3592,37 @@ pub struct nsINode_COMTypeInfo<T, U> {
     pub _phantom_0: ::std::marker::PhantomData<T>,
     pub _phantom_1: ::std::marker::PhantomData<U>,
 }
 #[repr(u32)]
 /**
    * Bit-flags to pass (or'ed together) to IsNodeOfType()
    */
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum nsINode__bindgen_ty_bindgen_id_101554 {
+pub enum nsINode__bindgen_ty_bindgen_id_101557 {
     eCONTENT = 1,
     eDOCUMENT = 2,
     eATTRIBUTE = 4,
     eTEXT = 8,
     ePROCESSING_INSTRUCTION = 16,
     eCOMMENT = 32,
     eHTML_FORM_CONTROL = 64,
     eDOCUMENT_FRAGMENT = 128,
     eDATA_NODE = 256,
     eMEDIA = 512,
     eANIMATION = 1024,
     eFILTER = 2048,
 }
 #[repr(C)]
-pub struct bindgen_vtable__bindgen_id_102323 {
+pub struct bindgen_vtable__bindgen_id_102326 {
 }
 #[repr(C)]
 #[derive(Debug)]
 pub struct nsINode_nsSlots {
-    pub vtable_: *const bindgen_vtable__bindgen_id_102323,
+    pub vtable_: *const bindgen_vtable__bindgen_id_102326,
     /**
      * A list of mutation observers
      */
     pub mMutationObservers: [u64; 2usize],
     /**
      * An object implementing nsIDOMNodeList for this content (childNodes)
      * @see nsIDOMNodeList
      * @see nsGenericHTMLElement::GetChildNodes
@@ -3677,29 +3681,29 @@ pub enum nsINode_BooleanFlag {
     NodeHasRelevantHoverRules = 28,
     ElementHasWeirdParserInsertionMode = 29,
     ParserHasNotified = 30,
     MayBeApzAware = 31,
     BooleanFlagCount = 32,
 }
 #[repr(C)]
 #[derive(Debug, Copy)]
-pub struct nsINode__bindgen_ty_bindgen_id_105423 {
+pub struct nsINode__bindgen_ty_bindgen_id_105432 {
     pub mPrimaryFrame: __BindgenUnionField<*mut nsIFrame>,
     pub mSubtreeRoot: __BindgenUnionField<*mut nsINode>,
     pub bindgen_union_field: u64,
 }
 #[test]
-fn bindgen_test_layout_nsINode__bindgen_ty_bindgen_id_105423() {
-    assert_eq!(::std::mem::size_of::<nsINode__bindgen_ty_bindgen_id_105423>()
+fn bindgen_test_layout_nsINode__bindgen_ty_bindgen_id_105432() {
+    assert_eq!(::std::mem::size_of::<nsINode__bindgen_ty_bindgen_id_105432>()
                , 8usize);
-    assert_eq!(::std::mem::align_of::<nsINode__bindgen_ty_bindgen_id_105423>()
+    assert_eq!(::std::mem::align_of::<nsINode__bindgen_ty_bindgen_id_105432>()
                , 8usize);
 }
-impl Clone for nsINode__bindgen_ty_bindgen_id_105423 {
+impl Clone for nsINode__bindgen_ty_bindgen_id_105432 {
     fn clone(&self) -> Self { *self }
 }
 #[test]
 fn bindgen_test_layout_nsINode() {
     assert_eq!(::std::mem::size_of::<nsINode>() , 104usize);
     assert_eq!(::std::mem::align_of::<nsINode>() , 8usize);
 }
 #[repr(C)]
@@ -4039,33 +4043,33 @@ pub struct nsIDOMNode {
 #[derive(Debug, Copy, Clone)]
 pub struct nsIDOMNode_COMTypeInfo<T, U> {
     pub _address: u8,
     pub _phantom_0: ::std::marker::PhantomData<T>,
     pub _phantom_1: ::std::marker::PhantomData<U>,
 }
 #[repr(u32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum nsIDOMNode__bindgen_ty_bindgen_id_113557 {
+pub enum nsIDOMNode__bindgen_ty_bindgen_id_113566 {
     ELEMENT_NODE = 1,
     ATTRIBUTE_NODE = 2,
     TEXT_NODE = 3,
     CDATA_SECTION_NODE = 4,
     ENTITY_REFERENCE_NODE = 5,
     ENTITY_NODE = 6,
     PROCESSING_INSTRUCTION_NODE = 7,
     COMMENT_NODE = 8,
     DOCUMENT_NODE = 9,
     DOCUMENT_TYPE_NODE = 10,
     DOCUMENT_FRAGMENT_NODE = 11,
     NOTATION_NODE = 12,
 }
 #[repr(u32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum nsIDOMNode__bindgen_ty_bindgen_id_113776 {
+pub enum nsIDOMNode__bindgen_ty_bindgen_id_113785 {
     DOCUMENT_POSITION_DISCONNECTED = 1,
     DOCUMENT_POSITION_PRECEDING = 2,
     DOCUMENT_POSITION_FOLLOWING = 4,
     DOCUMENT_POSITION_CONTAINS = 8,
     DOCUMENT_POSITION_CONTAINED_BY = 16,
     DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC = 32,
 }
 #[test]
@@ -5162,17 +5166,17 @@ pub type PLDHashInitEntry =
 pub struct nsPtrHashKey<T> {
     pub _base: PLDHashEntryHdr,
     pub mKey: *mut T,
 }
 pub type nsPtrHashKey_KeyType<T> = *mut T;
 pub type nsPtrHashKey_KeyTypePointer<T> = *mut T;
 #[repr(i32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum nsPtrHashKey__bindgen_ty_bindgen_id_118298 { ALLOW_MEMMOVE = 0, }
+pub enum nsPtrHashKey__bindgen_ty_bindgen_id_118307 { ALLOW_MEMMOVE = 0, }
 /**
  * A node of content in a document's content model. This interface
  * is supported by all content objects.
  */
 #[repr(C)]
 #[derive(Debug)]
 pub struct nsIContent {
     pub _base: nsINode,
@@ -5182,24 +5186,24 @@ pub type nsIContent_IMEState = IMEState;
 #[derive(Debug, Copy, Clone)]
 pub struct nsIContent_COMTypeInfo<T, U> {
     pub _address: u8,
     pub _phantom_0: ::std::marker::PhantomData<T>,
     pub _phantom_1: ::std::marker::PhantomData<U>,
 }
 #[repr(u32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum nsIContent__bindgen_ty_bindgen_id_119638 {
+pub enum nsIContent__bindgen_ty_bindgen_id_119647 {
     eAllChildren = 0,
     eAllButXBL = 1,
     eSkipPlaceholderContent = 2,
 }
 #[repr(i32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum nsIContent__bindgen_ty_bindgen_id_119874 {
+pub enum nsIContent__bindgen_ty_bindgen_id_119883 {
     ATTR_MISSING = -1,
     ATTR_VALUE_NO_MATCH = -2,
 }
 /**
    * Check whether this content node's given attribute has one of a given
    * list of values. If there is a match, we return the index in the list
    * of the first matching value. If there was no attribute at all, then
    * we return ATTR_MISSING. If there was an attribute but it didn't
@@ -5395,17 +5399,17 @@ pub struct FragmentOrElement_nsDOMSlots 
      * Holds any SMIL override style declaration for this element.
      */
     pub mSMILOverrideStyleDeclaration: RefPtr<Declaration>,
     /**
      * An object implementing nsIDOMMozNamedAttrMap for this content (attributes)
      * @see FragmentOrElement::GetAttributes
      */
     pub mAttributeMap: RefPtr<nsDOMAttributeMap>,
-    pub __bindgen_anon_1: FragmentOrElement_nsDOMSlots__bindgen_ty_bindgen_id_121005,
+    pub __bindgen_anon_1: FragmentOrElement_nsDOMSlots__bindgen_ty_bindgen_id_121014,
     /**
      * An object implementing the .children property for this element.
      */
     pub mChildrenList: RefPtr<nsContentList>,
     /**
      * An object implementing the .classList property for this element.
      */
     pub mClassList: RefPtr<nsDOMTokenList>,
@@ -5432,36 +5436,36 @@ pub struct FragmentOrElement_nsDOMSlots 
     pub mXBLInsertionParent: nsCOMPtr<nsIContent>,
     /**
      * Web components custom element data.
      */
     pub mCustomElementData: RefPtr<CustomElementData>,
 }
 #[repr(C)]
 #[derive(Debug, Copy)]
-pub struct FragmentOrElement_nsDOMSlots__bindgen_ty_bindgen_id_121005 {
+pub struct FragmentOrElement_nsDOMSlots__bindgen_ty_bindgen_id_121014 {
     /**
       * The nearest enclosing content node with a binding that created us.
       * @see FragmentOrElement::GetBindingParent
       */
     pub mBindingParent: __BindgenUnionField<*mut nsIContent>,
     /**
       * The controllers of the XUL Element.
       */
     pub mControllers: __BindgenUnionField<*mut nsIControllers>,
     pub bindgen_union_field: u64,
 }
 #[test]
-fn bindgen_test_layout_FragmentOrElement_nsDOMSlots__bindgen_ty_bindgen_id_121005() {
-    assert_eq!(::std::mem::size_of::<FragmentOrElement_nsDOMSlots__bindgen_ty_bindgen_id_121005>()
+fn bindgen_test_layout_FragmentOrElement_nsDOMSlots__bindgen_ty_bindgen_id_121014() {
+    assert_eq!(::std::mem::size_of::<FragmentOrElement_nsDOMSlots__bindgen_ty_bindgen_id_121014>()
                , 8usize);
-    assert_eq!(::std::mem::align_of::<FragmentOrElement_nsDOMSlots__bindgen_ty_bindgen_id_121005>()
+    assert_eq!(::std::mem::align_of::<FragmentOrElement_nsDOMSlots__bindgen_ty_bindgen_id_121014>()
                , 8usize);
 }
-impl Clone for FragmentOrElement_nsDOMSlots__bindgen_ty_bindgen_id_121005 {
+impl Clone for FragmentOrElement_nsDOMSlots__bindgen_ty_bindgen_id_121014 {
     fn clone(&self) -> Self { *self }
 }
 #[test]
 fn bindgen_test_layout_FragmentOrElement_nsDOMSlots() {
     assert_eq!(::std::mem::size_of::<FragmentOrElement_nsDOMSlots>() ,
                168usize);
     assert_eq!(::std::mem::align_of::<FragmentOrElement_nsDOMSlots>() ,
                8usize);
@@ -5523,31 +5527,31 @@ pub struct nsIChannel {
 #[derive(Debug, Copy, Clone)]
 pub struct nsIChannel_COMTypeInfo<T, U> {
     pub _address: u8,
     pub _phantom_0: ::std::marker::PhantomData<T>,
     pub _phantom_1: ::std::marker::PhantomData<U>,
 }
 #[repr(u32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum nsIChannel__bindgen_ty_bindgen_id_138490 {
+pub enum nsIChannel__bindgen_ty_bindgen_id_138499 {
     LOAD_DOCUMENT_URI = 65536,
     LOAD_RETARGETED_DOCUMENT_URI = 131072,
     LOAD_REPLACE = 262144,
     LOAD_INITIAL_DOCUMENT_URI = 524288,
     LOAD_TARGETED = 1048576,
     LOAD_CALL_CONTENT_SNIFFERS = 2097152,
     LOAD_CLASSIFY_URI = 4194304,
     LOAD_MEDIA_SNIFFER_OVERRIDES_CONTENT_TYPE = 8388608,
     LOAD_EXPLICIT_CREDENTIALS = 16777216,
     LOAD_BYPASS_SERVICE_WORKER = 33554432,
 }
 #[repr(u32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum nsIChannel__bindgen_ty_bindgen_id_138510 {
+pub enum nsIChannel__bindgen_ty_bindgen_id_138519 {
     DISPOSITION_INLINE = 0,
     DISPOSITION_ATTACHMENT = 1,
 }
 #[test]
 fn bindgen_test_layout_nsIChannel() {
     assert_eq!(::std::mem::size_of::<nsIChannel>() , 8usize);
     assert_eq!(::std::mem::align_of::<nsIChannel>() , 8usize);
 }
@@ -5563,17 +5567,17 @@ pub struct nsIRequest {
 #[derive(Debug, Copy, Clone)]
 pub struct nsIRequest_COMTypeInfo<T, U> {
     pub _address: u8,
     pub _phantom_0: ::std::marker::PhantomData<T>,
     pub _phantom_1: ::std::marker::PhantomData<U>,
 }
 #[repr(u32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum nsIRequest__bindgen_ty_bindgen_id_138328 {
+pub enum nsIRequest__bindgen_ty_bindgen_id_138337 {
     LOAD_REQUESTMASK = 65535,
     LOAD_NORMAL = 0,
     LOAD_BACKGROUND = 1,
     INHIBIT_PIPELINE = 64,
     INHIBIT_CACHING = 128,
     INHIBIT_PERSISTENT_CACHING = 256,
     LOAD_BYPASS_CACHE = 512,
     LOAD_FROM_CACHE = 1024,
@@ -6117,23 +6121,23 @@ pub enum nsIPresShell_IntrinsicDirty {
 }
 #[repr(u32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
 pub enum nsIPresShell_ReflowRootHandling {
     ePositionOrSizeChange = 0,
     eNoPositionOrSizeChange = 1,
     eInferFromBitToAdd = 2,
 }
-pub const SCROLL_LEFT: nsIPresShell__bindgen_ty_bindgen_id_156315 =
-    nsIPresShell__bindgen_ty_bindgen_id_156315::SCROLL_TOP;
-pub const SCROLL_RIGHT: nsIPresShell__bindgen_ty_bindgen_id_156315 =
-    nsIPresShell__bindgen_ty_bindgen_id_156315::SCROLL_BOTTOM;
+pub const SCROLL_LEFT: nsIPresShell__bindgen_ty_bindgen_id_156336 =
+    nsIPresShell__bindgen_ty_bindgen_id_156336::SCROLL_TOP;
+pub const SCROLL_RIGHT: nsIPresShell__bindgen_ty_bindgen_id_156336 =
+    nsIPresShell__bindgen_ty_bindgen_id_156336::SCROLL_BOTTOM;
 #[repr(i32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum nsIPresShell__bindgen_ty_bindgen_id_156315 {
+pub enum nsIPresShell__bindgen_ty_bindgen_id_156336 {
     SCROLL_TOP = 0,
     SCROLL_BOTTOM = 100,
     SCROLL_CENTER = 50,
     SCROLL_MINIMUM = -1,
 }
 #[repr(u32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
 pub enum nsIPresShell_WhenToScroll {
@@ -6151,17 +6155,17 @@ fn bindgen_test_layout_nsIPresShell_Scro
     assert_eq!(::std::mem::size_of::<nsIPresShell_ScrollAxis>() , 4usize);
     assert_eq!(::std::mem::align_of::<nsIPresShell_ScrollAxis>() , 4usize);
 }
 impl Clone for nsIPresShell_ScrollAxis {
     fn clone(&self) -> Self { *self }
 }
 #[repr(u32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum nsIPresShell__bindgen_ty_bindgen_id_156346 {
+pub enum nsIPresShell__bindgen_ty_bindgen_id_156367 {
     SCROLL_FIRST_ANCESTOR_ONLY = 1,
     SCROLL_OVERFLOW_HIDDEN = 2,
     SCROLL_NO_PARENT_FRAMES = 4,
     SCROLL_SMOOTH = 8,
     SCROLL_SMOOTH_AUTO = 16,
 }
 #[repr(u32)]
 /**
@@ -6198,41 +6202,41 @@ pub enum nsIPresShell__bindgen_ty_bindge
    * or the document is in ignore viewport scrolling mode
    * (nsIPresShell::SetIgnoreViewportScrolling/IgnoringViewportScrolling).
    * @param aBackgroundColor a background color to render onto
    * @param aRenderedContext the gfxContext to render to. We render so that
    * one CSS pixel in the source document is rendered to one unit in the current
    * transform.
    */
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum nsIPresShell__bindgen_ty_bindgen_id_156799 {
+pub enum nsIPresShell__bindgen_ty_bindgen_id_156820 {
     RENDER_IS_UNTRUSTED = 1,
     RENDER_IGNORE_VIEWPORT_SCROLLING = 2,
     RENDER_CARET = 4,
     RENDER_USE_WIDGET_LAYERS = 8,
     RENDER_ASYNC_DECODE_IMAGES = 16,
     RENDER_DOCUMENT_RELATIVE = 32,
     RENDER_DRAWWINDOW_NOT_FLUSHING = 64,
 }
 #[repr(u32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum nsIPresShell__bindgen_ty_bindgen_id_156817 {
+pub enum nsIPresShell__bindgen_ty_bindgen_id_156838 {
     RENDER_IS_IMAGE = 256,
     RENDER_AUTO_SCALE = 128,
 }
 #[repr(u32)]
 /**
    * Add a solid color item to the bottom of aList with frame aFrame and bounds
    * aBounds. Checks first if this needs to be done by checking if aFrame is a
    * canvas frame (if the FORCE_DRAW flag is passed then this check is skipped).
    * aBackstopColor is composed behind the background color of the canvas, it is
    * transparent by default.
    */
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum nsIPresShell__bindgen_ty_bindgen_id_156940 { FORCE_DRAW = 1, }
+pub enum nsIPresShell__bindgen_ty_bindgen_id_156961 { FORCE_DRAW = 1, }
 #[repr(C)]
 #[derive(Debug)]
 pub struct nsIPresShell_PointerCaptureInfo {
     pub mPendingContent: nsCOMPtr<nsIContent>,
     pub mOverrideContent: nsCOMPtr<nsIContent>,
     pub mPrimaryState: bool,
 }
 #[test]
@@ -6495,24 +6499,16 @@ fn bindgen_test_layout_nsNodeWeakReferen
 pub struct nsDOMMutationObserver {
     pub _address: u8,
 }
 impl Clone for nsDOMMutationObserver {
     fn clone(&self) -> Self { *self }
 }
 #[repr(C)]
 #[derive(Debug, Copy)]
-pub struct ServoNodeData {
-    pub _address: u8,
-}
-impl Clone for ServoNodeData {
-    fn clone(&self) -> Self { *self }
-}
-#[repr(C)]
-#[derive(Debug, Copy)]
 pub struct BoxQuadOptions {
     pub _address: u8,
 }
 impl Clone for BoxQuadOptions {
     fn clone(&self) -> Self { *self }
 }
 #[repr(C)]
 #[derive(Debug, Copy)]
@@ -6617,77 +6613,77 @@ impl Clone for TextOrElementOrDocument {
 #[repr(C)]
 #[derive(Debug, Copy)]
 pub struct DOMPointInit {
     pub _address: u8,
 }
 impl Clone for DOMPointInit {
     fn clone(&self) -> Self { *self }
 }
-pub const NODE_HAS_LISTENERMANAGER: _bindgen_ty_bindgen_id_158347 =
-    _bindgen_ty_bindgen_id_158347::NODE_HAS_LISTENERMANAGER;
-pub const NODE_HAS_PROPERTIES: _bindgen_ty_bindgen_id_158347 =
-    _bindgen_ty_bindgen_id_158347::NODE_HAS_PROPERTIES;
-pub const NODE_IS_ANONYMOUS_ROOT: _bindgen_ty_bindgen_id_158347 =
-    _bindgen_ty_bindgen_id_158347::NODE_IS_ANONYMOUS_ROOT;
-pub const NODE_IS_IN_NATIVE_ANONYMOUS_SUBTREE: _bindgen_ty_bindgen_id_158347 =
-    _bindgen_ty_bindgen_id_158347::NODE_IS_IN_NATIVE_ANONYMOUS_SUBTREE;
-pub const NODE_IS_NATIVE_ANONYMOUS_ROOT: _bindgen_ty_bindgen_id_158347 =
-    _bindgen_ty_bindgen_id_158347::NODE_IS_NATIVE_ANONYMOUS_ROOT;
-pub const NODE_FORCE_XBL_BINDINGS: _bindgen_ty_bindgen_id_158347 =
-    _bindgen_ty_bindgen_id_158347::NODE_FORCE_XBL_BINDINGS;
-pub const NODE_MAY_BE_IN_BINDING_MNGR: _bindgen_ty_bindgen_id_158347 =
-    _bindgen_ty_bindgen_id_158347::NODE_MAY_BE_IN_BINDING_MNGR;
-pub const NODE_IS_EDITABLE: _bindgen_ty_bindgen_id_158347 =
-    _bindgen_ty_bindgen_id_158347::NODE_IS_EDITABLE;
-pub const NODE_MAY_HAVE_CLASS: _bindgen_ty_bindgen_id_158347 =
-    _bindgen_ty_bindgen_id_158347::NODE_MAY_HAVE_CLASS;
-pub const NODE_IS_IN_SHADOW_TREE: _bindgen_ty_bindgen_id_158347 =
-    _bindgen_ty_bindgen_id_158347::NODE_IS_IN_SHADOW_TREE;
-pub const NODE_HAS_EMPTY_SELECTOR: _bindgen_ty_bindgen_id_158347 =
-    _bindgen_ty_bindgen_id_158347::NODE_HAS_EMPTY_SELECTOR;
-pub const NODE_HAS_SLOW_SELECTOR: _bindgen_ty_bindgen_id_158347 =
-    _bindgen_ty_bindgen_id_158347::NODE_HAS_SLOW_SELECTOR;
-pub const NODE_HAS_EDGE_CHILD_SELECTOR: _bindgen_ty_bindgen_id_158347 =
-    _bindgen_ty_bindgen_id_158347::NODE_HAS_EDGE_CHILD_SELECTOR;
-pub const NODE_HAS_SLOW_SELECTOR_LATER_SIBLINGS: _bindgen_ty_bindgen_id_158347
+pub const NODE_HAS_LISTENERMANAGER: _bindgen_ty_bindgen_id_158361 =
+    _bindgen_ty_bindgen_id_158361::NODE_HAS_LISTENERMANAGER;
+pub const NODE_HAS_PROPERTIES: _bindgen_ty_bindgen_id_158361 =
+    _bindgen_ty_bindgen_id_158361::NODE_HAS_PROPERTIES;
+pub const NODE_IS_ANONYMOUS_ROOT: _bindgen_ty_bindgen_id_158361 =
+    _bindgen_ty_bindgen_id_158361::NODE_IS_ANONYMOUS_ROOT;
+pub const NODE_IS_IN_NATIVE_ANONYMOUS_SUBTREE: _bindgen_ty_bindgen_id_158361 =
+    _bindgen_ty_bindgen_id_158361::NODE_IS_IN_NATIVE_ANONYMOUS_SUBTREE;
+pub const NODE_IS_NATIVE_ANONYMOUS_ROOT: _bindgen_ty_bindgen_id_158361 =
+    _bindgen_ty_bindgen_id_158361::NODE_IS_NATIVE_ANONYMOUS_ROOT;
+pub const NODE_FORCE_XBL_BINDINGS: _bindgen_ty_bindgen_id_158361 =
+    _bindgen_ty_bindgen_id_158361::NODE_FORCE_XBL_BINDINGS;
+pub const NODE_MAY_BE_IN_BINDING_MNGR: _bindgen_ty_bindgen_id_158361 =
+    _bindgen_ty_bindgen_id_158361::NODE_MAY_BE_IN_BINDING_MNGR;
+pub const NODE_IS_EDITABLE: _bindgen_ty_bindgen_id_158361 =
+    _bindgen_ty_bindgen_id_158361::NODE_IS_EDITABLE;
+pub const NODE_MAY_HAVE_CLASS: _bindgen_ty_bindgen_id_158361 =
+    _bindgen_ty_bindgen_id_158361::NODE_MAY_HAVE_CLASS;
+pub const NODE_IS_IN_SHADOW_TREE: _bindgen_ty_bindgen_id_158361 =
+    _bindgen_ty_bindgen_id_158361::NODE_IS_IN_SHADOW_TREE;
+pub const NODE_HAS_EMPTY_SELECTOR: _bindgen_ty_bindgen_id_158361 =
+    _bindgen_ty_bindgen_id_158361::NODE_HAS_EMPTY_SELECTOR;
+pub const NODE_HAS_SLOW_SELECTOR: _bindgen_ty_bindgen_id_158361 =
+    _bindgen_ty_bindgen_id_158361::NODE_HAS_SLOW_SELECTOR;
+pub const NODE_HAS_EDGE_CHILD_SELECTOR: _bindgen_ty_bindgen_id_158361 =
+    _bindgen_ty_bindgen_id_158361::NODE_HAS_EDGE_CHILD_SELECTOR;
+pub const NODE_HAS_SLOW_SELECTOR_LATER_SIBLINGS: _bindgen_ty_bindgen_id_158361
           =
-    _bindgen_ty_bindgen_id_158347::NODE_HAS_SLOW_SELECTOR_LATER_SIBLINGS;
-pub const NODE_ALL_SELECTOR_FLAGS: _bindgen_ty_bindgen_id_158347 =
-    _bindgen_ty_bindgen_id_158347::NODE_ALL_SELECTOR_FLAGS;
-pub const NODE_NEEDS_FRAME: _bindgen_ty_bindgen_id_158347 =
-    _bindgen_ty_bindgen_id_158347::NODE_NEEDS_FRAME;
-pub const NODE_DESCENDANTS_NEED_FRAMES: _bindgen_ty_bindgen_id_158347 =
-    _bindgen_ty_bindgen_id_158347::NODE_DESCENDANTS_NEED_FRAMES;
-pub const NODE_HAS_ACCESSKEY: _bindgen_ty_bindgen_id_158347 =
-    _bindgen_ty_bindgen_id_158347::NODE_HAS_ACCESSKEY;
-pub const NODE_HAS_DIRECTION_RTL: _bindgen_ty_bindgen_id_158347 =
-    _bindgen_ty_bindgen_id_158347::NODE_HAS_DIRECTION_RTL;
-pub const NODE_HAS_DIRECTION_LTR: _bindgen_ty_bindgen_id_158347 =
-    _bindgen_ty_bindgen_id_158347::NODE_HAS_DIRECTION_LTR;
-pub const NODE_ALL_DIRECTION_FLAGS: _bindgen_ty_bindgen_id_158347 =
-    _bindgen_ty_bindgen_id_158347::NODE_ALL_DIRECTION_FLAGS;
-pub const NODE_CHROME_ONLY_ACCESS: _bindgen_ty_bindgen_id_158347 =
-    _bindgen_ty_bindgen_id_158347::NODE_CHROME_ONLY_ACCESS;
-pub const NODE_IS_ROOT_OF_CHROME_ONLY_ACCESS: _bindgen_ty_bindgen_id_158347 =
-    _bindgen_ty_bindgen_id_158347::NODE_IS_ROOT_OF_CHROME_ONLY_ACCESS;
-pub const NODE_SHARED_RESTYLE_BIT_1: _bindgen_ty_bindgen_id_158347 =
-    _bindgen_ty_bindgen_id_158347::NODE_SHARED_RESTYLE_BIT_1;
-pub const NODE_SHARED_RESTYLE_BIT_2: _bindgen_ty_bindgen_id_158347 =
-    _bindgen_ty_bindgen_id_158347::NODE_SHARED_RESTYLE_BIT_2;
-pub const NODE_IS_DIRTY_FOR_SERVO: _bindgen_ty_bindgen_id_158347 =
-    _bindgen_ty_bindgen_id_158347::NODE_SHARED_RESTYLE_BIT_1;
-pub const NODE_HAS_DIRTY_DESCENDANTS_FOR_SERVO: _bindgen_ty_bindgen_id_158347
+    _bindgen_ty_bindgen_id_158361::NODE_HAS_SLOW_SELECTOR_LATER_SIBLINGS;
+pub const NODE_ALL_SELECTOR_FLAGS: _bindgen_ty_bindgen_id_158361 =
+    _bindgen_ty_bindgen_id_158361::NODE_ALL_SELECTOR_FLAGS;
+pub const NODE_NEEDS_FRAME: _bindgen_ty_bindgen_id_158361 =
+    _bindgen_ty_bindgen_id_158361::NODE_NEEDS_FRAME;
+pub const NODE_DESCENDANTS_NEED_FRAMES: _bindgen_ty_bindgen_id_158361 =
+    _bindgen_ty_bindgen_id_158361::NODE_DESCENDANTS_NEED_FRAMES;
+pub const NODE_HAS_ACCESSKEY: _bindgen_ty_bindgen_id_158361 =
+    _bindgen_ty_bindgen_id_158361::NODE_HAS_ACCESSKEY;
+pub const NODE_HAS_DIRECTION_RTL: _bindgen_ty_bindgen_id_158361 =
+    _bindgen_ty_bindgen_id_158361::NODE_HAS_DIRECTION_RTL;
+pub const NODE_HAS_DIRECTION_LTR: _bindgen_ty_bindgen_id_158361 =
+    _bindgen_ty_bindgen_id_158361::NODE_HAS_DIRECTION_LTR;
+pub const NODE_ALL_DIRECTION_FLAGS: _bindgen_ty_bindgen_id_158361 =
+    _bindgen_ty_bindgen_id_158361::NODE_ALL_DIRECTION_FLAGS;
+pub const NODE_CHROME_ONLY_ACCESS: _bindgen_ty_bindgen_id_158361 =
+    _bindgen_ty_bindgen_id_158361::NODE_CHROME_ONLY_ACCESS;
+pub const NODE_IS_ROOT_OF_CHROME_ONLY_ACCESS: _bindgen_ty_bindgen_id_158361 =
+    _bindgen_ty_bindgen_id_158361::NODE_IS_ROOT_OF_CHROME_ONLY_ACCESS;
+pub const NODE_SHARED_RESTYLE_BIT_1: _bindgen_ty_bindgen_id_158361 =
+    _bindgen_ty_bindgen_id_158361::NODE_SHARED_RESTYLE_BIT_1;
+pub const NODE_SHARED_RESTYLE_BIT_2: _bindgen_ty_bindgen_id_158361 =
+    _bindgen_ty_bindgen_id_158361::NODE_SHARED_RESTYLE_BIT_2;
+pub const NODE_IS_DIRTY_FOR_SERVO: _bindgen_ty_bindgen_id_158361 =
+    _bindgen_ty_bindgen_id_158361::NODE_SHARED_RESTYLE_BIT_1;
+pub const NODE_HAS_DIRTY_DESCENDANTS_FOR_SERVO: _bindgen_ty_bindgen_id_158361
           =
-    _bindgen_ty_bindgen_id_158347::NODE_SHARED_RESTYLE_BIT_2;
-pub const NODE_TYPE_SPECIFIC_BITS_OFFSET: _bindgen_ty_bindgen_id_158347 =
-    _bindgen_ty_bindgen_id_158347::NODE_TYPE_SPECIFIC_BITS_OFFSET;
+    _bindgen_ty_bindgen_id_158361::NODE_SHARED_RESTYLE_BIT_2;
+pub const NODE_TYPE_SPECIFIC_BITS_OFFSET: _bindgen_ty_bindgen_id_158361 =
+    _bindgen_ty_bindgen_id_158361::NODE_TYPE_SPECIFIC_BITS_OFFSET;
 #[repr(u32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum _bindgen_ty_bindgen_id_158347 {
+pub enum _bindgen_ty_bindgen_id_158361 {
     NODE_HAS_LISTENERMANAGER = 4,
     NODE_HAS_PROPERTIES = 8,
     NODE_IS_ANONYMOUS_ROOT = 16,
     NODE_IS_IN_NATIVE_ANONYMOUS_SUBTREE = 32,
     NODE_IS_NATIVE_ANONYMOUS_ROOT = 64,
     NODE_FORCE_XBL_BINDINGS = 128,
     NODE_MAY_BE_IN_BINDING_MNGR = 256,
     NODE_IS_EDITABLE = 512,
@@ -6735,17 +6731,17 @@ pub struct nsITimer {
 #[derive(Debug, Copy, Clone)]
 pub struct nsITimer_COMTypeInfo<T, U> {
     pub _address: u8,
     pub _phantom_0: ::std::marker::PhantomData<T>,
     pub _phantom_1: ::std::marker::PhantomData<U>,
 }
 #[repr(u32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum nsITimer__bindgen_ty_bindgen_id_174915 {
+pub enum nsITimer__bindgen_ty_bindgen_id_174929 {
     TYPE_ONE_SHOT = 0,
     TYPE_REPEATING_SLACK = 1,
     TYPE_REPEATING_PRECISE = 2,
     TYPE_REPEATING_PRECISE_CAN_SKIP = 3,
 }
 #[test]
 fn bindgen_test_layout_nsITimer() {
     assert_eq!(::std::mem::size_of::<nsITimer>() , 8usize);
@@ -6761,17 +6757,17 @@ impl Clone for nsITimer {
  */
 #[repr(C)]
 #[derive(Debug, Copy)]
 pub struct nsExpirationState {
     pub _bitfield_1: u32,
 }
 #[repr(u32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum nsExpirationState__bindgen_ty_bindgen_id_175391 {
+pub enum nsExpirationState__bindgen_ty_bindgen_id_175405 {
     NOT_TRACKED = 15,
     MAX_INDEX_IN_GENERATION = 268435455,
 }
 #[test]
 fn bindgen_test_layout_nsExpirationState() {
     assert_eq!(::std::mem::size_of::<nsExpirationState>() , 4usize);
     assert_eq!(::std::mem::align_of::<nsExpirationState>() , 4usize);
 }
@@ -6835,29 +6831,29 @@ pub struct imgIRequest {
 #[derive(Debug, Copy, Clone)]
 pub struct imgIRequest_COMTypeInfo<T, U> {
     pub _address: u8,
     pub _phantom_0: ::std::marker::PhantomData<T>,
     pub _phantom_1: ::std::marker::PhantomData<U>,
 }
 #[repr(u32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum imgIRequest__bindgen_ty_bindgen_id_175978 {
+pub enum imgIRequest__bindgen_ty_bindgen_id_175992 {
     STATUS_NONE = 0,
     STATUS_SIZE_AVAILABLE = 1,
     STATUS_LOAD_COMPLETE = 2,
     STATUS_ERROR = 4,
     STATUS_FRAME_COMPLETE = 8,
     STATUS_DECODE_COMPLETE = 16,
     STATUS_IS_ANIMATED = 32,
     STATUS_HAS_TRANSPARENCY = 64,
 }
 #[repr(u32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum imgIRequest__bindgen_ty_bindgen_id_176058 {
+pub enum imgIRequest__bindgen_ty_bindgen_id_176072 {
     CORS_NONE = 1,
     CORS_ANONYMOUS = 2,
     CORS_USE_CREDENTIALS = 3,
 }
 #[test]
 fn bindgen_test_layout_imgIRequest() {
     assert_eq!(::std::mem::size_of::<imgIRequest>() , 8usize);
     assert_eq!(::std::mem::align_of::<imgIRequest>() , 8usize);
@@ -7346,17 +7342,17 @@ pub struct nsPresArena_FreeList {
     pub mEntrySize: usize,
     pub mEntriesEverAllocated: usize,
     pub mKey: nsPresArena_FreeList_KeyTypePointer,
 }
 pub type nsPresArena_FreeList_KeyType = u32;
 pub type nsPresArena_FreeList_KeyTypePointer = *const ::std::os::raw::c_void;
 #[repr(u32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum nsPresArena_FreeList__bindgen_ty_bindgen_id_196508 {
+pub enum nsPresArena_FreeList__bindgen_ty_bindgen_id_196522 {
     ALLOW_MEMMOVE = 0,
 }
 #[test]
 fn bindgen_test_layout_nsPresArena_FreeList() {
     assert_eq!(::std::mem::size_of::<nsPresArena_FreeList>() , 40usize);
     assert_eq!(::std::mem::align_of::<nsPresArena_FreeList>() , 8usize);
 }
 #[test]
@@ -7373,17 +7369,17 @@ pub struct imgINotificationObserver {
 #[derive(Debug, Copy, Clone)]
 pub struct imgINotificationObserver_COMTypeInfo<T, U> {
     pub _address: u8,
     pub _phantom_0: ::std::marker::PhantomData<T>,
     pub _phantom_1: ::std::marker::PhantomData<U>,
 }
 #[repr(u32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum imgINotificationObserver__bindgen_ty_bindgen_id_196655 {
+pub enum imgINotificationObserver__bindgen_ty_bindgen_id_196669 {
     SIZE_AVAILABLE = 1,
     FRAME_UPDATE = 2,
     FRAME_COMPLETE = 3,
     LOAD_COMPLETE = 4,
     DECODE_COMPLETE = 5,
     DISCARD = 6,
     UNLOCKED_DRAW = 7,
     IS_ANIMATED = 8,
@@ -7622,17 +7618,17 @@ pub struct gfxFontFeatureValueSet_Featur
     pub mValues: nsTArray<::std::os::raw::c_uint>,
 }
 pub type gfxFontFeatureValueSet_FeatureValueHashEntry_KeyType =
     *const gfxFontFeatureValueSet_FeatureValueHashKey;
 pub type gfxFontFeatureValueSet_FeatureValueHashEntry_KeyTypePointer =
     *const gfxFontFeatureValueSet_FeatureValueHashKey;
 #[repr(u32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum gfxFontFeatureValueSet_FeatureValueHashEntry__bindgen_ty_bindgen_id_197909
+pub enum gfxFontFeatureValueSet_FeatureValueHashEntry__bindgen_ty_bindgen_id_197923
          {
     ALLOW_MEMMOVE = 1,
 }
 #[test]
 fn bindgen_test_layout_gfxFontFeatureValueSet_FeatureValueHashEntry() {
     assert_eq!(::std::mem::size_of::<gfxFontFeatureValueSet_FeatureValueHashEntry>()
                , 56usize);
     assert_eq!(::std::mem::align_of::<gfxFontFeatureValueSet_FeatureValueHashEntry>()
@@ -8018,33 +8014,33 @@ pub enum nsStyleUnit {
     eStyleUnit_FlexFraction = 16,
     eStyleUnit_Coord = 20,
     eStyleUnit_Integer = 30,
     eStyleUnit_Enumerated = 32,
     eStyleUnit_Calc = 40,
 }
 #[repr(C)]
 #[derive(Debug, Copy)]
-pub struct _bindgen_ty_bindgen_id_198662 {
+pub struct _bindgen_ty_bindgen_id_198676 {
     pub mInt: __BindgenUnionField<i32>,
     pub mFloat: __BindgenUnionField<f32>,
     pub mPointer: __BindgenUnionField<*mut ::std::os::raw::c_void>,
     pub bindgen_union_field: u64,
 }
 #[test]
-fn bindgen_test_layout__bindgen_ty_bindgen_id_198662() {
-    assert_eq!(::std::mem::size_of::<_bindgen_ty_bindgen_id_198662>() ,
+fn bindgen_test_layout__bindgen_ty_bindgen_id_198676() {
+    assert_eq!(::std::mem::size_of::<_bindgen_ty_bindgen_id_198676>() ,
                8usize);
-    assert_eq!(::std::mem::align_of::<_bindgen_ty_bindgen_id_198662>() ,
+    assert_eq!(::std::mem::align_of::<_bindgen_ty_bindgen_id_198676>() ,
                8usize);
 }
-impl Clone for _bindgen_ty_bindgen_id_198662 {
-    fn clone(&self) -> Self { *self }
-}
-pub type nsStyleUnion = _bindgen_ty_bindgen_id_198662;
+impl Clone for _bindgen_ty_bindgen_id_198676 {
+    fn clone(&self) -> Self { *self }
+}
+pub type nsStyleUnion = _bindgen_ty_bindgen_id_198676;
 /**
  * Class that hold a single size specification used by the style
  * system.  The size specification consists of two parts -- a number
  * and a unit.  The number is an integer, a floating point value, an
  * nscoord, or undefined, and the unit is an nsStyleUnit.  Checking
  * the unit is a must before asking for the value in any particular
  * form.
  */
@@ -9059,34 +9055,34 @@ fn bindgen_test_layout_imgRequestProxy_i
                8usize);
 }
 #[test]
 fn bindgen_test_layout_imgRequestProxy() {
     assert_eq!(::std::mem::size_of::<imgRequestProxy>() , 120usize);
     assert_eq!(::std::mem::align_of::<imgRequestProxy>() , 8usize);
 }
 #[repr(C)]
-pub struct bindgen_vtable__bindgen_id_207732 {
+pub struct bindgen_vtable__bindgen_id_207746 {
 }
 /**
  * An interface for observing changes to image state, as reported by
  * ProgressTracker.
  *
  * This is the ImageLib-internal version of imgINotificationObserver,
  * essentially, with implementation details that code outside of ImageLib
  * shouldn't see.
  *
  * XXX(seth): It's preferable to avoid adding anything to this interface if
  * possible.  In the long term, it would be ideal to get to a place where we can
  * just use the imgINotificationObserver interface internally as well.
  */
 #[repr(C)]
 #[derive(Debug)]
 pub struct IProgressObserver {
-    pub vtable_: *const bindgen_vtable__bindgen_id_207732,
+    pub vtable_: *const bindgen_vtable__bindgen_id_207746,
     pub _base: u64,
 }
 #[test]
 fn bindgen_test_layout_IProgressObserver() {
     assert_eq!(::std::mem::size_of::<IProgressObserver>() , 16usize);
     assert_eq!(::std::mem::align_of::<IProgressObserver>() , 8usize);
 }
 #[repr(C)]
@@ -9098,17 +9094,17 @@ pub struct nsISupportsPriority {
 #[derive(Debug, Copy, Clone)]
 pub struct nsISupportsPriority_COMTypeInfo<T, U> {
     pub _address: u8,
     pub _phantom_0: ::std::marker::PhantomData<T>,
     pub _phantom_1: ::std::marker::PhantomData<U>,
 }
 #[repr(i32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum nsISupportsPriority__bindgen_ty_bindgen_id_207813 {
+pub enum nsISupportsPriority__bindgen_ty_bindgen_id_207827 {
     PRIORITY_HIGHEST = -20,
     PRIORITY_HIGH = -10,
     PRIORITY_NORMAL = 0,
     PRIORITY_LOW = 10,
     PRIORITY_LOWEST = 20,
 }
 #[test]
 fn bindgen_test_layout_nsISupportsPriority() {
@@ -9489,33 +9485,33 @@ pub type nsCSSValueFloatColor_HasThreadS
 fn bindgen_test_layout_nsCSSValueFloatColor() {
     assert_eq!(::std::mem::size_of::<nsCSSValueFloatColor>() , 32usize);
     assert_eq!(::std::mem::align_of::<nsCSSValueFloatColor>() , 8usize);
 }
 #[repr(C)]
 #[derive(Debug)]
 pub struct nsCSSValue {
     pub mUnit: nsCSSUnit,
-    pub mValue: nsCSSValue__bindgen_ty_bindgen_id_210707,
+    pub mValue: nsCSSValue__bindgen_ty_bindgen_id_210721,
 }
 #[repr(C)]
 #[derive(Debug)]
 pub struct nsCSSValue_Array {
     pub mRefCnt: usize,
     pub mCount: usize,
     pub mArray: [nsCSSValue; 1usize],
 }
 #[test]
 fn bindgen_test_layout_nsCSSValue_Array() {
     assert_eq!(::std::mem::size_of::<nsCSSValue_Array>() , 32usize);
     assert_eq!(::std::mem::align_of::<nsCSSValue_Array>() , 8usize);
 }
 #[repr(C)]
 #[derive(Debug, Copy)]
-pub struct nsCSSValue__bindgen_ty_bindgen_id_210707 {
+pub struct nsCSSValue__bindgen_ty_bindgen_id_210721 {
     pub mInt: __BindgenUnionField<i32>,
     pub mFloat: __BindgenUnionField<f32>,
     pub mString: __BindgenUnionField<*mut nsStringBuffer>,
     pub mColor: __BindgenUnionField<nscolor>,
     pub mArray: __BindgenUnionField<*mut nsCSSValue_Array>,
     pub mURL: __BindgenUnionField<*mut URLValue>,
     pub mImage: __BindgenUnionField<*mut ImageValue>,
     pub mGridTemplateAreas: __BindgenUnionField<*mut GridTemplateAreasValue>,
@@ -9529,23 +9525,23 @@ pub struct nsCSSValue__bindgen_ty_bindge
     pub mSharedList: __BindgenUnionField<*mut nsCSSValueSharedList>,
     pub mPairList: __BindgenUnionField<*mut nsCSSValuePairList_heap>,
     pub mPairListDependent: __BindgenUnionField<*mut nsCSSValuePairList>,
     pub mFloatColor: __BindgenUnionField<*mut nsCSSValueFloatColor>,
     pub mFontFamilyList: __BindgenUnionField<*mut FontFamilyListRefCnt>,
     pub bindgen_union_field: u64,
 }
 #[test]
-fn bindgen_test_layout_nsCSSValue__bindgen_ty_bindgen_id_210707() {
-    assert_eq!(::std::mem::size_of::<nsCSSValue__bindgen_ty_bindgen_id_210707>()
+fn bindgen_test_layout_nsCSSValue__bindgen_ty_bindgen_id_210721() {
+    assert_eq!(::std::mem::size_of::<nsCSSValue__bindgen_ty_bindgen_id_210721>()
                , 8usize);
-    assert_eq!(::std::mem::align_of::<nsCSSValue__bindgen_ty_bindgen_id_210707>()
+    assert_eq!(::std::mem::align_of::<nsCSSValue__bindgen_ty_bindgen_id_210721>()
                , 8usize);
 }
-impl Clone for nsCSSValue__bindgen_ty_bindgen_id_210707 {
+impl Clone for nsCSSValue__bindgen_ty_bindgen_id_210721 {
     fn clone(&self) -> Self { *self }
 }
 #[test]
 fn bindgen_test_layout_nsCSSValue() {
     assert_eq!(::std::mem::size_of::<nsCSSValue>() , 16usize);
     assert_eq!(::std::mem::align_of::<nsCSSValue>() , 8usize);
 }
 #[repr(C)]
@@ -9556,22 +9552,22 @@ pub struct nsCSSValueGradientStop {
     pub mIsInterpolationHint: bool,
 }
 #[test]
 fn bindgen_test_layout_nsCSSValueGradientStop() {
     assert_eq!(::std::mem::size_of::<nsCSSValueGradientStop>() , 40usize);
     assert_eq!(::std::mem::align_of::<nsCSSValueGradientStop>() , 8usize);
 }
 #[repr(C)]
-pub struct bindgen_vtable__bindgen_id_210914 {
+pub struct bindgen_vtable__bindgen_id_210928 {
 }
 #[repr(C)]
 #[derive(Debug, Copy)]
 pub struct CounterStyle {
-    pub vtable_: *const bindgen_vtable__bindgen_id_210914,
+    pub vtable_: *const bindgen_vtable__bindgen_id_210928,
     pub mStyle: i32,
 }
 #[test]
 fn bindgen_test_layout_CounterStyle() {
     assert_eq!(::std::mem::size_of::<CounterStyle>() , 16usize);
     assert_eq!(::std::mem::align_of::<CounterStyle>() , 8usize);
 }
 impl Clone for CounterStyle {
@@ -9642,16 +9638,19 @@ pub struct nsStyleVisibility {
     pub mTextOrientation: u8,
     pub mColorAdjust: u8,
 }
 #[test]
 fn bindgen_test_layout_nsStyleVisibility() {
     assert_eq!(::std::mem::size_of::<nsStyleVisibility>() , 7usize);
     assert_eq!(::std::mem::align_of::<nsStyleVisibility>() , 1usize);
 }
+pub type RawGeckoNode = nsINode;
+pub type RawGeckoElement = Element;
+pub type RawGeckoDocument = nsIDocument;
 #[repr(C)]
 #[derive(Debug)]
 pub struct FragmentOrURL {
     pub mURL: nsCOMPtr<nsIURI>,
     pub mIsLocalRef: bool,
 }
 #[test]
 fn bindgen_test_layout_FragmentOrURL() {
@@ -9758,36 +9757,36 @@ fn bindgen_test_layout_CachedBorderImage
  * image of type (1)).
  */
 #[repr(C)]
 #[derive(Debug)]
 pub struct nsStyleImage {
     pub mCachedBIData: UniquePtr<CachedBorderImageData,
                                  DefaultDelete<CachedBorderImageData>>,
     pub mType: nsStyleImageType,
-    pub __bindgen_anon_1: nsStyleImage__bindgen_ty_bindgen_id_212871,
+    pub __bindgen_anon_1: nsStyleImage__bindgen_ty_bindgen_id_212896,
     pub mCropRect: UniquePtr<nsStyleSides, DefaultDelete<nsStyleSides>>,
     pub mImageTracked: bool,
 }
 #[repr(C)]
 #[derive(Debug, Copy)]
-pub struct nsStyleImage__bindgen_ty_bindgen_id_212871 {
+pub struct nsStyleImage__bindgen_ty_bindgen_id_212896 {
     pub mImage: __BindgenUnionField<*mut imgRequestProxy>,
     pub mGradient: __BindgenUnionField<*mut nsStyleGradient>,
     pub mElementId: __BindgenUnionField<*mut u16>,
     pub bindgen_union_field: u64,
 }
 #[test]
-fn bindgen_test_layout_nsStyleImage__bindgen_ty_bindgen_id_212871() {
-    assert_eq!(::std::mem::size_of::<nsStyleImage__bindgen_ty_bindgen_id_212871>()
+fn bindgen_test_layout_nsStyleImage__bindgen_ty_bindgen_id_212896() {
+    assert_eq!(::std::mem::size_of::<nsStyleImage__bindgen_ty_bindgen_id_212896>()
                , 8usize);
-    assert_eq!(::std::mem::align_of::<nsStyleImage__bindgen_ty_bindgen_id_212871>()
+    assert_eq!(::std::mem::align_of::<nsStyleImage__bindgen_ty_bindgen_id_212896>()
                , 8usize);
 }
-impl Clone for nsStyleImage__bindgen_ty_bindgen_id_212871 {
+impl Clone for nsStyleImage__bindgen_ty_bindgen_id_212896 {
     fn clone(&self) -> Self { *self }
 }
 #[test]
 fn bindgen_test_layout_nsStyleImage() {
     assert_eq!(::std::mem::size_of::<nsStyleImage>() , 40usize);
     assert_eq!(::std::mem::align_of::<nsStyleImage>() , 8usize);
 }
 #[repr(C)]
@@ -9828,17 +9827,17 @@ pub struct nsStyleImageLayers {
     pub mSizeCount: u32,
     pub mMaskModeCount: u32,
     pub mBlendModeCount: u32,
     pub mCompositeCount: u32,
     pub mLayers: nsStyleAutoArray<nsStyleImageLayers_Layer>,
 }
 #[repr(u32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum nsStyleImageLayers__bindgen_ty_bindgen_id_212917 {
+pub enum nsStyleImageLayers__bindgen_ty_bindgen_id_212942 {
     shorthand = 0,
     color = 1,
     image = 2,
     repeat = 3,
     positionX = 4,
     positionY = 5,
     clip = 6,
     origin = 7,
@@ -10364,17 +10363,17 @@ fn bindgen_test_layout_nsStyleImageOrien
 }
 impl Clone for nsStyleImageOrientation {
     fn clone(&self) -> Self { *self }
 }
 #[repr(C)]
 #[derive(Debug, Copy)]
 pub struct nsTimingFunction {
     pub mType: nsTimingFunction_Type,
-    pub __bindgen_anon_1: nsTimingFunction__bindgen_ty_bindgen_id_214676,
+    pub __bindgen_anon_1: nsTimingFunction__bindgen_ty_bindgen_id_214701,
 }
 #[repr(i32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
 pub enum nsTimingFunction_Type {
     Ease = 0,
     Linear = 1,
     EaseIn = 2,
     EaseOut = 3,
@@ -10383,66 +10382,66 @@ pub enum nsTimingFunction_Type {
     StepEnd = 6,
     CubicBezier = 7,
 }
 #[repr(i32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
 pub enum nsTimingFunction_Keyword { Implicit = 0, Explicit = 1, }
 #[repr(C)]
 #[derive(Debug, Copy)]
-pub struct nsTimingFunction__bindgen_ty_bindgen_id_214676 {
-    pub mFunc: __BindgenUnionField<nsTimingFunction__bindgen_ty_bindgen_id_214676__bindgen_ty_bindgen_id_214677>,
-    pub __bindgen_anon_1: __BindgenUnionField<nsTimingFunction__bindgen_ty_bindgen_id_214676__bindgen_ty_bindgen_id_214688>,
+pub struct nsTimingFunction__bindgen_ty_bindgen_id_214701 {
+    pub mFunc: __BindgenUnionField<nsTimingFunction__bindgen_ty_bindgen_id_214701__bindgen_ty_bindgen_id_214702>,
+    pub __bindgen_anon_1: __BindgenUnionField<nsTimingFunction__bindgen_ty_bindgen_id_214701__bindgen_ty_bindgen_id_214713>,
     pub bindgen_union_field: [u32; 4usize],
 }
 #[repr(C)]
 #[derive(Debug, Copy)]
-pub struct nsTimingFunction__bindgen_ty_bindgen_id_214676__bindgen_ty_bindgen_id_214677 {
+pub struct nsTimingFunction__bindgen_ty_bindgen_id_214701__bindgen_ty_bindgen_id_214702 {
     pub mX1: f32,
     pub mY1: f32,
     pub mX2: f32,
     pub mY2: f32,
 }
 #[test]
-fn bindgen_test_layout_nsTimingFunction__bindgen_ty_bindgen_id_214676__bindgen_ty_bindgen_id_214677() {
-    assert_eq!(::std::mem::size_of::<nsTimingFunction__bindgen_ty_bindgen_id_214676__bindgen_ty_bindgen_id_214677>()
+fn bindgen_test_layout_nsTimingFunction__bindgen_ty_bindgen_id_214701__bindgen_ty_bindgen_id_214702() {
+    assert_eq!(::std::mem::size_of::<nsTimingFunction__bindgen_ty_bindgen_id_214701__bindgen_ty_bindgen_id_214702>()
                , 16usize);
-    assert_eq!(::std::mem::align_of::<nsTimingFunction__bindgen_ty_bindgen_id_214676__bindgen_ty_bindgen_id_214677>()
+    assert_eq!(::std::mem::align_of::<nsTimingFunction__bindgen_ty_bindgen_id_214701__bindgen_ty_bindgen_id_214702>()
                , 4usize);
 }
 impl Clone for
- nsTimingFunction__bindgen_ty_bindgen_id_214676__bindgen_ty_bindgen_id_214677
+ nsTimingFunction__bindgen_ty_bindgen_id_214701__bindgen_ty_bindgen_id_214702
  {
     fn clone(&self) -> Self { *self }
 }
 #[repr(C)]
 #[derive(Debug, Copy)]
-pub struct nsTimingFunction__bindgen_ty_bindgen_id_214676__bindgen_ty_bindgen_id_214688 {
+pub struct nsTimingFunction__bindgen_ty_bindgen_id_214701__bindgen_ty_bindgen_id_214713 {
     pub mSteps: u32,
 }
 #[test]
-fn bindgen_test_layout_nsTimingFunction__bindgen_ty_bindgen_id_214676__bindgen_ty_bindgen_id_214688() {
-    assert_eq!(::std::mem::size_of::<nsTimingFunction__bindgen_ty_bindgen_id_214676__bindgen_ty_bindgen_id_214688>()
+fn bindgen_test_layout_nsTimingFunction__bindgen_ty_bindgen_id_214701__bindgen_ty_bindgen_id_214713() {
+    assert_eq!(::std::mem::size_of::<nsTimingFunction__bindgen_ty_bindgen_id_214701__bindgen_ty_bindgen_id_214713>()
                , 4usize);
-    assert_eq!(::std::mem::align_of::<nsTimingFunction__bindgen_ty_bindgen_id_214676__bindgen_ty_bindgen_id_214688>()
+    assert_eq!(::std::mem::align_of::<nsTimingFunction__bindgen_ty_bindgen_id_214701__bindgen_ty_bindgen_id_214713>()
                , 4usize);
 }
 impl Clone for
- nsTimingFunction__bindgen_ty_bindgen_id_214676__bindgen_ty_bindgen_id_214688
+ nsTimingFunction__bindgen_ty_bindgen_id_214701__bindgen_ty_bindgen_id_214713
  {
     fn clone(&self) -> Self { *self }
 }
 #[test]
-fn bindgen_test_layout_nsTimingFunction__bindgen_ty_bindgen_id_214676() {
-    assert_eq!(::std::mem::size_of::<nsTimingFunction__bindgen_ty_bindgen_id_214676>()
+fn bindgen_test_layout_nsTimingFunction__bindgen_ty_bindgen_id_214701() {
+    assert_eq!(::std::mem::size_of::<nsTimingFunction__bindgen_ty_bindgen_id_214701>()
                , 16usize);
-    assert_eq!(::std::mem::align_of::<nsTimingFunction__bindgen_ty_bindgen_id_214676>()
+    assert_eq!(::std::mem::align_of::<nsTimingFunction__bindgen_ty_bindgen_id_214701>()
                , 4usize);
 }
-impl Clone for nsTimingFunction__bindgen_ty_bindgen_id_214676 {
+impl Clone for nsTimingFunction__bindgen_ty_bindgen_id_214701 {
     fn clone(&self) -> Self { *self }
 }
 #[test]
 fn bindgen_test_layout_nsTimingFunction() {
     assert_eq!(::std::mem::size_of::<nsTimingFunction>() , 20usize);
     assert_eq!(::std::mem::align_of::<nsTimingFunction>() , 4usize);
 }
 impl Clone for nsTimingFunction {
@@ -10493,23 +10492,23 @@ pub type StyleBasicShape_HasThreadSafeRe
 #[test]
 fn bindgen_test_layout_StyleBasicShape() {
     assert_eq!(::std::mem::size_of::<StyleBasicShape>() , 120usize);
     assert_eq!(::std::mem::align_of::<StyleBasicShape>() , 8usize);
 }
 #[repr(C)]
 #[derive(Debug)]
 pub struct StyleShapeSource<ReferenceBox> {
-    pub __bindgen_anon_1: StyleShapeSource__bindgen_ty_bindgen_id_215059<ReferenceBox>,
+    pub __bindgen_anon_1: StyleShapeSource__bindgen_ty_bindgen_id_215084<ReferenceBox>,
     pub mType: StyleShapeSourceType,
     pub mReferenceBox: ReferenceBox,
 }
 #[repr(C)]
 #[derive(Debug, Copy, Clone)]
-pub struct StyleShapeSource__bindgen_ty_bindgen_id_215059<ReferenceBox> {
+pub struct StyleShapeSource__bindgen_ty_bindgen_id_215084<ReferenceBox> {
     pub mBasicShape: __BindgenUnionField<*mut StyleBasicShape>,
     pub mURL: __BindgenUnionField<*mut FragmentOrURL>,
     pub bindgen_union_field: u64,
     pub _phantom_0: ::std::marker::PhantomData<ReferenceBox>,
 }
 pub type StyleClipPath = StyleShapeSource<StyleClipPathGeometryBox>;
 pub type StyleShapeOutside = StyleShapeSource<StyleShapeOutsideShapeBox>;
 #[repr(C)]
@@ -10551,35 +10550,35 @@ pub enum nsStyleContentType {
     eStyleContentType_NoCloseQuote = 43,
     eStyleContentType_AltContent = 50,
     eStyleContentType_Uninitialized = 51,
 }
 #[repr(C)]
 #[derive(Debug)]
 pub struct nsStyleContentData {
     pub mType: nsStyleContentType,
-    pub mContent: nsStyleContentData__bindgen_ty_bindgen_id_215143,
+    pub mContent: nsStyleContentData__bindgen_ty_bindgen_id_215168,
     pub mImageTracked: bool,
 }
 #[repr(C)]
 #[derive(Debug, Copy)]
-pub struct nsStyleContentData__bindgen_ty_bindgen_id_215143 {
+pub struct nsStyleContentData__bindgen_ty_bindgen_id_215168 {
     pub mString: __BindgenUnionField<*mut u16>,
     pub mImage: __BindgenUnionField<*mut imgRequestProxy>,
     pub mCounters: __BindgenUnionField<*mut nsCSSValue_Array>,
     pub bindgen_union_field: u64,
 }
 #[test]
-fn bindgen_test_layout_nsStyleContentData__bindgen_ty_bindgen_id_215143() {
-    assert_eq!(::std::mem::size_of::<nsStyleContentData__bindgen_ty_bindgen_id_215143>()
+fn bindgen_test_layout_nsStyleContentData__bindgen_ty_bindgen_id_215168() {
+    assert_eq!(::std::mem::size_of::<nsStyleContentData__bindgen_ty_bindgen_id_215168>()
                , 8usize);
-    assert_eq!(::std::mem::align_of::<nsStyleContentData__bindgen_ty_bindgen_id_215143>()
+    assert_eq!(::std::mem::align_of::<nsStyleContentData__bindgen_ty_bindgen_id_215168>()
                , 8usize);
 }
-impl Clone for nsStyleContentData__bindgen_ty_bindgen_id_215143 {
+impl Clone for nsStyleContentData__bindgen_ty_bindgen_id_215168 {
     fn clone(&self) -> Self { *self }
 }
 #[test]
 fn bindgen_test_layout_nsStyleContentData() {
     assert_eq!(::std::mem::size_of::<nsStyleContentData>() , 24usize);
     assert_eq!(::std::mem::align_of::<nsStyleContentData>() , 8usize);
 }
 #[repr(C)]
@@ -10694,35 +10693,35 @@ pub enum nsStyleSVGPaintType {
     eStyleSVGPaintType_Color = 2,
     eStyleSVGPaintType_Server = 3,
     eStyleSVGPaintType_ContextFill = 4,
     eStyleSVGPaintType_ContextStroke = 5,
 }
 #[repr(C)]
 #[derive(Debug)]
 pub struct nsStyleSVGPaint {
-    pub mPaint: nsStyleSVGPaint__bindgen_ty_bindgen_id_215542,
+    pub mPaint: nsStyleSVGPaint__bindgen_ty_bindgen_id_215567,
     pub mType: nsStyleSVGPaintType,
     pub mFallbackColor: nscolor,
 }
 #[repr(C)]
 #[derive(Debug, Copy)]
-pub struct nsStyleSVGPaint__bindgen_ty_bindgen_id_215542 {
+pub struct nsStyleSVGPaint__bindgen_ty_bindgen_id_215567 {
     pub mColor: __BindgenUnionField<nscolor>,
     pub mPaintServer: __BindgenUnionField<*mut FragmentOrURL>,
     pub bindgen_union_field: u64,
 }
 #[test]
-fn bindgen_test_layout_nsStyleSVGPaint__bindgen_ty_bindgen_id_215542() {
-    assert_eq!(::std::mem::size_of::<nsStyleSVGPaint__bindgen_ty_bindgen_id_215542>()
+fn bindgen_test_layout_nsStyleSVGPaint__bindgen_ty_bindgen_id_215567() {
+    assert_eq!(::std::mem::size_of::<nsStyleSVGPaint__bindgen_ty_bindgen_id_215567>()
                , 8usize);
-    assert_eq!(::std::mem::align_of::<nsStyleSVGPaint__bindgen_ty_bindgen_id_215542>()
+    assert_eq!(::std::mem::align_of::<nsStyleSVGPaint__bindgen_ty_bindgen_id_215567>()
                , 8usize);
 }
-impl Clone for nsStyleSVGPaint__bindgen_ty_bindgen_id_215542 {
+impl Clone for nsStyleSVGPaint__bindgen_ty_bindgen_id_215567 {
     fn clone(&self) -> Self { *self }
 }
 #[test]
 fn bindgen_test_layout_nsStyleSVGPaint() {
     assert_eq!(::std::mem::size_of::<nsStyleSVGPaint>() , 16usize);
     assert_eq!(::std::mem::align_of::<nsStyleSVGPaint>() , 8usize);
 }
 #[repr(C)]
@@ -10747,17 +10746,17 @@ pub struct nsStyleSVG {
     pub mShapeRendering: u8,
     pub mStrokeLinecap: u8,
     pub mStrokeLinejoin: u8,
     pub mTextAnchor: u8,
     pub mContextFlags: u8,
 }
 #[repr(u32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum nsStyleSVG__bindgen_ty_bindgen_id_215719 {
+pub enum nsStyleSVG__bindgen_ty_bindgen_id_215744 {
     FILL_OPACITY_SOURCE_MASK = 3,
     STROKE_OPACITY_SOURCE_MASK = 12,
     STROKE_DASHARRAY_CONTEXT = 16,
     STROKE_DASHOFFSET_CONTEXT = 32,
     STROKE_WIDTH_CONTEXT = 64,
     FILL_OPACITY_SOURCE_SHIFT = 0,
     STROKE_OPACITY_SOURCE_SHIFT = 2,
 }
@@ -10766,33 +10765,33 @@ fn bindgen_test_layout_nsStyleSVG() {
     assert_eq!(::std::mem::size_of::<nsStyleSVG>() , 144usize);
     assert_eq!(::std::mem::align_of::<nsStyleSVG>() , 8usize);
 }
 #[repr(C)]
 #[derive(Debug)]
 pub struct nsStyleFilter {
     pub mType: i32,
     pub mFilterParameter: nsStyleCoord,
-    pub __bindgen_anon_1: nsStyleFilter__bindgen_ty_bindgen_id_215785,
-}
-#[repr(C)]
-#[derive(Debug, Copy)]
-pub struct nsStyleFilter__bindgen_ty_bindgen_id_215785 {
+    pub __bindgen_anon_1: nsStyleFilter__bindgen_ty_bindgen_id_215810,
+}
+#[repr(C)]
+#[derive(Debug, Copy)]
+pub struct nsStyleFilter__bindgen_ty_bindgen_id_215810 {
     pub mURL: __BindgenUnionField<*mut FragmentOrURL>,
     pub mDropShadow: __BindgenUnionField<*mut nsCSSShadowArray>,
     pub bindgen_union_field: u64,
 }
 #[test]
-fn bindgen_test_layout_nsStyleFilter__bindgen_ty_bindgen_id_215785() {
-    assert_eq!(::std::mem::size_of::<nsStyleFilter__bindgen_ty_bindgen_id_215785>()
+fn bindgen_test_layout_nsStyleFilter__bindgen_ty_bindgen_id_215810() {
+    assert_eq!(::std::mem::size_of::<nsStyleFilter__bindgen_ty_bindgen_id_215810>()
                , 8usize);
-    assert_eq!(::std::mem::align_of::<nsStyleFilter__bindgen_ty_bindgen_id_215785>()
+    assert_eq!(::std::mem::align_of::<nsStyleFilter__bindgen_ty_bindgen_id_215810>()
                , 8usize);
 }
-impl Clone for nsStyleFilter__bindgen_ty_bindgen_id_215785 {
+impl Clone for nsStyleFilter__bindgen_ty_bindgen_id_215810 {
     fn clone(&self) -> Self { *self }
 }
 #[test]
 fn bindgen_test_layout_nsStyleFilter() {
     assert_eq!(::std::mem::size_of::<nsStyleFilter>() , 32usize);
     assert_eq!(::std::mem::align_of::<nsStyleFilter>() , 8usize);
 }
 #[repr(C)]
--- a/servo/ports/geckolib/gecko_bindings/structs_release.rs
+++ b/servo/ports/geckolib/gecko_bindings/structs_release.rs
@@ -1,10 +1,15 @@
 /* automatically generated by rust-bindgen */
 
+pub enum OpaqueStyleData {}
+pub type ServoUnsafeCell<T> = ::std::cell::UnsafeCell<T>;
+pub type ServoCell<T> = ::std::cell::Cell<T>;
+pub type ServoNodeData = OpaqueStyleData;
+
 #[derive(Debug)]
 #[repr(C)]
 pub struct __BindgenUnionField<T>(::std::marker::PhantomData<T>);
 impl <T> __BindgenUnionField<T> {
     #[inline]
     pub fn new() -> Self { __BindgenUnionField(::std::marker::PhantomData) }
     #[inline]
     pub unsafe fn as_ref(&self) -> &T { ::std::mem::transmute(self) }
@@ -1491,40 +1496,40 @@ pub enum JSWhyMagic {
     JS_UNINITIALIZED_LEXICAL = 15,
     JS_GENERIC_MAGIC = 16,
     JS_WHY_MAGIC_COUNT = 17,
 }
 #[repr(C)]
 #[derive(Debug, Copy)]
 pub struct jsval_layout {
     pub asBits: __BindgenUnionField<u64>,
-    pub debugView: __BindgenUnionField<jsval_layout__bindgen_ty_bindgen_id_59538>,
-    pub s: __BindgenUnionField<jsval_layout__bindgen_ty_bindgen_id_59545>,
+    pub debugView: __BindgenUnionField<jsval_layout__bindgen_ty_bindgen_id_59541>,
+    pub s: __BindgenUnionField<jsval_layout__bindgen_ty_bindgen_id_59548>,
     pub asDouble: __BindgenUnionField<f64>,
     pub asPtr: __BindgenUnionField<*mut ::std::os::raw::c_void>,
     pub asWord: __BindgenUnionField<usize>,
     pub asUIntPtr: __BindgenUnionField<usize>,
     pub bindgen_union_field: u64,
 }
 #[repr(C)]
 #[derive(Debug, Copy)]
-pub struct jsval_layout__bindgen_ty_bindgen_id_59538 {
+pub struct jsval_layout__bindgen_ty_bindgen_id_59541 {
     pub _bitfield_1: u64,
 }
 #[test]
-fn bindgen_test_layout_jsval_layout__bindgen_ty_bindgen_id_59538() {
-    assert_eq!(::std::mem::size_of::<jsval_layout__bindgen_ty_bindgen_id_59538>()
+fn bindgen_test_layout_jsval_layout__bindgen_ty_bindgen_id_59541() {
+    assert_eq!(::std::mem::size_of::<jsval_layout__bindgen_ty_bindgen_id_59541>()
                , 8usize);
-    assert_eq!(::std::mem::align_of::<jsval_layout__bindgen_ty_bindgen_id_59538>()
+    assert_eq!(::std::mem::align_of::<jsval_layout__bindgen_ty_bindgen_id_59541>()
                , 8usize);
 }
-impl Clone for jsval_layout__bindgen_ty_bindgen_id_59538 {
-    fn clone(&self) -> Self { *self }
-}
-impl jsval_layout__bindgen_ty_bindgen_id_59538 {
+impl Clone for jsval_layout__bindgen_ty_bindgen_id_59541 {
+    fn clone(&self) -> Self { *self }
+}
+impl jsval_layout__bindgen_ty_bindgen_id_59541 {
     #[inline]
     pub fn payload47(&self) -> u64 {
         unsafe {
             ::std::mem::transmute(((self._bitfield_1 &
                                         (140737488355327usize as u64)) >>
                                        0u32) as u64)
         }
     }
@@ -1547,46 +1552,46 @@ impl jsval_layout__bindgen_ty_bindgen_id
         self._bitfield_1 &= !(18446603336221196288usize as u64);
         self._bitfield_1 |=
             ((val as u32 as u64) << 47u32) &
                 (18446603336221196288usize as u64);
     }
 }
 #[repr(C)]
 #[derive(Debug, Copy)]
-pub struct jsval_layout__bindgen_ty_bindgen_id_59545 {
-    pub payload: jsval_layout__bindgen_ty_bindgen_id_59545__bindgen_ty_bindgen_id_59546,
-}
-#[repr(C)]
-#[derive(Debug, Copy)]
-pub struct jsval_layout__bindgen_ty_bindgen_id_59545__bindgen_ty_bindgen_id_59546 {
+pub struct jsval_layout__bindgen_ty_bindgen_id_59548 {
+    pub payload: jsval_layout__bindgen_ty_bindgen_id_59548__bindgen_ty_bindgen_id_59549,
+}
+#[repr(C)]
+#[derive(Debug, Copy)]
+pub struct jsval_layout__bindgen_ty_bindgen_id_59548__bindgen_ty_bindgen_id_59549 {
     pub i32: __BindgenUnionField<i32>,
     pub u32: __BindgenUnionField<u32>,
     pub why: __BindgenUnionField<JSWhyMagic>,
     pub bindgen_union_field: u32,
 }
 #[test]
-fn bindgen_test_layout_jsval_layout__bindgen_ty_bindgen_id_59545__bindgen_ty_bindgen_id_59546() {
-    assert_eq!(::std::mem::size_of::<jsval_layout__bindgen_ty_bindgen_id_59545__bindgen_ty_bindgen_id_59546>()
+fn bindgen_test_layout_jsval_layout__bindgen_ty_bindgen_id_59548__bindgen_ty_bindgen_id_59549() {
+    assert_eq!(::std::mem::size_of::<jsval_layout__bindgen_ty_bindgen_id_59548__bindgen_ty_bindgen_id_59549>()
                , 4usize);
-    assert_eq!(::std::mem::align_of::<jsval_layout__bindgen_ty_bindgen_id_59545__bindgen_ty_bindgen_id_59546>()
+    assert_eq!(::std::mem::align_of::<jsval_layout__bindgen_ty_bindgen_id_59548__bindgen_ty_bindgen_id_59549>()
                , 4usize);
 }
 impl Clone for
- jsval_layout__bindgen_ty_bindgen_id_59545__bindgen_ty_bindgen_id_59546 {
-    fn clone(&self) -> Self { *self }
-}
-#[test]
-fn bindgen_test_layout_jsval_layout__bindgen_ty_bindgen_id_59545() {
-    assert_eq!(::std::mem::size_of::<jsval_layout__bindgen_ty_bindgen_id_59545>()
+ jsval_layout__bindgen_ty_bindgen_id_59548__bindgen_ty_bindgen_id_59549 {
+    fn clone(&self) -> Self { *self }
+}
+#[test]
+fn bindgen_test_layout_jsval_layout__bindgen_ty_bindgen_id_59548() {
+    assert_eq!(::std::mem::size_of::<jsval_layout__bindgen_ty_bindgen_id_59548>()
                , 4usize);
-    assert_eq!(::std::mem::align_of::<jsval_layout__bindgen_ty_bindgen_id_59545>()
+    assert_eq!(::std::mem::align_of::<jsval_layout__bindgen_ty_bindgen_id_59548>()
                , 4usize);
 }
-impl Clone for jsval_layout__bindgen_ty_bindgen_id_59545 {
+impl Clone for jsval_layout__bindgen_ty_bindgen_id_59548 {
     fn clone(&self) -> Self { *self }
 }
 impl Clone for jsval_layout {
     fn clone(&self) -> Self { *self }
 }
 #[repr(C)]
 #[derive(Debug)]
 pub struct nsAString_internal {
@@ -1610,17 +1615,17 @@ pub type nsAString_internal_iterator = n
 pub type nsAString_internal_comparator_type = nsStringComparator;
 pub type nsAString_internal_char_iterator = *mut nsAString_internal_char_type;
 pub type nsAString_internal_const_char_iterator =
     *const nsAString_internal_char_type;
 pub type nsAString_internal_size_type = u32;
 pub type nsAString_internal_index_type = u32;
 #[repr(u32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum nsAString_internal__bindgen_ty_bindgen_id_61383 {
+pub enum nsAString_internal__bindgen_ty_bindgen_id_61386 {
     F_NONE = 0,
     F_TERMINATED = 1,
     F_VOIDED = 2,
     F_SHARED = 4,
     F_OWNED = 8,
     F_FIXED = 16,
     F_LITERAL = 32,
     F_CLASS_FIXED = 65536,
@@ -1672,22 +1677,22 @@ impl Clone for nsString_Segment {
     fn clone(&self) -> Self { *self }
 }
 #[test]
 fn bindgen_test_layout_nsString() {
     assert_eq!(::std::mem::size_of::<nsString>() , 16usize);
     assert_eq!(::std::mem::align_of::<nsString>() , 8usize);
 }
 #[repr(C)]
-pub struct bindgen_vtable__bindgen_id_61993 {
+pub struct bindgen_vtable__bindgen_id_61996 {
 }
 #[repr(C)]
 #[derive(Debug, Copy)]
 pub struct nsStringComparator {
-    pub vtable_: *const bindgen_vtable__bindgen_id_61993,
+    pub vtable_: *const bindgen_vtable__bindgen_id_61996,
 }
 pub type nsStringComparator_char_type = u16;
 #[test]
 fn bindgen_test_layout_nsStringComparator() {
     assert_eq!(::std::mem::size_of::<nsStringComparator>() , 8usize);
     assert_eq!(::std::mem::align_of::<nsStringComparator>() , 8usize);
 }
 impl Clone for nsStringComparator {
@@ -1719,17 +1724,17 @@ pub type nsACString_internal_comparator_
 pub type nsACString_internal_char_iterator =
     *mut nsACString_internal_char_type;
 pub type nsACString_internal_const_char_iterator =
     *const nsACString_internal_char_type;
 pub type nsACString_internal_size_type = u32;
 pub type nsACString_internal_index_type = u32;
 #[repr(u32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum nsACString_internal__bindgen_ty_bindgen_id_63223 {
+pub enum nsACString_internal__bindgen_ty_bindgen_id_63226 {
     F_NONE = 0,
     F_TERMINATED = 1,
     F_VOIDED = 2,
     F_SHARED = 4,
     F_OWNED = 8,
     F_FIXED = 16,
     F_LITERAL = 32,
     F_CLASS_FIXED = 65536,
@@ -1781,45 +1786,45 @@ impl Clone for nsCString_Segment {
     fn clone(&self) -> Self { *self }
 }
 #[test]
 fn bindgen_test_layout_nsCString() {
     assert_eq!(::std::mem::size_of::<nsCString>() , 16usize);
     assert_eq!(::std::mem::align_of::<nsCString>() , 8usize);
 }
 #[repr(C)]
-pub struct bindgen_vtable__bindgen_id_63775 {
+pub struct bindgen_vtable__bindgen_id_63778 {
 }
 #[repr(C)]
 #[derive(Debug, Copy)]
 pub struct nsCStringComparator {
-    pub vtable_: *const bindgen_vtable__bindgen_id_63775,
+    pub vtable_: *const bindgen_vtable__bindgen_id_63778,
 }
 pub type nsCStringComparator_char_type = ::std::os::raw::c_char;
 #[test]
 fn bindgen_test_layout_nsCStringComparator() {
     assert_eq!(::std::mem::size_of::<nsCStringComparator>() , 8usize);
     assert_eq!(::std::mem::align_of::<nsCStringComparator>() , 8usize);
 }
 impl Clone for nsCStringComparator {
     fn clone(&self) -> Self { *self }
 }
 #[repr(C)]
-pub struct bindgen_vtable__bindgen_id_63819 {
+pub struct bindgen_vtable__bindgen_id_63822 {
 }
 /**
  * Basic component object model interface. Objects which implement
  * this interface support runtime interface discovery (QueryInterface)
  * and a reference counted memory model (AddRef/Release). This is
  * modelled after the win32 IUnknown API.
  */
 #[repr(C)]
 #[derive(Debug, Copy)]
 pub struct nsISupports {
-    pub vtable_: *const bindgen_vtable__bindgen_id_63819,
+    pub vtable_: *const bindgen_vtable__bindgen_id_63822,
 }
 #[repr(C)]
 #[derive(Debug, Copy, Clone)]
 pub struct nsISupports_COMTypeInfo<T, U> {
     pub _address: u8,
     pub _phantom_0: ::std::marker::PhantomData<T>,
     pub _phantom_1: ::std::marker::PhantomData<U>,
 }
@@ -1827,25 +1832,25 @@ pub struct nsISupports_COMTypeInfo<T, U>
 fn bindgen_test_layout_nsISupports() {
     assert_eq!(::std::mem::size_of::<nsISupports>() , 8usize);
     assert_eq!(::std::mem::align_of::<nsISupports>() , 8usize);
 }
 impl Clone for nsISupports {
     fn clone(&self) -> Self { *self }
 }
 #[repr(C)]
-pub struct bindgen_vtable__bindgen_id_64102 {
+pub struct bindgen_vtable__bindgen_id_64105 {
 }
 /**
  * Participant implementation classes
  */
 #[repr(C)]
 #[derive(Debug, Copy)]
 pub struct nsCycleCollectionParticipant {
-    pub vtable_: *const bindgen_vtable__bindgen_id_64102,
+    pub vtable_: *const bindgen_vtable__bindgen_id_64105,
     pub mMightSkip: bool,
 }
 #[test]
 fn bindgen_test_layout_nsCycleCollectionParticipant() {
     assert_eq!(::std::mem::size_of::<nsCycleCollectionParticipant>() ,
                16usize);
     assert_eq!(::std::mem::align_of::<nsCycleCollectionParticipant>() ,
                8usize);
@@ -2158,34 +2163,34 @@ fn bindgen_test_layout_ErrorResult() {
  * A cleanup policy consists of two booleans: whether to assert that we've been
  * reported or suppressed, and whether to then go ahead and suppress the
  * exception.
  */
 #[repr(C)]
 #[derive(Debug)]
 pub struct TErrorResult<CleanupPolicy> {
     pub mResult: nsresult,
-    pub __bindgen_anon_1: TErrorResult__bindgen_ty_bindgen_id_68731<CleanupPolicy>,
+    pub __bindgen_anon_1: TErrorResult__bindgen_ty_bindgen_id_68734<CleanupPolicy>,
     pub _phantom_0: ::std::marker::PhantomData<CleanupPolicy>,
 }
 #[repr(C)]
 #[derive(Debug, Copy, Clone)]
 pub struct TErrorResult_Message<CleanupPolicy> {
     pub _address: u8,
     pub _phantom_0: ::std::marker::PhantomData<CleanupPolicy>,
 }
 #[repr(C)]
 #[derive(Debug, Copy, Clone)]
 pub struct TErrorResult_DOMExceptionInfo<CleanupPolicy> {
     pub _address: u8,
     pub _phantom_0: ::std::marker::PhantomData<CleanupPolicy>,
 }
 #[repr(C)]
 #[derive(Debug, Copy, Clone)]
-pub struct TErrorResult__bindgen_ty_bindgen_id_68731<CleanupPolicy> {
+pub struct TErrorResult__bindgen_ty_bindgen_id_68734<CleanupPolicy> {
     pub mMessage: __BindgenUnionField<*mut TErrorResult_Message<CleanupPolicy>>,
     pub mJSException: __BindgenUnionField<Value>,
     pub mDOMExceptionInfo: __BindgenUnionField<*mut TErrorResult_DOMExceptionInfo<CleanupPolicy>>,
     pub bindgen_union_field: u64,
     pub _phantom_0: ::std::marker::PhantomData<CleanupPolicy>,
 }
 #[repr(C)]
 #[derive(Debug, Copy)]
@@ -2308,17 +2313,17 @@ impl nsIAtom {
     #[inline]
     pub fn set_mIsStatic(&mut self, val: u32) {
         self._bitfield_1 &= !(2147483648usize as u32);
         self._bitfield_1 |=
             ((val as u32 as u32) << 31u32) & (2147483648usize as u32);
     }
 }
 #[repr(C)]
-pub struct bindgen_vtable__bindgen_id_69502 {
+pub struct bindgen_vtable__bindgen_id_69505 {
 }
 /**
  * Class to store the wrapper for an object. This can only be used with objects
  * that only have one non-security wrapper at a time (for an XPCWrappedNative
  * this is usually ensured by setting an explicit parent in the PreCreate hook
  * for the class).
  *
  * An instance of nsWrapperCache can be gotten from an object that implements
@@ -2350,17 +2355,17 @@ pub struct bindgen_vtable__bindgen_id_69
  *
  * A number of the methods are implemented in nsWrapperCacheInlines.h because we
  * have to include some JS headers that don't play nicely with the rest of the
  * codebase. Include nsWrapperCacheInlines.h if you need to call those methods.
  */
 #[repr(C)]
 #[derive(Debug)]
 pub struct nsWrapperCache {
-    pub vtable_: *const bindgen_vtable__bindgen_id_69502,
+    pub vtable_: *const bindgen_vtable__bindgen_id_69505,
     pub mWrapper: *mut JSObject,
     pub mFlags: nsWrapperCache_FlagsType,
 }
 #[repr(C)]
 #[derive(Debug, Copy, Clone)]
 pub struct nsWrapperCache_COMTypeInfo<T, U> {
     pub _address: u8,
     pub _phantom_0: ::std::marker::PhantomData<T>,
@@ -2375,31 +2380,31 @@ pub type nsWrapperCache_FlagsType = u32;
    * causes between the native object and the JS object, so it is important that
    * any native object that supports preserving of its wrapper
    * traces/traverses/unlinks the cached JS object (see
    * NS_IMPL_CYCLE_COLLECTION_TRACE_PRESERVED_WRAPPER,
    * NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS and
    * NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER).
    */
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum nsWrapperCache__bindgen_ty_bindgen_id_69698 {
+pub enum nsWrapperCache__bindgen_ty_bindgen_id_69701 {
     WRAPPER_BIT_PRESERVED = 1,
 }
 #[repr(u32)]
 /**
    * If this bit is set then the wrapper for the native object is not a DOM
    * binding.
    */
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum nsWrapperCache__bindgen_ty_bindgen_id_69701 {
+pub enum nsWrapperCache__bindgen_ty_bindgen_id_69704 {
     WRAPPER_IS_NOT_DOM_BINDING = 2,
 }
 #[repr(u32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum nsWrapperCache__bindgen_ty_bindgen_id_69704 {
+pub enum nsWrapperCache__bindgen_ty_bindgen_id_69707 {
     kWrapperFlagsMask = 3,
 }
 #[test]
 fn bindgen_test_layout_nsWrapperCache() {
     assert_eq!(::std::mem::size_of::<nsWrapperCache>() , 24usize);
     assert_eq!(::std::mem::align_of::<nsWrapperCache>() , 8usize);
 }
 #[repr(C)]
@@ -2498,33 +2503,33 @@ impl Clone for bidirectional_iterator_ta
 #[derive(Debug, Copy)]
 pub struct random_access_iterator_tag {
     pub _address: u8,
 }
 impl Clone for random_access_iterator_tag {
     fn clone(&self) -> Self { *self }
 }
 #[repr(C)]
-pub struct bindgen_vtable__bindgen_id_89267 {
+pub struct bindgen_vtable__bindgen_id_89270 {
 }
 /**
  * A class of objects that return source code on demand.
  *
  * When code is compiled with setSourceIsLazy(true), SpiderMonkey doesn't
  * retain the source code (and doesn't do lazy bytecode generation). If we ever
  * need the source code, say, in response to a call to Function.prototype.
  * toSource or Debugger.Source.prototype.text, then we call the 'load' member
  * function of the instance of this class that has hopefully been registered
  * with the runtime, passing the code's URL, and hope that it will be able to
  * find the source.
  */
 #[repr(C)]
 #[derive(Debug)]
 pub struct SourceHook {
-    pub vtable_: *const bindgen_vtable__bindgen_id_89267,
+    pub vtable_: *const bindgen_vtable__bindgen_id_89270,
 }
 #[test]
 fn bindgen_test_layout_SourceHook() {
     assert_eq!(::std::mem::size_of::<SourceHook>() , 8usize);
     assert_eq!(::std::mem::align_of::<SourceHook>() , 8usize);
 }
 #[repr(C)]
 #[derive(Debug, Copy)]
@@ -2535,17 +2540,17 @@ pub struct nsIPrincipal {
 #[derive(Debug, Copy, Clone)]
 pub struct nsIPrincipal_COMTypeInfo<T, U> {
     pub _address: u8,
     pub _phantom_0: ::std::marker::PhantomData<T>,
     pub _phantom_1: ::std::marker::PhantomData<U>,
 }
 #[repr(u32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum nsIPrincipal__bindgen_ty_bindgen_id_94706 {
+pub enum nsIPrincipal__bindgen_ty_bindgen_id_94709 {
     APP_STATUS_NOT_INSTALLED = 0,
     APP_STATUS_INSTALLED = 1,
     APP_STATUS_PRIVILEGED = 2,
     APP_STATUS_CERTIFIED = 3,
 }
 #[test]
 fn bindgen_test_layout_nsIPrincipal() {
     assert_eq!(::std::mem::size_of::<nsIPrincipal>() , 8usize);
@@ -2853,17 +2858,17 @@ pub enum nsIDocument_DocumentTheme {
     Doc_Theme_Neutral = 2,
     Doc_Theme_Dark = 3,
     Doc_Theme_Bright = 4,
 }
 pub type nsIDocument_FrameRequestCallbackList =
     nsTArray<RefPtr<FrameRequestCallback>>;
 #[repr(u32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum nsIDocument__bindgen_ty_bindgen_id_103392 { REQUEST_DISCARD = 1, }
+pub enum nsIDocument__bindgen_ty_bindgen_id_103401 { REQUEST_DISCARD = 1, }
 #[repr(u32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
 pub enum nsIDocument_DeprecatedOperations {
     eGetAttributeNode = 0,
     eSetAttributeNode = 1,
     eGetAttributeNodeNS = 2,
     eSetAttributeNodeNS = 3,
     eRemoveAttributeNode = 4,
@@ -3544,20 +3549,19 @@ impl nsIDocument {
 pub struct nsINode {
     pub _base: EventTarget,
     pub mNodeInfo: RefPtr<NodeInfo>,
     pub mParent: *mut nsINode,
     pub mBoolFlags: u32,
     pub mNextSibling: *mut nsIContent,
     pub mPreviousSibling: *mut nsIContent,
     pub mFirstChild: *mut nsIContent,
-    pub __bindgen_anon_1: nsINode__bindgen_ty_bindgen_id_100106,
+    pub __bindgen_anon_1: nsINode__bindgen_ty_bindgen_id_100115,
     pub mSlots: *mut nsINode_nsSlots,
-    pub mServoNodeData: UniquePtr<ServoNodeData,
-                                  DefaultDelete<ServoNodeData>>,
+    pub mServoData: ServoCell<*mut ServoNodeData>,
 }
 pub type nsINode_BoxQuadOptions = BoxQuadOptions;
 pub type nsINode_ConvertCoordinateOptions = ConvertCoordinateOptions;
 pub type nsINode_DOMPoint = DOMPoint;
 pub type nsINode_DOMPointInit = DOMPointInit;
 pub type nsINode_DOMQuad = DOMQuad;
 pub type nsINode_DOMRectReadOnly = DOMRectReadOnly;
 pub type nsINode_OwningNodeOrString = OwningNodeOrString;
@@ -3570,37 +3574,37 @@ pub struct nsINode_COMTypeInfo<T, U> {
     pub _phantom_0: ::std::marker::PhantomData<T>,
     pub _phantom_1: ::std::marker::PhantomData<U>,
 }
 #[repr(u32)]
 /**
    * Bit-flags to pass (or'ed together) to IsNodeOfType()
    */
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum nsINode__bindgen_ty_bindgen_id_96250 {
+pub enum nsINode__bindgen_ty_bindgen_id_96253 {
     eCONTENT = 1,
     eDOCUMENT = 2,
     eATTRIBUTE = 4,
     eTEXT = 8,
     ePROCESSING_INSTRUCTION = 16,
     eCOMMENT = 32,
     eHTML_FORM_CONTROL = 64,
     eDOCUMENT_FRAGMENT = 128,
     eDATA_NODE = 256,
     eMEDIA = 512,
     eANIMATION = 1024,
     eFILTER = 2048,
 }
 #[repr(C)]
-pub struct bindgen_vtable__bindgen_id_97019 {
+pub struct bindgen_vtable__bindgen_id_97022 {
 }
 #[repr(C)]
 #[derive(Debug)]
 pub struct nsINode_nsSlots {
-    pub vtable_: *const bindgen_vtable__bindgen_id_97019,
+    pub vtable_: *const bindgen_vtable__bindgen_id_97022,
     /**
      * A list of mutation observers
      */
     pub mMutationObservers: [u64; 2usize],
     /**
      * An object implementing nsIDOMNodeList for this content (childNodes)
      * @see nsIDOMNodeList
      * @see nsGenericHTMLElement::GetChildNodes
@@ -3659,29 +3663,29 @@ pub enum nsINode_BooleanFlag {
     NodeHasRelevantHoverRules = 28,
     ElementHasWeirdParserInsertionMode = 29,
     ParserHasNotified = 30,
     MayBeApzAware = 31,
     BooleanFlagCount = 32,
 }
 #[repr(C)]
 #[derive(Debug, Copy)]
-pub struct nsINode__bindgen_ty_bindgen_id_100106 {
+pub struct nsINode__bindgen_ty_bindgen_id_100115 {
     pub mPrimaryFrame: __BindgenUnionField<*mut nsIFrame>,
     pub mSubtreeRoot: __BindgenUnionField<*mut nsINode>,
     pub bindgen_union_field: u64,
 }
 #[test]
-fn bindgen_test_layout_nsINode__bindgen_ty_bindgen_id_100106() {
-    assert_eq!(::std::mem::size_of::<nsINode__bindgen_ty_bindgen_id_100106>()
+fn bindgen_test_layout_nsINode__bindgen_ty_bindgen_id_100115() {
+    assert_eq!(::std::mem::size_of::<nsINode__bindgen_ty_bindgen_id_100115>()
                , 8usize);
-    assert_eq!(::std::mem::align_of::<nsINode__bindgen_ty_bindgen_id_100106>()
+    assert_eq!(::std::mem::align_of::<nsINode__bindgen_ty_bindgen_id_100115>()
                , 8usize);
 }
-impl Clone for nsINode__bindgen_ty_bindgen_id_100106 {
+impl Clone for nsINode__bindgen_ty_bindgen_id_100115 {
     fn clone(&self) -> Self { *self }
 }
 #[test]
 fn bindgen_test_layout_nsINode() {
     assert_eq!(::std::mem::size_of::<nsINode>() , 104usize);
     assert_eq!(::std::mem::align_of::<nsINode>() , 8usize);
 }
 #[repr(C)]
@@ -4021,33 +4025,33 @@ pub struct nsIDOMNode {
 #[derive(Debug, Copy, Clone)]
 pub struct nsIDOMNode_COMTypeInfo<T, U> {
     pub _address: u8,
     pub _phantom_0: ::std::marker::PhantomData<T>,
     pub _phantom_1: ::std::marker::PhantomData<U>,
 }
 #[repr(u32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum nsIDOMNode__bindgen_ty_bindgen_id_108375 {
+pub enum nsIDOMNode__bindgen_ty_bindgen_id_108384 {
     ELEMENT_NODE = 1,
     ATTRIBUTE_NODE = 2,
     TEXT_NODE = 3,
     CDATA_SECTION_NODE = 4,
     ENTITY_REFERENCE_NODE = 5,
     ENTITY_NODE = 6,
     PROCESSING_INSTRUCTION_NODE = 7,
     COMMENT_NODE = 8,
     DOCUMENT_NODE = 9,
     DOCUMENT_TYPE_NODE = 10,
     DOCUMENT_FRAGMENT_NODE = 11,
     NOTATION_NODE = 12,
 }
 #[repr(u32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum nsIDOMNode__bindgen_ty_bindgen_id_108594 {
+pub enum nsIDOMNode__bindgen_ty_bindgen_id_108603 {
     DOCUMENT_POSITION_DISCONNECTED = 1,
     DOCUMENT_POSITION_PRECEDING = 2,
     DOCUMENT_POSITION_FOLLOWING = 4,
     DOCUMENT_POSITION_CONTAINS = 8,
     DOCUMENT_POSITION_CONTAINED_BY = 16,
     DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC = 32,
 }
 #[test]
@@ -5110,17 +5114,17 @@ pub type PLDHashInitEntry =
 pub struct nsPtrHashKey<T> {
     pub _base: PLDHashEntryHdr,
     pub mKey: *mut T,
 }
 pub type nsPtrHashKey_KeyType<T> = *mut T;
 pub type nsPtrHashKey_KeyTypePointer<T> = *mut T;
 #[repr(i32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum nsPtrHashKey__bindgen_ty_bindgen_id_112948 { ALLOW_MEMMOVE = 0, }
+pub enum nsPtrHashKey__bindgen_ty_bindgen_id_112957 { ALLOW_MEMMOVE = 0, }
 /**
  * A node of content in a document's content model. This interface
  * is supported by all content objects.
  */
 #[repr(C)]
 #[derive(Debug)]
 pub struct nsIContent {
     pub _base: nsINode,
@@ -5130,24 +5134,24 @@ pub type nsIContent_IMEState = IMEState;
 #[derive(Debug, Copy, Clone)]
 pub struct nsIContent_COMTypeInfo<T, U> {
     pub _address: u8,
     pub _phantom_0: ::std::marker::PhantomData<T>,
     pub _phantom_1: ::std::marker::PhantomData<U>,
 }
 #[repr(u32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum nsIContent__bindgen_ty_bindgen_id_114288 {
+pub enum nsIContent__bindgen_ty_bindgen_id_114297 {
     eAllChildren = 0,
     eAllButXBL = 1,
     eSkipPlaceholderContent = 2,
 }
 #[repr(i32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum nsIContent__bindgen_ty_bindgen_id_114524 {
+pub enum nsIContent__bindgen_ty_bindgen_id_114533 {
     ATTR_MISSING = -1,
     ATTR_VALUE_NO_MATCH = -2,
 }
 /**
    * Check whether this content node's given attribute has one of a given
    * list of values. If there is a match, we return the index in the list
    * of the first matching value. If there was no attribute at all, then
    * we return ATTR_MISSING. If there was an attribute but it didn't
@@ -5343,17 +5347,17 @@ pub struct FragmentOrElement_nsDOMSlots 
      * Holds any SMIL override style declaration for this element.
      */
     pub mSMILOverrideStyleDeclaration: RefPtr<Declaration>,
     /**
      * An object implementing nsIDOMMozNamedAttrMap for this content (attributes)
      * @see FragmentOrElement::GetAttributes
      */
     pub mAttributeMap: RefPtr<nsDOMAttributeMap>,
-    pub __bindgen_anon_1: FragmentOrElement_nsDOMSlots__bindgen_ty_bindgen_id_115619,
+    pub __bindgen_anon_1: FragmentOrElement_nsDOMSlots__bindgen_ty_bindgen_id_115628,
     /**
      * An object implementing the .children property for this element.
      */
     pub mChildrenList: RefPtr<nsContentList>,
     /**
      * An object implementing the .classList property for this element.
      */
     pub mClassList: RefPtr<nsDOMTokenList>,
@@ -5380,36 +5384,36 @@ pub struct FragmentOrElement_nsDOMSlots 
     pub mXBLInsertionParent: nsCOMPtr<nsIContent>,
     /**
      * Web components custom element data.
      */
     pub mCustomElementData: RefPtr<CustomElementData>,
 }
 #[repr(C)]
 #[derive(Debug, Copy)]
-pub struct FragmentOrElement_nsDOMSlots__bindgen_ty_bindgen_id_115619 {
+pub struct FragmentOrElement_nsDOMSlots__bindgen_ty_bindgen_id_115628 {
     /**
       * The nearest enclosing content node with a binding that created us.
       * @see FragmentOrElement::GetBindingParent
       */
     pub mBindingParent: __BindgenUnionField<*mut nsIContent>,
     /**
       * The controllers of the XUL Element.
       */
     pub mControllers: __BindgenUnionField<*mut nsIControllers>,
     pub bindgen_union_field: u64,
 }
 #[test]
-fn bindgen_test_layout_FragmentOrElement_nsDOMSlots__bindgen_ty_bindgen_id_115619() {
-    assert_eq!(::std::mem::size_of::<FragmentOrElement_nsDOMSlots__bindgen_ty_bindgen_id_115619>()
+fn bindgen_test_layout_FragmentOrElement_nsDOMSlots__bindgen_ty_bindgen_id_115628() {
+    assert_eq!(::std::mem::size_of::<FragmentOrElement_nsDOMSlots__bindgen_ty_bindgen_id_115628>()
                , 8usize);
-    assert_eq!(::std::mem::align_of::<FragmentOrElement_nsDOMSlots__bindgen_ty_bindgen_id_115619>()
+    assert_eq!(::std::mem::align_of::<FragmentOrElement_nsDOMSlots__bindgen_ty_bindgen_id_115628>()
                , 8usize);
 }
-impl Clone for FragmentOrElement_nsDOMSlots__bindgen_ty_bindgen_id_115619 {
+impl Clone for FragmentOrElement_nsDOMSlots__bindgen_ty_bindgen_id_115628 {
     fn clone(&self) -> Self { *self }
 }
 #[test]
 fn bindgen_test_layout_FragmentOrElement_nsDOMSlots() {
     assert_eq!(::std::mem::size_of::<FragmentOrElement_nsDOMSlots>() ,
                168usize);
     assert_eq!(::std::mem::align_of::<FragmentOrElement_nsDOMSlots>() ,
                8usize);
@@ -5471,31 +5475,31 @@ pub struct nsIChannel {
 #[derive(Debug, Copy, Clone)]
 pub struct nsIChannel_COMTypeInfo<T, U> {
     pub _address: u8,
     pub _phantom_0: ::std::marker::PhantomData<T>,
     pub _phantom_1: ::std::marker::PhantomData<U>,
 }
 #[repr(u32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum nsIChannel__bindgen_ty_bindgen_id_132785 {
+pub enum nsIChannel__bindgen_ty_bindgen_id_132794 {
     LOAD_DOCUMENT_URI = 65536,
     LOAD_RETARGETED_DOCUMENT_URI = 131072,
     LOAD_REPLACE = 262144,
     LOAD_INITIAL_DOCUMENT_URI = 524288,
     LOAD_TARGETED = 1048576,
     LOAD_CALL_CONTENT_SNIFFERS = 2097152,
     LOAD_CLASSIFY_URI = 4194304,
     LOAD_MEDIA_SNIFFER_OVERRIDES_CONTENT_TYPE = 8388608,
     LOAD_EXPLICIT_CREDENTIALS = 16777216,
     LOAD_BYPASS_SERVICE_WORKER = 33554432,
 }
 #[repr(u32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum nsIChannel__bindgen_ty_bindgen_id_132805 {
+pub enum nsIChannel__bindgen_ty_bindgen_id_132814 {
     DISPOSITION_INLINE = 0,
     DISPOSITION_ATTACHMENT = 1,
 }
 #[test]
 fn bindgen_test_layout_nsIChannel() {
     assert_eq!(::std::mem::size_of::<nsIChannel>() , 8usize);
     assert_eq!(::std::mem::align_of::<nsIChannel>() , 8usize);
 }
@@ -5511,17 +5515,17 @@ pub struct nsIRequest {
 #[derive(Debug, Copy, Clone)]
 pub struct nsIRequest_COMTypeInfo<T, U> {
     pub _address: u8,
     pub _phantom_0: ::std::marker::PhantomData<T>,
     pub _phantom_1: ::std::marker::PhantomData<U>,
 }
 #[repr(u32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum nsIRequest__bindgen_ty_bindgen_id_132623 {
+pub enum nsIRequest__bindgen_ty_bindgen_id_132632 {
     LOAD_REQUESTMASK = 65535,
     LOAD_NORMAL = 0,
     LOAD_BACKGROUND = 1,
     INHIBIT_PIPELINE = 64,
     INHIBIT_CACHING = 128,
     INHIBIT_PERSISTENT_CACHING = 256,
     LOAD_BYPASS_CACHE = 512,
     LOAD_FROM_CACHE = 1024,
@@ -6063,23 +6067,23 @@ pub enum nsIPresShell_IntrinsicDirty {
 }
 #[repr(u32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
 pub enum nsIPresShell_ReflowRootHandling {
     ePositionOrSizeChange = 0,
     eNoPositionOrSizeChange = 1,
     eInferFromBitToAdd = 2,
 }
-pub const SCROLL_LEFT: nsIPresShell__bindgen_ty_bindgen_id_150598 =
-    nsIPresShell__bindgen_ty_bindgen_id_150598::SCROLL_TOP;
-pub const SCROLL_RIGHT: nsIPresShell__bindgen_ty_bindgen_id_150598 =
-    nsIPresShell__bindgen_ty_bindgen_id_150598::SCROLL_BOTTOM;
+pub const SCROLL_LEFT: nsIPresShell__bindgen_ty_bindgen_id_150619 =
+    nsIPresShell__bindgen_ty_bindgen_id_150619::SCROLL_TOP;
+pub const SCROLL_RIGHT: nsIPresShell__bindgen_ty_bindgen_id_150619 =
+    nsIPresShell__bindgen_ty_bindgen_id_150619::SCROLL_BOTTOM;
 #[repr(i32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum nsIPresShell__bindgen_ty_bindgen_id_150598 {
+pub enum nsIPresShell__bindgen_ty_bindgen_id_150619 {
     SCROLL_TOP = 0,
     SCROLL_BOTTOM = 100,
     SCROLL_CENTER = 50,
     SCROLL_MINIMUM = -1,
 }
 #[repr(u32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
 pub enum nsIPresShell_WhenToScroll {
@@ -6097,17 +6101,17 @@ fn bindgen_test_layout_nsIPresShell_Scro
     assert_eq!(::std::mem::size_of::<nsIPresShell_ScrollAxis>() , 4usize);
     assert_eq!(::std::mem::align_of::<nsIPresShell_ScrollAxis>() , 4usize);
 }
 impl Clone for nsIPresShell_ScrollAxis {
     fn clone(&self) -> Self { *self }
 }
 #[repr(u32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum nsIPresShell__bindgen_ty_bindgen_id_150629 {
+pub enum nsIPresShell__bindgen_ty_bindgen_id_150650 {
     SCROLL_FIRST_ANCESTOR_ONLY = 1,
     SCROLL_OVERFLOW_HIDDEN = 2,
     SCROLL_NO_PARENT_FRAMES = 4,
     SCROLL_SMOOTH = 8,
     SCROLL_SMOOTH_AUTO = 16,
 }
 #[repr(u32)]
 /**
@@ -6144,41 +6148,41 @@ pub enum nsIPresShell__bindgen_ty_bindge
    * or the document is in ignore viewport scrolling mode
    * (nsIPresShell::SetIgnoreViewportScrolling/IgnoringViewportScrolling).
    * @param aBackgroundColor a background color to render onto
    * @param aRenderedContext the gfxContext to render to. We render so that
    * one CSS pixel in the source document is rendered to one unit in the current
    * transform.
    */
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum nsIPresShell__bindgen_ty_bindgen_id_151051 {
+pub enum nsIPresShell__bindgen_ty_bindgen_id_151072 {
     RENDER_IS_UNTRUSTED = 1,
     RENDER_IGNORE_VIEWPORT_SCROLLING = 2,
     RENDER_CARET = 4,
     RENDER_USE_WIDGET_LAYERS = 8,
     RENDER_ASYNC_DECODE_IMAGES = 16,
     RENDER_DOCUMENT_RELATIVE = 32,
     RENDER_DRAWWINDOW_NOT_FLUSHING = 64,
 }
 #[repr(u32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum nsIPresShell__bindgen_ty_bindgen_id_151069 {
+pub enum nsIPresShell__bindgen_ty_bindgen_id_151090 {
     RENDER_IS_IMAGE = 256,
     RENDER_AUTO_SCALE = 128,
 }
 #[repr(u32)]
 /**
    * Add a solid color item to the bottom of aList with frame aFrame and bounds
    * aBounds. Checks first if this needs to be done by checking if aFrame is a
    * canvas frame (if the FORCE_DRAW flag is passed then this check is skipped).
    * aBackstopColor is composed behind the background color of the canvas, it is
    * transparent by default.
    */
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum nsIPresShell__bindgen_ty_bindgen_id_151185 { FORCE_DRAW = 1, }
+pub enum nsIPresShell__bindgen_ty_bindgen_id_151206 { FORCE_DRAW = 1, }
 #[repr(C)]
 #[derive(Debug)]
 pub struct nsIPresShell_PointerCaptureInfo {
     pub mPendingContent: nsCOMPtr<nsIContent>,
     pub mOverrideContent: nsCOMPtr<nsIContent>,
     pub mPrimaryState: bool,
 }
 #[test]
@@ -6441,24 +6445,16 @@ fn bindgen_test_layout_nsNodeWeakReferen
 pub struct nsDOMMutationObserver {
     pub _address: u8,
 }
 impl Clone for nsDOMMutationObserver {
     fn clone(&self) -> Self { *self }
 }
 #[repr(C)]
 #[derive(Debug, Copy)]
-pub struct ServoNodeData {
-    pub _address: u8,
-}
-impl Clone for ServoNodeData {
-    fn clone(&self) -> Self { *self }
-}
-#[repr(C)]
-#[derive(Debug, Copy)]
 pub struct BoxQuadOptions {
     pub _address: u8,
 }
 impl Clone for BoxQuadOptions {
     fn clone(&self) -> Self { *self }
 }
 #[repr(C)]
 #[derive(Debug, Copy)]
@@ -6563,77 +6559,77 @@ impl Clone for TextOrElementOrDocument {
 #[repr(C)]
 #[derive(Debug, Copy)]
 pub struct DOMPointInit {
     pub _address: u8,
 }
 impl Clone for DOMPointInit {
     fn clone(&self) -> Self { *self }
 }
-pub const NODE_HAS_LISTENERMANAGER: _bindgen_ty_bindgen_id_152566 =
-    _bindgen_ty_bindgen_id_152566::NODE_HAS_LISTENERMANAGER;
-pub const NODE_HAS_PROPERTIES: _bindgen_ty_bindgen_id_152566 =
-    _bindgen_ty_bindgen_id_152566::NODE_HAS_PROPERTIES;
-pub const NODE_IS_ANONYMOUS_ROOT: _bindgen_ty_bindgen_id_152566 =
-    _bindgen_ty_bindgen_id_152566::NODE_IS_ANONYMOUS_ROOT;
-pub const NODE_IS_IN_NATIVE_ANONYMOUS_SUBTREE: _bindgen_ty_bindgen_id_152566 =
-    _bindgen_ty_bindgen_id_152566::NODE_IS_IN_NATIVE_ANONYMOUS_SUBTREE;
-pub const NODE_IS_NATIVE_ANONYMOUS_ROOT: _bindgen_ty_bindgen_id_152566 =
-    _bindgen_ty_bindgen_id_152566::NODE_IS_NATIVE_ANONYMOUS_ROOT;
-pub const NODE_FORCE_XBL_BINDINGS: _bindgen_ty_bindgen_id_152566 =
-    _bindgen_ty_bindgen_id_152566::NODE_FORCE_XBL_BINDINGS;
-pub const NODE_MAY_BE_IN_BINDING_MNGR: _bindgen_ty_bindgen_id_152566 =
-    _bindgen_ty_bindgen_id_152566::NODE_MAY_BE_IN_BINDING_MNGR;
-pub const NODE_IS_EDITABLE: _bindgen_ty_bindgen_id_152566 =
-    _bindgen_ty_bindgen_id_152566::NODE_IS_EDITABLE;
-pub const NODE_MAY_HAVE_CLASS: _bindgen_ty_bindgen_id_152566 =
-    _bindgen_ty_bindgen_id_152566::NODE_MAY_HAVE_CLASS;
-pub const NODE_IS_IN_SHADOW_TREE: _bindgen_ty_bindgen_id_152566 =
-    _bindgen_ty_bindgen_id_152566::NODE_IS_IN_SHADOW_TREE;
-pub const NODE_HAS_EMPTY_SELECTOR: _bindgen_ty_bindgen_id_152566 =
-    _bindgen_ty_bindgen_id_152566::NODE_HAS_EMPTY_SELECTOR;
-pub const NODE_HAS_SLOW_SELECTOR: _bindgen_ty_bindgen_id_152566 =
-    _bindgen_ty_bindgen_id_152566::NODE_HAS_SLOW_SELECTOR;
-pub const NODE_HAS_EDGE_CHILD_SELECTOR: _bindgen_ty_bindgen_id_152566 =
-    _bindgen_ty_bindgen_id_152566::NODE_HAS_EDGE_CHILD_SELECTOR;
-pub const NODE_HAS_SLOW_SELECTOR_LATER_SIBLINGS: _bindgen_ty_bindgen_id_152566
+pub const NODE_HAS_LISTENERMANAGER: _bindgen_ty_bindgen_id_152580 =
+    _bindgen_ty_bindgen_id_152580::NODE_HAS_LISTENERMANAGER;
+pub const NODE_HAS_PROPERTIES: _bindgen_ty_bindgen_id_152580 =
+    _bindgen_ty_bindgen_id_152580::NODE_HAS_PROPERTIES;
+pub const NODE_IS_ANONYMOUS_ROOT: _bindgen_ty_bindgen_id_152580 =
+    _bindgen_ty_bindgen_id_152580::NODE_IS_ANONYMOUS_ROOT;
+pub const NODE_IS_IN_NATIVE_ANONYMOUS_SUBTREE: _bindgen_ty_bindgen_id_152580 =
+    _bindgen_ty_bindgen_id_152580::NODE_IS_IN_NATIVE_ANONYMOUS_SUBTREE;
+pub const NODE_IS_NATIVE_ANONYMOUS_ROOT: _bindgen_ty_bindgen_id_152580 =
+    _bindgen_ty_bindgen_id_152580::NODE_IS_NATIVE_ANONYMOUS_ROOT;
+pub const NODE_FORCE_XBL_BINDINGS: _bindgen_ty_bindgen_id_152580 =
+    _bindgen_ty_bindgen_id_152580::NODE_FORCE_XBL_BINDINGS;
+pub const NODE_MAY_BE_IN_BINDING_MNGR: _bindgen_ty_bindgen_id_152580 =
+    _bindgen_ty_bindgen_id_152580::NODE_MAY_BE_IN_BINDING_MNGR;
+pub const NODE_IS_EDITABLE: _bindgen_ty_bindgen_id_152580 =
+    _bindgen_ty_bindgen_id_152580::NODE_IS_EDITABLE;
+pub const NODE_MAY_HAVE_CLASS: _bindgen_ty_bindgen_id_152580 =
+    _bindgen_ty_bindgen_id_152580::NODE_MAY_HAVE_CLASS;
+pub const NODE_IS_IN_SHADOW_TREE: _bindgen_ty_bindgen_id_152580 =
+    _bindgen_ty_bindgen_id_152580::NODE_IS_IN_SHADOW_TREE;
+pub const NODE_HAS_EMPTY_SELECTOR: _bindgen_ty_bindgen_id_152580 =
+    _bindgen_ty_bindgen_id_152580::NODE_HAS_EMPTY_SELECTOR;
+pub const NODE_HAS_SLOW_SELECTOR: _bindgen_ty_bindgen_id_152580 =
+    _bindgen_ty_bindgen_id_152580::NODE_HAS_SLOW_SELECTOR;
+pub const NODE_HAS_EDGE_CHILD_SELECTOR: _bindgen_ty_bindgen_id_152580 =
+    _bindgen_ty_bindgen_id_152580::NODE_HAS_EDGE_CHILD_SELECTOR;
+pub const NODE_HAS_SLOW_SELECTOR_LATER_SIBLINGS: _bindgen_ty_bindgen_id_152580
           =
-    _bindgen_ty_bindgen_id_152566::NODE_HAS_SLOW_SELECTOR_LATER_SIBLINGS;
-pub const NODE_ALL_SELECTOR_FLAGS: _bindgen_ty_bindgen_id_152566 =
-    _bindgen_ty_bindgen_id_152566::NODE_ALL_SELECTOR_FLAGS;
-pub const NODE_NEEDS_FRAME: _bindgen_ty_bindgen_id_152566 =
-    _bindgen_ty_bindgen_id_152566::NODE_NEEDS_FRAME;
-pub const NODE_DESCENDANTS_NEED_FRAMES: _bindgen_ty_bindgen_id_152566 =
-    _bindgen_ty_bindgen_id_152566::NODE_DESCENDANTS_NEED_FRAMES;
-pub const NODE_HAS_ACCESSKEY: _bindgen_ty_bindgen_id_152566 =
-    _bindgen_ty_bindgen_id_152566::NODE_HAS_ACCESSKEY;
-pub const NODE_HAS_DIRECTION_RTL: _bindgen_ty_bindgen_id_152566 =
-    _bindgen_ty_bindgen_id_152566::NODE_HAS_DIRECTION_RTL;
-pub const NODE_HAS_DIRECTION_LTR: _bindgen_ty_bindgen_id_152566 =
-    _bindgen_ty_bindgen_id_152566::NODE_HAS_DIRECTION_LTR;
-pub const NODE_ALL_DIRECTION_FLAGS: _bindgen_ty_bindgen_id_152566 =
-    _bindgen_ty_bindgen_id_152566::NODE_ALL_DIRECTION_FLAGS;
-pub const NODE_CHROME_ONLY_ACCESS: _bindgen_ty_bindgen_id_152566 =
-    _bindgen_ty_bindgen_id_152566::NODE_CHROME_ONLY_ACCESS;
-pub const NODE_IS_ROOT_OF_CHROME_ONLY_ACCESS: _bindgen_ty_bindgen_id_152566 =
-    _bindgen_ty_bindgen_id_152566::NODE_IS_ROOT_OF_CHROME_ONLY_ACCESS;
-pub const NODE_SHARED_RESTYLE_BIT_1: _bindgen_ty_bindgen_id_152566 =
-    _bindgen_ty_bindgen_id_152566::NODE_SHARED_RESTYLE_BIT_1;
-pub const NODE_SHARED_RESTYLE_BIT_2: _bindgen_ty_bindgen_id_152566 =
-    _bindgen_ty_bindgen_id_152566::NODE_SHARED_RESTYLE_BIT_2;
-pub const NODE_IS_DIRTY_FOR_SERVO: _bindgen_ty_bindgen_id_152566 =
-    _bindgen_ty_bindgen_id_152566::NODE_SHARED_RESTYLE_BIT_1;
-pub const NODE_HAS_DIRTY_DESCENDANTS_FOR_SERVO: _bindgen_ty_bindgen_id_152566
+    _bindgen_ty_bindgen_id_152580::NODE_HAS_SLOW_SELECTOR_LATER_SIBLINGS;
+pub const NODE_ALL_SELECTOR_FLAGS: _bindgen_ty_bindgen_id_152580 =
+    _bindgen_ty_bindgen_id_152580::NODE_ALL_SELECTOR_FLAGS;
+pub const NODE_NEEDS_FRAME: _bindgen_ty_bindgen_id_152580 =
+    _bindgen_ty_bindgen_id_152580::NODE_NEEDS_FRAME;
+pub const NODE_DESCENDANTS_NEED_FRAMES: _bindgen_ty_bindgen_id_152580 =
+    _bindgen_ty_bindgen_id_152580::NODE_DESCENDANTS_NEED_FRAMES;
+pub const NODE_HAS_ACCESSKEY: _bindgen_ty_bindgen_id_152580 =
+    _bindgen_ty_bindgen_id_152580::NODE_HAS_ACCESSKEY;
+pub const NODE_HAS_DIRECTION_RTL: _bindgen_ty_bindgen_id_152580 =
+    _bindgen_ty_bindgen_id_152580::NODE_HAS_DIRECTION_RTL;
+pub const NODE_HAS_DIRECTION_LTR: _bindgen_ty_bindgen_id_152580 =
+    _bindgen_ty_bindgen_id_152580::NODE_HAS_DIRECTION_LTR;
+pub const NODE_ALL_DIRECTION_FLAGS: _bindgen_ty_bindgen_id_152580 =
+    _bindgen_ty_bindgen_id_152580::NODE_ALL_DIRECTION_FLAGS;
+pub const NODE_CHROME_ONLY_ACCESS: _bindgen_ty_bindgen_id_152580 =
+    _bindgen_ty_bindgen_id_152580::NODE_CHROME_ONLY_ACCESS;
+pub const NODE_IS_ROOT_OF_CHROME_ONLY_ACCESS: _bindgen_ty_bindgen_id_152580 =
+    _bindgen_ty_bindgen_id_152580::NODE_IS_ROOT_OF_CHROME_ONLY_ACCESS;
+pub const NODE_SHARED_RESTYLE_BIT_1: _bindgen_ty_bindgen_id_152580 =
+    _bindgen_ty_bindgen_id_152580::NODE_SHARED_RESTYLE_BIT_1;
+pub const NODE_SHARED_RESTYLE_BIT_2: _bindgen_ty_bindgen_id_152580 =
+    _bindgen_ty_bindgen_id_152580::NODE_SHARED_RESTYLE_BIT_2;
+pub const NODE_IS_DIRTY_FOR_SERVO: _bindgen_ty_bindgen_id_152580 =
+    _bindgen_ty_bindgen_id_152580::NODE_SHARED_RESTYLE_BIT_1;
+pub const NODE_HAS_DIRTY_DESCENDANTS_FOR_SERVO: _bindgen_ty_bindgen_id_152580
           =
-    _bindgen_ty_bindgen_id_152566::NODE_SHARED_RESTYLE_BIT_2;
-pub const NODE_TYPE_SPECIFIC_BITS_OFFSET: _bindgen_ty_bindgen_id_152566 =
-    _bindgen_ty_bindgen_id_152566::NODE_TYPE_SPECIFIC_BITS_OFFSET;
+    _bindgen_ty_bindgen_id_152580::NODE_SHARED_RESTYLE_BIT_2;
+pub const NODE_TYPE_SPECIFIC_BITS_OFFSET: _bindgen_ty_bindgen_id_152580 =
+    _bindgen_ty_bindgen_id_152580::NODE_TYPE_SPECIFIC_BITS_OFFSET;
 #[repr(u32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum _bindgen_ty_bindgen_id_152566 {
+pub enum _bindgen_ty_bindgen_id_152580 {
     NODE_HAS_LISTENERMANAGER = 4,
     NODE_HAS_PROPERTIES = 8,
     NODE_IS_ANONYMOUS_ROOT = 16,
     NODE_IS_IN_NATIVE_ANONYMOUS_SUBTREE = 32,
     NODE_IS_NATIVE_ANONYMOUS_ROOT = 64,
     NODE_FORCE_XBL_BINDINGS = 128,
     NODE_MAY_BE_IN_BINDING_MNGR = 256,
     NODE_IS_EDITABLE = 512,
@@ -6681,17 +6677,17 @@ pub struct nsITimer {
 #[derive(Debug, Copy, Clone)]
 pub struct nsITimer_COMTypeInfo<T, U> {
     pub _address: u8,
     pub _phantom_0: ::std::marker::PhantomData<T>,
     pub _phantom_1: ::std::marker::PhantomData<U>,
 }
 #[repr(u32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum nsITimer__bindgen_ty_bindgen_id_169279 {
+pub enum nsITimer__bindgen_ty_bindgen_id_169293 {
     TYPE_ONE_SHOT = 0,
     TYPE_REPEATING_SLACK = 1,
     TYPE_REPEATING_PRECISE = 2,
     TYPE_REPEATING_PRECISE_CAN_SKIP = 3,
 }
 #[test]
 fn bindgen_test_layout_nsITimer() {
     assert_eq!(::std::mem::size_of::<nsITimer>() , 8usize);
@@ -6707,17 +6703,17 @@ impl Clone for nsITimer {
  */
 #[repr(C)]
 #[derive(Debug, Copy)]
 pub struct nsExpirationState {
     pub _bitfield_1: u32,
 }
 #[repr(u32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum nsExpirationState__bindgen_ty_bindgen_id_169755 {
+pub enum nsExpirationState__bindgen_ty_bindgen_id_169769 {
     NOT_TRACKED = 15,
     MAX_INDEX_IN_GENERATION = 268435455,
 }
 #[test]
 fn bindgen_test_layout_nsExpirationState() {
     assert_eq!(::std::mem::size_of::<nsExpirationState>() , 4usize);
     assert_eq!(::std::mem::align_of::<nsExpirationState>() , 4usize);
 }
@@ -6781,29 +6777,29 @@ pub struct imgIRequest {
 #[derive(Debug, Copy, Clone)]
 pub struct imgIRequest_COMTypeInfo<T, U> {
     pub _address: u8,
     pub _phantom_0: ::std::marker::PhantomData<T>,
     pub _phantom_1: ::std::marker::PhantomData<U>,
 }
 #[repr(u32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum imgIRequest__bindgen_ty_bindgen_id_170342 {
+pub enum imgIRequest__bindgen_ty_bindgen_id_170356 {
     STATUS_NONE = 0,
     STATUS_SIZE_AVAILABLE = 1,
     STATUS_LOAD_COMPLETE = 2,
     STATUS_ERROR = 4,
     STATUS_FRAME_COMPLETE = 8,
     STATUS_DECODE_COMPLETE = 16,
     STATUS_IS_ANIMATED = 32,
     STATUS_HAS_TRANSPARENCY = 64,
 }
 #[repr(u32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum imgIRequest__bindgen_ty_bindgen_id_170422 {
+pub enum imgIRequest__bindgen_ty_bindgen_id_170436 {
     CORS_NONE = 1,
     CORS_ANONYMOUS = 2,
     CORS_USE_CREDENTIALS = 3,
 }
 #[test]
 fn bindgen_test_layout_imgIRequest() {
     assert_eq!(::std::mem::size_of::<imgIRequest>() , 8usize);
     assert_eq!(::std::mem::align_of::<imgIRequest>() , 8usize);
@@ -7292,17 +7288,17 @@ pub struct nsPresArena_FreeList {
     pub mEntrySize: usize,
     pub mEntriesEverAllocated: usize,
     pub mKey: nsPresArena_FreeList_KeyTypePointer,
 }
 pub type nsPresArena_FreeList_KeyType = u32;
 pub type nsPresArena_FreeList_KeyTypePointer = *const ::std::os::raw::c_void;
 #[repr(u32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum nsPresArena_FreeList__bindgen_ty_bindgen_id_190782 {
+pub enum nsPresArena_FreeList__bindgen_ty_bindgen_id_190796 {
     ALLOW_MEMMOVE = 0,
 }
 #[test]
 fn bindgen_test_layout_nsPresArena_FreeList() {
     assert_eq!(::std::mem::size_of::<nsPresArena_FreeList>() , 40usize);
     assert_eq!(::std::mem::align_of::<nsPresArena_FreeList>() , 8usize);
 }
 #[test]
@@ -7319,17 +7315,17 @@ pub struct imgINotificationObserver {
 #[derive(Debug, Copy, Clone)]
 pub struct imgINotificationObserver_COMTypeInfo<T, U> {
     pub _address: u8,
     pub _phantom_0: ::std::marker::PhantomData<T>,
     pub _phantom_1: ::std::marker::PhantomData<U>,
 }
 #[repr(u32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum imgINotificationObserver__bindgen_ty_bindgen_id_190929 {
+pub enum imgINotificationObserver__bindgen_ty_bindgen_id_190943 {
     SIZE_AVAILABLE = 1,
     FRAME_UPDATE = 2,
     FRAME_COMPLETE = 3,
     LOAD_COMPLETE = 4,
     DECODE_COMPLETE = 5,
     DISCARD = 6,
     UNLOCKED_DRAW = 7,
     IS_ANIMATED = 8,
@@ -7568,17 +7564,17 @@ pub struct gfxFontFeatureValueSet_Featur
     pub mValues: nsTArray<::std::os::raw::c_uint>,
 }
 pub type gfxFontFeatureValueSet_FeatureValueHashEntry_KeyType =
     *const gfxFontFeatureValueSet_FeatureValueHashKey;
 pub type gfxFontFeatureValueSet_FeatureValueHashEntry_KeyTypePointer =
     *const gfxFontFeatureValueSet_FeatureValueHashKey;
 #[repr(u32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum gfxFontFeatureValueSet_FeatureValueHashEntry__bindgen_ty_bindgen_id_192167
+pub enum gfxFontFeatureValueSet_FeatureValueHashEntry__bindgen_ty_bindgen_id_192181
          {
     ALLOW_MEMMOVE = 1,
 }
 #[test]
 fn bindgen_test_layout_gfxFontFeatureValueSet_FeatureValueHashEntry() {
     assert_eq!(::std::mem::size_of::<gfxFontFeatureValueSet_FeatureValueHashEntry>()
                , 56usize);
     assert_eq!(::std::mem::align_of::<gfxFontFeatureValueSet_FeatureValueHashEntry>()
@@ -7964,33 +7960,33 @@ pub enum nsStyleUnit {
     eStyleUnit_FlexFraction = 16,
     eStyleUnit_Coord = 20,
     eStyleUnit_Integer = 30,
     eStyleUnit_Enumerated = 32,
     eStyleUnit_Calc = 40,
 }
 #[repr(C)]
 #[derive(Debug, Copy)]
-pub struct _bindgen_ty_bindgen_id_192920 {
+pub struct _bindgen_ty_bindgen_id_192934 {
     pub mInt: __BindgenUnionField<i32>,
     pub mFloat: __BindgenUnionField<f32>,
     pub mPointer: __BindgenUnionField<*mut ::std::os::raw::c_void>,
     pub bindgen_union_field: u64,
 }
 #[test]
-fn bindgen_test_layout__bindgen_ty_bindgen_id_192920() {
-    assert_eq!(::std::mem::size_of::<_bindgen_ty_bindgen_id_192920>() ,
+fn bindgen_test_layout__bindgen_ty_bindgen_id_192934() {
+    assert_eq!(::std::mem::size_of::<_bindgen_ty_bindgen_id_192934>() ,
                8usize);
-    assert_eq!(::std::mem::align_of::<_bindgen_ty_bindgen_id_192920>() ,
+    assert_eq!(::std::mem::align_of::<_bindgen_ty_bindgen_id_192934>() ,
                8usize);
 }
-impl Clone for _bindgen_ty_bindgen_id_192920 {
-    fn clone(&self) -> Self { *self }
-}
-pub type nsStyleUnion = _bindgen_ty_bindgen_id_192920;
+impl Clone for _bindgen_ty_bindgen_id_192934 {
+    fn clone(&self) -> Self { *self }
+}
+pub type nsStyleUnion = _bindgen_ty_bindgen_id_192934;
 /**
  * Class that hold a single size specification used by the style
  * system.  The size specification consists of two parts -- a number
  * and a unit.  The number is an integer, a floating point value, an
  * nscoord, or undefined, and the unit is an nsStyleUnit.  Checking
  * the unit is a must before asking for the value in any particular
  * form.
  */
@@ -9005,34 +9001,34 @@ fn bindgen_test_layout_imgRequestProxy_i
                8usize);
 }
 #[test]
 fn bindgen_test_layout_imgRequestProxy() {
     assert_eq!(::std::mem::size_of::<imgRequestProxy>() , 120usize);
     assert_eq!(::std::mem::align_of::<imgRequestProxy>() , 8usize);
 }
 #[repr(C)]
-pub struct bindgen_vtable__bindgen_id_201935 {
+pub struct bindgen_vtable__bindgen_id_201949 {
 }
 /**
  * An interface for observing changes to image state, as reported by
  * ProgressTracker.
  *
  * This is the ImageLib-internal version of imgINotificationObserver,
  * essentially, with implementation details that code outside of ImageLib
  * shouldn't see.
  *
  * XXX(seth): It's preferable to avoid adding anything to this interface if
  * possible.  In the long term, it would be ideal to get to a place where we can
  * just use the imgINotificationObserver interface internally as well.
  */
 #[repr(C)]
 #[derive(Debug)]
 pub struct IProgressObserver {
-    pub vtable_: *const bindgen_vtable__bindgen_id_201935,
+    pub vtable_: *const bindgen_vtable__bindgen_id_201949,
     pub _base: u64,
 }
 #[test]
 fn bindgen_test_layout_IProgressObserver() {
     assert_eq!(::std::mem::size_of::<IProgressObserver>() , 16usize);
     assert_eq!(::std::mem::align_of::<IProgressObserver>() , 8usize);
 }
 #[repr(C)]
@@ -9044,17 +9040,17 @@ pub struct nsISupportsPriority {
 #[derive(Debug, Copy, Clone)]
 pub struct nsISupportsPriority_COMTypeInfo<T, U> {
     pub _address: u8,
     pub _phantom_0: ::std::marker::PhantomData<T>,
     pub _phantom_1: ::std::marker::PhantomData<U>,
 }
 #[repr(i32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum nsISupportsPriority__bindgen_ty_bindgen_id_202011 {
+pub enum nsISupportsPriority__bindgen_ty_bindgen_id_202025 {
     PRIORITY_HIGHEST = -20,
     PRIORITY_HIGH = -10,
     PRIORITY_NORMAL = 0,
     PRIORITY_LOW = 10,
     PRIORITY_LOWEST = 20,
 }
 #[test]
 fn bindgen_test_layout_nsISupportsPriority() {
@@ -9435,33 +9431,33 @@ pub type nsCSSValueFloatColor_HasThreadS
 fn bindgen_test_layout_nsCSSValueFloatColor() {
     assert_eq!(::std::mem::size_of::<nsCSSValueFloatColor>() , 32usize);
     assert_eq!(::std::mem::align_of::<nsCSSValueFloatColor>() , 8usize);
 }
 #[repr(C)]
 #[derive(Debug)]
 pub struct nsCSSValue {
     pub mUnit: nsCSSUnit,
-    pub mValue: nsCSSValue__bindgen_ty_bindgen_id_204905,
+    pub mValue: nsCSSValue__bindgen_ty_bindgen_id_204919,
 }
 #[repr(C)]
 #[derive(Debug)]
 pub struct nsCSSValue_Array {
     pub mRefCnt: usize,
     pub mCount: usize,
     pub mArray: [nsCSSValue; 1usize],
 }
 #[test]
 fn bindgen_test_layout_nsCSSValue_Array() {
     assert_eq!(::std::mem::size_of::<nsCSSValue_Array>() , 32usize);
     assert_eq!(::std::mem::align_of::<nsCSSValue_Array>() , 8usize);
 }
 #[repr(C)]
 #[derive(Debug, Copy)]
-pub struct nsCSSValue__bindgen_ty_bindgen_id_204905 {
+pub struct nsCSSValue__bindgen_ty_bindgen_id_204919 {
     pub mInt: __BindgenUnionField<i32>,
     pub mFloat: __BindgenUnionField<f32>,
     pub mString: __BindgenUnionField<*mut nsStringBuffer>,
     pub mColor: __BindgenUnionField<nscolor>,
     pub mArray: __BindgenUnionField<*mut nsCSSValue_Array>,
     pub mURL: __BindgenUnionField<*mut URLValue>,
     pub mImage: __BindgenUnionField<*mut ImageValue>,
     pub mGridTemplateAreas: __BindgenUnionField<*mut GridTemplateAreasValue>,
@@ -9475,23 +9471,23 @@ pub struct nsCSSValue__bindgen_ty_bindge
     pub mSharedList: __BindgenUnionField<*mut nsCSSValueSharedList>,
     pub mPairList: __BindgenUnionField<*mut nsCSSValuePairList_heap>,
     pub mPairListDependent: __BindgenUnionField<*mut nsCSSValuePairList>,
     pub mFloatColor: __BindgenUnionField<*mut nsCSSValueFloatColor>,
     pub mFontFamilyList: __BindgenUnionField<*mut FontFamilyListRefCnt>,
     pub bindgen_union_field: u64,
 }
 #[test]
-fn bindgen_test_layout_nsCSSValue__bindgen_ty_bindgen_id_204905() {
-    assert_eq!(::std::mem::size_of::<nsCSSValue__bindgen_ty_bindgen_id_204905>()
+fn bindgen_test_layout_nsCSSValue__bindgen_ty_bindgen_id_204919() {
+    assert_eq!(::std::mem::size_of::<nsCSSValue__bindgen_ty_bindgen_id_204919>()
                , 8usize);
-    assert_eq!(::std::mem::align_of::<nsCSSValue__bindgen_ty_bindgen_id_204905>()
+    assert_eq!(::std::mem::align_of::<nsCSSValue__bindgen_ty_bindgen_id_204919>()
                , 8usize);
 }
-impl Clone for nsCSSValue__bindgen_ty_bindgen_id_204905 {
+impl Clone for nsCSSValue__bindgen_ty_bindgen_id_204919 {
     fn clone(&self) -> Self { *self }
 }
 #[test]
 fn bindgen_test_layout_nsCSSValue() {
     assert_eq!(::std::mem::size_of::<nsCSSValue>() , 16usize);
     assert_eq!(::std::mem::align_of::<nsCSSValue>() , 8usize);
 }
 #[repr(C)]
@@ -9502,22 +9498,22 @@ pub struct nsCSSValueGradientStop {
     pub mIsInterpolationHint: bool,
 }
 #[test]
 fn bindgen_test_layout_nsCSSValueGradientStop() {
     assert_eq!(::std::mem::size_of::<nsCSSValueGradientStop>() , 40usize);
     assert_eq!(::std::mem::align_of::<nsCSSValueGradientStop>() , 8usize);
 }
 #[repr(C)]
-pub struct bindgen_vtable__bindgen_id_205112 {
+pub struct bindgen_vtable__bindgen_id_205126 {
 }
 #[repr(C)]
 #[derive(Debug, Copy)]
 pub struct CounterStyle {
-    pub vtable_: *const bindgen_vtable__bindgen_id_205112,
+    pub vtable_: *const bindgen_vtable__bindgen_id_205126,
     pub mStyle: i32,
 }
 #[test]
 fn bindgen_test_layout_CounterStyle() {
     assert_eq!(::std::mem::size_of::<CounterStyle>() , 16usize);
     assert_eq!(::std::mem::align_of::<CounterStyle>() , 8usize);
 }
 impl Clone for CounterStyle {
@@ -9588,16 +9584,19 @@ pub struct nsStyleVisibility {
     pub mTextOrientation: u8,
     pub mColorAdjust: u8,
 }
 #[test]
 fn bindgen_test_layout_nsStyleVisibility() {
     assert_eq!(::std::mem::size_of::<nsStyleVisibility>() , 7usize);
     assert_eq!(::std::mem::align_of::<nsStyleVisibility>() , 1usize);
 }
+pub type RawGeckoNode = nsINode;
+pub type RawGeckoElement = Element;
+pub type RawGeckoDocument = nsIDocument;
 #[repr(C)]
 #[derive(Debug)]
 pub struct FragmentOrURL {
     pub mURL: nsCOMPtr<nsIURI>,
     pub mIsLocalRef: bool,
 }
 #[test]
 fn bindgen_test_layout_FragmentOrURL() {
@@ -9704,35 +9703,35 @@ fn bindgen_test_layout_CachedBorderImage
  * image of type (1)).
  */
 #[repr(C)]
 #[derive(Debug)]
 pub struct nsStyleImage {
     pub mCachedBIData: UniquePtr<CachedBorderImageData,
                                  DefaultDelete<CachedBorderImageData>>,
     pub mType: nsStyleImageType,
-    pub __bindgen_anon_1: nsStyleImage__bindgen_ty_bindgen_id_207069,
+    pub __bindgen_anon_1: nsStyleImage__bindgen_ty_bindgen_id_207094,
     pub mCropRect: UniquePtr<nsStyleSides, DefaultDelete<nsStyleSides>>,
 }
 #[repr(C)]
 #[derive(Debug, Copy)]
-pub struct nsStyleImage__bindgen_ty_bindgen_id_207069 {
+pub struct nsStyleImage__bindgen_ty_bindgen_id_207094 {
     pub mImage: __BindgenUnionField<*mut imgRequestProxy>,
     pub mGradient: __BindgenUnionField<*mut nsStyleGradient>,
     pub mElementId: __BindgenUnionField<*mut u16>,
     pub bindgen_union_field: u64,
 }
 #[test]
-fn bindgen_test_layout_nsStyleImage__bindgen_ty_bindgen_id_207069() {
-    assert_eq!(::std::mem::size_of::<nsStyleImage__bindgen_ty_bindgen_id_207069>()
+fn bindgen_test_layout_nsStyleImage__bindgen_ty_bindgen_id_207094() {
+    assert_eq!(::std::mem::size_of::<nsStyleImage__bindgen_ty_bindgen_id_207094>()
                , 8usize);
-    assert_eq!(::std::mem::align_of::<nsStyleImage__bindgen_ty_bindgen_id_207069>()
+    assert_eq!(::std::mem::align_of::<nsStyleImage__bindgen_ty_bindgen_id_207094>()
                , 8usize);
 }
-impl Clone for nsStyleImage__bindgen_ty_bindgen_id_207069 {
+impl Clone for nsStyleImage__bindgen_ty_bindgen_id_207094 {
     fn clone(&self) -> Self { *self }
 }
 #[test]
 fn bindgen_test_layout_nsStyleImage() {
     assert_eq!(::std::mem::size_of::<nsStyleImage>() , 32usize);
     assert_eq!(::std::mem::align_of::<nsStyleImage>() , 8usize);
 }
 #[repr(C)]
@@ -9773,17 +9772,17 @@ pub struct nsStyleImageLayers {
     pub mSizeCount: u32,
     pub mMaskModeCount: u32,
     pub mBlendModeCount: u32,
     pub mCompositeCount: u32,
     pub mLayers: nsStyleAutoArray<nsStyleImageLayers_Layer>,
 }
 #[repr(u32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum nsStyleImageLayers__bindgen_ty_bindgen_id_207113 {
+pub enum nsStyleImageLayers__bindgen_ty_bindgen_id_207138 {
     shorthand = 0,
     color = 1,
     image = 2,
     repeat = 3,
     positionX = 4,
     positionY = 5,
     clip = 6,
     origin = 7,
@@ -10309,17 +10308,17 @@ fn bindgen_test_layout_nsStyleImageOrien
 }
 impl Clone for nsStyleImageOrientation {
     fn clone(&self) -> Self { *self }
 }
 #[repr(C)]
 #[derive(Debug, Copy)]
 pub struct nsTimingFunction {
     pub mType: nsTimingFunction_Type,
-    pub __bindgen_anon_1: nsTimingFunction__bindgen_ty_bindgen_id_208872,
+    pub __bindgen_anon_1: nsTimingFunction__bindgen_ty_bindgen_id_208897,
 }
 #[repr(i32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
 pub enum nsTimingFunction_Type {
     Ease = 0,
     Linear = 1,
     EaseIn = 2,
     EaseOut = 3,
@@ -10328,66 +10327,66 @@ pub enum nsTimingFunction_Type {
     StepEnd = 6,
     CubicBezier = 7,
 }
 #[repr(i32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
 pub enum nsTimingFunction_Keyword { Implicit = 0, Explicit = 1, }
 #[repr(C)]
 #[derive(Debug, Copy)]
-pub struct nsTimingFunction__bindgen_ty_bindgen_id_208872 {
-    pub mFunc: __BindgenUnionField<nsTimingFunction__bindgen_ty_bindgen_id_208872__bindgen_ty_bindgen_id_208873>,
-    pub __bindgen_anon_1: __BindgenUnionField<nsTimingFunction__bindgen_ty_bindgen_id_208872__bindgen_ty_bindgen_id_208884>,
+pub struct nsTimingFunction__bindgen_ty_bindgen_id_208897 {
+    pub mFunc: __BindgenUnionField<nsTimingFunction__bindgen_ty_bindgen_id_208897__bindgen_ty_bindgen_id_208898>,
+    pub __bindgen_anon_1: __BindgenUnionField<nsTimingFunction__bindgen_ty_bindgen_id_208897__bindgen_ty_bindgen_id_208909>,
     pub bindgen_union_field: [u32; 4usize],
 }
 #[repr(C)]
 #[derive(Debug, Copy)]
-pub struct nsTimingFunction__bindgen_ty_bindgen_id_208872__bindgen_ty_bindgen_id_208873 {
+pub struct nsTimingFunction__bindgen_ty_bindgen_id_208897__bindgen_ty_bindgen_id_208898 {
     pub mX1: f32,
     pub mY1: f32,
     pub mX2: f32,
     pub mY2: f32,
 }
 #[test]
-fn bindgen_test_layout_nsTimingFunction__bindgen_ty_bindgen_id_208872__bindgen_ty_bindgen_id_208873() {
-    assert_eq!(::std::mem::size_of::<nsTimingFunction__bindgen_ty_bindgen_id_208872__bindgen_ty_bindgen_id_208873>()
+fn bindgen_test_layout_nsTimingFunction__bindgen_ty_bindgen_id_208897__bindgen_ty_bindgen_id_208898() {
+    assert_eq!(::std::mem::size_of::<nsTimingFunction__bindgen_ty_bindgen_id_208897__bindgen_ty_bindgen_id_208898>()
                , 16usize);
-    assert_eq!(::std::mem::align_of::<nsTimingFunction__bindgen_ty_bindgen_id_208872__bindgen_ty_bindgen_id_208873>()
+    assert_eq!(::std::mem::align_of::<nsTimingFunction__bindgen_ty_bindgen_id_208897__bindgen_ty_bindgen_id_208898>()
                , 4usize);
 }
 impl Clone for
- nsTimingFunction__bindgen_ty_bindgen_id_208872__bindgen_ty_bindgen_id_208873
+ nsTimingFunction__bindgen_ty_bindgen_id_208897__bindgen_ty_bindgen_id_208898
  {
     fn clone(&self) -> Self { *self }
 }
 #[repr(C)]
 #[derive(Debug, Copy)]
-pub struct nsTimingFunction__bindgen_ty_bindgen_id_208872__bindgen_ty_bindgen_id_208884 {
+pub struct nsTimingFunction__bindgen_ty_bindgen_id_208897__bindgen_ty_bindgen_id_208909 {
     pub mSteps: u32,
 }
 #[test]
-fn bindgen_test_layout_nsTimingFunction__bindgen_ty_bindgen_id_208872__bindgen_ty_bindgen_id_208884() {
-    assert_eq!(::std::mem::size_of::<nsTimingFunction__bindgen_ty_bindgen_id_208872__bindgen_ty_bindgen_id_208884>()
+fn bindgen_test_layout_nsTimingFunction__bindgen_ty_bindgen_id_208897__bindgen_ty_bindgen_id_208909() {
+    assert_eq!(::std::mem::size_of::<nsTimingFunction__bindgen_ty_bindgen_id_208897__bindgen_ty_bindgen_id_208909>()
                , 4usize);
-    assert_eq!(::std::mem::align_of::<nsTimingFunction__bindgen_ty_bindgen_id_208872__bindgen_ty_bindgen_id_208884>()
+    assert_eq!(::std::mem::align_of::<nsTimingFunction__bindgen_ty_bindgen_id_208897__bindgen_ty_bindgen_id_208909>()
                , 4usize);
 }
 impl Clone for
- nsTimingFunction__bindgen_ty_bindgen_id_208872__bindgen_ty_bindgen_id_208884
+ nsTimingFunction__bindgen_ty_bindgen_id_208897__bindgen_ty_bindgen_id_208909
  {
     fn clone(&self) -> Self { *self }
 }
 #[test]
-fn bindgen_test_layout_nsTimingFunction__bindgen_ty_bindgen_id_208872() {
-    assert_eq!(::std::mem::size_of::<nsTimingFunction__bindgen_ty_bindgen_id_208872>()
+fn bindgen_test_layout_nsTimingFunction__bindgen_ty_bindgen_id_208897() {
+    assert_eq!(::std::mem::size_of::<nsTimingFunction__bindgen_ty_bindgen_id_208897>()
                , 16usize);
-    assert_eq!(::std::mem::align_of::<nsTimingFunction__bindgen_ty_bindgen_id_208872>()
+    assert_eq!(::std::mem::align_of::<nsTimingFunction__bindgen_ty_bindgen_id_208897>()
                , 4usize);
 }
-impl Clone for nsTimingFunction__bindgen_ty_bindgen_id_208872 {
+impl Clone for nsTimingFunction__bindgen_ty_bindgen_id_208897 {
     fn clone(&self) -> Self { *self }
 }
 #[test]
 fn bindgen_test_layout_nsTimingFunction() {
     assert_eq!(::std::mem::size_of::<nsTimingFunction>() , 20usize);
     assert_eq!(::std::mem::align_of::<nsTimingFunction>() , 4usize);
 }
 impl Clone for nsTimingFunction {
@@ -10438,23 +10437,23 @@ pub type StyleBasicShape_HasThreadSafeRe
 #[test]
 fn bindgen_test_layout_StyleBasicShape() {
     assert_eq!(::std::mem::size_of::<StyleBasicShape>() , 120usize);
     assert_eq!(::std::mem::align_of::<StyleBasicShape>() , 8usize);
 }
 #[repr(C)]
 #[derive(Debug)]
 pub struct StyleShapeSource<ReferenceBox> {
-    pub __bindgen_anon_1: StyleShapeSource__bindgen_ty_bindgen_id_209255<ReferenceBox>,
+    pub __bindgen_anon_1: StyleShapeSource__bindgen_ty_bindgen_id_209280<ReferenceBox>,
     pub mType: StyleShapeSourceType,
     pub mReferenceBox: ReferenceBox,
 }
 #[repr(C)]
 #[derive(Debug, Copy, Clone)]
-pub struct StyleShapeSource__bindgen_ty_bindgen_id_209255<ReferenceBox> {
+pub struct StyleShapeSource__bindgen_ty_bindgen_id_209280<ReferenceBox> {
     pub mBasicShape: __BindgenUnionField<*mut StyleBasicShape>,
     pub mURL: __BindgenUnionField<*mut FragmentOrURL>,
     pub bindgen_union_field: u64,
     pub _phantom_0: ::std::marker::PhantomData<ReferenceBox>,
 }
 pub type StyleClipPath = StyleShapeSource<StyleClipPathGeometryBox>;
 pub type StyleShapeOutside = StyleShapeSource<StyleShapeOutsideShapeBox>;
 #[repr(C)]
@@ -10496,34 +10495,34 @@ pub enum nsStyleContentType {
     eStyleContentType_NoCloseQuote = 43,
     eStyleContentType_AltContent = 50,
     eStyleContentType_Uninitialized = 51,
 }
 #[repr(C)]
 #[derive(Debug)]
 pub struct nsStyleContentData {
     pub mType: nsStyleContentType,
-    pub mContent: nsStyleContentData__bindgen_ty_bindgen_id_209339,
-}
-#[repr(C)]
-#[derive(Debug, Copy)]
-pub struct nsStyleContentData__bindgen_ty_bindgen_id_209339 {
+    pub mContent: nsStyleContentData__bindgen_ty_bindgen_id_209364,
+}
+#[repr(C)]
+#[derive(Debug, Copy)]
+pub struct nsStyleContentData__bindgen_ty_bindgen_id_209364 {
     pub mString: __BindgenUnionField<*mut u16>,
     pub mImage: __BindgenUnionField<*mut imgRequestProxy>,
     pub mCounters: __BindgenUnionField<*mut nsCSSValue_Array>,
     pub bindgen_union_field: u64,
 }
 #[test]
-fn bindgen_test_layout_nsStyleContentData__bindgen_ty_bindgen_id_209339() {
-    assert_eq!(::std::mem::size_of::<nsStyleContentData__bindgen_ty_bindgen_id_209339>()
+fn bindgen_test_layout_nsStyleContentData__bindgen_ty_bindgen_id_209364() {
+    assert_eq!(::std::mem::size_of::<nsStyleContentData__bindgen_ty_bindgen_id_209364>()
                , 8usize);
-    assert_eq!(::std::mem::align_of::<nsStyleContentData__bindgen_ty_bindgen_id_209339>()
+    assert_eq!(::std::mem::align_of::<nsStyleContentData__bindgen_ty_bindgen_id_209364>()
                , 8usize);
 }
-impl Clone for nsStyleContentData__bindgen_ty_bindgen_id_209339 {
+impl Clone for nsStyleContentData__bindgen_ty_bindgen_id_209364 {
     fn clone(&self) -> Self { *self }
 }
 #[test]
 fn bindgen_test_layout_nsStyleContentData() {
     assert_eq!(::std::mem::size_of::<nsStyleContentData>() , 16usize);
     assert_eq!(::std::mem::align_of::<nsStyleContentData>() , 8usize);
 }
 #[repr(C)]
@@ -10638,35 +10637,35 @@ pub enum nsStyleSVGPaintType {
     eStyleSVGPaintType_Color = 2,
     eStyleSVGPaintType_Server = 3,
     eStyleSVGPaintType_ContextFill = 4,
     eStyleSVGPaintType_ContextStroke = 5,
 }
 #[repr(C)]
 #[derive(Debug)]
 pub struct nsStyleSVGPaint {
-    pub mPaint: nsStyleSVGPaint__bindgen_ty_bindgen_id_209736,
+    pub mPaint: nsStyleSVGPaint__bindgen_ty_bindgen_id_209761,
     pub mType: nsStyleSVGPaintType,
     pub mFallbackColor: nscolor,
 }
 #[repr(C)]
 #[derive(Debug, Copy)]
-pub struct nsStyleSVGPaint__bindgen_ty_bindgen_id_209736 {
+pub struct nsStyleSVGPaint__bindgen_ty_bindgen_id_209761 {
     pub mColor: __BindgenUnionField<nscolor>,
     pub mPaintServer: __BindgenUnionField<*mut FragmentOrURL>,
     pub bindgen_union_field: u64,
 }
 #[test]
-fn bindgen_test_layout_nsStyleSVGPaint__bindgen_ty_bindgen_id_209736() {
-    assert_eq!(::std::mem::size_of::<nsStyleSVGPaint__bindgen_ty_bindgen_id_209736>()
+fn bindgen_test_layout_nsStyleSVGPaint__bindgen_ty_bindgen_id_209761() {
+    assert_eq!(::std::mem::size_of::<nsStyleSVGPaint__bindgen_ty_bindgen_id_209761>()
                , 8usize);
-    assert_eq!(::std::mem::align_of::<nsStyleSVGPaint__bindgen_ty_bindgen_id_209736>()
+    assert_eq!(::std::mem::align_of::<nsStyleSVGPaint__bindgen_ty_bindgen_id_209761>()
                , 8usize);
 }
-impl Clone for nsStyleSVGPaint__bindgen_ty_bindgen_id_209736 {
+impl Clone for nsStyleSVGPaint__bindgen_ty_bindgen_id_209761 {
     fn clone(&self) -> Self { *self }
 }
 #[test]
 fn bindgen_test_layout_nsStyleSVGPaint() {
     assert_eq!(::std::mem::size_of::<nsStyleSVGPaint>() , 16usize);
     assert_eq!(::std::mem::align_of::<nsStyleSVGPaint>() , 8usize);
 }
 #[repr(C)]
@@ -10691,17 +10690,17 @@ pub struct nsStyleSVG {
     pub mShapeRendering: u8,
     pub mStrokeLinecap: u8,
     pub mStrokeLinejoin: u8,
     pub mTextAnchor: u8,
     pub mContextFlags: u8,
 }
 #[repr(u32)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum nsStyleSVG__bindgen_ty_bindgen_id_209913 {
+pub enum nsStyleSVG__bindgen_ty_bindgen_id_209938 {
     FILL_OPACITY_SOURCE_MASK = 3,
     STROKE_OPACITY_SOURCE_MASK = 12,
     STROKE_DASHARRAY_CONTEXT = 16,
     STROKE_DASHOFFSET_CONTEXT = 32,
     STROKE_WIDTH_CONTEXT = 64,
     FILL_OPACITY_SOURCE_SHIFT = 0,
     STROKE_OPACITY_SOURCE_SHIFT = 2,
 }
@@ -10710,33 +10709,33 @@ fn bindgen_test_layout_nsStyleSVG() {
     assert_eq!(::std::mem::size_of::<nsStyleSVG>() , 144usize);
     assert_eq!(::std::mem::align_of::<nsStyleSVG>() , 8usize);
 }
 #[repr(C)]
 #[derive(Debug)]
 pub struct nsStyleFilter {
     pub mType: i32,
     pub mFilterParameter: nsStyleCoord,
-    pub __bindgen_anon_1: nsStyleFilter__bindgen_ty_bindgen_id_209979,
-}
-#[repr(C)]
-#[derive(Debug, Copy)]
-pub struct nsStyleFilter__bindgen_ty_bindgen_id_209979 {
+    pub __bindgen_anon_1: nsStyleFilter__bindgen_ty_bindgen_id_210004,
+}
+#[repr(C)]
+#[derive(Debug, Copy)]
+pub struct nsStyleFilter__bindgen_ty_bindgen_id_210004 {
     pub mURL: __BindgenUnionField<*mut FragmentOrURL>,
     pub mDropShadow: __BindgenUnionField<*mut nsCSSShadowArray>,
     pub bindgen_union_field: u64,
 }
 #[test]
-fn bindgen_test_layout_nsStyleFilter__bindgen_ty_bindgen_id_209979() {
-    assert_eq!(::std::mem::size_of::<nsStyleFilter__bindgen_ty_bindgen_id_209979>()
+fn bindgen_test_layout_nsStyleFilter__bindgen_ty_bindgen_id_210004() {
+    assert_eq!(::std::mem::size_of::<nsStyleFilter__bindgen_ty_bindgen_id_210004>()
                , 8usize);
-    assert_eq!(::std::mem::align_of::<nsStyleFilter__bindgen_ty_bindgen_id_209979>()
+    assert_eq!(::std::mem::align_of::<nsStyleFilter__bindgen_ty_bindgen_id_210004>()
                , 8usize);
 }
-impl Clone for nsStyleFilter__bindgen_ty_bindgen_id_209979 {
+impl Clone for nsStyleFilter__bindgen_ty_bindgen_id_210004 {
     fn clone(&self) -> Self { *self }
 }
 #[test]
 fn bindgen_test_layout_nsStyleFilter() {
     assert_eq!(::std::mem::size_of::<nsStyleFilter>() , 32usize);
     assert_eq!(::std::mem::align_of::<nsStyleFilter>() , 8usize);
 }
 #[repr(C)]
--- a/servo/ports/geckolib/glue.rs
+++ b/servo/ports/geckolib/glue.rs
@@ -4,17 +4,17 @@
 
 #![allow(unsafe_code)]
 
 use app_units::Au;
 use data::{NUM_THREADS, PerDocumentStyleData};
 use env_logger;
 use euclid::Size2D;
 use gecko_bindings::bindings::{RawGeckoElementBorrowed, RawGeckoNodeBorrowed};
-use gecko_bindings::bindings::{RawServoStyleSetBorrowed, RawServoStyleSetOwned, ServoNodeDataOwned};
+use gecko_bindings::bindings::{RawServoStyleSetBorrowed, RawServoStyleSetOwned};
 use gecko_bindings::bindings::{RawServoStyleSetBorrowedMut, RawGeckoDocumentBorrowed};
 use gecko_bindings::bindings::{RawServoStyleSheetBorrowed, ServoComputedValuesBorrowed};
 use gecko_bindings::bindings::{RawServoStyleSheetStrong, ServoComputedValuesStrong};
 use gecko_bindings::bindings::{ServoComputedValuesBorrowedOrNull, ServoDeclarationBlock};
 use gecko_bindings::bindings::{ServoDeclarationBlockBorrowed, ServoDeclarationBlockStrong};
 use gecko_bindings::bindings::{ThreadSafePrincipalHolder, ThreadSafeURIHolder, nsHTMLCSSStyleSheet};
 use gecko_bindings::ptr::{GeckoArcPrincipal, GeckoArcURI};
 use gecko_bindings::structs::{SheetParsingMode, nsIAtom};
@@ -39,17 +39,17 @@ use style::parallel;
 use style::parser::ParserContextExtraData;
 use style::properties::{ComputedValues, PropertyDeclarationBlock, parse_one_declaration};
 use style::selector_impl::PseudoElementCascadeType;
 use style::sequential;
 use style::stylesheets::{Origin, Stylesheet};
 use style::timer::Timer;
 use traversal::RecalcStyleOnly;
 use url::Url;
-use wrapper::{DUMMY_BASE_URL, GeckoDocument, GeckoElement, GeckoNode, NonOpaqueStyleData};
+use wrapper::{DUMMY_BASE_URL, GeckoDocument, GeckoElement, GeckoNode};
 
 /*
  * For Gecko->Servo function calls, we need to redeclare the same signature that was declared in
  * the C header in Gecko. In order to catch accidental mismatches, we run rust-bindgen against
  * those signatures as well, giving us a second declaration of all the Servo_* functions in this
  * crate. If there's a mismatch, LLVM will assert and abort, which is a rather awful thing to
  * depend on but good enough for our purposes.
  */
@@ -131,18 +131,19 @@ pub extern "C" fn Servo_RestyleDocument(
 }
 
 #[no_mangle]
 pub extern "C" fn Servo_StyleWorkerThreadCount() -> u32 {
     *NUM_THREADS as u32
 }
 
 #[no_mangle]
-pub extern "C" fn Servo_NodeData_Drop(data: ServoNodeDataOwned) -> () {
-    let _ = data.into_box::<NonOpaqueStyleData>();
+pub extern "C" fn Servo_Node_ClearNodeData(node: RawGeckoNodeBorrowed) -> () {
+    let node = GeckoNode(node);
+    node.clear_data();
 }
 
 #[no_mangle]
 pub extern "C" fn Servo_StyleSheet_FromUTF8Bytes(bytes: *const u8,
                                                 length: u32,
                                                 mode: SheetParsingMode,
                                                 base_bytes: *const u8,
                                                 base_length: u32,
--- a/servo/ports/geckolib/wrapper.rs
+++ b/servo/ports/geckolib/wrapper.rs
@@ -12,26 +12,24 @@ use gecko_bindings::bindings::{Gecko_Get
 use gecko_bindings::bindings::{Gecko_GetLastChild, Gecko_GetLastChildElement};
 use gecko_bindings::bindings::{Gecko_GetNextSibling, Gecko_GetNextSiblingElement, Gecko_GetNextStyleChild};
 use gecko_bindings::bindings::{Gecko_GetNodeFlags, Gecko_SetNodeFlags, Gecko_UnsetNodeFlags};
 use gecko_bindings::bindings::{Gecko_GetParentElement, Gecko_GetParentNode};
 use gecko_bindings::bindings::{Gecko_GetPrevSibling, Gecko_GetPrevSiblingElement};
 use gecko_bindings::bindings::{Gecko_GetServoDeclarationBlock, Gecko_IsHTMLElementInHTMLDocument};
 use gecko_bindings::bindings::{Gecko_IsLink, Gecko_IsRootElement, Gecko_IsTextNode};
 use gecko_bindings::bindings::{Gecko_IsUnvisitedLink, Gecko_IsVisitedLink};
-use gecko_bindings::bindings::{Gecko_LocalName, Gecko_Namespace, Gecko_NodeIsElement, Gecko_SetNodeData};
-use gecko_bindings::bindings::{RawGeckoDocument, RawGeckoElement, RawGeckoNode};
+use gecko_bindings::bindings::{Gecko_LocalName, Gecko_Namespace, Gecko_NodeIsElement};
 use gecko_bindings::bindings::Gecko_ClassOrClassList;
-use gecko_bindings::bindings::Gecko_GetNodeData;
 use gecko_bindings::bindings::Gecko_GetStyleContext;
-use gecko_bindings::bindings::ServoNodeData;
 use gecko_bindings::structs::{NODE_HAS_DIRTY_DESCENDANTS_FOR_SERVO, NODE_IS_DIRTY_FOR_SERVO};
 use gecko_bindings::structs::{nsChangeHint, nsIAtom, nsStyleContext};
-use gecko_bindings::sugar::ownership::{FFIArcHelpers, HasBoxFFI, HasFFI, HasSimpleFFI};
-use gecko_bindings::sugar::ownership::Borrowed;
+use gecko_bindings::structs::{RawGeckoDocument, RawGeckoElement, RawGeckoNode};
+use gecko_bindings::structs::OpaqueStyleData;
+use gecko_bindings::sugar::ownership::FFIArcHelpers;
 use gecko_string_cache::{Atom, Namespace, WeakAtom, WeakNamespace};
 use glue::GeckoDeclarationBlock;
 use libc::uintptr_t;
 use selectors::Element;
 use selectors::parser::{AttrSelector, NamespaceConstraint};
 use snapshot::GeckoElementSnapshot;
 use snapshot_helpers;
 use std::fmt;
@@ -50,49 +48,59 @@ use style::properties::PropertyDeclarati
 use style::refcell::{Ref, RefCell, RefMut};
 use style::selector_impl::ElementExt;
 use style::selector_matching::ApplicableDeclarationBlock;
 use style::sink::Push;
 use url::Url;
 
 pub struct NonOpaqueStyleData(RefCell<PrivateStyleData>);
 
-unsafe impl HasFFI for NonOpaqueStyleData {
-    type FFIType = ServoNodeData;
-}
-unsafe impl HasSimpleFFI for NonOpaqueStyleData {}
-unsafe impl HasBoxFFI for NonOpaqueStyleData {}
-
 impl NonOpaqueStyleData {
     pub fn new() -> Self {
         NonOpaqueStyleData(RefCell::new(PrivateStyleData::new()))
     }
 }
 
+
+// We can eliminate OpaqueStyleData when the bindings move into the style crate.
+fn to_opaque_style_data(d: *mut NonOpaqueStyleData) -> *mut OpaqueStyleData {
+    d as *mut OpaqueStyleData
+}
+fn from_opaque_style_data(d: *mut OpaqueStyleData) -> *mut NonOpaqueStyleData {
+    d as *mut NonOpaqueStyleData
+}
+
 // Important: We don't currently refcount the DOM, because the wrapper lifetime
 // magic guarantees that our LayoutFoo references won't outlive the root, and
 // we don't mutate any of the references on the Gecko side during restyle. We
 // could implement refcounting if need be (at a potentially non-trivial
 // performance cost) by implementing Drop and making LayoutFoo non-Copy.
 #[derive(Clone, Copy)]
 pub struct GeckoNode<'ln>(pub &'ln RawGeckoNode);
 
 impl<'ln> GeckoNode<'ln> {
-    fn get_node_data(&self) -> Borrowed<NonOpaqueStyleData> {
+    fn get_node_data(&self) -> Option<&NonOpaqueStyleData> {
             unsafe {
-                Borrowed::from_ffi(Gecko_GetNodeData(&*self.0))
+                from_opaque_style_data(self.0.mServoData.get()).as_ref()
             }
     }
 
     pub fn initialize_data(self) {
-        unsafe {
-            if self.get_node_data().is_null() {
-                let ptr = Box::new(NonOpaqueStyleData::new());
-                Gecko_SetNodeData(self.0, ptr.into_ffi());
-            }
+        if self.get_node_data().is_none() {
+            let ptr = Box::new(NonOpaqueStyleData::new());
+            debug_assert!(self.0.mServoData.get().is_null());
+            self.0.mServoData.set(to_opaque_style_data(Box::into_raw(ptr)));
+        }
+    }
+
+    pub fn clear_data(self) {
+        if !self.get_node_data().is_none() {
+            let d = from_opaque_style_data(self.0.mServoData.get());
+            let _ = unsafe { Box::from_raw(d) };
+            self.0.mServoData.set(ptr::null_mut());
         }
     }
 }
 
 #[derive(Clone, Copy, Debug, PartialEq)]
 pub struct GeckoRestyleDamage(nsChangeHint);
 
 impl TRestyleDamage for GeckoRestyleDamage {
@@ -204,17 +212,17 @@ impl<'ln> TNode for GeckoNode<'ln> {
 
     unsafe fn set_changed(&self, _value: bool) {
         unimplemented!()
     }
 
     fn is_dirty(&self) -> bool {
         // Return true unconditionally if we're not yet styled. This is a hack
         // and should go away soon.
-        if self.get_node_data().is_null() {
+        if self.get_node_data().is_none() {
             return true;
         }
 
         let flags = unsafe { Gecko_GetNodeFlags(self.0) };
         flags & (NODE_IS_DIRTY_FOR_SERVO as u32) != 0
     }
 
     unsafe fn set_dirty(&self, value: bool) {
@@ -223,17 +231,17 @@ impl<'ln> TNode for GeckoNode<'ln> {
         } else {
             Gecko_UnsetNodeFlags(self.0, NODE_IS_DIRTY_FOR_SERVO as u32)
         }
     }
 
     fn has_dirty_descendants(&self) -> bool {
         // Return true unconditionally if we're not yet styled. This is a hack
         // and should go away soon.
-        if self.get_node_data().is_null() {
+        if self.get_node_data().is_none() {
             return true;
         }
         let flags = unsafe { Gecko_GetNodeFlags(self.0) };
         flags & (NODE_HAS_DIRTY_DESCENDANTS_FOR_SERVO as u32) != 0
     }
 
     unsafe fn set_dirty_descendants(&self, value: bool) {
         if value {
@@ -251,28 +259,28 @@ impl<'ln> TNode for GeckoNode<'ln> {
 
     unsafe fn set_can_be_fragmented(&self, _value: bool) {
         // FIXME(SimonSapin): Servo uses this to implement CSS multicol / fragmentation
         // Maybe this isn’t useful for Gecko?
     }
 
     #[inline(always)]
     unsafe fn borrow_data_unchecked(&self) -> Option<*const PrivateStyleData> {
-        self.get_node_data().borrow_opt().map(|d| d.0.as_unsafe_cell().get()
+        self.get_node_data().as_ref().map(|d| d.0.as_unsafe_cell().get()
                                                   as *const PrivateStyleData)
     }
 
     #[inline(always)]
     fn borrow_data(&self) -> Option<Ref<PrivateStyleData>> {
-        self.get_node_data().borrow_opt().map(|d| d.0.borrow())
+        self.get_node_data().as_ref().map(|d| d.0.borrow())
     }
 
     #[inline(always)]
     fn mutate_data(&self) -> Option<RefMut<PrivateStyleData>> {
-        self.get_node_data().borrow_opt().map(|d| d.0.borrow_mut())
+        self.get_node_data().as_ref().map(|d| d.0.borrow_mut())
     }
 
     fn restyle_damage(self) -> Self::ConcreteRestyleDamage {
         // Not called from style, only for layout.
         unimplemented!();
     }
 
     fn set_restyle_damage(self, damage: Self::ConcreteRestyleDamage) {