diff options
-rw-r--r-- | components/style/properties/gecko.mako.rs | 4 | ||||
-rw-r--r-- | components/style/properties/properties.mako.rs | 28 |
2 files changed, 23 insertions, 9 deletions
diff --git a/components/style/properties/gecko.mako.rs b/components/style/properties/gecko.mako.rs index f0fbe045c11..85a1e21bb85 100644 --- a/components/style/properties/gecko.mako.rs +++ b/components/style/properties/gecko.mako.rs @@ -2774,10 +2774,6 @@ fn static_assert() { % for member in fill_fields.split(): max_len = cmp::max(max_len, self.gecko.${image_layers_field}.${member}Count); % endfor - - // XXXManishearth Gecko does an optimization here where it only - // fills things in if any of the properties have been set - unsafe { // While we could do this manually, we'd need to also manually // run all the copy constructors, so we just delegate to gecko diff --git a/components/style/properties/properties.mako.rs b/components/style/properties/properties.mako.rs index 9724580d678..be94b96b5f0 100644 --- a/components/style/properties/properties.mako.rs +++ b/components/style/properties/properties.mako.rs @@ -2044,6 +2044,15 @@ impl<'a, T: 'a> StyleStructRef<'a, T> } } + /// Get a mutable reference to the owned struct, or `None` if the struct + /// hasn't been mutated. + pub fn get_if_mutated(&mut self) -> Option<<&mut T> { + match *self { + StyleStructRef::Owned(ref mut v) => Some(v), + StyleStructRef::Borrowed(..) => None, + } + } + /// Returns an `Arc` to the internal struct, constructing one if /// appropriate. pub fn build(self) -> Arc<T> { @@ -2141,6 +2150,13 @@ impl<'a> StyleBuilder<'a> { pub fn mutate_${style_struct.name_lower}(&mut self) -> &mut style_structs::${style_struct.name} { self.${style_struct.ident}.mutate() } + + /// Gets a mutable view of the current `${style_struct.name}` style, + /// only if it's been mutated before. + pub fn get_${style_struct.name_lower}_if_mutated(&mut self) + -> Option<<&mut style_structs::${style_struct.name}> { + self.${style_struct.ident}.get_if_mutated() + } % endfor /// Returns whether this computed style represents a floated object. @@ -2546,11 +2562,13 @@ pub fn apply_declarations<'a, F, I>(device: &Device, } % if product == "gecko": - // FIXME(emilio): This is effectively creating a new nsStyleBackground - // and nsStyleSVG per element. We should only do this when necessary - // using the `seen` bitfield! - style.mutate_background().fill_arrays(); - style.mutate_svg().fill_arrays(); + if let Some(ref mut bg) = style.get_background_if_mutated() { + bg.fill_arrays(); + } + + if let Some(ref mut svg) = style.get_svg_if_mutated() { + svg.fill_arrays(); + } % endif if is_root_element { |