diff --git a/dom/base/CustomElementRegistry.cpp b/dom/base/CustomElementRegistry.cpp index 2bf969d382..a27218f02e 100644 --- a/dom/base/CustomElementRegistry.cpp +++ b/dom/base/CustomElementRegistry.cpp @@ -791,6 +791,45 @@ CustomElementRegistry::Define(const nsAString& aName, } +static void +TryUpgrade(nsINode& aNode) +{ + Element* element = aNode.IsElement() ? aNode.AsElement() : nullptr; + if (element) { + CustomElementData* ceData = element->GetCustomElementData(); + if (ceData) { + NodeInfo* nodeInfo = element->NodeInfo(); + nsAtom* typeAtom = ceData->GetCustomElementType(); + CustomElementDefinition* definition = + nsContentUtils::LookupCustomElementDefinition(nodeInfo->GetDocument(), + nodeInfo->NameAtom(), + nodeInfo->NamespaceID(), + typeAtom); + if (definition) { + nsContentUtils::EnqueueUpgradeReaction(element, definition); + } + } + + if (ShadowRoot* root = element->GetShadowRoot()) { + for (Element* child = root->GetFirstElementChild(); child; + child = child->GetNextElementSibling()) { + TryUpgrade(*child); + } + } + } + + for (Element* child = aNode.GetFirstElementChild(); child; + child = child->GetNextElementSibling()) { + TryUpgrade(*child); + } +} + +void +CustomElementRegistry::Upgrade(nsINode& aRoot) +{ + TryUpgrade(aRoot); +} + void CustomElementRegistry::Get(JSContext* aCx, const nsAString& aName, JS::MutableHandle aRetVal) diff --git a/dom/base/CustomElementRegistry.h b/dom/base/CustomElementRegistry.h index eacf568c9e..a20400bf92 100644 --- a/dom/base/CustomElementRegistry.h +++ b/dom/base/CustomElementRegistry.h @@ -525,6 +525,8 @@ public: JS::MutableHandle aRetVal); already_AddRefed WhenDefined(const nsAString& aName, ErrorResult& aRv); + + void Upgrade(nsINode& aRoot); }; class MOZ_RAII AutoCEReaction final { diff --git a/dom/webidl/CustomElementRegistry.webidl b/dom/webidl/CustomElementRegistry.webidl index 788b6a4ed0..15933ee1d6 100644 --- a/dom/webidl/CustomElementRegistry.webidl +++ b/dom/webidl/CustomElementRegistry.webidl @@ -11,6 +11,7 @@ interface CustomElementRegistry { any get(DOMString name); [Throws] Promise whenDefined(DOMString name); + [CEReactions] void upgrade(Node root); }; dictionary ElementDefinitionOptions {