summaryrefslogtreecommitdiffstats
path: root/chrome/browser/extensions/api/developer_private/developer_private_api.cc
diff options
context:
space:
mode:
authordvh@chromium.org <dvh@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-10-08 06:50:55 +0000
committerdvh@chromium.org <dvh@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-10-08 06:50:55 +0000
commitdcc41abf828333397c7100044ff285afe0bafe03 (patch)
tree5ad8bd81b7231ca29759bb7d2c94463f737a8d4d /chrome/browser/extensions/api/developer_private/developer_private_api.cc
parent5488874f4eaaeaf5fd205b07695900acaf39c983 (diff)
downloadchromium_src-dcc41abf828333397c7100044ff285afe0bafe03.zip
chromium_src-dcc41abf828333397c7100044ff285afe0bafe03.tar.gz
chromium_src-dcc41abf828333397c7100044ff285afe0bafe03.tar.bz2
Refactored loading of applications / extensions icons.
Added ImageLoader::LoadExtensionIconAsync() and ImageLoader::LoadExtensionIconDataURLAsync(). Moved all apps / extension loading code to ImageLoader. BUG=297298, 297301, 304180 Review URL: https://codereview.chromium.org/26161002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@227477 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/extensions/api/developer_private/developer_private_api.cc')
-rw-r--r--chrome/browser/extensions/api/developer_private/developer_private_api.cc109
1 files changed, 34 insertions, 75 deletions
diff --git a/chrome/browser/extensions/api/developer_private/developer_private_api.cc b/chrome/browser/extensions/api/developer_private/developer_private_api.cc
index 3f594d6..40b1612 100644
--- a/chrome/browser/extensions/api/developer_private/developer_private_api.cc
+++ b/chrome/browser/extensions/api/developer_private/developer_private_api.cc
@@ -27,6 +27,7 @@
#include "chrome/browser/extensions/extension_error_reporter.h"
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/extensions/extension_system.h"
+#include "chrome/browser/extensions/image_loader.h"
#include "chrome/browser/extensions/management_policy.h"
#include "chrome/browser/extensions/unpacked_installer.h"
#include "chrome/browser/extensions/updater/extension_updater.h"
@@ -85,45 +86,6 @@ ExtensionUpdater* GetExtensionUpdater(Profile* profile) {
return profile->GetExtensionService()->updater();
}
-GURL GetImageURLFromData(std::string contents) {
- std::string contents_base64;
- if (!base::Base64Encode(contents, &contents_base64))
- return GURL();
-
- // TODO(dvh): make use of chrome::kDataScheme. Filed as crbug/297301.
- const char kDataURLPrefix[] = "data:image;base64,";
- return GURL(kDataURLPrefix + contents_base64);
-}
-
-GURL GetDefaultImageURL(developer_private::ItemType type) {
- int icon_resource_id;
- switch (type) {
- case developer::ITEM_TYPE_LEGACY_PACKAGED_APP:
- case developer::ITEM_TYPE_HOSTED_APP:
- case developer::ITEM_TYPE_PACKAGED_APP:
- icon_resource_id = IDR_APP_DEFAULT_ICON;
- break;
- default:
- icon_resource_id = IDR_EXTENSION_DEFAULT_ICON;
- break;
- }
-
- return GetImageURLFromData(
- ResourceBundle::GetSharedInstance().GetRawDataResourceForScale(
- icon_resource_id, ui::SCALE_FACTOR_100P).as_string());
-}
-
-// TODO(dvh): This code should be refactored and moved to
-// extensions::ImageLoader. Also a resize should be performed to avoid
-// potential huge URLs: crbug/297298.
-GURL ToDataURL(const base::FilePath& path, developer_private::ItemType type) {
- std::string contents;
- if (path.empty() || !base::ReadFileToString(path, &contents))
- return GetDefaultImageURL(type);
-
- return GetImageURLFromData(contents);
-}
-
std::vector<base::FilePath> ListFolder(const base::FilePath path) {
base::FileEnumerator files(path, false,
base::FileEnumerator::DIRECTORIES | base::FileEnumerator::FILES);
@@ -374,27 +336,6 @@ scoped_ptr<developer::ItemInfo>
return info.Pass();
}
-void DeveloperPrivateGetItemsInfoFunction::GetIconsOnFileThread(
- ItemInfoList item_list,
- const std::map<std::string, ExtensionResource> idToIcon) {
- for (ItemInfoList::iterator iter = item_list.begin();
- iter != item_list.end(); ++iter) {
- developer_private::ItemInfo* info = iter->get();
- std::map<std::string, ExtensionResource>::const_iterator resource_ptr
- = idToIcon.find(info->id);
- if (resource_ptr != idToIcon.end()) {
- info->icon_url =
- ToDataURL(resource_ptr->second.GetFilePath(), info->type).spec();
- }
- }
-
- results_ = developer::GetItemsInfo::Results::Create(item_list);
- content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE,
- base::Bind(&DeveloperPrivateGetItemsInfoFunction::SendResponse,
- this,
- true));
-}
-
void DeveloperPrivateGetItemsInfoFunction::
GetInspectablePagesForExtensionProcess(
const Extension* extension,
@@ -554,37 +495,55 @@ bool DeveloperPrivateGetItemsInfoFunction::RunImpl() {
items.InsertAll(*service->terminated_extensions());
}
- std::map<std::string, ExtensionResource> id_to_icon;
- ItemInfoList item_list;
-
for (ExtensionSet::const_iterator iter = items.begin();
iter != items.end(); ++iter) {
const Extension& item = *iter->get();
- ExtensionResource item_resource =
- IconsInfo::GetIconResource(&item,
- extension_misc::EXTENSION_ICON_MEDIUM,
- ExtensionIconSet::MATCH_BIGGER);
- id_to_icon[item.id()] = item_resource;
-
// Don't show component extensions and invisible apps.
if (item.ShouldNotBeVisible())
continue;
- item_list.push_back(make_linked_ptr<developer::ItemInfo>(
+ item_list_.push_back(make_linked_ptr<developer::ItemInfo>(
CreateItemInfo(
item, service->IsExtensionEnabled(item.id())).release()));
}
- content::BrowserThread::PostTask(content::BrowserThread::FILE, FROM_HERE,
- base::Bind(&DeveloperPrivateGetItemsInfoFunction::GetIconsOnFileThread,
- this,
- item_list,
- id_to_icon));
+ // Iterate over |item_list_| to request all the icons.
+ RequestNextIcon();
return true;
}
+void DeveloperPrivateGetItemsInfoFunction::RequestNextIcon() {
+ developer::ItemInfo* info = item_list_[icon_to_load_].get();
+ ExtensionService* service = profile()->GetExtensionService();
+ ImageLoader::Get(profile())->LoadExtensionIconDataURLAsync(
+ service->GetExtensionById(info->id, true),
+ extension_misc::EXTENSION_ICON_MEDIUM,
+ ExtensionIconSet::MATCH_BIGGER,
+ false,
+ base::Bind(&DeveloperPrivateGetItemsInfoFunction::LoadIconFinished,
+ this));
+}
+
+void DeveloperPrivateGetItemsInfoFunction::LoadIconFinished(const GURL& url) {
+ // Store the result.
+ developer::ItemInfo* info = item_list_[icon_to_load_].get();
+ info->icon_url = url.spec();
+ ++icon_to_load_;
+ if (icon_to_load_ < static_cast<int>(item_list_.size())) {
+ RequestNextIcon();
+ } else {
+ // All icons have been loaded: send the result.
+ results_ = developer::GetItemsInfo::Results::Create(item_list_);
+ SendResponse(true);
+ }
+}
+
+DeveloperPrivateGetItemsInfoFunction::DeveloperPrivateGetItemsInfoFunction()
+ : icon_to_load_(0) {
+}
+
DeveloperPrivateGetItemsInfoFunction::~DeveloperPrivateGetItemsInfoFunction() {}
bool DeveloperPrivateAllowFileAccessFunction::RunImpl() {