servo: Merge #18988 - stylo: querySelector / querySelectorAll machinery (from emilio:qs); r=heycam
authorEmilio Cobos Álvarez <emilio@crisal.io>
Mon, 23 Oct 2017 08:14:35 -0500
changeset 685789 9fde647fdf30402a107c94e4607de30b65c0b94b
parent 685788 e309c6971f7b128acb75feaeca82c053d250e9a3
child 685790 138a9b0c043b7abbc721a804017d9c57a929387a
push id86016
push userkgupta@mozilla.com
push dateWed, 25 Oct 2017 01:53:44 +0000
reviewersheycam
milestone58.0a1
servo: Merge #18988 - stylo: querySelector / querySelectorAll machinery (from emilio:qs); r=heycam Bug: 1410624 Reviewed-by: heycam Source-Repo: https://github.com/servo/servo Source-Revision: eaba7ede232c9b556f22d67698eca5dc64ad4075
servo/components/selectors/matching.rs
servo/components/style/data.rs
servo/components/style/dom.rs
servo/components/style/dom_apis.rs
servo/components/style/gecko/generated/atom_macro.rs
servo/components/style/gecko/generated/bindings.rs
servo/components/style/gecko/generated/structs.rs
servo/components/style/gecko/wrapper.rs
servo/components/style/invalidation/element/collector.rs
servo/components/style/invalidation/element/invalidator.rs
servo/components/style/selector_map.rs
servo/components/style/stylist.rs
servo/ports/geckolib/glue.rs
--- a/servo/components/selectors/matching.rs
+++ b/servo/components/selectors/matching.rs
@@ -333,18 +333,17 @@ pub fn matches_compound_selector<E>(
     selector: &Selector<E::Impl>,
     mut from_offset: usize,
     context: &mut MatchingContext<E::Impl>,
     element: &E,
 ) -> CompoundSelectorMatchingResult
 where
     E: Element
 {
-    debug_assert_ne!(from_offset, 0);
-    if cfg!(debug_assertions) {
+    if cfg!(debug_assertions) && from_offset != 0 {
         selector.combinator_at_parse_order(from_offset - 1); // This asserts.
     }
 
     let mut local_context = LocalMatchingContext {
         shared: context,
         matches_hover_and_active_quirk: false,
     };
 
--- a/servo/components/style/data.rs
+++ b/servo/components/style/data.rs
@@ -12,16 +12,17 @@ use invalidation::element::restyle_hints
 use malloc_size_of::MallocSizeOfOps;
 use properties::ComputedValues;
 use properties::longhands::display::computed_value as display;
 use rule_tree::StrongRuleNode;
 use selector_parser::{EAGER_PSEUDO_COUNT, PseudoElement, RestyleDamage};
 use selectors::NthIndexCache;
 use servo_arc::Arc;
 use shared_lock::StylesheetGuards;
+use smallvec::SmallVec;
 use std::fmt;
 use std::mem;
 use std::ops::{Deref, DerefMut};
 use style_resolver::{PrimaryStyle, ResolvedElementStyles, ResolvedStyle};
 
 bitflags! {
     /// Various flags stored on ElementData.
     #[derive(Default)]
@@ -254,27 +255,32 @@ impl ElementData {
                 element.has_snapshot(),
                 element.handled_snapshot(),
                 element.implemented_pseudo_element());
 
         if !element.has_snapshot() || element.handled_snapshot() {
             return InvalidationResult::empty();
         }
 
+        let mut xbl_stylists = SmallVec::<[_; 3]>::new();
+        let cut_off_inheritance =
+            element.each_xbl_stylist(|s| xbl_stylists.push(s));
+
         let mut processor = StateAndAttrInvalidationProcessor::new(
             shared_context,
+            &xbl_stylists,
+            cut_off_inheritance,
             element,
             self,
+            nth_index_cache,
         );
 
         let invalidator = TreeStyleInvalidator::new(
             element,
-            shared_context.quirks_mode(),
             stack_limit_checker,
-            nth_index_cache,
             &mut processor,
         );
 
         let result = invalidator.invalidate();
 
         unsafe { element.set_handled_snapshot() }
         debug_assert!(element.handled_snapshot());
 
--- a/servo/components/style/dom.rs
+++ b/servo/components/style/dom.rs
@@ -105,19 +105,42 @@ where
                 self.0 = n.next_sibling();
                 Some(n)
             }
             None => None,
         }
     }
 }
 
+/// An iterator over the DOM descendants of a node in pre-order.
+pub struct DomDescendants<N> {
+    previous: Option<N>,
+    scope: N,
+}
+
+impl<N> Iterator for DomDescendants<N>
+where
+    N: TNode
+{
+    type Item = N;
+
+    fn next(&mut self) -> Option<N> {
+        let prev = match self.previous.take() {
+            None => return None,
+            Some(n) => n,
+        };
+
+        self.previous = prev.next_in_preorder(Some(self.scope));
+        self.previous
+    }
+}
+
 /// The `TNode` trait. This is the main generic trait over which the style
 /// system can be implemented.
-pub trait TNode : Sized + Copy + Clone + Debug + NodeInfo {
+pub trait TNode : Sized + Copy + Clone + Debug + NodeInfo + PartialEq {
     /// The concrete `TElement` type.
     type ConcreteElement: TElement<ConcreteNode = Self>;
 
     /// Get this node's parent node.
     fn parent_node(&self) -> Option<Self>;
 
     /// Get this node's first child.
     fn first_child(&self) -> Option<Self>;
@@ -126,21 +149,55 @@ pub trait TNode : Sized + Copy + Clone +
     fn last_child(&self) -> Option<Self>;
 
     /// Get this node's previous sibling.
     fn prev_sibling(&self) -> Option<Self>;
 
     /// Get this node's next sibling.
     fn next_sibling(&self) -> Option<Self>;
 
-    /// Iterate over the DOM children of an element.
+    /// Iterate over the DOM children of a node.
     fn dom_children(&self) -> DomChildren<Self> {
         DomChildren(self.first_child())
     }
 
+    /// Iterate over the DOM children of a node, in preorder.
+    fn dom_descendants(&self) -> DomDescendants<Self> {
+        DomDescendants {
+            previous: Some(*self),
+            scope: *self,
+        }
+    }
+
+    /// Returns the next children in pre-order, optionally scoped to a subtree
+    /// root.
+    fn next_in_preorder(&self, scoped_to: Option<Self>) -> Option<Self> {
+        if let Some(c) = self.first_child() {
+            return Some(c);
+        }
+
+        if Some(*self) == scoped_to {
+            return None;
+        }
+
+        let mut current = *self;
+        loop {
+            if let Some(s) = current.next_sibling() {
+                return Some(s);
+            }
+
+            let parent = current.parent_node();
+            if parent == scoped_to {
+                return None;
+            }
+
+            current = parent.expect("Not a descendant of the scope?");
+        }
+    }
+
     /// Get this node's parent element from the perspective of a restyle
     /// traversal.
     fn traversal_parent(&self) -> Option<Self::ConcreteElement>;
 
     /// Get this node's parent element if present.
     fn parent_element(&self) -> Option<Self::ConcreteElement> {
         self.parent_node().and_then(|n| n.as_element())
     }
@@ -681,19 +738,20 @@ pub trait TElement
         } else {
             *self
         }
     }
 
     /// Implements Gecko's `nsBindingManager::WalkRules`.
     ///
     /// Returns whether to cut off the inheritance.
-    fn each_xbl_stylist<F>(&self, _: F) -> bool
+    fn each_xbl_stylist<'a, F>(&self, _: F) -> bool
     where
-        F: FnMut(&Stylist),
+        Self: 'a,
+        F: FnMut(AtomicRef<'a, Stylist>),
     {
         false
     }
 
     /// Gets the current existing CSS transitions, by |property, end value| pairs in a FnvHashMap.
     #[cfg(feature = "gecko")]
     fn get_css_transitions_info(&self)
                                 -> FnvHashMap<LonghandId, Arc<AnimationValue>>;
--- a/servo/components/style/dom_apis.rs
+++ b/servo/components/style/dom_apis.rs
@@ -1,18 +1,21 @@
 /* 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/. */
 
 //! Generic implementations of some DOM APIs so they can be shared between Servo
 //! and Gecko.
 
 use context::QuirksMode;
+use dom::{TElement, TNode};
+use invalidation::element::invalidator::{Invalidation, InvalidationProcessor, InvalidationVector};
 use selectors::{Element, NthIndexCache, SelectorList};
 use selectors::matching::{self, MatchingContext, MatchingMode};
+use smallvec::SmallVec;
 
 /// <https://dom.spec.whatwg.org/#dom-element-matches>
 pub fn element_matches<E>(
     element: &E,
     selector_list: &SelectorList<E::Impl>,
     quirks_mode: QuirksMode,
 ) -> bool
 where
@@ -52,8 +55,322 @@ where
         if matching::matches_selector_list(selector_list, &element, &mut context) {
             return Some(element);
         }
         current = element.parent_element();
     }
 
     return None;
 }
+
+/// A selector query abstraction, in order to be generic over QuerySelector and
+/// QuerySelectorAll.
+pub trait SelectorQuery<E: TElement> {
+    /// The output of the query.
+    type Output;
+
+    /// Whether the query should stop after the first element has been matched.
+    fn should_stop_after_first_match() -> bool;
+
+    /// Append an element matching after the first query.
+    fn append_element(output: &mut Self::Output, element: E);
+
+    /// Returns true if the output is empty.
+    fn is_empty(output: &Self::Output) -> bool;
+}
+
+/// The result of a querySelectorAll call.
+pub type QuerySelectorAllResult<E> = SmallVec<[E; 128]>;
+
+/// A query for all the elements in a subtree.
+pub struct QueryAll;
+
+impl<E: TElement> SelectorQuery<E> for QueryAll {
+    type Output = QuerySelectorAllResult<E>;
+
+    fn should_stop_after_first_match() -> bool { false }
+
+    fn append_element(output: &mut Self::Output, element: E) {
+        output.push(element);
+    }
+
+    fn is_empty(output: &Self::Output) -> bool {
+        output.is_empty()
+    }
+}
+
+/// A query for the first in-tree match of all the elements in a subtree.
+pub struct QueryFirst;
+
+impl<E: TElement> SelectorQuery<E> for QueryFirst {
+    type Output = Option<E>;
+
+    fn should_stop_after_first_match() -> bool { true }
+
+    fn append_element(output: &mut Self::Output, element: E) {
+        if output.is_none() {
+            *output = Some(element)
+        }
+    }
+
+    fn is_empty(output: &Self::Output) -> bool {
+        output.is_none()
+    }
+}
+
+struct QuerySelectorProcessor<'a, E, Q>
+where
+    E: TElement + 'a,
+    Q: SelectorQuery<E>,
+    Q::Output: 'a,
+{
+    results: &'a mut Q::Output,
+    matching_context: MatchingContext<'a, E::Impl>,
+    selector_list: &'a SelectorList<E::Impl>,
+}
+
+impl<'a, E, Q> InvalidationProcessor<'a, E> for QuerySelectorProcessor<'a, E, Q>
+where
+    E: TElement + 'a,
+    Q: SelectorQuery<E>,
+    Q::Output: 'a,
+{
+    fn light_tree_only(&self) -> bool { true }
+
+    fn collect_invalidations(
+        &mut self,
+        element: E,
+        self_invalidations: &mut InvalidationVector<'a>,
+        descendant_invalidations: &mut InvalidationVector<'a>,
+        _sibling_invalidations: &mut InvalidationVector<'a>,
+    ) -> bool {
+        // TODO(emilio): If the element is not a root element, and
+        // selector_list has any descendant combinator, we need to do extra work
+        // in order to handle properly things like:
+        //
+        //   <div id="a">
+        //     <div id="b">
+        //       <div id="c"></div>
+        //     </div>
+        //   </div>
+        //
+        // b.querySelector('#a div'); // Should return "c".
+        //
+        // For now, assert it's a root element.
+        debug_assert!(element.parent_element().is_none());
+
+        let target_vector =
+            if self.matching_context.scope_element.is_some() {
+                descendant_invalidations
+            } else {
+                self_invalidations
+            };
+
+        for selector in self.selector_list.0.iter() {
+            target_vector.push(Invalidation::new(selector, 0))
+        }
+
+        false
+    }
+
+    fn matching_context(&mut self) -> &mut MatchingContext<'a, E::Impl> {
+        &mut self.matching_context
+    }
+
+    fn should_process_descendants(&mut self, _: E) -> bool {
+        if Q::should_stop_after_first_match() {
+            return Q::is_empty(&self.results)
+        }
+
+        true
+    }
+
+    fn invalidated_self(&mut self, e: E) {
+        Q::append_element(self.results, e);
+    }
+
+    fn recursion_limit_exceeded(&mut self, _e: E) {}
+    fn invalidated_descendants(&mut self, _e: E, _child: E) {}
+}
+
+fn collect_all_elements<E, Q, F>(
+    root: E::ConcreteNode,
+    results: &mut Q::Output,
+    mut filter: F,
+)
+where
+    E: TElement,
+    Q: SelectorQuery<E>,
+    F: FnMut(E) -> bool,
+{
+    for node in root.dom_descendants() {
+        let element = match node.as_element() {
+            Some(e) => e,
+            None => continue,
+        };
+
+        if !filter(element) {
+            continue;
+        }
+
+        Q::append_element(results, element);
+        if Q::should_stop_after_first_match() {
+            return;
+        }
+    }
+}
+
+/// Fast paths for a given selector query.
+///
+/// FIXME(emilio, nbp): This may very well be a good candidate for code to be
+/// replaced by HolyJit :)
+fn query_selector_fast<E, Q>(
+    root: E::ConcreteNode,
+    selector_list: &SelectorList<E::Impl>,
+    results: &mut Q::Output,
+    quirks_mode: QuirksMode,
+) -> Result<(), ()>
+where
+    E: TElement,
+    Q: SelectorQuery<E>,
+{
+    use selectors::parser::{Component, LocalName};
+    use std::borrow::Borrow;
+
+    // We need to return elements in document order, and reordering them
+    // afterwards is kinda silly.
+    if selector_list.0.len() > 1 {
+        return Err(());
+    }
+
+    let selector = &selector_list.0[0];
+
+    // Let's just care about the easy cases for now.
+    //
+    // FIXME(emilio): Blink has a fast path for classes in ancestor combinators
+    // that may be worth stealing.
+    if selector.len() > 1 {
+        return Err(());
+    }
+
+    let component = selector.iter().next().unwrap();
+    match *component {
+        Component::ExplicitUniversalType => {
+            collect_all_elements::<E, Q, _>(root, results, |_| true)
+        }
+        Component::ID(ref id) => {
+            // TODO(emilio): We may want to reuse Gecko's document ID table.
+            let case_sensitivity = quirks_mode.classes_and_ids_case_sensitivity();
+            collect_all_elements::<E, Q, _>(root, results, |element| {
+                element.has_id(id, case_sensitivity)
+            })
+        }
+        Component::Class(ref class) => {
+            let case_sensitivity = quirks_mode.classes_and_ids_case_sensitivity();
+            collect_all_elements::<E, Q, _>(root, results, |element| {
+                element.has_class(class, case_sensitivity)
+            })
+        }
+        Component::LocalName(LocalName { ref name, ref lower_name }) => {
+            collect_all_elements::<E, Q, _>(root, results, |element| {
+                if element.is_html_element_in_html_document() {
+                    element.get_local_name() == lower_name.borrow()
+                } else {
+                    element.get_local_name() == name.borrow()
+                }
+            })
+        }
+        // TODO(emilio): More fast paths?
+        _ => {
+            return Err(())
+        }
+    }
+
+    Ok(())
+}
+
+// Slow path for a given selector query.
+fn query_selector_slow<E, Q>(
+    root: E::ConcreteNode,
+    selector_list: &SelectorList<E::Impl>,
+    results: &mut Q::Output,
+    matching_context: &mut MatchingContext<E::Impl>,
+)
+where
+    E: TElement,
+    Q: SelectorQuery<E>,
+{
+    collect_all_elements::<E, Q, _>(root, results, |element| {
+        matching::matches_selector_list(selector_list, &element, matching_context)
+    });
+}
+
+/// <https://dom.spec.whatwg.org/#dom-parentnode-queryselector>
+pub fn query_selector<E, Q>(
+    root: E::ConcreteNode,
+    selector_list: &SelectorList<E::Impl>,
+    results: &mut Q::Output,
+    quirks_mode: QuirksMode,
+)
+where
+    E: TElement,
+    Q: SelectorQuery<E>,
+{
+    use invalidation::element::invalidator::TreeStyleInvalidator;
+
+    let fast_result = query_selector_fast::<E, Q>(
+        root,
+        selector_list,
+        results,
+        quirks_mode,
+    );
+
+    if fast_result.is_ok() {
+        return;
+    }
+
+    // Slow path: Use the invalidation machinery if we're a root, and tree
+    // traversal otherwise.
+    //
+    // See the comment in collect_invalidations to see why only if we're a root.
+    let mut nth_index_cache = NthIndexCache::default();
+    let mut matching_context = MatchingContext::new(
+        MatchingMode::Normal,
+        None,
+        Some(&mut nth_index_cache),
+        quirks_mode,
+    );
+
+    let root_element = root.as_element();
+    matching_context.scope_element = root_element.map(|e| e.opaque());
+
+    // The invalidation mechanism is only useful in presence of combinators.
+    //
+    // We could do that check properly here, though checking the length of the
+    // selectors is a good heuristic.
+    let invalidation_may_be_useful =
+        selector_list.0.iter().any(|s| s.len() > 1);
+
+    if root_element.is_some() || !invalidation_may_be_useful {
+        query_selector_slow::<E, Q>(
+            root,
+            selector_list,
+            results,
+            &mut matching_context,
+        );
+    } else {
+        let mut processor = QuerySelectorProcessor::<E, Q> {
+            results,
+            matching_context,
+            selector_list,
+        };
+
+        for node in root.dom_children() {
+            if let Some(e) = node.as_element() {
+                TreeStyleInvalidator::new(
+                    e,
+                    /* stack_limit_checker = */ None,
+                    &mut processor,
+                ).invalidate();
+            }
+        }
+    }
+}
--- a/servo/components/style/gecko/generated/atom_macro.rs
+++ b/servo/components/style/gecko/generated/atom_macro.rs
@@ -4363,18 +4363,16 @@ cfg_if! {
             #[link_name = "_ZN9nsGkAtoms15DisplayPortBaseE"]
             pub static nsGkAtoms_DisplayPortBase: *mut nsAtom;
             #[link_name = "_ZN9nsGkAtoms30AsyncScrollLayerCreationFailedE"]
             pub static nsGkAtoms_AsyncScrollLayerCreationFailed: *mut nsAtom;
             #[link_name = "_ZN9nsGkAtoms19forcemessagemanagerE"]
             pub static nsGkAtoms_forcemessagemanager: *mut nsAtom;
             #[link_name = "_ZN9nsGkAtoms16isPreloadBrowserE"]
             pub static nsGkAtoms_isPreloadBrowser: *mut nsAtom;
-            #[link_name = "_ZN9nsGkAtoms22color_picker_availableE"]
-            pub static nsGkAtoms_color_picker_available: *mut nsAtom;
             #[link_name = "_ZN9nsGkAtoms24scrollbar_start_backwardE"]
             pub static nsGkAtoms_scrollbar_start_backward: *mut nsAtom;
             #[link_name = "_ZN9nsGkAtoms23scrollbar_start_forwardE"]
             pub static nsGkAtoms_scrollbar_start_forward: *mut nsAtom;
             #[link_name = "_ZN9nsGkAtoms22scrollbar_end_backwardE"]
             pub static nsGkAtoms_scrollbar_end_backward: *mut nsAtom;
             #[link_name = "_ZN9nsGkAtoms21scrollbar_end_forwardE"]
             pub static nsGkAtoms_scrollbar_end_forward: *mut nsAtom;
@@ -4395,18 +4393,16 @@ cfg_if! {
             #[link_name = "_ZN9nsGkAtoms13windows_glassE"]
             pub static nsGkAtoms_windows_glass: *mut nsAtom;
             #[link_name = "_ZN9nsGkAtoms13touch_enabledE"]
             pub static nsGkAtoms_touch_enabled: *mut nsAtom;
             #[link_name = "_ZN9nsGkAtoms12menubar_dragE"]
             pub static nsGkAtoms_menubar_drag: *mut nsAtom;
             #[link_name = "_ZN9nsGkAtoms23swipe_animation_enabledE"]
             pub static nsGkAtoms_swipe_animation_enabled: *mut nsAtom;
-            #[link_name = "_ZN9nsGkAtoms20physical_home_buttonE"]
-            pub static nsGkAtoms_physical_home_button: *mut nsAtom;
             #[link_name = "_ZN9nsGkAtoms15windows_classicE"]
             pub static nsGkAtoms_windows_classic: *mut nsAtom;
             #[link_name = "_ZN9nsGkAtoms18windows_theme_aeroE"]
             pub static nsGkAtoms_windows_theme_aero: *mut nsAtom;
             #[link_name = "_ZN9nsGkAtoms23windows_theme_aero_liteE"]
             pub static nsGkAtoms_windows_theme_aero_lite: *mut nsAtom;
             #[link_name = "_ZN9nsGkAtoms23windows_theme_luna_blueE"]
             pub static nsGkAtoms_windows_theme_luna_blue: *mut nsAtom;
@@ -4415,18 +4411,16 @@ cfg_if! {
             #[link_name = "_ZN9nsGkAtoms25windows_theme_luna_silverE"]
             pub static nsGkAtoms_windows_theme_luna_silver: *mut nsAtom;
             #[link_name = "_ZN9nsGkAtoms20windows_theme_royaleE"]
             pub static nsGkAtoms_windows_theme_royale: *mut nsAtom;
             #[link_name = "_ZN9nsGkAtoms18windows_theme_zuneE"]
             pub static nsGkAtoms_windows_theme_zune: *mut nsAtom;
             #[link_name = "_ZN9nsGkAtoms21windows_theme_genericE"]
             pub static nsGkAtoms_windows_theme_generic: *mut nsAtom;
-            #[link_name = "_ZN9nsGkAtoms27_moz_color_picker_availableE"]
-            pub static nsGkAtoms__moz_color_picker_available: *mut nsAtom;
             #[link_name = "_ZN9nsGkAtoms29_moz_scrollbar_start_backwardE"]
             pub static nsGkAtoms__moz_scrollbar_start_backward: *mut nsAtom;
             #[link_name = "_ZN9nsGkAtoms28_moz_scrollbar_start_forwardE"]
             pub static nsGkAtoms__moz_scrollbar_start_forward: *mut nsAtom;
             #[link_name = "_ZN9nsGkAtoms27_moz_scrollbar_end_backwardE"]
             pub static nsGkAtoms__moz_scrollbar_end_backward: *mut nsAtom;
             #[link_name = "_ZN9nsGkAtoms26_moz_scrollbar_end_forwardE"]
             pub static nsGkAtoms__moz_scrollbar_end_forward: *mut nsAtom;
@@ -4459,18 +4453,16 @@ cfg_if! {
             #[link_name = "_ZN9nsGkAtoms23_moz_device_pixel_ratioE"]
             pub static nsGkAtoms__moz_device_pixel_ratio: *mut nsAtom;
             #[link_name = "_ZN9nsGkAtoms23_moz_device_orientationE"]
             pub static nsGkAtoms__moz_device_orientation: *mut nsAtom;
             #[link_name = "_ZN9nsGkAtoms25_moz_is_resource_documentE"]
             pub static nsGkAtoms__moz_is_resource_document: *mut nsAtom;
             #[link_name = "_ZN9nsGkAtoms28_moz_swipe_animation_enabledE"]
             pub static nsGkAtoms__moz_swipe_animation_enabled: *mut nsAtom;
-            #[link_name = "_ZN9nsGkAtoms25_moz_physical_home_buttonE"]
-            pub static nsGkAtoms__moz_physical_home_button: *mut nsAtom;
             #[link_name = "_ZN9nsGkAtoms4BackE"]
             pub static nsGkAtoms_Back: *mut nsAtom;
             #[link_name = "_ZN9nsGkAtoms7ForwardE"]
             pub static nsGkAtoms_Forward: *mut nsAtom;
             #[link_name = "_ZN9nsGkAtoms6ReloadE"]
             pub static nsGkAtoms_Reload: *mut nsAtom;
             #[link_name = "_ZN9nsGkAtoms4StopE"]
             pub static nsGkAtoms_Stop: *mut nsAtom;
@@ -9534,18 +9526,16 @@ cfg_if! {
             #[link_name = "?DisplayPortBase@nsGkAtoms@@2PEAVnsAtom@@EA"]
             pub static nsGkAtoms_DisplayPortBase: *mut nsAtom;
             #[link_name = "?AsyncScrollLayerCreationFailed@nsGkAtoms@@2PEAVnsAtom@@EA"]
             pub static nsGkAtoms_AsyncScrollLayerCreationFailed: *mut nsAtom;
             #[link_name = "?forcemessagemanager@nsGkAtoms@@2PEAVnsAtom@@EA"]
             pub static nsGkAtoms_forcemessagemanager: *mut nsAtom;
             #[link_name = "?isPreloadBrowser@nsGkAtoms@@2PEAVnsAtom@@EA"]
             pub static nsGkAtoms_isPreloadBrowser: *mut nsAtom;
-            #[link_name = "?color_picker_available@nsGkAtoms@@2PEAVnsAtom@@EA"]
-            pub static nsGkAtoms_color_picker_available: *mut nsAtom;
             #[link_name = "?scrollbar_start_backward@nsGkAtoms@@2PEAVnsAtom@@EA"]
             pub static nsGkAtoms_scrollbar_start_backward: *mut nsAtom;
             #[link_name = "?scrollbar_start_forward@nsGkAtoms@@2PEAVnsAtom@@EA"]
             pub static nsGkAtoms_scrollbar_start_forward: *mut nsAtom;
             #[link_name = "?scrollbar_end_backward@nsGkAtoms@@2PEAVnsAtom@@EA"]
             pub static nsGkAtoms_scrollbar_end_backward: *mut nsAtom;
             #[link_name = "?scrollbar_end_forward@nsGkAtoms@@2PEAVnsAtom@@EA"]
             pub static nsGkAtoms_scrollbar_end_forward: *mut nsAtom;
@@ -9566,18 +9556,16 @@ cfg_if! {
             #[link_name = "?windows_glass@nsGkAtoms@@2PEAVnsAtom@@EA"]
             pub static nsGkAtoms_windows_glass: *mut nsAtom;
             #[link_name = "?touch_enabled@nsGkAtoms@@2PEAVnsAtom@@EA"]
             pub static nsGkAtoms_touch_enabled: *mut nsAtom;
             #[link_name = "?menubar_drag@nsGkAtoms@@2PEAVnsAtom@@EA"]
             pub static nsGkAtoms_menubar_drag: *mut nsAtom;
             #[link_name = "?swipe_animation_enabled@nsGkAtoms@@2PEAVnsAtom@@EA"]
             pub static nsGkAtoms_swipe_animation_enabled: *mut nsAtom;
-            #[link_name = "?physical_home_button@nsGkAtoms@@2PEAVnsAtom@@EA"]
-            pub static nsGkAtoms_physical_home_button: *mut nsAtom;
             #[link_name = "?windows_classic@nsGkAtoms@@2PEAVnsAtom@@EA"]
             pub static nsGkAtoms_windows_classic: *mut nsAtom;
             #[link_name = "?windows_theme_aero@nsGkAtoms@@2PEAVnsAtom@@EA"]
             pub static nsGkAtoms_windows_theme_aero: *mut nsAtom;
             #[link_name = "?windows_theme_aero_lite@nsGkAtoms@@2PEAVnsAtom@@EA"]
             pub static nsGkAtoms_windows_theme_aero_lite: *mut nsAtom;
             #[link_name = "?windows_theme_luna_blue@nsGkAtoms@@2PEAVnsAtom@@EA"]
             pub static nsGkAtoms_windows_theme_luna_blue: *mut nsAtom;
@@ -9586,18 +9574,16 @@ cfg_if! {
             #[link_name = "?windows_theme_luna_silver@nsGkAtoms@@2PEAVnsAtom@@EA"]
             pub static nsGkAtoms_windows_theme_luna_silver: *mut nsAtom;
             #[link_name = "?windows_theme_royale@nsGkAtoms@@2PEAVnsAtom@@EA"]
             pub static nsGkAtoms_windows_theme_royale: *mut nsAtom;
             #[link_name = "?windows_theme_zune@nsGkAtoms@@2PEAVnsAtom@@EA"]
             pub static nsGkAtoms_windows_theme_zune: *mut nsAtom;
             #[link_name = "?windows_theme_generic@nsGkAtoms@@2PEAVnsAtom@@EA"]
             pub static nsGkAtoms_windows_theme_generic: *mut nsAtom;
-            #[link_name = "?_moz_color_picker_available@nsGkAtoms@@2PEAVnsAtom@@EA"]
-            pub static nsGkAtoms__moz_color_picker_available: *mut nsAtom;
             #[link_name = "?_moz_scrollbar_start_backward@nsGkAtoms@@2PEAVnsAtom@@EA"]
             pub static nsGkAtoms__moz_scrollbar_start_backward: *mut nsAtom;
             #[link_name = "?_moz_scrollbar_start_forward@nsGkAtoms@@2PEAVnsAtom@@EA"]
             pub static nsGkAtoms__moz_scrollbar_start_forward: *mut nsAtom;
             #[link_name = "?_moz_scrollbar_end_backward@nsGkAtoms@@2PEAVnsAtom@@EA"]
             pub static nsGkAtoms__moz_scrollbar_end_backward: *mut nsAtom;
             #[link_name = "?_moz_scrollbar_end_forward@nsGkAtoms@@2PEAVnsAtom@@EA"]
             pub static nsGkAtoms__moz_scrollbar_end_forward: *mut nsAtom;
@@ -9630,18 +9616,16 @@ cfg_if! {
             #[link_name = "?_moz_device_pixel_ratio@nsGkAtoms@@2PEAVnsAtom@@EA"]
             pub static nsGkAtoms__moz_device_pixel_ratio: *mut nsAtom;
             #[link_name = "?_moz_device_orientation@nsGkAtoms@@2PEAVnsAtom@@EA"]
             pub static nsGkAtoms__moz_device_orientation: *mut nsAtom;
             #[link_name = "?_moz_is_resource_document@nsGkAtoms@@2PEAVnsAtom@@EA"]
             pub static nsGkAtoms__moz_is_resource_document: *mut nsAtom;
             #[link_name = "?_moz_swipe_animation_enabled@nsGkAtoms@@2PEAVnsAtom@@EA"]
             pub static nsGkAtoms__moz_swipe_animation_enabled: *mut nsAtom;
-            #[link_name = "?_moz_physical_home_button@nsGkAtoms@@2PEAVnsAtom@@EA"]
-            pub static nsGkAtoms__moz_physical_home_button: *mut nsAtom;
             #[link_name = "?Back@nsGkAtoms@@2PEAVnsAtom@@EA"]
             pub static nsGkAtoms_Back: *mut nsAtom;
             #[link_name = "?Forward@nsGkAtoms@@2PEAVnsAtom@@EA"]
             pub static nsGkAtoms_Forward: *mut nsAtom;
             #[link_name = "?Reload@nsGkAtoms@@2PEAVnsAtom@@EA"]
             pub static nsGkAtoms_Reload: *mut nsAtom;
             #[link_name = "?Stop@nsGkAtoms@@2PEAVnsAtom@@EA"]
             pub static nsGkAtoms_Stop: *mut nsAtom;
@@ -14705,18 +14689,16 @@ cfg_if! {
             #[link_name = "\x01?DisplayPortBase@nsGkAtoms@@2PAVnsAtom@@A"]
             pub static nsGkAtoms_DisplayPortBase: *mut nsAtom;
             #[link_name = "\x01?AsyncScrollLayerCreationFailed@nsGkAtoms@@2PAVnsAtom@@A"]
             pub static nsGkAtoms_AsyncScrollLayerCreationFailed: *mut nsAtom;
             #[link_name = "\x01?forcemessagemanager@nsGkAtoms@@2PAVnsAtom@@A"]
             pub static nsGkAtoms_forcemessagemanager: *mut nsAtom;
             #[link_name = "\x01?isPreloadBrowser@nsGkAtoms@@2PAVnsAtom@@A"]
             pub static nsGkAtoms_isPreloadBrowser: *mut nsAtom;
-            #[link_name = "\x01?color_picker_available@nsGkAtoms@@2PAVnsAtom@@A"]
-            pub static nsGkAtoms_color_picker_available: *mut nsAtom;
             #[link_name = "\x01?scrollbar_start_backward@nsGkAtoms@@2PAVnsAtom@@A"]
             pub static nsGkAtoms_scrollbar_start_backward: *mut nsAtom;
             #[link_name = "\x01?scrollbar_start_forward@nsGkAtoms@@2PAVnsAtom@@A"]
             pub static nsGkAtoms_scrollbar_start_forward: *mut nsAtom;
             #[link_name = "\x01?scrollbar_end_backward@nsGkAtoms@@2PAVnsAtom@@A"]
             pub static nsGkAtoms_scrollbar_end_backward: *mut nsAtom;
             #[link_name = "\x01?scrollbar_end_forward@nsGkAtoms@@2PAVnsAtom@@A"]
             pub static nsGkAtoms_scrollbar_end_forward: *mut nsAtom;
@@ -14737,18 +14719,16 @@ cfg_if! {
             #[link_name = "\x01?windows_glass@nsGkAtoms@@2PAVnsAtom@@A"]
             pub static nsGkAtoms_windows_glass: *mut nsAtom;
             #[link_name = "\x01?touch_enabled@nsGkAtoms@@2PAVnsAtom@@A"]
             pub static nsGkAtoms_touch_enabled: *mut nsAtom;
             #[link_name = "\x01?menubar_drag@nsGkAtoms@@2PAVnsAtom@@A"]
             pub static nsGkAtoms_menubar_drag: *mut nsAtom;
             #[link_name = "\x01?swipe_animation_enabled@nsGkAtoms@@2PAVnsAtom@@A"]
             pub static nsGkAtoms_swipe_animation_enabled: *mut nsAtom;
-            #[link_name = "\x01?physical_home_button@nsGkAtoms@@2PAVnsAtom@@A"]
-            pub static nsGkAtoms_physical_home_button: *mut nsAtom;
             #[link_name = "\x01?windows_classic@nsGkAtoms@@2PAVnsAtom@@A"]
             pub static nsGkAtoms_windows_classic: *mut nsAtom;
             #[link_name = "\x01?windows_theme_aero@nsGkAtoms@@2PAVnsAtom@@A"]
             pub static nsGkAtoms_windows_theme_aero: *mut nsAtom;
             #[link_name = "\x01?windows_theme_aero_lite@nsGkAtoms@@2PAVnsAtom@@A"]
             pub static nsGkAtoms_windows_theme_aero_lite: *mut nsAtom;
             #[link_name = "\x01?windows_theme_luna_blue@nsGkAtoms@@2PAVnsAtom@@A"]
             pub static nsGkAtoms_windows_theme_luna_blue: *mut nsAtom;
@@ -14757,18 +14737,16 @@ cfg_if! {
             #[link_name = "\x01?windows_theme_luna_silver@nsGkAtoms@@2PAVnsAtom@@A"]
             pub static nsGkAtoms_windows_theme_luna_silver: *mut nsAtom;
             #[link_name = "\x01?windows_theme_royale@nsGkAtoms@@2PAVnsAtom@@A"]
             pub static nsGkAtoms_windows_theme_royale: *mut nsAtom;
             #[link_name = "\x01?windows_theme_zune@nsGkAtoms@@2PAVnsAtom@@A"]
             pub static nsGkAtoms_windows_theme_zune: *mut nsAtom;
             #[link_name = "\x01?windows_theme_generic@nsGkAtoms@@2PAVnsAtom@@A"]
             pub static nsGkAtoms_windows_theme_generic: *mut nsAtom;
-            #[link_name = "\x01?_moz_color_picker_available@nsGkAtoms@@2PAVnsAtom@@A"]
-            pub static nsGkAtoms__moz_color_picker_available: *mut nsAtom;
             #[link_name = "\x01?_moz_scrollbar_start_backward@nsGkAtoms@@2PAVnsAtom@@A"]
             pub static nsGkAtoms__moz_scrollbar_start_backward: *mut nsAtom;
             #[link_name = "\x01?_moz_scrollbar_start_forward@nsGkAtoms@@2PAVnsAtom@@A"]
             pub static nsGkAtoms__moz_scrollbar_start_forward: *mut nsAtom;
             #[link_name = "\x01?_moz_scrollbar_end_backward@nsGkAtoms@@2PAVnsAtom@@A"]
             pub static nsGkAtoms__moz_scrollbar_end_backward: *mut nsAtom;
             #[link_name = "\x01?_moz_scrollbar_end_forward@nsGkAtoms@@2PAVnsAtom@@A"]
             pub static nsGkAtoms__moz_scrollbar_end_forward: *mut nsAtom;
@@ -14801,18 +14779,16 @@ cfg_if! {
             #[link_name = "\x01?_moz_device_pixel_ratio@nsGkAtoms@@2PAVnsAtom@@A"]
             pub static nsGkAtoms__moz_device_pixel_ratio: *mut nsAtom;
             #[link_name = "\x01?_moz_device_orientation@nsGkAtoms@@2PAVnsAtom@@A"]
             pub static nsGkAtoms__moz_device_orientation: *mut nsAtom;
             #[link_name = "\x01?_moz_is_resource_document@nsGkAtoms@@2PAVnsAtom@@A"]
             pub static nsGkAtoms__moz_is_resource_document: *mut nsAtom;
             #[link_name = "\x01?_moz_swipe_animation_enabled@nsGkAtoms@@2PAVnsAtom@@A"]
             pub static nsGkAtoms__moz_swipe_animation_enabled: *mut nsAtom;
-            #[link_name = "\x01?_moz_physical_home_button@nsGkAtoms@@2PAVnsAtom@@A"]
-            pub static nsGkAtoms__moz_physical_home_button: *mut nsAtom;
             #[link_name = "\x01?Back@nsGkAtoms@@2PAVnsAtom@@A"]
             pub static nsGkAtoms_Back: *mut nsAtom;
             #[link_name = "\x01?Forward@nsGkAtoms@@2PAVnsAtom@@A"]
             pub static nsGkAtoms_Forward: *mut nsAtom;
             #[link_name = "\x01?Reload@nsGkAtoms@@2PAVnsAtom@@A"]
             pub static nsGkAtoms_Reload: *mut nsAtom;
             #[link_name = "\x01?Stop@nsGkAtoms@@2PAVnsAtom@@A"]
             pub static nsGkAtoms_Stop: *mut nsAtom;
@@ -19879,18 +19855,16 @@ macro_rules! atom {
 ("_displayportbase") =>
   { unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_DisplayPortBase as *mut _) } };
 ("_asyncscrolllayercreationfailed") =>
   { unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_AsyncScrollLayerCreationFailed as *mut _) } };
 ("forcemessagemanager") =>
   { unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_forcemessagemanager as *mut _) } };
 ("isPreloadBrowser") =>
   { unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_isPreloadBrowser as *mut _) } };
-("color-picker-available") =>
-  { unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_color_picker_available as *mut _) } };
 ("scrollbar-start-backward") =>
   { unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_scrollbar_start_backward as *mut _) } };
 ("scrollbar-start-forward") =>
   { unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_scrollbar_start_forward as *mut _) } };
 ("scrollbar-end-backward") =>
   { unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_scrollbar_end_backward as *mut _) } };
 ("scrollbar-end-forward") =>
   { unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_scrollbar_end_forward as *mut _) } };
