| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "core/dom/custom/CustomElementsRegistry.h" | 5 #include "core/dom/custom/CustomElementsRegistry.h" |
| 6 | 6 |
| 7 #include "bindings/core/v8/ExceptionState.h" | 7 #include "bindings/core/v8/ExceptionState.h" |
| 8 #include "bindings/core/v8/ScriptCustomElementDefinitionBuilder.h" | 8 #include "bindings/core/v8/ScriptCustomElementDefinitionBuilder.h" |
| 9 #include "core/dom/Document.h" | 9 #include "core/dom/Document.h" |
| 10 #include "core/dom/ElementRegistrationOptions.h" | 10 #include "core/dom/ElementRegistrationOptions.h" |
| 11 #include "core/dom/ExceptionCode.h" | 11 #include "core/dom/ExceptionCode.h" |
| 12 #include "core/dom/custom/CustomElement.h" | 12 #include "core/dom/custom/CustomElement.h" |
| 13 #include "core/dom/custom/CustomElementDefinition.h" | 13 #include "core/dom/custom/CustomElementDefinition.h" |
| 14 #include "core/dom/custom/CustomElementDefinitionBuilder.h" | 14 #include "core/dom/custom/CustomElementDefinitionBuilder.h" |
| 15 #include "core/dom/custom/V0CustomElementRegistrationContext.h" | 15 #include "core/dom/custom/V0CustomElementRegistrationContext.h" |
| 16 #include "wtf/Allocator.h" |
| 16 | 17 |
| 17 namespace blink { | 18 namespace blink { |
| 18 | 19 |
| 20 class CustomElementsRegistry::NameIsBeingDefined final { |
| 21 STACK_ALLOCATED(); |
| 22 DISALLOW_IMPLICIT_CONSTRUCTORS(NameIsBeingDefined); |
| 23 public: |
| 24 NameIsBeingDefined( |
| 25 CustomElementsRegistry* registry, |
| 26 const AtomicString& name) |
| 27 : m_registry(registry) |
| 28 , m_name(name) |
| 29 { |
| 30 DCHECK(!m_registry->m_namesBeingDefined.contains(name)); |
| 31 m_registry->m_namesBeingDefined.add(name); |
| 32 } |
| 33 |
| 34 ~NameIsBeingDefined() |
| 35 { |
| 36 m_registry->m_namesBeingDefined.remove(m_name); |
| 37 } |
| 38 |
| 39 private: |
| 40 Member<CustomElementsRegistry> m_registry; |
| 41 const AtomicString& m_name; |
| 42 }; |
| 43 |
| 19 CustomElementsRegistry* CustomElementsRegistry::create( | 44 CustomElementsRegistry* CustomElementsRegistry::create( |
| 20 V0CustomElementRegistrationContext* v0) | 45 V0CustomElementRegistrationContext* v0) |
| 21 { | 46 { |
| 22 // TODO(dominicc): The window could install a new document; add a signal | 47 // TODO(dominicc): The window could install a new document; add a signal |
| 23 // when a window installs a new document to notify that V0 context, too. | 48 // when a window installs a new document to notify that V0 context, too. |
| 24 CustomElementsRegistry* registry = new CustomElementsRegistry(v0); | 49 CustomElementsRegistry* registry = new CustomElementsRegistry(v0); |
| 25 if (v0) | 50 if (v0) |
| 26 v0->setV1(registry); | 51 v0->setV1(registry); |
| 27 return registry; | 52 return registry; |
| 28 } | 53 } |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 64 if (!builder.checkConstructorIntrinsics()) | 89 if (!builder.checkConstructorIntrinsics()) |
| 65 return; | 90 return; |
| 66 | 91 |
| 67 if (!CustomElement::isValidName(name)) { | 92 if (!CustomElement::isValidName(name)) { |
| 68 exceptionState.throwDOMException( | 93 exceptionState.throwDOMException( |
| 69 SyntaxError, | 94 SyntaxError, |
| 70 "\"" + name + "\" is not a valid custom element name"); | 95 "\"" + name + "\" is not a valid custom element name"); |
| 71 return; | 96 return; |
| 72 } | 97 } |
| 73 | 98 |
| 99 if (m_namesBeingDefined.contains(name)) { |
| 100 exceptionState.throwDOMException( |
| 101 NotSupportedError, |
| 102 "this name is already being defined in this registry"); |
| 103 return; |
| 104 } |
| 105 NameIsBeingDefined defining(this, name); |
| 106 |
| 74 if (nameIsDefined(name) || v0NameIsDefined(name)) { | 107 if (nameIsDefined(name) || v0NameIsDefined(name)) { |
| 75 exceptionState.throwDOMException( | 108 exceptionState.throwDOMException( |
| 76 NotSupportedError, | 109 NotSupportedError, |
| 77 "this name has already been used with this registry"); | 110 "this name has already been used with this registry"); |
| 78 return; | 111 return; |
| 79 } | 112 } |
| 80 | 113 |
| 81 if (!builder.checkConstructorNotRegistered()) | 114 if (!builder.checkConstructorNotRegistered()) |
| 82 return; | 115 return; |
| 83 | 116 |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 119 return m_v0->nameIsDefined(name); | 152 return m_v0->nameIsDefined(name); |
| 120 } | 153 } |
| 121 | 154 |
| 122 CustomElementDefinition* CustomElementsRegistry::definitionForName( | 155 CustomElementDefinition* CustomElementsRegistry::definitionForName( |
| 123 const AtomicString& name) const | 156 const AtomicString& name) const |
| 124 { | 157 { |
| 125 return m_definitions.get(name); | 158 return m_definitions.get(name); |
| 126 } | 159 } |
| 127 | 160 |
| 128 } // namespace blink | 161 } // namespace blink |
| OLD | NEW |