summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authormihaip@chromium.org <mihaip@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-10-19 21:41:40 +0000
committermihaip@chromium.org <mihaip@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-10-19 21:41:40 +0000
commitcb08ba2b4460e3d873cb4fec72ad5b34fe433ff7 (patch)
tree2ffbd8329cf9b2dc6433fa6efc0d41821f763434 /chrome
parent303f3e955f35aa20c9d72769639ed8ecf25ba8f6 (diff)
downloadchromium_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.h1
-rw-r--r--chrome/browser/extensions/webstore_inline_install_browsertest.cc42
-rw-r--r--chrome/browser/extensions/webstore_inline_installer.cc21
-rw-r--r--chrome/browser/extensions/webstore_inline_installer.h7
-rw-r--r--chrome/test/data/extensions/api_test/webstore_inline_install/inlineinstall/detail/cccccccccccccccccccccccccccccccc8
-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.html38
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>