@@ -19911,18 +19885,16 @@ macro_rules! atom {
 ("windows-glass") =>
   { unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_windows_glass as *mut _) } };
 ("touch-enabled") =>
   { unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_touch_enabled as *mut _) } };
 ("menubar-drag") =>
   { unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_menubar_drag as *mut _) } };
 ("swipe-animation-enabled") =>
   { unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_swipe_animation_enabled as *mut _) } };
-("physical-home-button") =>
-  { unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_physical_home_button as *mut _) } };
 ("windows-classic") =>
   { unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_windows_classic as *mut _) } };
 ("windows-theme-aero") =>
   { unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_windows_theme_aero as *mut _) } };
 ("windows-theme-aero-lite") =>
   { unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_windows_theme_aero_lite as *mut _) } };
 ("windows-theme-luna-blue") =>
   { unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_windows_theme_luna_blue as *mut _) } };
@@ -19931,18 +19903,16 @@ macro_rules! atom {
 ("windows-theme-luna-silver") =>
   { unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_windows_theme_luna_silver as *mut _) } };
 ("windows-theme-royale") =>
   { unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_windows_theme_royale as *mut _) } };
 ("windows-theme-zune") =>
   { unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_windows_theme_zune as *mut _) } };
 ("windows-theme-generic") =>
   { unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_windows_theme_generic as *mut _) } };
-("-moz-color-picker-available") =>
-  { unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms__moz_color_picker_available as *mut _) } };
 ("-moz-scrollbar-start-backward") =>
   { unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms__moz_scrollbar_start_backward as *mut _) } };
 ("-moz-scrollbar-start-forward") =>
   { unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms__moz_scrollbar_start_forward as *mut _) } };
 ("-moz-scrollbar-end-backward") =>
   { unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms__moz_scrollbar_end_backward as *mut _) } };
 ("-moz-scrollbar-end-forward") =>
   { unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms__moz_scrollbar_end_forward as *mut _) } };
@@ -19975,18 +19945,16 @@ macro_rules! atom {
 ("-moz-device-pixel-ratio") =>
   { unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms__moz_device_pixel_ratio as *mut _) } };
 ("-moz-device-orientation") =>
   { unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms__moz_device_orientation as *mut _) } };
 ("-moz-is-resource-document") =>
   { unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms__moz_is_resource_document as *mut _) } };
 ("-moz-swipe-animation-enabled") =>
   { unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms__moz_swipe_animation_enabled as *mut _) } };
-("-moz-physical-home-button") =>
-  { unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms__moz_physical_home_button as *mut _) } };
 ("Back") =>
   { unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_Back as *mut _) } };
 ("Forward") =>
   { unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_Forward as *mut _) } };
 ("Reload") =>
   { unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_Reload as *mut _) } };
 ("Stop") =>
   { unsafe { $crate::string_cache::atom_macro::atom_from_static($crate::string_cache::atom_macro::nsGkAtoms_Stop as *mut _) } };
--- a/servo/components/style/gecko/generated/bindings.rs
+++ b/servo/components/style/gecko/generated/bindings.rs
@@ -18,16 +18,17 @@ use gecko_bindings::structs::mozilla::An
 use gecko_bindings::structs::mozilla::AtomArray;
 use gecko_bindings::structs::mozilla::MallocSizeOf;
 use gecko_bindings::structs::mozilla::OriginFlags;
 use gecko_bindings::structs::mozilla::UniquePtr;
 use gecko_bindings::structs::ServoRawOffsetArc;
 use gecko_bindings::structs::nsIContent;
 use gecko_bindings::structs::nsIDocument;
 use gecko_bindings::structs::nsIDocument_DocumentTheme;
+use gecko_bindings::structs::nsSimpleContentList;
 use gecko_bindings::structs::RawGeckoAnimationPropertySegment;
 use gecko_bindings::structs::RawGeckoComputedTiming;
 use gecko_bindings::structs::RawGeckoCSSPropertyIDList;
 use gecko_bindings::structs::RawGeckoDocument;
 use gecko_bindings::structs::RawGeckoElement;
 use gecko_bindings::structs::RawGeckoKeyframeList;
 use gecko_bindings::structs::RawGeckoPropertyValuePairList;
 use gecko_bindings::structs::RawGeckoComputedKeyframeValuesList;
@@ -70,16 +71,17 @@ use gecko_bindings::structs::StyleBasicS
 use gecko_bindings::structs::StyleShapeSource;
 use gecko_bindings::structs::StyleTransition;
 use gecko_bindings::structs::gfxFontFeatureValueSet;
 use gecko_bindings::structs::nsCSSCounterStyleRule;
 use gecko_bindings::structs::nsCSSFontFaceRule;
 use gecko_bindings::structs::nsCSSKeyword;
 use gecko_bindings::structs::nsCSSPropertyID;
 use gecko_bindings::structs::nsCSSPropertyIDSet;
+use gecko_bindings::structs::nsCSSRect;
 use gecko_bindings::structs::nsCSSShadowArray;
 use gecko_bindings::structs::nsCSSUnit;
 use gecko_bindings::structs::nsCSSValue;
 use gecko_bindings::structs::nsCSSValueSharedList;
 use gecko_bindings::structs::nsChangeHint;
 use gecko_bindings::structs::nsCursorImage;
 use gecko_bindings::structs::nsFont;
 use gecko_bindings::structs::nsAtom;
@@ -2125,16 +2127,27 @@ extern "C" {
      -> bool;
 }
 extern "C" {
     pub fn Servo_SelectorList_Closest(arg1: RawGeckoElementBorrowed,
                                       arg2: RawServoSelectorListBorrowed)
      -> *const RawGeckoElement;
 }
 extern "C" {
+    pub fn Servo_SelectorList_QueryFirst(arg1: RawGeckoNodeBorrowed,
+                                         arg2: RawServoSelectorListBorrowed)
+     -> *const RawGeckoElement;
+}
+extern "C" {
+    pub fn Servo_SelectorList_QueryAll(arg1: RawGeckoNodeBorrowed,
+                                       arg2: RawServoSelectorListBorrowed,
+                                       content_list:
+                                           *mut nsSimpleContentList);
+}
+extern "C" {
     pub fn Servo_StyleSet_AddSizeOfExcludingThis(malloc_size_of: MallocSizeOf,
                                                  malloc_enclosing_size_of:
                                                      MallocSizeOf,
                                                  sizes:
                                                      *mut ServoStyleSetSizes,
                                                  set:
                                                      RawServoStyleSetBorrowed);
 }
@@ -2728,17 +2741,18 @@ extern "C" {
     pub fn Servo_DeclarationBlock_RemoveProperty(declarations:
                                                      RawServoDeclarationBlockBorrowed,
                                                  property: *const nsACString);
 }
 extern "C" {
     pub fn Servo_DeclarationBlock_RemovePropertyById(declarations:
                                                          RawServoDeclarationBlockBorrowed,
                                                      property:
-                                                         nsCSSPropertyID) -> bool;
+                                                         nsCSSPropertyID)
+     -> bool;
 }
 extern "C" {
     pub fn Servo_DeclarationBlock_HasCSSWideKeyword(declarations:
                                                         RawServoDeclarationBlockBorrowed,
                                                     property: nsCSSPropertyID)
      -> bool;
 }
 extern "C" {
@@ -3071,16 +3085,29 @@ extern "C" {
                                           *const ServoRawOffsetArc<RustString>);
 }
 extern "C" {
     pub fn Servo_CloneArcStringData(string:
                                         *const ServoRawOffsetArc<RustString>)
      -> ServoRawOffsetArc<RustString>;
 }
 extern "C" {
+    pub fn Servo_IsValidCSSColor(value: *const nsAString) -> bool;
+}
+extern "C" {
+    pub fn Servo_ComputeColor(set: RawServoStyleSetBorrowedOrNull,
+                              current_color: nscolor, value: *const nsAString,
+                              result_color: *mut nscolor) -> bool;
+}
+extern "C" {
+    pub fn Servo_ParseIntersectionObserverRootMargin(value: *const nsAString,
+                                                     result: *mut nsCSSRect)
+     -> bool;
+}
+extern "C" {
     pub fn Gecko_CreateCSSErrorReporter(sheet: *mut ServoStyleSheet,
                                         loader: *mut Loader, uri: *mut nsIURI)
      -> *mut ErrorReporter;
 }
 extern "C" {
     pub fn Gecko_DestroyCSSErrorReporter(reporter: *mut ErrorReporter);
 }
 extern "C" {
@@ -3097,8 +3124,13 @@ extern "C" {
                                           prefixParamLen: u32,
                                           suffix:
                                               *const ::std::os::raw::c_char,
                                           source:
                                               *const ::std::os::raw::c_char,
                                           sourceLen: u32, lineNumber: u32,
                                           colNumber: u32);
 }
