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

Unified Diff: chrome/browser/extensions/api/declarative/rules_registry_service.cc

Issue 590573002: Remove ContentRulesRegistry dependence from RulesRegistryService. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix comment. Created 6 years, 3 months 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/extensions/api/declarative/rules_registry_service.cc
diff --git a/chrome/browser/extensions/api/declarative/rules_registry_service.cc b/chrome/browser/extensions/api/declarative/rules_registry_service.cc
deleted file mode 100644
index 3974b3d2e7e9d680f79c6032eb1807f6cfb9bf1a..0000000000000000000000000000000000000000
--- a/chrome/browser/extensions/api/declarative/rules_registry_service.cc
+++ /dev/null
@@ -1,233 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/extensions/api/declarative/rules_registry_service.h"
-
-#include "base/bind.h"
-#include "base/lazy_instance.h"
-#include "base/logging.h"
-#include "base/memory/scoped_ptr.h"
-#include "chrome/browser/extensions/api/declarative_content/content_rules_registry.h"
-#include "content/public/browser/browser_thread.h"
-#include "content/public/browser/notification_details.h"
-#include "content/public/browser/notification_service.h"
-#include "content/public/browser/notification_source.h"
-#include "content/public/browser/notification_types.h"
-#include "content/public/browser/render_process_host.h"
-#include "extensions/browser/api/declarative/rules_cache_delegate.h"
-#include "extensions/browser/api/declarative_webrequest/webrequest_constants.h"
-#include "extensions/browser/api/declarative_webrequest/webrequest_rules_registry.h"
-#include "extensions/browser/api/web_request/web_request_api.h"
-#include "extensions/browser/extension_registry.h"
-#include "extensions/common/extension.h"
-
-namespace extensions {
-
-namespace {
-
-// Registers |web_request_rules_registry| on the IO thread.
-void RegisterToExtensionWebRequestEventRouterOnIO(
- content::BrowserContext* browser_context,
- const RulesRegistryService::WebViewKey& webview_key,
- scoped_refptr<WebRequestRulesRegistry> web_request_rules_registry) {
- ExtensionWebRequestEventRouter::GetInstance()->RegisterRulesRegistry(
- browser_context, webview_key, web_request_rules_registry);
-}
-
-bool IsWebView(const RulesRegistryService::WebViewKey& webview_key) {
- return webview_key.embedder_process_id && webview_key.webview_instance_id;
-}
-
-} // namespace
-
-RulesRegistryService::RulesRegistryService(content::BrowserContext* context)
- : content_rules_registry_(NULL),
- extension_registry_observer_(this),
- browser_context_(context) {
- if (browser_context_) {
- extension_registry_observer_.Add(ExtensionRegistry::Get(browser_context_));
- registrar_.Add(
- this, content::NOTIFICATION_RENDERER_PROCESS_TERMINATED,
- content::NotificationService::AllBrowserContextsAndSources());
- EnsureDefaultRulesRegistriesRegistered(WebViewKey(0, 0));
- }
-}
-
-RulesRegistryService::~RulesRegistryService() {}
-
-void RulesRegistryService::EnsureDefaultRulesRegistriesRegistered(
- const WebViewKey& webview_key) {
- if (!browser_context_)
- return;
-
- RulesRegistryKey key(declarative_webrequest_constants::kOnRequest,
- webview_key);
- // If we can find the key in the |rule_registries_| then we have already
- // installed the default registries.
- if (ContainsKey(rule_registries_, key))
- return;
-
-
- RulesCacheDelegate* web_request_cache_delegate = NULL;
- if (!IsWebView(webview_key)) {
- web_request_cache_delegate =
- new RulesCacheDelegate(true /*log_storage_init_delay*/);
- cache_delegates_.push_back(web_request_cache_delegate);
- }
- scoped_refptr<WebRequestRulesRegistry> web_request_rules_registry(
- new WebRequestRulesRegistry(browser_context_,
- web_request_cache_delegate,
- webview_key));
-
- RegisterRulesRegistry(web_request_rules_registry);
- content::BrowserThread::PostTask(
- content::BrowserThread::IO, FROM_HERE,
- base::Bind(&RegisterToExtensionWebRequestEventRouterOnIO,
- browser_context_, webview_key, web_request_rules_registry));
-
- // Only create a ContentRulesRegistry for regular pages and not webviews.
- if (!IsWebView(webview_key)) {
- RulesCacheDelegate* content_rules_cache_delegate =
- new RulesCacheDelegate(false /*log_storage_init_delay*/);
- cache_delegates_.push_back(content_rules_cache_delegate);
- scoped_refptr<ContentRulesRegistry> content_rules_registry(
- new ContentRulesRegistry(browser_context_,
- content_rules_cache_delegate));
- RegisterRulesRegistry(content_rules_registry);
- content_rules_registry_ = content_rules_registry.get();
- }
-}
-
-void RulesRegistryService::Shutdown() {
- // Release the references to all registries. This would happen soon during
- // destruction of |*this|, but we need the ExtensionWebRequestEventRouter to
- // be the last to reference the WebRequestRulesRegistry objects, so that
- // the posted task below causes their destruction on the IO thread, not on UI
- // where the destruction of |*this| takes place.
- // TODO(vabr): Remove once http://crbug.com/218451#c6 gets addressed.
- rule_registries_.clear();
- content::BrowserThread::PostTask(
- content::BrowserThread::IO, FROM_HERE,
- base::Bind(&RegisterToExtensionWebRequestEventRouterOnIO,
- browser_context_, WebViewKey(0, 0),
- scoped_refptr<WebRequestRulesRegistry>(NULL)));
-}
-
-static base::LazyInstance<BrowserContextKeyedAPIFactory<RulesRegistryService> >
- g_factory = LAZY_INSTANCE_INITIALIZER;
-
-// static
-BrowserContextKeyedAPIFactory<RulesRegistryService>*
-RulesRegistryService::GetFactoryInstance() {
- return g_factory.Pointer();
-}
-
-// static
-RulesRegistryService* RulesRegistryService::Get(
- content::BrowserContext* context) {
- return BrowserContextKeyedAPIFactory<RulesRegistryService>::Get(context);
-}
-
-void RulesRegistryService::RegisterRulesRegistry(
- scoped_refptr<RulesRegistry> rule_registry) {
- const std::string event_name(rule_registry->event_name());
- RulesRegistryKey key(event_name, rule_registry->webview_key());
- DCHECK(rule_registries_.find(key) == rule_registries_.end());
- rule_registries_[key] = rule_registry;
-}
-
-scoped_refptr<RulesRegistry> RulesRegistryService::GetRulesRegistry(
- const WebViewKey& webview_key,
- const std::string& event_name) {
- EnsureDefaultRulesRegistriesRegistered(webview_key);
-
- RulesRegistryKey key(event_name, webview_key);
- RulesRegistryMap::const_iterator i = rule_registries_.find(key);
- if (i == rule_registries_.end())
- return scoped_refptr<RulesRegistry>();
- return i->second;
-}
-
-void RulesRegistryService::RemoveWebViewRulesRegistries(int process_id) {
- DCHECK_NE(0, process_id);
-
- std::set<RulesRegistryKey> registries_to_delete;
- for (RulesRegistryMap::iterator it = rule_registries_.begin();
- it != rule_registries_.end(); ++it) {
- const RulesRegistryKey& key = it->first;
- const WebViewKey& webview_key = key.webview_key;
- int embedder_process_id = webview_key.embedder_process_id;
- // |process_id| will always be non-zero.
- // |embedder_process_id| will only be non-zero if the key corresponds to a
- // webview registry.
- // Thus, |embedder_process_id| == |process_id| ==> the process ID is a
- // webview embedder.
- if (embedder_process_id != process_id)
- continue;
-
- // Modifying the container while iterating is bad so we'll save the keys we
- // wish to delete in another container, and delete them in another loop.
- registries_to_delete.insert(key);
- }
- for (std::set<RulesRegistryKey>::iterator it = registries_to_delete.begin();
- it != registries_to_delete.end(); ++it) {
- rule_registries_.erase(*it);
- }
-}
-
-void RulesRegistryService::SimulateExtensionUninstalled(
- const std::string& extension_id) {
- NotifyRegistriesHelper(&RulesRegistry::OnExtensionUninstalled, extension_id);
-}
-
-void RulesRegistryService::NotifyRegistriesHelper(
- void (RulesRegistry::*notification_callback)(const std::string&),
- const std::string& extension_id) {
- RulesRegistryMap::iterator i;
- for (i = rule_registries_.begin(); i != rule_registries_.end(); ++i) {
- scoped_refptr<RulesRegistry> registry = i->second;
- if (content::BrowserThread::CurrentlyOn(registry->owner_thread())) {
- (registry.get()->*notification_callback)(extension_id);
- } else {
- content::BrowserThread::PostTask(
- registry->owner_thread(),
- FROM_HERE,
- base::Bind(notification_callback, registry, extension_id));
- }
- }
-}
-
-void RulesRegistryService::OnExtensionLoaded(
- content::BrowserContext* browser_context,
- const Extension* extension) {
- NotifyRegistriesHelper(&RulesRegistry::OnExtensionLoaded, extension->id());
-}
-
-void RulesRegistryService::OnExtensionUnloaded(
- content::BrowserContext* browser_context,
- const Extension* extension,
- UnloadedExtensionInfo::Reason reason) {
- NotifyRegistriesHelper(&RulesRegistry::OnExtensionUnloaded, extension->id());
-}
-
-void RulesRegistryService::OnExtensionUninstalled(
- content::BrowserContext* browser_context,
- const Extension* extension,
- extensions::UninstallReason reason) {
- NotifyRegistriesHelper(&RulesRegistry::OnExtensionUninstalled,
- extension->id());
-}
-
-void RulesRegistryService::Observe(
- int type,
- const content::NotificationSource& source,
- const content::NotificationDetails& details) {
- DCHECK_EQ(content::NOTIFICATION_RENDERER_PROCESS_TERMINATED, type);
-
- content::RenderProcessHost* process =
- content::Source<content::RenderProcessHost>(source).ptr();
- RemoveWebViewRulesRegistries(process->GetID());
-}
-
-} // namespace extensions

Powered by Google App Engine
This is Rietveld 408576698