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

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

Issue 2477713003: Custom Elements: Check Definition in createElement, Create Customized Built-in Elements Sync (Closed)
Patch Set: Made changes Created 4 years, 1 month 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
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/CustomElement.h" 5 #include "core/dom/custom/CustomElement.h"
6 6
7 #include "core/HTMLElementFactory.h"
8 #include "core/HTMLElementTypeHelpers.h"
7 #include "core/dom/Document.h" 9 #include "core/dom/Document.h"
8 #include "core/dom/QualifiedName.h" 10 #include "core/dom/QualifiedName.h"
9 #include "core/dom/custom/CEReactionsScope.h" 11 #include "core/dom/custom/CEReactionsScope.h"
10 #include "core/dom/custom/CustomElementDefinition.h" 12 #include "core/dom/custom/CustomElementDefinition.h"
11 #include "core/dom/custom/CustomElementReactionStack.h" 13 #include "core/dom/custom/CustomElementReactionStack.h"
12 #include "core/dom/custom/CustomElementRegistry.h" 14 #include "core/dom/custom/CustomElementRegistry.h"
13 #include "core/dom/custom/V0CustomElement.h" 15 #include "core/dom/custom/V0CustomElement.h"
14 #include "core/dom/custom/V0CustomElementRegistrationContext.h" 16 #include "core/dom/custom/V0CustomElementRegistrationContext.h"
15 #include "core/frame/LocalDOMWindow.h" 17 #include "core/frame/LocalDOMWindow.h"
16 #include "core/html/HTMLElement.h" 18 #include "core/html/HTMLElement.h"
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
72 static CustomElementDefinition* definitionFor( 74 static CustomElementDefinition* definitionFor(
73 const Document& document, 75 const Document& document,
74 const CustomElementDescriptor desc) { 76 const CustomElementDescriptor desc) {
75 if (CustomElementRegistry* registry = CustomElement::registry(document)) 77 if (CustomElementRegistry* registry = CustomElement::registry(document))
76 return registry->definitionFor(desc); 78 return registry->definitionFor(desc);
77 return nullptr; 79 return nullptr;
78 } 80 }
79 81
80 HTMLElement* CustomElement::createCustomElementSync( 82 HTMLElement* CustomElement::createCustomElementSync(
81 Document& document, 83 Document& document,
82 const AtomicString& localName) { 84 const AtomicString& localName,
85 const AtomicString& is) {
83 return createCustomElementSync( 86 return createCustomElementSync(
84 document, 87 document,
85 QualifiedName(nullAtom, localName, HTMLNames::xhtmlNamespaceURI)); 88 QualifiedName(nullAtom, localName, HTMLNames::xhtmlNamespaceURI), is);
86 } 89 }
87 90
91 // https://dom.spec.whatwg.org/#concept-create-element
88 HTMLElement* CustomElement::createCustomElementSync( 92 HTMLElement* CustomElement::createCustomElementSync(
89 Document& document, 93 Document& document,
90 const QualifiedName& tagName) { 94 const QualifiedName& tagName,
91 DCHECK(shouldCreateCustomElement(tagName)); 95 const AtomicString& is) {
92 if (CustomElementDefinition* definition = definitionFor( 96 const AtomicString& name = is.isNull() ? tagName.localName() : is;
93 document, 97 DCHECK(shouldCreateCustomElement(name));
dominicc (has gone to gerrit) 2016/11/08 08:36:29 Could you do a debug build and try something like
94 CustomElementDescriptor(tagName.localName(), tagName.localName()))) 98 const CustomElementDescriptor desc(name, tagName.localName());
95 return definition->createElementSync(document, tagName); 99 CustomElementDefinition* definition = definitionFor(document, desc);
96 return createUndefinedElement(document, tagName); 100 HTMLElement* element;
101
102 if (definition && desc.isAutonomous()) {
103 // 6. If definition is non-null and we have an autonomous custom element
104 element = definition->createElementSync(document, tagName);
105 } else if (definition) {
106 // 5. If definition is non-null and we have a customized built-in element
107 element = createUndefinedElement(document, tagName);
108 definition->upgrade(element);
109 } else {
110 // 7. Otherwise
111 element = createUndefinedElement(document, tagName);
112 }
113 return element;
97 } 114 }
98 115
99 HTMLElement* CustomElement::createCustomElementAsync( 116 HTMLElement* CustomElement::createCustomElementAsync(
100 Document& document, 117 Document& document,
101 const QualifiedName& tagName) { 118 const QualifiedName& tagName) {
102 DCHECK(shouldCreateCustomElement(tagName)); 119 DCHECK(shouldCreateCustomElement(tagName));
103 120
104 // To create an element: 121 // To create an element:
105 // https://dom.spec.whatwg.org/#concept-create-element 122 // https://dom.spec.whatwg.org/#concept-create-element
106 // 6. If definition is non-null, then: 123 // 6. If definition is non-null, then:
107 // 6.2. If the synchronous custom elements flag is not set: 124 // 6.2. If the synchronous custom elements flag is not set:
108 if (CustomElementDefinition* definition = definitionFor( 125 if (CustomElementDefinition* definition = definitionFor(
109 document, 126 document,
110 CustomElementDescriptor(tagName.localName(), tagName.localName()))) 127 CustomElementDescriptor(tagName.localName(), tagName.localName())))
111 return definition->createElementAsync(document, tagName); 128 return definition->createElementAsync(document, tagName);
112 129
113 return createUndefinedElement(document, tagName); 130 return createUndefinedElement(document, tagName);
114 } 131 }
115 132
133 // Create a HTMLElement
116 HTMLElement* CustomElement::createUndefinedElement( 134 HTMLElement* CustomElement::createUndefinedElement(
117 Document& document, 135 Document& document,
118 const QualifiedName& tagName) { 136 const QualifiedName& tagName) {
119 DCHECK(shouldCreateCustomElement(tagName)); 137 bool shouldCreateBuiltin =
138 htmlElementTypeForTag(tagName.localName()) !=
139 HTMLElementType::kHTMLUnknownElement &&
140 RuntimeEnabledFeatures::customElementsBuiltinEnabled();
141 DCHECK(shouldCreateCustomElement(tagName) || shouldCreateBuiltin);
120 142
121 HTMLElement* element; 143 HTMLElement* element;
122 if (V0CustomElement::isValidName(tagName.localName()) && 144 if (V0CustomElement::isValidName(tagName.localName()) &&
123 document.registrationContext()) { 145 document.registrationContext()) {
124 Element* v0element = document.registrationContext()->createCustomTagElement( 146 Element* v0element = document.registrationContext()->createCustomTagElement(
125 document, tagName); 147 document, tagName);
126 SECURITY_DCHECK(v0element->isHTMLElement()); 148 SECURITY_DCHECK(v0element->isHTMLElement());
127 element = toHTMLElement(v0element); 149 element = toHTMLElement(v0element);
150 } else if (shouldCreateBuiltin) {
151 element = HTMLElementFactory::createHTMLElement(
152 tagName.localName(), document, nullptr, CreatedByCreateElement);
128 } else { 153 } else {
129 element = HTMLElement::create(tagName, document); 154 element = HTMLElement::create(tagName, document);
130 } 155 }
131 156
132 element->setCustomElementState(CustomElementState::Undefined); 157 element->setCustomElementState(CustomElementState::Undefined);
133 158
134 return element; 159 return element;
135 } 160 }
136 161
137 HTMLElement* CustomElement::createFailedElement(Document& document, 162 HTMLElement* CustomElement::createFailedElement(Document& document,
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
213 if (!registry) 238 if (!registry)
214 return; 239 return;
215 if (CustomElementDefinition* definition = registry->definitionFor( 240 if (CustomElementDefinition* definition = registry->definitionFor(
216 CustomElementDescriptor(element->localName(), element->localName()))) 241 CustomElementDescriptor(element->localName(), element->localName())))
217 definition->enqueueUpgradeReaction(element); 242 definition->enqueueUpgradeReaction(element);
218 else 243 else
219 registry->addCandidate(element); 244 registry->addCandidate(element);
220 } 245 }
221 246
222 } // namespace blink 247 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698