1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#ifndef CHROME_BROWSER_UI_VIEWS_TOOLBAR_BROWSER_ACTION_VIEW_H_
6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#define CHROME_BROWSER_UI_VIEWS_TOOLBAR_BROWSER_ACTION_VIEW_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_action_icon_factory.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_context_menu_model.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_observer.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_registrar.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/context_menu_controller.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/button/menu_button.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/button/menu_button_listener.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/drag_controller.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/view.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Browser;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BrowserActionButton;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionAction;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Extension;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Image;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MenuItemView;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MenuRunner;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BrowserActionView
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A single entry in the browser action container. This contains the actual
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BrowserActionButton, as well as the logic to paint the badge.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BrowserActionView : public views::View {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Need DragController here because BrowserActionView could be
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // dragged/dropped.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class Delegate : public views::DragController,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   public ExtensionContextMenuModel::PopupDelegate {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Returns the current tab's ID, or -1 if there is no current tab.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual int GetCurrentTabId() const = 0;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Called when the user clicks on the browser action icon.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void OnBrowserActionExecuted(BrowserActionButton* button) = 0;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Called when a browser action becomes visible/hidden.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void OnBrowserActionVisibilityChanged() = 0;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   protected:
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~Delegate() {}
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserActionView(const extensions::Extension* extension,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    Browser* browser,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    Delegate* delegate);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~BrowserActionView();
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserActionButton* button() { return button_; }
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets browser action button icon with the badge.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::ImageSkia GetIconWithBadge();
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from views::View:
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Layout() OVERRIDE;
73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void GetAccessibleState(ui::AXViewState* state) OVERRIDE;
74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual gfx::Size GetPreferredSize() const OVERRIDE;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from views::View to paint the badge on top of children.
78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void PaintChildren(gfx::Canvas* canvas,
79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                             const views::CullSet& cull_set) OVERRIDE;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The Browser object this view is associated with.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser_;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Usually a container for this view.
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Delegate* delegate_;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The button this view contains.
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserActionButton* button_;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Extension this view associated with.
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const extensions::Extension* extension_;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BrowserActionView);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BrowserActionButton
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The BrowserActionButton is a specialization of the MenuButton class.
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// It acts on a ExtensionAction, in this case a BrowserAction and handles
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// loading the image for the button asynchronously on the file thread.
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BrowserActionButton : public views::MenuButton,
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            public views::ButtonListener,
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            public views::ContextMenuController,
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            public content::NotificationObserver,
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            public ExtensionActionIconFactory::Observer {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // The IconObserver will receive a notification when the button's icon has
110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // been updated.
111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  class IconObserver {
112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   public:
113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual void OnIconUpdated(const gfx::ImageSkia& icon) = 0;
114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   protected:
116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual ~IconObserver() {}
117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  };
118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserActionButton(const extensions::Extension* extension,
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      Browser* browser_,
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      BrowserActionView::Delegate* delegate);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Call this instead of delete.
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Destroy();
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionAction* browser_action() const { return browser_action_; }
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const extensions::Extension* extension() { return extension_; }
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void set_icon_observer(IconObserver* icon_observer) {
130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    icon_observer_ = icon_observer;
131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called to update the display to match the browser action's state.
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateState();
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Does this button's action have a popup?
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool IsPopup();
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual GURL GetPopupUrl();
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from views::View:
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool CanHandleAccelerators() const OVERRIDE;
142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void GetAccessibleState(ui::AXViewState* state) OVERRIDE;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from views::ButtonListener:
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ButtonPressed(views::Button* sender,
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const ui::Event& event) OVERRIDE;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from views::ContextMenuController.
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ShowContextMenuForView(View* source,
1507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                      const gfx::Point& point,
1517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                      ui::MenuSourceType source_type) OVERRIDE;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from content::NotificationObserver:
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Observe(int type,
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const content::NotificationSource& source,
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const content::NotificationDetails& details) OVERRIDE;
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overriden from ExtensionActionIconFactory::Observer.
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnIconUpdated() OVERRIDE;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // MenuButton behavior overrides.  These methods all default to TextButton
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // behavior unless this button is a popup.  In that case, it uses MenuButton
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // behavior.  MenuButton has the notion of a child popup being shown where the
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // button will stay in the pushed state until the "menu" (a popup in this
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // case) is dismissed.
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Activate() OVERRIDE;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool OnMousePressed(const ui::MouseEvent& event) OVERRIDE;
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnMouseReleased(const ui::MouseEvent& event) OVERRIDE;
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnMouseExited(const ui::MouseEvent& event) OVERRIDE;
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool OnKeyReleased(const ui::KeyEvent& event) OVERRIDE;
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from ui::AcceleratorTarget.
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool AcceleratorPressed(const ui::Accelerator& accelerator) OVERRIDE;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notifications when to set button state to pushed/not pushed (for when the
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // popup/context menu is hidden or shown by the container).
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetButtonPushed();
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetButtonNotPushed();
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Whether the browser action is enabled on this tab. Note that we cannot use
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the built-in views enabled/SetEnabled because disabled views do not
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // receive drag events.
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsEnabled(int tab_id) const;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns icon factory for the button.
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionActionIconFactory& icon_factory() { return icon_factory_; }
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
189a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Gets the icon of this button and its badge.
190a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  gfx::ImageSkia GetIconWithBadge();
191a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns button icon so it can be accessed during tests.
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::ImageSkia GetIconForTest();
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from views::View:
197a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  virtual void ViewHierarchyChanged(
198a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      const ViewHierarchyChangedDetails& details) OVERRIDE;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~BrowserActionButton();
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Register an extension command if the extension has an active one.
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void MaybeRegisterExtensionCommand();
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Unregisters an extension command, if the extension has registered one and
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // it is active.
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void MaybeUnregisterExtensionCommand(bool only_if_active);
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The Browser object this button is associated with.
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser_;
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The browser action this view represents. The ExtensionAction is not owned
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // by this class.
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionAction* browser_action_;
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The extension associated with the browser action we're displaying.
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const extensions::Extension* extension_;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The object that will be used to get the browser action icon for us.
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // It may load the icon asynchronously (in which case the initial icon
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // returned by the factory will be transparent), so we have to observe it for
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // updates to the icon.
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionActionIconFactory icon_factory_;
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Delegate that usually represents a container for BrowserActionView.
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserActionView::Delegate* delegate_;
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The context menu.  This member is non-NULL only when the menu is shown.
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::MenuItemView* context_menu_;
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used to make sure MaybeRegisterExtensionCommand() is called only once
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // from ViewHierarchyChanged().
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool called_registered_extension_command_;
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationRegistrar registrar_;
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The extension key binding accelerator this browser action is listening for
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (to show the popup).
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ui::Accelerator> keybinding_;
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Responsible for running the menu.
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<views::MenuRunner> menu_runner_;
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // The observer that we need to notify when the icon of the button has been
246a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // updated.
247a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  IconObserver* icon_observer_;
248a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class base::DeleteHelper<BrowserActionButton>;
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BrowserActionButton);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
254f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif  // CHROME_BROWSER_UI_VIEWS_TOOLBAR_BROWSER_ACTION_VIEW_H_
255