Bug 1422641: Inline Gecko_GetSMILOverrideDeclarationBlock. r?Manishearth,xidorn
MozReview-Commit-ID: E8cM7zRZHn1
--- a/layout/style/ServoBindings.cpp
+++ b/layout/style/ServoBindings.cpp
@@ -441,38 +441,16 @@ Gecko_UnsetDirtyStyleAttr(RawGeckoElemen
// XXX This can happen when nodes are adopted from a Gecko-style-backend
// document into a Servo-style-backend document. See bug 1330051.
NS_WARNING("stylo: requesting a Gecko declaration block?");
return;
}
decl->UnsetDirty();
}
-RawServoDeclarationBlockStrongBorrowedOrNull
-Gecko_GetSMILOverrideDeclarationBlock(RawGeckoElementBorrowed aElement)
-{
- // This function duplicates a lot of the code in
- // Gecko_GetStyleAttrDeclarationBlock above because I haven't worked out a way
- // to persuade hazard analysis that a pointer-to-lambda is ok yet.
- MOZ_ASSERT(aElement, "Invalid GeckoElement");
-
- DeclarationBlock* decl =
- const_cast<dom::Element*>(aElement)->GetSMILOverrideStyleDeclaration();
- if (!decl) {
- return nullptr;
- }
- if (decl->IsGecko()) {
- // XXX This can happen when nodes are adopted from a Gecko-style-backend
- // document into a Servo-style-backend document. See bug 1330051.
- NS_WARNING("stylo: requesting a Gecko declaration block?");
- return nullptr;
- }
- return decl->AsServo()->RefRawStrong();
-}
-
const RawServoDeclarationBlockStrong*
AsRefRawStrong(const RefPtr<RawServoDeclarationBlock>& aDecl)
{
static_assert(sizeof(RefPtr<RawServoDeclarationBlock>) ==
sizeof(RawServoDeclarationBlockStrong),
"RefPtr should just be a pointer");
return reinterpret_cast<const RawServoDeclarationBlockStrong*>(&aDecl);
}
--- a/layout/style/ServoBindings.h
+++ b/layout/style/ServoBindings.h
@@ -234,18 +234,16 @@ Gecko_GetActiveLinkAttrDeclarationBlock(
// Returns whether private browsing is enabled for a given element.
bool Gecko_IsPrivateBrowsingEnabled(const nsIDocument* aDoc);
// Animations
bool
Gecko_GetAnimationRule(RawGeckoElementBorrowed aElementOrPseudo,
mozilla::EffectCompositor::CascadeLevel aCascadeLevel,
RawServoAnimationValueMapBorrowedMut aAnimationValues);
-RawServoDeclarationBlockStrongBorrowedOrNull
-Gecko_GetSMILOverrideDeclarationBlock(RawGeckoElementBorrowed element);
bool Gecko_StyleAnimationsEquals(RawGeckoStyleAnimationListBorrowed,
RawGeckoStyleAnimationListBorrowed);
void Gecko_CopyAnimationNames(RawGeckoStyleAnimationListBorrowedMut aDest,
RawGeckoStyleAnimationListBorrowed aSrc);
// This function takes an already addrefed nsAtom
void Gecko_SetAnimationName(mozilla::StyleAnimation* aStyleAnimation,
nsAtom* aAtom);
void Gecko_UpdateAnimations(RawGeckoElementBorrowed aElementOrPseudo,
--- a/layout/style/ServoBindings.toml
+++ b/layout/style/ServoBindings.toml
@@ -67,16 +67,17 @@ headers = [
"mozilla/dom/Element.h",
"mozilla/dom/ChildIterator.h",
"mozilla/dom/NameSpaceConstants.h",
"mozilla/LookAndFeel.h",
"mozilla/StylePrefs.h",
"mozilla/ServoBindings.h",
"mozilla/ServoMediaList.h",
"mozilla/ServoStyleContext.h",
+ "mozilla/ServoDeclarationBlock.h",
"mozilla/SizeOfState.h",
"nsCSSCounterStyleRule.h",
"nsCSSFontFaceRule.h",
"nsContentUtils.h",
"nsNameSpaceManager.h",
"nsMediaFeatures.h",
"nsXBLBinding.h",
]
@@ -364,16 +365,17 @@ whitelist-types = [
"StyleTransition",
"ThemeWidgetType",
"mozilla::UniquePtr",
"mozilla::DefaultDelete",
"mozilla::Side",
"mozilla::binding_danger::AssertAndSuppressCleanupPolicy",
"mozilla::ParsingMode",
"mozilla::InheritTarget",
+ "mozilla::ServoDeclarationBlock",
"mozilla::ServoMediaList",
"mozilla::StyleRuleInclusion",
"nsStyleTransformMatrix::MatrixTransformOperator",
]
opaque-types = [
"std::pair__PCCP",
"std::namespace::atomic___base", "std::atomic__My_base",
"std::atomic",
--- a/servo/components/style/gecko/wrapper.rs
+++ b/servo/components/style/gecko/wrapper.rs
@@ -37,17 +37,16 @@ use gecko_bindings::bindings::{Gecko_Set
use gecko_bindings::bindings::Gecko_ClassOrClassList;
use gecko_bindings::bindings::Gecko_ElementHasAnimations;
use gecko_bindings::bindings::Gecko_ElementHasCSSAnimations;
use gecko_bindings::bindings::Gecko_ElementHasCSSTransitions;
use gecko_bindings::bindings::Gecko_GetActiveLinkAttrDeclarationBlock;
use gecko_bindings::bindings::Gecko_GetAnimationRule;
use gecko_bindings::bindings::Gecko_GetExtraContentStyleDeclarations;
use gecko_bindings::bindings::Gecko_GetHTMLPresentationAttrDeclarationBlock;
-use gecko_bindings::bindings::Gecko_GetSMILOverrideDeclarationBlock;
use gecko_bindings::bindings::Gecko_GetStyleAttrDeclarationBlock;
use gecko_bindings::bindings::Gecko_GetUnvisitedLinkAttrDeclarationBlock;
use gecko_bindings::bindings::Gecko_GetVisitedLinkAttrDeclarationBlock;
use gecko_bindings::bindings::Gecko_IsSignificantChild;
use gecko_bindings::bindings::Gecko_MatchLang;
use gecko_bindings::bindings::Gecko_MatchStringArgPseudo;
use gecko_bindings::bindings::Gecko_UnsetDirtyStyleAttr;
use gecko_bindings::bindings::Gecko_UpdateAnimations;
@@ -1060,24 +1059,35 @@ impl<'le> TElement for GeckoElement<'le>
if !self.may_have_style_attribute() {
return;
}
unsafe { Gecko_UnsetDirtyStyleAttr(self.0) };
}
fn get_smil_override(&self) -> Option<ArcBorrow<Locked<PropertyDeclarationBlock>>> {
- let declarations = unsafe { Gecko_GetSMILOverrideDeclarationBlock(self.0) };
- let declarations: Option<&RawOffsetArc<Locked<PropertyDeclarationBlock>>> =
- declarations.and_then(|s| s.as_arc_opt());
- declarations.map(|s| s.borrow_arc())
+ unsafe {
+ let declaration: &structs::DeclarationBlock =
+ self.get_extended_slots()?.mSMILOverrideStyleDeclaration.mRawPtr.as_ref()?;
+
+ assert_eq!(declaration.mType, structs::StyleBackendType_Servo);
+ let declaration: &structs::ServoDeclarationBlock =
+ mem::transmute(declaration);
+
+ let raw: &structs::RawServoDeclarationBlock = declaration.mRaw.mRawPtr.as_ref()?;
+ Some(Locked::<PropertyDeclarationBlock>::as_arc(
+ &*(&raw as *const &structs::RawServoDeclarationBlock)
+ ).borrow_arc())
+ }
}
- fn get_animation_rule_by_cascade(&self, cascade_level: ServoCascadeLevel)
- -> Option<Arc<Locked<PropertyDeclarationBlock>>> {
+ fn get_animation_rule_by_cascade(
+ &self,
+ cascade_level: ServoCascadeLevel,
+ ) -> Option<Arc<Locked<PropertyDeclarationBlock>>> {
match cascade_level {
ServoCascadeLevel::Animations => self.get_animation_rule(),
ServoCascadeLevel::Transitions => self.get_transition_rule(),
_ => panic!("Unsupported cascade level for getting the animation rule")
}
}
fn get_animation_rule(