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

Side by Side Diff: chrome/browser/renderer_host/chrome_extension_message_filter.cc

Issue 1413543005: Use FrameTreeNode ID as frameId in extension APIs (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Improve port lifetime management, add tests Created 5 years, 1 month 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
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "chrome/browser/renderer_host/chrome_extension_message_filter.h" 5 #include "chrome/browser/renderer_host/chrome_extension_message_filter.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/bind_helpers.h" 8 #include "base/bind_helpers.h"
9 #include "base/files/file_path.h" 9 #include "base/files/file_path.h"
10 #include "base/strings/utf_string_conversions.h" 10 #include "base/strings/utf_string_conversions.h"
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
77 77
78 bool ChromeExtensionMessageFilter::OnMessageReceived( 78 bool ChromeExtensionMessageFilter::OnMessageReceived(
79 const IPC::Message& message) { 79 const IPC::Message& message) {
80 bool handled = true; 80 bool handled = true;
81 IPC_BEGIN_MESSAGE_MAP(ChromeExtensionMessageFilter, message) 81 IPC_BEGIN_MESSAGE_MAP(ChromeExtensionMessageFilter, message)
82 IPC_MESSAGE_HANDLER(ExtensionHostMsg_OpenChannelToExtension, 82 IPC_MESSAGE_HANDLER(ExtensionHostMsg_OpenChannelToExtension,
83 OnOpenChannelToExtension) 83 OnOpenChannelToExtension)
84 IPC_MESSAGE_HANDLER(ExtensionHostMsg_OpenChannelToTab, OnOpenChannelToTab) 84 IPC_MESSAGE_HANDLER(ExtensionHostMsg_OpenChannelToTab, OnOpenChannelToTab)
85 IPC_MESSAGE_HANDLER(ExtensionHostMsg_OpenChannelToNativeApp, 85 IPC_MESSAGE_HANDLER(ExtensionHostMsg_OpenChannelToNativeApp,
86 OnOpenChannelToNativeApp) 86 OnOpenChannelToNativeApp)
87 IPC_MESSAGE_HANDLER(ExtensionHostMsg_OpenMessagePort, OnOpenMessagePort)
88 IPC_MESSAGE_HANDLER(ExtensionHostMsg_CloseMessagePort, OnCloseMessagePort)
87 IPC_MESSAGE_HANDLER(ExtensionHostMsg_PostMessage, OnPostMessage) 89 IPC_MESSAGE_HANDLER(ExtensionHostMsg_PostMessage, OnPostMessage)
88 IPC_MESSAGE_HANDLER_DELAY_REPLY(ExtensionHostMsg_GetMessageBundle, 90 IPC_MESSAGE_HANDLER_DELAY_REPLY(ExtensionHostMsg_GetMessageBundle,
89 OnGetExtMessageBundle) 91 OnGetExtMessageBundle)
90 IPC_MESSAGE_HANDLER(ExtensionHostMsg_CloseChannel, OnExtensionCloseChannel)
91 IPC_MESSAGE_HANDLER(ExtensionHostMsg_AddAPIActionToActivityLog, 92 IPC_MESSAGE_HANDLER(ExtensionHostMsg_AddAPIActionToActivityLog,
92 OnAddAPIActionToExtensionActivityLog); 93 OnAddAPIActionToExtensionActivityLog);
93 IPC_MESSAGE_HANDLER(ExtensionHostMsg_AddDOMActionToActivityLog, 94 IPC_MESSAGE_HANDLER(ExtensionHostMsg_AddDOMActionToActivityLog,
94 OnAddDOMActionToExtensionActivityLog); 95 OnAddDOMActionToExtensionActivityLog);
95 IPC_MESSAGE_HANDLER(ExtensionHostMsg_AddEventToActivityLog, 96 IPC_MESSAGE_HANDLER(ExtensionHostMsg_AddEventToActivityLog,
96 OnAddEventToExtensionActivityLog); 97 OnAddEventToExtensionActivityLog);
97 IPC_MESSAGE_UNHANDLED(handled = false) 98 IPC_MESSAGE_UNHANDLED(handled = false)
98 IPC_END_MESSAGE_MAP() 99 IPC_END_MESSAGE_MAP()
99 100
100 return handled; 101 return handled;
101 } 102 }
102 103
103 void ChromeExtensionMessageFilter::OverrideThreadForMessage( 104 void ChromeExtensionMessageFilter::OverrideThreadForMessage(
104 const IPC::Message& message, BrowserThread::ID* thread) { 105 const IPC::Message& message, BrowserThread::ID* thread) {
105 switch (message.type()) { 106 switch (message.type()) {
107 case ExtensionHostMsg_OpenMessagePort::ID:
108 case ExtensionHostMsg_CloseMessagePort::ID:
106 case ExtensionHostMsg_PostMessage::ID: 109 case ExtensionHostMsg_PostMessage::ID:
107 case ExtensionHostMsg_CloseChannel::ID:
108 case ExtensionHostMsg_AddAPIActionToActivityLog::ID: 110 case ExtensionHostMsg_AddAPIActionToActivityLog::ID:
109 case ExtensionHostMsg_AddDOMActionToActivityLog::ID: 111 case ExtensionHostMsg_AddDOMActionToActivityLog::ID:
110 case ExtensionHostMsg_AddEventToActivityLog::ID: 112 case ExtensionHostMsg_AddEventToActivityLog::ID:
111 *thread = BrowserThread::UI; 113 *thread = BrowserThread::UI;
112 break; 114 break;
113 default: 115 default:
114 break; 116 break;
115 } 117 }
116 } 118 }
117 119
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
185 extensions::MessageService::Get(profile_) 187 extensions::MessageService::Get(profile_)
186 ->OpenChannelToNativeApp(render_process_id_, 188 ->OpenChannelToNativeApp(render_process_id_,
187 source_routing_id, 189 source_routing_id,
188 receiver_port_id, 190 receiver_port_id,
189 source_extension_id, 191 source_extension_id,
190 native_app_name); 192 native_app_name);
191 } 193 }
192 } 194 }
193 195
194 void ChromeExtensionMessageFilter::OnOpenChannelToTab( 196 void ChromeExtensionMessageFilter::OnOpenChannelToTab(
197 int routing_id,
195 const ExtensionMsg_TabTargetConnectionInfo& info, 198 const ExtensionMsg_TabTargetConnectionInfo& info,
196 const std::string& extension_id, 199 const std::string& extension_id,
197 const std::string& channel_name, 200 const std::string& channel_name,
198 int* port_id) { 201 int* port_id) {
199 int port2_id; 202 int port2_id;
200 extensions::MessageService::AllocatePortIdPair(port_id, &port2_id); 203 extensions::MessageService::AllocatePortIdPair(port_id, &port2_id);
201 204
202 BrowserThread::PostTask( 205 BrowserThread::PostTask(
203 BrowserThread::UI, FROM_HERE, 206 BrowserThread::UI, FROM_HERE,
204 base::Bind(&ChromeExtensionMessageFilter::OpenChannelToTabOnUIThread, 207 base::Bind(&ChromeExtensionMessageFilter::OpenChannelToTabOnUIThread,
205 this, render_process_id_, port2_id, info, extension_id, 208 this, render_process_id_, routing_id, port2_id, info,
206 channel_name)); 209 extension_id, channel_name));
207 } 210 }
208 211
209 void ChromeExtensionMessageFilter::OpenChannelToTabOnUIThread( 212 void ChromeExtensionMessageFilter::OpenChannelToTabOnUIThread(
210 int source_process_id, 213 int source_process_id,
214 int source_routing_id,
211 int receiver_port_id, 215 int receiver_port_id,
212 const ExtensionMsg_TabTargetConnectionInfo& info, 216 const ExtensionMsg_TabTargetConnectionInfo& info,
213 const std::string& extension_id, 217 const std::string& extension_id,
214 const std::string& channel_name) { 218 const std::string& channel_name) {
215 DCHECK_CURRENTLY_ON(BrowserThread::UI); 219 DCHECK_CURRENTLY_ON(BrowserThread::UI);
216 if (profile_) { 220 if (profile_) {
217 extensions::MessageService::Get(profile_) 221 extensions::MessageService::Get(profile_)
218 ->OpenChannelToTab(source_process_id, 222 ->OpenChannelToTab(source_process_id,
223 source_routing_id,
219 receiver_port_id, 224 receiver_port_id,
220 info.tab_id, 225 info.tab_id,
221 info.frame_id, 226 info.frame_id,
222 extension_id, 227 extension_id,
223 channel_name); 228 channel_name);
224 } 229 }
225 } 230 }
226 231
232 void ChromeExtensionMessageFilter::OnOpenMessagePort(int routing_id,
233 int port_id) {
234 if (!profile_)
235 return;
236
237 extensions::MessageService::Get(profile_)->OpenPort(
238 port_id, render_process_id_, routing_id);
239 }
240
241 void ChromeExtensionMessageFilter::OnCloseMessagePort(int routing_id,
242 int port_id,
243 bool force_close) {
244 if (!profile_)
245 return;
246
247 extensions::MessageService::Get(profile_)->ClosePort(
248 port_id, render_process_id_, routing_id, force_close);
249 }
250
227 void ChromeExtensionMessageFilter::OnPostMessage( 251 void ChromeExtensionMessageFilter::OnPostMessage(
228 int port_id, 252 int port_id,
229 const extensions::Message& message) { 253 const extensions::Message& message) {
230 if (!profile_) 254 if (!profile_)
231 return; 255 return;
232 256
233 extensions::MessageService::Get(profile_)->PostMessage(port_id, message); 257 extensions::MessageService::Get(profile_)->PostMessage(port_id, message);
234 } 258 }
235 259
236 void ChromeExtensionMessageFilter::OnGetExtMessageBundle( 260 void ChromeExtensionMessageFilter::OnGetExtMessageBundle(
(...skipping 15 matching lines...) Expand all
252 276
253 scoped_ptr<extensions::MessageBundle::SubstitutionMap> dictionary_map( 277 scoped_ptr<extensions::MessageBundle::SubstitutionMap> dictionary_map(
254 extensions::file_util::LoadMessageBundleSubstitutionMapWithImports( 278 extensions::file_util::LoadMessageBundleSubstitutionMapWithImports(
255 extension_id, extension_set)); 279 extension_id, extension_set));
256 280
257 ExtensionHostMsg_GetMessageBundle::WriteReplyParams(reply_msg, 281 ExtensionHostMsg_GetMessageBundle::WriteReplyParams(reply_msg,
258 *dictionary_map); 282 *dictionary_map);
259 Send(reply_msg); 283 Send(reply_msg);
260 } 284 }
261 285
262 void ChromeExtensionMessageFilter::OnExtensionCloseChannel(
263 int port_id,
264 const std::string& error_message) {
265 if (!profile_)
266 return;
267
268 if (!content::RenderProcessHost::FromID(render_process_id_))
269 return; // To guard against crash in browser_tests shutdown.
270
271 extensions::MessageService* message_service =
272 extensions::MessageService::Get(profile_);
273 if (message_service)
274 message_service->CloseChannel(port_id, error_message);
275 }
276
277 void ChromeExtensionMessageFilter::OnAddAPIActionToExtensionActivityLog( 286 void ChromeExtensionMessageFilter::OnAddAPIActionToExtensionActivityLog(
278 const std::string& extension_id, 287 const std::string& extension_id,
279 const ExtensionHostMsg_APIActionOrEvent_Params& params) { 288 const ExtensionHostMsg_APIActionOrEvent_Params& params) {
280 scoped_refptr<extensions::Action> action = new extensions::Action( 289 scoped_refptr<extensions::Action> action = new extensions::Action(
281 extension_id, base::Time::Now(), extensions::Action::ACTION_API_CALL, 290 extension_id, base::Time::Now(), extensions::Action::ACTION_API_CALL,
282 params.api_call); 291 params.api_call);
283 action->set_args(make_scoped_ptr(params.arguments.DeepCopy())); 292 action->set_args(make_scoped_ptr(params.arguments.DeepCopy()));
284 if (!params.extra.empty()) { 293 if (!params.extra.empty()) {
285 action->mutable_other()->SetString( 294 action->mutable_other()->SetString(
286 activity_log_constants::kActionExtra, params.extra); 295 activity_log_constants::kActionExtra, params.extra);
(...skipping 29 matching lines...) Expand all
316 AddActionToExtensionActivityLog(profile_, action); 325 AddActionToExtensionActivityLog(profile_, action);
317 } 326 }
318 327
319 void ChromeExtensionMessageFilter::Observe( 328 void ChromeExtensionMessageFilter::Observe(
320 int type, 329 int type,
321 const content::NotificationSource& source, 330 const content::NotificationSource& source,
322 const content::NotificationDetails& details) { 331 const content::NotificationDetails& details) {
323 DCHECK_EQ(chrome::NOTIFICATION_PROFILE_DESTROYED, type); 332 DCHECK_EQ(chrome::NOTIFICATION_PROFILE_DESTROYED, type);
324 profile_ = NULL; 333 profile_ = NULL;
325 } 334 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698