| 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 "extensions/browser/extension_message_filter.h" | 5 #include "extensions/browser/extension_message_filter.h" |
| 6 | 6 |
| 7 #include "components/crx_file/id_util.h" | 7 #include "components/crx_file/id_util.h" |
| 8 #include "content/public/browser/browser_thread.h" | 8 #include "content/public/browser/browser_thread.h" |
| 9 #include "content/public/browser/render_frame_host.h" | 9 #include "content/public/browser/render_frame_host.h" |
| 10 #include "content/public/browser/render_process_host.h" | 10 #include "content/public/browser/render_process_host.h" |
| 11 #include "content/public/browser/render_view_host.h" | 11 #include "content/public/browser/render_view_host.h" |
| 12 #include "content/public/browser/resource_dispatcher_host.h" | 12 #include "content/public/browser/resource_dispatcher_host.h" |
| 13 #include "extensions/browser/blob_holder.h" | 13 #include "extensions/browser/blob_holder.h" |
| 14 #include "extensions/browser/event_router.h" | 14 #include "extensions/browser/event_router.h" |
| 15 #include "extensions/browser/extension_function_dispatcher.h" | 15 #include "extensions/browser/extension_function_dispatcher.h" |
| 16 #include "extensions/browser/extension_system.h" | 16 #include "extensions/browser/extension_system.h" |
| 17 #include "extensions/browser/guest_view/guest_view_base.h" | |
| 18 #include "extensions/browser/guest_view/guest_view_manager.h" | |
| 19 #include "extensions/browser/guest_view/mime_handler_view/mime_handler_view_cons
tants.h" | |
| 20 #include "extensions/browser/guest_view/mime_handler_view/mime_handler_view_gues
t.h" | |
| 21 #include "extensions/browser/info_map.h" | 17 #include "extensions/browser/info_map.h" |
| 22 #include "extensions/browser/process_manager.h" | 18 #include "extensions/browser/process_manager.h" |
| 23 #include "extensions/common/extension.h" | 19 #include "extensions/common/extension.h" |
| 24 #include "extensions/common/extension_messages.h" | 20 #include "extensions/common/extension_messages.h" |
| 25 #include "ipc/ipc_message_macros.h" | 21 #include "ipc/ipc_message_macros.h" |
| 26 | 22 |
| 27 using content::BrowserThread; | 23 using content::BrowserThread; |
| 28 using content::RenderProcessHost; | 24 using content::RenderProcessHost; |
| 29 | 25 |
| 30 namespace extensions { | 26 namespace extensions { |
| (...skipping 10 matching lines...) Expand all Loading... |
| 41 | 37 |
| 42 ExtensionMessageFilter::~ExtensionMessageFilter() { | 38 ExtensionMessageFilter::~ExtensionMessageFilter() { |
| 43 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 39 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 44 } | 40 } |
| 45 | 41 |
| 46 void ExtensionMessageFilter::OverrideThreadForMessage( | 42 void ExtensionMessageFilter::OverrideThreadForMessage( |
| 47 const IPC::Message& message, | 43 const IPC::Message& message, |
| 48 BrowserThread::ID* thread) { | 44 BrowserThread::ID* thread) { |
| 49 switch (message.type()) { | 45 switch (message.type()) { |
| 50 case ExtensionHostMsg_AddListener::ID: | 46 case ExtensionHostMsg_AddListener::ID: |
| 51 case ExtensionHostMsg_AttachGuest::ID: | |
| 52 case ExtensionHostMsg_RemoveListener::ID: | 47 case ExtensionHostMsg_RemoveListener::ID: |
| 53 case ExtensionHostMsg_AddLazyListener::ID: | 48 case ExtensionHostMsg_AddLazyListener::ID: |
| 54 case ExtensionHostMsg_CreateMimeHandlerViewGuest::ID: | |
| 55 case ExtensionHostMsg_RemoveLazyListener::ID: | 49 case ExtensionHostMsg_RemoveLazyListener::ID: |
| 56 case ExtensionHostMsg_AddFilteredListener::ID: | 50 case ExtensionHostMsg_AddFilteredListener::ID: |
| 57 case ExtensionHostMsg_RemoveFilteredListener::ID: | 51 case ExtensionHostMsg_RemoveFilteredListener::ID: |
| 58 case ExtensionHostMsg_ShouldSuspendAck::ID: | 52 case ExtensionHostMsg_ShouldSuspendAck::ID: |
| 59 case ExtensionHostMsg_SuspendAck::ID: | 53 case ExtensionHostMsg_SuspendAck::ID: |
| 60 case ExtensionHostMsg_TransferBlobsAck::ID: | 54 case ExtensionHostMsg_TransferBlobsAck::ID: |
| 61 *thread = BrowserThread::UI; | 55 *thread = BrowserThread::UI; |
| 62 break; | 56 break; |
| 63 default: | 57 default: |
| 64 break; | 58 break; |
| 65 } | 59 } |
| 66 } | 60 } |
| 67 | 61 |
| 68 void ExtensionMessageFilter::OnDestruct() const { | 62 void ExtensionMessageFilter::OnDestruct() const { |
| 69 // Destroy the filter on the IO thread since that's where its weak pointers | 63 // Destroy the filter on the IO thread since that's where its weak pointers |
| 70 // are being used. | 64 // are being used. |
| 71 BrowserThread::DeleteOnIOThread::Destruct(this); | 65 BrowserThread::DeleteOnIOThread::Destruct(this); |
| 72 } | 66 } |
| 73 | 67 |
| 74 bool ExtensionMessageFilter::OnMessageReceived(const IPC::Message& message) { | 68 bool ExtensionMessageFilter::OnMessageReceived(const IPC::Message& message) { |
| 75 bool handled = true; | 69 bool handled = true; |
| 76 IPC_BEGIN_MESSAGE_MAP(ExtensionMessageFilter, message) | 70 IPC_BEGIN_MESSAGE_MAP(ExtensionMessageFilter, message) |
| 77 IPC_MESSAGE_HANDLER(ExtensionHostMsg_AddListener, | 71 IPC_MESSAGE_HANDLER(ExtensionHostMsg_AddListener, |
| 78 OnExtensionAddListener) | 72 OnExtensionAddListener) |
| 79 IPC_MESSAGE_HANDLER(ExtensionHostMsg_RemoveListener, | 73 IPC_MESSAGE_HANDLER(ExtensionHostMsg_RemoveListener, |
| 80 OnExtensionRemoveListener) | 74 OnExtensionRemoveListener) |
| 81 IPC_MESSAGE_HANDLER(ExtensionHostMsg_AddLazyListener, | 75 IPC_MESSAGE_HANDLER(ExtensionHostMsg_AddLazyListener, |
| 82 OnExtensionAddLazyListener) | 76 OnExtensionAddLazyListener) |
| 83 IPC_MESSAGE_HANDLER(ExtensionHostMsg_AttachGuest, | |
| 84 OnExtensionAttachGuest) | |
| 85 IPC_MESSAGE_HANDLER(ExtensionHostMsg_CreateMimeHandlerViewGuest, | |
| 86 OnExtensionCreateMimeHandlerViewGuest) | |
| 87 IPC_MESSAGE_HANDLER(ExtensionHostMsg_RemoveLazyListener, | 77 IPC_MESSAGE_HANDLER(ExtensionHostMsg_RemoveLazyListener, |
| 88 OnExtensionRemoveLazyListener) | 78 OnExtensionRemoveLazyListener) |
| 89 IPC_MESSAGE_HANDLER(ExtensionHostMsg_AddFilteredListener, | 79 IPC_MESSAGE_HANDLER(ExtensionHostMsg_AddFilteredListener, |
| 90 OnExtensionAddFilteredListener) | 80 OnExtensionAddFilteredListener) |
| 91 IPC_MESSAGE_HANDLER(ExtensionHostMsg_RemoveFilteredListener, | 81 IPC_MESSAGE_HANDLER(ExtensionHostMsg_RemoveFilteredListener, |
| 92 OnExtensionRemoveFilteredListener) | 82 OnExtensionRemoveFilteredListener) |
| 93 IPC_MESSAGE_HANDLER(ExtensionHostMsg_ShouldSuspendAck, | 83 IPC_MESSAGE_HANDLER(ExtensionHostMsg_ShouldSuspendAck, |
| 94 OnExtensionShouldSuspendAck) | 84 OnExtensionShouldSuspendAck) |
| 95 IPC_MESSAGE_HANDLER(ExtensionHostMsg_SuspendAck, | 85 IPC_MESSAGE_HANDLER(ExtensionHostMsg_SuspendAck, |
| 96 OnExtensionSuspendAck) | 86 OnExtensionSuspendAck) |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 150 } | 140 } |
| 151 | 141 |
| 152 void ExtensionMessageFilter::OnExtensionAddLazyListener( | 142 void ExtensionMessageFilter::OnExtensionAddLazyListener( |
| 153 const std::string& extension_id, const std::string& event_name) { | 143 const std::string& extension_id, const std::string& event_name) { |
| 154 EventRouter* router = EventRouter::Get(browser_context_); | 144 EventRouter* router = EventRouter::Get(browser_context_); |
| 155 if (!router) | 145 if (!router) |
| 156 return; | 146 return; |
| 157 router->AddLazyEventListener(event_name, extension_id); | 147 router->AddLazyEventListener(event_name, extension_id); |
| 158 } | 148 } |
| 159 | 149 |
| 160 void ExtensionMessageFilter::OnExtensionAttachGuest( | |
| 161 int routing_id, | |
| 162 int element_instance_id, | |
| 163 int guest_instance_id, | |
| 164 const base::DictionaryValue& params) { | |
| 165 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
| 166 GuestViewManager* manager = | |
| 167 GuestViewManager::FromBrowserContext(browser_context_); | |
| 168 if (!manager) | |
| 169 return; | |
| 170 | |
| 171 manager->AttachGuest(render_process_id_, | |
| 172 routing_id, | |
| 173 element_instance_id, | |
| 174 guest_instance_id, | |
| 175 params); | |
| 176 } | |
| 177 | |
| 178 void ExtensionMessageFilter::OnExtensionCreateMimeHandlerViewGuest( | |
| 179 int render_frame_id, | |
| 180 const std::string& view_id, | |
| 181 int element_instance_id, | |
| 182 const gfx::Size& element_size) { | |
| 183 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
| 184 GuestViewManager* manager = | |
| 185 GuestViewManager::FromBrowserContext(browser_context_); | |
| 186 if (!manager) | |
| 187 return; | |
| 188 | |
| 189 content::RenderFrameHost* rfh = | |
| 190 content::RenderFrameHost::FromID(render_process_id_, render_frame_id); | |
| 191 content::WebContents* embedder_web_contents = | |
| 192 content::WebContents::FromRenderFrameHost(rfh); | |
| 193 if (!embedder_web_contents) | |
| 194 return; | |
| 195 | |
| 196 GuestViewManager::WebContentsCreatedCallback callback = | |
| 197 base::Bind(&ExtensionMessageFilter::MimeHandlerViewGuestCreatedCallback, | |
| 198 this, | |
| 199 element_instance_id, | |
| 200 render_process_id_, | |
| 201 render_frame_id, | |
| 202 element_size); | |
| 203 | |
| 204 base::DictionaryValue create_params; | |
| 205 create_params.SetString(mime_handler_view::kViewId, view_id); | |
| 206 create_params.SetInteger(guestview::kElementWidth, element_size.width()); | |
| 207 create_params.SetInteger(guestview::kElementHeight, element_size.height()); | |
| 208 manager->CreateGuest(MimeHandlerViewGuest::Type, | |
| 209 embedder_web_contents, | |
| 210 create_params, | |
| 211 callback); | |
| 212 } | |
| 213 | |
| 214 void ExtensionMessageFilter::OnExtensionRemoveLazyListener( | 150 void ExtensionMessageFilter::OnExtensionRemoveLazyListener( |
| 215 const std::string& extension_id, const std::string& event_name) { | 151 const std::string& extension_id, const std::string& event_name) { |
| 216 EventRouter* router = EventRouter::Get(browser_context_); | 152 EventRouter* router = EventRouter::Get(browser_context_); |
| 217 if (!router) | 153 if (!router) |
| 218 return; | 154 return; |
| 219 router->RemoveLazyEventListener(event_name, extension_id); | 155 router->RemoveLazyEventListener(event_name, extension_id); |
| 220 } | 156 } |
| 221 | 157 |
| 222 void ExtensionMessageFilter::OnExtensionAddFilteredListener( | 158 void ExtensionMessageFilter::OnExtensionAddFilteredListener( |
| 223 const std::string& extension_id, | 159 const std::string& extension_id, |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 284 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 220 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 285 ExtensionFunctionDispatcher::DispatchOnIOThread( | 221 ExtensionFunctionDispatcher::DispatchOnIOThread( |
| 286 extension_info_map_.get(), | 222 extension_info_map_.get(), |
| 287 browser_context_, | 223 browser_context_, |
| 288 render_process_id_, | 224 render_process_id_, |
| 289 weak_ptr_factory_.GetWeakPtr(), | 225 weak_ptr_factory_.GetWeakPtr(), |
| 290 routing_id, | 226 routing_id, |
| 291 params); | 227 params); |
| 292 } | 228 } |
| 293 | 229 |
| 294 void ExtensionMessageFilter::MimeHandlerViewGuestCreatedCallback( | |
| 295 int element_instance_id, | |
| 296 int embedder_render_process_id, | |
| 297 int embedder_render_frame_id, | |
| 298 const gfx::Size& element_size, | |
| 299 content::WebContents* web_contents) { | |
| 300 GuestViewManager* manager = | |
| 301 GuestViewManager::FromBrowserContext(browser_context_); | |
| 302 if (!manager) | |
| 303 return; | |
| 304 | |
| 305 MimeHandlerViewGuest* guest_view = | |
| 306 MimeHandlerViewGuest::FromWebContents(web_contents); | |
| 307 if (!guest_view) | |
| 308 return; | |
| 309 int guest_instance_id = guest_view->guest_instance_id(); | |
| 310 | |
| 311 content::RenderFrameHost* rfh = content::RenderFrameHost::FromID( | |
| 312 embedder_render_process_id, embedder_render_frame_id); | |
| 313 if (!rfh) | |
| 314 return; | |
| 315 | |
| 316 base::DictionaryValue attach_params; | |
| 317 attach_params.SetInteger(guestview::kElementWidth, element_size.width()); | |
| 318 attach_params.SetInteger(guestview::kElementHeight, element_size.height()); | |
| 319 manager->AttachGuest(embedder_render_process_id, | |
| 320 rfh->GetRenderViewHost()->GetRoutingID(), | |
| 321 element_instance_id, | |
| 322 guest_instance_id, | |
| 323 attach_params); | |
| 324 | |
| 325 rfh->Send( | |
| 326 new ExtensionMsg_CreateMimeHandlerViewGuestACK(element_instance_id)); | |
| 327 } | |
| 328 | |
| 329 } // namespace extensions | 230 } // namespace extensions |
| OLD | NEW |