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

Unified Diff: third_party/WebKit/Source/core/dom/Document.cpp

Issue 2477713003: Custom Elements: Check Definition in createElement, Create Customized Built-in Elements Sync (Closed)
Patch Set: New tests 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 side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/dom/Document.cpp
diff --git a/third_party/WebKit/Source/core/dom/Document.cpp b/third_party/WebKit/Source/core/dom/Document.cpp
index 814f71fd5e4707711f266950c0261cc6fbad7b14..0c81e6496e9de52277785a0d93fb24db860c7857 100644
--- a/third_party/WebKit/Source/core/dom/Document.cpp
+++ b/third_party/WebKit/Source/core/dom/Document.cpp
@@ -44,6 +44,7 @@
#include "bindings/core/v8/V8PerIsolateData.h"
#include "bindings/core/v8/WindowProxy.h"
#include "core/HTMLElementFactory.h"
+#include "core/HTMLElementTypeHelpers.h"
#include "core/HTMLNames.h"
#include "core/SVGElementFactory.h"
#include "core/SVGNames.h"
@@ -713,6 +714,9 @@ String getTypeExtension(Document* document,
Element* Document::createElement(const AtomicString& localName,
const StringOrDictionary& stringOrOptions,
ExceptionState& exceptionState) {
+ const AtomicString& is =
+ AtomicString(getTypeExtension(this, stringOrOptions, exceptionState));
+
if (!isValidName(localName)) {
exceptionState.throwDOMException(
InvalidCharacterError,
@@ -722,9 +726,14 @@ Element* Document::createElement(const AtomicString& localName,
Element* element;
- if (CustomElement::shouldCreateCustomElement(convertLocalName(localName))) {
+ bool shouldCreateBuiltin =
+ stringOrOptions.isDictionary() &&
+ RuntimeEnabledFeatures::customElementsBuiltinEnabled();
+
+ if (CustomElement::shouldCreateCustomElement(convertLocalName(localName)) ||
+ shouldCreateBuiltin) {
element = CustomElement::createCustomElementSync(
- *this, convertLocalName(localName));
+ *this, convertLocalName(localName), is);
} else if (V0CustomElement::isValidName(localName) && registrationContext()) {
element = registrationContext()->createCustomTagElement(
*this, QualifiedName(nullAtom, convertLocalName(localName),
@@ -735,11 +744,13 @@ Element* Document::createElement(const AtomicString& localName,
return nullptr;
}
- String typeExtention =
- getTypeExtension(this, stringOrOptions, exceptionState);
- if (!typeExtention.isEmpty()) {
- V0CustomElementRegistrationContext::setIsAttributeAndTypeExtension(
- element, AtomicString(typeExtention));
+ if (!is.isEmpty()) {
+ if (element->getCustomElementState() != CustomElementState::Custom) {
+ V0CustomElementRegistrationContext::setIsAttributeAndTypeExtension(
+ element, is);
+ } else if (stringOrOptions.isDictionary()) {
+ element->setAttribute(HTMLNames::isAttr, is);
+ }
}
return element;
@@ -784,25 +795,43 @@ Element* Document::createElementNS(const AtomicString& namespaceURI,
const AtomicString& qualifiedName,
const StringOrDictionary& stringOrOptions,
ExceptionState& exceptionState) {
+ const AtomicString& is =
+ AtomicString(getTypeExtension(this, stringOrOptions, exceptionState));
+
+ if (!isValidName(qualifiedName)) {
+ exceptionState.throwDOMException(
+ InvalidCharacterError,
+ "The tag name provided ('" + qualifiedName + "') is not a valid name.");
+ return nullptr;
+ }
+
QualifiedName qName(
createQualifiedName(namespaceURI, qualifiedName, exceptionState));
if (qName == QualifiedName::null())
return nullptr;
Element* element;
- if (CustomElement::shouldCreateCustomElement(qName))
- element = CustomElement::createCustomElementSync(*this, qName);
- else if (V0CustomElement::isValidName(qName.localName()) &&
- registrationContext())
+
+ bool shouldCreateBuiltin =
dominicc (has gone to gerrit) 2016/11/10 03:43:09 Maybe *may* create builtin is better? If the optio
+ stringOrOptions.isDictionary() &&
+ RuntimeEnabledFeatures::customElementsBuiltinEnabled();
+
+ if (CustomElement::shouldCreateCustomElement(qName) || shouldCreateBuiltin) {
+ element = CustomElement::createCustomElementSync(*this, qName, is);
+ } else if (V0CustomElement::isValidName(qName.localName()) &&
+ registrationContext()) {
element = registrationContext()->createCustomTagElement(*this, qName);
- else
+ } else {
element = createElement(qName, CreatedByCreateElement);
+ }
- String typeExtention =
- getTypeExtension(this, stringOrOptions, exceptionState);
- if (!typeExtention.isEmpty()) {
- V0CustomElementRegistrationContext::setIsAttributeAndTypeExtension(
- element, AtomicString(typeExtention));
+ if (!is.isEmpty()) {
+ if (element->getCustomElementState() != CustomElementState::Custom) {
dominicc (has gone to gerrit) 2016/11/10 03:43:09 I'm not sure about this part. Doesn't v0-ish stuff
+ V0CustomElementRegistrationContext::setIsAttributeAndTypeExtension(
+ element, is);
+ } else if (stringOrOptions.isDictionary()) {
+ element->setAttribute(HTMLNames::isAttr, is);
+ }
}
return element;

Powered by Google App Engine
This is Rietveld 408576698