Bug 1419330: Make GetXBLBinding not an unconditional virtual call. r?smaug
MozReview-Commit-ID: IJB4OHsFM5v
--- a/dom/base/FragmentOrElement.cpp
+++ b/dom/base/FragmentOrElement.cpp
@@ -1209,25 +1209,22 @@ FragmentOrElement::GetBindingParent() co
if (slots) {
return slots->mBindingParent;
}
return nullptr;
}
nsXBLBinding*
-FragmentOrElement::GetXBLBinding() const
+FragmentOrElement::DoGetXBLBinding() const
{
- if (HasFlag(NODE_MAY_BE_IN_BINDING_MNGR)) {
- nsExtendedDOMSlots* slots = GetExistingExtendedDOMSlots();
- if (slots) {
- return slots->mXBLBinding;
- }
+ MOZ_ASSERT(HasFlag(NODE_MAY_BE_IN_BINDING_MNGR));
+ if (nsExtendedDOMSlots* slots = GetExistingExtendedDOMSlots()) {
+ return slots->mXBLBinding;
}
-
return nullptr;
}
void
FragmentOrElement::SetXBLBinding(nsXBLBinding* aBinding,
nsBindingManager* aOldBindingManager)
{
nsBindingManager* bindingManager;
--- a/dom/base/FragmentOrElement.h
+++ b/dom/base/FragmentOrElement.h
@@ -142,18 +142,18 @@ public:
virtual nsresult AppendText(const char16_t* aBuffer, uint32_t aLength,
bool aNotify) override;
virtual bool TextIsOnlyWhitespace() override;
virtual bool ThreadSafeTextIsOnlyWhitespace() const override;
virtual bool HasTextForTranslation() override;
virtual void AppendTextTo(nsAString& aResult) override;
MOZ_MUST_USE
virtual bool AppendTextTo(nsAString& aResult, const mozilla::fallible_t&) override;
- virtual nsIContent *GetBindingParent() const override;
- virtual nsXBLBinding *GetXBLBinding() const override;
+ virtual nsIContent* GetBindingParent() const override;
+ virtual nsXBLBinding* DoGetXBLBinding() const override;
virtual void SetXBLBinding(nsXBLBinding* aBinding,
nsBindingManager* aOldBindingManager = nullptr) override;
virtual ShadowRoot *GetContainingShadow() const override;
virtual nsTArray<nsIContent*> &DestInsertionPoints() override;
virtual nsTArray<nsIContent*> *GetExistingDestInsertionPoints() const override;
virtual void SetShadowRoot(ShadowRoot* aBinding) override;
virtual mozilla::dom::HTMLSlotElement* GetAssignedSlot() const override;
virtual void SetAssignedSlot(mozilla::dom::HTMLSlotElement* aSlot) override;
--- a/dom/base/nsGenericDOMDataNode.cpp
+++ b/dom/base/nsGenericDOMDataNode.cpp
@@ -750,17 +750,17 @@ nsGenericDOMDataNode::GetAssignedSlot()
void
nsGenericDOMDataNode::SetAssignedSlot(HTMLSlotElement* aSlot)
{
nsDataSlots *slots = DataSlots();
slots->mAssignedSlot = aSlot;
}
nsXBLBinding *
-nsGenericDOMDataNode::GetXBLBinding() const
+nsGenericDOMDataNode::DoGetXBLBinding() const
{
return nullptr;
}
void
nsGenericDOMDataNode::SetXBLBinding(nsXBLBinding* aBinding,
nsBindingManager* aOldBindingManager)
{
--- a/dom/base/nsGenericDOMDataNode.h
+++ b/dom/base/nsGenericDOMDataNode.h
@@ -163,18 +163,18 @@ public:
const mozilla::fallible_t&) override;
virtual void SaveSubtreeState() override;
#ifdef DEBUG
virtual void List(FILE* out, int32_t aIndent) const override;
virtual void DumpContent(FILE* out, int32_t aIndent, bool aDumpAll) const override;
#endif
- virtual nsIContent *GetBindingParent() const override;
- virtual nsXBLBinding *GetXBLBinding() const override;
+ virtual nsIContent* GetBindingParent() const override;
+ virtual nsXBLBinding* DoGetXBLBinding() const override;
virtual void SetXBLBinding(nsXBLBinding* aBinding,
nsBindingManager* aOldBindingManager = nullptr) override;
virtual mozilla::dom::ShadowRoot *GetContainingShadow() const override;
virtual nsTArray<nsIContent*> &DestInsertionPoints() override;
virtual nsTArray<nsIContent*> *GetExistingDestInsertionPoints() const override;
virtual void SetShadowRoot(mozilla::dom::ShadowRoot* aShadowRoot) override;
virtual mozilla::dom::HTMLSlotElement* GetAssignedSlot() const override;
virtual void SetAssignedSlot(mozilla::dom::HTMLSlotElement* aSlot) override;
--- a/dom/base/nsIContent.h
+++ b/dom/base/nsIContent.h
@@ -676,24 +676,33 @@ public:
* frame) responsible for our construction (and existence). Used by
* anonymous content (both XBL-generated and native-anonymous).
*
* null for all explicit content (i.e., content reachable from the top
* of its GetParent() chain via child lists).
*
* @return the binding parent
*/
- virtual nsIContent *GetBindingParent() const = 0;
+ virtual nsIContent* GetBindingParent() const = 0;
/**
* Gets the current XBL binding that is bound to this element.
*
* @return the current binding.
*/
- virtual nsXBLBinding *GetXBLBinding() const = 0;
+ nsXBLBinding* GetXBLBinding() const
+ {
+ if (!HasFlag(NODE_MAY_BE_IN_BINDING_MNGR)) {
+ return nullptr;
+ }
+
+ return DoGetXBLBinding();
+ }
+
+ virtual nsXBLBinding* DoGetXBLBinding() const = 0;
/**
* Sets or unsets an XBL binding for this element. Setting a
* binding on an element that already has a binding will remove the
* old binding.
*
* @param aBinding The binding to bind to this content. If nullptr is
* provided as the argument, then existing binding will be