diff options
-rw-r--r-- | dom/base/CustomElementRegistry.cpp | 42 | ||||
-rw-r--r-- | dom/base/CustomElementRegistry.h | 23 | ||||
-rw-r--r-- | dom/base/FragmentOrElement.cpp | 18 |
3 files changed, 52 insertions, 31 deletions
diff --git a/dom/base/CustomElementRegistry.cpp b/dom/base/CustomElementRegistry.cpp index 200668f9e..0f03b16bd 100644 --- a/dom/base/CustomElementRegistry.cpp +++ b/dom/base/CustomElementRegistry.cpp @@ -138,6 +138,48 @@ CustomElementData::CustomElementData(nsIAtom* aType, State aState) { } +void +CustomElementData::SetCustomElementDefinition(CustomElementDefinition* aDefinition) +{ + MOZ_ASSERT(mState == State::eCustom); + MOZ_ASSERT(!mCustomElementDefinition); + MOZ_ASSERT(aDefinition->mType == mType); + + mCustomElementDefinition = aDefinition; +} + +CustomElementDefinition* +CustomElementData::GetCustomElementDefinition() +{ + MOZ_ASSERT(mCustomElementDefinition ? mState == State::eCustom + : mState != State::eCustom); + + return mCustomElementDefinition; +} + +void +CustomElementData::Traverse(nsCycleCollectionTraversalCallback& aCb) const +{ + for (uint32_t i = 0; i < mReactionQueue.Length(); i++) { + if (mReactionQueue[i]) { + mReactionQueue[i]->Traverse(aCb); + } + } + + if (mCustomElementDefinition) { + NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(aCb, "mCustomElementDefinition"); + aCb.NoteNativeChild(mCustomElementDefinition, + NS_CYCLE_COLLECTION_PARTICIPANT(CustomElementDefinition)); + } +} + +void +CustomElementData::Unlink() +{ + mReactionQueue.Clear(); + mCustomElementDefinition = nullptr; +} + //----------------------------------------------------- // CustomElementRegistry diff --git a/dom/base/CustomElementRegistry.h b/dom/base/CustomElementRegistry.h index 867c92647..d3dfef682 100644 --- a/dom/base/CustomElementRegistry.h +++ b/dom/base/CustomElementRegistry.h @@ -130,24 +130,16 @@ struct CustomElementData // e.g., create an element, insert a node. AutoTArray<UniquePtr<CustomElementReaction>, 3> mReactionQueue; - RefPtr<CustomElementDefinition> mCustomElementDefinition; - - void - SetCustomElementDefinition(CustomElementDefinition* aDefinition) - { - MOZ_ASSERT(!mCustomElementDefinition); - - mCustomElementDefinition = aDefinition; - } + void SetCustomElementDefinition(CustomElementDefinition* aDefinition); + CustomElementDefinition* GetCustomElementDefinition(); - CustomElementDefinition* - GetCustomElementDefinition() - { - return mCustomElementDefinition; - } + void Traverse(nsCycleCollectionTraversalCallback& aCb) const; + void Unlink(); private: virtual ~CustomElementData() {} + + RefPtr<CustomElementDefinition> mCustomElementDefinition; }; #define ALEADY_CONSTRUCTED_MARKER nullptr @@ -167,7 +159,8 @@ struct CustomElementDefinition mozilla::dom::LifecycleCallbacks* aCallbacks, uint32_t aDocOrder); - // The type (name) for this custom element. + // The type (name) for this custom element, for <button is="x-foo"> or <x-foo> + // this would be x-foo. nsCOMPtr<nsIAtom> mType; // The localname to (e.g. <button is=type> -- this would be button). diff --git a/dom/base/FragmentOrElement.cpp b/dom/base/FragmentOrElement.cpp index a851190ff..526c3c9d4 100644 --- a/dom/base/FragmentOrElement.cpp +++ b/dom/base/FragmentOrElement.cpp @@ -583,19 +583,7 @@ FragmentOrElement::nsDOMSlots::Traverse(nsCycleCollectionTraversalCallback &cb) cb.NoteXPCOMChild(mExtendedSlots->mXBLInsertionParent.get()); if (mExtendedSlots->mCustomElementData) { - for (uint32_t i = 0; - i < mExtendedSlots->mCustomElementData->mReactionQueue.Length(); i++) { - if (mExtendedSlots->mCustomElementData->mReactionQueue[i]) { - mExtendedSlots->mCustomElementData->mReactionQueue[i]->Traverse(cb); - } - } - - if (mExtendedSlots->mCustomElementData->mCustomElementDefinition) { - NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(cb, - "mExtendedSlots->mCustomElementData->mCustomElementDefinition"); - cb.NoteNativeChild(mExtendedSlots->mCustomElementData->mCustomElementDefinition, - NS_CYCLE_COLLECTION_PARTICIPANT(CustomElementDefinition)); - } + mExtendedSlots->mCustomElementData->Traverse(cb); } for (auto iter = mExtendedSlots->mRegisteredIntersectionObservers.Iter(); @@ -633,9 +621,7 @@ FragmentOrElement::nsDOMSlots::Unlink() MOZ_ASSERT(!(mExtendedSlots->mXBLBinding)); mExtendedSlots->mXBLInsertionParent = nullptr; if (mExtendedSlots->mCustomElementData) { - if (mExtendedSlots->mCustomElementData->mCustomElementDefinition) { - mExtendedSlots->mCustomElementData->mCustomElementDefinition = nullptr; - } + mExtendedSlots->mCustomElementData->Unlink(); mExtendedSlots->mCustomElementData = nullptr; } mExtendedSlots->mRegisteredIntersectionObservers.Clear(); |