aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCameron McCormack <cam@mcc.id.au>2017-06-14 16:58:13 +0800
committerCameron McCormack <cam@mcc.id.au>2017-06-14 16:59:44 +0800
commite185104bb6980d51acae3e62414e3afe3cbda8af (patch)
treedf5d3ca0f2f6ebbba032f10a8ae357f226099378
parentc6da6ba06057ec488521edb19f33592f4e98c3d4 (diff)
downloadservo-e185104bb6980d51acae3e62414e3afe3cbda8af.tar.gz
servo-e185104bb6980d51acae3e62414e3afe3cbda8af.zip
geckolib: Stop borrowing PerDocumentStyleData twice when resolving lazy pseudo styles.
-rw-r--r--ports/geckolib/glue.rs27
1 files changed, 14 insertions, 13 deletions
diff --git a/ports/geckolib/glue.rs b/ports/geckolib/glue.rs
index a3c1ebbe2bc..b51a4e85b96 100644
--- a/ports/geckolib/glue.rs
+++ b/ports/geckolib/glue.rs
@@ -1444,7 +1444,7 @@ pub extern "C" fn Servo_ResolvePseudoStyle(element: RawGeckoElementBorrowed,
let global_style_data = &*GLOBAL_STYLE_DATA;
let guard = global_style_data.shared_lock.read();
match get_pseudo_style(&guard, element, &pseudo, RuleInclusion::All,
- data.styles(), doc_data) {
+ data.styles(), &*doc_data.borrow()) {
Some(values) => values.into_strong(),
// FIXME(emilio): This looks pretty wrong! Shouldn't it be at least an
// empty style inheriting from the element?
@@ -1478,28 +1478,29 @@ fn get_pseudo_style(guard: &SharedRwLockReadGuard,
pseudo: &PseudoElement,
rule_inclusion: RuleInclusion,
styles: &ElementStyles,
- doc_data: &PerDocumentStyleData)
+ doc_data: &PerDocumentStyleDataImpl)
-> Option<Arc<ComputedValues>>
{
match pseudo.cascade_type() {
PseudoElementCascadeType::Eager => styles.pseudos.get(&pseudo).map(|s| s.values().clone()),
PseudoElementCascadeType::Precomputed => unreachable!("No anonymous boxes"),
PseudoElementCascadeType::Lazy => {
- let d = doc_data.borrow_mut();
let base = if pseudo.inherits_from_default_values() {
- d.default_computed_values()
+ doc_data.default_computed_values()
} else {
styles.primary.values()
};
let guards = StylesheetGuards::same(guard);
let metrics = get_metrics_provider_for_product();
- d.stylist.lazily_compute_pseudo_element_style(&guards,
- &element,
- &pseudo,
- rule_inclusion,
- base,
- &metrics)
- .map(|s| s.values().clone())
+ doc_data.stylist
+ .lazily_compute_pseudo_element_style(
+ &guards,
+ &element,
+ &pseudo,
+ rule_inclusion,
+ base,
+ &metrics)
+ .map(|s| s.values().clone())
},
}
}
@@ -2565,10 +2566,11 @@ pub extern "C" fn Servo_ResolveStyleLazily(element: RawGeckoElementBorrowed,
let guard = global_style_data.shared_lock.read();
let element = GeckoElement(element);
let doc_data = PerDocumentStyleData::from_ffi(raw_data);
+ let data = doc_data.borrow();
let rule_inclusion = RuleInclusion::from(rule_inclusion);
let finish = |styles: &ElementStyles| -> Arc<ComputedValues> {
PseudoElement::from_pseudo_type(pseudo_type).and_then(|ref pseudo| {
- get_pseudo_style(&guard, element, pseudo, rule_inclusion, styles, doc_data)
+ get_pseudo_style(&guard, element, pseudo, rule_inclusion, styles, &*data)
}).unwrap_or_else(|| styles.primary.values().clone())
};
@@ -2589,7 +2591,6 @@ pub extern "C" fn Servo_ResolveStyleLazily(element: RawGeckoElementBorrowed,
// We don't have the style ready. Go ahead and compute it as necessary.
let mut result = None;
- let data = doc_data.borrow();
let shared = create_shared_context(&global_style_data,
&guard,
&data,