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

Side by Side Diff: net/websockets/websocket_channel.cc

Issue 1545233002: Convert Pass()→std::move() in //net (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 12 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
« no previous file with comments | « net/websockets/websocket_basic_stream_test.cc ('k') | net/websockets/websocket_channel_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 "net/websockets/websocket_channel.h" 5 #include "net/websockets/websocket_channel.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <limits.h> // for INT_MAX 8 #include <limits.h> // for INT_MAX
9 9
10 #include <algorithm> 10 #include <algorithm>
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
146 std::vector<scoped_ptr<WebSocketFrame>> frames_; 146 std::vector<scoped_ptr<WebSocketFrame>> frames_;
147 147
148 // The total size of the payload data in |frames_|. This will be used to 148 // The total size of the payload data in |frames_|. This will be used to
149 // measure the throughput of the link. 149 // measure the throughput of the link.
150 // TODO(ricea): Measure the throughput of the link. 150 // TODO(ricea): Measure the throughput of the link.
151 uint64_t total_bytes_; 151 uint64_t total_bytes_;
152 }; 152 };
153 153
154 void WebSocketChannel::SendBuffer::AddFrame(scoped_ptr<WebSocketFrame> frame) { 154 void WebSocketChannel::SendBuffer::AddFrame(scoped_ptr<WebSocketFrame> frame) {
155 total_bytes_ += frame->header.payload_length; 155 total_bytes_ += frame->header.payload_length;
156 frames_.push_back(frame.Pass()); 156 frames_.push_back(std::move(frame));
157 } 157 }
158 158
159 // Implementation of WebSocketStream::ConnectDelegate that simply forwards the 159 // Implementation of WebSocketStream::ConnectDelegate that simply forwards the
160 // calls on to the WebSocketChannel that created it. 160 // calls on to the WebSocketChannel that created it.
161 class WebSocketChannel::ConnectDelegate 161 class WebSocketChannel::ConnectDelegate
162 : public WebSocketStream::ConnectDelegate { 162 : public WebSocketStream::ConnectDelegate {
163 public: 163 public:
164 explicit ConnectDelegate(WebSocketChannel* creator) : creator_(creator) {} 164 explicit ConnectDelegate(WebSocketChannel* creator) : creator_(creator) {}
165 165
166 void OnSuccess(scoped_ptr<WebSocketStream> stream) override { 166 void OnSuccess(scoped_ptr<WebSocketStream> stream) override {
167 creator_->OnConnectSuccess(stream.Pass()); 167 creator_->OnConnectSuccess(std::move(stream));
168 // |this| may have been deleted. 168 // |this| may have been deleted.
169 } 169 }
170 170
171 void OnFailure(const std::string& message) override { 171 void OnFailure(const std::string& message) override {
172 creator_->OnConnectFailure(message); 172 creator_->OnConnectFailure(message);
173 // |this| has been deleted. 173 // |this| has been deleted.
174 } 174 }
175 175
176 void OnStartOpeningHandshake( 176 void OnStartOpeningHandshake(
177 scoped_ptr<WebSocketHandshakeRequestInfo> request) override { 177 scoped_ptr<WebSocketHandshakeRequestInfo> request) override {
178 creator_->OnStartOpeningHandshake(request.Pass()); 178 creator_->OnStartOpeningHandshake(std::move(request));
179 } 179 }
180 180
181 void OnFinishOpeningHandshake( 181 void OnFinishOpeningHandshake(
182 scoped_ptr<WebSocketHandshakeResponseInfo> response) override { 182 scoped_ptr<WebSocketHandshakeResponseInfo> response) override {
183 creator_->OnFinishOpeningHandshake(response.Pass()); 183 creator_->OnFinishOpeningHandshake(std::move(response));
184 } 184 }
185 185
186 void OnSSLCertificateError( 186 void OnSSLCertificateError(
187 scoped_ptr<WebSocketEventInterface::SSLErrorCallbacks> 187 scoped_ptr<WebSocketEventInterface::SSLErrorCallbacks>
188 ssl_error_callbacks, 188 ssl_error_callbacks,
189 const SSLInfo& ssl_info, 189 const SSLInfo& ssl_info,
190 bool fatal) override { 190 bool fatal) override {
191 creator_->OnSSLCertificateError( 191 creator_->OnSSLCertificateError(std::move(ssl_error_callbacks), ssl_info,
192 ssl_error_callbacks.Pass(), ssl_info, fatal); 192 fatal);
193 } 193 }
194 194
195 private: 195 private:
196 // A pointer to the WebSocketChannel that created this object. There is no 196 // A pointer to the WebSocketChannel that created this object. There is no
197 // danger of this pointer being stale, because deleting the WebSocketChannel 197 // danger of this pointer being stale, because deleting the WebSocketChannel
198 // cancels the connect process, deleting this object and preventing its 198 // cancels the connect process, deleting this object and preventing its
199 // callbacks from being called. 199 // callbacks from being called.
200 WebSocketChannel* const creator_; 200 WebSocketChannel* const creator_;
201 201
202 DISALLOW_COPY_AND_ASSIGN(ConnectDelegate); 202 DISALLOW_COPY_AND_ASSIGN(ConnectDelegate);
203 }; 203 };
204 204
205 class WebSocketChannel::HandshakeNotificationSender 205 class WebSocketChannel::HandshakeNotificationSender
206 : public base::SupportsWeakPtr<HandshakeNotificationSender> { 206 : public base::SupportsWeakPtr<HandshakeNotificationSender> {
207 public: 207 public:
208 explicit HandshakeNotificationSender(WebSocketChannel* channel); 208 explicit HandshakeNotificationSender(WebSocketChannel* channel);
209 ~HandshakeNotificationSender(); 209 ~HandshakeNotificationSender();
210 210
211 static void Send(base::WeakPtr<HandshakeNotificationSender> sender); 211 static void Send(base::WeakPtr<HandshakeNotificationSender> sender);
212 212
213 ChannelState SendImmediately(WebSocketEventInterface* event_interface); 213 ChannelState SendImmediately(WebSocketEventInterface* event_interface);
214 214
215 const WebSocketHandshakeRequestInfo* handshake_request_info() const { 215 const WebSocketHandshakeRequestInfo* handshake_request_info() const {
216 return handshake_request_info_.get(); 216 return handshake_request_info_.get();
217 } 217 }
218 218
219 void set_handshake_request_info( 219 void set_handshake_request_info(
220 scoped_ptr<WebSocketHandshakeRequestInfo> request_info) { 220 scoped_ptr<WebSocketHandshakeRequestInfo> request_info) {
221 handshake_request_info_ = request_info.Pass(); 221 handshake_request_info_ = std::move(request_info);
222 } 222 }
223 223
224 const WebSocketHandshakeResponseInfo* handshake_response_info() const { 224 const WebSocketHandshakeResponseInfo* handshake_response_info() const {
225 return handshake_response_info_.get(); 225 return handshake_response_info_.get();
226 } 226 }
227 227
228 void set_handshake_response_info( 228 void set_handshake_response_info(
229 scoped_ptr<WebSocketHandshakeResponseInfo> response_info) { 229 scoped_ptr<WebSocketHandshakeResponseInfo> response_info) {
230 handshake_response_info_ = response_info.Pass(); 230 handshake_response_info_ = std::move(response_info);
231 } 231 }
232 232
233 private: 233 private:
234 WebSocketChannel* owner_; 234 WebSocketChannel* owner_;
235 scoped_ptr<WebSocketHandshakeRequestInfo> handshake_request_info_; 235 scoped_ptr<WebSocketHandshakeRequestInfo> handshake_request_info_;
236 scoped_ptr<WebSocketHandshakeResponseInfo> handshake_response_info_; 236 scoped_ptr<WebSocketHandshakeResponseInfo> handshake_response_info_;
237 }; 237 };
238 238
239 WebSocketChannel::HandshakeNotificationSender::HandshakeNotificationSender( 239 WebSocketChannel::HandshakeNotificationSender::HandshakeNotificationSender(
240 WebSocketChannel* channel) 240 WebSocketChannel* channel)
241 : owner_(channel) {} 241 : owner_(channel) {}
242 242
243 WebSocketChannel::HandshakeNotificationSender::~HandshakeNotificationSender() {} 243 WebSocketChannel::HandshakeNotificationSender::~HandshakeNotificationSender() {}
244 244
245 void WebSocketChannel::HandshakeNotificationSender::Send( 245 void WebSocketChannel::HandshakeNotificationSender::Send(
246 base::WeakPtr<HandshakeNotificationSender> sender) { 246 base::WeakPtr<HandshakeNotificationSender> sender) {
247 // Do nothing if |sender| is already destructed. 247 // Do nothing if |sender| is already destructed.
248 if (sender) { 248 if (sender) {
249 WebSocketChannel* channel = sender->owner_; 249 WebSocketChannel* channel = sender->owner_;
250 sender->SendImmediately(channel->event_interface_.get()); 250 sender->SendImmediately(channel->event_interface_.get());
251 } 251 }
252 } 252 }
253 253
254 ChannelState WebSocketChannel::HandshakeNotificationSender::SendImmediately( 254 ChannelState WebSocketChannel::HandshakeNotificationSender::SendImmediately(
255 WebSocketEventInterface* event_interface) { 255 WebSocketEventInterface* event_interface) {
256 256
257 if (handshake_request_info_.get()) { 257 if (handshake_request_info_.get()) {
258 if (CHANNEL_DELETED == event_interface->OnStartOpeningHandshake( 258 if (CHANNEL_DELETED ==
259 handshake_request_info_.Pass())) 259 event_interface->OnStartOpeningHandshake(
260 std::move(handshake_request_info_)))
260 return CHANNEL_DELETED; 261 return CHANNEL_DELETED;
261 } 262 }
262 263
263 if (handshake_response_info_.get()) { 264 if (handshake_response_info_.get()) {
264 if (CHANNEL_DELETED == event_interface->OnFinishOpeningHandshake( 265 if (CHANNEL_DELETED ==
265 handshake_response_info_.Pass())) 266 event_interface->OnFinishOpeningHandshake(
267 std::move(handshake_response_info_)))
266 return CHANNEL_DELETED; 268 return CHANNEL_DELETED;
267 269
268 // TODO(yhirano): We can release |this| to save memory because 270 // TODO(yhirano): We can release |this| to save memory because
269 // there will be no more opening handshake notification. 271 // there will be no more opening handshake notification.
270 } 272 }
271 273
272 return CHANNEL_ALIVE; 274 return CHANNEL_ALIVE;
273 } 275 }
274 276
275 WebSocketChannel::PendingReceivedFrame::PendingReceivedFrame( 277 WebSocketChannel::PendingReceivedFrame::PendingReceivedFrame(
(...skipping 17 matching lines...) Expand all
293 295
294 void WebSocketChannel::PendingReceivedFrame::DidConsume(uint64_t bytes) { 296 void WebSocketChannel::PendingReceivedFrame::DidConsume(uint64_t bytes) {
295 DCHECK_LE(offset_, size_); 297 DCHECK_LE(offset_, size_);
296 DCHECK_LE(bytes, size_ - offset_); 298 DCHECK_LE(bytes, size_ - offset_);
297 offset_ += bytes; 299 offset_ += bytes;
298 } 300 }
299 301
300 WebSocketChannel::WebSocketChannel( 302 WebSocketChannel::WebSocketChannel(
301 scoped_ptr<WebSocketEventInterface> event_interface, 303 scoped_ptr<WebSocketEventInterface> event_interface,
302 URLRequestContext* url_request_context) 304 URLRequestContext* url_request_context)
303 : event_interface_(event_interface.Pass()), 305 : event_interface_(std::move(event_interface)),
304 url_request_context_(url_request_context), 306 url_request_context_(url_request_context),
305 send_quota_low_water_mark_(kDefaultSendQuotaLowWaterMark), 307 send_quota_low_water_mark_(kDefaultSendQuotaLowWaterMark),
306 send_quota_high_water_mark_(kDefaultSendQuotaHighWaterMark), 308 send_quota_high_water_mark_(kDefaultSendQuotaHighWaterMark),
307 current_send_quota_(0), 309 current_send_quota_(0),
308 current_receive_quota_(0), 310 current_receive_quota_(0),
309 closing_handshake_timeout_(base::TimeDelta::FromSeconds( 311 closing_handshake_timeout_(
310 kClosingHandshakeTimeoutSeconds)), 312 base::TimeDelta::FromSeconds(kClosingHandshakeTimeoutSeconds)),
311 underlying_connection_close_timeout_(base::TimeDelta::FromSeconds( 313 underlying_connection_close_timeout_(base::TimeDelta::FromSeconds(
312 kUnderlyingConnectionCloseTimeoutSeconds)), 314 kUnderlyingConnectionCloseTimeoutSeconds)),
313 has_received_close_frame_(false), 315 has_received_close_frame_(false),
314 received_close_code_(0), 316 received_close_code_(0),
315 state_(FRESHLY_CONSTRUCTED), 317 state_(FRESHLY_CONSTRUCTED),
316 notification_sender_(new HandshakeNotificationSender(this)), 318 notification_sender_(new HandshakeNotificationSender(this)),
317 sending_text_message_(false), 319 sending_text_message_(false),
318 receiving_text_message_(false), 320 receiving_text_message_(false),
319 expecting_to_handle_continuation_(false), 321 expecting_to_handle_continuation_(false),
320 initial_frame_forwarded_(false) {} 322 initial_frame_forwarded_(false) {}
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after
552 if (!socket_url.SchemeIsWSOrWSS()) { 554 if (!socket_url.SchemeIsWSOrWSS()) {
553 // TODO(ricea): Kill the renderer (this error should have been caught by 555 // TODO(ricea): Kill the renderer (this error should have been caught by
554 // Javascript). 556 // Javascript).
555 ignore_result(event_interface_->OnFailChannel("Invalid scheme")); 557 ignore_result(event_interface_->OnFailChannel("Invalid scheme"));
556 // |this| is deleted here. 558 // |this| is deleted here.
557 return; 559 return;
558 } 560 }
559 socket_url_ = socket_url; 561 socket_url_ = socket_url;
560 scoped_ptr<WebSocketStream::ConnectDelegate> connect_delegate( 562 scoped_ptr<WebSocketStream::ConnectDelegate> connect_delegate(
561 new ConnectDelegate(this)); 563 new ConnectDelegate(this));
562 stream_request_ = creator.Run(socket_url_, 564 stream_request_ = creator.Run(socket_url_, requested_subprotocols, origin,
563 requested_subprotocols, 565 url_request_context_, BoundNetLog(),
564 origin, 566 std::move(connect_delegate));
565 url_request_context_,
566 BoundNetLog(),
567 connect_delegate.Pass());
568 SetState(CONNECTING); 567 SetState(CONNECTING);
569 } 568 }
570 569
571 void WebSocketChannel::OnConnectSuccess(scoped_ptr<WebSocketStream> stream) { 570 void WebSocketChannel::OnConnectSuccess(scoped_ptr<WebSocketStream> stream) {
572 DCHECK(stream); 571 DCHECK(stream);
573 DCHECK_EQ(CONNECTING, state_); 572 DCHECK_EQ(CONNECTING, state_);
574 573
575 stream_ = stream.Pass(); 574 stream_ = std::move(stream);
576 575
577 SetState(CONNECTED); 576 SetState(CONNECTED);
578 577
579 if (event_interface_->OnAddChannelResponse(stream_->GetSubProtocol(), 578 if (event_interface_->OnAddChannelResponse(stream_->GetSubProtocol(),
580 stream_->GetExtensions()) == 579 stream_->GetExtensions()) ==
581 CHANNEL_DELETED) 580 CHANNEL_DELETED)
582 return; 581 return;
583 582
584 // TODO(ricea): Get flow control information from the WebSocketStream once we 583 // TODO(ricea): Get flow control information from the WebSocketStream once we
585 // have a multiplexing WebSocketStream. 584 // have a multiplexing WebSocketStream.
(...skipping 26 matching lines...) Expand all
612 ChannelState result = event_interface_->OnFailChannel(message_copy); 611 ChannelState result = event_interface_->OnFailChannel(message_copy);
613 DCHECK_EQ(CHANNEL_DELETED, result); 612 DCHECK_EQ(CHANNEL_DELETED, result);
614 // |this| has been deleted. 613 // |this| has been deleted.
615 } 614 }
616 615
617 void WebSocketChannel::OnSSLCertificateError( 616 void WebSocketChannel::OnSSLCertificateError(
618 scoped_ptr<WebSocketEventInterface::SSLErrorCallbacks> ssl_error_callbacks, 617 scoped_ptr<WebSocketEventInterface::SSLErrorCallbacks> ssl_error_callbacks,
619 const SSLInfo& ssl_info, 618 const SSLInfo& ssl_info,
620 bool fatal) { 619 bool fatal) {
621 ignore_result(event_interface_->OnSSLCertificateError( 620 ignore_result(event_interface_->OnSSLCertificateError(
622 ssl_error_callbacks.Pass(), socket_url_, ssl_info, fatal)); 621 std::move(ssl_error_callbacks), socket_url_, ssl_info, fatal));
623 } 622 }
624 623
625 void WebSocketChannel::OnStartOpeningHandshake( 624 void WebSocketChannel::OnStartOpeningHandshake(
626 scoped_ptr<WebSocketHandshakeRequestInfo> request) { 625 scoped_ptr<WebSocketHandshakeRequestInfo> request) {
627 DCHECK(!notification_sender_->handshake_request_info()); 626 DCHECK(!notification_sender_->handshake_request_info());
628 627
629 // Because it is hard to handle an IPC error synchronously is difficult, 628 // Because it is hard to handle an IPC error synchronously is difficult,
630 // we asynchronously notify the information. 629 // we asynchronously notify the information.
631 notification_sender_->set_handshake_request_info(request.Pass()); 630 notification_sender_->set_handshake_request_info(std::move(request));
632 ScheduleOpeningHandshakeNotification(); 631 ScheduleOpeningHandshakeNotification();
633 } 632 }
634 633
635 void WebSocketChannel::OnFinishOpeningHandshake( 634 void WebSocketChannel::OnFinishOpeningHandshake(
636 scoped_ptr<WebSocketHandshakeResponseInfo> response) { 635 scoped_ptr<WebSocketHandshakeResponseInfo> response) {
637 DCHECK(!notification_sender_->handshake_response_info()); 636 DCHECK(!notification_sender_->handshake_response_info());
638 637
639 // Because it is hard to handle an IPC error synchronously is difficult, 638 // Because it is hard to handle an IPC error synchronously is difficult,
640 // we asynchronously notify the information. 639 // we asynchronously notify the information.
641 notification_sender_->set_handshake_response_info(response.Pass()); 640 notification_sender_->set_handshake_response_info(std::move(response));
642 ScheduleOpeningHandshakeNotification(); 641 ScheduleOpeningHandshakeNotification();
643 } 642 }
644 643
645 void WebSocketChannel::ScheduleOpeningHandshakeNotification() { 644 void WebSocketChannel::ScheduleOpeningHandshakeNotification() {
646 base::ThreadTaskRunnerHandle::Get()->PostTask( 645 base::ThreadTaskRunnerHandle::Get()->PostTask(
647 FROM_HERE, base::Bind(HandshakeNotificationSender::Send, 646 FROM_HERE, base::Bind(HandshakeNotificationSender::Send,
648 notification_sender_->AsWeakPtr())); 647 notification_sender_->AsWeakPtr()));
649 } 648 }
650 649
651 ChannelState WebSocketChannel::WriteFrames() { 650 ChannelState WebSocketChannel::WriteFrames() {
(...skipping 17 matching lines...) Expand all
669 } 668 }
670 669
671 ChannelState WebSocketChannel::OnWriteDone(bool synchronous, int result) { 670 ChannelState WebSocketChannel::OnWriteDone(bool synchronous, int result) {
672 DCHECK_NE(FRESHLY_CONSTRUCTED, state_); 671 DCHECK_NE(FRESHLY_CONSTRUCTED, state_);
673 DCHECK_NE(CONNECTING, state_); 672 DCHECK_NE(CONNECTING, state_);
674 DCHECK_NE(ERR_IO_PENDING, result); 673 DCHECK_NE(ERR_IO_PENDING, result);
675 DCHECK(data_being_sent_); 674 DCHECK(data_being_sent_);
676 switch (result) { 675 switch (result) {
677 case OK: 676 case OK:
678 if (data_to_send_next_) { 677 if (data_to_send_next_) {
679 data_being_sent_ = data_to_send_next_.Pass(); 678 data_being_sent_ = std::move(data_to_send_next_);
680 if (!synchronous) 679 if (!synchronous)
681 return WriteFrames(); 680 return WriteFrames();
682 } else { 681 } else {
683 data_being_sent_.reset(); 682 data_being_sent_.reset();
684 if (current_send_quota_ < send_quota_low_water_mark_) { 683 if (current_send_quota_ < send_quota_low_water_mark_) {
685 // TODO(ricea): Increase low_water_mark and high_water_mark if 684 // TODO(ricea): Increase low_water_mark and high_water_mark if
686 // throughput is high, reduce them if throughput is low. Low water 685 // throughput is high, reduce them if throughput is low. Low water
687 // mark needs to be >= the bandwidth delay product *of the IPC 686 // mark needs to be >= the bandwidth delay product *of the IPC
688 // channel*. Because factors like context-switch time, thread wake-up 687 // channel*. Because factors like context-switch time, thread wake-up
689 // time, and bus speed come into play it is complex and probably needs 688 // time, and bus speed come into play it is complex and probably needs
(...skipping 321 matching lines...) Expand 10 before | Expand all | Expand 10 after
1011 header.payload_length = size; 1010 header.payload_length = size;
1012 frame->data = buffer; 1011 frame->data = buffer;
1013 1012
1014 if (data_being_sent_) { 1013 if (data_being_sent_) {
1015 // Either the link to the WebSocket server is saturated, or several messages 1014 // Either the link to the WebSocket server is saturated, or several messages
1016 // are being sent in a batch. 1015 // are being sent in a batch.
1017 // TODO(ricea): Keep some statistics to work out the situation and adjust 1016 // TODO(ricea): Keep some statistics to work out the situation and adjust
1018 // quota appropriately. 1017 // quota appropriately.
1019 if (!data_to_send_next_) 1018 if (!data_to_send_next_)
1020 data_to_send_next_.reset(new SendBuffer); 1019 data_to_send_next_.reset(new SendBuffer);
1021 data_to_send_next_->AddFrame(frame.Pass()); 1020 data_to_send_next_->AddFrame(std::move(frame));
1022 return CHANNEL_ALIVE; 1021 return CHANNEL_ALIVE;
1023 } 1022 }
1024 1023
1025 data_being_sent_.reset(new SendBuffer); 1024 data_being_sent_.reset(new SendBuffer);
1026 data_being_sent_->AddFrame(frame.Pass()); 1025 data_being_sent_->AddFrame(std::move(frame));
1027 return WriteFrames(); 1026 return WriteFrames();
1028 } 1027 }
1029 1028
1030 ChannelState WebSocketChannel::FailChannel(const std::string& message, 1029 ChannelState WebSocketChannel::FailChannel(const std::string& message,
1031 uint16_t code, 1030 uint16_t code,
1032 const std::string& reason) { 1031 const std::string& reason) {
1033 DCHECK_NE(FRESHLY_CONSTRUCTED, state_); 1032 DCHECK_NE(FRESHLY_CONSTRUCTED, state_);
1034 DCHECK_NE(CONNECTING, state_); 1033 DCHECK_NE(CONNECTING, state_);
1035 DCHECK_NE(CLOSED, state_); 1034 DCHECK_NE(CLOSED, state_);
1036 1035
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
1144 } 1143 }
1145 1144
1146 void WebSocketChannel::CloseTimeout() { 1145 void WebSocketChannel::CloseTimeout() {
1147 stream_->Close(); 1146 stream_->Close();
1148 SetState(CLOSED); 1147 SetState(CLOSED);
1149 DoDropChannel(false, kWebSocketErrorAbnormalClosure, ""); 1148 DoDropChannel(false, kWebSocketErrorAbnormalClosure, "");
1150 // |this| has been deleted. 1149 // |this| has been deleted.
1151 } 1150 }
1152 1151
1153 } // namespace net 1152 } // namespace net
OLDNEW
« no previous file with comments | « net/websockets/websocket_basic_stream_test.cc ('k') | net/websockets/websocket_channel_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698