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