aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--components/style/properties/gecko.mako.rs4
-rw-r--r--components/style/properties/properties.mako.rs28
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 {