mirror of
https://github.com/servo/servo.git
synced 2025-08-05 13:40:08 +01:00
Ensure the default computed values are up-to-date before evaluating media queries.
Zoom changes can change the meaning of ems, so we can't re-evaluate media queries with the old values, because otherwise we may miss a restyle. Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1357461 MozReview-Commit-ID: HQInvR7RPqR
This commit is contained in:
parent
5c66d3c77a
commit
dd3bf6f952
3 changed files with 20 additions and 13 deletions
|
@ -9,7 +9,6 @@ use atomic_refcell::{AtomicRef, AtomicRefCell, AtomicRefMut};
|
||||||
use dom::TElement;
|
use dom::TElement;
|
||||||
use fnv::FnvHashMap;
|
use fnv::FnvHashMap;
|
||||||
use gecko::rules::{CounterStyleRule, FontFaceRule};
|
use gecko::rules::{CounterStyleRule, FontFaceRule};
|
||||||
use gecko::wrapper::GeckoElement;
|
|
||||||
use gecko_bindings::bindings::RawServoStyleSet;
|
use gecko_bindings::bindings::RawServoStyleSet;
|
||||||
use gecko_bindings::structs::RawGeckoPresContextOwned;
|
use gecko_bindings::structs::RawGeckoPresContextOwned;
|
||||||
use gecko_bindings::structs::nsIDocument;
|
use gecko_bindings::structs::nsIDocument;
|
||||||
|
@ -70,15 +69,6 @@ impl PerDocumentStyleData {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl PerDocumentStyleDataImpl {
|
impl PerDocumentStyleDataImpl {
|
||||||
/// Reset the device state because it may have changed.
|
|
||||||
///
|
|
||||||
/// Implies also a stylesheet flush.
|
|
||||||
pub fn reset_device(&mut self, guard: &SharedRwLockReadGuard) {
|
|
||||||
self.stylist.device_mut().reset();
|
|
||||||
self.stylesheets.force_dirty();
|
|
||||||
self.flush_stylesheets::<GeckoElement>(guard, None);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Recreate the style data if the stylesheets have changed.
|
/// Recreate the style data if the stylesheets have changed.
|
||||||
pub fn flush_stylesheets<E>(&mut self,
|
pub fn flush_stylesheets<E>(&mut self,
|
||||||
guard: &SharedRwLockReadGuard,
|
guard: &SharedRwLockReadGuard,
|
||||||
|
|
|
@ -99,6 +99,13 @@ impl Device {
|
||||||
self.root_font_size.store(size.0 as isize, Ordering::Relaxed)
|
self.root_font_size.store(size.0 as isize, Ordering::Relaxed)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Recreates the default computed values.
|
||||||
|
pub fn reset_computed_values(&mut self) {
|
||||||
|
// NB: A following stylesheet flush will populate this if appropriate.
|
||||||
|
self.viewport_override = None;
|
||||||
|
self.default_values = ComputedValues::default_values(unsafe { &*self.pres_context });
|
||||||
|
}
|
||||||
|
|
||||||
/// Recreates all the temporary state that the `Device` stores.
|
/// Recreates all the temporary state that the `Device` stores.
|
||||||
///
|
///
|
||||||
/// This includes the viewport override from `@viewport` rules, and also the
|
/// This includes the viewport override from `@viewport` rules, and also the
|
||||||
|
@ -106,7 +113,7 @@ impl Device {
|
||||||
pub fn reset(&mut self) {
|
pub fn reset(&mut self) {
|
||||||
// NB: A following stylesheet flush will populate this if appropriate.
|
// NB: A following stylesheet flush will populate this if appropriate.
|
||||||
self.viewport_override = None;
|
self.viewport_override = None;
|
||||||
self.default_values = ComputedValues::default_values(unsafe { &*self.pres_context });
|
self.reset_computed_values();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the current media type of the device.
|
/// Returns the current media type of the device.
|
||||||
|
|
|
@ -758,7 +758,15 @@ pub extern "C" fn Servo_StyleSet_MediumFeaturesChanged(
|
||||||
// it's up to date.
|
// it's up to date.
|
||||||
//
|
//
|
||||||
// In case it isn't we would trigger a rebuild + restyle as needed too.
|
// In case it isn't we would trigger a rebuild + restyle as needed too.
|
||||||
let data = PerDocumentStyleData::from_ffi(raw_data).borrow();
|
//
|
||||||
|
// We need to ensure the default computed values are up to date though,
|
||||||
|
// because those can influence the result of media query evaluation.
|
||||||
|
//
|
||||||
|
// FIXME(emilio, bug 1369984): do the computation conditionally, to do it
|
||||||
|
// less often.
|
||||||
|
let mut data = PerDocumentStyleData::from_ffi(raw_data).borrow_mut();
|
||||||
|
|
||||||
|
data.stylist.device_mut().reset_computed_values();
|
||||||
data.stylist.media_features_change_changed_style(
|
data.stylist.media_features_change_changed_style(
|
||||||
data.stylesheets.iter(),
|
data.stylesheets.iter(),
|
||||||
&guard,
|
&guard,
|
||||||
|
@ -1428,7 +1436,9 @@ pub extern "C" fn Servo_StyleSet_RebuildData(raw_data: RawServoStyleSetBorrowed)
|
||||||
let guard = global_style_data.shared_lock.read();
|
let guard = global_style_data.shared_lock.read();
|
||||||
|
|
||||||
let mut data = PerDocumentStyleData::from_ffi(raw_data).borrow_mut();
|
let mut data = PerDocumentStyleData::from_ffi(raw_data).borrow_mut();
|
||||||
data.reset_device(&guard);
|
data.stylist.device_mut().reset();
|
||||||
|
data.stylesheets.force_dirty();
|
||||||
|
data.flush_stylesheets::<GeckoElement>(&guard, None);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue