<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[188913] trunk/Source/WebCore</title>
</head>
<body>
<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/188913">188913</a></dd>
<dt>Author</dt> <dd>cdumez@apple.com</dd>
<dt>Date</dt> <dd>2015-08-25 10:04:47 -0700 (Tue, 25 Aug 2015)</dd>
</dl>
<h3>Log Message</h3>
<pre>Add support for callback interfaces using other callback names than "handleEvent"
https://bugs.webkit.org/show_bug.cgi?id=148418
Reviewed by Ryosuke Niwa.
Add support for callback interfaces using other callback names than
"handleEvent" [1].
This is a pre-requirement for Bug 148415, as NodeFilter's callback
function name is "acceptNode":
- https://dom.spec.whatwg.org/#interface-nodefilter
[1] https://heycam.github.io/webidl/#es-user-objects
* bindings/js/JSCallbackData.cpp:
(WebCore::JSCallbackData::invokeCallback):
* bindings/js/JSCallbackData.h:
* bindings/js/JSCustomSQLStatementErrorCallback.cpp:
(WebCore::JSSQLStatementErrorCallback::handleEvent):
* bindings/scripts/CodeGeneratorJS.pm:
(GenerateCallbackImplementation):
* bindings/scripts/test/JS/JSTestCallback.cpp:
(WebCore::JSTestCallback::callbackWithNoParam):
(WebCore::JSTestCallback::callbackWithArrayParam):
(WebCore::JSTestCallback::callbackWithSerializedScriptValueParam):
(WebCore::JSTestCallback::callbackWithStringList):
(WebCore::JSTestCallback::callbackWithBoolean):
(WebCore::JSTestCallback::callbackRequiresThisToPass):</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSCallbackDatacpp">trunk/Source/WebCore/bindings/js/JSCallbackData.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSCallbackDatah">trunk/Source/WebCore/bindings/js/JSCallbackData.h</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSCustomSQLStatementErrorCallbackcpp">trunk/Source/WebCore/bindings/js/JSCustomSQLStatementErrorCallback.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsscriptsCodeGeneratorJSpm">trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm</a></li>
<li><a href="#trunkSourceWebCorebindingsscriptstestJSJSTestCallbackcpp">trunk/Source/WebCore/bindings/scripts/test/JS/JSTestCallback.cpp</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (188912 => 188913)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-08-25 17:02:34 UTC (rev 188912)
+++ trunk/Source/WebCore/ChangeLog        2015-08-25 17:04:47 UTC (rev 188913)
</span><span class="lines">@@ -1,5 +1,36 @@
</span><span class="cx"> 2015-08-25 Chris Dumez <cdumez@apple.com>
</span><span class="cx">
</span><ins>+ Add support for callback interfaces using other callback names than "handleEvent"
+ https://bugs.webkit.org/show_bug.cgi?id=148418
+
+ Reviewed by Ryosuke Niwa.
+
+ Add support for callback interfaces using other callback names than
+ "handleEvent" [1].
+
+ This is a pre-requirement for Bug 148415, as NodeFilter's callback
+ function name is "acceptNode":
+ - https://dom.spec.whatwg.org/#interface-nodefilter
+
+ [1] https://heycam.github.io/webidl/#es-user-objects
+
+ * bindings/js/JSCallbackData.cpp:
+ (WebCore::JSCallbackData::invokeCallback):
+ * bindings/js/JSCallbackData.h:
+ * bindings/js/JSCustomSQLStatementErrorCallback.cpp:
+ (WebCore::JSSQLStatementErrorCallback::handleEvent):
+ * bindings/scripts/CodeGeneratorJS.pm:
+ (GenerateCallbackImplementation):
+ * bindings/scripts/test/JS/JSTestCallback.cpp:
+ (WebCore::JSTestCallback::callbackWithNoParam):
+ (WebCore::JSTestCallback::callbackWithArrayParam):
+ (WebCore::JSTestCallback::callbackWithSerializedScriptValueParam):
+ (WebCore::JSTestCallback::callbackWithStringList):
+ (WebCore::JSTestCallback::callbackWithBoolean):
+ (WebCore::JSTestCallback::callbackRequiresThisToPass):
+
+2015-08-25 Chris Dumez <cdumez@apple.com>
+
</ins><span class="cx"> Get rid of custom bindings for RequestAnimationFrameCallback.handleEvent()
</span><span class="cx"> https://bugs.webkit.org/show_bug.cgi?id=148417
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSCallbackDatacpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSCallbackData.cpp (188912 => 188913)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSCallbackData.cpp        2015-08-25 17:02:34 UTC (rev 188912)
+++ trunk/Source/WebCore/bindings/js/JSCallbackData.cpp        2015-08-25 17:04:47 UTC (rev 188913)
</span><span class="lines">@@ -43,13 +43,13 @@
</span><span class="cx"> delete static_cast<JSCallbackData*>(context);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-JSValue JSCallbackData::invokeCallback(MarkedArgumentBuffer& args, bool* raisedException)
</del><ins>+JSValue JSCallbackData::invokeCallback(MarkedArgumentBuffer& args, PropertyName functionName, bool* raisedException)
</ins><span class="cx"> {
</span><span class="cx"> ASSERT(callback());
</span><del>- return invokeCallback(callback(), args, raisedException);
</del><ins>+ return invokeCallback(callback(), args, functionName, raisedException);
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-JSValue JSCallbackData::invokeCallback(JSValue thisValue, MarkedArgumentBuffer& args, bool* raisedException)
</del><ins>+JSValue JSCallbackData::invokeCallback(JSValue thisValue, MarkedArgumentBuffer& args, PropertyName functionName, bool* raisedException)
</ins><span class="cx"> {
</span><span class="cx"> ASSERT(callback());
</span><span class="cx"> ASSERT(globalObject());
</span><span class="lines">@@ -60,7 +60,7 @@
</span><span class="cx"> CallData callData;
</span><span class="cx"> CallType callType = callback()->methodTable()->getCallData(callback(), callData);
</span><span class="cx"> if (callType == CallTypeNone) {
</span><del>- function = callback()->get(exec, Identifier::fromString(exec, "handleEvent"));
</del><ins>+ function = callback()->get(exec, functionName);
</ins><span class="cx"> callType = getCallData(function, callData);
</span><span class="cx"> if (callType == CallTypeNone)
</span><span class="cx"> return JSValue();
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSCallbackDatah"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSCallbackData.h (188912 => 188913)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSCallbackData.h        2015-08-25 17:02:34 UTC (rev 188912)
+++ trunk/Source/WebCore/bindings/js/JSCallbackData.h        2015-08-25 17:04:47 UTC (rev 188913)
</span><span class="lines">@@ -66,8 +66,8 @@
</span><span class="cx"> JSC::JSObject* callback() { return m_callback.get(); }
</span><span class="cx"> JSDOMGlobalObject* globalObject() { return m_globalObject.get(); }
</span><span class="cx">
</span><del>- JSC::JSValue invokeCallback(JSC::MarkedArgumentBuffer&, bool* raisedException = 0);
- JSC::JSValue invokeCallback(JSC::JSValue thisValue, JSC::MarkedArgumentBuffer&, bool* raisedException = 0);
</del><ins>+ JSC::JSValue invokeCallback(JSC::MarkedArgumentBuffer&, JSC::PropertyName functionName, bool* raisedException = nullptr);
+ JSC::JSValue invokeCallback(JSC::JSValue thisValue, JSC::MarkedArgumentBuffer&, JSC::PropertyName functionName, bool* raisedException = nullptr);
</ins><span class="cx">
</span><span class="cx"> private:
</span><span class="cx"> JSC::Strong<JSC::JSObject> m_callback;
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSCustomSQLStatementErrorCallbackcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSCustomSQLStatementErrorCallback.cpp (188912 => 188913)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSCustomSQLStatementErrorCallback.cpp        2015-08-25 17:02:34 UTC (rev 188912)
+++ trunk/Source/WebCore/bindings/js/JSCustomSQLStatementErrorCallback.cpp        2015-08-25 17:04:47 UTC (rev 188913)
</span><span class="lines">@@ -54,7 +54,7 @@
</span><span class="cx"> args.append(toJS(exec, m_data->globalObject(), error));
</span><span class="cx">
</span><span class="cx"> bool raisedException = false;
</span><del>- JSValue result = m_data->invokeCallback(args, &raisedException);
</del><ins>+ JSValue result = m_data->invokeCallback(args, Identifier::fromString(exec, "handleEvent"), &raisedException);
</ins><span class="cx"> if (raisedException) {
</span><span class="cx"> // The spec says:
</span><span class="cx"> // "If the error callback returns false, then move on to the next statement..."
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsscriptsCodeGeneratorJSpm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm (188912 => 188913)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm        2015-08-25 17:02:34 UTC (rev 188912)
+++ trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm        2015-08-25 17:04:47 UTC (rev 188913)
</span><span class="lines">@@ -3570,7 +3570,8 @@
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> AddIncludesForTypeInImpl($function->signature->type);
</span><del>- push(@implContent, "\n" . GetNativeTypeForCallbacks($function->signature->type) . " ${className}::" . $function->signature->name . "(");
</del><ins>+ my $functionName = $function->signature->name;
+ push(@implContent, "\n" . GetNativeTypeForCallbacks($function->signature->type) . " ${className}::${functionName}(");
</ins><span class="cx">
</span><span class="cx"> my @args = ();
</span><span class="cx"> my @argsCheck = ();
</span><span class="lines">@@ -3588,10 +3589,7 @@
</span><span class="cx"> push(@implContent, " return true;\n\n");
</span><span class="cx"> push(@implContent, " Ref<$className> protect(*this);\n\n");
</span><span class="cx"> push(@implContent, " JSLockHolder lock(m_data->globalObject()->vm());\n\n");
</span><del>- if (@params) {
- push(@implContent, " ExecState* exec = m_data->globalObject()->globalExec();\n");
- push(@implContent, " UNUSED_PARAM(exec);\n");
- }
</del><ins>+ push(@implContent, " ExecState* exec = m_data->globalObject()->globalExec();\n");
</ins><span class="cx"> push(@implContent, " MarkedArgumentBuffer args;\n");
</span><span class="cx">
</span><span class="cx"> foreach my $param (@params) {
</span><span class="lines">@@ -3600,7 +3598,7 @@
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> push(@implContent, "\n bool raisedException = false;\n");
</span><del>- push(@implContent, " m_data->invokeCallback(args, &raisedException);\n");
</del><ins>+ push(@implContent, " m_data->invokeCallback(args, Identifier::fromString(exec, \"${functionName}\"), &raisedException);\n");
</ins><span class="cx"> push(@implContent, " return !raisedException;\n");
</span><span class="cx"> push(@implContent, "}\n");
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsscriptstestJSJSTestCallbackcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/scripts/test/JS/JSTestCallback.cpp (188912 => 188913)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/scripts/test/JS/JSTestCallback.cpp        2015-08-25 17:02:34 UTC (rev 188912)
+++ trunk/Source/WebCore/bindings/scripts/test/JS/JSTestCallback.cpp        2015-08-25 17:04:47 UTC (rev 188913)
</span><span class="lines">@@ -71,10 +71,11 @@
</span><span class="cx">
</span><span class="cx"> JSLockHolder lock(m_data->globalObject()->vm());
</span><span class="cx">
</span><ins>+ ExecState* exec = m_data->globalObject()->globalExec();
</ins><span class="cx"> MarkedArgumentBuffer args;
</span><span class="cx">
</span><span class="cx"> bool raisedException = false;
</span><del>- m_data->invokeCallback(args, &raisedException);
</del><ins>+ m_data->invokeCallback(args, Identifier::fromString(exec, "callbackWithNoParam"), &raisedException);
</ins><span class="cx"> return !raisedException;
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -88,12 +89,11 @@
</span><span class="cx"> JSLockHolder lock(m_data->globalObject()->vm());
</span><span class="cx">
</span><span class="cx"> ExecState* exec = m_data->globalObject()->globalExec();
</span><del>- UNUSED_PARAM(exec);
</del><span class="cx"> MarkedArgumentBuffer args;
</span><span class="cx"> args.append(toJS(exec, m_data->globalObject(), WTF::getPtr(arrayParam)));
</span><span class="cx">
</span><span class="cx"> bool raisedException = false;
</span><del>- m_data->invokeCallback(args, &raisedException);
</del><ins>+ m_data->invokeCallback(args, Identifier::fromString(exec, "callbackWithArrayParam"), &raisedException);
</ins><span class="cx"> return !raisedException;
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -107,13 +107,12 @@
</span><span class="cx"> JSLockHolder lock(m_data->globalObject()->vm());
</span><span class="cx">
</span><span class="cx"> ExecState* exec = m_data->globalObject()->globalExec();
</span><del>- UNUSED_PARAM(exec);
</del><span class="cx"> MarkedArgumentBuffer args;
</span><span class="cx"> args.append(srzParam ? srzParam->deserialize(exec, castedThis->globalObject(), 0) : jsNull());
</span><span class="cx"> args.append(jsStringWithCache(exec, strArg));
</span><span class="cx">
</span><span class="cx"> bool raisedException = false;
</span><del>- m_data->invokeCallback(args, &raisedException);
</del><ins>+ m_data->invokeCallback(args, Identifier::fromString(exec, "callbackWithSerializedScriptValueParam"), &raisedException);
</ins><span class="cx"> return !raisedException;
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -127,12 +126,11 @@
</span><span class="cx"> JSLockHolder lock(m_data->globalObject()->vm());
</span><span class="cx">
</span><span class="cx"> ExecState* exec = m_data->globalObject()->globalExec();
</span><del>- UNUSED_PARAM(exec);
</del><span class="cx"> MarkedArgumentBuffer args;
</span><span class="cx"> args.append(toJS(exec, m_data->globalObject(), WTF::getPtr(listParam)));
</span><span class="cx">
</span><span class="cx"> bool raisedException = false;
</span><del>- m_data->invokeCallback(args, &raisedException);
</del><ins>+ m_data->invokeCallback(args, Identifier::fromString(exec, "callbackWithStringList"), &raisedException);
</ins><span class="cx"> return !raisedException;
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -146,12 +144,11 @@
</span><span class="cx"> JSLockHolder lock(m_data->globalObject()->vm());
</span><span class="cx">
</span><span class="cx"> ExecState* exec = m_data->globalObject()->globalExec();
</span><del>- UNUSED_PARAM(exec);
</del><span class="cx"> MarkedArgumentBuffer args;
</span><span class="cx"> args.append(jsBoolean(boolParam));
</span><span class="cx">
</span><span class="cx"> bool raisedException = false;
</span><del>- m_data->invokeCallback(args, &raisedException);
</del><ins>+ m_data->invokeCallback(args, Identifier::fromString(exec, "callbackWithBoolean"), &raisedException);
</ins><span class="cx"> return !raisedException;
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -165,13 +162,12 @@
</span><span class="cx"> JSLockHolder lock(m_data->globalObject()->vm());
</span><span class="cx">
</span><span class="cx"> ExecState* exec = m_data->globalObject()->globalExec();
</span><del>- UNUSED_PARAM(exec);
</del><span class="cx"> MarkedArgumentBuffer args;
</span><span class="cx"> args.append(jsNumber(longParam));
</span><span class="cx"> args.append(toJS(exec, m_data->globalObject(), WTF::getPtr(testNodeParam)));
</span><span class="cx">
</span><span class="cx"> bool raisedException = false;
</span><del>- m_data->invokeCallback(args, &raisedException);
</del><ins>+ m_data->invokeCallback(args, Identifier::fromString(exec, "callbackRequiresThisToPass"), &raisedException);
</ins><span class="cx"> return !raisedException;
</span><span class="cx"> }
</span><span class="cx">
</span></span></pre>
</div>
</div>
</body>
</html>