Index: chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc |
diff --git a/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc b/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc |
index 15b5556b27d917b67165a33261a999ad57736850..092fb8eb57aba57c29019ee0751526daa4a587de 100644 |
--- a/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc |
+++ b/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc |
@@ -4,11 +4,14 @@ |
#include <vector> |
+#include "base/callback_list.h" |
#include "base/file_util.h" |
#include "base/files/file_path.h" |
+#include "base/strings/string_number_conversions.h" |
#include "base/strings/stringprintf.h" |
#include "base/strings/utf_string_conversions.h" |
#include "chrome/browser/chrome_notification_types.h" |
+#include "chrome/browser/extensions/api/identity/identity_api.h" |
#include "chrome/browser/extensions/api/management/management_api.h" |
#include "chrome/browser/extensions/api/webstore_private/webstore_private_api.h" |
#include "chrome/browser/extensions/extension_apitest.h" |
@@ -18,10 +21,18 @@ |
#include "chrome/browser/extensions/extension_service.h" |
#include "chrome/browser/extensions/webstore_installer.h" |
#include "chrome/browser/profiles/profile.h" |
+#include "chrome/browser/signin/fake_profile_oauth2_token_service.h" |
+#include "chrome/browser/signin/fake_profile_oauth2_token_service_builder.h" |
+#include "chrome/browser/signin/fake_signin_manager.h" |
+#include "chrome/browser/signin/profile_oauth2_token_service_factory.h" |
+#include "chrome/browser/signin/signin_manager_factory.h" |
#include "chrome/browser/ui/browser.h" |
#include "chrome/browser/ui/tabs/tab_strip_model.h" |
#include "chrome/common/chrome_switches.h" |
#include "chrome/test/base/ui_test_utils.h" |
+#include "components/keyed_service/content/browser_context_dependency_manager.h" |
+#include "components/signin/core/browser/signin_manager.h" |
+#include "components/signin/core/browser/test_signin_client.h" |
#include "content/public/browser/gpu_data_manager.h" |
#include "content/public/browser/notification_observer.h" |
#include "content/public/browser/notification_registrar.h" |
@@ -91,6 +102,11 @@ class WebstoreInstallListener : public WebstoreInstaller::Delegate { |
// A base class for tests below. |
class ExtensionWebstorePrivateApiTest : public ExtensionApiTest { |
public: |
+ ExtensionWebstorePrivateApiTest() |
+ : signin_manager_(NULL), |
+ token_service_(NULL) {} |
+ virtual ~ExtensionWebstorePrivateApiTest() {} |
+ |
virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { |
ExtensionApiTest::SetUpCommandLine(command_line); |
command_line->AppendSwitchASCII( |
@@ -101,11 +117,46 @@ class ExtensionWebstorePrivateApiTest : public ExtensionApiTest { |
} |
virtual void SetUpInProcessBrowserTestFixture() OVERRIDE { |
+ ExtensionApiTest::SetUpInProcessBrowserTestFixture(); |
+ |
// Start up the test server and get us ready for calling the install |
// API functions. |
host_resolver()->AddRule("www.example.com", "127.0.0.1"); |
- ASSERT_TRUE(test_server()->Start()); |
+ ASSERT_TRUE(StartSpawnedTestServer()); |
ExtensionInstallUI::set_disable_failure_ui_for_tests(); |
+ |
+ will_create_browser_context_services_subscription_ = |
+ BrowserContextDependencyManager::GetInstance()-> |
+ RegisterWillCreateBrowserContextServicesCallbackForTesting( |
+ base::Bind( |
+ &ExtensionWebstorePrivateApiTest:: |
+ OnWillCreateBrowserContextServices, |
+ base::Unretained(this))).Pass(); |
+ } |
+ |
+ void OnWillCreateBrowserContextServices(content::BrowserContext* context) { |
+ // Replace the signin manager and token service with fakes. Do this ahead of |
+ // creating the browser so that a bunch of classes don't register as |
+ // observers and end up needing to unregister when the fake is substituted. |
+ SigninManagerFactory::GetInstance()->SetTestingFactory( |
+ context, &FakeSigninManagerBase::Build); |
+ ProfileOAuth2TokenServiceFactory::GetInstance()->SetTestingFactory( |
+ context, &BuildFakeProfileOAuth2TokenService); |
+ } |
+ |
+ virtual void SetUpOnMainThread() OVERRIDE { |
+ ExtensionApiTest::SetUpOnMainThread(); |
+ |
+ // Grab references to the fake signin manager and token service. |
+ signin_manager_ = |
+ static_cast<FakeSigninManagerForTesting*>( |
+ SigninManagerFactory::GetInstance()->GetForProfile(profile())); |
+ ASSERT_TRUE(signin_manager_); |
+ token_service_ = |
+ static_cast<FakeProfileOAuth2TokenService*>( |
+ ProfileOAuth2TokenServiceFactory::GetInstance()->GetForProfile( |
+ profile())); |
+ ASSERT_TRUE(token_service_); |
} |
protected: |
@@ -142,9 +193,36 @@ class ExtensionWebstorePrivateApiTest : public ExtensionApiTest { |
#endif |
} |
+ // Navigates to |page| and waits for the API call. |
+ void StartSignInTest(const std::string& page) { |
+ ui_test_utils::NavigateToURL(browser(), GetTestServerURL(page)); |
+ |
+ // Wait for the API to be called. A simple way to wait for this is to run |
+ // some other JavaScript in the page and wait for a round-trip back to the |
+ // browser process. |
+ bool result = false; |
+ ASSERT_TRUE( |
+ content::ExecuteScriptAndExtractBool( |
+ GetWebContents(), "window.domAutomationController.send(true)", |
+ &result)); |
+ ASSERT_TRUE(result); |
+ } |
+ |
+ content::WebContents* GetWebContents() { |
+ return browser()->tab_strip_model()->GetActiveWebContents(); |
+ } |
+ |
ExtensionService* service() { |
return browser()->profile()->GetExtensionService(); |
} |
+ |
+ FakeSigninManagerForTesting* signin_manager_; |
+ FakeProfileOAuth2TokenService* token_service_; |
+ |
+ private: |
+ scoped_ptr<base::CallbackList<void(content::BrowserContext*)>::Subscription> |
+ will_create_browser_context_services_subscription_; |
+ |
}; |
// Test cases for webstore origin frame blocking. |
@@ -152,11 +230,9 @@ class ExtensionWebstorePrivateApiTest : public ExtensionApiTest { |
// Chromium, see crbug.com/226018. |
IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, |
DISABLED_FrameWebstorePageBlocked) { |
- content::WebContents* contents = |
- browser()->tab_strip_model()->GetActiveWebContents(); |
base::string16 expected_title = base::UTF8ToUTF16("PASS: about:blank"); |
base::string16 failure_title = base::UTF8ToUTF16("FAIL"); |
- content::TitleWatcher watcher(contents, expected_title); |
+ content::TitleWatcher watcher(GetWebContents(), expected_title); |
watcher.AlsoWaitForTitle(failure_title); |
GURL url = test_server()->GetURL( |
"files/extensions/api_test/webstore_private/noframe.html"); |
@@ -169,11 +245,9 @@ IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, |
// Chromium, see crbug.com/226018. |
IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, |
DISABLED_FrameErrorPageBlocked) { |
- content::WebContents* contents = |
- browser()->tab_strip_model()->GetActiveWebContents(); |
base::string16 expected_title = base::UTF8ToUTF16("PASS: about:blank"); |
base::string16 failure_title = base::UTF8ToUTF16("FAIL"); |
- content::TitleWatcher watcher(contents, expected_title); |
+ content::TitleWatcher watcher(GetWebContents(), expected_title); |
watcher.AlsoWaitForTitle(failure_title); |
GURL url = test_server()->GetURL( |
"files/extensions/api_test/webstore_private/noframe2.html"); |
@@ -367,4 +441,131 @@ IN_PROC_BROWSER_TEST_F(ExtensionWebstoreGetWebGLStatusTest, Blocked) { |
RunTest(webgl_allowed); |
} |
+IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, |
+ SignIn_UserGestureRequired) { |
+ GURL page_url = GetTestServerURL("sign_in_user_gesture_required.html"); |
+ ASSERT_TRUE(RunPageTest(page_url.spec())); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, |
+ SignIn_MissingContinueUrl) { |
+ GURL page_url = GetTestServerURL("sign_in_missing_continue_url.html"); |
+ ASSERT_TRUE(RunPageTest(page_url.spec())); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, |
+ SignIn_InvalidContinueUrl) { |
+ GURL page_url = GetTestServerURL("sign_in_invalid_continue_url.html"); |
+ ASSERT_TRUE(RunPageTest(page_url.spec())); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, |
+ SignIn_ContinueUrlOnDifferentOrigin) { |
+ GURL page_url = |
+ GetTestServerURL("sign_in_continue_url_on_different_origin.html"); |
+ ASSERT_TRUE(RunPageTest(page_url.spec())); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, |
+ SignIn_DisallowedInIncognito) { |
+ // Make sure that the test is testing something more than the absence of a |
+ // sign-in manager for this profile. |
+ ASSERT_TRUE(SigninManagerFactory::GetForProfile(profile())); |
+ |
+ GURL page_url = |
+ GetTestServerURL("sign_in_disallowed_in_incognito.html"); |
+ ASSERT_TRUE( |
+ RunPageTest(page_url.spec(), ExtensionApiTest::kFlagUseIncognito)); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, |
+ SignIn_DisabledWhenWebBasedSigninIsEnabled) { |
+ // Make sure that the test is testing something more than the absence of a |
+ // sign-in manager for this profile. |
+ ASSERT_TRUE(SigninManagerFactory::GetForProfile(profile())); |
+ |
+ CommandLine::ForCurrentProcess()->AppendSwitch( |
+ switches::kEnableWebBasedSignin); |
+ GURL page_url = GetTestServerURL( |
+ "sign_in_disabled_when_web_based_signin_is_enabled.html"); |
+ ASSERT_TRUE(RunPageTest(page_url.spec())); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, |
+ SignIn_AlreadySignedIn) { |
+ signin_manager_->SetAuthenticatedUsername("user@example.com"); |
+ GURL page_url = GetTestServerURL("sign_in_already_signed_in.html"); |
+ ASSERT_TRUE(RunPageTest(page_url.spec())); |
+} |
+ |
+// The FakeSignInManager class is not implemented for ChromeOS, so there's no |
+// straightforward way to test these flows on that platform. |
+#if !defined(OS_CHROMEOS) |
+IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, |
+ SignIn_AuthInProgress_Fails) { |
+ // Initiate an authentication that will be in progress when the sign-in API is |
+ // called. |
+ signin_manager_->set_auth_in_progress("user@example.com"); |
+ |
+ // Navigate to the page, which will cause the sign-in API to be called. |
+ // Then, complete the authentication in a failed state. |
+ ResultCatcher catcher; |
+ StartSignInTest("sign_in_auth_in_progress_fails.html"); |
+ signin_manager_->FailSignin(GoogleServiceAuthError::AuthErrorNone()); |
+ ASSERT_TRUE(catcher.GetNextResult()); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, |
+ SignIn_AuthInProgress_MergeSessionFails) { |
+ // Initiate an authentication that will be in progress when the sign-in API is |
+ // called. |
+ signin_manager_->set_auth_in_progress("user@example.com"); |
+ |
+ // Navigate to the page, which will cause the sign-in API to be called. |
+ // Then, complete the authentication in a successful state. |
+ ResultCatcher catcher; |
+ StartSignInTest("sign_in_auth_in_progress_merge_session_fails.html"); |
+ signin_manager_->CompletePendingSignin(); |
+ token_service_->IssueRefreshToken("token"); |
+ signin_manager_->NotifyMergeSessionObservers( |
+ GoogleServiceAuthError(GoogleServiceAuthError::SERVICE_UNAVAILABLE)); |
+ ASSERT_TRUE(catcher.GetNextResult()); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, |
+ SignIn_AuthInProgress_Succeeds) { |
+ // Initiate an authentication that will be in progress when the sign-in API is |
+ // called. |
+ signin_manager_->set_auth_in_progress("user@example.com"); |
+ |
+ // Navigate to the page, which will cause the sign-in API to be called. |
+ // Then, complete the authentication in a successful state. |
+ ResultCatcher catcher; |
+ StartSignInTest("sign_in_auth_in_progress_succeeds.html"); |
+ signin_manager_->CompletePendingSignin(); |
+ token_service_->IssueRefreshToken("token"); |
+ signin_manager_->NotifyMergeSessionObservers( |
+ GoogleServiceAuthError::AuthErrorNone()); |
+ ASSERT_TRUE(catcher.GetNextResult()); |
+} |
+#endif // !defined (OS_CHROMEOS) |
+ |
+IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, |
+ SignIn_RedirectToSignIn) { |
+ GURL signin_url( |
+ "chrome://chrome-signin/?source=5&" |
+ "continue=http%3A%2F%2Fwww.example.com%3A" + |
+ base::IntToString(test_server()->host_port_pair().port()) + |
+ "%2Fcontinue"); |
+ ui_test_utils::UrlLoadObserver observer( |
+ signin_url, |
+ content::Source<content::NavigationController>( |
+ &GetWebContents()->GetController())); |
+ StartSignInTest("sign_in_redirect_to_sign_in.html"); |
+ observer.Wait(); |
+ |
+ // TODO(isherman): Also test the redirect back to the continue URL once |
+ // sign-in completes? |
+} |
+ |
} // namespace extensions |