summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjianli@chromium.org <jianli@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-09-18 05:53:37 +0000
committerjianli@chromium.org <jianli@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-09-18 05:53:37 +0000
commit910b34bb21c120b78aa84648d09330a415d538dc (patch)
tree3ff6840bc4007d58935a3e6e0221938f5603ef6c
parent214832f40d2351a88579d65de1ac6830dc0ed356 (diff)
downloadchromium_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.cc39
-rw-r--r--chrome/browser/ui/panels/panel.h27
-rw-r--r--chrome/browser/ui/panels/panel_gtk.cc4
-rw-r--r--chrome/browser/ui/panels/panel_view.cc8
-rw-r--r--chrome/browser/ui/panels/panel_view.h1
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;