Auto merge of #20133 - emilio:kill-xbl, r=xidorn

style: Make Shadow DOM not use XBL anymore.

Bug: 1425759
Reviewed-by: xidorn
MozReview-Commit-ID: Jf2iGvLC5de

<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/20133)
<!-- Reviewable:end -->
This commit is contained in:
bors-servo 2018-02-27 05:47:29 -05:00 committed by GitHub
commit a7f38f0f32
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 879 additions and 118 deletions

View file

@ -2298,6 +2298,19 @@ extern "C" {
gecko_sheet: *const ServoStyleSheet,
);
}
extern "C" {
pub fn Servo_AuthorStyles_RemoveStyleSheet(
self_: RawServoAuthorStylesBorrowedMut,
gecko_sheet: *const ServoStyleSheet,
);
}
extern "C" {
pub fn Servo_AuthorStyles_InsertStyleSheetBefore(
self_: RawServoAuthorStylesBorrowedMut,
gecko_sheet: *const ServoStyleSheet,
before: *const ServoStyleSheet,
);
}
extern "C" {
pub fn Servo_AuthorStyles_ForceDirty(self_: RawServoAuthorStylesBorrowedMut);
}

File diff suppressed because it is too large Load diff

View file

@ -959,7 +959,8 @@ impl<'le> TElement for GeckoElement<'le> {
// ::before/::after, XBL bindings, or nsIAnonymousContentCreators.
if self.is_in_anonymous_subtree() ||
self.has_xbl_binding_with_content() ||
self.is_in_shadow_tree() ||
self.is_html_slot_element() ||
self.shadow_root().is_some() ||
self.may_have_anonymous_children() {
unsafe {
let mut iter: structs::StyleChildrenIterator = ::std::mem::zeroed();
@ -990,7 +991,7 @@ impl<'le> TElement for GeckoElement<'le> {
return self.as_node().owner_doc().as_node();
}
if self.xbl_binding().is_some() {
if self.xbl_binding().is_some() || self.shadow_root().is_some() {
return self.as_node();
}
@ -1408,19 +1409,36 @@ impl<'le> TElement for GeckoElement<'le> {
// 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());
while let Some(element) = current {
// TODO(emilio): Deal with Shadow DOM separately than with XBL
// (right now we still rely on get_xbl_binding_parent()).
//
// That will allow to clean up a bunch in
// push_applicable_declarations.
if let Some(shadow) = element.shadow_root() {
debug_assert!(!shadow.mServoStyles.mPtr.is_null());
let author_styles = unsafe {
&*(shadow.mServoStyles.mPtr
as *const structs::RawServoAuthorStyles
as *const bindings::RawServoAuthorStyles)
};
let author_styles: &'a _ = AuthorStyles::<GeckoStyleSheet>::from_ffi(author_styles);
f(&author_styles.data, author_styles.quirks_mode);
if element != *self {
break;
}
}
if let Some(binding) = element.xbl_binding() {
binding.each_xbl_cascade_data(&mut f);
// If we're not looking at our original element, allow the
// binding to cut off style inheritance.
if element != *self {
if !binding.inherits_style() {
// Go no further; we're not inheriting style from
// anything above here.
break;
}
if element != *self && !binding.inherits_style() {
// Go no further; we're not inheriting style from
// anything above here.
break;
}
}