diff options
author | tbarzic@chromium.org <tbarzic@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-01-30 02:06:55 +0000 |
---|---|---|
committer | tbarzic@chromium.org <tbarzic@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-01-30 02:06:55 +0000 |
commit | 7029cb749f5fff4747ff2bea06f0e91ab2a729b0 (patch) | |
tree | 72b89b03cbb299baa8dd4de22c8230bdd7f9d9dd | |
parent | 23a1e3dda52ae121cdc202f2fa20c3becbfb4b49 (diff) | |
download | chromium_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
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, |