From 186782301c03f4b27e4edae07b0280e92c4e01d1 Mon Sep 17 00:00:00 2001 From: Gaming4JC Date: Sun, 5 Jan 2020 15:46:37 -0500 Subject: Bug 1334043 - Part 1: Replace attached callback (v0) with connected callback (v1). Tag UXP Issue #1344 --- dom/base/CustomElementRegistry.cpp | 31 +++++++++++++++++-------------- dom/base/Element.cpp | 15 +++++++-------- dom/base/nsIDocument.h | 2 +- 3 files changed, 25 insertions(+), 23 deletions(-) (limited to 'dom/base') diff --git a/dom/base/CustomElementRegistry.cpp b/dom/base/CustomElementRegistry.cpp index 1a4b5d45a..efbad781f 100644 --- a/dom/base/CustomElementRegistry.cpp +++ b/dom/base/CustomElementRegistry.cpp @@ -28,14 +28,13 @@ CustomElementCallback::Call() mOwnerData->mElementIsBeingCreated = true; // The callback hasn't actually been invoked yet, but we need to flip - // this now in order to enqueue the attached callback. This is a spec + // this now in order to enqueue the connected callback. This is a spec // bug (w3c bug 27437). mOwnerData->mCreatedCallbackInvoked = true; - // If ELEMENT is in a document and this document has a browsing context, - // enqueue attached callback for ELEMENT. + // If ELEMENT is connected, enqueue connected callback for ELEMENT. nsIDocument* document = mThisObject->GetComposedDoc(); - if (document && document->GetDocShell()) { + if (document) { NodeInfo* ni = mThisObject->NodeInfo(); nsDependentAtomString extType(mOwnerData->mType); @@ -48,15 +47,15 @@ CustomElementCallback::Call() ni->LocalName(), ni->NamespaceID(), extType.IsEmpty() ? nullptr : &extType); nsContentUtils::EnqueueLifecycleCallback( - document, nsIDocument::eAttached, mThisObject, nullptr, definition); + document, nsIDocument::eConnected, mThisObject, nullptr, definition); } static_cast(mCallback.get())->Call(mThisObject, rv); mOwnerData->mElementIsBeingCreated = false; break; } - case nsIDocument::eAttached: - static_cast(mCallback.get())->Call(mThisObject, rv); + case nsIDocument::eConnected: + static_cast(mCallback.get())->Call(mThisObject, rv); break; case nsIDocument::eDetached: static_cast(mCallback.get())->Call(mThisObject, rv); @@ -349,9 +348,9 @@ CustomElementRegistry::CreateCustomElementCallback( } break; - case nsIDocument::eAttached: - if (aDefinition->mCallbacks->mAttachedCallback.WasPassed()) { - func = aDefinition->mCallbacks->mAttachedCallback.Value(); + case nsIDocument::eConnected: + if (aDefinition->mCallbacks->mConnectedCallback.WasPassed()) { + func = aDefinition->mCallbacks->mConnectedCallback.Value(); } break; @@ -934,7 +933,11 @@ CustomElementRegistry::Upgrade(Element* aElement, } // Step 4. - // TODO: Bug 1334043 - Implement connected lifecycle callbacks for custom elements + if (aElement->IsInComposedDoc()) { + nsContentUtils::EnqueueLifecycleCallback(aElement->OwnerDoc(), + nsIDocument::eConnected, aElement, + nullptr, aDefinition); + } // Step 5. AutoConstructionStackEntry acs(aDefinition->mConstructionStack, @@ -1129,9 +1132,9 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(CustomElementDefinition) cb.NoteXPCOMChild(callbacks->mCreatedCallback.Value()); } - if (callbacks->mAttachedCallback.WasPassed()) { - NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(cb, "mCallbacks->mAttachedCallback"); - cb.NoteXPCOMChild(callbacks->mAttachedCallback.Value()); + if (callbacks->mConnectedCallback.WasPassed()) { + NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(cb, "mCallbacks->mConnectedCallback"); + cb.NoteXPCOMChild(callbacks->mConnectedCallback.Value()); } if (callbacks->mDetachedCallback.WasPassed()) { diff --git a/dom/base/Element.cpp b/dom/base/Element.cpp index e90d44476..7ab0699ed 100644 --- a/dom/base/Element.cpp +++ b/dom/base/Element.cpp @@ -1685,13 +1685,12 @@ Element::BindToTree(nsIDocument* aDocument, nsIContent* aParent, } nsIDocument* composedDoc = GetComposedDoc(); - if (composedDoc) { - // Attached callback must be enqueued whenever custom element is inserted into a - // document and this document has a browsing context. - if (GetCustomElementData() && composedDoc->GetDocShell()) { - // Enqueue an attached callback for the custom element. + if (CustomElementRegistry::IsCustomElementEnabled() && composedDoc) { + // Connected callback must be enqueued whenever a custom element becomes + // connected. + if (GetCustomElementData()) { nsContentUtils::EnqueueLifecycleCallback( - composedDoc, nsIDocument::eAttached, this); + composedDoc, nsIDocument::eConnected, this); } } @@ -2586,7 +2585,7 @@ Element::SetAttrAndNotify(int32_t aNamespaceID, UpdateState(aNotify); - if (nsContentUtils::IsWebComponentsEnabled()) { + if (CustomElementRegistry::IsCustomElementEnabled()) { if (CustomElementData* data = GetCustomElementData()) { if (CustomElementDefinition* definition = nsContentUtils::GetElementDefinitionIfObservingAttr(this, @@ -2853,7 +2852,7 @@ Element::UnsetAttr(int32_t aNameSpaceID, nsIAtom* aName, UpdateState(aNotify); - if (nsContentUtils::IsWebComponentsEnabled()) { + if (CustomElementRegistry::IsCustomElementEnabled()) { if (CustomElementData* data = GetCustomElementData()) { if (CustomElementDefinition* definition = nsContentUtils::GetElementDefinitionIfObservingAttr(this, diff --git a/dom/base/nsIDocument.h b/dom/base/nsIDocument.h index e44ab047e..0f05bbfcb 100644 --- a/dom/base/nsIDocument.h +++ b/dom/base/nsIDocument.h @@ -2580,7 +2580,7 @@ public: enum ElementCallbackType { eCreated, - eAttached, + eConnected, eDetached, eAttributeChanged }; -- cgit v1.2.3