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

Unified Diff: mojo/public/cpp/bindings/lib/router.cc

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/cpp/bindings/lib/router.cc
diff --git a/mojo/public/cpp/bindings/lib/router.cc b/mojo/public/cpp/bindings/lib/router.cc
index da5f34b1df57ce4bbfaf8668061d2bbde6bc3e49..2107a32facfd3c841b5c57ef24fda230c25baf8c 100644
--- a/mojo/public/cpp/bindings/lib/router.cc
+++ b/mojo/public/cpp/bindings/lib/router.cc
@@ -41,32 +41,33 @@ class ResponderThunk : public MessageReceiverWithStatus {
// We raise an error to signal the calling application that an error
// condition occurred. Without this the calling application would have no
// way of knowing it should stop waiting for a response.
+ Error error(Error::Type::REQUEST_CANCELED);
if (task_runner_->RunsTasksOnCurrentThread()) {
// Please note that even if this code is run from a different task
// runner on the same thread as |task_runner_|, it is okay to directly
// call Router::RaiseError(), because it will raise error from the
// correct task runner asynchronously.
if (router_)
- router_->RaiseError();
+ router_->RaiseError(std::move(error));
} else {
task_runner_->PostTask(FROM_HERE,
- base::Bind(&Router::RaiseError, router_));
+ base::Bind(&Router::RaiseError, router_,
+ base::Passed(&error)));
}
}
}
// MessageReceiver implementation:
- bool Accept(Message* message) override {
+ bool Accept(Message* message, Error* error) override {
DCHECK(task_runner_->RunsTasksOnCurrentThread());
accept_was_invoked_ = true;
DCHECK(message->has_flag(kMessageIsResponse));
- bool result = false;
-
if (router_)
- result = router_->Accept(message);
+ return router_->Accept(message, error);
- return result;
+ *error = Error(Error::Type::RESPONSE_DROPPED);
+ return false;
}
// MessageReceiverWithStatus implementation:
@@ -108,8 +109,9 @@ Router::HandleIncomingMessageThunk::HandleIncomingMessageThunk(Router* router)
Router::HandleIncomingMessageThunk::~HandleIncomingMessageThunk() {
}
-bool Router::HandleIncomingMessageThunk::Accept(Message* message) {
- return router_->HandleIncomingMessage(message);
+bool Router::HandleIncomingMessageThunk::Accept(Message* message,
+ Error* error) {
+ return router_->HandleIncomingMessage(message, error);
}
// ----------------------------------------------------------------------------
@@ -138,13 +140,15 @@ Router::Router(ScopedMessagePipeHandle message_pipe,
Router::~Router() {}
-bool Router::Accept(Message* message) {
+bool Router::Accept(Message* message, Error* error) {
DCHECK(thread_checker_.CalledOnValidThread());
DCHECK(!message->has_flag(kMessageExpectsResponse));
- return connector_.Accept(message);
+ return connector_.Accept(message, error);
}
-bool Router::AcceptWithResponder(Message* message, MessageReceiver* responder) {
+bool Router::AcceptWithResponder(Message* message,
+ MessageReceiver* responder,
+ Error* error) {
DCHECK(thread_checker_.CalledOnValidThread());
DCHECK(message->has_flag(kMessageExpectsResponse));
@@ -155,7 +159,7 @@ bool Router::AcceptWithResponder(Message* message, MessageReceiver* responder) {
bool is_sync = message->has_flag(kMessageIsSync);
message->set_request_id(request_id);
- if (!connector_.Accept(message))
+ if (!connector_.Accept(message, error))
return false;
if (!is_sync) {
@@ -178,7 +182,10 @@ bool Router::AcceptWithResponder(Message* message, MessageReceiver* responder) {
DCHECK_EQ(&response_received, iter->second->response_received);
if (response_received) {
std::unique_ptr<Message> response = std::move(iter->second->response);
- ignore_result(sync_responder->Accept(response.get()));
+
+ Error send_response_error;
+ ignore_result(sync_responder->Accept(response.get(),
+ &send_response_error));
}
sync_responses_.erase(iter);
}
@@ -193,7 +200,7 @@ void Router::EnableTestingMode() {
connector_.set_enforce_errors_from_incoming_receiver(false);
}
-bool Router::HandleIncomingMessage(Message* message) {
+bool Router::HandleIncomingMessage(Message* message, Error* error) {
DCHECK(thread_checker_.CalledOnValidThread());
const bool during_sync_call =
@@ -214,7 +221,7 @@ bool Router::HandleIncomingMessage(Message* message) {
return true;
}
- return HandleMessageInternal(message);
+ return HandleMessageInternal(message, error);
}
void Router::HandleQueuedMessages() {
@@ -226,12 +233,13 @@ void Router::HandleQueuedMessages() {
std::unique_ptr<Message> message(std::move(pending_messages_.front()));
pending_messages_.pop();
- bool result = HandleMessageInternal(message.get());
+ Error error;
+ bool result = HandleMessageInternal(message.get(), &error);
if (!weak_self)
return;
if (!result && !testing_mode_) {
- connector_.RaiseError();
+ connector_.RaiseError(std::move(error));
break;
}
}
@@ -245,14 +253,17 @@ void Router::HandleQueuedMessages() {
OnConnectionError();
}
-bool Router::HandleMessageInternal(Message* message) {
+bool Router::HandleMessageInternal(Message* message, Error* error) {
if (message->has_flag(kMessageExpectsResponse)) {
- if (!incoming_receiver_)
+ if (!incoming_receiver_) {
+ *error = Error(Error::Type::REQUEST_DROPPED);
return false;
+ }
MessageReceiverWithStatus* responder = new ResponderThunk(
weak_factory_.GetWeakPtr(), connector_.task_runner());
- bool ok = incoming_receiver_->AcceptWithResponder(message, responder);
+ bool ok = incoming_receiver_->AcceptWithResponder(message, responder,
+ error);
if (!ok)
delete responder;
return ok;
@@ -264,6 +275,7 @@ bool Router::HandleMessageInternal(Message* message) {
auto it = sync_responses_.find(request_id);
if (it == sync_responses_.end()) {
DCHECK(testing_mode_);
+ *error = Error::ForUnexpectedResponse(interface_name_, message);
return false;
}
it->second->response.reset(new Message());
@@ -275,16 +287,19 @@ bool Router::HandleMessageInternal(Message* message) {
auto it = async_responders_.find(request_id);
if (it == async_responders_.end()) {
DCHECK(testing_mode_);
+ *error = Error::ForUnexpectedResponse(interface_name_, message);
return false;
}
std::unique_ptr<MessageReceiver> responder = std::move(it->second);
async_responders_.erase(it);
- return responder->Accept(message);
+ return responder->Accept(message, error);
} else {
- if (!incoming_receiver_)
+ if (!incoming_receiver_) {
+ *error = Error(Error::Type::REQUEST_DROPPED);
return false;
+ }
- return incoming_receiver_->Accept(message);
+ return incoming_receiver_->Accept(message, error);
}
}

Powered by Google App Engine
This is Rietveld 408576698