Index: chrome/browser/extensions/extension_action_runner.cc |
diff --git a/chrome/browser/extensions/extension_action_runner.cc b/chrome/browser/extensions/extension_action_runner.cc |
index bcbb7e738c3ee2c4a003de97786b81b5090efa78..8fa7f01c52233cb9e12f18c08507020dafb598e8 100644 |
--- a/chrome/browser/extensions/extension_action_runner.cc |
+++ b/chrome/browser/extensions/extension_action_runner.cc |
@@ -68,13 +68,40 @@ ExtensionActionRunner* ExtensionActionRunner::GetForWebContents( |
return tab_helper ? tab_helper->extension_action_runner() : NULL; |
} |
-void ExtensionActionRunner::OnActiveTabPermissionGranted( |
- const Extension* extension) { |
- if (WantsToRun(extension)) |
- OnClicked(extension); |
+ExtensionAction::ShowAction ExtensionActionRunner::RunAction( |
+ const Extension* extension, |
+ bool grant_tab_permissions) { |
+ bool has_pending_scripts = WantsToRun(extension); |
+ if (grant_tab_permissions) { |
+ TabHelper::FromWebContents(web_contents()) |
+ ->active_tab_permission_granter() |
+ ->GrantIfRequested(extension); |
+ // If the extension had blocked actions, granting active tab will have |
+ // run the extension. Don't execute further since clicking should run |
+ // blocked actions *or* the normal extension action, not both. |
+ if (has_pending_scripts) |
+ return ExtensionAction::ACTION_NONE; |
+ } |
+ |
+ ExtensionAction* extension_action = |
+ ExtensionActionManager::Get(browser_context_) |
+ ->GetExtensionAction(*extension); |
+ |
+ // Anything that gets here should have a page or browser action. |
+ DCHECK(extension_action); |
+ int tab_id = SessionTabHelper::IdForTab(web_contents()); |
+ if (!extension_action->GetIsVisible(tab_id)) |
+ return ExtensionAction::ACTION_NONE; |
+ |
+ if (extension_action->HasPopup(tab_id)) |
+ return ExtensionAction::ACTION_SHOW_POPUP; |
+ |
+ ExtensionActionAPI::Get(browser_context_) |
+ ->DispatchExtensionActionClicked(*extension_action, web_contents()); |
+ return ExtensionAction::ACTION_NONE; |
} |
-void ExtensionActionRunner::OnClicked(const Extension* extension) { |
+void ExtensionActionRunner::RunBlockedActions(const Extension* extension) { |
DCHECK(ContainsKey(pending_scripts_, extension->id()) || |
web_request_blocked_.count(extension->id()) != 0); |
@@ -94,6 +121,12 @@ void ExtensionActionRunner::OnClicked(const Extension* extension) { |
NotifyChange(extension); |
} |
+void ExtensionActionRunner::OnActiveTabPermissionGranted( |
+ const Extension* extension) { |
+ if (WantsToRun(extension)) |
+ RunBlockedActions(extension); |
+} |
+ |
void ExtensionActionRunner::OnWebRequestBlocked(const Extension* extension) { |
web_request_blocked_.insert(extension->id()); |
} |