| Index: third_party/WebKit/Source/core/dom/custom/CustomElementRegistry.cpp
|
| diff --git a/third_party/WebKit/Source/core/dom/custom/CustomElementRegistry.cpp b/third_party/WebKit/Source/core/dom/custom/CustomElementRegistry.cpp
|
| index 28a45e752735b2b9c175793219c9a9fdd2a05b1f..41610482c81044994d1a058f6949a9f5b23fbe48 100644
|
| --- a/third_party/WebKit/Source/core/dom/custom/CustomElementRegistry.cpp
|
| +++ b/third_party/WebKit/Source/core/dom/custom/CustomElementRegistry.cpp
|
| @@ -4,6 +4,7 @@
|
|
|
| #include "core/dom/custom/CustomElementRegistry.h"
|
|
|
| +#include <limits>
|
| #include "bindings/core/v8/ExceptionState.h"
|
| #include "bindings/core/v8/ScriptCustomElementDefinitionBuilder.h"
|
| #include "bindings/core/v8/ScriptPromise.h"
|
| @@ -93,6 +94,8 @@ DEFINE_TRACE(CustomElementRegistry) {
|
|
|
| DEFINE_TRACE_WRAPPERS(CustomElementRegistry) {
|
| visitor->TraceWrappers(&CustomElementReactionStack::Current());
|
| + for (auto definition : definitions_)
|
| + visitor->TraceWrappers(definition);
|
| }
|
|
|
| CustomElementDefinition* CustomElementRegistry::define(
|
| @@ -183,11 +186,15 @@ CustomElementDefinition* CustomElementRegistry::define(
|
| }
|
|
|
| CustomElementDescriptor descriptor(name, local_name);
|
| - CustomElementDefinition* definition = builder.Build(descriptor);
|
| + if (UNLIKELY(definitions_.size() >= std::numeric_limits<uint32_t>::max()))
|
| + return nullptr;
|
| + uint32_t id = definitions_.size() + 1;
|
| + CustomElementDefinition* definition = builder.Build(descriptor, id);
|
| CHECK(!exception_state.HadException());
|
| CHECK(definition->Descriptor() == descriptor);
|
| - DefinitionMap::AddResult result =
|
| - definitions_.insert(descriptor.GetName(), definition);
|
| + definitions_.emplace_back(
|
| + TraceWrapperMember<CustomElementDefinition>(this, definition));
|
| + DefinitionMap::AddResult result = nameIdMap_.insert(descriptor.GetName(), id);
|
| CHECK(result.is_new_entry);
|
|
|
| HeapVector<Member<Element>> candidates;
|
| @@ -234,7 +241,7 @@ CustomElementDefinition* CustomElementRegistry::DefinitionFor(
|
| }
|
|
|
| bool CustomElementRegistry::NameIsDefined(const AtomicString& name) const {
|
| - return definitions_.Contains(name);
|
| + return nameIdMap_.Contains(name);
|
| }
|
|
|
| void CustomElementRegistry::Entangle(V0CustomElementRegistrationContext* v0) {
|
| @@ -252,7 +259,12 @@ bool CustomElementRegistry::V0NameIsDefined(const AtomicString& name) {
|
|
|
| CustomElementDefinition* CustomElementRegistry::DefinitionForName(
|
| const AtomicString& name) const {
|
| - return definitions_.at(name);
|
| + return DefinitionForId(nameIdMap_.at(name));
|
| +}
|
| +
|
| +CustomElementDefinition* CustomElementRegistry::DefinitionForId(
|
| + CustomElementDefinition::Id id) const {
|
| + return id ? definitions_[id - 1].Get() : nullptr;
|
| }
|
|
|
| void CustomElementRegistry::AddCandidate(Element* candidate) {
|
|
|