Bug 1530751 - Make the pres context optional in the style system. r=jwatt

Differential Revision: https://phabricator.services.mozilla.com/D21239

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Emilio Cobos Álvarez 2019-03-06 21:36:12 +00:00
Родитель 8c9a745531
Коммит 2028cb1479
11 изменённых файлов: 115 добавлений и 87 удалений

Просмотреть файл

@ -170,7 +170,6 @@ nsPresContext::nsPresContext(dom::Document* aDocument, nsPresContextType aType)
mHasPendingInterrupt(false), mHasPendingInterrupt(false),
mPendingInterruptFromTest(false), mPendingInterruptFromTest(false),
mInterruptsEnabled(false), mInterruptsEnabled(false),
mUseDocumentColors(true),
mSendAfterPaintToContent(false), mSendAfterPaintToContent(false),
mUseFocusColors(false), mUseFocusColors(false),
mDrawImageBackground(true), // always draw the background mDrawImageBackground(true), // always draw the background
@ -344,28 +343,6 @@ void nsPresContext::GetDocumentColorPreferences() {
// but in some reference tests, that is not the case. // but in some reference tests, that is not the case.
gfxPrefs::GetSingleton(); gfxPrefs::GetSingleton();
PreferenceSheet::EnsureInitialized(); PreferenceSheet::EnsureInitialized();
static int32_t sDocumentColorsSetting;
static bool sDocumentColorsSettingPrefCached = false;
if (!sDocumentColorsSettingPrefCached) {
sDocumentColorsSettingPrefCached = true;
Preferences::AddIntVarCache(&sDocumentColorsSetting,
"browser.display.document_color_use", 0);
}
// Now deal with the pref:
// 0 = default: always, except in high contrast mode
// 1 = always
// 2 = never
if (sDocumentColorsSetting == 1 || mDocument->IsBeingUsedAsImage()) {
mUseDocumentColors = true;
} else if (sDocumentColorsSetting == 2) {
mUseDocumentColors = IsChrome() || IsChromeOriginImage();
} else {
bool useAccessibilityTheme =
PreferenceSheet::UseAccessibilityTheme(IsChrome());
mUseDocumentColors = !useAccessibilityTheme;
}
} }
void nsPresContext::GetUserPreferences() { void nsPresContext::GetUserPreferences() {
@ -1662,9 +1639,9 @@ bool nsPresContext::HasAuthorSpecifiedRules(const nsIFrame* aFrame,
if (aFrame->Style()->IsAnonBox()) { if (aFrame->Style()->IsAnonBox()) {
return false; return false;
} }
return Servo_HasAuthorSpecifiedRules(aFrame->Style(), elem,
aFrame->Style()->GetPseudoType(), auto* set = PresShell()->StyleSet()->RawSet();
aRuleTypeMask, UseDocumentColors()); return Servo_HasAuthorSpecifiedRules(set, aFrame->Style(), elem, aRuleTypeMask);
} }
gfxUserFontSet* nsPresContext::GetUserFontSet() { gfxUserFontSet* nsPresContext::GetUserFontSet() {

Просмотреть файл

@ -841,14 +841,6 @@ class nsPresContext : public nsISupports,
bool HasAuthorSpecifiedRules(const nsIFrame* aFrame, bool HasAuthorSpecifiedRules(const nsIFrame* aFrame,
uint32_t ruleTypeMask) const; uint32_t ruleTypeMask) const;
// Is it OK to let the page specify colors and backgrounds?
bool UseDocumentColors() const {
MOZ_ASSERT(mUseDocumentColors || !(IsChrome() || IsChromeOriginImage()),
"We should never have a chrome doc or image that can't use its "
"colors.");
return mUseDocumentColors;
}
// Explicitly enable and disable paint flashing. // Explicitly enable and disable paint flashing.
void SetPaintFlashing(bool aPaintFlashing) { void SetPaintFlashing(bool aPaintFlashing) {
mPaintFlashing = aPaintFlashing; mPaintFlashing = aPaintFlashing;
@ -1227,7 +1219,6 @@ class nsPresContext : public nsISupports,
unsigned mHasPendingInterrupt : 1; unsigned mHasPendingInterrupt : 1;
unsigned mPendingInterruptFromTest : 1; unsigned mPendingInterruptFromTest : 1;
unsigned mInterruptsEnabled : 1; unsigned mInterruptsEnabled : 1;
unsigned mUseDocumentColors : 1;
unsigned mSendAfterPaintToContent : 1; unsigned mSendAfterPaintToContent : 1;
unsigned mUseFocusColors : 1; unsigned mUseFocusColors : 1;
unsigned mFocusRingOnAnything : 1; unsigned mFocusRingOnAnything : 1;

Просмотреть файл

@ -39,7 +39,7 @@ bool PreferenceSheet::ShouldUseChromePrefs(const Document& aDoc) {
(aDoc.IsBeingUsedAsImage() && aDoc.IsDocumentURISchemeChrome()); (aDoc.IsBeingUsedAsImage() && aDoc.IsDocumentURISchemeChrome());
} }
bool PreferenceSheet::UseAccessibilityTheme(bool aIsChrome) { static bool UseAccessibilityTheme(bool aIsChrome) {
return !aIsChrome && return !aIsChrome &&
!!LookAndFeel::GetInt(LookAndFeel::eIntID_UseAccessibilityTheme, 0); !!LookAndFeel::GetInt(LookAndFeel::eIntID_UseAccessibilityTheme, 0);
} }
@ -47,6 +47,8 @@ bool PreferenceSheet::UseAccessibilityTheme(bool aIsChrome) {
void PreferenceSheet::Prefs::Load(bool aIsChrome) { void PreferenceSheet::Prefs::Load(bool aIsChrome) {
*this = {}; *this = {};
mIsChrome = aIsChrome;
mUseAccessibilityTheme = UseAccessibilityTheme(aIsChrome);
mUnderlineLinks = StaticPrefs::browser_underline_anchors(); mUnderlineLinks = StaticPrefs::browser_underline_anchors();
mUseFocusColors = StaticPrefs::browser_display_use_focus_colors(); mUseFocusColors = StaticPrefs::browser_display_use_focus_colors();
@ -54,7 +56,7 @@ void PreferenceSheet::Prefs::Load(bool aIsChrome) {
mFocusRingStyle = StaticPrefs::browser_display_focus_ring_style(); mFocusRingStyle = StaticPrefs::browser_display_focus_ring_style();
mFocusRingOnAnything = StaticPrefs::browser_display_focus_ring_on_anything(); mFocusRingOnAnything = StaticPrefs::browser_display_focus_ring_on_anything();
const bool usePrefColors = !aIsChrome && !UseAccessibilityTheme(aIsChrome) && const bool usePrefColors = !aIsChrome && !mUseAccessibilityTheme &&
!StaticPrefs::browser_display_use_system_colors(); !StaticPrefs::browser_display_use_system_colors();
if (nsContentUtils::UseStandinsForNativeColors()) { if (nsContentUtils::UseStandinsForNativeColors()) {

Просмотреть файл

@ -31,6 +31,9 @@ struct PreferenceSheet {
nscolor mFocusTextColor = mDefaultColor; nscolor mFocusTextColor = mDefaultColor;
nscolor mFocusBackgroundColor = mDefaultBackgroundColor; nscolor mFocusBackgroundColor = mDefaultBackgroundColor;
bool mIsChrome = false;
bool mUseAccessibilityTheme = false;
bool mUnderlineLinks = true; bool mUnderlineLinks = true;
bool mUseFocusColors = false; bool mUseFocusColors = false;
uint8_t mFocusRingWidth = 1; uint8_t mFocusRingWidth = 1;
@ -63,7 +66,6 @@ struct PreferenceSheet {
} }
static bool ShouldUseChromePrefs(const dom::Document&); static bool ShouldUseChromePrefs(const dom::Document&);
static bool UseAccessibilityTheme(bool aIsChrome);
static const Prefs& PrefsFor(const dom::Document& aDocument) { static const Prefs& PrefsFor(const dom::Document& aDocument) {
return ShouldUseChromePrefs(aDocument) ? ChromePrefs() : ContentPrefs(); return ShouldUseChromePrefs(aDocument) ? ChromePrefs() : ContentPrefs();
} }

Просмотреть файл

@ -836,11 +836,10 @@ ComputedStyleStrong Servo_ComputedValues_ResolveXULTreePseudoStyle(
void Servo_SetExplicitStyle(RawGeckoElementBorrowed element, void Servo_SetExplicitStyle(RawGeckoElementBorrowed element,
ComputedStyleBorrowed primary_style); ComputedStyleBorrowed primary_style);
bool Servo_HasAuthorSpecifiedRules(ComputedStyleBorrowed style, bool Servo_HasAuthorSpecifiedRules(RawServoStyleSetBorrowed set,
ComputedStyleBorrowed style,
RawGeckoElementBorrowed element, RawGeckoElementBorrowed element,
mozilla::PseudoStyleType pseudo_type, uint32_t rule_type_mask);
uint32_t rule_type_mask,
bool author_colors_allowed);
// Resolves style for an element or pseudo-element without processing pending // Resolves style for an element or pseudo-element without processing pending
// restyles first. The Element and its ancestors may be unstyled, have pending // restyles first. The Element and its ancestors may be unstyled, have pending

Просмотреть файл

@ -581,6 +581,14 @@ VARCACHE_PREF(
bool, true bool, true
) )
// 0 = default: always, except in high contrast mode
// 1 = always
// 2 = never
VARCACHE_PREF(
"browser.display.document_color_use",
browser_display_document_color_use,
uint32_t, 0
)
VARCACHE_PREF( VARCACHE_PREF(
"browser.display.use_focus_colors", "browser.display.use_focus_colors",
browser_display_use_focus_colors, browser_display_use_focus_colors,

Просмотреть файл

@ -7,7 +7,7 @@
use crate::context::QuirksMode; use crate::context::QuirksMode;
use crate::dom::TElement; use crate::dom::TElement;
use crate::gecko_bindings::bindings::{self, RawServoStyleSet}; use crate::gecko_bindings::bindings::{self, RawServoStyleSet};
use crate::gecko_bindings::structs::{RawGeckoPresContextBorrowed, ServoStyleSetSizes}; use crate::gecko_bindings::structs::{self, ServoStyleSetSizes};
use crate::gecko_bindings::structs::{StyleSheet as DomStyleSheet, StyleSheetInfo}; use crate::gecko_bindings::structs::{StyleSheet as DomStyleSheet, StyleSheetInfo};
use crate::gecko_bindings::sugar::ownership::{HasArcFFI, HasBoxFFI, HasFFI, HasSimpleFFI}; use crate::gecko_bindings::sugar::ownership::{HasArcFFI, HasBoxFFI, HasFFI, HasSimpleFFI};
use crate::invalidation::media_queries::{MediaListKey, ToMediaListKey}; use crate::invalidation::media_queries::{MediaListKey, ToMediaListKey};
@ -142,9 +142,9 @@ pub struct PerDocumentStyleDataImpl {
pub struct PerDocumentStyleData(AtomicRefCell<PerDocumentStyleDataImpl>); pub struct PerDocumentStyleData(AtomicRefCell<PerDocumentStyleDataImpl>);
impl PerDocumentStyleData { impl PerDocumentStyleData {
/// Create a dummy `PerDocumentStyleData`. /// Create a `PerDocumentStyleData`.
pub fn new(pres_context: RawGeckoPresContextBorrowed) -> Self { pub fn new(document: *const structs::Document) -> Self {
let device = Device::new(pres_context); let device = Device::new(document);
// FIXME(emilio, tlin): How is this supposed to work with XBL? This is // FIXME(emilio, tlin): How is this supposed to work with XBL? This is
// right now not always honored, see bug 1405543... // right now not always honored, see bug 1405543...

Просмотреть файл

@ -17,12 +17,13 @@ use app_units::Au;
use euclid::Size2D; use euclid::Size2D;
fn viewport_size(device: &Device) -> Size2D<Au> { fn viewport_size(device: &Device) -> Size2D<Au> {
let pc = device.pres_context(); if let Some(pc) = device.pres_context() {
if pc.mIsRootPaginatedDocument() != 0 { if pc.mIsRootPaginatedDocument() != 0 {
// We want the page size, including unprintable areas and margins. // We want the page size, including unprintable areas and margins.
// FIXME(emilio, bug 1414600): Not quite! // FIXME(emilio, bug 1414600): Not quite!
let area = &pc.mPageSize; let area = &pc.mPageSize;
return Size2D::new(Au(area.width), Au(area.height)); return Size2D::new(Au(area.width), Au(area.height));
}
} }
device.au_viewport_size() device.au_viewport_size()
} }

Просмотреть файл

@ -8,7 +8,6 @@ use crate::custom_properties::CssEnvironment;
use crate::gecko::values::{convert_nscolor_to_rgba, convert_rgba_to_nscolor}; use crate::gecko::values::{convert_nscolor_to_rgba, convert_rgba_to_nscolor};
use crate::gecko_bindings::bindings; use crate::gecko_bindings::bindings;
use crate::gecko_bindings::structs; use crate::gecko_bindings::structs;
use crate::gecko_bindings::structs::{nsPresContext, RawGeckoPresContextBorrowed};
use crate::media_queries::MediaType; use crate::media_queries::MediaType;
use crate::properties::ComputedValues; use crate::properties::ComputedValues;
use crate::string_cache::Atom; use crate::string_cache::Atom;
@ -28,10 +27,9 @@ use style_traits::{CSSPixel, DevicePixel};
/// The `Device` in Gecko wraps a pres context, has a default values computed, /// The `Device` in Gecko wraps a pres context, has a default values computed,
/// and contains all the viewport rule state. /// and contains all the viewport rule state.
pub struct Device { pub struct Device {
/// NB: The pres context lifetime is tied to the styleset, who owns the /// NB: The document owns the styleset, who owns the stylist, and thus the
/// stylist, and thus the `Device`, so having a raw pres context pointer /// `Device`, so having a raw document pointer here is fine.
/// here is fine. document: *const structs::Document,
pres_context: RawGeckoPresContextBorrowed,
default_values: Arc<ComputedValues>, default_values: Arc<ComputedValues>,
/// The font size of the root element /// The font size of the root element
/// This is set when computing the style of the root /// This is set when computing the style of the root
@ -81,12 +79,12 @@ unsafe impl Send for Device {}
impl Device { impl Device {
/// Trivially constructs a new `Device`. /// Trivially constructs a new `Device`.
pub fn new(pres_context: RawGeckoPresContextBorrowed) -> Self { pub fn new(document: *const structs::Document) -> Self {
assert!(!pres_context.is_null()); assert!(!document.is_null());
let doc = unsafe { &*(*pres_context).mDocument.mRawPtr }; let doc = unsafe { &*document };
let prefs = unsafe { &*bindings::Gecko_GetPrefSheetPrefs(doc) }; let prefs = unsafe { &*bindings::Gecko_GetPrefSheetPrefs(doc) };
Device { Device {
pres_context, document,
default_values: ComputedValues::default_values(doc), default_values: ComputedValues::default_values(doc),
// FIXME(bz): Seems dubious? // FIXME(bz): Seems dubious?
root_font_size: AtomicIsize::new(FontSize::medium().size().0 as isize), root_font_size: AtomicIsize::new(FontSize::medium().size().0 as isize),
@ -112,9 +110,14 @@ impl Device {
/// Whether any animation name may be referenced from the style of any /// Whether any animation name may be referenced from the style of any
/// element. /// element.
pub fn animation_name_may_be_referenced(&self, name: &KeyframesName) -> bool { pub fn animation_name_may_be_referenced(&self, name: &KeyframesName) -> bool {
let pc = match self.pres_context() {
Some(pc) => pc,
None => return false,
};
unsafe { unsafe {
bindings::Gecko_AnimationNameMayBeReferencedFromStyle( bindings::Gecko_AnimationNameMayBeReferencedFromStyle(
self.pres_context(), pc,
name.as_atom().as_ptr(), name.as_atom().as_ptr(),
) )
} }
@ -156,16 +159,18 @@ impl Device {
convert_nscolor_to_rgba(self.body_text_color.load(Ordering::Relaxed) as u32) convert_nscolor_to_rgba(self.body_text_color.load(Ordering::Relaxed) as u32)
} }
/// Gets the pres context associated with this document.
#[inline]
pub fn pres_context(&self) -> &nsPresContext {
unsafe { &*self.pres_context }
}
/// Gets the document pointer. /// Gets the document pointer.
#[inline] #[inline]
pub fn document(&self) -> &structs::Document { pub fn document(&self) -> &structs::Document {
unsafe { &*self.pres_context().mDocument.mRawPtr } unsafe { &*self.document }
}
/// Gets the pres context associated with this document.
#[inline]
pub fn pres_context(&self) -> Option<&structs::nsPresContext> {
unsafe {
self.document().mPresShell.as_ref()?.mPresContext.mRawPtr.as_ref()
}
} }
/// Gets the preference stylesheet prefs for our document. /// Gets the preference stylesheet prefs for our document.
@ -201,13 +206,17 @@ impl Device {
/// Returns the current media type of the device. /// Returns the current media type of the device.
pub fn media_type(&self) -> MediaType { pub fn media_type(&self) -> MediaType {
let pc = match self.pres_context() {
Some(pc) => pc,
None => return MediaType::screen(),
};
// Gecko allows emulating random media with mIsEmulatingMedia and // Gecko allows emulating random media with mIsEmulatingMedia and
// mMediaEmulated. // mMediaEmulated.
let context = self.pres_context(); let medium_to_use = if pc.mIsEmulatingMedia() != 0 {
let medium_to_use = if context.mIsEmulatingMedia() != 0 { pc.mMediaEmulated.mRawPtr
context.mMediaEmulated.mRawPtr
} else { } else {
context.mMedium pc.mMedium
}; };
MediaType(CustomIdent(unsafe { Atom::from_raw(medium_to_use) })) MediaType(CustomIdent(unsafe { Atom::from_raw(medium_to_use) }))
@ -215,7 +224,11 @@ impl Device {
/// Returns the current viewport size in app units. /// Returns the current viewport size in app units.
pub fn au_viewport_size(&self) -> Size2D<Au> { pub fn au_viewport_size(&self) -> Size2D<Au> {
let area = &self.pres_context().mVisibleArea; let pc = match self.pres_context() {
Some(pc) => pc,
None => return Size2D::new(Au(0), Au(0)),
};
let area = &pc.mVisibleArea;
Size2D::new(Au(area.width), Au(area.height)) Size2D::new(Au(area.width), Au(area.height))
} }
@ -233,18 +246,37 @@ impl Device {
/// Returns the device pixel ratio. /// Returns the device pixel ratio.
pub fn device_pixel_ratio(&self) -> TypedScale<f32, CSSPixel, DevicePixel> { pub fn device_pixel_ratio(&self) -> TypedScale<f32, CSSPixel, DevicePixel> {
let override_dppx = self.pres_context().mOverrideDPPX; let pc = match self.pres_context() {
Some(pc) => pc,
None => return TypedScale::new(1.),
};
let override_dppx = pc.mOverrideDPPX;
if override_dppx > 0.0 { if override_dppx > 0.0 {
return TypedScale::new(override_dppx); return TypedScale::new(override_dppx);
} }
let au_per_dpx = self.pres_context().mCurAppUnitsPerDevPixel as f32;
let au_per_dpx = pc.mCurAppUnitsPerDevPixel as f32;
let au_per_px = AU_PER_PX as f32; let au_per_px = AU_PER_PX as f32;
TypedScale::new(au_per_px / au_per_dpx) TypedScale::new(au_per_px / au_per_dpx)
} }
/// Returns whether document colors are enabled. /// Returns whether document colors are enabled.
#[inline]
pub fn use_document_colors(&self) -> bool { pub fn use_document_colors(&self) -> bool {
self.pres_context().mUseDocumentColors() != 0 let doc = self.document();
if doc.mIsBeingUsedAsImage() {
return true;
}
let document_color_use = unsafe {
structs::StaticPrefs_sVarCache_browser_display_document_color_use
};
let prefs = self.pref_sheet_prefs();
match document_color_use {
1 => true,
2 => prefs.mIsChrome,
_ => !prefs.mUseAccessibilityTheme,
}
} }
/// Returns the default background color. /// Returns the default background color.
@ -252,15 +284,25 @@ impl Device {
convert_nscolor_to_rgba(self.pref_sheet_prefs().mDefaultBackgroundColor) convert_nscolor_to_rgba(self.pref_sheet_prefs().mDefaultBackgroundColor)
} }
/// Returns the current effective text zoom.
#[inline]
fn effective_text_zoom(&self) -> f32 {
let pc = match self.pres_context() {
Some(pc) => pc,
None => return 1.,
};
pc.mEffectiveTextZoom
}
/// Applies text zoom to a font-size or line-height value (see nsStyleFont::ZoomText). /// Applies text zoom to a font-size or line-height value (see nsStyleFont::ZoomText).
#[inline] #[inline]
pub fn zoom_text(&self, size: Au) -> Au { pub fn zoom_text(&self, size: Au) -> Au {
size.scale_by(self.pres_context().mEffectiveTextZoom) size.scale_by(self.effective_text_zoom())
} }
/// Un-apply text zoom. /// Un-apply text zoom.
#[inline] #[inline]
pub fn unzoom_text(&self, size: Au) -> Au { pub fn unzoom_text(&self, size: Au) -> Au {
size.scale_by(1. / self.pres_context().mEffectiveTextZoom) size.scale_by(1. / self.effective_text_zoom())
} }
} }

Просмотреть файл

@ -1044,9 +1044,13 @@ impl FontMetricsProvider for GeckoFontMetricsProvider {
device: &Device, device: &Device,
) -> FontMetricsQueryResult { ) -> FontMetricsQueryResult {
use crate::gecko_bindings::bindings::Gecko_GetFontMetrics; use crate::gecko_bindings::bindings::Gecko_GetFontMetrics;
let pc = match device.pres_context() {
Some(pc) => pc,
None => return FontMetricsQueryResult::NotAvailable,
};
let gecko_metrics = unsafe { let gecko_metrics = unsafe {
Gecko_GetFontMetrics( Gecko_GetFontMetrics(
device.pres_context(), pc,
wm.is_vertical() && !wm.is_sideways(), wm.is_vertical() && !wm.is_sideways(),
font.gecko(), font.gecko(),
font_size.0, font_size.0,

Просмотреть файл

@ -3349,18 +3349,20 @@ pub extern "C" fn Servo_SetExplicitStyle(
#[no_mangle] #[no_mangle]
pub extern "C" fn Servo_HasAuthorSpecifiedRules( pub extern "C" fn Servo_HasAuthorSpecifiedRules(
raw_data: RawServoStyleSetBorrowed,
style: ComputedStyleBorrowed, style: ComputedStyleBorrowed,
element: RawGeckoElementBorrowed, element: RawGeckoElementBorrowed,
pseudo_type: PseudoStyleType,
rule_type_mask: u32, rule_type_mask: u32,
author_colors_allowed: bool,
) -> bool { ) -> bool {
let data = PerDocumentStyleData::from_ffi(raw_data).borrow();
let element = GeckoElement(element); let element = GeckoElement(element);
let pseudo = PseudoElement::from_pseudo_type(pseudo_type);
let guard = (*GLOBAL_STYLE_DATA).shared_lock.read(); let guard = (*GLOBAL_STYLE_DATA).shared_lock.read();
let guards = StylesheetGuards::same(&guard); let guards = StylesheetGuards::same(&guard);
let pseudo = style.pseudo();
let author_colors_allowed = data.stylist.device().use_document_colors();
style.rules().has_author_specified_rules( style.rules().has_author_specified_rules(
element, element,
pseudo, pseudo,
@ -3576,7 +3578,8 @@ pub extern "C" fn Servo_ComputedValues_GetStyleRuleList(
pub extern "C" fn Servo_StyleSet_Init( pub extern "C" fn Servo_StyleSet_Init(
pres_context: RawGeckoPresContextBorrowed, pres_context: RawGeckoPresContextBorrowed,
) -> *mut RawServoStyleSet { ) -> *mut RawServoStyleSet {
let data = Box::new(PerDocumentStyleData::new(pres_context)); let doc = pres_context.mDocument.mRawPtr;
let data = Box::new(PerDocumentStyleData::new(doc));
Box::into_raw(data) as *mut RawServoStyleSet Box::into_raw(data) as *mut RawServoStyleSet
} }
@ -3594,9 +3597,8 @@ pub extern "C" fn Servo_StyleSet_Drop(data: RawServoStyleSetOwned) {
#[no_mangle] #[no_mangle]
pub unsafe extern "C" fn Servo_StyleSet_CompatModeChanged(raw_data: RawServoStyleSetBorrowed) { pub unsafe extern "C" fn Servo_StyleSet_CompatModeChanged(raw_data: RawServoStyleSetBorrowed) {
let mut data = PerDocumentStyleData::from_ffi(raw_data).borrow_mut(); let mut data = PerDocumentStyleData::from_ffi(raw_data).borrow_mut();
let doc = &*data.stylist.device().pres_context().mDocument.mRawPtr; let quirks_mode = data.stylist.device().document().mCompatMode;
data.stylist data.stylist.set_quirks_mode(quirks_mode.into());
.set_quirks_mode(QuirksMode::from(doc.mCompatMode));
} }
fn parse_property_into( fn parse_property_into(