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

Unified Diff: chrome/test/chromedriver/chrome/devtools_client_impl.cc

Issue 15772009: [chromedriver] Fix race where we might not wait for page load after navigating. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 7 years, 7 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: 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(

Powered by Google App Engine
This is Rietveld 408576698