diff options
Diffstat (limited to 'chrome/browser/extensions/webstore_inline_installer_browsertest.cc')
-rw-r--r-- | chrome/browser/extensions/webstore_inline_installer_browsertest.cc | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/chrome/browser/extensions/webstore_inline_installer_browsertest.cc b/chrome/browser/extensions/webstore_inline_installer_browsertest.cc new file mode 100644 index 0000000..ee16a93 --- /dev/null +++ b/chrome/browser/extensions/webstore_inline_installer_browsertest.cc @@ -0,0 +1,138 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/extensions/extension_install_prompt.h" +#include "chrome/browser/extensions/tab_helper.h" +#include "chrome/browser/extensions/webstore_inline_installer.h" +#include "chrome/browser/extensions/webstore_inline_installer_factory.h" +#include "chrome/browser/extensions/webstore_installer_test.h" +#include "chrome/browser/extensions/webstore_standalone_installer.h" +#include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/tabs/tab_strip_model.h" +#include "chrome/test/base/ui_test_utils.h" +#include "content/public/browser/render_view_host.h" +#include "content/public/browser/web_contents.h" +#include "url/gurl.h" + +using content::WebContents; +using extensions::Extension; +using extensions::TabHelper; +using extensions::WebstoreInlineInstaller; +using extensions::WebstoreInlineInstallerFactory; +using extensions::WebstoreStandaloneInstaller; + +const char kWebstoreDomain[] = "cws.com"; +const char kAppDomain[] = "app.com"; +const char kNonAppDomain[] = "nonapp.com"; +const char kTestExtensionId[] = "ecglahbcnmdpdciemllbhojghbkagdje"; +const char kTestDataPath[] = "extensions/api_test/webstore_inline_install"; +const char kCrxFilename[] = "extension.crx"; + +class WebstoreInlineInstallerTest : public WebstoreInstallerTest { + public: + WebstoreInlineInstallerTest() + : WebstoreInstallerTest( + kWebstoreDomain, + kTestDataPath, + kCrxFilename, + kAppDomain, + kNonAppDomain) {} +}; + +class ProgrammableInstallPrompt : public ExtensionInstallPrompt { + public: + explicit ProgrammableInstallPrompt(WebContents* contents) + : ExtensionInstallPrompt(contents) + {} + + virtual ~ProgrammableInstallPrompt() {} + + virtual void ConfirmStandaloneInstall( + Delegate* delegate, + const Extension* extension, + SkBitmap* icon, + const ExtensionInstallPrompt::Prompt& prompt) OVERRIDE { + delegate_ = delegate; + } + + static bool Ready() { + return delegate_ != NULL; + } + + static void Accept() { + delegate_->InstallUIProceed(); + } + + static void Reject() { + delegate_->InstallUIAbort(true); + } + + private: + static Delegate* delegate_; +}; + +ExtensionInstallPrompt::Delegate* ProgrammableInstallPrompt::delegate_; + + +// Fake inline installer which creates a programmable prompt in place of +// the normal dialog UI. +class WebstoreInlineInstallerForTest : public WebstoreInlineInstaller { + public: + WebstoreInlineInstallerForTest(WebContents* contents, + const std::string& extension_id, + const GURL& requestor_url, + const Callback& callback) + : WebstoreInlineInstaller( + contents, + kTestExtensionId, + requestor_url, + base::Bind(DummyCallback)), + programmable_prompt_(NULL) { + } + + virtual scoped_ptr<ExtensionInstallPrompt> CreateInstallUI() OVERRIDE { + programmable_prompt_ = new ProgrammableInstallPrompt(web_contents()); + return make_scoped_ptr(programmable_prompt_). + PassAs<ExtensionInstallPrompt>(); + } + + private: + virtual ~WebstoreInlineInstallerForTest() {} + + friend class base::RefCountedThreadSafe<WebstoreStandaloneInstaller>; + + static void DummyCallback(bool /*success*/, const std::string& /*error*/) { + } + + ProgrammableInstallPrompt* programmable_prompt_; +}; + +class WebstoreInlineInstallerForTestFactory : + public WebstoreInlineInstallerFactory { + virtual ~WebstoreInlineInstallerForTestFactory() {} + virtual WebstoreInlineInstaller* CreateInstaller( + WebContents* contents, + const std::string& webstore_item_id, + const GURL& requestor_url, + const WebstoreStandaloneInstaller::Callback& callback) OVERRIDE { + return new WebstoreInlineInstallerForTest( + contents, webstore_item_id, requestor_url, callback); + } +}; + +IN_PROC_BROWSER_TEST_F(WebstoreInlineInstallerTest, + CloseTabBeforeInstallConfirmation) { + GURL install_url = GenerateTestServerUrl(kAppDomain, "install.html"); + ui_test_utils::NavigateToURL(browser(), install_url); + WebContents* web_contents = + browser()->tab_strip_model()->GetActiveWebContents(); + TabHelper* tab_helper = TabHelper::FromWebContents(web_contents); + tab_helper->SetWebstoreInlineInstallerFactoryForTests( + new WebstoreInlineInstallerForTestFactory()); + RunTestAsync("runTest"); + while (!ProgrammableInstallPrompt::Ready()) + base::RunLoop().RunUntilIdle(); + web_contents->Close(); + ProgrammableInstallPrompt::Accept(); +} |