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