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

Unified Diff: content/child/websocket_dispatcher.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 side-by-side diff with in-line comments
Download patch
Index: content/child/websocket_dispatcher.cc
diff --git a/content/child/websocket_dispatcher.cc b/content/child/websocket_dispatcher.cc
new file mode 100644
index 0000000000000000000000000000000000000000..3e9e9a182a8f310ac196ace7ead46147951b12f3
--- /dev/null
+++ b/content/child/websocket_dispatcher.cc
@@ -0,0 +1,133 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/child/websocket_dispatcher.h"
+
+#include <map>
+#include <string>
+#include <vector>
+
+#include "base/logging.h"
+#include "content/child/websocket_bridge.h"
+#include "content/common/websocket_messages.h"
+#include "ipc/ipc_message.h"
+#include "ipc/ipc_message_macros.h"
+#include "url/gurl.h"
+#include "third_party/WebKit/public/platform/WebSocketHandle.h"
+#include "third_party/WebKit/public/platform/WebSocketHandleClient.h"
+
+using WebKit::WebSocketHandle;
+using WebKit::WebSocketHandleClient;
+using WebKit::WebString;
+using WebKit::WebURL;
+using WebKit::WebVector;
+
+namespace content {
+
+WebSocketDispatcher::WebSocketDispatcher() : channel_id_max_(0) {}
+
+WebSocketDispatcher::~WebSocketDispatcher() {}
+
+int WebSocketDispatcher::AddBridge(WebSocketBridge* bridge) {
+ ++channel_id_max_;
+ bridges_.insert(std::make_pair(channel_id_max_, bridge));
+ return channel_id_max_;
+}
+
+void WebSocketDispatcher::RemoveBridge(int channel_id) {
+ std::map<int, WebSocketBridge*>::iterator i = bridges_.find(channel_id);
+ if (i == bridges_.end()) {
+ DVLOG(1) << "Remove a non-existent bridge(" << channel_id << ")";
+ return;
+ }
+ bridges_.erase(i);
+}
+
+bool WebSocketDispatcher::OnMessageReceived(const IPC::Message& msg) {
+ bool handled = true;
+ IPC_BEGIN_MESSAGE_MAP(WebSocketDispatcher, msg)
+ IPC_MESSAGE_HANDLER(WebSocketMsg_AddChannelResponse, OnConnected)
+ IPC_MESSAGE_HANDLER(WebSocketMsg_SendFrame, OnReceivedData)
+ IPC_MESSAGE_HANDLER(WebSocketMsg_FlowControl, OnReceivedFlowControl)
+ IPC_MESSAGE_HANDLER(WebSocketMsg_DropChannel, OnClosed)
+ IPC_MESSAGE_UNHANDLED(handled = false)
+ IPC_END_MESSAGE_MAP()
piman 2013/09/20 03:39:06 I still think this should be using routed messages
yhirano 2013/09/20 08:42:28 I got it! Then, we can remove functions without ch
piman 2013/09/20 16:30:13 Right, all the message logic is now in WebSocketBr
+ return handled;
+}
+
+void WebSocketDispatcher::OnConnected(int channel_id,
+ bool fail,
+ const std::string& selected_protocol,
+ const std::string& extensions) {
+ DVLOG(1) << "WebSocketDispatcher::OnConnected("
+ << channel_id << ", "
+ << fail << ", "
+ << selected_protocol << ", "
+ << extensions << ")";
+ WebSocketBridge* bridge = GetBridge(channel_id);
+ if (!bridge) return;
piman 2013/09/20 03:39:06 nit: statement on next line.
yhirano 2013/09/20 08:42:28 I deleted the code.
+ WebString protocol_to_pass = WebString::fromUTF8(selected_protocol);
+ WebString extensions_to_pass = WebString::fromUTF8(extensions);
+ bridge->DidConnect(fail, protocol_to_pass, extensions_to_pass);
+}
+
+void WebSocketDispatcher::OnReceivedData(int channel_id,
+ bool fin,
+ WebSocketMessageType type,
+ const std::vector<char>& data) {
+ DVLOG(1) << "WebSocketDispatcher::OnReceivedData("
+ << channel_id << ", "
+ << fin << ", "
+ << type << ", "
+ << "(data size = " << data.size() << "))";
+ WebSocketBridge* bridge = GetBridge(channel_id);
+ if (!bridge) return;
piman 2013/09/20 03:39:06 nit: statement on next line.
yhirano 2013/09/20 08:42:28 I deleted the code.
+ WebSocketHandle::MessageType type_to_pass =
+ WebSocketHandle::MessageTypeContinuation;
+ switch (type) {
+ case WEB_SOCKET_MESSAGE_TYPE_CONTINUATION:
+ type_to_pass = WebSocketHandle::MessageTypeContinuation;
+ break;
+ case WEB_SOCKET_MESSAGE_TYPE_TEXT:
+ type_to_pass = WebSocketHandle::MessageTypeText;
+ break;
+ case WEB_SOCKET_MESSAGE_TYPE_BINARY:
+ type_to_pass = WebSocketHandle::MessageTypeBinary;
+ break;
+ }
+ bridge->DidReceiveData(fin, type_to_pass, data.data(), data.size());
+}
+
+void WebSocketDispatcher::OnReceivedFlowControl(int channel_id, int64 quota) {
+ DVLOG(1) << "WebSocketDispatcher::OnReceivedFlowControl("
+ << channel_id << ", "
+ << quota << ")";
+ WebSocketBridge* bridge = GetBridge(channel_id);
+ if (!bridge) return;
piman 2013/09/20 03:39:06 nit: statement on next line.
yhirano 2013/09/20 08:42:28 I deleted the code.
+ bridge->DidReceiveFlowControl(quota);
+}
+
+void WebSocketDispatcher::OnClosed(int channel_id,
+ unsigned short code,
+ const std::string& reason) {
+ DVLOG(1) << "WebSocketDispatcher::OnClosed("
+ << channel_id << ", "
+ << code << ", "
+ << reason << ")";
+ WebSocketBridge* bridge = GetBridge(channel_id);
+ if (!bridge) return;
piman 2013/09/20 03:39:06 nit: statement on next line.
yhirano 2013/09/20 08:42:28 I deleted the code.
+ WebString reason_to_pass = WebString::fromUTF8(reason);
+ bridge->DidClose(code, reason_to_pass);
+}
+
+WebSocketBridge* WebSocketDispatcher::GetBridge(int channel_id) {
+ std::map<int, WebSocketBridge*>::iterator i = bridges_.find(channel_id);
+ if (i == bridges_.end()) {
+ DVLOG(1) << "No bridge for channel_id=" << channel_id;
+ return NULL;
+ }
+ return i->second;
+}
+
+} // namespace content

Powered by Google App Engine
This is Rietveld 408576698