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

Unified Diff: third_party/WebKit/Source/core/dom/custom/CustomElementDefinition.cpp

Issue 2054433002: Implement "create an element" when sync for Custom Element V1 (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@async-ce
Patch Set: dominicc review 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 side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/dom/custom/CustomElementDefinition.cpp
diff --git a/third_party/WebKit/Source/core/dom/custom/CustomElementDefinition.cpp b/third_party/WebKit/Source/core/dom/custom/CustomElementDefinition.cpp
index b261c80514f8de4966a4f07f43eb41362d471fe0..be9334697911b5e6afb2d756410ac5da0ad65097 100644
--- a/third_party/WebKit/Source/core/dom/custom/CustomElementDefinition.cpp
+++ b/third_party/WebKit/Source/core/dom/custom/CustomElementDefinition.cpp
@@ -4,6 +4,10 @@
#include "core/dom/custom/CustomElementDefinition.h"
+#include "core/dom/ExceptionCode.h"
+#include "core/dom/custom/CustomElement.h"
+#include "core/html/HTMLElement.h"
+
namespace blink {
CustomElementDefinition::CustomElementDefinition(
@@ -21,6 +25,23 @@ DEFINE_TRACE(CustomElementDefinition)
visitor->trace(m_constructionStack);
}
+HTMLElement* CustomElementDefinition::createElementAsync(Document& document, const QualifiedName& tagName)
+{
+ // https://dom.spec.whatwg.org/#concept-create-element
+ // 6. If definition is non-null, then:
+ // 6.2. If the synchronous custom elements flag is not set:
+ // 6.2.1. Set result to a new element that implements the HTMLElement
+ // interface, with no attributes, namespace set to the HTML namespace,
+ // namespace prefix set to prefix, local name set to localName, custom
+ // element state set to "undefined", and node document set to document.
+ HTMLElement* element = HTMLElement::create(tagName, document);
+ element->setCustomElementState(CustomElementState::Undefined);
+ // 6.2.2. Enqueue a custom element upgrade reaction given result and
+ // definition.
+ CustomElement::enqueueUpgradeReaction(element, this);
+ return element;
+}
+
// https://html.spec.whatwg.org/multipage/scripting.html#concept-upgrade-an-element
void CustomElementDefinition::upgrade(Element* element)
{
@@ -46,4 +67,47 @@ void CustomElementDefinition::upgrade(Element* element)
CHECK(element->getCustomElementState() == CustomElementState::Custom);
}
+static String errorMessageForConstructorResult(Element* element,
+ Document& document, const QualifiedName& tagName)
+{
+ // https://dom.spec.whatwg.org/#concept-create-element
+ // 6.1.4. If result's attribute list is not empty, then throw a NotSupportedError.
+ if (element->hasAttributes())
+ return "The result must not have attributes";
+ // 6.1.5. If result has children, then throw a NotSupportedError.
+ if (element->hasChildren())
+ return "The result must not have children";
+ // 6.1.6. If result's parent is not null, then throw a NotSupportedError.
+ if (element->parentNode())
+ return "The result must not have a parent";
+ // 6.1.7. If result's node document is not document, then throw a NotSupportedError.
+ if (&element->document() != &document)
+ return "The result must be in the same document";
+ // 6.1.8. If result's namespace is not the HTML namespace, then throw a NotSupportedError.
+ if (element->namespaceURI() != HTMLNames::xhtmlNamespaceURI)
+ return "The result must have HTML namespace";
+ // 6.1.9. If result's local name is not equal to localName, then throw a NotSupportedError.
+ if (element->localName() != tagName.localName())
+ return "The result must have the same localName";
+ return String();
+}
+
+void CustomElementDefinition::checkConstructorResult(Element* element,
+ Document& document, const QualifiedName& tagName,
+ ExceptionState& exceptionState)
+{
+ // https://dom.spec.whatwg.org/#concept-create-element
+ // 6.1.3. If result does not implement the HTMLElement interface, throw a TypeError.
+ // See https://github.com/whatwg/html/issues/1402 for more clarifications.
+ if (!element || !element->isHTMLElement()) {
+ exceptionState.throwTypeError("The result must implement HTMLElement interface");
+ return;
+ }
+
+ // 6.1.4. through 6.1.9.
+ const String message = errorMessageForConstructorResult(element, document, tagName);
+ if (!message.isEmpty())
+ exceptionState.throwDOMException(NotSupportedError, message);
+}
+
} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698