Index: chrome/browser/ui/webui/extensions/extension_icon_source.cc |
=================================================================== |
--- chrome/browser/ui/webui/extensions/extension_icon_source.cc (revision 176942) |
+++ chrome/browser/ui/webui/extensions/extension_icon_source.cc (working copy) |
@@ -19,7 +19,6 @@ |
#include "chrome/browser/extensions/image_loader.h" |
#include "chrome/browser/favicon/favicon_service_factory.h" |
#include "chrome/browser/profiles/profile.h" |
-#include "chrome/browser/ui/webui/chrome_url_data_manager.h" |
#include "chrome/common/extensions/extension.h" |
#include "chrome/common/extensions/extension_constants.h" |
#include "chrome/common/extensions/extension_resource.h" |
@@ -63,7 +62,7 @@ |
} |
struct ExtensionIconSource::ExtensionIconRequest { |
- int request_id; |
+ content::URLDataSource::GotDataCallback callback; |
const extensions::Extension* extension; |
bool grayscale; |
int size; |
@@ -113,24 +112,26 @@ |
return "image/png"; |
} |
-void ExtensionIconSource::StartDataRequest(const std::string& path, |
- bool is_incognito, |
- int request_id) { |
+void ExtensionIconSource::StartDataRequest( |
+ const std::string& path, |
+ bool is_incognito, |
+ const content::URLDataSource::GotDataCallback& callback) { |
// This is where everything gets started. First, parse the request and make |
// the request data available for later. |
- if (!ParseData(path, request_id)) { |
- SendDefaultResponse(request_id); |
+ static int next_id = 0; |
+ if (!ParseData(path, ++next_id, callback)) { |
+ SendDefaultResponse(next_id); |
return; |
} |
- ExtensionIconRequest* request = GetData(request_id); |
+ ExtensionIconRequest* request = GetData(next_id); |
ExtensionResource icon = |
request->extension->GetIconResource(request->size, request->match); |
if (icon.relative_path().empty()) { |
- LoadIconFailed(request_id); |
+ LoadIconFailed(next_id); |
} else { |
- LoadExtensionImage(icon, request_id); |
+ LoadExtensionImage(icon, next_id); |
} |
} |
@@ -158,13 +159,14 @@ |
void ExtensionIconSource::FinalizeImage(const SkBitmap* image, |
int request_id) { |
SkBitmap bitmap; |
- if (GetData(request_id)->grayscale) |
+ ExtensionIconRequest* request = GetData(request_id); |
+ if (request->grayscale) |
bitmap = DesaturateImage(image); |
else |
bitmap = *image; |
+ request->callback.Run(BitmapToMemory(&bitmap)); |
ClearData(request_id); |
- url_data_source()->SendResponse(request_id, BitmapToMemory(&bitmap)); |
} |
void ExtensionIconSource::LoadDefaultImage(int request_id) { |
@@ -231,8 +233,8 @@ |
if (!request->grayscale) { |
// If we don't need a grayscale image, then we can bypass FinalizeImage |
// to avoid unnecessary conversions. |
+ request->callback.Run(bitmap_result.bitmap_data); |
ClearData(request_id); |
- url_data_source()->SendResponse(request_id, bitmap_result.bitmap_data); |
} else { |
FinalizeImage(ToBitmap(bitmap_result.bitmap_data->front(), |
bitmap_result.bitmap_data->size()), request_id); |
@@ -258,8 +260,10 @@ |
LoadDefaultImage(request_id); |
} |
-bool ExtensionIconSource::ParseData(const std::string& path, |
- int request_id) { |
+bool ExtensionIconSource::ParseData( |
+ const std::string& path, |
+ int request_id, |
+ const content::URLDataSource::GotDataCallback& callback) { |
// Extract the parameters from the path by lower casing and splitting. |
std::string path_lower = StringToLowerASCII(path); |
std::vector<std::string> path_parts; |
@@ -297,7 +301,7 @@ |
bool grayscale = path_lower.find("grayscale=true") != std::string::npos; |
- SetData(request_id, extension, grayscale, size, match_type); |
+ SetData(request_id, callback, extension, grayscale, size, match_type); |
return true; |
} |
@@ -305,18 +309,20 @@ |
void ExtensionIconSource::SendDefaultResponse(int request_id) { |
// We send back the default application icon (not resized or desaturated) |
// as the default response, like when there is no data. |
+ ExtensionIconRequest* request = GetData(request_id); |
+ request->callback.Run(BitmapToMemory(GetDefaultAppImage())); |
ClearData(request_id); |
- url_data_source()->SendResponse( |
- request_id, BitmapToMemory(GetDefaultAppImage())); |
} |
-void ExtensionIconSource::SetData(int request_id, |
- const extensions::Extension* extension, |
- bool grayscale, |
- int size, |
- ExtensionIconSet::MatchType match) { |
+void ExtensionIconSource::SetData( |
+ int request_id, |
+ const content::URLDataSource::GotDataCallback& callback, |
+ const extensions::Extension* extension, |
+ bool grayscale, |
+ int size, |
+ ExtensionIconSet::MatchType match) { |
ExtensionIconRequest* request = new ExtensionIconRequest(); |
- request->request_id = request_id; |
+ request->callback = callback; |
request->extension = extension; |
request->grayscale = grayscale; |
request->size = size; |