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

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: haraken review and 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 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 cdc2f6db42a93e3b572c711c789ead694a4004db..6db283ccd58a7a75331003f4d3758c0d2120d1d9 100644
--- a/third_party/WebKit/Source/core/dom/custom/CustomElementDefinition.cpp
+++ b/third_party/WebKit/Source/core/dom/custom/CustomElementDefinition.cpp
@@ -4,12 +4,14 @@
#include "core/dom/custom/CustomElementDefinition.h"
+#include "core/dom/ExceptionCode.h"
#include "core/dom/custom/CEReactionsScope.h"
#include "core/dom/custom/CustomElement.h"
#include "core/dom/custom/CustomElementAttributeChangedCallbackReaction.h"
#include "core/dom/custom/CustomElementConnectedCallbackReaction.h"
#include "core/dom/custom/CustomElementDisconnectedCallbackReaction.h"
#include "core/dom/custom/CustomElementUpgradeReaction.h"
+#include "core/html/HTMLElement.h"
namespace blink {
@@ -28,6 +30,66 @@ DEFINE_TRACE(CustomElementDefinition)
visitor->trace(m_constructionStack);
}
+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);
+}
+
+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.
+ enqueueUpgradeReaction(element);
+ return element;
+}
+
// https://html.spec.whatwg.org/multipage/scripting.html#concept-upgrade-an-element
void CustomElementDefinition::upgrade(Element* element)
{

Powered by Google App Engine
This is Rietveld 408576698