From 8e6ce5fae721e5a4caf38b0b72e1c4a0324ae55e Mon Sep 17 00:00:00 2001 From: Gaming4JC Date: Sun, 5 Jan 2020 18:15:57 -0500 Subject: Bug 1121994 - Implement adopted callback for custom elements. Tag UXP Issue #1344 --- dom/base/CustomElementRegistry.cpp | 35 +++++++++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 6 deletions(-) (limited to 'dom/base/CustomElementRegistry.cpp') diff --git a/dom/base/CustomElementRegistry.cpp b/dom/base/CustomElementRegistry.cpp index 069611f65..bad100cf5 100644 --- a/dom/base/CustomElementRegistry.cpp +++ b/dom/base/CustomElementRegistry.cpp @@ -47,7 +47,7 @@ CustomElementCallback::Call() ni->LocalName(), ni->NamespaceID(), extType.IsEmpty() ? nullptr : &extType); nsContentUtils::EnqueueLifecycleCallback( - nsIDocument::eConnected, mThisObject, nullptr, definition); + nsIDocument::eConnected, mThisObject, nullptr, nullptr, definition); } static_cast(mCallback.get())->Call(mThisObject, rv); @@ -60,6 +60,10 @@ CustomElementCallback::Call() case nsIDocument::eDisconnected: static_cast(mCallback.get())->Call(mThisObject, rv); break; + case nsIDocument::eAdopted: + static_cast(mCallback.get())->Call(mThisObject, + mAdoptedCallbackArgs.mOldDocument, mAdoptedCallbackArgs.mNewDocument, rv); + break; case nsIDocument::eAttributeChanged: static_cast(mCallback.get())->Call(mThisObject, mArgs.name, mArgs.oldValue, mArgs.newValue, mArgs.namespaceURI, rv); @@ -332,7 +336,9 @@ CustomElementRegistry::SetupCustomElement(Element* aElement, /* static */ UniquePtr CustomElementRegistry::CreateCustomElementCallback( nsIDocument::ElementCallbackType aType, Element* aCustomElement, - LifecycleCallbackArgs* aArgs, CustomElementDefinition* aDefinition) + LifecycleCallbackArgs* aArgs, + LifecycleAdoptedCallbackArgs* aAdoptedCallbackArgs, + CustomElementDefinition* aDefinition) { MOZ_ASSERT(aDefinition, "CustomElementDefinition should not be null"); @@ -360,6 +366,12 @@ CustomElementRegistry::CreateCustomElementCallback( } break; + case nsIDocument::eAdopted: + if (aDefinition->mCallbacks->mAdoptedCallback.WasPassed()) { + func = aDefinition->mCallbacks->mAdoptedCallback.Value(); + } + break; + case nsIDocument::eAttributeChanged: if (aDefinition->mCallbacks->mAttributeChangedCallback.WasPassed()) { func = aDefinition->mCallbacks->mAttributeChangedCallback.Value(); @@ -388,6 +400,9 @@ CustomElementRegistry::CreateCustomElementCallback( callback->SetArgs(*aArgs); } + if (aAdoptedCallbackArgs) { + callback->SetAdoptedCallbackArgs(*aAdoptedCallbackArgs); + } return Move(callback); } @@ -395,6 +410,7 @@ CustomElementRegistry::CreateCustomElementCallback( CustomElementRegistry::EnqueueLifecycleCallback(nsIDocument::ElementCallbackType aType, Element* aCustomElement, LifecycleCallbackArgs* aArgs, + LifecycleAdoptedCallbackArgs* aAdoptedCallbackArgs, CustomElementDefinition* aDefinition) { CustomElementDefinition* definition = aDefinition; @@ -407,7 +423,8 @@ CustomElementRegistry::EnqueueLifecycleCallback(nsIDocument::ElementCallbackType } auto callback = - CreateCustomElementCallback(aType, aCustomElement, aArgs, definition); + CreateCustomElementCallback(aType, aCustomElement, aArgs, + aAdoptedCallbackArgs, definition); if (!callback) { return; } @@ -926,7 +943,7 @@ CustomElementRegistry::Upgrade(Element* aElement, }; nsContentUtils::EnqueueLifecycleCallback(nsIDocument::eAttributeChanged, aElement, - &args, aDefinition); + &args, nullptr, aDefinition); } } } @@ -934,7 +951,7 @@ CustomElementRegistry::Upgrade(Element* aElement, // Step 4. if (aElement->IsInComposedDoc()) { nsContentUtils::EnqueueLifecycleCallback(nsIDocument::eConnected, aElement, - nullptr, aDefinition); + nullptr, nullptr, aDefinition); } // Step 5. @@ -958,7 +975,8 @@ CustomElementRegistry::Upgrade(Element* aElement, // This is for old spec. nsContentUtils::EnqueueLifecycleCallback(nsIDocument::eCreated, - aElement, nullptr, aDefinition); + aElement, nullptr, + nullptr, aDefinition); } //----------------------------------------------------- @@ -1141,6 +1159,11 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(CustomElementDefinition) cb.NoteXPCOMChild(callbacks->mDisconnectedCallback.Value()); } + if (callbacks->mAdoptedCallback.WasPassed()) { + NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(cb, "mCallbacks->mAdoptedCallback"); + cb.NoteXPCOMChild(callbacks->mAdoptedCallback.Value()); + } + NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(cb, "mConstructor"); cb.NoteXPCOMChild(tmp->mConstructor); NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END -- cgit v1.2.3