| // 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 "chrome/browser/extensions/extension_action.h" |
| #include "content/public/browser/web_contents_observer.h" |
| #include "extensions/browser/extension_registry_observer.h" |
| |
| namespace content { |
| class WebContents; |
| } |
| |
| 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: |
| 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 ExtensionAction::ShowAction 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). |
| ExtensionAction::ShowAction 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_ |