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

Side by Side Diff: chrome/test/chromedriver/net/sync_websocket_impl.cc

Issue 12321057: [chromedriver] Implement reconnection to DevTools. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix nits. Created 7 years, 9 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/test/chromedriver/net/sync_websocket_impl.h" 5 #include "chrome/test/chromedriver/net/sync_websocket_impl.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/callback.h" 8 #include "base/callback.h"
9 #include "base/location.h" 9 #include "base/location.h"
10 #include "base/single_thread_task_runner.h" 10 #include "base/single_thread_task_runner.h"
11 #include "base/synchronization/waitable_event.h" 11 #include "base/synchronization/waitable_event.h"
12 #include "googleurl/src/gurl.h" 12 #include "googleurl/src/gurl.h"
13 #include "net/base/net_errors.h" 13 #include "net/base/net_errors.h"
14 #include "net/url_request/url_request_context_getter.h" 14 #include "net/url_request/url_request_context_getter.h"
15 15
16 SyncWebSocketImpl::SyncWebSocketImpl( 16 SyncWebSocketImpl::SyncWebSocketImpl(
17 net::URLRequestContextGetter* context_getter) 17 net::URLRequestContextGetter* context_getter)
18 : core_(new Core(context_getter)) {} 18 : core_(new Core(context_getter)) {}
19 19
20 SyncWebSocketImpl::~SyncWebSocketImpl() {} 20 SyncWebSocketImpl::~SyncWebSocketImpl() {}
21 21
22 bool SyncWebSocketImpl::IsConnected() {
23 return core_->IsConnected();
24 }
25
22 bool SyncWebSocketImpl::Connect(const GURL& url) { 26 bool SyncWebSocketImpl::Connect(const GURL& url) {
23 return core_->Connect(url); 27 return core_->Connect(url);
24 } 28 }
25 29
26 bool SyncWebSocketImpl::Send(const std::string& message) { 30 bool SyncWebSocketImpl::Send(const std::string& message) {
27 return core_->Send(message); 31 return core_->Send(message);
28 } 32 }
29 33
30 bool SyncWebSocketImpl::ReceiveNextMessage(std::string* message) { 34 bool SyncWebSocketImpl::ReceiveNextMessage(std::string* message) {
31 return core_->ReceiveNextMessage(message); 35 return core_->ReceiveNextMessage(message);
32 } 36 }
33 37
34 bool SyncWebSocketImpl::HasNextMessage() { 38 bool SyncWebSocketImpl::HasNextMessage() {
35 return core_->HasNextMessage(); 39 return core_->HasNextMessage();
36 } 40 }
37 41
38 SyncWebSocketImpl::Core::Core(net::URLRequestContextGetter* context_getter) 42 SyncWebSocketImpl::Core::Core(net::URLRequestContextGetter* context_getter)
39 : context_getter_(context_getter), 43 : context_getter_(context_getter),
40 closed_(false), 44 is_connected_(false),
41 on_update_event_(&lock_) {} 45 on_update_event_(&lock_) {}
42 46
47 bool SyncWebSocketImpl::Core::IsConnected() {
48 base::AutoLock lock(lock_);
49 return is_connected_;
50 }
51
43 bool SyncWebSocketImpl::Core::Connect(const GURL& url) { 52 bool SyncWebSocketImpl::Core::Connect(const GURL& url) {
44 bool success = false; 53 bool success = false;
45 base::WaitableEvent event(false, false); 54 base::WaitableEvent event(false, false);
46 context_getter_->GetNetworkTaskRunner()->PostTask( 55 context_getter_->GetNetworkTaskRunner()->PostTask(
47 FROM_HERE, 56 FROM_HERE,
48 base::Bind(&SyncWebSocketImpl::Core::ConnectOnIO, 57 base::Bind(&SyncWebSocketImpl::Core::ConnectOnIO,
49 this, url, &success, &event)); 58 this, url, &success, &event));
50 event.Wait(); 59 event.Wait();
51 return success; 60 return success;
52 } 61 }
53 62
54 bool SyncWebSocketImpl::Core::Send(const std::string& message) { 63 bool SyncWebSocketImpl::Core::Send(const std::string& message) {
55 bool success = false; 64 bool success = false;
56 base::WaitableEvent event(false, false); 65 base::WaitableEvent event(false, false);
57 context_getter_->GetNetworkTaskRunner()->PostTask( 66 context_getter_->GetNetworkTaskRunner()->PostTask(
58 FROM_HERE, 67 FROM_HERE,
59 base::Bind(&SyncWebSocketImpl::Core::SendOnIO, 68 base::Bind(&SyncWebSocketImpl::Core::SendOnIO,
60 this, message, &success, &event)); 69 this, message, &success, &event));
61 event.Wait(); 70 event.Wait();
62 return success; 71 return success;
63 } 72 }
64 73
65 bool SyncWebSocketImpl::Core::ReceiveNextMessage(std::string* message) { 74 bool SyncWebSocketImpl::Core::ReceiveNextMessage(std::string* message) {
66 base::AutoLock lock(lock_); 75 base::AutoLock lock(lock_);
67 while (received_queue_.empty() && !closed_) on_update_event_.Wait(); 76 while (received_queue_.empty() && is_connected_) on_update_event_.Wait();
68 if (closed_) 77 if (!is_connected_)
69 return false; 78 return false;
70 *message = received_queue_.front(); 79 *message = received_queue_.front();
71 received_queue_.pop_front(); 80 received_queue_.pop_front();
72 return true; 81 return true;
73 } 82 }
74 83
75 bool SyncWebSocketImpl::Core::HasNextMessage() { 84 bool SyncWebSocketImpl::Core::HasNextMessage() {
76 base::AutoLock lock(lock_); 85 base::AutoLock lock(lock_);
77 return !received_queue_.empty(); 86 return !received_queue_.empty();
78 } 87 }
79 88
80 void SyncWebSocketImpl::Core::OnMessageReceived(const std::string& message) { 89 void SyncWebSocketImpl::Core::OnMessageReceived(const std::string& message) {
81 base::AutoLock lock(lock_); 90 base::AutoLock lock(lock_);
82 received_queue_.push_back(message); 91 received_queue_.push_back(message);
83 on_update_event_.Signal(); 92 on_update_event_.Signal();
84 } 93 }
85 94
86 void SyncWebSocketImpl::Core::OnClose() { 95 void SyncWebSocketImpl::Core::OnClose() {
87 base::AutoLock lock(lock_); 96 base::AutoLock lock(lock_);
88 closed_ = true; 97 is_connected_ = false;
89 on_update_event_.Signal(); 98 on_update_event_.Signal();
90 } 99 }
91 100
92 SyncWebSocketImpl::Core::~Core() { } 101 SyncWebSocketImpl::Core::~Core() { }
93 102
94 void SyncWebSocketImpl::Core::ConnectOnIO( 103 void SyncWebSocketImpl::Core::ConnectOnIO(
95 const GURL& url, 104 const GURL& url,
96 bool* success, 105 bool* success,
97 base::WaitableEvent* event) { 106 base::WaitableEvent* event) {
107 {
108 base::AutoLock lock(lock_);
109 received_queue_.clear();
110 }
98 socket_.reset(new WebSocket(context_getter_, url, this)); 111 socket_.reset(new WebSocket(context_getter_, url, this));
99 socket_->Connect(base::Bind( 112 socket_->Connect(base::Bind(
100 &SyncWebSocketImpl::Core::OnConnectCompletedOnIO, 113 &SyncWebSocketImpl::Core::OnConnectCompletedOnIO,
101 this, success, event)); 114 this, success, event));
102 } 115 }
103 116
104 void SyncWebSocketImpl::Core::OnConnectCompletedOnIO( 117 void SyncWebSocketImpl::Core::OnConnectCompletedOnIO(
105 bool* success, 118 bool* success,
106 base::WaitableEvent* event, 119 base::WaitableEvent* event,
107 int error) { 120 int error) {
108 *success = (error == net::OK); 121 *success = (error == net::OK);
122 if (*success) {
123 base::AutoLock lock(lock_);
124 is_connected_ = true;
125 }
109 event->Signal(); 126 event->Signal();
110 } 127 }
111 128
112 void SyncWebSocketImpl::Core::SendOnIO( 129 void SyncWebSocketImpl::Core::SendOnIO(
113 const std::string& message, 130 const std::string& message,
114 bool* success, 131 bool* success,
115 base::WaitableEvent* event) { 132 base::WaitableEvent* event) {
116 *success = socket_->Send(message); 133 *success = socket_->Send(message);
117 event->Signal(); 134 event->Signal();
118 } 135 }
119 136
120 void SyncWebSocketImpl::Core::OnDestruct() const { 137 void SyncWebSocketImpl::Core::OnDestruct() const {
121 scoped_refptr<base::SingleThreadTaskRunner> network_task_runner = 138 scoped_refptr<base::SingleThreadTaskRunner> network_task_runner =
122 context_getter_->GetNetworkTaskRunner(); 139 context_getter_->GetNetworkTaskRunner();
123 if (network_task_runner->BelongsToCurrentThread()) 140 if (network_task_runner->BelongsToCurrentThread())
124 delete this; 141 delete this;
125 else 142 else
126 network_task_runner->DeleteSoon(FROM_HERE, this); 143 network_task_runner->DeleteSoon(FROM_HERE, this);
127 } 144 }
OLDNEW
« no previous file with comments | « chrome/test/chromedriver/net/sync_websocket_impl.h ('k') | chrome/test/chromedriver/net/sync_websocket_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698