+extern "C" {
+    pub fn Gecko_ContentList_AppendAll(aContentList: *mut nsSimpleContentList,
+                                       aElements: *mut *const RawGeckoElement,
+                                       aLength: usize);
+}
--- a/servo/components/style/gecko/generated/structs.rs
+++ b/servo/components/style/gecko/generated/structs.rs
@@ -995,16 +995,18 @@ pub mod root {
         pub struct pair<_T1, _T2> {
             pub first: _T1,
             pub second: _T2,
             pub _phantom_0: ::std::marker::PhantomData<::std::cell::UnsafeCell<_T1>>,
             pub _phantom_1: ::std::marker::PhantomData<::std::cell::UnsafeCell<_T2>>,
         }
         pub type pair_first_type<_T1> = _T1;
         pub type pair_second_type<_T2> = _T2;
+        pub type pair__PCCP = u8;
+        pub type pair__PCCFP = u8;
         #[repr(C)]
         #[derive(Debug, Copy)]
         pub struct input_iterator_tag {
             pub _address: u8,
         }
         #[test]
         fn bindgen_test_layout_input_iterator_tag() {
             assert_eq!(::std::mem::size_of::<input_iterator_tag>() , 1usize ,
@@ -1046,16 +1048,24 @@ pub mod root {
             pub _M_wp: *mut root::std::bitset__WordT,
             pub _M_bpos: usize,
         }
     }
     pub mod __gnu_cxx {
         #[allow(unused_imports)]
         use self::super::super::root;
     }
+    pub type __int8_t = ::std::os::raw::c_schar;
+    pub type __uint8_t = ::std::os::raw::c_uchar;
+    pub type __int16_t = ::std::os::raw::c_short;
+    pub type __uint16_t = ::std::os::raw::c_ushort;
+    pub type __int32_t = ::std::os::raw::c_int;
+    pub type __uint32_t = ::std::os::raw::c_uint;
+    pub type __int64_t = ::std::os::raw::c_long;
+    pub type __uint64_t = ::std::os::raw::c_ulong;
     pub mod mozilla {
         #[allow(unused_imports)]
         use self::super::super::root;
         #[repr(C)]
         #[derive(Debug, Copy)]
         pub struct fallible_t {
             pub _address: u8,
         }
@@ -1090,34 +1100,34 @@ pub mod root {
             pub type nsTStringRepr_char_type<T> = T;
             pub type nsTStringRepr_self_type<T> =
                 root::mozilla::detail::nsTStringRepr<T>;
             pub type nsTStringRepr_base_string_type<T> =
                 root::mozilla::detail::nsTStringRepr_self_type<T>;
             pub type nsTStringRepr_substring_type<T> = root::nsTSubstring<T>;
             pub type nsTStringRepr_substring_tuple_type<T> =
                 root::nsTSubstringTuple<T>;
+            pub type nsTStringRepr_literalstring_type<T> =
+                root::nsTLiteralString<T>;
             pub type nsTStringRepr_const_iterator<T> =
                 root::nsReadingIterator<root::mozilla::detail::nsTStringRepr_char_type<T>>;
             pub type nsTStringRepr_iterator<T> =
                 root::nsWritingIterator<root::mozilla::detail::nsTStringRepr_char_type<T>>;
             pub type nsTStringRepr_comparator_type =
                 root::nsTStringComparator;
             pub type nsTStringRepr_char_iterator<T> =
                 *mut root::mozilla::detail::nsTStringRepr_char_type<T>;
             pub type nsTStringRepr_const_char_iterator<T> =
                 *const root::mozilla::detail::nsTStringRepr_char_type<T>;
             pub type nsTStringRepr_index_type = u32;
             pub type nsTStringRepr_size_type = u32;
             pub type nsTStringRepr_DataFlags =
                 root::mozilla::detail::StringDataFlags;
             pub type nsTStringRepr_ClassFlags =
                 root::mozilla::detail::StringClassFlags;
-            pub type nsTStringRepr_IsChar = u8;
-            pub type nsTStringRepr_IsChar16 = u8;
             #[repr(C)]
             #[derive(Debug, Copy, Clone)]
             pub struct nsTStringRepr_raw_type {
                 pub _address: u8,
             }
             pub type nsTStringRepr_raw_type_type<U> = *mut U;
             #[repr(u16)]
             #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
@@ -1143,16 +1153,21 @@ pub mod root {
             pub type LinkedListElementTraits_RawType<T> = *mut T;
             pub type LinkedListElementTraits_ConstRawType<T> = *mut T;
             pub type LinkedListElementTraits_ClientType<T> = *mut T;
             pub type LinkedListElementTraits_ConstClientType<T> = *mut T;
             #[repr(C)]
             #[derive(Debug, Copy, Clone)]
             pub struct WeakReference {
             }
+            #[repr(C)]
+            #[derive(Debug, Copy, Clone)]
+            pub struct FreePolicy {
+                pub _address: u8,
+            }
         }
         pub type Conditional_Type<A> = A;
         #[repr(u32)]
         #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
         pub enum ArenaObjectID {
             eArenaObjectID_DummyBeforeFirstObjectID = 171,
             eArenaObjectID_GeckoStyleContext = 172,
             eArenaObjectID_nsLineBox = 173,
@@ -2308,17 +2323,17 @@ pub mod root {
                            ));
                 assert_eq! (::std::mem::align_of::<MediaList>() , 8usize ,
                             concat ! (
                             "Alignment of " , stringify ! ( MediaList ) ));
             }
             #[repr(C)]
             #[derive(Debug)]
             pub struct SRIMetadata {
-                pub mHashes: root::nsTArray<root::nsTString<::std::os::raw::c_char>>,
+                pub mHashes: root::nsTArray<root::nsCString>,
                 pub mIntegrityString: ::nsstring::nsStringRepr,
                 pub mAlgorithm: root::nsCString,
                 pub mAlgorithmType: i8,
                 pub mEmpty: bool,
             }
             pub const SRIMetadata_MAX_ALTERNATE_HASHES: u32 = 256;
             pub const SRIMetadata_UNKNOWN_ALGORITHM: i8 = -1;
             #[test]
@@ -2812,16 +2827,21 @@ pub mod root {
             }
             #[repr(C)]
             #[derive(Debug, Copy, Clone)]
             pub struct DOMPointInit {
                 _unused: [u8; 0],
             }
             #[repr(C)]
             #[derive(Debug, Copy, Clone)]
+            pub struct HTMLSlotElement {
+                _unused: [u8; 0],
+            }
+            #[repr(C)]
+            #[derive(Debug, Copy, Clone)]
             pub struct TabGroup {
                 _unused: [u8; 0],
             }
             #[repr(C)]
             pub struct DispatcherTrait__bindgen_vtable(::std::os::raw::c_void);
             #[repr(C)]
             #[derive(Debug, Copy)]
             pub struct DispatcherTrait {
@@ -3167,29 +3187,31 @@ pub mod root {
                 pub mLabelsList: root::RefPtr<root::nsLabelsNodeList>,
                 /// ShadowRoot bound to the element.
                 pub mShadowRoot: root::RefPtr<root::mozilla::dom::ShadowRoot>,
                 /// The root ShadowRoot of this element if it is in a shadow tree.
                 pub mContainingShadow: root::RefPtr<root::mozilla::dom::ShadowRoot>,
                 /// An array of web component insertion points to which this element
                 /// is distributed.
                 pub mDestInsertionPoints: root::nsTArray<*mut root::nsIContent>,
+                /// The assigned slot associated with this element.
+                pub mAssignedSlot: root::RefPtr<root::mozilla::dom::HTMLSlotElement>,
                 /// XBL binding installed on the element.
                 pub mXBLBinding: root::RefPtr<root::nsXBLBinding>,
                 /// XBL binding installed on the lement.
                 pub mXBLInsertionParent: root::nsCOMPtr,
                 /// Web components custom element data.
                 pub mCustomElementData: root::RefPtr<root::mozilla::dom::CustomElementData>,
                 /// For XUL to hold either frameloader or opener.
                 pub mFrameLoaderOrOpener: root::nsCOMPtr,
             }
             #[test]
             fn bindgen_test_layout_FragmentOrElement_nsExtendedDOMSlots() {
                 assert_eq!(::std::mem::size_of::<FragmentOrElement_nsExtendedDOMSlots>()
-                           , 96usize , concat ! (
+                           , 104usize , concat ! (
                            "Size of: " , stringify ! (
                            FragmentOrElement_nsExtendedDOMSlots ) ));
                 assert_eq! (::std::mem::align_of::<FragmentOrElement_nsExtendedDOMSlots>()
                             , 8usize , concat ! (
                             "Alignment of " , stringify ! (
                             FragmentOrElement_nsExtendedDOMSlots ) ));
                 assert_eq! (unsafe {
                             & (
@@ -3262,45 +3284,54 @@ pub mod root {
                             , 56usize , concat ! (
                             "Alignment of field: " , stringify ! (
                             FragmentOrElement_nsExtendedDOMSlots ) , "::" ,
                             stringify ! ( mDestInsertionPoints ) ));
                 assert_eq! (unsafe {
                             & (
                             * (
                             0 as * const FragmentOrElement_nsExtendedDOMSlots
+                            ) ) . mAssignedSlot as * const _ as usize } ,
+                            64usize , concat ! (
+                            "Alignment of field: " , stringify ! (
+                            FragmentOrElement_nsExtendedDOMSlots ) , "::" ,
+                            stringify ! ( mAssignedSlot ) ));
+                assert_eq! (unsafe {
+                            & (
+                            * (
+                            0 as * const FragmentOrElement_nsExtendedDOMSlots
                             ) ) . mXBLBinding as * const _ as usize } ,
-                            64usize , concat ! (
+                            72usize , concat ! (
                             "Alignment of field: " , stringify ! (
                             FragmentOrElement_nsExtendedDOMSlots ) , "::" ,
                             stringify ! ( mXBLBinding ) ));
                 assert_eq! (unsafe {
                             & (
                             * (
                             0 as * const FragmentOrElement_nsExtendedDOMSlots
                             ) ) . mXBLInsertionParent as * const _ as usize }
-                            , 72usize , concat ! (
+                            , 80usize , concat ! (
                             "Alignment of field: " , stringify ! (
                             FragmentOrElement_nsExtendedDOMSlots ) , "::" ,
                             stringify ! ( mXBLInsertionParent ) ));
                 assert_eq! (unsafe {
                             & (
                             * (
                             0 as * const FragmentOrElement_nsExtendedDOMSlots
                             ) ) . mCustomElementData as * const _ as usize } ,
-                            80usize , concat ! (
+                            88usize , concat ! (
                             "Alignment of field: " , stringify ! (
                             FragmentOrElement_nsExtendedDOMSlots ) , "::" ,
                             stringify ! ( mCustomElementData ) ));
                 assert_eq! (unsafe {
                             & (
                             * (
                             0 as * const FragmentOrElement_nsExtendedDOMSlots
                             ) ) . mFrameLoaderOrOpener as * const _ as usize }
-                            , 88usize , concat ! (
+                            , 96usize , concat ! (
                             "Alignment of field: " , stringify ! (
                             FragmentOrElement_nsExtendedDOMSlots ) , "::" ,
                             stringify ! ( mFrameLoaderOrOpener ) ));
             }
             #[repr(C)]
             #[derive(Debug)]
             pub struct FragmentOrElement_nsDOMSlots {
                 pub _base: root::nsINode_nsSlots,
@@ -5658,16 +5689,17 @@ pub mod root {
         pub type Runnable_HasThreadSafeRefCnt = root::mozilla::TrueType;
         #[test]
         fn bindgen_test_layout_Runnable() {
             assert_eq!(::std::mem::size_of::<Runnable>() , 32usize , concat !
                        ( "Size of: " , stringify ! ( Runnable ) ));
             assert_eq! (::std::mem::align_of::<Runnable>() , 8usize , concat !
                         ( "Alignment of " , stringify ! ( Runnable ) ));
         }
+        pub type Preferences_PrefSetting = root::mozilla::dom::PrefSetting;
         #[repr(C)]
         #[derive(Debug)]
         pub struct CycleCollectedJSContext_RunInMetastableStateData {
             pub mRunnable: root::nsCOMPtr,
             pub mRecursionDepth: u32,
         }
         #[test]
         fn bindgen_test_layout_CycleCollectedJSContext_RunInMetastableStateData() {
@@ -5769,57 +5801,48 @@ pub mod root {
             eUseCounter_DataTransfer_mozSetDataAt = 48,
             eUseCounter_DataTransfer_mozGetDataAt = 49,
             eUseCounter_DataTransfer_mozUserCancelled_getter = 50,
             eUseCounter_DataTransfer_mozUserCancelled_setter = 51,
             eUseCounter_DataTransfer_mozSourceNode_getter = 52,
             eUseCounter_DataTransfer_mozSourceNode_setter = 53,
             eUseCounter_custom_JS_asmjs = 54,
             eUseCounter_custom_JS_wasm = 55,
-            eUseCounter_GetAttributeNode = 56,
-            eUseCounter_SetAttributeNode = 57,
-            eUseCounter_GetAttributeNodeNS = 58,
-            eUseCounter_SetAttributeNodeNS = 59,
-            eUseCounter_RemoveAttributeNode = 60,
-            eUseCounter_CreateAttribute = 61,
-            eUseCounter_CreateAttributeNS = 62,
-            eUseCounter_NodeValue = 63,
-            eUseCounter_TextContent = 64,
-            eUseCounter_EnablePrivilege = 65,
-            eUseCounter_DOMExceptionCode = 66,
-            eUseCounter_MutationEvent = 67,
-            eUseCounter_Components = 68,
-            eUseCounter_PrefixedVisibilityAPI = 69,
-            eUseCounter_NodeIteratorDetach = 70,
-            eUseCounter_LenientThis = 71,
-            eUseCounter_GetPreventDefault = 72,
-            eUseCounter_GetSetUserData = 73,
-            eUseCounter_MozGetAsFile = 74,
-            eUseCounter_UseOfCaptureEvents = 75,
-            eUseCounter_UseOfReleaseEvents = 76,
-            eUseCounter_UseOfDOM3LoadMethod = 77,
-            eUseCounter_ChromeUseOfDOM3LoadMethod = 78,
-            eUseCounter_ShowModalDialog = 79,
-            eUseCounter_SyncXMLHttpRequest = 80,
-            eUseCounter_Window_Cc_ontrollers = 81,
-            eUseCounter_ImportXULIntoContent = 82,
-            eUseCounter_PannerNodeDoppler = 83,
-            eUseCounter_NavigatorGetUserMedia = 84,
-            eUseCounter_WebrtcDeprecatedPrefix = 85,
-            eUseCounter_RTCPeerConnectionGetStreams = 86,
-            eUseCounter_AppCache = 87,
-            eUseCounter_PrefixedImageSmoothingEnabled = 88,
-            eUseCounter_PrefixedFullscreenAPI = 89,
-            eUseCounter_LenientSetter = 90,
-            eUseCounter_FileLastModifiedDate = 91,
-            eUseCounter_ImageBitmapRenderingContext_TransferImageBitmap = 92,
-            eUseCounter_URLCreateObjectURL_MediaStream = 93,
-            eUseCounter_XMLBaseAttribute = 94,
-            eUseCounter_WindowContentUntrusted = 95,
-            eUseCounter_Count = 96,
+            eUseCounter_EnablePrivilege = 56,
+            eUseCounter_DOMExceptionCode = 57,
+            eUseCounter_MutationEvent = 58,
+            eUseCounter_Components = 59,
+            eUseCounter_PrefixedVisibilityAPI = 60,
+            eUseCounter_NodeIteratorDetach = 61,
+            eUseCounter_LenientThis = 62,
+            eUseCounter_GetPreventDefault = 63,
+            eUseCounter_GetSetUserData = 64,
+            eUseCounter_MozGetAsFile = 65,
+            eUseCounter_UseOfCaptureEvents = 66,
+            eUseCounter_UseOfReleaseEvents = 67,
+            eUseCounter_UseOfDOM3LoadMethod = 68,
+            eUseCounter_ChromeUseOfDOM3LoadMethod = 69,
+            eUseCounter_ShowModalDialog = 70,
+            eUseCounter_SyncXMLHttpRequest = 71,
+            eUseCounter_Window_Cc_ontrollers = 72,
+            eUseCounter_ImportXULIntoContent = 73,
+            eUseCounter_PannerNodeDoppler = 74,
+            eUseCounter_NavigatorGetUserMedia = 75,
+            eUseCounter_WebrtcDeprecatedPrefix = 76,
+            eUseCounter_RTCPeerConnectionGetStreams = 77,
+            eUseCounter_AppCache = 78,
+            eUseCounter_PrefixedImageSmoothingEnabled = 79,
+            eUseCounter_PrefixedFullscreenAPI = 80,
+            eUseCounter_LenientSetter = 81,
+            eUseCounter_FileLastModifiedDate = 82,
+            eUseCounter_ImageBitmapRenderingContext_TransferImageBitmap = 83,
+            eUseCounter_URLCreateObjectURL_MediaStream = 84,
+            eUseCounter_XMLBaseAttribute = 85,
+            eUseCounter_WindowContentUntrusted = 86,
+            eUseCounter_Count = 87,
         }
         /// This class holds all non-tree-structural state of an element that might be
         /// used for selector matching eventually.
         ///
         /// This means the attributes, and the element state, such as :hover, :active,
         /// etc...
         #[repr(C)]
         #[derive(Debug)]
@@ -6611,16 +6634,18 @@ pub mod root {
             #[inline]
             fn bitand_assign(&mut self, rhs: root::mozilla::OriginFlags) {
                 self.0 &= rhs.0;
             }
         }
         #[repr(C)]
         #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
         pub struct OriginFlags(pub u8);
+        pub type ComputedKeyframeValues =
+            root::nsTArray<root::mozilla::PropertyStyleAnimationValuePair>;
         #[test]
         fn __bindgen_test_layout_DefaultDelete_open0_RawServoStyleSet_close0_instantiation() {
             assert_eq!(::std::mem::size_of::<root::mozilla::DefaultDelete>() ,
                        1usize , concat ! (
                        "Size of template specialization: " , stringify ! (
                        root::mozilla::DefaultDelete ) ));
             assert_eq!(::std::mem::align_of::<root::mozilla::DefaultDelete>()
                        , 1usize , concat ! (
@@ -7037,35 +7062,16 @@ pub mod root {
                         CounterStyleManager ) , "::" , stringify ! (
                         mRetiredStyles ) ));
         }
         #[repr(C)]
         #[derive(Debug, Copy, Clone)]
         pub struct RestyleManager {
             _unused: [u8; 0],
         }
-        #[repr(C)]
-        #[derive(Debug, Copy)]
-        pub struct XREAppData_NSFreePolicy {
-            pub _address: u8,
-        }
-        #[test]
-        fn bindgen_test_layout_XREAppData_NSFreePolicy() {
-            assert_eq!(::std::mem::size_of::<XREAppData_NSFreePolicy>() ,
-                       1usize , concat ! (
-                       "Size of: " , stringify ! ( XREAppData_NSFreePolicy )
-                       ));
-            assert_eq! (::std::mem::align_of::<XREAppData_NSFreePolicy>() ,
-                        1usize , concat ! (
-                        "Alignment of " , stringify ! (
-                        XREAppData_NSFreePolicy ) ));
-        }
-        impl Clone for XREAppData_NSFreePolicy {
-            fn clone(&self) -> Self { *self }
-        }
         pub mod image {
             #[allow(unused_imports)]
             use self::super::super::super::root;
             #[repr(C)]
             #[derive(Debug, Copy, Clone)]
             pub struct ImageURL {
                 _unused: [u8; 0],
             }
@@ -8591,23 +8597,21 @@ pub mod root {
             eIntID_IMESelectedConvertedTextUnderline = 38,
             eIntID_SpellCheckerUnderlineStyle = 39,
             eIntID_MenuBarDrag = 40,
             eIntID_WindowsThemeIdentifier = 41,
             eIntID_OperatingSystemVersionIdentifier = 42,
             eIntID_ScrollbarButtonAutoRepeatBehavior = 43,
             eIntID_TooltipDelay = 44,
             eIntID_SwipeAnimationEnabled = 45,
-            eIntID_ColorPickerAvailable = 46,
-            eIntID_PhysicalHomeButton = 47,
-            eIntID_ScrollbarDisplayOnMouseMove = 48,
-            eIntID_ScrollbarFadeBeginDelay = 49,
-            eIntID_ScrollbarFadeDuration = 50,
-            eIntID_ContextMenuOffsetVertical = 51,
-            eIntID_ContextMenuOffsetHorizontal = 52,
+            eIntID_ScrollbarDisplayOnMouseMove = 46,
+            eIntID_ScrollbarFadeBeginDelay = 47,
+            eIntID_ScrollbarFadeDuration = 48,
+            eIntID_ContextMenuOffsetVertical = 49,
+            eIntID_ContextMenuOffsetHorizontal = 50,
         }
         #[repr(u32)]
         /// Windows themes we currently detect.
         #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
         pub enum LookAndFeel_WindowsTheme {
             eWindowsTheme_Generic = 0,
             eWindowsTheme_Classic = 1,
             eWindowsTheme_Aero = 2,
@@ -8841,83 +8845,82 @@ pub mod root {
             nthChild = 13,
             nthLastChild = 14,
             nthOfType = 15,
             nthLastOfType = 16,
             mozIsHTML = 17,
             unresolved = 18,
             mozNativeAnonymous = 19,
             mozUseShadowTreeRoot = 20,
-            mozSystemMetric = 21,
-            mozLocaleDir = 22,
-            mozLWTheme = 23,
-            mozLWThemeBrightText = 24,
-            mozLWThemeDarkText = 25,
-            mozWindowInactive = 26,
-            mozTableBorderNonzero = 27,
-            mozBrowserFrame = 28,
-            scope = 29,
-            negation = 30,
-            dir = 31,
-            link = 32,
-            mozAnyLink = 33,
-            anyLink = 34,
-            visited = 35,
-            active = 36,
-            checked = 37,
-            disabled = 38,
-            enabled = 39,
-            focus = 40,
-            focusWithin = 41,
-            hover = 42,
-            mozDragOver = 43,
-            target = 44,
-            indeterminate = 45,
-            mozDevtoolsHighlighted = 46,
-            mozStyleeditorTransitioning = 47,
-            fullscreen = 48,
-            mozFullScreen = 49,
-            mozFocusRing = 50,
-            mozBroken = 51,
-            mozLoading = 52,
-            mozUserDisabled = 53,
-            mozSuppressed = 54,
-            mozHandlerClickToPlay = 55,
-            mozHandlerVulnerableUpdatable = 56,
-            mozHandlerVulnerableNoUpdate = 57,
-            mozHandlerDisabled = 58,
-            mozHandlerBlocked = 59,
-            mozHandlerCrashed = 60,
-            mozMathIncrementScriptLevel = 61,
-            mozHasDirAttr = 62,
-            mozDirAttrLTR = 63,
-            mozDirAttrRTL = 64,
-            mozDirAttrLikeAuto = 65,
-            mozAutofill = 66,
-            mozAutofillPreview = 67,
-            required = 68,
-            optional = 69,
-            valid = 70,
-            invalid = 71,
-            inRange = 72,
-            outOfRange = 73,
-            defaultPseudo = 74,
-            placeholderShown = 75,
-            mozReadOnly = 76,
-            mozReadWrite = 77,
-            mozSubmitInvalid = 78,
-            mozUIInvalid = 79,
-            mozUIValid = 80,
-            mozMeterOptimum = 81,
-            mozMeterSubOptimum = 82,
-            mozMeterSubSubOptimum = 83,
-            mozPlaceholder = 84,
-            Count = 85,
-            NotPseudo = 86,
-            MAX = 87,
+            mozLocaleDir = 21,
+            mozLWTheme = 22,
+            mozLWThemeBrightText = 23,
+            mozLWThemeDarkText = 24,
+            mozWindowInactive = 25,
+            mozTableBorderNonzero = 26,
+            mozBrowserFrame = 27,
+            scope = 28,
+            negation = 29,
+            dir = 30,
+            link = 31,
+            mozAnyLink = 32,
+            anyLink = 33,
+            visited = 34,
+            active = 35,
+            checked = 36,
+            disabled = 37,
+            enabled = 38,
+            focus = 39,
+            focusWithin = 40,
+            hover = 41,
+            mozDragOver = 42,
+            target = 43,
+            indeterminate = 44,
+            mozDevtoolsHighlighted = 45,
+            mozStyleeditorTransitioning = 46,
+            fullscreen = 47,
+            mozFullScreen = 48,
+            mozFocusRing = 49,
+            mozBroken = 50,
+            mozLoading = 51,
+            mozUserDisabled = 52,
+            mozSuppressed = 53,
+            mozHandlerClickToPlay = 54,
+            mozHandlerVulnerableUpdatable = 55,
+            mozHandlerVulnerableNoUpdate = 56,
+            mozHandlerDisabled = 57,
+            mozHandlerBlocked = 58,
+            mozHandlerCrashed = 59,
+            mozMathIncrementScriptLevel = 60,
+            mozHasDirAttr = 61,
+            mozDirAttrLTR = 62,
+            mozDirAttrRTL = 63,
+            mozDirAttrLikeAuto = 64,
+            mozAutofill = 65,
+            mozAutofillPreview = 66,
+            required = 67,
+            optional = 68,
+            valid = 69,
+            invalid = 70,
+            inRange = 71,
+            outOfRange = 72,
+            defaultPseudo = 73,
+            placeholderShown = 74,
+            mozReadOnly = 75,
+            mozReadWrite = 76,
+            mozSubmitInvalid = 77,
+            mozUIInvalid = 78,
+            mozUIValid = 79,
+            mozMeterOptimum = 80,
+            mozMeterSubOptimum = 81,
+            mozMeterSubSubOptimum = 82,
+            mozPlaceholder = 83,
+            Count = 84,
+            NotPseudo = 85,
+            MAX = 86,
         }
         #[repr(C)]
         #[derive(Debug)]
         pub struct ServoMediaList {
             pub _base: root::mozilla::dom::MediaList,
             pub mRawList: root::RefPtr<root::RawServoMediaList>,
         }
         #[test]
@@ -9662,16 +9665,18 @@ pub mod root {
         pub _phantom_0: ::std::marker::PhantomData<::std::cell::UnsafeCell<T>>,
     }
     pub type nsTSubstring_self_type<T> = root::nsTSubstring<T>;
     pub type nsTSubstring_string_type<T> = root::nsTString<T>;
     pub type nsTSubstring_base_string_type<T> =
         root::mozilla::detail::nsTStringRepr<T>;
     pub type nsTSubstring_substring_type<T> =
         root::nsTSubstring_base_string_type<T>;
+    pub type nsTSubstring_literalstring_type<T> =
+        root::nsTSubstring_base_string_type<T>;
     pub type nsTSubstring_fallible_t<T> =
         root::nsTSubstring_base_string_type<T>;
     pub type nsTSubstring_char_type<T> =
         root::nsTSubstring_base_string_type<T>;
     pub type nsTSubstring_substring_tuple_type<T> =
         root::nsTSubstring_base_string_type<T>;
     pub type nsTSubstring_const_iterator<T> =
         root::nsTSubstring_base_string_type<T>;
@@ -9723,16 +9728,17 @@ pub mod root {
     /// to denote a null-terminated string.
     #[repr(C)]
     #[derive(Debug)]
     pub struct nsTString<T> {
         pub _base: root::nsTSubstring<T>,
         pub _phantom_0: ::std::marker::PhantomData<::std::cell::UnsafeCell<T>>,
     }
     pub type nsTString_self_type<T> = root::nsTString<T>;
+    pub type nsTString_literalstring_type = [u8; 0usize];
     pub type nsTString_fallible_t = [u8; 0usize];
     pub type nsTString_char_type = [u8; 0usize];
     pub type nsTString_substring_tuple_type = [u8; 0usize];
     pub type nsTString_const_iterator = [u8; 0usize];
     pub type nsTString_iterator = [u8; 0usize];
     pub type nsTString_comparator_type = [u8; 0usize];
     pub type nsTString_char_iterator = [u8; 0usize];
     pub type nsTString_const_char_iterator = [u8; 0usize];
@@ -9760,28 +9766,56 @@ pub mod root {
     pub type nsTAutoStringN_char_type<T> =
         root::nsTAutoStringN_base_string_type<T>;
     pub type nsTAutoStringN_substring_type<T> =
         root::nsTAutoStringN_base_string_type<T>;
     pub type nsTAutoStringN_size_type<T> =
         root::nsTAutoStringN_base_string_type<T>;
     pub type nsTAutoStringN_substring_tuple_type<T> =
         root::nsTAutoStringN_base_string_type<T>;
+    pub type nsTAutoStringN_literalstring_type<T> =
+        root::nsTAutoStringN_base_string_type<T>;
     pub type nsTAutoStringN_DataFlags<T> =
         root::nsTAutoStringN_base_string_type<T>;
     pub type nsTAutoStringN_ClassFlags<T> =
         root::nsTAutoStringN_base_string_type<T>;
     #[repr(C)]
     pub struct nsTStringComparator__bindgen_vtable(::std::os::raw::c_void);
     #[repr(C)]
     #[derive(Debug, Copy, Clone)]
     pub struct nsTStringComparator {
         pub vtable_: *const nsTStringComparator__bindgen_vtable,
     }
     pub type nsTStringComparator_char_type<T> = T;
+    /// nsTLiteralString_CharT
+    ///
+    /// Stores a null-terminated, immutable sequence of characters.
+    ///
+    /// nsTString-lookalike that restricts its string value to a literal character
+    /// sequence. Can be implicitly cast to const nsTString& (the const is
+    /// essential, since this class's data are not writable). The data are assumed
+    /// to be static (permanent) and therefore, as an optimization, this class
+    /// does not have a destructor.
+    #[repr(C)]
+    #[derive(Debug, Copy, Clone)]
+    pub struct nsTLiteralString<T> {
+        pub _base: root::mozilla::detail::nsTStringRepr<T>,
+        pub _phantom_0: ::std::marker::PhantomData<::std::cell::UnsafeCell<T>>,
+    }
+    pub type nsTLiteralString_self_type<T> = root::nsTLiteralString<T>;
+    pub type nsTLiteralString_char_type = [u8; 0usize];
+    pub type nsTLiteralString_size_type = [u8; 0usize];
+    pub type nsTLiteralString_DataFlags = [u8; 0usize];
+    pub type nsTLiteralString_ClassFlags = [u8; 0usize];
+    #[repr(C)]
+    #[derive(Debug, Copy, Clone)]
+    pub struct nsTLiteralString_raw_type {
+        pub _address: u8,
+    }
+    pub type nsTLiteralString_raw_type_type<N> = *mut N;
     pub type nsAString = root::nsTSubstring<u16>;
     pub type nsAutoString = [u64; 19usize];
     pub type nsACString = root::nsTSubstring<::std::os::raw::c_char>;
     pub type nsCString = root::nsTString<::std::os::raw::c_char>;
     #[repr(C)]
     pub struct nsISupports__bindgen_vtable(::std::os::raw::c_void);
     /// Basic component object model interface. Objects which implement
     /// this interface support runtime interface discovery (QueryInterface)
@@ -11485,17 +11519,17 @@ pub mod root {
         pub mFontFeatureValues: [u64; 4usize],
     }
     pub type gfxFontFeatureValueSet_HasThreadSafeRefCnt =
         root::mozilla::TrueType;
     #[repr(C)]
     #[derive(Debug)]
     pub struct gfxFontFeatureValueSet_ValueList {
         pub name: ::nsstring::nsStringRepr,
-        pub featureSelectors: root::nsTArray<::std::os::raw::c_uint>,
+        pub featureSelectors: root::nsTArray<u32>,
     }
     #[test]
     fn bindgen_test_layout_gfxFontFeatureValueSet_ValueList() {
         assert_eq!(::std::mem::size_of::<gfxFontFeatureValueSet_ValueList>() ,
                    24usize , concat ! (
                    "Size of: " , stringify ! (
                    gfxFontFeatureValueSet_ValueList ) ));
         assert_eq! (::std::mem::align_of::<gfxFontFeatureValueSet_ValueList>()
@@ -11590,17 +11624,17 @@ pub mod root {
                     gfxFontFeatureValueSet_FeatureValueHashKey ) , "::" ,
                     stringify ! ( mName ) ));
     }
     #[repr(C)]
     #[derive(Debug)]
     pub struct gfxFontFeatureValueSet_FeatureValueHashEntry {
         pub _base: root::PLDHashEntryHdr,
         pub mKey: root::gfxFontFeatureValueSet_FeatureValueHashKey,
-        pub mValues: root::nsTArray<::std::os::raw::c_uint>,
+        pub mValues: root::nsTArray<u32>,
     }
     pub type gfxFontFeatureValueSet_FeatureValueHashEntry_KeyType =
         *const root::gfxFontFeatureValueSet_FeatureValueHashKey;
     pub type gfxFontFeatureValueSet_FeatureValueHashEntry_KeyTypePointer =
         *const root::gfxFontFeatureValueSet_FeatureValueHashKey;
     pub const gfxFontFeatureValueSet_FeatureValueHashEntry_ALLOW_MEMMOVE:
               root::gfxFontFeatureValueSet_FeatureValueHashEntry__bindgen_ty_1
               =
@@ -11688,17 +11722,17 @@ pub mod root {
         pub stretch: i16,
         pub kerning: u8,
         pub synthesis: u8,
         pub size: root::nscoord,
         pub sizeAdjust: f32,
         pub alternateValues: root::nsTArray<root::gfxAlternateValue>,
         pub featureValueLookup: root::RefPtr<root::gfxFontFeatureValueSet>,
         pub fontFeatureSettings: root::nsTArray<root::gfxFontFeature>,
-        pub fontVariationSettings: root::nsTArray<root::mozilla::gfx::FontVariation>,
+        pub fontVariationSettings: root::nsTArray<root::gfxFontVariation>,
         pub languageOverride: u32,
     }
     #[test]
     fn bindgen_test_layout_nsFont() {
         assert_eq!(::std::mem::size_of::<nsFont>() , 88usize , concat ! (
                    "Size of: " , stringify ! ( nsFont ) ));
         assert_eq! (::std::mem::align_of::<nsFont>() , 8usize , concat ! (
                     "Alignment of " , stringify ! ( nsFont ) ));
@@ -12282,16 +12316,140 @@ pub mod root {
     /// to be set on the frames.
     ///
     /// NOTE: When adding new restyle hints, please also add them to
     /// RestyleManager::RestyleHintToString.
     #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
     pub struct nsRestyleHint(pub u32);
     #[repr(C)]
     #[derive(Debug)]
+    pub struct nsAtom {
+        pub mRefCnt: root::mozilla::ThreadSafeAutoRefCnt,
+        pub _bitfield_1: u32,
+        pub mHash: u32,
+        pub mString: *mut u16,
+    }
+    #[repr(u8)]
+    #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
+    pub enum nsAtom_AtomKind {
+        DynamicAtom = 0,
+        StaticAtom = 1,
+        HTML5Atom = 2,
+    }
+    pub type nsAtom_HasThreadSafeRefCnt = root::mozilla::TrueType;
+    #[test]
+    fn bindgen_test_layout_nsAtom() {
+        assert_eq!(::std::mem::size_of::<nsAtom>() , 24usize , concat ! (
+                   "Size of: " , stringify ! ( nsAtom ) ));
+        assert_eq! (::std::mem::align_of::<nsAtom>() , 8usize , concat ! (
+                    "Alignment of " , stringify ! ( nsAtom ) ));
+        assert_eq! (unsafe {
+                    & ( * ( 0 as * const nsAtom ) ) . mRefCnt as * const _ as
+                    usize } , 0usize , concat ! (
+                    "Alignment of field: " , stringify ! ( nsAtom ) , "::" ,
+                    stringify ! ( mRefCnt ) ));
+        assert_eq! (unsafe {
+                    & ( * ( 0 as * const nsAtom ) ) . mHash as * const _ as
+                    usize } , 12usize , concat ! (
+                    "Alignment of field: " , stringify ! ( nsAtom ) , "::" ,
+                    stringify ! ( mHash ) ));
+        assert_eq! (unsafe {
+                    & ( * ( 0 as * const nsAtom ) ) . mString as * const _ as
+                    usize } , 16usize , concat ! (
+                    "Alignment of field: " , stringify ! ( nsAtom ) , "::" ,
+                    stringify ! ( mString ) ));
+    }
+    impl nsAtom {
+        #[inline]
+        pub fn mLength(&self) -> u32 {
+            let mut unit_field_val: u32 =
+                unsafe { ::std::mem::uninitialized() };
+            unsafe {
+                ::std::ptr::copy_nonoverlapping(&self._bitfield_1 as *const _
+                                                    as *const u8,
+                                                &mut unit_field_val as
+                                                    *mut u32 as *mut u8,
+                                                ::std::mem::size_of::<u32>())
+            };
+            let mask = 1073741823u64 as u32;
+            let val = (unit_field_val & mask) >> 0usize;
+            unsafe { ::std::mem::transmute(val as u32) }
+        }
+        #[inline]
+        pub fn set_mLength(&mut self, val: u32) {
+            let mask = 1073741823u64 as u32;
+            let val = val as u32 as u32;
+            let mut unit_field_val: u32 =
+                unsafe { ::std::mem::uninitialized() };
+            unsafe {
+                ::std::ptr::copy_nonoverlapping(&self._bitfield_1 as *const _
+                                                    as *const u8,
+                                                &mut unit_field_val as
+                                                    *mut u32 as *mut u8,
+                                                ::std::mem::size_of::<u32>())
+            };
+            unit_field_val &= !mask;
+            unit_field_val |= (val << 0usize) & mask;
+            unsafe {
+                ::std::ptr::copy_nonoverlapping(&unit_field_val as *const _ as
+                                                    *const u8,
+                                                &mut self._bitfield_1 as
+                                                    *mut _ as *mut u8,
+                                                ::std::mem::size_of::<u32>());
+            }
+        }
+        #[inline]
+        pub fn mKind(&self) -> u32 {
+            let mut unit_field_val: u32 =
+                unsafe { ::std::mem::uninitialized() };
+            unsafe {
+                ::std::ptr::copy_nonoverlapping(&self._bitfield_1 as *const _
+                                                    as *const u8,
+                                                &mut unit_field_val as
+                                                    *mut u32 as *mut u8,
+                                                ::std::mem::size_of::<u32>())
+            };
+            let mask = 3221225472u64 as u32;
+            let val = (unit_field_val & mask) >> 30usize;
+            unsafe { ::std::mem::transmute(val as u32) }
+        }
+        #[inline]
+        pub fn set_mKind(&mut self, val: u32) {
+            let mask = 3221225472u64 as u32;
+            let val = val as u32 as u32;
+            let mut unit_field_val: u32 =
+                unsafe { ::std::mem::uninitialized() };
+            unsafe {
+                ::std::ptr::copy_nonoverlapping(&self._bitfield_1 as *const _
+                                                    as *const u8,
+                                                &mut unit_field_val as
+                                                    *mut u32 as *mut u8,
+                                                ::std::mem::size_of::<u32>())
+            };
+            unit_field_val &= !mask;
+            unit_field_val |= (val << 30usize) & mask;
+            unsafe {
+                ::std::ptr::copy_nonoverlapping(&unit_field_val as *const _ as
+                                                    *const u8,
+                                                &mut self._bitfield_1 as
+                                                    *mut _ as *mut u8,
+                                                ::std::mem::size_of::<u32>());
+            }
+        }
+        #[inline]
+        pub fn new_bitfield_1(mLength: u32, mKind: u32) -> u32 {
+            ({
+                 ({ 0 } |
+                      ((mLength as u32 as u32) << 0usize) &
+                          (1073741823u64 as u32))
+             } | ((mKind as u32 as u32) << 30usize) & (3221225472u64 as u32))
+        }
+    }
+    #[repr(C)]
+    #[derive(Debug)]
     pub struct nsStyleFont {
         pub mFont: root::nsFont,
         pub mSize: root::nscoord,
         pub mFontSizeFactor: f32,
         pub mFontSizeOffset: root::nscoord,
         pub mFontSizeKeyword: u8,
         pub mGenericID: u8,
         pub mScriptLevel: i8,
@@ -14691,140 +14849,16 @@ pub mod root {
                     "::" , stringify ! ( mRefCount ) ));
         assert_eq! (unsafe {
                     & ( * ( 0 as * const nsStringBuffer ) ) . mStorageSize as
                     * const _ as usize } , 4usize , concat ! (
                     "Alignment of field: " , stringify ! ( nsStringBuffer ) ,
                     "::" , stringify ! ( mStorageSize ) ));
     }
     #[repr(C)]
-    #[derive(Debug)]
-    pub struct nsAtom {
-        pub mRefCnt: root::mozilla::ThreadSafeAutoRefCnt,
-        pub _bitfield_1: u32,
-        pub mHash: u32,
-        pub mString: *mut u16,
-    }
-    #[repr(u8)]
-    #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-    pub enum nsAtom_AtomKind {
-        DynamicAtom = 0,
-        StaticAtom = 1,
-        HTML5Atom = 2,
-    }
-    pub type nsAtom_HasThreadSafeRefCnt = root::mozilla::TrueType;
-    #[test]
-    fn bindgen_test_layout_nsAtom() {
-        assert_eq!(::std::mem::size_of::<nsAtom>() , 24usize , concat ! (
-                   "Size of: " , stringify ! ( nsAtom ) ));
-        assert_eq! (::std::mem::align_of::<nsAtom>() , 8usize , concat ! (
-                    "Alignment of " , stringify ! ( nsAtom ) ));
-        assert_eq! (unsafe {
-                    & ( * ( 0 as * const nsAtom ) ) . mRefCnt as * const _ as
-                    usize } , 0usize , concat ! (
-                    "Alignment of field: " , stringify ! ( nsAtom ) , "::" ,
-                    stringify ! ( mRefCnt ) ));
-        assert_eq! (unsafe {
-                    & ( * ( 0 as * const nsAtom ) ) . mHash as * const _ as
-                    usize } , 12usize , concat ! (
-                    "Alignment of field: " , stringify ! ( nsAtom ) , "::" ,
-                    stringify ! ( mHash ) ));
-        assert_eq! (unsafe {
-                    & ( * ( 0 as * const nsAtom ) ) . mString as * const _ as
-                    usize } , 16usize , concat ! (
-                    "Alignment of field: " , stringify ! ( nsAtom ) , "::" ,
-                    stringify ! ( mString ) ));
-    }
-    impl nsAtom {
-        #[inline]
-        pub fn mLength(&self) -> u32 {
-            let mut unit_field_val: u32 =
-                unsafe { ::std::mem::uninitialized() };
-            unsafe {
-                ::std::ptr::copy_nonoverlapping(&self._bitfield_1 as *const _
-                                                    as *const u8,
-                                                &mut unit_field_val as
-                                                    *mut u32 as *mut u8,
-                                                ::std::mem::size_of::<u32>())
-            };
-            let mask = 1073741823u64 as u32;
-            let val = (unit_field_val & mask) >> 0usize;
-            unsafe { ::std::mem::transmute(val as u32) }
-        }
-        #[inline]
-        pub fn set_mLength(&mut self, val: u32) {
-            let mask = 1073741823u64 as u32;
-            let val = val as u32 as u32;
-            let mut unit_field_val: u32 =
-                unsafe { ::std::mem::uninitialized() };
-            unsafe {
-                ::std::ptr::copy_nonoverlapping(&self._bitfield_1 as *const _
-                                                    as *const u8,
-                                                &mut unit_field_val as
-                                                    *mut u32 as *mut u8,
-                                                ::std::mem::size_of::<u32>())
-            };
-            unit_field_val &= !mask;
-            unit_field_val |= (val << 0usize) & mask;
-            unsafe {
-                ::std::ptr::copy_nonoverlapping(&unit_field_val as *const _ as
-                                                    *const u8,
-                                                &mut self._bitfield_1 as
-                                                    *mut _ as *mut u8,
-                                                ::std::mem::size_of::<u32>());
-            }
-        }
-        #[inline]
-        pub fn mKind(&self) -> u32 {
-            let mut unit_field_val: u32 =
-                unsafe { ::std::mem::uninitialized() };
-            unsafe {
-                ::std::ptr::copy_nonoverlapping(&self._bitfield_1 as *const _
-                                                    as *const u8,
-                                                &mut unit_field_val as
-                                                    *mut u32 as *mut u8,
-                                                ::std::mem::size_of::<u32>())
-            };
-            let mask = 3221225472u64 as u32;
-            let val = (unit_field_val & mask) >> 30usize;
-            unsafe { ::std::mem::transmute(val as u32) }
-        }
-        #[inline]
-        pub fn set_mKind(&mut self, val: u32) {
-            let mask = 3221225472u64 as u32;
-            let val = val as u32 as u32;
-            let mut unit_field_val: u32 =
-                unsafe { ::std::mem::uninitialized() };
-            unsafe {
-                ::std::ptr::copy_nonoverlapping(&self._bitfield_1 as *const _
-                                                    as *const u8,
-                                                &mut unit_field_val as
-                                                    *mut u32 as *mut u8,
-                                                ::std::mem::size_of::<u32>())
-            };
-            unit_field_val &= !mask;
-            unit_field_val |= (val << 30usize) & mask;
-            unsafe {
-                ::std::ptr::copy_nonoverlapping(&unit_field_val as *const _ as
-                                                    *const u8,
-                                                &mut self._bitfield_1 as
-                                                    *mut _ as *mut u8,
-                                                ::std::mem::size_of::<u32>());
-            }
-        }
-        #[inline]
-        pub fn new_bitfield_1(mLength: u32, mKind: u32) -> u32 {
-            ({
-                 ({ 0 } |
-                      ((mLength as u32 as u32) << 0usize) &
-                          (1073741823u64 as u32))
-             } | ((mKind as u32 as u32) << 30usize) & (3221225472u64 as u32))
-        }
-    }
-    #[repr(C)]
     #[derive(Debug, Copy)]
     pub struct nsIPrincipal {
         pub _base: root::nsISerializable,
     }
     #[repr(C)]
     #[derive(Debug, Copy, Clone)]
     pub struct nsIPrincipal_COMTypeInfo {
         pub _address: u8,
@@ -15223,17 +15257,17 @@ pub mod root {
     #[derive(Debug)]
     pub struct nsINode_nsSlots {
         pub vtable_: *const nsINode_nsSlots__bindgen_vtable,
         /// A list of mutation observers
         pub mMutationObservers: [u64; 4usize],
         /// An object implementing nsIDOMNodeList for this content (childNodes)
         /// @see nsIDOMNodeList
         /// @see nsGenericHTMLElement::GetChildNodes
-        pub mChildNodes: root::RefPtr<root::nsAttrChildContentList>,
+        pub mChildNodes: root::RefPtr<root::nsChildContentList>,
         /// Weak reference to this node.  This is cleared by the destructor of
         /// nsNodeWeakReference.
         pub mWeakReference: *mut root::nsNodeWeakReference,
         /// A set of ranges which are in the selection and which have this node as
         /// their endpoints' common ancestor.  This is a UniquePtr instead of just a
         /// LinkedList, because that prevents us from pushing DOMSlots up to the next
         /// allocation bucket size, at the cost of some complexity.
         pub mCommonAncestorRanges: root::mozilla::UniquePtr<root::mozilla::LinkedList>,
@@ -15960,17 +15994,18 @@ pub mod root {
     }
     #[repr(C)]
     #[derive(Debug)]
     pub struct nsIDocument {
         pub _base: root::nsINode,
         pub _base_1: root::mozilla::dom::DispatcherTrait,
         pub mDeprecationWarnedAbout: u64,
         pub mDocWarningWarnedAbout: u64,
-        pub mSelectorCache: root::nsAutoPtr<root::nsIDocument_SelectorCache>,
+        pub mServoSelectorCache: root::mozilla::UniquePtr<root::nsIDocument_SelectorCache>,
+        pub mGeckoSelectorCache: root::mozilla::UniquePtr<root::nsIDocument_SelectorCache>,
         pub mReferrer: root::nsCString,
         pub mLastModified: ::nsstring::nsStringRepr,
         pub mDocumentURI: root::nsCOMPtr,
         pub mOriginalURI: root::nsCOMPtr,
         pub mChromeXHRDocURI: root::nsCOMPtr,
         pub mDocumentBaseURI: root::nsCOMPtr,
         pub mChromeXHRDocBaseURI: root::nsCOMPtr,
         pub mCachedURLData: root::RefPtr<root::mozilla::URLExtraData>,
@@ -15978,17 +16013,17 @@ pub mod root {
         pub mReferrerPolicySet: bool,
         pub mReferrerPolicy: root::nsIDocument_ReferrerPolicyEnum,
         pub mBlockAllMixedContent: bool,
         pub mBlockAllMixedContentPreloads: bool,
         pub mUpgradeInsecureRequests: bool,
         pub mUpgradeInsecurePreloads: bool,
         pub mHSTSPrimingURIList: [u64; 4usize],
         pub mDocumentContainer: u64,
-        pub mCharacterSet: root::mozilla::NotNull<*const root::mozilla::Encoding>,
+        pub mCharacterSet: root::mozilla::NotNull<*const root::nsIDocument_Encoding>,
         pub mCharacterSetSource: i32,
         pub mParentDocument: *mut root::nsIDocument,
         pub mCachedRootElement: *mut root::mozilla::dom::Element,
         pub mNodeInfoManager: *mut root::nsNodeInfoManager,
         pub mCSSLoader: root::RefPtr<root::mozilla::css::Loader>,
         pub mStyleImageLoader: root::RefPtr<root::mozilla::css::ImageLoader>,
         pub mAttrStyleSheet: root::RefPtr<root::nsHTMLStyleSheet>,
         pub mStyleAttrStyleSheet: root::RefPtr<root::nsHTMLCSSStyleSheet>,
@@ -16027,17 +16062,17 @@ pub mod root {
         pub mDisplayDocument: root::nsCOMPtr,
         pub mEventsSuppressed: u32,
         /// The number number of external scripts (ones with the src attribute) that
         /// have this document as their owner and that are being evaluated right now.
         pub mExternalScriptsBeingEvaluated: u32,
         /// The current frame request callback handle
         pub mFrameRequestCallbackCounter: i32,
         pub mStaticCloneCount: u32,
-        pub mBlockedTrackingNodes: root::nsTArray<root::nsCOMPtr>,
+        pub mBlockedTrackingNodes: root::nsTArray<root::nsWeakPtr>,
         pub mWindow: *mut root::nsPIDOMWindowInner,
         pub mCachedEncoder: root::nsCOMPtr,
         pub mFrameRequestCallbacks: root::nsTArray<root::nsIDocument_FrameRequest>,
         pub mBFCacheEntry: *mut root::nsIBFCacheEntry,
         pub mBaseTarget: ::nsstring::nsStringRepr,
         pub mStateObjectContainer: root::nsCOMPtr,
         pub mStateObjectCached: root::nsCOMPtr,
         pub mInSyncOperationCount: u32,
@@ -16050,16 +16085,17 @@ pub mod root {
         pub mNotifiedPageForUseCounter: [u64; 2usize],
         pub mIncCounters: u16,
         pub mUserHasInteracted: bool,
         pub mPageUnloadingEventTimeStamp: root::mozilla::TimeStamp,
         pub mDocGroup: root::RefPtr<root::mozilla::dom::DocGroup>,
         pub mTrackingScripts: [u64; 4usize],
         pub mBufferedCSPViolations: root::nsTArray<root::nsCOMPtr>,
         pub mAncestorPrincipals: root::nsTArray<root::nsCOMPtr>,
+        pub mAncestorOuterWindowIDs: root::nsTArray<u64>,
         pub mServoRestyleRoot: root::nsCOMPtr,
         pub mServoRestyleRootDirtyBits: u32,
     }
     pub type nsIDocument_GlobalObject = root::mozilla::dom::GlobalObject;
     pub type nsIDocument_Encoding = root::mozilla::Encoding;
     pub type nsIDocument_NotNull<T> = root::mozilla::NotNull<T>;
     pub use self::super::root::mozilla::net::ReferrerPolicy as
             nsIDocument_ReferrerPolicyEnum;
@@ -16311,57 +16347,48 @@ pub mod root {
         Doc_Theme_Dark = 3,
         Doc_Theme_Bright = 4,
     }
     pub type nsIDocument_FrameRequestCallbackList =
         root::nsTArray<root::RefPtr<root::mozilla::dom::FrameRequestCallback>>;
     #[repr(u32)]
     #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
     pub enum nsIDocument_DeprecatedOperations {
-        eGetAttributeNode = 0,
-        eSetAttributeNode = 1,
-        eGetAttributeNodeNS = 2,
-        eSetAttributeNodeNS = 3,
-        eRemoveAttributeNode = 4,
-        eCreateAttribute = 5,
-        eCreateAttributeNS = 6,
-        eNodeValue = 7,
-        eTextContent = 8,
-        eEnablePrivilege = 9,
-        eDOMExceptionCode = 10,
-        eMutationEvent = 11,
-        eComponents = 12,
-        ePrefixedVisibilityAPI = 13,
-        eNodeIteratorDetach = 14,
-        eLenientThis = 15,
-        eGetPreventDefault = 16,
-        eGetSetUserData = 17,
-        eMozGetAsFile = 18,
-        eUseOfCaptureEvents = 19,
-        eUseOfReleaseEvents = 20,
-        eUseOfDOM3LoadMethod = 21,
-        eChromeUseOfDOM3LoadMethod = 22,
-        eShowModalDialog = 23,
-        eSyncXMLHttpRequest = 24,
-        eWindow_Cc_ontrollers = 25,
-        eImportXULIntoContent = 26,
-        ePannerNodeDoppler = 27,
-        eNavigatorGetUserMedia = 28,
-        eWebrtcDeprecatedPrefix = 29,
-        eRTCPeerConnectionGetStreams = 30,
-        eAppCache = 31,
-        ePrefixedImageSmoothingEnabled = 32,
-        ePrefixedFullscreenAPI = 33,
-        eLenientSetter = 34,
-        eFileLastModifiedDate = 35,
-        eImageBitmapRenderingContext_TransferImageBitmap = 36,
-        eURLCreateObjectURL_MediaStream = 37,
-        eXMLBaseAttribute = 38,
-        eWindowContentUntrusted = 39,
-        eDeprecatedOperationCount = 40,
+        eEnablePrivilege = 0,
+        eDOMExceptionCode = 1,
+        eMutationEvent = 2,
+        eComponents = 3,
+        ePrefixedVisibilityAPI = 4,
+        eNodeIteratorDetach = 5,
+        eLenientThis = 6,
+        eGetPreventDefault = 7,
+        eGetSetUserData = 8,
+        eMozGetAsFile = 9,
+        eUseOfCaptureEvents = 10,
+        eUseOfReleaseEvents = 11,
+        eUseOfDOM3LoadMethod = 12,
+        eChromeUseOfDOM3LoadMethod = 13,
+        eShowModalDialog = 14,
+        eSyncXMLHttpRequest = 15,
+        eWindow_Cc_ontrollers = 16,
+        eImportXULIntoContent = 17,
+        ePannerNodeDoppler = 18,
+        eNavigatorGetUserMedia = 19,
+        eWebrtcDeprecatedPrefix = 20,
+        eRTCPeerConnectionGetStreams = 21,
+        eAppCache = 22,
+        ePrefixedImageSmoothingEnabled = 23,
+        ePrefixedFullscreenAPI = 24,
+        eLenientSetter = 25,
+        eFileLastModifiedDate = 26,
+        eImageBitmapRenderingContext_TransferImageBitmap = 27,
+        eURLCreateObjectURL_MediaStream = 28,
+        eXMLBaseAttribute = 29,
+        eWindowContentUntrusted = 30,
+        eDeprecatedOperationCount = 31,
     }
     #[repr(u32)]
     #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
     pub enum nsIDocument_DocumentWarnings {
         eIgnoringWillChangeOverBudget = 0,
         ePreventDefaultFromPassiveListener = 1,
         eSVGRefLoop = 2,
         eSVGRefChainLengthExceeded = 3,
@@ -16408,17 +16435,17 @@ pub mod root {
     #[repr(C)]
     #[derive(Debug, Copy, Clone)]
     pub struct nsIDocument_FrameRequest {
         _unused: [u8; 0],
     }
     pub const nsIDocument_kSegmentSize: usize = 128;
     #[test]
     fn bindgen_test_layout_nsIDocument() {
-        assert_eq!(::std::mem::size_of::<nsIDocument>() , 872usize , concat !
+        assert_eq!(::std::mem::size_of::<nsIDocument>() , 888usize , concat !
                    ( "Size of: " , stringify ! ( nsIDocument ) ));
         assert_eq! (::std::mem::align_of::<nsIDocument>() , 8usize , concat !
                     ( "Alignment of " , stringify ! ( nsIDocument ) ));
     }
     impl nsIDocument {
         #[inline]
         pub fn mBidiEnabled(&self) -> bool {
             let mut unit_field_val: u64 =
@@ -19040,17 +19067,17 @@ pub mod root {
         _unused: [u8; 0],
     }
     #[repr(C)]
     #[derive(Debug)]
     pub struct nsBindingManager {
         pub _base: root::nsStubMutationObserver,
         pub mRefCnt: root::nsCycleCollectingAutoRefCnt,
         pub mBoundContentSet: u64,
-        pub mWrapperTable: u64,
+        pub mWrapperTable: root::nsAutoPtr<root::nsBindingManager_WrapperHashtable>,
         pub mDocumentTable: u64,
         pub mLoadingDocTable: u64,
         pub mAttachedStack: root::nsBindingList,
         pub mProcessingAttachedStack: bool,
         pub mDestroyed: bool,
         pub mAttachedStackSizeOnOutermost: u32,
         pub mProcessAttachedQueueEvent: u64,
         pub mDocument: *mut root::nsIDocument,
@@ -19326,24 +19353,16 @@ pub mod root {
     /// 2. any *child* style contexts (this might be the reverse of
     /// expectation, but it makes sense in this case)
     #[repr(C)]
     #[derive(Debug)]
     pub struct nsStyleContext {
         pub mPseudoTag: root::RefPtr<root::nsAtom>,
         pub mBits: u64,
     }
-    pub const nsStyleContext_kAllResolvedStructs:
-              root::nsStyleContext__bindgen_ty_1 =
-        nsStyleContext__bindgen_ty_1::kAllResolvedStructs;
-    #[repr(u32)]
-    #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-    pub enum nsStyleContext__bindgen_ty_1 {
-        kAllResolvedStructs = 4294967295,
-    }
     #[test]
     fn bindgen_test_layout_nsStyleContext() {
         assert_eq!(::std::mem::size_of::<nsStyleContext>() , 16usize , concat
                    ! ( "Size of: " , stringify ! ( nsStyleContext ) ));
         assert_eq! (::std::mem::align_of::<nsStyleContext>() , 8usize , concat
                     ! ( "Alignment of " , stringify ! ( nsStyleContext ) ));
         assert_eq! (unsafe {
                     & ( * ( 0 as * const nsStyleContext ) ) . mPseudoTag as *
@@ -22734,17 +22753,17 @@ pub mod root {
     pub type nsTObserverArray_base_type = u8;
     pub type nsTObserverArray_size_type =
         root::nsTObserverArray_base_size_type;
     #[repr(C)]
     #[derive(Debug)]
     pub struct nsIGlobalObject {
         pub _base: root::nsISupports,
         pub _base_1: root::mozilla::dom::DispatcherTrait,
-        pub mHostObjectURIs: root::nsTArray<root::nsTString<::std::os::raw::c_char>>,
+        pub mHostObjectURIs: root::nsTArray<root::nsCString>,
         pub mIsDying: bool,
     }
     #[repr(C)]
     #[derive(Debug, Copy, Clone)]
     pub struct nsIGlobalObject_COMTypeInfo {
         pub _address: u8,
     }
     #[test]
@@ -22848,17 +22867,17 @@ pub mod root {
         assert_eq! (unsafe {
                     & ( * ( 0 as * const nsAttrAndChildArray ) ) . mImpl as *
                     const _ as usize } , 0usize , concat ! (
                     "Alignment of field: " , stringify ! ( nsAttrAndChildArray
                     ) , "::" , stringify ! ( mImpl ) ));
     }
     #[repr(C)]
     #[derive(Debug, Copy, Clone)]
-    pub struct nsAttrChildContentList {
+    pub struct nsChildContentList {
         _unused: [u8; 0],
     }
     #[repr(C)]
     #[derive(Debug, Copy, Clone)]
     pub struct nsCSSSelectorList {
         _unused: [u8; 0],
     }
     #[repr(C)]
@@ -24141,67 +24160,67 @@ pub mod root {
     pub struct nsRange {
         _unused: [u8; 0],
     }
     #[repr(C)]
     #[derive(Debug, Copy, Clone)]
     pub struct RawServoSelectorList {
         _unused: [u8; 0],
     }
-    pub const NODE_HAS_LISTENERMANAGER: root::_bindgen_ty_83 =
-        _bindgen_ty_83::NODE_HAS_LISTENERMANAGER;
-    pub const NODE_HAS_PROPERTIES: root::_bindgen_ty_83 =
-        _bindgen_ty_83::NODE_HAS_PROPERTIES;
-    pub const NODE_IS_ANONYMOUS_ROOT: root::_bindgen_ty_83 =
-        _bindgen_ty_83::NODE_IS_ANONYMOUS_ROOT;
-    pub const NODE_IS_IN_NATIVE_ANONYMOUS_SUBTREE: root::_bindgen_ty_83 =
-        _bindgen_ty_83::NODE_IS_IN_NATIVE_ANONYMOUS_SUBTREE;
-    pub const NODE_IS_NATIVE_ANONYMOUS_ROOT: root::_bindgen_ty_83 =
-        _bindgen_ty_83::NODE_IS_NATIVE_ANONYMOUS_ROOT;
-    pub const NODE_FORCE_XBL_BINDINGS: root::_bindgen_ty_83 =
-        _bindgen_ty_83::NODE_FORCE_XBL_BINDINGS;
-    pub const NODE_MAY_BE_IN_BINDING_MNGR: root::_bindgen_ty_83 =
-        _bindgen_ty_83::NODE_MAY_BE_IN_BINDING_MNGR;
-    pub const NODE_IS_EDITABLE: root::_bindgen_ty_83 =
-        _bindgen_ty_83::NODE_IS_EDITABLE;
-    pub const NODE_IS_NATIVE_ANONYMOUS: root::_bindgen_ty_83 =
-        _bindgen_ty_83::NODE_IS_NATIVE_ANONYMOUS;
-    pub const NODE_IS_IN_SHADOW_TREE: root::_bindgen_ty_83 =
-        _bindgen_ty_83::NODE_IS_IN_SHADOW_TREE;
-    pub const NODE_HAS_EMPTY_SELECTOR: root::_bindgen_ty_83 =
-        _bindgen_ty_83::NODE_HAS_EMPTY_SELECTOR;
-    pub const NODE_HAS_SLOW_SELECTOR: root::_bindgen_ty_83 =
-        _bindgen_ty_83::NODE_HAS_SLOW_SELECTOR;
-    pub const NODE_HAS_EDGE_CHILD_SELECTOR: root::_bindgen_ty_83 =
-        _bindgen_ty_83::NODE_HAS_EDGE_CHILD_SELECTOR;
-    pub const NODE_HAS_SLOW_SELECTOR_LATER_SIBLINGS: root::_bindgen_ty_83 =
-        _bindgen_ty_83::NODE_HAS_SLOW_SELECTOR_LATER_SIBLINGS;
-    pub const NODE_ALL_SELECTOR_FLAGS: root::_bindgen_ty_83 =
-        _bindgen_ty_83::NODE_ALL_SELECTOR_FLAGS;
-    pub const NODE_NEEDS_FRAME: root::_bindgen_ty_83 =
-        _bindgen_ty_83::NODE_NEEDS_FRAME;
-    pub const NODE_DESCENDANTS_NEED_FRAMES: root::_bindgen_ty_83 =
-        _bindgen_ty_83::NODE_DESCENDANTS_NEED_FRAMES;
-    pub const NODE_HAS_ACCESSKEY: root::_bindgen_ty_83 =
-        _bindgen_ty_83::NODE_HAS_ACCESSKEY;
-    pub const NODE_HAS_DIRECTION_RTL: root::_bindgen_ty_83 =
-        _bindgen_ty_83::NODE_HAS_DIRECTION_RTL;
-    pub const NODE_HAS_DIRECTION_LTR: root::_bindgen_ty_83 =
-        _bindgen_ty_83::NODE_HAS_DIRECTION_LTR;
-    pub const NODE_ALL_DIRECTION_FLAGS: root::_bindgen_ty_83 =
-        _bindgen_ty_83::NODE_ALL_DIRECTION_FLAGS;
-    pub const NODE_CHROME_ONLY_ACCESS: root::_bindgen_ty_83 =
-        _bindgen_ty_83::NODE_CHROME_ONLY_ACCESS;
-    pub const NODE_IS_ROOT_OF_CHROME_ONLY_ACCESS: root::_bindgen_ty_83 =
-        _bindgen_ty_83::NODE_IS_ROOT_OF_CHROME_ONLY_ACCESS;
-    pub const NODE_TYPE_SPECIFIC_BITS_OFFSET: root::_bindgen_ty_83 =
-        _bindgen_ty_83::NODE_TYPE_SPECIFIC_BITS_OFFSET;
-    #[repr(u32)]
-    #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-    pub enum _bindgen_ty_83 {
+    pub const NODE_HAS_LISTENERMANAGER: root::_bindgen_ty_77 =
+        _bindgen_ty_77::NODE_HAS_LISTENERMANAGER;
+    pub const NODE_HAS_PROPERTIES: root::_bindgen_ty_77 =
+        _bindgen_ty_77::NODE_HAS_PROPERTIES;
+    pub const NODE_IS_ANONYMOUS_ROOT: root::_bindgen_ty_77 =
+        _bindgen_ty_77::NODE_IS_ANONYMOUS_ROOT;
+    pub const NODE_IS_IN_NATIVE_ANONYMOUS_SUBTREE: root::_bindgen_ty_77 =
+        _bindgen_ty_77::NODE_IS_IN_NATIVE_ANONYMOUS_SUBTREE;
+    pub const NODE_IS_NATIVE_ANONYMOUS_ROOT: root::_bindgen_ty_77 =
+        _bindgen_ty_77::NODE_IS_NATIVE_ANONYMOUS_ROOT;
+    pub const NODE_FORCE_XBL_BINDINGS: root::_bindgen_ty_77 =
+        _bindgen_ty_77::NODE_FORCE_XBL_BINDINGS;
+    pub const NODE_MAY_BE_IN_BINDING_MNGR: root::_bindgen_ty_77 =
+        _bindgen_ty_77::NODE_MAY_BE_IN_BINDING_MNGR;
+    pub const NODE_IS_EDITABLE: root::_bindgen_ty_77 =
+        _bindgen_ty_77::NODE_IS_EDITABLE;
+    pub const NODE_IS_NATIVE_ANONYMOUS: root::_bindgen_ty_77 =
+        _bindgen_ty_77::NODE_IS_NATIVE_ANONYMOUS;
+    pub const NODE_IS_IN_SHADOW_TREE: root::_bindgen_ty_77 =
+        _bindgen_ty_77::NODE_IS_IN_SHADOW_TREE;
+    pub const NODE_HAS_EMPTY_SELECTOR: root::_bindgen_ty_77 =
+        _bindgen_ty_77::NODE_HAS_EMPTY_SELECTOR;
+    pub const NODE_HAS_SLOW_SELECTOR: root::_bindgen_ty_77 =
+        _bindgen_ty_77::NODE_HAS_SLOW_SELECTOR;
+    pub const NODE_HAS_EDGE_CHILD_SELECTOR: root::_bindgen_ty_77 =
+        _bindgen_ty_77::NODE_HAS_EDGE_CHILD_SELECTOR;
+    pub const NODE_HAS_SLOW_SELECTOR_LATER_SIBLINGS: root::_bindgen_ty_77 =
+        _bindgen_ty_77::NODE_HAS_SLOW_SELECTOR_LATER_SIBLINGS;
+    pub const NODE_ALL_SELECTOR_FLAGS: root::_bindgen_ty_77 =
+        _bindgen_ty_77::NODE_ALL_SELECTOR_FLAGS;
+    pub const NODE_NEEDS_FRAME: root::_bindgen_ty_77 =
+        _bindgen_ty_77::NODE_NEEDS_FRAME;
+    pub const NODE_DESCENDANTS_NEED_FRAMES: root::_bindgen_ty_77 =
+        _bindgen_ty_77::NODE_DESCENDANTS_NEED_FRAMES;
+    pub const NODE_HAS_ACCESSKEY: root::_bindgen_ty_77 =
+        _bindgen_ty_77::NODE_HAS_ACCESSKEY;
+    pub const NODE_HAS_DIRECTION_RTL: root::_bindgen_ty_77 =
+        _bindgen_ty_77::NODE_HAS_DIRECTION_RTL;
+    pub const NODE_HAS_DIRECTION_LTR: root::_bindgen_ty_77 =
+        _bindgen_ty_77::NODE_HAS_DIRECTION_LTR;
+    pub const NODE_ALL_DIRECTION_FLAGS: root::_bindgen_ty_77 =
+        _bindgen_ty_77::NODE_ALL_DIRECTION_FLAGS;
+    pub const NODE_CHROME_ONLY_ACCESS: root::_bindgen_ty_77 =
+        _bindgen_ty_77::NODE_CHROME_ONLY_ACCESS;
+    pub const NODE_IS_ROOT_OF_CHROME_ONLY_ACCESS: root::_bindgen_ty_77 =
+        _bindgen_ty_77::NODE_IS_ROOT_OF_CHROME_ONLY_ACCESS;
+    pub const NODE_TYPE_SPECIFIC_BITS_OFFSET: root::_bindgen_ty_77 =
+        _bindgen_ty_77::NODE_TYPE_SPECIFIC_BITS_OFFSET;
+    #[repr(u32)]
+    #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
+    pub enum _bindgen_ty_77 {
         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,
@@ -26069,16 +26088,21 @@ pub mod root {
                     , stringify ! ( mUnit ) ));
         assert_eq! (unsafe {
                     & ( * ( 0 as * const nsCSSValue ) ) . mValue as * const _
                     as usize } , 8usize , concat ! (
                     "Alignment of field: " , stringify ! ( nsCSSValue ) , "::"
                     , stringify ! ( mValue ) ));
     }
     #[repr(C)]
+    #[derive(Debug, Copy, Clone)]
+    pub struct nsSimpleContentList {
+        _unused: [u8; 0],
+    }
+    #[repr(C)]
     #[derive(Debug, Copy)]
     pub struct nsTimingFunction {
         pub mType: root::nsTimingFunction_Type,
         pub __bindgen_anon_1: root::nsTimingFunction__bindgen_ty_1,
     }
     #[repr(i32)]
     #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
     pub enum nsTimingFunction_Type {
@@ -26228,17 +26252,17 @@ pub mod root {
     pub type RawGeckoXBLBinding = root::nsXBLBinding;
     pub type RawGeckoURLExtraData = root::mozilla::URLExtraData;
     pub type RawGeckoServoAnimationValueList =
         root::nsTArray<root::RefPtr<root::RawServoAnimationValue>>;
     pub type RawGeckoKeyframeList = root::nsTArray<root::mozilla::Keyframe>;
     pub type RawGeckoPropertyValuePairList =
         root::nsTArray<root::mozilla::PropertyValuePair>;
     pub type RawGeckoComputedKeyframeValuesList =
-        root::nsTArray<root::nsTArray<root::mozilla::PropertyStyleAnimationValuePair>>;
+        root::nsTArray<root::mozilla::ComputedKeyframeValues>;
     pub type RawGeckoStyleAnimationList =
         root::nsStyleAutoArray<root::mozilla::StyleAnimation>;
     pub type RawGeckoFontFaceRuleList =
         root::nsTArray<root::nsFontFaceRuleContainer>;
     pub type RawGeckoAnimationPropertySegment =
         root::mozilla::AnimationPropertySegment;
     pub type RawGeckoComputedTiming = root::mozilla::ComputedTiming;
     pub type RawGeckoServoStyleRuleList =
@@ -28338,17 +28362,17 @@ pub mod root {
     pub struct imgRequestProxy {
         pub _base: root::imgIRequest,
         pub _base_1: root::mozilla::image::IProgressObserver,
         pub _base_2: root::nsISupportsPriority,
         pub _base_3: root::nsISecurityInfoProvider,
         pub _base_4: root::nsITimedChannel,
         pub mRefCnt: root::nsAutoRefCnt,
         pub mBehaviour: root::mozilla::UniquePtr<root::ProxyBehaviour>,
-        pub mURI: root::RefPtr<root::mozilla::image::ImageURL>,
+        pub mURI: root::RefPtr<root::imgRequestProxy_ImageURL>,
         pub mListener: *mut root::imgINotificationObserver,
         pub mLoadGroup: root::nsCOMPtr,
         pub mTabGroup: root::RefPtr<root::mozilla::dom::TabGroup>,
         pub mEventTarget: root::nsCOMPtr,
         pub mLoadFlags: root::nsLoadFlags,
         pub mLockCount: u32,
         pub mAnimationConsumers: u32,
         pub _bitfield_1: u8,
@@ -30191,17 +30215,17 @@ pub mod root {
                     & ( * ( 0 as * const nsCSSShadowArray ) ) . mArray as *
                     const _ as usize } , 12usize , concat ! (
                     "Alignment of field: " , stringify ! ( nsCSSShadowArray )
                     , "::" , stringify ! ( mArray ) ));
     }
     #[repr(C)]
     #[derive(Debug)]
     pub struct nsBorderColors {
-        pub mColors: [root::nsTArray<::std::os::raw::c_uint>; 4usize],
+        pub mColors: [root::nsTArray<root::nscolor>; 4usize],
     }
     #[test]
     fn bindgen_test_layout_nsBorderColors() {
         assert_eq!(::std::mem::size_of::<nsBorderColors>() , 32usize , concat
                    ! ( "Size of: " , stringify ! ( nsBorderColors ) ));
         assert_eq! (::std::mem::align_of::<nsBorderColors>() , 8usize , concat
                     ! ( "Alignment of " , stringify ! ( nsBorderColors ) ));
         assert_eq! (unsafe {
@@ -30215,18 +30239,17 @@ pub mod root {
     /// to share the same 'quotes' value with a parent style context.
     #[repr(C)]
     #[derive(Debug)]
     pub struct nsStyleQuoteValues {
         pub mRefCnt: root::mozilla::ThreadSafeAutoRefCnt,
         pub mQuotePairs: root::nsStyleQuoteValues_QuotePairArray,
     }
     pub type nsStyleQuoteValues_QuotePairArray =
-        root::nsTArray<root::std::pair<::nsstring::nsStringRepr,
-                                       ::nsstring::nsStringRepr>>;
+        root::nsTArray<root::std::pair<::nsstring::nsStringRepr, ::nsstring::nsStringRepr>>;
     pub type nsStyleQuoteValues_HasThreadSafeRefCnt = root::mozilla::TrueType;
     #[test]
     fn bindgen_test_layout_nsStyleQuoteValues() {
         assert_eq!(::std::mem::size_of::<nsStyleQuoteValues>() , 16usize ,
                    concat ! ( "Size of: " , stringify ! ( nsStyleQuoteValues )
                    ));
         assert_eq! (::std::mem::align_of::<nsStyleQuoteValues>() , 8usize ,
                     concat ! (
@@ -31633,61 +31656,61 @@ pub mod root {
     }
     #[test]
     fn bindgen_test_layout_nsISMILAttr() {
         assert_eq!(::std::mem::size_of::<nsISMILAttr>() , 8usize , concat ! (
                    "Size of: " , stringify ! ( nsISMILAttr ) ));
         assert_eq! (::std::mem::align_of::<nsISMILAttr>() , 8usize , concat !
                     ( "Alignment of " , stringify ! ( nsISMILAttr ) ));
     }
-    pub const ELEMENT_SHARED_RESTYLE_BIT_1: root::_bindgen_ty_85 =
-        _bindgen_ty_85::ELEMENT_SHARED_RESTYLE_BIT_1;
-    pub const ELEMENT_SHARED_RESTYLE_BIT_2: root::_bindgen_ty_85 =
-        _bindgen_ty_85::ELEMENT_SHARED_RESTYLE_BIT_2;
-    pub const ELEMENT_SHARED_RESTYLE_BIT_3: root::_bindgen_ty_85 =
-        _bindgen_ty_85::ELEMENT_SHARED_RESTYLE_BIT_3;
-    pub const ELEMENT_SHARED_RESTYLE_BIT_4: root::_bindgen_ty_85 =
-        _bindgen_ty_85::ELEMENT_SHARED_RESTYLE_BIT_4;
-    pub const ELEMENT_SHARED_RESTYLE_BITS: root::_bindgen_ty_85 =
-        _bindgen_ty_85::ELEMENT_SHARED_RESTYLE_BITS;
-    pub const ELEMENT_HAS_DIRTY_DESCENDANTS_FOR_SERVO: root::_bindgen_ty_85 =
-        _bindgen_ty_85::ELEMENT_SHARED_RESTYLE_BIT_1;
+    pub const ELEMENT_SHARED_RESTYLE_BIT_1: root::_bindgen_ty_79 =
+        _bindgen_ty_79::ELEMENT_SHARED_RESTYLE_BIT_1;
+    pub const ELEMENT_SHARED_RESTYLE_BIT_2: root::_bindgen_ty_79 =
+        _bindgen_ty_79::ELEMENT_SHARED_RESTYLE_BIT_2;
+    pub const ELEMENT_SHARED_RESTYLE_BIT_3: root::_bindgen_ty_79 =
+        _bindgen_ty_79::ELEMENT_SHARED_RESTYLE_BIT_3;
+    pub const ELEMENT_SHARED_RESTYLE_BIT_4: root::_bindgen_ty_79 =
+        _bindgen_ty_79::ELEMENT_SHARED_RESTYLE_BIT_4;
+    pub const ELEMENT_SHARED_RESTYLE_BITS: root::_bindgen_ty_79 =
+        _bindgen_ty_79::ELEMENT_SHARED_RESTYLE_BITS;
+    pub const ELEMENT_HAS_DIRTY_DESCENDANTS_FOR_SERVO: root::_bindgen_ty_79 =
+        _bindgen_ty_79::ELEMENT_SHARED_RESTYLE_BIT_1;
     pub const ELEMENT_HAS_ANIMATION_ONLY_DIRTY_DESCENDANTS_FOR_SERVO:
-              root::_bindgen_ty_85 =
-        _bindgen_ty_85::ELEMENT_SHARED_RESTYLE_BIT_2;
-    pub const ELEMENT_HAS_SNAPSHOT: root::_bindgen_ty_85 =
-        _bindgen_ty_85::ELEMENT_SHARED_RESTYLE_BIT_3;
-    pub const ELEMENT_HANDLED_SNAPSHOT: root::_bindgen_ty_85 =
-        _bindgen_ty_85::ELEMENT_SHARED_RESTYLE_BIT_4;
-    pub const ELEMENT_HAS_PENDING_RESTYLE: root::_bindgen_ty_85 =
-        _bindgen_ty_85::ELEMENT_SHARED_RESTYLE_BIT_1;
-    pub const ELEMENT_IS_POTENTIAL_RESTYLE_ROOT: root::_bindgen_ty_85 =
-        _bindgen_ty_85::ELEMENT_SHARED_RESTYLE_BIT_2;
-    pub const ELEMENT_HAS_PENDING_ANIMATION_ONLY_RESTYLE: root::_bindgen_ty_85
-              =
-        _bindgen_ty_85::ELEMENT_SHARED_RESTYLE_BIT_3;
+              root::_bindgen_ty_79 =
+        _bindgen_ty_79::ELEMENT_SHARED_RESTYLE_BIT_2;
+    pub const ELEMENT_HAS_SNAPSHOT: root::_bindgen_ty_79 =
+        _bindgen_ty_79::ELEMENT_SHARED_RESTYLE_BIT_3;
+    pub const ELEMENT_HANDLED_SNAPSHOT: root::_bindgen_ty_79 =
+        _bindgen_ty_79::ELEMENT_SHARED_RESTYLE_BIT_4;
+    pub const ELEMENT_HAS_PENDING_RESTYLE: root::_bindgen_ty_79 =
+        _bindgen_ty_79::ELEMENT_SHARED_RESTYLE_BIT_1;
+    pub const ELEMENT_IS_POTENTIAL_RESTYLE_ROOT: root::_bindgen_ty_79 =
+        _bindgen_ty_79::ELEMENT_SHARED_RESTYLE_BIT_2;
+    pub const ELEMENT_HAS_PENDING_ANIMATION_ONLY_RESTYLE: root::_bindgen_ty_79
+              =
+        _bindgen_ty_79::ELEMENT_SHARED_RESTYLE_BIT_3;
     pub const ELEMENT_IS_POTENTIAL_ANIMATION_ONLY_RESTYLE_ROOT:
-              root::_bindgen_ty_85 =
-        _bindgen_ty_85::ELEMENT_SHARED_RESTYLE_BIT_4;
-    pub const ELEMENT_IS_CONDITIONAL_RESTYLE_ANCESTOR: root::_bindgen_ty_85 =
-        _bindgen_ty_85::ELEMENT_IS_CONDITIONAL_RESTYLE_ANCESTOR;
-    pub const ELEMENT_HAS_CHILD_WITH_LATER_SIBLINGS_HINT: root::_bindgen_ty_85
-              =
-        _bindgen_ty_85::ELEMENT_HAS_CHILD_WITH_LATER_SIBLINGS_HINT;
-    pub const ELEMENT_PENDING_RESTYLE_FLAGS: root::_bindgen_ty_85 =
-        _bindgen_ty_85::ELEMENT_PENDING_RESTYLE_FLAGS;
-    pub const ELEMENT_POTENTIAL_RESTYLE_ROOT_FLAGS: root::_bindgen_ty_85 =
-        _bindgen_ty_85::ELEMENT_POTENTIAL_RESTYLE_ROOT_FLAGS;
-    pub const ELEMENT_ALL_RESTYLE_FLAGS: root::_bindgen_ty_85 =
-        _bindgen_ty_85::ELEMENT_ALL_RESTYLE_FLAGS;
-    pub const ELEMENT_TYPE_SPECIFIC_BITS_OFFSET: root::_bindgen_ty_85 =
-        _bindgen_ty_85::ELEMENT_TYPE_SPECIFIC_BITS_OFFSET;
-    #[repr(u32)]
-    #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-    pub enum _bindgen_ty_85 {
+              root::_bindgen_ty_79 =
+        _bindgen_ty_79::ELEMENT_SHARED_RESTYLE_BIT_4;
+    pub const ELEMENT_IS_CONDITIONAL_RESTYLE_ANCESTOR: root::_bindgen_ty_79 =
+        _bindgen_ty_79::ELEMENT_IS_CONDITIONAL_RESTYLE_ANCESTOR;
+    pub const ELEMENT_HAS_CHILD_WITH_LATER_SIBLINGS_HINT: root::_bindgen_ty_79
+              =
+        _bindgen_ty_79::ELEMENT_HAS_CHILD_WITH_LATER_SIBLINGS_HINT;
+    pub const ELEMENT_PENDING_RESTYLE_FLAGS: root::_bindgen_ty_79 =
+        _bindgen_ty_79::ELEMENT_PENDING_RESTYLE_FLAGS;
+    pub const ELEMENT_POTENTIAL_RESTYLE_ROOT_FLAGS: root::_bindgen_ty_79 =
+        _bindgen_ty_79::ELEMENT_POTENTIAL_RESTYLE_ROOT_FLAGS;
+    pub const ELEMENT_ALL_RESTYLE_FLAGS: root::_bindgen_ty_79 =
+        _bindgen_ty_79::ELEMENT_ALL_RESTYLE_FLAGS;
+    pub const ELEMENT_TYPE_SPECIFIC_BITS_OFFSET: root::_bindgen_ty_79 =
+        _bindgen_ty_79::ELEMENT_TYPE_SPECIFIC_BITS_OFFSET;
+    #[repr(u32)]
+    #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
+    pub enum _bindgen_ty_79 {
         ELEMENT_SHARED_RESTYLE_BIT_1 = 8388608,
         ELEMENT_SHARED_RESTYLE_BIT_2 = 16777216,
         ELEMENT_SHARED_RESTYLE_BIT_3 = 33554432,
         ELEMENT_SHARED_RESTYLE_BIT_4 = 67108864,
         ELEMENT_SHARED_RESTYLE_BITS = 125829120,
         ELEMENT_IS_CONDITIONAL_RESTYLE_ANCESTOR = 134217728,
         ELEMENT_HAS_CHILD_WITH_LATER_SIBLINGS_HINT = 268435456,
         ELEMENT_PENDING_RESTYLE_FLAGS = 41943040,
@@ -32342,38 +32365,25 @@ pub mod root {
                    "Size of template specialization: " , stringify ! (
                    root::nsTString<::std::os::raw::c_char> ) ));
         assert_eq!(::std::mem::align_of::<root::nsTString<::std::os::raw::c_char>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsTString<::std::os::raw::c_char> ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTArray_open0_nsTString_open1_char_close1_close0_instantiation() {
-        assert_eq!(::std::mem::size_of::<root::nsTArray<root::nsTString<::std::os::raw::c_char>>>()
-                   , 8usize , concat ! (
-                   "Size of template specialization: " , stringify ! (
-                   root::nsTArray<root::nsTString<::std::os::raw::c_char>> )
-                   ));
-        assert_eq!(::std::mem::align_of::<root::nsTArray<root::nsTString<::std::os::raw::c_char>>>()
-                   , 8usize , concat ! (
-                   "Alignment of template specialization: " , stringify ! (
-                   root::nsTArray<root::nsTString<::std::os::raw::c_char>> )
-                   ));
-    }
-    #[test]
-    fn __bindgen_test_layout_nsTString_open0_char_close0_instantiation_1() {
-        assert_eq!(::std::mem::size_of::<root::nsTString<::std::os::raw::c_char>>()
-                   , 16usize , concat ! (
-                   "Size of template specialization: " , stringify ! (
-                   root::nsTString<::std::os::raw::c_char> ) ));
-        assert_eq!(::std::mem::align_of::<root::nsTString<::std::os::raw::c_char>>()
-                   , 8usize , concat ! (
-                   "Alignment of template specialization: " , stringify ! (
-                   root::nsTString<::std::os::raw::c_char> ) ));
+    fn __bindgen_test_layout_nsTArray_open0_nsCString_close0_instantiation() {
+        assert_eq!(::std::mem::size_of::<root::nsTArray<root::nsCString>>() ,
+                   8usize , concat ! (
+                   "Size of template specialization: " , stringify ! (
+                   root::nsTArray<root::nsCString> ) ));
+        assert_eq!(::std::mem::align_of::<root::nsTArray<root::nsCString>>() ,
+                   8usize , concat ! (
+                   "Alignment of template specialization: " , stringify ! (
+                   root::nsTArray<root::nsCString> ) ));
     }
     #[test]
     fn __bindgen_test_layout_UniquePtr_open0_JSErrorNotes_DeletePolicy_open1_JSErrorNotes_close1_close0_instantiation() {
         assert_eq!(::std::mem::size_of::<root::mozilla::UniquePtr<root::JSErrorNotes>>()
                    , 8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::mozilla::UniquePtr<root::JSErrorNotes> ) ));
         assert_eq!(::std::mem::align_of::<root::mozilla::UniquePtr<root::JSErrorNotes>>()
@@ -32480,82 +32490,82 @@ pub mod root {
                    "Size of template specialization: " , stringify ! (
                    root::RefPtr<root::mozilla::SharedFontList> ) ));
         assert_eq!(::std::mem::align_of::<root::RefPtr<root::mozilla::SharedFontList>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::RefPtr<root::mozilla::SharedFontList> ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTArray_open0_unsigned_int_close0_instantiation() {
-        assert_eq!(::std::mem::size_of::<root::nsTArray<::std::os::raw::c_uint>>()
-                   , 8usize , concat ! (
-                   "Size of template specialization: " , stringify ! (
-                   root::nsTArray<::std::os::raw::c_uint> ) ));
-        assert_eq!(::std::mem::align_of::<root::nsTArray<::std::os::raw::c_uint>>()
-                   , 8usize , concat ! (
-                   "Alignment of template specialization: " , stringify ! (
-                   root::nsTArray<::std::os::raw::c_uint> ) ));
-    }
-    #[test]
-    fn __bindgen_test_layout_nsTArray_open0_unsigned_int_close0_instantiation_1() {
-        assert_eq!(::std::mem::size_of::<root::nsTArray<::std::os::raw::c_uint>>()
-                   , 8usize , concat ! (
-                   "Size of template specialization: " , stringify ! (
-                   root::nsTArray<::std::os::raw::c_uint> ) ));
-        assert_eq!(::std::mem::align_of::<root::nsTArray<::std::os::raw::c_uint>>()
-                   , 8usize , concat ! (
-                   "Alignment of template specialization: " , stringify ! (
-                   root::nsTArray<::std::os::raw::c_uint> ) ));
+    fn __bindgen_test_layout_nsTArray_open0_uint32_t_close0_instantiation() {
+        assert_eq!(::std::mem::size_of::<root::nsTArray<u32>>() , 8usize ,
+                   concat ! (
+                   "Size of template specialization: " , stringify ! (
+                   root::nsTArray<u32> ) ));
+        assert_eq!(::std::mem::align_of::<root::nsTArray<u32>>() , 8usize ,
+                   concat ! (
+                   "Alignment of template specialization: " , stringify ! (
+                   root::nsTArray<u32> ) ));
+    }
+    #[test]
+    fn __bindgen_test_layout_nsTArray_open0_uint32_t_close0_instantiation_1() {
+        assert_eq!(::std::mem::size_of::<root::nsTArray<u32>>() , 8usize ,
+                   concat ! (
+                   "Size of template specialization: " , stringify ! (
+                   root::nsTArray<u32> ) ));
+        assert_eq!(::std::mem::align_of::<root::nsTArray<u32>>() , 8usize ,
+                   concat ! (
+                   "Alignment of template specialization: " , stringify ! (
+                   root::nsTArray<u32> ) ));
     }
     #[test]
     fn __bindgen_test_layout_nsTArray_open0_gfxFontFeatureValueSet_ValueList_close0_instantiation() {
         assert_eq!(::std::mem::size_of::<root::nsTArray<root::gfxFontFeatureValueSet_ValueList>>()
                    , 8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<root::gfxFontFeatureValueSet_ValueList> )
                    ));
         assert_eq!(::std::mem::align_of::<root::nsTArray<root::gfxFontFeatureValueSet_ValueList>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsTArray<root::gfxFontFeatureValueSet_ValueList> )
                    ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTArray_open0_unsigned_int_close0_instantiation_2() {
-        assert_eq!(::std::mem::size_of::<root::nsTArray<::std::os::raw::c_uint>>()
-                   , 8usize , concat ! (
-                   "Size of template specialization: " , stringify ! (
-                   root::nsTArray<::std::os::raw::c_uint> ) ));
-        assert_eq!(::std::mem::align_of::<root::nsTArray<::std::os::raw::c_uint>>()
-                   , 8usize , concat ! (
-                   "Alignment of template specialization: " , stringify ! (
-                   root::nsTArray<::std::os::raw::c_uint> ) ));
-    }
-    #[test]
-    fn __bindgen_test_layout_nsTArray_open0_unsigned_int_close0_instantiation_3() {
-        assert_eq!(::std::mem::size_of::<root::nsTArray<::std::os::raw::c_uint>>()
-                   , 8usize , concat ! (
-                   "Size of template specialization: " , stringify ! (
-                   root::nsTArray<::std::os::raw::c_uint> ) ));
-        assert_eq!(::std::mem::align_of::<root::nsTArray<::std::os::raw::c_uint>>()
-                   , 8usize , concat ! (
-                   "Alignment of template specialization: " , stringify ! (
-                   root::nsTArray<::std::os::raw::c_uint> ) ));
-    }
-    #[test]
-    fn __bindgen_test_layout_nsTArray_open0_unsigned_int_close0_instantiation_4() {
-        assert_eq!(::std::mem::size_of::<root::nsTArray<::std::os::raw::c_uint>>()
-                   , 8usize , concat ! (
-                   "Size of template specialization: " , stringify ! (
-                   root::nsTArray<::std::os::raw::c_uint> ) ));
-        assert_eq!(::std::mem::align_of::<root::nsTArray<::std::os::raw::c_uint>>()
-                   , 8usize , concat ! (
-                   "Alignment of template specialization: " , stringify ! (
-                   root::nsTArray<::std::os::raw::c_uint> ) ));
+    fn __bindgen_test_layout_nsTArray_open0_uint32_t_close0_instantiation_2() {
+        assert_eq!(::std::mem::size_of::<root::nsTArray<u32>>() , 8usize ,
+                   concat ! (
+                   "Size of template specialization: " , stringify ! (
+                   root::nsTArray<u32> ) ));
+        assert_eq!(::std::mem::align_of::<root::nsTArray<u32>>() , 8usize ,
+                   concat ! (
+                   "Alignment of template specialization: " , stringify ! (
+                   root::nsTArray<u32> ) ));
+    }
+    #[test]
+    fn __bindgen_test_layout_nsTArray_open0_uint32_t_close0_instantiation_3() {
+        assert_eq!(::std::mem::size_of::<root::nsTArray<u32>>() , 8usize ,
+                   concat ! (
+                   "Size of template specialization: " , stringify ! (
+                   root::nsTArray<u32> ) ));
+        assert_eq!(::std::mem::align_of::<root::nsTArray<u32>>() , 8usize ,
+                   concat ! (
+                   "Alignment of template specialization: " , stringify ! (
+                   root::nsTArray<u32> ) ));
+    }
+    #[test]
+    fn __bindgen_test_layout_nsTArray_open0_uint32_t_close0_instantiation_4() {
+        assert_eq!(::std::mem::size_of::<root::nsTArray<u32>>() , 8usize ,
+                   concat ! (
+                   "Size of template specialization: " , stringify ! (
+                   root::nsTArray<u32> ) ));
+        assert_eq!(::std::mem::align_of::<root::nsTArray<u32>>() , 8usize ,
+                   concat ! (
+                   "Alignment of template specialization: " , stringify ! (
+                   root::nsTArray<u32> ) ));
     }
     #[test]
     fn __bindgen_test_layout_nsTArray_open0_gfxAlternateValue_close0_instantiation() {
         assert_eq!(::std::mem::size_of::<root::nsTArray<root::gfxAlternateValue>>()
                    , 8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<root::gfxAlternateValue> ) ));
         assert_eq!(::std::mem::align_of::<root::nsTArray<root::gfxAlternateValue>>()
@@ -32581,49 +32591,71 @@ pub mod root {
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<root::gfxFontFeature> ) ));
         assert_eq!(::std::mem::align_of::<root::nsTArray<root::gfxFontFeature>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsTArray<root::gfxFontFeature> ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTArray_open0_FontVariation_close0_instantiation() {
-        assert_eq!(::std::mem::size_of::<root::nsTArray<root::mozilla::gfx::FontVariation>>()
-                   , 8usize , concat ! (
-                   "Size of template specialization: " , stringify ! (
-                   root::nsTArray<root::mozilla::gfx::FontVariation> ) ));
-        assert_eq!(::std::mem::align_of::<root::nsTArray<root::mozilla::gfx::FontVariation>>()
-                   , 8usize , concat ! (
-                   "Alignment of template specialization: " , stringify ! (
-                   root::nsTArray<root::mozilla::gfx::FontVariation> ) ));
-    }
-    #[test]
-    fn __bindgen_test_layout_nsTArray_open0__bindgen_ty_id_214713_close0_instantiation() {
+    fn __bindgen_test_layout_nsTArray_open0_gfxFontVariation_close0_instantiation() {
+        assert_eq!(::std::mem::size_of::<root::nsTArray<root::gfxFontVariation>>()
+                   , 8usize , concat ! (
+                   "Size of template specialization: " , stringify ! (
+                   root::nsTArray<root::gfxFontVariation> ) ));
+        assert_eq!(::std::mem::align_of::<root::nsTArray<root::gfxFontVariation>>()
+                   , 8usize , concat ! (
+                   "Alignment of template specialization: " , stringify ! (
+                   root::nsTArray<root::gfxFontVariation> ) ));
+    }
+    #[test]
+    fn __bindgen_test_layout_nsTArray_open0__bindgen_ty_id_191979_close0_instantiation() {
         assert_eq!(::std::mem::size_of::<root::nsTArray<*mut root::nsCSSSelector>>()
                    , 8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<*mut root::nsCSSSelector> ) ));
         assert_eq!(::std::mem::align_of::<root::nsTArray<*mut root::nsCSSSelector>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsTArray<*mut root::nsCSSSelector> ) ));
     }
     #[test]
+    fn __bindgen_test_layout_nsTArray_open0_RefPtr_open1_nsAtom_close1_close0_instantiation() {
+        assert_eq!(::std::mem::size_of::<root::nsTArray<root::RefPtr<root::nsAtom>>>()
+                   , 8usize , concat ! (
+                   "Size of template specialization: " , stringify ! (
+                   root::nsTArray<root::RefPtr<root::nsAtom>> ) ));
+        assert_eq!(::std::mem::align_of::<root::nsTArray<root::RefPtr<root::nsAtom>>>()
+                   , 8usize , concat ! (
+                   "Alignment of template specialization: " , stringify ! (
+                   root::nsTArray<root::RefPtr<root::nsAtom>> ) ));
+    }
+    #[test]
     fn __bindgen_test_layout_RefPtr_open0_nsAtom_close0_instantiation() {
         assert_eq!(::std::mem::size_of::<root::RefPtr<root::nsAtom>>() ,
                    8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::RefPtr<root::nsAtom> ) ));
         assert_eq!(::std::mem::align_of::<root::RefPtr<root::nsAtom>>() ,
                    8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::RefPtr<root::nsAtom> ) ));
     }
     #[test]
+    fn __bindgen_test_layout_RefPtr_open0_nsAtom_close0_instantiation_1() {
+        assert_eq!(::std::mem::size_of::<root::RefPtr<root::nsAtom>>() ,
+                   8usize , concat ! (
+                   "Size of template specialization: " , stringify ! (
+                   root::RefPtr<root::nsAtom> ) ));
+        assert_eq!(::std::mem::align_of::<root::RefPtr<root::nsAtom>>() ,
+                   8usize , concat ! (
+                   "Alignment of template specialization: " , stringify ! (
+                   root::RefPtr<root::nsAtom> ) ));
+    }
+    #[test]
     fn __bindgen_test_layout_RefPtr_open0_nsStyleImageRequest_close0_instantiation() {
         assert_eq!(::std::mem::size_of::<root::RefPtr<root::nsStyleImageRequest>>()
                    , 8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::RefPtr<root::nsStyleImageRequest> ) ));
         assert_eq!(::std::mem::align_of::<root::RefPtr<root::nsStyleImageRequest>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
@@ -32702,28 +32734,28 @@ pub mod root {
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<root::nsStyleCoord> ) ));
         assert_eq!(::std::mem::align_of::<root::nsTArray<root::nsStyleCoord>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsTArray<root::nsStyleCoord> ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTArray_open0_RefPtr_open1_nsAtom_close1_close0_instantiation() {
+    fn __bindgen_test_layout_nsTArray_open0_RefPtr_open1_nsAtom_close1_close0_instantiation_1() {
         assert_eq!(::std::mem::size_of::<root::nsTArray<root::RefPtr<root::nsAtom>>>()
                    , 8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<root::RefPtr<root::nsAtom>> ) ));
         assert_eq!(::std::mem::align_of::<root::nsTArray<root::RefPtr<root::nsAtom>>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsTArray<root::RefPtr<root::nsAtom>> ) ));
     }
     #[test]
-    fn __bindgen_test_layout_RefPtr_open0_nsAtom_close0_instantiation_1() {
+    fn __bindgen_test_layout_RefPtr_open0_nsAtom_close0_instantiation_2() {
         assert_eq!(::std::mem::size_of::<root::RefPtr<root::nsAtom>>() ,
                    8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::RefPtr<root::nsAtom> ) ));
         assert_eq!(::std::mem::align_of::<root::RefPtr<root::nsAtom>>() ,
                    8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::RefPtr<root::nsAtom> ) ));
@@ -32781,28 +32813,28 @@ pub mod root {
                    ));
         assert_eq!(::std::mem::align_of::<root::RefPtr<root::mozilla::css::GridTemplateAreasValue>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::RefPtr<root::mozilla::css::GridTemplateAreasValue> )
                    ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTArray_open0_RefPtr_open1_nsAtom_close1_close0_instantiation_1() {
+    fn __bindgen_test_layout_nsTArray_open0_RefPtr_open1_nsAtom_close1_close0_instantiation_2() {
         assert_eq!(::std::mem::size_of::<root::nsTArray<root::RefPtr<root::nsAtom>>>()
                    , 8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<root::RefPtr<root::nsAtom>> ) ));
         assert_eq!(::std::mem::align_of::<root::nsTArray<root::RefPtr<root::nsAtom>>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsTArray<root::RefPtr<root::nsAtom>> ) ));
     }
     #[test]
-    fn __bindgen_test_layout_RefPtr_open0_nsAtom_close0_instantiation_2() {
+    fn __bindgen_test_layout_RefPtr_open0_nsAtom_close0_instantiation_3() {
         assert_eq!(::std::mem::size_of::<root::RefPtr<root::nsAtom>>() ,
                    8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::RefPtr<root::nsAtom> ) ));
         assert_eq!(::std::mem::align_of::<root::RefPtr<root::nsAtom>>() ,
                    8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::RefPtr<root::nsAtom> ) ));
@@ -32959,39 +32991,28 @@ pub mod root {
                    "Size of template specialization: " , stringify ! (
                    root::RefPtr<root::mozilla::ServoStyleContext> ) ));
         assert_eq!(::std::mem::align_of::<root::RefPtr<root::mozilla::ServoStyleContext>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::RefPtr<root::mozilla::ServoStyleContext> ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTArray_open0_nsTString_open1_char16_t_close1_close0_instantiation() {
-        assert_eq!(::std::mem::size_of::<root::nsTArray<::nsstring::nsStringRepr>>()
-                   , 8usize , concat ! (
+    fn __bindgen_test_layout_nsTArray_open0_nsString_close0_instantiation() {
+        assert_eq!(::std::mem::size_of::<root::nsTArray<::nsstring::nsStringRepr>>() ,
+                   8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<::nsstring::nsStringRepr> ) ));
-        assert_eq!(::std::mem::align_of::<root::nsTArray<::nsstring::nsStringRepr>>()
-                   , 8usize , concat ! (
+        assert_eq!(::std::mem::align_of::<root::nsTArray<::nsstring::nsStringRepr>>() ,
+                   8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsTArray<::nsstring::nsStringRepr> ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTString_open0_char16_t_close0_instantiation_1() {
-        assert_eq!(::std::mem::size_of::<::nsstring::nsStringRepr>() , 16usize ,
-                   concat ! (
-                   "Size of template specialization: " , stringify ! (
-                   ::nsstring::nsStringRepr ) ));
-        assert_eq!(::std::mem::align_of::<::nsstring::nsStringRepr>() , 8usize ,
-                   concat ! (
-                   "Alignment of template specialization: " , stringify ! (
-                   ::nsstring::nsStringRepr ) ));
-    }
-    #[test]
-    fn __bindgen_test_layout_nsTArray_open0__bindgen_ty_id_216526_close0_instantiation() {
+    fn __bindgen_test_layout_nsTArray_open0__bindgen_ty_id_193764_close0_instantiation() {
         assert_eq!(::std::mem::size_of::<root::nsTArray<*mut root::mozilla::StyleSheet>>()
                    , 8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<*mut root::mozilla::StyleSheet> ) ));
         assert_eq!(::std::mem::align_of::<root::nsTArray<*mut root::mozilla::StyleSheet>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsTArray<*mut root::mozilla::StyleSheet> ) ));
@@ -33036,25 +33057,25 @@ pub mod root {
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<root::mozilla::StyleSetHandle> ) ));
         assert_eq!(::std::mem::align_of::<root::nsTArray<root::mozilla::StyleSetHandle>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsTArray<root::mozilla::StyleSetHandle> ) ));
     }
     #[test]
-    fn __bindgen_test_layout_RefPtr_open0_nsAttrChildContentList_close0_instantiation() {
-        assert_eq!(::std::mem::size_of::<root::RefPtr<root::nsAttrChildContentList>>()
-                   , 8usize , concat ! (
-                   "Size of template specialization: " , stringify ! (
-                   root::RefPtr<root::nsAttrChildContentList> ) ));
-        assert_eq!(::std::mem::align_of::<root::RefPtr<root::nsAttrChildContentList>>()
-                   , 8usize , concat ! (
-                   "Alignment of template specialization: " , stringify ! (
-                   root::RefPtr<root::nsAttrChildContentList> ) ));
+    fn __bindgen_test_layout_RefPtr_open0_nsChildContentList_close0_instantiation() {
+        assert_eq!(::std::mem::size_of::<root::RefPtr<root::nsChildContentList>>()
+                   , 8usize , concat ! (
+                   "Size of template specialization: " , stringify ! (
+                   root::RefPtr<root::nsChildContentList> ) ));
+        assert_eq!(::std::mem::align_of::<root::RefPtr<root::nsChildContentList>>()
+                   , 8usize , concat ! (
+                   "Alignment of template specialization: " , stringify ! (
+                   root::RefPtr<root::nsChildContentList> ) ));
     }
     #[test]
     fn __bindgen_test_layout_UniquePtr_open0_LinkedList_open1_nsRange_close1_DefaultDelete_open1_LinkedList_open2_nsRange_close2_close1_close0_instantiation() {
         assert_eq!(::std::mem::size_of::<root::mozilla::UniquePtr<root::mozilla::LinkedList>>()
                    , 8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::mozilla::UniquePtr<root::mozilla::LinkedList> ) ));
         assert_eq!(::std::mem::align_of::<root::mozilla::UniquePtr<root::mozilla::LinkedList>>()
@@ -33146,17 +33167,17 @@ pub mod root {
                    "Size of template specialization: " , stringify ! (
                    root::JS::DeletePolicy ) ));
         assert_eq!(::std::mem::align_of::<root::JS::DeletePolicy>() , 1usize ,
                    concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::JS::DeletePolicy ) ));
     }
     #[test]
-    fn __bindgen_test_layout_iterator_open0_input_iterator_tag_UniquePtr_open1_JSErrorNotes_Note_DeletePolicy_open2_JSErrorNotes_Note_close2_close1_long__bindgen_ty_id_222123__bindgen_ty_id_222130_close0_instantiation() {
+    fn __bindgen_test_layout_iterator_open0_input_iterator_tag_UniquePtr_open1_JSErrorNotes_Note_DeletePolicy_open2_JSErrorNotes_Note_close2_close1_long__bindgen_ty_id_199351__bindgen_ty_id_199358_close0_instantiation() {
         assert_eq!(::std::mem::size_of::<root::std::iterator>() , 1usize ,
                    concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::std::iterator ) ));
         assert_eq!(::std::mem::align_of::<root::std::iterator>() , 1usize ,
                    concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::std::iterator ) ));
@@ -33289,75 +33310,16 @@ pub mod root {
                    "Size of template specialization: " , stringify ! (
                    root::nsCOMPtr ) ));
         assert_eq!(::std::mem::align_of::<root::nsCOMPtr>() , 8usize , concat
                    ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsCOMPtr ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTArray_open0_nsTString_open1_char_close1_close0_instantiation_1() {
-        assert_eq!(::std::mem::size_of::<root::nsTArray<root::nsTString<::std::os::raw::c_char>>>()
-                   , 8usize , concat ! (
-                   "Size of template specialization: " , stringify ! (
-                   root::nsTArray<root::nsTString<::std::os::raw::c_char>> )
-                   ));
-        assert_eq!(::std::mem::align_of::<root::nsTArray<root::nsTString<::std::os::raw::c_char>>>()
-                   , 8usize , concat ! (
-                   "Alignment of template specialization: " , stringify ! (
-                   root::nsTArray<root::nsTString<::std::os::raw::c_char>> )
-                   ));
-    }
-    #[test]
-    fn __bindgen_test_layout_nsTString_open0_char_close0_instantiation_2() {
-        assert_eq!(::std::mem::size_of::<root::nsTString<::std::os::raw::c_char>>()
-                   , 16usize , concat ! (
-                   "Size of template specialization: " , stringify ! (
-                   root::nsTString<::std::os::raw::c_char> ) ));
-        assert_eq!(::std::mem::align_of::<root::nsTString<::std::os::raw::c_char>>()
-                   , 8usize , concat ! (
-                   "Alignment of template specialization: " , stringify ! (
-                   root::nsTString<::std::os::raw::c_char> ) ));
-    }
-    #[test]
-    fn __bindgen_test_layout_nsTArray_open0_nsTString_open1_char_close1_close0_instantiation_2() {
-        assert_eq!(::std::mem::size_of::<root::nsTArray<root::nsTString<::std::os::raw::c_char>>>()
-                   , 8usize , concat ! (
-                   "Size of template specialization: " , stringify ! (
-                   root::nsTArray<root::nsTString<::std::os::raw::c_char>> )
-                   ));
-        assert_eq!(::std::mem::align_of::<root::nsTArray<root::nsTString<::std::os::raw::c_char>>>()
-                   , 8usize , concat ! (
-                   "Alignment of template specialization: " , stringify ! (
-                   root::nsTArray<root::nsTString<::std::os::raw::c_char>> )
-                   ));
-    }
-    #[test]
-    fn __bindgen_test_layout_nsTString_open0_char_close0_instantiation_3() {
-        assert_eq!(::std::mem::size_of::<root::nsTString<::std::os::raw::c_char>>()
-                   , 16usize , concat ! (
-                   "Size of template specialization: " , stringify ! (
-                   root::nsTString<::std::os::raw::c_char> ) ));
-        assert_eq!(::std::mem::align_of::<root::nsTString<::std::os::raw::c_char>>()
-                   , 8usize , concat ! (
-                   "Alignment of template specialization: " , stringify ! (
-                   root::nsTString<::std::os::raw::c_char> ) ));
-    }
-    #[test]
-    fn __bindgen_test_layout_nsCOMPtr_open0_nsIDocument_close0_instantiation() {
-        assert_eq!(::std::mem::size_of::<root::nsCOMPtr>() , 8usize , concat !
-                   (
-                   "Size of template specialization: " , stringify ! (
-                   root::nsCOMPtr ) ));
-        assert_eq!(::std::mem::align_of::<root::nsCOMPtr>() , 8usize , concat
-                   ! (
-                   "Alignment of template specialization: " , stringify ! (
-                   root::nsCOMPtr ) ));
-    }
-    #[test]
     fn __bindgen_test_layout_nsTArray_open0_nsCOMPtr_open1_nsIPrincipal_close1_close0_instantiation_1() {
         assert_eq!(::std::mem::size_of::<root::nsTArray<root::nsCOMPtr>>() ,
                    8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<root::nsCOMPtr> ) ));
         assert_eq!(::std::mem::align_of::<root::nsTArray<root::nsCOMPtr>>() ,
                    8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
@@ -33370,16 +33332,93 @@ pub mod root {
                    "Size of template specialization: " , stringify ! (
                    root::nsCOMPtr ) ));
         assert_eq!(::std::mem::align_of::<root::nsCOMPtr>() , 8usize , concat
                    ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsCOMPtr ) ));
     }
     #[test]
+    fn __bindgen_test_layout_nsTArray_open0_uint64_t_close0_instantiation() {
+        assert_eq!(::std::mem::size_of::<root::nsTArray<u64>>() , 8usize ,
+                   concat ! (
+                   "Size of template specialization: " , stringify ! (
+                   root::nsTArray<u64> ) ));
+        assert_eq!(::std::mem::align_of::<root::nsTArray<u64>>() , 8usize ,
+                   concat ! (
+                   "Alignment of template specialization: " , stringify ! (
+                   root::nsTArray<u64> ) ));
+    }
+    #[test]
+    fn __bindgen_test_layout_nsTArray_open0_nsCString_close0_instantiation_1() {
+        assert_eq!(::std::mem::size_of::<root::nsTArray<root::nsCString>>() ,
+                   8usize , concat ! (
+                   "Size of template specialization: " , stringify ! (
+                   root::nsTArray<root::nsCString> ) ));
+        assert_eq!(::std::mem::align_of::<root::nsTArray<root::nsCString>>() ,
+                   8usize , concat ! (
+                   "Alignment of template specialization: " , stringify ! (
+                   root::nsTArray<root::nsCString> ) ));
+    }
+    #[test]
+    fn __bindgen_test_layout_nsTArray_open0_nsCString_close0_instantiation_2() {
+        assert_eq!(::std::mem::size_of::<root::nsTArray<root::nsCString>>() ,
+                   8usize , concat ! (
+                   "Size of template specialization: " , stringify ! (
+                   root::nsTArray<root::nsCString> ) ));
+        assert_eq!(::std::mem::align_of::<root::nsTArray<root::nsCString>>() ,
+                   8usize , concat ! (
+                   "Alignment of template specialization: " , stringify ! (
+                   root::nsTArray<root::nsCString> ) ));
+    }
+    #[test]
+    fn __bindgen_test_layout_nsCOMPtr_open0_nsIDocument_close0_instantiation() {
+        assert_eq!(::std::mem::size_of::<root::nsCOMPtr>() , 8usize , concat !
+                   (
+                   "Size of template specialization: " , stringify ! (
+                   root::nsCOMPtr ) ));
+        assert_eq!(::std::mem::align_of::<root::nsCOMPtr>() , 8usize , concat
+                   ! (
+                   "Alignment of template specialization: " , stringify ! (
+                   root::nsCOMPtr ) ));
+    }
+    #[test]
+    fn __bindgen_test_layout_nsTArray_open0_nsCOMPtr_open1_nsIPrincipal_close1_close0_instantiation_2() {
+        assert_eq!(::std::mem::size_of::<root::nsTArray<root::nsCOMPtr>>() ,
+                   8usize , concat ! (
+                   "Size of template specialization: " , stringify ! (
+                   root::nsTArray<root::nsCOMPtr> ) ));
+        assert_eq!(::std::mem::align_of::<root::nsTArray<root::nsCOMPtr>>() ,
+                   8usize , concat ! (
+                   "Alignment of template specialization: " , stringify ! (
+                   root::nsTArray<root::nsCOMPtr> ) ));
+    }
+    #[test]
+    fn __bindgen_test_layout_nsCOMPtr_open0_nsIPrincipal_close0_instantiation_2() {
+        assert_eq!(::std::mem::size_of::<root::nsCOMPtr>() , 8usize , concat !
+                   (
+                   "Size of template specialization: " , stringify ! (
+                   root::nsCOMPtr ) ));
+        assert_eq!(::std::mem::align_of::<root::nsCOMPtr>() , 8usize , concat
+                   ! (
+                   "Alignment of template specialization: " , stringify ! (
+                   root::nsCOMPtr ) ));
+    }
+    #[test]
+    fn __bindgen_test_layout_nsTArray_open0_uint64_t_close0_instantiation_1() {
+        assert_eq!(::std::mem::size_of::<root::nsTArray<u64>>() , 8usize ,
+                   concat ! (
+                   "Size of template specialization: " , stringify ! (
+                   root::nsTArray<u64> ) ));
+        assert_eq!(::std::mem::align_of::<root::nsTArray<u64>>() , 8usize ,
+                   concat ! (
+                   "Alignment of template specialization: " , stringify ! (
+                   root::nsTArray<u64> ) ));
+    }
+    #[test]
     fn __bindgen_test_layout_nsTArray_open0_nsCOMPtr_open1_nsIRunnable_close1_close0_instantiation() {
         assert_eq!(::std::mem::size_of::<root::nsTArray<root::nsCOMPtr>>() ,
                    8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<root::nsCOMPtr> ) ));
         assert_eq!(::std::mem::align_of::<root::nsTArray<root::nsCOMPtr>>() ,
                    8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
@@ -33541,25 +33580,25 @@ pub mod root {
                    "Size of template specialization: " , stringify ! (
                    root::RefPtr<root::mozilla::StyleSheet> ) ));
         assert_eq!(::std::mem::align_of::<root::RefPtr<root::mozilla::StyleSheet>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::RefPtr<root::mozilla::StyleSheet> ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTArray_open0__bindgen_ty_id_224685_close0_instantiation() {
-        assert_eq!(::std::mem::size_of::<root::nsTArray<*mut root::mozilla::dom::Element>>()
-                   , 8usize , concat ! (
-                   "Size of template specialization: " , stringify ! (
-                   root::nsTArray<*mut root::mozilla::dom::Element> ) ));
-        assert_eq!(::std::mem::align_of::<root::nsTArray<*mut root::mozilla::dom::Element>>()
-                   , 8usize , concat ! (
-                   "Alignment of template specialization: " , stringify ! (
-                   root::nsTArray<*mut root::mozilla::dom::Element> ) ));
+    fn __bindgen_test_layout_nsTArray_open0__bindgen_ty_id_201990_close0_instantiation() {
+        assert_eq!(::std::mem::size_of::<root::nsTArray<*mut root::nsIDocument_Element>>()
+                   , 8usize , concat ! (
+                   "Size of template specialization: " , stringify ! (
+                   root::nsTArray<*mut root::nsIDocument_Element> ) ));
+        assert_eq!(::std::mem::align_of::<root::nsTArray<*mut root::nsIDocument_Element>>()
+                   , 8usize , concat ! (
+                   "Alignment of template specialization: " , stringify ! (
+                   root::nsTArray<*mut root::nsIDocument_Element> ) ));
     }
     #[test]
     fn __bindgen_test_layout_nsTArray_open0_RefPtr_open1_Element_close1_close0_instantiation() {
         assert_eq!(::std::mem::size_of::<root::nsTArray<root::RefPtr<root::mozilla::dom::Element>>>()
                    , 8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<root::RefPtr<root::mozilla::dom::Element>> )
                    ));
@@ -33609,25 +33648,25 @@ pub mod root {
                    "Size of template specialization: " , stringify ! (
                    root::nsCOMPtr ) ));
         assert_eq!(::std::mem::align_of::<root::nsCOMPtr>() , 8usize , concat
                    ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsCOMPtr ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTArray_open0__bindgen_ty_id_224990_close0_instantiation() {
-        assert_eq!(::std::mem::size_of::<root::nsTArray<*mut root::mozilla::dom::Element>>()
-                   , 8usize , concat ! (
-                   "Size of template specialization: " , stringify ! (
-                   root::nsTArray<*mut root::mozilla::dom::Element> ) ));
-        assert_eq!(::std::mem::align_of::<root::nsTArray<*mut root::mozilla::dom::Element>>()
-                   , 8usize , concat ! (
-                   "Alignment of template specialization: " , stringify ! (
-                   root::nsTArray<*mut root::mozilla::dom::Element> ) ));
+    fn __bindgen_test_layout_nsTArray_open0__bindgen_ty_id_202295_close0_instantiation() {
+        assert_eq!(::std::mem::size_of::<root::nsTArray<*mut root::nsIDocument_Element>>()
+                   , 8usize , concat ! (
+                   "Size of template specialization: " , stringify ! (
+                   root::nsTArray<*mut root::nsIDocument_Element> ) ));
+        assert_eq!(::std::mem::align_of::<root::nsTArray<*mut root::nsIDocument_Element>>()
+                   , 8usize , concat ! (
+                   "Alignment of template specialization: " , stringify ! (
+                   root::nsTArray<*mut root::nsIDocument_Element> ) ));
     }
     #[test]
     fn __bindgen_test_layout_nsTArray_open0_RefPtr_open1_Element_close1_close0_instantiation_1() {
         assert_eq!(::std::mem::size_of::<root::nsTArray<root::RefPtr<root::mozilla::dom::Element>>>()
                    , 8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<root::RefPtr<root::mozilla::dom::Element>> )
                    ));
@@ -33644,25 +33683,62 @@ pub mod root {
                    "Size of template specialization: " , stringify ! (
                    root::RefPtr<root::mozilla::dom::Element> ) ));
         assert_eq!(::std::mem::align_of::<root::RefPtr<root::mozilla::dom::Element>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::RefPtr<root::mozilla::dom::Element> ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsAutoPtr_open0_nsIDocument_SelectorCache_close0_instantiation() {
-        assert_eq!(::std::mem::size_of::<root::nsAutoPtr<root::nsIDocument_SelectorCache>>()
-                   , 8usize , concat ! (
-                   "Size of template specialization: " , stringify ! (
-                   root::nsAutoPtr<root::nsIDocument_SelectorCache> ) ));
-        assert_eq!(::std::mem::align_of::<root::nsAutoPtr<root::nsIDocument_SelectorCache>>()
-                   , 8usize , concat ! (
-                   "Alignment of template specialization: " , stringify ! (
-                   root::nsAutoPtr<root::nsIDocument_SelectorCache> ) ));
+    fn __bindgen_test_layout_UniquePtr_open0_nsIDocument_SelectorCache_DefaultDelete_open1_nsIDocument_SelectorCache_close1_close0_instantiation() {
+        assert_eq!(::std::mem::size_of::<root::mozilla::UniquePtr<root::nsIDocument_SelectorCache>>()
+                   , 8usize , concat ! (
+                   "Size of template specialization: " , stringify ! (
+                   root::mozilla::UniquePtr<root::nsIDocument_SelectorCache> )
+                   ));
+        assert_eq!(::std::mem::align_of::<root::mozilla::UniquePtr<root::nsIDocument_SelectorCache>>()
+                   , 8usize , concat ! (
+                   "Alignment of template specialization: " , stringify ! (
+                   root::mozilla::UniquePtr<root::nsIDocument_SelectorCache> )
+                   ));
+    }
+    #[test]
+    fn __bindgen_test_layout_DefaultDelete_open0_nsIDocument_SelectorCache_close0_instantiation() {
+        assert_eq!(::std::mem::size_of::<root::mozilla::DefaultDelete>() ,
+                   1usize , concat ! (
+                   "Size of template specialization: " , stringify ! (
+                   root::mozilla::DefaultDelete ) ));
+        assert_eq!(::std::mem::align_of::<root::mozilla::DefaultDelete>() ,
+                   1usize , concat ! (
+                   "Alignment of template specialization: " , stringify ! (
+                   root::mozilla::DefaultDelete ) ));
+    }
+    #[test]
+    fn __bindgen_test_layout_UniquePtr_open0_nsIDocument_SelectorCache_DefaultDelete_open1_nsIDocument_SelectorCache_close1_close0_instantiation_1() {
+        assert_eq!(::std::mem::size_of::<root::mozilla::UniquePtr<root::nsIDocument_SelectorCache>>()
+                   , 8usize , concat ! (
+                   "Size of template specialization: " , stringify ! (
+                   root::mozilla::UniquePtr<root::nsIDocument_SelectorCache> )
+                   ));
+        assert_eq!(::std::mem::align_of::<root::mozilla::UniquePtr<root::nsIDocument_SelectorCache>>()
+                   , 8usize , concat ! (
+                   "Alignment of template specialization: " , stringify ! (
+                   root::mozilla::UniquePtr<root::nsIDocument_SelectorCache> )
+                   ));
+    }
+    #[test]
+    fn __bindgen_test_layout_DefaultDelete_open0_nsIDocument_SelectorCache_close0_instantiation_1() {
+        assert_eq!(::std::mem::size_of::<root::mozilla::DefaultDelete>() ,
+                   1usize , concat ! (
+                   "Size of template specialization: " , stringify ! (
+                   root::mozilla::DefaultDelete ) ));
+        assert_eq!(::std::mem::align_of::<root::mozilla::DefaultDelete>() ,
+                   1usize , concat ! (
+                   "Alignment of template specialization: " , stringify ! (
+                   root::mozilla::DefaultDelete ) ));
     }
     #[test]
     fn __bindgen_test_layout_nsCOMPtr_open0_nsIURI_close0_instantiation() {
         assert_eq!(::std::mem::size_of::<root::nsCOMPtr>() , 8usize , concat !
                    (
                    "Size of template specialization: " , stringify ! (
                    root::nsCOMPtr ) ));
         assert_eq!(::std::mem::align_of::<root::nsCOMPtr>() , 8usize , concat
@@ -33721,26 +33797,26 @@ pub mod root {
                    "Size of template specialization: " , stringify ! (
                    root::RefPtr<root::mozilla::URLExtraData> ) ));
         assert_eq!(::std::mem::align_of::<root::RefPtr<root::mozilla::URLExtraData>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::RefPtr<root::mozilla::URLExtraData> ) ));
     }
     #[test]
-    fn __bindgen_test_layout_NotNull_open0__bindgen_ty_id_225541_close0_instantiation() {
-        assert_eq!(::std::mem::size_of::<root::mozilla::NotNull<*const root::mozilla::Encoding>>()
-                   , 8usize , concat ! (
-                   "Size of template specialization: " , stringify ! (
-                   root::mozilla::NotNull<*const root::mozilla::Encoding> )
-                   ));
-        assert_eq!(::std::mem::align_of::<root::mozilla::NotNull<*const root::mozilla::Encoding>>()
-                   , 8usize , concat ! (
-                   "Alignment of template specialization: " , stringify ! (
-                   root::mozilla::NotNull<*const root::mozilla::Encoding> )
+    fn __bindgen_test_layout_NotNull_open0__bindgen_ty_id_202855_close0_instantiation() {
+        assert_eq!(::std::mem::size_of::<root::mozilla::NotNull<*const root::nsIDocument_Encoding>>()
+                   , 8usize , concat ! (
+                   "Size of template specialization: " , stringify ! (
+                   root::mozilla::NotNull<*const root::nsIDocument_Encoding> )
+                   ));
+        assert_eq!(::std::mem::align_of::<root::mozilla::NotNull<*const root::nsIDocument_Encoding>>()
+                   , 8usize , concat ! (
+                   "Alignment of template specialization: " , stringify ! (
+                   root::mozilla::NotNull<*const root::nsIDocument_Encoding> )
                    ));
     }
     #[test]
     fn __bindgen_test_layout_RefPtr_open0_Loader_close0_instantiation() {
         assert_eq!(::std::mem::size_of::<root::RefPtr<root::mozilla::css::Loader>>()
                    , 8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::RefPtr<root::mozilla::css::Loader> ) ));
@@ -33932,36 +34008,25 @@ pub mod root {
                    "Size of template specialization: " , stringify ! (
                    root::nsCOMPtr ) ));
         assert_eq!(::std::mem::align_of::<root::nsCOMPtr>() , 8usize , concat
                    ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsCOMPtr ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTArray_open0_nsCOMPtr_open1_nsIWeakReference_close1_close0_instantiation() {
-        assert_eq!(::std::mem::size_of::<root::nsTArray<root::nsCOMPtr>>() ,
-                   8usize , concat ! (
-                   "Size of template specialization: " , stringify ! (
-                   root::nsTArray<root::nsCOMPtr> ) ));
-        assert_eq!(::std::mem::align_of::<root::nsTArray<root::nsCOMPtr>>() ,
-                   8usize , concat ! (
-                   "Alignment of template specialization: " , stringify ! (
-                   root::nsTArray<root::nsCOMPtr> ) ));
-    }
-    #[test]
-    fn __bindgen_test_layout_nsCOMPtr_open0_nsIWeakReference_close0_instantiation() {
-        assert_eq!(::std::mem::size_of::<root::nsCOMPtr>() , 8usize , concat !
-                   (
-                   "Size of template specialization: " , stringify ! (
-                   root::nsCOMPtr ) ));
-        assert_eq!(::std::mem::align_of::<root::nsCOMPtr>() , 8usize , concat
-                   ! (
-                   "Alignment of template specialization: " , stringify ! (
-                   root::nsCOMPtr ) ));
+    fn __bindgen_test_layout_nsTArray_open0_nsWeakPtr_close0_instantiation() {
+        assert_eq!(::std::mem::size_of::<root::nsTArray<root::nsWeakPtr>>() ,
+                   8usize , concat ! (
+                   "Size of template specialization: " , stringify ! (
+                   root::nsTArray<root::nsWeakPtr> ) ));
+        assert_eq!(::std::mem::align_of::<root::nsTArray<root::nsWeakPtr>>() ,
+                   8usize , concat ! (
+                   "Alignment of template specialization: " , stringify ! (
+                   root::nsTArray<root::nsWeakPtr> ) ));
     }
     #[test]
     fn __bindgen_test_layout_nsCOMPtr_open0_nsIDocumentEncoder_close0_instantiation() {
         assert_eq!(::std::mem::size_of::<root::nsCOMPtr>() , 8usize , concat !
                    (
                    "Size of template specialization: " , stringify ! (
                    root::nsCOMPtr ) ));
         assert_eq!(::std::mem::align_of::<root::nsCOMPtr>() , 8usize , concat
@@ -34066,36 +34131,47 @@ pub mod root {
                    "Size of template specialization: " , stringify ! (
                    root::nsCOMPtr ) ));
         assert_eq!(::std::mem::align_of::<root::nsCOMPtr>() , 8usize , concat
                    ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsCOMPtr ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTArray_open0_nsCOMPtr_open1_nsIPrincipal_close1_close0_instantiation_2() {
+    fn __bindgen_test_layout_nsTArray_open0_nsCOMPtr_open1_nsIPrincipal_close1_close0_instantiation_3() {
         assert_eq!(::std::mem::size_of::<root::nsTArray<root::nsCOMPtr>>() ,
                    8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<root::nsCOMPtr> ) ));
         assert_eq!(::std::mem::align_of::<root::nsTArray<root::nsCOMPtr>>() ,
                    8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsTArray<root::nsCOMPtr> ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsCOMPtr_open0_nsIPrincipal_close0_instantiation_2() {
-        assert_eq!(::std::mem::size_of::<root::nsCOMPtr>() , 8usize , concat !
-                   (
-                   "Size of template specialization: " , stringify ! (
-                   root::nsCOMPtr ) ));
-        assert_eq!(::std::mem::align_of::<root::nsCOMPtr>() , 8usize , concat
-                   ! (
-                   "Alignment of template specialization: " , stringify ! (
-                   root::nsCOMPtr ) ));
+    fn __bindgen_test_layout_nsCOMPtr_open0_nsIPrincipal_close0_instantiation_3() {
+        assert_eq!(::std::mem::size_of::<root::nsCOMPtr>() , 8usize , concat !
+                   (
+                   "Size of template specialization: " , stringify ! (
+                   root::nsCOMPtr ) ));
+        assert_eq!(::std::mem::align_of::<root::nsCOMPtr>() , 8usize , concat
+                   ! (
+                   "Alignment of template specialization: " , stringify ! (
+                   root::nsCOMPtr ) ));
+    }
+    #[test]
+    fn __bindgen_test_layout_nsTArray_open0_uint64_t_close0_instantiation_2() {
+        assert_eq!(::std::mem::size_of::<root::nsTArray<u64>>() , 8usize ,
+                   concat ! (
+                   "Size of template specialization: " , stringify ! (
+                   root::nsTArray<u64> ) ));
+        assert_eq!(::std::mem::align_of::<root::nsTArray<u64>>() , 8usize ,
+                   concat ! (
+                   "Alignment of template specialization: " , stringify ! (
+                   root::nsTArray<u64> ) ));
     }
     #[test]
     fn __bindgen_test_layout_nsCOMPtr_open0_nsINode_close0_instantiation() {
         assert_eq!(::std::mem::size_of::<root::nsCOMPtr>() , 8usize , concat !
                    (
                    "Size of template specialization: " , stringify ! (
                    root::nsCOMPtr ) ));
         assert_eq!(::std::mem::align_of::<root::nsCOMPtr>() , 8usize , concat
@@ -34156,17 +34232,17 @@ pub mod root {
                    "Size of template specialization: " , stringify ! (
                    root::RefPtr<root::mozilla::StyleSheet> ) ));
         assert_eq!(::std::mem::align_of::<root::RefPtr<root::mozilla::StyleSheet>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::RefPtr<root::mozilla::StyleSheet> ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTArray_open0__bindgen_ty_id_225970_close0_instantiation() {
+    fn __bindgen_test_layout_nsTArray_open0__bindgen_ty_id_203294_close0_instantiation() {
         assert_eq!(::std::mem::size_of::<root::nsTArray<*mut root::mozilla::StyleSheet>>()
                    , 8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<*mut root::mozilla::StyleSheet> ) ));
         assert_eq!(::std::mem::align_of::<root::nsTArray<*mut root::mozilla::StyleSheet>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsTArray<*mut root::mozilla::StyleSheet> ) ));
@@ -34200,17 +34276,17 @@ pub mod root {
                    "Size of template specialization: " , stringify ! (
                    root::nsCOMPtr ) ));
         assert_eq!(::std::mem::align_of::<root::nsCOMPtr>() , 8usize , concat
                    ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsCOMPtr ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsCOMPtr_open0_nsIPrincipal_close0_instantiation_3() {
+    fn __bindgen_test_layout_nsCOMPtr_open0_nsIPrincipal_close0_instantiation_4() {
         assert_eq!(::std::mem::size_of::<root::nsCOMPtr>() , 8usize , concat !
                    (
                    "Size of template specialization: " , stringify ! (
                    root::nsCOMPtr ) ));
         assert_eq!(::std::mem::align_of::<root::nsCOMPtr>() , 8usize , concat
                    ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsCOMPtr ) ));
@@ -34222,38 +34298,25 @@ pub mod root {
                    "Size of template specialization: " , stringify ! (
                    root::RefPtr<root::mozilla::StyleSheet> ) ));
         assert_eq!(::std::mem::align_of::<root::RefPtr<root::mozilla::StyleSheet>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::RefPtr<root::mozilla::StyleSheet> ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTArray_open0_nsTString_open1_char_close1_close0_instantiation_3() {
-        assert_eq!(::std::mem::size_of::<root::nsTArray<root::nsTString<::std::os::raw::c_char>>>()
-                   , 8usize , concat ! (
-                   "Size of template specialization: " , stringify ! (
-                   root::nsTArray<root::nsTString<::std::os::raw::c_char>> )
-                   ));
-        assert_eq!(::std::mem::align_of::<root::nsTArray<root::nsTString<::std::os::raw::c_char>>>()
-                   , 8usize , concat ! (
-                   "Alignment of template specialization: " , stringify ! (
-                   root::nsTArray<root::nsTString<::std::os::raw::c_char>> )
-                   ));
-    }
-    #[test]
-    fn __bindgen_test_layout_nsTString_open0_char_close0_instantiation_4() {
-        assert_eq!(::std::mem::size_of::<root::nsTString<::std::os::raw::c_char>>()
-                   , 16usize , concat ! (
-                   "Size of template specialization: " , stringify ! (
-                   root::nsTString<::std::os::raw::c_char> ) ));
-        assert_eq!(::std::mem::align_of::<root::nsTString<::std::os::raw::c_char>>()
-                   , 8usize , concat ! (
-                   "Alignment of template specialization: " , stringify ! (
-                   root::nsTString<::std::os::raw::c_char> ) ));
+    fn __bindgen_test_layout_nsTArray_open0_nsCString_close0_instantiation_3() {
+        assert_eq!(::std::mem::size_of::<root::nsTArray<root::nsCString>>() ,
+                   8usize , concat ! (
+                   "Size of template specialization: " , stringify ! (
+                   root::nsTArray<root::nsCString> ) ));
+        assert_eq!(::std::mem::align_of::<root::nsTArray<root::nsCString>>() ,
+                   8usize , concat ! (
+                   "Alignment of template specialization: " , stringify ! (
+                   root::nsTArray<root::nsCString> ) ));
     }
     #[test]
     fn __bindgen_test_layout_nsTArray_open0_RefPtr_open1_ServoStyleSheet_close1_close0_instantiation() {
         assert_eq!(::std::mem::size_of::<root::nsTArray<root::RefPtr<root::mozilla::ServoStyleSheet>>>()
                    , 8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<root::RefPtr<root::mozilla::ServoStyleSheet>>
                    ) ));
@@ -34272,17 +34335,17 @@ pub mod root {
                    ) ));
         assert_eq!(::std::mem::align_of::<root::nsTArray<root::RefPtr<root::mozilla::ServoStyleSheet>>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsTArray<root::RefPtr<root::mozilla::ServoStyleSheet>>
                    ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTArray_open0__bindgen_ty_id_226384_close0_instantiation() {
+    fn __bindgen_test_layout_nsTArray_open0__bindgen_ty_id_203714_close0_instantiation() {
         assert_eq!(::std::mem::size_of::<root::nsTArray<*mut root::mozilla::StyleSheet>>()
                    , 8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<*mut root::mozilla::StyleSheet> ) ));
         assert_eq!(::std::mem::align_of::<root::nsTArray<*mut root::mozilla::StyleSheet>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsTArray<*mut root::mozilla::StyleSheet> ) ));
@@ -34395,39 +34458,28 @@ pub mod root {
                    "Size of template specialization: " , stringify ! (
                    root::mozilla::DefaultDelete ) ));
         assert_eq!(::std::mem::align_of::<root::mozilla::DefaultDelete>() ,
                    1usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::mozilla::DefaultDelete ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTArray_open0_nsTString_open1_char16_t_close1_close0_instantiation_1() {
-        assert_eq!(::std::mem::size_of::<root::nsTArray<::nsstring::nsStringRepr>>()
-                   , 8usize , concat ! (
+    fn __bindgen_test_layout_nsTArray_open0_nsString_close0_instantiation_1() {
+        assert_eq!(::std::mem::size_of::<root::nsTArray<::nsstring::nsStringRepr>>() ,
+                   8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<::nsstring::nsStringRepr> ) ));
-        assert_eq!(::std::mem::align_of::<root::nsTArray<::nsstring::nsStringRepr>>()
-                   , 8usize , concat ! (
+        assert_eq!(::std::mem::align_of::<root::nsTArray<::nsstring::nsStringRepr>>() ,
+                   8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsTArray<::nsstring::nsStringRepr> ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTString_open0_char16_t_close0_instantiation_2() {
-        assert_eq!(::std::mem::size_of::<::nsstring::nsStringRepr>() , 16usize ,
-                   concat ! (
-                   "Size of template specialization: " , stringify ! (
-                   ::nsstring::nsStringRepr ) ));
-        assert_eq!(::std::mem::align_of::<::nsstring::nsStringRepr>() , 8usize ,
-                   concat ! (
-                   "Alignment of template specialization: " , stringify ! (
-                   ::nsstring::nsStringRepr ) ));
-    }
-    #[test]
-    fn __bindgen_test_layout_nsTArray_open0__bindgen_ty_id_227343_close0_instantiation() {
+    fn __bindgen_test_layout_nsTArray_open0__bindgen_ty_id_204693_close0_instantiation() {
         assert_eq!(::std::mem::size_of::<root::nsTArray<*mut root::mozilla::StyleSheet>>()
                    , 8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<*mut root::mozilla::StyleSheet> ) ));
         assert_eq!(::std::mem::align_of::<root::nsTArray<*mut root::mozilla::StyleSheet>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsTArray<*mut root::mozilla::StyleSheet> ) ));
@@ -34448,23 +34500,27 @@ pub mod root {
                    "Size of template specialization: " , stringify ! (
                    root::nsRefPtrHashKey<root::nsIContent> ) ));
         assert_eq!(::std::mem::align_of::<root::nsRefPtrHashKey<root::nsIContent>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsRefPtrHashKey<root::nsIContent> ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsAutoPtr_open0_nsInterfaceHashtable_open1_nsISupportsHashKey_nsIXPConnectWrappedJS_close1_close0_instantiation() {
-        assert_eq!(::std::mem::size_of::<u64>() , 8usize , concat ! (
-                   "Size of template specialization: " , stringify ! ( u64 )
-                   ));
-        assert_eq!(::std::mem::align_of::<u64>() , 8usize , concat ! (
-                   "Alignment of template specialization: " , stringify ! (
-                   u64 ) ));
+    fn __bindgen_test_layout_nsAutoPtr_open0_nsBindingManager_WrapperHashtable_close0_instantiation() {
+        assert_eq!(::std::mem::size_of::<root::nsAutoPtr<root::nsBindingManager_WrapperHashtable>>()
+                   , 8usize , concat ! (
+                   "Size of template specialization: " , stringify ! (
+                   root::nsAutoPtr<root::nsBindingManager_WrapperHashtable> )
+                   ));
+        assert_eq!(::std::mem::align_of::<root::nsAutoPtr<root::nsBindingManager_WrapperHashtable>>()
+                   , 8usize , concat ! (
+                   "Alignment of template specialization: " , stringify ! (
+                   root::nsAutoPtr<root::nsBindingManager_WrapperHashtable> )
+                   ));
     }
     #[test]
     fn __bindgen_test_layout_nsAutoPtr_open0_nsRefPtrHashtable_open1_nsURIHashKey_nsXBLDocumentInfo_close1_close0_instantiation() {
         assert_eq!(::std::mem::size_of::<u64>() , 8usize , concat ! (
                    "Size of template specialization: " , stringify ! ( u64 )
                    ));
         assert_eq!(::std::mem::align_of::<u64>() , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
@@ -34484,17 +34540,17 @@ pub mod root {
         assert_eq!(::std::mem::size_of::<u64>() , 8usize , concat ! (
                    "Size of template specialization: " , stringify ! ( u64 )
                    ));
         assert_eq!(::std::mem::align_of::<u64>() , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    u64 ) ));
     }
     #[test]
-    fn __bindgen_test_layout_RefPtr_open0_nsAtom_close0_instantiation_3() {
+    fn __bindgen_test_layout_RefPtr_open0_nsAtom_close0_instantiation_4() {
         assert_eq!(::std::mem::size_of::<root::RefPtr<root::nsAtom>>() ,
                    8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::RefPtr<root::nsAtom> ) ));
         assert_eq!(::std::mem::align_of::<root::RefPtr<root::nsAtom>>() ,
                    8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::RefPtr<root::nsAtom> ) ));
@@ -34506,39 +34562,39 @@ pub mod root {
                    "Size of template specialization: " , stringify ! (
                    root::RefPtr<root::nsCSSFontFaceRule> ) ));
         assert_eq!(::std::mem::align_of::<root::RefPtr<root::nsCSSFontFaceRule>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::RefPtr<root::nsCSSFontFaceRule> ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTArray_open0__bindgen_ty_id_227653_close0_instantiation() {
+    fn __bindgen_test_layout_nsTArray_open0__bindgen_ty_id_205014_close0_instantiation() {
         assert_eq!(::std::mem::size_of::<root::nsTArray<*mut root::nsIContent>>()
                    , 8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<*mut root::nsIContent> ) ));
         assert_eq!(::std::mem::align_of::<root::nsTArray<*mut root::nsIContent>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsTArray<*mut root::nsIContent> ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTArray_open0__bindgen_ty_id_227658_close0_instantiation() {
+    fn __bindgen_test_layout_nsTArray_open0__bindgen_ty_id_205019_close0_instantiation() {
         assert_eq!(::std::mem::size_of::<root::nsTArray<*mut root::nsIContent>>()
                    , 8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<*mut root::nsIContent> ) ));
         assert_eq!(::std::mem::align_of::<root::nsTArray<*mut root::nsIContent>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsTArray<*mut root::nsIContent> ) ));
     }
     #[test]
-    fn __bindgen_test_layout_RefPtr_open0_nsAtom_close0_instantiation_4() {
+    fn __bindgen_test_layout_RefPtr_open0_nsAtom_close0_instantiation_5() {
         assert_eq!(::std::mem::size_of::<root::RefPtr<root::nsAtom>>() ,
                    8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::RefPtr<root::nsAtom> ) ));
         assert_eq!(::std::mem::align_of::<root::RefPtr<root::nsAtom>>() ,
                    8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::RefPtr<root::nsAtom> ) ));
@@ -34574,17 +34630,17 @@ pub mod root {
                    "Size of template specialization: " , stringify ! (
                    root::RefPtr<root::mozilla::CSSStyleSheet> ) ));
         assert_eq!(::std::mem::align_of::<root::RefPtr<root::mozilla::CSSStyleSheet>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::RefPtr<root::mozilla::CSSStyleSheet> ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTArray_open0__bindgen_ty_id_228135_close0_instantiation() {
+    fn __bindgen_test_layout_nsTArray_open0__bindgen_ty_id_205500_close0_instantiation() {
         assert_eq!(::std::mem::size_of::<root::nsTArray<*mut root::mozilla::StyleSheet>>()
                    , 8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<*mut root::mozilla::StyleSheet> ) ));
         assert_eq!(::std::mem::align_of::<root::nsTArray<*mut root::mozilla::StyleSheet>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsTArray<*mut root::mozilla::StyleSheet> ) ));
@@ -34741,17 +34797,17 @@ pub mod root {
                    "Size of template specialization: " , stringify ! (
                    root::RefPtr<root::mozilla::CounterStyleManager> ) ));
         assert_eq!(::std::mem::align_of::<root::RefPtr<root::mozilla::CounterStyleManager>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::RefPtr<root::mozilla::CounterStyleManager> ) ));
     }
     #[test]
-    fn __bindgen_test_layout_RefPtr_open0_nsAtom_close0_instantiation_5() {
+    fn __bindgen_test_layout_RefPtr_open0_nsAtom_close0_instantiation_6() {
         assert_eq!(::std::mem::size_of::<root::RefPtr<root::nsAtom>>() ,
                    8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::RefPtr<root::nsAtom> ) ));
         assert_eq!(::std::mem::align_of::<root::RefPtr<root::nsAtom>>() ,
                    8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::RefPtr<root::nsAtom> ) ));
@@ -34763,17 +34819,17 @@ pub mod root {
                    "Size of template specialization: " , stringify ! (
                    root::RefPtr<root::gfxFontFeatureValueSet> ) ));
         assert_eq!(::std::mem::align_of::<root::RefPtr<root::gfxFontFeatureValueSet>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::RefPtr<root::gfxFontFeatureValueSet> ) ));
     }
     #[test]
-    fn __bindgen_test_layout_RefPtr_open0_nsAtom_close0_instantiation_6() {
+    fn __bindgen_test_layout_RefPtr_open0_nsAtom_close0_instantiation_7() {
         assert_eq!(::std::mem::size_of::<root::RefPtr<root::nsAtom>>() ,
                    8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::RefPtr<root::nsAtom> ) ));
         assert_eq!(::std::mem::align_of::<root::RefPtr<root::nsAtom>>() ,
                    8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::RefPtr<root::nsAtom> ) ));
@@ -34873,60 +34929,38 @@ pub mod root {
                    "Size of template specialization: " , stringify ! (
                    root::nsRefPtrHashKey<root::nsAtom> ) ));
         assert_eq!(::std::mem::align_of::<root::nsRefPtrHashKey<root::nsAtom>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsRefPtrHashKey<root::nsAtom> ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTArray_open0_RefPtr_open1_nsAtom_close1_close0_instantiation_2() {
-        assert_eq!(::std::mem::size_of::<root::nsTArray<root::RefPtr<root::nsAtom>>>()
-                   , 8usize , concat ! (
-                   "Size of template specialization: " , stringify ! (
-                   root::nsTArray<root::RefPtr<root::nsAtom>> ) ));
-        assert_eq!(::std::mem::align_of::<root::nsTArray<root::RefPtr<root::nsAtom>>>()
-                   , 8usize , concat ! (
-                   "Alignment of template specialization: " , stringify ! (
-                   root::nsTArray<root::RefPtr<root::nsAtom>> ) ));
-    }
-    #[test]
-    fn __bindgen_test_layout_RefPtr_open0_nsAtom_close0_instantiation_7() {
-        assert_eq!(::std::mem::size_of::<root::RefPtr<root::nsAtom>>() ,
-                   8usize , concat ! (
-                   "Size of template specialization: " , stringify ! (
-                   root::RefPtr<root::nsAtom> ) ));
-        assert_eq!(::std::mem::align_of::<root::RefPtr<root::nsAtom>>() ,
-                   8usize , concat ! (
-                   "Alignment of template specialization: " , stringify ! (
-                   root::RefPtr<root::nsAtom> ) ));
-    }
-    #[test]
-    fn __bindgen_test_layout_nsCOMPtr_open0_nsIPrincipal_close0_instantiation_4() {
-        assert_eq!(::std::mem::size_of::<root::nsCOMPtr>() , 8usize , concat !
-                   (
-                   "Size of template specialization: " , stringify ! (
-                   root::nsCOMPtr ) ));
-        assert_eq!(::std::mem::align_of::<root::nsCOMPtr>() , 8usize , concat
-                   ! (
-                   "Alignment of template specialization: " , stringify ! (
-                   root::nsCOMPtr ) ));
-    }
-    #[test]
     fn __bindgen_test_layout_nsCOMPtr_open0_nsIPrincipal_close0_instantiation_5() {
         assert_eq!(::std::mem::size_of::<root::nsCOMPtr>() , 8usize , concat !
                    (
                    "Size of template specialization: " , stringify ! (
                    root::nsCOMPtr ) ));
         assert_eq!(::std::mem::align_of::<root::nsCOMPtr>() , 8usize , concat
                    ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsCOMPtr ) ));
     }
     #[test]
+    fn __bindgen_test_layout_nsCOMPtr_open0_nsIPrincipal_close0_instantiation_6() {
+        assert_eq!(::std::mem::size_of::<root::nsCOMPtr>() , 8usize , concat !
+                   (
+                   "Size of template specialization: " , stringify ! (
+                   root::nsCOMPtr ) ));
+        assert_eq!(::std::mem::align_of::<root::nsCOMPtr>() , 8usize , concat
+                   ! (
+                   "Alignment of template specialization: " , stringify ! (
+                   root::nsCOMPtr ) ));
+    }
+    #[test]
     fn __bindgen_test_layout_RefPtr_open0_nsBindingManager_close0_instantiation_1() {
         assert_eq!(::std::mem::size_of::<root::RefPtr<root::nsBindingManager>>()
                    , 8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::RefPtr<root::nsBindingManager> ) ));
         assert_eq!(::std::mem::align_of::<root::RefPtr<root::nsBindingManager>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
@@ -34939,63 +34973,39 @@ pub mod root {
                    "Size of template specialization: " , stringify ! (
                    root::RefPtr<root::nsNodeInfoManager> ) ));
         assert_eq!(::std::mem::align_of::<root::RefPtr<root::nsNodeInfoManager>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::RefPtr<root::nsNodeInfoManager> ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTArray_open0_nsTString_open1_char_close1_close0_instantiation_4() {
-        assert_eq!(::std::mem::size_of::<root::nsTArray<root::nsTString<::std::os::raw::c_char>>>()
-                   , 8usize , concat ! (
-                   "Size of template specialization: " , stringify ! (
-                   root::nsTArray<root::nsTString<::std::os::raw::c_char>> )
-                   ));
-        assert_eq!(::std::mem::align_of::<root::nsTArray<root::nsTString<::std::os::raw::c_char>>>()
-                   , 8usize , concat ! (
-                   "Alignment of template specialization: " , stringify ! (
-                   root::nsTArray<root::nsTString<::std::os::raw::c_char>> )
-                   ));
-    }
-    #[test]
-    fn __bindgen_test_layout_nsTString_open0_char_close0_instantiation_5() {
-        assert_eq!(::std::mem::size_of::<root::nsTString<::std::os::raw::c_char>>()
-                   , 16usize , concat ! (
-                   "Size of template specialization: " , stringify ! (
-                   root::nsTString<::std::os::raw::c_char> ) ));
-        assert_eq!(::std::mem::align_of::<root::nsTString<::std::os::raw::c_char>>()
-                   , 8usize , concat ! (
-                   "Alignment of template specialization: " , stringify ! (
-                   root::nsTString<::std::os::raw::c_char> ) ));
-    }
-    #[test]
-    fn __bindgen_test_layout_nsTArray_open0_nsTString_open1_char16_t_close1_close0_instantiation_2() {
-        assert_eq!(::std::mem::size_of::<root::nsTArray<::nsstring::nsStringRepr>>()
-                   , 8usize , concat ! (
+    fn __bindgen_test_layout_nsTArray_open0_nsCString_close0_instantiation_4() {
+        assert_eq!(::std::mem::size_of::<root::nsTArray<root::nsCString>>() ,
+                   8usize , concat ! (
+                   "Size of template specialization: " , stringify ! (
+                   root::nsTArray<root::nsCString> ) ));
+        assert_eq!(::std::mem::align_of::<root::nsTArray<root::nsCString>>() ,
+                   8usize , concat ! (
+                   "Alignment of template specialization: " , stringify ! (
+                   root::nsTArray<root::nsCString> ) ));
+    }
+    #[test]
+    fn __bindgen_test_layout_nsTArray_open0_nsString_close0_instantiation_2() {
+        assert_eq!(::std::mem::size_of::<root::nsTArray<::nsstring::nsStringRepr>>() ,
+                   8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<::nsstring::nsStringRepr> ) ));
-        assert_eq!(::std::mem::align_of::<root::nsTArray<::nsstring::nsStringRepr>>()
-                   , 8usize , concat ! (
+        assert_eq!(::std::mem::align_of::<root::nsTArray<::nsstring::nsStringRepr>>() ,
+                   8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsTArray<::nsstring::nsStringRepr> ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTString_open0_char16_t_close0_instantiation_3() {
-        assert_eq!(::std::mem::size_of::<::nsstring::nsStringRepr>() , 16usize ,
-                   concat ! (
-                   "Size of template specialization: " , stringify ! (
-                   ::nsstring::nsStringRepr ) ));
-        assert_eq!(::std::mem::align_of::<::nsstring::nsStringRepr>() , 8usize ,
-                   concat ! (
-                   "Alignment of template specialization: " , stringify ! (
-                   ::nsstring::nsStringRepr ) ));
-    }
-    #[test]
-    fn __bindgen_test_layout_nsCOMPtr_open0_Element_close0_instantiation() {
+    fn __bindgen_test_layout_nsCOMPtr_open0_nsDOMAttributeMap_Element_close0_instantiation() {
         assert_eq!(::std::mem::size_of::<root::nsCOMPtr>() , 8usize , concat !
                    (
                    "Size of template specialization: " , stringify ! (
                    root::nsCOMPtr ) ));
         assert_eq!(::std::mem::align_of::<root::nsCOMPtr>() , 8usize , concat
                    ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsCOMPtr ) ));
@@ -35200,39 +35210,39 @@ pub mod root {
                    "Size of template specialization: " , stringify ! (
                    root::nsCOMPtr ) ));
         assert_eq!(::std::mem::align_of::<root::nsCOMPtr>() , 8usize , concat
                    ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsCOMPtr ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsCOMPtr_open0_nsIPrincipal_close0_instantiation_6() {
-        assert_eq!(::std::mem::size_of::<root::nsCOMPtr>() , 8usize , concat !
-                   (
-                   "Size of template specialization: " , stringify ! (
-                   root::nsCOMPtr ) ));
-        assert_eq!(::std::mem::align_of::<root::nsCOMPtr>() , 8usize , concat
-                   ! (
-                   "Alignment of template specialization: " , stringify ! (
-                   root::nsCOMPtr ) ));
-    }
-    #[test]
-    fn __bindgen_test_layout_nsCOMPtr_open0_nsIWeakReference_close0_instantiation_1() {
-        assert_eq!(::std::mem::size_of::<root::nsCOMPtr>() , 8usize , concat !
-                   (
-                   "Size of template specialization: " , stringify ! (
-                   root::nsCOMPtr ) ));
-        assert_eq!(::std::mem::align_of::<root::nsCOMPtr>() , 8usize , concat
-                   ! (
-                   "Alignment of template specialization: " , stringify ! (
-                   root::nsCOMPtr ) ));
-    }
-    #[test]
-    fn __bindgen_test_layout_nsTArray_open0__bindgen_ty_id_230823_close0_instantiation() {
+    fn __bindgen_test_layout_nsCOMPtr_open0_nsIPrincipal_close0_instantiation_7() {
+        assert_eq!(::std::mem::size_of::<root::nsCOMPtr>() , 8usize , concat !
+                   (
+                   "Size of template specialization: " , stringify ! (
+                   root::nsCOMPtr ) ));
+        assert_eq!(::std::mem::align_of::<root::nsCOMPtr>() , 8usize , concat
+                   ! (
+                   "Alignment of template specialization: " , stringify ! (
+                   root::nsCOMPtr ) ));
+    }
+    #[test]
+    fn __bindgen_test_layout_nsCOMPtr_open0_nsIWeakReference_close0_instantiation() {
+        assert_eq!(::std::mem::size_of::<root::nsCOMPtr>() , 8usize , concat !
+                   (
+                   "Size of template specialization: " , stringify ! (
+                   root::nsCOMPtr ) ));
+        assert_eq!(::std::mem::align_of::<root::nsCOMPtr>() , 8usize , concat
+                   ! (
+                   "Alignment of template specialization: " , stringify ! (
+                   root::nsCOMPtr ) ));
+    }
+    #[test]
+    fn __bindgen_test_layout_nsTArray_open0__bindgen_ty_id_208178_close0_instantiation() {
         assert_eq!(::std::mem::size_of::<root::nsTArray<*mut ::std::os::raw::c_void>>()
                    , 8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<*mut ::std::os::raw::c_void> ) ));
         assert_eq!(::std::mem::align_of::<root::nsTArray<*mut ::std::os::raw::c_void>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsTArray<*mut ::std::os::raw::c_void> ) ));
@@ -35301,17 +35311,17 @@ pub mod root {
                    "Size of template specialization: " , stringify ! (
                    root::mozilla::DefaultDelete ) ));
         assert_eq!(::std::mem::align_of::<root::mozilla::DefaultDelete>() ,
                    1usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::mozilla::DefaultDelete ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTArray_open0__bindgen_ty_id_236867_close0_instantiation() {
+    fn __bindgen_test_layout_nsTArray_open0__bindgen_ty_id_214306_close0_instantiation() {
         assert_eq!(::std::mem::size_of::<root::nsTArray<*mut root::mozilla::dom::AudioContext>>()
                    , 8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<*mut root::mozilla::dom::AudioContext> ) ));
         assert_eq!(::std::mem::align_of::<root::nsTArray<*mut root::mozilla::dom::AudioContext>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsTArray<*mut root::mozilla::dom::AudioContext> ) ));
@@ -35391,49 +35401,38 @@ pub mod root {
                    ) ));
         assert_eq!(::std::mem::align_of::<root::nsTArray<root::mozilla::CycleCollectedJSContext_RunInMetastableStateData>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsTArray<root::mozilla::CycleCollectedJSContext_RunInMetastableStateData>
                    ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTArray_open0__bindgen_ty_id_239176_close0_instantiation() {
+    fn __bindgen_test_layout_nsTArray_open0__bindgen_ty_id_216713_close0_instantiation() {
         assert_eq!(::std::mem::size_of::<root::nsTArray<*mut root::nsISupports>>()
                    , 8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<*mut root::nsISupports> ) ));
         assert_eq!(::std::mem::align_of::<root::nsTArray<*mut root::nsISupports>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsTArray<*mut root::nsISupports> ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTArray_open0_nsTString_open1_char16_t_close1_close0_instantiation_3() {
-        assert_eq!(::std::mem::size_of::<root::nsTArray<::nsstring::nsStringRepr>>()
-                   , 8usize , concat ! (
+    fn __bindgen_test_layout_nsTArray_open0_nsString_close0_instantiation_3() {
+        assert_eq!(::std::mem::size_of::<root::nsTArray<::nsstring::nsStringRepr>>() ,
+                   8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<::nsstring::nsStringRepr> ) ));
-        assert_eq!(::std::mem::align_of::<root::nsTArray<::nsstring::nsStringRepr>>()
-                   , 8usize , concat ! (
+        assert_eq!(::std::mem::align_of::<root::nsTArray<::nsstring::nsStringRepr>>() ,
+                   8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsTArray<::nsstring::nsStringRepr> ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTString_open0_char16_t_close0_instantiation_4() {
-        assert_eq!(::std::mem::size_of::<::nsstring::nsStringRepr>() , 16usize ,
-                   concat ! (
-                   "Size of template specialization: " , stringify ! (
-                   ::nsstring::nsStringRepr ) ));
-        assert_eq!(::std::mem::align_of::<::nsstring::nsStringRepr>() , 8usize ,
-                   concat ! (
-                   "Alignment of template specialization: " , stringify ! (
-                   ::nsstring::nsStringRepr ) ));
-    }
-    #[test]
     fn __bindgen_test_layout_nsCOMPtr_open0_nsIURI_close0_instantiation_10() {
         assert_eq!(::std::mem::size_of::<root::nsCOMPtr>() , 8usize , concat !
                    (
                    "Size of template specialization: " , stringify ! (
                    root::nsCOMPtr ) ));
         assert_eq!(::std::mem::align_of::<root::nsCOMPtr>() , 8usize , concat
                    ! (
                    "Alignment of template specialization: " , stringify ! (
@@ -35556,38 +35555,27 @@ pub mod root {
                    "Size of template specialization: " , stringify ! (
                    root::nsStyleAutoArray<root::mozilla::StyleAnimation> ) ));
         assert_eq!(::std::mem::align_of::<root::nsStyleAutoArray<root::mozilla::StyleAnimation>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsStyleAutoArray<root::mozilla::StyleAnimation> ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTArray_open0_nsTString_open1_char16_t_close1_close0_instantiation_4() {
-        assert_eq!(::std::mem::size_of::<root::nsTArray<::nsstring::nsStringRepr>>()
-                   , 8usize , concat ! (
+    fn __bindgen_test_layout_nsTArray_open0_nsString_close0_instantiation_4() {
+        assert_eq!(::std::mem::size_of::<root::nsTArray<::nsstring::nsStringRepr>>() ,
+                   8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<::nsstring::nsStringRepr> ) ));
-        assert_eq!(::std::mem::align_of::<root::nsTArray<::nsstring::nsStringRepr>>()
-                   , 8usize , concat ! (
+        assert_eq!(::std::mem::align_of::<root::nsTArray<::nsstring::nsStringRepr>>() ,
+                   8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsTArray<::nsstring::nsStringRepr> ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTString_open0_char16_t_close0_instantiation_5() {
-        assert_eq!(::std::mem::size_of::<::nsstring::nsStringRepr>() , 16usize ,
-                   concat ! (
-                   "Size of template specialization: " , stringify ! (
-                   ::nsstring::nsStringRepr ) ));
-        assert_eq!(::std::mem::align_of::<::nsstring::nsStringRepr>() , 8usize ,
-                   concat ! (
-                   "Alignment of template specialization: " , stringify ! (
-                   ::nsstring::nsStringRepr ) ));
-    }
-    #[test]
     fn __bindgen_test_layout_nsTArray_open0_RefPtr_open1_SheetLoadData_close1_close0_instantiation() {
         assert_eq!(::std::mem::size_of::<root::nsTArray<root::RefPtr<root::mozilla::css::SheetLoadData>>>()
                    , 8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<root::RefPtr<root::mozilla::css::SheetLoadData>>
                    ) ));
         assert_eq!(::std::mem::align_of::<root::nsTArray<root::RefPtr<root::mozilla::css::SheetLoadData>>>()
                    , 8usize , concat ! (
@@ -35683,17 +35671,17 @@ pub mod root {
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<f64> ) ));
         assert_eq!(::std::mem::align_of::<root::nsTArray<f64>>() , 8usize ,
                    concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsTArray<f64> ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTArray_open0__bindgen_ty_id_241338_close0_instantiation() {
+    fn __bindgen_test_layout_nsTArray_open0__bindgen_ty_id_218867_close0_instantiation() {
         assert_eq!(::std::mem::size_of::<root::nsTArray<*mut root::mozilla::dom::Element>>()
                    , 8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<*mut root::mozilla::dom::Element> ) ));
         assert_eq!(::std::mem::align_of::<root::nsTArray<*mut root::mozilla::dom::Element>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsTArray<*mut root::mozilla::dom::Element> ) ));
@@ -35731,38 +35719,27 @@ pub mod root {
                    "Size of template specialization: " , stringify ! (
                    root::mozilla::UniquePtr<root::ProfilerBacktrace> ) ));
         assert_eq!(::std::mem::align_of::<root::mozilla::UniquePtr<root::ProfilerBacktrace>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::mozilla::UniquePtr<root::ProfilerBacktrace> ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTArray_open0_nsTString_open1_char16_t_close1_close0_instantiation_5() {
-        assert_eq!(::std::mem::size_of::<root::nsTArray<::nsstring::nsStringRepr>>()
-                   , 8usize , concat ! (
+    fn __bindgen_test_layout_nsTArray_open0_nsString_close0_instantiation_5() {
+        assert_eq!(::std::mem::size_of::<root::nsTArray<::nsstring::nsStringRepr>>() ,
+                   8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<::nsstring::nsStringRepr> ) ));
-        assert_eq!(::std::mem::align_of::<root::nsTArray<::nsstring::nsStringRepr>>()
-                   , 8usize , concat ! (
+        assert_eq!(::std::mem::align_of::<root::nsTArray<::nsstring::nsStringRepr>>() ,
+                   8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsTArray<::nsstring::nsStringRepr> ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTString_open0_char16_t_close0_instantiation_6() {
-        assert_eq!(::std::mem::size_of::<::nsstring::nsStringRepr>() , 16usize ,
-                   concat ! (
-                   "Size of template specialization: " , stringify ! (
-                   ::nsstring::nsStringRepr ) ));
-        assert_eq!(::std::mem::align_of::<::nsstring::nsStringRepr>() , 8usize ,
-                   concat ! (
-                   "Alignment of template specialization: " , stringify ! (
-                   ::nsstring::nsStringRepr ) ));
-    }
-    #[test]
     fn __bindgen_test_layout_RefPtr_open0_nsAtom_close0_instantiation_10() {
         assert_eq!(::std::mem::size_of::<root::RefPtr<root::nsAtom>>() ,
                    8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::RefPtr<root::nsAtom> ) ));
         assert_eq!(::std::mem::align_of::<root::RefPtr<root::nsAtom>>() ,
                    8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
@@ -35799,17 +35776,17 @@ pub mod root {
                    "Size of template specialization: " , stringify ! (
                    root::nsRefPtrHashKey<root::nsAtom> ) ));
         assert_eq!(::std::mem::align_of::<root::nsRefPtrHashKey<root::nsAtom>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsRefPtrHashKey<root::nsAtom> ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTArray_open0__bindgen_ty_id_243710_close0_instantiation() {
+    fn __bindgen_test_layout_nsTArray_open0__bindgen_ty_id_221107_close0_instantiation() {
         assert_eq!(::std::mem::size_of::<root::nsTArray<*mut root::mozilla::CounterStyle>>()
                    , 8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<*mut root::mozilla::CounterStyle> ) ));
         assert_eq!(::std::mem::align_of::<root::nsTArray<*mut root::mozilla::CounterStyle>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsTArray<*mut root::mozilla::CounterStyle> ) ));
@@ -35832,38 +35809,27 @@ pub mod root {
                    "Size of template specialization: " , stringify ! (
                    root::nsCOMPtr ) ));
         assert_eq!(::std::mem::align_of::<root::nsCOMPtr>() , 8usize , concat
                    ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsCOMPtr ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTArray_open0_nsTString_open1_char16_t_close1_close0_instantiation_6() {
-        assert_eq!(::std::mem::size_of::<root::nsTArray<::nsstring::nsStringRepr>>()
-                   , 8usize , concat ! (
+    fn __bindgen_test_layout_nsTArray_open0_nsString_close0_instantiation_6() {
+        assert_eq!(::std::mem::size_of::<root::nsTArray<::nsstring::nsStringRepr>>() ,
+                   8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<::nsstring::nsStringRepr> ) ));
-        assert_eq!(::std::mem::align_of::<root::nsTArray<::nsstring::nsStringRepr>>()
-                   , 8usize , concat ! (
+        assert_eq!(::std::mem::align_of::<root::nsTArray<::nsstring::nsStringRepr>>() ,
+                   8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsTArray<::nsstring::nsStringRepr> ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTString_open0_char16_t_close0_instantiation_7() {
-        assert_eq!(::std::mem::size_of::<::nsstring::nsStringRepr>() , 16usize ,
-                   concat ! (
-                   "Size of template specialization: " , stringify ! (
-                   ::nsstring::nsStringRepr ) ));
-        assert_eq!(::std::mem::align_of::<::nsstring::nsStringRepr>() , 8usize ,
-                   concat ! (
-                   "Alignment of template specialization: " , stringify ! (
-                   ::nsstring::nsStringRepr ) ));
-    }
-    #[test]
     fn __bindgen_test_layout_UniquePtr_open0_URLParams_DefaultDelete_open1_URLParams_close1_close0_instantiation() {
         assert_eq!(::std::mem::size_of::<root::mozilla::UniquePtr<root::mozilla::dom::URLParams>>()
                    , 8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::mozilla::UniquePtr<root::mozilla::dom::URLParams> )
                    ));
         assert_eq!(::std::mem::align_of::<root::mozilla::UniquePtr<root::mozilla::dom::URLParams>>()
                    , 8usize , concat ! (
@@ -35878,60 +35844,60 @@ pub mod root {
                    "Size of template specialization: " , stringify ! (
                    root::mozilla::DefaultDelete ) ));
         assert_eq!(::std::mem::align_of::<root::mozilla::DefaultDelete>() ,
                    1usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::mozilla::DefaultDelete ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTArray_open0_nsTString_open1_char16_t_close1_close0_instantiation_7() {
-        assert_eq!(::std::mem::size_of::<root::nsTArray<::nsstring::nsStringRepr>>()
-                   , 8usize , concat ! (
+    fn __bindgen_test_layout_nsTArray_open0_nsString_close0_instantiation_7() {
+        assert_eq!(::std::mem::size_of::<root::nsTArray<::nsstring::nsStringRepr>>() ,
+                   8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<::nsstring::nsStringRepr> ) ));
-        assert_eq!(::std::mem::align_of::<root::nsTArray<::nsstring::nsStringRepr>>()
-                   , 8usize , concat ! (
+        assert_eq!(::std::mem::align_of::<root::nsTArray<::nsstring::nsStringRepr>>() ,
+                   8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsTArray<::nsstring::nsStringRepr> ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTString_open0_char16_t_close0_instantiation_8() {
-        assert_eq!(::std::mem::size_of::<::nsstring::nsStringRepr>() , 16usize ,
-                   concat ! (
-                   "Size of template specialization: " , stringify ! (
-                   ::nsstring::nsStringRepr ) ));
-        assert_eq!(::std::mem::align_of::<::nsstring::nsStringRepr>() , 8usize ,
-                   concat ! (
-                   "Alignment of template specialization: " , stringify ! (
-                   ::nsstring::nsStringRepr ) ));
-    }
-    #[test]
     fn __bindgen_test_layout_nsTArray_open0_URLParams_Param_close0_instantiation() {
         assert_eq!(::std::mem::size_of::<root::nsTArray<root::mozilla::dom::URLParams_Param>>()
                    , 8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<root::mozilla::dom::URLParams_Param> ) ));
         assert_eq!(::std::mem::align_of::<root::nsTArray<root::mozilla::dom::URLParams_Param>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsTArray<root::mozilla::dom::URLParams_Param> ) ));
     }
     #[test]
-    fn __bindgen_test_layout_UniquePtr_open0_const_char_XREAppData_NSFreePolicy_close0_instantiation() {
+    fn __bindgen_test_layout_UniquePtr_open0_const_char_FreePolicy_open1_const_char_close1_close0_instantiation() {
         assert_eq!(::std::mem::size_of::<root::mozilla::UniquePtr<::std::os::raw::c_char>>()
                    , 8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::mozilla::UniquePtr<::std::os::raw::c_char> ) ));
         assert_eq!(::std::mem::align_of::<root::mozilla::UniquePtr<::std::os::raw::c_char>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::mozilla::UniquePtr<::std::os::raw::c_char> ) ));
     }
     #[test]
+    fn __bindgen_test_layout_FreePolicy_open0_const_char_close0_instantiation() {
+        assert_eq!(::std::mem::size_of::<root::mozilla::detail::FreePolicy>()
+                   , 1usize , concat ! (
+                   "Size of template specialization: " , stringify ! (
+                   root::mozilla::detail::FreePolicy ) ));
+        assert_eq!(::std::mem::align_of::<root::mozilla::detail::FreePolicy>()
+                   , 1usize , concat ! (
+                   "Alignment of template specialization: " , stringify ! (
+                   root::mozilla::detail::FreePolicy ) ));
+    }
+    #[test]
     fn __bindgen_test_layout_nsCOMPtr_open0_nsIEventTarget_close0_instantiation() {
         assert_eq!(::std::mem::size_of::<root::nsCOMPtr>() , 8usize , concat !
                    (
                    "Size of template specialization: " , stringify ! (
                    root::nsCOMPtr ) ));
         assert_eq!(::std::mem::align_of::<root::nsCOMPtr>() , 8usize , concat
                    ! (
                    "Alignment of template specialization: " , stringify ! (
@@ -35966,25 +35932,25 @@ pub mod root {
                    "Size of template specialization: " , stringify ! (
                    root::mozilla::DefaultDelete ) ));
         assert_eq!(::std::mem::align_of::<root::mozilla::DefaultDelete>() ,
                    1usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::mozilla::DefaultDelete ) ));
     }
     #[test]
-    fn __bindgen_test_layout_RefPtr_open0_ImageURL_close0_instantiation() {
-        assert_eq!(::std::mem::size_of::<root::RefPtr<root::mozilla::image::ImageURL>>()
-                   , 8usize , concat ! (
-                   "Size of template specialization: " , stringify ! (
-                   root::RefPtr<root::mozilla::image::ImageURL> ) ));
-        assert_eq!(::std::mem::align_of::<root::RefPtr<root::mozilla::image::ImageURL>>()
-                   , 8usize , concat ! (
-                   "Alignment of template specialization: " , stringify ! (
-                   root::RefPtr<root::mozilla::image::ImageURL> ) ));
+    fn __bindgen_test_layout_RefPtr_open0_imgRequestProxy_ImageURL_close0_instantiation() {
+        assert_eq!(::std::mem::size_of::<root::RefPtr<root::imgRequestProxy_ImageURL>>()
+                   , 8usize , concat ! (
+                   "Size of template specialization: " , stringify ! (
+                   root::RefPtr<root::imgRequestProxy_ImageURL> ) ));
+        assert_eq!(::std::mem::align_of::<root::RefPtr<root::imgRequestProxy_ImageURL>>()
+                   , 8usize , concat ! (
+                   "Alignment of template specialization: " , stringify ! (
+                   root::RefPtr<root::imgRequestProxy_ImageURL> ) ));
     }
     #[test]
     fn __bindgen_test_layout_nsCOMPtr_open0_nsILoadGroup_close0_instantiation() {
         assert_eq!(::std::mem::size_of::<root::nsCOMPtr>() , 8usize , concat !
                    (
                    "Size of template specialization: " , stringify ! (
                    root::nsCOMPtr ) ));
         assert_eq!(::std::mem::align_of::<root::nsCOMPtr>() , 8usize , concat
@@ -36054,38 +36020,27 @@ pub mod root {
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<root::mozilla::css::GridNamedArea> ) ));
         assert_eq!(::std::mem::align_of::<root::nsTArray<root::mozilla::css::GridNamedArea>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsTArray<root::mozilla::css::GridNamedArea> ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTArray_open0_nsTString_open1_char16_t_close1_close0_instantiation_8() {
-        assert_eq!(::std::mem::size_of::<root::nsTArray<::nsstring::nsStringRepr>>()
-                   , 8usize , concat ! (
+    fn __bindgen_test_layout_nsTArray_open0_nsString_close0_instantiation_8() {
+        assert_eq!(::std::mem::size_of::<root::nsTArray<::nsstring::nsStringRepr>>() ,
+                   8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<::nsstring::nsStringRepr> ) ));
-        assert_eq!(::std::mem::align_of::<root::nsTArray<::nsstring::nsStringRepr>>()
-                   , 8usize , concat ! (
+        assert_eq!(::std::mem::align_of::<root::nsTArray<::nsstring::nsStringRepr>>() ,
+                   8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsTArray<::nsstring::nsStringRepr> ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTString_open0_char16_t_close0_instantiation_9() {
-        assert_eq!(::std::mem::size_of::<::nsstring::nsStringRepr>() , 16usize ,
-                   concat ! (
-                   "Size of template specialization: " , stringify ! (
-                   ::nsstring::nsStringRepr ) ));
-        assert_eq!(::std::mem::align_of::<::nsstring::nsStringRepr>() , 8usize ,
-                   concat ! (
-                   "Alignment of template specialization: " , stringify ! (
-                   ::nsstring::nsStringRepr ) ));
-    }
-    #[test]
     fn __bindgen_test_layout_nsTArray_open0_nsCSSValueGradientStop_close0_instantiation() {
         assert_eq!(::std::mem::size_of::<root::nsTArray<root::nsCSSValueGradientStop>>()
                    , 8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<root::nsCSSValueGradientStop> ) ));
         assert_eq!(::std::mem::align_of::<root::nsTArray<root::nsCSSValueGradientStop>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
@@ -36109,91 +36064,58 @@ pub mod root {
                    "Size of template specialization: " , stringify ! (
                    root::nsCOMPtr ) ));
         assert_eq!(::std::mem::align_of::<root::nsCOMPtr>() , 8usize , concat
                    ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsCOMPtr ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsCOMPtr_open0_nsIPrincipal_close0_instantiation_7() {
-        assert_eq!(::std::mem::size_of::<root::nsCOMPtr>() , 8usize , concat !
-                   (
-                   "Size of template specialization: " , stringify ! (
-                   root::nsCOMPtr ) ));
-        assert_eq!(::std::mem::align_of::<root::nsCOMPtr>() , 8usize , concat
-                   ! (
-                   "Alignment of template specialization: " , stringify ! (
-                   root::nsCOMPtr ) ));
-    }
-    #[test]
-    fn __bindgen_test_layout_nsTArray_open0_nsTString_open1_char16_t_close1_close0_instantiation_9() {
-        assert_eq!(::std::mem::size_of::<root::nsTArray<::nsstring::nsStringRepr>>()
-                   , 8usize , concat ! (
-                   "Size of template specialization: " , stringify ! (
-                   root::nsTArray<::nsstring::nsStringRepr> ) ));
-        assert_eq!(::std::mem::align_of::<root::nsTArray<::nsstring::nsStringRepr>>()
-                   , 8usize , concat ! (
-                   "Alignment of template specialization: " , stringify ! (
-                   root::nsTArray<::nsstring::nsStringRepr> ) ));
-    }
-    #[test]
-    fn __bindgen_test_layout_nsTString_open0_char16_t_close0_instantiation_10() {
-        assert_eq!(::std::mem::size_of::<::nsstring::nsStringRepr>() , 16usize ,
-                   concat ! (
-                   "Size of template specialization: " , stringify ! (
-                   ::nsstring::nsStringRepr ) ));
-        assert_eq!(::std::mem::align_of::<::nsstring::nsStringRepr>() , 8usize ,
-                   concat ! (
-                   "Alignment of template specialization: " , stringify ! (
-                   ::nsstring::nsStringRepr ) ));
-    }
-    #[test]
-    fn __bindgen_test_layout_nsTArray_open0_nsTString_open1_char16_t_close1_close0_instantiation_10() {
-        assert_eq!(::std::mem::size_of::<root::nsTArray<::nsstring::nsStringRepr>>()
-                   , 8usize , concat ! (
+    fn __bindgen_test_layout_nsCOMPtr_open0_nsIPrincipal_close0_instantiation_8() {
+        assert_eq!(::std::mem::size_of::<root::nsCOMPtr>() , 8usize , concat !
+                   (
+                   "Size of template specialization: " , stringify ! (
+                   root::nsCOMPtr ) ));
+        assert_eq!(::std::mem::align_of::<root::nsCOMPtr>() , 8usize , concat
+                   ! (
+                   "Alignment of template specialization: " , stringify ! (
+                   root::nsCOMPtr ) ));
+    }
+    #[test]
+    fn __bindgen_test_layout_nsTArray_open0_nsString_close0_instantiation_9() {
+        assert_eq!(::std::mem::size_of::<root::nsTArray<::nsstring::nsStringRepr>>() ,
+                   8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<::nsstring::nsStringRepr> ) ));
-        assert_eq!(::std::mem::align_of::<root::nsTArray<::nsstring::nsStringRepr>>()
-                   , 8usize , concat ! (
+        assert_eq!(::std::mem::align_of::<root::nsTArray<::nsstring::nsStringRepr>>() ,
+                   8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsTArray<::nsstring::nsStringRepr> ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTString_open0_char16_t_close0_instantiation_11() {
-        assert_eq!(::std::mem::size_of::<::nsstring::nsStringRepr>() , 16usize ,
-                   concat ! (
-                   "Size of template specialization: " , stringify ! (
-                   ::nsstring::nsStringRepr ) ));
-        assert_eq!(::std::mem::align_of::<::nsstring::nsStringRepr>() , 8usize ,
-                   concat ! (
-                   "Alignment of template specialization: " , stringify ! (
-                   ::nsstring::nsStringRepr ) ));
-    }
-    #[test]
-    fn __bindgen_test_layout_nsTArray_open0_nsTString_open1_char16_t_close1_close0_instantiation_11() {
-        assert_eq!(::std::mem::size_of::<root::nsTArray<::nsstring::nsStringRepr>>()
-                   , 8usize , concat ! (
+    fn __bindgen_test_layout_nsTArray_open0_nsString_close0_instantiation_10() {
+        assert_eq!(::std::mem::size_of::<root::nsTArray<::nsstring::nsStringRepr>>() ,
+                   8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<::nsstring::nsStringRepr> ) ));
-        assert_eq!(::std::mem::align_of::<root::nsTArray<::nsstring::nsStringRepr>>()
-                   , 8usize , concat ! (
+        assert_eq!(::std::mem::align_of::<root::nsTArray<::nsstring::nsStringRepr>>() ,
+                   8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsTArray<::nsstring::nsStringRepr> ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTString_open0_char16_t_close0_instantiation_12() {
-        assert_eq!(::std::mem::size_of::<::nsstring::nsStringRepr>() , 16usize ,
-                   concat ! (
-                   "Size of template specialization: " , stringify ! (
-                   ::nsstring::nsStringRepr ) ));
-        assert_eq!(::std::mem::align_of::<::nsstring::nsStringRepr>() , 8usize ,
-                   concat ! (
-                   "Alignment of template specialization: " , stringify ! (
-                   ::nsstring::nsStringRepr ) ));
+    fn __bindgen_test_layout_nsTArray_open0_nsString_close0_instantiation_11() {
+        assert_eq!(::std::mem::size_of::<root::nsTArray<::nsstring::nsStringRepr>>() ,
+                   8usize , concat ! (
+                   "Size of template specialization: " , stringify ! (
+                   root::nsTArray<::nsstring::nsStringRepr> ) ));
+        assert_eq!(::std::mem::align_of::<root::nsTArray<::nsstring::nsStringRepr>>() ,
+                   8usize , concat ! (
+                   "Alignment of template specialization: " , stringify ! (
+                   root::nsTArray<::nsstring::nsStringRepr> ) ));
     }
     #[test]
     fn __bindgen_test_layout_nsTArray_open0_nsStyleGradientStop_close0_instantiation() {
         assert_eq!(::std::mem::size_of::<root::nsTArray<root::nsStyleGradientStop>>()
                    , 8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<root::nsStyleGradientStop> ) ));
         assert_eq!(::std::mem::align_of::<root::nsTArray<root::nsStyleGradientStop>>()
@@ -36353,112 +36275,75 @@ pub mod root {
                    ));
         assert_eq!(::std::mem::align_of::<root::nsStyleAutoArray<root::nsStyleImageLayers_Layer>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsStyleAutoArray<root::nsStyleImageLayers_Layer> )
                    ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTArray_open0_unsigned_int_close0_instantiation_5() {
-        assert_eq!(::std::mem::size_of::<root::nsTArray<::std::os::raw::c_uint>>()
-                   , 8usize , concat ! (
-                   "Size of template specialization: " , stringify ! (
-                   root::nsTArray<::std::os::raw::c_uint> ) ));
-        assert_eq!(::std::mem::align_of::<root::nsTArray<::std::os::raw::c_uint>>()
-                   , 8usize , concat ! (
-                   "Alignment of template specialization: " , stringify ! (
-                   root::nsTArray<::std::os::raw::c_uint> ) ));
-    }
-    #[test]
-    fn __bindgen_test_layout_nsTArray_open0_pair_open1_nsTString_open2_char16_t_close2_nsTString_open2_char16_t_close2_close1_close0_instantiation() {
+    fn __bindgen_test_layout_nsTArray_open0_nscolor_close0_instantiation() {
+        assert_eq!(::std::mem::size_of::<root::nsTArray<root::nscolor>>() ,
+                   8usize , concat ! (
+                   "Size of template specialization: " , stringify ! (
+                   root::nsTArray<root::nscolor> ) ));
+        assert_eq!(::std::mem::align_of::<root::nsTArray<root::nscolor>>() ,
+                   8usize , concat ! (
+                   "Alignment of template specialization: " , stringify ! (
+                   root::nsTArray<root::nscolor> ) ));
+    }
+    #[test]
+    fn __bindgen_test_layout_nsTArray_open0_pair_open1_nsString_nsString_close1_close0_instantiation() {
         assert_eq!(::std::mem::size_of::<root::nsTArray<root::std::pair<::nsstring::nsStringRepr,
                                                      ::nsstring::nsStringRepr>>>()
                    , 8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<root::std::pair<::nsstring::nsStringRepr, ::nsstring::nsStringRepr>>
                    ) ));
         assert_eq!(::std::mem::align_of::<root::nsTArray<root::std::pair<::nsstring::nsStringRepr,
                                                       ::nsstring::nsStringRepr>>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsTArray<root::std::pair<::nsstring::nsStringRepr, ::nsstring::nsStringRepr>>
                    ) ));
     }
     #[test]
-    fn __bindgen_test_layout_pair_open0_nsTString_open1_char16_t_close1_nsTString_open1_char16_t_close1_close0_instantiation() {
-        assert_eq!(::std::mem::size_of::<root::std::pair<::nsstring::nsStringRepr,
-                                      ::nsstring::nsStringRepr>>()
+    fn __bindgen_test_layout_pair_open0_nsString_nsString_close0_instantiation() {
+        assert_eq!(::std::mem::size_of::<root::std::pair<::nsstring::nsStringRepr, ::nsstring::nsStringRepr>>()
                    , 32usize , concat ! (
                    "Size of template specialization: " , stringify ! (
-                   root::std::pair<::nsstring::nsStringRepr, ::nsstring::nsStringRepr>
-                   ) ));
-        assert_eq!(::std::mem::align_of::<root::std::pair<::nsstring::nsStringRepr,
-                                       ::nsstring::nsStringRepr>>()
-                   , 8usize , concat ! (
-                   "Alignment of template specialization: " , stringify ! (
-                   root::std::pair<::nsstring::nsStringRepr, ::nsstring::nsStringRepr>
-                   ) ));
-    }
-    #[test]
-    fn __bindgen_test_layout_nsTString_open0_char16_t_close0_instantiation_13() {
-        assert_eq!(::std::mem::size_of::<::nsstring::nsStringRepr>() , 16usize ,
-                   concat ! (
-                   "Size of template specialization: " , stringify ! (
-                   ::nsstring::nsStringRepr ) ));
-        assert_eq!(::std::mem::align_of::<::nsstring::nsStringRepr>() , 8usize ,
-                   concat ! (
-                   "Alignment of template specialization: " , stringify ! (
-                   ::nsstring::nsStringRepr ) ));
-    }
-    #[test]
-    fn __bindgen_test_layout_nsTString_open0_char16_t_close0_instantiation_14() {
-        assert_eq!(::std::mem::size_of::<::nsstring::nsStringRepr>() , 16usize ,
-                   concat ! (
-                   "Size of template specialization: " , stringify ! (
-                   ::nsstring::nsStringRepr ) ));
-        assert_eq!(::std::mem::align_of::<::nsstring::nsStringRepr>() , 8usize ,
-                   concat ! (
-                   "Alignment of template specialization: " , stringify ! (
-                   ::nsstring::nsStringRepr ) ));
-    }
-    #[test]
-    fn __bindgen_test_layout_nsTArray_open0_nsTArray_open1_nsTString_open2_char16_t_close2_close1_close0_instantiation() {
+                   root::std::pair<::nsstring::nsStringRepr, ::nsstring::nsStringRepr> ) ));
+        assert_eq!(::std::mem::align_of::<root::std::pair<::nsstring::nsStringRepr, ::nsstring::nsStringRepr>>()
+                   , 8usize , concat ! (
+                   "Alignment of template specialization: " , stringify ! (
+                   root::std::pair<::nsstring::nsStringRepr, ::nsstring::nsStringRepr> ) ));
+    }
+    #[test]
+    fn __bindgen_test_layout_nsTArray_open0_nsTArray_open1_nsString_close1_close0_instantiation() {
         assert_eq!(::std::mem::size_of::<root::nsTArray<root::nsTArray<::nsstring::nsStringRepr>>>()
                    , 8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<root::nsTArray<::nsstring::nsStringRepr>> ) ));
         assert_eq!(::std::mem::align_of::<root::nsTArray<root::nsTArray<::nsstring::nsStringRepr>>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsTArray<root::nsTArray<::nsstring::nsStringRepr>> ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTArray_open0_nsTString_open1_char16_t_close1_close0_instantiation_12() {
-        assert_eq!(::std::mem::size_of::<root::nsTArray<::nsstring::nsStringRepr>>()
-                   , 8usize , concat ! (
+    fn __bindgen_test_layout_nsTArray_open0_nsString_close0_instantiation_12() {
+        assert_eq!(::std::mem::size_of::<root::nsTArray<::nsstring::nsStringRepr>>() ,
+                   8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<::nsstring::nsStringRepr> ) ));
-        assert_eq!(::std::mem::align_of::<root::nsTArray<::nsstring::nsStringRepr>>()
-                   , 8usize , concat ! (
+        assert_eq!(::std::mem::align_of::<root::nsTArray<::nsstring::nsStringRepr>>() ,
+                   8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsTArray<::nsstring::nsStringRepr> ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTString_open0_char16_t_close0_instantiation_15() {
-        assert_eq!(::std::mem::size_of::<::nsstring::nsStringRepr>() , 16usize ,
-                   concat ! (
-                   "Size of template specialization: " , stringify ! (
-                   ::nsstring::nsStringRepr ) ));
-        assert_eq!(::std::mem::align_of::<::nsstring::nsStringRepr>() , 8usize ,
-                   concat ! (
-                   "Alignment of template specialization: " , stringify ! (
-                   ::nsstring::nsStringRepr ) ));
-    }
-    #[test]
     fn __bindgen_test_layout_nsTArray_open0_nsStyleCoord_close0_instantiation_1() {
         assert_eq!(::std::mem::size_of::<root::nsTArray<root::nsStyleCoord>>()
                    , 8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<root::nsStyleCoord> ) ));
         assert_eq!(::std::mem::align_of::<root::nsTArray<root::nsStyleCoord>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
@@ -36471,60 +36356,38 @@ pub mod root {
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<root::nsStyleCoord> ) ));
         assert_eq!(::std::mem::align_of::<root::nsTArray<root::nsStyleCoord>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsTArray<root::nsStyleCoord> ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTArray_open0_nsTString_open1_char16_t_close1_close0_instantiation_13() {
-        assert_eq!(::std::mem::size_of::<root::nsTArray<::nsstring::nsStringRepr>>()
-                   , 8usize , concat ! (
+    fn __bindgen_test_layout_nsTArray_open0_nsString_close0_instantiation_13() {
+        assert_eq!(::std::mem::size_of::<root::nsTArray<::nsstring::nsStringRepr>>() ,
+                   8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<::nsstring::nsStringRepr> ) ));
-        assert_eq!(::std::mem::align_of::<root::nsTArray<::nsstring::nsStringRepr>>()
-                   , 8usize , concat ! (
+        assert_eq!(::std::mem::align_of::<root::nsTArray<::nsstring::nsStringRepr>>() ,
+                   8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsTArray<::nsstring::nsStringRepr> ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTString_open0_char16_t_close0_instantiation_16() {
-        assert_eq!(::std::mem::size_of::<::nsstring::nsStringRepr>() , 16usize ,
-                   concat ! (
-                   "Size of template specialization: " , stringify ! (
-                   ::nsstring::nsStringRepr ) ));
-        assert_eq!(::std::mem::align_of::<::nsstring::nsStringRepr>() , 8usize ,
-                   concat ! (
-                   "Alignment of template specialization: " , stringify ! (
-                   ::nsstring::nsStringRepr ) ));
-    }
-    #[test]
-    fn __bindgen_test_layout_nsTArray_open0_nsTString_open1_char16_t_close1_close0_instantiation_14() {
-        assert_eq!(::std::mem::size_of::<root::nsTArray<::nsstring::nsStringRepr>>()
-                   , 8usize , concat ! (
+    fn __bindgen_test_layout_nsTArray_open0_nsString_close0_instantiation_14() {
+        assert_eq!(::std::mem::size_of::<root::nsTArray<::nsstring::nsStringRepr>>() ,
+                   8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<::nsstring::nsStringRepr> ) ));
-        assert_eq!(::std::mem::align_of::<root::nsTArray<::nsstring::nsStringRepr>>()
-                   , 8usize , concat ! (
+        assert_eq!(::std::mem::align_of::<root::nsTArray<::nsstring::nsStringRepr>>() ,
+                   8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsTArray<::nsstring::nsStringRepr> ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTString_open0_char16_t_close0_instantiation_17() {
-        assert_eq!(::std::mem::size_of::<::nsstring::nsStringRepr>() , 16usize ,
-                   concat ! (
-                   "Size of template specialization: " , stringify ! (
-                   ::nsstring::nsStringRepr ) ));
-        assert_eq!(::std::mem::align_of::<::nsstring::nsStringRepr>() , 8usize ,
-                   concat ! (
-                   "Alignment of template specialization: " , stringify ! (
-                   ::nsstring::nsStringRepr ) ));
-    }
-    #[test]
     fn __bindgen_test_layout_RefPtr_open0_nsAtom_close0_instantiation_11() {
         assert_eq!(::std::mem::size_of::<root::RefPtr<root::nsAtom>>() ,
                    8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::RefPtr<root::nsAtom> ) ));
         assert_eq!(::std::mem::align_of::<root::RefPtr<root::nsAtom>>() ,
                    8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
@@ -36675,17 +36538,17 @@ pub mod root {
                    "Size of template specialization: " , stringify ! (
                    root::RefPtr<root::nsStyleImageRequest> ) ));
         assert_eq!(::std::mem::align_of::<root::RefPtr<root::nsStyleImageRequest>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::RefPtr<root::nsStyleImageRequest> ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTArray_open0__bindgen_ty_id_246058_close0_instantiation() {
+    fn __bindgen_test_layout_nsTArray_open0__bindgen_ty_id_223421_close0_instantiation() {
         assert_eq!(::std::mem::size_of::<root::nsTArray<*mut root::nsISupports>>()
                    , 8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<*mut root::nsISupports> ) ));
         assert_eq!(::std::mem::align_of::<root::nsTArray<*mut root::nsISupports>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsTArray<*mut root::nsISupports> ) ));
@@ -36813,17 +36676,17 @@ pub mod root {
                    ) ));
         assert_eq!(::std::mem::align_of::<root::nsTArray<root::nsMediaQueryResultCacheKey_FeatureEntry>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsTArray<root::nsMediaQueryResultCacheKey_FeatureEntry>
                    ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsCOMPtr_open0_nsIPrincipal_close0_instantiation_8() {
+    fn __bindgen_test_layout_nsCOMPtr_open0_nsIPrincipal_close0_instantiation_9() {
         assert_eq!(::std::mem::size_of::<root::nsCOMPtr>() , 8usize , concat !
                    (
                    "Size of template specialization: " , stringify ! (
                    root::nsCOMPtr ) ));
         assert_eq!(::std::mem::align_of::<root::nsCOMPtr>() , 8usize , concat
                    ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsCOMPtr ) ));
@@ -36846,28 +36709,28 @@ pub mod root {
                    "Size of template specialization: " , stringify ! (
                    root::nsCOMPtr ) ));
         assert_eq!(::std::mem::align_of::<root::nsCOMPtr>() , 8usize , concat
                    ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsCOMPtr ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTArray_open0__bindgen_ty_id_249947_close0_instantiation() {
+    fn __bindgen_test_layout_nsTArray_open0__bindgen_ty_id_227416_close0_instantiation() {
         assert_eq!(::std::mem::size_of::<root::nsTArray<*mut root::nsIContent>>()
                    , 8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<*mut root::nsIContent> ) ));
         assert_eq!(::std::mem::align_of::<root::nsTArray<*mut root::nsIContent>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsTArray<*mut root::nsIContent> ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTArray_open0__bindgen_ty_id_249952_close0_instantiation() {
+    fn __bindgen_test_layout_nsTArray_open0__bindgen_ty_id_227421_close0_instantiation() {
         assert_eq!(::std::mem::size_of::<root::nsTArray<*mut root::nsIContent>>()
                    , 8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<*mut root::nsIContent> ) ));
         assert_eq!(::std::mem::align_of::<root::nsTArray<*mut root::nsIContent>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsTArray<*mut root::nsIContent> ) ));
@@ -36945,27 +36808,38 @@ pub mod root {
                    "Size of template specialization: " , stringify ! (
                    root::RefPtr<root::mozilla::dom::ShadowRoot> ) ));
         assert_eq!(::std::mem::align_of::<root::RefPtr<root::mozilla::dom::ShadowRoot>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::RefPtr<root::mozilla::dom::ShadowRoot> ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTArray_open0__bindgen_ty_id_250065_close0_instantiation() {
+    fn __bindgen_test_layout_nsTArray_open0__bindgen_ty_id_227538_close0_instantiation() {
         assert_eq!(::std::mem::size_of::<root::nsTArray<*mut root::nsIContent>>()
                    , 8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<*mut root::nsIContent> ) ));
         assert_eq!(::std::mem::align_of::<root::nsTArray<*mut root::nsIContent>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsTArray<*mut root::nsIContent> ) ));
     }
     #[test]
+    fn __bindgen_test_layout_RefPtr_open0_HTMLSlotElement_close0_instantiation() {
+        assert_eq!(::std::mem::size_of::<root::RefPtr<root::mozilla::dom::HTMLSlotElement>>()
+                   , 8usize , concat ! (
+                   "Size of template specialization: " , stringify ! (
+                   root::RefPtr<root::mozilla::dom::HTMLSlotElement> ) ));
+        assert_eq!(::std::mem::align_of::<root::RefPtr<root::mozilla::dom::HTMLSlotElement>>()
+                   , 8usize , concat ! (
+                   "Alignment of template specialization: " , stringify ! (
+                   root::RefPtr<root::mozilla::dom::HTMLSlotElement> ) ));
+    }
+    #[test]
     fn __bindgen_test_layout_RefPtr_open0_nsXBLBinding_close0_instantiation_1() {
         assert_eq!(::std::mem::size_of::<root::RefPtr<root::nsXBLBinding>>() ,
                    8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::RefPtr<root::nsXBLBinding> ) ));
         assert_eq!(::std::mem::align_of::<root::RefPtr<root::nsXBLBinding>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
@@ -37206,17 +37080,17 @@ pub mod root {
                    "Size of template specialization: " , stringify ! (
                    root::nsRefPtrHashKey<root::mozilla::dom::Element> ) ));
         assert_eq!(::std::mem::align_of::<root::nsRefPtrHashKey<root::mozilla::dom::Element>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsRefPtrHashKey<root::mozilla::dom::Element> ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTArray_open0__bindgen_ty_id_251791_close0_instantiation() {
+    fn __bindgen_test_layout_nsTArray_open0__bindgen_ty_id_229278_close0_instantiation() {
         assert_eq!(::std::mem::size_of::<root::nsTArray<*mut root::nsIContent>>()
                    , 8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<*mut root::nsIContent> ) ));
         assert_eq!(::std::mem::align_of::<root::nsTArray<*mut root::nsIContent>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsTArray<*mut root::nsIContent> ) ));
@@ -37228,28 +37102,50 @@ pub mod root {
                    "Size of template specialization: " , stringify ! (
                    root::RefPtr<root::mozilla::dom::Element> ) ));
         assert_eq!(::std::mem::align_of::<root::RefPtr<root::mozilla::dom::Element>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::RefPtr<root::mozilla::dom::Element> ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTArray_open0__bindgen_ty_id_251949_close0_instantiation() {
+    fn __bindgen_test_layout_nsTArray_open0_uintptr_t_close0_instantiation() {
+        assert_eq!(::std::mem::size_of::<root::nsTArray<usize>>() , 8usize ,
+                   concat ! (
+                   "Size of template specialization: " , stringify ! (
+                   root::nsTArray<usize> ) ));
+        assert_eq!(::std::mem::align_of::<root::nsTArray<usize>>() , 8usize ,
+                   concat ! (
+                   "Alignment of template specialization: " , stringify ! (
+                   root::nsTArray<usize> ) ));
+    }
+    #[test]
+    fn __bindgen_test_layout_nsTArray_open0_uintptr_t_close0_instantiation_1() {
+        assert_eq!(::std::mem::size_of::<root::nsTArray<usize>>() , 8usize ,
+                   concat ! (
+                   "Size of template specialization: " , stringify ! (
+                   root::nsTArray<usize> ) ));
+        assert_eq!(::std::mem::align_of::<root::nsTArray<usize>>() , 8usize ,
+                   concat ! (
+                   "Alignment of template specialization: " , stringify ! (
+                   root::nsTArray<usize> ) ));
+    }
+    #[test]
+    fn __bindgen_test_layout_nsTArray_open0__bindgen_ty_id_229434_close0_instantiation() {
         assert_eq!(::std::mem::size_of::<root::nsTArray<*mut root::nsIContent>>()
                    , 8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<*mut root::nsIContent> ) ));
         assert_eq!(::std::mem::align_of::<root::nsTArray<*mut root::nsIContent>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsTArray<*mut root::nsIContent> ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTArray_open0__bindgen_ty_id_251954_close0_instantiation() {
+    fn __bindgen_test_layout_nsTArray_open0__bindgen_ty_id_229439_close0_instantiation() {
         assert_eq!(::std::mem::size_of::<root::nsTArray<*mut root::nsIContent>>()
                    , 8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<*mut root::nsIContent> ) ));
         assert_eq!(::std::mem::align_of::<root::nsTArray<*mut root::nsIContent>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsTArray<*mut root::nsIContent> ) ));
@@ -37272,49 +37168,38 @@ pub mod root {
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<root::mozilla::FontFamilyName> ) ));
         assert_eq!(::std::mem::align_of::<root::nsTArray<root::mozilla::FontFamilyName>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsTArray<root::mozilla::FontFamilyName> ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTArray_open0_unsigned_int_close0_instantiation_6() {
+    fn __bindgen_test_layout_nsTArray_open0_unsigned_int_close0_instantiation() {
         assert_eq!(::std::mem::size_of::<root::nsTArray<::std::os::raw::c_uint>>()
                    , 8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<::std::os::raw::c_uint> ) ));
         assert_eq!(::std::mem::align_of::<root::nsTArray<::std::os::raw::c_uint>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsTArray<::std::os::raw::c_uint> ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTArray_open0_nsTString_open1_char16_t_close1_close0_instantiation_15() {
-        assert_eq!(::std::mem::size_of::<root::nsTArray<::nsstring::nsStringRepr>>()
-                   , 8usize , concat ! (
+    fn __bindgen_test_layout_nsTArray_open0_nsString_close0_instantiation_15() {
+        assert_eq!(::std::mem::size_of::<root::nsTArray<::nsstring::nsStringRepr>>() ,
+                   8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<::nsstring::nsStringRepr> ) ));
-        assert_eq!(::std::mem::align_of::<root::nsTArray<::nsstring::nsStringRepr>>()
-                   , 8usize , concat ! (
+        assert_eq!(::std::mem::align_of::<root::nsTArray<::nsstring::nsStringRepr>>() ,
+                   8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsTArray<::nsstring::nsStringRepr> ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTString_open0_char16_t_close0_instantiation_18() {
-        assert_eq!(::std::mem::size_of::<::nsstring::nsStringRepr>() , 16usize ,
-                   concat ! (
-                   "Size of template specialization: " , stringify ! (
-                   ::nsstring::nsStringRepr ) ));
-        assert_eq!(::std::mem::align_of::<::nsstring::nsStringRepr>() , 8usize ,
-                   concat ! (
-                   "Alignment of template specialization: " , stringify ! (
-                   ::nsstring::nsStringRepr ) ));
-    }
-    #[test]
     fn __bindgen_test_layout_UniquePtr_open0_nsStyleGridTemplate_DefaultDelete_open1_nsStyleGridTemplate_close1_close0_instantiation_2() {
         assert_eq!(::std::mem::size_of::<root::mozilla::UniquePtr<root::nsStyleGridTemplate>>()
                    , 8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::mozilla::UniquePtr<root::nsStyleGridTemplate> ) ));
         assert_eq!(::std::mem::align_of::<root::mozilla::UniquePtr<root::nsStyleGridTemplate>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
@@ -37393,39 +37278,39 @@ pub mod root {
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<root::gfxFontFeature> ) ));
         assert_eq!(::std::mem::align_of::<root::nsTArray<root::gfxFontFeature>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsTArray<root::gfxFontFeature> ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTArray_open0_FontVariation_close0_instantiation_1() {
-        assert_eq!(::std::mem::size_of::<root::nsTArray<root::mozilla::gfx::FontVariation>>()
-                   , 8usize , concat ! (
-                   "Size of template specialization: " , stringify ! (
-                   root::nsTArray<root::mozilla::gfx::FontVariation> ) ));
-        assert_eq!(::std::mem::align_of::<root::nsTArray<root::mozilla::gfx::FontVariation>>()
-                   , 8usize , concat ! (
-                   "Alignment of template specialization: " , stringify ! (
-                   root::nsTArray<root::mozilla::gfx::FontVariation> ) ));
-    }
-    #[test]
-    fn __bindgen_test_layout_nsTArray_open0__bindgen_ty_id_254403_close0_instantiation() {
+    fn __bindgen_test_layout_nsTArray_open0_gfxFontVariation_close0_instantiation_1() {
+        assert_eq!(::std::mem::size_of::<root::nsTArray<root::gfxFontVariation>>()
+                   , 8usize , concat ! (
+                   "Size of template specialization: " , stringify ! (
+                   root::nsTArray<root::gfxFontVariation> ) ));
+        assert_eq!(::std::mem::align_of::<root::nsTArray<root::gfxFontVariation>>()
+                   , 8usize , concat ! (
+                   "Alignment of template specialization: " , stringify ! (
+                   root::nsTArray<root::gfxFontVariation> ) ));
+    }
+    #[test]
+    fn __bindgen_test_layout_nsTArray_open0__bindgen_ty_id_231910_close0_instantiation() {
         assert_eq!(::std::mem::size_of::<root::nsTArray<*mut root::mozilla::css::DocumentRule>>()
                    , 8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<*mut root::mozilla::css::DocumentRule> ) ));
         assert_eq!(::std::mem::align_of::<root::nsTArray<*mut root::mozilla::css::DocumentRule>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsTArray<*mut root::mozilla::css::DocumentRule> ) ));
     }
     #[test]
-    fn __bindgen_test_layout_nsTArray_open0__bindgen_ty_id_254409_close0_instantiation() {
+    fn __bindgen_test_layout_nsTArray_open0__bindgen_ty_id_231916_close0_instantiation() {
         assert_eq!(::std::mem::size_of::<root::nsTArray<*mut root::mozilla::css::DocumentRule>>()
                    , 8usize , concat ! (
                    "Size of template specialization: " , stringify ! (
                    root::nsTArray<*mut root::mozilla::css::DocumentRule> ) ));
         assert_eq!(::std::mem::align_of::<root::nsTArray<*mut root::mozilla::css::DocumentRule>>()
                    , 8usize , concat ! (
                    "Alignment of template specialization: " , stringify ! (
                    root::nsTArray<*mut root::mozilla::css::DocumentRule> ) ));
--- a/servo/components/style/gecko/wrapper.rs
+++ b/servo/components/style/gecko/wrapper.rs
@@ -12,17 +12,17 @@
 //!
 //! This theoretically should live in its own crate, but now it lives in the
 //! style system it's kind of pointless in the Stylo case, and only Servo forces
 //! the separation between the style system implementation and everything else.
 
 use CaseSensitivityExt;
 use app_units::Au;
 use applicable_declarations::ApplicableDeclarationBlock;
-use atomic_refcell::{AtomicRefCell, AtomicRefMut};
+use atomic_refcell::{AtomicRefCell, AtomicRef, AtomicRefMut};
 use context::{QuirksMode, SharedStyleContext, PostAnimationTasks, UpdateAnimationsTasks};
 use data::ElementData;
 use dom::{LayoutIterator, NodeInfo, TElement, TNode};
 use dom::{OpaqueNode, PresentationalHintsSynthesizer};
 use element_state::{ElementState, DocumentState, NS_DOCUMENT_STATE_WINDOW_INACTIVE};
 use error_reporting::ParseErrorReporter;
 use font_metrics::{FontMetrics, FontMetricsProvider, FontMetricsQueryResult};
 use gecko::data::PerDocumentStyleData;
@@ -99,16 +99,22 @@ use stylist::Stylist;
 /// 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> PartialEq for GeckoNode<'ln> {
+    fn eq(&self, other: &Self) -> bool {
+        self.0 as *const _ == other.0 as *const _
+    }
+}
+
 impl<'ln> fmt::Debug for GeckoNode<'ln> {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         if let Some(el) = self.as_element() {
             el.fmt(f)
         } else {
             if self.is_text_node() {
                 write!(f, "<text node> ({:#x})", self.opaque().0)
             } else {
@@ -143,16 +149,22 @@ impl<'ln> GeckoNode<'ln> {
     }
 
     #[cfg(target_pointer_width = "32")]
     #[inline]
     fn bool_flags(&self) -> u32 {
         (self.0).mBoolFlags
     }
 
+    /// Owner document quirks mode getter.
+    #[inline]
+    pub fn owner_document_quirks_mode(&self) -> QuirksMode {
+        self.owner_doc().mCompatMode.into()
+    }
+
     #[inline]
     fn get_bool_flag(&self, flag: nsINode_BooleanFlag) -> bool {
         self.bool_flags() & (1u32 << flag as u32) != 0
     }
 
     fn owner_doc(&self) -> &structs::nsIDocument {
         debug_assert!(!self.node_info().mDocument.is_null());
         unsafe { &*self.node_info().mDocument }
@@ -350,31 +362,31 @@ impl<'lb> GeckoXBLBinding<'lb> {
             }
             binding = match binding.base_binding() {
                 Some(b) => b,
                 None => return None,
             };
         }
     }
 
-    fn each_xbl_stylist<F>(self, f: &mut F)
+    fn each_xbl_stylist<F>(&self, f: &mut F)
     where
-        F: FnMut(&Stylist),
+        F: FnMut(AtomicRef<'lb, Stylist>),
     {
         if let Some(base) = self.base_binding() {
             base.each_xbl_stylist(f);
         }
 
         let raw_data = unsafe {
             bindings::Gecko_XBLBinding_GetRawServoStyleSet(self.0)
         };
 
         if let Some(raw_data) = raw_data {
             let data = PerDocumentStyleData::from_ffi(&*raw_data).borrow();
-            f(&data.stylist);
+            f(AtomicRef::map(data, |d| &d.stylist));
         }
     }
 }
 
 /// A simple wrapper over a non-null Gecko `Element` pointer.
 #[derive(Clone, Copy)]
 pub struct GeckoElement<'le>(pub &'le RawGeckoElement);
 
@@ -471,26 +483,26 @@ impl<'le> GeckoElement<'le> {
     fn get_extended_slots(
         &self,
     ) -> Option<&structs::FragmentOrElement_nsExtendedDOMSlots> {
         self.get_dom_slots()
             .and_then(|s| unsafe { s.mExtendedSlots.mPtr.as_ref() })
     }
 
     #[inline]
-    fn get_xbl_binding(&self) -> Option<GeckoXBLBinding> {
+    fn get_xbl_binding(&self) -> Option<GeckoXBLBinding<'le>> {
         if self.flags() & (structs::NODE_MAY_BE_IN_BINDING_MNGR as u32) == 0 {
             return None;
         }
 
         unsafe { bindings::Gecko_GetXBLBinding(self.0).map(GeckoXBLBinding) }
     }
 
     #[inline]
-    fn get_xbl_binding_with_content(&self) -> Option<GeckoXBLBinding> {
+    fn get_xbl_binding_with_content(&self) -> Option<GeckoXBLBinding<'le>> {
         self.get_xbl_binding()
             .and_then(|b| b.get_binding_with_content())
     }
 
     #[inline]
     fn has_xbl_binding_with_content(&self) -> bool {
         !self.get_xbl_binding_with_content().is_none()
     }
@@ -620,18 +632,19 @@ impl<'le> GeckoElement<'le> {
 
     #[inline]
     fn get_document_theme(&self) -> DocumentTheme {
         let node = self.as_node();
         unsafe { Gecko_GetDocumentLWTheme(node.owner_doc()) }
     }
 
     /// Owner document quirks mode getter.
+    #[inline]
     pub fn owner_document_quirks_mode(&self) -> QuirksMode {
-        self.as_node().owner_doc().mCompatMode.into()
+        self.as_node().owner_document_quirks_mode()
     }
 
     /// Only safe to call on the main thread, with exclusive access to the element and
     /// its ancestors.
     /// This function is also called after display property changed for SMIL animation.
     ///
     /// Also this function schedules style flush.
     unsafe fn maybe_restyle<'a>(
@@ -1241,19 +1254,20 @@ impl<'le> TElement for GeckoElement<'le>
     fn has_css_animations(&self) -> bool {
         self.may_have_animations() && unsafe { Gecko_ElementHasCSSAnimations(self.0) }
     }
 
     fn has_css_transitions(&self) -> bool {
         self.may_have_animations() && unsafe { Gecko_ElementHasCSSTransitions(self.0) }
     }
 
-    fn each_xbl_stylist<F>(&self, mut f: F) -> bool
+    fn each_xbl_stylist<'a, F>(&self, mut f: F) -> bool
     where
-        F: FnMut(&Stylist),
+        'le: 'a,
+        F: FnMut(AtomicRef<'a, Stylist>),
     {
         // Walk the binding scope chain, starting with the binding attached to
         // our content, up till we run out of scopes or we get cut off.
         //
         // If we are a NAC pseudo-element, we want to get rules from our
         // rule_hash_target, that is, our originating element.
         let mut current = Some(self.rule_hash_target());
 
--- a/servo/components/style/invalidation/element/collector.rs
+++ b/servo/components/style/invalidation/element/collector.rs
@@ -1,97 +1,123 @@
 /* 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/. */
 
 //! An invalidation processor for style changes due to state and attribute
 //! changes.
 
 use Atom;
+use atomic_refcell::AtomicRef;
 use context::{QuirksMode, SharedStyleContext};
 use data::ElementData;
 use dom::TElement;
 use element_state::{ElementState, IN_VISITED_OR_UNVISITED_STATE};
 use invalidation::element::element_wrapper::{ElementSnapshot, ElementWrapper};
 use invalidation::element::invalidation_map::*;
 use invalidation::element::invalidator::{InvalidationVector, Invalidation, InvalidationProcessor};
 use invalidation::element::restyle_hints::*;
 use selector_map::SelectorMap;
 use selector_parser::Snapshot;
 use selectors::NthIndexCache;
 use selectors::attr::CaseSensitivity;
 use selectors::matching::{MatchingContext, MatchingMode, VisitedHandlingMode};
 use selectors::matching::matches_selector;
 use smallvec::SmallVec;
+use stylesheets::origin::{Origin, OriginSet};
+use stylist::Stylist;
 
 #[derive(Debug, PartialEq)]
 enum VisitedDependent {
     Yes,
     No,
 }
 
 /// The collector implementation.
-struct Collector<'a, 'b: 'a, E>
+struct Collector<'a, 'b: 'a, 'selectors: 'a, E>
 where
     E: TElement,
 {
     element: E,
     wrapper: ElementWrapper<'b, E>,
     nth_index_cache: Option<&'a mut NthIndexCache>,
     snapshot: &'a Snapshot,
     quirks_mode: QuirksMode,
     lookup_element: E,
     removed_id: Option<&'a Atom>,
     added_id: Option<&'a Atom>,
     classes_removed: &'a SmallVec<[Atom; 8]>,
     classes_added: &'a SmallVec<[Atom; 8]>,
     state_changes: ElementState,
-    descendant_invalidations: &'a mut InvalidationVector,
-    sibling_invalidations: &'a mut InvalidationVector,
+    descendant_invalidations: &'a mut InvalidationVector<'selectors>,
+    sibling_invalidations: &'a mut InvalidationVector<'selectors>,
     invalidates_self: bool,
 }
 
 /// An invalidation processor for style changes due to state and attribute
 /// changes.
-pub struct StateAndAttrInvalidationProcessor<'a, 'b: 'a, E> {
+pub struct StateAndAttrInvalidationProcessor<'a, 'b: 'a, E: TElement> {
     shared_context: &'a SharedStyleContext<'b>,
+    xbl_stylists: &'a [AtomicRef<'b, Stylist>],
+    cut_off_inheritance: bool,
     element: E,
     data: &'a mut ElementData,
+    matching_context: MatchingContext<'a, E::Impl>,
 }
 
-impl<'a, 'b: 'a, E> StateAndAttrInvalidationProcessor<'a, 'b, E> {
+impl<'a, 'b: 'a, E: TElement> StateAndAttrInvalidationProcessor<'a, 'b, E> {
     /// Creates a new StateAndAttrInvalidationProcessor.
     pub fn new(
         shared_context: &'a SharedStyleContext<'b>,
+        xbl_stylists: &'a [AtomicRef<'b, Stylist>],
+        cut_off_inheritance: bool,
         element: E,
         data: &'a mut ElementData,
+        nth_index_cache: Option<&'a mut NthIndexCache>,
     ) -> Self {
-        Self { shared_context, element, data }
+        let matching_context = MatchingContext::new_for_visited(
+            MatchingMode::Normal,
+            None,
+            nth_index_cache,
+            VisitedHandlingMode::AllLinksVisitedAndUnvisited,
+            shared_context.quirks_mode(),
+        );
+
+        Self {
+            shared_context,
+            xbl_stylists,
+            cut_off_inheritance,
+            element,
+            data,
+            matching_context,
+        }
     }
 }
 
-impl<'a, 'b: 'a, E> InvalidationProcessor<E> for StateAndAttrInvalidationProcessor<'a, 'b, E>
+impl<'a, 'b: 'a, E: 'a> InvalidationProcessor<'a, E> for StateAndAttrInvalidationProcessor<'a, 'b, E>
 where
     E: TElement,
 {
     /// We need to invalidate style on an eager pseudo-element, in order to
     /// process changes that could otherwise end up in ::before or ::after
     /// content being generated.
     fn invalidates_on_eager_pseudo_element(&self) -> bool { true }
 
+    fn matching_context(&mut self) -> &mut MatchingContext<'a, E::Impl> {
+        &mut self.matching_context
+    }
+
     fn collect_invalidations(
         &mut self,
         element: E,
-        nth_index_cache: Option<&mut NthIndexCache>,
-        quirks_mode: QuirksMode,
-        descendant_invalidations: &mut InvalidationVector,
-        sibling_invalidations: &mut InvalidationVector,
+        _self_invalidations: &mut InvalidationVector<'a>,
+        descendant_invalidations: &mut InvalidationVector<'a>,
+        sibling_invalidations: &mut InvalidationVector<'a>,
     ) -> bool {
         debug_assert!(element.has_snapshot(), "Why bothering?");
-        debug_assert_eq!(quirks_mode, self.shared_context.quirks_mode(), "How exactly?");
 
         let wrapper =
             ElementWrapper::new(element, &*self.shared_context.snapshot_map);
 
         let state_changes = wrapper.state_changes();
         let snapshot = wrapper.snapshot().expect("has_snapshot lied");
 
         if !snapshot.has_attrs() && state_changes.is_empty() {
@@ -144,48 +170,51 @@ where
             } else {
                 element
             };
 
         let invalidated_self = {
             let mut collector = Collector {
                 wrapper,
                 lookup_element,
-                nth_index_cache,
                 state_changes,
                 element,
                 snapshot: &snapshot,
                 quirks_mode: self.shared_context.quirks_mode(),
+                nth_index_cache: self.matching_context.nth_index_cache.as_mut().map(|c| &mut **c),
                 removed_id: id_removed.as_ref(),
                 added_id: id_added.as_ref(),
                 classes_removed: &classes_removed,
                 classes_added: &classes_added,
                 descendant_invalidations,
                 sibling_invalidations,
                 invalidates_self: false,
             };
 
-            self.shared_context.stylist.each_invalidation_map(|invalidation_map| {
-                collector.collect_dependencies_in_invalidation_map(invalidation_map);
+            let document_origins = if self.cut_off_inheritance {
+                Origin::UserAgent.into()
+            } else {
+                OriginSet::all()
+            };
+
+            self.shared_context.stylist.each_invalidation_map(|invalidation_map, origin| {
+                if document_origins.contains(origin.into()) {
+                    collector.collect_dependencies_in_invalidation_map(invalidation_map);
+                }
             });
 
-            // TODO(emilio): Consider storing dependencies from the UA sheet in
-            // a different map. If we do that, we can skip the stuff on the
-            // shared stylist iff cut_off_inheritance is true, and we can look
-            // just at that map.
-            let _cut_off_inheritance =
-                element.each_xbl_stylist(|stylist| {
-                    // FIXME(emilio): Replace with assert / remove when we
-                    // figure out what to do with the quirks mode mismatches
-                    // (that is, when bug 1406875 is properly fixed).
-                    collector.quirks_mode = stylist.quirks_mode();
-                    stylist.each_invalidation_map(|invalidation_map| {
-                        collector.collect_dependencies_in_invalidation_map(invalidation_map);
-                    });
-                });
+            for stylist in self.xbl_stylists {
+                // FIXME(emilio): Replace with assert / remove when we
+                // figure out what to do with the quirks mode mismatches
+                // (that is, when bug 1406875 is properly fixed).
+                collector.quirks_mode = stylist.quirks_mode();
+                stylist.each_invalidation_map(|invalidation_map, _| {
+                    collector.collect_dependencies_in_invalidation_map(invalidation_map);
+                })
+            }
 
             collector.invalidates_self
         };
 
         if invalidated_self {
             self.data.hint.insert(RESTYLE_SELF);
         }
 
@@ -242,23 +271,24 @@ where
     fn invalidated_self(&mut self, element: E) {
         debug_assert_ne!(element, self.element);
         if let Some(mut data) = element.mutate_data() {
             data.hint.insert(RESTYLE_SELF);
         }
     }
 }
 
-impl<'a, 'b, E> Collector<'a, 'b, E>
+impl<'a, 'b, 'selectors, E> Collector<'a, 'b, 'selectors, E>
 where
     E: TElement,
+    'selectors: 'a,
 {
     fn collect_dependencies_in_invalidation_map(
         &mut self,
-        map: &InvalidationMap,
+        map: &'selectors InvalidationMap,
     ) {
         let quirks_mode = self.quirks_mode;
         let removed_id = self.removed_id;
         if let Some(ref id) = removed_id {
             if let Some(deps) = map.id_to_selector.get(id, quirks_mode) {
                 for dep in deps {
                     self.scan_dependency(dep, VisitedDependent::No);
                 }
@@ -299,33 +329,33 @@ where
                 &map.state_affecting_selectors,
                 state_changes,
             )
         }
     }
 
     fn collect_dependencies_in_map(
         &mut self,
-        map: &SelectorMap<Dependency>,
+        map: &'selectors SelectorMap<Dependency>,
     ) {
         map.lookup_with_additional(
             self.lookup_element,
             self.quirks_mode,
             self.removed_id,
             self.classes_removed,
             &mut |dependency| {
                 self.scan_dependency(dependency, VisitedDependent::No);
                 true
             },
         );
     }
 
     fn collect_state_dependencies(
         &mut self,
-        map: &SelectorMap<StateDependency>,
+        map: &'selectors SelectorMap<StateDependency>,
         state_changes: ElementState,
     ) {
         map.lookup_with_additional(
             self.lookup_element,
             self.quirks_mode,
             self.removed_id,
             self.classes_removed,
             &mut |dependency| {
@@ -399,17 +429,17 @@ where
         // Check for mismatches in both the match result and also the status
         // of whether a relevant link was found.
         matched_then != matches_now ||
             relevant_link_found_now != relevant_link_found_then
     }
 
     fn scan_dependency(
         &mut self,
-        dependency: &Dependency,
+        dependency: &'selectors Dependency,
         is_visited_dependent: VisitedDependent,
     ) {
         debug!("TreeStyleInvalidator::scan_dependency({:?}, {:?}, {:?})",
                self.element,
                dependency,
                is_visited_dependent);
 
         if !self.dependency_may_be_relevant(dependency) {
@@ -452,34 +482,34 @@ where
             );
 
             if should_account_for_dependency {
                 return self.note_dependency(dependency);
             }
         }
     }
 
-    fn note_dependency(&mut self, dependency: &Dependency) {
+    fn note_dependency(&mut self, dependency: &'selectors Dependency) {
         if dependency.affects_self() {
             self.invalidates_self = true;
         }
 
         if dependency.affects_descendants() {
             debug_assert_ne!(dependency.selector_offset, 0);
             debug_assert_ne!(dependency.selector_offset, dependency.selector.len());
             debug_assert!(!dependency.affects_later_siblings());
             self.descendant_invalidations.push(Invalidation::new(
-                dependency.selector.clone(),
+                &dependency.selector,
                 dependency.selector.len() - dependency.selector_offset + 1,
             ));
         } else if dependency.affects_later_siblings() {
             debug_assert_ne!(dependency.selector_offset, 0);
             debug_assert_ne!(dependency.selector_offset, dependency.selector.len());
             self.sibling_invalidations.push(Invalidation::new(
-                dependency.selector.clone(),
+                &dependency.selector,
                 dependency.selector.len() - dependency.selector_offset + 1,
             ));
         }
     }
 
     /// Returns whether `dependency` may cause us to invalidate the style of
     /// more elements than what we've already invalidated.
     fn dependency_may_be_relevant(&self, dependency: &Dependency) -> bool {
--- a/servo/components/style/invalidation/element/invalidator.rs
+++ b/servo/components/style/invalidation/element/invalidator.rs
@@ -3,44 +3,49 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 //! The struct that takes care of encapsulating all the logic on where and how
 //! element styles need to be invalidated.
 
 use context::StackLimitChecker;
 use dom::{TElement, TNode};
 use selector_parser::SelectorImpl;
-use selectors::NthIndexCache;
-use selectors::matching::{MatchingContext, MatchingMode, QuirksMode, VisitedHandlingMode};
-use selectors::matching::CompoundSelectorMatchingResult;
+use selectors::matching::{CompoundSelectorMatchingResult, MatchingContext};
 use selectors::matching::matches_compound_selector;
 use selectors::parser::{Combinator, Component, Selector};
 use smallvec::SmallVec;
 use std::fmt;
 
 /// A trait to abstract the collection of invalidations for a given pass.
-pub trait InvalidationProcessor<E>
+pub trait InvalidationProcessor<'a, E>
 where
     E: TElement,
 {
     /// Whether an invalidation that contains only an eager pseudo-element
     /// selector like ::before or ::after triggers invalidation of the element
     /// that would originate it.
     fn invalidates_on_eager_pseudo_element(&self) -> bool { false }
 
+    /// Whether the invalidation processor only cares about light-tree
+    /// descendants of a given element, that is, doesn't invalidate
+    /// pseudo-elements, NAC, or XBL anon content.
+    fn light_tree_only(&self) -> bool { false }
+
+    /// The matching context that should be used to process invalidations.
+    fn matching_context(&mut self) -> &mut MatchingContext<'a, E::Impl>;
+
     /// Collect invalidations for a given element's descendants and siblings.
     ///
     /// Returns whether the element itself was invalidated.
     fn collect_invalidations(
         &mut self,
         element: E,
-        nth_index_cache: Option<&mut NthIndexCache>,
-        quirks_mode: QuirksMode,
-        descendant_invalidations: &mut InvalidationVector,
-        sibling_invalidations: &mut InvalidationVector,
+        self_invalidations: &mut InvalidationVector<'a>,
+        descendant_invalidations: &mut InvalidationVector<'a>,
+        sibling_invalidations: &mut InvalidationVector<'a>,
     ) -> bool;
 
     /// Returns whether the invalidation process should process the descendants
     /// of the given element.
     fn should_process_descendants(&mut self, element: E) -> bool;
 
     /// Executes an arbitrary action when the recursion limit is exceded (if
     /// any).
@@ -50,94 +55,102 @@ where
     fn invalidated_self(&mut self, element: E);
 
     /// Executes an action when any descendant of `Self` is invalidated.
     fn invalidated_descendants(&mut self, element: E, child: E);
 }
 
 /// The struct that takes care of encapsulating all the logic on where and how
 /// element styles need to be invalidated.
-pub struct TreeStyleInvalidator<'a, E, P: 'a>
+pub struct TreeStyleInvalidator<'a, 'b, E, P: 'a>
 where
+    'b: 'a,
     E: TElement,
-    P: InvalidationProcessor<E>
+    P: InvalidationProcessor<'b, E>,
 {
     element: E,
-    quirks_mode: QuirksMode,
     stack_limit_checker: Option<&'a StackLimitChecker>,
-    nth_index_cache: Option<&'a mut NthIndexCache>,
     processor: &'a mut P,
+    _marker: ::std::marker::PhantomData<&'b ()>
 }
 
 /// A vector of invalidations, optimized for small invalidation sets.
-pub type InvalidationVector = SmallVec<[Invalidation; 10]>;
+pub type InvalidationVector<'a> = SmallVec<[Invalidation<'a>; 10]>;
 
 /// The kind of invalidation we're processing.
 ///
 /// We can use this to avoid pushing invalidations of the same kind to our
 /// descendants or siblings.
 #[derive(Clone, Copy, Debug, Eq, PartialEq)]
 enum InvalidationKind {
     Descendant,
     Sibling,
 }
 
 /// An `Invalidation` is a complex selector that describes which elements,
 /// relative to a current element we are processing, must be restyled.
 #[derive(Clone)]
-pub struct Invalidation {
-    selector: Selector<SelectorImpl>,
+pub struct Invalidation<'a> {
+    selector: &'a Selector<SelectorImpl>,
     /// The offset of the selector pointing to a compound selector.
     ///
     /// This order is a "parse order" offset, that is, zero is the leftmost part
     /// of the selector written as parsed / serialized.
     offset: usize,
     /// Whether the invalidation was already matched by any previous sibling or
     /// ancestor.
     ///
     /// If this is the case, we can avoid pushing invalidations generated by
     /// this one if the generated invalidation is effective for all the siblings
     /// or descendants after us.
     matched_by_any_previous: bool,
 }
 
-impl Invalidation {
+impl<'a> Invalidation<'a> {
     /// Create a new invalidation for a given selector and offset.
-    pub fn new(selector: Selector<SelectorImpl>, offset: usize) -> Self {
+    pub fn new(selector: &'a Selector<SelectorImpl>, offset: usize) -> Self {
         Self {
             selector,
             offset,
             matched_by_any_previous: false,
         }
     }
 
     /// Whether this invalidation is effective for the next sibling or
     /// descendant after us.
     fn effective_for_next(&self) -> bool {
+        if self.offset == 0 {
+            return true;
+        }
+
         // TODO(emilio): For pseudo-elements this should be mostly false, except
         // for the weird pseudos in <input type="number">.
         //
         // We should be able to do better here!
         match self.selector.combinator_at_parse_order(self.offset - 1) {
             Combinator::NextSibling |
             Combinator::Child => false,
             _ => true,
         }
     }
 
     fn kind(&self) -> InvalidationKind {
+        if self.offset == 0 {
+            return InvalidationKind::Descendant;
+        }
+
         if self.selector.combinator_at_parse_order(self.offset - 1).is_ancestor() {
             InvalidationKind::Descendant
         } else {
             InvalidationKind::Sibling
         }
     }
 }
 
-impl fmt::Debug for Invalidation {
+impl<'a> fmt::Debug for Invalidation<'a> {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         use cssparser::ToCss;
 
         f.write_str("Invalidation(")?;
         for component in self.selector.iter_raw_parse_order_from(self.offset) {
             if matches!(*component, Component::Combinator(..)) {
                 break;
             }
@@ -187,95 +200,110 @@ impl InvalidationResult {
     }
 
     /// Whether the invalidation has invalidate siblings.
     pub fn has_invalidated_siblings(&self) -> bool {
         self.invalidated_siblings
     }
 }
 
-impl<'a, E, P: 'a> TreeStyleInvalidator<'a, E, P>
+impl<'a, 'b, E, P: 'a> TreeStyleInvalidator<'a, 'b, E, P>
 where
+    'b: 'a,
     E: TElement,
-    P: InvalidationProcessor<E>,
+    P: InvalidationProcessor<'b, E>,
 {
     /// Trivially constructs a new `TreeStyleInvalidator`.
     pub fn new(
         element: E,
-        quirks_mode: QuirksMode,
         stack_limit_checker: Option<&'a StackLimitChecker>,
-        nth_index_cache: Option<&'a mut NthIndexCache>,
         processor: &'a mut P,
     ) -> Self {
         Self {
             element,
-            quirks_mode,
             stack_limit_checker,
-            nth_index_cache,
             processor,
+            _marker: ::std::marker::PhantomData,
         }
     }
 
     /// Perform the invalidation pass.
     pub fn invalidate(mut self) -> InvalidationResult {
         debug!("StyleTreeInvalidator::invalidate({:?})", self.element);
 
+        let mut self_invalidations = InvalidationVector::new();
         let mut descendant_invalidations = InvalidationVector::new();
         let mut sibling_invalidations = InvalidationVector::new();
 
-        let invalidated_self = self.processor.collect_invalidations(
+        let mut invalidated_self = self.processor.collect_invalidations(
             self.element,
-            self.nth_index_cache.as_mut().map(|c| &mut **c),
-            self.quirks_mode,
+            &mut self_invalidations,
             &mut descendant_invalidations,
             &mut sibling_invalidations,
         );
 
         debug!("Collected invalidations (self: {}): ", invalidated_self);
+        debug!(" > self: {:?}", descendant_invalidations);
         debug!(" > descendants: {:?}", descendant_invalidations);
         debug!(" > siblings: {:?}", sibling_invalidations);
 
+        let invalidated_self_from_collection = invalidated_self;
+
+        invalidated_self |= self.process_descendant_invalidations(
+            &self_invalidations,
+            &mut descendant_invalidations,
+            &mut sibling_invalidations,
+        );
+
+        if invalidated_self && !invalidated_self_from_collection {
+            self.processor.invalidated_self(self.element);
+        }
+
         let invalidated_descendants = self.invalidate_descendants(&descendant_invalidations);
         let invalidated_siblings = self.invalidate_siblings(&mut sibling_invalidations);
 
         InvalidationResult { invalidated_self, invalidated_descendants, invalidated_siblings }
     }
 
     /// Go through later DOM siblings, invalidating style as needed using the
     /// `sibling_invalidations` list.
     ///
     /// Returns whether any sibling's style or any sibling descendant's style
     /// was invalidated.
     fn invalidate_siblings(
         &mut self,
-        sibling_invalidations: &mut InvalidationVector,
+        sibling_invalidations: &mut InvalidationVector<'b>,
     ) -> bool {
         if sibling_invalidations.is_empty() {
             return false;
         }
 
         let mut current = self.element.next_sibling_element();
         let mut any_invalidated = false;
 
         while let Some(sibling) = current {
             let mut sibling_invalidator = TreeStyleInvalidator::new(
                 sibling,
-                self.quirks_mode,
                 self.stack_limit_checker,
-                self.nth_index_cache.as_mut().map(|c| &mut **c),
                 self.processor,
             );
 
             let mut invalidations_for_descendants = InvalidationVector::new();
-            any_invalidated |=
+            let invalidated_sibling =
                 sibling_invalidator.process_sibling_invalidations(
                     &mut invalidations_for_descendants,
                     sibling_invalidations,
                 );
 
+            if invalidated_sibling {
+                sibling_invalidator.processor.invalidated_self(sibling);
+            }
+
+            any_invalidated |= invalidated_sibling;
+
             any_invalidated |=
                 sibling_invalidator.invalidate_descendants(
                     &invalidations_for_descendants
                 );
 
             if sibling_invalidations.is_empty() {
                 break;
             }
@@ -284,17 +312,17 @@ where
         }
 
         any_invalidated
     }
 
     fn invalidate_pseudo_element_or_nac(
         &mut self,
         child: E,
-        invalidations: &InvalidationVector
+        invalidations: &InvalidationVector<'b>,
     ) -> bool {
         let mut sibling_invalidations = InvalidationVector::new();
 
         let result = self.invalidate_child(
             child,
             invalidations,
             &mut sibling_invalidations
         );
@@ -309,44 +337,46 @@ where
         result
     }
 
     /// Invalidate a child and recurse down invalidating its descendants if
     /// needed.
     fn invalidate_child(
         &mut self,
         child: E,
-        invalidations: &InvalidationVector,
-        sibling_invalidations: &mut InvalidationVector,
+        invalidations: &InvalidationVector<'b>,
+        sibling_invalidations: &mut InvalidationVector<'b>,
     ) -> bool {
         let mut invalidations_for_descendants = InvalidationVector::new();
 
         let mut invalidated_child = false;
         let invalidated_descendants = {
             let mut child_invalidator = TreeStyleInvalidator::new(
                 child,
-                self.quirks_mode,
                 self.stack_limit_checker,
-                self.nth_index_cache.as_mut().map(|c| &mut **c),
                 self.processor,
             );
 
             invalidated_child |=
                 child_invalidator.process_sibling_invalidations(
                     &mut invalidations_for_descendants,
                     sibling_invalidations,
                 );
 
             invalidated_child |=
                 child_invalidator.process_descendant_invalidations(
                     invalidations,
                     &mut invalidations_for_descendants,
                     sibling_invalidations,
                 );
 
+            if invalidated_child {
+                child_invalidator.processor.invalidated_self(child);
+            }
+
             child_invalidator.invalidate_descendants(&invalidations_for_descendants)
         };
 
         // The child may not be a flattened tree child of the current element,
         // but may be arbitrarily deep.
         //
         // Since we keep the traversal flags in terms of the flattened tree,
         // we need to propagate it as appropriate.
@@ -354,17 +384,17 @@ where
             self.processor.invalidated_descendants(self.element, child);
         }
 
         invalidated_child || invalidated_descendants
     }
 
     fn invalidate_nac(
         &mut self,
-        invalidations: &InvalidationVector,
+        invalidations: &InvalidationVector<'b>,
     ) -> bool {
         let mut any_nac_root = false;
 
         let element = self.element;
         element.each_anonymous_content_child(|nac| {
             any_nac_root |=
                 self.invalidate_pseudo_element_or_nac(nac, invalidations);
         });
@@ -372,17 +402,17 @@ where
         any_nac_root
     }
 
     // NB: It's important that this operates on DOM children, which is what
     // selector-matching operates on.
     fn invalidate_dom_descendants_of(
         &mut self,
         parent: E::ConcreteNode,
-        invalidations: &InvalidationVector,
+        invalidations: &InvalidationVector<'b>,
     ) -> bool {
         let mut any_descendant = false;
 
         let mut sibling_invalidations = InvalidationVector::new();
         for child in parent.dom_children() {
             // TODO(emilio): We handle <xbl:children> fine, because they appear
             // in selector-matching (note bug 1374247, though).
             //
@@ -406,17 +436,17 @@ where
 
         any_descendant
     }
 
     /// Given a descendant invalidation list, go through the current element's
     /// descendants, and invalidate style on them.
     fn invalidate_descendants(
         &mut self,
-        invalidations: &InvalidationVector,
+        invalidations: &InvalidationVector<'b>,
     ) -> bool {
         if invalidations.is_empty() {
             return false;
         }
 
         debug!("StyleTreeInvalidator::invalidate_descendants({:?})",
                self.element);
         debug!(" > {:?}", invalidations);
@@ -430,16 +460,21 @@ where
 
         if let Some(checker) = self.stack_limit_checker {
             if checker.limit_exceeded() {
                 self.processor.recursion_limit_exceeded(self.element);
                 return true;
             }
         }
 
+        if self.processor.light_tree_only() {
+            let node = self.element.as_node();
+            return self.invalidate_dom_descendants_of(node, invalidations);
+        }
+
         let mut any_descendant = false;
 
         if let Some(anon_content) = self.element.xbl_binding_anonymous_content() {
             any_descendant |=
                 self.invalidate_dom_descendants_of(anon_content, invalidations);
         }
 
         // TODO(emilio): Having a list of invalidations just for pseudo-elements
@@ -471,18 +506,18 @@ where
     ///
     /// In particular, all descendants get the same set of invalidations from
     /// the parent, but the invalidations from a given sibling depend on the
     /// ones we got from the previous one.
     ///
     /// Returns whether invalidated the current element's style.
     fn process_sibling_invalidations(
         &mut self,
-        descendant_invalidations: &mut InvalidationVector,
-        sibling_invalidations: &mut InvalidationVector,
+        descendant_invalidations: &mut InvalidationVector<'b>,
+        sibling_invalidations: &mut InvalidationVector<'b>,
     ) -> bool {
         let mut i = 0;
         let mut new_sibling_invalidations = InvalidationVector::new();
         let mut invalidated_self = false;
 
         while i < sibling_invalidations.len() {
             let result = self.process_invalidation(
                 &sibling_invalidations[i],
@@ -506,19 +541,19 @@ where
 
     /// Process a given invalidation list coming from our parent,
     /// adding to `descendant_invalidations` and `sibling_invalidations` as
     /// needed.
     ///
     /// Returns whether our style was invalidated as a result.
     fn process_descendant_invalidations(
         &mut self,
-        invalidations: &InvalidationVector,
-        descendant_invalidations: &mut InvalidationVector,
-        sibling_invalidations: &mut InvalidationVector,
+        invalidations: &InvalidationVector<'b>,
+        descendant_invalidations: &mut InvalidationVector<'b>,
+        sibling_invalidations: &mut InvalidationVector<'b>,
     ) -> bool {
         let mut invalidated = false;
 
         for invalidation in invalidations {
             let result = self.process_invalidation(
                 invalidation,
                 descendant_invalidations,
                 sibling_invalidations,
@@ -539,40 +574,30 @@ where
     /// Processes a given invalidation, potentially invalidating the style of
     /// the current element.
     ///
     /// Returns whether invalidated the style of the element, and whether the
     /// invalidation should be effective to subsequent siblings or descendants
     /// down in the tree.
     fn process_invalidation(
         &mut self,
-        invalidation: &Invalidation,
-        descendant_invalidations: &mut InvalidationVector,
-        sibling_invalidations: &mut InvalidationVector,
+        invalidation: &Invalidation<'b>,
+        descendant_invalidations: &mut InvalidationVector<'b>,
+        sibling_invalidations: &mut InvalidationVector<'b>,
         invalidation_kind: InvalidationKind,
     ) -> SingleInvalidationResult {
         debug!("TreeStyleInvalidator::process_invalidation({:?}, {:?}, {:?})",
                self.element, invalidation, invalidation_kind);
 
-        let matching_result = {
-            let mut context = MatchingContext::new_for_visited(
-                MatchingMode::Normal,
-                None,
-                self.nth_index_cache.as_mut().map(|c| &mut **c),
-                VisitedHandlingMode::AllLinksVisitedAndUnvisited,
-                self.quirks_mode,
-            );
-
-            matches_compound_selector(
-                &invalidation.selector,
-                invalidation.offset,
-                &mut context,
-                &self.element
-            )
-        };
+        let matching_result = matches_compound_selector(
+            &invalidation.selector,
+            invalidation.offset,
+            self.processor.matching_context(),
+            &self.element
+        );
 
         let mut invalidated_self = false;
         let mut matched = false;
         match matching_result {
             CompoundSelectorMatchingResult::FullyMatched => {
                 debug!(" > Invalidation matched completely");
                 matched = true;
                 invalidated_self = true;
@@ -623,17 +648,17 @@ where
                     if self.processor.invalidates_on_eager_pseudo_element() &&
                         pseudo.is_eager() {
                         invalidated_self = true;
                     }
                 }
 
 
                 let next_invalidation = Invalidation {
-                    selector: invalidation.selector.clone(),
+                    selector: invalidation.selector,
                     offset: next_combinator_offset + 1,
                     matched_by_any_previous: false,
                 };
 
                 debug!(" > Invalidation matched, next: {:?}, ({:?})",
                         next_invalidation, next_combinator);
 
                 let next_invalidation_kind = next_invalidation.kind();
@@ -714,16 +739,12 @@ where
                             sibling_invalidations.push(next_invalidation);
                         }
                     }
                 }
             }
             CompoundSelectorMatchingResult::NotMatched => {}
         }
 
-        if invalidated_self {
-            self.processor.invalidated_self(self.element);
-        }
-
         SingleInvalidationResult { invalidated_self, matched, }
     }
 }
 
--- a/servo/components/style/selector_map.rs
+++ b/servo/components/style/selector_map.rs
@@ -301,19 +301,20 @@ impl<T: SelectorMapEntry> SelectorMap<T>
     /// Each entry is passed to the callback, which returns true to continue
     /// iterating entries, or false to terminate the lookup.
     ///
     /// Returns false if the callback ever returns false.
     ///
     /// FIXME(bholley) This overlaps with SelectorMap<Rule>::get_all_matching_rules,
     /// but that function is extremely hot and I'd rather not rearrange it.
     #[inline]
-    pub fn lookup<E, F>(&self, element: E, quirks_mode: QuirksMode, f: &mut F) -> bool
-        where E: TElement,
-              F: FnMut(&T) -> bool
+    pub fn lookup<'a, E, F>(&'a self, element: E, quirks_mode: QuirksMode, f: &mut F) -> bool
+    where
+        E: TElement,
+        F: FnMut(&'a T) -> bool
     {
         // Id.
         if let Some(id) = element.get_id() {
             if let Some(v) = self.id_hash.get(&id, quirks_mode) {
                 for entry in v.iter() {
                     if !f(&entry) {
                         return false;
                     }
@@ -361,25 +362,27 @@ impl<T: SelectorMapEntry> SelectorMap<T>
     /// Performs a normal lookup, and also looks up entries for the passed-in
     /// id and classes.
     ///
     /// Each entry is passed to the callback, which returns true to continue
     /// iterating entries, or false to terminate the lookup.
     ///
     /// Returns false if the callback ever returns false.
     #[inline]
-    pub fn lookup_with_additional<E, F>(&self,
-                                        element: E,
-                                        quirks_mode: QuirksMode,
-                                        additional_id: Option<&Atom>,
-                                        additional_classes: &[Atom],
-                                        f: &mut F)
-                                        -> bool
-        where E: TElement,
-              F: FnMut(&T) -> bool
+    pub fn lookup_with_additional<'a, E, F>(
+        &'a self,
+        element: E,
+        quirks_mode: QuirksMode,
+        additional_id: Option<&Atom>,
+        additional_classes: &[Atom],
+        f: &mut F,
+    ) -> bool
+    where
+        E: TElement,
+        F: FnMut(&'a T) -> bool
     {
         // Do the normal lookup.
         if !self.lookup(element, quirks_mode, f) {
             return false;
         }
 
         // Check the additional id.
         if let Some(id) = additional_id {
--- a/servo/components/style/stylist.rs
+++ b/servo/components/style/stylist.rs
@@ -479,21 +479,22 @@ impl Stylist {
             .map(|(d, _)| d.selectors_for_cache_revalidation.len()).sum()
     }
 
     /// Invokes `f` with the `InvalidationMap` for each origin.
     ///
     /// NOTE(heycam) This might be better as an `iter_invalidation_maps`, once
     /// we have `impl trait` and can return that easily without bothering to
     /// create a whole new iterator type.
-    pub fn each_invalidation_map<F>(&self, mut f: F)
-        where F: FnMut(&InvalidationMap)
+    pub fn each_invalidation_map<'a, F>(&'a self, mut f: F)
+    where
+        F: FnMut(&'a InvalidationMap, Origin)
     {
-        for (data, _) in self.cascade_data.iter_origins() {
-            f(&data.invalidation_map)
+        for (data, origin) in self.cascade_data.iter_origins() {
+            f(&data.invalidation_map, origin)
         }
     }
 
     /// Flush the list of stylesheets if they changed, ensuring the stylist is
     /// up-to-date.
     pub fn flush<E>(
         &mut self,
         guards: &StylesheetGuards,
--- a/servo/ports/geckolib/glue.rs
+++ b/servo/ports/geckolib/glue.rs
@@ -24,19 +24,19 @@ use style::driver;
 use style::element_state::{DocumentState, ElementState};
 use style::error_reporting::{NullReporter, ParseErrorReporter};
 use style::font_metrics::{FontMetricsProvider, get_metrics_provider_for_product};
 use style::gecko::data::{GeckoStyleSheet, PerDocumentStyleData, PerDocumentStyleDataImpl};
 use style::gecko::global_style_data::{GLOBAL_STYLE_DATA, GlobalStyleData, STYLE_THREAD_POOL};
 use style::gecko::restyle_damage::GeckoRestyleDamage;
 use style::gecko::selector_parser::PseudoElement;
 use style::gecko::traversal::RecalcStyleOnly;
-use style::gecko::wrapper::GeckoElement;
+use style::gecko::wrapper::{GeckoElement, GeckoNode};
 use style::gecko_bindings::bindings;
-use style::gecko_bindings::bindings::{RawGeckoElementBorrowed, RawGeckoElementBorrowedOrNull};
+use style::gecko_bindings::bindings::{RawGeckoElementBorrowed, RawGeckoElementBorrowedOrNull, RawGeckoNodeBorrowed};
 use style::gecko_bindings::bindings::{RawGeckoKeyframeListBorrowed, RawGeckoKeyframeListBorrowedMut};
 use style::gecko_bindings::bindings::{RawServoDeclarationBlockBorrowed, RawServoDeclarationBlockStrong};
 use style::gecko_bindings::bindings::{RawServoDocumentRule, RawServoDocumentRuleBorrowed};
 use style::gecko_bindings::bindings::{RawServoFontFeatureValuesRule, RawServoFontFeatureValuesRuleBorrowed};
 use style::gecko_bindings::bindings::{RawServoImportRule, RawServoImportRuleBorrowed};
 use style::gecko_bindings::bindings::{RawServoKeyframe, RawServoKeyframeBorrowed, RawServoKeyframeStrong};
 use style::gecko_bindings::bindings::{RawServoKeyframesRule, RawServoKeyframesRuleBorrowed};
 use style::gecko_bindings::bindings::{RawServoMediaListBorrowed, RawServoMediaListStrong};
@@ -1610,16 +1610,69 @@ pub unsafe extern "C" fn Servo_SelectorL
     dom_apis::element_matches(
         &element,
         &selectors,
         element.owner_document_quirks_mode(),
     )
 }
 
 #[no_mangle]
+pub unsafe extern "C" fn Servo_SelectorList_QueryFirst(
+    node: RawGeckoNodeBorrowed,
+    selectors: RawServoSelectorListBorrowed,
+) -> *const structs::RawGeckoElement {
+    use std::borrow::Borrow;
+    use style::dom_apis::{self, QueryFirst};
+
+    let node = GeckoNode(node);
+    let selectors = ::selectors::SelectorList::from_ffi(selectors).borrow();
+    let mut result = None;
+    dom_apis::query_selector::<GeckoElement, QueryFirst>(
+        node,
+        &selectors,
+        &mut result,
+        node.owner_document_quirks_mode(),
+    );
+
+    result.map_or(ptr::null(), |e| e.0)
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn Servo_SelectorList_QueryAll(
+    node: RawGeckoNodeBorrowed,
+    selectors: RawServoSelectorListBorrowed,
+    content_list: *mut structs::nsSimpleContentList,
+) {
+    use smallvec::SmallVec;
+    use std::borrow::Borrow;
+    use style::dom_apis::{self, QueryAll};
+
+    let node = GeckoNode(node);
+    let selectors = ::selectors::SelectorList::from_ffi(selectors).borrow();
+    let mut result = SmallVec::new();
+
+    dom_apis::query_selector::<GeckoElement, QueryAll>(
+        node,
+        &selectors,
+        &mut result,
+        node.owner_document_quirks_mode(),
+    );
+
+    if !result.is_empty() {
+        // NOTE(emilio): This relies on a slice of GeckoElement having the same
+        // memory representation than a slice of element pointers.
+        bindings::Gecko_ContentList_AppendAll(
+            content_list,
+            result.as_ptr() as *mut *const _,
+            result.len(),
+        )
+    }
+}
+
+#[no_mangle]
 pub extern "C" fn Servo_ImportRule_GetHref(rule: RawServoImportRuleBorrowed, result: *mut nsAString) {
     read_locked_arc(rule, |rule: &ImportRule| {
         write!(unsafe { &mut *result }, "{}", rule.url.as_str()).unwrap();
     })
 }
 
 #[no_mangle]
 pub extern "C" fn Servo_ImportRule_GetSheet(