summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authormek@chromium.org <mek@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-10-03 19:42:57 +0000
committermek@chromium.org <mek@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-10-03 19:42:57 +0000
commitb9aae8e08795a381b2915de3a554b4d14472dbe5 (patch)
treeaededa494063621084c892a9505c55d26865cfff /chrome
parentb8f2cbb58238fc3f596230f30141eeebcaa6499f (diff)
downloadchromium_src-b9aae8e08795a381b2915de3a554b4d14472dbe5.zip
chromium_src-b9aae8e08795a381b2915de3a554b4d14472dbe5.tar.gz
chromium_src-b9aae8e08795a381b2915de3a554b4d14472dbe5.tar.bz2
Give Chrome Web Store app an icon in its manifest file.
This fixes no icon being shown in the "The app is currently unreachable" page for the chrome web store. Also added is another exception to ResourceRequestPolicy::CanRequestResource to make sure the error page is always allowed to display the app's icon, even in a manifest v2 app that doesn't list its icons in web_accessible_resources. BUG=135549 Review URL: https://chromiumcodereview.appspot.com/10985028 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@159950 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r--chrome/browser/extensions/extension_icon_image.cc30
-rw-r--r--chrome/browser/extensions/extension_protocols.cc34
-rw-r--r--chrome/browser/extensions/image_loading_tracker.cc67
-rw-r--r--chrome/browser/extensions/image_loading_tracker.h7
-rw-r--r--chrome/browser/extensions/image_loading_tracker_unittest.cc2
-rw-r--r--chrome/browser/resources/chrome_app/manifest.json4
-rw-r--r--chrome/browser/resources/webstore_app/manifest.json2
-rw-r--r--chrome/browser/ui/webui/extensions/extension_icon_source.cc11
-rw-r--r--chrome/common/extensions/extension_file_util.cc47
-rw-r--r--chrome/common/extensions/extension_file_util.h4
-rw-r--r--chrome/renderer/extensions/resource_request_policy.cc5
11 files changed, 98 insertions, 115 deletions
diff --git a/chrome/browser/extensions/extension_icon_image.cc b/chrome/browser/extensions/extension_icon_image.cc
index 8259861..f07452a 100644
--- a/chrome/browser/extensions/extension_icon_image.cc
+++ b/chrome/browser/extensions/extension_icon_image.cc
@@ -168,24 +168,22 @@ gfx::ImageSkiaRep IconImage::LoadImageForScaleFactor(
ExtensionResource resource;
// Find extension resource for non bundled component extensions.
- if (!ImageLoadingTracker::IsSpecialBundledExtensionId(extension_->id())) {
- // We try loading bigger image only if resource size is >= 32.
- if (resource_size_in_pixel >= kMatchBiggerTreshold) {
- resource = GetExtensionIconResource(extension_, icon_set_,
- resource_size_in_pixel, ExtensionIconSet::MATCH_BIGGER);
- }
-
- // If resource is not found by now, try matching smaller one.
- if (resource.empty()) {
- resource = GetExtensionIconResource(extension_, icon_set_,
- resource_size_in_pixel, ExtensionIconSet::MATCH_SMALLER);
- }
-
- // If there is no resource found, return default icon.
- if (resource.empty())
- return default_icon_.GetRepresentation(scale_factor);
+ // We try loading bigger image only if resource size is >= 32.
+ if (resource_size_in_pixel >= kMatchBiggerTreshold) {
+ resource = GetExtensionIconResource(extension_, icon_set_,
+ resource_size_in_pixel, ExtensionIconSet::MATCH_BIGGER);
}
+ // If resource is not found by now, try matching smaller one.
+ if (resource.empty()) {
+ resource = GetExtensionIconResource(extension_, icon_set_,
+ resource_size_in_pixel, ExtensionIconSet::MATCH_SMALLER);
+ }
+
+ // If there is no resource found, return default icon.
+ if (resource.empty())
+ return default_icon_.GetRepresentation(scale_factor);
+
int id = tracker_.next_id();
load_map_[id].scale_factor = scale_factor;
load_map_[id].is_async = false;
diff --git a/chrome/browser/extensions/extension_protocols.cc b/chrome/browser/extensions/extension_protocols.cc
index 70af6bf..d7d56cd 100644
--- a/chrome/browser/extensions/extension_protocols.cc
+++ b/chrome/browser/extensions/extension_protocols.cc
@@ -375,26 +375,20 @@ ExtensionProtocolHandler::MaybeCreateJob(
// component_extension_resources.pak file in resources_path, calculate
// extension relative path against resources_path.
resources_path.AppendRelativePath(directory_path, &relative_path)) {
- relative_path = relative_path.Append(
- extension_file_util::ExtensionURLToRelativeFilePath(request->url()));
- relative_path = relative_path.NormalizePathSeparators();
-
- // TODO(tc): Make a map of FilePath -> resource ids so we don't have to
- // covert to FilePaths all the time. This will be more useful as we add
- // more resources.
- for (size_t i = 0; i < kComponentExtensionResourcesSize; ++i) {
- FilePath bm_resource_path =
- FilePath().AppendASCII(kComponentExtensionResources[i].name);
- bm_resource_path = bm_resource_path.NormalizePathSeparators();
- if (relative_path == bm_resource_path) {
- return new URLRequestResourceBundleJob(
- request,
- network_delegate,
- relative_path,
- kComponentExtensionResources[i].value,
- content_security_policy,
- send_cors_header);
- }
+ FilePath request_path =
+ extension_file_util::ExtensionURLToRelativeFilePath(request->url());
+ int resource_id;
+ if (extension_file_util::IsComponentExtensionResource(extension,
+ request_path, &resource_id)) {
+ relative_path = relative_path.Append(request_path);
+ relative_path = relative_path.NormalizePathSeparators();
+ return new URLRequestResourceBundleJob(
+ request,
+ network_delegate,
+ relative_path,
+ resource_id,
+ content_security_policy,
+ send_cors_header);
}
}
diff --git a/chrome/browser/extensions/image_loading_tracker.cc b/chrome/browser/extensions/image_loading_tracker.cc
index f7cd334..1fe6e6c 100644
--- a/chrome/browser/extensions/image_loading_tracker.cc
+++ b/chrome/browser/extensions/image_loading_tracker.cc
@@ -14,6 +14,7 @@
#include "chrome/common/chrome_notification_types.h"
#include "chrome/common/extensions/extension.h"
#include "chrome/common/extensions/extension_constants.h"
+#include "chrome/common/extensions/extension_file_util.h"
#include "chrome/common/extensions/extension_resource.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/notification_service.h"
@@ -31,30 +32,6 @@ using extensions::Extension;
namespace {
-struct ComponentExtensionResource {
- const char* extension_id;
- const int resource_id;
-};
-
-const ComponentExtensionResource kSpecialComponentExtensionResources[] = {
- { extension_misc::kWebStoreAppId, IDR_WEBSTORE_ICON },
- { extension_misc::kChromeAppId, IDR_PRODUCT_LOGO_128 },
-};
-
-// Finds special component extension resource id for given extension id.
-bool FindSpecialExtensionResourceId(const std::string& extension_id,
- int* out_resource_id) {
- for (size_t i = 0; i < arraysize(kSpecialComponentExtensionResources); ++i) {
- if (extension_id == kSpecialComponentExtensionResources[i].extension_id) {
- if (out_resource_id)
- *out_resource_id = kSpecialComponentExtensionResources[i].resource_id;
- return true;
- }
- }
-
- return false;
-}
-
bool ShouldResizeImageRepresentation(
ImageLoadingTracker::ImageRepresentation::ResizeCondition resize_method,
const gfx::Size& decoded_size,
@@ -247,13 +224,6 @@ class ImageLoadingTracker::ImageLoader
////////////////////////////////////////////////////////////////////////////////
// ImageLoadingTracker
-// static
-bool ImageLoadingTracker::IsSpecialBundledExtensionId(
- const std::string& extension_id) {
- int resource_id = -1;
- return FindSpecialExtensionResourceId(extension_id, &resource_id);
-}
-
ImageLoadingTracker::ImageLoadingTracker(Observer* observer)
: observer_(observer),
next_id_(0) {
@@ -295,16 +265,6 @@ void ImageLoadingTracker::LoadImages(
for (std::vector<ImageRepresentation>::const_iterator it = info_list.begin();
it != info_list.end(); ++it) {
- int resource_id = -1;
-
- // Load resources for special component extensions.
- if (FindSpecialExtensionResourceId(load_info.extension_id, &resource_id)) {
- if (!loader_)
- loader_ = new ImageLoader(this);
- loader_->LoadResource(*it, id, resource_id);
- continue;
- }
-
// If we don't have a path we don't need to do any further work, just
// respond back.
if (it->resource.relative_path().empty()) {
@@ -327,7 +287,8 @@ void ImageLoadingTracker::LoadImages(
if (!loader_)
loader_ = new ImageLoader(this);
- if (IsComponentExtensionResource(extension, it->resource, resource_id))
+ int resource_id = -1;
+ if (IsComponentExtensionResource(extension, it->resource, &resource_id))
loader_->LoadResource(*it, id, resource_id);
else
loader_->LoadImage(*it, id);
@@ -337,25 +298,9 @@ void ImageLoadingTracker::LoadImages(
bool ImageLoadingTracker::IsComponentExtensionResource(
const Extension* extension,
const ExtensionResource& resource,
- int& resource_id) const {
- if (extension->location() != Extension::COMPONENT)
- return false;
-
- FilePath directory_path = extension->path();
- FilePath relative_path = directory_path.BaseName().Append(
- resource.relative_path());
-
- for (size_t i = 0; i < kComponentExtensionResourcesSize; ++i) {
- FilePath resource_path =
- FilePath().AppendASCII(kComponentExtensionResources[i].name);
- resource_path = resource_path.NormalizePathSeparators();
-
- if (relative_path == resource_path) {
- resource_id = kComponentExtensionResources[i].value;
- return true;
- }
- }
- return false;
+ int* resource_id) const {
+ return extension_file_util::IsComponentExtensionResource(extension,
+ resource.relative_path(), resource_id);
}
void ImageLoadingTracker::OnBitmapLoaded(
diff --git a/chrome/browser/extensions/image_loading_tracker.h b/chrome/browser/extensions/image_loading_tracker.h
index be631e7..e5ddb992 100644
--- a/chrome/browser/extensions/image_loading_tracker.h
+++ b/chrome/browser/extensions/image_loading_tracker.h
@@ -96,11 +96,6 @@ class ImageLoadingTracker : public content::NotificationObserver {
ui::ScaleFactor scale_factor;
};
- // Returns true if given extension id is a special component extension that
- // has its resource bundled.
- // TODO(xiyuan): Move this out of this class.
- static bool IsSpecialBundledExtensionId(const std::string& extension_id);
-
explicit ImageLoadingTracker(Observer* observer);
virtual ~ImageLoadingTracker();
@@ -161,7 +156,7 @@ class ImageLoadingTracker : public content::NotificationObserver {
// resources. Otherwise fills |resource_id|.
bool IsComponentExtensionResource(const extensions::Extension* extension,
const ExtensionResource& resource,
- int& resource_id) const;
+ int* resource_id) const;
// content::NotificationObserver method. If an extension is uninstalled while
// we're waiting for the image we remove the entry from load_map_.
diff --git a/chrome/browser/extensions/image_loading_tracker_unittest.cc b/chrome/browser/extensions/image_loading_tracker_unittest.cc
index 34cb00d..a5d14be 100644
--- a/chrome/browser/extensions/image_loading_tracker_unittest.cc
+++ b/chrome/browser/extensions/image_loading_tracker_unittest.cc
@@ -254,7 +254,7 @@ TEST_F(ImageLoadingTrackerTest, IsComponentExtensionResource) {
ASSERT_EQ(true,
loader.IsComponentExtensionResource(extension.get(),
resource,
- resource_id));
+ &resource_id));
ASSERT_EQ(IDR_FILE_MANAGER_ICON_16, resource_id);
#endif
}
diff --git a/chrome/browser/resources/chrome_app/manifest.json b/chrome/browser/resources/chrome_app/manifest.json
index f4806e2..628dde1 100644
--- a/chrome/browser/resources/chrome_app/manifest.json
+++ b/chrome/browser/resources/chrome_app/manifest.json
@@ -3,6 +3,10 @@
"name": "Chrome",
"version": "0.1",
"description": "Chrome as an app",
+ "icons": {
+ "16": "product_logo_16.png",
+ "128": "product_logo_128.png"
+ },
"app": {
"launch": {
// Note this will be changed by special case to become chrome://newtab.
diff --git a/chrome/browser/resources/webstore_app/manifest.json b/chrome/browser/resources/webstore_app/manifest.json
index a08a6ea..5ae6a31 100644
--- a/chrome/browser/resources/webstore_app/manifest.json
+++ b/chrome/browser/resources/webstore_app/manifest.json
@@ -4,6 +4,8 @@
"version": "0.1",
"description": "Web Store",
"icons": {
+ "16": "webstore_icon_16.png",
+ "128": "webstore_icon_128.png"
},
"app": {
"launch": {
diff --git a/chrome/browser/ui/webui/extensions/extension_icon_source.cc b/chrome/browser/ui/webui/extensions/extension_icon_source.cc
index 6e3e1b6..061eae7 100644
--- a/chrome/browser/ui/webui/extensions/extension_icon_source.cc
+++ b/chrome/browser/ui/webui/extensions/extension_icon_source.cc
@@ -135,13 +135,6 @@ ExtensionIconSource::~ExtensionIconSource() {
STLDeleteValues(&request_map_);
}
-const SkBitmap* ExtensionIconSource::GetWebStoreImage() {
- if (!web_store_icon_data_.get())
- web_store_icon_data_.reset(LoadImageByResourceId(IDR_WEBSTORE_ICON));
-
- return web_store_icon_data_.get();
-}
-
const SkBitmap* ExtensionIconSource::GetDefaultAppImage() {
if (!default_app_data_.get())
default_app_data_.reset(LoadImageByResourceId(IDR_APP_DEFAULT_ICON));
@@ -174,9 +167,7 @@ void ExtensionIconSource::LoadDefaultImage(int request_id) {
ExtensionIconRequest* request = GetData(request_id);
const SkBitmap* default_image = NULL;
- if (request->extension->id() == extension_misc::kWebStoreAppId)
- default_image = GetWebStoreImage();
- else if (request->extension->is_app())
+ if (request->extension->is_app())
default_image = GetDefaultAppImage();
else
default_image = GetDefaultExtensionImage();
diff --git a/chrome/common/extensions/extension_file_util.cc b/chrome/common/extensions/extension_file_util.cc
index fce46dd..6ca5758 100644
--- a/chrome/common/extensions/extension_file_util.cc
+++ b/chrome/common/extensions/extension_file_util.cc
@@ -26,7 +26,9 @@
#include "chrome/common/extensions/extension_messages.h"
#include "chrome/common/extensions/extension_resource.h"
#include "chrome/common/extensions/message_bundle.h"
+#include "grit/component_extension_resources_map.h"
#include "grit/generated_resources.h"
+#include "grit/theme_resources.h"
#include "net/base/escape.h"
#include "net/base/file_stream.h"
#include "ui/base/l10n/l10n_util.h"
@@ -791,4 +793,49 @@ void DeleteFile(const FilePath& path, bool recursive) {
file_util::Delete(path, recursive);
}
+bool IsComponentExtensionResource(const Extension* extension,
+ const FilePath& resource_path,
+ int* resource_id) {
+ static const GritResourceMap kExtraComponentExtensionResources[] = {
+ {"web_store/webstore_icon_128.png", IDR_WEBSTORE_ICON},
+ {"web_store/webstore_icon_16.png", IDR_WEBSTORE_ICON_16},
+ {"chrome_app/product_logo_128.png", IDR_PRODUCT_LOGO_128},
+ {"chrome_app/product_logo_16.png", IDR_PRODUCT_LOGO_16},
+ };
+ static const size_t kExtraComponentExtensionResourcesSize =
+ arraysize(kExtraComponentExtensionResources);
+
+ if (extension->location() != Extension::COMPONENT)
+ return false;
+
+ FilePath directory_path = extension->path();
+ FilePath relative_path = directory_path.BaseName().Append(resource_path);
+ relative_path = relative_path.NormalizePathSeparators();
+
+ // TODO(tc): Make a map of FilePath -> resource ids so we don't have to
+ // covert to FilePaths all the time. This will be more useful as we add
+ // more resources.
+ for (size_t i = 0; i < kComponentExtensionResourcesSize; ++i) {
+ FilePath resource_path =
+ FilePath().AppendASCII(kComponentExtensionResources[i].name);
+ resource_path = resource_path.NormalizePathSeparators();
+
+ if (relative_path == resource_path) {
+ *resource_id = kComponentExtensionResources[i].value;
+ return true;
+ }
+ }
+ for (size_t i = 0; i < kExtraComponentExtensionResourcesSize; ++i) {
+ FilePath resource_path =
+ FilePath().AppendASCII(kExtraComponentExtensionResources[i].name);
+ resource_path = resource_path.NormalizePathSeparators();
+
+ if (relative_path == resource_path) {
+ *resource_id = kExtraComponentExtensionResources[i].value;
+ return true;
+ }
+ }
+ return false;
+}
+
} // namespace extension_file_util
diff --git a/chrome/common/extensions/extension_file_util.h b/chrome/common/extensions/extension_file_util.h
index 49a13cc..fcbdc65 100644
--- a/chrome/common/extensions/extension_file_util.h
+++ b/chrome/common/extensions/extension_file_util.h
@@ -130,6 +130,10 @@ FilePath GetUserDataTempDir();
// TODO(skerner): Make a version of Delete that is not overloaded in file_util.
void DeleteFile(const FilePath& path, bool recursive);
+bool IsComponentExtensionResource(const extensions::Extension* extension,
+ const FilePath& resource_path,
+ int* resource_id);
+
} // namespace extension_file_util
#endif // CHROME_COMMON_EXTENSIONS_EXTENSION_FILE_UTIL_H_
diff --git a/chrome/renderer/extensions/resource_request_policy.cc b/chrome/renderer/extensions/resource_request_policy.cc
index c9973c8..da83a32 100644
--- a/chrome/renderer/extensions/resource_request_policy.cc
+++ b/chrome/renderer/extensions/resource_request_policy.cc
@@ -70,9 +70,12 @@ bool ResourceRequestPolicy::CanRequestResource(
!extension->devtools_url().is_empty();
bool transition_allowed =
!content::PageTransitionIsWebTriggerable(transition_type);
+ // - unreachable web page error page (to allow showing the icon of the
+ // unreachable app on this page)
+ bool is_error_page = frame_url == GURL(content::kUnreachableWebDataURL);
if (!is_empty_origin && !is_own_resource &&
- !is_dev_tools && !transition_allowed) {
+ !is_dev_tools && !transition_allowed && !is_error_page) {
std::string message = base::StringPrintf(
"Denying load of %s. Resources must be listed in the "
"web_accessible_resources manifest key in order to be loaded by "