Chromium Code Reviews| 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 c0dfb779f5b33c265733a982b97586a9c18ba8d5..88a27e00182868600089dbaf942591a69deb23c8 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 { |
|
kochi
2017/04/28 06:24:15
Add DCHECK(id <= difinitions_.size())?
|
| + return id ? definitions_[id - 1].Get() : nullptr; |
| } |
| void CustomElementRegistry::AddCandidate(Element* candidate) { |