<!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>[188965] trunk</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/188965">188965</a></dd>
<dt>Author</dt> <dd>bburg@apple.com</dd>
<dt>Date</dt> <dd>2015-08-26 07:34:38 -0700 (Wed, 26 Aug 2015)</dd>
</dl>
<h3>Log Message</h3>
<pre>Web Inspector: no need to allocate protocolErrors array for every dispatched backend command
https://bugs.webkit.org/show_bug.cgi?id=146466
Reviewed by Joseph Pecoraro.
Source/JavaScriptCore:
Clean up some of the backend dispatcher code, with a focus on eliminating useless allocations
of objects in the common case when no protocol errors happen. This is done by saving the
current id of each request as it is being processed by the backend dispatcher, and tagging any
subsequent errors with that id. This also means we don't have to thread the requestId except
in the async command code path.
This patch also lifts some common code shared between all generated backend command
implementatations into the per-domain dispatch method instead. This reduces generated code size.
To be consistent, this patch standardizes on calling the id of a backend message its 'requestId'.
Requests can be handled synchronously or asynchronously (triggered via the 'async' property).
No new tests, covered by existing protocol tests.
* inspector/InspectorBackendDispatcher.cpp:
(Inspector::BackendDispatcher::CallbackBase::CallbackBase): Split the two code paths for reporting
success and failure.
(Inspector::BackendDispatcher::CallbackBase::sendFailure):
(Inspector::BackendDispatcher::CallbackBase::sendSuccess): Renamed from sendIfActive.
(Inspector::BackendDispatcher::dispatch): Reset counters and current requestId before dispatching.
No need to manually thread the requestId to all reportProtocolError calls.
(Inspector::BackendDispatcher::hasProtocolErrors): Added.
(Inspector::BackendDispatcher::sendResponse):
(Inspector::BackendDispatcher::sendPendingErrors): Send any saved protocol errors to the frontend.
Always send a 'data' member with all of the errors, even if there's just one. We might want to add
more information about errors later.
(Inspector::BackendDispatcher::reportProtocolError): Enqueue a protocol error to be sent later.
(Inspector::BackendDispatcher::getPropertyValue): Remove useless type parameters and nuke most of
the type conversion methods. Use std::function types instead of function pointer types.
(Inspector::castToInteger): Added.
(Inspector::castToNumber): Added.
(Inspector::BackendDispatcher::getInteger):
(Inspector::BackendDispatcher::getDouble):
(Inspector::BackendDispatcher::getString):
(Inspector::BackendDispatcher::getBoolean):
(Inspector::BackendDispatcher::getObject):
(Inspector::BackendDispatcher::getArray):
(Inspector::BackendDispatcher::getValue):
(Inspector::getPropertyValue): Deleted.
(Inspector::AsMethodBridges::asInteger): Deleted.
(Inspector::AsMethodBridges::asDouble): Deleted.
(Inspector::AsMethodBridges::asString): Deleted.
(Inspector::AsMethodBridges::asBoolean): Deleted.
(Inspector::AsMethodBridges::asObject): Deleted.
(Inspector::AsMethodBridges::asArray): Deleted.
(Inspector::AsMethodBridges::asValue): Deleted.
* inspector/InspectorBackendDispatcher.h:
* inspector/scripts/codegen/cpp_generator_templates.py: Extract 'params' object in domain dispatch method.
Omit requestIds where possible. Convert dispatch tables to use NeverDestroyed. Check the protocol error count
to decide whether to abort the dispatch or not, rather than allocating our own errors array.
* inspector/scripts/codegen/cpp_generator_templates.py:
(void):
* inspector/scripts/codegen/generate_cpp_backend_dispatcher_header.py: Revert to passing RefPtr<InspectorObject>
since parameters are now being passed rather than the message object. Some commands do not require parameters.
* inspector/scripts/codegen/generate_cpp_backend_dispatcher_implementation.py:
(CppBackendDispatcherImplementationGenerator.generate_output):
(CppBackendDispatcherImplementationGenerator._generate_small_dispatcher_switch_implementation_for_domain):
(CppBackendDispatcherImplementationGenerator._generate_dispatcher_implementation_for_command):
* inspector/scripts/codegen/generate_objc_backend_dispatcher_header.py:
(ObjCBackendDispatcherHeaderGenerator._generate_objc_handler_declaration_for_command):
* inspector/scripts/codegen/generate_objc_backend_dispatcher_implementation.py:
(ObjCConfigurationImplementationGenerator._generate_handler_implementation_for_command):
(ObjCConfigurationImplementationGenerator._generate_success_block_for_command):
* inspector/scripts/codegen/objc_generator_templates.py:
Rebaseline some protocol generator tests.
* inspector/scripts/tests/expected/commands-with-async-attribute.json-result:
* inspector/scripts/tests/expected/commands-with-optional-call-return-parameters.json-result:
* inspector/scripts/tests/expected/domains-with-varying-command-sizes.json-result:
* inspector/scripts/tests/expected/enum-values.json-result:
* inspector/scripts/tests/expected/events-with-optional-parameters.json-result:
* inspector/scripts/tests/expected/generate-domains-with-feature-guards.json-result:
* inspector/scripts/tests/expected/same-type-id-different-domain.json-result:
* inspector/scripts/tests/expected/shadowed-optional-type-setters.json-result:
* inspector/scripts/tests/expected/type-declaration-aliased-primitive-type.json-result:
* inspector/scripts/tests/expected/type-declaration-array-type.json-result:
* inspector/scripts/tests/expected/type-declaration-enum-type.json-result:
* inspector/scripts/tests/expected/type-declaration-object-type.json-result:
* inspector/scripts/tests/expected/type-requiring-runtime-casts.json-result:
Source/WebInspectorUI:
* UserInterface/TestStub.html: Fix a typo, this property exists on ProtocolTest.
LayoutTests:
* inspector/protocol/backend-dispatcher-argument-errors-expected.txt:
* inspector/protocol/backend-dispatcher-argument-errors.html:
Stringify the 'data' member before dumping, since it now contains JSON. Rebaseline it.</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsinspectorprotocolbackenddispatcherargumenterrorsexpectedtxt">trunk/LayoutTests/inspector/protocol/backend-dispatcher-argument-errors-expected.txt</a></li>
<li><a href="#trunkLayoutTestsinspectorprotocolbackenddispatcherargumenterrorshtml">trunk/LayoutTests/inspector/protocol/backend-dispatcher-argument-errors.html</a></li>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorInspectorBackendDispatchercpp">trunk/Source/JavaScriptCore/inspector/InspectorBackendDispatcher.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorInspectorBackendDispatcherh">trunk/Source/JavaScriptCore/inspector/InspectorBackendDispatcher.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorscriptscodegencpp_generator_templatespy">trunk/Source/JavaScriptCore/inspector/scripts/codegen/cpp_generator_templates.py</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorscriptscodegengenerate_cpp_backend_dispatcher_headerpy">trunk/Source/JavaScriptCore/inspector/scripts/codegen/generate_cpp_backend_dispatcher_header.py</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorscriptscodegengenerate_cpp_backend_dispatcher_implementationpy">trunk/Source/JavaScriptCore/inspector/scripts/codegen/generate_cpp_backend_dispatcher_implementation.py</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorscriptscodegengenerate_objc_backend_dispatcher_headerpy">trunk/Source/JavaScriptCore/inspector/scripts/codegen/generate_objc_backend_dispatcher_header.py</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorscriptscodegengenerate_objc_backend_dispatcher_implementationpy">trunk/Source/JavaScriptCore/inspector/scripts/codegen/generate_objc_backend_dispatcher_implementation.py</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorscriptscodegenobjc_generator_templatespy">trunk/Source/JavaScriptCore/inspector/scripts/codegen/objc_generator_templates.py</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorscriptstestsexpectedcommandswithasyncattributejsonresult">trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/commands-with-async-attribute.json-result</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorscriptstestsexpectedcommandswithoptionalcallreturnparametersjsonresult">trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/commands-with-optional-call-return-parameters.json-result</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorscriptstestsexpecteddomainswithvaryingcommandsizesjsonresult">trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/domains-with-varying-command-sizes.json-result</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorscriptstestsexpectedenumvaluesjsonresult">trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/enum-values.json-result</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorscriptstestsexpectedeventswithoptionalparametersjsonresult">trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/events-with-optional-parameters.json-result</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorscriptstestsexpectedgeneratedomainswithfeatureguardsjsonresult">trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/generate-domains-with-feature-guards.json-result</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorscriptstestsexpectedsametypeiddifferentdomainjsonresult">trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/same-type-id-different-domain.json-result</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorscriptstestsexpectedshadowedoptionaltypesettersjsonresult">trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/shadowed-optional-type-setters.json-result</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorscriptstestsexpectedtypedeclarationaliasedprimitivetypejsonresult">trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/type-declaration-aliased-primitive-type.json-result</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorscriptstestsexpectedtypedeclarationarraytypejsonresult">trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/type-declaration-array-type.json-result</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorscriptstestsexpectedtypedeclarationenumtypejsonresult">trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/type-declaration-enum-type.json-result</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorscriptstestsexpectedtypedeclarationobjecttypejsonresult">trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/type-declaration-object-type.json-result</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorscriptstestsexpectedtyperequiringruntimecastsjsonresult">trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/type-requiring-runtime-casts.json-result</a></li>
<li><a href="#trunkSourceWebInspectorUIChangeLog">trunk/Source/WebInspectorUI/ChangeLog</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceTestStubhtml">trunk/Source/WebInspectorUI/UserInterface/TestStub.html</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (188964 => 188965)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2015-08-26 10:24:30 UTC (rev 188964)
+++ trunk/LayoutTests/ChangeLog        2015-08-26 14:34:38 UTC (rev 188965)
</span><span class="lines">@@ -1,3 +1,14 @@
</span><ins>+2015-08-25 Brian Burg <bburg@apple.com>
+
+ Web Inspector: no need to allocate protocolErrors array for every dispatched backend command
+ https://bugs.webkit.org/show_bug.cgi?id=146466
+
+ Reviewed by Joseph Pecoraro.
+
+ * inspector/protocol/backend-dispatcher-argument-errors-expected.txt:
+ * inspector/protocol/backend-dispatcher-argument-errors.html:
+ Stringify the 'data' member before dumping, since it now contains JSON. Rebaseline it.
+
</ins><span class="cx"> 2015-08-26 Enrica Casucci <enrica@apple.com>
</span><span class="cx">
</span><span class="cx"> Add some new emoji with modifiers and new sequence.
</span></span></pre></div>
<a id="trunkLayoutTestsinspectorprotocolbackenddispatcherargumenterrorsexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/inspector/protocol/backend-dispatcher-argument-errors-expected.txt (188964 => 188965)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/inspector/protocol/backend-dispatcher-argument-errors-expected.txt        2015-08-26 10:24:30 UTC (rev 188964)
+++ trunk/LayoutTests/inspector/protocol/backend-dispatcher-argument-errors-expected.txt        2015-08-26 14:34:38 UTC (rev 188965)
</span><span class="lines">@@ -8,7 +8,7 @@
</span><span class="cx"> PASS: the reported error should be "InvalidParams" (-32602)
</span><span class="cx"> Actual error code: -32602
</span><span class="cx"> Actual error message: Some arguments of method 'Runtime.evaluate' can't be processed
</span><del>-Actual error data: 'params' object must contain required parameter 'expression' with type 'String'.
</del><ins>+Actual error data: [{"code":-32602,"message":"'params' object must contain required parameter 'expression' with type 'String'."},{"code":-32602,"message":"Some arguments of method 'Runtime.evaluate' can't be processed"}]
</ins><span class="cx">
</span><span class="cx"> -- Running test case: MissingRequiredParameter
</span><span class="cx"> Sending message: {"id":123,"method":"Runtime.evaluate","params":{"stuff":123}}
</span><span class="lines">@@ -16,7 +16,7 @@
</span><span class="cx"> PASS: the reported error should be "InvalidParams" (-32602)
</span><span class="cx"> Actual error code: -32602
</span><span class="cx"> Actual error message: Some arguments of method 'Runtime.evaluate' can't be processed
</span><del>-Actual error data: Parameter 'expression' with type 'String' was not found.
</del><ins>+Actual error data: [{"code":-32602,"message":"Parameter 'expression' with type 'String' was not found."},{"code":-32602,"message":"Some arguments of method 'Runtime.evaluate' can't be processed"}]
</ins><span class="cx">
</span><span class="cx"> -- Running test case: RequiredParameterWrongType
</span><span class="cx"> Sending message: {"id":123,"method":"Runtime.evaluate","params":{"expression":[]}}
</span><span class="lines">@@ -24,7 +24,7 @@
</span><span class="cx"> PASS: the reported error should be "InvalidParams" (-32602)
</span><span class="cx"> Actual error code: -32602
</span><span class="cx"> Actual error message: Some arguments of method 'Runtime.evaluate' can't be processed
</span><del>-Actual error data: Parameter 'expression' has wrong type. It must be 'String'.
</del><ins>+Actual error data: [{"code":-32602,"message":"Parameter 'expression' has wrong type. It must be 'String'."},{"code":-32602,"message":"Some arguments of method 'Runtime.evaluate' can't be processed"}]
</ins><span class="cx">
</span><span class="cx"> -- Running test case: OptionalParameterWrongType
</span><span class="cx"> Sending message: {"id":123,"method":"Runtime.evaluate","params":{"expression":"42","includeCommandLineAPI":123}}
</span><span class="lines">@@ -32,7 +32,7 @@
</span><span class="cx"> PASS: the reported error should be "InvalidParams" (-32602)
</span><span class="cx"> Actual error code: -32602
</span><span class="cx"> Actual error message: Some arguments of method 'Runtime.evaluate' can't be processed
</span><del>-Actual error data: Parameter 'includeCommandLineAPI' has wrong type. It must be 'Boolean'.
</del><ins>+Actual error data: [{"code":-32602,"message":"Parameter 'includeCommandLineAPI' has wrong type. It must be 'Boolean'."},{"code":-32602,"message":"Some arguments of method 'Runtime.evaluate' can't be processed"}]
</ins><span class="cx">
</span><span class="cx"> -- Running test case: TestErrorCodeForSyncServerError
</span><span class="cx"> Sending message: {"id":123,"method":"Database.getDatabaseTableNames","params":{"databaseId":"thisisNotADatabase"}}
</span><span class="lines">@@ -40,6 +40,7 @@
</span><span class="cx"> PASS: the reported error should be "ServerError" (-32000)
</span><span class="cx"> Actual error code: -32000
</span><span class="cx"> Actual error message: Database agent is not enabled
</span><ins>+Actual error data: [{"code":-32000,"message":"Database agent is not enabled"}]
</ins><span class="cx">
</span><span class="cx"> -- Running test case: TestErrorCodeForAsyncServerError
</span><span class="cx"> Sending message: {"id":123,"method":"Database.executeSQL","params":{"databaseId":"thisisNotADatabase","query":"asdf"}}
</span><span class="lines">@@ -47,6 +48,7 @@
</span><span class="cx"> PASS: the reported error should be "ServerError" (-32000)
</span><span class="cx"> Actual error code: -32000
</span><span class="cx"> Actual error message: Database agent is not enabled
</span><ins>+Actual error data: [{"code":-32000,"message":"Database agent is not enabled"}]
</ins><span class="cx">
</span><span class="cx"> -- Running test case: CommandWithBadArgumentValue
</span><span class="cx"> Sending message: {"id":123,"method":"Runtime.getProperties","params":{"objectId":"thisisNotAnId"}}
</span><span class="lines">@@ -54,4 +56,5 @@
</span><span class="cx"> PASS: the reported error should be "ServerError" (-32000)
</span><span class="cx"> Actual error code: -32000
</span><span class="cx"> Actual error message: Inspected frame has gone
</span><ins>+Actual error data: [{"code":-32000,"message":"Inspected frame has gone"}]
</ins><span class="cx">
</span></span></pre></div>
<a id="trunkLayoutTestsinspectorprotocolbackenddispatcherargumenterrorshtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/inspector/protocol/backend-dispatcher-argument-errors.html (188964 => 188965)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/inspector/protocol/backend-dispatcher-argument-errors.html        2015-08-26 10:24:30 UTC (rev 188964)
+++ trunk/LayoutTests/inspector/protocol/backend-dispatcher-argument-errors.html        2015-08-26 14:34:38 UTC (rev 188965)
</span><span class="lines">@@ -36,7 +36,7 @@
</span><span class="cx"> ProtocolTest.log("Actual error code: " + response.code);
</span><span class="cx"> ProtocolTest.log("Actual error message: " + response.message);
</span><span class="cx"> if (response.data)
</span><del>- ProtocolTest.log("Actual error data: " + response.data);
</del><ins>+ ProtocolTest.log("Actual error data: " + JSON.stringify(response.data));
</ins><span class="cx">
</span><span class="cx"> resolve();
</span><span class="cx"> })
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (188964 => 188965)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2015-08-26 10:24:30 UTC (rev 188964)
+++ trunk/Source/JavaScriptCore/ChangeLog        2015-08-26 14:34:38 UTC (rev 188965)
</span><span class="lines">@@ -1,3 +1,95 @@
</span><ins>+2015-08-25 Brian Burg <bburg@apple.com>
+
+ Web Inspector: no need to allocate protocolErrors array for every dispatched backend command
+ https://bugs.webkit.org/show_bug.cgi?id=146466
+
+ Reviewed by Joseph Pecoraro.
+
+ Clean up some of the backend dispatcher code, with a focus on eliminating useless allocations
+ of objects in the common case when no protocol errors happen. This is done by saving the
+ current id of each request as it is being processed by the backend dispatcher, and tagging any
+ subsequent errors with that id. This also means we don't have to thread the requestId except
+ in the async command code path.
+
+ This patch also lifts some common code shared between all generated backend command
+ implementatations into the per-domain dispatch method instead. This reduces generated code size.
+
+ To be consistent, this patch standardizes on calling the id of a backend message its 'requestId'.
+ Requests can be handled synchronously or asynchronously (triggered via the 'async' property).
+
+ No new tests, covered by existing protocol tests.
+
+ * inspector/InspectorBackendDispatcher.cpp:
+ (Inspector::BackendDispatcher::CallbackBase::CallbackBase): Split the two code paths for reporting
+ success and failure.
+
+ (Inspector::BackendDispatcher::CallbackBase::sendFailure):
+ (Inspector::BackendDispatcher::CallbackBase::sendSuccess): Renamed from sendIfActive.
+ (Inspector::BackendDispatcher::dispatch): Reset counters and current requestId before dispatching.
+ No need to manually thread the requestId to all reportProtocolError calls.
+
+ (Inspector::BackendDispatcher::hasProtocolErrors): Added.
+ (Inspector::BackendDispatcher::sendResponse):
+ (Inspector::BackendDispatcher::sendPendingErrors): Send any saved protocol errors to the frontend.
+ Always send a 'data' member with all of the errors, even if there's just one. We might want to add
+ more information about errors later.
+
+ (Inspector::BackendDispatcher::reportProtocolError): Enqueue a protocol error to be sent later.
+ (Inspector::BackendDispatcher::getPropertyValue): Remove useless type parameters and nuke most of
+ the type conversion methods. Use std::function types instead of function pointer types.
+
+ (Inspector::castToInteger): Added.
+ (Inspector::castToNumber): Added.
+ (Inspector::BackendDispatcher::getInteger):
+ (Inspector::BackendDispatcher::getDouble):
+ (Inspector::BackendDispatcher::getString):
+ (Inspector::BackendDispatcher::getBoolean):
+ (Inspector::BackendDispatcher::getObject):
+ (Inspector::BackendDispatcher::getArray):
+ (Inspector::BackendDispatcher::getValue):
+ (Inspector::getPropertyValue): Deleted.
+ (Inspector::AsMethodBridges::asInteger): Deleted.
+ (Inspector::AsMethodBridges::asDouble): Deleted.
+ (Inspector::AsMethodBridges::asString): Deleted.
+ (Inspector::AsMethodBridges::asBoolean): Deleted.
+ (Inspector::AsMethodBridges::asObject): Deleted.
+ (Inspector::AsMethodBridges::asArray): Deleted.
+ (Inspector::AsMethodBridges::asValue): Deleted.
+ * inspector/InspectorBackendDispatcher.h:
+ * inspector/scripts/codegen/cpp_generator_templates.py: Extract 'params' object in domain dispatch method.
+ Omit requestIds where possible. Convert dispatch tables to use NeverDestroyed. Check the protocol error count
+ to decide whether to abort the dispatch or not, rather than allocating our own errors array.
+
+ * inspector/scripts/codegen/cpp_generator_templates.py:
+ (void):
+ * inspector/scripts/codegen/generate_cpp_backend_dispatcher_header.py: Revert to passing RefPtr<InspectorObject>
+ since parameters are now being passed rather than the message object. Some commands do not require parameters.
+ * inspector/scripts/codegen/generate_cpp_backend_dispatcher_implementation.py:
+ (CppBackendDispatcherImplementationGenerator.generate_output):
+ (CppBackendDispatcherImplementationGenerator._generate_small_dispatcher_switch_implementation_for_domain):
+ (CppBackendDispatcherImplementationGenerator._generate_dispatcher_implementation_for_command):
+ * inspector/scripts/codegen/generate_objc_backend_dispatcher_header.py:
+ (ObjCBackendDispatcherHeaderGenerator._generate_objc_handler_declaration_for_command):
+ * inspector/scripts/codegen/generate_objc_backend_dispatcher_implementation.py:
+ (ObjCConfigurationImplementationGenerator._generate_handler_implementation_for_command):
+ (ObjCConfigurationImplementationGenerator._generate_success_block_for_command):
+ * inspector/scripts/codegen/objc_generator_templates.py:
+
+ Rebaseline some protocol generator tests.
+ * inspector/scripts/tests/expected/commands-with-async-attribute.json-result:
+ * inspector/scripts/tests/expected/commands-with-optional-call-return-parameters.json-result:
+ * inspector/scripts/tests/expected/domains-with-varying-command-sizes.json-result:
+ * inspector/scripts/tests/expected/enum-values.json-result:
+ * inspector/scripts/tests/expected/events-with-optional-parameters.json-result:
+ * inspector/scripts/tests/expected/generate-domains-with-feature-guards.json-result:
+ * inspector/scripts/tests/expected/same-type-id-different-domain.json-result:
+ * inspector/scripts/tests/expected/shadowed-optional-type-setters.json-result:
+ * inspector/scripts/tests/expected/type-declaration-aliased-primitive-type.json-result:
+ * inspector/scripts/tests/expected/type-declaration-array-type.json-result:
+ * inspector/scripts/tests/expected/type-declaration-enum-type.json-result:
+ * inspector/scripts/tests/expected/type-declaration-object-type.json-result:
+ * inspector/scripts/tests/expected/type-requiring-runtime-casts.json-result:
+
</ins><span class="cx"> 2015-08-25 Saam barati <sbarati@apple.com>
</span><span class="cx">
</span><span class="cx"> Lets rename codeOriginIndex to callSiteIndex and get rid of CallFrame::Location.
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorInspectorBackendDispatchercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/InspectorBackendDispatcher.cpp (188964 => 188965)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/InspectorBackendDispatcher.cpp        2015-08-26 10:24:30 UTC (rev 188964)
+++ trunk/Source/JavaScriptCore/inspector/InspectorBackendDispatcher.cpp        2015-08-26 14:34:38 UTC (rev 188965)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2013 Apple Inc. All Rights Reserved.
</del><ins>+ * Copyright (C) 2013, 2015 Apple Inc. All Rights Reserved.
</ins><span class="cx"> * Copyright (C) 2011 The Chromium Authors. All rights reserved.
</span><span class="cx"> *
</span><span class="cx"> * Redistribution and use in source and binary forms, with or without
</span><span class="lines">@@ -29,15 +29,15 @@
</span><span class="cx">
</span><span class="cx"> #include "InspectorFrontendChannel.h"
</span><span class="cx"> #include "InspectorValues.h"
</span><ins>+#include <wtf/TemporaryChange.h>
</ins><span class="cx"> #include <wtf/text/CString.h>
</span><span class="cx"> #include <wtf/text/WTFString.h>
</span><span class="cx">
</span><span class="cx"> namespace Inspector {
</span><span class="cx">
</span><del>-BackendDispatcher::CallbackBase::CallbackBase(Ref<BackendDispatcher>&& backendDispatcher, int id)
</del><ins>+BackendDispatcher::CallbackBase::CallbackBase(Ref<BackendDispatcher>&& backendDispatcher, long requestId)
</ins><span class="cx"> : m_backendDispatcher(WTF::move(backendDispatcher))
</span><del>- , m_id(id)
- , m_alreadySent(false)
</del><ins>+ , m_requestId(requestId)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -49,16 +49,24 @@
</span><span class="cx"> void BackendDispatcher::CallbackBase::sendFailure(const ErrorString& error)
</span><span class="cx"> {
</span><span class="cx"> ASSERT(error.length());
</span><del>- sendIfActive(nullptr, error);
</del><ins>+
+ if (m_alreadySent)
+ return;
+
+ m_alreadySent = true;
+
+ // Immediately send an error message since this is an async response with a single error.
+ m_backendDispatcher->reportProtocolError(m_requestId, ServerError, error);
+ m_backendDispatcher->sendPendingErrors();
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void BackendDispatcher::CallbackBase::sendIfActive(RefPtr<InspectorObject>&& partialMessage, const ErrorString& invocationError)
</del><ins>+void BackendDispatcher::CallbackBase::sendSuccess(RefPtr<InspectorObject>&& partialMessage)
</ins><span class="cx"> {
</span><span class="cx"> if (m_alreadySent)
</span><span class="cx"> return;
</span><span class="cx">
</span><del>- m_backendDispatcher->sendResponse(m_id, WTF::move(partialMessage), invocationError);
</del><span class="cx"> m_alreadySent = true;
</span><ins>+ m_backendDispatcher->sendResponse(m_requestId, WTF::move(partialMessage));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> Ref<BackendDispatcher> BackendDispatcher::create(FrontendChannel* frontendChannel)
</span><span class="lines">@@ -76,83 +84,94 @@
</span><span class="cx"> {
</span><span class="cx"> Ref<BackendDispatcher> protect(*this);
</span><span class="cx">
</span><ins>+ ASSERT(!m_protocolErrors.size());
+
</ins><span class="cx"> RefPtr<InspectorValue> parsedMessage;
</span><span class="cx"> if (!InspectorValue::parseJSON(message, parsedMessage)) {
</span><del>- reportProtocolError(nullptr, ParseError, ASCIILiteral("Message must be in JSON format"));
</del><ins>+ reportProtocolError(ParseError, ASCIILiteral("Message must be in JSON format"));
+ sendPendingErrors();
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> RefPtr<InspectorObject> messageObject;
</span><span class="cx"> if (!parsedMessage->asObject(messageObject)) {
</span><del>- reportProtocolError(nullptr, InvalidRequest, ASCIILiteral("Message must be a JSONified object"));
</del><ins>+ reportProtocolError(InvalidRequest, ASCIILiteral("Message must be a JSONified object"));
+ sendPendingErrors();
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx">
</span><del>- RefPtr<InspectorValue> callIdValue;
- if (!messageObject->getValue(ASCIILiteral("id"), callIdValue)) {
- reportProtocolError(nullptr, InvalidRequest, ASCIILiteral("'id' property was not found"));
</del><ins>+ RefPtr<InspectorValue> requestIdValue;
+ if (!messageObject->getValue(ASCIILiteral("id"), requestIdValue)) {
+ reportProtocolError(InvalidRequest, ASCIILiteral("'id' property was not found"));
+ sendPendingErrors();
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx">
</span><del>- long callId = 0;
- if (!callIdValue->asInteger(callId)) {
- reportProtocolError(nullptr, InvalidRequest, ASCIILiteral("The type of 'id' property must be integer"));
</del><ins>+ long requestId = 0;
+ if (!requestIdValue->asInteger(requestId)) {
+ reportProtocolError(InvalidRequest, ASCIILiteral("The type of 'id' property must be integer"));
+ sendPendingErrors();
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+ ASSERT(!m_currentRequestId);
+ TemporaryChange<Optional<long>> scopedRequestId(m_currentRequestId, requestId);
+
</ins><span class="cx"> RefPtr<InspectorValue> methodValue;
</span><span class="cx"> if (!messageObject->getValue(ASCIILiteral("method"), methodValue)) {
</span><del>- reportProtocolError(&callId, InvalidRequest, ASCIILiteral("'method' property wasn't found"));
</del><ins>+ reportProtocolError(InvalidRequest, ASCIILiteral("'method' property wasn't found"));
+ sendPendingErrors();
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> String methodString;
</span><span class="cx"> if (!methodValue->asString(methodString)) {
</span><del>- reportProtocolError(&callId, InvalidRequest, ASCIILiteral("The type of 'method' property must be string"));
</del><ins>+ reportProtocolError(InvalidRequest, ASCIILiteral("The type of 'method' property must be string"));
+ sendPendingErrors();
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> Vector<String> domainAndMethod;
</span><span class="cx"> methodString.split('.', true, domainAndMethod);
</span><span class="cx"> if (domainAndMethod.size() != 2 || !domainAndMethod[0].length() || !domainAndMethod[1].length()) {
</span><del>- reportProtocolError(&callId, InvalidRequest, ASCIILiteral("The 'method' property was formatted incorrectly. It should be 'Domain.method'"));
</del><ins>+ reportProtocolError(InvalidRequest, ASCIILiteral("The 'method' property was formatted incorrectly. It should be 'Domain.method'"));
+ sendPendingErrors();
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> String domain = domainAndMethod[0];
</span><span class="cx"> SupplementalBackendDispatcher* domainDispatcher = m_dispatchers.get(domain);
</span><span class="cx"> if (!domainDispatcher) {
</span><del>- reportProtocolError(&callId, MethodNotFound, "'" + domain + "' domain was not found");
</del><ins>+ reportProtocolError(MethodNotFound, "'" + domain + "' domain was not found");
+ sendPendingErrors();
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> String method = domainAndMethod[1];
</span><del>- domainDispatcher->dispatch(callId, method, messageObject.releaseNonNull());
</del><ins>+ domainDispatcher->dispatch(requestId, method, messageObject.releaseNonNull());
+
+ if (m_protocolErrors.size())
+ sendPendingErrors();
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void BackendDispatcher::sendResponse(long callId, RefPtr<InspectorObject>&& result, const ErrorString& invocationError)
</del><ins>+void BackendDispatcher::sendResponse(long requestId, RefPtr<InspectorObject>&& result)
</ins><span class="cx"> {
</span><span class="cx"> if (!m_frontendChannel)
</span><span class="cx"> return;
</span><span class="cx">
</span><del>- if (invocationError.length()) {
- reportProtocolError(&callId, ServerError, invocationError);
- return;
- }
</del><ins>+ ASSERT(!m_protocolErrors.size());
</ins><span class="cx">
</span><ins>+ // The JSON-RPC 2.0 specification requires that the "error" member have the value 'null'
+ // if no error occurred during an invocation, but we do not include it at all.
</ins><span class="cx"> Ref<InspectorObject> responseMessage = InspectorObject::create();
</span><span class="cx"> responseMessage->setObject(ASCIILiteral("result"), result);
</span><del>- responseMessage->setInteger(ASCIILiteral("id"), callId);
</del><ins>+ responseMessage->setInteger(ASCIILiteral("id"), requestId);
</ins><span class="cx"> m_frontendChannel->sendMessageToFrontend(responseMessage->toJSONString());
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void BackendDispatcher::reportProtocolError(const long* const callId, CommonErrorCode errorCode, const String& errorMessage) const
</del><ins>+void BackendDispatcher::sendPendingErrors()
</ins><span class="cx"> {
</span><del>- reportProtocolError(callId, errorCode, errorMessage, nullptr);
-}
-
-void BackendDispatcher::reportProtocolError(const long* const callId, CommonErrorCode errorCode, const String& errorMessage, RefPtr<Inspector::Protocol::Array<String>>&& data) const
-{
</del><ins>+ // These error codes are specified in JSON-RPC 2.0, Section 5.1.
</ins><span class="cx"> static const int errorCodes[] = {
</span><span class="cx"> -32700, // ParseError
</span><span class="cx"> -32600, // InvalidRequest
</span><span class="lines">@@ -162,33 +181,69 @@
</span><span class="cx"> -32000, // ServerError
</span><span class="cx"> };
</span><span class="cx">
</span><del>- ASSERT_ARG(errorCode, errorCode >= 0);
- ASSERT_ARG(errorCode, (unsigned)errorCode < WTF_ARRAY_LENGTH(errorCodes));
- ASSERT_ARG(errorCode, errorCodes[errorCode]);
-
</del><span class="cx"> if (!m_frontendChannel)
</span><span class="cx"> return;
</span><ins>+
+ // To construct the error object, only use the last error's code and message.
+ // Per JSON-RPC 2.0, Section 5.1, the 'data' member may contain nested errors,
+ // but only one top-level Error object should be sent per request.
+ CommonErrorCode errorCode;
+ String errorMessage;
+ Ref<InspectorArray> payload = InspectorArray::create();
+
+ for (auto& data : m_protocolErrors) {
+ errorCode = std::get<0>(data);
+ errorMessage = std::get<1>(data);
</ins><span class="cx">
</span><del>- Ref<InspectorObject> error = InspectorObject::create();
- error->setInteger(ASCIILiteral("code"), errorCodes[errorCode]);
- error->setString(ASCIILiteral("message"), errorMessage);
- if (data)
- error->setArray(ASCIILiteral("data"), WTF::move(data));
</del><ins>+ ASSERT_ARG(errorCode, (unsigned)errorCode < WTF_ARRAY_LENGTH(errorCodes));
+ ASSERT_ARG(errorCode, errorCodes[errorCode]);
</ins><span class="cx">
</span><ins>+ Ref<InspectorObject> error = InspectorObject::create();
+ error->setInteger(ASCIILiteral("code"), errorCodes[errorCode]);
+ error->setString(ASCIILiteral("message"), errorMessage);
+ payload->pushObject(WTF::move(error));
+ }
+
+ Ref<InspectorObject> topLevelError = InspectorObject::create();
+ topLevelError->setInteger(ASCIILiteral("code"), errorCodes[errorCode]);
+ topLevelError->setString(ASCIILiteral("message"), errorMessage);
+ topLevelError->setArray(ASCIILiteral("data"), WTF::move(payload));
+
</ins><span class="cx"> Ref<InspectorObject> message = InspectorObject::create();
</span><del>- message->setObject(ASCIILiteral("error"), WTF::move(error));
- if (callId)
- message->setInteger(ASCIILiteral("id"), *callId);
- else
</del><ins>+ message->setObject(ASCIILiteral("error"), WTF::move(topLevelError));
+ if (m_currentRequestId)
+ message->setInteger(ASCIILiteral("id"), m_currentRequestId.value());
+ else {
+ // The 'null' value for an unknown id is specified in JSON-RPC 2.0, Section 5.
</ins><span class="cx"> message->setValue(ASCIILiteral("id"), InspectorValue::null());
</span><ins>+ }
</ins><span class="cx">
</span><span class="cx"> m_frontendChannel->sendMessageToFrontend(message->toJSONString());
</span><ins>+
+ m_protocolErrors.clear();
+ m_currentRequestId = Nullopt;
</ins><span class="cx"> }
</span><ins>+
+void BackendDispatcher::reportProtocolError(CommonErrorCode errorCode, const String& errorMessage)
+{
+ reportProtocolError(m_currentRequestId, errorCode, errorMessage);
+}
</ins><span class="cx">
</span><del>-template<typename ReturnValueType, typename ValueType, typename DefaultValueType>
-static ReturnValueType getPropertyValue(InspectorObject* object, const String& name, bool* out_optionalValueFound, Inspector::Protocol::Array<String>& protocolErrors, DefaultValueType defaultValue, bool (*asMethod)(InspectorValue&, ValueType&), const char* typeName)
</del><ins>+void BackendDispatcher::reportProtocolError(Optional<long> relatedRequestId, CommonErrorCode errorCode, const String& errorMessage)
</ins><span class="cx"> {
</span><del>- ValueType result = defaultValue;
</del><ins>+ ASSERT_ARG(errorCode, errorCode >= 0);
+
+ // If the error was reported from an async callback, then no request id will be registered yet.
+ if (!m_currentRequestId)
+ m_currentRequestId = relatedRequestId;
+
+ m_protocolErrors.append(std::tuple<CommonErrorCode, String>(errorCode, errorMessage));
+}
+
+template<typename T>
+T BackendDispatcher::getPropertyValue(InspectorObject* object, const String& name, bool* out_optionalValueFound, T defaultValue, std::function<bool(InspectorValue&, T&)> asMethod, const char* typeName)
+{
+ T result(defaultValue);
</ins><span class="cx"> // out_optionalValueFound signals to the caller whether an optional property was found.
</span><span class="cx"> // if out_optionalValueFound == nullptr, then this is a required property.
</span><span class="cx"> if (out_optionalValueFound)
</span><span class="lines">@@ -196,19 +251,19 @@
</span><span class="cx">
</span><span class="cx"> if (!object) {
</span><span class="cx"> if (!out_optionalValueFound)
</span><del>- protocolErrors.addItem(String::format("'params' object must contain required parameter '%s' with type '%s'.", name.utf8().data(), typeName));
</del><ins>+ reportProtocolError(BackendDispatcher::InvalidParams, String::format("'params' object must contain required parameter '%s' with type '%s'.", name.utf8().data(), typeName));
</ins><span class="cx"> return result;
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> auto findResult = object->find(name);
</span><span class="cx"> if (findResult == object->end()) {
</span><span class="cx"> if (!out_optionalValueFound)
</span><del>- protocolErrors.addItem(String::format("Parameter '%s' with type '%s' was not found.", name.utf8().data(), typeName));
</del><ins>+ reportProtocolError(BackendDispatcher::InvalidParams, String::format("Parameter '%s' with type '%s' was not found.", name.utf8().data(), typeName));
</ins><span class="cx"> return result;
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> if (!asMethod(*findResult->value, result)) {
</span><del>- protocolErrors.addItem(String::format("Parameter '%s' has wrong type. It must be '%s'.", name.utf8().data(), typeName));
</del><ins>+ reportProtocolError(BackendDispatcher::InvalidParams, String::format("Parameter '%s' has wrong type. It must be '%s'.", name.utf8().data(), typeName));
</ins><span class="cx"> return result;
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -218,49 +273,42 @@
</span><span class="cx"> return result;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-struct AsMethodBridges {
- static bool asInteger(InspectorValue& value, int& output) { return value.asInteger(output); }
- static bool asDouble(InspectorValue& value, double& output) { return value.asDouble(output); }
- static bool asString(InspectorValue& value, String& output) { return value.asString(output); }
- static bool asBoolean(InspectorValue& value, bool& output) { return value.asBoolean(output); }
- static bool asObject(InspectorValue& value, RefPtr<InspectorObject>& output) { return value.asObject(output); }
- static bool asArray(InspectorValue& value, RefPtr<InspectorArray>& output) { return value.asArray(output); }
- static bool asValue(InspectorValue& value, RefPtr<InspectorValue>& output) { return value.asValue(output); }
-};
</del><ins>+static bool castToInteger(InspectorValue& value, int& result) { return value.asInteger(result); }
+static bool castToNumber(InspectorValue& value, double& result) { return value.asDouble(result); }
</ins><span class="cx">
</span><del>-int BackendDispatcher::getInteger(InspectorObject* object, const String& name, bool* valueFound, Inspector::Protocol::Array<String>& protocolErrors)
</del><ins>+int BackendDispatcher::getInteger(InspectorObject* object, const String& name, bool* valueFound)
</ins><span class="cx"> {
</span><del>- return getPropertyValue<int, int, int>(object, name, valueFound, protocolErrors, 0, AsMethodBridges::asInteger, "Integer");
</del><ins>+ return getPropertyValue<int>(object, name, valueFound, 0, &castToInteger, "Integer");
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-double BackendDispatcher::getDouble(InspectorObject* object, const String& name, bool* valueFound, Inspector::Protocol::Array<String>& protocolErrors)
</del><ins>+double BackendDispatcher::getDouble(InspectorObject* object, const String& name, bool* valueFound)
</ins><span class="cx"> {
</span><del>- return getPropertyValue<double, double, double>(object, name, valueFound, protocolErrors, 0, AsMethodBridges::asDouble, "Number");
</del><ins>+ return getPropertyValue<double>(object, name, valueFound, 0, &castToNumber, "Number");
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-String BackendDispatcher::getString(InspectorObject* object, const String& name, bool* valueFound, Inspector::Protocol::Array<String>& protocolErrors)
</del><ins>+String BackendDispatcher::getString(InspectorObject* object, const String& name, bool* valueFound)
</ins><span class="cx"> {
</span><del>- return getPropertyValue<String, String, String>(object, name, valueFound, protocolErrors, "", AsMethodBridges::asString, "String");
</del><ins>+ return getPropertyValue<String>(object, name, valueFound, "", &InspectorValue::asString, "String");
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-bool BackendDispatcher::getBoolean(InspectorObject* object, const String& name, bool* valueFound, Inspector::Protocol::Array<String>& protocolErrors)
</del><ins>+bool BackendDispatcher::getBoolean(InspectorObject* object, const String& name, bool* valueFound)
</ins><span class="cx"> {
</span><del>- return getPropertyValue<bool, bool, bool>(object, name, valueFound, protocolErrors, false, AsMethodBridges::asBoolean, "Boolean");
</del><ins>+ return getPropertyValue<bool>(object, name, valueFound, false, &InspectorValue::asBoolean, "Boolean");
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-RefPtr<InspectorObject> BackendDispatcher::getObject(InspectorObject* object, const String& name, bool* valueFound, Inspector::Protocol::Array<String>& protocolErrors)
</del><ins>+RefPtr<InspectorObject> BackendDispatcher::getObject(InspectorObject* object, const String& name, bool* valueFound)
</ins><span class="cx"> {
</span><del>- return getPropertyValue<RefPtr<InspectorObject>, RefPtr<InspectorObject>, InspectorObject*>(object, name, valueFound, protocolErrors, nullptr, AsMethodBridges::asObject, "Object");
</del><ins>+ return getPropertyValue<RefPtr<InspectorObject>>(object, name, valueFound, nullptr, &InspectorValue::asObject, "Object");
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-RefPtr<InspectorArray> BackendDispatcher::getArray(InspectorObject* object, const String& name, bool* valueFound, Inspector::Protocol::Array<String>& protocolErrors)
</del><ins>+RefPtr<InspectorArray> BackendDispatcher::getArray(InspectorObject* object, const String& name, bool* valueFound)
</ins><span class="cx"> {
</span><del>- return getPropertyValue<RefPtr<InspectorArray>, RefPtr<InspectorArray>, InspectorArray*>(object, name, valueFound, protocolErrors, nullptr, AsMethodBridges::asArray, "Array");
</del><ins>+ return getPropertyValue<RefPtr<InspectorArray>>(object, name, valueFound, nullptr, &InspectorValue::asArray, "Array");
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-RefPtr<InspectorValue> BackendDispatcher::getValue(InspectorObject* object, const String& name, bool* valueFound, Inspector::Protocol::Array<String>& protocolErrors)
</del><ins>+RefPtr<InspectorValue> BackendDispatcher::getValue(InspectorObject* object, const String& name, bool* valueFound)
</ins><span class="cx"> {
</span><del>- return getPropertyValue<RefPtr<InspectorValue>, RefPtr<InspectorValue>, InspectorValue*>(object, name, valueFound, protocolErrors, nullptr, AsMethodBridges::asValue, "Value");
</del><ins>+ return getPropertyValue<RefPtr<InspectorValue>>(object, name, valueFound, nullptr, &InspectorValue::asValue, "Value");
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> } // namespace Inspector
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorInspectorBackendDispatcherh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/InspectorBackendDispatcher.h (188964 => 188965)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/InspectorBackendDispatcher.h        2015-08-26 10:24:30 UTC (rev 188964)
+++ trunk/Source/JavaScriptCore/inspector/InspectorBackendDispatcher.h        2015-08-26 14:34:38 UTC (rev 188965)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2013 Apple Inc. All Rights Reserved.
</del><ins>+ * Copyright (C) 2013, 2015 Apple Inc. All Rights Reserved.
</ins><span class="cx"> * Copyright (C) 2011 The Chromium Authors. All rights reserved.
</span><span class="cx"> *
</span><span class="cx"> * Redistribution and use in source and binary forms, with or without
</span><span class="lines">@@ -28,6 +28,7 @@
</span><span class="cx"> #define InspectorBackendDispatcher_h
</span><span class="cx">
</span><span class="cx"> #include "InspectorProtocolTypes.h"
</span><ins>+#include <wtf/Optional.h>
</ins><span class="cx"> #include <wtf/RefCounted.h>
</span><span class="cx"> #include <wtf/text/WTFString.h>
</span><span class="cx">
</span><span class="lines">@@ -43,35 +44,36 @@
</span><span class="cx"> SupplementalBackendDispatcher(BackendDispatcher& backendDispatcher)
</span><span class="cx"> : m_backendDispatcher(backendDispatcher) { }
</span><span class="cx"> virtual ~SupplementalBackendDispatcher() { }
</span><del>- virtual void dispatch(long callId, const String& method, Ref<InspectorObject>&& message) = 0;
</del><ins>+ virtual void dispatch(long requestId, const String& method, Ref<InspectorObject>&& message) = 0;
</ins><span class="cx"> protected:
</span><span class="cx"> Ref<BackendDispatcher> m_backendDispatcher;
</span><span class="cx"> };
</span><span class="cx">
</span><del>-class JS_EXPORT_PRIVATE BackendDispatcher : public RefCounted<BackendDispatcher> {
</del><ins>+class BackendDispatcher : public RefCounted<BackendDispatcher> {
</ins><span class="cx"> public:
</span><del>- static Ref<BackendDispatcher> create(FrontendChannel*);
</del><ins>+ JS_EXPORT_PRIVATE static Ref<BackendDispatcher> create(FrontendChannel*);
</ins><span class="cx">
</span><span class="cx"> class JS_EXPORT_PRIVATE CallbackBase : public RefCounted<CallbackBase> {
</span><span class="cx"> public:
</span><del>- CallbackBase(Ref<BackendDispatcher>&&, int id);
</del><ins>+ CallbackBase(Ref<BackendDispatcher>&&, long requestId);
</ins><span class="cx">
</span><span class="cx"> bool isActive() const;
</span><del>- void sendFailure(const ErrorString&);
</del><span class="cx"> void disable() { m_alreadySent = true; }
</span><span class="cx">
</span><del>- protected:
- void sendIfActive(RefPtr<InspectorObject>&& partialMessage, const ErrorString& invocationError);
</del><ins>+ void sendSuccess(RefPtr<InspectorObject>&&);
+ void sendFailure(const ErrorString&);
</ins><span class="cx">
</span><span class="cx"> private:
</span><span class="cx"> Ref<BackendDispatcher> m_backendDispatcher;
</span><del>- int m_id;
- bool m_alreadySent;
</del><ins>+ long m_requestId;
+ bool m_alreadySent { false };
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> void clearFrontend() { m_frontendChannel = nullptr; }
</span><span class="cx"> bool isActive() const { return !!m_frontendChannel; }
</span><span class="cx">
</span><ins>+ bool hasProtocolErrors() const { return m_protocolErrors.size() > 0; }
+
</ins><span class="cx"> enum CommonErrorCode {
</span><span class="cx"> ParseError = 0,
</span><span class="cx"> InvalidRequest,
</span><span class="lines">@@ -82,25 +84,42 @@
</span><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> void registerDispatcherForDomain(const String& domain, SupplementalBackendDispatcher*);
</span><del>- void dispatch(const String& message);
- void sendResponse(long callId, RefPtr<InspectorObject>&& result, const ErrorString& invocationError);
- void reportProtocolError(const long* const callId, CommonErrorCode, const String& errorMessage) const;
- void reportProtocolError(const long* const callId, CommonErrorCode, const String& errorMessage, RefPtr<Inspector::Protocol::Array<String>>&& data) const;
</del><ins>+ JS_EXPORT_PRIVATE void dispatch(const String& message);
</ins><span class="cx">
</span><del>- static int getInteger(InspectorObject*, const String& name, bool* valueFound, Inspector::Protocol::Array<String>& protocolErrors);
- static double getDouble(InspectorObject*, const String& name, bool* valueFound, Inspector::Protocol::Array<String>& protocolErrors);
- static String getString(InspectorObject*, const String& name, bool* valueFound, Inspector::Protocol::Array<String>& protocolErrors);
- static bool getBoolean(InspectorObject*, const String& name, bool* valueFound, Inspector::Protocol::Array<String>& protocolErrors);
- static RefPtr<InspectorValue> getValue(InspectorObject*, const String& name, bool* valueFound, Inspector::Protocol::Array<String>& protocolErrors);
- static RefPtr<InspectorObject> getObject(InspectorObject*, const String& name, bool* valueFound, Inspector::Protocol::Array<String>& protocolErrors);
- static RefPtr<InspectorArray> getArray(InspectorObject*, const String& name, bool* valueFound, Inspector::Protocol::Array<String>& protocolErrors);
</del><ins>+ JS_EXPORT_PRIVATE void sendResponse(long requestId, RefPtr<InspectorObject>&& result);
+ JS_EXPORT_PRIVATE void sendPendingErrors();
</ins><span class="cx">
</span><ins>+ void reportProtocolError(CommonErrorCode, const String& errorMessage);
+ JS_EXPORT_PRIVATE void reportProtocolError(Optional<long> relatedRequestId, CommonErrorCode, const String& errorMessage);
+
+ template<typename T>
+ T getPropertyValue(InspectorObject*, const String& name, bool* out_optionalValueFound, T defaultValue, std::function<bool(InspectorValue&, T&)>, const char* typeName);
+
+ int getInteger(InspectorObject*, const String& name, bool* valueFound);
+ double getDouble(InspectorObject*, const String& name, bool* valueFound);
+ String getString(InspectorObject*, const String& name, bool* valueFound);
+ bool getBoolean(InspectorObject*, const String& name, bool* valueFound);
+ RefPtr<InspectorValue> getValue(InspectorObject*, const String& name, bool* valueFound);
+ RefPtr<InspectorObject> getObject(InspectorObject*, const String& name, bool* valueFound);
+ RefPtr<InspectorArray> getArray(InspectorObject*, const String& name, bool* valueFound);
+
</ins><span class="cx"> private:
</span><del>- BackendDispatcher(FrontendChannel* FrontendChannel)
- : m_frontendChannel(FrontendChannel) { }
</del><ins>+ BackendDispatcher(FrontendChannel* channel)
+ : m_frontendChannel(channel)
+ {
+ }
</ins><span class="cx">
</span><span class="cx"> FrontendChannel* m_frontendChannel;
</span><span class="cx"> HashMap<String, SupplementalBackendDispatcher*> m_dispatchers;
</span><ins>+
+ // Protocol errors reported for the top-level request being processed.
+ // If processing a request triggers async responses, then any related errors will
+ // be attributed to the top-level request, but generate separate error messages.
+ Vector<std::tuple<CommonErrorCode, String>> m_protocolErrors;
+
+ // For synchronously handled requests, avoid plumbing requestId through every
+ // call that could potentially fail with a protocol error.
+ Optional<long> m_currentRequestId { Nullopt };
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> } // namespace Inspector
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorscriptscodegencpp_generator_templatespy"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/scripts/codegen/cpp_generator_templates.py (188964 => 188965)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/scripts/codegen/cpp_generator_templates.py        2015-08-26 10:24:30 UTC (rev 188964)
+++ trunk/Source/JavaScriptCore/inspector/scripts/codegen/cpp_generator_templates.py        2015-08-26 14:34:38 UTC (rev 188965)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> #
</span><del>-# Copyright (c) 2014 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2014, 2015 Apple Inc. All rights reserved.
</ins><span class="cx"> # Copyright (c) 2014 University of Washington. All rights reserved.
</span><span class="cx"> #
</span><span class="cx"> # Redistribution and use in source and binary forms, with or without
</span><span class="lines">@@ -101,7 +101,7 @@
</span><span class="cx"> """${classAndExportMacro} ${domainName}BackendDispatcher final : public SupplementalBackendDispatcher {
</span><span class="cx"> public:
</span><span class="cx"> static Ref<${domainName}BackendDispatcher> create(BackendDispatcher*, ${domainName}BackendDispatcherHandler*);
</span><del>- virtual void dispatch(long callId, const String& method, Ref<InspectorObject>&& message) override;
</del><ins>+ virtual void dispatch(long requestId, const String& method, Ref<InspectorObject>&& message) override;
</ins><span class="cx"> ${commandDeclarations}
</span><span class="cx"> private:
</span><span class="cx"> ${domainName}BackendDispatcher(BackendDispatcher&, ${domainName}BackendDispatcherHandler*);
</span><span class="lines">@@ -123,24 +123,30 @@
</span><span class="cx"> virtual void ${commandName}(${inParameters}) = 0;""")
</span><span class="cx">
</span><span class="cx"> BackendDispatcherImplementationSmallSwitch = (
</span><del>- """void ${domainName}BackendDispatcher::dispatch(long callId, const String& method, Ref<InspectorObject>&& message)
</del><ins>+ """void ${domainName}BackendDispatcher::dispatch(long requestId, const String& method, Ref<InspectorObject>&& message)
</ins><span class="cx"> {
</span><span class="cx"> Ref<${domainName}BackendDispatcher> protect(*this);
</span><span class="cx">
</span><ins>+ RefPtr<InspectorObject> parameters;
+ message->getObject(ASCIILiteral("params"), parameters);
+
</ins><span class="cx"> ${dispatchCases}
</span><span class="cx"> else
</span><del>- m_backendDispatcher->reportProtocolError(&callId, BackendDispatcher::MethodNotFound, makeString('\\'', "${domainName}", '.', method, "' was not found"));
</del><ins>+ m_backendDispatcher->reportProtocolError(BackendDispatcher::MethodNotFound, makeString('\\'', "${domainName}", '.', method, "' was not found"));
</ins><span class="cx"> }""")
</span><span class="cx">
</span><span class="cx"> BackendDispatcherImplementationLargeSwitch = (
</span><del>-"""void ${domainName}BackendDispatcher::dispatch(long callId, const String& method, Ref<InspectorObject>&& message)
</del><ins>+"""void ${domainName}BackendDispatcher::dispatch(long requestId, const String& method, Ref<InspectorObject>&& message)
</ins><span class="cx"> {
</span><span class="cx"> Ref<${domainName}BackendDispatcher> protect(*this);
</span><span class="cx">
</span><del>- typedef void (${domainName}BackendDispatcher::*CallHandler)(long callId, const InspectorObject& message);
</del><ins>+ RefPtr<InspectorObject> parameters;
+ message->getObject(ASCIILiteral("params"), parameters);
+
+ typedef void (${domainName}BackendDispatcher::*CallHandler)(long requestId, RefPtr<InspectorObject>&& message);
</ins><span class="cx"> typedef HashMap<String, CallHandler> DispatchMap;
</span><del>- DEPRECATED_DEFINE_STATIC_LOCAL(DispatchMap, dispatchMap, ());
- if (dispatchMap.isEmpty()) {
</del><ins>+ static NeverDestroyed<DispatchMap> dispatchMap;
+ if (dispatchMap.get().isEmpty()) {
</ins><span class="cx"> static const struct MethodTable {
</span><span class="cx"> const char* name;
</span><span class="cx"> CallHandler handler;
</span><span class="lines">@@ -149,16 +155,16 @@
</span><span class="cx"> };
</span><span class="cx"> size_t length = WTF_ARRAY_LENGTH(commands);
</span><span class="cx"> for (size_t i = 0; i < length; ++i)
</span><del>- dispatchMap.add(commands[i].name, commands[i].handler);
</del><ins>+ dispatchMap.get().add(commands[i].name, commands[i].handler);
</ins><span class="cx"> }
</span><span class="cx">
</span><del>- HashMap<String, CallHandler>::iterator it = dispatchMap.find(method);
- if (it == dispatchMap.end()) {
- m_backendDispatcher->reportProtocolError(&callId, BackendDispatcher::MethodNotFound, makeString('\\'', "${domainName}", '.', method, "' was not found"));
</del><ins>+ auto findResult = dispatchMap.get().find(method);
+ if (findResult == dispatchMap.get().end()) {
+ m_backendDispatcher->reportProtocolError(BackendDispatcher::MethodNotFound, makeString('\\'', "${domainName}", '.', method, "' was not found"));
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx">
</span><del>- ((*this).*it->value)(callId, message.get());
</del><ins>+ ((*this).*findResult->value)(requestId, WTF::move(parameters));
</ins><span class="cx"> }""")
</span><span class="cx">
</span><span class="cx"> BackendDispatcherImplementationDomainConstructor = (
</span><span class="lines">@@ -178,13 +184,9 @@
</span><span class="cx"> }""")
</span><span class="cx">
</span><span class="cx"> BackendDispatcherImplementationPrepareCommandArguments = (
</span><del>-""" auto protocolErrors = Inspector::Protocol::Array<String>::create();
- RefPtr<InspectorObject> paramsContainer;
- message.getObject(ASCIILiteral("params"), paramsContainer);
-${inParameterDeclarations}
- if (protocolErrors->length()) {
- String errorMessage = String::format("Some arguments of method \'%s\' can't be processed", "${domainName}.${commandName}");
- m_backendDispatcher->reportProtocolError(&callId, BackendDispatcher::InvalidParams, errorMessage, WTF::move(protocolErrors));
</del><ins>+"""${inParameterDeclarations}
+ if (m_backendDispatcher->hasProtocolErrors()) {
+ m_backendDispatcher->reportProtocolError(BackendDispatcher::InvalidParams, String::format("Some arguments of method \'%s\' can't be processed", "${domainName}.${commandName}"));
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx"> """)
</span><span class="lines">@@ -196,7 +198,7 @@
</span><span class="cx"> {
</span><span class="cx"> Ref<InspectorObject> jsonMessage = InspectorObject::create();
</span><span class="cx"> ${outParameterAssignments}
</span><del>- sendIfActive(WTF::move(jsonMessage), ErrorString());
</del><ins>+ CallbackBase::sendSuccess(WTF::move(jsonMessage));
</ins><span class="cx"> }""")
</span><span class="cx">
</span><span class="cx"> FrontendDispatcherDomainDispatcherDeclaration = (
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorscriptscodegengenerate_cpp_backend_dispatcher_headerpy"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/scripts/codegen/generate_cpp_backend_dispatcher_header.py (188964 => 188965)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/scripts/codegen/generate_cpp_backend_dispatcher_header.py        2015-08-26 10:24:30 UTC (rev 188964)
+++ trunk/Source/JavaScriptCore/inspector/scripts/codegen/generate_cpp_backend_dispatcher_header.py        2015-08-26 14:34:38 UTC (rev 188965)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> #
</span><del>-# Copyright (c) 2014 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2014, 2015 Apple Inc. All rights reserved.
</ins><span class="cx"> # Copyright (c) 2014 University of Washington. All rights reserved.
</span><span class="cx"> #
</span><span class="cx"> # Redistribution and use in source and binary forms, with or without
</span><span class="lines">@@ -205,4 +205,4 @@
</span><span class="cx"> return self.wrap_with_guard_for_domain(domain, Template(CppTemplates.BackendDispatcherHeaderDomainDispatcherDeclaration).substitute(None, **handler_args))
</span><span class="cx">
</span><span class="cx"> def _generate_dispatcher_declaration_for_command(self, command):
</span><del>- return " void %s(long callId, const InspectorObject& message);" % command.command_name
</del><ins>+ return " void %s(long requestId, RefPtr<InspectorObject>&& parameters);" % command.command_name
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorscriptscodegengenerate_cpp_backend_dispatcher_implementationpy"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/scripts/codegen/generate_cpp_backend_dispatcher_implementation.py (188964 => 188965)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/scripts/codegen/generate_cpp_backend_dispatcher_implementation.py        2015-08-26 10:24:30 UTC (rev 188964)
+++ trunk/Source/JavaScriptCore/inspector/scripts/codegen/generate_cpp_backend_dispatcher_implementation.py        2015-08-26 14:34:38 UTC (rev 188965)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> #!/usr/bin/env python
</span><span class="cx"> #
</span><del>-# Copyright (c) 2014 Apple Inc. All rights reserved.
</del><ins>+# Copyright (c) 2014, 2015 Apple Inc. All rights reserved.
</ins><span class="cx"> # Copyright (c) 2014 University of Washington. All rights reserved.
</span><span class="cx"> #
</span><span class="cx"> # Redistribution and use in source and binary forms, with or without
</span><span class="lines">@@ -51,6 +51,7 @@
</span><span class="cx"> secondary_headers = [
</span><span class="cx"> '<inspector/InspectorFrontendChannel.h>',
</span><span class="cx"> '<inspector/InspectorValues.h>',
</span><ins>+ '<wtf/NeverDestroyed.h>',
</ins><span class="cx"> '<wtf/text/CString.h>']
</span><span class="cx">
</span><span class="cx"> secondary_includes = ['#include %s' % header for header in secondary_headers]
</span><span class="lines">@@ -104,10 +105,10 @@
</span><span class="cx"> def _generate_small_dispatcher_switch_implementation_for_domain(self, domain):
</span><span class="cx"> cases = []
</span><span class="cx"> cases.append(' if (method == "%s")' % domain.commands[0].command_name)
</span><del>- cases.append(' %s(callId, message);' % domain.commands[0].command_name)
</del><ins>+ cases.append(' %s(requestId, WTF::move(parameters));' % domain.commands[0].command_name)
</ins><span class="cx"> for command in domain.commands[1:]:
</span><span class="cx"> cases.append(' else if (method == "%s")' % command.command_name)
</span><del>- cases.append(' %s(callId, message);' % command.command_name)
</del><ins>+ cases.append(' %s(requestId, WTF::move(parameters));' % command.command_name)
</ins><span class="cx">
</span><span class="cx"> switch_args = {
</span><span class="cx"> 'domainName': domain.domain_name,
</span><span class="lines">@@ -170,7 +171,7 @@
</span><span class="cx"> in_parameter_declarations = []
</span><span class="cx"> out_parameter_declarations = []
</span><span class="cx"> out_parameter_assignments = []
</span><del>- alternate_dispatcher_method_parameters = ['callId']
</del><ins>+ alternate_dispatcher_method_parameters = ['requestId']
</ins><span class="cx"> method_parameters = ['error']
</span><span class="cx">
</span><span class="cx"> for parameter in command.call_parameters:
</span><span class="lines">@@ -207,7 +208,7 @@
</span><span class="cx"> 'successOutParam': out_success_argument
</span><span class="cx"> }
</span><span class="cx">
</span><del>- in_parameter_declarations.append(' %(parameterType)s %(parameterName)s = BackendDispatcher::%(keyedGetMethod)s(paramsContainer.get(), ASCIILiteral("%(parameterKey)s"), %(successOutParam)s, protocolErrors.get());' % param_args)
</del><ins>+ in_parameter_declarations.append(' %(parameterType)s %(parameterName)s = m_backendDispatcher->%(keyedGetMethod)s(parameters.get(), ASCIILiteral("%(parameterKey)s"), %(successOutParam)s);' % param_args)
</ins><span class="cx">
</span><span class="cx"> if parameter.is_optional:
</span><span class="cx"> optional_in_parameter_string = '%(parameterName)s_valueFound ? %(parameterExpression)s : nullptr' % param_args
</span><span class="lines">@@ -224,7 +225,7 @@
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> out_parameter_assignments.append(' callback->disable();')
</span><del>- out_parameter_assignments.append(' m_backendDispatcher->reportProtocolError(&callId, BackendDispatcher::ServerError, error);')
</del><ins>+ out_parameter_assignments.append(' m_backendDispatcher->reportProtocolError(BackendDispatcher::ServerError, error);')
</ins><span class="cx"> out_parameter_assignments.append(' return;')
</span><span class="cx"> method_parameters.append('callback.copyRef()')
</span><span class="cx">
</span><span class="lines">@@ -267,9 +268,9 @@
</span><span class="cx">
</span><span class="cx"> lines = []
</span><span class="cx"> if len(command.call_parameters) == 0:
</span><del>- lines.append('void %(domainName)sBackendDispatcher::%(commandName)s(long callId, const InspectorObject&)' % command_args)
</del><ins>+ lines.append('void %(domainName)sBackendDispatcher::%(commandName)s(long requestId, RefPtr<InspectorObject>&&)' % command_args)
</ins><span class="cx"> else:
</span><del>- lines.append('void %(domainName)sBackendDispatcher::%(commandName)s(long callId, const InspectorObject& message)' % command_args)
</del><ins>+ lines.append('void %(domainName)sBackendDispatcher::%(commandName)s(long requestId, RefPtr<InspectorObject>&& parameters)' % command_args)
</ins><span class="cx"> lines.append('{')
</span><span class="cx">
</span><span class="cx"> if len(command.call_parameters) > 0:
</span><span class="lines">@@ -286,7 +287,7 @@
</span><span class="cx"> lines.append(' ErrorString error;')
</span><span class="cx"> lines.append(' Ref<InspectorObject> result = InspectorObject::create();')
</span><span class="cx"> if command.is_async:
</span><del>- lines.append(' Ref<%(domainName)sBackendDispatcherHandler::%(callbackName)s> callback = adoptRef(*new %(domainName)sBackendDispatcherHandler::%(callbackName)s(m_backendDispatcher.copyRef(), callId));' % command_args)
</del><ins>+ lines.append(' Ref<%(domainName)sBackendDispatcherHandler::%(callbackName)s> callback = adoptRef(*new %(domainName)sBackendDispatcherHandler::%(callbackName)s(m_backendDispatcher.copyRef(), requestId));' % command_args)
</ins><span class="cx"> if len(command.return_parameters) > 0:
</span><span class="cx"> lines.extend(out_parameter_declarations)
</span><span class="cx"> lines.append(' m_agent->%(commandName)s(%(invocationParameters)s);' % command_args)
</span><span class="lines">@@ -305,6 +306,9 @@
</span><span class="cx"> lines.append('')
</span><span class="cx">
</span><span class="cx"> if not command.is_async:
</span><del>- lines.append(' m_backendDispatcher->sendResponse(callId, WTF::move(result), error);')
</del><ins>+ lines.append(' if (!error.length())')
+ lines.append(' m_backendDispatcher->sendResponse(requestId, WTF::move(result));')
+ lines.append(' else')
+ lines.append(' m_backendDispatcher->reportProtocolError(BackendDispatcher::ServerError, WTF::move(error));')
</ins><span class="cx"> lines.append('}')
</span><span class="cx"> return "\n".join(lines)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorscriptscodegengenerate_objc_backend_dispatcher_headerpy"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/scripts/codegen/generate_objc_backend_dispatcher_header.py (188964 => 188965)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/scripts/codegen/generate_objc_backend_dispatcher_header.py        2015-08-26 10:24:30 UTC (rev 188964)
+++ trunk/Source/JavaScriptCore/inspector/scripts/codegen/generate_objc_backend_dispatcher_header.py        2015-08-26 14:34:38 UTC (rev 188965)
</span><span class="lines">@@ -94,7 +94,7 @@
</span><span class="cx">
</span><span class="cx"> def _generate_objc_handler_declaration_for_command(self, command):
</span><span class="cx"> lines = []
</span><del>- parameters = ['long callId']
</del><ins>+ parameters = ['long requestId']
</ins><span class="cx"> for _parameter in command.call_parameters:
</span><span class="cx"> parameters.append('%s in_%s' % (CppGenerator.cpp_type_for_unchecked_formal_in_parameter(_parameter), _parameter.parameter_name))
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorscriptscodegengenerate_objc_backend_dispatcher_implementationpy"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/scripts/codegen/generate_objc_backend_dispatcher_implementation.py (188964 => 188965)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/scripts/codegen/generate_objc_backend_dispatcher_implementation.py        2015-08-26 10:24:30 UTC (rev 188964)
+++ trunk/Source/JavaScriptCore/inspector/scripts/codegen/generate_objc_backend_dispatcher_implementation.py        2015-08-26 14:34:38 UTC (rev 188965)
</span><span class="lines">@@ -82,7 +82,7 @@
</span><span class="cx">
</span><span class="cx"> def _generate_handler_implementation_for_command(self, domain, command):
</span><span class="cx"> lines = []
</span><del>- parameters = ['long callId']
</del><ins>+ parameters = ['long requestId']
</ins><span class="cx"> for parameter in command.call_parameters:
</span><span class="cx"> parameters.append('%s in_%s' % (CppGenerator.cpp_type_for_unchecked_formal_in_parameter(parameter), parameter.parameter_name))
</span><span class="cx">
</span><span class="lines">@@ -139,9 +139,9 @@
</span><span class="cx"> else:
</span><span class="cx"> lines.append(' if (%s)' % var_name)
</span><span class="cx"> lines.append(' resultObject->%s(ASCIILiteral("%s"), %s);' % (keyed_set_method, parameter.parameter_name, export_expression))
</span><del>- lines.append(' backendDispatcher()->sendResponse(callId, WTF::move(resultObject), String());')
</del><ins>+ lines.append(' backendDispatcher()->sendResponse(requestId, WTF::move(resultObject));')
</ins><span class="cx"> else:
</span><del>- lines.append(' backendDispatcher()->sendResponse(callId, InspectorObject::create(), String());')
</del><ins>+ lines.append(' backendDispatcher()->sendResponse(requestId, InspectorObject::create());')
</ins><span class="cx">
</span><span class="cx"> lines.append(' };')
</span><span class="cx"> return '\n'.join(lines)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorscriptscodegenobjc_generator_templatespy"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/scripts/codegen/objc_generator_templates.py (188964 => 188965)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/scripts/codegen/objc_generator_templates.py        2015-08-26 10:24:30 UTC (rev 188964)
+++ trunk/Source/JavaScriptCore/inspector/scripts/codegen/objc_generator_templates.py        2015-08-26 14:34:38 UTC (rev 188965)
</span><span class="lines">@@ -112,7 +112,8 @@
</span><span class="cx"> """void ObjCInspector${domainName}BackendDispatcher::${commandName}(${parameters})
</span><span class="cx"> {
</span><span class="cx"> id errorCallback = ^(NSString *error) {
</span><del>- backendDispatcher()->sendResponse(callId, InspectorObject::create(), error);
</del><ins>+ backendDispatcher()->reportProtocolError(requestId, BackendDispatcher::ServerError, error);
+ backendDispatcher()->sendPendingErrors();
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> ${successCallback}
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorscriptstestsexpectedcommandswithasyncattributejsonresult"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/commands-with-async-attribute.json-result (188964 => 188965)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/commands-with-async-attribute.json-result        2015-08-26 10:24:30 UTC (rev 188964)
+++ trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/commands-with-async-attribute.json-result        2015-08-26 14:34:38 UTC (rev 188965)
</span><span class="lines">@@ -187,12 +187,12 @@
</span><span class="cx"> class DatabaseBackendDispatcher final : public SupplementalBackendDispatcher {
</span><span class="cx"> public:
</span><span class="cx"> static Ref<DatabaseBackendDispatcher> create(BackendDispatcher*, DatabaseBackendDispatcherHandler*);
</span><del>- virtual void dispatch(long callId, const String& method, Ref<InspectorObject>&& message) override;
</del><ins>+ virtual void dispatch(long requestId, const String& method, Ref<InspectorObject>&& message) override;
</ins><span class="cx"> private:
</span><del>- void executeSQLSyncOptionalReturnValues(long callId, const InspectorObject& message);
- void executeSQLAsyncOptionalReturnValues(long callId, const InspectorObject& message);
- void executeSQLSync(long callId, const InspectorObject& message);
- void executeSQLAsync(long callId, const InspectorObject& message);
</del><ins>+ void executeSQLSyncOptionalReturnValues(long requestId, RefPtr<InspectorObject>&& parameters);
+ void executeSQLAsyncOptionalReturnValues(long requestId, RefPtr<InspectorObject>&& parameters);
+ void executeSQLSync(long requestId, RefPtr<InspectorObject>&& parameters);
+ void executeSQLAsync(long requestId, RefPtr<InspectorObject>&& parameters);
</ins><span class="cx"> private:
</span><span class="cx"> DatabaseBackendDispatcher(BackendDispatcher&, DatabaseBackendDispatcherHandler*);
</span><span class="cx"> DatabaseBackendDispatcherHandler* m_agent;
</span><span class="lines">@@ -245,6 +245,7 @@
</span><span class="cx">
</span><span class="cx"> #include <inspector/InspectorFrontendChannel.h>
</span><span class="cx"> #include <inspector/InspectorValues.h>
</span><ins>+#include <wtf/NeverDestroyed.h>
</ins><span class="cx"> #include <wtf/text/CString.h>
</span><span class="cx">
</span><span class="cx"> #if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS)
</span><span class="lines">@@ -270,38 +271,37 @@
</span><span class="cx"> m_backendDispatcher->registerDispatcherForDomain(ASCIILiteral("Database"), this);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void DatabaseBackendDispatcher::dispatch(long callId, const String& method, Ref<InspectorObject>&& message)
</del><ins>+void DatabaseBackendDispatcher::dispatch(long requestId, const String& method, Ref<InspectorObject>&& message)
</ins><span class="cx"> {
</span><span class="cx"> Ref<DatabaseBackendDispatcher> protect(*this);
</span><span class="cx">
</span><ins>+ RefPtr<InspectorObject> parameters;
+ message->getObject(ASCIILiteral("params"), parameters);
+
</ins><span class="cx"> if (method == "executeSQLSyncOptionalReturnValues")
</span><del>- executeSQLSyncOptionalReturnValues(callId, message);
</del><ins>+ executeSQLSyncOptionalReturnValues(requestId, WTF::move(parameters));
</ins><span class="cx"> else if (method == "executeSQLAsyncOptionalReturnValues")
</span><del>- executeSQLAsyncOptionalReturnValues(callId, message);
</del><ins>+ executeSQLAsyncOptionalReturnValues(requestId, WTF::move(parameters));
</ins><span class="cx"> else if (method == "executeSQLSync")
</span><del>- executeSQLSync(callId, message);
</del><ins>+ executeSQLSync(requestId, WTF::move(parameters));
</ins><span class="cx"> else if (method == "executeSQLAsync")
</span><del>- executeSQLAsync(callId, message);
</del><ins>+ executeSQLAsync(requestId, WTF::move(parameters));
</ins><span class="cx"> else
</span><del>- m_backendDispatcher->reportProtocolError(&callId, BackendDispatcher::MethodNotFound, makeString('\'', "Database", '.', method, "' was not found"));
</del><ins>+ m_backendDispatcher->reportProtocolError(BackendDispatcher::MethodNotFound, makeString('\'', "Database", '.', method, "' was not found"));
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void DatabaseBackendDispatcher::executeSQLSyncOptionalReturnValues(long callId, const InspectorObject& message)
</del><ins>+void DatabaseBackendDispatcher::executeSQLSyncOptionalReturnValues(long requestId, RefPtr<InspectorObject>&& parameters)
</ins><span class="cx"> {
</span><del>- auto protocolErrors = Inspector::Protocol::Array<String>::create();
- RefPtr<InspectorObject> paramsContainer;
- message.getObject(ASCIILiteral("params"), paramsContainer);
- int in_databaseId = BackendDispatcher::getInteger(paramsContainer.get(), ASCIILiteral("databaseId"), nullptr, protocolErrors.get());
- String in_query = BackendDispatcher::getString(paramsContainer.get(), ASCIILiteral("query"), nullptr, protocolErrors.get());
- if (protocolErrors->length()) {
- String errorMessage = String::format("Some arguments of method '%s' can't be processed", "Database.executeSQLSyncOptionalReturnValues");
- m_backendDispatcher->reportProtocolError(&callId, BackendDispatcher::InvalidParams, errorMessage, WTF::move(protocolErrors));
</del><ins>+ int in_databaseId = m_backendDispatcher->getInteger(parameters.get(), ASCIILiteral("databaseId"), nullptr);
+ String in_query = m_backendDispatcher->getString(parameters.get(), ASCIILiteral("query"), nullptr);
+ if (m_backendDispatcher->hasProtocolErrors()) {
+ m_backendDispatcher->reportProtocolError(BackendDispatcher::InvalidParams, String::format("Some arguments of method '%s' can't be processed", "Database.executeSQLSyncOptionalReturnValues"));
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> #if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS)
</span><span class="cx"> if (m_alternateDispatcher) {
</span><del>- m_alternateDispatcher->executeSQLSyncOptionalReturnValues(callId, in_databaseId, in_query);
</del><ins>+ m_alternateDispatcher->executeSQLSyncOptionalReturnValues(requestId, in_databaseId, in_query);
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="lines">@@ -342,7 +342,10 @@
</span><span class="cx"> if (out_printColor.isAssigned())
</span><span class="cx"> result->setString(ASCIILiteral("printColor"), out_printColor.getValue());
</span><span class="cx"> }
</span><del>- m_backendDispatcher->sendResponse(callId, WTF::move(result), error);
</del><ins>+ if (!error.length())
+ m_backendDispatcher->sendResponse(requestId, WTF::move(result));
+ else
+ m_backendDispatcher->reportProtocolError(BackendDispatcher::ServerError, WTF::move(error));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> DatabaseBackendDispatcherHandler::ExecuteSQLAsyncOptionalReturnValuesCallback::ExecuteSQLAsyncOptionalReturnValuesCallback(Ref<BackendDispatcher>&& backendDispatcher, int id) : BackendDispatcher::CallbackBase(WTF::move(backendDispatcher), id) { }
</span><span class="lines">@@ -370,57 +373,49 @@
</span><span class="cx"> jsonMessage->setArray(ASCIILiteral("alternateColors"), alternateColors);
</span><span class="cx"> if (printColor.isAssigned())
</span><span class="cx"> jsonMessage->setString(ASCIILiteral("printColor"), printColor.getValue());
</span><del>- sendIfActive(WTF::move(jsonMessage), ErrorString());
</del><ins>+ CallbackBase::sendSuccess(WTF::move(jsonMessage));
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void DatabaseBackendDispatcher::executeSQLAsyncOptionalReturnValues(long callId, const InspectorObject& message)
</del><ins>+void DatabaseBackendDispatcher::executeSQLAsyncOptionalReturnValues(long requestId, RefPtr<InspectorObject>&& parameters)
</ins><span class="cx"> {
</span><del>- auto protocolErrors = Inspector::Protocol::Array<String>::create();
- RefPtr<InspectorObject> paramsContainer;
- message.getObject(ASCIILiteral("params"), paramsContainer);
- int in_databaseId = BackendDispatcher::getInteger(paramsContainer.get(), ASCIILiteral("databaseId"), nullptr, protocolErrors.get());
- String in_query = BackendDispatcher::getString(paramsContainer.get(), ASCIILiteral("query"), nullptr, protocolErrors.get());
- if (protocolErrors->length()) {
- String errorMessage = String::format("Some arguments of method '%s' can't be processed", "Database.executeSQLAsyncOptionalReturnValues");
- m_backendDispatcher->reportProtocolError(&callId, BackendDispatcher::InvalidParams, errorMessage, WTF::move(protocolErrors));
</del><ins>+ int in_databaseId = m_backendDispatcher->getInteger(parameters.get(), ASCIILiteral("databaseId"), nullptr);
+ String in_query = m_backendDispatcher->getString(parameters.get(), ASCIILiteral("query"), nullptr);
+ if (m_backendDispatcher->hasProtocolErrors()) {
+ m_backendDispatcher->reportProtocolError(BackendDispatcher::InvalidParams, String::format("Some arguments of method '%s' can't be processed", "Database.executeSQLAsyncOptionalReturnValues"));
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> #if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS)
</span><span class="cx"> if (m_alternateDispatcher) {
</span><del>- m_alternateDispatcher->executeSQLAsyncOptionalReturnValues(callId, in_databaseId, in_query);
</del><ins>+ m_alternateDispatcher->executeSQLAsyncOptionalReturnValues(requestId, in_databaseId, in_query);
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx">
</span><span class="cx"> ErrorString error;
</span><span class="cx"> Ref<InspectorObject> result = InspectorObject::create();
</span><del>- Ref<DatabaseBackendDispatcherHandler::ExecuteSQLAsyncOptionalReturnValuesCallback> callback = adoptRef(*new DatabaseBackendDispatcherHandler::ExecuteSQLAsyncOptionalReturnValuesCallback(m_backendDispatcher.copyRef(), callId));
</del><ins>+ Ref<DatabaseBackendDispatcherHandler::ExecuteSQLAsyncOptionalReturnValuesCallback> callback = adoptRef(*new DatabaseBackendDispatcherHandler::ExecuteSQLAsyncOptionalReturnValuesCallback(m_backendDispatcher.copyRef(), requestId));
</ins><span class="cx"> m_agent->executeSQLAsyncOptionalReturnValues(error, in_databaseId, in_query, callback.copyRef());
</span><span class="cx">
</span><span class="cx"> if (error.length()) {
</span><span class="cx"> callback->disable();
</span><del>- m_backendDispatcher->reportProtocolError(&callId, BackendDispatcher::ServerError, error);
</del><ins>+ m_backendDispatcher->reportProtocolError(BackendDispatcher::ServerError, error);
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void DatabaseBackendDispatcher::executeSQLSync(long callId, const InspectorObject& message)
</del><ins>+void DatabaseBackendDispatcher::executeSQLSync(long requestId, RefPtr<InspectorObject>&& parameters)
</ins><span class="cx"> {
</span><del>- auto protocolErrors = Inspector::Protocol::Array<String>::create();
- RefPtr<InspectorObject> paramsContainer;
- message.getObject(ASCIILiteral("params"), paramsContainer);
- int in_databaseId = BackendDispatcher::getInteger(paramsContainer.get(), ASCIILiteral("databaseId"), nullptr, protocolErrors.get());
- String in_query = BackendDispatcher::getString(paramsContainer.get(), ASCIILiteral("query"), nullptr, protocolErrors.get());
- if (protocolErrors->length()) {
- String errorMessage = String::format("Some arguments of method '%s' can't be processed", "Database.executeSQLSync");
- m_backendDispatcher->reportProtocolError(&callId, BackendDispatcher::InvalidParams, errorMessage, WTF::move(protocolErrors));
</del><ins>+ int in_databaseId = m_backendDispatcher->getInteger(parameters.get(), ASCIILiteral("databaseId"), nullptr);
+ String in_query = m_backendDispatcher->getString(parameters.get(), ASCIILiteral("query"), nullptr);
+ if (m_backendDispatcher->hasProtocolErrors()) {
+ m_backendDispatcher->reportProtocolError(BackendDispatcher::InvalidParams, String::format("Some arguments of method '%s' can't be processed", "Database.executeSQLSync"));
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> #if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS)
</span><span class="cx"> if (m_alternateDispatcher) {
</span><del>- m_alternateDispatcher->executeSQLSync(callId, in_databaseId, in_query);
</del><ins>+ m_alternateDispatcher->executeSQLSync(requestId, in_databaseId, in_query);
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="lines">@@ -451,7 +446,10 @@
</span><span class="cx"> result->setString(ASCIILiteral("screenColor"), Inspector::Protocol::getEnumConstantValue(out_screenColor));
</span><span class="cx"> result->setString(ASCIILiteral("printColor"), Inspector::Protocol::getEnumConstantValue(out_printColor));
</span><span class="cx"> }
</span><del>- m_backendDispatcher->sendResponse(callId, WTF::move(result), error);
</del><ins>+ if (!error.length())
+ m_backendDispatcher->sendResponse(requestId, WTF::move(result));
+ else
+ m_backendDispatcher->reportProtocolError(BackendDispatcher::ServerError, WTF::move(error));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> DatabaseBackendDispatcherHandler::ExecuteSQLAsyncCallback::ExecuteSQLAsyncCallback(Ref<BackendDispatcher>&& backendDispatcher, int id) : BackendDispatcher::CallbackBase(WTF::move(backendDispatcher), id) { }
</span><span class="lines">@@ -469,37 +467,33 @@
</span><span class="cx"> jsonMessage->setString(ASCIILiteral("screenColor"), Inspector::Protocol::getEnumConstantValue(screenColor));
</span><span class="cx"> jsonMessage->setArray(ASCIILiteral("alternateColors"), alternateColors);
</span><span class="cx"> jsonMessage->setString(ASCIILiteral("printColor"), Inspector::Protocol::getEnumConstantValue(printColor));
</span><del>- sendIfActive(WTF::move(jsonMessage), ErrorString());
</del><ins>+ CallbackBase::sendSuccess(WTF::move(jsonMessage));
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void DatabaseBackendDispatcher::executeSQLAsync(long callId, const InspectorObject& message)
</del><ins>+void DatabaseBackendDispatcher::executeSQLAsync(long requestId, RefPtr<InspectorObject>&& parameters)
</ins><span class="cx"> {
</span><del>- auto protocolErrors = Inspector::Protocol::Array<String>::create();
- RefPtr<InspectorObject> paramsContainer;
- message.getObject(ASCIILiteral("params"), paramsContainer);
- int in_databaseId = BackendDispatcher::getInteger(paramsContainer.get(), ASCIILiteral("databaseId"), nullptr, protocolErrors.get());
- String in_query = BackendDispatcher::getString(paramsContainer.get(), ASCIILiteral("query"), nullptr, protocolErrors.get());
- if (protocolErrors->length()) {
- String errorMessage = String::format("Some arguments of method '%s' can't be processed", "Database.executeSQLAsync");
- m_backendDispatcher->reportProtocolError(&callId, BackendDispatcher::InvalidParams, errorMessage, WTF::move(protocolErrors));
</del><ins>+ int in_databaseId = m_backendDispatcher->getInteger(parameters.get(), ASCIILiteral("databaseId"), nullptr);
+ String in_query = m_backendDispatcher->getString(parameters.get(), ASCIILiteral("query"), nullptr);
+ if (m_backendDispatcher->hasProtocolErrors()) {
+ m_backendDispatcher->reportProtocolError(BackendDispatcher::InvalidParams, String::format("Some arguments of method '%s' can't be processed", "Database.executeSQLAsync"));
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> #if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS)
</span><span class="cx"> if (m_alternateDispatcher) {
</span><del>- m_alternateDispatcher->executeSQLAsync(callId, in_databaseId, in_query);
</del><ins>+ m_alternateDispatcher->executeSQLAsync(requestId, in_databaseId, in_query);
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx">
</span><span class="cx"> ErrorString error;
</span><span class="cx"> Ref<InspectorObject> result = InspectorObject::create();
</span><del>- Ref<DatabaseBackendDispatcherHandler::ExecuteSQLAsyncCallback> callback = adoptRef(*new DatabaseBackendDispatcherHandler::ExecuteSQLAsyncCallback(m_backendDispatcher.copyRef(), callId));
</del><ins>+ Ref<DatabaseBackendDispatcherHandler::ExecuteSQLAsyncCallback> callback = adoptRef(*new DatabaseBackendDispatcherHandler::ExecuteSQLAsyncCallback(m_backendDispatcher.copyRef(), requestId));
</ins><span class="cx"> m_agent->executeSQLAsync(error, in_databaseId, in_query, callback.copyRef());
</span><span class="cx">
</span><span class="cx"> if (error.length()) {
</span><span class="cx"> callback->disable();
</span><del>- m_backendDispatcher->reportProtocolError(&callId, BackendDispatcher::ServerError, error);
</del><ins>+ m_backendDispatcher->reportProtocolError(BackendDispatcher::ServerError, error);
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx"> }
</span><span class="lines">@@ -851,10 +845,10 @@
</span><span class="cx"> class ObjCInspectorDatabaseBackendDispatcher final : public AlternateDatabaseBackendDispatcher {
</span><span class="cx"> public:
</span><span class="cx"> ObjCInspectorDatabaseBackendDispatcher(id<RWIProtocolDatabaseDomainHandler> handler) { m_delegate = handler; }
</span><del>- virtual void executeSQLSyncOptionalReturnValues(long callId, int in_databaseId, const String& in_query) override;
- virtual void executeSQLAsyncOptionalReturnValues(long callId, int in_databaseId, const String& in_query) override;
- virtual void executeSQLSync(long callId, int in_databaseId, const String& in_query) override;
- virtual void executeSQLAsync(long callId, int in_databaseId, const String& in_query) override;
</del><ins>+ virtual void executeSQLSyncOptionalReturnValues(long requestId, int in_databaseId, const String& in_query) override;
+ virtual void executeSQLAsyncOptionalReturnValues(long requestId, int in_databaseId, const String& in_query) override;
+ virtual void executeSQLSync(long requestId, int in_databaseId, const String& in_query) override;
+ virtual void executeSQLAsync(long requestId, int in_databaseId, const String& in_query) override;
</ins><span class="cx"> private:
</span><span class="cx"> RetainPtr<id<RWIProtocolDatabaseDomainHandler>> m_delegate;
</span><span class="cx"> };
</span><span class="lines">@@ -1033,10 +1027,11 @@
</span><span class="cx">
</span><span class="cx"> namespace Inspector {
</span><span class="cx">
</span><del>-void ObjCInspectorDatabaseBackendDispatcher::executeSQLSyncOptionalReturnValues(long callId, int in_databaseId, const String& in_query)
</del><ins>+void ObjCInspectorDatabaseBackendDispatcher::executeSQLSyncOptionalReturnValues(long requestId, int in_databaseId, const String& in_query)
</ins><span class="cx"> {
</span><span class="cx"> id errorCallback = ^(NSString *error) {
</span><del>- backendDispatcher()->sendResponse(callId, InspectorObject::create(), error);
</del><ins>+ backendDispatcher()->reportProtocolError(requestId, BackendDispatcher::ServerError, error);
+ backendDispatcher()->sendPendingErrors();
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> id successCallback = ^(NSArray/*<NSString>*/ **columnNames, NSString **notes, double *timestamp, RWIProtocolJSONObject **values, RWIProtocolJSONObject **payload, int *databaseId, RWIProtocolDatabaseError **sqlError, RWIProtocolDatabasePrimaryColors *screenColor, NSArray/*<NSString>*/ **alternateColors, RWIProtocolDatabaseExecuteSQLSyncOptionalReturnValuesPrintColor *printColor) {
</span><span class="lines">@@ -1067,7 +1062,7 @@
</span><span class="cx"> resultObject->setArray(ASCIILiteral("alternateColors"), inspectorStringArray(*alternateColors));
</span><span class="cx"> if (printColor)
</span><span class="cx"> resultObject->setString(ASCIILiteral("printColor"), toProtocolString(*printColor));
</span><del>- backendDispatcher()->sendResponse(callId, WTF::move(resultObject), String());
</del><ins>+ backendDispatcher()->sendResponse(requestId, WTF::move(resultObject));
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> int o_in_databaseId = in_databaseId;
</span><span class="lines">@@ -1076,10 +1071,11 @@
</span><span class="cx"> [m_delegate executeSQLSyncOptionalReturnValuesWithErrorCallback:errorCallback successCallback:successCallback databaseId:o_in_databaseId query:o_in_query];
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void ObjCInspectorDatabaseBackendDispatcher::executeSQLAsyncOptionalReturnValues(long callId, int in_databaseId, const String& in_query)
</del><ins>+void ObjCInspectorDatabaseBackendDispatcher::executeSQLAsyncOptionalReturnValues(long requestId, int in_databaseId, const String& in_query)
</ins><span class="cx"> {
</span><span class="cx"> id errorCallback = ^(NSString *error) {
</span><del>- backendDispatcher()->sendResponse(callId, InspectorObject::create(), error);
</del><ins>+ backendDispatcher()->reportProtocolError(requestId, BackendDispatcher::ServerError, error);
+ backendDispatcher()->sendPendingErrors();
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> id successCallback = ^(NSArray/*<NSString>*/ **columnNames, NSString **notes, double *timestamp, RWIProtocolJSONObject **values, RWIProtocolJSONObject **payload, int *databaseId, RWIProtocolDatabaseError **sqlError, RWIProtocolDatabasePrimaryColors *screenColor, NSArray/*<NSString>*/ **alternateColors, RWIProtocolDatabaseExecuteSQLAsyncOptionalReturnValuesPrintColor *printColor) {
</span><span class="lines">@@ -1110,7 +1106,7 @@
</span><span class="cx"> resultObject->setArray(ASCIILiteral("alternateColors"), inspectorStringArray(*alternateColors));
</span><span class="cx"> if (printColor)
</span><span class="cx"> resultObject->setString(ASCIILiteral("printColor"), toProtocolString(*printColor));
</span><del>- backendDispatcher()->sendResponse(callId, WTF::move(resultObject), String());
</del><ins>+ backendDispatcher()->sendResponse(requestId, WTF::move(resultObject));
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> int o_in_databaseId = in_databaseId;
</span><span class="lines">@@ -1119,10 +1115,11 @@
</span><span class="cx"> [m_delegate executeSQLAsyncOptionalReturnValuesWithErrorCallback:errorCallback successCallback:successCallback databaseId:o_in_databaseId query:o_in_query];
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void ObjCInspectorDatabaseBackendDispatcher::executeSQLSync(long callId, int in_databaseId, const String& in_query)
</del><ins>+void ObjCInspectorDatabaseBackendDispatcher::executeSQLSync(long requestId, int in_databaseId, const String& in_query)
</ins><span class="cx"> {
</span><span class="cx"> id errorCallback = ^(NSString *error) {
</span><del>- backendDispatcher()->sendResponse(callId, InspectorObject::create(), error);
</del><ins>+ backendDispatcher()->reportProtocolError(requestId, BackendDispatcher::ServerError, error);
+ backendDispatcher()->sendPendingErrors();
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> id successCallback = ^(NSArray/*<NSString>*/ *columnNames, NSString *notes, double timestamp, RWIProtocolJSONObject *values, RWIProtocolJSONObject *payload, int databaseId, RWIProtocolDatabaseError *sqlError, NSArray/*<NSString>*/ *alternateColors, RWIProtocolDatabasePrimaryColors screenColor, RWIProtocolDatabaseExecuteSQLSyncPrintColor printColor) {
</span><span class="lines">@@ -1143,7 +1140,7 @@
</span><span class="cx"> resultObject->setArray(ASCIILiteral("alternateColors"), inspectorStringArray(alternateColors));
</span><span class="cx"> resultObject->setString(ASCIILiteral("screenColor"), toProtocolString(screenColor));
</span><span class="cx"> resultObject->setString(ASCIILiteral("printColor"), toProtocolString(printColor));
</span><del>- backendDispatcher()->sendResponse(callId, WTF::move(resultObject), String());
</del><ins>+ backendDispatcher()->sendResponse(requestId, WTF::move(resultObject));
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> int o_in_databaseId = in_databaseId;
</span><span class="lines">@@ -1152,10 +1149,11 @@
</span><span class="cx"> [m_delegate executeSQLSyncWithErrorCallback:errorCallback successCallback:successCallback databaseId:o_in_databaseId query:o_in_query];
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void ObjCInspectorDatabaseBackendDispatcher::executeSQLAsync(long callId, int in_databaseId, const String& in_query)
</del><ins>+void ObjCInspectorDatabaseBackendDispatcher::executeSQLAsync(long requestId, int in_databaseId, const String& in_query)
</ins><span class="cx"> {
</span><span class="cx"> id errorCallback = ^(NSString *error) {
</span><del>- backendDispatcher()->sendResponse(callId, InspectorObject::create(), error);
</del><ins>+ backendDispatcher()->reportProtocolError(requestId, BackendDispatcher::ServerError, error);
+ backendDispatcher()->sendPendingErrors();
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> id successCallback = ^(NSArray/*<NSString>*/ *columnNames, NSString *notes, double timestamp, RWIProtocolJSONObject *values, RWIProtocolJSONObject *payload, int databaseId, RWIProtocolDatabaseError *sqlError, RWIProtocolDatabasePrimaryColors screenColor, NSArray/*<NSString>*/ *alternateColors, RWIProtocolDatabaseExecuteSQLAsyncPrintColor printColor) {
</span><span class="lines">@@ -1176,7 +1174,7 @@
</span><span class="cx"> resultObject->setString(ASCIILiteral("screenColor"), toProtocolString(screenColor));
</span><span class="cx"> resultObject->setArray(ASCIILiteral("alternateColors"), inspectorStringArray(alternateColors));
</span><span class="cx"> resultObject->setString(ASCIILiteral("printColor"), toProtocolString(printColor));
</span><del>- backendDispatcher()->sendResponse(callId, WTF::move(resultObject), String());
</del><ins>+ backendDispatcher()->sendResponse(requestId, WTF::move(resultObject));
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> int o_in_databaseId = in_databaseId;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorscriptstestsexpectedcommandswithoptionalcallreturnparametersjsonresult"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/commands-with-optional-call-return-parameters.json-result (188964 => 188965)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/commands-with-optional-call-return-parameters.json-result        2015-08-26 10:24:30 UTC (rev 188964)
+++ trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/commands-with-optional-call-return-parameters.json-result        2015-08-26 14:34:38 UTC (rev 188965)
</span><span class="lines">@@ -170,10 +170,10 @@
</span><span class="cx"> class DatabaseBackendDispatcher final : public SupplementalBackendDispatcher {
</span><span class="cx"> public:
</span><span class="cx"> static Ref<DatabaseBackendDispatcher> create(BackendDispatcher*, DatabaseBackendDispatcherHandler*);
</span><del>- virtual void dispatch(long callId, const String& method, Ref<InspectorObject>&& message) override;
</del><ins>+ virtual void dispatch(long requestId, const String& method, Ref<InspectorObject>&& message) override;
</ins><span class="cx"> private:
</span><del>- void executeAllOptionalParameters(long callId, const InspectorObject& message);
- void executeNoOptionalParameters(long callId, const InspectorObject& message);
</del><ins>+ void executeAllOptionalParameters(long requestId, RefPtr<InspectorObject>&& parameters);
+ void executeNoOptionalParameters(long requestId, RefPtr<InspectorObject>&& parameters);
</ins><span class="cx"> private:
</span><span class="cx"> DatabaseBackendDispatcher(BackendDispatcher&, DatabaseBackendDispatcherHandler*);
</span><span class="cx"> DatabaseBackendDispatcherHandler* m_agent;
</span><span class="lines">@@ -226,6 +226,7 @@
</span><span class="cx">
</span><span class="cx"> #include <inspector/InspectorFrontendChannel.h>
</span><span class="cx"> #include <inspector/InspectorValues.h>
</span><ins>+#include <wtf/NeverDestroyed.h>
</ins><span class="cx"> #include <wtf/text/CString.h>
</span><span class="cx">
</span><span class="cx"> #if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS)
</span><span class="lines">@@ -251,52 +252,51 @@
</span><span class="cx"> m_backendDispatcher->registerDispatcherForDomain(ASCIILiteral("Database"), this);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void DatabaseBackendDispatcher::dispatch(long callId, const String& method, Ref<InspectorObject>&& message)
</del><ins>+void DatabaseBackendDispatcher::dispatch(long requestId, const String& method, Ref<InspectorObject>&& message)
</ins><span class="cx"> {
</span><span class="cx"> Ref<DatabaseBackendDispatcher> protect(*this);
</span><span class="cx">
</span><ins>+ RefPtr<InspectorObject> parameters;
+ message->getObject(ASCIILiteral("params"), parameters);
+
</ins><span class="cx"> if (method == "executeAllOptionalParameters")
</span><del>- executeAllOptionalParameters(callId, message);
</del><ins>+ executeAllOptionalParameters(requestId, WTF::move(parameters));
</ins><span class="cx"> else if (method == "executeNoOptionalParameters")
</span><del>- executeNoOptionalParameters(callId, message);
</del><ins>+ executeNoOptionalParameters(requestId, WTF::move(parameters));
</ins><span class="cx"> else
</span><del>- m_backendDispatcher->reportProtocolError(&callId, BackendDispatcher::MethodNotFound, makeString('\'', "Database", '.', method, "' was not found"));
</del><ins>+ m_backendDispatcher->reportProtocolError(BackendDispatcher::MethodNotFound, makeString('\'', "Database", '.', method, "' was not found"));
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void DatabaseBackendDispatcher::executeAllOptionalParameters(long callId, const InspectorObject& message)
</del><ins>+void DatabaseBackendDispatcher::executeAllOptionalParameters(long requestId, RefPtr<InspectorObject>&& parameters)
</ins><span class="cx"> {
</span><del>- auto protocolErrors = Inspector::Protocol::Array<String>::create();
- RefPtr<InspectorObject> paramsContainer;
- message.getObject(ASCIILiteral("params"), paramsContainer);
</del><span class="cx"> bool opt_in_columnNames_valueFound = false;
</span><del>- RefPtr<Inspector::InspectorArray> opt_in_columnNames = BackendDispatcher::getArray(paramsContainer.get(), ASCIILiteral("columnNames"), &opt_in_columnNames_valueFound, protocolErrors.get());
</del><ins>+ RefPtr<Inspector::InspectorArray> opt_in_columnNames = m_backendDispatcher->getArray(parameters.get(), ASCIILiteral("columnNames"), &opt_in_columnNames_valueFound);
</ins><span class="cx"> bool opt_in_notes_valueFound = false;
</span><del>- String opt_in_notes = BackendDispatcher::getString(paramsContainer.get(), ASCIILiteral("notes"), &opt_in_notes_valueFound, protocolErrors.get());
</del><ins>+ String opt_in_notes = m_backendDispatcher->getString(parameters.get(), ASCIILiteral("notes"), &opt_in_notes_valueFound);
</ins><span class="cx"> bool opt_in_timestamp_valueFound = false;
</span><del>- Inspector::Protocol::OptOutput<double> opt_in_timestamp = BackendDispatcher::getDouble(paramsContainer.get(), ASCIILiteral("timestamp"), &opt_in_timestamp_valueFound, protocolErrors.get());
</del><ins>+ Inspector::Protocol::OptOutput<double> opt_in_timestamp = m_backendDispatcher->getDouble(parameters.get(), ASCIILiteral("timestamp"), &opt_in_timestamp_valueFound);
</ins><span class="cx"> bool opt_in_values_valueFound = false;
</span><del>- RefPtr<Inspector::InspectorObject> opt_in_values = BackendDispatcher::getObject(paramsContainer.get(), ASCIILiteral("values"), &opt_in_values_valueFound, protocolErrors.get());
</del><ins>+ RefPtr<Inspector::InspectorObject> opt_in_values = m_backendDispatcher->getObject(parameters.get(), ASCIILiteral("values"), &opt_in_values_valueFound);
</ins><span class="cx"> bool opt_in_payload_valueFound = false;
</span><del>- RefPtr<Inspector::InspectorValue> opt_in_payload = BackendDispatcher::getValue(paramsContainer.get(), ASCIILiteral("payload"), &opt_in_payload_valueFound, protocolErrors.get());
</del><ins>+ RefPtr<Inspector::InspectorValue> opt_in_payload = m_backendDispatcher->getValue(parameters.get(), ASCIILiteral("payload"), &opt_in_payload_valueFound);
</ins><span class="cx"> bool opt_in_databaseId_valueFound = false;
</span><del>- int opt_in_databaseId = BackendDispatcher::getInteger(paramsContainer.get(), ASCIILiteral("databaseId"), &opt_in_databaseId_valueFound, protocolErrors.get());
</del><ins>+ int opt_in_databaseId = m_backendDispatcher->getInteger(parameters.get(), ASCIILiteral("databaseId"), &opt_in_databaseId_valueFound);
</ins><span class="cx"> bool opt_in_sqlError_valueFound = false;
</span><del>- RefPtr<Inspector::InspectorObject> opt_in_sqlError = BackendDispatcher::getObject(paramsContainer.get(), ASCIILiteral("sqlError"), &opt_in_sqlError_valueFound, protocolErrors.get());
</del><ins>+ RefPtr<Inspector::InspectorObject> opt_in_sqlError = m_backendDispatcher->getObject(parameters.get(), ASCIILiteral("sqlError"), &opt_in_sqlError_valueFound);
</ins><span class="cx"> bool opt_in_screenColor_valueFound = false;
</span><del>- String opt_in_screenColor = BackendDispatcher::getString(paramsContainer.get(), ASCIILiteral("screenColor"), &opt_in_screenColor_valueFound, protocolErrors.get());
</del><ins>+ String opt_in_screenColor = m_backendDispatcher->getString(parameters.get(), ASCIILiteral("screenColor"), &opt_in_screenColor_valueFound);
</ins><span class="cx"> bool opt_in_alternateColors_valueFound = false;
</span><del>- RefPtr<Inspector::InspectorArray> opt_in_alternateColors = BackendDispatcher::getArray(paramsContainer.get(), ASCIILiteral("alternateColors"), &opt_in_alternateColors_valueFound, protocolErrors.get());
</del><ins>+ RefPtr<Inspector::InspectorArray> opt_in_alternateColors = m_backendDispatcher->getArray(parameters.get(), ASCIILiteral("alternateColors"), &opt_in_alternateColors_valueFound);
</ins><span class="cx"> bool opt_in_printColor_valueFound = false;
</span><del>- String opt_in_printColor = BackendDispatcher::getString(paramsContainer.get(), ASCIILiteral("printColor"), &opt_in_printColor_valueFound, protocolErrors.get());
- if (protocolErrors->length()) {
- String errorMessage = String::format("Some arguments of method '%s' can't be processed", "Database.executeAllOptionalParameters");
- m_backendDispatcher->reportProtocolError(&callId, BackendDispatcher::InvalidParams, errorMessage, WTF::move(protocolErrors));
</del><ins>+ String opt_in_printColor = m_backendDispatcher->getString(parameters.get(), ASCIILiteral("printColor"), &opt_in_printColor_valueFound);
+ if (m_backendDispatcher->hasProtocolErrors()) {
+ m_backendDispatcher->reportProtocolError(BackendDispatcher::InvalidParams, String::format("Some arguments of method '%s' can't be processed", "Database.executeAllOptionalParameters"));
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> #if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS)
</span><span class="cx"> if (m_alternateDispatcher) {
</span><del>- m_alternateDispatcher->executeAllOptionalParameters(callId, opt_in_columnNames_valueFound ? opt_in_columnNames.get() : nullptr, opt_in_notes_valueFound ? &opt_in_notes : nullptr, opt_in_timestamp_valueFound ? &opt_in_timestamp : nullptr, opt_in_values_valueFound ? opt_in_values.get() : nullptr, opt_in_payload_valueFound ? opt_in_payload.get() : nullptr, opt_in_databaseId_valueFound ? &opt_in_databaseId : nullptr, opt_in_sqlError_valueFound ? opt_in_sqlError.get() : nullptr, opt_in_screenColor_valueFound ? &opt_in_screenColor : nullptr, opt_in_alternateColors_valueFound ? opt_in_alternateColors.get() : nullptr, opt_in_printColor_valueFound ? &opt_in_printColor : nullptr);
</del><ins>+ m_alternateDispatcher->executeAllOptionalParameters(requestId, opt_in_columnNames_valueFound ? opt_in_columnNames.get() : nullptr, opt_in_notes_valueFound ? &opt_in_notes : nullptr, opt_in_timestamp_valueFound ? &opt_in_timestamp : nullptr, opt_in_values_valueFound ? opt_in_values.get() : nullptr, opt_in_payload_valueFound ? opt_in_payload.get() : nullptr, opt_in_databaseId_valueFound ? &opt_in_databaseId : nullptr, opt_in_sqlError_valueFound ? opt_in_sqlError.get() : nullptr, opt_in_screenColor_valueFound ? &opt_in_screenColor : nullptr, opt_in_alternateColors_valueFound ? opt_in_alternateColors.get() : nullptr, opt_in_printColor_valueFound ? &opt_in_printColor : nullptr);
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="lines">@@ -337,33 +337,32 @@
</span><span class="cx"> if (out_printColor.isAssigned())
</span><span class="cx"> result->setString(ASCIILiteral("printColor"), out_printColor.getValue());
</span><span class="cx"> }
</span><del>- m_backendDispatcher->sendResponse(callId, WTF::move(result), error);
</del><ins>+ if (!error.length())
+ m_backendDispatcher->sendResponse(requestId, WTF::move(result));
+ else
+ m_backendDispatcher->reportProtocolError(BackendDispatcher::ServerError, WTF::move(error));
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void DatabaseBackendDispatcher::executeNoOptionalParameters(long callId, const InspectorObject& message)
</del><ins>+void DatabaseBackendDispatcher::executeNoOptionalParameters(long requestId, RefPtr<InspectorObject>&& parameters)
</ins><span class="cx"> {
</span><del>- auto protocolErrors = Inspector::Protocol::Array<String>::create();
- RefPtr<InspectorObject> paramsContainer;
- message.getObject(ASCIILiteral("params"), paramsContainer);
- RefPtr<Inspector::InspectorArray> in_columnNames = BackendDispatcher::getArray(paramsContainer.get(), ASCIILiteral("columnNames"), nullptr, protocolErrors.get());
- String in_notes = BackendDispatcher::getString(paramsContainer.get(), ASCIILiteral("notes"), nullptr, protocolErrors.get());
- double in_timestamp = BackendDispatcher::getDouble(paramsContainer.get(), ASCIILiteral("timestamp"), nullptr, protocolErrors.get());
- RefPtr<Inspector::InspectorObject> in_values = BackendDispatcher::getObject(paramsContainer.get(), ASCIILiteral("values"), nullptr, protocolErrors.get());
- RefPtr<Inspector::InspectorValue> in_payload = BackendDispatcher::getValue(paramsContainer.get(), ASCIILiteral("payload"), nullptr, protocolErrors.get());
- int in_databaseId = BackendDispatcher::getInteger(paramsContainer.get(), ASCIILiteral("databaseId"), nullptr, protocolErrors.get());
- RefPtr<Inspector::InspectorObject> in_sqlError = BackendDispatcher::getObject(paramsContainer.get(), ASCIILiteral("sqlError"), nullptr, protocolErrors.get());
- String in_screenColor = BackendDispatcher::getString(paramsContainer.get(), ASCIILiteral("screenColor"), nullptr, protocolErrors.get());
- RefPtr<Inspector::InspectorArray> in_alternateColors = BackendDispatcher::getArray(paramsContainer.get(), ASCIILiteral("alternateColors"), nullptr, protocolErrors.get());
- String in_printColor = BackendDispatcher::getString(paramsContainer.get(), ASCIILiteral("printColor"), nullptr, protocolErrors.get());
- if (protocolErrors->length()) {
- String errorMessage = String::format("Some arguments of method '%s' can't be processed", "Database.executeNoOptionalParameters");
- m_backendDispatcher->reportProtocolError(&callId, BackendDispatcher::InvalidParams, errorMessage, WTF::move(protocolErrors));
</del><ins>+ RefPtr<Inspector::InspectorArray> in_columnNames = m_backendDispatcher->getArray(parameters.get(), ASCIILiteral("columnNames"), nullptr);
+ String in_notes = m_backendDispatcher->getString(parameters.get(), ASCIILiteral("notes"), nullptr);
+ double in_timestamp = m_backendDispatcher->getDouble(parameters.get(), ASCIILiteral("timestamp"), nullptr);
+ RefPtr<Inspector::InspectorObject> in_values = m_backendDispatcher->getObject(parameters.get(), ASCIILiteral("values"), nullptr);
+ RefPtr<Inspector::InspectorValue> in_payload = m_backendDispatcher->getValue(parameters.get(), ASCIILiteral("payload"), nullptr);
+ int in_databaseId = m_backendDispatcher->getInteger(parameters.get(), ASCIILiteral("databaseId"), nullptr);
+ RefPtr<Inspector::InspectorObject> in_sqlError = m_backendDispatcher->getObject(parameters.get(), ASCIILiteral("sqlError"), nullptr);
+ String in_screenColor = m_backendDispatcher->getString(parameters.get(), ASCIILiteral("screenColor"), nullptr);
+ RefPtr<Inspector::InspectorArray> in_alternateColors = m_backendDispatcher->getArray(parameters.get(), ASCIILiteral("alternateColors"), nullptr);
+ String in_printColor = m_backendDispatcher->getString(parameters.get(), ASCIILiteral("printColor"), nullptr);
+ if (m_backendDispatcher->hasProtocolErrors()) {
+ m_backendDispatcher->reportProtocolError(BackendDispatcher::InvalidParams, String::format("Some arguments of method '%s' can't be processed", "Database.executeNoOptionalParameters"));
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> #if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS)
</span><span class="cx"> if (m_alternateDispatcher) {
</span><del>- m_alternateDispatcher->executeNoOptionalParameters(callId, *in_columnNames, in_notes, in_timestamp, *in_values, *in_payload, in_databaseId, *in_sqlError, in_screenColor, *in_alternateColors, in_printColor);
</del><ins>+ m_alternateDispatcher->executeNoOptionalParameters(requestId, *in_columnNames, in_notes, in_timestamp, *in_values, *in_payload, in_databaseId, *in_sqlError, in_screenColor, *in_alternateColors, in_printColor);
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="lines">@@ -394,7 +393,10 @@
</span><span class="cx"> result->setArray(ASCIILiteral("alternateColors"), out_alternateColors);
</span><span class="cx"> result->setString(ASCIILiteral("printColor"), Inspector::Protocol::getEnumConstantValue(out_printColor));
</span><span class="cx"> }
</span><del>- m_backendDispatcher->sendResponse(callId, WTF::move(result), error);
</del><ins>+ if (!error.length())
+ m_backendDispatcher->sendResponse(requestId, WTF::move(result));
+ else
+ m_backendDispatcher->reportProtocolError(BackendDispatcher::ServerError, WTF::move(error));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> } // namespace Inspector
</span><span class="lines">@@ -744,8 +746,8 @@
</span><span class="cx"> class ObjCInspectorDatabaseBackendDispatcher final : public AlternateDatabaseBackendDispatcher {
</span><span class="cx"> public:
</span><span class="cx"> ObjCInspectorDatabaseBackendDispatcher(id<RWIProtocolDatabaseDomainHandler> handler) { m_delegate = handler; }
</span><del>- virtual void executeAllOptionalParameters(long callId, const Inspector::InspectorArray* in_columnNames, const String* in_notes, const double* in_timestamp, const Inspector::InspectorObject* in_values, const Inspector::InspectorValue* in_payload, const int* in_databaseId, const Inspector::InspectorObject* in_sqlError, const String* in_screenColor, const Inspector::InspectorArray* in_alternateColors, const String* in_printColor) override;
- virtual void executeNoOptionalParameters(long callId, const Inspector::InspectorArray& in_columnNames, const String& in_notes, double in_timestamp, const Inspector::InspectorObject& in_values, Inspector::InspectorValue in_payload, int in_databaseId, const Inspector::InspectorObject& in_sqlError, const String& in_screenColor, const Inspector::InspectorArray& in_alternateColors, const String& in_printColor) override;
</del><ins>+ virtual void executeAllOptionalParameters(long requestId, const Inspector::InspectorArray* in_columnNames, const String* in_notes, const double* in_timestamp, const Inspector::InspectorObject* in_values, const Inspector::InspectorValue* in_payload, const int* in_databaseId, const Inspector::InspectorObject* in_sqlError, const String* in_screenColor, const Inspector::InspectorArray* in_alternateColors, const String* in_printColor) override;
+ virtual void executeNoOptionalParameters(long requestId, const Inspector::InspectorArray& in_columnNames, const String& in_notes, double in_timestamp, const Inspector::InspectorObject& in_values, Inspector::InspectorValue in_payload, int in_databaseId, const Inspector::InspectorObject& in_sqlError, const String& in_screenColor, const Inspector::InspectorArray& in_alternateColors, const String& in_printColor) override;
</ins><span class="cx"> private:
</span><span class="cx"> RetainPtr<id<RWIProtocolDatabaseDomainHandler>> m_delegate;
</span><span class="cx"> };
</span><span class="lines">@@ -924,10 +926,11 @@
</span><span class="cx">
</span><span class="cx"> namespace Inspector {
</span><span class="cx">
</span><del>-void ObjCInspectorDatabaseBackendDispatcher::executeAllOptionalParameters(long callId, const Inspector::InspectorArray* in_columnNames, const String* in_notes, const double* in_timestamp, const Inspector::InspectorObject* in_values, const Inspector::InspectorValue* in_payload, const int* in_databaseId, const Inspector::InspectorObject* in_sqlError, const String* in_screenColor, const Inspector::InspectorArray* in_alternateColors, const String* in_printColor)
</del><ins>+void ObjCInspectorDatabaseBackendDispatcher::executeAllOptionalParameters(long requestId, const Inspector::InspectorArray* in_columnNames, const String* in_notes, const double* in_timestamp, const Inspector::InspectorObject* in_values, const Inspector::InspectorValue* in_payload, const int* in_databaseId, const Inspector::InspectorObject* in_sqlError, const String* in_screenColor, const Inspector::InspectorArray* in_alternateColors, const String* in_printColor)
</ins><span class="cx"> {
</span><span class="cx"> id errorCallback = ^(NSString *error) {
</span><del>- backendDispatcher()->sendResponse(callId, InspectorObject::create(), error);
</del><ins>+ backendDispatcher()->reportProtocolError(requestId, BackendDispatcher::ServerError, error);
+ backendDispatcher()->sendPendingErrors();
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> id successCallback = ^(NSArray/*<NSString>*/ **columnNames, NSString **notes, double *timestamp, RWIProtocolJSONObject **values, RWIProtocolJSONObject **payload, int *databaseId, RWIProtocolDatabaseError **sqlError, RWIProtocolDatabasePrimaryColors *screenColor, NSArray/*<NSString>*/ **alternateColors, RWIProtocolDatabaseExecuteAllOptionalParametersPrintColor *printColor) {
</span><span class="lines">@@ -958,7 +961,7 @@
</span><span class="cx"> resultObject->setArray(ASCIILiteral("alternateColors"), inspectorStringArray(*alternateColors));
</span><span class="cx"> if (printColor)
</span><span class="cx"> resultObject->setString(ASCIILiteral("printColor"), toProtocolString(*printColor));
</span><del>- backendDispatcher()->sendResponse(callId, WTF::move(resultObject), String());
</del><ins>+ backendDispatcher()->sendResponse(requestId, WTF::move(resultObject));
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> NSArray/*<NSString>*/ *o_in_columnNames;
</span><span class="lines">@@ -995,10 +998,11 @@
</span><span class="cx"> [m_delegate executeAllOptionalParametersWithErrorCallback:errorCallback successCallback:successCallback columnNames:(in_columnNames ? &o_in_columnNames : nil) notes:(in_notes ? &o_in_notes : nil) timestamp:(in_timestamp ? &o_in_timestamp : nil) values:(in_values ? &o_in_values : nil) payload:(in_payload ? &o_in_payload : nil) databaseId:(in_databaseId ? &o_in_databaseId : nil) sqlError:(in_sqlError ? &o_in_sqlError : nil) screenColor:(in_screenColor ? &o_in_screenColor : nil) alternateColors:(in_alternateColors ? &o_in_alternateColors : nil) printColor:(in_printColor ? &o_in_printColor : nil)];
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void ObjCInspectorDatabaseBackendDispatcher::executeNoOptionalParameters(long callId, const Inspector::InspectorArray& in_columnNames, const String& in_notes, double in_timestamp, const Inspector::InspectorObject& in_values, Inspector::InspectorValue in_payload, int in_databaseId, const Inspector::InspectorObject& in_sqlError, const String& in_screenColor, const Inspector::InspectorArray& in_alternateColors, const String& in_printColor)
</del><ins>+void ObjCInspectorDatabaseBackendDispatcher::executeNoOptionalParameters(long requestId, const Inspector::InspectorArray& in_columnNames, const String& in_notes, double in_timestamp, const Inspector::InspectorObject& in_values, Inspector::InspectorValue in_payload, int in_databaseId, const Inspector::InspectorObject& in_sqlError, const String& in_screenColor, const Inspector::InspectorArray& in_alternateColors, const String& in_printColor)
</ins><span class="cx"> {
</span><span class="cx"> id errorCallback = ^(NSString *error) {
</span><del>- backendDispatcher()->sendResponse(callId, InspectorObject::create(), error);
</del><ins>+ backendDispatcher()->reportProtocolError(requestId, BackendDispatcher::ServerError, error);
+ backendDispatcher()->sendPendingErrors();
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> id successCallback = ^(NSArray/*<NSString>*/ *columnNames, NSString *notes, double timestamp, RWIProtocolJSONObject *values, RWIProtocolJSONObject *payload, int databaseId, RWIProtocolDatabaseError *sqlError, RWIProtocolDatabasePrimaryColors screenColor, NSArray/*<NSString>*/ *alternateColors, RWIProtocolDatabaseExecuteNoOptionalParametersPrintColor printColor) {
</span><span class="lines">@@ -1019,7 +1023,7 @@
</span><span class="cx"> resultObject->setString(ASCIILiteral("screenColor"), toProtocolString(screenColor));
</span><span class="cx"> resultObject->setArray(ASCIILiteral("alternateColors"), inspectorStringArray(alternateColors));
</span><span class="cx"> resultObject->setString(ASCIILiteral("printColor"), toProtocolString(printColor));
</span><del>- backendDispatcher()->sendResponse(callId, WTF::move(resultObject), String());
</del><ins>+ backendDispatcher()->sendResponse(requestId, WTF::move(resultObject));
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> NSArray/*<NSString>*/ *o_in_columnNames = objcStringArray(&in_columnNames);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorscriptstestsexpecteddomainswithvaryingcommandsizesjsonresult"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/domains-with-varying-command-sizes.json-result (188964 => 188965)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/domains-with-varying-command-sizes.json-result        2015-08-26 10:24:30 UTC (rev 188964)
+++ trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/domains-with-varying-command-sizes.json-result        2015-08-26 14:34:38 UTC (rev 188965)
</span><span class="lines">@@ -188,9 +188,9 @@
</span><span class="cx"> class Network1BackendDispatcher final : public SupplementalBackendDispatcher {
</span><span class="cx"> public:
</span><span class="cx"> static Ref<Network1BackendDispatcher> create(BackendDispatcher*, Network1BackendDispatcherHandler*);
</span><del>- virtual void dispatch(long callId, const String& method, Ref<InspectorObject>&& message) override;
</del><ins>+ virtual void dispatch(long requestId, const String& method, Ref<InspectorObject>&& message) override;
</ins><span class="cx"> private:
</span><del>- void loadResource1(long callId, const InspectorObject& message);
</del><ins>+ void loadResource1(long requestId, RefPtr<InspectorObject>&& parameters);
</ins><span class="cx"> private:
</span><span class="cx"> Network1BackendDispatcher(BackendDispatcher&, Network1BackendDispatcherHandler*);
</span><span class="cx"> Network1BackendDispatcherHandler* m_agent;
</span><span class="lines">@@ -205,15 +205,15 @@
</span><span class="cx"> class Network3BackendDispatcher final : public SupplementalBackendDispatcher {
</span><span class="cx"> public:
</span><span class="cx"> static Ref<Network3BackendDispatcher> create(BackendDispatcher*, Network3BackendDispatcherHandler*);
</span><del>- virtual void dispatch(long callId, const String& method, Ref<InspectorObject>&& message) override;
</del><ins>+ virtual void dispatch(long requestId, const String& method, Ref<InspectorObject>&& message) override;
</ins><span class="cx"> private:
</span><del>- void loadResource1(long callId, const InspectorObject& message);
- void loadResource2(long callId, const InspectorObject& message);
- void loadResource3(long callId, const InspectorObject& message);
- void loadResource4(long callId, const InspectorObject& message);
- void loadResource5(long callId, const InspectorObject& message);
- void loadResource6(long callId, const InspectorObject& message);
- void loadResource7(long callId, const InspectorObject& message);
</del><ins>+ void loadResource1(long requestId, RefPtr<InspectorObject>&& parameters);
+ void loadResource2(long requestId, RefPtr<InspectorObject>&& parameters);
+ void loadResource3(long requestId, RefPtr<InspectorObject>&& parameters);
+ void loadResource4(long requestId, RefPtr<InspectorObject>&& parameters);
+ void loadResource5(long requestId, RefPtr<InspectorObject>&& parameters);
+ void loadResource6(long requestId, RefPtr<InspectorObject>&& parameters);
+ void loadResource7(long requestId, RefPtr<InspectorObject>&& parameters);
</ins><span class="cx"> private:
</span><span class="cx"> Network3BackendDispatcher(BackendDispatcher&, Network3BackendDispatcherHandler*);
</span><span class="cx"> Network3BackendDispatcherHandler* m_agent;
</span><span class="lines">@@ -266,6 +266,7 @@
</span><span class="cx">
</span><span class="cx"> #include <inspector/InspectorFrontendChannel.h>
</span><span class="cx"> #include <inspector/InspectorValues.h>
</span><ins>+#include <wtf/NeverDestroyed.h>
</ins><span class="cx"> #include <wtf/text/CString.h>
</span><span class="cx">
</span><span class="cx"> #if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS)
</span><span class="lines">@@ -292,21 +293,24 @@
</span><span class="cx"> m_backendDispatcher->registerDispatcherForDomain(ASCIILiteral("Network1"), this);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void Network1BackendDispatcher::dispatch(long callId, const String& method, Ref<InspectorObject>&& message)
</del><ins>+void Network1BackendDispatcher::dispatch(long requestId, const String& method, Ref<InspectorObject>&& message)
</ins><span class="cx"> {
</span><span class="cx"> Ref<Network1BackendDispatcher> protect(*this);
</span><span class="cx">
</span><ins>+ RefPtr<InspectorObject> parameters;
+ message->getObject(ASCIILiteral("params"), parameters);
+
</ins><span class="cx"> if (method == "loadResource1")
</span><del>- loadResource1(callId, message);
</del><ins>+ loadResource1(requestId, WTF::move(parameters));
</ins><span class="cx"> else
</span><del>- m_backendDispatcher->reportProtocolError(&callId, BackendDispatcher::MethodNotFound, makeString('\'', "Network1", '.', method, "' was not found"));
</del><ins>+ m_backendDispatcher->reportProtocolError(BackendDispatcher::MethodNotFound, makeString('\'', "Network1", '.', method, "' was not found"));
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void Network1BackendDispatcher::loadResource1(long callId, const InspectorObject&)
</del><ins>+void Network1BackendDispatcher::loadResource1(long requestId, RefPtr<InspectorObject>&&)
</ins><span class="cx"> {
</span><span class="cx"> #if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS)
</span><span class="cx"> if (m_alternateDispatcher) {
</span><del>- m_alternateDispatcher->loadResource1(callId);
</del><ins>+ m_alternateDispatcher->loadResource1(requestId);
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="lines">@@ -315,7 +319,10 @@
</span><span class="cx"> Ref<InspectorObject> result = InspectorObject::create();
</span><span class="cx"> m_agent->loadResource1(error);
</span><span class="cx">
</span><del>- m_backendDispatcher->sendResponse(callId, WTF::move(result), error);
</del><ins>+ if (!error.length())
+ m_backendDispatcher->sendResponse(requestId, WTF::move(result));
+ else
+ m_backendDispatcher->reportProtocolError(BackendDispatcher::ServerError, WTF::move(error));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> Ref<Network3BackendDispatcher> Network3BackendDispatcher::create(BackendDispatcher* backendDispatcher, Network3BackendDispatcherHandler* agent)
</span><span class="lines">@@ -333,14 +340,17 @@
</span><span class="cx"> m_backendDispatcher->registerDispatcherForDomain(ASCIILiteral("Network3"), this);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void Network3BackendDispatcher::dispatch(long callId, const String& method, Ref<InspectorObject>&& message)
</del><ins>+void Network3BackendDispatcher::dispatch(long requestId, const String& method, Ref<InspectorObject>&& message)
</ins><span class="cx"> {
</span><span class="cx"> Ref<Network3BackendDispatcher> protect(*this);
</span><span class="cx">
</span><del>- typedef void (Network3BackendDispatcher::*CallHandler)(long callId, const InspectorObject& message);
</del><ins>+ RefPtr<InspectorObject> parameters;
+ message->getObject(ASCIILiteral("params"), parameters);
+
+ typedef void (Network3BackendDispatcher::*CallHandler)(long requestId, RefPtr<InspectorObject>&& message);
</ins><span class="cx"> typedef HashMap<String, CallHandler> DispatchMap;
</span><del>- DEPRECATED_DEFINE_STATIC_LOCAL(DispatchMap, dispatchMap, ());
- if (dispatchMap.isEmpty()) {
</del><ins>+ static NeverDestroyed<DispatchMap> dispatchMap;
+ if (dispatchMap.get().isEmpty()) {
</ins><span class="cx"> static const struct MethodTable {
</span><span class="cx"> const char* name;
</span><span class="cx"> CallHandler handler;
</span><span class="lines">@@ -355,23 +365,23 @@
</span><span class="cx"> };
</span><span class="cx"> size_t length = WTF_ARRAY_LENGTH(commands);
</span><span class="cx"> for (size_t i = 0; i < length; ++i)
</span><del>- dispatchMap.add(commands[i].name, commands[i].handler);
</del><ins>+ dispatchMap.get().add(commands[i].name, commands[i].handler);
</ins><span class="cx"> }
</span><span class="cx">
</span><del>- HashMap<String, CallHandler>::iterator it = dispatchMap.find(method);
- if (it == dispatchMap.end()) {
- m_backendDispatcher->reportProtocolError(&callId, BackendDispatcher::MethodNotFound, makeString('\'', "Network3", '.', method, "' was not found"));
</del><ins>+ auto findResult = dispatchMap.get().find(method);
+ if (findResult == dispatchMap.get().end()) {
+ m_backendDispatcher->reportProtocolError(BackendDispatcher::MethodNotFound, makeString('\'', "Network3", '.', method, "' was not found"));
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx">
</span><del>- ((*this).*it->value)(callId, message.get());
</del><ins>+ ((*this).*findResult->value)(requestId, WTF::move(parameters));
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void Network3BackendDispatcher::loadResource1(long callId, const InspectorObject&)
</del><ins>+void Network3BackendDispatcher::loadResource1(long requestId, RefPtr<InspectorObject>&&)
</ins><span class="cx"> {
</span><span class="cx"> #if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS)
</span><span class="cx"> if (m_alternateDispatcher) {
</span><del>- m_alternateDispatcher->loadResource1(callId);
</del><ins>+ m_alternateDispatcher->loadResource1(requestId);
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="lines">@@ -380,14 +390,17 @@
</span><span class="cx"> Ref<InspectorObject> result = InspectorObject::create();
</span><span class="cx"> m_agent->loadResource1(error);
</span><span class="cx">
</span><del>- m_backendDispatcher->sendResponse(callId, WTF::move(result), error);
</del><ins>+ if (!error.length())
+ m_backendDispatcher->sendResponse(requestId, WTF::move(result));
+ else
+ m_backendDispatcher->reportProtocolError(BackendDispatcher::ServerError, WTF::move(error));
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void Network3BackendDispatcher::loadResource2(long callId, const InspectorObject&)
</del><ins>+void Network3BackendDispatcher::loadResource2(long requestId, RefPtr<InspectorObject>&&)
</ins><span class="cx"> {
</span><span class="cx"> #if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS)
</span><span class="cx"> if (m_alternateDispatcher) {
</span><del>- m_alternateDispatcher->loadResource2(callId);
</del><ins>+ m_alternateDispatcher->loadResource2(requestId);
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="lines">@@ -396,14 +409,17 @@
</span><span class="cx"> Ref<InspectorObject> result = InspectorObject::create();
</span><span class="cx"> m_agent->loadResource2(error);
</span><span class="cx">
</span><del>- m_backendDispatcher->sendResponse(callId, WTF::move(result), error);
</del><ins>+ if (!error.length())
+ m_backendDispatcher->sendResponse(requestId, WTF::move(result));
+ else
+ m_backendDispatcher->reportProtocolError(BackendDispatcher::ServerError, WTF::move(error));
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void Network3BackendDispatcher::loadResource3(long callId, const InspectorObject&)
</del><ins>+void Network3BackendDispatcher::loadResource3(long requestId, RefPtr<InspectorObject>&&)
</ins><span class="cx"> {
</span><span class="cx"> #if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS)
</span><span class="cx"> if (m_alternateDispatcher) {
</span><del>- m_alternateDispatcher->loadResource3(callId);
</del><ins>+ m_alternateDispatcher->loadResource3(requestId);
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="lines">@@ -412,14 +428,17 @@
</span><span class="cx"> Ref<InspectorObject> result = InspectorObject::create();
</span><span class="cx"> m_agent->loadResource3(error);
</span><span class="cx">
</span><del>- m_backendDispatcher->sendResponse(callId, WTF::move(result), error);
</del><ins>+ if (!error.length())
+ m_backendDispatcher->sendResponse(requestId, WTF::move(result));
+ else
+ m_backendDispatcher->reportProtocolError(BackendDispatcher::ServerError, WTF::move(error));
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void Network3BackendDispatcher::loadResource4(long callId, const InspectorObject&)
</del><ins>+void Network3BackendDispatcher::loadResource4(long requestId, RefPtr<InspectorObject>&&)
</ins><span class="cx"> {
</span><span class="cx"> #if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS)
</span><span class="cx"> if (m_alternateDispatcher) {
</span><del>- m_alternateDispatcher->loadResource4(callId);
</del><ins>+ m_alternateDispatcher->loadResource4(requestId);
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="lines">@@ -428,14 +447,17 @@
</span><span class="cx"> Ref<InspectorObject> result = InspectorObject::create();
</span><span class="cx"> m_agent->loadResource4(error);
</span><span class="cx">
</span><del>- m_backendDispatcher->sendResponse(callId, WTF::move(result), error);
</del><ins>+ if (!error.length())
+ m_backendDispatcher->sendResponse(requestId, WTF::move(result));
+ else
+ m_backendDispatcher->reportProtocolError(BackendDispatcher::ServerError, WTF::move(error));
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void Network3BackendDispatcher::loadResource5(long callId, const InspectorObject&)
</del><ins>+void Network3BackendDispatcher::loadResource5(long requestId, RefPtr<InspectorObject>&&)
</ins><span class="cx"> {
</span><span class="cx"> #if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS)
</span><span class="cx"> if (m_alternateDispatcher) {
</span><del>- m_alternateDispatcher->loadResource5(callId);
</del><ins>+ m_alternateDispatcher->loadResource5(requestId);
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="lines">@@ -444,14 +466,17 @@
</span><span class="cx"> Ref<InspectorObject> result = InspectorObject::create();
</span><span class="cx"> m_agent->loadResource5(error);
</span><span class="cx">
</span><del>- m_backendDispatcher->sendResponse(callId, WTF::move(result), error);
</del><ins>+ if (!error.length())
+ m_backendDispatcher->sendResponse(requestId, WTF::move(result));
+ else
+ m_backendDispatcher->reportProtocolError(BackendDispatcher::ServerError, WTF::move(error));
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void Network3BackendDispatcher::loadResource6(long callId, const InspectorObject&)
</del><ins>+void Network3BackendDispatcher::loadResource6(long requestId, RefPtr<InspectorObject>&&)
</ins><span class="cx"> {
</span><span class="cx"> #if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS)
</span><span class="cx"> if (m_alternateDispatcher) {
</span><del>- m_alternateDispatcher->loadResource6(callId);
</del><ins>+ m_alternateDispatcher->loadResource6(requestId);
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="lines">@@ -460,14 +485,17 @@
</span><span class="cx"> Ref<InspectorObject> result = InspectorObject::create();
</span><span class="cx"> m_agent->loadResource6(error);
</span><span class="cx">
</span><del>- m_backendDispatcher->sendResponse(callId, WTF::move(result), error);
</del><ins>+ if (!error.length())
+ m_backendDispatcher->sendResponse(requestId, WTF::move(result));
+ else
+ m_backendDispatcher->reportProtocolError(BackendDispatcher::ServerError, WTF::move(error));
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void Network3BackendDispatcher::loadResource7(long callId, const InspectorObject&)
</del><ins>+void Network3BackendDispatcher::loadResource7(long requestId, RefPtr<InspectorObject>&&)
</ins><span class="cx"> {
</span><span class="cx"> #if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS)
</span><span class="cx"> if (m_alternateDispatcher) {
</span><del>- m_alternateDispatcher->loadResource7(callId);
</del><ins>+ m_alternateDispatcher->loadResource7(requestId);
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="lines">@@ -476,7 +504,10 @@
</span><span class="cx"> Ref<InspectorObject> result = InspectorObject::create();
</span><span class="cx"> m_agent->loadResource7(error);
</span><span class="cx">
</span><del>- m_backendDispatcher->sendResponse(callId, WTF::move(result), error);
</del><ins>+ if (!error.length())
+ m_backendDispatcher->sendResponse(requestId, WTF::move(result));
+ else
+ m_backendDispatcher->reportProtocolError(BackendDispatcher::ServerError, WTF::move(error));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> } // namespace Inspector
</span><span class="lines">@@ -739,7 +770,7 @@
</span><span class="cx"> class ObjCInspectorNetwork1BackendDispatcher final : public AlternateNetwork1BackendDispatcher {
</span><span class="cx"> public:
</span><span class="cx"> ObjCInspectorNetwork1BackendDispatcher(id<RWIProtocolNetwork1DomainHandler> handler) { m_delegate = handler; }
</span><del>- virtual void loadResource1(long callId) override;
</del><ins>+ virtual void loadResource1(long requestId) override;
</ins><span class="cx"> private:
</span><span class="cx"> RetainPtr<id<RWIProtocolNetwork1DomainHandler>> m_delegate;
</span><span class="cx"> };
</span><span class="lines">@@ -749,13 +780,13 @@
</span><span class="cx"> class ObjCInspectorNetwork3BackendDispatcher final : public AlternateNetwork3BackendDispatcher {
</span><span class="cx"> public:
</span><span class="cx"> ObjCInspectorNetwork3BackendDispatcher(id<RWIProtocolNetwork3DomainHandler> handler) { m_delegate = handler; }
</span><del>- virtual void loadResource1(long callId) override;
- virtual void loadResource2(long callId) override;
- virtual void loadResource3(long callId) override;
- virtual void loadResource4(long callId) override;
- virtual void loadResource5(long callId) override;
- virtual void loadResource6(long callId) override;
- virtual void loadResource7(long callId) override;
</del><ins>+ virtual void loadResource1(long requestId) override;
+ virtual void loadResource2(long requestId) override;
+ virtual void loadResource3(long requestId) override;
+ virtual void loadResource4(long requestId) override;
+ virtual void loadResource5(long requestId) override;
+ virtual void loadResource6(long requestId) override;
+ virtual void loadResource7(long requestId) override;
</ins><span class="cx"> private:
</span><span class="cx"> RetainPtr<id<RWIProtocolNetwork3DomainHandler>> m_delegate;
</span><span class="cx"> };
</span><span class="lines">@@ -955,14 +986,15 @@
</span><span class="cx">
</span><span class="cx"> namespace Inspector {
</span><span class="cx">
</span><del>-void ObjCInspectorNetwork1BackendDispatcher::loadResource1(long callId)
</del><ins>+void ObjCInspectorNetwork1BackendDispatcher::loadResource1(long requestId)
</ins><span class="cx"> {
</span><span class="cx"> id errorCallback = ^(NSString *error) {
</span><del>- backendDispatcher()->sendResponse(callId, InspectorObject::create(), error);
</del><ins>+ backendDispatcher()->reportProtocolError(requestId, BackendDispatcher::ServerError, error);
+ backendDispatcher()->sendPendingErrors();
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> id successCallback = ^{
</span><del>- backendDispatcher()->sendResponse(callId, InspectorObject::create(), String());
</del><ins>+ backendDispatcher()->sendResponse(requestId, InspectorObject::create());
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> [m_delegate loadResource1WithErrorCallback:errorCallback successCallback:successCallback];
</span><span class="lines">@@ -971,92 +1003,99 @@
</span><span class="cx">
</span><span class="cx">
</span><span class="cx">
</span><del>-void ObjCInspectorNetwork3BackendDispatcher::loadResource1(long callId)
</del><ins>+void ObjCInspectorNetwork3BackendDispatcher::loadResource1(long requestId)
</ins><span class="cx"> {
</span><span class="cx"> id errorCallback = ^(NSString *error) {
</span><del>- backendDispatcher()->sendResponse(callId, InspectorObject::create(), error);
</del><ins>+ backendDispatcher()->reportProtocolError(requestId, BackendDispatcher::ServerError, error);
+ backendDispatcher()->sendPendingErrors();
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> id successCallback = ^{
</span><del>- backendDispatcher()->sendResponse(callId, InspectorObject::create(), String());
</del><ins>+ backendDispatcher()->sendResponse(requestId, InspectorObject::create());
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> [m_delegate loadResource1WithErrorCallback:errorCallback successCallback:successCallback];
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void ObjCInspectorNetwork3BackendDispatcher::loadResource2(long callId)
</del><ins>+void ObjCInspectorNetwork3BackendDispatcher::loadResource2(long requestId)
</ins><span class="cx"> {
</span><span class="cx"> id errorCallback = ^(NSString *error) {
</span><del>- backendDispatcher()->sendResponse(callId, InspectorObject::create(), error);
</del><ins>+ backendDispatcher()->reportProtocolError(requestId, BackendDispatcher::ServerError, error);
+ backendDispatcher()->sendPendingErrors();
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> id successCallback = ^{
</span><del>- backendDispatcher()->sendResponse(callId, InspectorObject::create(), String());
</del><ins>+ backendDispatcher()->sendResponse(requestId, InspectorObject::create());
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> [m_delegate loadResource2WithErrorCallback:errorCallback successCallback:successCallback];
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void ObjCInspectorNetwork3BackendDispatcher::loadResource3(long callId)
</del><ins>+void ObjCInspectorNetwork3BackendDispatcher::loadResource3(long requestId)
</ins><span class="cx"> {
</span><span class="cx"> id errorCallback = ^(NSString *error) {
</span><del>- backendDispatcher()->sendResponse(callId, InspectorObject::create(), error);
</del><ins>+ backendDispatcher()->reportProtocolError(requestId, BackendDispatcher::ServerError, error);
+ backendDispatcher()->sendPendingErrors();
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> id successCallback = ^{
</span><del>- backendDispatcher()->sendResponse(callId, InspectorObject::create(), String());
</del><ins>+ backendDispatcher()->sendResponse(requestId, InspectorObject::create());
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> [m_delegate loadResource3WithErrorCallback:errorCallback successCallback:successCallback];
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void ObjCInspectorNetwork3BackendDispatcher::loadResource4(long callId)
</del><ins>+void ObjCInspectorNetwork3BackendDispatcher::loadResource4(long requestId)
</ins><span class="cx"> {
</span><span class="cx"> id errorCallback = ^(NSString *error) {
</span><del>- backendDispatcher()->sendResponse(callId, InspectorObject::create(), error);
</del><ins>+ backendDispatcher()->reportProtocolError(requestId, BackendDispatcher::ServerError, error);
+ backendDispatcher()->sendPendingErrors();
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> id successCallback = ^{
</span><del>- backendDispatcher()->sendResponse(callId, InspectorObject::create(), String());
</del><ins>+ backendDispatcher()->sendResponse(requestId, InspectorObject::create());
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> [m_delegate loadResource4WithErrorCallback:errorCallback successCallback:successCallback];
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void ObjCInspectorNetwork3BackendDispatcher::loadResource5(long callId)
</del><ins>+void ObjCInspectorNetwork3BackendDispatcher::loadResource5(long requestId)
</ins><span class="cx"> {
</span><span class="cx"> id errorCallback = ^(NSString *error) {
</span><del>- backendDispatcher()->sendResponse(callId, InspectorObject::create(), error);
</del><ins>+ backendDispatcher()->reportProtocolError(requestId, BackendDispatcher::ServerError, error);
+ backendDispatcher()->sendPendingErrors();
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> id successCallback = ^{
</span><del>- backendDispatcher()->sendResponse(callId, InspectorObject::create(), String());
</del><ins>+ backendDispatcher()->sendResponse(requestId, InspectorObject::create());
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> [m_delegate loadResource5WithErrorCallback:errorCallback successCallback:successCallback];
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void ObjCInspectorNetwork3BackendDispatcher::loadResource6(long callId)
</del><ins>+void ObjCInspectorNetwork3BackendDispatcher::loadResource6(long requestId)
</ins><span class="cx"> {
</span><span class="cx"> id errorCallback = ^(NSString *error) {
</span><del>- backendDispatcher()->sendResponse(callId, InspectorObject::create(), error);
</del><ins>+ backendDispatcher()->reportProtocolError(requestId, BackendDispatcher::ServerError, error);
+ backendDispatcher()->sendPendingErrors();
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> id successCallback = ^{
</span><del>- backendDispatcher()->sendResponse(callId, InspectorObject::create(), String());
</del><ins>+ backendDispatcher()->sendResponse(requestId, InspectorObject::create());
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> [m_delegate loadResource6WithErrorCallback:errorCallback successCallback:successCallback];
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void ObjCInspectorNetwork3BackendDispatcher::loadResource7(long callId)
</del><ins>+void ObjCInspectorNetwork3BackendDispatcher::loadResource7(long requestId)
</ins><span class="cx"> {
</span><span class="cx"> id errorCallback = ^(NSString *error) {
</span><del>- backendDispatcher()->sendResponse(callId, InspectorObject::create(), error);
</del><ins>+ backendDispatcher()->reportProtocolError(requestId, BackendDispatcher::ServerError, error);
+ backendDispatcher()->sendPendingErrors();
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> id successCallback = ^{
</span><del>- backendDispatcher()->sendResponse(callId, InspectorObject::create(), String());
</del><ins>+ backendDispatcher()->sendResponse(requestId, InspectorObject::create());
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> [m_delegate loadResource7WithErrorCallback:errorCallback successCallback:successCallback];
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorscriptstestsexpectedenumvaluesjsonresult"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/enum-values.json-result (188964 => 188965)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/enum-values.json-result        2015-08-26 10:24:30 UTC (rev 188964)
+++ trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/enum-values.json-result        2015-08-26 14:34:38 UTC (rev 188965)
</span><span class="lines">@@ -169,9 +169,9 @@
</span><span class="cx"> class CommandDomainBackendDispatcher final : public SupplementalBackendDispatcher {
</span><span class="cx"> public:
</span><span class="cx"> static Ref<CommandDomainBackendDispatcher> create(BackendDispatcher*, CommandDomainBackendDispatcherHandler*);
</span><del>- virtual void dispatch(long callId, const String& method, Ref<InspectorObject>&& message) override;
</del><ins>+ virtual void dispatch(long requestId, const String& method, Ref<InspectorObject>&& message) override;
</ins><span class="cx"> private:
</span><del>- void commandWithEnumReturnValue(long callId, const InspectorObject& message);
</del><ins>+ void commandWithEnumReturnValue(long requestId, RefPtr<InspectorObject>&& parameters);
</ins><span class="cx"> private:
</span><span class="cx"> CommandDomainBackendDispatcher(BackendDispatcher&, CommandDomainBackendDispatcherHandler*);
</span><span class="cx"> CommandDomainBackendDispatcherHandler* m_agent;
</span><span class="lines">@@ -224,6 +224,7 @@
</span><span class="cx">
</span><span class="cx"> #include <inspector/InspectorFrontendChannel.h>
</span><span class="cx"> #include <inspector/InspectorValues.h>
</span><ins>+#include <wtf/NeverDestroyed.h>
</ins><span class="cx"> #include <wtf/text/CString.h>
</span><span class="cx">
</span><span class="cx"> #if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS)
</span><span class="lines">@@ -249,21 +250,24 @@
</span><span class="cx"> m_backendDispatcher->registerDispatcherForDomain(ASCIILiteral("CommandDomain"), this);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void CommandDomainBackendDispatcher::dispatch(long callId, const String& method, Ref<InspectorObject>&& message)
</del><ins>+void CommandDomainBackendDispatcher::dispatch(long requestId, const String& method, Ref<InspectorObject>&& message)
</ins><span class="cx"> {
</span><span class="cx"> Ref<CommandDomainBackendDispatcher> protect(*this);
</span><span class="cx">
</span><ins>+ RefPtr<InspectorObject> parameters;
+ message->getObject(ASCIILiteral("params"), parameters);
+
</ins><span class="cx"> if (method == "commandWithEnumReturnValue")
</span><del>- commandWithEnumReturnValue(callId, message);
</del><ins>+ commandWithEnumReturnValue(requestId, WTF::move(parameters));
</ins><span class="cx"> else
</span><del>- m_backendDispatcher->reportProtocolError(&callId, BackendDispatcher::MethodNotFound, makeString('\'', "CommandDomain", '.', method, "' was not found"));
</del><ins>+ m_backendDispatcher->reportProtocolError(BackendDispatcher::MethodNotFound, makeString('\'', "CommandDomain", '.', method, "' was not found"));
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void CommandDomainBackendDispatcher::commandWithEnumReturnValue(long callId, const InspectorObject&)
</del><ins>+void CommandDomainBackendDispatcher::commandWithEnumReturnValue(long requestId, RefPtr<InspectorObject>&&)
</ins><span class="cx"> {
</span><span class="cx"> #if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS)
</span><span class="cx"> if (m_alternateDispatcher) {
</span><del>- m_alternateDispatcher->commandWithEnumReturnValue(callId);
</del><ins>+ m_alternateDispatcher->commandWithEnumReturnValue(requestId);
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="lines">@@ -276,7 +280,10 @@
</span><span class="cx"> if (!error.length())
</span><span class="cx"> result->setString(ASCIILiteral("returnValue"), Inspector::Protocol::getEnumConstantValue(out_returnValue));
</span><span class="cx">
</span><del>- m_backendDispatcher->sendResponse(callId, WTF::move(result), error);
</del><ins>+ if (!error.length())
+ m_backendDispatcher->sendResponse(requestId, WTF::move(result));
+ else
+ m_backendDispatcher->reportProtocolError(BackendDispatcher::ServerError, WTF::move(error));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> } // namespace Inspector
</span><span class="lines">@@ -584,7 +591,7 @@
</span><span class="cx"> class ObjCInspectorCommandDomainBackendDispatcher final : public AlternateCommandDomainBackendDispatcher {
</span><span class="cx"> public:
</span><span class="cx"> ObjCInspectorCommandDomainBackendDispatcher(id<RWIProtocolCommandDomainDomainHandler> handler) { m_delegate = handler; }
</span><del>- virtual void commandWithEnumReturnValue(long callId) override;
</del><ins>+ virtual void commandWithEnumReturnValue(long requestId) override;
</ins><span class="cx"> private:
</span><span class="cx"> RetainPtr<id<RWIProtocolCommandDomainDomainHandler>> m_delegate;
</span><span class="cx"> };
</span><span class="lines">@@ -777,16 +784,17 @@
</span><span class="cx">
</span><span class="cx">
</span><span class="cx">
</span><del>-void ObjCInspectorCommandDomainBackendDispatcher::commandWithEnumReturnValue(long callId)
</del><ins>+void ObjCInspectorCommandDomainBackendDispatcher::commandWithEnumReturnValue(long requestId)
</ins><span class="cx"> {
</span><span class="cx"> id errorCallback = ^(NSString *error) {
</span><del>- backendDispatcher()->sendResponse(callId, InspectorObject::create(), error);
</del><ins>+ backendDispatcher()->reportProtocolError(requestId, BackendDispatcher::ServerError, error);
+ backendDispatcher()->sendPendingErrors();
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> id successCallback = ^(RWIProtocolCommandDomainCommandWithEnumReturnValueReturnValue returnValue) {
</span><span class="cx"> Ref<InspectorObject> resultObject = InspectorObject::create();
</span><span class="cx"> resultObject->setString(ASCIILiteral("returnValue"), toProtocolString(returnValue));
</span><del>- backendDispatcher()->sendResponse(callId, WTF::move(resultObject), String());
</del><ins>+ backendDispatcher()->sendResponse(requestId, WTF::move(resultObject));
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> [m_delegate commandWithEnumReturnValueWithErrorCallback:errorCallback successCallback:successCallback];
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorscriptstestsexpectedeventswithoptionalparametersjsonresult"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/events-with-optional-parameters.json-result (188964 => 188965)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/events-with-optional-parameters.json-result        2015-08-26 10:24:30 UTC (rev 188964)
+++ trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/events-with-optional-parameters.json-result        2015-08-26 14:34:38 UTC (rev 188965)
</span><span class="lines">@@ -180,6 +180,7 @@
</span><span class="cx">
</span><span class="cx"> #include <inspector/InspectorFrontendChannel.h>
</span><span class="cx"> #include <inspector/InspectorValues.h>
</span><ins>+#include <wtf/NeverDestroyed.h>
</ins><span class="cx"> #include <wtf/text/CString.h>
</span><span class="cx">
</span><span class="cx"> #if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorscriptstestsexpectedgeneratedomainswithfeatureguardsjsonresult"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/generate-domains-with-feature-guards.json-result (188964 => 188965)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/generate-domains-with-feature-guards.json-result        2015-08-26 10:24:30 UTC (rev 188964)
+++ trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/generate-domains-with-feature-guards.json-result        2015-08-26 14:34:38 UTC (rev 188965)
</span><span class="lines">@@ -165,9 +165,9 @@
</span><span class="cx"> class Network1BackendDispatcher final : public SupplementalBackendDispatcher {
</span><span class="cx"> public:
</span><span class="cx"> static Ref<Network1BackendDispatcher> create(BackendDispatcher*, Network1BackendDispatcherHandler*);
</span><del>- virtual void dispatch(long callId, const String& method, Ref<InspectorObject>&& message) override;
</del><ins>+ virtual void dispatch(long requestId, const String& method, Ref<InspectorObject>&& message) override;
</ins><span class="cx"> private:
</span><del>- void loadResource(long callId, const InspectorObject& message);
</del><ins>+ void loadResource(long requestId, RefPtr<InspectorObject>&& parameters);
</ins><span class="cx"> private:
</span><span class="cx"> Network1BackendDispatcher(BackendDispatcher&, Network1BackendDispatcherHandler*);
</span><span class="cx"> Network1BackendDispatcherHandler* m_agent;
</span><span class="lines">@@ -221,6 +221,7 @@
</span><span class="cx">
</span><span class="cx"> #include <inspector/InspectorFrontendChannel.h>
</span><span class="cx"> #include <inspector/InspectorValues.h>
</span><ins>+#include <wtf/NeverDestroyed.h>
</ins><span class="cx"> #include <wtf/text/CString.h>
</span><span class="cx">
</span><span class="cx"> #if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS)
</span><span class="lines">@@ -249,21 +250,24 @@
</span><span class="cx"> m_backendDispatcher->registerDispatcherForDomain(ASCIILiteral("Network1"), this);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void Network1BackendDispatcher::dispatch(long callId, const String& method, Ref<InspectorObject>&& message)
</del><ins>+void Network1BackendDispatcher::dispatch(long requestId, const String& method, Ref<InspectorObject>&& message)
</ins><span class="cx"> {
</span><span class="cx"> Ref<Network1BackendDispatcher> protect(*this);
</span><span class="cx">
</span><ins>+ RefPtr<InspectorObject> parameters;
+ message->getObject(ASCIILiteral("params"), parameters);
+
</ins><span class="cx"> if (method == "loadResource")
</span><del>- loadResource(callId, message);
</del><ins>+ loadResource(requestId, WTF::move(parameters));
</ins><span class="cx"> else
</span><del>- m_backendDispatcher->reportProtocolError(&callId, BackendDispatcher::MethodNotFound, makeString('\'', "Network1", '.', method, "' was not found"));
</del><ins>+ m_backendDispatcher->reportProtocolError(BackendDispatcher::MethodNotFound, makeString('\'', "Network1", '.', method, "' was not found"));
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void Network1BackendDispatcher::loadResource(long callId, const InspectorObject&)
</del><ins>+void Network1BackendDispatcher::loadResource(long requestId, RefPtr<InspectorObject>&&)
</ins><span class="cx"> {
</span><span class="cx"> #if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS)
</span><span class="cx"> if (m_alternateDispatcher) {
</span><del>- m_alternateDispatcher->loadResource(callId);
</del><ins>+ m_alternateDispatcher->loadResource(requestId);
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="lines">@@ -272,7 +276,10 @@
</span><span class="cx"> Ref<InspectorObject> result = InspectorObject::create();
</span><span class="cx"> m_agent->loadResource(error);
</span><span class="cx">
</span><del>- m_backendDispatcher->sendResponse(callId, WTF::move(result), error);
</del><ins>+ if (!error.length())
+ m_backendDispatcher->sendResponse(requestId, WTF::move(result));
+ else
+ m_backendDispatcher->reportProtocolError(BackendDispatcher::ServerError, WTF::move(error));
</ins><span class="cx"> }
</span><span class="cx"> #endif // PLATFORM(WEB_COMMANDS)
</span><span class="cx">
</span><span class="lines">@@ -627,7 +634,7 @@
</span><span class="cx"> class ObjCInspectorNetwork1BackendDispatcher final : public AlternateNetwork1BackendDispatcher {
</span><span class="cx"> public:
</span><span class="cx"> ObjCInspectorNetwork1BackendDispatcher(id<RWIProtocolNetwork1DomainHandler> handler) { m_delegate = handler; }
</span><del>- virtual void loadResource(long callId) override;
</del><ins>+ virtual void loadResource(long requestId) override;
</ins><span class="cx"> private:
</span><span class="cx"> RetainPtr<id<RWIProtocolNetwork1DomainHandler>> m_delegate;
</span><span class="cx"> };
</span><span class="lines">@@ -822,14 +829,15 @@
</span><span class="cx"> namespace Inspector {
</span><span class="cx">
</span><span class="cx"> #if PLATFORM(WEB_COMMANDS)
</span><del>-void ObjCInspectorNetwork1BackendDispatcher::loadResource(long callId)
</del><ins>+void ObjCInspectorNetwork1BackendDispatcher::loadResource(long requestId)
</ins><span class="cx"> {
</span><span class="cx"> id errorCallback = ^(NSString *error) {
</span><del>- backendDispatcher()->sendResponse(callId, InspectorObject::create(), error);
</del><ins>+ backendDispatcher()->reportProtocolError(requestId, BackendDispatcher::ServerError, error);
+ backendDispatcher()->sendPendingErrors();
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> id successCallback = ^{
</span><del>- backendDispatcher()->sendResponse(callId, InspectorObject::create(), String());
</del><ins>+ backendDispatcher()->sendResponse(requestId, InspectorObject::create());
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> [m_delegate loadResourceWithErrorCallback:errorCallback successCallback:successCallback];
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorscriptstestsexpectedsametypeiddifferentdomainjsonresult"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/same-type-id-different-domain.json-result (188964 => 188965)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/same-type-id-different-domain.json-result        2015-08-26 10:24:30 UTC (rev 188964)
+++ trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/same-type-id-different-domain.json-result        2015-08-26 14:34:38 UTC (rev 188965)
</span><span class="lines">@@ -174,6 +174,7 @@
</span><span class="cx">
</span><span class="cx"> #include <inspector/InspectorFrontendChannel.h>
</span><span class="cx"> #include <inspector/InspectorValues.h>
</span><ins>+#include <wtf/NeverDestroyed.h>
</ins><span class="cx"> #include <wtf/text/CString.h>
</span><span class="cx">
</span><span class="cx"> #if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorscriptstestsexpectedshadowedoptionaltypesettersjsonresult"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/shadowed-optional-type-setters.json-result (188964 => 188965)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/shadowed-optional-type-setters.json-result        2015-08-26 10:24:30 UTC (rev 188964)
+++ trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/shadowed-optional-type-setters.json-result        2015-08-26 14:34:38 UTC (rev 188965)
</span><span class="lines">@@ -174,6 +174,7 @@
</span><span class="cx">
</span><span class="cx"> #include <inspector/InspectorFrontendChannel.h>
</span><span class="cx"> #include <inspector/InspectorValues.h>
</span><ins>+#include <wtf/NeverDestroyed.h>
</ins><span class="cx"> #include <wtf/text/CString.h>
</span><span class="cx">
</span><span class="cx"> #if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorscriptstestsexpectedtypedeclarationaliasedprimitivetypejsonresult"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/type-declaration-aliased-primitive-type.json-result (188964 => 188965)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/type-declaration-aliased-primitive-type.json-result        2015-08-26 10:24:30 UTC (rev 188964)
+++ trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/type-declaration-aliased-primitive-type.json-result        2015-08-26 14:34:38 UTC (rev 188965)
</span><span class="lines">@@ -174,6 +174,7 @@
</span><span class="cx">
</span><span class="cx"> #include <inspector/InspectorFrontendChannel.h>
</span><span class="cx"> #include <inspector/InspectorValues.h>
</span><ins>+#include <wtf/NeverDestroyed.h>
</ins><span class="cx"> #include <wtf/text/CString.h>
</span><span class="cx">
</span><span class="cx"> #if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorscriptstestsexpectedtypedeclarationarraytypejsonresult"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/type-declaration-array-type.json-result (188964 => 188965)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/type-declaration-array-type.json-result        2015-08-26 10:24:30 UTC (rev 188964)
+++ trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/type-declaration-array-type.json-result        2015-08-26 14:34:38 UTC (rev 188965)
</span><span class="lines">@@ -177,6 +177,7 @@
</span><span class="cx">
</span><span class="cx"> #include <inspector/InspectorFrontendChannel.h>
</span><span class="cx"> #include <inspector/InspectorValues.h>
</span><ins>+#include <wtf/NeverDestroyed.h>
</ins><span class="cx"> #include <wtf/text/CString.h>
</span><span class="cx">
</span><span class="cx"> #if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorscriptstestsexpectedtypedeclarationenumtypejsonresult"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/type-declaration-enum-type.json-result (188964 => 188965)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/type-declaration-enum-type.json-result        2015-08-26 10:24:30 UTC (rev 188964)
+++ trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/type-declaration-enum-type.json-result        2015-08-26 14:34:38 UTC (rev 188965)
</span><span class="lines">@@ -178,6 +178,7 @@
</span><span class="cx">
</span><span class="cx"> #include <inspector/InspectorFrontendChannel.h>
</span><span class="cx"> #include <inspector/InspectorValues.h>
</span><ins>+#include <wtf/NeverDestroyed.h>
</ins><span class="cx"> #include <wtf/text/CString.h>
</span><span class="cx">
</span><span class="cx"> #if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorscriptstestsexpectedtypedeclarationobjecttypejsonresult"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/type-declaration-object-type.json-result (188964 => 188965)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/type-declaration-object-type.json-result        2015-08-26 10:24:30 UTC (rev 188964)
+++ trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/type-declaration-object-type.json-result        2015-08-26 14:34:38 UTC (rev 188965)
</span><span class="lines">@@ -174,6 +174,7 @@
</span><span class="cx">
</span><span class="cx"> #include <inspector/InspectorFrontendChannel.h>
</span><span class="cx"> #include <inspector/InspectorValues.h>
</span><ins>+#include <wtf/NeverDestroyed.h>
</ins><span class="cx"> #include <wtf/text/CString.h>
</span><span class="cx">
</span><span class="cx"> #if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorscriptstestsexpectedtyperequiringruntimecastsjsonresult"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/type-requiring-runtime-casts.json-result (188964 => 188965)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/type-requiring-runtime-casts.json-result        2015-08-26 10:24:30 UTC (rev 188964)
+++ trunk/Source/JavaScriptCore/inspector/scripts/tests/expected/type-requiring-runtime-casts.json-result        2015-08-26 14:34:38 UTC (rev 188965)
</span><span class="lines">@@ -178,6 +178,7 @@
</span><span class="cx">
</span><span class="cx"> #include <inspector/InspectorFrontendChannel.h>
</span><span class="cx"> #include <inspector/InspectorValues.h>
</span><ins>+#include <wtf/NeverDestroyed.h>
</ins><span class="cx"> #include <wtf/text/CString.h>
</span><span class="cx">
</span><span class="cx"> #if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS)
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/ChangeLog (188964 => 188965)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/ChangeLog        2015-08-26 10:24:30 UTC (rev 188964)
+++ trunk/Source/WebInspectorUI/ChangeLog        2015-08-26 14:34:38 UTC (rev 188965)
</span><span class="lines">@@ -1,3 +1,12 @@
</span><ins>+2015-08-25 Brian Burg <bburg@apple.com>
+
+ Web Inspector: no need to allocate protocolErrors array for every dispatched backend command
+ https://bugs.webkit.org/show_bug.cgi?id=146466
+
+ Reviewed by Joseph Pecoraro.
+
+ * UserInterface/TestStub.html: Fix a typo, this property exists on ProtocolTest.
+
</ins><span class="cx"> 2015-08-26 Matt Baker <mattbaker@apple.com>
</span><span class="cx">
</span><span class="cx"> Web Inspector: Rendering Frames legend item checkbox colors are too light
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceTestStubhtml"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/TestStub.html (188964 => 188965)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/TestStub.html        2015-08-26 10:24:30 UTC (rev 188964)
+++ trunk/Source/WebInspectorUI/UserInterface/TestStub.html        2015-08-26 14:34:38 UTC (rev 188965)
</span><span class="lines">@@ -47,7 +47,7 @@
</span><span class="cx"> ProtocolTest.dumpActivityToSystemConsole = false;
</span><span class="cx">
</span><span class="cx"> // Best used in combination with dumpActivityToSystemConsole.
</span><del>- InspectorProtocol.dumpInspectorProtocolMessages = false;
</del><ins>+ ProtocolTest.dumpInspectorProtocolMessages = false;
</ins><span class="cx"> </script>
</span><span class="cx"> </head>
</span><span class="cx"> </html>
</span></span></pre>
</div>
</div>
</body>
</html>