summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortbarzic@chromium.org <tbarzic@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-01-30 02:06:55 +0000
committertbarzic@chromium.org <tbarzic@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-01-30 02:06:55 +0000
commit7029cb749f5fff4747ff2bea06f0e91ab2a729b0 (patch)
tree72b89b03cbb299baa8dd4de22c8230bdd7f9d9dd
parent23a1e3dda52ae121cdc202f2fa20c3becbfb4b49 (diff)
downloadchromium_src-7029cb749f5fff4747ff2bea06f0e91ab2a729b0.zip
chromium_src-7029cb749f5fff4747ff2bea06f0e91ab2a729b0.tar.gz
chromium_src-7029cb749f5fff4747ff2bea06f0e91ab2a729b0.tar.bz2
Fix crash in ExtensionIconSource when chrome://extension-icon URL is invalid.
The problem is SendDefaultResponse gets the callback it calls from resquest_map_, but in the case the request is not valid, the request data doesn't get added to the map. BUG=172696 TEST=navigtate to chrome://extension-icon/xxx ; no crash Review URL: https://chromiumcodereview.appspot.com/12095021 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@179508 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/extensions/extension_icon_source_apitest.cc15
-rw-r--r--chrome/browser/ui/webui/extensions/extension_icon_source.cc14
-rw-r--r--chrome/browser/ui/webui/extensions/extension_icon_source.h3
3 files changed, 20 insertions, 12 deletions
diff --git a/chrome/browser/extensions/extension_icon_source_apitest.cc b/chrome/browser/extensions/extension_icon_source_apitest.cc
index cdf2b50..3ab665f 100644
--- a/chrome/browser/extensions/extension_icon_source_apitest.cc
+++ b/chrome/browser/extensions/extension_icon_source_apitest.cc
@@ -52,6 +52,21 @@ IN_PROC_BROWSER_TEST_F(ExtensionIconSourceTest, IconsLoaded) {
EXPECT_EQ(result, "Not Loaded");
}
+IN_PROC_BROWSER_TEST_F(ExtensionIconSourceTest, InvalidURL) {
+ std::string result;
+
+ // Test that navigation to an invalid url works.
+ ui_test_utils::NavigateToURL(
+ browser(),
+ GURL("chrome://extension-icon/invalid"));
+
+ ASSERT_TRUE(content::ExecuteScriptAndExtractString(
+ browser()->tab_strip_model()->GetActiveWebContents(),
+ "window.domAutomationController.send(document.title)",
+ &result));
+ EXPECT_EQ(result, "invalid (96\xC3\x97""96)");
+}
+
IN_PROC_BROWSER_TEST_F(ExtensionIconSourceTest, IconsLoadedIncognito) {
FilePath basedir = test_data_dir_.AppendASCII("icons");
ASSERT_TRUE(LoadExtensionIncognito(
diff --git a/chrome/browser/ui/webui/extensions/extension_icon_source.cc b/chrome/browser/ui/webui/extensions/extension_icon_source.cc
index 80aabe9..0d0dd47 100644
--- a/chrome/browser/ui/webui/extensions/extension_icon_source.cc
+++ b/chrome/browser/ui/webui/extensions/extension_icon_source.cc
@@ -120,7 +120,11 @@ void ExtensionIconSource::StartDataRequest(
// the request data available for later.
static int next_id = 0;
if (!ParseData(path, ++next_id, callback)) {
- SendDefaultResponse(next_id);
+ // If the request data cannot be parsed, request parameters will not be
+ // added to |request_map_|.
+ // Send back the default application icon (not resized or desaturated) as
+ // the default response.
+ callback.Run(BitmapToMemory(GetDefaultAppImage()));
return;
}
@@ -306,14 +310,6 @@ bool ExtensionIconSource::ParseData(
return true;
}
-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);
-}
-
void ExtensionIconSource::SetData(
int request_id,
const content::URLDataSource::GotDataCallback& callback,
diff --git a/chrome/browser/ui/webui/extensions/extension_icon_source.h b/chrome/browser/ui/webui/extensions/extension_icon_source.h
index 286d2f2..0241160 100644
--- a/chrome/browser/ui/webui/extensions/extension_icon_source.h
+++ b/chrome/browser/ui/webui/extensions/extension_icon_source.h
@@ -128,9 +128,6 @@ class ExtensionIconSource : public content::URLDataSource,
int request_id,
const content::URLDataSource::GotDataCallback& callback);
- // Sends the default response to |request_id|, used for invalid requests.
- void SendDefaultResponse(int request_id);
-
// Stores the parameters associated with the |request_id|, making them
// as an ExtensionIconRequest via GetData.
void SetData(int request_id,