diff options
author | jianli@chromium.org <jianli@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-09-18 05:53:37 +0000 |
---|---|---|
committer | jianli@chromium.org <jianli@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-09-18 05:53:37 +0000 |
commit | 910b34bb21c120b78aa84648d09330a415d538dc (patch) | |
tree | 3ff6840bc4007d58935a3e6e0221938f5603ef6c | |
parent | 214832f40d2351a88579d65de1ac6830dc0ed356 (diff) | |
download | chromium_src-910b34bb21c120b78aa84648d09330a415d538dc.zip chromium_src-910b34bb21c120b78aa84648d09330a415d538dc.tar.gz chromium_src-910b34bb21c120b78aa84648d09330a415d538dc.tar.bz2 |
Fix bug 144287: Panels [WIN]: Panels should use the app manifest icon instead of the favicon in the taskbar
Also fix the same issue on GTK.
BUG=144287
TEST=Manual test by creating panels and varifying its icon on taskbar
Review URL: https://chromiumcodereview.appspot.com/10915320
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@157308 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/ui/panels/panel.cc | 39 | ||||
-rw-r--r-- | chrome/browser/ui/panels/panel.h | 27 | ||||
-rw-r--r-- | chrome/browser/ui/panels/panel_gtk.cc | 4 | ||||
-rw-r--r-- | chrome/browser/ui/panels/panel_view.cc | 8 | ||||
-rw-r--r-- | chrome/browser/ui/panels/panel_view.h | 1 |
5 files changed, 70 insertions, 9 deletions
diff --git a/chrome/browser/ui/panels/panel.cc b/chrome/browser/ui/panels/panel.cc index 433b2a7..875abad 100644 --- a/chrome/browser/ui/panels/panel.cc +++ b/chrome/browser/ui/panels/panel.cc @@ -38,10 +38,6 @@ using content::RenderViewHost; using content::UserMetricsAction; -namespace extensions { -class Extension; -} - namespace panel_internal { class PanelExtensionWindowController : public extensions::WindowController { @@ -192,6 +188,8 @@ void Panel::Initialize(Profile* profile, const GURL& url, // Prevent the browser process from shutting down while this window is open. browser::StartKeepAlive(); + + UpdateAppIcon(); } void Panel::InitCommandState() { @@ -785,3 +783,36 @@ void Panel::LoadingStateChanged(bool is_loading) { void Panel::WebContentsFocused(content::WebContents* contents) { native_panel_->PanelWebContentsFocused(contents); } + +const extensions::Extension* Panel::GetExtension() const { + ExtensionService* extension_service = + extensions::ExtensionSystem::Get(profile())->extension_service(); + if (!extension_service || !extension_service->is_ready()) + return NULL; + return extension_service->GetExtensionById(extension_id(), false); +} + +void Panel::UpdateAppIcon() { + const extensions::Extension* extension = GetExtension(); + if (!extension) + return; + + app_icon_loader_.reset(new ImageLoadingTracker(this)); + app_icon_loader_->LoadImage( + extension, + extension->GetIconResource(extension_misc::EXTENSION_ICON_SMALLISH, + ExtensionIconSet::MATCH_BIGGER), + gfx::Size(extension_misc::EXTENSION_ICON_SMALLISH, + extension_misc::EXTENSION_ICON_SMALLISH), + ImageLoadingTracker::CACHE); +} + +void Panel::OnImageLoaded(const gfx::Image& image, + const std::string& extension_id, + int index) { + if (!image.IsEmpty()) { + app_icon_ = image; + native_panel_->UpdatePanelTitleBar(); + } + app_icon_loader_.reset(); +} diff --git a/chrome/browser/ui/panels/panel.h b/chrome/browser/ui/panels/panel.h index 93baaf97..b913e1d 100644 --- a/chrome/browser/ui/panels/panel.h +++ b/chrome/browser/ui/panels/panel.h @@ -11,11 +11,13 @@ #include "base/memory/scoped_ptr.h" #include "base/string16.h" #include "chrome/browser/command_updater.h" +#include "chrome/browser/extensions/image_loading_tracker.h" #include "chrome/browser/sessions/session_id.h" #include "chrome/browser/ui/base_window.h" #include "chrome/browser/ui/panels/panel_constants.h" #include "content/public/browser/notification_observer.h" #include "content/public/browser/notification_registrar.h" +#include "ui/gfx/image/image.h" #include "ui/gfx/rect.h" class GURL; @@ -31,13 +33,10 @@ struct NativeWebKeyboardEvent; } namespace extensions { +class Extension; class WindowController; } -namespace gfx { -class Image; -} - // A platform independent implementation of BaseWindow for Panels. // This class gets the first crack at all the BaseWindow calls for Panels and // does one or more of the following: @@ -49,7 +48,8 @@ class Image; // other Panels. For example deleting a panel would rearrange other panels. class Panel : public BaseWindow, public CommandUpdater::CommandUpdaterDelegate, - public content::NotificationObserver { + public content::NotificationObserver, + public ImageLoadingTracker::Observer { public: enum ExpansionState { // The panel is fully expanded with both title-bar and the client-area. @@ -77,6 +77,7 @@ class Panel : public BaseWindow, PanelManager* manager() const; const std::string& app_name() const { return app_name_; } + const gfx::Image& app_icon() const { return app_icon_; } const SessionID& session_id() const { return session_id_; } extensions::WindowController* extension_window_controller() const { return extension_window_controller_.get(); @@ -309,12 +310,22 @@ class Panel : public BaseWindow, CUSTOM_MAX_SIZE }; + // ImageLoadingTracker::Observer implementation. + virtual void OnImageLoaded(const gfx::Image& image, + const std::string& extension_id, + int index) OVERRIDE; + // Initialize state for all supported commands. void InitCommandState(); // Configures the renderer for auto resize (if auto resize is enabled). void ConfigureAutoResize(content::WebContents* web_contents); + const extensions::Extension* GetExtension() const; + + // Load the app's image, firing a load state change when loaded. + void UpdateAppIcon(); + // Prepares a title string for display (removes embedded newlines, etc). static void FormatTitleForDisplay(string16* title); @@ -369,6 +380,12 @@ class Panel : public BaseWindow, scoped_ptr<extensions::WindowController> extension_window_controller_; scoped_ptr<PanelHost> panel_host_; + // Used for loading app_icon_. + scoped_ptr<ImageLoadingTracker> app_icon_loader_; + + // Icon showed in the task bar. + gfx::Image app_icon_; + DISALLOW_COPY_AND_ASSIGN(Panel); }; diff --git a/chrome/browser/ui/panels/panel_gtk.cc b/chrome/browser/ui/panels/panel_gtk.cc index 9a969a7..13aa0bfe 100644 --- a/chrome/browser/ui/panels/panel_gtk.cc +++ b/chrome/browser/ui/panels/panel_gtk.cc @@ -833,6 +833,10 @@ void PanelGtk::UpdatePanelTitleBar() { string16 title = panel_->GetWindowTitle(); gtk_window_set_title(window_, UTF16ToUTF8(title).c_str()); titlebar_->UpdateTitleAndIcon(); + + gfx::Image app_icon = panel_->app_icon(); + if (!app_icon.IsEmpty()) + gtk_util::SetWindowIcon(window_, panel_->profile(), app_icon.ToGdkPixbuf()); } void PanelGtk::UpdatePanelLoadingAnimations(bool should_animate) { diff --git a/chrome/browser/ui/panels/panel_view.cc b/chrome/browser/ui/panels/panel_view.cc index d4f348d..1ed4dec 100644 --- a/chrome/browser/ui/panels/panel_view.cc +++ b/chrome/browser/ui/panels/panel_view.cc @@ -519,6 +519,14 @@ string16 PanelView::GetWindowTitle() const { return panel_->GetWindowTitle(); } +gfx::ImageSkia PanelView::GetWindowAppIcon() { + gfx::Image app_icon = panel_->app_icon(); + if (app_icon.IsEmpty()) + return GetWindowIcon(); + else + return *app_icon.ToImageSkia(); +} + gfx::ImageSkia PanelView::GetWindowIcon() { gfx::Image icon = panel_->GetCurrentPageIcon(); return icon.IsEmpty() ? gfx::ImageSkia() : *icon.ToImageSkia(); diff --git a/chrome/browser/ui/panels/panel_view.h b/chrome/browser/ui/panels/panel_view.h index f101965..b53395c 100644 --- a/chrome/browser/ui/panels/panel_view.h +++ b/chrome/browser/ui/panels/panel_view.h @@ -112,6 +112,7 @@ class PanelView : public NativePanel, virtual views::Widget* GetWidget() OVERRIDE; virtual const views::Widget* GetWidget() const OVERRIDE; virtual string16 GetWindowTitle() const OVERRIDE; + virtual gfx::ImageSkia GetWindowAppIcon() OVERRIDE; virtual gfx::ImageSkia GetWindowIcon() OVERRIDE; virtual void DeleteDelegate() OVERRIDE; virtual void OnWindowBeginUserBoundsChange() OVERRIDE; |