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

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

Issue 12230021: [chromedriver] Send all OnConnected before any OnEvent when connected. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address comments. Created 7 years, 10 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/devtools_client_impl.cc
diff --git a/chrome/test/chromedriver/devtools_client_impl.cc b/chrome/test/chromedriver/devtools_client_impl.cc
index 25415a9636c74e78f46d01cc58bc7c4708d026f2..a5cb79fda45f39d8649708e64ac842ee132cb330 100644
--- a/chrome/test/chromedriver/devtools_client_impl.cc
+++ b/chrome/test/chromedriver/devtools_client_impl.cc
@@ -126,12 +126,9 @@ Status DevToolsClientImpl::SendCommandInternal(
if (!socket_->Connect(url_))
return Status(kDisconnected, "unable to connect to renderer");
connected_ = true;
- for (std::list<DevToolsEventListener*>::iterator iter = listeners_.begin();
- iter != listeners_.end(); ++iter) {
- Status status = (*iter)->OnConnected();
- if (status.IsError())
- return status;
- }
+
+ // OnConnected notification will be sent out in method ReceiveNextMessage.
+ listeners_for_on_connected_ = listeners_;
}
int command_id = next_id_++;
@@ -155,7 +152,7 @@ Status DevToolsClientImpl::ReceiveCommandResponse(
internal::InspectorEvent event;
internal::InspectorCommandResponse response;
cmd_response_map_[command_id] = NULL;
- while (cmd_response_map_[command_id] == NULL) {
+ while (!HasReceivedCommandResponse(command_id)) {
Status status = ReceiveNextMessage(command_id, &type, &event, &response);
if (status.IsError())
return status;
@@ -170,6 +167,18 @@ Status DevToolsClientImpl::ReceiveNextMessage(
internal::InspectorMessageType* type,
internal::InspectorEvent* event,
internal::InspectorCommandResponse* response) {
+ while (!listeners_for_on_connected_.empty()) {
+ DevToolsEventListener* listener = listeners_for_on_connected_.front();
+ listeners_for_on_connected_.pop_front();
+ Status status = listener->OnConnected();
+ if (status.IsError())
+ return status;
+ }
+ // The message might be received already when processing other commands sent
+ // from DevToolsEventListener::OnConnected.
+ if (HasReceivedCommandResponse(expected_id))
+ return Status(kOk);
+
std::string message;
if (!socket_->ReceiveNextMessage(&message)) {
connected_ = false;
@@ -193,6 +202,11 @@ Status DevToolsClientImpl::ReceiveNextMessage(
return Status(kOk);
}
+bool DevToolsClientImpl::HasReceivedCommandResponse(int cmd_id) {
+ return cmd_response_map_.find(cmd_id) != cmd_response_map_.end()
+ && cmd_response_map_[cmd_id] != NULL;
+}
+
Status DevToolsClientImpl::NotifyEventListeners(
const std::string& method,
const base::DictionaryValue& params) {
« no previous file with comments | « chrome/test/chromedriver/devtools_client_impl.h ('k') | chrome/test/chromedriver/devtools_client_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698