Skip to content

Commit

Permalink
Support pseudo-element properly in HasAuthorSpecifiedRules.
Browse files Browse the repository at this point in the history
  • Loading branch information
upsuper committed Oct 10, 2017
1 parent be5839f commit 0c40ae7
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 19 deletions.
4 changes: 3 additions & 1 deletion components/style/gecko/generated/bindings.rs
Expand Up @@ -2944,7 +2944,9 @@ extern "C" {
primary_style: ServoStyleContextBorrowed);
}
extern "C" {
pub fn Servo_HasAuthorSpecifiedRules(element: RawGeckoElementBorrowed,
pub fn Servo_HasAuthorSpecifiedRules(style: ServoStyleContextBorrowed,
element: RawGeckoElementBorrowed,
pseudo_type: CSSPseudoElementType,
rule_type_mask: u32,
author_colors_allowed: bool) -> bool;
}
Expand Down
23 changes: 16 additions & 7 deletions components/style/rule_tree/mod.rs
Expand Up @@ -7,6 +7,8 @@
//! The rule tree.

use applicable_declarations::ApplicableDeclarationList;
#[cfg(feature = "gecko")]
use gecko::selector_parser::PseudoElement;
#[cfg(feature = "servo")]
use heapsize::HeapSizeOf;
#[cfg(feature = "gecko")]
Expand Down Expand Up @@ -1077,6 +1079,7 @@ impl StrongRuleNode {
#[cfg(feature = "gecko")]
pub fn has_author_specified_rules<E>(&self,
mut element: E,
mut pseudo: Option<PseudoElement>,
guards: &StylesheetGuards,
rule_type_mask: u32,
author_colors_allowed: bool)
Expand Down Expand Up @@ -1291,14 +1294,20 @@ impl StrongRuleNode {
if !have_explicit_ua_inherit { break }

// Continue to the parent element and search for the inherited properties.
element = match element.inheritance_parent() {
Some(parent) => parent,
None => break
};
if let Some(pseudo) = pseudo.take() {
if pseudo.inherits_from_default_values() {
break;
}
} else {
element = match element.inheritance_parent() {
Some(parent) => parent,
None => break
};

let parent_data = element.mutate_data().unwrap();
let parent_rule_node = parent_data.styles.primary().rules().clone();
element_rule_node = Cow::Owned(parent_rule_node);
let parent_data = element.mutate_data().unwrap();
let parent_rule_node = parent_data.styles.primary().rules().clone();
element_rule_node = Cow::Owned(parent_rule_node);
}

properties = inherited_properties;
}
Expand Down
20 changes: 9 additions & 11 deletions ports/geckolib/glue.rs
Expand Up @@ -1863,26 +1863,24 @@ pub extern "C" fn Servo_SetExplicitStyle(element: RawGeckoElementBorrowed,
}

#[no_mangle]
pub extern "C" fn Servo_HasAuthorSpecifiedRules(element: RawGeckoElementBorrowed,
pub extern "C" fn Servo_HasAuthorSpecifiedRules(style: ServoStyleContextBorrowed,
element: RawGeckoElementBorrowed,
pseudo_type: CSSPseudoElementType,
rule_type_mask: u32,
author_colors_allowed: bool)
-> bool
{
let element = GeckoElement(element);

let data =
element.borrow_data()
.expect("calling Servo_HasAuthorSpecifiedRules on an unstyled element");

let primary_style = data.styles.primary();
let pseudo = PseudoElement::from_pseudo_type(pseudo_type);

let guard = (*GLOBAL_STYLE_DATA).shared_lock.read();
let guards = StylesheetGuards::same(&guard);

primary_style.rules().has_author_specified_rules(element,
&guards,
rule_type_mask,
author_colors_allowed)
style.rules().has_author_specified_rules(element,
pseudo,
&guards,
rule_type_mask,
author_colors_allowed)
}

fn get_pseudo_style(
Expand Down

0 comments on commit 0c40ae7

Please sign in to comment.