Index: third_party/WebKit/Source/core/dom/custom/CustomElementsRegistry.cpp |
diff --git a/third_party/WebKit/Source/core/dom/custom/CustomElementsRegistry.cpp b/third_party/WebKit/Source/core/dom/custom/CustomElementsRegistry.cpp |
index 1bd3aad2ffc571283db758477872f8e23179e72b..6ecc7a8ea89b49ab40328c7981fe22f933eed729 100644 |
--- a/third_party/WebKit/Source/core/dom/custom/CustomElementsRegistry.cpp |
+++ b/third_party/WebKit/Source/core/dom/custom/CustomElementsRegistry.cpp |
@@ -20,6 +20,7 @@ |
#include "core/dom/custom/CustomElementUpgradeReaction.h" |
#include "core/dom/custom/CustomElementUpgradeSorter.h" |
#include "core/dom/custom/V0CustomElementRegistrationContext.h" |
+#include "core/frame/LocalDOMWindow.h" |
#include "wtf/Allocator.h" |
namespace blink { |
@@ -63,16 +64,19 @@ private: |
}; |
CustomElementsRegistry* CustomElementsRegistry::create( |
- Document* document) |
+ const LocalDOMWindow* owner) |
{ |
- CustomElementsRegistry* registry = new CustomElementsRegistry(document); |
- if (V0CustomElementRegistrationContext* v0Context = registry->v0()) |
- v0Context->setV1(registry); |
+ CustomElementsRegistry* registry = new CustomElementsRegistry(owner); |
+ Document* document = owner->document(); |
+ if (V0CustomElementRegistrationContext* v0 = |
+ document ? document->registrationContext() : nullptr) |
+ registry->entangle(v0); |
return registry; |
} |
-CustomElementsRegistry::CustomElementsRegistry(Document* document) |
- : m_document(document) |
+CustomElementsRegistry::CustomElementsRegistry(const LocalDOMWindow* owner) |
+ : m_owner(owner) |
+ , m_v0 (new V0RegistrySet()) |
, m_upgradeCandidates(new UpgradeCandidateMap()) |
{ |
} |
@@ -80,7 +84,8 @@ CustomElementsRegistry::CustomElementsRegistry(Document* document) |
DEFINE_TRACE(CustomElementsRegistry) |
{ |
visitor->trace(m_definitions); |
- visitor->trace(m_document); |
+ visitor->trace(m_owner); |
+ visitor->trace(m_v0); |
visitor->trace(m_upgradeCandidates); |
visitor->trace(m_whenDefinedPromiseMap); |
} |
@@ -189,20 +194,35 @@ ScriptValue CustomElementsRegistry::get(const AtomicString& name) |
return definition->getConstructorForScript(); |
} |
+CustomElementDefinition* CustomElementsRegistry::definitionFor(const CustomElementDescriptor& desc) const |
+{ |
+ CustomElementDefinition* definition = definitionForName(desc.name()); |
+ if (!definition) |
+ return nullptr; |
+ // The definition for a customized built-in element, such as |
+ // <button is="my-button"> should not be provided for an |
+ // autonomous element, such as <my-button>, even though the |
+ // name "my-button" matches. |
+ return definition->descriptor() == desc ? definition : nullptr; |
+} |
+ |
bool CustomElementsRegistry::nameIsDefined(const AtomicString& name) const |
{ |
return m_definitions.contains(name); |
} |
-V0CustomElementRegistrationContext* CustomElementsRegistry::v0() |
+void CustomElementsRegistry::entangle(V0CustomElementRegistrationContext* v0) |
{ |
- return m_document->registrationContext(); |
+ m_v0->add(v0); |
+ v0->setV1(this); |
} |
bool CustomElementsRegistry::v0NameIsDefined(const AtomicString& name) |
{ |
- if (V0CustomElementRegistrationContext* v0Context = v0()) |
- return v0Context->nameIsDefined(name); |
+ for (const auto& v0 : *m_v0) { |
+ if (v0->nameIsDefined(name)) |
+ return true; |
+ } |
return false; |
} |
@@ -264,7 +284,12 @@ void CustomElementsRegistry::collectCandidates( |
} |
m_upgradeCandidates->remove(it); |
- sorter.sorted(elements, m_document.get()); |
+ |
+ Document* document = m_owner->document(); |
+ if (!document) |
+ return; |
+ |
+ sorter.sorted(elements, document); |
} |
} // namespace blink |