Index: chrome/browser/extensions/location_bar_controller.h |
diff --git a/chrome/browser/extensions/location_bar_controller.h b/chrome/browser/extensions/location_bar_controller.h |
index ee99c443c071fe93131465fa3dc01d3445b55ed6..a8bf3b4699f93fd3455cbaeab518b610010478a3 100644 |
--- a/chrome/browser/extensions/location_bar_controller.h |
+++ b/chrome/browser/extensions/location_bar_controller.h |
@@ -5,40 +5,87 @@ |
#ifndef CHROME_BROWSER_EXTENSIONS_LOCATION_BAR_CONTROLLER_H_ |
#define CHROME_BROWSER_EXTENSIONS_LOCATION_BAR_CONTROLLER_H_ |
-#include <set> |
-#include <string> |
#include <vector> |
+#include "base/macros.h" |
+#include "base/memory/scoped_ptr.h" |
+#include "content/public/browser/web_contents_observer.h" |
+ |
+namespace content { |
+class WebContents; |
+} |
+ |
class ExtensionAction; |
namespace extensions { |
+class ActiveScriptController; |
+class Extension; |
+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 { |
+class LocationBarController : public content::WebContentsObserver { |
public: |
- // The reaction that the UI should take after executing |OnClicked|. |
+ // The action that the UI should take after executing |OnClicked|. |
enum Action { |
ACTION_NONE, |
ACTION_SHOW_POPUP, |
ACTION_SHOW_CONTEXT_MENU, |
}; |
- virtual ~LocationBarController() {} |
+ 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; |
+ }; |
+ |
+ 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; |
- // Gets the action data for all extensions. |
- virtual std::vector<ExtensionAction*> GetCurrentActions() const = 0; |
+ // The associated WebContents. |
+ content::WebContents* web_contents_; |
- // Notifies this that the badge for an extension has been clicked with some |
- // mouse button (1 for left, 2 for middle, and 3 for right click), and |
- // returns the action that should be taken in response (if any). |
- // TODO(kalman): make mouse_button an enum. |
- virtual Action OnClicked(const std::string& extension_id, |
- int mouse_button) = 0; |
+ // 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_; |
- // Notifies clients that the icons have changed. |
- virtual void NotifyChange() = 0; |
+ DISALLOW_COPY_AND_ASSIGN(LocationBarController); |
}; |
} // namespace extensions |