Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(248)

Side by Side Diff: third_party/WebKit/Source/core/dom/custom/CustomElementsRegistry.cpp

Issue 2029923003: Recursively defining custom elements should not lead to redefinition (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase. Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « third_party/WebKit/Source/core/dom/custom/CustomElementsRegistry.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/Element.h" 10 #include "core/dom/Element.h"
11 #include "core/dom/ElementRegistrationOptions.h" 11 #include "core/dom/ElementRegistrationOptions.h"
12 #include "core/dom/ExceptionCode.h" 12 #include "core/dom/ExceptionCode.h"
13 #include "core/dom/custom/CEReactionsScope.h" 13 #include "core/dom/custom/CEReactionsScope.h"
14 #include "core/dom/custom/CustomElement.h" 14 #include "core/dom/custom/CustomElement.h"
15 #include "core/dom/custom/CustomElementDefinition.h" 15 #include "core/dom/custom/CustomElementDefinition.h"
16 #include "core/dom/custom/CustomElementDefinitionBuilder.h" 16 #include "core/dom/custom/CustomElementDefinitionBuilder.h"
17 #include "core/dom/custom/CustomElementDescriptor.h" 17 #include "core/dom/custom/CustomElementDescriptor.h"
18 #include "core/dom/custom/CustomElementUpgradeReaction.h" 18 #include "core/dom/custom/CustomElementUpgradeReaction.h"
19 #include "core/dom/custom/CustomElementUpgradeSorter.h" 19 #include "core/dom/custom/CustomElementUpgradeSorter.h"
20 #include "core/dom/custom/V0CustomElementRegistrationContext.h" 20 #include "core/dom/custom/V0CustomElementRegistrationContext.h"
21 #include "wtf/Allocator.h"
21 22
22 namespace blink { 23 namespace blink {
23 24
25 class CustomElementsRegistry::NameIsBeingDefined final {
26 STACK_ALLOCATED();
27 DISALLOW_IMPLICIT_CONSTRUCTORS(NameIsBeingDefined);
28 public:
29 NameIsBeingDefined(
30 CustomElementsRegistry* registry,
31 const AtomicString& name)
32 : m_registry(registry)
33 , m_name(name)
34 {
35 DCHECK(!m_registry->m_namesBeingDefined.contains(name));
36 m_registry->m_namesBeingDefined.add(name);
37 }
38
39 ~NameIsBeingDefined()
40 {
41 m_registry->m_namesBeingDefined.remove(m_name);
42 }
43
44 private:
45 Member<CustomElementsRegistry> m_registry;
46 const AtomicString& m_name;
47 };
48
24 CustomElementsRegistry* CustomElementsRegistry::create( 49 CustomElementsRegistry* CustomElementsRegistry::create(
25 Document* document) 50 Document* document)
26 { 51 {
27 CustomElementsRegistry* registry = new CustomElementsRegistry(document); 52 CustomElementsRegistry* registry = new CustomElementsRegistry(document);
28 if (V0CustomElementRegistrationContext* v0Context = registry->v0()) 53 if (V0CustomElementRegistrationContext* v0Context = registry->v0())
29 v0Context->setV1(registry); 54 v0Context->setV1(registry);
30 return registry; 55 return registry;
31 } 56 }
32 57
33 CustomElementsRegistry::CustomElementsRegistry(Document* document) 58 CustomElementsRegistry::CustomElementsRegistry(Document* document)
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
70 if (!builder.checkConstructorIntrinsics()) 95 if (!builder.checkConstructorIntrinsics())
71 return; 96 return;
72 97
73 if (!CustomElement::isValidName(name)) { 98 if (!CustomElement::isValidName(name)) {
74 exceptionState.throwDOMException( 99 exceptionState.throwDOMException(
75 SyntaxError, 100 SyntaxError,
76 "\"" + name + "\" is not a valid custom element name"); 101 "\"" + name + "\" is not a valid custom element name");
77 return; 102 return;
78 } 103 }
79 104
105 if (m_namesBeingDefined.contains(name)) {
106 exceptionState.throwDOMException(
107 NotSupportedError,
108 "this name is already being defined in this registry");
109 return;
110 }
111 NameIsBeingDefined defining(this, name);
112
80 if (nameIsDefined(name) || v0NameIsDefined(name)) { 113 if (nameIsDefined(name) || v0NameIsDefined(name)) {
81 exceptionState.throwDOMException( 114 exceptionState.throwDOMException(
82 NotSupportedError, 115 NotSupportedError,
83 "this name has already been used with this registry"); 116 "this name has already been used with this registry");
84 return; 117 return;
85 } 118 }
86 119
87 if (!builder.checkConstructorNotRegistered()) 120 if (!builder.checkConstructorNotRegistered())
88 return; 121 return;
89 122
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
190 if (!element || !desc.matches(*element)) 223 if (!element || !desc.matches(*element))
191 continue; 224 continue;
192 sorter.add(element); 225 sorter.add(element);
193 } 226 }
194 227
195 m_upgradeCandidates->remove(it); 228 m_upgradeCandidates->remove(it);
196 sorter.sorted(elements, m_document.get()); 229 sorter.sorted(elements, m_document.get());
197 } 230 }
198 231
199 } // namespace blink 232 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/dom/custom/CustomElementsRegistry.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698