| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <vector> | 5 #include <vector> |
| 6 | 6 |
| 7 #include "base/callback_list.h" | 7 #include "base/callback_list.h" |
| 8 #include "base/file_util.h" | 8 #include "base/file_util.h" |
| 9 #include "base/files/file_path.h" | 9 #include "base/files/file_path.h" |
| 10 #include "base/strings/string_number_conversions.h" | 10 #include "base/strings/string_number_conversions.h" |
| 11 #include "base/strings/stringprintf.h" | 11 #include "base/strings/stringprintf.h" |
| 12 #include "base/strings/utf_string_conversions.h" | 12 #include "base/strings/utf_string_conversions.h" |
| 13 #include "chrome/browser/chrome_notification_types.h" | 13 #include "chrome/browser/chrome_notification_types.h" |
| 14 #include "chrome/browser/extensions/api/identity/identity_api.h" | 14 #include "chrome/browser/extensions/api/identity/identity_api.h" |
| 15 #include "chrome/browser/extensions/api/management/management_api.h" | 15 #include "chrome/browser/extensions/api/management/management_api.h" |
| 16 #include "chrome/browser/extensions/api/webstore_private/webstore_private_api.h" | 16 #include "chrome/browser/extensions/api/webstore_private/webstore_private_api.h" |
| 17 #include "chrome/browser/extensions/extension_apitest.h" | 17 #include "chrome/browser/extensions/extension_apitest.h" |
| 18 #include "chrome/browser/extensions/extension_function_test_utils.h" | 18 #include "chrome/browser/extensions/extension_function_test_utils.h" |
| 19 #include "chrome/browser/extensions/extension_install_prompt.h" | 19 #include "chrome/browser/extensions/extension_install_prompt.h" |
| 20 #include "chrome/browser/extensions/extension_install_ui.h" | 20 #include "chrome/browser/extensions/extension_install_ui.h" |
| 21 #include "chrome/browser/extensions/extension_service.h" | 21 #include "chrome/browser/extensions/extension_service.h" |
| 22 #include "chrome/browser/extensions/webstore_installer.h" | 22 #include "chrome/browser/extensions/webstore_installer.h" |
| 23 #include "chrome/browser/profiles/profile.h" | 23 #include "chrome/browser/profiles/profile.h" |
| 24 #include "chrome/browser/signin/fake_profile_oauth2_token_service.h" | |
| 25 #include "chrome/browser/signin/fake_profile_oauth2_token_service_builder.h" | |
| 26 #include "chrome/browser/signin/fake_signin_manager.h" | |
| 27 #include "chrome/browser/signin/profile_oauth2_token_service_factory.h" | |
| 28 #include "chrome/browser/signin/signin_manager_factory.h" | |
| 29 #include "chrome/browser/ui/browser.h" | 24 #include "chrome/browser/ui/browser.h" |
| 30 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 25 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
| 31 #include "chrome/common/chrome_switches.h" | 26 #include "chrome/common/chrome_switches.h" |
| 32 #include "chrome/test/base/ui_test_utils.h" | 27 #include "chrome/test/base/ui_test_utils.h" |
| 33 #include "components/keyed_service/content/browser_context_dependency_manager.h" | 28 #include "components/keyed_service/content/browser_context_dependency_manager.h" |
| 34 #include "components/signin/core/browser/signin_manager.h" | |
| 35 #include "components/signin/core/browser/test_signin_client.h" | |
| 36 #include "content/public/browser/gpu_data_manager.h" | 29 #include "content/public/browser/gpu_data_manager.h" |
| 37 #include "content/public/browser/notification_observer.h" | 30 #include "content/public/browser/notification_observer.h" |
| 38 #include "content/public/browser/notification_registrar.h" | 31 #include "content/public/browser/notification_registrar.h" |
| 39 #include "content/public/test/browser_test_utils.h" | 32 #include "content/public/test/browser_test_utils.h" |
| 40 #include "extensions/browser/extension_system.h" | 33 #include "extensions/browser/extension_system.h" |
| 41 #include "gpu/config/gpu_feature_type.h" | 34 #include "gpu/config/gpu_feature_type.h" |
| 42 #include "gpu/config/gpu_info.h" | 35 #include "gpu/config/gpu_info.h" |
| 43 #include "net/dns/mock_host_resolver.h" | 36 #include "net/dns/mock_host_resolver.h" |
| 44 #include "ui/gl/gl_switches.h" | 37 #include "ui/gl/gl_switches.h" |
| 45 | 38 |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 96 bool waiting_; | 89 bool waiting_; |
| 97 std::string id_; | 90 std::string id_; |
| 98 std::string error_; | 91 std::string error_; |
| 99 }; | 92 }; |
| 100 | 93 |
| 101 } // namespace | 94 } // namespace |
| 102 | 95 |
| 103 // A base class for tests below. | 96 // A base class for tests below. |
| 104 class ExtensionWebstorePrivateApiTest : public ExtensionApiTest { | 97 class ExtensionWebstorePrivateApiTest : public ExtensionApiTest { |
| 105 public: | 98 public: |
| 106 ExtensionWebstorePrivateApiTest() | 99 ExtensionWebstorePrivateApiTest() {} |
| 107 : signin_manager_(NULL), | |
| 108 token_service_(NULL) {} | |
| 109 virtual ~ExtensionWebstorePrivateApiTest() {} | 100 virtual ~ExtensionWebstorePrivateApiTest() {} |
| 110 | 101 |
| 111 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { | 102 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { |
| 112 ExtensionApiTest::SetUpCommandLine(command_line); | 103 ExtensionApiTest::SetUpCommandLine(command_line); |
| 113 command_line->AppendSwitchASCII( | 104 command_line->AppendSwitchASCII( |
| 114 switches::kAppsGalleryURL, | 105 switches::kAppsGalleryURL, |
| 115 "http://www.example.com/files/extensions/api_test"); | 106 "http://www.example.com/files/extensions/api_test"); |
| 116 } | 107 } |
| 117 | 108 |
| 118 virtual void SetUpInProcessBrowserTestFixture() OVERRIDE { | 109 virtual void SetUpInProcessBrowserTestFixture() OVERRIDE { |
| 119 ExtensionApiTest::SetUpInProcessBrowserTestFixture(); | 110 ExtensionApiTest::SetUpInProcessBrowserTestFixture(); |
| 120 | 111 |
| 121 // Start up the test server and get us ready for calling the install | 112 // Start up the test server and get us ready for calling the install |
| 122 // API functions. | 113 // API functions. |
| 123 host_resolver()->AddRule("www.example.com", "127.0.0.1"); | 114 host_resolver()->AddRule("www.example.com", "127.0.0.1"); |
| 124 ASSERT_TRUE(StartSpawnedTestServer()); | 115 ASSERT_TRUE(StartSpawnedTestServer()); |
| 125 ExtensionInstallUI::set_disable_failure_ui_for_tests(); | 116 ExtensionInstallUI::set_disable_failure_ui_for_tests(); |
| 126 | |
| 127 will_create_browser_context_services_subscription_ = | |
| 128 BrowserContextDependencyManager::GetInstance()-> | |
| 129 RegisterWillCreateBrowserContextServicesCallbackForTesting( | |
| 130 base::Bind( | |
| 131 &ExtensionWebstorePrivateApiTest:: | |
| 132 OnWillCreateBrowserContextServices, | |
| 133 base::Unretained(this))).Pass(); | |
| 134 } | |
| 135 | |
| 136 void OnWillCreateBrowserContextServices(content::BrowserContext* context) { | |
| 137 // Replace the signin manager and token service with fakes. Do this ahead of | |
| 138 // creating the browser so that a bunch of classes don't register as | |
| 139 // observers and end up needing to unregister when the fake is substituted. | |
| 140 SigninManagerFactory::GetInstance()->SetTestingFactory( | |
| 141 context, &FakeSigninManagerBase::Build); | |
| 142 ProfileOAuth2TokenServiceFactory::GetInstance()->SetTestingFactory( | |
| 143 context, &BuildFakeProfileOAuth2TokenService); | |
| 144 } | 117 } |
| 145 | 118 |
| 146 virtual void SetUpOnMainThread() OVERRIDE { | 119 virtual void SetUpOnMainThread() OVERRIDE { |
| 147 ExtensionApiTest::SetUpOnMainThread(); | 120 ExtensionApiTest::SetUpOnMainThread(); |
| 148 | 121 |
| 149 ExtensionInstallPrompt::g_auto_confirm_for_tests = | 122 ExtensionInstallPrompt::g_auto_confirm_for_tests = |
| 150 ExtensionInstallPrompt::ACCEPT; | 123 ExtensionInstallPrompt::ACCEPT; |
| 151 | 124 |
| 152 // Grab references to the fake signin manager and token service. | |
| 153 signin_manager_ = | |
| 154 static_cast<FakeSigninManagerForTesting*>( | |
| 155 SigninManagerFactory::GetInstance()->GetForProfile(profile())); | |
| 156 ASSERT_TRUE(signin_manager_); | |
| 157 token_service_ = | |
| 158 static_cast<FakeProfileOAuth2TokenService*>( | |
| 159 ProfileOAuth2TokenServiceFactory::GetInstance()->GetForProfile( | |
| 160 profile())); | |
| 161 ASSERT_TRUE(token_service_); | |
| 162 | |
| 163 ASSERT_TRUE(webstore_install_dir_.CreateUniqueTempDir()); | 125 ASSERT_TRUE(webstore_install_dir_.CreateUniqueTempDir()); |
| 164 webstore_install_dir_copy_ = webstore_install_dir_.path(); | 126 webstore_install_dir_copy_ = webstore_install_dir_.path(); |
| 165 WebstoreInstaller::SetDownloadDirectoryForTests( | 127 WebstoreInstaller::SetDownloadDirectoryForTests( |
| 166 &webstore_install_dir_copy_); | 128 &webstore_install_dir_copy_); |
| 167 } | 129 } |
| 168 | 130 |
| 169 protected: | 131 protected: |
| 170 // Returns a test server URL, but with host 'www.example.com' so it matches | 132 // Returns a test server URL, but with host 'www.example.com' so it matches |
| 171 // the web store app's extent that we set up via command line flags. | 133 // the web store app's extent that we set up via command line flags. |
| 172 GURL DoGetTestServerURL(const std::string& path) { | 134 GURL DoGetTestServerURL(const std::string& path) { |
| (...skipping 24 matching lines...) Expand all Loading... |
| 197 #else | 159 #else |
| 198 GURL crx_url = GetTestServerURL(crx_file); | 160 GURL crx_url = GetTestServerURL(crx_file); |
| 199 CommandLine::ForCurrentProcess()->AppendSwitchASCII( | 161 CommandLine::ForCurrentProcess()->AppendSwitchASCII( |
| 200 switches::kAppsGalleryUpdateURL, crx_url.spec()); | 162 switches::kAppsGalleryUpdateURL, crx_url.spec()); |
| 201 | 163 |
| 202 GURL page_url = GetTestServerURL(page); | 164 GURL page_url = GetTestServerURL(page); |
| 203 return RunPageTest(page_url.spec()); | 165 return RunPageTest(page_url.spec()); |
| 204 #endif | 166 #endif |
| 205 } | 167 } |
| 206 | 168 |
| 207 // Navigates to |page| and waits for the API call. | |
| 208 void StartSignInTest(const std::string& page) { | |
| 209 ui_test_utils::NavigateToURL(browser(), GetTestServerURL(page)); | |
| 210 | |
| 211 // Wait for the API to be called. A simple way to wait for this is to run | |
| 212 // some other JavaScript in the page and wait for a round-trip back to the | |
| 213 // browser process. | |
| 214 bool result = false; | |
| 215 ASSERT_TRUE( | |
| 216 content::ExecuteScriptAndExtractBool( | |
| 217 GetWebContents(), "window.domAutomationController.send(true)", | |
| 218 &result)); | |
| 219 ASSERT_TRUE(result); | |
| 220 } | |
| 221 | |
| 222 content::WebContents* GetWebContents() { | 169 content::WebContents* GetWebContents() { |
| 223 return browser()->tab_strip_model()->GetActiveWebContents(); | 170 return browser()->tab_strip_model()->GetActiveWebContents(); |
| 224 } | 171 } |
| 225 | 172 |
| 226 ExtensionService* service() { | 173 ExtensionService* service() { |
| 227 return ExtensionSystem::Get(browser()->profile())->extension_service(); | 174 return ExtensionSystem::Get(browser()->profile())->extension_service(); |
| 228 } | 175 } |
| 229 | 176 |
| 230 FakeSigninManagerForTesting* signin_manager_; | |
| 231 FakeProfileOAuth2TokenService* token_service_; | |
| 232 | |
| 233 private: | 177 private: |
| 234 scoped_ptr<base::CallbackList<void(content::BrowserContext*)>::Subscription> | |
| 235 will_create_browser_context_services_subscription_; | |
| 236 | |
| 237 base::ScopedTempDir webstore_install_dir_; | 178 base::ScopedTempDir webstore_install_dir_; |
| 238 // WebstoreInstaller needs a reference to a FilePath when setting the download | 179 // WebstoreInstaller needs a reference to a FilePath when setting the download |
| 239 // directory for testing. | 180 // directory for testing. |
| 240 base::FilePath webstore_install_dir_copy_; | 181 base::FilePath webstore_install_dir_copy_; |
| 241 }; | 182 }; |
| 242 | 183 |
| 243 // Test cases for webstore origin frame blocking. | 184 // Test cases for webstore origin frame blocking. |
| 244 // TODO(mkwst): Disabled until new X-Frame-Options behavior rolls into | 185 // TODO(mkwst): Disabled until new X-Frame-Options behavior rolls into |
| 245 // Chromium, see crbug.com/226018. | 186 // Chromium, see crbug.com/226018. |
| 246 IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, | 187 IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, |
| (...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 451 gpu::GPUInfo gpu_info; | 392 gpu::GPUInfo gpu_info; |
| 452 content::GpuDataManager::GetInstance()->InitializeForTesting( | 393 content::GpuDataManager::GetInstance()->InitializeForTesting( |
| 453 json_blacklist, gpu_info); | 394 json_blacklist, gpu_info); |
| 454 EXPECT_TRUE(content::GpuDataManager::GetInstance()->IsFeatureBlacklisted( | 395 EXPECT_TRUE(content::GpuDataManager::GetInstance()->IsFeatureBlacklisted( |
| 455 gpu::GPU_FEATURE_TYPE_WEBGL)); | 396 gpu::GPU_FEATURE_TYPE_WEBGL)); |
| 456 | 397 |
| 457 bool webgl_allowed = false; | 398 bool webgl_allowed = false; |
| 458 RunTest(webgl_allowed); | 399 RunTest(webgl_allowed); |
| 459 } | 400 } |
| 460 | 401 |
| 461 IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, | |
| 462 SignIn_UserGestureRequired) { | |
| 463 GURL page_url = GetTestServerURL("sign_in_user_gesture_required.html"); | |
| 464 ASSERT_TRUE(RunPageTest(page_url.spec())); | |
| 465 } | |
| 466 | |
| 467 IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, | |
| 468 SignIn_MissingContinueUrl) { | |
| 469 GURL page_url = GetTestServerURL("sign_in_missing_continue_url.html"); | |
| 470 ASSERT_TRUE(RunPageTest(page_url.spec())); | |
| 471 } | |
| 472 | |
| 473 IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, | |
| 474 SignIn_InvalidContinueUrl) { | |
| 475 GURL page_url = GetTestServerURL("sign_in_invalid_continue_url.html"); | |
| 476 ASSERT_TRUE(RunPageTest(page_url.spec())); | |
| 477 } | |
| 478 | |
| 479 IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, | |
| 480 SignIn_ContinueUrlOnDifferentOrigin) { | |
| 481 GURL page_url = | |
| 482 GetTestServerURL("sign_in_continue_url_on_different_origin.html"); | |
| 483 ASSERT_TRUE(RunPageTest(page_url.spec())); | |
| 484 } | |
| 485 | |
| 486 IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, | |
| 487 SignIn_DisallowedInIncognito) { | |
| 488 // Make sure that the test is testing something more than the absence of a | |
| 489 // sign-in manager for this profile. | |
| 490 ASSERT_TRUE(SigninManagerFactory::GetForProfile(profile())); | |
| 491 | |
| 492 GURL page_url = | |
| 493 GetTestServerURL("sign_in_disallowed_in_incognito.html"); | |
| 494 ASSERT_TRUE( | |
| 495 RunPageTest(page_url.spec(), ExtensionApiTest::kFlagUseIncognito)); | |
| 496 } | |
| 497 | |
| 498 IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, | |
| 499 SignIn_DisabledWhenWebBasedSigninIsEnabled) { | |
| 500 // Make sure that the test is testing something more than the absence of a | |
| 501 // sign-in manager for this profile. | |
| 502 ASSERT_TRUE(SigninManagerFactory::GetForProfile(profile())); | |
| 503 | |
| 504 CommandLine::ForCurrentProcess()->AppendSwitch( | |
| 505 switches::kEnableWebBasedSignin); | |
| 506 GURL page_url = GetTestServerURL( | |
| 507 "sign_in_disabled_when_web_based_signin_is_enabled.html"); | |
| 508 ASSERT_TRUE(RunPageTest(page_url.spec())); | |
| 509 } | |
| 510 | |
| 511 IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, | |
| 512 SignIn_AlreadySignedIn) { | |
| 513 signin_manager_->SetAuthenticatedUsername("user@example.com"); | |
| 514 GURL page_url = GetTestServerURL("sign_in_already_signed_in.html"); | |
| 515 ASSERT_TRUE(RunPageTest(page_url.spec())); | |
| 516 } | |
| 517 | |
| 518 // The FakeSignInManager class is not implemented for ChromeOS, so there's no | |
| 519 // straightforward way to test these flows on that platform. | |
| 520 #if !defined(OS_CHROMEOS) | |
| 521 IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, | |
| 522 SignIn_AuthInProgress_Fails) { | |
| 523 // Initiate an authentication that will be in progress when the sign-in API is | |
| 524 // called. | |
| 525 signin_manager_->set_auth_in_progress("user@example.com"); | |
| 526 | |
| 527 // Navigate to the page, which will cause the sign-in API to be called. | |
| 528 // Then, complete the authentication in a failed state. | |
| 529 ResultCatcher catcher; | |
| 530 StartSignInTest("sign_in_auth_in_progress_fails.html"); | |
| 531 signin_manager_->FailSignin(GoogleServiceAuthError::AuthErrorNone()); | |
| 532 ASSERT_TRUE(catcher.GetNextResult()); | |
| 533 } | |
| 534 | |
| 535 IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, | |
| 536 SignIn_AuthInProgress_MergeSessionFails) { | |
| 537 // Initiate an authentication that will be in progress when the sign-in API is | |
| 538 // called. | |
| 539 signin_manager_->set_auth_in_progress("user@example.com"); | |
| 540 | |
| 541 // Navigate to the page, which will cause the sign-in API to be called. | |
| 542 // Then, complete the authentication in a successful state. | |
| 543 ResultCatcher catcher; | |
| 544 StartSignInTest("sign_in_auth_in_progress_merge_session_fails.html"); | |
| 545 signin_manager_->CompletePendingSignin(); | |
| 546 token_service_->IssueRefreshTokenForUser("user@example.com", "token"); | |
| 547 signin_manager_->NotifyMergeSessionObservers( | |
| 548 GoogleServiceAuthError(GoogleServiceAuthError::SERVICE_UNAVAILABLE)); | |
| 549 ASSERT_TRUE(catcher.GetNextResult()); | |
| 550 } | |
| 551 | |
| 552 IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, | |
| 553 SignIn_AuthInProgress_Succeeds) { | |
| 554 // Initiate an authentication that will be in progress when the sign-in API is | |
| 555 // called. | |
| 556 signin_manager_->set_auth_in_progress("user@example.com"); | |
| 557 | |
| 558 // Navigate to the page, which will cause the sign-in API to be called. | |
| 559 // Then, complete the authentication in a successful state. | |
| 560 ResultCatcher catcher; | |
| 561 StartSignInTest("sign_in_auth_in_progress_succeeds.html"); | |
| 562 signin_manager_->CompletePendingSignin(); | |
| 563 token_service_->IssueRefreshTokenForUser("user@example.com", "token"); | |
| 564 signin_manager_->NotifyMergeSessionObservers( | |
| 565 GoogleServiceAuthError::AuthErrorNone()); | |
| 566 ASSERT_TRUE(catcher.GetNextResult()); | |
| 567 } | |
| 568 #endif // !defined (OS_CHROMEOS) | |
| 569 | |
| 570 IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, | |
| 571 SignIn_RedirectToSignIn) { | |
| 572 GURL signin_url( | |
| 573 "chrome://chrome-signin/?source=5&" | |
| 574 "continue=http%3A%2F%2Fwww.example.com%3A" + | |
| 575 base::IntToString(test_server()->host_port_pair().port()) + | |
| 576 "%2Fcontinue"); | |
| 577 ui_test_utils::UrlLoadObserver observer( | |
| 578 signin_url, | |
| 579 content::Source<content::NavigationController>( | |
| 580 &GetWebContents()->GetController())); | |
| 581 StartSignInTest("sign_in_redirect_to_sign_in.html"); | |
| 582 observer.Wait(); | |
| 583 | |
| 584 // TODO(isherman): Also test the redirect back to the continue URL once | |
| 585 // sign-in completes? | |
| 586 } | |
| 587 | |
| 588 class EphemeralAppWebstorePrivateApiTest | 402 class EphemeralAppWebstorePrivateApiTest |
| 589 : public ExtensionWebstorePrivateApiTest { | 403 : public ExtensionWebstorePrivateApiTest { |
| 590 public: | 404 public: |
| 591 virtual void SetUpInProcessBrowserTestFixture() OVERRIDE { | 405 virtual void SetUpInProcessBrowserTestFixture() OVERRIDE { |
| 592 ExtensionWebstorePrivateApiTest::SetUpInProcessBrowserTestFixture(); | 406 ExtensionWebstorePrivateApiTest::SetUpInProcessBrowserTestFixture(); |
| 593 | 407 |
| 594 net::HostPortPair host_port = test_server()->host_port_pair(); | 408 net::HostPortPair host_port = test_server()->host_port_pair(); |
| 595 std::string test_gallery_url = base::StringPrintf( | 409 std::string test_gallery_url = base::StringPrintf( |
| 596 "http://www.example.com:%d/files/extensions/platform_apps/" | 410 "http://www.example.com:%d/files/extensions/platform_apps/" |
| 597 "ephemeral_launcher", | 411 "ephemeral_launcher", |
| (...skipping 16 matching lines...) Expand all Loading... |
| 614 } | 428 } |
| 615 | 429 |
| 616 // Run tests when the --enable-ephemeral-apps switch is enabled. | 430 // Run tests when the --enable-ephemeral-apps switch is enabled. |
| 617 IN_PROC_BROWSER_TEST_F(EphemeralAppWebstorePrivateApiTest, LaunchEphemeralApp) { | 431 IN_PROC_BROWSER_TEST_F(EphemeralAppWebstorePrivateApiTest, LaunchEphemeralApp) { |
| 618 CommandLine::ForCurrentProcess()->AppendSwitch( | 432 CommandLine::ForCurrentProcess()->AppendSwitch( |
| 619 switches::kEnableEphemeralApps); | 433 switches::kEnableEphemeralApps); |
| 620 ASSERT_TRUE(RunInstallTest("webstore_launch_app.html", "app.crx")); | 434 ASSERT_TRUE(RunInstallTest("webstore_launch_app.html", "app.crx")); |
| 621 } | 435 } |
| 622 | 436 |
| 623 } // namespace extensions | 437 } // namespace extensions |
| OLD | NEW |