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

Unified Diff: mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl

Issue 2064903002: Mojo: Report bindings validation errors via MojoNotifyBadMessage (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: . Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl
index aef7e9d3d78ac3354f1183be91189099eb9fb8b1..2539c86c0fa2bb2a0041d85c3134e548b8e7d7d8 100644
--- a/mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl
+++ b/mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl
@@ -5,7 +5,8 @@
{%- set proxy_name = interface.name ~ "Proxy" %}
{%- set namespace_as_string = "%s"|format(namespace|replace(".","::")) %}
-{%- macro alloc_params(struct, params, message, serialization_context) %}
+{%- macro alloc_params(struct, params, message, create_error, method_name,
+ serialization_context) %}
({{params}})->DecodePointers();
({{serialization_context}})->handles.Swap(({{message}})->mutable_handles());
bool success = true;
@@ -16,7 +17,7 @@
{{serialization_context}});
{{struct_macros.deserialize(struct, "input_data_view", "p_%s", "success")}}
if (!success)
- return false;
+ return {{create_error}}("{{class_name}}", "{{method_name}}", {{message}});
yzshen1 2016/06/15 16:22:33 Please consider using {{class_name}}::Name_ instea
{%- endmacro %}
{%- macro pass_params(parameters) %}
@@ -82,7 +83,7 @@ class {{class_name}}_{{method.name}}_HandleSyncResponse
{%- endfor %} {
DCHECK(!*result_);
}
- bool Accept(mojo::Message* message) override;
+ Result Accept(mojo::Message* message) override;
private:
mojo::internal::SerializationContext serialization_context_;
bool* result_;
@@ -91,13 +92,15 @@ class {{class_name}}_{{method.name}}_HandleSyncResponse
{%- endfor -%}
DISALLOW_COPY_AND_ASSIGN({{class_name}}_{{method.name}}_HandleSyncResponse);
};
-bool {{class_name}}_{{method.name}}_HandleSyncResponse::Accept(
+mojo::MessageReceiver::Result
+{{class_name}}_{{method.name}}_HandleSyncResponse::Accept(
mojo::Message* message) {
internal::{{class_name}}_{{method.name}}_ResponseParams_Data* params =
reinterpret_cast<internal::{{class_name}}_{{method.name}}_ResponseParams_Data*>(
message->mutable_payload());
{{alloc_params(method.response_param_struct, "params", "message",
+ "Result::ForBadResponse", method.name,
"&serialization_context_")}}
{%- for param in method.response_parameters %}
@@ -108,7 +111,7 @@ bool {{class_name}}_{{method.name}}_HandleSyncResponse::Accept(
{%- endif %}
{%- endfor %}
*result_ = true;
- return true;
+ return Result::ForSuccess();
}
{%- endif %}
@@ -120,22 +123,24 @@ class {{class_name}}_{{method.name}}_ForwardToCallback
scoped_refptr<mojo::internal::MultiplexRouter> router)
: callback_(callback), serialization_context_(std::move(router)) {
}
- bool Accept(mojo::Message* message) override;
+ Result Accept(mojo::Message* message) override;
private:
{{class_name}}::{{method.name}}Callback callback_;
mojo::internal::SerializationContext serialization_context_;
DISALLOW_COPY_AND_ASSIGN({{class_name}}_{{method.name}}_ForwardToCallback);
};
-bool {{class_name}}_{{method.name}}_ForwardToCallback::Accept(
+mojo::MessageReceiver::Result
+{{class_name}}_{{method.name}}_ForwardToCallback::Accept(
mojo::Message* message) {
internal::{{class_name}}_{{method.name}}_ResponseParams_Data* params =
reinterpret_cast<internal::{{class_name}}_{{method.name}}_ResponseParams_Data*>(
message->mutable_payload());
{{alloc_params(method.response_param_struct, "params", "message",
+ "Result::ForBadResponse", method.name,
"&serialization_context_")}}
callback_.Run({{pass_params(method.response_parameters)}});
- return true;
+ return Result::ForSuccess();
}
{%- endif %}
{%- endfor %}
@@ -171,8 +176,10 @@ bool {{proxy_name}}::{{method.name}}(
{%- for param in method.response_parameters -%}
, param_{{param.name}}
{%- endfor %});
- if (!receiver_->AcceptWithResponder(builder.message(), responder))
+ if (!receiver_->AcceptWithResponder(builder.message(),
+ responder).Succeeded()) {
delete responder;
+ }
return result;
}
{%- endif %}
@@ -193,14 +200,15 @@ void {{proxy_name}}::{{method.name}}(
{%- if method.response_parameters != None %}
mojo::MessageReceiver* responder =
- new {{class_name}}_{{method.name}}_ForwardToCallback(callback, serialization_context_.router);
- if (!receiver_->AcceptWithResponder(builder.message(), responder))
+ new {{class_name}}_{{method.name}}_ForwardToCallback(
+ callback, serialization_context_.router);
+ if (!receiver_->AcceptWithResponder(builder.message(), responder).Succeeded())
delete responder;
{%- else %}
- bool ok = receiver_->Accept(builder.message());
- // This return value may be ignored as !ok implies the Connector has
- // encountered an error, which will be visible through other means.
- ALLOW_UNUSED_LOCAL(ok);
+ // This return value may be ignored as any unsuccessful result implies the
+ // Connector has encountered an error, which will be visible through other
+ // means.
+ ignore_result(receiver_->Accept(builder.message()));
{%- endif %}
}
{%- endfor %}
@@ -261,11 +269,10 @@ void {{class_name}}_{{method.name}}_ProxyToResponder::Run(
is_sync_ ? mojo::internal::kMessageIsSync : 0);
{{build_message(response_params_struct, "in_%s", params_description,
"&serialization_context_")}}
- bool ok = responder_->Accept(builder.message());
- ALLOW_UNUSED_LOCAL(ok);
- // TODO(darin): !ok returned here indicates a malformed message, and that may
- // be good reason to close the connection. However, we don't have a way to do
+ // TODO(darin): Failure here indicates a malformed message, and that may be
yzshen1 2016/06/15 16:22:34 Does it make sense to replace this comment with th
+ // good reason to close the connection. However, we don't have a way to do
// that from here. We should add a way.
+ ignore_result(responder_->Accept(builder.message()));
delete responder_;
responder_ = nullptr;
}
@@ -274,14 +281,16 @@ void {{class_name}}_{{method.name}}_ProxyToResponder::Run(
{{class_name}}Stub::{{class_name}}Stub()
: sink_(nullptr),
- control_message_handler_({{interface.name}}::Version_) {
+ control_message_handler_({{interface.name}}::Name_,
+ {{interface.name}}::Version_) {
}
{{class_name}}Stub::~{{interface.name}}Stub() {}
{#--- Stub definition #}
-bool {{class_name}}Stub::Accept(mojo::Message* message) {
+mojo::MessageReceiver::Result {{class_name}}Stub::Accept(
+ mojo::Message* message) {
if (mojo::internal::ControlMessageHandler::IsControlMessage(message))
return control_message_handler_.Accept(message);
{%- if interface.methods %}
@@ -294,12 +303,13 @@ bool {{class_name}}Stub::Accept(mojo::Message* message) {
message->mutable_payload());
{{alloc_params(method.param_struct, "params", "message",
+ "Result::ForBadRequest", method.name,
"&serialization_context_")|indent(4)}}
// A null |sink_| means no implementation was bound.
assert(sink_);
TRACE_EVENT0("mojom", "{{class_name}}::{{method.name}}");
sink_->{{method.name}}({{pass_params(method.parameters)}});
- return true;
+ return Result::ForSuccess();
{%- else %}
break;
{%- endif %}
@@ -307,11 +317,12 @@ bool {{class_name}}Stub::Accept(mojo::Message* message) {
{%- endfor %}
}
{%- endif %}
- return false;
+ return Result::ForUnexpectedRequest("{{class_name}}", message);
}
-bool {{class_name}}Stub::AcceptWithResponder(
- mojo::Message* message, mojo::MessageReceiverWithStatus* responder) {
+mojo::MessageReceiver::Result {{class_name}}Stub::AcceptWithResponder(
+ mojo::Message* message,
+ mojo::MessageReceiverWithStatus* responder) {
if (mojo::internal::ControlMessageHandler::IsControlMessage(message))
return control_message_handler_.AcceptWithResponder(message, responder);
{%- if interface.methods %}
@@ -324,6 +335,7 @@ bool {{class_name}}Stub::AcceptWithResponder(
message->mutable_payload());
{{alloc_params(method.param_struct, "params", "message",
+ "Result::ForBadRequest", method.name,
"&serialization_context_")|indent(4)}}
{{class_name}}::{{method.name}}Callback::Runnable* runnable =
new {{class_name}}_{{method.name}}_ProxyToResponder(
@@ -337,7 +349,7 @@ bool {{class_name}}Stub::AcceptWithResponder(
TRACE_EVENT0("mojom", "{{class_name}}::{{method.name}}");
sink_->{{method.name}}(
{%- if method.parameters -%}{{pass_params(method.parameters)}}, {% endif -%}callback);
- return true;
+ return Result::ForSuccess();
{%- else %}
break;
{%- endif %}
@@ -345,7 +357,7 @@ bool {{class_name}}Stub::AcceptWithResponder(
{%- endfor %}
}
{%- endif %}
- return false;
+ return Result::ForUnexpectedRequest("{{class_name}}", message);
}
{#--- Request validator definitions #}
@@ -354,12 +366,13 @@ bool {{class_name}}Stub::AcceptWithResponder(
mojo::MessageReceiver* sink) : MessageFilter(sink) {
}
-bool {{class_name}}RequestValidator::Accept(mojo::Message* message) {
+mojo::MessageReceiver::Result {{class_name}}RequestValidator::Accept(
+ mojo::Message* message) {
assert(sink_);
if (mojo::internal::ControlMessageHandler::IsControlMessage(message)) {
if (!mojo::internal::ValidateControlRequest(message))
- return false;
+ return Result::ForBadControlMessage("{{class_name}}", message);
return sink_->Accept(message);
}
@@ -367,15 +380,20 @@ bool {{class_name}}RequestValidator::Accept(mojo::Message* message) {
{%- for method in interface.methods %}
case internal::k{{class_name}}_{{method.name}}_Name: {
{%- if method.response_parameters != None %}
- if (!mojo::internal::ValidateMessageIsRequestExpectingResponse(message))
- return false;
+ if (!mojo::internal::ValidateMessageIsRequestExpectingResponse(message)) {
+ return Result::ForBadRequest(
+ "{{class_name}}", "{{method.name}}", message);
+ }
{%- else %}
- if (!mojo::internal::ValidateMessageIsRequestWithoutResponse(message))
- return false;
+ if (!mojo::internal::ValidateMessageIsRequestWithoutResponse(message)) {
+ return Result::ForBadRequest(
+ "{{class_name}}", "{{method.name}}", message);
+ }
{%- endif %}
if (!mojo::internal::ValidateMessagePayload<
internal::{{class_name}}_{{method.name}}_Params_Data>(message)) {
- return false;
+ return Result::ForBadRequest(
+ "{{class_name}}", "{{method.name}}", message);
}
return sink_->Accept(message);
}
@@ -387,7 +405,7 @@ bool {{class_name}}RequestValidator::Accept(mojo::Message* message) {
// Unrecognized message.
ReportValidationError(
mojo::internal::VALIDATION_ERROR_MESSAGE_HEADER_UNKNOWN_METHOD);
- return false;
+ return Result::ForUnexpectedRequest("{{class_name}}", message);
}
{#--- Response validator definitions #}
@@ -396,23 +414,26 @@ bool {{class_name}}RequestValidator::Accept(mojo::Message* message) {
mojo::MessageReceiver* sink) : MessageFilter(sink) {
}
-bool {{class_name}}ResponseValidator::Accept(mojo::Message* message) {
+mojo::MessageReceiver::Result {{class_name}}ResponseValidator::Accept(
+ mojo::Message* message) {
assert(sink_);
if (mojo::internal::ControlMessageHandler::IsControlMessage(message)) {
if (!mojo::internal::ValidateControlResponse(message))
- return false;
+ return Result::ForBadControlMessage("{{class_name}}", message);
return sink_->Accept(message);
}
if (!mojo::internal::ValidateMessageIsResponse(message))
- return false;
+ return Result::ForUnexpectedRequest("{{class_name}}", message);
switch (message->header()->name) {
{%- for method in interface.methods if method.response_parameters != None %}
case internal::k{{class_name}}_{{method.name}}_Name: {
if (!mojo::internal::ValidateMessagePayload<
- internal::{{class_name}}_{{method.name}}_ResponseParams_Data>(message)) {
- return false;
+ internal::{{class_name}}_{{method.name}}_ResponseParams_Data>(
+ message)) {
+ return Result::ForBadResponse(
+ "{{class_name}}", "{{method.name}}", message);
}
return sink_->Accept(message);
}
@@ -424,6 +445,6 @@ bool {{class_name}}ResponseValidator::Accept(mojo::Message* message) {
// Unrecognized message.
ReportValidationError(
mojo::internal::VALIDATION_ERROR_MESSAGE_HEADER_UNKNOWN_METHOD);
- return false;
+ return Result::ForUnexpectedResponse("{{class_name}}", message);
}
{%- endif -%}

Powered by Google App Engine
This is Rietveld 408576698