summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--apps/shell_window.cc33
-rw-r--r--apps/shell_window.h19
2 files changed, 32 insertions, 20 deletions
diff --git a/apps/shell_window.cc b/apps/shell_window.cc
index 428ca5c..d0dd9cc 100644
--- a/apps/shell_window.cc
+++ b/apps/shell_window.cc
@@ -11,7 +11,6 @@
#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/extensions/extension_process_manager.h"
#include "chrome/browser/extensions/extension_system.h"
-#include "chrome/browser/extensions/image_loader.h"
#include "chrome/browser/extensions/shell_window_registry.h"
#include "chrome/browser/extensions/suggest_permission_util.h"
#include "chrome/browser/lifetime/application_lifetime.h"
@@ -352,6 +351,9 @@ void ShellWindow::SetAppIconUrl(const GURL& url) {
// Avoid using any previous app icons were are being downloaded.
image_loader_ptr_factory_.InvalidateWeakPtrs();
+ // Reset |app_icon_image_| to abort pending image load (if any).
+ app_icon_image_.reset();
+
app_icon_url_ = url;
web_contents()->DownloadImage(
url,
@@ -401,10 +403,6 @@ void ShellWindow::Restore() {
//------------------------------------------------------------------------------
// Private methods
-void ShellWindow::OnImageLoaded(const gfx::Image& image) {
- UpdateAppIcon(image);
-}
-
void ShellWindow::DidDownloadFavicon(int id,
int http_status_code,
const GURL& image_url,
@@ -425,20 +423,27 @@ void ShellWindow::DidDownloadFavicon(int id,
UpdateAppIcon(gfx::Image::CreateFrom1xBitmap(largest));
}
+void ShellWindow::OnExtensionIconImageChanged(extensions::IconImage* image) {
+ DCHECK_EQ(app_icon_image_.get(), image);
+
+ UpdateAppIcon(gfx::Image(app_icon_image_->image_skia()));
+}
+
void ShellWindow::UpdateExtensionAppIcon() {
// Avoid using any previous app icons were are being downloaded.
image_loader_ptr_factory_.InvalidateWeakPtrs();
- // Enqueue OnImageLoaded callback.
- extensions::ImageLoader* loader = extensions::ImageLoader::Get(profile());
- loader->LoadImageAsync(
+ app_icon_image_.reset(new extensions::IconImage(
+ profile(),
extension(),
- extensions::IconsInfo::GetIconResource(extension(),
- delegate_->PreferredIconSize(),
- ExtensionIconSet::MATCH_BIGGER),
- gfx::Size(delegate_->PreferredIconSize(), delegate_->PreferredIconSize()),
- base::Bind(&ShellWindow::OnImageLoaded,
- image_loader_ptr_factory_.GetWeakPtr()));
+ extensions::IconsInfo::GetIcons(extension()),
+ delegate_->PreferredIconSize(),
+ extensions::IconsInfo::GetDefaultAppIcon(),
+ this));
+
+ // Triggers actual image loading with 1x resources. The 2x resource will
+ // be handled by IconImage class when requested.
+ app_icon_image_->image_skia().GetRepresentation(ui::SCALE_FACTOR_100P);
}
void ShellWindow::CloseContents(WebContents* contents) {
diff --git a/apps/shell_window.h b/apps/shell_window.h
index 5e449df..a10cb5b 100644
--- a/apps/shell_window.h
+++ b/apps/shell_window.h
@@ -2,11 +2,12 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef CHROME_BROWSER_UI_EXTENSIONS_SHELL_WINDOW_H_
-#define CHROME_BROWSER_UI_EXTENSIONS_SHELL_WINDOW_H_
+#ifndef APPS_SHELL_WINDOW_H_
+#define APPS_SHELL_WINDOW_H_
#include "base/memory/scoped_ptr.h"
#include "base/memory/weak_ptr.h"
+#include "chrome/browser/extensions/extension_icon_image.h"
#include "chrome/browser/extensions/extension_keybinding_registry.h"
#include "chrome/browser/sessions/session_id.h"
#include "components/web_modal/web_contents_modal_dialog_manager_delegate.h"
@@ -73,7 +74,8 @@ class ShellWindowContents {
class ShellWindow : public content::NotificationObserver,
public content::WebContentsDelegate,
public web_modal::WebContentsModalDialogManagerDelegate,
- public extensions::ExtensionKeybindingRegistry::Delegate {
+ public extensions::ExtensionKeybindingRegistry::Delegate,
+ public extensions::IconImage::Observer {
public:
enum WindowType {
WINDOW_TYPE_DEFAULT = 1 << 0, // Default shell window.
@@ -316,8 +318,6 @@ class ShellWindow : public content::NotificationObserver,
// Load the app's image, firing a load state change when loaded.
void UpdateExtensionAppIcon();
- void OnImageLoaded(const gfx::Image& image);
-
// extensions::ExtensionKeybindingRegistry::Delegate implementation.
virtual extensions::ActiveTabPermissionGranter*
GetActiveTabPermissionGranter() OVERRIDE;
@@ -333,6 +333,10 @@ class ShellWindow : public content::NotificationObserver,
int requested_size,
const std::vector<SkBitmap>& bitmaps);
+ // extensions::IconImage::Observer implementation.
+ virtual void OnExtensionIconImageChanged(
+ extensions::IconImage* image) OVERRIDE;
+
Profile* profile_; // weak pointer - owned by ProfileManager.
// weak pointer - owned by ExtensionService.
const extensions::Extension* extension_;
@@ -353,6 +357,9 @@ class ShellWindow : public content::NotificationObserver,
// be fetched and set using this URL.
GURL app_icon_url_;
+ // An object to load the app's icon as an extension resource.
+ scoped_ptr<extensions::IconImage> app_icon_image_;
+
scoped_ptr<NativeAppWindow> native_app_window_;
scoped_ptr<ShellWindowContents> shell_window_contents_;
scoped_ptr<Delegate> delegate_;
@@ -369,4 +376,4 @@ class ShellWindow : public content::NotificationObserver,
} // namespace apps
-#endif // CHROME_BROWSER_UI_EXTENSIONS_SHELL_WINDOW_H_
+#endif // APPS_SHELL_WINDOW_H_