diff options
author | Gaming4JC <g4jc@hyperbola.info> | 2020-01-03 22:18:55 -0500 |
---|---|---|
committer | Gaming4JC <g4jc@hyperbola.info> | 2020-01-26 15:50:12 -0500 |
commit | 25a33c7123d457a59ecb4b15a2466cfc8507406b (patch) | |
tree | 63a7ed7795fd48dfbe59cdc23738846646e7ce93 /dom | |
parent | 5cf46e2f87f4f6294d02d96c7905b069c9975eee (diff) | |
download | UXP-25a33c7123d457a59ecb4b15a2466cfc8507406b.tar UXP-25a33c7123d457a59ecb4b15a2466cfc8507406b.tar.gz UXP-25a33c7123d457a59ecb4b15a2466cfc8507406b.tar.lz UXP-25a33c7123d457a59ecb4b15a2466cfc8507406b.tar.xz UXP-25a33c7123d457a59ecb4b15a2466cfc8507406b.zip |
Bug 1347446 - Move custom element reactions stack to DocGroup.
Tag UXP Issue #1344
Diffstat (limited to 'dom')
-rw-r--r-- | dom/base/CustomElementRegistry.cpp | 58 | ||||
-rw-r--r-- | dom/base/CustomElementRegistry.h | 157 | ||||
-rw-r--r-- | dom/base/DocGroup.h | 10 | ||||
-rw-r--r-- | dom/flyweb/FlyWebDiscoveryManager.cpp | 1 |
4 files changed, 136 insertions, 90 deletions
diff --git a/dom/base/CustomElementRegistry.cpp b/dom/base/CustomElementRegistry.cpp index 25267f5d3..1ab566e1d 100644 --- a/dom/base/CustomElementRegistry.cpp +++ b/dom/base/CustomElementRegistry.cpp @@ -9,6 +9,7 @@ #include "mozilla/dom/CustomElementRegistryBinding.h" #include "mozilla/dom/HTMLElementBinding.h" #include "mozilla/dom/WebComponentsBinding.h" +#include "mozilla/dom/DocGroup.h" #include "nsIParserService.h" #include "jsapi.h" @@ -214,7 +215,6 @@ CustomElementRegistry::sProcessingStack; CustomElementRegistry::CustomElementRegistry(nsPIDOMWindowInner* aWindow) : mWindow(aWindow) , mIsCustomDefinitionRunning(false) - , mIsBackupQueueProcessing(false) { MOZ_ASSERT(aWindow); MOZ_ASSERT(aWindow->IsInnerWindow()); @@ -467,18 +467,27 @@ CustomElementRegistry::GetCustomPrototype(nsIAtom* aAtom, void CustomElementRegistry::UpgradeCandidates(JSContext* aCx, nsIAtom* aKey, - CustomElementDefinition* aDefinition) + CustomElementDefinition* aDefinition, + ErrorResult& aRv) { + DocGroup* docGroup = mWindow->GetDocGroup(); + if (!docGroup) { + aRv.Throw(NS_ERROR_UNEXPECTED); + return; + } + nsAutoPtr<nsTArray<nsWeakPtr>> candidates; mCandidatesMap.RemoveAndForget(aKey, candidates); if (candidates) { + CustomElementReactionsStack* reactionsStack = + docGroup->CustomElementReactionsStack(); for (size_t i = 0; i < candidates->Length(); ++i) { nsCOMPtr<Element> elem = do_QueryReferent(candidates->ElementAt(i)); if (!elem) { continue; } - EnqueueUpgradeReaction(elem, aDefinition); + reactionsStack->EnqueueUpgradeReaction(this, elem, aDefinition); } } } @@ -540,7 +549,13 @@ CustomElementRegistry::Define(const nsAString& aName, { // We do this for [CEReaction] temporarily and it will be removed // after webidl supports [CEReaction] annotation in bug 1309147. - AutoCEReaction ceReaction(this); + DocGroup* docGroup = mWindow->GetDocGroup(); + if (!docGroup) { + aRv.Throw(NS_ERROR_UNEXPECTED); + return; + } + + AutoCEReaction ceReaction(docGroup->CustomElementReactionsStack()); aRv.MightThrowJSException(); AutoJSAPI jsapi; @@ -770,7 +785,7 @@ CustomElementRegistry::Define(const nsAString& aName, * 13. 14. 15. Upgrade candidates */ // TODO: Bug 1299363 - Implement custom element v1 upgrade algorithm - UpgradeCandidates(cx, nameAtom, definition); + UpgradeCandidates(cx, nameAtom, definition, aRv); /** * 16. If this CustomElementRegistry's when-defined promise map contains an @@ -835,13 +850,6 @@ CustomElementRegistry::WhenDefined(const nsAString& aName, ErrorResult& aRv) } void -CustomElementRegistry::EnqueueUpgradeReaction(Element* aElement, - CustomElementDefinition* aDefinition) -{ - Enqueue(aElement, new CustomElementUpgradeReaction(this, aDefinition)); -} - -void CustomElementRegistry::Upgrade(Element* aElement, CustomElementDefinition* aDefinition) { @@ -887,16 +895,18 @@ CustomElementRegistry::Upgrade(Element* aElement, EnqueueLifecycleCallback(nsIDocument::eCreated, aElement, nullptr, aDefinition); } +//----------------------------------------------------- +// CustomElementReactionsStack void -CustomElementRegistry::CreateAndPushElementQueue() +CustomElementReactionsStack::CreateAndPushElementQueue() { // Push a new element queue onto the custom element reactions stack. mReactionsStack.AppendElement(); } void -CustomElementRegistry::PopAndInvokeElementQueue() +CustomElementReactionsStack::PopAndInvokeElementQueue() { // Pop the element queue from the custom element reactions stack, // and invoke custom element reactions in that queue. @@ -904,15 +914,23 @@ CustomElementRegistry::PopAndInvokeElementQueue() "Reaction stack shouldn't be empty"); ElementQueue& elementQueue = mReactionsStack.LastElement(); - CustomElementRegistry::InvokeReactions(elementQueue); + InvokeReactions(elementQueue); DebugOnly<bool> isRemovedElement = mReactionsStack.RemoveElement(elementQueue); MOZ_ASSERT(isRemovedElement, "Reaction stack should have an element queue to remove"); } void -CustomElementRegistry::Enqueue(Element* aElement, - CustomElementReaction* aReaction) +CustomElementReactionsStack::EnqueueUpgradeReaction(CustomElementRegistry* aRegistry, + Element* aElement, + CustomElementDefinition* aDefinition) +{ + Enqueue(aElement, new CustomElementUpgradeReaction(aRegistry, aDefinition)); +} + +void +CustomElementReactionsStack::Enqueue(Element* aElement, + CustomElementReaction* aReaction) { // Add element to the current element queue. if (!mReactionsStack.IsEmpty()) { @@ -943,13 +961,13 @@ CustomElementRegistry::Enqueue(Element* aElement, } void -CustomElementRegistry::InvokeBackupQueue() +CustomElementReactionsStack::InvokeBackupQueue() { - CustomElementRegistry::InvokeReactions(mBackupQueue); + InvokeReactions(mBackupQueue); } void -CustomElementRegistry::InvokeReactions(ElementQueue& aElementQueue) +CustomElementReactionsStack::InvokeReactions(ElementQueue& aElementQueue) { for (uint32_t i = 0; i < aElementQueue.Length(); ++i) { nsCOMPtr<Element> element = do_QueryReferent(aElementQueue[i]); diff --git a/dom/base/CustomElementRegistry.h b/dom/base/CustomElementRegistry.h index 8fdf28289..5fc2eb2fd 100644 --- a/dom/base/CustomElementRegistry.h +++ b/dom/base/CustomElementRegistry.h @@ -165,6 +165,86 @@ private: virtual void Invoke(Element* aElement) override; }; +// https://html.spec.whatwg.org/multipage/scripting.html#custom-element-reactions-stack +class CustomElementReactionsStack +{ +public: + NS_INLINE_DECL_REFCOUNTING(CustomElementReactionsStack) + + CustomElementReactionsStack() + : mIsBackupQueueProcessing(false) + { + } + + // nsWeakPtr is a weak pointer of Element + // The element reaction queues are stored in ElementReactionQueueMap. + // We need to lookup ElementReactionQueueMap again to get relevant reaction queue. + typedef nsTArray<nsWeakPtr> ElementQueue; + + /** + * Enqueue a custom element upgrade reaction + * https://html.spec.whatwg.org/multipage/scripting.html#enqueue-a-custom-element-upgrade-reaction + */ + void EnqueueUpgradeReaction(CustomElementRegistry* aRegistry, + Element* aElement, + CustomElementDefinition* aDefinition); + + // [CEReactions] Before executing the algorithm's steps + // Push a new element queue onto the custom element reactions stack. + void CreateAndPushElementQueue(); + + // [CEReactions] After executing the algorithm's steps + // Pop the element queue from the custom element reactions stack, + // and invoke custom element reactions in that queue. + void PopAndInvokeElementQueue(); + +private: + ~CustomElementReactionsStack() {}; + + typedef nsTArray<nsAutoPtr<CustomElementReaction>> ReactionQueue; + typedef nsClassHashtable<nsISupportsHashKey, ReactionQueue> + ElementReactionQueueMap; + + ElementReactionQueueMap mElementReactionQueueMap; + + nsTArray<ElementQueue> mReactionsStack; + ElementQueue mBackupQueue; + // https://html.spec.whatwg.org/#enqueue-an-element-on-the-appropriate-element-queue + bool mIsBackupQueueProcessing; + + void InvokeBackupQueue(); + + /** + * Invoke custom element reactions + * https://html.spec.whatwg.org/multipage/scripting.html#invoke-custom-element-reactions + */ + void InvokeReactions(ElementQueue& aElementQueue); + + void Enqueue(Element* aElement, CustomElementReaction* aReaction); + +private: + class ProcessBackupQueueRunnable : public mozilla::Runnable { + public: + explicit ProcessBackupQueueRunnable(CustomElementReactionsStack* aReactionStack) + : mReactionStack(aReactionStack) + { + MOZ_ASSERT(!mReactionStack->mIsBackupQueueProcessing, + "mIsBackupQueueProcessing should be initially false"); + mReactionStack->mIsBackupQueueProcessing = true; + } + + NS_IMETHOD Run() override + { + mReactionStack->InvokeBackupQueue(); + mReactionStack->mIsBackupQueueProcessing = false; + return NS_OK; + } + + private: + RefPtr<CustomElementReactionsStack> mReactionStack; + }; +}; + class CustomElementRegistry final : public nsISupports, public nsWrapperCache { @@ -210,24 +290,8 @@ public: void GetCustomPrototype(nsIAtom* aAtom, JS::MutableHandle<JSObject*> aPrototype); - /** - * Enqueue a custom element upgrade reaction - * https://html.spec.whatwg.org/multipage/scripting.html#enqueue-a-custom-element-upgrade-reaction - */ - void EnqueueUpgradeReaction(Element* aElement, - CustomElementDefinition* aDefinition); - void Upgrade(Element* aElement, CustomElementDefinition* aDefinition); - // [CEReactions] Before executing the algorithm's steps - // Push a new element queue onto the custom element reactions stack. - void CreateAndPushElementQueue(); - - // [CEReactions] After executing the algorithm's steps - // Pop the element queue from the custom element reactions stack, - // and invoke custom element reactions in that queue. - void PopAndInvokeElementQueue(); - private: ~CustomElementRegistry(); @@ -244,22 +308,8 @@ private: void UpgradeCandidates(JSContext* aCx, nsIAtom* aKey, - CustomElementDefinition* aDefinition); - - void InvokeBackupQueue(); - - void Enqueue(Element* aElement, CustomElementReaction* aReaction); - - // nsWeakPtr is a weak pointer of Element - // The element reaction queues are stored in ElementReactionQueueMap. - // We need to lookup ElementReactionQueueMap again to get relevant reaction queue. - typedef nsTArray<nsWeakPtr> ElementQueue; - - /** - * Invoke custom element reactions - * https://html.spec.whatwg.org/multipage/scripting.html#invoke-custom-element-reactions - */ - void InvokeReactions(ElementQueue& aElementQueue); + CustomElementDefinition* aDefinition, + ErrorResult& aRv); typedef nsClassHashtable<nsISupportsHashKey, CustomElementDefinition> DefinitionMap; @@ -301,17 +351,6 @@ private: // It is used to prevent reentrant invocations of element definition. bool mIsCustomDefinitionRunning; - // https://html.spec.whatwg.org/#enqueue-an-element-on-the-appropriate-element-queue - bool mIsBackupQueueProcessing; - - typedef nsTArray<nsAutoPtr<CustomElementReaction>> ReactionQueue; - typedef nsClassHashtable<nsISupportsHashKey, ReactionQueue> - ElementReactionQueueMap; - - ElementReactionQueueMap mElementReactionQueueMap; - - nsTArray<ElementQueue> mReactionsStack; - ElementQueue mBackupQueue; private: class MOZ_RAII AutoSetRunningFlag final { @@ -332,28 +371,6 @@ private: CustomElementRegistry* mRegistry; }; -private: - class ProcessBackupQueueRunnable : public mozilla::Runnable { - public: - explicit ProcessBackupQueueRunnable(CustomElementRegistry* aRegistry) - : mRegistry(aRegistry) - { - MOZ_ASSERT(!mRegistry->mIsBackupQueueProcessing, - "mIsBackupQueueProcessing should be initially false"); - mRegistry->mIsBackupQueueProcessing = true; - } - - NS_IMETHOD Run() override - { - mRegistry->InvokeBackupQueue(); - mRegistry->mIsBackupQueueProcessing = false; - return NS_OK; - } - - private: - RefPtr<CustomElementRegistry> mRegistry; - }; - public: nsISupports* GetParentObject() const; @@ -370,15 +387,15 @@ public: class MOZ_RAII AutoCEReaction final { public: - explicit AutoCEReaction(CustomElementRegistry* aRegistry) - : mRegistry(aRegistry) { - mRegistry->CreateAndPushElementQueue(); + explicit AutoCEReaction(CustomElementReactionsStack* aReactionsStack) + : mReactionsStack(aReactionsStack) { + mReactionsStack->CreateAndPushElementQueue(); } ~AutoCEReaction() { - mRegistry->PopAndInvokeElementQueue(); + mReactionsStack->PopAndInvokeElementQueue(); } private: - RefPtr<CustomElementRegistry> mRegistry; + RefPtr<CustomElementReactionsStack> mReactionsStack; }; } // namespace dom diff --git a/dom/base/DocGroup.h b/dom/base/DocGroup.h index f4f7ac8ad..5b8f627cc 100644 --- a/dom/base/DocGroup.h +++ b/dom/base/DocGroup.h @@ -14,6 +14,7 @@ #include "nsString.h" #include "mozilla/RefPtr.h" +#include "mozilla/dom/CustomElementRegistry.h" namespace mozilla { namespace dom { @@ -52,6 +53,14 @@ public: { return mTabGroup; } + mozilla::dom::CustomElementReactionsStack* CustomElementReactionsStack() + { + if (!mReactionsStack) { + mReactionsStack = new mozilla::dom::CustomElementReactionsStack(); + } + + return mReactionsStack; + } void RemoveDocument(nsIDocument* aWindow); // Iterators for iterating over every document within the DocGroup @@ -71,6 +80,7 @@ private: nsCString mKey; RefPtr<TabGroup> mTabGroup; nsTArray<nsIDocument*> mDocuments; + RefPtr<mozilla::dom::CustomElementReactionsStack> mReactionsStack; }; } // namespace dom diff --git a/dom/flyweb/FlyWebDiscoveryManager.cpp b/dom/flyweb/FlyWebDiscoveryManager.cpp index 5a97eb6d8..14ad5aa1f 100644 --- a/dom/flyweb/FlyWebDiscoveryManager.cpp +++ b/dom/flyweb/FlyWebDiscoveryManager.cpp @@ -16,6 +16,7 @@ #include "mozilla/dom/FlyWebDiscoveryManager.h" #include "mozilla/dom/FlyWebDiscoveryManagerBinding.h" +#include "mozilla/dom/Element.h" namespace mozilla { namespace dom { |