diff options
-rw-r--r-- | components/style/properties/gecko.mako.rs | 39 | ||||
-rw-r--r-- | ports/geckolib/gecko_bindings/bindings.rs | 1 | ||||
-rw-r--r-- | ports/geckolib/glue.rs | 19 | ||||
-rw-r--r-- | ports/geckolib/wrapper.rs | 9 |
4 files changed, 47 insertions, 21 deletions
diff --git a/components/style/properties/gecko.mako.rs b/components/style/properties/gecko.mako.rs index 24893da9f7b..8fd16e33c07 100644 --- a/components/style/properties/gecko.mako.rs +++ b/components/style/properties/gecko.mako.rs @@ -100,7 +100,30 @@ impl ComputedValues { ComputedValues::inherit_from(parent) } - pub fn initial_values() -> &'static Self { &*INITIAL_GECKO_VALUES } + pub fn initial_values() -> &'static Self { + unsafe { + debug_assert!(!INITIAL_GECKO_VALUES.is_null()); + &*INITIAL_GECKO_VALUES + } + } + + pub unsafe fn initialize() { + debug_assert!(INITIAL_GECKO_VALUES.is_null()); + INITIAL_GECKO_VALUES = Box::into_raw(Box::new(ComputedValues { + % for style_struct in data.style_structs: + ${style_struct.ident}: style_structs::${style_struct.name}::initial(), + % endfor + custom_properties: None, + shareable: true, + writing_mode: WritingMode::empty(), + root_font_size: longhands::font_size::get_initial_value(), + })); + } + + pub unsafe fn shutdown() { + debug_assert!(!INITIAL_GECKO_VALUES.is_null()); + let _ = Box::from_raw(INITIAL_GECKO_VALUES); + } #[inline] pub fn do_cascade_property<F: FnOnce(&[CascadePropertyFn])>(f: F) { @@ -236,7 +259,7 @@ def set_gecko_property(ffi_name, expr): // In the longer term, Gecko should store currentColor as a computed // value, so that we don't need to do this: // https://bugzilla.mozilla.org/show_bug.cgi?id=760345 - unimplemented!(); + warn!("stylo: mishandling currentColor"); % endif </%def> @@ -1338,17 +1361,7 @@ ${impl_style_struct(style_struct)} ${define_ffi_struct_accessor(style_struct)} % endfor -lazy_static! { - pub static ref INITIAL_GECKO_VALUES: ComputedValues = ComputedValues { - % for style_struct in data.style_structs: - ${style_struct.ident}: style_structs::${style_struct.name}::initial(), - % endfor - custom_properties: None, - shareable: true, - writing_mode: WritingMode::empty(), - root_font_size: longhands::font_size::get_initial_value(), - }; -} +static mut INITIAL_GECKO_VALUES: *mut ComputedValues = 0 as *mut ComputedValues; static CASCADE_PROPERTY: [CascadePropertyFn; ${len(data.longhands)}] = [ % for property in data.longhands: diff --git a/ports/geckolib/gecko_bindings/bindings.rs b/ports/geckolib/gecko_bindings/bindings.rs index 646e1cffc4e..2855ce4942b 100644 --- a/ports/geckolib/gecko_bindings/bindings.rs +++ b/ports/geckolib/gecko_bindings/bindings.rs @@ -375,6 +375,7 @@ extern "C" { pub fn Servo_AddRefComputedValues(arg1: *mut ServoComputedValues); pub fn Servo_ReleaseComputedValues(arg1: *mut ServoComputedValues); pub fn Servo_Initialize(); + pub fn Servo_Shutdown(); pub fn Servo_RestyleDocument(doc: *mut RawGeckoDocument, set: *mut RawServoStyleSet); pub fn Servo_RestyleSubtree(node: *mut RawGeckoNode, diff --git a/ports/geckolib/glue.rs b/ports/geckolib/glue.rs index 87e69aabef0..98932fb8efc 100644 --- a/ports/geckolib/glue.rs +++ b/ports/geckolib/glue.rs @@ -76,6 +76,15 @@ pub extern "C" fn Servo_Initialize() -> () { // // See https://doc.rust-lang.org/log/env_logger/index.html for instructions. env_logger::init().unwrap(); + + // Allocate our default computed values. + unsafe { ComputedValues::initialize(); } +} + +#[no_mangle] +pub extern "C" fn Servo_Shutdown() -> () { + // Destroy our default computed values. + unsafe { ComputedValues::shutdown(); } } fn restyle_subtree(node: GeckoNode, raw_data: *mut RawServoStyleSet) { @@ -355,10 +364,12 @@ pub extern "C" fn Servo_GetComputedValuesForPseudoElement(parent_style: *mut Ser pub extern "C" fn Servo_InheritComputedValues(parent_style: *mut ServoComputedValues) -> *mut ServoComputedValues { type Helpers = ArcHelpers<ServoComputedValues, ComputedValues>; - Helpers::with(parent_style, |parent| { - let style = ComputedValues::inherit_from(parent); - Helpers::from(style) - }) + let style = if parent_style.is_null() { + Arc::new(ComputedValues::initial_values().clone()) + } else { + Helpers::with(parent_style, ComputedValues::inherit_from) + }; + Helpers::from(style) } #[no_mangle] diff --git a/ports/geckolib/wrapper.rs b/ports/geckolib/wrapper.rs index b750fda883f..db2df0c6f02 100644 --- a/ports/geckolib/wrapper.rs +++ b/ports/geckolib/wrapper.rs @@ -53,7 +53,8 @@ use style::selector_impl::ElementExt; use style::sink::Push; use url::Url; -pub type NonOpaqueStyleData = *mut RefCell<PrivateStyleData>; +pub type NonOpaqueStyleData = RefCell<PrivateStyleData>; +pub type NonOpaqueStyleDataPtr = *mut NonOpaqueStyleData; // Important: We don't currently refcount the DOM, because the wrapper lifetime // magic guarantees that our LayoutFoo references won't outlive the root, and @@ -78,16 +79,16 @@ impl<'ln> GeckoNode<'ln> { GeckoNode::from_raw(n as *const RawGeckoNode as *mut RawGeckoNode) } - fn get_node_data(&self) -> NonOpaqueStyleData { + fn get_node_data(&self) -> NonOpaqueStyleDataPtr { unsafe { - Gecko_GetNodeData(self.node) as NonOpaqueStyleData + Gecko_GetNodeData(self.node) as NonOpaqueStyleDataPtr } } pub fn initialize_data(self) { unsafe { if self.get_node_data().is_null() { - let ptr: NonOpaqueStyleData = Box::into_raw(Box::new(RefCell::new(PrivateStyleData::new()))); + let ptr: NonOpaqueStyleDataPtr = Box::into_raw(Box::new(RefCell::new(PrivateStyleData::new()))); Gecko_SetNodeData(self.node, ptr as *mut ServoNodeData); } } |