diff --git a/components/style/gecko/generated/bindings.rs b/components/style/gecko/generated/bindings.rs index 46687e34bb5..a300dd8d3d4 100644 --- a/components/style/gecko/generated/bindings.rs +++ b/components/style/gecko/generated/bindings.rs @@ -1420,6 +1420,10 @@ extern "C" { pub fn Gecko_CSSFontFaceRule_Create(line: u32, column: u32) -> *mut nsCSSFontFaceRule; } +extern "C" { + pub fn Gecko_CSSFontFaceRule_Clone(rule: *const nsCSSFontFaceRule) + -> *mut nsCSSFontFaceRule; +} extern "C" { pub fn Gecko_CSSFontFaceRule_GetCssText(rule: *const nsCSSFontFaceRule, result: *mut nsAString); @@ -1434,6 +1438,10 @@ extern "C" { pub fn Gecko_CSSCounterStyle_Create(name: *mut nsIAtom) -> *mut nsCSSCounterStyleRule; } +extern "C" { + pub fn Gecko_CSSCounterStyle_Clone(rule: *const nsCSSCounterStyleRule) + -> *mut nsCSSCounterStyleRule; +} extern "C" { pub fn Gecko_CSSCounterStyle_GetCssText(rule: *const nsCSSCounterStyleRule, diff --git a/components/style/gecko/rules.rs b/components/style/gecko/rules.rs index e9165f7629f..f29da894e86 100644 --- a/components/style/gecko/rules.rs +++ b/components/style/gecko/rules.rs @@ -150,6 +150,18 @@ impl ToNsCssValue for FontDisplay { } } +impl FontFaceRule { + /// Ask Gecko to deep clone the nsCSSFontFaceRule, and then construct + /// a FontFaceRule object from it. + pub fn deep_clone_from_gecko(&self) -> FontFaceRule { + let result = unsafe { + UniqueRefPtr::from_addrefed( + bindings::Gecko_CSSFontFaceRule_Clone(self.get())) + }; + result.get() + } +} + impl From for FontFaceRule { fn from(data: FontFaceRuleData) -> FontFaceRule { let mut result = unsafe { @@ -176,6 +188,18 @@ impl ToCssWithGuard for FontFaceRule { /// A @counter-style rule pub type CounterStyleRule = RefPtr; +impl CounterStyleRule { + /// Ask Gecko to deep clone the nsCSSCounterStyleRule, and then construct + /// a CounterStyleRule object from it. + pub fn deep_clone_from_gecko(&self) -> CounterStyleRule { + let result = unsafe { + UniqueRefPtr::from_addrefed( + bindings::Gecko_CSSCounterStyle_Clone(self.get())) + }; + result.get() + } +} + impl From for CounterStyleRule { fn from(data: counter_style::CounterStyleRuleData) -> CounterStyleRule { let mut result = unsafe { diff --git a/components/style/stylesheets/counter_style_rule.rs b/components/style/stylesheets/counter_style_rule.rs index a6369be9395..a27891bf5bb 100644 --- a/components/style/stylesheets/counter_style_rule.rs +++ b/components/style/stylesheets/counter_style_rule.rs @@ -10,3 +10,15 @@ pub use counter_style::CounterStyleRuleData as CounterStyleRule; #[cfg(feature = "gecko")] pub use gecko::rules::CounterStyleRule; + +impl CounterStyleRule { + #[cfg(feature = "servo")] + pub fn clone_conditionally_gecko_or_servo(&self) -> CounterStyleRule { + self.clone() + } + + #[cfg(feature = "gecko")] + pub fn clone_conditionally_gecko_or_servo(&self) -> CounterStyleRule { + self.deep_clone_from_gecko() + } +} diff --git a/components/style/stylesheets/font_face_rule.rs b/components/style/stylesheets/font_face_rule.rs index 5e178e88e55..100c762c2f8 100644 --- a/components/style/stylesheets/font_face_rule.rs +++ b/components/style/stylesheets/font_face_rule.rs @@ -10,3 +10,15 @@ pub use font_face::FontFaceRuleData as FontFaceRule; #[cfg(feature = "gecko")] pub use gecko::rules::FontFaceRule; + +impl FontFaceRule { + #[cfg(feature = "servo")] + pub fn clone_conditionally_gecko_or_servo(&self) -> FontFaceRule { + self.clone() + } + + #[cfg(feature = "gecko")] + pub fn clone_conditionally_gecko_or_servo(&self) -> FontFaceRule { + self.deep_clone_from_gecko() + } +} diff --git a/components/style/stylesheets/mod.rs b/components/style/stylesheets/mod.rs index bcc40f1243b..83abc51702a 100644 --- a/components/style/stylesheets/mod.rs +++ b/components/style/stylesheets/mod.rs @@ -289,11 +289,13 @@ impl DeepCloneWithLock for CssRule { }, CssRule::FontFace(ref arc) => { let rule = arc.read_with(guard); - CssRule::FontFace(Arc::new(lock.wrap(rule.clone()))) + CssRule::FontFace(Arc::new(lock.wrap( + rule.clone_conditionally_gecko_or_servo()))) }, CssRule::CounterStyle(ref arc) => { let rule = arc.read_with(guard); - CssRule::CounterStyle(Arc::new(lock.wrap(rule.clone()))) + CssRule::CounterStyle(Arc::new(lock.wrap( + rule.clone_conditionally_gecko_or_servo()))) }, CssRule::Viewport(ref arc) => { let rule = arc.read_with(guard);