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

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

Issue 11316115: [chromedriver] Write websocket client and sync websocket client. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: address toyoshim's comments and change some NET_EXPORT_PRIVATE Created 8 years 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
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "chrome/test/chromedriver/net/sync_websocket.h"
6
7 #include "base/bind.h"
8 #include "base/callback.h"
9 #include "base/location.h"
10 #include "base/single_thread_task_runner.h"
11 #include "base/synchronization/waitable_event.h"
12 #include "googleurl/src/gurl.h"
13 #include "net/base/net_errors.h"
14 #include "net/url_request/url_request_context_getter.h"
15
16 SyncWebSocket::SyncWebSocket(
17 net::URLRequestContextGetter* context_getter)
18 : core_(new Core(context_getter)) {}
19
20 SyncWebSocket::~SyncWebSocket() {}
21
22 bool SyncWebSocket::Connect(const GURL& url) {
23 return core_->Connect(url);
24 }
25
26 bool SyncWebSocket::Send(const std::string& message) {
27 return core_->Send(message);
28 }
29
30 bool SyncWebSocket::ReceiveNextMessage(std::string* message) {
31 return core_->ReceiveNextMessage(message);
32 }
33
34 SyncWebSocket::Core::Core(net::URLRequestContextGetter* context_getter)
35 : context_getter_(context_getter),
36 closed_(false),
37 on_update_event_(&lock_) {}
38
39 bool SyncWebSocket::Core::Connect(const GURL& url) {
40 bool success = false;
41 base::WaitableEvent event(false, false);
42 context_getter_->GetNetworkTaskRunner()->PostTask(
43 FROM_HERE,
44 base::Bind(&SyncWebSocket::Core::ConnectOnIO,
45 this, url, &success, &event));
46 event.Wait();
47 return success;
48 }
49
50 bool SyncWebSocket::Core::Send(const std::string& message) {
51 bool success = false;
52 base::WaitableEvent event(false, false);
53 context_getter_->GetNetworkTaskRunner()->PostTask(
54 FROM_HERE,
55 base::Bind(&SyncWebSocket::Core::SendOnIO,
56 this, message, &success, &event));
57 event.Wait();
58 return success;
59 }
60
61 bool SyncWebSocket::Core::ReceiveNextMessage(std::string* message) {
62 base::AutoLock lock(lock_);
63 while (received_queue_.empty() && !closed_) on_update_event_.Wait();
64 if (closed_)
65 return false;
66 *message = received_queue_.front();
67 received_queue_.pop_front();
68 return true;
69 }
70
71 void SyncWebSocket::Core::OnMessageReceived(const std::string& message) {
72 base::AutoLock lock(lock_);
73 received_queue_.push_back(message);
74 on_update_event_.Signal();
75 }
76
77 void SyncWebSocket::Core::OnClose() {
78 base::AutoLock lock(lock_);
79 closed_ = true;
80 on_update_event_.Signal();
81 }
82
83 SyncWebSocket::Core::~Core() { }
84
85 void SyncWebSocket::Core::ConnectOnIO(
86 const GURL& url,
87 bool* success,
88 base::WaitableEvent* event) {
89 socket_.reset(new WebSocket(context_getter_, url, this));
90 socket_->Connect(base::Bind(
91 &SyncWebSocket::Core::OnConnectCompletedOnIO,
92 this, success, event));
93 }
94
95 void SyncWebSocket::Core::OnConnectCompletedOnIO(
96 bool* success,
97 base::WaitableEvent* event,
98 int error) {
99 *success = (error == net::OK);
100 event->Signal();
101 }
102
103 void SyncWebSocket::Core::SendOnIO(
104 const std::string& message,
105 bool* success,
106 base::WaitableEvent* event) {
107 *success = socket_->Send(message);
108 event->Signal();
109 }
110
111 void SyncWebSocket::Core::OnDestruct() const {
112 scoped_refptr<base::SingleThreadTaskRunner> network_task_runner =
113 context_getter_->GetNetworkTaskRunner();
114 if (network_task_runner->BelongsToCurrentThread())
115 delete this;
116 else
117 network_task_runner->DeleteSoon(FROM_HERE, this);
118 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698