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

Side by Side Diff: content/browser/renderer_host/websocket_host.cc

Issue 26544003: Make net::WebSocketChannel deletion safe and enable new IPCs (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Rebase (again). Created 7 years, 2 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 | « content/browser/renderer_host/websocket_host.h ('k') | net/websockets/websocket_channel.h » ('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 "content/browser/renderer_host/websocket_host.h" 5 #include "content/browser/renderer_host/websocket_host.h"
6 6
7 #include "base/basictypes.h" 7 #include "base/basictypes.h"
8 #include "base/strings/string_util.h" 8 #include "base/strings/string_util.h"
9 #include "content/browser/renderer_host/websocket_dispatcher_host.h" 9 #include "content/browser/renderer_host/websocket_dispatcher_host.h"
10 #include "content/common/websocket_messages.h" 10 #include "content/common/websocket_messages.h"
11 #include "ipc/ipc_message_macros.h" 11 #include "ipc/ipc_message_macros.h"
12 #include "net/websockets/websocket_channel.h" 12 #include "net/websockets/websocket_channel.h"
13 #include "net/websockets/websocket_event_interface.h" 13 #include "net/websockets/websocket_event_interface.h"
14 #include "net/websockets/websocket_frame.h" // for WebSocketFrameHeader::OpCode 14 #include "net/websockets/websocket_frame.h" // for WebSocketFrameHeader::OpCode
15 15
16 namespace content { 16 namespace content {
17 17
18 namespace { 18 namespace {
19 19
20 typedef net::WebSocketEventInterface::ChannelState ChannelState;
21
20 // Convert a content::WebSocketMessageType to a 22 // Convert a content::WebSocketMessageType to a
21 // net::WebSocketFrameHeader::OpCode 23 // net::WebSocketFrameHeader::OpCode
22 net::WebSocketFrameHeader::OpCode MessageTypeToOpCode( 24 net::WebSocketFrameHeader::OpCode MessageTypeToOpCode(
23 WebSocketMessageType type) { 25 WebSocketMessageType type) {
24 DCHECK(type == WEB_SOCKET_MESSAGE_TYPE_CONTINUATION || 26 DCHECK(type == WEB_SOCKET_MESSAGE_TYPE_CONTINUATION ||
25 type == WEB_SOCKET_MESSAGE_TYPE_TEXT || 27 type == WEB_SOCKET_MESSAGE_TYPE_TEXT ||
26 type == WEB_SOCKET_MESSAGE_TYPE_BINARY); 28 type == WEB_SOCKET_MESSAGE_TYPE_BINARY);
27 typedef net::WebSocketFrameHeader::OpCode OpCode; 29 typedef net::WebSocketFrameHeader::OpCode OpCode;
28 // These compile asserts verify that the same underlying values are used for 30 // These compile asserts verify that the same underlying values are used for
29 // both types, so we can simply cast between them. 31 // both types, so we can simply cast between them.
(...skipping 11 matching lines...) Expand all
41 43
42 WebSocketMessageType OpCodeToMessageType( 44 WebSocketMessageType OpCodeToMessageType(
43 net::WebSocketFrameHeader::OpCode opCode) { 45 net::WebSocketFrameHeader::OpCode opCode) {
44 DCHECK(opCode == net::WebSocketFrameHeader::kOpCodeContinuation || 46 DCHECK(opCode == net::WebSocketFrameHeader::kOpCodeContinuation ||
45 opCode == net::WebSocketFrameHeader::kOpCodeText || 47 opCode == net::WebSocketFrameHeader::kOpCodeText ||
46 opCode == net::WebSocketFrameHeader::kOpCodeBinary); 48 opCode == net::WebSocketFrameHeader::kOpCodeBinary);
47 // This cast is guaranteed valid by the COMPILE_ASSERT() statements above. 49 // This cast is guaranteed valid by the COMPILE_ASSERT() statements above.
48 return static_cast<WebSocketMessageType>(opCode); 50 return static_cast<WebSocketMessageType>(opCode);
49 } 51 }
50 52
53 ChannelState StateCast(WebSocketDispatcherHost::WebSocketHostState host_state) {
54 const WebSocketDispatcherHost::WebSocketHostState WEBSOCKET_HOST_ALIVE =
55 WebSocketDispatcherHost::WEBSOCKET_HOST_ALIVE;
56 const WebSocketDispatcherHost::WebSocketHostState WEBSOCKET_HOST_DELETED =
57 WebSocketDispatcherHost::WEBSOCKET_HOST_DELETED;
58
59 DCHECK(host_state == WEBSOCKET_HOST_ALIVE ||
60 host_state == WEBSOCKET_HOST_DELETED);
61 // These compile asserts verify that we can get away with using static_cast<>
62 // for the conversion.
63 COMPILE_ASSERT(static_cast<ChannelState>(WEBSOCKET_HOST_ALIVE) ==
64 net::WebSocketEventInterface::CHANNEL_ALIVE,
65 enum_values_must_match_for_state_alive);
66 COMPILE_ASSERT(static_cast<ChannelState>(WEBSOCKET_HOST_DELETED) ==
67 net::WebSocketEventInterface::CHANNEL_DELETED,
68 enum_values_must_match_for_state_deleted);
69 return static_cast<ChannelState>(host_state);
70 }
71
51 // Implementation of net::WebSocketEventInterface. Receives events from our 72 // Implementation of net::WebSocketEventInterface. Receives events from our
52 // WebSocketChannel object. Each event is translated to an IPC and sent to the 73 // WebSocketChannel object. Each event is translated to an IPC and sent to the
53 // renderer or child process via WebSocketDispatcherHost. 74 // renderer or child process via WebSocketDispatcherHost.
54 class WebSocketEventHandler : public net::WebSocketEventInterface { 75 class WebSocketEventHandler : public net::WebSocketEventInterface {
55 public: 76 public:
56 WebSocketEventHandler(WebSocketDispatcherHost* dispatcher, int routing_id); 77 WebSocketEventHandler(WebSocketDispatcherHost* dispatcher, int routing_id);
57 virtual ~WebSocketEventHandler(); 78 virtual ~WebSocketEventHandler();
58 79
59 // net::WebSocketEventInterface implementation 80 // net::WebSocketEventInterface implementation
60 81
61 // TODO(ricea): Add |extensions| parameter to pass the list of enabled 82 // TODO(ricea): Add |extensions| parameter to pass the list of enabled
62 // WebSocket extensions through to the renderer to make it visible to 83 // WebSocket extensions through to the renderer to make it visible to
63 // Javascript. 84 // Javascript.
64 virtual void OnAddChannelResponse( 85 virtual ChannelState OnAddChannelResponse(
65 bool fail, 86 bool fail,
66 const std::string& selected_subprotocol) OVERRIDE; 87 const std::string& selected_subprotocol) OVERRIDE;
67 virtual void OnDataFrame(bool fin, 88 virtual ChannelState OnDataFrame(bool fin,
68 WebSocketMessageType type, 89 WebSocketMessageType type,
69 const std::vector<char>& data) OVERRIDE; 90 const std::vector<char>& data) OVERRIDE;
70 virtual void OnClosingHandshake() OVERRIDE; 91 virtual ChannelState OnClosingHandshake() OVERRIDE;
71 virtual void OnFlowControl(int64 quota) OVERRIDE; 92 virtual ChannelState OnFlowControl(int64 quota) OVERRIDE;
72 virtual void OnDropChannel(uint16 code, 93 virtual ChannelState OnDropChannel(uint16 code,
73 const std::string& reason) OVERRIDE; 94 const std::string& reason) OVERRIDE;
74 95
75 private: 96 private:
76 WebSocketDispatcherHost* const dispatcher_; 97 WebSocketDispatcherHost* const dispatcher_;
77 const int routing_id_; 98 const int routing_id_;
78 99
79 DISALLOW_COPY_AND_ASSIGN(WebSocketEventHandler); 100 DISALLOW_COPY_AND_ASSIGN(WebSocketEventHandler);
80 }; 101 };
81 102
82 WebSocketEventHandler::WebSocketEventHandler( 103 WebSocketEventHandler::WebSocketEventHandler(
83 WebSocketDispatcherHost* dispatcher, 104 WebSocketDispatcherHost* dispatcher,
84 int routing_id) 105 int routing_id)
85 : dispatcher_(dispatcher), routing_id_(routing_id) {} 106 : dispatcher_(dispatcher), routing_id_(routing_id) {}
86 107
87 WebSocketEventHandler::~WebSocketEventHandler() { 108 WebSocketEventHandler::~WebSocketEventHandler() {
88 DVLOG(1) << "WebSocketEventHandler destroyed routing_id= " << routing_id_; 109 DVLOG(1) << "WebSocketEventHandler destroyed routing_id= " << routing_id_;
89 } 110 }
90 111
91 void WebSocketEventHandler::OnAddChannelResponse( 112 ChannelState WebSocketEventHandler::OnAddChannelResponse(
92 bool fail, 113 bool fail,
93 const std::string& selected_protocol) { 114 const std::string& selected_protocol) {
94 dispatcher_->SendAddChannelResponse( 115 return StateCast(dispatcher_->SendAddChannelResponse(
95 routing_id_, fail, selected_protocol, std::string()); 116 routing_id_, fail, selected_protocol, std::string()));
96 // |this| may have been deleted here.
97 } 117 }
98 118
99 void WebSocketEventHandler::OnDataFrame(bool fin, 119 ChannelState WebSocketEventHandler::OnDataFrame(
100 net::WebSocketFrameHeader::OpCode type, 120 bool fin,
101 const std::vector<char>& data) { 121 net::WebSocketFrameHeader::OpCode type,
102 dispatcher_->SendFrame(routing_id_, fin, OpCodeToMessageType(type), data); 122 const std::vector<char>& data) {
103 // |this| may have been deleted here. 123 return StateCast(dispatcher_->SendFrame(
124 routing_id_, fin, OpCodeToMessageType(type), data));
104 } 125 }
105 126
106 void WebSocketEventHandler::OnClosingHandshake() { 127 ChannelState WebSocketEventHandler::OnClosingHandshake() {
107 dispatcher_->SendClosing(routing_id_); 128 return StateCast(dispatcher_->SendClosing(routing_id_));
108 // |this| may have been deleted here.
109 } 129 }
110 130
111 void WebSocketEventHandler::OnFlowControl(int64 quota) { 131 ChannelState WebSocketEventHandler::OnFlowControl(int64 quota) {
112 dispatcher_->SendFlowControl(routing_id_, quota); 132 return StateCast(dispatcher_->SendFlowControl(routing_id_, quota));
113 // |this| may have been deleted here.
114 } 133 }
115 134
116 void WebSocketEventHandler::OnDropChannel(uint16 code, 135 ChannelState WebSocketEventHandler::OnDropChannel(uint16 code,
117 const std::string& reason) { 136 const std::string& reason) {
118 dispatcher_->DoDropChannel(routing_id_, code, reason); 137 return StateCast(dispatcher_->DoDropChannel(routing_id_, code, reason));
119 // |this| has been deleted here.
120 } 138 }
121 139
122 } // namespace 140 } // namespace
123 141
124 WebSocketHost::WebSocketHost(int routing_id, 142 WebSocketHost::WebSocketHost(int routing_id,
125 WebSocketDispatcherHost* dispatcher, 143 WebSocketDispatcherHost* dispatcher,
126 net::URLRequestContext* url_request_context) { 144 net::URLRequestContext* url_request_context) {
127 DVLOG(1) << "WebSocketHost: created routing_id= " << routing_id; 145 DVLOG(1) << "WebSocketHost: created routing_id= " << routing_id;
128 scoped_ptr<net::WebSocketEventInterface> event_interface( 146 scoped_ptr<net::WebSocketEventInterface> event_interface(
129 new WebSocketEventHandler(dispatcher, routing_id)); 147 new WebSocketEventHandler(dispatcher, routing_id));
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
178 void WebSocketHost::OnDropChannel(uint16 code, const std::string& reason) { 196 void WebSocketHost::OnDropChannel(uint16 code, const std::string& reason) {
179 DVLOG(3) << "WebSocketDispatcherHost::OnDropChannel" 197 DVLOG(3) << "WebSocketDispatcherHost::OnDropChannel"
180 << " routing_id= " << routing_id_ << " code= " << code 198 << " routing_id= " << routing_id_ << " code= " << code
181 << " reason= " << reason; 199 << " reason= " << reason;
182 200
183 channel_->StartClosingHandshake(code, reason); 201 channel_->StartClosingHandshake(code, reason);
184 } 202 }
185 203
186 204
187 } // namespace content 205 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/renderer_host/websocket_host.h ('k') | net/websockets/websocket_channel.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698