Chromium Code Reviews| 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..e163c5a2f6e875f39d69212c54f197b2676dd1de 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,31 @@ 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; |
| + return definition->descriptor() == desc ? definition : nullptr; |
|
kouhei (in TOK)
2016/08/15 02:10:31
What are the cases where "definition->descriptor()
|
| +} |
| + |
| 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 +280,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 |