Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1836)

Unified Diff: chrome/browser/extensions/extension_web_ui.cc

Issue 11027044: Add a class to replace ImageLoadingTracker with a nicer API. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix include order Created 8 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/extensions/extension_web_ui.cc
diff --git a/chrome/browser/extensions/extension_web_ui.cc b/chrome/browser/extensions/extension_web_ui.cc
index b98641a3665ea2744452843a7f9a952e6115b69c..08f05d3056625273c4e14caa1d593bfa1452d69a 100644
--- a/chrome/browser/extensions/extension_web_ui.cc
+++ b/chrome/browser/extensions/extension_web_ui.cc
@@ -13,7 +13,7 @@
#include "chrome/browser/bookmarks/bookmark_manager_extension_api.h"
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/extensions/extension_tab_util.h"
-#include "chrome/browser/extensions/image_loading_tracker.h"
+#include "chrome/browser/extensions/image_loader.h"
#include "chrome/browser/prefs/pref_service.h"
#include "chrome/browser/prefs/scoped_user_pref_update.h"
#include "chrome/browser/profiles/profile.h"
@@ -78,113 +78,49 @@ void UnregisterAndReplaceOverrideForWebContents(
content::PAGE_TRANSITION_RELOAD, std::string());
}
-// Helper class that is used to track the loading of the favicon of an
-// extension.
-class ExtensionWebUIImageLoadingTracker : public ImageLoadingTracker::Observer {
- public:
- ExtensionWebUIImageLoadingTracker(Profile* profile,
- FaviconService::GetFaviconRequest* request,
- const GURL& page_url)
- : ALLOW_THIS_IN_INITIALIZER_LIST(tracker_(this)),
- request_(request),
- extension_(NULL) {
- // Even when the extensions service is enabled by default, it's still
- // disabled in incognito mode.
- ExtensionService* service = profile->GetExtensionService();
- if (service)
- extension_ = service->extensions()->GetByID(page_url.host());
- }
-
- void Init() {
- if (extension_) {
- // Fetch resources for all supported scale factors for which there are
- // resources. Load image reps for all supported scale factors immediately
- // instead of in an as needed fashion to be consistent with how favicons
- // are requested for chrome:// and page URLs.
- const std::vector<ui::ScaleFactor>& scale_factors =
- ui::GetSupportedScaleFactors();
- std::vector<ImageLoadingTracker::ImageRepresentation> info_list;
- for (size_t i = 0; i < scale_factors.size(); ++i) {
- float scale = ui::GetScaleFactorScale(scale_factors[i]);
- int pixel_size = static_cast<int>(gfx::kFaviconSize * scale);
- ExtensionResource icon_resource =
- extension_->GetIconResource(pixel_size,
- ExtensionIconSet::MATCH_BIGGER);
-
- info_list.push_back(
- ImageLoadingTracker::ImageRepresentation(
- icon_resource,
- ImageLoadingTracker::ImageRepresentation::ALWAYS_RESIZE,
- gfx::Size(pixel_size, pixel_size),
- scale_factors[i]));
- }
-
- tracker_.LoadImages(extension_, info_list,
- ImageLoadingTracker::DONT_CACHE);
+// Forwards the result of the request. If no favicon was available then
+// |image| will be empty. Once the result has been forwarded the instance is
+// deleted.
+void ForwardFaviconResult(FaviconService::GetFaviconRequest* request,
+ const gfx::Image& image) {
+ std::vector<history::FaviconBitmapResult> favicon_bitmap_results;
+ const std::vector<gfx::ImageSkiaRep>& image_reps =
+ image.AsImageSkia().image_reps();
+ for (size_t i = 0; i < image_reps.size(); ++i) {
+ const gfx::ImageSkiaRep& image_rep = image_reps[i];
+ scoped_refptr<base::RefCountedBytes> bitmap_data(
+ new base::RefCountedBytes());
+ if (gfx::PNGCodec::EncodeBGRASkBitmap(image_rep.sk_bitmap(),
+ false,
+ &bitmap_data->data())) {
+ history::FaviconBitmapResult bitmap_result;
+ bitmap_result.bitmap_data = bitmap_data;
+ bitmap_result.pixel_size = gfx::Size(image_rep.pixel_width(),
+ image_rep.pixel_height());
+ // Leave |bitmap_result|'s icon URL as the default of GURL().
+ bitmap_result.icon_type = history::FAVICON;
+
+ favicon_bitmap_results.push_back(bitmap_result);
} else {
- ForwardResult(gfx::Image());
+ NOTREACHED() << "Could not encode extension favicon";
}
}
- virtual void OnImageLoaded(const gfx::Image& image,
- const std::string& extension_id,
- int index) OVERRIDE {
- ForwardResult(image);
- }
-
- private:
- ~ExtensionWebUIImageLoadingTracker() {}
-
- // Forwards the result of the request. If no favicon was available then
- // |image| will be empty. Once the result has been forwarded the instance is
- // deleted.
- void ForwardResult(const gfx::Image& image) {
- std::vector<history::FaviconBitmapResult> favicon_bitmap_results;
- const std::vector<gfx::ImageSkiaRep>& image_reps =
- image.AsImageSkia().image_reps();
- for (size_t i = 0; i < image_reps.size(); ++i) {
- const gfx::ImageSkiaRep& image_rep = image_reps[i];
- scoped_refptr<base::RefCountedBytes> bitmap_data(
- new base::RefCountedBytes());
- if (gfx::PNGCodec::EncodeBGRASkBitmap(image_rep.sk_bitmap(),
- false,
- &bitmap_data->data())) {
- history::FaviconBitmapResult bitmap_result;
- bitmap_result.bitmap_data = bitmap_data;
- bitmap_result.pixel_size = gfx::Size(image_rep.pixel_width(),
- image_rep.pixel_height());
- // Leave |bitmap_result|'s icon URL as the default of GURL().
- bitmap_result.icon_type = history::FAVICON;
-
- favicon_bitmap_results.push_back(bitmap_result);
- } else {
- NOTREACHED() << "Could not encode extension favicon";
- }
- }
-
- // Populate IconURLSizesMap such that all the icon URLs in
- // |favicon_bitmap_results| are present in |icon_url_sizes|.
- // Populate the favicon sizes with the relevant pixel sizes in the
- // extension's icon set.
- history::IconURLSizesMap icon_url_sizes;
- for (size_t i = 0; i < favicon_bitmap_results.size(); ++i) {
- const history::FaviconBitmapResult& bitmap_result =
- favicon_bitmap_results[i];
- const GURL& icon_url = bitmap_result.icon_url;
- icon_url_sizes[icon_url].push_back(bitmap_result.pixel_size);
- }
-
- request_->ForwardResultAsync(request_->handle(), favicon_bitmap_results,
- icon_url_sizes);
- delete this;
+ // Populate IconURLSizesMap such that all the icon URLs in
+ // |favicon_bitmap_results| are present in |icon_url_sizes|.
+ // Populate the favicon sizes with the relevant pixel sizes in the
+ // extension's icon set.
+ history::IconURLSizesMap icon_url_sizes;
+ for (size_t i = 0; i < favicon_bitmap_results.size(); ++i) {
+ const history::FaviconBitmapResult& bitmap_result =
+ favicon_bitmap_results[i];
+ const GURL& icon_url = bitmap_result.icon_url;
+ icon_url_sizes[icon_url].push_back(bitmap_result.pixel_size);
}
- ImageLoadingTracker tracker_;
- scoped_refptr<FaviconService::GetFaviconRequest> request_;
- const Extension* extension_;
-
- DISALLOW_COPY_AND_ASSIGN(ExtensionWebUIImageLoadingTracker);
-};
+ request->ForwardResultAsync(request->handle(), favicon_bitmap_results,
+ icon_url_sizes);
+}
} // namespace
@@ -464,8 +400,43 @@ void ExtensionWebUI::UnregisterChromeURLOverrides(
// static
void ExtensionWebUI::GetFaviconForURL(Profile* profile,
FaviconService::GetFaviconRequest* request, const GURL& page_url) {
- // tracker deletes itself when done.
- ExtensionWebUIImageLoadingTracker* tracker =
- new ExtensionWebUIImageLoadingTracker(profile, request, page_url);
- tracker->Init();
+ // Even when the extensions service is enabled by default, it's still
+ // disabled in incognito mode.
+ ExtensionService* service = profile->GetExtensionService();
+ if (!service) {
+ ForwardFaviconResult(request, gfx::Image());
+ return;
+ }
+ const Extension* extension = service->extensions()->GetByID(page_url.host());
+ if (!extension) {
+ ForwardFaviconResult(request, gfx::Image());
+ return;
+ }
+
+ // Fetch resources for all supported scale factors for which there are
+ // resources. Load image reps for all supported scale factors immediately
+ // instead of in an as needed fashion to be consistent with how favicons
+ // are requested for chrome:// and page URLs.
+ const std::vector<ui::ScaleFactor>& scale_factors =
+ ui::GetSupportedScaleFactors();
+ std::vector<extensions::ImageLoader::ImageRepresentation> info_list;
+ for (size_t i = 0; i < scale_factors.size(); ++i) {
+ float scale = ui::GetScaleFactorScale(scale_factors[i]);
+ int pixel_size = static_cast<int>(gfx::kFaviconSize * scale);
+ ExtensionResource icon_resource =
+ extension->GetIconResource(pixel_size,
+ ExtensionIconSet::MATCH_BIGGER);
+
+ info_list.push_back(
+ extensions::ImageLoader::ImageRepresentation(
+ icon_resource,
+ extensions::ImageLoader::ImageRepresentation::ALWAYS_RESIZE,
+ gfx::Size(pixel_size, pixel_size),
+ scale_factors[i]));
+ }
+
+ extensions::ImageLoader::Get(profile)->LoadImagesAsync(
+ extension, info_list,
+ base::Bind(&ForwardFaviconResult,
+ scoped_refptr<FaviconService::GetFaviconRequest>(request)));
}

Powered by Google App Engine
This is Rietveld 408576698