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

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..648fcfe7355766a903c150f5dbaba7190893bd4a 100644
--- a/mojo/public/cpp/bindings/lib/router.cc
+++ b/mojo/public/cpp/bindings/lib/router.cc
@@ -41,32 +41,32 @@ 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.
+ Result error(Result::Type::RESPONSE_DROPPED);
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 {
+ Result Accept(Message* message) override {
DCHECK(task_runner_->RunsTasksOnCurrentThread());
accept_was_invoked_ = true;
DCHECK(message->has_flag(kMessageIsResponse));
- bool result = false;
+ if (!router_)
+ return Result(Result::Type::RESPONSE_DROPPED);
- if (router_)
- result = router_->Accept(message);
-
- return result;
+ return router_->Accept(message);
}
// MessageReceiverWithStatus implementation:
@@ -108,7 +108,8 @@ Router::HandleIncomingMessageThunk::HandleIncomingMessageThunk(Router* router)
Router::HandleIncomingMessageThunk::~HandleIncomingMessageThunk() {
}
-bool Router::HandleIncomingMessageThunk::Accept(Message* message) {
+MessageReceiver::Result Router::HandleIncomingMessageThunk::Accept(
+ Message* message) {
return router_->HandleIncomingMessage(message);
}
@@ -138,13 +139,15 @@ Router::Router(ScopedMessagePipeHandle message_pipe,
Router::~Router() {}
-bool Router::Accept(Message* message) {
+MessageReceiver::Result Router::Accept(Message* message) {
DCHECK(thread_checker_.CalledOnValidThread());
DCHECK(!message->has_flag(kMessageExpectsResponse));
return connector_.Accept(message);
}
-bool Router::AcceptWithResponder(Message* message, MessageReceiver* responder) {
+MessageReceiver::Result Router::AcceptWithResponder(
+ Message* message,
+ MessageReceiver* responder) {
DCHECK(thread_checker_.CalledOnValidThread());
DCHECK(message->has_flag(kMessageExpectsResponse));
@@ -155,13 +158,13 @@ bool Router::AcceptWithResponder(Message* message, MessageReceiver* responder) {
bool is_sync = message->has_flag(kMessageIsSync);
message->set_request_id(request_id);
- if (!connector_.Accept(message))
- return false;
+ if (!connector_.Accept(message).Succeeded())
+ return Result(Result::Type::SEND_FAILED);
if (!is_sync) {
// We assume ownership of |responder|.
async_responders_[request_id] = base::WrapUnique(responder);
- return true;
+ return Result::ForSuccess();
}
bool response_received = false;
@@ -183,8 +186,8 @@ bool Router::AcceptWithResponder(Message* message, MessageReceiver* responder) {
sync_responses_.erase(iter);
}
- // Return true means that we take ownership of |responder|.
- return true;
+ // Success means that we take ownership of |responder|.
+ return Result::ForSuccess();
}
void Router::EnableTestingMode() {
@@ -193,7 +196,7 @@ void Router::EnableTestingMode() {
connector_.set_enforce_errors_from_incoming_receiver(false);
}
-bool Router::HandleIncomingMessage(Message* message) {
+MessageReceiver::Result Router::HandleIncomingMessage(Message* message) {
DCHECK(thread_checker_.CalledOnValidThread());
const bool during_sync_call =
@@ -211,7 +214,7 @@ bool Router::HandleIncomingMessage(Message* message) {
weak_factory_.GetWeakPtr()));
}
- return true;
+ return Result::ForSuccess();
}
return HandleMessageInternal(message);
@@ -226,12 +229,12 @@ void Router::HandleQueuedMessages() {
std::unique_ptr<Message> message(std::move(pending_messages_.front()));
pending_messages_.pop();
- bool result = HandleMessageInternal(message.get());
+ Result result = HandleMessageInternal(message.get());
if (!weak_self)
return;
- if (!result && !testing_mode_) {
- connector_.RaiseError();
+ if (!result.Succeeded() && !testing_mode_) {
+ connector_.RaiseError(std::move(result));
break;
}
}
@@ -245,17 +248,17 @@ void Router::HandleQueuedMessages() {
OnConnectionError();
}
-bool Router::HandleMessageInternal(Message* message) {
+MessageReceiver::Result Router::HandleMessageInternal(Message* message) {
if (message->has_flag(kMessageExpectsResponse)) {
if (!incoming_receiver_)
- return false;
+ return Result(Result::Type::REQUEST_DROPPED);
MessageReceiverWithStatus* responder = new ResponderThunk(
weak_factory_.GetWeakPtr(), connector_.task_runner());
- bool ok = incoming_receiver_->AcceptWithResponder(message, responder);
- if (!ok)
+ Result result = incoming_receiver_->AcceptWithResponder(message, responder);
+ if (!result.Succeeded())
delete responder;
- return ok;
+ return result;
} else if (message->has_flag(kMessageIsResponse)) {
uint64_t request_id = message->request_id();
@@ -264,25 +267,25 @@ bool Router::HandleMessageInternal(Message* message) {
auto it = sync_responses_.find(request_id);
if (it == sync_responses_.end()) {
DCHECK(testing_mode_);
- return false;
+ return Result::ForUnexpectedResponse(interface_name_, message);
}
it->second->response.reset(new Message());
message->MoveTo(it->second->response.get());
*it->second->response_received = true;
- return true;
+ return Result::ForSuccess();
}
auto it = async_responders_.find(request_id);
if (it == async_responders_.end()) {
DCHECK(testing_mode_);
- return false;
+ return Result::ForUnexpectedResponse(interface_name_, message);
}
std::unique_ptr<MessageReceiver> responder = std::move(it->second);
async_responders_.erase(it);
return responder->Accept(message);
} else {
if (!incoming_receiver_)
- return false;
+ return Result(Result::Type::REQUEST_DROPPED);
return incoming_receiver_->Accept(message);
}

Powered by Google App Engine
This is Rietveld 408576698