diff options
author | mihaip@chromium.org <mihaip@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-10-19 21:41:40 +0000 |
---|---|---|
committer | mihaip@chromium.org <mihaip@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-10-19 21:41:40 +0000 |
commit | cb08ba2b4460e3d873cb4fec72ad5b34fe433ff7 (patch) | |
tree | 2ffbd8329cf9b2dc6433fa6efc0d41821f763434 /chrome | |
parent | 303f3e955f35aa20c9d72769639ed8ecf25ba8f6 (diff) | |
download | chromium_src-cb08ba2b4460e3d873cb4fec72ad5b34fe433ff7.zip chromium_src-cb08ba2b4460e3d873cb4fec72ad5b34fe433ff7.tar.gz chromium_src-cb08ba2b4460e3d873cb4fec72ad5b34fe433ff7.tar.bz2 |
Make inline installation callbacks fire when the item is downloaded and installed.
By having WebstoreInlineInstaller implement WebstoreInstaller::Delegate, we can
respond to the callback when the item is actually installed, instead of as soon
as the download is initiated.
(Reland r106140: WebstoreInlineInstallUnpackFailureTest now disables the install
failure UI, which was previous making the test time out on Mac and Windows)
R=jstritar@chromium.org
Review URL: http://codereview.chromium.org/8353015
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@106384 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r-- | chrome/browser/extensions/extension_install_ui.h | 1 | ||||
-rw-r--r-- | chrome/browser/extensions/webstore_inline_install_browsertest.cc | 42 | ||||
-rw-r--r-- | chrome/browser/extensions/webstore_inline_installer.cc | 21 | ||||
-rw-r--r-- | chrome/browser/extensions/webstore_inline_installer.h | 7 | ||||
-rw-r--r-- | chrome/test/data/extensions/api_test/webstore_inline_install/inlineinstall/detail/cccccccccccccccccccccccccccccccc | 8 | ||||
-rw-r--r-- | chrome/test/data/extensions/api_test/webstore_inline_install/install_non_verified_domain.html (renamed from chrome/test/data/extensions/api_test/webstore_inline_install/install-non-verified-domain.html) | 0 | ||||
-rw-r--r-- | chrome/test/data/extensions/api_test/webstore_inline_install/install_not_supported.html (renamed from chrome/test/data/extensions/api_test/webstore_inline_install/install-not-supported.html) | 0 | ||||
-rw-r--r-- | chrome/test/data/extensions/api_test/webstore_inline_install/install_unpack_failure.html | 38 |
8 files changed, 100 insertions, 17 deletions
diff --git a/chrome/browser/extensions/extension_install_ui.h b/chrome/browser/extensions/extension_install_ui.h index 171606d..69dc33fd 100644 --- a/chrome/browser/extensions/extension_install_ui.h +++ b/chrome/browser/extensions/extension_install_ui.h @@ -152,6 +152,7 @@ class ExtensionInstallUI : public ImageLoadingTracker::Observer { protected: friend class ExtensionWebstorePrivateApiTest; + friend class WebstoreInlineInstallUnpackFailureTest; // Disables showing UI (ErrorBox, etc.) for install failures. To be used only // in tests. diff --git a/chrome/browser/extensions/webstore_inline_install_browsertest.cc b/chrome/browser/extensions/webstore_inline_install_browsertest.cc index a58363a..af1c80f 100644 --- a/chrome/browser/extensions/webstore_inline_install_browsertest.cc +++ b/chrome/browser/extensions/webstore_inline_install_browsertest.cc @@ -7,6 +7,7 @@ #include "base/utf_string_conversions.h" #include "chrome/browser/extensions/extension_host.h" #include "chrome/browser/extensions/extension_install_dialog.h" +#include "chrome/browser/extensions/extension_install_ui.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/webstore_inline_installer.h" #include "chrome/browser/tabs/tab_strip_model.h" @@ -81,20 +82,14 @@ class WebstoreInlineInstallTest : public InProcessBrowserTest { IN_PROC_BROWSER_TEST_F(WebstoreInlineInstallTest, Install) { SetExtensionInstallDialogForManifestAutoConfirmForTests(true); - ui_test_utils::WindowedNotificationObserver load_signal( - chrome::NOTIFICATION_EXTENSION_LOADED, - content::Source<Profile>(browser()->profile())); - ui_test_utils::NavigateToURL( browser(), GenerateTestServerUrl(kAppDomain, "install.html")); RunInlineInstallTest("runTest"); - load_signal.Wait(); - const Extension* extension = browser()->profile()->GetExtensionService()-> GetExtensionById("ecglahbcnmdpdciemllbhojghbkagdje", false); - EXPECT_TRUE(extension != NULL); + EXPECT_TRUE(extension); } IN_PROC_BROWSER_TEST_F( @@ -102,7 +97,7 @@ IN_PROC_BROWSER_TEST_F( SetExtensionInstallDialogForManifestAutoConfirmForTests(false); ui_test_utils::NavigateToURL( browser(), - GenerateTestServerUrl(kNonAppDomain, "install-non-verified-domain.html")); + GenerateTestServerUrl(kNonAppDomain, "install_non_verified_domain.html")); RunInlineInstallTest("runTest1"); RunInlineInstallTest("runTest2"); @@ -127,7 +122,7 @@ IN_PROC_BROWSER_TEST_F(WebstoreInlineInstallTest, InstallNotSupported) { SetExtensionInstallDialogForManifestAutoConfirmForTests(false); ui_test_utils::NavigateToURL( browser(), - GenerateTestServerUrl(kAppDomain, "install-not-supported.html")); + GenerateTestServerUrl(kAppDomain, "install_not_supported.html")); RunInlineInstallTest("runTest"); @@ -139,3 +134,32 @@ IN_PROC_BROWSER_TEST_F(WebstoreInlineInstallTest, InstallNotSupported) { TabContents* tab_contents = browser()->GetSelectedTabContents(); EXPECT_EQ(GURL("http://cws.com/show-me-the-money"), tab_contents->GetURL()); } + +// The unpack failure test needs to use a different install .crx, which is +// specified via a command-line flag, so it needs its own test subclass. +class WebstoreInlineInstallUnpackFailureTest + : public WebstoreInlineInstallTest { + public: + virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { + WebstoreInlineInstallTest::SetUpCommandLine(command_line); + + GURL crx_url = GenerateTestServerUrl( + kWebstoreDomain, "malformed_extension.crx"); + CommandLine::ForCurrentProcess()->AppendSwitchASCII( + switches::kAppsGalleryUpdateURL, crx_url.spec()); + } + + void SetUpInProcessBrowserTestFixture() OVERRIDE { + WebstoreInlineInstallTest::SetUpInProcessBrowserTestFixture(); + ExtensionInstallUI::DisableFailureUIForTests(); + } +}; + +IN_PROC_BROWSER_TEST_F(WebstoreInlineInstallUnpackFailureTest, Test) { + SetExtensionInstallDialogForManifestAutoConfirmForTests(true); + + ui_test_utils::NavigateToURL(browser(), + GenerateTestServerUrl(kAppDomain, "install_unpack_failure.html")); + + RunInlineInstallTest("runTest"); +} diff --git a/chrome/browser/extensions/webstore_inline_installer.cc b/chrome/browser/extensions/webstore_inline_installer.cc index 967dba1..4a2ddfe 100644 --- a/chrome/browser/extensions/webstore_inline_installer.cc +++ b/chrome/browser/extensions/webstore_inline_installer.cc @@ -13,7 +13,6 @@ #include "chrome/browser/extensions/crx_installer.h" #include "chrome/browser/extensions/extension_install_dialog.h" #include "chrome/browser/extensions/extension_service.h" -#include "chrome/browser/extensions/webstore_installer.h" #include "chrome/browser/profiles/profile.h" #include "chrome/common/chrome_utility_messages.h" #include "chrome/common/extensions/extension.h" @@ -382,13 +381,8 @@ void WebstoreInlineInstaller::InstallUIProceed() { WebstoreInstaller* installer = profile->GetExtensionService()->webstore_installer(); - installer->InstallExtension(id_, NULL, - WebstoreInstaller::FLAG_INLINE_INSTALL); - - // TODO(mihaip): the success message should happen later, when the extension - // is actually downloaded and installed (by using the callbacks on - // ExtensionInstaller::Delegate). - CompleteInstall(""); + installer->InstallExtension( + id_, this, WebstoreInstaller::FLAG_INLINE_INSTALL); } void WebstoreInlineInstaller::InstallUIAbort(bool user_initiated) { @@ -403,6 +397,17 @@ void WebstoreInlineInstaller::TabContentsDestroyed(TabContents* tab_contents) { } } +void WebstoreInlineInstaller::OnExtensionInstallSuccess(const std::string& id) { + CHECK_EQ(id_, id); + CompleteInstall(""); +} + +void WebstoreInlineInstaller::OnExtensionInstallFailure( + const std::string& id, const std::string& error) { + CHECK_EQ(id_, id); + CompleteInstall(error); +} + void WebstoreInlineInstaller::CompleteInstall(const std::string& error) { // Only bother responding if there's still a tab contents to send back the // response to. diff --git a/chrome/browser/extensions/webstore_inline_installer.h b/chrome/browser/extensions/webstore_inline_installer.h index 7f11aa8..2b2cf05 100644 --- a/chrome/browser/extensions/webstore_inline_installer.h +++ b/chrome/browser/extensions/webstore_inline_installer.h @@ -12,6 +12,7 @@ #include "base/memory/scoped_ptr.h" #include "base/values.h" #include "chrome/browser/extensions/extension_install_ui.h" +#include "chrome/browser/extensions/webstore_installer.h" #include "chrome/browser/extensions/webstore_install_helper.h" #include "content/browser/tab_contents/tab_contents_observer.h" #include "content/common/net/url_fetcher.h" @@ -32,6 +33,7 @@ class WebstoreInlineInstaller public ExtensionInstallUI::Delegate, public TabContentsObserver, public URLFetcher::Delegate, + public WebstoreInstaller::Delegate, public WebstoreInstallHelper::Delegate { public: class Delegate { @@ -89,6 +91,11 @@ class WebstoreInlineInstaller // TabContentsObserver interface implementation. virtual void TabContentsDestroyed(TabContents* tab_contents) OVERRIDE; + // WebstoreInstaller::Delegate interface implementation. + virtual void OnExtensionInstallSuccess(const std::string& id) OVERRIDE; + virtual void OnExtensionInstallFailure(const std::string& id, + const std::string& error) OVERRIDE; + void CompleteInstall(const std::string& error); int install_id_; diff --git a/chrome/test/data/extensions/api_test/webstore_inline_install/inlineinstall/detail/cccccccccccccccccccccccccccccccc b/chrome/test/data/extensions/api_test/webstore_inline_install/inlineinstall/detail/cccccccccccccccccccccccccccccccc new file mode 100644 index 0000000..f9c1f89 --- /dev/null +++ b/chrome/test/data/extensions/api_test/webstore_inline_install/inlineinstall/detail/cccccccccccccccccccccccccccccccc @@ -0,0 +1,8 @@ +{ + "icon_url": "webstore_inline_install/extension/icon.png", + "users": "0", + "average_rating": 5, + "rating_count": 0, + "verified_site": "app.com", + "manifest": "{\"name\":\"Install Failure Test Extension\",\"version\":\"0.1\"}" +} diff --git a/chrome/test/data/extensions/api_test/webstore_inline_install/install-non-verified-domain.html b/chrome/test/data/extensions/api_test/webstore_inline_install/install_non_verified_domain.html index 8f74754..8f74754 100644 --- a/chrome/test/data/extensions/api_test/webstore_inline_install/install-non-verified-domain.html +++ b/chrome/test/data/extensions/api_test/webstore_inline_install/install_non_verified_domain.html diff --git a/chrome/test/data/extensions/api_test/webstore_inline_install/install-not-supported.html b/chrome/test/data/extensions/api_test/webstore_inline_install/install_not_supported.html index f86fc40..f86fc40 100644 --- a/chrome/test/data/extensions/api_test/webstore_inline_install/install-not-supported.html +++ b/chrome/test/data/extensions/api_test/webstore_inline_install/install_not_supported.html diff --git a/chrome/test/data/extensions/api_test/webstore_inline_install/install_unpack_failure.html b/chrome/test/data/extensions/api_test/webstore_inline_install/install_unpack_failure.html new file mode 100644 index 0000000..d638582 --- /dev/null +++ b/chrome/test/data/extensions/api_test/webstore_inline_install/install_unpack_failure.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<html> +<head> + <link rel="chrome-webstore-item"> +</head> +<body> +<script> + function runTest(galleryUrl) { + // Link URL has to be generated dynamically in order to include the right + // port number. The ID corresponds to the data in the "extension" directory. + document.getElementsByTagName('link')[0].href = + galleryUrl + '/detail/cccccccccccccccccccccccccccccccc'; + + try { + chrome.webstore.install( + undefined, + function() { + console.log('Unexpected install success'); + window.domAutomationController.send(false); + }, + function(error) { + if (error.indexOf('Package is invalid') != -1) { + window.domAutomationController.send(true); + } else { + console.log('Unexpected install error: ' + error); + window.domAutomationController.send(false); + } + }); + } catch (e) { + console.log('Unexpected exception: ' + e); + window.domAutomationController.send(false); + throw e; + } + } +</script> + +</body> +</html> |