summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorukai@chromium.org <ukai@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-12-07 05:55:19 +0000
committerukai@chromium.org <ukai@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-12-07 05:55:19 +0000
commit703e4d66f618720ca07ce00ff3fbe68810a661c3 (patch)
treeec9a4b906431d4e2f4ab46c6e8a3d87daa77a925
parentb281ab6e72be9b1df735395da6979c21712a8e5d (diff)
downloadchromium_src-703e4d66f618720ca07ce00ff3fbe68810a661c3.zip
chromium_src-703e4d66f618720ca07ce00ff3fbe68810a661c3.tar.gz
chromium_src-703e4d66f618720ca07ce00ff3fbe68810a661c3.tar.bz2
WebSocket in Worker: renderer_host change
To support WebSocket in Worker, SocketStreamDispatcherHost should be part of ResourceDispatcherHost instead of ResourceMessageFilter. ResourceMessageFilter is used only for renderer process, so it would not handle IPC message from worker process. SocketStreamHost changed to have ResourceDispatcherHost::Receiver, which is a peer of child process, and indexed by receiver id and socket_id. BUG=27618 TEST=none Review URL: http://codereview.chromium.org/437084 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@33953 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/renderer_host/resource_dispatcher_host.cc8
-rw-r--r--chrome/browser/renderer_host/resource_dispatcher_host.h3
-rw-r--r--chrome/browser/renderer_host/resource_message_filter.cc7
-rw-r--r--chrome/browser/renderer_host/resource_message_filter.h4
-rw-r--r--chrome/browser/renderer_host/socket_stream_dispatcher_host.cc147
-rw-r--r--chrome/browser/renderer_host/socket_stream_dispatcher_host.h28
-rw-r--r--chrome/browser/renderer_host/socket_stream_host.cc50
-rw-r--r--chrome/browser/renderer_host/socket_stream_host.h17
8 files changed, 181 insertions, 83 deletions
diff --git a/chrome/browser/renderer_host/resource_dispatcher_host.cc b/chrome/browser/renderer_host/resource_dispatcher_host.cc
index a4bd156..4bce18a 100644
--- a/chrome/browser/renderer_host/resource_dispatcher_host.cc
+++ b/chrome/browser/renderer_host/resource_dispatcher_host.cc
@@ -40,6 +40,7 @@
#include "chrome/browser/renderer_host/resource_request_details.h"
#include "chrome/browser/renderer_host/safe_browsing_resource_handler.h"
#include "chrome/browser/renderer_host/save_file_resource_handler.h"
+#include "chrome/browser/renderer_host/socket_stream_dispatcher_host.h"
#include "chrome/browser/renderer_host/sync_resource_handler.h"
#include "chrome/browser/safe_browsing/safe_browsing_service.h"
#include "chrome/browser/ssl/ssl_client_auth_handler.h"
@@ -249,6 +250,7 @@ ResourceDispatcherHost::ResourceDispatcherHost()
ALLOW_THIS_IN_INITIALIZER_LIST(user_script_listener_(
new UserScriptListener(this))),
safe_browsing_(new SafeBrowsingService),
+ socket_stream_dispatcher_host_(new SocketStreamDispatcherHost),
webkit_thread_(new WebKitThread),
request_id_(-1),
ALLOW_THIS_IN_INITIALIZER_LIST(method_runner_(this)),
@@ -336,8 +338,10 @@ bool ResourceDispatcherHost::HandleExternalProtocol(int request_id,
bool ResourceDispatcherHost::OnMessageReceived(const IPC::Message& message,
Receiver* receiver,
bool* message_was_ok) {
- if (!IsResourceDispatcherHostMessage(message))
- return false;
+ if (!IsResourceDispatcherHostMessage(message)) {
+ return socket_stream_dispatcher_host_->OnMessageReceived(
+ message, receiver, message_was_ok);
+ }
*message_was_ok = true;
receiver_ = receiver;
diff --git a/chrome/browser/renderer_host/resource_dispatcher_host.h b/chrome/browser/renderer_host/resource_dispatcher_host.h
index efdd741..a48cebe 100644
--- a/chrome/browser/renderer_host/resource_dispatcher_host.h
+++ b/chrome/browser/renderer_host/resource_dispatcher_host.h
@@ -36,6 +36,7 @@ class ResourceDispatcherHostRequestInfo;
class ResourceHandler;
class SafeBrowsingService;
class SaveFileManager;
+class SocketStreamDispatcherHost;
class SSLClientAuthHandler;
class UserScriptListener;
class URLRequestContext;
@@ -426,6 +427,8 @@ class ResourceDispatcherHost : public URLRequest::Delegate {
scoped_refptr<SafeBrowsingService> safe_browsing_;
+ scoped_ptr<SocketStreamDispatcherHost> socket_stream_dispatcher_host_;
+
// We own the WebKit thread and see to its destruction.
scoped_ptr<WebKitThread> webkit_thread_;
diff --git a/chrome/browser/renderer_host/resource_message_filter.cc b/chrome/browser/renderer_host/resource_message_filter.cc
index 81aefa6..1f623a3 100644
--- a/chrome/browser/renderer_host/resource_message_filter.cc
+++ b/chrome/browser/renderer_host/resource_message_filter.cc
@@ -31,7 +31,6 @@
#include "chrome/browser/renderer_host/browser_render_process_host.h"
#include "chrome/browser/renderer_host/database_dispatcher_host.h"
#include "chrome/browser/renderer_host/render_widget_helper.h"
-#include "chrome/browser/renderer_host/socket_stream_dispatcher_host.h"
#include "chrome/browser/spellchecker_platform_engine.h"
#include "chrome/browser/task_manager.h"
#include "chrome/browser/worker_host/message_port_dispatcher.h"
@@ -173,7 +172,6 @@ ResourceMessageFilter::ResourceMessageFilter(
new DatabaseDispatcherHost(profile->GetDatabaseTracker(), this))),
notification_prefs_(
profile->GetDesktopNotificationService()->prefs_cache()),
- socket_stream_dispatcher_host_(new SocketStreamDispatcherHost),
host_zoom_map_(profile->GetHostZoomMap()),
off_the_record_(profile->IsOffTheRecord()),
next_route_id_callback_(NewCallbackWithReturnValue(
@@ -183,7 +181,6 @@ ResourceMessageFilter::ResourceMessageFilter(
DCHECK(audio_renderer_host_.get());
DCHECK(appcache_dispatcher_host_.get());
DCHECK(dom_storage_dispatcher_host_.get());
- DCHECK(socket_stream_dispatcher_host_.get());
render_widget_helper_->Init(id(), resource_dispatcher_host_);
}
@@ -234,7 +231,6 @@ void ResourceMessageFilter::OnChannelConnected(int32 peer_pid) {
WorkerService::GetInstance()->Initialize(resource_dispatcher_host_);
appcache_dispatcher_host_->Initialize(this, id(), handle());
- socket_stream_dispatcher_host_->Initialize(this, id());
dom_storage_dispatcher_host_->Init(handle());
db_dispatcher_host_->Init(handle());
}
@@ -269,8 +265,7 @@ bool ResourceMessageFilter::OnMessageReceived(const IPC::Message& msg) {
audio_renderer_host_->OnMessageReceived(msg, &msg_is_ok) ||
db_dispatcher_host_->OnMessageReceived(msg, &msg_is_ok) ||
mp_dispatcher->OnMessageReceived(
- msg, this, next_route_id_callback(), &msg_is_ok) ||
- socket_stream_dispatcher_host_->OnMessageReceived(msg, &msg_is_ok);
+ msg, this, next_route_id_callback(), &msg_is_ok);
if (!handled) {
DCHECK(msg_is_ok); // It should have been marked handled if it wasn't OK.
diff --git a/chrome/browser/renderer_host/resource_message_filter.h b/chrome/browser/renderer_host/resource_message_filter.h
index 7d5d137..b40dcb3 100644
--- a/chrome/browser/renderer_host/resource_message_filter.h
+++ b/chrome/browser/renderer_host/resource_message_filter.h
@@ -40,7 +40,6 @@ class HostZoomMap;
class NotificationsPrefsCache;
class Profile;
class RenderWidgetHelper;
-class SocketStreamDispatcherHost;
class URLRequestContextGetter;
struct ViewHostMsg_Audio_CreateStream;
struct WebPluginInfo;
@@ -373,9 +372,6 @@ class ResourceMessageFilter : public IPC::ChannelProxy::MessageFilter,
// Desktop Notifications permission messages.
scoped_refptr<NotificationsPrefsCache> notification_prefs_;
- // Handles Socket Stream related messages.
- scoped_ptr<SocketStreamDispatcherHost> socket_stream_dispatcher_host_;
-
// Handles zoom-related messages.
scoped_refptr<HostZoomMap> host_zoom_map_;
diff --git a/chrome/browser/renderer_host/socket_stream_dispatcher_host.cc b/chrome/browser/renderer_host/socket_stream_dispatcher_host.cc
index 68f7d4f..a993683 100644
--- a/chrome/browser/renderer_host/socket_stream_dispatcher_host.cc
+++ b/chrome/browser/renderer_host/socket_stream_dispatcher_host.cc
@@ -11,50 +11,58 @@
#include "ipc/ipc_message.h"
#include "net/websockets/websocket_throttle.h"
-SocketStreamDispatcherHost::SocketStreamDispatcherHost()
- : sender_(NULL) {
+SocketStreamDispatcherHost::SocketStreamDispatcherHost() : receiver_(NULL) {
net::WebSocketThrottle::Init();
}
SocketStreamDispatcherHost::~SocketStreamDispatcherHost() {
// TODO(ukai): Implement IDMap::RemoveAll().
- for (IDMap<SocketStreamHost>::const_iterator iter(&hosts_);
+ for (IDMap< IDMap<SocketStreamHost> >::const_iterator iter(&hostmap_);
!iter.IsAtEnd();
iter.Advance()) {
- int socket_id = iter.GetCurrentKey();
- const SocketStreamHost* socket_stream_host = iter.GetCurrentValue();
- delete socket_stream_host;
- hosts_.Remove(socket_id);
+ int host_id = iter.GetCurrentKey();
+ IDMap<SocketStreamHost>* hosts =
+ const_cast<IDMap<SocketStreamHost> *>(iter.GetCurrentValue());
+ for (IDMap<SocketStreamHost>::const_iterator hosts_iter(hosts);
+ !hosts_iter.IsAtEnd();
+ hosts_iter.Advance()) {
+ int socket_id = iter.GetCurrentKey();
+ const SocketStreamHost* socket_stream_host = hosts_iter.GetCurrentValue();
+ delete socket_stream_host;
+ hosts->Remove(socket_id);
+ }
+ hostmap_.Remove(host_id);
+ delete hosts;
}
}
-void SocketStreamDispatcherHost::Initialize(
- IPC::Message::Sender* sender, int process_id) {
- DLOG(INFO) << "Initialize: SocketStreamDispatcherHost process_id="
- << process_id;
- DCHECK(sender);
- sender_ = sender;
- process_id_ = process_id;
-}
+bool SocketStreamDispatcherHost::OnMessageReceived(
+ const IPC::Message& msg,
+ ResourceDispatcherHost::Receiver* receiver,
+ bool* msg_ok) {
+ if (!IsSocketStreamDispatcherHostMessage(msg))
+ return false;
-bool SocketStreamDispatcherHost::OnMessageReceived(const IPC::Message& msg,
- bool* msg_ok) {
- DCHECK(sender_);
*msg_ok = true;
bool handled = true;
+ receiver_ = receiver;
IPC_BEGIN_MESSAGE_MAP_EX(SocketStreamDispatcherHost, msg, *msg_ok)
IPC_MESSAGE_HANDLER(ViewHostMsg_SocketStream_Connect, OnConnect)
IPC_MESSAGE_HANDLER(ViewHostMsg_SocketStream_SendData, OnSendData)
IPC_MESSAGE_HANDLER(ViewHostMsg_SocketStream_Close, OnCloseReq)
IPC_MESSAGE_UNHANDLED(handled = false)
IPC_END_MESSAGE_MAP_EX()
+ receiver_ = NULL;
return handled;
}
// SocketStream::Delegate methods implementations.
void SocketStreamDispatcherHost::OnConnected(net::SocketStream* socket,
int max_pending_send_allowed) {
- int socket_id = SocketStreamHost::SocketIdFromSocketStream(socket);
+ SocketStreamHost* socket_stream_host =
+ SocketStreamHost::GetSocketStreamHost(socket);
+ DCHECK(socket_stream_host);
+ int socket_id = socket_stream_host->socket_id();
DLOG(INFO) << "SocketStreamDispatcherHost::OnConnected socket_id="
<< socket_id
<< " max_pending_send_allowed=" << max_pending_send_allowed;
@@ -62,16 +70,18 @@ void SocketStreamDispatcherHost::OnConnected(net::SocketStream* socket,
LOG(ERROR) << "NoSocketId in OnConnected";
return;
}
- if (!sender_->Send(new ViewMsg_SocketStream_Connected(
- socket_id, max_pending_send_allowed))) {
+ if (!socket_stream_host->Connected(max_pending_send_allowed)) {
LOG(ERROR) << "ViewMsg_SocketStream_Connected failed.";
- DeleteSocketStreamHost(socket_id);
+ DeleteSocketStreamHost(socket_stream_host->receiver()->id(), socket_id);
}
}
void SocketStreamDispatcherHost::OnSentData(net::SocketStream* socket,
int amount_sent) {
- int socket_id = SocketStreamHost::SocketIdFromSocketStream(socket);
+ SocketStreamHost* socket_stream_host =
+ SocketStreamHost::GetSocketStreamHost(socket);
+ DCHECK(socket_stream_host);
+ int socket_id = socket_stream_host->socket_id();
DLOG(INFO) << "SocketStreamDispatcherHost::OnSentData socket_id="
<< socket_id
<< " amount_sent=" << amount_sent;
@@ -79,38 +89,42 @@ void SocketStreamDispatcherHost::OnSentData(net::SocketStream* socket,
LOG(ERROR) << "NoSocketId in OnReceivedData";
return;
}
- if (!sender_->Send(
- new ViewMsg_SocketStream_SentData(socket_id, amount_sent))) {
+ if (!socket_stream_host->SentData(amount_sent)) {
LOG(ERROR) << "ViewMsg_SocketStream_SentData failed.";
- DeleteSocketStreamHost(socket_id);
+ DeleteSocketStreamHost(socket_stream_host->receiver()->id(), socket_id);
}
}
void SocketStreamDispatcherHost::OnReceivedData(
net::SocketStream* socket, const char* data, int len) {
- int socket_id = SocketStreamHost::SocketIdFromSocketStream(socket);
+ SocketStreamHost* socket_stream_host =
+ SocketStreamHost::GetSocketStreamHost(socket);
+ DCHECK(socket_stream_host);
+ int socket_id = socket_stream_host->socket_id();
DLOG(INFO) << "SocketStreamDispatcherHost::OnReceiveData socket_id="
<< socket_id;
if (socket_id == chrome_common_net::kNoSocketId) {
LOG(ERROR) << "NoSocketId in OnReceivedData";
return;
}
- if (!sender_->Send(new ViewMsg_SocketStream_ReceivedData(
- socket_id, std::vector<char>(data, data + len)))) {
+ if (!socket_stream_host->ReceivedData(data, len)) {
LOG(ERROR) << "ViewMsg_SocketStream_ReceivedData failed.";
- DeleteSocketStreamHost(socket_id);
+ DeleteSocketStreamHost(socket_stream_host->receiver()->id(), socket_id);
}
}
void SocketStreamDispatcherHost::OnClose(net::SocketStream* socket) {
- int socket_id = SocketStreamHost::SocketIdFromSocketStream(socket);
+ SocketStreamHost* socket_stream_host =
+ SocketStreamHost::GetSocketStreamHost(socket);
+ DCHECK(socket_stream_host);
+ int socket_id = socket_stream_host->socket_id();
DLOG(INFO) << "SocketStreamDispatcherHost::OnClosed socket_id="
<< socket_id;
if (socket_id == chrome_common_net::kNoSocketId) {
LOG(ERROR) << "NoSocketId in OnClose";
return;
}
- DeleteSocketStreamHost(socket_id);
+ DeleteSocketStreamHost(socket_stream_host->receiver()->id(), socket_id);
}
// Message handlers called by OnMessageReceived.
@@ -118,12 +132,15 @@ void SocketStreamDispatcherHost::OnConnect(const GURL& url, int socket_id) {
DLOG(INFO) << "SocketStreamDispatcherHost::OnConnect url=" << url
<< " socket_id=" << socket_id;
DCHECK_NE(chrome_common_net::kNoSocketId, socket_id);
- if (hosts_.Lookup(socket_id)) {
- LOG(ERROR) << "socket_id=" << socket_id << " already registered.";
+ DCHECK(receiver_);
+ if (LookupHostMap(receiver_->id(), socket_id)) {
+ LOG(ERROR) << "host_id=" << receiver_->id()
+ << " socket_id=" << socket_id << " already registered.";
return;
}
- SocketStreamHost* socket_stream_host = new SocketStreamHost(this, socket_id);
- hosts_.AddWithID(socket_stream_host, socket_id);
+ SocketStreamHost* socket_stream_host =
+ new SocketStreamHost(this, receiver_, socket_id);
+ AddHostMap(receiver_->id(), socket_id, socket_stream_host);
socket_stream_host->Connect(url);
DLOG(INFO) << "SocketStreamDispatcherHost::OnConnect -> " << socket_id;
}
@@ -132,9 +149,12 @@ void SocketStreamDispatcherHost::OnSendData(
int socket_id, const std::vector<char>& data) {
DLOG(INFO) << "SocketStreamDispatcherHost::OnSendData socket_id="
<< socket_id;
- SocketStreamHost* socket_stream_host = hosts_.Lookup(socket_id);
+ DCHECK(receiver_);
+ SocketStreamHost* socket_stream_host =
+ LookupHostMap(receiver_->id(), socket_id);
if (!socket_stream_host) {
- LOG(ERROR) << "socket_id=" << socket_id << " already closed.";
+ LOG(ERROR) << "host_id=" << receiver_->id()
+ << " socket_id=" << socket_id << " already closed.";
return;
}
if (!socket_stream_host->SendData(data)) {
@@ -146,18 +166,57 @@ void SocketStreamDispatcherHost::OnSendData(
void SocketStreamDispatcherHost::OnCloseReq(int socket_id) {
DLOG(INFO) << "SocketStreamDispatcherHost::OnCloseReq socket_id="
<< socket_id;
- SocketStreamHost* socket_stream_host = hosts_.Lookup(socket_id);
+ DCHECK(receiver_);
+ SocketStreamHost* socket_stream_host =
+ LookupHostMap(receiver_->id(), socket_id);
if (!socket_stream_host)
return;
socket_stream_host->Close();
}
-void SocketStreamDispatcherHost::DeleteSocketStreamHost(int socket_id) {
- SocketStreamHost* socket_stream_host = hosts_.Lookup(socket_id);
+void SocketStreamDispatcherHost::DeleteSocketStreamHost(
+ int host_id, int socket_id) {
+ SocketStreamHost* socket_stream_host = LookupHostMap(host_id, socket_id);
DCHECK(socket_stream_host);
delete socket_stream_host;
- hosts_.Remove(socket_id);
- if (!sender_->Send(new ViewMsg_SocketStream_Closed(socket_id))) {
- LOG(ERROR) << "ViewMsg_SocketStream_Closed failed.";
+ IDMap<SocketStreamHost>* hosts = hostmap_.Lookup(host_id);
+ DCHECK(hosts);
+ hosts->Remove(socket_id);
+ if (hosts->IsEmpty()) {
+ hostmap_.Remove(host_id);
+ delete hosts;
+ }
+}
+
+void SocketStreamDispatcherHost::AddHostMap(
+ int host_id, int socket_id, SocketStreamHost* socket_stream_host) {
+ IDMap<SocketStreamHost>* hosts = hostmap_.Lookup(host_id);
+ if (!hosts) {
+ hosts = new IDMap<SocketStreamHost>;
+ hostmap_.AddWithID(hosts, host_id);
+ }
+ hosts->AddWithID(socket_stream_host, socket_id);
+}
+
+SocketStreamHost* SocketStreamDispatcherHost::LookupHostMap(
+ int host_id, int socket_id) {
+ IDMap<SocketStreamHost>* hosts = hostmap_.Lookup(host_id);
+ if (!hosts)
+ return NULL;
+ return hosts->Lookup(socket_id);
+}
+
+/* static */
+bool SocketStreamDispatcherHost::IsSocketStreamDispatcherHostMessage(
+ const IPC::Message& message) {
+ switch (message.type()) {
+ case ViewHostMsg_SocketStream_Connect::ID:
+ case ViewHostMsg_SocketStream_SendData::ID:
+ case ViewHostMsg_SocketStream_Close::ID:
+ return true;
+
+ default:
+ break;
}
+ return false;
}
diff --git a/chrome/browser/renderer_host/socket_stream_dispatcher_host.h b/chrome/browser/renderer_host/socket_stream_dispatcher_host.h
index 58bfaaa..01297ff 100644
--- a/chrome/browser/renderer_host/socket_stream_dispatcher_host.h
+++ b/chrome/browser/renderer_host/socket_stream_dispatcher_host.h
@@ -8,6 +8,7 @@
#include <vector>
#include "base/id_map.h"
+#include "chrome/browser/renderer_host/resource_dispatcher_host.h"
#include "ipc/ipc_message.h"
#include "net/socket_stream/socket_stream.h"
@@ -22,8 +23,9 @@ class SocketStreamDispatcherHost : public net::SocketStream::Delegate {
SocketStreamDispatcherHost();
virtual ~SocketStreamDispatcherHost();
- void Initialize(IPC::Message::Sender* sender, int process_id);
- bool OnMessageReceived(const IPC::Message& msg, bool* msg_ok);
+ bool OnMessageReceived(const IPC::Message& msg,
+ ResourceDispatcherHost::Receiver* receiver,
+ bool* msg_ok);
// SocketStream::Delegate methods.
virtual void OnConnected(net::SocketStream* socket,
@@ -33,22 +35,26 @@ class SocketStreamDispatcherHost : public net::SocketStream::Delegate {
const char* data, int len);
virtual void OnClose(net::SocketStream* socket);
- // For sync message.
- bool Send(IPC::Message* message) {
- return sender_->Send(message);
- }
-
private:
// Message handlers called by OnMessageReceived.
void OnConnect(const GURL& url, int socket_id);
void OnSendData(int socket_id, const std::vector<char>& data);
void OnCloseReq(int socket_id);
- void DeleteSocketStreamHost(int socket_id);
+ void DeleteSocketStreamHost(int host_id, int socket_id);
+
+ void AddHostMap(int host_id, int socket_id,
+ SocketStreamHost* socket_stream_host);
+ SocketStreamHost* LookupHostMap(int host_id, int socket_id);
+
+ // Returns true if the message passed in is a SocketStream related message.
+ static bool IsSocketStreamDispatcherHostMessage(const IPC::Message& message);
+
+ // key: host_id -> { key: socket_id -> value: SocketStreamHost }
+ IDMap< IDMap<SocketStreamHost> > hostmap_;
- IPC::Message::Sender* sender_;
- int process_id_;
- IDMap<SocketStreamHost> hosts_;
+ // valid while OnMessageReceived processing.
+ ResourceDispatcherHost::Receiver* receiver_;
DISALLOW_COPY_AND_ASSIGN(SocketStreamDispatcherHost);
};
diff --git a/chrome/browser/renderer_host/socket_stream_host.cc b/chrome/browser/renderer_host/socket_stream_host.cc
index 864cbf2..6fc49b4 100644
--- a/chrome/browser/renderer_host/socket_stream_host.cc
+++ b/chrome/browser/renderer_host/socket_stream_host.cc
@@ -8,39 +8,48 @@
#include "chrome/browser/profile.h"
#include "chrome/browser/net/url_request_context_getter.h"
#include "chrome/common/net/socket_stream.h"
+#include "chrome/common/render_messages.h"
#include "net/socket_stream/socket_stream.h"
-static const char* kSocketIdKey = "socketId";
+static const char* kSocketHostKey = "socketHost";
-class SocketStreamId : public net::SocketStream::UserData {
+class SocketStreamInfo : public net::SocketStream::UserData {
public:
- explicit SocketStreamId(int socket_id) : socket_id_(socket_id) {}
- virtual ~SocketStreamId() {}
- int socket_id() const { return socket_id_; }
+ explicit SocketStreamInfo(SocketStreamHost* host) : host_(host) {}
+ virtual ~SocketStreamInfo() {}
+ SocketStreamHost* host() const { return host_; }
+
private:
- int socket_id_;
+ SocketStreamHost* host_;
};
SocketStreamHost::SocketStreamHost(
- net::SocketStream::Delegate* delegate, int socket_id)
+ net::SocketStream::Delegate* delegate,
+ ResourceDispatcherHost::Receiver* receiver,
+ int socket_id)
: delegate_(delegate),
+ receiver_(receiver),
socket_id_(socket_id) {
DCHECK_NE(socket_id_, chrome_common_net::kNoSocketId);
LOG(INFO) << "SocketStreamHost: socket_id=" << socket_id_;
}
/* static */
-int SocketStreamHost::SocketIdFromSocketStream(net::SocketStream* socket) {
- net::SocketStream::UserData* d = socket->GetUserData(kSocketIdKey);
+SocketStreamHost*
+SocketStreamHost::GetSocketStreamHost(net::SocketStream* socket) {
+ net::SocketStream::UserData* d = socket->GetUserData(kSocketHostKey);
if (d) {
- SocketStreamId* socket_stream_id = static_cast<SocketStreamId*>(d);
- return socket_stream_id->socket_id();
+ SocketStreamInfo* info = static_cast<SocketStreamInfo*>(d);
+ return info->host();
}
- return chrome_common_net::kNoSocketId;
+ return NULL;
}
SocketStreamHost::~SocketStreamHost() {
LOG(INFO) << "SocketStreamHost destructed socket_id=" << socket_id_;
+ if (!receiver_->Send(new ViewMsg_SocketStream_Closed(socket_id_))) {
+ LOG(ERROR) << "ViewMsg_SocketStream_Closed failed.";
+ }
socket_->DetachDelegate();
}
@@ -50,7 +59,7 @@ void SocketStreamHost::Connect(const GURL& url) {
URLRequestContextGetter* context_getter = Profile::GetDefaultRequestContext();
if (context_getter)
socket_->set_context(context_getter->GetURLRequestContext());
- socket_->SetUserData(kSocketIdKey, new SocketStreamId(socket_id_));
+ socket_->SetUserData(kSocketHostKey, new SocketStreamInfo(this));
socket_->Connect();
}
@@ -67,3 +76,18 @@ void SocketStreamHost::Close() {
return;
return socket_->Close();
}
+
+bool SocketStreamHost::Connected(int max_pending_send_allowed) {
+ return receiver_->Send(new ViewMsg_SocketStream_Connected(
+ socket_id_, max_pending_send_allowed));
+}
+
+bool SocketStreamHost::SentData(int amount_sent) {
+ return receiver_->Send(new ViewMsg_SocketStream_SentData(
+ socket_id_, amount_sent));
+}
+
+bool SocketStreamHost::ReceivedData(const char* data, int len) {
+ return receiver_->Send(new ViewMsg_SocketStream_ReceivedData(
+ socket_id_, std::vector<char>(data, data + len)));
+}
diff --git a/chrome/browser/renderer_host/socket_stream_host.h b/chrome/browser/renderer_host/socket_stream_host.h
index d7c1b46..180f818 100644
--- a/chrome/browser/renderer_host/socket_stream_host.h
+++ b/chrome/browser/renderer_host/socket_stream_host.h
@@ -8,6 +8,7 @@
#include <vector>
#include "base/ref_counted.h"
+#include "chrome/browser/renderer_host/resource_dispatcher_host.h"
#include "net/socket_stream/socket_stream.h"
class GURL;
@@ -22,12 +23,15 @@ class GURL;
// SocketStreamDispatcherHost.
class SocketStreamHost {
public:
- SocketStreamHost(net::SocketStream::Delegate* delegate, int socket_id);
+ SocketStreamHost(net::SocketStream::Delegate* delegate,
+ ResourceDispatcherHost::Receiver* receiver,
+ int socket_id);
~SocketStreamHost();
- // Gets socket_id associated with |socket|.
- static int SocketIdFromSocketStream(net::SocketStream* socket);
+ // Gets SocketStreamHost associated with |socket|.
+ static SocketStreamHost* GetSocketStreamHost(net::SocketStream* socket);
+ ResourceDispatcherHost::Receiver* receiver() const { return receiver_; }
int socket_id() const { return socket_id_; }
// Starts to open connection to |url|.
@@ -43,8 +47,15 @@ class SocketStreamHost {
// Closes the socket stream.
void Close();
+ bool Connected(int max_pending_send_allowed);
+
+ bool SentData(int amount_sent);
+
+ bool ReceivedData(const char* data, int len);
+
private:
net::SocketStream::Delegate* delegate_;
+ ResourceDispatcherHost::Receiver* receiver_;
int socket_id_;
scoped_refptr<net::SocketStream> socket_;