mirror of
https://github.com/servo/servo.git
synced 2025-08-05 21:50:18 +01:00
Auto merge of #17313 - heycam:double-borrow, r=emilio
geckolib: Stop borrowing PerDocumentStyleData twice when resolving lazy pseudo styles. From https://bugzilla.mozilla.org/show_bug.cgi?id=1371708.
This commit is contained in:
commit
f26726cfdd
1 changed files with 14 additions and 13 deletions
|
@ -1444,7 +1444,7 @@ pub extern "C" fn Servo_ResolvePseudoStyle(element: RawGeckoElementBorrowed,
|
||||||
let global_style_data = &*GLOBAL_STYLE_DATA;
|
let global_style_data = &*GLOBAL_STYLE_DATA;
|
||||||
let guard = global_style_data.shared_lock.read();
|
let guard = global_style_data.shared_lock.read();
|
||||||
match get_pseudo_style(&guard, element, &pseudo, RuleInclusion::All,
|
match get_pseudo_style(&guard, element, &pseudo, RuleInclusion::All,
|
||||||
data.styles(), doc_data) {
|
data.styles(), &*doc_data.borrow()) {
|
||||||
Some(values) => values.into_strong(),
|
Some(values) => values.into_strong(),
|
||||||
// FIXME(emilio): This looks pretty wrong! Shouldn't it be at least an
|
// FIXME(emilio): This looks pretty wrong! Shouldn't it be at least an
|
||||||
// empty style inheriting from the element?
|
// empty style inheriting from the element?
|
||||||
|
@ -1478,22 +1478,23 @@ fn get_pseudo_style(guard: &SharedRwLockReadGuard,
|
||||||
pseudo: &PseudoElement,
|
pseudo: &PseudoElement,
|
||||||
rule_inclusion: RuleInclusion,
|
rule_inclusion: RuleInclusion,
|
||||||
styles: &ElementStyles,
|
styles: &ElementStyles,
|
||||||
doc_data: &PerDocumentStyleData)
|
doc_data: &PerDocumentStyleDataImpl)
|
||||||
-> Option<Arc<ComputedValues>>
|
-> Option<Arc<ComputedValues>>
|
||||||
{
|
{
|
||||||
match pseudo.cascade_type() {
|
match pseudo.cascade_type() {
|
||||||
PseudoElementCascadeType::Eager => styles.pseudos.get(&pseudo).map(|s| s.values().clone()),
|
PseudoElementCascadeType::Eager => styles.pseudos.get(&pseudo).map(|s| s.values().clone()),
|
||||||
PseudoElementCascadeType::Precomputed => unreachable!("No anonymous boxes"),
|
PseudoElementCascadeType::Precomputed => unreachable!("No anonymous boxes"),
|
||||||
PseudoElementCascadeType::Lazy => {
|
PseudoElementCascadeType::Lazy => {
|
||||||
let d = doc_data.borrow_mut();
|
|
||||||
let base = if pseudo.inherits_from_default_values() {
|
let base = if pseudo.inherits_from_default_values() {
|
||||||
d.default_computed_values()
|
doc_data.default_computed_values()
|
||||||
} else {
|
} else {
|
||||||
styles.primary.values()
|
styles.primary.values()
|
||||||
};
|
};
|
||||||
let guards = StylesheetGuards::same(guard);
|
let guards = StylesheetGuards::same(guard);
|
||||||
let metrics = get_metrics_provider_for_product();
|
let metrics = get_metrics_provider_for_product();
|
||||||
d.stylist.lazily_compute_pseudo_element_style(&guards,
|
doc_data.stylist
|
||||||
|
.lazily_compute_pseudo_element_style(
|
||||||
|
&guards,
|
||||||
&element,
|
&element,
|
||||||
&pseudo,
|
&pseudo,
|
||||||
rule_inclusion,
|
rule_inclusion,
|
||||||
|
@ -2565,10 +2566,11 @@ pub extern "C" fn Servo_ResolveStyleLazily(element: RawGeckoElementBorrowed,
|
||||||
let guard = global_style_data.shared_lock.read();
|
let guard = global_style_data.shared_lock.read();
|
||||||
let element = GeckoElement(element);
|
let element = GeckoElement(element);
|
||||||
let doc_data = PerDocumentStyleData::from_ffi(raw_data);
|
let doc_data = PerDocumentStyleData::from_ffi(raw_data);
|
||||||
|
let data = doc_data.borrow();
|
||||||
let rule_inclusion = RuleInclusion::from(rule_inclusion);
|
let rule_inclusion = RuleInclusion::from(rule_inclusion);
|
||||||
let finish = |styles: &ElementStyles| -> Arc<ComputedValues> {
|
let finish = |styles: &ElementStyles| -> Arc<ComputedValues> {
|
||||||
PseudoElement::from_pseudo_type(pseudo_type).and_then(|ref pseudo| {
|
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())
|
}).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.
|
// We don't have the style ready. Go ahead and compute it as necessary.
|
||||||
let mut result = None;
|
let mut result = None;
|
||||||
let data = doc_data.borrow();
|
|
||||||
let shared = create_shared_context(&global_style_data,
|
let shared = create_shared_context(&global_style_data,
|
||||||
&guard,
|
&guard,
|
||||||
&data,
|
&data,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue