| 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..2a67822685898ccc57bbb6af5f11fca7ac930f1c 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,12 +98,14 @@ 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) {
|
| + // If we have been shut down already, return.
|
| + if (!extension_system_)
|
| + return true;
|
| +
|
| bool handled = true;
|
| IPC_BEGIN_MESSAGE_MAP(ExtensionMessageFilter, message)
|
| IPC_MESSAGE_HANDLER(ExtensionHostMsg_AddListener,
|
| @@ -86,12 +126,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 +138,8 @@ void ExtensionMessageFilter::OnExtensionAddListener(
|
| RenderProcessHost* process = RenderProcessHost::FromID(render_process_id_);
|
| if (!process)
|
| return;
|
| - EventRouter* router = EventRouter::Get(browser_context_);
|
| +
|
| + EventRouter* router = extension_system_->event_router();
|
| if (!router)
|
| return;
|
|
|
| @@ -125,7 +160,8 @@ void ExtensionMessageFilter::OnExtensionRemoveListener(
|
| RenderProcessHost* process = RenderProcessHost::FromID(render_process_id_);
|
| if (!process)
|
| return;
|
| - EventRouter* router = EventRouter::Get(browser_context_);
|
| +
|
| + EventRouter* router = extension_system_->event_router();
|
| if (!router)
|
| return;
|
|
|
| @@ -141,17 +177,19 @@ void ExtensionMessageFilter::OnExtensionRemoveListener(
|
|
|
| void ExtensionMessageFilter::OnExtensionAddLazyListener(
|
| const std::string& extension_id, const std::string& event_name) {
|
| - EventRouter* router = EventRouter::Get(browser_context_);
|
| + 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_);
|
| + EventRouter* router = extension_system_->event_router();
|
| if (!router)
|
| return;
|
| +
|
| router->RemoveLazyEventListener(event_name, extension_id);
|
| }
|
|
|
| @@ -163,9 +201,11 @@ void ExtensionMessageFilter::OnExtensionAddFilteredListener(
|
| RenderProcessHost* process = RenderProcessHost::FromID(render_process_id_);
|
| if (!process)
|
| return;
|
| - EventRouter* router = EventRouter::Get(browser_context_);
|
| +
|
| + EventRouter* router = extension_system_->event_router();
|
| if (!router)
|
| return;
|
| +
|
| router->AddFilteredEventListener(
|
| event_name, process, extension_id, filter, lazy);
|
| }
|
| @@ -178,22 +218,23 @@ void ExtensionMessageFilter::OnExtensionRemoveFilteredListener(
|
| RenderProcessHost* process = RenderProcessHost::FromID(render_process_id_);
|
| if (!process)
|
| return;
|
| - EventRouter* router = EventRouter::Get(browser_context_);
|
| +
|
| + 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);
|
| + process_manager_->OnShouldSuspendAck(extension_id, sequence_id);
|
| }
|
|
|
| void ExtensionMessageFilter::OnExtensionSuspendAck(
|
| const std::string& extension_id) {
|
| - ProcessManager::Get(browser_context_)->OnSuspendAck(extension_id);
|
| + process_manager_->OnSuspendAck(extension_id);
|
| }
|
|
|
| void ExtensionMessageFilter::OnExtensionTransferBlobsAck(
|
| @@ -201,30 +242,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
|
|
|