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) |
{ |