Skip to content

Commit

Permalink
style: Fix IsInAnonymousSubtree to account for XBL in Shadow DOM.
Browse files Browse the repository at this point in the history
Bug: 1453206
Reviewed-by: smaug
MozReview-Commit-ID: B2aYury8K7i
  • Loading branch information
emilio committed Apr 14, 2018
1 parent 245d848 commit 3ef77f5
Showing 1 changed file with 15 additions and 17 deletions.
32 changes: 15 additions & 17 deletions components/style/gecko/wrapper.rs
Expand Up @@ -637,10 +637,11 @@ impl<'le> GeckoElement<'le> {
!self.xbl_binding_with_content().is_none()
}

/// This and has_xbl_binding_parent duplicate the logic in Gecko's virtual
/// nsINode::GetBindingParent function, which only has two implementations:
/// one for XUL elements, and one for other elements. We just hard code in
/// our knowledge of those two implementations here.
/// This duplicates the logic in Gecko's virtual nsINode::GetBindingParent
/// function, which only has two implementations: one for XUL elements, and
/// one for other elements.
///
/// We just hard code in our knowledge of those two implementations here.
fn xbl_binding_parent(&self) -> Option<Self> {
if self.is_xul_element() {
// FIXME(heycam): Having trouble with bindgen on nsXULElement,
Expand All @@ -667,17 +668,6 @@ impl<'le> GeckoElement<'le> {
.map_or(ptr::null_mut(), |slots| slots._base.mBindingParent)
}

fn has_xbl_binding_parent(&self) -> bool {
if self.is_xul_element() {
// FIXME(heycam): Having trouble with bindgen on nsXULElement,
// where the binding parent is stored in a member variable
// rather than in slots. So just get it through FFI for now.
unsafe { bindings::Gecko_GetBindingParent(self.0).is_some() }
} else {
!self.non_xul_xbl_binding_parent_raw_content().is_null()
}
}

#[inline]
fn namespace_id(&self) -> i32 {
self.as_node().node_info().mInner.mNamespaceID
Expand Down Expand Up @@ -815,8 +805,16 @@ impl<'le> GeckoElement<'le> {
/// This logic is duplicated in Gecko's nsIContent::IsInAnonymousSubtree.
#[inline]
fn is_in_anonymous_subtree(&self) -> bool {
self.is_in_native_anonymous_subtree() ||
(!self.as_node().is_in_shadow_tree() && self.has_xbl_binding_parent())
if self.is_in_native_anonymous_subtree() {
return true;
}

let binding_parent = match self.xbl_binding_parent() {
Some(p) => p,
None => return false,
};

binding_parent.shadow_root().is_none()
}

/// Returns true if this node is the shadow root of an use-element shadow tree.
Expand Down

0 comments on commit 3ef77f5

Please sign in to comment.