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

Unified Diff: third_party/WebKit/Source/bindings/core/v8/ScriptCustomElementDefinition.cpp

Issue 2060753002: Implement script-side of callback reactions for Custom Elements V1 (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@callback-ce
Patch Set: 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 8756cbd6692a0b3f8a4e6e97bad08cb21d137200..342dff7dd84a2ae37a3408aa7e3997b9d989dd25 100644
--- a/third_party/WebKit/Source/bindings/core/v8/ScriptCustomElementDefinition.cpp
+++ b/third_party/WebKit/Source/bindings/core/v8/ScriptCustomElementDefinition.cpp
@@ -82,9 +82,10 @@ ScriptCustomElementDefinition* ScriptCustomElementDefinition::forConstructor(
return static_cast<ScriptCustomElementDefinition*>(definition);
}
+template <typename T>
static void keepAlive(v8::Local<v8::Array>& array, uint32_t index,
- const v8::Local<v8::Object>& value,
- ScopedPersistent<v8::Object>& persistent,
+ const v8::Local<T>& value,
+ ScopedPersistent<T>& persistent,
ScriptState* scriptState)
{
if (value.IsEmpty())
@@ -102,9 +103,9 @@ ScriptCustomElementDefinition* ScriptCustomElementDefinition::create(
const CustomElementDescriptor& descriptor,
const v8::Local<v8::Object>& constructor,
const v8::Local<v8::Object>& prototype,
- const v8::Local<v8::Object>& connectedCallback,
- const v8::Local<v8::Object>& disconnectedCallback,
- const v8::Local<v8::Object>& attributeChangedCallback,
+ const v8::Local<v8::Function>& connectedCallback,
+ const v8::Local<v8::Function>& disconnectedCallback,
+ const v8::Local<v8::Function>& attributeChangedCallback,
const HashSet<AtomicString>& observedAttributes)
{
ScriptCustomElementDefinition* definition =
@@ -143,14 +144,13 @@ ScriptCustomElementDefinition::ScriptCustomElementDefinition(
const CustomElementDescriptor& descriptor,
const v8::Local<v8::Object>& constructor,
const v8::Local<v8::Object>& prototype,
- const v8::Local<v8::Object>& connectedCallback,
- const v8::Local<v8::Object>& disconnectedCallback,
- const v8::Local<v8::Object>& attributeChangedCallback,
+ const v8::Local<v8::Function>& connectedCallback,
+ const v8::Local<v8::Function>& disconnectedCallback,
+ const v8::Local<v8::Function>& attributeChangedCallback,
const HashSet<AtomicString>& observedAttributes)
- : CustomElementDefinition(descriptor)
+ : CustomElementDefinition(descriptor, observedAttributes)
, m_scriptState(scriptState)
, m_constructor(scriptState->isolate(), constructor)
- , m_observedAttributes(observedAttributes)
{
}
@@ -283,4 +283,74 @@ ScriptValue ScriptCustomElementDefinition::getConstructorForScript()
return ScriptValue(m_scriptState.get(), constructor());
}
+bool ScriptCustomElementDefinition::hasConnectedCallback() const
+{
+ return !m_connectedCallback.isEmpty();
+}
+
+bool ScriptCustomElementDefinition::hasDisconnectedCallback() const
+{
+ return !m_disconnectedCallback.isEmpty();
+}
+
+void ScriptCustomElementDefinition::runCallback(
+ v8::Local<v8::Function> callback,
+ Element* element, int argc, v8::Local<v8::Value> argv[])
+{
+ DCHECK(ScriptState::current(m_scriptState->isolate()) == m_scriptState);
+ v8::Isolate* isolate = m_scriptState->isolate();
+
+ // Invoke custom element reactions
+ // https://html.spec.whatwg.org/multipage/scripting.html#invoke-custom-element-reactions
+ // If this throws any exception, then report the exception.
+ v8::TryCatch tryCatch(isolate);
+ tryCatch.SetVerbose(true);
+
+ ExecutionContext* executionContext = m_scriptState->getExecutionContext();
+ v8::Local<v8::Value> elementHandle = toV8(element,
+ m_scriptState->context()->Global(), isolate);
+ V8ScriptRunner::callFunction(
+ callback,
+ executionContext,
+ elementHandle,
+ argc, argv, isolate);
+}
+
+void ScriptCustomElementDefinition::runConnectedCallback(Element* element)
+{
+ if (!m_scriptState->contextIsValid())
+ return;
+ ScriptState::Scope scope(m_scriptState.get());
+ v8::Isolate* isolate = m_scriptState->isolate();
+ runCallback(m_connectedCallback.newLocal(isolate), element);
+}
+
+void ScriptCustomElementDefinition::runDisconnectedCallback(Element* element)
+{
+ if (!m_scriptState->contextIsValid())
+ return;
+ ScriptState::Scope scope(m_scriptState.get());
+ v8::Isolate* isolate = m_scriptState->isolate();
+ runCallback(m_disconnectedCallback.newLocal(isolate), element);
+}
+
+void ScriptCustomElementDefinition::runAttributeChangedCallback(
+ Element* element, const QualifiedName& name,
+ const AtomicString& oldValue, const AtomicString& newValue)
+{
+ if (!m_scriptState->contextIsValid())
+ return;
+ ScriptState::Scope scope(m_scriptState.get());
+ v8::Isolate* isolate = m_scriptState->isolate();
+ const int argc = 4;
+ v8::Local<v8::Value> argv[argc] = {
+ v8String(isolate, name.localName()),
+ v8StringOrNull(isolate, oldValue),
+ v8StringOrNull(isolate, newValue),
+ v8String(isolate, name.namespaceURI()),
+ };
+ runCallback(m_attributeChangedCallback.newLocal(isolate), element,
+ argc, argv);
+}
+
} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698