diff options
author | aa@chromium.org <aa@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-10-20 05:16:54 +0000 |
---|---|---|
committer | aa@chromium.org <aa@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-10-20 05:16:54 +0000 |
commit | bf28f5f87c717257ef566e4f7a22d116d088f59e (patch) | |
tree | b6a1cb91e83a23973187116c3aaec3041af27538 /chrome/browser | |
parent | dd3e02abd586bcb898a557713b2636e0f4999990 (diff) | |
download | chromium_src-bf28f5f87c717257ef566e4f7a22d116d088f59e.zip chromium_src-bf28f5f87c717257ef566e4f7a22d116d088f59e.tar.gz chromium_src-bf28f5f87c717257ef566e4f7a22d116d088f59e.tar.bz2 |
Implement chrome.browserAction.setIcon({path:...});
BUG=22575
Review URL: http://codereview.chromium.org/269103
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@29495 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser')
-rw-r--r-- | chrome/browser/extensions/browser_action_apitest.cc | 21 | ||||
-rw-r--r-- | chrome/browser/views/browser_actions_container.cc | 98 | ||||
-rw-r--r-- | chrome/browser/views/browser_actions_container.h | 116 |
3 files changed, 132 insertions, 103 deletions
diff --git a/chrome/browser/extensions/browser_action_apitest.cc b/chrome/browser/extensions/browser_action_apitest.cc index e5a4650..13b73d8 100644 --- a/chrome/browser/extensions/browser_action_apitest.cc +++ b/chrome/browser/extensions/browser_action_apitest.cc @@ -65,13 +65,15 @@ IN_PROC_BROWSER_TEST_F(ExtensionApiTest, BrowserAction) { IN_PROC_BROWSER_TEST_F(ExtensionApiTest, DynamicBrowserAction) { ASSERT_TRUE(RunExtensionTest("browser_action_no_icon")) << message_; - // Test that there is a browser action in the toolbar. + // Test that there is a browser action in the toolbar and that it has no icon. BrowserActionsContainer* browser_actions = browser()->window()->GetBrowserWindowTesting()->GetToolbarView()-> browser_actions(); ASSERT_EQ(1, browser_actions->num_browser_actions()); + ASSERT_TRUE(browser_actions->GetBrowserActionViewAt(0)->button()->icon() + .empty()); - // Tell the extension to update the browser action state. + // Tell the extension to update the icon using setIcon({imageData:...}). ResultCatcher catcher; ExtensionsService* service = browser()->profile()->GetExtensionsService(); Extension* extension = service->extensions()->at(0); @@ -80,8 +82,19 @@ IN_PROC_BROWSER_TEST_F(ExtensionApiTest, DynamicBrowserAction) { ASSERT_TRUE(catcher.GetNextResult()); // Test that we received the changes. - ExtensionActionState* action_state = extension->browser_action_state(); - ASSERT_TRUE(action_state->icon()); + ASSERT_FALSE(browser_actions->GetBrowserActionViewAt(0)->button()->icon() + .empty()); + + // Tell the extension to update using setIcon({path:...}); + ui_test_utils::NavigateToURL(browser(), + GURL(extension->GetResourceURL("update2.html"))); + ASSERT_TRUE(catcher.GetNextResult()); + + // Test that we received the changes. + ASSERT_FALSE(browser_actions->GetBrowserActionViewAt(0)->button()->icon() + .empty()); + + // TODO(aa): Would be nice here to actually compare that the pixels change. } IN_PROC_BROWSER_TEST_F(ExtensionApiTest, BrowserActionPopup) { diff --git a/chrome/browser/views/browser_actions_container.cc b/chrome/browser/views/browser_actions_container.cc index 1d4f825f..52cc137 100644 --- a/chrome/browser/views/browser_actions_container.cc +++ b/chrome/browser/views/browser_actions_container.cc @@ -11,7 +11,6 @@ #include "chrome/browser/extensions/extension_browser_event_router.h" #include "chrome/browser/extensions/extensions_service.h" #include "chrome/browser/extensions/extension_tabs_module.h" -#include "chrome/browser/extensions/image_loading_tracker.h" #include "chrome/browser/profile.h" #include "chrome/browser/view_ids.h" #include "chrome/browser/views/extensions/extension_popup.h" @@ -23,7 +22,6 @@ #include "third_party/skia/include/core/SkBitmap.h" #include "third_party/skia/include/core/SkTypeface.h" #include "third_party/skia/include/effects/SkGradientShader.h" -#include "views/controls/button/menu_button.h" #include "views/controls/button/text_button.h" // The size (both dimensions) of the buttons for page actions. @@ -41,85 +39,10 @@ static const int kControlVertOffset = 6; // not enough space to fit all the browser actions in the toolbar. static const int kMinimumNumberOfVisibleBrowserActions = 2; + //////////////////////////////////////////////////////////////////////////////// // BrowserActionButton -// The BrowserActionButton is a specialization of the MenuButton class. -// It acts on a ExtensionAction, in this case a BrowserAction and handles -// loading the image for the button asynchronously on the file thread to -class BrowserActionButton : public views::MenuButton, - public views::ButtonListener, - public ImageLoadingTracker::Observer, - public NotificationObserver { - public: - BrowserActionButton(ExtensionAction* browser_action, - Extension* extension, - BrowserActionsContainer* panel); - ~BrowserActionButton(); - - const ExtensionAction& browser_action() const { return *browser_action_; } - ExtensionActionState* browser_action_state() { return browser_action_state_; } - - // Overriden from views::View. Return a 0-inset so the icon can draw all the - // way to the edge of the view if it wants. - virtual gfx::Insets GetInsets() const; - - // Overridden from views::ButtonListener: - virtual void ButtonPressed(views::Button* sender, const views::Event& event); - - // Overridden from ImageLoadingTracker. - virtual void OnImageLoaded(SkBitmap* image, size_t index); - - // Overridden from NotificationObserver: - virtual void Observe(NotificationType type, - const NotificationSource& source, - const NotificationDetails& details); - - // MenuButton behavior overrides. These methods all default to TextButton - // behavior unless this button is a popup. In that case, it uses MenuButton - // behavior. MenuButton has the notion of a child popup being shown where the - // button will stay in the pushed state until the "menu" (a popup in this - // case) is dismissed. - virtual bool Activate(); - virtual bool OnMousePressed(const views::MouseEvent& e); - virtual void OnMouseReleased(const views::MouseEvent& e, bool canceled); - virtual bool OnKeyReleased(const views::KeyEvent& e); - virtual void OnMouseExited(const views::MouseEvent& event); - - // Does this button's action have a popup? - virtual bool IsPopup(); - - // Notifications when the popup is hidden or shown by the container. - virtual void PopupDidShow(); - virtual void PopupDidHide(); - - private: - // Called to update the display to match the browser action's state. - void OnStateUpdated(); - - // The browser action this view represents. The ExtensionAction is not owned - // by this class. - ExtensionAction* browser_action_; - - // The state of our browser action. Not owned by this class. - ExtensionActionState* browser_action_state_; - - // The icons representing different states for the browser action. - std::vector<SkBitmap> browser_action_icons_; - - // The object that is waiting for the image loading to complete - // asynchronously. This object can potentially outlive the BrowserActionView, - // and takes care of deleting itself. - ImageLoadingTracker* tracker_; - - // The browser action shelf. - BrowserActionsContainer* panel_; - - NotificationRegistrar registrar_; - - DISALLOW_COPY_AND_ASSIGN(BrowserActionButton); -}; - BrowserActionButton::BrowserActionButton( ExtensionAction* browser_action, Extension* extension, BrowserActionsContainer* panel) @@ -266,25 +189,6 @@ void BrowserActionButton::PopupDidHide() { //////////////////////////////////////////////////////////////////////////////// // BrowserActionView -// A single section in the browser action container. This contains the actual -// BrowserActionButton, as well as the logic to paint the badge. - -class BrowserActionView : public views::View { - public: - BrowserActionView(ExtensionAction* browser_action, Extension* extension, - BrowserActionsContainer* panel); - - BrowserActionButton* button() { return button_; } - - private: - virtual void Layout(); - - // Override PaintChildren so that we can paint the badge on top of children. - virtual void PaintChildren(gfx::Canvas* canvas); - - // The button this view contains. - BrowserActionButton* button_; -}; BrowserActionView::BrowserActionView(ExtensionAction* browser_action, Extension* extension, diff --git a/chrome/browser/views/browser_actions_container.h b/chrome/browser/views/browser_actions_container.h index c849d44..e365bcd 100644 --- a/chrome/browser/views/browser_actions_container.h +++ b/chrome/browser/views/browser_actions_container.h @@ -8,19 +8,125 @@ #include <vector> #include "base/task.h" +#include "chrome/browser/extensions/image_loading_tracker.h" #include "chrome/browser/views/browser_bubble.h" #include "chrome/common/notification_observer.h" #include "chrome/common/notification_registrar.h" +#include "views/controls/button/menu_button.h" #include "views/view.h" -class BrowserActionButton; -class BrowserActionView; +class BrowserActionsContainer; +class Extension; class ExtensionAction; +class ExtensionActionState; class ExtensionPopup; class Profile; class ToolbarView; //////////////////////////////////////////////////////////////////////////////// +// BrowserActionButton + +// The BrowserActionButton is a specialization of the MenuButton class. +// It acts on a ExtensionAction, in this case a BrowserAction and handles +// loading the image for the button asynchronously on the file thread to +class BrowserActionButton : public views::MenuButton, + public views::ButtonListener, + public ImageLoadingTracker::Observer, + public NotificationObserver { + public: + BrowserActionButton(ExtensionAction* browser_action, + Extension* extension, + BrowserActionsContainer* panel); + ~BrowserActionButton(); + + const ExtensionAction& browser_action() const { return *browser_action_; } + ExtensionActionState* browser_action_state() { return browser_action_state_; } + + // Overriden from views::View. Return a 0-inset so the icon can draw all the + // way to the edge of the view if it wants. + virtual gfx::Insets GetInsets() const; + + // Overridden from views::ButtonListener: + virtual void ButtonPressed(views::Button* sender, const views::Event& event); + + // Overridden from ImageLoadingTracker. + virtual void OnImageLoaded(SkBitmap* image, size_t index); + + // Overridden from NotificationObserver: + virtual void Observe(NotificationType type, + const NotificationSource& source, + const NotificationDetails& details); + + // MenuButton behavior overrides. These methods all default to TextButton + // behavior unless this button is a popup. In that case, it uses MenuButton + // behavior. MenuButton has the notion of a child popup being shown where the + // button will stay in the pushed state until the "menu" (a popup in this + // case) is dismissed. + virtual bool Activate(); + virtual bool OnMousePressed(const views::MouseEvent& e); + virtual void OnMouseReleased(const views::MouseEvent& e, bool canceled); + virtual bool OnKeyReleased(const views::KeyEvent& e); + virtual void OnMouseExited(const views::MouseEvent& event); + + // Does this button's action have a popup? + virtual bool IsPopup(); + + // Notifications when the popup is hidden or shown by the container. + virtual void PopupDidShow(); + virtual void PopupDidHide(); + + private: + // Called to update the display to match the browser action's state. + void OnStateUpdated(); + + // The browser action this view represents. The ExtensionAction is not owned + // by this class. + ExtensionAction* browser_action_; + + // The state of our browser action. Not owned by this class. + ExtensionActionState* browser_action_state_; + + // The icons representing different states for the browser action. + std::vector<SkBitmap> browser_action_icons_; + + // The object that is waiting for the image loading to complete + // asynchronously. This object can potentially outlive the BrowserActionView, + // and takes care of deleting itself. + ImageLoadingTracker* tracker_; + + // The browser action shelf. + BrowserActionsContainer* panel_; + + NotificationRegistrar registrar_; + + DISALLOW_COPY_AND_ASSIGN(BrowserActionButton); +}; + + +//////////////////////////////////////////////////////////////////////////////// +// BrowserActionView +// A single section in the browser action container. This contains the actual +// BrowserActionButton, as well as the logic to paint the badge. + +class BrowserActionView : public views::View { + public: + BrowserActionView(ExtensionAction* browser_action, Extension* extension, + BrowserActionsContainer* panel); + + BrowserActionButton* button() { return button_; } + + private: + virtual void Layout(); + + // Override PaintChildren so that we can paint the badge on top of children. + virtual void PaintChildren(gfx::Canvas* canvas); + + // The button this view contains. + BrowserActionButton* button_; +}; + + +//////////////////////////////////////////////////////////////////////////////// // // The BrowserActionsContainer is a container view, responsible for drawing the // icons that represent browser actions (extensions that add icons to the @@ -34,8 +140,14 @@ class BrowserActionsContainer : public views::View, BrowserActionsContainer(Profile* profile, ToolbarView* toolbar); virtual ~BrowserActionsContainer(); + // Get the number of browser actions being displayed. int num_browser_actions() { return browser_action_views_.size(); } + // Get a particular browser action view. + BrowserActionView* GetBrowserActionViewAt(int index) { + return browser_action_views_[index]; + } + // Update the views to reflect the state of the browser action icons. void RefreshBrowserActionViews(); |