Index: chrome/browser/extensions/tab_helper.cc |
diff --git a/chrome/browser/extensions/tab_helper.cc b/chrome/browser/extensions/tab_helper.cc |
index 53c7127bca8d605c61649d00e8d0a554f89c95ca..5a96901f4f5ababfcd4f5e7267384dbe95144955 100644 |
--- a/chrome/browser/extensions/tab_helper.cc |
+++ b/chrome/browser/extensions/tab_helper.cc |
@@ -74,10 +74,9 @@ namespace extensions { |
TabHelper::TabHelper(content::WebContents* web_contents) |
: content::WebContentsObserver(web_contents), |
+ profile_(Profile::FromBrowserContext(web_contents->GetBrowserContext())), |
extension_app_(NULL), |
- extension_function_dispatcher_( |
- Profile::FromBrowserContext(web_contents->GetBrowserContext()), |
- this), |
+ extension_function_dispatcher_(profile_, this), |
pending_web_app_action_(NONE), |
last_committed_nav_entry_unique_id_(0), |
update_shortcut_on_load_complete_(false), |
@@ -97,14 +96,14 @@ TabHelper::TabHelper(content::WebContents* web_contents) |
active_tab_permission_granter_.reset(new ActiveTabPermissionGranter( |
web_contents, |
SessionTabHelper::IdForTab(web_contents), |
- Profile::FromBrowserContext(web_contents->GetBrowserContext()))); |
- |
- // If more classes need to listen to global content script activity, then |
- // a separate routing class with an observer interface should be written. |
- profile_ = Profile::FromBrowserContext(web_contents->GetBrowserContext()); |
+ profile_)); |
AddScriptExecutionObserver(ActivityLog::GetInstance(profile_)); |
+ InvokeForContentRulesRegistries([this](ContentRulesRegistry* registry) { |
+ registry->MonitorWebContentsForRuleEvaluation(this->web_contents()); |
+ }); |
+ |
registrar_.Add(this, |
content::NOTIFICATION_LOAD_STOP, |
content::Source<NavigationController>( |
@@ -192,6 +191,30 @@ SkBitmap* TabHelper::GetExtensionAppIcon() { |
return &extension_app_icon_; |
} |
+// Encapsulates the logic to decide which ContentRulesRegistries need to be |
+// invoked, depending on whether this WebContents is associated with an Original |
+// or OffTheRecord profile. In the latter case, we need to invoke on both the |
+// Original and OffTheRecord ContentRulesRegistries since the Original registry |
+// handles spanning-mode incognito extensions. |
+template <class Func> |
+void TabHelper::InvokeForContentRulesRegistries(const Func& func) { |
+ RulesRegistryService* rules_registry_service = |
+ RulesRegistryService::Get(profile_); |
+ if (rules_registry_service) { |
+ func(rules_registry_service->content_rules_registry()); |
+ if (profile_->IsOffTheRecord()) { |
+ // The original profile's content rules registry handles rules for |
+ // spanning extensions in incognito profiles, so invoke it also. |
+ RulesRegistryService* original_profile_rules_registry_service = |
+ RulesRegistryService::Get(profile_->GetOriginalProfile()); |
+ DCHECK_NE(rules_registry_service, |
+ original_profile_rules_registry_service); |
+ if (original_profile_rules_registry_service) |
+ func(original_profile_rules_registry_service->content_rules_registry()); |
+ } |
+ } |
+} |
+ |
void TabHelper::FinishCreateBookmarkApp( |
const Extension* extension, |
const WebApplicationInfo& web_app_info) { |
@@ -205,27 +228,10 @@ void TabHelper::RenderFrameCreated(content::RenderFrameHost* host) { |
void TabHelper::DidNavigateMainFrame( |
const content::LoadCommittedDetails& details, |
const content::FrameNavigateParams& params) { |
- RulesRegistryService* rules_registry_service = |
- RulesRegistryService::Get(profile_); |
- if (rules_registry_service) { |
- rules_registry_service->content_rules_registry()-> |
- DidNavigateMainFrame(web_contents(), details, params); |
- // The original profile's content rules registry handles rules for spanning |
- // extensions in incognito profiles, so let it know about the navigation |
- // also. |
- if (profile_->IsOffTheRecord()) { |
- RulesRegistryService* incognito_rules_registry_service = |
- RulesRegistryService::Get(profile_->GetOriginalProfile()); |
- // The content and web request rules registries depend on separate |
- // instances for original/incognito profiles. See the comment on |
- // ChromeContentRulesRegistry. |
- DCHECK_NE(rules_registry_service, incognito_rules_registry_service); |
- if (incognito_rules_registry_service) { |
- incognito_rules_registry_service->content_rules_registry()-> |
- DidNavigateMainFrame(web_contents(), details, params); |
- } |
- } |
- } |
+ InvokeForContentRulesRegistries( |
+ [this, &details, ¶ms](ContentRulesRegistry* registry) { |
+ registry->DidNavigateMainFrame(web_contents(), details, params); |
+ }); |
content::BrowserContext* context = web_contents()->GetBrowserContext(); |
ExtensionRegistry* registry = ExtensionRegistry::Get(context); |
@@ -262,8 +268,6 @@ bool TabHelper::OnMessageReceived(const IPC::Message& message) { |
IPC_MESSAGE_HANDLER(ExtensionHostMsg_GetAppInstallState, |
OnGetAppInstallState); |
IPC_MESSAGE_HANDLER(ExtensionHostMsg_Request, OnRequest) |
- IPC_MESSAGE_HANDLER(ExtensionHostMsg_OnWatchedPageChange, |
- OnWatchedPageChange) |
IPC_MESSAGE_UNHANDLED(handled = false) |
IPC_END_MESSAGE_MAP() |
return handled; |
@@ -356,12 +360,9 @@ void TabHelper::OnInlineWebstoreInstall(int install_id, |
} |
// Inform the Webstore API that an inline install is happening, in case the |
// page requested status updates. |
- Profile* profile = |
- Profile::FromBrowserContext(web_contents()->GetBrowserContext()); |
- |
- ExtensionRegistry* registry = ExtensionRegistry::Get(profile); |
+ ExtensionRegistry* registry = ExtensionRegistry::Get(profile_); |
if (registry->disabled_extensions().Contains(webstore_item_id) && |
- (ExtensionPrefs::Get(profile)->GetDisableReasons(webstore_item_id) & |
+ (ExtensionPrefs::Get(profile_)->GetDisableReasons(webstore_item_id) & |
Extension::DISABLE_PERMISSIONS_INCREASE) != 0) { |
// The extension was disabled due to permissions increase. Prompt for |
// re-enable. |
@@ -371,7 +372,7 @@ void TabHelper::OnInlineWebstoreInstall(int install_id, |
extension_reenabler_.reset(); |
extension_reenabler_ = ExtensionReenabler::PromptForReenable( |
registry->disabled_extensions().GetByID(webstore_item_id), |
- profile, |
+ profile_, |
web_contents(), |
requestor_url, |
base::Bind(&TabHelper::OnReenableComplete, |
@@ -381,7 +382,7 @@ void TabHelper::OnInlineWebstoreInstall(int install_id, |
} else { |
// TODO(devlin): We should adddress the case of the extension already |
// being installed and enabled. |
- WebstoreAPI::Get(profile)->OnInlineInstallStart( |
+ WebstoreAPI::Get(profile_)->OnInlineInstallStart( |
return_route_id, this, webstore_item_id, listeners_mask); |
WebstoreStandaloneInstaller::Callback callback = |
@@ -433,15 +434,6 @@ void TabHelper::OnContentScriptsExecuting( |
OnScriptsExecuted(web_contents(), executing_scripts_map, on_url)); |
} |
-void TabHelper::OnWatchedPageChange( |
- const std::vector<std::string>& css_selectors) { |
- if (ExtensionSystem::Get(profile_)->extension_service() && |
- RulesRegistryService::Get(profile_)) { |
- RulesRegistryService::Get(profile_)->content_rules_registry()->Apply( |
- web_contents(), css_selectors); |
- } |
-} |
- |
void TabHelper::OnDetailedConsoleMessageAdded( |
const base::string16& message, |
const base::string16& source, |
@@ -480,9 +472,7 @@ void TabHelper::UpdateExtensionAppIcon(const Extension* extension) { |
// Enqueue OnImageLoaded callback. |
if (extension) { |
- Profile* profile = |
- Profile::FromBrowserContext(web_contents()->GetBrowserContext()); |
- ImageLoader* loader = ImageLoader::Get(profile); |
+ ImageLoader* loader = ImageLoader::Get(profile_); |
loader->LoadImageAsync( |
extension, |
IconsInfo::GetIconResource(extension, |