Index: chrome/test/chromedriver/chrome/devtools_client_impl.cc |
diff --git a/chrome/test/chromedriver/chrome/devtools_client_impl.cc b/chrome/test/chromedriver/chrome/devtools_client_impl.cc |
index 89906efa3fa6ca223a926ff738ba753e19c0fd95..4adedbf2ad1fbaf1aa9af579dcd685c42ca27652 100644 |
--- a/chrome/test/chromedriver/chrome/devtools_client_impl.cc |
+++ b/chrome/test/chromedriver/chrome/devtools_client_impl.cc |
@@ -178,7 +178,8 @@ Status DevToolsClientImpl::HandleEventsUntil( |
return Status(kOk); |
} |
-DevToolsClientImpl::ResponseInfo::ResponseInfo() : state(kWaiting) {} |
+DevToolsClientImpl::ResponseInfo::ResponseInfo(const std::string& method) |
+ : state(kWaiting), method(method) {} |
DevToolsClientImpl::ResponseInfo::~ResponseInfo() {} |
@@ -200,7 +201,8 @@ Status DevToolsClientImpl::SendCommandInternal( |
if (!socket_->Send(message)) |
return Status(kDisconnected, "unable to send message to renderer"); |
- linked_ptr<ResponseInfo> response_info = make_linked_ptr(new ResponseInfo()); |
+ linked_ptr<ResponseInfo> response_info = |
+ make_linked_ptr(new ResponseInfo(method)); |
response_info_map_[command_id] = response_info; |
while (response_info->state == kWaiting) { |
Status status = ProcessNextMessage(command_id); |
@@ -231,6 +233,9 @@ Status DevToolsClientImpl::ProcessNextMessage(int expected_id) { |
status = EnsureListenersNotifiedOfEvent(); |
if (status.IsError()) |
return status; |
+ status = EnsureListenersNotifiedOfCommandResponse(); |
+ if (status.IsError()) |
+ return status; |
// The command response may have already been received or blocked while |
// notifying listeners. |
@@ -300,15 +305,25 @@ Status DevToolsClientImpl::ProcessCommandResponse( |
linked_ptr<ResponseInfo> response_info = response_info_map_[response.id]; |
if (response_info->state == kReceived) |
return Status(kUnknownError, "received multiple command responses"); |
+ |
if (response_info->state == kIgnored) { |
response_info_map_.erase(response.id); |
- return Status(kOk); |
+ } else { |
+ response_info->state = kReceived; |
+ response_info->response.id = response.id; |
+ response_info->response.error = response.error; |
+ if (response.result) |
+ response_info->response.result.reset(response.result->DeepCopy()); |
+ } |
+ |
+ if (response.result) { |
+ unnotified_cmd_response_listeners_ = listeners_; |
+ unnotified_cmd_response_info_ = response_info; |
+ Status status = EnsureListenersNotifiedOfCommandResponse(); |
+ unnotified_cmd_response_info_.reset(); |
+ if (status.IsError()) |
+ return status; |
} |
- response_info->state = kReceived; |
- response_info->response.id = response.id; |
- response_info->response.error = response.error; |
- if (response.result) |
- response_info->response.result.reset(response.result->DeepCopy()); |
return Status(kOk); |
} |
@@ -333,6 +348,19 @@ Status DevToolsClientImpl::EnsureListenersNotifiedOfEvent() { |
return Status(kOk); |
} |
+Status DevToolsClientImpl::EnsureListenersNotifiedOfCommandResponse() { |
+ while (unnotified_cmd_response_listeners_.size()) { |
+ DevToolsEventListener* listener = |
+ unnotified_cmd_response_listeners_.front(); |
+ unnotified_cmd_response_listeners_.pop_front(); |
+ Status status = |
+ listener->OnCommandSuccess(this, unnotified_cmd_response_info_->method); |
+ if (status.IsError()) |
+ return status; |
+ } |
+ return Status(kOk); |
+} |
+ |
namespace internal { |
bool ParseInspectorMessage( |