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

Side by Side Diff: content/renderer/p2p/socket_dispatcher.cc

Issue 10917167: Refactor the P2PSocketDispatcher to be created on the RenderThread instead of the RenderView. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Change P2PSocketDispatcher to take the io message loop as input to fix existing unit tests Created 8 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/renderer/p2p/socket_dispatcher.h" 5 #include "content/renderer/p2p/socket_dispatcher.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/memory/ref_counted.h" 8 #include "base/memory/ref_counted.h"
9 #include "base/message_loop_proxy.h" 9 #include "base/message_loop_proxy.h"
10 #include "content/common/child_process.h"
10 #include "content/common/p2p_messages.h" 11 #include "content/common/p2p_messages.h"
11 #include "content/renderer/p2p/host_address_request.h" 12 #include "content/renderer/p2p/host_address_request.h"
12 #include "content/renderer/p2p/socket_client.h" 13 #include "content/renderer/p2p/socket_client.h"
13 #include "content/renderer/render_view_impl.h" 14 #include "content/renderer/render_view_impl.h"
14 #include "webkit/glue/network_list_observer.h" 15 #include "webkit/glue/network_list_observer.h"
15 16
16 namespace content { 17 namespace content {
17 18
18 class P2PSocketDispatcher::AsyncMessageSender 19 class P2PSocketDispatcher::AsyncMessageSender
19 : public base::RefCountedThreadSafe<AsyncMessageSender> { 20 : public base::RefCountedThreadSafe<AsyncMessageSender> {
20 public: 21 public:
21 explicit AsyncMessageSender(IPC::Sender* message_sender) 22 explicit AsyncMessageSender(P2PSocketDispatcher* message_sender)
22 : message_loop_(base::MessageLoopProxy::current()), 23 : message_sender_(message_sender) {
23 message_sender_(message_sender) {
24 } 24 }
25 25
26 void Detach() { 26 void Detach() {
27 DCHECK(message_loop_->BelongsToCurrentThread());
28 message_sender_ = NULL; 27 message_sender_ = NULL;
29 } 28 }
30 29
31 void Send(IPC::Message* msg) { 30 void Send(IPC::Message* msg) {
32 message_loop_->PostTask(FROM_HERE, 31 if (!message_sender_) {
33 base::Bind(&AsyncMessageSender::DoSend, this, msg)); 32 delete msg;
33 return;
34 }
35 base::MessageLoopProxy* loop = message_sender_->message_loop();
36 loop->PostTask(
37 FROM_HERE, base::Bind(&P2PSocketDispatcher::Send,
38 message_sender_.get(), msg));
34 } 39 }
35 40
36 private: 41 private:
37 friend class base::RefCountedThreadSafe<AsyncMessageSender>; 42 friend class base::RefCountedThreadSafe<AsyncMessageSender>;
38 ~AsyncMessageSender() {} 43 ~AsyncMessageSender() {}
39 44
40 void DoSend(IPC::Message* msg) { 45 scoped_refptr<P2PSocketDispatcher> message_sender_;
41 DCHECK(message_loop_->BelongsToCurrentThread());
42 if (message_sender_)
43 message_sender_->Send(msg);
44 }
45
46 scoped_refptr<base::MessageLoopProxy> message_loop_;
47 IPC::Sender* message_sender_;
48 46
49 DISALLOW_COPY_AND_ASSIGN(AsyncMessageSender); 47 DISALLOW_COPY_AND_ASSIGN(AsyncMessageSender);
50 }; 48 };
51 49
52 P2PSocketDispatcher::P2PSocketDispatcher(RenderViewImpl* render_view) 50 P2PSocketDispatcher::P2PSocketDispatcher(
53 : content::RenderViewObserver(render_view), 51 base::MessageLoopProxy* ipc_message_loop)
54 message_loop_(base::MessageLoopProxy::current()), 52 : message_loop_(ipc_message_loop),
55 network_notifications_started_(false), 53 network_notifications_started_(false),
56 network_list_observers_( 54 network_list_observers_(
57 new ObserverListThreadSafe<webkit_glue::NetworkListObserver>()), 55 new ObserverListThreadSafe<webkit_glue::NetworkListObserver>()),
58 async_message_sender_(new AsyncMessageSender(this)) { 56 async_message_sender_(new AsyncMessageSender(this)),
57 channel_(NULL) {
59 } 58 }
60 59
61 P2PSocketDispatcher::~P2PSocketDispatcher() { 60 P2PSocketDispatcher::~P2PSocketDispatcher() {
62 FOR_EACH_OBSERVER(P2PSocketDispatcherDestructionObserver, 61 FOR_EACH_OBSERVER(P2PSocketDispatcherDestructionObserver,
63 destruction_observer_, OnSocketDispatcherDestroyed()); 62 destruction_observer_, OnSocketDispatcherDestroyed());
64 network_list_observers_->AssertEmpty(); 63 network_list_observers_->AssertEmpty();
65 if (network_notifications_started_) 64 if (network_notifications_started_)
66 Send(new P2PHostMsg_StopNetworkNotifications(routing_id())); 65 Send(new P2PHostMsg_StopNetworkNotifications());
67 for (IDMap<P2PSocketClient>::iterator i(&clients_); !i.IsAtEnd(); 66 for (IDMap<P2PSocketClient>::iterator i(&clients_); !i.IsAtEnd();
68 i.Advance()) { 67 i.Advance()) {
69 i.GetCurrentValue()->Detach(); 68 i.GetCurrentValue()->Detach();
70 } 69 }
71 async_message_sender_->Detach(); 70 async_message_sender_->Detach();
72 } 71 }
73 72
74 void P2PSocketDispatcher::AddNetworkListObserver( 73 void P2PSocketDispatcher::AddNetworkListObserver(
75 webkit_glue::NetworkListObserver* network_list_observer) { 74 webkit_glue::NetworkListObserver* network_list_observer) {
76 network_list_observers_->AddObserver(network_list_observer); 75 network_list_observers_->AddObserver(network_list_observer);
77 network_notifications_started_ = true; 76 network_notifications_started_ = true;
78 async_message_sender_->Send( 77 async_message_sender_->Send(
79 new P2PHostMsg_StartNetworkNotifications(routing_id())); 78 new P2PHostMsg_StartNetworkNotifications());
80 } 79 }
81 80
82 void P2PSocketDispatcher::RemoveNetworkListObserver( 81 void P2PSocketDispatcher::RemoveNetworkListObserver(
83 webkit_glue::NetworkListObserver* network_list_observer) { 82 webkit_glue::NetworkListObserver* network_list_observer) {
84 network_list_observers_->RemoveObserver(network_list_observer); 83 network_list_observers_->RemoveObserver(network_list_observer);
85 } 84 }
86 85
87 void P2PSocketDispatcher::AddDestructionObserver( 86 void P2PSocketDispatcher::AddDestructionObserver(
88 P2PSocketDispatcherDestructionObserver* observer) { 87 P2PSocketDispatcherDestructionObserver* observer) {
89 destruction_observer_.AddObserver(observer); 88 destruction_observer_.AddObserver(observer);
90 } 89 }
91 90
92 void P2PSocketDispatcher::RemoveDestructionObserver( 91 void P2PSocketDispatcher::RemoveDestructionObserver(
93 P2PSocketDispatcherDestructionObserver* observer) { 92 P2PSocketDispatcherDestructionObserver* observer) {
94 destruction_observer_.RemoveObserver(observer); 93 destruction_observer_.RemoveObserver(observer);
95 } 94 }
96 95
96 void P2PSocketDispatcher::Send(IPC::Message* message) {
97 DCHECK(message_loop_->BelongsToCurrentThread());
98 if (!channel_) {
99 delete message;
100 return;
101 }
102
103 channel_->Send(message);
104 }
105
97 bool P2PSocketDispatcher::OnMessageReceived(const IPC::Message& message) { 106 bool P2PSocketDispatcher::OnMessageReceived(const IPC::Message& message) {
98 bool handled = true; 107 bool handled = true;
99 IPC_BEGIN_MESSAGE_MAP(P2PSocketDispatcher, message) 108 IPC_BEGIN_MESSAGE_MAP(P2PSocketDispatcher, message)
100 IPC_MESSAGE_HANDLER(P2PMsg_NetworkListChanged, OnNetworkListChanged) 109 IPC_MESSAGE_HANDLER(P2PMsg_NetworkListChanged, OnNetworkListChanged)
101 IPC_MESSAGE_HANDLER(P2PMsg_GetHostAddressResult, OnGetHostAddressResult) 110 IPC_MESSAGE_HANDLER(P2PMsg_GetHostAddressResult, OnGetHostAddressResult)
102 IPC_MESSAGE_HANDLER(P2PMsg_OnSocketCreated, OnSocketCreated) 111 IPC_MESSAGE_HANDLER(P2PMsg_OnSocketCreated, OnSocketCreated)
103 IPC_MESSAGE_HANDLER(P2PMsg_OnIncomingTcpConnection, OnIncomingTcpConnection) 112 IPC_MESSAGE_HANDLER(P2PMsg_OnIncomingTcpConnection, OnIncomingTcpConnection)
104 IPC_MESSAGE_HANDLER(P2PMsg_OnError, OnError) 113 IPC_MESSAGE_HANDLER(P2PMsg_OnError, OnError)
105 IPC_MESSAGE_HANDLER(P2PMsg_OnDataReceived, OnDataReceived) 114 IPC_MESSAGE_HANDLER(P2PMsg_OnDataReceived, OnDataReceived)
106 IPC_MESSAGE_UNHANDLED(handled = false) 115 IPC_MESSAGE_UNHANDLED(handled = false)
107 IPC_END_MESSAGE_MAP() 116 IPC_END_MESSAGE_MAP()
108 return handled; 117 return handled;
109 } 118 }
110 119
120 void P2PSocketDispatcher::OnFilterAdded(IPC::Channel* channel) {
121 DVLOG(1) << "P2PSocketDispatcher::OnFilterAdded()";
122 // Captures the channel for IPC.
123 channel_ = channel;
124 }
125
126 void P2PSocketDispatcher::OnFilterRemoved() {
127 channel_ = NULL;
128 }
129
130 void P2PSocketDispatcher::OnChannelClosing() {
131 channel_ = NULL;
132 }
133
111 base::MessageLoopProxy* P2PSocketDispatcher::message_loop() { 134 base::MessageLoopProxy* P2PSocketDispatcher::message_loop() {
112 return message_loop_; 135 return message_loop_;
113 } 136 }
114 137
115 int P2PSocketDispatcher::RegisterClient(P2PSocketClient* client) { 138 int P2PSocketDispatcher::RegisterClient(P2PSocketClient* client) {
139 DCHECK(message_loop_->BelongsToCurrentThread());
116 return clients_.Add(client); 140 return clients_.Add(client);
117 } 141 }
118 142
119 void P2PSocketDispatcher::UnregisterClient(int id) { 143 void P2PSocketDispatcher::UnregisterClient(int id) {
144 DCHECK(message_loop_->BelongsToCurrentThread());
120 clients_.Remove(id); 145 clients_.Remove(id);
121 } 146 }
122 147
123 void P2PSocketDispatcher::SendP2PMessage(IPC::Message* msg) { 148 void P2PSocketDispatcher::SendP2PMessage(IPC::Message* msg) {
124 msg->set_routing_id(routing_id()); 149 DCHECK(message_loop_->BelongsToCurrentThread());
125 Send(msg); 150 Send(msg);
126 } 151 }
127 152
128 int P2PSocketDispatcher::RegisterHostAddressRequest( 153 int P2PSocketDispatcher::RegisterHostAddressRequest(
129 P2PHostAddressRequest* request) { 154 P2PHostAddressRequest* request) {
155 DCHECK(message_loop_->BelongsToCurrentThread());
130 return host_address_requests_.Add(request); 156 return host_address_requests_.Add(request);
131 } 157 }
132 158
133 void P2PSocketDispatcher::UnregisterHostAddressRequest(int id) { 159 void P2PSocketDispatcher::UnregisterHostAddressRequest(int id) {
160 DCHECK(message_loop_->BelongsToCurrentThread());
134 host_address_requests_.Remove(id); 161 host_address_requests_.Remove(id);
135 } 162 }
136 163
137 void P2PSocketDispatcher::OnNetworkListChanged( 164 void P2PSocketDispatcher::OnNetworkListChanged(
138 const net::NetworkInterfaceList& networks) { 165 const net::NetworkInterfaceList& networks) {
139 network_list_observers_->Notify( 166 network_list_observers_->Notify(
140 &webkit_glue::NetworkListObserver::OnNetworkListChanged, networks); 167 &webkit_glue::NetworkListObserver::OnNetworkListChanged, networks);
141 } 168 }
142 169
143 void P2PSocketDispatcher::OnGetHostAddressResult( 170 void P2PSocketDispatcher::OnGetHostAddressResult(
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
191 // hasn't processed the close message by the time it sends the 218 // hasn't processed the close message by the time it sends the
192 // message to the renderer. 219 // message to the renderer.
193 VLOG(1) << "Received P2P message for socket that doesn't exist."; 220 VLOG(1) << "Received P2P message for socket that doesn't exist.";
194 return NULL; 221 return NULL;
195 } 222 }
196 223
197 return client; 224 return client;
198 } 225 }
199 226
200 } // namespace content 227 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698