Chromium Code Reviews| Index: extensions/browser/extension_message_filter.cc |
| diff --git a/extensions/browser/extension_message_filter.cc b/extensions/browser/extension_message_filter.cc |
| index dfa57b5f49726c4ad1ac613812fd9260682e9f24..5122aafb20190c4f7c98729d3cbf1821f408fd19 100644 |
| --- a/extensions/browser/extension_message_filter.cc |
| +++ b/extensions/browser/extension_message_filter.cc |
| @@ -4,18 +4,18 @@ |
| #include "extensions/browser/extension_message_filter.h" |
| +#include "base/memory/singleton.h" |
| #include "components/crx_file/id_util.h" |
| +#include "components/keyed_service/content/browser_context_keyed_service_shutdown_notifier_factory.h" |
| #include "content/public/browser/browser_thread.h" |
| -#include "content/public/browser/render_frame_host.h" |
| #include "content/public/browser/render_process_host.h" |
| -#include "content/public/browser/render_view_host.h" |
| -#include "content/public/browser/resource_dispatcher_host.h" |
| #include "extensions/browser/blob_holder.h" |
| #include "extensions/browser/event_router.h" |
| -#include "extensions/browser/extension_function_dispatcher.h" |
| #include "extensions/browser/extension_system.h" |
| -#include "extensions/browser/info_map.h" |
| +#include "extensions/browser/extension_system_provider.h" |
| +#include "extensions/browser/extensions_browser_client.h" |
| #include "extensions/browser/process_manager.h" |
| +#include "extensions/browser/process_manager_factory.h" |
| #include "extensions/common/extension.h" |
| #include "extensions/common/extension_messages.h" |
| #include "ipc/ipc_message_macros.h" |
| @@ -25,18 +25,56 @@ using content::RenderProcessHost; |
| namespace extensions { |
| +namespace { |
| + |
| +class ShutdownNotifierFactory |
| + : public BrowserContextKeyedServiceShutdownNotifierFactory { |
| + public: |
| + static ShutdownNotifierFactory* GetInstance() { |
| + return Singleton<ShutdownNotifierFactory>::get(); |
| + } |
| + |
| + private: |
| + friend struct DefaultSingletonTraits<ShutdownNotifierFactory>; |
| + |
| + ShutdownNotifierFactory() |
| + : BrowserContextKeyedServiceShutdownNotifierFactory( |
| + "ExtensionMessageFilter") { |
| + DependsOn(ExtensionsBrowserClient::Get()->GetExtensionSystemFactory()); |
| + DependsOn(ProcessManagerFactory::GetInstance()); |
| + } |
| + ~ShutdownNotifierFactory() override {} |
| + |
| + DISALLOW_COPY_AND_ASSIGN(ShutdownNotifierFactory); |
| +}; |
| + |
| +} // namespace |
| + |
| ExtensionMessageFilter::ExtensionMessageFilter(int render_process_id, |
| content::BrowserContext* context) |
| : BrowserMessageFilter(ExtensionMsgStart), |
| render_process_id_(render_process_id), |
| - browser_context_(context), |
| - extension_info_map_(ExtensionSystem::Get(context)->info_map()), |
| - weak_ptr_factory_(this) { |
| + extension_system_(ExtensionSystem::Get(context)), |
| + process_manager_(ProcessManager::Get(context)) { |
| DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| + shutdown_notifier_ = |
| + ShutdownNotifierFactory::GetInstance()->Get(context)->Subscribe( |
| + base::Bind(&ExtensionMessageFilter::ShutdownOnUIThread, |
| + base::Unretained(this))); |
| +} |
| + |
| +void ExtensionMessageFilter::EnsureShutdownNotifierFactoryBuilt() { |
| + ShutdownNotifierFactory::GetInstance(); |
| } |
| ExtensionMessageFilter::~ExtensionMessageFilter() { |
| - DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| + DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| +} |
| + |
| +void ExtensionMessageFilter::ShutdownOnUIThread() { |
| + extension_system_ = nullptr; |
| + process_manager_ = nullptr; |
| + shutdown_notifier_.reset(); |
| } |
| void ExtensionMessageFilter::OverrideThreadForMessage( |
| @@ -60,9 +98,7 @@ void ExtensionMessageFilter::OverrideThreadForMessage( |
| } |
| void ExtensionMessageFilter::OnDestruct() const { |
| - // Destroy the filter on the IO thread since that's where its weak pointers |
| - // are being used. |
| - BrowserThread::DeleteOnIOThread::Destruct(this); |
| + BrowserThread::DeleteOnUIThread::Destruct(this); |
| } |
| bool ExtensionMessageFilter::OnMessageReceived(const IPC::Message& message) { |
| @@ -86,12 +122,6 @@ bool ExtensionMessageFilter::OnMessageReceived(const IPC::Message& message) { |
| OnExtensionSuspendAck) |
| IPC_MESSAGE_HANDLER(ExtensionHostMsg_TransferBlobsAck, |
| OnExtensionTransferBlobsAck) |
| - IPC_MESSAGE_HANDLER(ExtensionHostMsg_GenerateUniqueID, |
| - OnExtensionGenerateUniqueID) |
| - IPC_MESSAGE_HANDLER(ExtensionHostMsg_ResumeRequests, |
| - OnExtensionResumeRequests); |
| - IPC_MESSAGE_HANDLER(ExtensionHostMsg_RequestForIOThread, |
| - OnExtensionRequestForIOThread) |
| IPC_MESSAGE_UNHANDLED(handled = false) |
| IPC_END_MESSAGE_MAP() |
| return handled; |
| @@ -104,7 +134,11 @@ void ExtensionMessageFilter::OnExtensionAddListener( |
| RenderProcessHost* process = RenderProcessHost::FromID(render_process_id_); |
| if (!process) |
| return; |
| - EventRouter* router = EventRouter::Get(browser_context_); |
| + |
| + if (!extension_system_) |
| + return; |
| + |
| + EventRouter* router = extension_system_->event_router(); |
| if (!router) |
| return; |
| @@ -125,7 +159,11 @@ void ExtensionMessageFilter::OnExtensionRemoveListener( |
| RenderProcessHost* process = RenderProcessHost::FromID(render_process_id_); |
| if (!process) |
| return; |
| - EventRouter* router = EventRouter::Get(browser_context_); |
| + |
| + if (!extension_system_) |
|
not at google - send to devlin
2015/02/10 18:37:41
Is it possible to do all of these extension system
Bernhard Bauer
2015/02/10 19:02:34
Done. It does mean that we don't check anymore whe
|
| + return; |
| + |
| + EventRouter* router = extension_system_->event_router(); |
| if (!router) |
| return; |
| @@ -141,17 +179,25 @@ void ExtensionMessageFilter::OnExtensionRemoveListener( |
| void ExtensionMessageFilter::OnExtensionAddLazyListener( |
| const std::string& extension_id, const std::string& event_name) { |
| - EventRouter* router = EventRouter::Get(browser_context_); |
| + if (!extension_system_) |
| + return; |
| + |
| + EventRouter* router = extension_system_->event_router(); |
| if (!router) |
| return; |
| + |
| router->AddLazyEventListener(event_name, extension_id); |
| } |
| void ExtensionMessageFilter::OnExtensionRemoveLazyListener( |
| const std::string& extension_id, const std::string& event_name) { |
| - EventRouter* router = EventRouter::Get(browser_context_); |
| + if (!extension_system_) |
| + return; |
| + |
| + EventRouter* router = extension_system_->event_router(); |
| if (!router) |
| return; |
| + |
| router->RemoveLazyEventListener(event_name, extension_id); |
| } |
| @@ -163,9 +209,14 @@ void ExtensionMessageFilter::OnExtensionAddFilteredListener( |
| RenderProcessHost* process = RenderProcessHost::FromID(render_process_id_); |
| if (!process) |
| return; |
| - EventRouter* router = EventRouter::Get(browser_context_); |
| + |
| + if (!extension_system_) |
| + return; |
| + |
| + EventRouter* router = extension_system_->event_router(); |
| if (!router) |
| return; |
| + |
| router->AddFilteredEventListener( |
| event_name, process, extension_id, filter, lazy); |
| } |
| @@ -178,22 +229,32 @@ void ExtensionMessageFilter::OnExtensionRemoveFilteredListener( |
| RenderProcessHost* process = RenderProcessHost::FromID(render_process_id_); |
|
not at google - send to devlin
2015/02/10 18:37:15
I wonder if this can actually fail given it's call
Bernhard Bauer
2015/02/10 19:02:34
Process shuts down between the time the message is
|
| if (!process) |
| return; |
| - EventRouter* router = EventRouter::Get(browser_context_); |
| + |
| + if (!extension_system_) |
| + return; |
| + |
| + EventRouter* router = extension_system_->event_router(); |
| if (!router) |
| return; |
| + |
| router->RemoveFilteredEventListener( |
| event_name, process, extension_id, filter, lazy); |
| } |
| void ExtensionMessageFilter::OnExtensionShouldSuspendAck( |
| const std::string& extension_id, int sequence_id) { |
| - ProcessManager::Get(browser_context_) |
| - ->OnShouldSuspendAck(extension_id, sequence_id); |
| + if (!process_manager_) |
| + return; |
| + |
| + process_manager_->OnShouldSuspendAck(extension_id, sequence_id); |
|
not at google - send to devlin
2015/02/10 18:37:14
could you write these like
if (process_manager_)
Bernhard Bauer
2015/02/10 19:02:34
Yeah... I removed the check completely, because if
|
| } |
| void ExtensionMessageFilter::OnExtensionSuspendAck( |
| const std::string& extension_id) { |
| - ProcessManager::Get(browser_context_)->OnSuspendAck(extension_id); |
| + if (!process_manager_) |
| + return; |
| + |
| + process_manager_->OnSuspendAck(extension_id); |
| } |
| void ExtensionMessageFilter::OnExtensionTransferBlobsAck( |
| @@ -201,30 +262,8 @@ void ExtensionMessageFilter::OnExtensionTransferBlobsAck( |
| RenderProcessHost* process = RenderProcessHost::FromID(render_process_id_); |
| if (!process) |
| return; |
| - BlobHolder::FromRenderProcessHost(process)->DropBlobs(blob_uuids); |
| -} |
| -void ExtensionMessageFilter::OnExtensionGenerateUniqueID(int* unique_id) { |
| - static int next_unique_id = 0; |
| - *unique_id = ++next_unique_id; |
| -} |
| - |
| -void ExtensionMessageFilter::OnExtensionResumeRequests(int route_id) { |
| - content::ResourceDispatcherHost::Get()->ResumeBlockedRequestsForRoute( |
| - render_process_id_, route_id); |
| -} |
| - |
| -void ExtensionMessageFilter::OnExtensionRequestForIOThread( |
| - int routing_id, |
| - const ExtensionHostMsg_Request_Params& params) { |
| - DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| - ExtensionFunctionDispatcher::DispatchOnIOThread( |
| - extension_info_map_.get(), |
| - browser_context_, |
| - render_process_id_, |
| - weak_ptr_factory_.GetWeakPtr(), |
| - routing_id, |
| - params); |
| + BlobHolder::FromRenderProcessHost(process)->DropBlobs(blob_uuids); |
| } |
| } // namespace extensions |