// 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. #ifndef CHROME_BROWSER_EXTENSIONS_LOCATION_BAR_CONTROLLER_H_ #define CHROME_BROWSER_EXTENSIONS_LOCATION_BAR_CONTROLLER_H_ #include <vector> #include "base/macros.h" #include "base/memory/scoped_ptr.h" #include "base/scoped_observer.h" #include "content/public/browser/web_contents_observer.h" #include "extensions/browser/extension_registry_observer.h" namespace content { class WebContents; } class ExtensionAction; namespace extensions { class ActiveScriptController; class Extension; class ExtensionRegistry; class PageActionController; // Interface for a class that controls the the extension icons that show up in // the location bar. Depending on switches, these icons can have differing // behavior. class LocationBarController : public content::WebContentsObserver, public ExtensionRegistryObserver { public: // The action that the UI should take after executing |OnClicked|. enum Action { ACTION_NONE, ACTION_SHOW_POPUP, ACTION_SHOW_CONTEXT_MENU, }; class ActionProvider { public: // Returns the action for the given extension, or NULL if there isn't one. virtual ExtensionAction* GetActionForExtension( const Extension* extension) = 0; // Handles a click on an extension action. virtual LocationBarController::Action OnClicked( const Extension* extension) = 0; // A notification that the WebContents has navigated in the main frame (and // not in page), so any state relating to the current page should likely be // reset. virtual void OnNavigated() = 0; // A notification that the given |extension| has been unloaded, and any // actions associated with it should be removed. // The location bar controller will update itself after this if needed, so // Providers should not call NotifyChange(). virtual void OnExtensionUnloaded(const Extension* extension) {} }; explicit LocationBarController(content::WebContents* web_contents); virtual ~LocationBarController(); // Returns the actions which should be displayed in the location bar. std::vector<ExtensionAction*> GetCurrentActions(); // Notifies this that an ExtensionAction has been clicked, and returns the // action which should be taken in response (if any). Action OnClicked(const ExtensionAction* action); // Notifies the window that the actions have changed. static void NotifyChange(content::WebContents* web_contents); ActiveScriptController* active_script_controller() { return active_script_controller_.get(); } private: // content::WebContentsObserver implementation. virtual void DidNavigateMainFrame( const content::LoadCommittedDetails& details, const content::FrameNavigateParams& params) OVERRIDE; // ExtensionRegistryObserver implementation. virtual void OnExtensionUnloaded( content::BrowserContext* browser_context, const Extension* extension, UnloadedExtensionInfo::Reason reason) OVERRIDE; // The associated WebContents. content::WebContents* web_contents_; // The controllers for different sources of actions in the location bar. // Currently, this is only page actions and active script actions, so we // explicitly own and create both. If there are ever more, it will be worth // considering making this class own a list of LocationBarControllerProviders // instead. scoped_ptr<ActiveScriptController> active_script_controller_; scoped_ptr<PageActionController> page_action_controller_; ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver> extension_registry_observer_; DISALLOW_COPY_AND_ASSIGN(LocationBarController); }; } // namespace extensions #endif // CHROME_BROWSER_EXTENSIONS_LOCATION_BAR_CONTROLLER_H_