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

Unified Diff: third_party/WebKit/Source/bindings/core/v8/ScriptCustomElementDefinition.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/bindings/core/v8/ScriptCustomElementDefinition.cpp
diff --git a/third_party/WebKit/Source/bindings/core/v8/ScriptCustomElementDefinition.cpp b/third_party/WebKit/Source/bindings/core/v8/ScriptCustomElementDefinition.cpp
index de725ff62ad418e8ad81b48123a14d602e1e0ba3..8756cbd6692a0b3f8a4e6e97bad08cb21d137200 100644
--- a/third_party/WebKit/Source/bindings/core/v8/ScriptCustomElementDefinition.cpp
+++ b/third_party/WebKit/Source/bindings/core/v8/ScriptCustomElementDefinition.cpp
@@ -13,6 +13,8 @@
#include "bindings/core/v8/V8ScriptRunner.h"
#include "bindings/core/v8/V8ThrowException.h"
#include "core/dom/ExceptionCode.h"
+#include "core/html/HTMLElement.h"
+#include "core/html/HTMLUnknownElement.h"
#include "v8.h"
#include "wtf/Allocator.h"
@@ -152,6 +154,67 @@ ScriptCustomElementDefinition::ScriptCustomElementDefinition(
{
}
+HTMLElement* ScriptCustomElementDefinition::createElementSync(
+ Document& document, const QualifiedName& tagName,
+ ExceptionState& exceptionState)
+{
+ DCHECK(ScriptState::current(m_scriptState->isolate()) == m_scriptState);
+
+ // Create an element
+ // https://dom.spec.whatwg.org/#concept-create-element
+ // 6. If definition is non-null
+ // 6.1. If the synchronous custom elements flag is set:
+ // 6.1.2. Set result to Construct(C). Rethrow any exceptions.
+ Element* element = nullptr;
+ {
+ v8::TryCatch tryCatch(m_scriptState->isolate());
+ element = runConstructor();
+ if (tryCatch.HasCaught()) {
+ exceptionState.rethrowV8Exception(tryCatch.Exception());
+ return nullptr;
+ }
+ }
+
+ // 6.1.3. through 6.1.9.
+ checkConstructorResult(element, document, tagName, exceptionState);
+ if (exceptionState.hadException())
+ return nullptr;
+
+ DCHECK_EQ(element->getCustomElementState(), CustomElementState::Custom);
+ return toHTMLElement(element);
+}
+
+HTMLElement* ScriptCustomElementDefinition::createElementSync(
+ Document& document, const QualifiedName& tagName)
+{
+ ScriptState::Scope scope(m_scriptState.get());
+ v8::Isolate* isolate = m_scriptState->isolate();
+
+ // When invoked from "create an element for a token":
+ // https://html.spec.whatwg.org/multipage/syntax.html#create-an-element-for-the-token
+
+ ExceptionState exceptionState(ExceptionState::ConstructionContext,
+ "CustomElement", constructor(), isolate);
+ HTMLElement* element = createElementSync(document, tagName, exceptionState);
+
+ if (exceptionState.hadException() || !element) {
+ // 7. If this step throws an exception, then report the exception, ...
+ {
+ v8::TryCatch tryCatch(isolate);
+ tryCatch.SetVerbose(true);
+ exceptionState.throwIfNeeded();
+ }
+
+ // ...and let element be instead a new element that implements
+ // HTMLUnknownElement, with no attributes, namespace set to given
+ // namespace, namespace prefix set to null, custom element state
+ // "undefined", and node document set to document.
+ element = HTMLUnknownElement::create(tagName, document);
+ element->setCustomElementState(CustomElementState::Undefined);
+ }
+ return element;
+}
+
// https://html.spec.whatwg.org/multipage/scripting.html#upgrades
bool ScriptCustomElementDefinition::runConstructor(Element* element)
{
@@ -165,18 +228,11 @@ bool ScriptCustomElementDefinition::runConstructor(Element* element)
v8::TryCatch tryCatch(isolate);
tryCatch.SetVerbose(true);
- ExecutionContext* executionContext = m_scriptState->getExecutionContext();
- v8::Local<v8::Value> result;
- if (!v8Call(V8ScriptRunner::callAsConstructor(
- isolate,
- constructor(),
- executionContext,
- 0,
- nullptr),
- result))
+ Element* result = runConstructor();
+ if (!result)
return false;
- if (V8Element::toImplWithTypeCheck(isolate, result) != element) {
+ if (result != element) {
V8ThrowException::throwException(
V8ThrowException::createDOMException(
m_scriptState->isolate(),
@@ -191,6 +247,24 @@ bool ScriptCustomElementDefinition::runConstructor(Element* element)
return true;
}
+Element* ScriptCustomElementDefinition::runConstructor()
+{
+ v8::Isolate* isolate = m_scriptState->isolate();
+ DCHECK(ScriptState::current(isolate) == m_scriptState);
+ ExecutionContext* executionContext = m_scriptState->getExecutionContext();
+ v8::Local<v8::Value> result;
+ if (!v8Call(V8ScriptRunner::callAsConstructor(
+ isolate,
+ constructor(),
+ executionContext,
+ 0,
+ nullptr),
+ result)) {
+ return nullptr;
+ }
+ return V8Element::toImplWithTypeCheck(isolate, result);
+}
+
v8::Local<v8::Object> ScriptCustomElementDefinition::constructor() const
{
DCHECK(!m_constructor.isEmpty());

Powered by Google App Engine
This is Rietveld 408576698