Index: chrome/browser/extensions/active_script_controller.cc |
diff --git a/chrome/browser/extensions/active_script_controller.cc b/chrome/browser/extensions/active_script_controller.cc |
index 31574c9c22493e820bcdc178e795fd8a5848cfd7..f3b73b933f6c266192b7e870578f072b3ef13e7f 100644 |
--- a/chrome/browser/extensions/active_script_controller.cc |
+++ b/chrome/browser/extensions/active_script_controller.cc |
@@ -60,11 +60,11 @@ bool ShouldRecordExtension(const Extension* extension) { |
ActiveScriptController::ActiveScriptController( |
content::WebContents* web_contents) |
: content::WebContentsObserver(web_contents), |
+ browser_context_(web_contents->GetBrowserContext()), |
enabled_(FeatureSwitch::scripts_require_action()->IsEnabled()), |
extension_registry_observer_(this) { |
CHECK(web_contents); |
- extension_registry_observer_.Add( |
- ExtensionRegistry::Get(web_contents->GetBrowserContext())); |
+ extension_registry_observer_.Add(ExtensionRegistry::Get(browser_context_)); |
} |
ActiveScriptController::~ActiveScriptController() { |
@@ -130,8 +130,8 @@ void ActiveScriptController::AlwaysRunOnVisibleOrigin( |
// permissions and granted permissions. |
// TODO(devlin): Make sure that the permission is removed from |
// withheld_permissions if appropriate. |
- PermissionsUpdater(web_contents()->GetBrowserContext()) |
- .AddPermissions(extension, new_permissions.get()); |
+ PermissionsUpdater(browser_context_).AddPermissions(extension, |
+ new_permissions.get()); |
// Allow current tab to run injection. |
OnClicked(extension); |
@@ -183,12 +183,10 @@ void ActiveScriptController::RequestScriptInjection( |
PendingRequestList& list = pending_requests_[extension->id()]; |
list.push_back(callback); |
- // If this was the first entry, notify the location bar that there's a new |
- // icon. |
- if (list.size() == 1u) { |
- ExtensionActionAPI::Get(web_contents()->GetBrowserContext())-> |
- NotifyPageActionsChanged(web_contents()); |
- } |
+ // If this was the first entry, we need to notify that a new extension wants |
+ // to run. |
+ if (list.size() == 1u) |
+ NotifyChange(extension); |
} |
void ActiveScriptController::RunPendingForExtension( |
@@ -229,9 +227,9 @@ void ActiveScriptController::RunPendingForExtension( |
request->Run(); |
} |
- // Inform the location bar that the action is now gone. |
- ExtensionActionAPI::Get(web_contents()->GetBrowserContext())-> |
- NotifyPageActionsChanged(web_contents()); |
+ // The extension ran, so we need to update the ExtensionActionAPI that we no |
+ // longer want to act. |
+ NotifyChange(extension); |
} |
void ActiveScriptController::OnRequestScriptInjectionPermission( |
@@ -244,7 +242,7 @@ void ActiveScriptController::OnRequestScriptInjectionPermission( |
} |
const Extension* extension = |
- ExtensionRegistry::Get(web_contents()->GetBrowserContext()) |
+ ExtensionRegistry::Get(browser_context_) |
->enabled_extensions().GetByID(extension_id); |
// We shouldn't allow extensions which are no longer enabled to run any |
// scripts. Ignore the request. |
@@ -294,6 +292,22 @@ void ActiveScriptController::PermitScriptInjection(int64 request_id) { |
} |
} |
+void ActiveScriptController::NotifyChange(const Extension* extension) { |
+ ExtensionActionAPI* extension_action_api = |
+ ExtensionActionAPI::Get(browser_context_); |
+ ExtensionAction* extension_action = |
+ ExtensionActionManager::Get(browser_context_)-> |
+ GetExtensionAction(*extension); |
+ // If the extension has an action, we need to notify that it's updated. |
+ if (extension_action) { |
+ extension_action_api->NotifyChange( |
+ extension_action, web_contents(), browser_context_); |
+ } |
+ |
+ // We also notify that page actions may have changed. |
+ extension_action_api->NotifyPageActionsChanged(web_contents()); |
+} |
+ |
void ActiveScriptController::LogUMA() const { |
UMA_HISTOGRAM_COUNTS_100( |
"Extensions.ActiveScriptController.ShownActiveScriptsOnPage", |
@@ -339,7 +353,7 @@ void ActiveScriptController::OnExtensionUnloaded( |
PendingRequestMap::iterator iter = pending_requests_.find(extension->id()); |
if (iter != pending_requests_.end()) { |
pending_requests_.erase(iter); |
- ExtensionActionAPI::Get(web_contents()->GetBrowserContext())-> |
+ ExtensionActionAPI::Get(browser_context_)-> |
NotifyPageActionsChanged(web_contents()); |
} |
} |