| OLD | NEW |
| 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/websocket.h" | 5 #include "chrome/test/chromedriver/net/websocket.h" |
| 6 | 6 |
| 7 #include "base/base64.h" | 7 #include "base/base64.h" |
| 8 #include "base/bind.h" | 8 #include "base/bind.h" |
| 9 #include "base/bind_helpers.h" | 9 #include "base/bind_helpers.h" |
| 10 #include "base/memory/scoped_vector.h" | 10 #include "base/memory/scoped_vector.h" |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 121 | 121 |
| 122 void WebSocket::ContinueWritingIfNecessary() { | 122 void WebSocket::ContinueWritingIfNecessary() { |
| 123 if (!write_buffer_->BytesRemaining()) { | 123 if (!write_buffer_->BytesRemaining()) { |
| 124 if (pending_write_.empty()) | 124 if (pending_write_.empty()) |
| 125 return; | 125 return; |
| 126 write_buffer_ = new net::DrainableIOBuffer( | 126 write_buffer_ = new net::DrainableIOBuffer( |
| 127 new net::StringIOBuffer(pending_write_), | 127 new net::StringIOBuffer(pending_write_), |
| 128 pending_write_.length()); | 128 pending_write_.length()); |
| 129 pending_write_.clear(); | 129 pending_write_.clear(); |
| 130 } | 130 } |
| 131 int code = socket_->Write( | 131 int code = |
| 132 write_buffer_, | 132 socket_->Write(write_buffer_.get(), |
| 133 write_buffer_->BytesRemaining(), | 133 write_buffer_->BytesRemaining(), |
| 134 base::Bind(&WebSocket::OnWrite, base::Unretained(this))); | 134 base::Bind(&WebSocket::OnWrite, base::Unretained(this))); |
| 135 if (code != net::ERR_IO_PENDING) | 135 if (code != net::ERR_IO_PENDING) |
| 136 OnWrite(code); | 136 OnWrite(code); |
| 137 } | 137 } |
| 138 | 138 |
| 139 void WebSocket::Read() { | 139 void WebSocket::Read() { |
| 140 int code = socket_->Read( | 140 int code = |
| 141 read_buffer_, | 141 socket_->Read(read_buffer_.get(), |
| 142 read_buffer_->size(), | 142 read_buffer_->size(), |
| 143 base::Bind(&WebSocket::OnRead, base::Unretained(this))); | 143 base::Bind(&WebSocket::OnRead, base::Unretained(this))); |
| 144 if (code != net::ERR_IO_PENDING) | 144 if (code != net::ERR_IO_PENDING) |
| 145 OnRead(code); | 145 OnRead(code); |
| 146 } | 146 } |
| 147 | 147 |
| 148 void WebSocket::OnRead(int code) { | 148 void WebSocket::OnRead(int code) { |
| 149 if (code <= 0) { | 149 if (code <= 0) { |
| 150 Close(code ? code : net::ERR_FAILED); | 150 Close(code ? code : net::ERR_FAILED); |
| 151 return; | 151 return; |
| 152 } | 152 } |
| 153 | 153 |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 189 InvokeConnectCallback(net::OK); | 189 InvokeConnectCallback(net::OK); |
| 190 if (!leftover_message.empty()) | 190 if (!leftover_message.empty()) |
| 191 OnReadDuringOpen(leftover_message.c_str(), leftover_message.length()); | 191 OnReadDuringOpen(leftover_message.c_str(), leftover_message.length()); |
| 192 } | 192 } |
| 193 | 193 |
| 194 void WebSocket::OnReadDuringOpen(const char* data, int len) { | 194 void WebSocket::OnReadDuringOpen(const char* data, int len) { |
| 195 ScopedVector<net::WebSocketFrameChunk> frame_chunks; | 195 ScopedVector<net::WebSocketFrameChunk> frame_chunks; |
| 196 CHECK(parser_.Decode(data, len, &frame_chunks)); | 196 CHECK(parser_.Decode(data, len, &frame_chunks)); |
| 197 for (size_t i = 0; i < frame_chunks.size(); ++i) { | 197 for (size_t i = 0; i < frame_chunks.size(); ++i) { |
| 198 scoped_refptr<net::IOBufferWithSize> buffer = frame_chunks[i]->data; | 198 scoped_refptr<net::IOBufferWithSize> buffer = frame_chunks[i]->data; |
| 199 if (buffer) | 199 if (buffer.get()) |
| 200 next_message_ += std::string(buffer->data(), buffer->size()); | 200 next_message_ += std::string(buffer->data(), buffer->size()); |
| 201 if (frame_chunks[i]->final_chunk) { | 201 if (frame_chunks[i]->final_chunk) { |
| 202 listener_->OnMessageReceived(next_message_); | 202 listener_->OnMessageReceived(next_message_); |
| 203 next_message_.clear(); | 203 next_message_.clear(); |
| 204 } | 204 } |
| 205 } | 205 } |
| 206 } | 206 } |
| 207 | 207 |
| 208 void WebSocket::InvokeConnectCallback(int code) { | 208 void WebSocket::InvokeConnectCallback(int code) { |
| 209 net::CompletionCallback temp = connect_callback_; | 209 net::CompletionCallback temp = connect_callback_; |
| 210 connect_callback_.Reset(); | 210 connect_callback_.Reset(); |
| 211 CHECK(!temp.is_null()); | 211 CHECK(!temp.is_null()); |
| 212 temp.Run(code); | 212 temp.Run(code); |
| 213 } | 213 } |
| 214 | 214 |
| 215 void WebSocket::Close(int code) { | 215 void WebSocket::Close(int code) { |
| 216 socket_->Disconnect(); | 216 socket_->Disconnect(); |
| 217 if (!connect_callback_.is_null()) | 217 if (!connect_callback_.is_null()) |
| 218 InvokeConnectCallback(code); | 218 InvokeConnectCallback(code); |
| 219 if (state_ == OPEN) | 219 if (state_ == OPEN) |
| 220 listener_->OnClose(); | 220 listener_->OnClose(); |
| 221 | 221 |
| 222 state_ = CLOSED; | 222 state_ = CLOSED; |
| 223 } | 223 } |
| 224 | 224 |
| 225 | 225 |
| OLD | NEW |