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

Side by Side Diff: content/child/websocket_bridge.cc

Issue 22815034: Introduce webkit_glue bridges for the new WebSocket Implementation. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 7 years, 3 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
OLDNEW
(Empty)
1 // Copyright (c) 2013 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 "content/child/websocket_bridge.h"
6
7 #include <string>
8 #include <vector>
9
10 #include "base/logging.h"
11 #include "base/strings/string_util.h"
12 #include "content/child/child_thread.h"
13 #include "content/child/websocket_dispatcher.h"
14 #include "content/common/websocket_messages.h"
15 #include "ipc/ipc_message.h"
16 #include "ipc/ipc_message_macros.h"
17 #include "url/gurl.h"
18 #include "third_party/WebKit/public/platform/WebSocketHandle.h"
19 #include "third_party/WebKit/public/platform/WebSocketHandleClient.h"
20 #include "third_party/WebKit/public/platform/WebString.h"
21 #include "third_party/WebKit/public/platform/WebURL.h"
22 #include "third_party/WebKit/public/platform/WebVector.h"
23
24 using WebKit::WebSocketHandle;
25 using WebKit::WebSocketHandleClient;
26 using WebKit::WebString;
27 using WebKit::WebURL;
28 using WebKit::WebVector;
29
30 namespace content {
31
32 WebSocketBridge::WebSocketBridge()
33 : channel_id_(kInvalidChannelId), client_(NULL) {}
34
35 WebSocketBridge::~WebSocketBridge() {
36 Disconnect();
37 }
38
39 void WebSocketBridge::DidConnect(bool fail,
40 const WebString& selected_protocol,
41 const WebString& extensions) {
42 WebSocketHandleClient* client = client_;
43 if (fail)
44 Disconnect();
45 if (client)
46 client->didConnect(this, fail, selected_protocol, extensions);
47 // |this| can be deleted here.
48 }
49
50 void WebSocketBridge::DidReceiveData(
51 bool fin,
52 WebSocketHandle::MessageType type,
53 const char* data,
54 size_t size) {
55 if (client_)
56 client_->didReceiveData(this, fin, type, data, size);
57 // |this| can be deleted here.
58 }
59
60 void WebSocketBridge::DidReceiveFlowControl(int64_t quota) {
61 if (client_)
62 client_->didReceiveFlowControl(this, quota);
63 // |this| can be deleted here.
64 }
65
66 void WebSocketBridge::DidClose(unsigned short code,
67 const WebString& reason) {
68 WebSocketHandleClient* client = client_;
69 Disconnect();
70 if (client)
71 client->didClose(this, code, reason);
72 // |this| can be deleted here.
73 }
74
75 void WebSocketBridge::connect(
76 const WebURL& url,
77 const WebVector<WebString>& protocols,
78 const WebString& origin,
79 WebSocketHandleClient* client) {
80
piman 2013/09/20 03:39:06 nit: no need for blank line
yhirano 2013/09/20 08:42:28 Done.
81 DCHECK_EQ(kInvalidChannelId, channel_id_);
82 WebSocketDispatcher* dispatcher =
83 ChildThread::current()->websocket_dispatcher();
84 channel_id_ = dispatcher->AddBridge(this);
85 client_ = client;
86
87 std::vector<std::string> protocols_to_pass;
88 for (size_t i = 0; i < protocols.size(); ++i)
89 protocols_to_pass.push_back(protocols[i].utf8());
90 GURL origin_to_pass(origin.utf8());
91
92 DVLOG(1) << "Bridge#" << channel_id_ << " Connect("
93 << url << ", (" << JoinString(protocols_to_pass, ", ") << "), "
94 << origin_to_pass << ")";
95
96 ChildThread::current()->Send(
97 new WebSocketHostMsg_AddChannelRequest(channel_id_,
98 url,
99 protocols_to_pass,
100 origin_to_pass));
101 }
102
103 void WebSocketBridge::send(bool fin,
104 WebSocketHandle::MessageType type,
105 const char* data,
106 size_t size) {
107 if (channel_id_ == kInvalidChannelId)
108 return;
109
110 WebSocketMessageType type_to_pass = WEB_SOCKET_MESSAGE_TYPE_CONTINUATION;
111 switch (type) {
112 case WebSocketHandle::MessageTypeContinuation:
113 type_to_pass = WEB_SOCKET_MESSAGE_TYPE_CONTINUATION;
114 break;
115 case WebSocketHandle::MessageTypeText:
116 type_to_pass = WEB_SOCKET_MESSAGE_TYPE_TEXT;
117 break;
118 case WebSocketHandle::MessageTypeBinary:
119 type_to_pass = WEB_SOCKET_MESSAGE_TYPE_BINARY;
120 break;
121 }
122
123 DVLOG(1) << "Bridge #" << channel_id_ << " Send("
124 << fin << ", " << type_to_pass << ", "
125 << "(data size = " << size << "))";
126
127 ChildThread::current()->Send(
128 new WebSocketMsg_SendFrame(channel_id_,
129 fin,
130 type_to_pass,
131 std::vector<char>(data, data + size)));
132 }
133
134 void WebSocketBridge::flowControl(int64_t quota) {
135 if (channel_id_ == kInvalidChannelId)
136 return;
137
138 DVLOG(1) << "Bridge #" << channel_id_ << " FlowControl(" << quota << ")";
139
140 ChildThread::current()->Send(
141 new WebSocketMsg_FlowControl(channel_id_, quota));
142 }
143
144 void WebSocketBridge::close(unsigned short code,
145 const WebString& reason) {
146 if (channel_id_ == kInvalidChannelId)
147 return;
148
149 std::string reason_to_pass = reason.utf8();
150 DVLOG(1) << "Bridge #" << channel_id_ << " Close("
151 << code << ", " << reason_to_pass << ")";
152 ChildThread::current()->Send(
153 new WebSocketMsg_DropChannel(channel_id_, code, reason_to_pass));
154 }
155
156 void WebSocketBridge::Disconnect() {
157 if (channel_id_ == kInvalidChannelId)
158 return;
159 WebSocketDispatcher* dispatcher =
160 ChildThread::current()->websocket_dispatcher();
161 dispatcher->RemoveBridge(channel_id_);
162
163 channel_id_ = kInvalidChannelId;
164 client_ = NULL;
165 }
166
167 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698