// Copyright 2014 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/location_bar_controller.h" #include "chrome/browser/extensions/active_script_controller.h" #include "chrome/browser/extensions/api/extension_action/extension_action_api.h" #include "chrome/browser/extensions/extension_action_manager.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_finder.h" #include "chrome/browser/ui/browser_window.h" #include "chrome/browser/ui/location_bar/location_bar.h" #include "chrome/common/extensions/manifest_handlers/ui_overrides_handler.h" #include "content/public/browser/web_contents.h" #include "extensions/browser/extension_registry.h" #include "extensions/common/feature_switch.h" namespace extensions { LocationBarController::LocationBarController( content::WebContents* web_contents) : web_contents_(web_contents), browser_context_(web_contents->GetBrowserContext()), action_manager_(ExtensionActionManager::Get(browser_context_)), should_show_page_actions_( !FeatureSwitch::extension_action_redesign()->IsEnabled()), extension_registry_observer_(this) { if (should_show_page_actions_) extension_registry_observer_.Add(ExtensionRegistry::Get(browser_context_)); } LocationBarController::~LocationBarController() { } std::vector LocationBarController::GetCurrentActions() { const ExtensionSet& extensions = ExtensionRegistry::Get(browser_context_)->enabled_extensions(); std::vector current_actions; if (!should_show_page_actions_) return current_actions; ActiveScriptController* active_script_controller = ActiveScriptController::GetForWebContents(web_contents_); for (ExtensionSet::const_iterator iter = extensions.begin(); iter != extensions.end(); ++iter) { // Right now, we can consolidate these actions because we only want to show // one action per extension. If clicking on an active script action ever // has a response, then we will need to split the actions. ExtensionAction* action = action_manager_->GetPageAction(**iter); if (!action && active_script_controller->WantsToRun(iter->get())) { ExtensionActionMap::iterator existing = active_script_actions_.find((*iter)->id()); if (existing != active_script_actions_.end()) { action = existing->second.get(); } else { linked_ptr active_script_action( ExtensionActionManager::Get(browser_context_)-> GetBestFitAction(**iter, ActionInfo::TYPE_PAGE).release()); active_script_action->SetIsVisible( ExtensionAction::kDefaultTabId, true); active_script_actions_[(*iter)->id()] = active_script_action; action = active_script_action.get(); } } if (action) current_actions.push_back(action); } return current_actions; } void LocationBarController::OnExtensionLoaded( content::BrowserContext* browser_context, const Extension* extension) { if (action_manager_->GetPageAction(*extension)) { ExtensionActionAPI::Get(browser_context)-> NotifyPageActionsChanged(web_contents_); } // We might also need to update the location bar if the extension can remove // the bookmark star. if (UIOverrides::RemovesBookmarkButton(extension)) { Browser* browser = chrome::FindBrowserWithWebContents(web_contents_); // In a perfect world, this can never be NULL. Unfortunately, since a // LocationBarController is attached to most WebContents, we can't make that // guarantee. if (!browser) return; // window() can be NULL if this is called before CreateBrowserWindow() // completes, and there won't be a location bar if the window has no toolbar // (e.g., and app window). LocationBar* location_bar = browser->window() ? browser->window()->GetLocationBar() : NULL; if (!location_bar) return; location_bar->UpdateBookmarkStarVisibility(); } } void LocationBarController::OnExtensionUnloaded( content::BrowserContext* browser_context, const Extension* extension, UnloadedExtensionInfo::Reason reason) { if (action_manager_->GetPageAction(*extension)) { ExtensionActionAPI::Get(browser_context)-> NotifyPageActionsChanged(web_contents_); } } } // namespace extensions