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:
Emilio Cobos Álvarez 2017-06-02 20:34:37 +02:00
parent 5c66d3c77a
commit dd3bf6f952
No known key found for this signature in database
GPG key ID: 056B727BB9C1027C
3 changed files with 20 additions and 13 deletions

View file

@ -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,

View file

@ -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.

View file

@ -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]