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

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

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

Powered by Google App Engine
This is Rietveld 408576698