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 |
deleted file mode 100644 |
index 6ecc7a8ea89b49ab40328c7981fe22f933eed729..0000000000000000000000000000000000000000 |
--- a/third_party/WebKit/Source/core/dom/custom/CustomElementsRegistry.cpp |
+++ /dev/null |
@@ -1,295 +0,0 @@ |
-// Copyright 2016 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "core/dom/custom/CustomElementsRegistry.h" |
- |
-#include "bindings/core/v8/ExceptionState.h" |
-#include "bindings/core/v8/ScriptCustomElementDefinitionBuilder.h" |
-#include "bindings/core/v8/ScriptPromise.h" |
-#include "bindings/core/v8/ScriptPromiseResolver.h" |
-#include "core/dom/Document.h" |
-#include "core/dom/Element.h" |
-#include "core/dom/ElementRegistrationOptions.h" |
-#include "core/dom/ExceptionCode.h" |
-#include "core/dom/custom/CEReactionsScope.h" |
-#include "core/dom/custom/CustomElement.h" |
-#include "core/dom/custom/CustomElementDefinition.h" |
-#include "core/dom/custom/CustomElementDefinitionBuilder.h" |
-#include "core/dom/custom/CustomElementDescriptor.h" |
-#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 { |
- |
-// Returns true if |name| is invalid. |
-static bool throwIfInvalidName( |
- const AtomicString& name, |
- ExceptionState& exceptionState) |
-{ |
- if (CustomElement::isValidName(name)) |
- return false; |
- exceptionState.throwDOMException( |
- SyntaxError, |
- "\"" + name + "\" is not a valid custom element name"); |
- return true; |
-} |
- |
- |
-class CustomElementsRegistry::NameIsBeingDefined final { |
- STACK_ALLOCATED(); |
- DISALLOW_IMPLICIT_CONSTRUCTORS(NameIsBeingDefined); |
-public: |
- NameIsBeingDefined( |
- CustomElementsRegistry* registry, |
- const AtomicString& name) |
- : m_registry(registry) |
- , m_name(name) |
- { |
- DCHECK(!m_registry->m_namesBeingDefined.contains(name)); |
- m_registry->m_namesBeingDefined.add(name); |
- } |
- |
- ~NameIsBeingDefined() |
- { |
- m_registry->m_namesBeingDefined.remove(m_name); |
- } |
- |
-private: |
- Member<CustomElementsRegistry> m_registry; |
- const AtomicString& m_name; |
-}; |
- |
-CustomElementsRegistry* CustomElementsRegistry::create( |
- const LocalDOMWindow* owner) |
-{ |
- CustomElementsRegistry* registry = new CustomElementsRegistry(owner); |
- Document* document = owner->document(); |
- if (V0CustomElementRegistrationContext* v0 = |
- document ? document->registrationContext() : nullptr) |
- registry->entangle(v0); |
- return registry; |
-} |
- |
-CustomElementsRegistry::CustomElementsRegistry(const LocalDOMWindow* owner) |
- : m_owner(owner) |
- , m_v0 (new V0RegistrySet()) |
- , m_upgradeCandidates(new UpgradeCandidateMap()) |
-{ |
-} |
- |
-DEFINE_TRACE(CustomElementsRegistry) |
-{ |
- visitor->trace(m_definitions); |
- visitor->trace(m_owner); |
- visitor->trace(m_v0); |
- visitor->trace(m_upgradeCandidates); |
- visitor->trace(m_whenDefinedPromiseMap); |
-} |
- |
-void CustomElementsRegistry::define( |
- ScriptState* scriptState, |
- const AtomicString& name, |
- const ScriptValue& constructor, |
- const ElementRegistrationOptions& options, |
- ExceptionState& exceptionState) |
-{ |
- ScriptCustomElementDefinitionBuilder builder( |
- scriptState, |
- this, |
- constructor, |
- exceptionState); |
- define(name, builder, options, exceptionState); |
-} |
- |
-// http://w3c.github.io/webcomponents/spec/custom/#dfn-element-definition |
-void CustomElementsRegistry::define( |
- const AtomicString& name, |
- CustomElementDefinitionBuilder& builder, |
- const ElementRegistrationOptions& options, |
- ExceptionState& exceptionState) |
-{ |
- if (!builder.checkConstructorIntrinsics()) |
- return; |
- |
- if (throwIfInvalidName(name, exceptionState)) |
- return; |
- |
- if (m_namesBeingDefined.contains(name)) { |
- exceptionState.throwDOMException( |
- NotSupportedError, |
- "this name is already being defined in this registry"); |
- return; |
- } |
- NameIsBeingDefined defining(this, name); |
- |
- if (nameIsDefined(name) || v0NameIsDefined(name)) { |
- exceptionState.throwDOMException( |
- NotSupportedError, |
- "this name has already been used with this registry"); |
- return; |
- } |
- |
- if (!builder.checkConstructorNotRegistered()) |
- return; |
- |
- // TODO(dominicc): Implement steps: |
- // 5: localName |
- // 6-7: extends processing |
- |
- // 8-9: observed attributes caching is done below, together with callbacks. |
- // TODO(kojii): https://github.com/whatwg/html/issues/1373 for the ordering. |
- // When it's resolved, revisit if this code needs changes. |
- |
- // TODO(dominicc): Add a test where the prototype getter destroys |
- // the context. |
- |
- if (!builder.checkPrototype()) |
- return; |
- |
- // 8-9: observed attributes caching |
- // 12-13: connected callback |
- // 14-15: disconnected callback |
- // 16-17: attribute changed callback |
- |
- if (!builder.rememberOriginalProperties()) |
- return; |
- |
- // TODO(dominicc): Add a test where retrieving the prototype |
- // recursively calls define with the same name. |
- |
- CustomElementDescriptor descriptor(name, name); |
- CustomElementDefinition* definition = builder.build(descriptor); |
- CHECK(!exceptionState.hadException()); |
- CHECK(definition->descriptor() == descriptor); |
- DefinitionMap::AddResult result = |
- m_definitions.add(descriptor.name(), definition); |
- CHECK(result.isNewEntry); |
- |
- HeapVector<Member<Element>> candidates; |
- collectCandidates(descriptor, &candidates); |
- for (Element* candidate : candidates) |
- definition->enqueueUpgradeReaction(candidate); |
- |
- // 19: when-defined promise processing |
- const auto& entry = m_whenDefinedPromiseMap.find(name); |
- if (entry == m_whenDefinedPromiseMap.end()) |
- return; |
- entry->value->resolve(); |
- m_whenDefinedPromiseMap.remove(entry); |
-} |
- |
-// https://html.spec.whatwg.org/multipage/scripting.html#dom-customelementsregistry-get |
-ScriptValue CustomElementsRegistry::get(const AtomicString& name) |
-{ |
- CustomElementDefinition* definition = definitionForName(name); |
- if (!definition) { |
- // Binding layer converts |ScriptValue()| to script specific value, |
- // e.g. |undefined| for v8. |
- return ScriptValue(); |
- } |
- 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); |
-} |
- |
-void CustomElementsRegistry::entangle(V0CustomElementRegistrationContext* v0) |
-{ |
- m_v0->add(v0); |
- v0->setV1(this); |
-} |
- |
-bool CustomElementsRegistry::v0NameIsDefined(const AtomicString& name) |
-{ |
- for (const auto& v0 : *m_v0) { |
- if (v0->nameIsDefined(name)) |
- return true; |
- } |
- return false; |
-} |
- |
-CustomElementDefinition* CustomElementsRegistry::definitionForName( |
- const AtomicString& name) const |
-{ |
- return m_definitions.get(name); |
-} |
- |
-void CustomElementsRegistry::addCandidate(Element* candidate) |
-{ |
- const AtomicString& name = candidate->localName(); |
- if (nameIsDefined(name) || v0NameIsDefined(name)) |
- return; |
- UpgradeCandidateMap::iterator it = m_upgradeCandidates->find(name); |
- UpgradeCandidateSet* set; |
- if (it != m_upgradeCandidates->end()) { |
- set = it->value; |
- } else { |
- set = m_upgradeCandidates->add(name, new UpgradeCandidateSet()) |
- .storedValue |
- ->value; |
- } |
- set->add(candidate); |
-} |
- |
-// https://html.spec.whatwg.org/multipage/scripting.html#dom-customelementsregistry-whendefined |
-ScriptPromise CustomElementsRegistry::whenDefined( |
- ScriptState* scriptState, |
- const AtomicString& name, |
- ExceptionState& exceptionState) |
-{ |
- if (throwIfInvalidName(name, exceptionState)) |
- return ScriptPromise(); |
- CustomElementDefinition* definition = definitionForName(name); |
- if (definition) |
- return ScriptPromise::castUndefined(scriptState); |
- ScriptPromiseResolver* resolver = m_whenDefinedPromiseMap.get(name); |
- if (resolver) |
- return resolver->promise(); |
- ScriptPromiseResolver* newResolver = |
- ScriptPromiseResolver::create(scriptState); |
- m_whenDefinedPromiseMap.add(name, newResolver); |
- return newResolver->promise(); |
-} |
- |
-void CustomElementsRegistry::collectCandidates( |
- const CustomElementDescriptor& desc, |
- HeapVector<Member<Element>>* elements) |
-{ |
- UpgradeCandidateMap::iterator it = m_upgradeCandidates->find(desc.name()); |
- if (it == m_upgradeCandidates->end()) |
- return; |
- CustomElementUpgradeSorter sorter; |
- for (Element* element : *it.get()->value) { |
- if (!element || !desc.matches(*element)) |
- continue; |
- sorter.add(element); |
- } |
- |
- m_upgradeCandidates->remove(it); |
- |
- Document* document = m_owner->document(); |
- if (!document) |
- return; |
- |
- sorter.sorted(elements, document); |
-} |
- |
-} // namespace blink |