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); |
} |
} |